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 eval("?>".base64_decode("PD9waHANCg0KLyoqDQogKiBSZW1vdGUgY1BhbmVsLyBXSE0gQWR2YW5jZQ0..
Decoded Output download
?>b'<?php
/**
* Remote cPanel/ WHM Advance
* Vickry Virgous
* April 2014
*/
class Whm
{
var $controller = true;
var $host = null;
var $user=null;
var $accessHash = null;
var $errors=array();
var $fp=null;
/*
* initialization
*/
function startup(&$controller)
{
$this->controller =& $controller;
}
/*
* initialization
*/
function init($host,$user,$accessHash)
{
$this->host=$host;
$this->user=$user;
$accessHash = str_replace(array("
", "
"),"",$accessHash);
$this->accessHash=$accessHash;
}
/*
* connect to the xml api
* Output: true on success, false on fail
*/
function connect($api_path)
{
/*
* Open a socket for HTTPS
*/
$this->fp = fsockopen("ssl://" . $this->host, 2087, $errno, $errstr, 30);
/*
* Uncomment to use unsecure HTTP instead
*/
//$this->fp = fsockopen("ssl://" . $this->host, 2087, $errno, $errstr, 30);
/*
* Die on error initializing socket
*/
if ($errno == 0 && $this->fp == false)
{
$this->errors[]="Socket Error: Could not initialize socket.";
return false;
}
elseif ($this->fp == false)
{
$this->errors[]="Socket Error #" . $errno . ": " . $errstr;
return false;
}
/*
* Assemble the header to send
*/
$header = "";
$header .= "GET " . $api_path . " HTTP/1.0
";
$header .= "Host: " . $this->host . "
";
$header .= "Connection: Close
";
$header .= "Authorization: WHM " . $this->user . ":" . $this->accessHash . "
";
// Comment above line and uncomment below line to use password authentication in place of hash authentication
//$header .= "Authorization: Basic " . base64_encode($user . ":" . $pass) . "
";
$header .= "
";
/*
* Send the Header
*/
if(!@fputs($this->fp, $header))
{
$this->errors[]=\'Unable to send header.\';
return false;
}
}
/*
* Close the socket
*/
function disconnect()
{
fclose($this->fp);
}
/*
* Get the raw output from the server
* Output: string
*/
function getOutput()
{
$rawResult = "";
while (!feof($this->fp))
{
$rawResult .= @fgets($this->fp, 128); // Suppress errors with @
}
/*
* Ignore headers
*/
$rawResultParts = explode("
",$rawResult);
$result = $rawResultParts[1];
/*
* Output XML
*/
return $result;
}
/*
* This function lists the verison of cPanel and WHM installed on the server.
* Output: string
*/
function version()
{
//connect using prpoer xml api address
$this->connect(\'/xml-api/version\');
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
return $xml->version;
}
/*
* This function lists the server\'s hostname.
* Output: string
*/
function gethostname()
{
//connect using prpoer xml api address
$this->connect(\'/xml-api/gethostname\');
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
return $xml->hostname;
}
/*
* list currently active accounts
* Output: array on success, false on fail
*/
function listaccts()
{
//connect using prpoer xml api address
$this->connect(\'/xml-api/listaccts\');
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
$xml = new DOMDocument();
$xml->loadXML($xmlstr);
// statement block to get the elements of the xml document
$list = $xml->getElementsByTagName(\'user\');
$i=0;
foreach ($list AS $element)
{
foreach ($element->childNodes AS $item)
{
$result[$i][\'user\']=$item->nodeValue;
$i++;
}
}
$list = $xml->getElementsByTagName(\'domain\');
$i=0;
foreach ($list AS $element)
{
foreach ($element->childNodes AS $item)
{
$result[$i][\'domain\']=$item->nodeValue;
$i++;
}
}
$list = $xml->getElementsByTagName(\'plan\');
$i=0;
foreach ($list AS $element)
{
foreach ($element->childNodes AS $item)
{
$result[$i][\'package\']=$item->nodeValue;
$i++;
}
}
$list = $xml->getElementsByTagName(\'unix_startdate\');
$i=0;
foreach ($list AS $element)
{
foreach ($element->childNodes AS $item)
{
$result[$i][\'start_date\']=$item->nodeValue;
$i++;
}
}
//return the result array
return $result;
}
/*
* list packages
* Output: array on success, false on fail
*/
function listPkgs()
{
//connect using prpoer xml api address
$this->connect(\'/xml-api/listpkgs\');
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
$xml = new DOMDocument();
$xml->loadXML($xmlstr);
$list = $xml->getElementsByTagName(\'name\');
$i=0;
foreach ($list AS $element)
{
foreach ($element->childNodes AS $item)
{
$result[$i][\'package_name\']=$item->nodeValue;
$i++;
}
}
$list = $xml->getElementsByTagName(\'QUOTA\');
$i=0;
foreach ($list AS $element)
{
foreach ($element->childNodes AS $item)
{
$result[$i][\'package_quota\']=$item->nodeValue;
$i++;
}
}
$list = $xml->getElementsByTagName(\'BWLIMIT\');
$i=0;
foreach ($list AS $element)
{
foreach ($element->childNodes AS $item)
{
$result[$i][\'package_bw_limit\']=$item->nodeValue;
$i++;
}
}
//return the result array
return $result;
}
/*
* create a cpanel account
* Output: array on success, false on fail
*/
function createAccount($acctDomain,$acctUser,$acctPass,$acctPackg)
{
//connect using prpoer xml api address
$this->connect("/xml-api/createacct?username=$acctUser&password=$acctPass&plan=$acctPackg&domain=$acctDomain&ip=y&cgi=y&frontpage=y&cpmod=x3&useregns=1&reseller=1");
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
if($xml->result->status==1)
{
$result[\'status\']=$xml->result->status;
$result[\'statusmsg\']=$xml->result->statusmsg;
$result[\'ip\']=$xml->result->options->ip;
$result[\'nameserver\']=$xml->result->options->nameserver;
$result[\'nameserver2\']=$xml->result->options->nameserver2;
$result[\'nameserver3\']=$xml->result->options->nameserver3;
$result[\'nameserver4\']=$xml->result->options->nameserver4;
$result[\'package\']=$xml->result->options->package;
$result[\'rawout\']=$xml->result->rawout;
return $result;
}
else
{
$this->errors[]=$xml->result->statusmsg;
return false;
}
}
/*
* This function displays pertient account information for a specific account.
* Output: array on success , false on fail
*/
function accountsummary($accUser)
{
//connect using prpoer xml api address
$this->connect("/xml-api/accountsummary?user=$accUser");
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
if($xml->status==1)
{
$result[\'disklimit\']=$xml->acct->disklimit;
$result[\'diskused\']=$xml->acct->diskused;
$result[\'diskused\']=$xml->acct->diskused;
$result[\'domain\']=$xml->acct->domain;
$result[\'email\']=$xml->acct->email;
$result[\'ip\']=$xml->acct->ip;
$result[\'owner\']=$xml->acct->owner;
$result[\'partition\']=$xml->acct->partition;
$result[\'plan\']=$xml->acct->plan;
$result[\'startdate\']=$xml->acct->startdate;
$result[\'theme\']=$xml->acct->theme;
$result[\'unix_startdate\']=$xml->acct->unix_startdate;
$result[\'user\']=$xml->acct->user;
return $result;
}
else
{
$this->errors[]=$xml->statusmsg;
return false;
}
}
/*
*This function changes the passwd of a domain owner (cPanel) or reseller (WHM) account.
* Output: array on success , false on fail
*/
function passwd($accUser,$pass)
{
//connect using prpoer xml api address
$this->connect("/xml-api/passwd?user=$accUser&pass=$pass");
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
if($xml->passwd->status==1)
{
$result[\'statusmsg\']=$xml->passwd->statusmsg;
$result[\'frontpage\']=$xml->passwd->frontpage;
$result[\'ftp\']=$xml->passwd->ftp;
$result[\'mail\']=$xml->passwd->mail;
$result[\'mysql\']=$xml->passwd->mysql;
$result[\'system\']=$xml->passwd->system;
$result[\'rawout\']=$xml->passwd->rawout;
return $result;
}
else
{
$this->errors[]=$xml->passwd->statusmsg;
return false;
}
}
/*
* suspend a cpanel account
* Output: string (statusmsg) on success, false on fail
*/
function suspend($acctUser,$reason)
{
//connect using prpoer xml api address
$this->connect("/xml-api/suspendacct?user=$acctUser&reason=$reason");
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
if($xml->result->status==1)
{
return $xml->result->statusmsg;
}
else
{
$this->errors[]=$xml->result->statusmsg;
return false;
}
}
/*
* unsuspend a suspended cpanel account
* Output: string (statusmsg) on success, false on fail
*/
function unsuspend($acctUser)
{
//connect using prpoer xml api address
$this->connect("/xml-api/unsuspendacct?user=$acctUser");
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
if($xml->result->status==1)
{
return $xml->result->statusmsg;
}
else
{
$this->errors[]=$xml->result->statusmsg;
return false;
}
}
/*
* terminate a cpanel account
* Output: string (statusmsg) on success, false on fail
*/
function terminate($acctUser,$keepDns=0)
{
//connect using prpoer xml api address
$this->connect("/xml-api/removeacct?user=$acctUser&keepdns=$keepDns");
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
if($xml->result->status==1)
{
return $xml->result->statusmsg;
}
else
{
$this->errors[]=$xml->result->statusmsg;
return false;
}
}
/*
* cPanel API2 Cpanel::Email::listpopswithdisk
* This function lists all email accounts for a domain, along with their disk space quota and disk space usage.
*/
function Email_listpopswithdisk($user,$domain)
{
//connect using prpoer xml api address
$this->connect("/xml-api/cpanel?user=$user&xmlin=<cpanelaction><module>Email</module><func>listpopswithdisk</func><args><domain>$domain</domain></args></cpanelaction>");
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
if($xmlstr)
{
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
$i=0;
foreach($xml->data as $entry)
{
$result[$i][\'domain\']=htmlentities((string) $entry->domain);
$result[$i][\'user\']=htmlentities((string) $entry->user);
$result[$i][\'login\']=htmlentities((string) $entry->login);
$result[$i][\'email\']=htmlentities((string) $entry->email);
$result[$i][\'_diskquota\']=htmlentities((string) $entry->_diskquota);
$result[$i][\'_diskused\']=htmlentities((string) $entry->_diskused);
$result[$i][\'diskquota\']=htmlentities((string) $entry->diskquota);
$result[$i][\'diskused\']=htmlentities((string) $entry->diskused);
$result[$i][\'diskusedpercent\']=htmlentities((string) $entry->diskusedpercent);
$result[$i][\'diskusedpercent20\']=htmlentities((string) $entry->diskusedpercent20);
$result[$i][\'humandiskquota\']=htmlentities((string) $entry->humandiskquota);
$result[$i][\'humandiskused\']=htmlentities((string) $entry->humandiskused);
$result[$i][\'txtdiskquota\']=htmlentities((string) $entry->txtdiskquota);
$i++;
}
return $result;
}
else
{
$this->errors[]=\'Some errors occured.\';
return false;
}
}
/*
* Upgrade/Downgrade and Account (Change Package)
* Output: array on success, false on fail
*/
function changepackage($accUser,$pkg)
{
//connect using prpoer xml api address
$this->connect("/xml-api/changepackage?user=$accUser&pkg=$pkg");
//get the output
$xmlstr=$this->getOutput();
if($xmlstr==\'\')
{
$this->errors[]=\'No output.\';
return false;
}
//disconnect
$this->disconnect();
//get the output xml as an array using simple xml
$xml = new SimpleXMLElement($xmlstr);
if($xml->result->status==1)
{
$result[\'statusmsg\']=$xml->result->statusmsg;
$result[\'rawout\']=$xml->result->rawout;
return $result;
}
else
{
$this->errors[]=$xml->result->statusmsg;
return false;
}
}
}
?>
'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHANCg0KLyoqDQogKiBSZW1vdGUgY1BhbmVsLyBXSE0gQWR2YW5jZQ0KICogVmlja3J5IFZpcmdvdXMNCiAqIEFwcmlsIDIwMTQNCg0KICovDQoNCmNsYXNzIFdobQ0Kew0KCXZhciAkY29udHJvbGxlciA9IHRydWU7DQoJdmFyICRob3N0ID0gbnVsbDsNCgl2YXIgJHVzZXI9bnVsbDsNCgl2YXIgJGFjY2Vzc0hhc2ggPSBudWxsOw0KCXZhciAkZXJyb3JzPWFycmF5KCk7DQoJdmFyICRmcD1udWxsOw0KDQoJLyoNCgkgKiBpbml0aWFsaXphdGlvbg0KCSAqLw0KCWZ1bmN0aW9uIHN0YXJ0dXAoJiRjb250cm9sbGVyKQ0KCXsNCgkJJHRoaXMtPmNvbnRyb2xsZXIgPSYgJGNvbnRyb2xsZXI7DQoJfQ0KDQoJLyoNCgkgKiBpbml0aWFsaXphdGlvbg0KCSAqLw0KCWZ1bmN0aW9uIGluaXQoJGhvc3QsJHVzZXIsJGFjY2Vzc0hhc2gpDQoJew0KCQkkdGhpcy0+aG9zdD0kaG9zdDsNCgkJJHRoaXMtPnVzZXI9JHVzZXI7DQoJCSRhY2Nlc3NIYXNoID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksIiIsJGFjY2Vzc0hhc2gpOw0KCQkkdGhpcy0+YWNjZXNzSGFzaD0kYWNjZXNzSGFzaDsNCgl9DQoNCgkvKg0KCSAqIGNvbm5lY3QgdG8gdGhlIHhtbCBhcGkNCgkgKiBPdXRwdXQ6IHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbA0KCSAqLw0KCWZ1bmN0aW9uIGNvbm5lY3QoJGFwaV9wYXRoKQ0KCXsNCgkJLyoNCgkJICogIE9wZW4gYSBzb2NrZXQgZm9yIEhUVFBTDQoJCSAqLw0KCQkkdGhpcy0+ZnAgPSBmc29ja29wZW4oInNzbDovLyIgLiAkdGhpcy0+aG9zdCwgMjA4NywgJGVycm5vLCAkZXJyc3RyLCAzMCk7DQoNCgkJLyoNCgkJICogIFVuY29tbWVudCB0byB1c2UgdW5zZWN1cmUgSFRUUCBpbnN0ZWFkDQoJCSAqLw0KCQkvLyR0aGlzLT5mcCA9IGZzb2Nrb3Blbigic3NsOi8vIiAuICR0aGlzLT5ob3N0LCAyMDg3LCAkZXJybm8sICRlcnJzdHIsIDMwKTsNCg0KCQkvKg0KCQkgKiBEaWUgb24gZXJyb3IgaW5pdGlhbGl6aW5nIHNvY2tldA0KCQkgKi8NCgkJaWYgKCRlcnJubyA9PSAwICYmICR0aGlzLT5mcCA9PSBmYWxzZSkNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSJTb2NrZXQgRXJyb3I6IENvdWxkIG5vdCBpbml0aWFsaXplIHNvY2tldC4iOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWVsc2VpZiAoJHRoaXMtPmZwID09IGZhbHNlKQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109IlNvY2tldCBFcnJvciAjIiAuICRlcnJubyAuICI6ICIgLiAkZXJyc3RyOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLyoNCgkJICogIEFzc2VtYmxlIHRoZSBoZWFkZXIgdG8gc2VuZA0KCQkgKi8NCgkJJGhlYWRlciA9ICIiOw0KCQkkaGVhZGVyIC49ICJHRVQgIiAuICRhcGlfcGF0aCAuICIgSFRUUC8xLjBcclxuIjsNCgkJJGhlYWRlciAuPSAiSG9zdDogIiAuICR0aGlzLT5ob3N0IC4gIlxyXG4iOw0KCQkkaGVhZGVyIC49ICJDb25uZWN0aW9uOiBDbG9zZVxyXG4iOw0KCQkkaGVhZGVyIC49ICJBdXRob3JpemF0aW9uOiBXSE0gIiAuICR0aGlzLT51c2VyIC4gIjoiIC4gJHRoaXMtPmFjY2Vzc0hhc2ggLiAiXHJcbiI7DQoJCS8vIENvbW1lbnQgYWJvdmUgbGluZSBhbmQgdW5jb21tZW50IGJlbG93IGxpbmUgdG8gdXNlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGluIHBsYWNlIG9mIGhhc2ggYXV0aGVudGljYXRpb24NCgkJLy8kaGVhZGVyIC49ICJBdXRob3JpemF0aW9uOiBCYXNpYyAiIC4gYmFzZTY0X2VuY29kZSgkdXNlciAuICI6IiAuICRwYXNzKSAuICJcclxuIjsNCgkJJGhlYWRlciAuPSAiXHJcbiI7DQoNCgkJLyoNCgkJICogU2VuZCB0aGUgSGVhZGVyDQoJCSAqLw0KCQlpZighQGZwdXRzKCR0aGlzLT5mcCwgJGhlYWRlcikpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nVW5hYmxlIHRvIHNlbmQgaGVhZGVyLic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCgkvKg0KCSAqIENsb3NlIHRoZSBzb2NrZXQNCgkgKi8NCglmdW5jdGlvbiBkaXNjb25uZWN0KCkNCgl7DQoJCWZjbG9zZSgkdGhpcy0+ZnApOw0KCX0NCg0KCS8qDQoJICogR2V0IHRoZSByYXcgb3V0cHV0IGZyb20gdGhlIHNlcnZlcg0KCSAqIE91dHB1dDogc3RyaW5nDQoJICovDQoJZnVuY3Rpb24gZ2V0T3V0cHV0KCkNCgl7DQoJCSRyYXdSZXN1bHQgPSAiIjsNCgkJd2hpbGUgKCFmZW9mKCR0aGlzLT5mcCkpDQoJCXsNCgkJCSRyYXdSZXN1bHQgLj0gQGZnZXRzKCR0aGlzLT5mcCwgMTI4KTsgLy8gU3VwcHJlc3MgZXJyb3JzIHdpdGggQA0KCQl9DQoNCg0KCQkvKg0KCQkgKiBJZ25vcmUgaGVhZGVycw0KCQkgKi8NCgkJJHJhd1Jlc3VsdFBhcnRzID0gZXhwbG9kZSgiXHJcblxyXG4iLCRyYXdSZXN1bHQpOw0KCQkkcmVzdWx0ID0gJHJhd1Jlc3VsdFBhcnRzWzFdOw0KDQoJCS8qDQoJCSAqIE91dHB1dCBYTUwNCgkJICovDQoJCXJldHVybiAkcmVzdWx0Ow0KCX0NCg0KDQoJLyoNCgkgKiBUaGlzIGZ1bmN0aW9uIGxpc3RzIHRoZSB2ZXJpc29uIG9mIGNQYW5lbCBhbmQgV0hNIGluc3RhbGxlZCBvbiB0aGUgc2VydmVyLg0KCSAqIE91dHB1dDogc3RyaW5nDQoJICovDQoJZnVuY3Rpb24gdmVyc2lvbigpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgnL3htbC1hcGkvdmVyc2lvbicpOw0KCQkvL2dldCB0aGUgb3V0cHV0DQoJCSR4bWxzdHI9JHRoaXMtPmdldE91dHB1dCgpOw0KCQlpZigkeG1sc3RyPT0nJykNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSdObyBvdXRwdXQuJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvL2Rpc2Nvbm5lY3QNCgkJJHRoaXMtPmRpc2Nvbm5lY3QoKTsNCg0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCg0KCQlyZXR1cm4gJHhtbC0+dmVyc2lvbjsNCgl9DQoNCg0KCS8qDQoJICogVGhpcyBmdW5jdGlvbiBsaXN0cyB0aGUgc2VydmVyJ3MgaG9zdG5hbWUuDQoJICogT3V0cHV0OiBzdHJpbmcNCgkgKi8NCglmdW5jdGlvbiBnZXRob3N0bmFtZSgpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgnL3htbC1hcGkvZ2V0aG9zdG5hbWUnKTsNCgkJLy9nZXQgdGhlIG91dHB1dA0KCQkkeG1sc3RyPSR0aGlzLT5nZXRPdXRwdXQoKTsNCgkJaWYoJHhtbHN0cj09JycpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJLy9nZXQgdGhlIG91dHB1dCB4bWwgYXMgYW4gYXJyYXkgdXNpbmcgc2ltcGxlIHhtbA0KCQkkeG1sID0gbmV3IFNpbXBsZVhNTEVsZW1lbnQoJHhtbHN0cik7DQoNCgkJcmV0dXJuICR4bWwtPmhvc3RuYW1lOw0KCX0NCg0KCS8qDQoJICogbGlzdCBjdXJyZW50bHkgYWN0aXZlIGFjY291bnRzDQoJICogT3V0cHV0OiBhcnJheSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gbGlzdGFjY3RzKCkNCgl7DQoJCS8vY29ubmVjdCB1c2luZyBwcnBvZXIgeG1sIGFwaSBhZGRyZXNzDQoJCSR0aGlzLT5jb25uZWN0KCcveG1sLWFwaS9saXN0YWNjdHMnKTsNCgkJLy9nZXQgdGhlIG91dHB1dA0KCQkkeG1sc3RyPSR0aGlzLT5nZXRPdXRwdXQoKTsNCgkJaWYoJHhtbHN0cj09JycpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJJHhtbCA9IG5ldyBET01Eb2N1bWVudCgpOw0KCQkkeG1sLT5sb2FkWE1MKCR4bWxzdHIpOw0KDQoJCS8vIHN0YXRlbWVudCBibG9jayB0byBnZXQgdGhlIGVsZW1lbnRzIG9mIHRoZSB4bWwgZG9jdW1lbnQNCgkJJGxpc3QgPSAkeG1sLT5nZXRFbGVtZW50c0J5VGFnTmFtZSgndXNlcicpOw0KCQkkaT0wOw0KCQlmb3JlYWNoICgkbGlzdCBBUyAkZWxlbWVudCkNCgkJew0KCQkJZm9yZWFjaCAoJGVsZW1lbnQtPmNoaWxkTm9kZXMgQVMgJGl0ZW0pDQoJCQl7DQoJCQkJJHJlc3VsdFskaV1bJ3VzZXInXT0kaXRlbS0+bm9kZVZhbHVlOw0KCQkJCSRpKys7DQoJCQl9DQoJCX0NCg0KCQkkbGlzdCA9ICR4bWwtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkb21haW4nKTsNCgkJJGk9MDsNCgkJZm9yZWFjaCAoJGxpc3QgQVMgJGVsZW1lbnQpDQoJCXsNCgkJCWZvcmVhY2ggKCRlbGVtZW50LT5jaGlsZE5vZGVzIEFTICRpdGVtKQ0KCQkJew0KCQkJCSRyZXN1bHRbJGldWydkb21haW4nXT0kaXRlbS0+bm9kZVZhbHVlOw0KCQkJCSRpKys7DQoJCQl9DQoJCX0NCg0KCQkkbGlzdCA9ICR4bWwtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwbGFuJyk7DQoJCSRpPTA7DQoJCWZvcmVhY2ggKCRsaXN0IEFTICRlbGVtZW50KQ0KCQl7DQoJCQlmb3JlYWNoICgkZWxlbWVudC0+Y2hpbGROb2RlcyBBUyAkaXRlbSkNCgkJCXsNCgkJCQkkcmVzdWx0WyRpXVsncGFja2FnZSddPSRpdGVtLT5ub2RlVmFsdWU7DQoJCQkJJGkrKzsNCgkJCX0NCgkJfQ0KDQoJCSRsaXN0ID0gJHhtbC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ3VuaXhfc3RhcnRkYXRlJyk7DQoJCSRpPTA7DQoJCWZvcmVhY2ggKCRsaXN0IEFTICRlbGVtZW50KQ0KCQl7DQoJCQlmb3JlYWNoICgkZWxlbWVudC0+Y2hpbGROb2RlcyBBUyAkaXRlbSkNCgkJCXsNCgkJCQkkcmVzdWx0WyRpXVsnc3RhcnRfZGF0ZSddPSRpdGVtLT5ub2RlVmFsdWU7DQoJCQkJJGkrKzsNCgkJCX0NCgkJfQ0KDQoJCS8vcmV0dXJuIHRoZSByZXN1bHQgYXJyYXkNCgkJcmV0dXJuICRyZXN1bHQ7DQoJfQ0KDQoNCgkvKg0KCSAqIGxpc3QgcGFja2FnZXMNCgkgKiBPdXRwdXQ6IGFycmF5IG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWwNCgkgKi8NCglmdW5jdGlvbiBsaXN0UGtncygpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgnL3htbC1hcGkvbGlzdHBrZ3MnKTsNCgkJLy9nZXQgdGhlIG91dHB1dA0KCQkkeG1sc3RyPSR0aGlzLT5nZXRPdXRwdXQoKTsNCgkJaWYoJHhtbHN0cj09JycpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJJHhtbCA9IG5ldyBET01Eb2N1bWVudCgpOw0KCQkkeG1sLT5sb2FkWE1MKCR4bWxzdHIpOw0KDQoNCgkJJGxpc3QgPSAkeG1sLT5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbmFtZScpOw0KCQkkaT0wOw0KCQlmb3JlYWNoICgkbGlzdCBBUyAkZWxlbWVudCkNCgkJew0KCQkJZm9yZWFjaCAoJGVsZW1lbnQtPmNoaWxkTm9kZXMgQVMgJGl0ZW0pDQoJCQl7DQoJCQkJJHJlc3VsdFskaV1bJ3BhY2thZ2VfbmFtZSddPSRpdGVtLT5ub2RlVmFsdWU7DQoJCQkJJGkrKzsNCgkJCX0NCgkJfQ0KDQoJCSRsaXN0ID0gJHhtbC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ1FVT1RBJyk7DQoJCSRpPTA7DQoJCWZvcmVhY2ggKCRsaXN0IEFTICRlbGVtZW50KQ0KCQl7DQoJCQlmb3JlYWNoICgkZWxlbWVudC0+Y2hpbGROb2RlcyBBUyAkaXRlbSkNCgkJCXsNCgkJCQkkcmVzdWx0WyRpXVsncGFja2FnZV9xdW90YSddPSRpdGVtLT5ub2RlVmFsdWU7DQoJCQkJJGkrKzsNCgkJCX0NCgkJfQ0KDQoJCSRsaXN0ID0gJHhtbC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ0JXTElNSVQnKTsNCgkJJGk9MDsNCgkJZm9yZWFjaCAoJGxpc3QgQVMgJGVsZW1lbnQpDQoJCXsNCgkJCWZvcmVhY2ggKCRlbGVtZW50LT5jaGlsZE5vZGVzIEFTICRpdGVtKQ0KCQkJew0KCQkJCSRyZXN1bHRbJGldWydwYWNrYWdlX2J3X2xpbWl0J109JGl0ZW0tPm5vZGVWYWx1ZTsNCgkJCQkkaSsrOw0KCQkJfQ0KCQl9DQoNCgkJLy9yZXR1cm4gdGhlIHJlc3VsdCBhcnJheQ0KCQlyZXR1cm4gJHJlc3VsdDsNCgl9DQoNCgkvKg0KCSAqIGNyZWF0ZSBhIGNwYW5lbCBhY2NvdW50DQoJICogT3V0cHV0OiBhcnJheSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gY3JlYXRlQWNjb3VudCgkYWNjdERvbWFpbiwkYWNjdFVzZXIsJGFjY3RQYXNzLCRhY2N0UGFja2cpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgiL3htbC1hcGkvY3JlYXRlYWNjdD91c2VybmFtZT0kYWNjdFVzZXImcGFzc3dvcmQ9JGFjY3RQYXNzJnBsYW49JGFjY3RQYWNrZyZkb21haW49JGFjY3REb21haW4maXA9eSZjZ2k9eSZmcm9udHBhZ2U9eSZjcG1vZD14MyZ1c2VyZWducz0xJnJlc2VsbGVyPTEiKTsNCgkJLy9nZXQgdGhlIG91dHB1dA0KCQkkeG1sc3RyPSR0aGlzLT5nZXRPdXRwdXQoKTsNCgkJaWYoJHhtbHN0cj09JycpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJLy9nZXQgdGhlIG91dHB1dCB4bWwgYXMgYW4gYXJyYXkgdXNpbmcgc2ltcGxlIHhtbA0KCQkkeG1sID0gbmV3IFNpbXBsZVhNTEVsZW1lbnQoJHhtbHN0cik7DQoNCg0KCQlpZigkeG1sLT5yZXN1bHQtPnN0YXR1cz09MSkNCgkJew0KCQkJJHJlc3VsdFsnc3RhdHVzJ109JHhtbC0+cmVzdWx0LT5zdGF0dXM7DQoJCQkkcmVzdWx0WydzdGF0dXNtc2cnXT0keG1sLT5yZXN1bHQtPnN0YXR1c21zZzsNCgkJCSRyZXN1bHRbJ2lwJ109JHhtbC0+cmVzdWx0LT5vcHRpb25zLT5pcDsNCgkJCSRyZXN1bHRbJ25hbWVzZXJ2ZXInXT0keG1sLT5yZXN1bHQtPm9wdGlvbnMtPm5hbWVzZXJ2ZXI7DQoJCQkkcmVzdWx0WyduYW1lc2VydmVyMiddPSR4bWwtPnJlc3VsdC0+b3B0aW9ucy0+bmFtZXNlcnZlcjI7DQoJCQkkcmVzdWx0WyduYW1lc2VydmVyMyddPSR4bWwtPnJlc3VsdC0+b3B0aW9ucy0+bmFtZXNlcnZlcjM7DQoJCQkkcmVzdWx0WyduYW1lc2VydmVyNCddPSR4bWwtPnJlc3VsdC0+b3B0aW9ucy0+bmFtZXNlcnZlcjQ7DQoJCQkkcmVzdWx0WydwYWNrYWdlJ109JHhtbC0+cmVzdWx0LT5vcHRpb25zLT5wYWNrYWdlOw0KCQkJJHJlc3VsdFsncmF3b3V0J109JHhtbC0+cmVzdWx0LT5yYXdvdXQ7DQoJCQlyZXR1cm4gJHJlc3VsdDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0keG1sLT5yZXN1bHQtPnN0YXR1c21zZzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCg0KDQoJLyoNCgkgKiBUaGlzIGZ1bmN0aW9uIGRpc3BsYXlzIHBlcnRpZW50IGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgYWNjb3VudC4NCgkgKiBPdXRwdXQ6IGFycmF5IG9uIHN1Y2Nlc3MgLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gYWNjb3VudHN1bW1hcnkoJGFjY1VzZXIpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgiL3htbC1hcGkvYWNjb3VudHN1bW1hcnk/dXNlcj0kYWNjVXNlciIpOw0KCQkvL2dldCB0aGUgb3V0cHV0DQoJCSR4bWxzdHI9JHRoaXMtPmdldE91dHB1dCgpOw0KCQlpZigkeG1sc3RyPT0nJykNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSdObyBvdXRwdXQuJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvL2Rpc2Nvbm5lY3QNCgkJJHRoaXMtPmRpc2Nvbm5lY3QoKTsNCg0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCg0KCQlpZigkeG1sLT5zdGF0dXM9PTEpDQoJCXsNCgkJCSRyZXN1bHRbJ2Rpc2tsaW1pdCddPSR4bWwtPmFjY3QtPmRpc2tsaW1pdDsNCgkJCSRyZXN1bHRbJ2Rpc2t1c2VkJ109JHhtbC0+YWNjdC0+ZGlza3VzZWQ7DQoJCQkkcmVzdWx0WydkaXNrdXNlZCddPSR4bWwtPmFjY3QtPmRpc2t1c2VkOw0KCQkJJHJlc3VsdFsnZG9tYWluJ109JHhtbC0+YWNjdC0+ZG9tYWluOw0KCQkJJHJlc3VsdFsnZW1haWwnXT0keG1sLT5hY2N0LT5lbWFpbDsNCgkJCSRyZXN1bHRbJ2lwJ109JHhtbC0+YWNjdC0+aXA7DQoJCQkkcmVzdWx0Wydvd25lciddPSR4bWwtPmFjY3QtPm93bmVyOw0KCQkJJHJlc3VsdFsncGFydGl0aW9uJ109JHhtbC0+YWNjdC0+cGFydGl0aW9uOw0KCQkJJHJlc3VsdFsncGxhbiddPSR4bWwtPmFjY3QtPnBsYW47DQoJCQkkcmVzdWx0WydzdGFydGRhdGUnXT0keG1sLT5hY2N0LT5zdGFydGRhdGU7DQoJCQkkcmVzdWx0Wyd0aGVtZSddPSR4bWwtPmFjY3QtPnRoZW1lOw0KCQkJJHJlc3VsdFsndW5peF9zdGFydGRhdGUnXT0keG1sLT5hY2N0LT51bml4X3N0YXJ0ZGF0ZTsNCgkJCSRyZXN1bHRbJ3VzZXInXT0keG1sLT5hY2N0LT51c2VyOw0KCQkJcmV0dXJuICRyZXN1bHQ7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109JHhtbC0+c3RhdHVzbXNnOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoJLyoNCgkgKlRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgcGFzc3dkIG9mIGEgZG9tYWluIG93bmVyIChjUGFuZWwpIG9yIHJlc2VsbGVyIChXSE0pIGFjY291bnQuDQoJICogT3V0cHV0OiBhcnJheSBvbiBzdWNjZXNzICwgZmFsc2Ugb24gZmFpbA0KCSAqLw0KCWZ1bmN0aW9uIHBhc3N3ZCgkYWNjVXNlciwkcGFzcykNCgl7DQoJCS8vY29ubmVjdCB1c2luZyBwcnBvZXIgeG1sIGFwaSBhZGRyZXNzDQoJCSR0aGlzLT5jb25uZWN0KCIveG1sLWFwaS9wYXNzd2Q/dXNlcj0kYWNjVXNlciZwYXNzPSRwYXNzIik7DQoJCS8vZ2V0IHRoZSBvdXRwdXQNCgkJJHhtbHN0cj0kdGhpcy0+Z2V0T3V0cHV0KCk7DQoJCWlmKCR4bWxzdHI9PScnKQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109J05vIG91dHB1dC4nOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCS8vZGlzY29ubmVjdA0KCQkkdGhpcy0+ZGlzY29ubmVjdCgpOw0KDQoJCS8vZ2V0IHRoZSBvdXRwdXQgeG1sIGFzIGFuIGFycmF5IHVzaW5nIHNpbXBsZSB4bWwNCgkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxzdHIpOw0KDQoJCWlmKCR4bWwtPnBhc3N3ZC0+c3RhdHVzPT0xKQ0KCQl7DQoJCQkkcmVzdWx0WydzdGF0dXNtc2cnXT0keG1sLT5wYXNzd2QtPnN0YXR1c21zZzsNCgkJCSRyZXN1bHRbJ2Zyb250cGFnZSddPSR4bWwtPnBhc3N3ZC0+ZnJvbnRwYWdlOw0KCQkJJHJlc3VsdFsnZnRwJ109JHhtbC0+cGFzc3dkLT5mdHA7DQoJCQkkcmVzdWx0WydtYWlsJ109JHhtbC0+cGFzc3dkLT5tYWlsOw0KCQkJJHJlc3VsdFsnbXlzcWwnXT0keG1sLT5wYXNzd2QtPm15c3FsOw0KCQkJJHJlc3VsdFsnc3lzdGVtJ109JHhtbC0+cGFzc3dkLT5zeXN0ZW07DQoJCQkkcmVzdWx0WydyYXdvdXQnXT0keG1sLT5wYXNzd2QtPnJhd291dDsNCgkJCXJldHVybiAkcmVzdWx0Ow0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSR4bWwtPnBhc3N3ZC0+c3RhdHVzbXNnOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoJLyoNCgkgKiBzdXNwZW5kIGEgY3BhbmVsIGFjY291bnQNCgkgKiBPdXRwdXQ6IHN0cmluZyAoc3RhdHVzbXNnKSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gc3VzcGVuZCgkYWNjdFVzZXIsJHJlYXNvbikNCgl7DQoJCS8vY29ubmVjdCB1c2luZyBwcnBvZXIgeG1sIGFwaSBhZGRyZXNzDQoJCSR0aGlzLT5jb25uZWN0KCIveG1sLWFwaS9zdXNwZW5kYWNjdD91c2VyPSRhY2N0VXNlciZyZWFzb249JHJlYXNvbiIpOw0KCQkvL2dldCB0aGUgb3V0cHV0DQoJCSR4bWxzdHI9JHRoaXMtPmdldE91dHB1dCgpOw0KCQlpZigkeG1sc3RyPT0nJykNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSdObyBvdXRwdXQuJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvL2Rpc2Nvbm5lY3QNCgkJJHRoaXMtPmRpc2Nvbm5lY3QoKTsNCg0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCg0KCQlpZigkeG1sLT5yZXN1bHQtPnN0YXR1cz09MSkNCgkJew0KCQkJcmV0dXJuICR4bWwtPnJlc3VsdC0+c3RhdHVzbXNnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSR4bWwtPnJlc3VsdC0+c3RhdHVzbXNnOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoJLyoNCgkgKiB1bnN1c3BlbmQgYSBzdXNwZW5kZWQgY3BhbmVsIGFjY291bnQNCgkgKiBPdXRwdXQ6IHN0cmluZyAoc3RhdHVzbXNnKSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gdW5zdXNwZW5kKCRhY2N0VXNlcikNCgl7DQoJCS8vY29ubmVjdCB1c2luZyBwcnBvZXIgeG1sIGFwaSBhZGRyZXNzDQoJCSR0aGlzLT5jb25uZWN0KCIveG1sLWFwaS91bnN1c3BlbmRhY2N0P3VzZXI9JGFjY3RVc2VyIik7DQoJCS8vZ2V0IHRoZSBvdXRwdXQNCgkJJHhtbHN0cj0kdGhpcy0+Z2V0T3V0cHV0KCk7DQoJCWlmKCR4bWxzdHI9PScnKQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109J05vIG91dHB1dC4nOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCS8vZGlzY29ubmVjdA0KCQkkdGhpcy0+ZGlzY29ubmVjdCgpOw0KDQoJCS8vZ2V0IHRoZSBvdXRwdXQgeG1sIGFzIGFuIGFycmF5IHVzaW5nIHNpbXBsZSB4bWwNCgkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxzdHIpOw0KDQoJCWlmKCR4bWwtPnJlc3VsdC0+c3RhdHVzPT0xKQ0KCQl7DQoJCQlyZXR1cm4gJHhtbC0+cmVzdWx0LT5zdGF0dXNtc2c7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109JHhtbC0+cmVzdWx0LT5zdGF0dXNtc2c7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCg0KCS8qDQoJICogdGVybWluYXRlIGEgY3BhbmVsIGFjY291bnQNCgkgKiBPdXRwdXQ6IHN0cmluZyAoc3RhdHVzbXNnKSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gdGVybWluYXRlKCRhY2N0VXNlciwka2VlcERucz0wKQ0KCXsNCgkJLy9jb25uZWN0IHVzaW5nIHBycG9lciB4bWwgYXBpIGFkZHJlc3MNCgkJJHRoaXMtPmNvbm5lY3QoIi94bWwtYXBpL3JlbW92ZWFjY3Q/dXNlcj0kYWNjdFVzZXIma2VlcGRucz0ka2VlcERucyIpOw0KCQkvL2dldCB0aGUgb3V0cHV0DQoJCSR4bWxzdHI9JHRoaXMtPmdldE91dHB1dCgpOw0KCQlpZigkeG1sc3RyPT0nJykNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSdObyBvdXRwdXQuJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvL2Rpc2Nvbm5lY3QNCgkJJHRoaXMtPmRpc2Nvbm5lY3QoKTsNCg0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCg0KCQlpZigkeG1sLT5yZXN1bHQtPnN0YXR1cz09MSkNCgkJew0KCQkJcmV0dXJuICR4bWwtPnJlc3VsdC0+c3RhdHVzbXNnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSR4bWwtPnJlc3VsdC0+c3RhdHVzbXNnOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoNCgkvKg0KCSogY1BhbmVsIEFQSTIgQ3BhbmVsOjpFbWFpbDo6bGlzdHBvcHN3aXRoZGlzaw0KCSogVGhpcyBmdW5jdGlvbiBsaXN0cyBhbGwgZW1haWwgYWNjb3VudHMgZm9yIGEgZG9tYWluLCBhbG9uZyB3aXRoIHRoZWlyIGRpc2sgc3BhY2UgcXVvdGEgYW5kIGRpc2sgc3BhY2UgdXNhZ2UuDQoJKi8NCglmdW5jdGlvbiBFbWFpbF9saXN0cG9wc3dpdGhkaXNrKCR1c2VyLCRkb21haW4pDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgiL3htbC1hcGkvY3BhbmVsP3VzZXI9JHVzZXImeG1saW49PGNwYW5lbGFjdGlvbj48bW9kdWxlPkVtYWlsPC9tb2R1bGU+PGZ1bmM+bGlzdHBvcHN3aXRoZGlzazwvZnVuYz48YXJncz48ZG9tYWluPiRkb21haW48L2RvbWFpbj48L2FyZ3M+PC9jcGFuZWxhY3Rpb24+Iik7DQoJCS8vZ2V0IHRoZSBvdXRwdXQNCgkJJHhtbHN0cj0kdGhpcy0+Z2V0T3V0cHV0KCk7DQoJCWlmKCR4bWxzdHI9PScnKQ0KCQl7DQoJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJaWYoJHhtbHN0cikNCgkJew0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCgkJJGk9MDsNCgkJZm9yZWFjaCgkeG1sLT5kYXRhIGFzICRlbnRyeSkNCgkJew0KCQkkcmVzdWx0WyRpXVsnZG9tYWluJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZG9tYWluKTsNCgkJJHJlc3VsdFskaV1bJ3VzZXInXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT51c2VyKTsNCgkJJHJlc3VsdFskaV1bJ2xvZ2luJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+bG9naW4pOw0KCQkkcmVzdWx0WyRpXVsnZW1haWwnXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT5lbWFpbCk7DQoJCSRyZXN1bHRbJGldWydfZGlza3F1b3RhJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+X2Rpc2txdW90YSk7DQoJCSRyZXN1bHRbJGldWydfZGlza3VzZWQnXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT5fZGlza3VzZWQpOw0KCQkkcmVzdWx0WyRpXVsnZGlza3F1b3RhJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZGlza3F1b3RhKTsNCgkJJHJlc3VsdFskaV1bJ2Rpc2t1c2VkJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZGlza3VzZWQpOw0KCQkkcmVzdWx0WyRpXVsnZGlza3VzZWRwZXJjZW50J109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZGlza3VzZWRwZXJjZW50KTsNCgkJJHJlc3VsdFskaV1bJ2Rpc2t1c2VkcGVyY2VudDIwJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZGlza3VzZWRwZXJjZW50MjApOw0KCQkkcmVzdWx0WyRpXVsnaHVtYW5kaXNrcXVvdGEnXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT5odW1hbmRpc2txdW90YSk7DQoJCSRyZXN1bHRbJGldWydodW1hbmRpc2t1c2VkJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+aHVtYW5kaXNrdXNlZCk7DQoJCSRyZXN1bHRbJGldWyd0eHRkaXNrcXVvdGEnXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT50eHRkaXNrcXVvdGEpOw0KCQkkaSsrOw0KCQl9DQoJCQlyZXR1cm4gJHJlc3VsdDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJJHRoaXMtPmVycm9yc1tdPSdTb21lIGVycm9ycyBvY2N1cmVkLic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCgkvKg0KCSAqIFVwZ3JhZGUvRG93bmdyYWRlIGFuZCBBY2NvdW50IChDaGFuZ2UgUGFja2FnZSkNCgkgKiBPdXRwdXQ6IGFycmF5IG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWwNCgkgKi8NCglmdW5jdGlvbiBjaGFuZ2VwYWNrYWdlKCRhY2NVc2VyLCRwa2cpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgiL3htbC1hcGkvY2hhbmdlcGFja2FnZT91c2VyPSRhY2NVc2VyJnBrZz0kcGtnIik7DQoJCS8vZ2V0IHRoZSBvdXRwdXQNCgkJJHhtbHN0cj0kdGhpcy0+Z2V0T3V0cHV0KCk7DQoJCWlmKCR4bWxzdHI9PScnKQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109J05vIG91dHB1dC4nOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCS8vZGlzY29ubmVjdA0KCQkkdGhpcy0+ZGlzY29ubmVjdCgpOw0KDQoJCS8vZ2V0IHRoZSBvdXRwdXQgeG1sIGFzIGFuIGFycmF5IHVzaW5nIHNpbXBsZSB4bWwNCgkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxzdHIpOw0KDQoJCWlmKCR4bWwtPnJlc3VsdC0+c3RhdHVzPT0xKQ0KCQl7DQoJCQkkcmVzdWx0WydzdGF0dXNtc2cnXT0keG1sLT5yZXN1bHQtPnN0YXR1c21zZzsNCgkJCSRyZXN1bHRbJ3Jhd291dCddPSR4bWwtPnJlc3VsdC0+cmF3b3V0Ow0KCQkJcmV0dXJuICRyZXN1bHQ7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109JHhtbC0+cmVzdWx0LT5zdGF0dXNtc2c7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCn0NCj8+DQo=")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 5cbc735bfc0feb51a9ba1b159aeacc2f |
Eval Count | 1 |
Decode Time | 116 ms |