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("PD9waHANCg0KZGVmaW5lKCJDSEFSIiwiQUJDREVGR0hJSktMTU5PUFFSU1..

Decoded Output download

?>b'<?php

define("CHAR","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_");
define("BBCHAR","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789[]=_\/|+-*.<>()%^$#@!
	");
define("NUMBER","0123456789");
class CNeoInject
{
	public function Encode(&$str)
	{
		$str = base64_encode($str);
		return $str;
	}
	public function Decode(&$str)
	{
		$str = base64_decode($str);
		return $str;
	}
	public function sec_BBString($str)
	{
		$ret = "";
		$aSTR = str_split($str,1);
		$aCHAR = str_split(BBCHAR,1);
		for( $i = 0 ; $i <= strlen($str) ; $i ++ )
		{
			for( $l = 0 ; $l <= strlen(BBCHAR) ; $l ++ )
			{
				if ( $aCHAR[$l] == $aSTR[$i] )
				{
					$ret = $ret.$aSTR[$i];
				}
			}
		}
		return $ret;
	}
	public function sec_String($str)
	{
		$ret = "";
		$aSTR = str_split($str,1);
		$aCHAR = str_split(CHAR,1);
		for( $i = 0 ; $i <= strlen($str) ; $i ++ )
		{
			for( $l = 0 ; $l <= strlen(CHAR) ; $l ++ )
			{
				if ( $aCHAR[$l] == $aSTR[$i] )
				{
					$ret = $ret.$aSTR[$i];
				}
			}
		}
		return $ret;
	}

	public function sec_Int($str)
	{
		$ret = "";
		$aSTR = str_split($str,1);
		$aCHAR = str_split(NUMBER,1);
		for( $i = 0 ; $i <= strlen($str) ; $i ++ )
		{
			for( $l = 0 ; $l <= strlen(NUMBER) ; $l ++ )
			{
				if ( $aCHAR[$l] == $aSTR[$i] )
				{
					$ret = $ret.$aSTR[$i];
				}
			}
		}
		return (int)$ret;
	}

	/*PROTECT BEGIN*/
	/**
	 * @shortdesc url to redirect if an sql inject attempt is detect. if unset, value is FALSE
	 * @private
	 * @type mixed
	 */
    var $urlRedirect;
    /**
	 * @shortdesc does the session must be destroy if an attempt is detect
	 * @private
	 * @type bool
	 */
    var $bdestroy_session;
    /**
	 * @shortdesc the SQL data currently test
	 * @private
	 * @type string
	 */
    var $rq;
    /**
	 * @shortdesc if not FALSE, the url to the log file
	 * @private
	 * @type mixed
	 */
    var $bLog;

    /**
	 * Builder
	 *
	 * @param bool bdestroy_session optional. does the session must be destroy if an attempt is detect?
	 * @param string urlRedirect optional. url to redirect if an sql inject attempt is detect
     * @public
	 * @type void
     */
    function sql_inject($mLog=FALSE,$bdestroy_session=FALSE,$urlRedirect=FALSE)
    {
        $this->bLog = (($mLog!=FALSE)?$mLog:\'\');
        $this->urlRedirect = (((trim($urlRedirect)!=\'\') && file_exists($urlRedirect))?$urlRedirect:\'\');
        $this->bdestroy_session = $bdestroy_session;
        $this->rq = \'\';
    }

    /**
	 * @shortdesc test if there is a sql inject attempt detect
	 * test if there is a sql inject attempt detect
	 *
	 * @param string sRQ required. SQL Data to test
     * @public
	 * @type bool
     */
    function test($sRQ)
    {
        $sRQ = strtolower($sRQ);
        $this->rq = $sRQ;
        $aValues = array();
        $aTemp = array(); // temp array
        $aWords = array(); //
        $aSep = array(\' and \',\' or \'); // separators for detect the
        $sConditions = \'(\';
        $matches = array();
        $sSep = \'\';
        // is there an attempt to unused part of the rq?
        if (is_int((strpos($sRQ,"#")))&&$this->_in_post(\'#\')) return $this->detect();

        // is there a attempt to do a 2nd SQL requete ?
        if (is_int(strpos($sRQ,\';\'))){
            $aTemp = explode(\';\',$sRQ);
            if ($this->_in_post($aTemp[1])) return $this->detect();
        }

        $aTemp = explode(" where ",$sRQ);
        if (count($aTemp)==1) return FALSE;
        $sConditions = $aTemp[1];
        $aWords = explode(" ",$sConditions);
        if(strcasecmp($aWords[0],\'select\')!=0) $aSep[] = \',\';
        $sSep = \'(\'.implode(\'|\',$aSep).\')\';
        $aValues = preg_split($sSep,$sConditions,-1, PREG_SPLIT_NO_EMPTY);

        // test the always true expressions
        foreach($aValues as $i => $v)
        {
            // SQL injection like 1=1 or a=a or \'za\'=\'za\'
            if (is_int(strpos($v,\'=\')))
            {
                 $aTemp = explode(\'=\',$v);
                 if (trim($aTemp[0])==trim($aTemp[1])) return $this->detect();
            }

            //SQL injection like 1<>2
            if (is_int(strpos($v,\'<>\')))
            {
                $aTemp = explode(\'<>\',$v);
                if ((trim($aTemp[0])!=trim($aTemp[1]))&& ($this->_in_post(\'<>\'))) return $this->detect();
            }
        }

        if (strpos($sConditions,\' null\'))
        {
            if (preg_match("/null +is +null/",$sConditions)) return $this->detect();
            if (preg_match("/is +not +null/",$sConditions,$matches))
            {
                foreach($matches as $i => $v)
                {
                    if ($this->_in_post($v))return $this->detect();
                }
            }
        }

        if (preg_match("/[a-z0-9]+ +between +[a-z0-9]+ +and +[a-z0-9]+/",$sConditions,$matches))
        {
            $Temp = explode(\' between \',$matches[0]);
            $Evaluate = $Temp[0];
            $Temp = explode(\' and \',$Temp[1]);
            if ((strcasecmp($Evaluate,$Temp[0])>0) && (strcasecmp($Evaluate,$Temp[1])<0) && $this->_in_post($matches[0])) return $this->detect();
        }
        return FALSE;
    }

    function _in_post($value)
    {
        foreach($_POST as $i => $v)
        {
             if (is_int(strpos(strtolower($v),$value))) return TRUE;
        }
        return FALSE;
    }

    function detect()
    {
        // log the attempt to sql inject?
        if ($this->bLog)
        {
            $fp = @fopen($this->bLog,\'a+\');
            if ($fp)
            {
                fputs($fp,"
".date("d-m-Y H:i:s").\' [\'.$this->rq.\'] from \'.$this->sIp = getenv("REMOTE_ADDR"));
                fclose($fp);
            }
        }
        // destroy session?
        if ($this->bdestroy_session) session_destroy();
        // redirect?
        if ($this->urlRedirect!=\'\'){
             if (!headers_sent())  header("location: $this->urlRedirect");
        }
        return TRUE;
    }

	function protect1($protected) { // This Will be the fuction we call to protect the variables.
		if ( $protected == "" ) return ;
		$banlist = array ("\'", "\"", "<", "\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
		//$banlist is the list of words you dont want to allow.
		if ( eregi ( "[a-zA-Z0-9@]+", $protected ) ) { // Makes sure only legitimate Characters are used.
			$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
			return $protected;
			//echo "+";
		} else {
			return ;
			//echo "-";
			//echo $protected;
			//die ( \'This word not support\' ); // Message if thier is any characters not in [a-zA-Z0-9].
		} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
	} // ends the function Protect() {

	function protect2($protected) { // This Will be the fuction we call to protect the variables.
		if ( $protected == "" ) return ;
		$banlist = array ("\'", "\"", "<", "\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
		//$banlist is the list of words you dont want to allow.
		if ( eregi ( "[0-9]+", $protected ) ) { // Makes sure only legitimate Characters are used.
			$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
			return $protected;
			//echo "+";
		} else {
			return ;
			//echo "-";
			//echo $protected;
			//die ( \'This word not support\' ); // Message if thier is any characters not in [a-zA-Z0-9].
		} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
	} // ends the function Protect() {

	function protect3($protected) { // This Will be the fuction we call to protect the variables.
		if ( $protected == "" ) return ;
		$banlist = array ("\'", "\"", "<", "\", "|", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
		//$banlist is the list of words you dont want to allow.
		if ( eregi ( "[-a-zA-Z0-9@]+", $protected ) ) { // Makes sure only legitimate Characters are used.
			$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
			return $protected;
			//echo "+";
		} else {
			return ;
			//echo "-";
			//echo $protected;
			//die ( \'This word not support\' ); // Message if thier is any characters not in [a-zA-Z0-9].
		} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
	} // ends the function Protect() {

	/*PROTECT END*/
}

$ip = $_SERVER[\'REMOTE_ADDR\'];
$time = date("l dS of F Y h:i:s A");
$script = $_SERVER[PATH_TRANSLATED];
$fp = fopen ("Injection.txt", "a+");
$sql_inject_1 = array(";","\'","%",\'"\'); #Whoth need replace
$sql_inject_2 = array("", "","","&quot;"); #To wont replace
$GET_KEY = array_keys($_GET); #array keys from $_GET
$POST_KEY = array_keys($_POST); #array keys from $_POST
$COOKIE_KEY = array_keys($_COOKIE); #array keys from $_COOKIE
/*begin clear $_GET */
for($i=0;$i<count($GET_KEY);$i++)
{
$real_get[$i] = $_GET[$GET_KEY[$i]];
$_GET[$GET_KEY[$i]] = str_replace($sql_inject_1, $sql_inject_2, HtmlSpecialChars($_GET[$GET_KEY[$i]]));
if($real_get[$i] != $_GET[$GET_KEY[$i]])
{
fwrite ($fp, "IP: $ip
");
fwrite ($fp, "Method: GET
");
fwrite ($fp, "Value: $real_get[$i]
");
fwrite ($fp, "Script: $script
");
fwrite ($fp, "Time: $time
");
fwrite ($fp, "==================================
");
}
}
/*end clear $_GET */
/*begin clear $_POST */
for($i=0;$i<count($POST_KEY);$i++)
{
$real_post[$i] = $_POST[$POST_KEY[$i]];
$_POST[$POST_KEY[$i]] = str_replace($sql_inject_1, $sql_inject_2, HtmlSpecialChars($_POST[$POST_KEY[$i]]));
if($real_post[$i] != $_POST[$POST_KEY[$i]])
{
fwrite ($fp, "IP: $ip
");
fwrite ($fp, "Method: POST
");
fwrite ($fp, "Value: $real_post[$i]
");
fwrite ($fp, "Script: $script
");
fwrite ($fp, "Time: $time
");
fwrite ($fp, "==================================
");
}
}
/*end clear $_POST */
/*begin clear $_COOKIE */
for($i=0;$i<count($COOKIE_KEY);$i++)
{
$real_cookie[$i] = $_COOKIE[$COOKIE_KEY[$i]];
$_COOKIE[$COOKIE_KEY[$i]] = str_replace($sql_inject_1, $sql_inject_2, HtmlSpecialChars($_COOKIE[$COOKIE_KEY[$i]]));
if($real_cookie[$i] != $_COOKIE[$COOKIE_KEY[$i]])
{
fwrite ($fp, "IP: $ip
");
fwrite ($fp, "Method: COOKIE
");
fwrite ($fp, "Value: $real_cookie[$i]
");
fwrite ($fp, "Script: $script
");
fwrite ($fp, "Time: $time
");
fwrite ($fp, "==================================
");
}
}

/*end clear $_COOKIE */
fclose ($fp);
$xa = getenv(\'REMOTE_ADDR\');
$badwords = array(";","\'","\"","*","union","del","DEL","insert","update","drop","sele","memb","set","$","res3t","wareh","%");

foreach($_POST as $value)
  foreach($badwords as $word)
    if(substr_count($value, $word) > 0)
      die("Error IP: $xa ");

class sql_inject
{
    /**
	 * @shortdesc url to redirect if an sql inject attempt is detect. if unset, value is FALSE
	 * @private
	 * @type mixed
	 */
    var $urlRedirect;
    /**
	 * @shortdesc does the session must be destroy if an attempt is detect
	 * @private
	 * @type bool
	 */
    var $bdestroy_session;
    /**
	 * @shortdesc the SQL data currently test
	 * @private
	 * @type string
	 */
    var $rq;
    /**
	 * @shortdesc if not FALSE, the url to the log file
	 * @private
	 * @type mixed
	 */
    var $bLog;

    /**
	 * Builder
	 *
	 * @param bool bdestroy_session optional. does the session must be destroy if an attempt is detect?
	 * @param string urlRedirect optional. url to redirect if an sql inject attempt is detect
     * @public
	 * @type void
     */
    function sql_inject($mLog=FALSE,$bdestroy_session=FALSE,$urlRedirect=FALSE)
    {
        $this->bLog = (($mLog!=FALSE)?$mLog:\'\');
        $this->urlRedirect = (((trim($urlRedirect)!=\'\') && file_exists($urlRedirect))?$urlRedirect:\'\');
        $this->bdestroy_session = $bdestroy_session;
        $this->rq = \'\';
    }

    /**
	 * @shortdesc test if there is a sql inject attempt detect
	 * test if there is a sql inject attempt detect
	 *
	 * @param string sRQ required. SQL Data to test
     * @public
	 * @type bool
     */
    function test($sRQ)
    {
        $sRQ = strtolower($sRQ);
        $this->rq = $sRQ;
        $aValues = array();
        $aTemp = array(); // temp array
        $aWords = array(); //
        $aSep = array(\' and \',\' or \'); // separators for detect the
        $sConditions = \'(\';
        $matches = array();
        $sSep = \'\';
        // is there an attempt to unused part of the rq?
        if (is_int((strpos($sRQ,"#")))&&$this->_in_post(\'#\')) return $this->detect();

        // is there a attempt to do a 2nd SQL requete ?
        if (is_int(strpos($sRQ,\';\'))){
            $aTemp = explode(\';\',$sRQ);
            if ($this->_in_post($aTemp[1])) return $this->detect();
        }

        $aTemp = explode(" where ",$sRQ);
        if (count($aTemp)==1) return FALSE;
        $sConditions = $aTemp[1];
        $aWords = explode(" ",$sConditions);
        if(strcasecmp($aWords[0],\'select\')!=0) $aSep[] = \',\';
        $sSep = \'(\'.implode(\'|\',$aSep).\')\';
        $aValues = preg_split($sSep,$sConditions,-1, PREG_SPLIT_NO_EMPTY);

        // test the always true expressions
        foreach($aValues as $i => $v)
        {
            // SQL injection like 1=1 or a=a or \'za\'=\'za\'
            if (is_int(strpos($v,\'=\')))
            {
                 $aTemp = explode(\'=\',$v);
                 if (trim($aTemp[0])==trim($aTemp[1])) return $this->detect();
            }

            //SQL injection like 1<>2
            if (is_int(strpos($v,\'<>\')))
            {
                $aTemp = explode(\'<>\',$v);
                if ((trim($aTemp[0])!=trim($aTemp[1]))&& ($this->_in_post(\'<>\'))) return $this->detect();
            }
        }

        if (strpos($sConditions,\' null\'))
        {
            if (preg_match("/null +is +null/",$sConditions)) return $this->detect();
            if (preg_match("/is +not +null/",$sConditions,$matches))
            {
                foreach($matches as $i => $v)
                {
                    if ($this->_in_post($v))return $this->detect();
                }
            }
        }

        if (preg_match("/[a-z0-9]+ +between +[a-z0-9]+ +and +[a-z0-9]+/",$sConditions,$matches))
        {
            $Temp = explode(\' between \',$matches[0]);
            $Evaluate = $Temp[0];
            $Temp = explode(\' and \',$Temp[1]);
            if ((strcasecmp($Evaluate,$Temp[0])>0) && (strcasecmp($Evaluate,$Temp[1])<0) && $this->_in_post($matches[0])) return $this->detect();
        }
        return FALSE;
    }

    function _in_post($value)
    {
        foreach($_POST as $i => $v)
        {
             if (is_int(strpos(strtolower($v),$value))) return TRUE;
        }
        return FALSE;
    }

    function detect()
    {
        // log the attempt to sql inject?
        if ($this->bLog)
        {
            $fp = @fopen($this->bLog,\'a+\');
            if ($fp)
            {
                fputs($fp,"
".date("d-m-Y H:i:s").\' [\'.$this->rq.\'] from \'.$this->sIp = getenv("REMOTE_ADDR"));
                fclose($fp);
            }
        }
        // destroy session?
        if ($this->bdestroy_session) session_destroy();
        // redirect?
        if ($this->urlRedirect!=\'\'){
             if (!headers_sent())  header("location: $this->urlRedirect");
        }
        return TRUE;
    }


function protect1($protected) { // This Will be the fuction we call to protect the variables.
	$banlist = array ("\'", "\"", "<", "\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
	//$banlist is the list of words you dont want to allow.
	if ( eregi ( "[a-zA-Z0-9@]+", $protected ) ) { // Makes sure only legitimate Characters are used.
		$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
		return $protected;
		//echo "+";
	} else {
		//echo "-";
		echo $protected;
		die ( \' .\' ); // Message if thier is any characters not in [a-zA-Z0-9].
	} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
} // ends the function Protect() {

function protect2($protected) { // This Will be the fuction we call to protect the variables.
	$banlist = array ("\'", "\"", "<", "\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "desc");
	//$banlist is the list of words you dont want to allow.
	if ( eregi ( "[0-9]+", $protected ) ) { // Makes sure only legitimate Characters are used.
		$protected = trim(str_replace($banlist, \'\', $protected)); // Takes out whitespace, and removes any banned words.
		return $protected;
		//echo "+";
	} else {
		//echo "-";
		echo $protected;
		die ( \'   . \' ); // Message if thier is any characters not in [a-zA-Z0-9].
	} // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {
} // ends the function Protect() {


}
?>'

Did this file decode correctly?

Original Code

<?php @eval("?>".base64_decode("PD9waHANCg0KZGVmaW5lKCJDSEFSIiwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfIik7DQpkZWZpbmUoIkJCQ0hBUiIsIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5W109X1wvfCstKi48PigpJV4kI0AhDQoJIik7DQpkZWZpbmUoIk5VTUJFUiIsIjAxMjM0NTY3ODkiKTsNCmNsYXNzIENOZW9JbmplY3QNCnsNCglwdWJsaWMgZnVuY3Rpb24gRW5jb2RlKCYkc3RyKQ0KCXsNCgkJJHN0ciA9IGJhc2U2NF9lbmNvZGUoJHN0cik7DQoJCXJldHVybiAkc3RyOw0KCX0NCglwdWJsaWMgZnVuY3Rpb24gRGVjb2RlKCYkc3RyKQ0KCXsNCgkJJHN0ciA9IGJhc2U2NF9kZWNvZGUoJHN0cik7DQoJCXJldHVybiAkc3RyOw0KCX0NCglwdWJsaWMgZnVuY3Rpb24gc2VjX0JCU3RyaW5nKCRzdHIpDQoJew0KCQkkcmV0ID0gIiI7DQoJCSRhU1RSID0gc3RyX3NwbGl0KCRzdHIsMSk7DQoJCSRhQ0hBUiA9IHN0cl9zcGxpdChCQkNIQVIsMSk7DQoJCWZvciggJGkgPSAwIDsgJGkgPD0gc3RybGVuKCRzdHIpIDsgJGkgKysgKQ0KCQl7DQoJCQlmb3IoICRsID0gMCA7ICRsIDw9IHN0cmxlbihCQkNIQVIpIDsgJGwgKysgKQ0KCQkJew0KCQkJCWlmICggJGFDSEFSWyRsXSA9PSAkYVNUUlskaV0gKQ0KCQkJCXsNCgkJCQkJJHJldCA9ICRyZXQuJGFTVFJbJGldOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJHJldDsNCgl9DQoJcHVibGljIGZ1bmN0aW9uIHNlY19TdHJpbmcoJHN0cikNCgl7DQoJCSRyZXQgPSAiIjsNCgkJJGFTVFIgPSBzdHJfc3BsaXQoJHN0ciwxKTsNCgkJJGFDSEFSID0gc3RyX3NwbGl0KENIQVIsMSk7DQoJCWZvciggJGkgPSAwIDsgJGkgPD0gc3RybGVuKCRzdHIpIDsgJGkgKysgKQ0KCQl7DQoJCQlmb3IoICRsID0gMCA7ICRsIDw9IHN0cmxlbihDSEFSKSA7ICRsICsrICkNCgkJCXsNCgkJCQlpZiAoICRhQ0hBUlskbF0gPT0gJGFTVFJbJGldICkNCgkJCQl7DQoJCQkJCSRyZXQgPSAkcmV0LiRhU1RSWyRpXTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRyZXQ7DQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIHNlY19JbnQoJHN0cikNCgl7DQoJCSRyZXQgPSAiIjsNCgkJJGFTVFIgPSBzdHJfc3BsaXQoJHN0ciwxKTsNCgkJJGFDSEFSID0gc3RyX3NwbGl0KE5VTUJFUiwxKTsNCgkJZm9yKCAkaSA9IDAgOyAkaSA8PSBzdHJsZW4oJHN0cikgOyAkaSArKyApDQoJCXsNCgkJCWZvciggJGwgPSAwIDsgJGwgPD0gc3RybGVuKE5VTUJFUikgOyAkbCArKyApDQoJCQl7DQoJCQkJaWYgKCAkYUNIQVJbJGxdID09ICRhU1RSWyRpXSApDQoJCQkJew0KCQkJCQkkcmV0ID0gJHJldC4kYVNUUlskaV07DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXJldHVybiAoaW50KSRyZXQ7DQoJfQ0KDQoJLypQUk9URUNUIEJFR0lOKi8NCgkvKioNCgkgKiBAc2hvcnRkZXNjIHVybCB0byByZWRpcmVjdCBpZiBhbiBzcWwgaW5qZWN0IGF0dGVtcHQgaXMgZGV0ZWN0LiBpZiB1bnNldCwgdmFsdWUgaXMgRkFMU0UNCgkgKiBAcHJpdmF0ZQ0KCSAqIEB0eXBlIG1peGVkDQoJICovDQogICAgdmFyICR1cmxSZWRpcmVjdDsNCiAgICAvKioNCgkgKiBAc2hvcnRkZXNjIGRvZXMgdGhlIHNlc3Npb24gbXVzdCBiZSBkZXN0cm95IGlmIGFuIGF0dGVtcHQgaXMgZGV0ZWN0DQoJICogQHByaXZhdGUNCgkgKiBAdHlwZSBib29sDQoJICovDQogICAgdmFyICRiZGVzdHJveV9zZXNzaW9uOw0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgdGhlIFNRTCBkYXRhIGN1cnJlbnRseSB0ZXN0DQoJICogQHByaXZhdGUNCgkgKiBAdHlwZSBzdHJpbmcNCgkgKi8NCiAgICB2YXIgJHJxOw0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgaWYgbm90IEZBTFNFLCB0aGUgdXJsIHRvIHRoZSBsb2cgZmlsZQ0KCSAqIEBwcml2YXRlDQoJICogQHR5cGUgbWl4ZWQNCgkgKi8NCiAgICB2YXIgJGJMb2c7DQoNCiAgICAvKioNCgkgKiBCdWlsZGVyDQoJICoNCgkgKiBAcGFyYW0gYm9vbCBiZGVzdHJveV9zZXNzaW9uIG9wdGlvbmFsLiBkb2VzIHRoZSBzZXNzaW9uIG11c3QgYmUgZGVzdHJveSBpZiBhbiBhdHRlbXB0IGlzIGRldGVjdD8NCgkgKiBAcGFyYW0gc3RyaW5nIHVybFJlZGlyZWN0IG9wdGlvbmFsLiB1cmwgdG8gcmVkaXJlY3QgaWYgYW4gc3FsIGluamVjdCBhdHRlbXB0IGlzIGRldGVjdA0KICAgICAqIEBwdWJsaWMNCgkgKiBAdHlwZSB2b2lkDQogICAgICovDQogICAgZnVuY3Rpb24gc3FsX2luamVjdCgkbUxvZz1GQUxTRSwkYmRlc3Ryb3lfc2Vzc2lvbj1GQUxTRSwkdXJsUmVkaXJlY3Q9RkFMU0UpDQogICAgew0KICAgICAgICAkdGhpcy0+YkxvZyA9ICgoJG1Mb2chPUZBTFNFKT8kbUxvZzonJyk7DQogICAgICAgICR0aGlzLT51cmxSZWRpcmVjdCA9ICgoKHRyaW0oJHVybFJlZGlyZWN0KSE9JycpICYmIGZpbGVfZXhpc3RzKCR1cmxSZWRpcmVjdCkpPyR1cmxSZWRpcmVjdDonJyk7DQogICAgICAgICR0aGlzLT5iZGVzdHJveV9zZXNzaW9uID0gJGJkZXN0cm95X3Nlc3Npb247DQogICAgICAgICR0aGlzLT5ycSA9ICcnOw0KICAgIH0NCg0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgdGVzdCBpZiB0aGVyZSBpcyBhIHNxbCBpbmplY3QgYXR0ZW1wdCBkZXRlY3QNCgkgKiB0ZXN0IGlmIHRoZXJlIGlzIGEgc3FsIGluamVjdCBhdHRlbXB0IGRldGVjdA0KCSAqDQoJICogQHBhcmFtIHN0cmluZyBzUlEgcmVxdWlyZWQuIFNRTCBEYXRhIHRvIHRlc3QNCiAgICAgKiBAcHVibGljDQoJICogQHR5cGUgYm9vbA0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHRlc3QoJHNSUSkNCiAgICB7DQogICAgICAgICRzUlEgPSBzdHJ0b2xvd2VyKCRzUlEpOw0KICAgICAgICAkdGhpcy0+cnEgPSAkc1JROw0KICAgICAgICAkYVZhbHVlcyA9IGFycmF5KCk7DQogICAgICAgICRhVGVtcCA9IGFycmF5KCk7IC8vIHRlbXAgYXJyYXkNCiAgICAgICAgJGFXb3JkcyA9IGFycmF5KCk7IC8vDQogICAgICAgICRhU2VwID0gYXJyYXkoJyBhbmQgJywnIG9yICcpOyAvLyBzZXBhcmF0b3JzIGZvciBkZXRlY3QgdGhlDQogICAgICAgICRzQ29uZGl0aW9ucyA9ICcoJzsNCiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOw0KICAgICAgICAkc1NlcCA9ICcnOw0KICAgICAgICAvLyBpcyB0aGVyZSBhbiBhdHRlbXB0IHRvIHVudXNlZCBwYXJ0IG9mIHRoZSBycT8NCiAgICAgICAgaWYgKGlzX2ludCgoc3RycG9zKCRzUlEsIiMiKSkpJiYkdGhpcy0+X2luX3Bvc3QoJyMnKSkgcmV0dXJuICR0aGlzLT5kZXRlY3QoKTsNCg0KICAgICAgICAvLyBpcyB0aGVyZSBhIGF0dGVtcHQgdG8gZG8gYSAybmQgU1FMIHJlcXVldGUgPw0KICAgICAgICBpZiAoaXNfaW50KHN0cnBvcygkc1JRLCc7JykpKXsNCiAgICAgICAgICAgICRhVGVtcCA9IGV4cGxvZGUoJzsnLCRzUlEpOw0KICAgICAgICAgICAgaWYgKCR0aGlzLT5faW5fcG9zdCgkYVRlbXBbMV0pKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgJGFUZW1wID0gZXhwbG9kZSgiIHdoZXJlICIsJHNSUSk7DQogICAgICAgIGlmIChjb3VudCgkYVRlbXApPT0xKSByZXR1cm4gRkFMU0U7DQogICAgICAgICRzQ29uZGl0aW9ucyA9ICRhVGVtcFsxXTsNCiAgICAgICAgJGFXb3JkcyA9IGV4cGxvZGUoIiAiLCRzQ29uZGl0aW9ucyk7DQogICAgICAgIGlmKHN0cmNhc2VjbXAoJGFXb3Jkc1swXSwnc2VsZWN0JykhPTApICRhU2VwW10gPSAnLCc7DQogICAgICAgICRzU2VwID0gJygnLmltcGxvZGUoJ3wnLCRhU2VwKS4nKSc7DQogICAgICAgICRhVmFsdWVzID0gcHJlZ19zcGxpdCgkc1NlcCwkc0NvbmRpdGlvbnMsLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KDQogICAgICAgIC8vIHRlc3QgdGhlIGFsd2F5cyB0cnVlIGV4cHJlc3Npb25zDQogICAgICAgIGZvcmVhY2goJGFWYWx1ZXMgYXMgJGkgPT4gJHYpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFNRTCBpbmplY3Rpb24gbGlrZSAxPTEgb3IgYT1hIG9yICd6YSc9J3phJw0KICAgICAgICAgICAgaWYgKGlzX2ludChzdHJwb3MoJHYsJz0nKSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICRhVGVtcCA9IGV4cGxvZGUoJz0nLCR2KTsNCiAgICAgICAgICAgICAgICAgaWYgKHRyaW0oJGFUZW1wWzBdKT09dHJpbSgkYVRlbXBbMV0pKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL1NRTCBpbmplY3Rpb24gbGlrZSAxPD4yDQogICAgICAgICAgICBpZiAoaXNfaW50KHN0cnBvcygkdiwnPD4nKSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgJGFUZW1wID0gZXhwbG9kZSgnPD4nLCR2KTsNCiAgICAgICAgICAgICAgICBpZiAoKHRyaW0oJGFUZW1wWzBdKSE9dHJpbSgkYVRlbXBbMV0pKSYmICgkdGhpcy0+X2luX3Bvc3QoJzw+JykpKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0cnBvcygkc0NvbmRpdGlvbnMsJyBudWxsJykpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCIvbnVsbCAraXMgK251bGwvIiwkc0NvbmRpdGlvbnMpKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9pcyArbm90ICtudWxsLyIsJHNDb25kaXRpb25zLCRtYXRjaGVzKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBmb3JlYWNoKCRtYXRjaGVzIGFzICRpID0+ICR2KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5faW5fcG9zdCgkdikpcmV0dXJuICR0aGlzLT5kZXRlY3QoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocHJlZ19tYXRjaCgiL1thLXowLTldKyArYmV0d2VlbiArW2EtejAtOV0rICthbmQgK1thLXowLTldKy8iLCRzQ29uZGl0aW9ucywkbWF0Y2hlcykpDQogICAgICAgIHsNCiAgICAgICAgICAgICRUZW1wID0gZXhwbG9kZSgnIGJldHdlZW4gJywkbWF0Y2hlc1swXSk7DQogICAgICAgICAgICAkRXZhbHVhdGUgPSAkVGVtcFswXTsNCiAgICAgICAgICAgICRUZW1wID0gZXhwbG9kZSgnIGFuZCAnLCRUZW1wWzFdKTsNCiAgICAgICAgICAgIGlmICgoc3RyY2FzZWNtcCgkRXZhbHVhdGUsJFRlbXBbMF0pPjApICYmIChzdHJjYXNlY21wKCRFdmFsdWF0ZSwkVGVtcFsxXSk8MCkgJiYgJHRoaXMtPl9pbl9wb3N0KCRtYXRjaGVzWzBdKSkgcmV0dXJuICR0aGlzLT5kZXRlY3QoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX2luX3Bvc3QoJHZhbHVlKQ0KICAgIHsNCiAgICAgICAgZm9yZWFjaCgkX1BPU1QgYXMgJGkgPT4gJHYpDQogICAgICAgIHsNCiAgICAgICAgICAgICBpZiAoaXNfaW50KHN0cnBvcyhzdHJ0b2xvd2VyKCR2KSwkdmFsdWUpKSkgcmV0dXJuIFRSVUU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIEZBTFNFOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRldGVjdCgpDQogICAgew0KICAgICAgICAvLyBsb2cgdGhlIGF0dGVtcHQgdG8gc3FsIGluamVjdD8NCiAgICAgICAgaWYgKCR0aGlzLT5iTG9nKQ0KICAgICAgICB7DQogICAgICAgICAgICAkZnAgPSBAZm9wZW4oJHRoaXMtPmJMb2csJ2ErJyk7DQogICAgICAgICAgICBpZiAoJGZwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZwdXRzKCRmcCwiXHJcbiIuZGF0ZSgiZC1tLVkgSDppOnMiKS4nIFsnLiR0aGlzLT5ycS4nXSBmcm9tICcuJHRoaXMtPnNJcCA9IGdldGVudigiUkVNT1RFX0FERFIiKSk7DQogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8gZGVzdHJveSBzZXNzaW9uPw0KICAgICAgICBpZiAoJHRoaXMtPmJkZXN0cm95X3Nlc3Npb24pIHNlc3Npb25fZGVzdHJveSgpOw0KICAgICAgICAvLyByZWRpcmVjdD8NCiAgICAgICAgaWYgKCR0aGlzLT51cmxSZWRpcmVjdCE9Jycpew0KICAgICAgICAgICAgIGlmICghaGVhZGVyc19zZW50KCkpICBoZWFkZXIoImxvY2F0aW9uOiAkdGhpcy0+dXJsUmVkaXJlY3QiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gVFJVRTsNCiAgICB9DQoNCglmdW5jdGlvbiBwcm90ZWN0MSgkcHJvdGVjdGVkKSB7IC8vIFRoaXMgV2lsbCBiZSB0aGUgZnVjdGlvbiB3ZSBjYWxsIHRvIHByb3RlY3QgdGhlIHZhcmlhYmxlcy4NCgkJaWYgKCAkcHJvdGVjdGVkID09ICIiICkgcmV0dXJuIDsNCgkJJGJhbmxpc3QgPSBhcnJheSAoIiciLCAiXCIiLCAiPCIsICJcXCIsICJ8IiwgIi8iLCAiPSIsICJpbnNlcnQiLCAic2VsZWN0IiwgInVwZGF0ZSIsICJkZWxldGUiLCAiZGlzdGluY3QiLCAiaGF2aW5nIiwgInRydW5jYXRlIiwgInJlcGxhY2UiLCAiaGFuZGxlciIsICJsaWtlIiwgInByb2NlZHVyZSIsICJsaW1pdCIsICJvcmRlciBieSIsICJncm91cCBieSIsICJhc2MiLCAiZGVzYyIpOw0KCQkvLyRiYW5saXN0IGlzIHRoZSBsaXN0IG9mIHdvcmRzIHlvdSBkb250IHdhbnQgdG8gYWxsb3cuDQoJCWlmICggZXJlZ2kgKCAiW2EtekEtWjAtOUBdKyIsICRwcm90ZWN0ZWQgKSApIHsgLy8gTWFrZXMgc3VyZSBvbmx5IGxlZ2l0aW1hdGUgQ2hhcmFjdGVycyBhcmUgdXNlZC4NCgkJCSRwcm90ZWN0ZWQgPSB0cmltKHN0cl9yZXBsYWNlKCRiYW5saXN0LCAnJywgJHByb3RlY3RlZCkpOyAvLyBUYWtlcyBvdXQgd2hpdGVzcGFjZSwgYW5kIHJlbW92ZXMgYW55IGJhbm5lZCB3b3Jkcy4NCgkJCXJldHVybiAkcHJvdGVjdGVkOw0KCQkJLy9lY2hvICIrIjsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiA7DQoJCQkvL2VjaG8gIi0iOw0KCQkJLy9lY2hvICRwcm90ZWN0ZWQ7DQoJCQkvL2RpZSAoICdUaGlzIHdvcmQgbm90IHN1cHBvcnQnICk7IC8vIE1lc3NhZ2UgaWYgdGhpZXIgaXMgYW55IGNoYXJhY3RlcnMgbm90IGluIFthLXpBLVowLTldLg0KCQl9IC8vIGVuZHMgdGhlIGlmICggZXJlZ2kgKCAiW2EtekEtWjAtOV0rIiwgJHRoaXMtPnByb3RlY3RlZCApICkgew0KCX0gLy8gZW5kcyB0aGUgZnVuY3Rpb24gUHJvdGVjdCgpIHsNCg0KCWZ1bmN0aW9uIHByb3RlY3QyKCRwcm90ZWN0ZWQpIHsgLy8gVGhpcyBXaWxsIGJlIHRoZSBmdWN0aW9uIHdlIGNhbGwgdG8gcHJvdGVjdCB0aGUgdmFyaWFibGVzLg0KCQlpZiAoICRwcm90ZWN0ZWQgPT0gIiIgKSByZXR1cm4gOw0KCQkkYmFubGlzdCA9IGFycmF5ICgiJyIsICJcIiIsICI8IiwgIlxcIiwgInwiLCAiLyIsICI9IiwgImluc2VydCIsICJzZWxlY3QiLCAidXBkYXRlIiwgImRlbGV0ZSIsICJkaXN0aW5jdCIsICJoYXZpbmciLCAidHJ1bmNhdGUiLCAicmVwbGFjZSIsICJoYW5kbGVyIiwgImxpa2UiLCAicHJvY2VkdXJlIiwgImxpbWl0IiwgIm9yZGVyIGJ5IiwgImdyb3VwIGJ5IiwgImFzYyIsICJkZXNjIik7DQoJCS8vJGJhbmxpc3QgaXMgdGhlIGxpc3Qgb2Ygd29yZHMgeW91IGRvbnQgd2FudCB0byBhbGxvdy4NCgkJaWYgKCBlcmVnaSAoICJbMC05XSsiLCAkcHJvdGVjdGVkICkgKSB7IC8vIE1ha2VzIHN1cmUgb25seSBsZWdpdGltYXRlIENoYXJhY3RlcnMgYXJlIHVzZWQuDQoJCQkkcHJvdGVjdGVkID0gdHJpbShzdHJfcmVwbGFjZSgkYmFubGlzdCwgJycsICRwcm90ZWN0ZWQpKTsgLy8gVGFrZXMgb3V0IHdoaXRlc3BhY2UsIGFuZCByZW1vdmVzIGFueSBiYW5uZWQgd29yZHMuDQoJCQlyZXR1cm4gJHByb3RlY3RlZDsNCgkJCS8vZWNobyAiKyI7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gOw0KCQkJLy9lY2hvICItIjsNCgkJCS8vZWNobyAkcHJvdGVjdGVkOw0KCQkJLy9kaWUgKCAnVGhpcyB3b3JkIG5vdCBzdXBwb3J0JyApOyAvLyBNZXNzYWdlIGlmIHRoaWVyIGlzIGFueSBjaGFyYWN0ZXJzIG5vdCBpbiBbYS16QS1aMC05XS4NCgkJfSAvLyBlbmRzIHRoZSBpZiAoIGVyZWdpICggIlthLXpBLVowLTldKyIsICR0aGlzLT5wcm90ZWN0ZWQgKSApIHsNCgl9IC8vIGVuZHMgdGhlIGZ1bmN0aW9uIFByb3RlY3QoKSB7DQoNCglmdW5jdGlvbiBwcm90ZWN0MygkcHJvdGVjdGVkKSB7IC8vIFRoaXMgV2lsbCBiZSB0aGUgZnVjdGlvbiB3ZSBjYWxsIHRvIHByb3RlY3QgdGhlIHZhcmlhYmxlcy4NCgkJaWYgKCAkcHJvdGVjdGVkID09ICIiICkgcmV0dXJuIDsNCgkJJGJhbmxpc3QgPSBhcnJheSAoIiciLCAiXCIiLCAiPCIsICJcXCIsICJ8IiwgIj0iLCAiaW5zZXJ0IiwgInNlbGVjdCIsICJ1cGRhdGUiLCAiZGVsZXRlIiwgImRpc3RpbmN0IiwgImhhdmluZyIsICJ0cnVuY2F0ZSIsICJyZXBsYWNlIiwgImhhbmRsZXIiLCAibGlrZSIsICJwcm9jZWR1cmUiLCAibGltaXQiLCAib3JkZXIgYnkiLCAiZ3JvdXAgYnkiLCAiYXNjIiwgImRlc2MiKTsNCgkJLy8kYmFubGlzdCBpcyB0aGUgbGlzdCBvZiB3b3JkcyB5b3UgZG9udCB3YW50IHRvIGFsbG93Lg0KCQlpZiAoIGVyZWdpICggIlvguIEt4LmbYS16QS1aMC05QF0rIiwgJHByb3RlY3RlZCApICkgeyAvLyBNYWtlcyBzdXJlIG9ubHkgbGVnaXRpbWF0ZSBDaGFyYWN0ZXJzIGFyZSB1c2VkLg0KCQkJJHByb3RlY3RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoJGJhbmxpc3QsICcnLCAkcHJvdGVjdGVkKSk7IC8vIFRha2VzIG91dCB3aGl0ZXNwYWNlLCBhbmQgcmVtb3ZlcyBhbnkgYmFubmVkIHdvcmRzLg0KCQkJcmV0dXJuICRwcm90ZWN0ZWQ7DQoJCQkvL2VjaG8gIisiOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuIDsNCgkJCS8vZWNobyAiLSI7DQoJCQkvL2VjaG8gJHByb3RlY3RlZDsNCgkJCS8vZGllICggJ1RoaXMgd29yZCBub3Qgc3VwcG9ydCcgKTsgLy8gTWVzc2FnZSBpZiB0aGllciBpcyBhbnkgY2hhcmFjdGVycyBub3QgaW4gW2EtekEtWjAtOV0uDQoJCX0gLy8gZW5kcyB0aGUgaWYgKCBlcmVnaSAoICJbYS16QS1aMC05XSsiLCAkdGhpcy0+cHJvdGVjdGVkICkgKSB7DQoJfSAvLyBlbmRzIHRoZSBmdW5jdGlvbiBQcm90ZWN0KCkgew0KDQoJLypQUk9URUNUIEVORCovDQp9DQoNCiRpcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KJHRpbWUgPSBkYXRlKCJsIGRTIG9mIEYgWSBoOmk6cyBBIik7DQokc2NyaXB0ID0gJF9TRVJWRVJbUEFUSF9UUkFOU0xBVEVEXTsNCiRmcCA9IGZvcGVuICgiSW5qZWN0aW9uLnR4dCIsICJhKyIpOw0KJHNxbF9pbmplY3RfMSA9IGFycmF5KCI7IiwiJyIsIiUiLCciJyk7ICNXaG90aCBuZWVkIHJlcGxhY2UNCiRzcWxfaW5qZWN0XzIgPSBhcnJheSgiIiwgIiIsIiIsIiZxdW90OyIpOyAjVG8gd29udCByZXBsYWNlDQokR0VUX0tFWSA9IGFycmF5X2tleXMoJF9HRVQpOyAjYXJyYXkga2V5cyBmcm9tICRfR0VUDQokUE9TVF9LRVkgPSBhcnJheV9rZXlzKCRfUE9TVCk7ICNhcnJheSBrZXlzIGZyb20gJF9QT1NUDQokQ09PS0lFX0tFWSA9IGFycmF5X2tleXMoJF9DT09LSUUpOyAjYXJyYXkga2V5cyBmcm9tICRfQ09PS0lFDQovKmJlZ2luIGNsZWFyICRfR0VUICovDQpmb3IoJGk9MDskaTxjb3VudCgkR0VUX0tFWSk7JGkrKykNCnsNCiRyZWFsX2dldFskaV0gPSAkX0dFVFskR0VUX0tFWVskaV1dOw0KJF9HRVRbJEdFVF9LRVlbJGldXSA9IHN0cl9yZXBsYWNlKCRzcWxfaW5qZWN0XzEsICRzcWxfaW5qZWN0XzIsIEh0bWxTcGVjaWFsQ2hhcnMoJF9HRVRbJEdFVF9LRVlbJGldXSkpOw0KaWYoJHJlYWxfZ2V0WyRpXSAhPSAkX0dFVFskR0VUX0tFWVskaV1dKQ0Kew0KZndyaXRlICgkZnAsICJJUDogJGlwXHJcbiIpOw0KZndyaXRlICgkZnAsICJNZXRob2Q6IEdFVFxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiVmFsdWU6ICRyZWFsX2dldFskaV1cclxuIik7DQpmd3JpdGUgKCRmcCwgIlNjcmlwdDogJHNjcmlwdFxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiVGltZTogJHRpbWVcclxuIik7DQpmd3JpdGUgKCRmcCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuIik7DQp9DQp9DQovKmVuZCBjbGVhciAkX0dFVCAqLw0KLypiZWdpbiBjbGVhciAkX1BPU1QgKi8NCmZvcigkaT0wOyRpPGNvdW50KCRQT1NUX0tFWSk7JGkrKykNCnsNCiRyZWFsX3Bvc3RbJGldID0gJF9QT1NUWyRQT1NUX0tFWVskaV1dOw0KJF9QT1NUWyRQT1NUX0tFWVskaV1dID0gc3RyX3JlcGxhY2UoJHNxbF9pbmplY3RfMSwgJHNxbF9pbmplY3RfMiwgSHRtbFNwZWNpYWxDaGFycygkX1BPU1RbJFBPU1RfS0VZWyRpXV0pKTsNCmlmKCRyZWFsX3Bvc3RbJGldICE9ICRfUE9TVFskUE9TVF9LRVlbJGldXSkNCnsNCmZ3cml0ZSAoJGZwLCAiSVA6ICRpcFxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiTWV0aG9kOiBQT1NUXHJcbiIpOw0KZndyaXRlICgkZnAsICJWYWx1ZTogJHJlYWxfcG9zdFskaV1cclxuIik7DQpmd3JpdGUgKCRmcCwgIlNjcmlwdDogJHNjcmlwdFxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiVGltZTogJHRpbWVcclxuIik7DQpmd3JpdGUgKCRmcCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuIik7DQp9DQp9DQovKmVuZCBjbGVhciAkX1BPU1QgKi8NCi8qYmVnaW4gY2xlYXIgJF9DT09LSUUgKi8NCmZvcigkaT0wOyRpPGNvdW50KCRDT09LSUVfS0VZKTskaSsrKQ0Kew0KJHJlYWxfY29va2llWyRpXSA9ICRfQ09PS0lFWyRDT09LSUVfS0VZWyRpXV07DQokX0NPT0tJRVskQ09PS0lFX0tFWVskaV1dID0gc3RyX3JlcGxhY2UoJHNxbF9pbmplY3RfMSwgJHNxbF9pbmplY3RfMiwgSHRtbFNwZWNpYWxDaGFycygkX0NPT0tJRVskQ09PS0lFX0tFWVskaV1dKSk7DQppZigkcmVhbF9jb29raWVbJGldICE9ICRfQ09PS0lFWyRDT09LSUVfS0VZWyRpXV0pDQp7DQpmd3JpdGUgKCRmcCwgIklQOiAkaXBcclxuIik7DQpmd3JpdGUgKCRmcCwgIk1ldGhvZDogQ09PS0lFXHJcbiIpOw0KZndyaXRlICgkZnAsICJWYWx1ZTogJHJlYWxfY29va2llWyRpXVxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiU2NyaXB0OiAkc2NyaXB0XHJcbiIpOw0KZndyaXRlICgkZnAsICJUaW1lOiAkdGltZVxyXG4iKTsNCmZ3cml0ZSAoJGZwLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4iKTsNCn0NCn0NCg0KLyplbmQgY2xlYXIgJF9DT09LSUUgKi8NCmZjbG9zZSAoJGZwKTsNCiR4YSA9IGdldGVudignUkVNT1RFX0FERFInKTsNCiRiYWR3b3JkcyA9IGFycmF5KCI7IiwiJyIsIlwiIiwiKiIsInVuaW9uIiwiZGVsIiwiREVMIiwiaW5zZXJ0IiwidXBkYXRlIiwiZHJvcCIsInNlbGUiLCJtZW1iIiwic2V0IiwiJCIsInJlczN0Iiwid2FyZWgiLCIlIik7DQoNCmZvcmVhY2goJF9QT1NUIGFzICR2YWx1ZSkNCiAgZm9yZWFjaCgkYmFkd29yZHMgYXMgJHdvcmQpDQogICAgaWYoc3Vic3RyX2NvdW50KCR2YWx1ZSwgJHdvcmQpID4gMCkNCiAgICAgIGRpZSgiRXJyb3IgSVA6ICR4YSAiKTsNCg0KY2xhc3Mgc3FsX2luamVjdA0Kew0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgdXJsIHRvIHJlZGlyZWN0IGlmIGFuIHNxbCBpbmplY3QgYXR0ZW1wdCBpcyBkZXRlY3QuIGlmIHVuc2V0LCB2YWx1ZSBpcyBGQUxTRQ0KCSAqIEBwcml2YXRlDQoJICogQHR5cGUgbWl4ZWQNCgkgKi8NCiAgICB2YXIgJHVybFJlZGlyZWN0Ow0KICAgIC8qKg0KCSAqIEBzaG9ydGRlc2MgZG9lcyB0aGUgc2Vzc2lvbiBtdXN0IGJlIGRlc3Ryb3kgaWYgYW4gYXR0ZW1wdCBpcyBkZXRlY3QNCgkgKiBAcHJpdmF0ZQ0KCSAqIEB0eXBlIGJvb2wNCgkgKi8NCiAgICB2YXIgJGJkZXN0cm95X3Nlc3Npb247DQogICAgLyoqDQoJICogQHNob3J0ZGVzYyB0aGUgU1FMIGRhdGEgY3VycmVudGx5IHRlc3QNCgkgKiBAcHJpdmF0ZQ0KCSAqIEB0eXBlIHN0cmluZw0KCSAqLw0KICAgIHZhciAkcnE7DQogICAgLyoqDQoJICogQHNob3J0ZGVzYyBpZiBub3QgRkFMU0UsIHRoZSB1cmwgdG8gdGhlIGxvZyBmaWxlDQoJICogQHByaXZhdGUNCgkgKiBAdHlwZSBtaXhlZA0KCSAqLw0KICAgIHZhciAkYkxvZzsNCg0KICAgIC8qKg0KCSAqIEJ1aWxkZXINCgkgKg0KCSAqIEBwYXJhbSBib29sIGJkZXN0cm95X3Nlc3Npb24gb3B0aW9uYWwuIGRvZXMgdGhlIHNlc3Npb24gbXVzdCBiZSBkZXN0cm95IGlmIGFuIGF0dGVtcHQgaXMgZGV0ZWN0Pw0KCSAqIEBwYXJhbSBzdHJpbmcgdXJsUmVkaXJlY3Qgb3B0aW9uYWwuIHVybCB0byByZWRpcmVjdCBpZiBhbiBzcWwgaW5qZWN0IGF0dGVtcHQgaXMgZGV0ZWN0DQogICAgICogQHB1YmxpYw0KCSAqIEB0eXBlIHZvaWQNCiAgICAgKi8NCiAgICBmdW5jdGlvbiBzcWxfaW5qZWN0KCRtTG9nPUZBTFNFLCRiZGVzdHJveV9zZXNzaW9uPUZBTFNFLCR1cmxSZWRpcmVjdD1GQUxTRSkNCiAgICB7DQogICAgICAgICR0aGlzLT5iTG9nID0gKCgkbUxvZyE9RkFMU0UpPyRtTG9nOicnKTsNCiAgICAgICAgJHRoaXMtPnVybFJlZGlyZWN0ID0gKCgodHJpbSgkdXJsUmVkaXJlY3QpIT0nJykgJiYgZmlsZV9leGlzdHMoJHVybFJlZGlyZWN0KSk/JHVybFJlZGlyZWN0OicnKTsNCiAgICAgICAgJHRoaXMtPmJkZXN0cm95X3Nlc3Npb24gPSAkYmRlc3Ryb3lfc2Vzc2lvbjsNCiAgICAgICAgJHRoaXMtPnJxID0gJyc7DQogICAgfQ0KDQogICAgLyoqDQoJICogQHNob3J0ZGVzYyB0ZXN0IGlmIHRoZXJlIGlzIGEgc3FsIGluamVjdCBhdHRlbXB0IGRldGVjdA0KCSAqIHRlc3QgaWYgdGhlcmUgaXMgYSBzcWwgaW5qZWN0IGF0dGVtcHQgZGV0ZWN0DQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nIHNSUSByZXF1aXJlZC4gU1FMIERhdGEgdG8gdGVzdA0KICAgICAqIEBwdWJsaWMNCgkgKiBAdHlwZSBib29sDQogICAgICovDQogICAgZnVuY3Rpb24gdGVzdCgkc1JRKQ0KICAgIHsNCiAgICAgICAgJHNSUSA9IHN0cnRvbG93ZXIoJHNSUSk7DQogICAgICAgICR0aGlzLT5ycSA9ICRzUlE7DQogICAgICAgICRhVmFsdWVzID0gYXJyYXkoKTsNCiAgICAgICAgJGFUZW1wID0gYXJyYXkoKTsgLy8gdGVtcCBhcnJheQ0KICAgICAgICAkYVdvcmRzID0gYXJyYXkoKTsgLy8NCiAgICAgICAgJGFTZXAgPSBhcnJheSgnIGFuZCAnLCcgb3IgJyk7IC8vIHNlcGFyYXRvcnMgZm9yIGRldGVjdCB0aGUNCiAgICAgICAgJHNDb25kaXRpb25zID0gJygnOw0KICAgICAgICAkbWF0Y2hlcyA9IGFycmF5KCk7DQogICAgICAgICRzU2VwID0gJyc7DQogICAgICAgIC8vIGlzIHRoZXJlIGFuIGF0dGVtcHQgdG8gdW51c2VkIHBhcnQgb2YgdGhlIHJxPw0KICAgICAgICBpZiAoaXNfaW50KChzdHJwb3MoJHNSUSwiIyIpKSkmJiR0aGlzLT5faW5fcG9zdCgnIycpKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KDQogICAgICAgIC8vIGlzIHRoZXJlIGEgYXR0ZW1wdCB0byBkbyBhIDJuZCBTUUwgcmVxdWV0ZSA/DQogICAgICAgIGlmIChpc19pbnQoc3RycG9zKCRzUlEsJzsnKSkpew0KICAgICAgICAgICAgJGFUZW1wID0gZXhwbG9kZSgnOycsJHNSUSk7DQogICAgICAgICAgICBpZiAoJHRoaXMtPl9pbl9wb3N0KCRhVGVtcFsxXSkpIHJldHVybiAkdGhpcy0+ZGV0ZWN0KCk7DQogICAgICAgIH0NCg0KICAgICAgICAkYVRlbXAgPSBleHBsb2RlKCIgd2hlcmUgIiwkc1JRKTsNCiAgICAgICAgaWYgKGNvdW50KCRhVGVtcCk9PTEpIHJldHVybiBGQUxTRTsNCiAgICAgICAgJHNDb25kaXRpb25zID0gJGFUZW1wWzFdOw0KICAgICAgICAkYVdvcmRzID0gZXhwbG9kZSgiICIsJHNDb25kaXRpb25zKTsNCiAgICAgICAgaWYoc3RyY2FzZWNtcCgkYVdvcmRzWzBdLCdzZWxlY3QnKSE9MCkgJGFTZXBbXSA9ICcsJzsNCiAgICAgICAgJHNTZXAgPSAnKCcuaW1wbG9kZSgnfCcsJGFTZXApLicpJzsNCiAgICAgICAgJGFWYWx1ZXMgPSBwcmVnX3NwbGl0KCRzU2VwLCRzQ29uZGl0aW9ucywtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7DQoNCiAgICAgICAgLy8gdGVzdCB0aGUgYWx3YXlzIHRydWUgZXhwcmVzc2lvbnMNCiAgICAgICAgZm9yZWFjaCgkYVZhbHVlcyBhcyAkaSA9PiAkdikNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gU1FMIGluamVjdGlvbiBsaWtlIDE9MSBvciBhPWEgb3IgJ3phJz0nemEnDQogICAgICAgICAgICBpZiAoaXNfaW50KHN0cnBvcygkdiwnPScpKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgJGFUZW1wID0gZXhwbG9kZSgnPScsJHYpOw0KICAgICAgICAgICAgICAgICBpZiAodHJpbSgkYVRlbXBbMF0pPT10cmltKCRhVGVtcFsxXSkpIHJldHVybiAkdGhpcy0+ZGV0ZWN0KCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vU1FMIGluamVjdGlvbiBsaWtlIDE8PjINCiAgICAgICAgICAgIGlmIChpc19pbnQoc3RycG9zKCR2LCc8PicpKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAkYVRlbXAgPSBleHBsb2RlKCc8PicsJHYpOw0KICAgICAgICAgICAgICAgIGlmICgodHJpbSgkYVRlbXBbMF0pIT10cmltKCRhVGVtcFsxXSkpJiYgKCR0aGlzLT5faW5fcG9zdCgnPD4nKSkpIHJldHVybiAkdGhpcy0+ZGV0ZWN0KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoc3RycG9zKCRzQ29uZGl0aW9ucywnIG51bGwnKSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9udWxsICtpcyArbnVsbC8iLCRzQ29uZGl0aW9ucykpIHJldHVybiAkdGhpcy0+ZGV0ZWN0KCk7DQogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgiL2lzICtub3QgK251bGwvIiwkc0NvbmRpdGlvbnMsJG1hdGNoZXMpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZvcmVhY2goJG1hdGNoZXMgYXMgJGkgPT4gJHYpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPl9pbl9wb3N0KCR2KSlyZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChwcmVnX21hdGNoKCIvW2EtejAtOV0rICtiZXR3ZWVuICtbYS16MC05XSsgK2FuZCArW2EtejAtOV0rLyIsJHNDb25kaXRpb25zLCRtYXRjaGVzKSkNCiAgICAgICAgew0KICAgICAgICAgICAgJFRlbXAgPSBleHBsb2RlKCcgYmV0d2VlbiAnLCRtYXRjaGVzWzBdKTsNCiAgICAgICAgICAgICRFdmFsdWF0ZSA9ICRUZW1wWzBdOw0KICAgICAgICAgICAgJFRlbXAgPSBleHBsb2RlKCcgYW5kICcsJFRlbXBbMV0pOw0KICAgICAgICAgICAgaWYgKChzdHJjYXNlY21wKCRFdmFsdWF0ZSwkVGVtcFswXSk+MCkgJiYgKHN0cmNhc2VjbXAoJEV2YWx1YXRlLCRUZW1wWzFdKTwwKSAmJiAkdGhpcy0+X2luX3Bvc3QoJG1hdGNoZXNbMF0pKSByZXR1cm4gJHRoaXMtPmRldGVjdCgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBGQUxTRTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBfaW5fcG9zdCgkdmFsdWUpDQogICAgew0KICAgICAgICBmb3JlYWNoKCRfUE9TVCBhcyAkaSA9PiAkdikNCiAgICAgICAgew0KICAgICAgICAgICAgIGlmIChpc19pbnQoc3RycG9zKHN0cnRvbG93ZXIoJHYpLCR2YWx1ZSkpKSByZXR1cm4gVFJVRTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gRkFMU0U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGV0ZWN0KCkNCiAgICB7DQogICAgICAgIC8vIGxvZyB0aGUgYXR0ZW1wdCB0byBzcWwgaW5qZWN0Pw0KICAgICAgICBpZiAoJHRoaXMtPmJMb2cpDQogICAgICAgIHsNCiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkdGhpcy0+YkxvZywnYSsnKTsNCiAgICAgICAgICAgIGlmICgkZnApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZnB1dHMoJGZwLCJcclxuIi5kYXRlKCJkLW0tWSBIOmk6cyIpLicgWycuJHRoaXMtPnJxLiddIGZyb20gJy4kdGhpcy0+c0lwID0gZ2V0ZW52KCJSRU1PVEVfQUREUiIpKTsNCiAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAvLyBkZXN0cm95IHNlc3Npb24/DQogICAgICAgIGlmICgkdGhpcy0+YmRlc3Ryb3lfc2Vzc2lvbikgc2Vzc2lvbl9kZXN0cm95KCk7DQogICAgICAgIC8vIHJlZGlyZWN0Pw0KICAgICAgICBpZiAoJHRoaXMtPnVybFJlZGlyZWN0IT0nJyl7DQogICAgICAgICAgICAgaWYgKCFoZWFkZXJzX3NlbnQoKSkgIGhlYWRlcigibG9jYXRpb246ICR0aGlzLT51cmxSZWRpcmVjdCIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBUUlVFOw0KICAgIH0NCg0KDQpmdW5jdGlvbiBwcm90ZWN0MSgkcHJvdGVjdGVkKSB7IC8vIFRoaXMgV2lsbCBiZSB0aGUgZnVjdGlvbiB3ZSBjYWxsIHRvIHByb3RlY3QgdGhlIHZhcmlhYmxlcy4NCgkkYmFubGlzdCA9IGFycmF5ICgiJyIsICJcIiIsICI8IiwgIlxcIiwgInwiLCAiLyIsICI9IiwgImluc2VydCIsICJzZWxlY3QiLCAidXBkYXRlIiwgImRlbGV0ZSIsICJkaXN0aW5jdCIsICJoYXZpbmciLCAidHJ1bmNhdGUiLCAicmVwbGFjZSIsICJoYW5kbGVyIiwgImxpa2UiLCAicHJvY2VkdXJlIiwgImxpbWl0IiwgIm9yZGVyIGJ5IiwgImdyb3VwIGJ5IiwgImFzYyIsICJkZXNjIik7DQoJLy8kYmFubGlzdCBpcyB0aGUgbGlzdCBvZiB3b3JkcyB5b3UgZG9udCB3YW50IHRvIGFsbG93Lg0KCWlmICggZXJlZ2kgKCAiW2EtekEtWjAtOUBdKyIsICRwcm90ZWN0ZWQgKSApIHsgLy8gTWFrZXMgc3VyZSBvbmx5IGxlZ2l0aW1hdGUgQ2hhcmFjdGVycyBhcmUgdXNlZC4NCgkJJHByb3RlY3RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoJGJhbmxpc3QsICcnLCAkcHJvdGVjdGVkKSk7IC8vIFRha2VzIG91dCB3aGl0ZXNwYWNlLCBhbmQgcmVtb3ZlcyBhbnkgYmFubmVkIHdvcmRzLg0KCQlyZXR1cm4gJHByb3RlY3RlZDsNCgkJLy9lY2hvICIrIjsNCgl9IGVsc2Ugew0KCQkvL2VjaG8gIi0iOw0KCQllY2hvICRwcm90ZWN0ZWQ7DQoJCWRpZSAoICcg4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiH4LiX4Li14LmI4LiI4Li44LiU4LmC4Lib4Lij4LiU4Lil4Lit4LiH4LmD4LiK4LmJ4Lij4Liy4Lii4LiB4Liy4Lij4Lit4Li34LmI4LiZLicgKTsgLy8gTWVzc2FnZSBpZiB0aGllciBpcyBhbnkgY2hhcmFjdGVycyBub3QgaW4gW2EtekEtWjAtOV0uDQoJfSAvLyBlbmRzIHRoZSBpZiAoIGVyZWdpICggIlthLXpBLVowLTldKyIsICR0aGlzLT5wcm90ZWN0ZWQgKSApIHsNCn0gLy8gZW5kcyB0aGUgZnVuY3Rpb24gUHJvdGVjdCgpIHsNCg0KZnVuY3Rpb24gcHJvdGVjdDIoJHByb3RlY3RlZCkgeyAvLyBUaGlzIFdpbGwgYmUgdGhlIGZ1Y3Rpb24gd2UgY2FsbCB0byBwcm90ZWN0IHRoZSB2YXJpYWJsZXMuDQoJJGJhbmxpc3QgPSBhcnJheSAoIiciLCAiXCIiLCAiPCIsICJcXCIsICJ8IiwgIi8iLCAiPSIsICJpbnNlcnQiLCAic2VsZWN0IiwgInVwZGF0ZSIsICJkZWxldGUiLCAiZGlzdGluY3QiLCAiaGF2aW5nIiwgInRydW5jYXRlIiwgInJlcGxhY2UiLCAiaGFuZGxlciIsICJsaWtlIiwgInByb2NlZHVyZSIsICJsaW1pdCIsICJvcmRlciBieSIsICJncm91cCBieSIsICJhc2MiLCAiZGVzYyIpOw0KCS8vJGJhbmxpc3QgaXMgdGhlIGxpc3Qgb2Ygd29yZHMgeW91IGRvbnQgd2FudCB0byBhbGxvdy4NCglpZiAoIGVyZWdpICggIlswLTldKyIsICRwcm90ZWN0ZWQgKSApIHsgLy8gTWFrZXMgc3VyZSBvbmx5IGxlZ2l0aW1hdGUgQ2hhcmFjdGVycyBhcmUgdXNlZC4NCgkJJHByb3RlY3RlZCA9IHRyaW0oc3RyX3JlcGxhY2UoJGJhbmxpc3QsICcnLCAkcHJvdGVjdGVkKSk7IC8vIFRha2VzIG91dCB3aGl0ZXNwYWNlLCBhbmQgcmVtb3ZlcyBhbnkgYmFubmVkIHdvcmRzLg0KCQlyZXR1cm4gJHByb3RlY3RlZDsNCgkJLy9lY2hvICIrIjsNCgl9IGVsc2Ugew0KCQkvL2VjaG8gIi0iOw0KCQllY2hvICRwcm90ZWN0ZWQ7DQoJCWRpZSAoICcgICDguYTguKHguYjguJbguLnguIHguJXguYnguK3guIfguJfguLXguYjguIjguLjguJTguYLguJvguKPguJTguKXguK3guIfguYPguIrguYnguKPguLLguKLguIHguLLguKPguK3guLfguYjguJkuICcgKTsgLy8gTWVzc2FnZSBpZiB0aGllciBpcyBhbnkgY2hhcmFjdGVycyBub3QgaW4gW2EtekEtWjAtOV0uDQoJfSAvLyBlbmRzIHRoZSBpZiAoIGVyZWdpICggIlthLXpBLVowLTldKyIsICR0aGlzLT5wcm90ZWN0ZWQgKSApIHsNCn0gLy8gZW5kcyB0aGUgZnVuY3Rpb24gUHJvdGVjdCgpIHsNCg0KDQp9DQo/Pg=="));//Generated by Ampare PHP Encoder. For more security please use php protect before encode the php program

Function Calls

base64_decode 1

Variables

None

Stats

MD5 5eea5d56fe1b555a58b4b9104ddd9ec1
Eval Count 1
Decode Time 179 ms