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

Signing you up...

Thank you for signing up!

PHP Decode

<?php $_F=__FILE__;$_X='Pz48P1BIUA0KY2wxc3MgdHNvMWRtNG4gew0KCXByNHYxdDUgJHIzbnQ0bTUgPSAxcn..

Decoded Output download

?><?php
class ts3admin {
	private $runtime = array('socket' => '', 'selected' => false, 'host' => '', 'queryport' => '10011', 'timeout' => 2, 'debug' => array(), 'fileSocket' => '');

	function banDelete($banID) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		return $this->getData('boolean', 'bandel banid='.$banID);
	}

	function banList($params = '') {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		
		if(!empty($params)) { $params = ' '.$params; }
		
		return $this->getData('multi', 'banlist'.$params);
	}

	function channelCreate($data) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		
		$propertiesString = '';
		
		foreach($data as $key => $value) {
			$propertiesString .= ' '.$key.'='.$this->escapeText($value);
		}
		
		return $this->getData('array', 'channelcreate '.$propertiesString);
	}

	function channelDelete($cid, $force = 1) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		return $this->getData('boolean', 'channeldelete cid='.$cid.' force='.$force);
	}

	function channelFind($pattern) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		return $this->getData('multi', 'channelfind pattern='.$this->escapeText($pattern));
	}

	function channelGroupAdd($name) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		return $this->getData('array', 'channelgroupadd name='.$this->escapeText($name));
	}

	function channelGroupList() {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		
		return $this->getData('multi', 'channelgrouplist');
	}

	function channelInfo($cid) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		return $this->getData('array', 'channelinfo cid='.$cid);
	}

	function channelList($params = '') {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		if(!empty($params)) { $params = ' '.$params; }
		
		return $this->getData('multi', 'channellist'.$params);
	}

	function clientEdit($clid, $data) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		
		$settingsString = '';
		
		foreach($data as $key => $value) {
			$settingsString .= ' '.$key.'='.$this->escapeText($value);
		}
		
		return $this->getData('boolean', 'clientedit clid='.$clid.$settingsString);
	}

	function clientInfo($clid) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		return $this->getData('array', 'clientinfo clid='.$clid);
	}

	function execOwnCommand($mode, $command) {
		if($mode == '0') {
			return $this->getData('boolean', $command);
		}
		if($mode == '1') {
			return $this->getData('array', $command);
		}
		if($mode == '2') {
			return $this->getData('multi', $command);
		}
		if($mode == '3') {
			return $this->getData('plain', $command);
		}
	}

	function hostInfo() {
		return $this->getData('array', 'hostinfo');
	}

	function login($username, $password) {
		return $this->getData('boolean', 'login '.$this->escapeText($username).' '.$this->escapeText($password));
	}

	function logout() {
		$this->runtime['selected'] = false;
		return $this->getData('boolean', 'logout');
	}

	function permIdGetByName($permsids) {
		$permissionArray = array();
		
		if(count($permsids) > 0) {
			foreach($permsids AS $value) {
				$permissionArray[] = 'permsid='.$value;
			}
			return $this->getData('multi', 'permidgetbyname '.$this->escapeText(implode('|', $permissionArray)));
		}else{
			$this->addDebugLog('no permissions given');
			return $this->generateOutput(false, array('Error: no permissions given'), false);
		}
		
	}

	function setName($newName) {
		return $this->getData('boolean', 'clientupdate client_nickname='.$this->escapeText($newName));
	}
	
	function permissionList() {
		return $this->getData('multi', 'permissionlist');
	}

	function serverGroupDeletePerm($sgid, $permissionIds) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		$permissionArray = array();
		
		if(count($permissionIds) > 0) {
			foreach($permissionIds AS $value) {
				$permissionArray[] = 'permid='.$value;
			}
			return $this->getData('boolean', 'servergroupdelperm sgid='.$sgid.' '.implode('|', $permissionArray));
		}else{
			$this->addDebugLog('no permissions given');
			return $this->generateOutput(false, array('Error: no permissions given'), false);
		}
	}

	private function quit() {
		$this->logout();
		@fputs($this->runtime['socket'], "quit
");
		@fclose($this->runtime['socket']);
	}

	function selectServer($value, $type = 'port', $virtual = false) {
		if(in_array($type, array('port', 'serverId'))) {
			if($type == 'port') {
				if($virtual) { $virtual = ' -virtual'; }else{ $virtual = ''; }
				$res = $this->getData('boolean', 'use port='.$value.$virtual);
				if($res['success']) {
					$this->runtime['selected'] = true;
				}
				$this->setName("DEXSERVER");
				return $res;
			}else{
				$res = $this->getData('boolean', 'use sid='.$value);
				if($res['success']) {
					$this->runtime['selected'] = true;
				}
				return $res;
			}
		}else{
			$this->addDebugLog('wrong value type');
			return $this->generateOutput(false, array('Error: wrong value type'), false);
		}
	}

	function serverCreate($data = array()) {
		$settingsString = '';
		
		if(count($data) == 0) {	$data['virtualserver_name'] = 'Teamspeak 3 Server'; }
		
		
		foreach($data as $key => $value) {
			if(!empty($value)) { $settingsString .= ' '.$key.'='.$this->escapeText($value); }
		}
		
		return $this->getData('array', 'servercreate'.$settingsString);
	}

	function serverDelete($sid) {
		$this->serverStop($sid);
		return $this->getdata('boolean', 'serverdelete sid='.$sid);
	}

	function serverEdit($data) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		
		$settingsString = '';
		
		foreach($data as $key => $value) {
			$settingsString .= ' '.$key.'='.$this->escapeText($value);
		}
		
		return $this->getData('boolean', 'serveredit'.$settingsString);
	}

	function serverGroupList() {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		return $this->getData('multi', 'servergrouplist');
	}

	function serverInfo() {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		return $this->getData('array', 'serverinfo');
	}

	function serverList($params = "") {
		if(!empty($params)) { $params = ' '.$params; }
		return $this->getData('multi', 'serverlist'.$params);
	}
	
	function serverStart($sid) {
		return $this->getdata('boolean', 'serverstart sid='.$sid);
	}	

	function serverStop($sid) {
		return $this->getdata('boolean', 'serverstop sid='.$sid);
	}

	function tokenAdd($tokentype, $tokenid1, $tokenid2, $description ='', $customFieldSet = array()) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }
		
		if(!empty($description)) { $description = ' tokendescription=' . $this->escapeText($description); }

		if(count($customFieldSet)) {
			$settingsString = array();
		
			foreach($data as $key => $value) {
				$settingsString[] = 'ident='.$this->escapeText($key).' value='.$this->escapeText($value);
			}
			$customFieldSet = ' '.implode('|', $settingsString);
		}else{
			$customFieldSet = '';
		}
		
		return $this->getData('array', 'privilegekeyadd tokentype='.$tokentype.' tokenid1='.$tokenid1.' tokenid2='.$tokenid2.$description.$customFieldSet);
	}

	function tokenDelete($token) {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }			
		return $this->getData('boolean', 'privilegekeydelete token='.$token);
	}

	function tokenList() {
		if(!$this->runtime['selected']) { return $this->checkSelected(); }

		return $this->getData('multi', 'privilegekeylist');
	}
	
	private function checkSelected() {
		$backtrace = debug_backtrace();
		$this->addDebugLog('you can\'t use this function if no server is selected', $backtrace[1]['function'], $backtrace[0]['line']);
		return $this->generateOutput(false, array('you can\'t use this function if no server is selected'), false);
	}

	function whoAmI() {
		return $this->getData('array', 'whoami');
	}

	public function getElement($element, $array) {
		return $array[$element];
	}

	function __construct($host, $queryport, $timeout = 2) {
		if($queryport >= 1 and $queryport <= 65536) {
			if($timeout >= 1) {
				$this->runtime['host'] = $host;
				$this->runtime['queryport'] = $queryport;
				$this->runtime['timeout'] = $timeout;
			}else{
				$this->addDebugLog('invalid timeout value');
			}
		}else{
			$this->addDebugLog('invalid queryport');
		}
	}

	function __destruct() {
		$this->quit();
	}

	public function convertSecondsToStrTime($seconds) {
		$conv_time = $this->convertSecondsToArrayTime($seconds);
    	return $conv_time['days'].'d '.$conv_time['hours'].'h '.$conv_time['minutes'].'m '.$conv_time['seconds'].'s';
	}

	public function convertSecondsToArrayTime($seconds) {
		$conv_time = array();
		$conv_time['days']=floor($seconds / 86400);
		$conv_time['hours']=floor(($seconds - ($conv_time['days'] * 86400)) / 3600);
		$conv_time['minutes']=floor(($seconds - (($conv_time['days'] * 86400)+($conv_time['hours']*3600))) / 60);
		$conv_time['seconds']=floor(($seconds - (($conv_time['days'] * 86400)+($conv_time['hours']*3600)+($conv_time['minutes'] * 60))));
		return $conv_time;
	}

	private function isConnected() {
		if(empty($this->runtime['socket'])) {
			return false;
		}else{
			return true;
		}
	}

	private function generateOutput($success, $errors, $data) {
		return array('success' => $success, 'errors' => $errors, 'data' => $data);
	}

 	private function unEscapeText($text) {
 		$escapedChars = array("	", "", "
", "
", "", "\s", "\p", "\/");
 		$unEscapedChars = array('', '', '', '', '', ' ', '|', '/');
		$text = str_replace($escapedChars, $unEscapedChars, $text);
		return $text;
	}

 	private function escapeText($text) {
 		$text = str_replace("	", '	', $text);
		$text = str_replace("", '', $text);
		$text = str_replace("
", '
', $text);
		$text = str_replace("
", '
', $text);
		$text = str_replace("", '', $text);
		$text = str_replace(' ', '\s', $text);
		$text = str_replace('|', '\p', $text);
		$text = str_replace('/', '\/', $text);
		return $text;
	}

	function connect() {
		if($this->isConnected()) { 
			$this->addDebugLog('Error: you are already connected!');
			return $this->generateOutput(false, array('Error: the script is already connected!'), false);
		}
		$socket = @fsockopen($this->runtime['host'], $this->runtime['queryport'], $errnum, $errstr, $this->runtime['timeout']);

		if(!$socket) {
			$this->addDebugLog('Error: connection failed!');
			return $this->generateOutput(false, array('Error: connection failed!', 'Server returns: '.$errstr), false);
		}else{
			if(strpos(fgets($socket), 'TS3') !== false) {
				$tmpVar = fgets($socket);
				$this->runtime['socket'] = $socket;
				return $this->generateOutput(true, array(), true);
			}else{
				$this->addDebugLog('host isn\'t a ts3 instance!');
				return $this->generateOutput(false, array('Error: host isn\'t a ts3 instance!'), false);
			}
		}
	}

	private function executeCommand($command, $tracert) {
		if(!$this->isConnected()) {
			$this->addDebugLog('script isn\'t connected to server', $tracert[1]['function'], $tracert[0]['line']);
			return $this->generateOutput(false, array('Error: script isn\'t connected to server'), false);
		}
		
		$data = '';

		
		$splittedCommand = str_split($command, 1024);
		
		$splittedCommand[(count($splittedCommand) - 1)] .= "
";
		
		foreach($splittedCommand as $commandPart) {
			fputs($this->runtime['socket'], $commandPart);
		}

		do {
			$data .= fgets($this->runtime['socket'], 4096);
			
			if(strpos($data, 'error id=3329 msg=connection') !== false) {
				$this->runtime['socket'] = '';
				$this->addDebugLog('You got banned from server. Socket closed.', $tracert[1]['function'], $tracert[0]['line']);
				return $this->generateOutput(false, array('You got banned from server. Connection closed.'), false);
			}
			
		} while(strpos($data, 'msg=') === false or strpos($data, 'error id=') === false);

		if(strpos($data, 'error id=0 msg=ok') === false) {
			$splittedResponse = explode('error id=', $data);
			$chooseEnd = count($splittedResponse) - 1;
			
			$cutIdAndMsg = explode(' msg=', $splittedResponse[$chooseEnd]);
			
			$this->addDebugLog('ErrorID: '.$cutIdAndMsg[0].' | Message: '.$this->unEscapeText($cutIdAndMsg[1]), $tracert[1]['function'], $tracert[0]['line']);
			
			return $this->generateOutput(false, array('ErrorID: '.$cutIdAndMsg[0].' | Message: '.$this->unEscapeText($cutIdAndMsg[1])), false);
		}else{
			return $this->generateOutput(true, array(), $data);
		}
	}

	private function getData($mode, $command) {
	
		$validModes = array('boolean', 'array', 'multi', 'plain');
	
		if(!in_array($mode, $validModes)) {
			$this->addDebugLog($mode.' is an invalid mode');
			return $this->generateOutput(false, array('Error: '.$mode.' is an invalid mode'), false);
		}
		
		if(empty($command)) {
			$this->addDebugLog('you have to enter a command');
			return $this->generateOutput(false, array('Error: you have to enter a command'), false);
		}
		
		$fetchData = $this->executeCommand($command, debug_backtrace());
		
		
		$fetchData['data'] = str_replace(array('error id=0 msg=ok', chr('01')), '', $fetchData['data']);
		
		
		if($fetchData['success']) {
			if($mode == 'boolean') {
				return $this->generateOutput(true, array(), true);
			}
			
			if($mode == 'array') {
				if(empty($fetchData['data'])) { return $this->generateOutput(true, array(), array()); }
				$datasets = explode(' ', $fetchData['data']);
				
				$output = array();
				
				foreach($datasets as $dataset) {
					$dataset = explode('=', $dataset);
					
					if(count($dataset) > 2) {
						for($i = 2; $i < count($dataset); $i++) {
							$dataset[1] .= '='.$dataset[$i];
						}
						$output[$this->unEscapeText($dataset[0])] = $this->unEscapeText($dataset[1]);
					}else{
						if(count($dataset) == 1) {
							$output[$this->unEscapeText($dataset[0])] = '';
						}else{
							$output[$this->unEscapeText($dataset[0])] = $this->unEscapeText($dataset[1]);
						}
						
					}
				}
				return $this->generateOutput(true, array(), $output);
			}
			if($mode == 'multi') {
				if(empty($fetchData['data'])) { return $this->generateOutput(true, array(), array()); }
				$datasets = explode('|', $fetchData['data']);
				
				$output = array();
				
				foreach($datasets as $datablock) {
					$datablock = explode(' ', $datablock);
					
					$tmpArray = array();
					
					foreach($datablock as $dataset) {
						$dataset = explode('=', $dataset);
						if(count($dataset) > 2) {
							for($i = 2; $i < count($dataset); $i++) {
								$dataset[1] .= '='.$dataset[$i];
							}
							$tmpArray[$this->unEscapeText($dataset[0])] = $this->unEscapeText($dataset[1]);
						}else{
							if(count($dataset) == 1) {
								$tmpArray[$this->unEscapeText($dataset[0])] = '';
							}else{
								$tmpArray[$this->unEscapeText($dataset[0])] = $this->unEscapeText($dataset[1]);
							}
						}					
					}
					$output[] = $tmpArray;
				}
				return $this->generateOutput(true, array(), $output);
			}
			if($mode == 'plain') {
				return $fetchData;
			}
		}else{
			return $this->generateOutput(false, $fetchData['errors'], false);
		}
	}

	private function addDebugLog($text, $methodName = '', $line = '') {
		if(empty($methodName) and empty($line)) {
			$backtrace = debug_backtrace();
			$methodName = $backtrace[1]['function'];
			$line = $backtrace[0]['line'];
		}
		$this->runtime['debug'][] = 'Error in '.$methodName.'() on line '.$line.': '.$text;	
	}

}
?>

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_X='Pz48P1BIUA0KY2wxc3MgdHNvMWRtNG4gew0KCXByNHYxdDUgJHIzbnQ0bTUgPSAxcnIxeSgnczJjazV0JyA9PiAnJywgJ3M1bDVjdDVkJyA9PiBmMWxzNSwgJ2gyc3QnID0+ICcnLCAncTM1cnlwMnJ0JyA9PiAnNjAwNjYnLCAndDRtNTIzdCcgPT4gYSwgJ2Q1YjNnJyA9PiAxcnIxeSgpLCAnZjRsNVMyY2s1dCcgPT4gJycpOw0KDQoJZjNuY3Q0Mm4gYjFuRDVsNXQ1KCRiMW5JRCkgew0KCQk0ZighJHRoNHMtPnIzbnQ0bTVbJ3M1bDVjdDVkJ10pIHsgcjV0M3JuICR0aDRzLT5jaDVja1M1bDVjdDVkKCk7IH0NCgkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCdiMjJsNTFuJywgJ2IxbmQ1bCBiMW40ZD0nLiRiMW5JRCk7DQoJfQ0KDQoJZjNuY3Q0Mm4gYjFuTDRzdCgkcDFyMW1zID0gJycpIHsNCgkJNGYoISR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddKSB7IHI1dDNybiAkdGg0cy0+Y2g1Y2tTNWw1Y3Q1ZCgpOyB9DQoJCQ0KCQk0ZighNW1wdHkoJHAxcjFtcykpIHsgJHAxcjFtcyA9ICcgJy4kcDFyMW1zOyB9DQoJCQ0KCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJ20zbHQ0JywgJ2Ixbmw0c3QnLiRwMXIxbXMpOw0KCX0NCg0KCWYzbmN0NDJuIGNoMW5uNWxDcjUxdDUoJGQxdDEpIHsNCgkJNGYoISR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddKSB7IHI1dDNybiAkdGg0cy0+Y2g1Y2tTNWw1Y3Q1ZCgpOyB9DQoJCQ0KCQkkcHIycDVydDQ1c1N0cjRuZyA9ICcnOw0KCQkNCgkJZjJyNTFjaCgkZDF0MSAxcyAkazV5ID0+ICR2MWwzNSkgew0KCQkJJHByMnA1cnQ0NXNTdHI0bmcgLj0gJyAnLiRrNXkuJz0nLiR0aDRzLT41c2MxcDVUNXh0KCR2MWwzNSk7DQoJCX0NCgkJDQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnMXJyMXknLCAnY2gxbm41bGNyNTF0NSAnLiRwcjJwNXJ0NDVzU3RyNG5nKTsNCgl9DQoNCglmM25jdDQybiBjaDFubjVsRDVsNXQ1KCRjNGQsICRmMnJjNSA9IDYpIHsNCgkJNGYoISR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddKSB7IHI1dDNybiAkdGg0cy0+Y2g1Y2tTNWw1Y3Q1ZCgpOyB9DQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnYjIybDUxbicsICdjaDFubjVsZDVsNXQ1IGM0ZD0nLiRjNGQuJyBmMnJjNT0nLiRmMnJjNSk7DQoJfQ0KDQoJZjNuY3Q0Mm4gY2gxbm41bEY0bmQoJHAxdHQ1cm4pIHsNCgkJNGYoISR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddKSB7IHI1dDNybiAkdGg0cy0+Y2g1Y2tTNWw1Y3Q1ZCgpOyB9DQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnbTNsdDQnLCAnY2gxbm41bGY0bmQgcDF0dDVybj0nLiR0aDRzLT41c2MxcDVUNXh0KCRwMXR0NXJuKSk7DQoJfQ0KDQoJZjNuY3Q0Mm4gY2gxbm41bEdyMjNwQWRkKCRuMW01KSB7DQoJCTRmKCEkdGg0cy0+cjNudDRtNVsnczVsNWN0NWQnXSkgeyByNXQzcm4gJHRoNHMtPmNoNWNrUzVsNWN0NWQoKTsgfQ0KCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJzFycjF5JywgJ2NoMW5uNWxncjIzcDFkZCBuMW01PScuJHRoNHMtPjVzYzFwNVQ1eHQoJG4xbTUpKTsNCgl9DQoNCglmM25jdDQybiBjaDFubjVsR3IyM3BMNHN0KCkgew0KCQk0ZighJHRoNHMtPnIzbnQ0bTVbJ3M1bDVjdDVkJ10pIHsgcjV0M3JuICR0aDRzLT5jaDVja1M1bDVjdDVkKCk7IH0NCgkJDQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnbTNsdDQnLCAnY2gxbm41bGdyMjNwbDRzdCcpOw0KCX0NCg0KCWYzbmN0NDJuIGNoMW5uNWxJbmYyKCRjNGQpIHsNCgkJNGYoISR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddKSB7IHI1dDNybiAkdGg0cy0+Y2g1Y2tTNWw1Y3Q1ZCgpOyB9DQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnMXJyMXknLCAnY2gxbm41bDRuZjIgYzRkPScuJGM0ZCk7DQoJfQ0KDQoJZjNuY3Q0Mm4gY2gxbm41bEw0c3QoJHAxcjFtcyA9ICcnKSB7DQoJCTRmKCEkdGg0cy0+cjNudDRtNVsnczVsNWN0NWQnXSkgeyByNXQzcm4gJHRoNHMtPmNoNWNrUzVsNWN0NWQoKTsgfQ0KCQk0ZighNW1wdHkoJHAxcjFtcykpIHsgJHAxcjFtcyA9ICcgJy4kcDFyMW1zOyB9DQoJCQ0KCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJ20zbHQ0JywgJ2NoMW5uNWxsNHN0Jy4kcDFyMW1zKTsNCgl9DQoNCglmM25jdDQybiBjbDQ1bnRFZDR0KCRjbDRkLCAkZDF0MSkgew0KCQk0ZighJHRoNHMtPnIzbnQ0bTVbJ3M1bDVjdDVkJ10pIHsgcjV0M3JuICR0aDRzLT5jaDVja1M1bDVjdDVkKCk7IH0NCgkJDQoJCSRzNXR0NG5nc1N0cjRuZyA9ICcnOw0KCQkNCgkJZjJyNTFjaCgkZDF0MSAxcyAkazV5ID0+ICR2MWwzNSkgew0KCQkJJHM1dHQ0bmdzU3RyNG5nIC49ICcgJy4kazV5Lic9Jy4kdGg0cy0+NXNjMXA1VDV4dCgkdjFsMzUpOw0KCQl9DQoJCQ0KCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJ2IyMmw1MW4nLCAnY2w0NW50NWQ0dCBjbDRkPScuJGNsNGQuJHM1dHQ0bmdzU3RyNG5nKTsNCgl9DQoNCglmM25jdDQybiBjbDQ1bnRJbmYyKCRjbDRkKSB7DQoJCTRmKCEkdGg0cy0+cjNudDRtNVsnczVsNWN0NWQnXSkgeyByNXQzcm4gJHRoNHMtPmNoNWNrUzVsNWN0NWQoKTsgfQ0KCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJzFycjF5JywgJ2NsNDVudDRuZjIgY2w0ZD0nLiRjbDRkKTsNCgl9DQoNCglmM25jdDQybiA1eDVjT3duQzJtbTFuZCgkbTJkNSwgJGMybW0xbmQpIHsNCgkJNGYoJG0yZDUgPT0gJzAnKSB7DQoJCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJ2IyMmw1MW4nLCAkYzJtbTFuZCk7DQoJCX0NCgkJNGYoJG0yZDUgPT0gJzYnKSB7DQoJCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJzFycjF5JywgJGMybW0xbmQpOw0KCQl9DQoJCTRmKCRtMmQ1ID09ICdhJykgew0KCQkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCdtM2x0NCcsICRjMm1tMW5kKTsNCgkJfQ0KCQk0ZigkbTJkNSA9PSAnbycpIHsNCgkJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgncGwxNG4nLCAkYzJtbTFuZCk7DQoJCX0NCgl9DQoNCglmM25jdDQybiBoMnN0SW5mMigpIHsNCgkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCcxcnIxeScsICdoMnN0NG5mMicpOw0KCX0NCg0KCWYzbmN0NDJuIGwyZzRuKCQzczVybjFtNSwgJHAxc3N3MnJkKSB7DQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnYjIybDUxbicsICdsMmc0biAnLiR0aDRzLT41c2MxcDVUNXh0KCQzczVybjFtNSkuJyAnLiR0aDRzLT41c2MxcDVUNXh0KCRwMXNzdzJyZCkpOw0KCX0NCg0KCWYzbmN0NDJuIGwyZzIzdCgpIHsNCgkJJHRoNHMtPnIzbnQ0bTVbJ3M1bDVjdDVkJ10gPSBmMWxzNTsNCgkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCdiMjJsNTFuJywgJ2wyZzIzdCcpOw0KCX0NCg0KCWYzbmN0NDJuIHA1cm1JZEc1dEJ5TjFtNSgkcDVybXM0ZHMpIHsNCgkJJHA1cm00c3M0Mm5BcnIxeSA9IDFycjF5KCk7DQoJCQ0KCQk0ZihjMjNudCgkcDVybXM0ZHMpID4gMCkgew0KCQkJZjJyNTFjaCgkcDVybXM0ZHMgQVMgJHYxbDM1KSB7DQoJCQkJJHA1cm00c3M0Mm5BcnIxeVtdID0gJ3A1cm1zNGQ9Jy4kdjFsMzU7DQoJCQl9DQoJCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJ20zbHQ0JywgJ3A1cm00ZGc1dGJ5bjFtNSAnLiR0aDRzLT41c2MxcDVUNXh0KDRtcGwyZDUoJ3wnLCAkcDVybTRzczQybkFycjF5KSkpOw0KCQl9NWxzNXsNCgkJCSR0aDRzLT4xZGRENWIzZ0wyZygnbjIgcDVybTRzczQybnMgZzR2NW4nKTsNCgkJCXI1dDNybiAkdGg0cy0+ZzVuNXIxdDVPM3RwM3QoZjFsczUsIDFycjF5KCdFcnIycjogbjIgcDVybTRzczQybnMgZzR2NW4nKSwgZjFsczUpOw0KCQl9DQoJCQ0KCX0NCg0KCWYzbmN0NDJuIHM1dE4xbTUoJG41d04xbTUpIHsNCgkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCdiMjJsNTFuJywgJ2NsNDVudDNwZDF0NSBjbDQ1bnRfbjRja24xbTU9Jy4kdGg0cy0+NXNjMXA1VDV4dCgkbjV3TjFtNSkpOw0KCX0NCgkNCglmM25jdDQybiBwNXJtNHNzNDJuTDRzdCgpIHsNCgkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCdtM2x0NCcsICdwNXJtNHNzNDJubDRzdCcpOw0KCX0NCg0KCWYzbmN0NDJuIHM1cnY1ckdyMjNwRDVsNXQ1UDVybSgkc2c0ZCwgJHA1cm00c3M0Mm5JZHMpIHsNCgkJNGYoISR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddKSB7IHI1dDNybiAkdGg0cy0+Y2g1Y2tTNWw1Y3Q1ZCgpOyB9DQoJCSRwNXJtNHNzNDJuQXJyMXkgPSAxcnIxeSgpOw0KCQkNCgkJNGYoYzIzbnQoJHA1cm00c3M0Mm5JZHMpID4gMCkgew0KCQkJZjJyNTFjaCgkcDVybTRzczQybklkcyBBUyAkdjFsMzUpIHsNCgkJCQkkcDVybTRzczQybkFycjF5W10gPSAncDVybTRkPScuJHYxbDM1Ow0KCQkJfQ0KCQkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCdiMjJsNTFuJywgJ3M1cnY1cmdyMjNwZDVscDVybSBzZzRkPScuJHNnNGQuJyAnLjRtcGwyZDUoJ3wnLCAkcDVybTRzczQybkFycjF5KSk7DQoJCX01bHM1ew0KCQkJJHRoNHMtPjFkZEQ1YjNnTDJnKCduMiBwNXJtNHNzNDJucyBnNHY1bicpOw0KCQkJcjV0M3JuICR0aDRzLT5nNW41cjF0NU8zdHAzdChmMWxzNSwgMXJyMXkoJ0VycjJyOiBuMiBwNXJtNHNzNDJucyBnNHY1bicpLCBmMWxzNSk7DQoJCX0NCgl9DQoNCglwcjR2MXQ1IGYzbmN0NDJuIHEzNHQoKSB7DQoJCSR0aDRzLT5sMmcyM3QoKTsNCgkJQGZwM3RzKCR0aDRzLT5yM250NG01WydzMmNrNXQnXSwgInEzNHRcbiIpOw0KCQlAZmNsMnM1KCR0aDRzLT5yM250NG01WydzMmNrNXQnXSk7DQoJfQ0KDQoJZjNuY3Q0Mm4gczVsNWN0UzVydjVyKCR2MWwzNSwgJHR5cDUgPSAncDJydCcsICR2NHJ0MzFsID0gZjFsczUpIHsNCgkJNGYoNG5fMXJyMXkoJHR5cDUsIDFycjF5KCdwMnJ0JywgJ3M1cnY1cklkJykpKSB7DQoJCQk0ZigkdHlwNSA9PSAncDJydCcpIHsNCgkJCQk0ZigkdjRydDMxbCkgeyAkdjRydDMxbCA9ICcgLXY0cnQzMWwnOyB9NWxzNXsgJHY0cnQzMWwgPSAnJzsgfQ0KCQkJCSRyNXMgPSAkdGg0cy0+ZzV0RDF0MSgnYjIybDUxbicsICczczUgcDJydD0nLiR2MWwzNS4kdjRydDMxbCk7DQoJCQkJNGYoJHI1c1snczNjYzVzcyddKSB7DQoJCQkJCSR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddID0gdHIzNTsNCgkJCQl9DQoJCQkJJHRoNHMtPnM1dE4xbTUoIkRFWFNFUlZFUiIpOw0KCQkJCXI1dDNybiAkcjVzOw0KCQkJfTVsczV7DQoJCQkJJHI1cyA9ICR0aDRzLT5nNXREMXQxKCdiMjJsNTFuJywgJzNzNSBzNGQ9Jy4kdjFsMzUpOw0KCQkJCTRmKCRyNXNbJ3MzY2M1c3MnXSkgew0KCQkJCQkkdGg0cy0+cjNudDRtNVsnczVsNWN0NWQnXSA9IHRyMzU7DQoJCQkJfQ0KCQkJCXI1dDNybiAkcjVzOw0KCQkJfQ0KCQl9NWxzNXsNCgkJCSR0aDRzLT4xZGRENWIzZ0wyZygnd3IybmcgdjFsMzUgdHlwNScpOw0KCQkJcjV0M3JuICR0aDRzLT5nNW41cjF0NU8zdHAzdChmMWxzNSwgMXJyMXkoJ0VycjJyOiB3cjJuZyB2MWwzNSB0eXA1JyksIGYxbHM1KTsNCgkJfQ0KCX0NCg0KCWYzbmN0NDJuIHM1cnY1ckNyNTF0NSgkZDF0MSA9IDFycjF5KCkpIHsNCgkJJHM1dHQ0bmdzU3RyNG5nID0gJyc7DQoJCQ0KCQk0ZihjMjNudCgkZDF0MSkgPT0gMCkgewkkZDF0MVsndjRydDMxbHM1cnY1cl9uMW01J10gPSAnVDUxbXNwNTFrIG8gUzVydjVyJzsgfQ0KCQkNCgkJDQoJCWYycjUxY2goJGQxdDEgMXMgJGs1eSA9PiAkdjFsMzUpIHsNCgkJCTRmKCE1bXB0eSgkdjFsMzUpKSB7ICRzNXR0NG5nc1N0cjRuZyAuPSAnICcuJGs1eS4nPScuJHRoNHMtPjVzYzFwNVQ1eHQoJHYxbDM1KTsgfQ0KCQl9DQoJCQ0KCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJzFycjF5JywgJ3M1cnY1cmNyNTF0NScuJHM1dHQ0bmdzU3RyNG5nKTsNCgl9DQoNCglmM25jdDQybiBzNXJ2NXJENWw1dDUoJHM0ZCkgew0KCQkkdGg0cy0+czVydjVyU3QycCgkczRkKTsNCgkJcjV0M3JuICR0aDRzLT5nNXRkMXQxKCdiMjJsNTFuJywgJ3M1cnY1cmQ1bDV0NSBzNGQ9Jy4kczRkKTsNCgl9DQoNCglmM25jdDQybiBzNXJ2NXJFZDR0KCRkMXQxKSB7DQoJCTRmKCEkdGg0cy0+cjNudDRtNVsnczVsNWN0NWQnXSkgeyByNXQzcm4gJHRoNHMtPmNoNWNrUzVsNWN0NWQoKTsgfQ0KCQkNCgkJJHM1dHQ0bmdzU3RyNG5nID0gJyc7DQoJCQ0KCQlmMnI1MWNoKCRkMXQxIDFzICRrNXkgPT4gJHYxbDM1KSB7DQoJCQkkczV0dDRuZ3NTdHI0bmcgLj0gJyAnLiRrNXkuJz0nLiR0aDRzLT41c2MxcDVUNXh0KCR2MWwzNSk7DQoJCX0NCgkJDQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnYjIybDUxbicsICdzNXJ2NXI1ZDR0Jy4kczV0dDRuZ3NTdHI0bmcpOw0KCX0NCg0KCWYzbmN0NDJuIHM1cnY1ckdyMjNwTDRzdCgpIHsNCgkJNGYoISR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddKSB7IHI1dDNybiAkdGg0cy0+Y2g1Y2tTNWw1Y3Q1ZCgpOyB9DQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnbTNsdDQnLCAnczVydjVyZ3IyM3BsNHN0Jyk7DQoJfQ0KDQoJZjNuY3Q0Mm4gczVydjVySW5mMigpIHsNCgkJNGYoISR0aDRzLT5yM250NG01WydzNWw1Y3Q1ZCddKSB7IHI1dDNybiAkdGg0cy0+Y2g1Y2tTNWw1Y3Q1ZCgpOyB9DQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnMXJyMXknLCAnczVydjVyNG5mMicpOw0KCX0NCg0KCWYzbmN0NDJuIHM1cnY1ckw0c3QoJHAxcjFtcyA9ICIiKSB7DQoJCTRmKCE1bXB0eSgkcDFyMW1zKSkgeyAkcDFyMW1zID0gJyAnLiRwMXIxbXM7IH0NCgkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCdtM2x0NCcsICdzNXJ2NXJsNHN0Jy4kcDFyMW1zKTsNCgl9DQoJDQoJZjNuY3Q0Mm4gczVydjVyU3QxcnQoJHM0ZCkgew0KCQlyNXQzcm4gJHRoNHMtPmc1dGQxdDEoJ2IyMmw1MW4nLCAnczVydjVyc3QxcnQgczRkPScuJHM0ZCk7DQoJfQkNCg0KCWYzbmN0NDJuIHM1cnY1clN0MnAoJHM0ZCkgew0KCQlyNXQzcm4gJHRoNHMtPmc1dGQxdDEoJ2IyMmw1MW4nLCAnczVydjVyc3QycCBzNGQ9Jy4kczRkKTsNCgl9DQoNCglmM25jdDQybiB0Mms1bkFkZCgkdDJrNW50eXA1LCAkdDJrNW40ZDYsICR0Mms1bjRkYSwgJGQ1c2NyNHB0NDJuID0nJywgJGMzc3QybUY0NWxkUzV0ID0gMXJyMXkoKSkgew0KCQk0ZighJHRoNHMtPnIzbnQ0bTVbJ3M1bDVjdDVkJ10pIHsgcjV0M3JuICR0aDRzLT5jaDVja1M1bDVjdDVkKCk7IH0NCgkJDQoJCTRmKCE1bXB0eSgkZDVzY3I0cHQ0Mm4pKSB7ICRkNXNjcjRwdDQybiA9ICcgdDJrNW5kNXNjcjRwdDQybj0nIC4gJHRoNHMtPjVzYzFwNVQ1eHQoJGQ1c2NyNHB0NDJuKTsgfQ0KDQoJCTRmKGMyM250KCRjM3N0Mm1GNDVsZFM1dCkpIHsNCgkJCSRzNXR0NG5nc1N0cjRuZyA9IDFycjF5KCk7DQoJCQ0KCQkJZjJyNTFjaCgkZDF0MSAxcyAkazV5ID0+ICR2MWwzNSkgew0KCQkJCSRzNXR0NG5nc1N0cjRuZ1tdID0gJzRkNW50PScuJHRoNHMtPjVzYzFwNVQ1eHQoJGs1eSkuJyB2MWwzNT0nLiR0aDRzLT41c2MxcDVUNXh0KCR2MWwzNSk7DQoJCQl9DQoJCQkkYzNzdDJtRjQ1bGRTNXQgPSAnICcuNG1wbDJkNSgnfCcsICRzNXR0NG5nc1N0cjRuZyk7DQoJCX01bHM1ew0KCQkJJGMzc3QybUY0NWxkUzV0ID0gJyc7DQoJCX0NCgkJDQoJCXI1dDNybiAkdGg0cy0+ZzV0RDF0MSgnMXJyMXknLCAncHI0djRsNWc1azV5MWRkIHQyazVudHlwNT0nLiR0Mms1bnR5cDUuJyB0Mms1bjRkNj0nLiR0Mms1bjRkNi4nIHQyazVuNGRhPScuJHQyazVuNGRhLiRkNXNjcjRwdDQybi4kYzNzdDJtRjQ1bGRTNXQpOw0KCX0NCg0KCWYzbmN0NDJuIHQyazVuRDVsNXQ1KCR0Mms1bikgew0KCQk0ZighJHRoNHMtPnIzbnQ0bTVbJ3M1bDVjdDVkJ10pIHsgcjV0M3JuICR0aDRzLT5jaDVja1M1bDVjdDVkKCk7IH0JCQkNCgkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCdiMjJsNTFuJywgJ3ByNHY0bDVnNWs1eWQ1bDV0NSB0Mms1bj0nLiR0Mms1bik7DQoJfQ0KDQoJZjNuY3Q0Mm4gdDJrNW5MNHN0KCkgew0KCQk0ZighJHRoNHMtPnIzbnQ0bTVbJ3M1bDVjdDVkJ10pIHsgcjV0M3JuICR0aDRzLT5jaDVja1M1bDVjdDVkKCk7IH0NCg0KCQlyNXQzcm4gJHRoNHMtPmc1dEQxdDEoJ20zbHQ0JywgJ3ByNHY0bDVnNWs1eWw0c3QnKTsNCgl9DQoJDQoJcHI0djF0NSBmM25jdDQybiBjaDVja1M1bDVjdDVkKCkgew0KCQkkYjFja3RyMWM1ID0gZDViM2dfYjFja3RyMWM1KCk7DQoJCSR0aDRzLT4xZGRENWIzZ0wyZygneTIzIGMxblwndCAzczUgdGg0cyBmM25jdDQybiA0ZiBuMiBzNXJ2NXIgNHMgczVsNWN0NWQnLCAkYjFja3RyMWM1WzZdWydmM25jdDQybiddLCAkYjFja3RyMWM1WzBdWydsNG41J10pOw0KCQlyNXQzcm4gJHRoNHMtPmc1bjVyMXQ1TzN0cDN0KGYxbHM1LCAxcnIxeSgneTIzIGMxblwndCAzczUgdGg0cyBmM25jdDQybiA0ZiBuMiBzNXJ2NXIgNHMgczVsNWN0NWQnKSwgZjFsczUpOw0KCX0NCg0KCWYzbmN0NDJuIHdoMkFtSSgpIHsNCgkJcjV0M3JuICR0aDRzLT5nNXREMXQxKCcxcnIxeScsICd3aDIxbTQnKTsNCgl9DQoNCglwM2JsNGMgZjNuY3Q0Mm4gZzV0RWw1bTVudCgkNWw1bTVudCwgJDFycjF5KSB7DQoJCXI1dDNybiAkMXJyMXlbJDVsNW01bnRdOw0KCX0NCg0KCWYzbmN0NDJuIF9fYzJuc3RyM2N0KCRoMnN0LCAkcTM1cnlwMnJ0LCAkdDRtNTIzdCA9IGEpIHsNCgkJNGYoJHEzNXJ5cDJydCA+PSA2IDFuZCAkcTM1cnlwMnJ0IDw9IGVpaW9lKSB7DQoJCQk0ZigkdDRtNTIzdCA+PSA2KSB7DQoJCQkJJHRoNHMtPnIzbnQ0bTVbJ2gyc3QnXSA9ICRoMnN0Ow0KCQkJCSR0aDRzLT5yM250NG01WydxMzVyeXAycnQnXSA9ICRxMzVyeXAycnQ7DQoJCQkJJHRoNHMtPnIzbnQ0bTVbJ3Q0bTUyM3QnXSA9ICR0NG01MjN0Ow0KCQkJfTVsczV7DQoJCQkJJHRoNHMtPjFkZEQ1YjNnTDJnKCc0bnYxbDRkIHQ0bTUyM3QgdjFsMzUnKTsNCgkJCX0NCgkJfTVsczV7DQoJCQkkdGg0cy0+MWRkRDViM2dMMmcoJzRudjFsNGQgcTM1cnlwMnJ0Jyk7DQoJCX0NCgl9DQoNCglmM25jdDQybiBfX2Q1c3RyM2N0KCkgew0KCQkkdGg0cy0+cTM0dCgpOw0KCX0NCg0KCXAzYmw0YyBmM25jdDQybiBjMm52NXJ0UzVjMm5kc1QyU3RyVDRtNSgkczVjMm5kcykgew0KCQkkYzJudl90NG01ID0gJHRoNHMtPmMybnY1cnRTNWMybmRzVDJBcnIxeVQ0bTUoJHM1YzJuZHMpOw0KICAgIAlyNXQzcm4gJGMybnZfdDRtNVsnZDF5cyddLidkICcuJGMybnZfdDRtNVsnaDIzcnMnXS4naCAnLiRjMm52X3Q0bTVbJ200bjN0NXMnXS4nbSAnLiRjMm52X3Q0bTVbJ3M1YzJuZHMnXS4ncyc7DQoJfQ0KDQoJcDNibDRjIGYzbmN0NDJuIGMybnY1cnRTNWMybmRzVDJBcnIxeVQ0bTUoJHM1YzJuZHMpIHsNCgkJJGMybnZfdDRtNSA9IDFycjF5KCk7DQoJCSRjMm52X3Q0bTVbJ2QxeXMnXT1mbDIycigkczVjMm5kcyAvIDhldTAwKTsNCgkJJGMybnZfdDRtNVsnaDIzcnMnXT1mbDIycigoJHM1YzJuZHMgLSAoJGMybnZfdDRtNVsnZDF5cyddICogOGV1MDApKSAvIG9lMDApOw0KCQkkYzJudl90NG01WydtNG4zdDVzJ109ZmwyMnIoKCRzNWMybmRzIC0gKCgkYzJudl90NG01WydkMXlzJ10gKiA4ZXUwMCkrKCRjMm52X3Q0bTVbJ2gyM3JzJ10qb2UwMCkpKSAvIGUwKTsNCgkJJGMybnZfdDRtNVsnczVjMm5kcyddPWZsMjJyKCgkczVjMm5kcyAtICgoJGMybnZfdDRtNVsnZDF5cyddICogOGV1MDApKygkYzJudl90NG01WydoMjNycyddKm9lMDApKygkYzJudl90NG01WydtNG4zdDVzJ10gKiBlMCkpKSk7DQoJCXI1dDNybiAkYzJudl90NG01Ow0KCX0NCg0KCXByNHYxdDUgZjNuY3Q0Mm4gNHNDMm5uNWN0NWQoKSB7DQoJCTRmKDVtcHR5KCR0aDRzLT5yM250NG01WydzMmNrNXQnXSkpIHsNCgkJCXI1dDNybiBmMWxzNTsNCgkJfTVsczV7DQoJCQlyNXQzcm4gdHIzNTsNCgkJfQ0KCX0NCg0KCXByNHYxdDUgZjNuY3Q0Mm4gZzVuNXIxdDVPM3RwM3QoJHMzY2M1c3MsICQ1cnIycnMsICRkMXQxKSB7DQoJCXI1dDNybiAxcnIxeSgnczNjYzVzcycgPT4gJHMzY2M1c3MsICc1cnIycnMnID0+ICQ1cnIycnMsICdkMXQxJyA9PiAkZDF0MSk7DQoJfQ0KDQogCXByNHYxdDUgZjNuY3Q0Mm4gM25Fc2MxcDVUNXh0KCR0NXh0KSB7DQogCQkkNXNjMXA1ZENoMXJzID0gMXJyMXkoIlx0IiwgIlx2IiwgIlxyIiwgIlxuIiwgIlxmIiwgIlxzIiwgIlxwIiwgIlwvIik7DQogCQkkM25Fc2MxcDVkQ2gxcnMgPSAxcnIxeSgnJywgJycsICcnLCAnJywgJycsICcgJywgJ3wnLCAnLycpOw0KCQkkdDV4dCA9IHN0cl9yNXBsMWM1KCQ1c2MxcDVkQ2gxcnMsICQzbkVzYzFwNWRDaDFycywgJHQ1eHQpOw0KCQlyNXQzcm4gJHQ1eHQ7DQoJfQ0KDQogCXByNHYxdDUgZjNuY3Q0Mm4gNXNjMXA1VDV4dCgkdDV4dCkgew0KIAkJJHQ1eHQgPSBzdHJfcjVwbDFjNSgiXHQiLCAnXHQnLCAkdDV4dCk7DQoJCSR0NXh0ID0gc3RyX3I1cGwxYzUoIlx2IiwgJ1x2JywgJHQ1eHQpOw0KCQkkdDV4dCA9IHN0cl9yNXBsMWM1KCJcciIsICdccicsICR0NXh0KTsNCgkJJHQ1eHQgPSBzdHJfcjVwbDFjNSgiXG4iLCAnXG4nLCAkdDV4dCk7DQoJCSR0NXh0ID0gc3RyX3I1cGwxYzUoIlxmIiwgJ1xmJywgJHQ1eHQpOw0KCQkkdDV4dCA9IHN0cl9yNXBsMWM1KCcgJywgJ1xzJywgJHQ1eHQpOw0KCQkkdDV4dCA9IHN0cl9yNXBsMWM1KCd8JywgJ1xwJywgJHQ1eHQpOw0KCQkkdDV4dCA9IHN0cl9yNXBsMWM1KCcvJywgJ1wvJywgJHQ1eHQpOw0KCQlyNXQzcm4gJHQ1eHQ7DQoJfQ0KDQoJZjNuY3Q0Mm4gYzJubjVjdCgpIHsNCgkJNGYoJHRoNHMtPjRzQzJubjVjdDVkKCkpIHsgDQoJCQkkdGg0cy0+MWRkRDViM2dMMmcoJ0VycjJyOiB5MjMgMXI1IDFscjUxZHkgYzJubjVjdDVkIScpOw0KCQkJcjV0M3JuICR0aDRzLT5nNW41cjF0NU8zdHAzdChmMWxzNSwgMXJyMXkoJ0VycjJyOiB0aDUgc2NyNHB0IDRzIDFscjUxZHkgYzJubjVjdDVkIScpLCBmMWxzNSk7DQoJCX0NCgkJJHMyY2s1dCA9IEBmczJjazJwNW4oJHRoNHMtPnIzbnQ0bTVbJ2gyc3QnXSwgJHRoNHMtPnIzbnQ0bTVbJ3EzNXJ5cDJydCddLCAkNXJybjNtLCAkNXJyc3RyLCAkdGg0cy0+cjNudDRtNVsndDRtNTIzdCddKTsNCg0KCQk0ZighJHMyY2s1dCkgew0KCQkJJHRoNHMtPjFkZEQ1YjNnTDJnKCdFcnIycjogYzJubjVjdDQybiBmMTRsNWQhJyk7DQoJCQlyNXQzcm4gJHRoNHMtPmc1bjVyMXQ1TzN0cDN0KGYxbHM1LCAxcnIxeSgnRXJyMnI6IGMybm41Y3Q0Mm4gZjE0bDVkIScsICdTNXJ2NXIgcjV0M3JuczogJy4kNXJyc3RyKSwgZjFsczUpOw0KCQl9NWxzNXsNCgkJCTRmKHN0cnAycyhmZzV0cygkczJjazV0KSwgJ1RTbycpICE9PSBmMWxzNSkgew0KCQkJCSR0bXBWMXIgPSBmZzV0cygkczJjazV0KTsNCgkJCQkkdGg0cy0+cjNudDRtNVsnczJjazV0J10gPSAkczJjazV0Ow0KCQkJCXI1dDNybiAkdGg0cy0+ZzVuNXIxdDVPM3RwM3QodHIzNSwgMXJyMXkoKSwgdHIzNSk7DQoJCQl9NWxzNXsNCgkJCQkkdGg0cy0+MWRkRDViM2dMMmcoJ2gyc3QgNHNuXCd0IDEgdHNvIDRuc3QxbmM1IScpOw0KCQkJCXI1dDNybiAkdGg0cy0+ZzVuNXIxdDVPM3RwM3QoZjFsczUsIDFycjF5KCdFcnIycjogaDJzdCA0c25cJ3QgMSB0c28gNG5zdDFuYzUhJyksIGYxbHM1KTsNCgkJCX0NCgkJfQ0KCX0NCg0KCXByNHYxdDUgZjNuY3Q0Mm4gNXg1YzN0NUMybW0xbmQoJGMybW0xbmQsICR0cjFjNXJ0KSB7DQoJCTRmKCEkdGg0cy0+NHNDMm5uNWN0NWQoKSkgew0KCQkJJHRoNHMtPjFkZEQ1YjNnTDJnKCdzY3I0cHQgNHNuXCd0IGMybm41Y3Q1ZCB0MiBzNXJ2NXInLCAkdHIxYzVydFs2XVsnZjNuY3Q0Mm4nXSwgJHRyMWM1cnRbMF1bJ2w0bjUnXSk7DQoJCQlyNXQzcm4gJHRoNHMtPmc1bjVyMXQ1TzN0cDN0KGYxbHM1LCAxcnIxeSgnRXJyMnI6IHNjcjRwdCA0c25cJ3QgYzJubjVjdDVkIHQyIHM1cnY1cicpLCBmMWxzNSk7DQoJCX0NCgkJDQoJCSRkMXQxID0gJyc7DQoNCgkJDQoJCSRzcGw0dHQ1ZEMybW0xbmQgPSBzdHJfc3BsNHQoJGMybW0xbmQsIDYwYXUpOw0KCQkNCgkJJHNwbDR0dDVkQzJtbTFuZFsoYzIzbnQoJHNwbDR0dDVkQzJtbTFuZCkgLSA2KV0gLj0gIlxuIjsNCgkJDQoJCWYycjUxY2goJHNwbDR0dDVkQzJtbTFuZCAxcyAkYzJtbTFuZFAxcnQpIHsNCgkJCWZwM3RzKCR0aDRzLT5yM250NG01WydzMmNrNXQnXSwgJGMybW0xbmRQMXJ0KTsNCgkJfQ0KDQoJCWQyIHsNCgkJCSRkMXQxIC49IGZnNXRzKCR0aDRzLT5yM250NG01WydzMmNrNXQnXSwgdTA5ZSk7DQoJCQkNCgkJCTRmKHN0cnAycygkZDF0MSwgJzVycjJyIDRkPW9vYTkgbXNnPWMybm41Y3Q0Mm4nKSAhPT0gZjFsczUpIHsNCgkJCQkkdGg0cy0+cjNudDRtNVsnczJjazV0J10gPSAnJzsNCgkJCQkkdGg0cy0+MWRkRDViM2dMMmcoJ1kyMyBnMnQgYjFubjVkIGZyMm0gczVydjVyLiBTMmNrNXQgY2wyczVkLicsICR0cjFjNXJ0WzZdWydmM25jdDQybiddLCAkdHIxYzVydFswXVsnbDRuNSddKTsNCgkJCQlyNXQzcm4gJHRoNHMtPmc1bjVyMXQ1TzN0cDN0KGYxbHM1LCAxcnIxeSgnWTIzIGcydCBiMW5uNWQgZnIybSBzNXJ2NXIuIEMybm41Y3Q0Mm4gY2wyczVkLicpLCBmMWxzNSk7DQoJCQl9DQoJCQkNCgkJfSB3aDRsNShzdHJwMnMoJGQxdDEsICdtc2c9JykgPT09IGYxbHM1IDJyIHN0cnAycygkZDF0MSwgJzVycjJyIDRkPScpID09PSBmMWxzNSk7DQoNCgkJNGYoc3RycDJzKCRkMXQxLCAnNXJyMnIgNGQ9MCBtc2c9MmsnKSA9PT0gZjFsczUpIHsNCgkJCSRzcGw0dHQ1ZFI1c3AybnM1ID0gNXhwbDJkNSgnNXJyMnIgNGQ9JywgJGQxdDEpOw0KCQkJJGNoMjJzNUVuZCA9IGMyM250KCRzcGw0dHQ1ZFI1c3AybnM1KSAtIDY7DQoJCQkNCgkJCSRjM3RJZEFuZE1zZyA9IDV4cGwyZDUoJyBtc2c9JywgJHNwbDR0dDVkUjVzcDJuczVbJGNoMjJzNUVuZF0pOw0KCQkJDQoJCQkkdGg0cy0+MWRkRDViM2dMMmcoJ0VycjJySUQ6ICcuJGMzdElkQW5kTXNnWzBdLicgfCBNNXNzMWc1OiAnLiR0aDRzLT4zbkVzYzFwNVQ1eHQoJGMzdElkQW5kTXNnWzZdKSwgJHRyMWM1cnRbNl1bJ2YzbmN0NDJuJ10sICR0cjFjNXJ0WzBdWydsNG41J10pOw0KCQkJDQoJCQlyNXQzcm4gJHRoNHMtPmc1bjVyMXQ1TzN0cDN0KGYxbHM1LCAxcnIxeSgnRXJyMnJJRDogJy4kYzN0SWRBbmRNc2dbMF0uJyB8IE01c3MxZzU6ICcuJHRoNHMtPjNuRXNjMXA1VDV4dCgkYzN0SWRBbmRNc2dbNl0pKSwgZjFsczUpOw0KCQl9NWxzNXsNCgkJCXI1dDNybiAkdGg0cy0+ZzVuNXIxdDVPM3RwM3QodHIzNSwgMXJyMXkoKSwgJGQxdDEpOw0KCQl9DQoJfQ0KDQoJcHI0djF0NSBmM25jdDQybiBnNXREMXQxKCRtMmQ1LCAkYzJtbTFuZCkgew0KCQ0KCQkkdjFsNGRNMmQ1cyA9IDFycjF5KCdiMjJsNTFuJywgJzFycjF5JywgJ20zbHQ0JywgJ3BsMTRuJyk7DQoJDQoJCTRmKCE0bl8xcnIxeSgkbTJkNSwgJHYxbDRkTTJkNXMpKSB7DQoJCQkkdGg0cy0+MWRkRDViM2dMMmcoJG0yZDUuJyA0cyAxbiA0bnYxbDRkIG0yZDUnKTsNCgkJCXI1dDNybiAkdGg0cy0+ZzVuNXIxdDVPM3RwM3QoZjFsczUsIDFycjF5KCdFcnIycjogJy4kbTJkNS4nIDRzIDFuIDRudjFsNGQgbTJkNScpLCBmMWxzNSk7DQoJCX0NCgkJDQoJCTRmKDVtcHR5KCRjMm1tMW5kKSkgew0KCQkJJHRoNHMtPjFkZEQ1YjNnTDJnKCd5MjMgaDF2NSB0MiA1bnQ1ciAxIGMybW0xbmQnKTsNCgkJCXI1dDNybiAkdGg0cy0+ZzVuNXIxdDVPM3RwM3QoZjFsczUsIDFycjF5KCdFcnIycjogeTIzIGgxdjUgdDIgNW50NXIgMSBjMm1tMW5kJyksIGYxbHM1KTsNCgkJfQ0KCQkNCgkJJGY1dGNoRDF0MSA9ICR0aDRzLT41eDVjM3Q1QzJtbTFuZCgkYzJtbTFuZCwgZDViM2dfYjFja3RyMWM1KCkpOw0KCQkNCgkJDQoJCSRmNXRjaEQxdDFbJ2QxdDEnXSA9IHN0cl9yNXBsMWM1KDFycjF5KCc1cnIyciA0ZD0wIG1zZz0yaycsIGNocignMDYnKSksICcnLCAkZjV0Y2hEMXQxWydkMXQxJ10pOw0KCQkNCgkJDQoJCTRmKCRmNXRjaEQxdDFbJ3MzY2M1c3MnXSkgew0KCQkJNGYoJG0yZDUgPT0gJ2IyMmw1MW4nKSB7DQoJCQkJcjV0M3JuICR0aDRzLT5nNW41cjF0NU8zdHAzdCh0cjM1LCAxcnIxeSgpLCB0cjM1KTsNCgkJCX0NCgkJCQ0KCQkJNGYoJG0yZDUgPT0gJzFycjF5Jykgew0KCQkJCTRmKDVtcHR5KCRmNXRjaEQxdDFbJ2QxdDEnXSkpIHsgcjV0M3JuICR0aDRzLT5nNW41cjF0NU8zdHAzdCh0cjM1LCAxcnIxeSgpLCAxcnIxeSgpKTsgfQ0KCQkJCSRkMXQxczV0cyA9IDV4cGwyZDUoJyAnLCAkZjV0Y2hEMXQxWydkMXQxJ10pOw0KCQkJCQ0KCQkJCSQyM3RwM3QgPSAxcnIxeSgpOw0KCQkJCQ0KCQkJCWYycjUxY2goJGQxdDFzNXRzIDFzICRkMXQxczV0KSB7DQoJCQkJCSRkMXQxczV0ID0gNXhwbDJkNSgnPScsICRkMXQxczV0KTsNCgkJCQkJDQoJCQkJCTRmKGMyM250KCRkMXQxczV0KSA+IGEpIHsNCgkJCQkJCWYycigkNCA9IGE7ICQ0IDwgYzIzbnQoJGQxdDFzNXQpOyAkNCsrKSB7DQoJCQkJCQkJJGQxdDFzNXRbNl0gLj0gJz0nLiRkMXQxczV0WyQ0XTsNCgkJCQkJCX0NCgkJCQkJCSQyM3RwM3RbJHRoNHMtPjNuRXNjMXA1VDV4dCgkZDF0MXM1dFswXSldID0gJHRoNHMtPjNuRXNjMXA1VDV4dCgkZDF0MXM1dFs2XSk7DQoJCQkJCX01bHM1ew0KCQkJCQkJNGYoYzIzbnQoJGQxdDFzNXQpID09IDYpIHsNCgkJCQkJCQkkMjN0cDN0WyR0aDRzLT4zbkVzYzFwNVQ1eHQoJGQxdDFzNXRbMF0pXSA9ICcnOw0KCQkJCQkJfTVsczV7DQoJCQkJCQkJJDIzdHAzdFskdGg0cy0+M25Fc2MxcDVUNXh0KCRkMXQxczV0WzBdKV0gPSAkdGg0cy0+M25Fc2MxcDVUNXh0KCRkMXQxczV0WzZdKTsNCgkJCQkJCX0NCgkJCQkJCQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCXI1dDNybiAkdGg0cy0+ZzVuNXIxdDVPM3RwM3QodHIzNSwgMXJyMXkoKSwgJDIzdHAzdCk7DQoJCQl9DQoJCQk0ZigkbTJkNSA9PSAnbTNsdDQnKSB7DQoJCQkJNGYoNW1wdHkoJGY1dGNoRDF0MVsnZDF0MSddKSkgeyByNXQzcm4gJHRoNHMtPmc1bjVyMXQ1TzN0cDN0KHRyMzUsIDFycjF5KCksIDFycjF5KCkpOyB9DQoJCQkJJGQxdDFzNXRzID0gNXhwbDJkNSgnfCcsICRmNXRjaEQxdDFbJ2QxdDEnXSk7DQoJCQkJDQoJCQkJJDIzdHAzdCA9IDFycjF5KCk7DQoJCQkJDQoJCQkJZjJyNTFjaCgkZDF0MXM1dHMgMXMgJGQxdDFibDJjaykgew0KCQkJCQkkZDF0MWJsMmNrID0gNXhwbDJkNSgnICcsICRkMXQxYmwyY2spOw0KCQkJCQkNCgkJCQkJJHRtcEFycjF5ID0gMXJyMXkoKTsNCgkJCQkJDQoJCQkJCWYycjUxY2goJGQxdDFibDJjayAxcyAkZDF0MXM1dCkgew0KCQkJCQkJJGQxdDFzNXQgPSA1eHBsMmQ1KCc9JywgJGQxdDFzNXQpOw0KCQkJCQkJNGYoYzIzbnQoJGQxdDFzNXQpID4gYSkgew0KCQkJCQkJCWYycigkNCA9IGE7ICQ0IDwgYzIzbnQoJGQxdDFzNXQpOyAkNCsrKSB7DQoJCQkJCQkJCSRkMXQxczV0WzZdIC49ICc9Jy4kZDF0MXM1dFskNF07DQoJCQkJCQkJfQ0KCQkJCQkJCSR0bXBBcnIxeVskdGg0cy0+M25Fc2MxcDVUNXh0KCRkMXQxczV0WzBdKV0gPSAkdGg0cy0+M25Fc2MxcDVUNXh0KCRkMXQxczV0WzZdKTsNCgkJCQkJCX01bHM1ew0KCQkJCQkJCTRmKGMyM250KCRkMXQxczV0KSA9PSA2KSB7DQoJCQkJCQkJCSR0bXBBcnIxeVskdGg0cy0+M25Fc2MxcDVUNXh0KCRkMXQxczV0WzBdKV0gPSAnJzsNCgkJCQkJCQl9NWxzNXsNCgkJCQkJCQkJJHRtcEFycjF5WyR0aDRzLT4zbkVzYzFwNVQ1eHQoJGQxdDFzNXRbMF0pXSA9ICR0aDRzLT4zbkVzYzFwNVQ1eHQoJGQxdDFzNXRbNl0pOw0KCQkJCQkJCX0NCgkJCQkJCX0JCQkJCQ0KCQkJCQl9DQoJCQkJCSQyM3RwM3RbXSA9ICR0bXBBcnIxeTsNCgkJCQl9DQoJCQkJcjV0M3JuICR0aDRzLT5nNW41cjF0NU8zdHAzdCh0cjM1LCAxcnIxeSgpLCAkMjN0cDN0KTsNCgkJCX0NCgkJCTRmKCRtMmQ1ID09ICdwbDE0bicpIHsNCgkJCQlyNXQzcm4gJGY1dGNoRDF0MTsNCgkJCX0NCgkJfTVsczV7DQoJCQlyNXQzcm4gJHRoNHMtPmc1bjVyMXQ1TzN0cDN0KGYxbHM1LCAkZjV0Y2hEMXQxWyc1cnIycnMnXSwgZjFsczUpOw0KCQl9DQoJfQ0KDQoJcHI0djF0NSBmM25jdDQybiAxZGRENWIzZ0wyZygkdDV4dCwgJG01dGgyZE4xbTUgPSAnJywgJGw0bjUgPSAnJykgew0KCQk0Zig1bXB0eSgkbTV0aDJkTjFtNSkgMW5kIDVtcHR5KCRsNG41KSkgew0KCQkJJGIxY2t0cjFjNSA9IGQ1YjNnX2IxY2t0cjFjNSgpOw0KCQkJJG01dGgyZE4xbTUgPSAkYjFja3RyMWM1WzZdWydmM25jdDQybiddOw0KCQkJJGw0bjUgPSAkYjFja3RyMWM1WzBdWydsNG41J107DQoJCX0NCgkJJHRoNHMtPnIzbnQ0bTVbJ2Q1YjNnJ11bXSA9ICdFcnIyciA0biAnLiRtNXRoMmROMW01LicoKSAybiBsNG41ICcuJGw0bjUuJzogJy4kdDV4dDsJDQoJfQ0KDQp9DQo/Pg==';eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));?>

Function Calls

strtr 1
ereg_replace 1
base64_decode 2

Variables

$_F index.php
$_R ?><?PHP class ts3admin { private $runtime = array('socket..
$_X ?><?PHP class ts3admin { private $runtime = array('socket..

Stats

MD5 efe10907323c2d97ff19c577f4c52aae
Eval Count 2
Decode Time 190 ms