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("PD9waHANCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio..
Decoded Output download
?>b'<?php
/************************************************************************************************
** The contents of this file are subject to the Vtiger SalesFunnel Module License Version 1.0
* ( "License" ); You may not use this file except in compliance with the License
* The Original Code is: Technokrafts Labs Pvt Ltd
* The Initial Developer of the Original Code is Technokrafts Labs Pvt Ltd.
* Portions created by Technokrafts Labs Pvt Ltd are Copyright ( C ) Technokrafts Labs Pvt Ltd.
* All Rights Reserved.
**
************************************************************************************************/
/**
* SalesFunnel class extending the Core class
*/
class SalesFunnel {
function getstage($module_name)
{
global $adb;
if($module_name == \'Opportunities\')
{
$result = $adb->pquery("SELECT * FROM vtiger_sales_stage ORDER BY sales_stage_id ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'sales_stage\'])] = decode_html($resultrow[\'sales_stage\']);
}
}
}
if($module_name == \'Quotes\')
{
$result = $adb->pquery("SELECT * FROM vtiger_quotestage ORDER BY quotestageid ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'quotestage\'])] = decode_html($resultrow[\'quotestage\']);
}
}
}
if($module_name == \'Invoice\')
{
$result = $adb->pquery("SELECT * FROM vtiger_invoicestatus ORDER BY invoicestatusid ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'invoicestatus\'])] = decode_html($resultrow[\'invoicestatus\']);
}
}
}
if($module_name == \'Purchase Order\')
{
$result = $adb->pquery("SELECT * FROM vtiger_postatus ORDER BY postatusid ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'postatus\'])] = decode_html($resultrow[\'postatus\']);
}
}
}
if($module_name == \'Sales Order\')
{
$result = $adb->pquery("SELECT * FROM vtiger_sostatus ORDER BY sostatusid ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'sostatus\'])] = decode_html($resultrow[\'sostatus\']);
}
}
}
return $row;
}
function getDataOnFunnel($sales_stage,$sales_stage_all,$module_name)
{
global $adb;
$rows = array();
if(is_array($sales_stage) && count($sales_stage)==0)
{
$sales_stage = $sales_stage_all;
}
foreach($sales_stage as $key=>$value)
{
if($module_name == \'Opportunities\')
{
$query = "SELECT count(*) AS count FROM vtiger_potential INNER JOIN vtiger_crmentity ON vtiger_potential.potentialid = vtiger_crmentity.crmid LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid WHERE vtiger_crmentity.deleted=0 AND vtiger_potential.potentialid > 0 AND vtiger_potential.sales_stage = \'".$value."\'";
}
if($module_name == \'Quotes\')
{
$query ="SELECT count( * ) AS count
FROM vtiger_quotes
INNER JOIN vtiger_crmentity ON vtiger_quotes.quoteid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_quotes.quoteid >0
AND vtiger_quotes.quotestage =\'".$value."\'";
}
if($module_name == \'Invoice\')
{
$query ="SELECT count( * ) AS count
FROM vtiger_invoice
INNER JOIN vtiger_crmentity ON vtiger_invoice.invoiceid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_invoice.invoiceid >0
AND vtiger_invoice.invoicestatus =\'".$value."\'";
}
if($module_name == \'Purchase Order\')
{
$query ="SELECT count( * ) AS count
FROM vtiger_purchaseorder
INNER JOIN vtiger_crmentity ON vtiger_purchaseorder.purchaseorderid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_purchaseorder.purchaseorderid >0
AND vtiger_purchaseorder.postatus =\'".$value."\'";
}
if($module_name == \'Sales Order\')
{
$query ="SELECT count( * ) AS count
FROM vtiger_salesorder
INNER JOIN vtiger_crmentity ON vtiger_salesorder.salesorderid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_salesorder.salesorderid >0
AND vtiger_salesorder.sostatus =\'".$value."\'";
}
$result = $adb->pquery($query, array());
if($adb->num_rows($result)>0)
{
$resultrow = $adb->fetch_array($result);
$cnt = $resultrow[\'count\'];
if($cnt)
{
$row[$value] = $cnt;
}
}
}
return $row;
}
function getChartData($sales_stage,$module_name){
global $adb;
$rows = array();
if($module_name == \'Opportunities\')
{
$query = "SELECT vtiger_potential.potential_no,vtiger_potential.potentialtype,vtiger_potential.amount, vtiger_potential.potentialname, vtiger_potential.related_to, vtiger_potential.sales_stage, vtiger_potential.leadsource, vtiger_potential.closingdate, vtiger_crmentity.smownerid, vtiger_potential.potentialid
FROM vtiger_potential
INNER JOIN vtiger_crmentity ON vtiger_potential.potentialid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_potential.potentialid >0 ";
if(is_array($sales_stage) && count($sales_stage)>0)
{
$str = "\'".implode("\',\'",$sales_stage)."\'";
$query.=" AND vtiger_potential.sales_stage IN (".$str.")";
}
$query.=" ORDER BY vtiger_potential.sales_stage";
$result = $adb->pquery($query, array());
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[$resultrow[\'potentialid\']]["potentialname"] = decode_html($resultrow[\'potentialname\']);
$row[$resultrow[\'potentialid\']]["sales_stage"] = decode_html($resultrow[\'sales_stage\']);
$row[$resultrow[\'potentialid\']]["leadsource"] = decode_html($resultrow[\'leadsource\']);
$row[$resultrow[\'potentialid\']]["amount"] = decode_html($resultrow[\'amount\']);
$row[$resultrow[\'potentialid\']]["potentialtype"] = decode_html($resultrow[\'potentialtype\']);
}
}
}
if($module_name == \'Quotes\')
{
$query = "SELECT vtiger_quotes.quote_no, vtiger_quotes.subject, vtiger_quotes.total, vtiger_quotes.quotestage, vtiger_quotes.validtill, vtiger_crmentity.smownerid, vtiger_quotes.quoteid
FROM vtiger_quotes
INNER JOIN vtiger_crmentity ON vtiger_quotes.quoteid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_quotes.quoteid >0";
if(is_array($sales_stage) && count($sales_stage)>0)
{
$str = "\'".implode("\',\'",$sales_stage)."\'";
$query.=" AND vtiger_quotes.quotestage IN (".$str.")";
}
$query.=" ORDER BY vtiger_quotes.quotestage";
$result = $adb->pquery($query, array());
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[$resultrow[\'quoteid\']]["quote_no"] = decode_html($resultrow[\'quote_no\']);
$row[$resultrow[\'quoteid\']]["subject"] = decode_html($resultrow[\'subject\']);
$row[$resultrow[\'quoteid\']]["quotestage"] = decode_html($resultrow[\'quotestage\']);
$row[$resultrow[\'quoteid\']]["total"] = decode_html($resultrow[\'total\']);
$row[$resultrow[\'quoteid\']]["validtill"] = decode_html($resultrow[\'validtill\']);
}
}
}
if($module_name == \'Invoice\')
{
$query = "SELECT vtiger_invoice.invoice_no, vtiger_invoice.subject,vtiger_invoice.invoicestatus, vtiger_invoice.invoicedate,vtiger_invoice.total,vtiger_crmentity.smownerid, vtiger_invoice.invoiceid
FROM vtiger_invoice
INNER JOIN vtiger_crmentity ON vtiger_invoice.invoiceid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_invoice.invoiceid >0";
if(is_array($sales_stage) && count($sales_stage)>0)
{
$str = "\'".implode("\',\'",$sales_stage)."\'";
$query.=" AND vtiger_invoice.invoicestatus IN (".$str.")";
}
$query.=" ORDER BY vtiger_invoice.invoicestatus";
$result = $adb->pquery($query, array());
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[$resultrow[\'invoiceid\']]["invoice_no"] = decode_html($resultrow[\'invoice_no\']);
$row[$resultrow[\'invoiceid\']]["subject"] = decode_html($resultrow[\'subject\']);
$row[$resultrow[\'invoiceid\']]["invoicestatus"] = decode_html($resultrow[\'invoicestatus\']);
$row[$resultrow[\'invoiceid\']]["invoicedate"] = decode_html($resultrow[\'invoicedate\']);
$row[$resultrow[\'invoiceid\']]["total"] = decode_html($resultrow[\'total\']);
}
}
}
if($module_name == \'Purchase Order\')
{
$query ="SELECT vtiger_purchaseorder.purchaseorder_no,vtiger_purchaseorder.subject,vtiger_purchaseorder.total, vtiger_purchaseorder.postatus,vtiger_purchaseorder.requisition_no, vtiger_crmentity.smownerid, vtiger_purchaseorder.purchaseorderid
FROM vtiger_purchaseorder
INNER JOIN vtiger_crmentity ON vtiger_purchaseorder.purchaseorderid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_purchaseorder.purchaseorderid >0";
if(is_array($sales_stage) && count($sales_stage)>0)
{
$str = "\'".implode("\',\'",$sales_stage)."\'";
$query.=" AND vtiger_purchaseorder.postatus IN (".$str.")";
}
$query.=" ORDER BY vtiger_purchaseorder.postatus";
$result = $adb->pquery($query, array());
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[$resultrow[\'purchaseorderid\']]["purchaseorder_no"] = decode_html($resultrow[\'purchaseorder_no\']);
$row[$resultrow[\'purchaseorderid\']]["subject"] = decode_html($resultrow[\'subject\']);
$row[$resultrow[\'purchaseorderid\']]["postatus"] = decode_html($resultrow[\'postatus\']);
$row[$resultrow[\'purchaseorderid\']]["total"] = decode_html($resultrow[\'total\']);
$row[$resultrow[\'purchaseorderid\']]["requisition_no"] = decode_html($resultrow[\'requisition_no\']);
}
}
}
if($module_name == \'Sales Order\')
{
$query = "SELECT vtiger_salesorder.salesorder_no, vtiger_salesorder.subject, vtiger_salesorder.total, vtiger_salesorder.sostatus, vtiger_salesorder.duedate, vtiger_crmentity.smownerid, vtiger_salesorder.salesorderid
FROM vtiger_salesorder
INNER JOIN vtiger_crmentity ON vtiger_salesorder.salesorderid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_salesorder.salesorderid >0";
if(is_array($sales_stage) && count($sales_stage)>0)
{
$str = "\'".implode("\',\'",$sales_stage)."\'";
$query.=" AND vtiger_salesorder.sostatus IN (".$str.")";
}
$query.=" ORDER BY vtiger_salesorder.sostatus";
$result = $adb->pquery($query, array());
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[$resultrow[\'salesorderid\']]["salesorder_no"] = decode_html($resultrow[\'salesorder_no\']);
$row[$resultrow[\'salesorderid\']]["subject"] = decode_html($resultrow[\'subject\']);
$row[$resultrow[\'salesorderid\']]["sostatus"] = decode_html($resultrow[\'sostatus\']);
$row[$resultrow[\'salesorderid\']]["total"] = decode_html($resultrow[\'total\']);
$row[$resultrow[\'salesorderid\']]["duedate"] = decode_html($resultrow[\'duedate\']);
}
}
}
return $row;
}
function getAllStages($flag=0) {
global $adb,$mod_strings;
$result = $adb->pquery("SELECT * FROM vtiger_sales_stage ORDER BY sales_stage_id ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
if($flag)
{
if($mod_strings[$resultrow[\'sales_stage\']])
{
$row[decode_html($resultrow[\'sales_stage\'])] = decode_html($mod_strings[$resultrow[\'sales_stage\']]);
}else{
$row[decode_html($resultrow[\'sales_stage\'])] = decode_html($resultrow[\'sales_stage\']);
}
}else{
$row[decode_html($resultrow[\'sales_stage\'])] = decode_html($resultrow[\'sales_stage\']);
}
}
}
return $row;
}
function getStagesDataFunnel($sales_stage,$sales_stage_all)
{
global $adb;
$rows = array();
if(is_array($sales_stage) && count($sales_stage)==0)
{
$sales_stage = $sales_stage_all;
}
foreach($sales_stage as $key=>$value)
{
$query = "SELECT count(*) AS count FROM vtiger_potential INNER JOIN vtiger_crmentity ON vtiger_potential.potentialid = vtiger_crmentity.crmid LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid WHERE vtiger_crmentity.deleted=0 AND vtiger_potential.potentialid > 0 AND vtiger_potential.sales_stage = \'".$value."\'";
$result = $adb->pquery($query, array());
if($adb->num_rows($result)>0)
{
$resultrow = $adb->fetch_array($result);
$cnt = $resultrow[\'count\'];
if($cnt)
{
$row[$value] = $cnt;
}
}
}
return $row;
}
function rand_colorCode(){
$r = dechex(mt_rand(0,255)); // generate the red component
$g = dechex(mt_rand(0,255)); // generate the green component
$b = dechex(mt_rand(0,255)); // generate the blue component
$rgb = $r.$g.$b;
if($r == $g && $g == $b){
$rgb = substr($rgb,0,3); // shorter version
}
return \'#\'.$rgb;
}
function getStagesData($sales_stage)
{
global $adb,$mod_strings;
$rows = array();
$query = "SELECT vtiger_potential.potential_no,vtiger_potential.potentialtype,vtiger_potential.amount, vtiger_potential.potentialname, vtiger_potential.related_to, vtiger_potential.sales_stage, vtiger_potential.leadsource, vtiger_potential.closingdate, vtiger_crmentity.smownerid, vtiger_potential.potentialid
FROM vtiger_potential
INNER JOIN vtiger_crmentity ON vtiger_potential.potentialid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_potential.potentialid >0 ";
if(is_array($sales_stage) && count($sales_stage)>0)
{
$str = "\'".implode("\',\'",$sales_stage)."\'";
$query.=" AND vtiger_potential.sales_stage IN (".$str.")";
}
$query.=" ORDER BY vtiger_potential.sales_stage";
$result = $adb->pquery($query, array());
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[$resultrow[\'potentialid\']]["potentialname"] = decode_html($resultrow[\'potentialname\']);
$row[$resultrow[\'potentialid\']]["sales_stage"] = decode_html($resultrow[\'sales_stage\']);
$row[$resultrow[\'potentialid\']]["leadsource"] = decode_html($resultrow[\'leadsource\']);
$row[$resultrow[\'potentialid\']]["amount"] = decode_html($resultrow[\'amount\']);
$row[$resultrow[\'potentialid\']]["potentialtype"] = decode_html($resultrow[\'potentialtype\']);
}
}
return $row;
}
function getAllStagesQuote() {
global $adb;
$result = $adb->pquery("SELECT * FROM vtiger_quotestage ORDER BY quotestageid ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'quotestage\'])] = decode_html($resultrow[\'quotestage\']);
}
}
return $row;
}
function getAllStagesInvoice() {
global $adb;
$result = $adb->pquery("SELECT * FROM vtiger_invoicestatus ORDER BY invoicestatusid ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'invoicestatus\'])] = decode_html($resultrow[\'invoicestatus\']);
}
}
return $row;
}
function getAllStagesSO() {
global $adb;
$result = $adb->pquery("SELECT * FROM vtiger_sostatus ORDER BY sostatusid ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'sostatus\'])] = decode_html($resultrow[\'sostatus\']);
}
}
return $row;
}
function getAllStagesPO() {
global $adb;
$result = $adb->pquery("SELECT * FROM vtiger_postatus ORDER BY postatusid ASC", array());
$rows = array();
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[decode_html($resultrow[\'postatus\'])] = decode_html($resultrow[\'postatus\']);
}
}
return $row;
}
function getStagesDataFunnelQuote($sales_stage,$sales_stage_all)
{
global $adb;
$rows = array();
if(is_array($sales_stage) && count($sales_stage)==0)
{
$sales_stage = $sales_stage_all;
}
foreach($sales_stage as $key=>$value)
{
$query = "SELECT count( * ) AS count
FROM vtiger_quotestage
INNER JOIN vtiger_crmentity ON vtiger_quotestage.quotestageid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_quotestage.quotestageid >0
AND vtiger_quotestage.quotestage =\'".$value."\'";
$result = $adb->pquery($query, array());
if($adb->num_rows($result)>0)
{
$resultrow = $adb->fetch_array($result);
$cnt = $resultrow[\'count\'];
if($cnt)
{
$row[$value] = $cnt;
}
}
}
return $row;
}
function getStagesDataQuote($sales_stage)
{
global $adb,$mod_strings;
$rows = array();
$query = "SELECT vtiger_quotes.quote_no, vtiger_quotes.subject, vtiger_quotes.total, vtiger_quotes.quotestage, vtiger_quotes.validtill, vtiger_crmentity.smownerid, vtiger_quotes.quoteid
FROM vtiger_quotes
INNER JOIN vtiger_crmentity ON vtiger_quotes.quoteid = vtiger_crmentity.crmid
LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id
LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid = vtiger_groups.groupid
WHERE vtiger_crmentity.deleted =0
AND vtiger_quotes.quoteid >0";
if(is_array($quotestage) && count($quotestage)>0)
{
$str = "\'".implode("\',\'",$quotestage)."\'";
$query.=" AND vtiger_quotes.quotestage IN (".$str.")";
}
$query.=" ORDER BY vtiger_quotes.quotestage";
$result = $adb->pquery($query, array());
if ($adb->num_rows($result)) {
while ($resultrow = $adb->fetch_array($result)) {
$row[$resultrow[\'quoteid\']]["quote_no"] = decode_html($resultrow[\'quote_no\']);
$row[$resultrow[\'quoteid\']]["subject"] = decode_html($resultrow[\'subject\']);
$row[$resultrow[\'quoteid\']]["quotestage"] = decode_html($resultrow[\'quotestage\']);
$row[$resultrow[\'quoteid\']]["total"] = decode_html($resultrow[\'total\']);
$row[$resultrow[\'quoteid\']]["validtill"] = decode_html($resultrow[\'validtill\']);
}
}
return $row;
}
}
?>'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHANCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFZ0aWdlciBTYWxlc0Z1bm5lbCBNb2R1bGUgTGljZW5zZSBWZXJzaW9uIDEuMA0KICogKCAiTGljZW5zZSIgKTsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlDQogKiBUaGUgT3JpZ2luYWwgQ29kZSBpczogIFRlY2hub2tyYWZ0cyBMYWJzIFB2dCBMdGQNCiAqIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBUZWNobm9rcmFmdHMgTGFicyBQdnQgTHRkLg0KICogUG9ydGlvbnMgY3JlYXRlZCBieSBUZWNobm9rcmFmdHMgTGFicyBQdnQgTHRkIGFyZSBDb3B5cmlnaHQgKCBDICkgVGVjaG5va3JhZnRzIExhYnMgUHZ0IEx0ZC4NCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQoqKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqDQogKiBTYWxlc0Z1bm5lbCBjbGFzcyBleHRlbmRpbmcgdGhlIENvcmUgY2xhc3MNCiAqLw0KY2xhc3MgU2FsZXNGdW5uZWwgIHsJDQoNCgkgZnVuY3Rpb24gZ2V0c3RhZ2UoJG1vZHVsZV9uYW1lKQ0KCSB7DQoJIAkNCgkJZ2xvYmFsICRhZGI7DQoJCWlmKCRtb2R1bGVfbmFtZSA9PSAnT3Bwb3J0dW5pdGllcycpDQoJCXsNCgkJCSRyZXN1bHQgPSAkYWRiLT5wcXVlcnkoIlNFTEVDVCAqIEZST00gdnRpZ2VyX3NhbGVzX3N0YWdlIE9SREVSIEJZIHNhbGVzX3N0YWdlX2lkIEFTQyIsIGFycmF5KCkpOw0KCQkJJHJvd3MgPSBhcnJheSgpOw0KCQkJaWYgKCRhZGItPm51bV9yb3dzKCRyZXN1bHQpKSB7DQoJCQkJd2hpbGUgKCRyZXN1bHRyb3cgPSAkYWRiLT5mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQkkcm93W2RlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3NhbGVzX3N0YWdlJ10pXSA9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3NhbGVzX3N0YWdlJ10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlpZigkbW9kdWxlX25hbWUgPT0gJ1F1b3RlcycpDQoJCXsNCgkJCSRyZXN1bHQgPSAkYWRiLT5wcXVlcnkoIlNFTEVDVCAqIEZST00gdnRpZ2VyX3F1b3Rlc3RhZ2UgT1JERVIgQlkgcXVvdGVzdGFnZWlkIEFTQyIsIGFycmF5KCkpOw0KCQkJJHJvd3MgPSBhcnJheSgpOw0KCQkJaWYgKCRhZGItPm51bV9yb3dzKCRyZXN1bHQpKSB7DQoJCQkJd2hpbGUgKCRyZXN1bHRyb3cgPSAkYWRiLT5mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQkkcm93W2RlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3F1b3Rlc3RhZ2UnXSldID0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1sncXVvdGVzdGFnZSddKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJaWYoJG1vZHVsZV9uYW1lID09ICdJbnZvaWNlJykNCgkJew0KCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgiU0VMRUNUICogRlJPTSB2dGlnZXJfaW52b2ljZXN0YXR1cyBPUkRFUiBCWSBpbnZvaWNlc3RhdHVzaWQgQVNDIiwgYXJyYXkoKSk7DQoJCQkkcm93cyA9IGFycmF5KCk7DQoJCQlpZiAoJGFkYi0+bnVtX3Jvd3MoJHJlc3VsdCkpIHsNCgkJCQl3aGlsZSAoJHJlc3VsdHJvdyA9ICRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCSRyb3dbZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snaW52b2ljZXN0YXR1cyddKV0gPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydpbnZvaWNlc3RhdHVzJ10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlpZigkbW9kdWxlX25hbWUgPT0gJ1B1cmNoYXNlIE9yZGVyJykNCgkJew0KCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgiU0VMRUNUICogRlJPTSB2dGlnZXJfcG9zdGF0dXMgT1JERVIgQlkgcG9zdGF0dXNpZCBBU0MiLCBhcnJheSgpKTsNCgkJCSRyb3dzID0gYXJyYXkoKTsNCgkJCWlmICgkYWRiLT5udW1fcm93cygkcmVzdWx0KSkgew0KCQkJCXdoaWxlICgkcmVzdWx0cm93ID0gJGFkYi0+ZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJJHJvd1tkZWNvZGVfaHRtbCgkcmVzdWx0cm93Wydwb3N0YXR1cyddKV0gPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93Wydwb3N0YXR1cyddKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJaWYoJG1vZHVsZV9uYW1lID09ICdTYWxlcyBPcmRlcicpDQoJCXsNCgkJDQoJCQkkcmVzdWx0ID0gJGFkYi0+cHF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHZ0aWdlcl9zb3N0YXR1cyBPUkRFUiBCWSBzb3N0YXR1c2lkIEFTQyIsIGFycmF5KCkpOw0KCQkJJHJvd3MgPSBhcnJheSgpOw0KCQkJaWYgKCRhZGItPm51bV9yb3dzKCRyZXN1bHQpKSB7DQoJCQkJd2hpbGUgKCRyZXN1bHRyb3cgPSAkYWRiLT5mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQkkcm93W2RlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3Nvc3RhdHVzJ10pXSA9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3Nvc3RhdHVzJ10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJHJvdzsNCgkgfQ0KCWZ1bmN0aW9uIGdldERhdGFPbkZ1bm5lbCgkc2FsZXNfc3RhZ2UsJHNhbGVzX3N0YWdlX2FsbCwkbW9kdWxlX25hbWUpDQoJew0KCQkJCQ0KCQkJZ2xvYmFsICRhZGI7DQoJCQkkcm93cyA9IGFycmF5KCk7DQoJCQkJCQ0KCQkJCWlmKGlzX2FycmF5KCRzYWxlc19zdGFnZSkgJiYgY291bnQoJHNhbGVzX3N0YWdlKT09MCkNCgkJCQl7DQoJCQkJCQ0KCQkJCQkkc2FsZXNfc3RhZ2UJPQkkc2FsZXNfc3RhZ2VfYWxsOw0KCQkJCQ0KCQkJCX0NCgkNCgkJCQlmb3JlYWNoKCRzYWxlc19zdGFnZSBhcyAka2V5PT4kdmFsdWUpDQoJCQkJew0KCQkJCQkNCgkJCQkJaWYoJG1vZHVsZV9uYW1lID09ICdPcHBvcnR1bml0aWVzJykNCgkJCQkJew0KCQkJCQkJJHF1ZXJ5CT0JIlNFTEVDVCBjb3VudCgqKSBBUyBjb3VudCAgRlJPTSB2dGlnZXJfcG90ZW50aWFsIElOTkVSIEpPSU4gdnRpZ2VyX2NybWVudGl0eSBPTiB2dGlnZXJfcG90ZW50aWFsLnBvdGVudGlhbGlkID0gdnRpZ2VyX2NybWVudGl0eS5jcm1pZCBMRUZUIEpPSU4gdnRpZ2VyX3VzZXJzIE9OIHZ0aWdlcl9jcm1lbnRpdHkuc21vd25lcmlkID0gdnRpZ2VyX3VzZXJzLmlkIExFRlQgSk9JTiB2dGlnZXJfZ3JvdXBzIE9OIHZ0aWdlcl9jcm1lbnRpdHkuc21vd25lcmlkID0gdnRpZ2VyX2dyb3Vwcy5ncm91cGlkIFdIRVJFIHZ0aWdlcl9jcm1lbnRpdHkuZGVsZXRlZD0wIEFORCB2dGlnZXJfcG90ZW50aWFsLnBvdGVudGlhbGlkID4gMCBBTkQgdnRpZ2VyX3BvdGVudGlhbC5zYWxlc19zdGFnZSA9ICciLiR2YWx1ZS4iJyI7DQoJCQkJCX0NCgkJCQkJaWYoJG1vZHVsZV9uYW1lID09ICdRdW90ZXMnKQ0KCQkJCQl7DQoJCQkJCQkkcXVlcnkJPSJTRUxFQ1QgY291bnQoICogKSBBUyBjb3VudA0KCQkJCQkJCQlGUk9NIHZ0aWdlcl9xdW90ZXMNCgkJCQkJCQkJSU5ORVIgSk9JTiB2dGlnZXJfY3JtZW50aXR5IE9OIHZ0aWdlcl9xdW90ZXMucXVvdGVpZCA9IHZ0aWdlcl9jcm1lbnRpdHkuY3JtaWQNCgkJCQkJCQkJTEVGVCBKT0lOIHZ0aWdlcl91c2VycyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl91c2Vycy5pZA0KCQkJCQkJCQlMRUZUIEpPSU4gdnRpZ2VyX2dyb3VwcyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl9ncm91cHMuZ3JvdXBpZA0KCQkJCQkJCQlXSEVSRSB2dGlnZXJfY3JtZW50aXR5LmRlbGV0ZWQgPTANCgkJCQkJCQkJQU5EIHZ0aWdlcl9xdW90ZXMucXVvdGVpZCA+MA0KCQkJCQkJCQlBTkQgdnRpZ2VyX3F1b3Rlcy5xdW90ZXN0YWdlID0nIi4kdmFsdWUuIiciOw0KCQkJCQl9DQoJCQkJCWlmKCRtb2R1bGVfbmFtZSA9PSAnSW52b2ljZScpDQoJCQkJCXsNCgkJCQkJCSRxdWVyeQk9IlNFTEVDVCBjb3VudCggKiApIEFTIGNvdW50DQoJCQkJCQkJCUZST00gdnRpZ2VyX2ludm9pY2UNCgkJCQkJCQkJSU5ORVIgSk9JTiB2dGlnZXJfY3JtZW50aXR5IE9OIHZ0aWdlcl9pbnZvaWNlLmludm9pY2VpZCA9IHZ0aWdlcl9jcm1lbnRpdHkuY3JtaWQNCgkJCQkJCQkJTEVGVCBKT0lOIHZ0aWdlcl91c2VycyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl91c2Vycy5pZA0KCQkJCQkJCQlMRUZUIEpPSU4gdnRpZ2VyX2dyb3VwcyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl9ncm91cHMuZ3JvdXBpZA0KCQkJCQkJCQlXSEVSRSB2dGlnZXJfY3JtZW50aXR5LmRlbGV0ZWQgPTANCgkJCQkJCQkJQU5EIHZ0aWdlcl9pbnZvaWNlLmludm9pY2VpZCA+MA0KCQkJCQkJCQlBTkQgdnRpZ2VyX2ludm9pY2UuaW52b2ljZXN0YXR1cyA9JyIuJHZhbHVlLiInIjsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJaWYoJG1vZHVsZV9uYW1lID09ICdQdXJjaGFzZSBPcmRlcicpDQoJCQkJCXsNCgkJCQkJCSRxdWVyeQk9IlNFTEVDVCBjb3VudCggKiApIEFTIGNvdW50DQoJCQkJCQkJCUZST00gdnRpZ2VyX3B1cmNoYXNlb3JkZXINCgkJCQkJCQkJSU5ORVIgSk9JTiB2dGlnZXJfY3JtZW50aXR5IE9OIHZ0aWdlcl9wdXJjaGFzZW9yZGVyLnB1cmNoYXNlb3JkZXJpZCA9IHZ0aWdlcl9jcm1lbnRpdHkuY3JtaWQNCgkJCQkJCQkJTEVGVCBKT0lOIHZ0aWdlcl91c2VycyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl91c2Vycy5pZA0KCQkJCQkJCQlMRUZUIEpPSU4gdnRpZ2VyX2dyb3VwcyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl9ncm91cHMuZ3JvdXBpZA0KCQkJCQkJCQlXSEVSRSB2dGlnZXJfY3JtZW50aXR5LmRlbGV0ZWQgPTANCgkJCQkJCQkJQU5EIHZ0aWdlcl9wdXJjaGFzZW9yZGVyLnB1cmNoYXNlb3JkZXJpZCA+MA0KCQkJCQkJCQlBTkQgdnRpZ2VyX3B1cmNoYXNlb3JkZXIucG9zdGF0dXMgPSciLiR2YWx1ZS4iJyI7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCWlmKCRtb2R1bGVfbmFtZSA9PSAnU2FsZXMgT3JkZXInKQ0KCQkJCQl7DQoJCQkJCQkkcXVlcnkJPSJTRUxFQ1QgY291bnQoICogKSBBUyBjb3VudA0KCQkJCQkJCQlGUk9NIHZ0aWdlcl9zYWxlc29yZGVyDQoJCQkJCQkJCUlOTkVSIEpPSU4gdnRpZ2VyX2NybWVudGl0eSBPTiB2dGlnZXJfc2FsZXNvcmRlci5zYWxlc29yZGVyaWQgPSB2dGlnZXJfY3JtZW50aXR5LmNybWlkDQoJCQkJCQkJCUxFRlQgSk9JTiB2dGlnZXJfdXNlcnMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfdXNlcnMuaWQNCgkJCQkJCQkJTEVGVCBKT0lOIHZ0aWdlcl9ncm91cHMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfZ3JvdXBzLmdyb3VwaWQNCgkJCQkJCQkJV0hFUkUgdnRpZ2VyX2NybWVudGl0eS5kZWxldGVkID0wDQoJCQkJCQkJCUFORCB2dGlnZXJfc2FsZXNvcmRlci5zYWxlc29yZGVyaWQgPjANCgkJCQkJCQkJQU5EIHZ0aWdlcl9zYWxlc29yZGVyLnNvc3RhdHVzID0nIi4kdmFsdWUuIiciOw0KCQkJCQl9CQ0KCQkJCQkJCQkJCQkNCgkJCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgkcXVlcnksIGFycmF5KCkpOw0KCQkNCgkJCQkJaWYoJGFkYi0+bnVtX3Jvd3MoJHJlc3VsdCk+MCkNCgkJCQkJew0KCQkJCQkJJHJlc3VsdHJvdyAJPSAJJGFkYi0+ZmV0Y2hfYXJyYXkoJHJlc3VsdCk7CQkJCQkJDQoJCQkJCQkkY250CQk9CSRyZXN1bHRyb3dbJ2NvdW50J107DQoJCQkJCQlpZigkY250KQ0KCQkJCQkJew0KCQkJCQkJCSRyb3dbJHZhbHVlXSA9ICRjbnQ7DQoJCQkJCQl9DQoJCQkJCX0JDQoNCgkJCQl9DQoJCQ0KCQlyZXR1cm4gJHJvdzsJDQoJfQ0KCWZ1bmN0aW9uIGdldENoYXJ0RGF0YSgkc2FsZXNfc3RhZ2UsJG1vZHVsZV9uYW1lKXsNCgkJZ2xvYmFsICRhZGI7DQoJCSRyb3dzID0gYXJyYXkoKTsNCgkJaWYoJG1vZHVsZV9uYW1lID09ICdPcHBvcnR1bml0aWVzJykNCgkJewkJCQ0KCQkJJHF1ZXJ5CT0JIlNFTEVDVCB2dGlnZXJfcG90ZW50aWFsLnBvdGVudGlhbF9ubyx2dGlnZXJfcG90ZW50aWFsLnBvdGVudGlhbHR5cGUsdnRpZ2VyX3BvdGVudGlhbC5hbW91bnQsIHZ0aWdlcl9wb3RlbnRpYWwucG90ZW50aWFsbmFtZSwgdnRpZ2VyX3BvdGVudGlhbC5yZWxhdGVkX3RvLCB2dGlnZXJfcG90ZW50aWFsLnNhbGVzX3N0YWdlLCB2dGlnZXJfcG90ZW50aWFsLmxlYWRzb3VyY2UsIHZ0aWdlcl9wb3RlbnRpYWwuY2xvc2luZ2RhdGUsIHZ0aWdlcl9jcm1lbnRpdHkuc21vd25lcmlkLCB2dGlnZXJfcG90ZW50aWFsLnBvdGVudGlhbGlkDQoJCQkJCUZST00gdnRpZ2VyX3BvdGVudGlhbA0KCQkJCQlJTk5FUiBKT0lOIHZ0aWdlcl9jcm1lbnRpdHkgT04gdnRpZ2VyX3BvdGVudGlhbC5wb3RlbnRpYWxpZCA9IHZ0aWdlcl9jcm1lbnRpdHkuY3JtaWQNCgkJCQkJTEVGVCBKT0lOIHZ0aWdlcl91c2VycyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl91c2Vycy5pZA0KCQkJCQlMRUZUIEpPSU4gdnRpZ2VyX2dyb3VwcyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl9ncm91cHMuZ3JvdXBpZA0KCQkJCQlXSEVSRSB2dGlnZXJfY3JtZW50aXR5LmRlbGV0ZWQgPTANCgkJCQkJQU5EIHZ0aWdlcl9wb3RlbnRpYWwucG90ZW50aWFsaWQgPjAgIjsJDQoJDQoJCQlpZihpc19hcnJheSgkc2FsZXNfc3RhZ2UpICYmIGNvdW50KCRzYWxlc19zdGFnZSk+MCkNCgkJCXsNCgkJCQkkc3RyCT0JIiciLmltcGxvZGUoIicsJyIsJHNhbGVzX3N0YWdlKS4iJyI7DQoJCQkJDQoJCQkJJHF1ZXJ5Lj0iIEFORCB2dGlnZXJfcG90ZW50aWFsLnNhbGVzX3N0YWdlIElOICgiLiRzdHIuIikiOw0KCQkJfQ0KCQkJJHF1ZXJ5Lj0iIE9SREVSIEJZIHZ0aWdlcl9wb3RlbnRpYWwuc2FsZXNfc3RhZ2UiOw0KCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgkcXVlcnksIGFycmF5KCkpOwkJDQoJCQlpZiAoJGFkYi0+bnVtX3Jvd3MoJHJlc3VsdCkpIHsNCgkJCQl3aGlsZSAoJHJlc3VsdHJvdyA9ICRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCSRyb3dbJHJlc3VsdHJvd1sncG90ZW50aWFsaWQnXV1bInBvdGVudGlhbG5hbWUiXSAJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93Wydwb3RlbnRpYWxuYW1lJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3BvdGVudGlhbGlkJ11dWyJzYWxlc19zdGFnZSJdIAkJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydzYWxlc19zdGFnZSddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93Wydwb3RlbnRpYWxpZCddXVsibGVhZHNvdXJjZSJdIAkJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydsZWFkc291cmNlJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3BvdGVudGlhbGlkJ11dWyJhbW91bnQiXSAJCQk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ2Ftb3VudCddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93Wydwb3RlbnRpYWxpZCddXVsicG90ZW50aWFsdHlwZSJdIAk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3BvdGVudGlhbHR5cGUnXSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCWlmKCRtb2R1bGVfbmFtZSA9PSAnUXVvdGVzJykNCgkJew0KCQkJCSRxdWVyeQk9CSJTRUxFQ1QgdnRpZ2VyX3F1b3Rlcy5xdW90ZV9ubywgdnRpZ2VyX3F1b3Rlcy5zdWJqZWN0LCB2dGlnZXJfcXVvdGVzLnRvdGFsLCB2dGlnZXJfcXVvdGVzLnF1b3Rlc3RhZ2UsIAkJdnRpZ2VyX3F1b3Rlcy52YWxpZHRpbGwsIHZ0aWdlcl9jcm1lbnRpdHkuc21vd25lcmlkLCB2dGlnZXJfcXVvdGVzLnF1b3RlaWQNCglGUk9NIHZ0aWdlcl9xdW90ZXMNCglJTk5FUiBKT0lOIHZ0aWdlcl9jcm1lbnRpdHkgT04gdnRpZ2VyX3F1b3Rlcy5xdW90ZWlkID0gdnRpZ2VyX2NybWVudGl0eS5jcm1pZA0KCUxFRlQgSk9JTiB2dGlnZXJfdXNlcnMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfdXNlcnMuaWQNCglMRUZUIEpPSU4gdnRpZ2VyX2dyb3VwcyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl9ncm91cHMuZ3JvdXBpZA0KCVdIRVJFIHZ0aWdlcl9jcm1lbnRpdHkuZGVsZXRlZCA9MA0KCUFORCB2dGlnZXJfcXVvdGVzLnF1b3RlaWQgPjAiOwkNCgkNCgkJCWlmKGlzX2FycmF5KCRzYWxlc19zdGFnZSkgJiYgY291bnQoJHNhbGVzX3N0YWdlKT4wKQ0KCQkJew0KCQkJCSRzdHIJPQkiJyIuaW1wbG9kZSgiJywnIiwkc2FsZXNfc3RhZ2UpLiInIjsNCgkJCQkkcXVlcnkuPSIgQU5EIHZ0aWdlcl9xdW90ZXMucXVvdGVzdGFnZSBJTiAoIi4kc3RyLiIpIjsNCgkJCX0NCgkJCSRxdWVyeS49IiBPUkRFUiBCWSB2dGlnZXJfcXVvdGVzLnF1b3Rlc3RhZ2UiOw0KCQkJDQoJCQkkcmVzdWx0ID0gJGFkYi0+cHF1ZXJ5KCRxdWVyeSwgYXJyYXkoKSk7CQkNCgkJCWlmICgkYWRiLT5udW1fcm93cygkcmVzdWx0KSkgew0KCQkJCXdoaWxlICgkcmVzdWx0cm93ID0gJGFkYi0+ZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJJHJvd1skcmVzdWx0cm93WydxdW90ZWlkJ11dWyJxdW90ZV9ubyJdIAk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3F1b3RlX25vJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3F1b3RlaWQnXV1bInN1YmplY3QiXSAJCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc3ViamVjdCddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93WydxdW90ZWlkJ11dWyJxdW90ZXN0YWdlIl0gCQk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3F1b3Rlc3RhZ2UnXSk7DQoJCQkJCSRyb3dbJHJlc3VsdHJvd1sncXVvdGVpZCddXVsidG90YWwiXSAJCQk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3RvdGFsJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3F1b3RlaWQnXV1bInZhbGlkdGlsbCJdIAk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3ZhbGlkdGlsbCddKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJaWYoJG1vZHVsZV9uYW1lID09ICdJbnZvaWNlJykNCgkJew0KCQkJJHF1ZXJ5CT0JIlNFTEVDVCB2dGlnZXJfaW52b2ljZS5pbnZvaWNlX25vLCB2dGlnZXJfaW52b2ljZS5zdWJqZWN0LHZ0aWdlcl9pbnZvaWNlLmludm9pY2VzdGF0dXMsCQl2dGlnZXJfaW52b2ljZS5pbnZvaWNlZGF0ZSx2dGlnZXJfaW52b2ljZS50b3RhbCx2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCwgdnRpZ2VyX2ludm9pY2UuaW52b2ljZWlkDQoJRlJPTSB2dGlnZXJfaW52b2ljZQ0KCUlOTkVSIEpPSU4gdnRpZ2VyX2NybWVudGl0eSBPTiB2dGlnZXJfaW52b2ljZS5pbnZvaWNlaWQgPSB2dGlnZXJfY3JtZW50aXR5LmNybWlkDQoJTEVGVCBKT0lOIHZ0aWdlcl91c2VycyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl91c2Vycy5pZA0KCUxFRlQgSk9JTiB2dGlnZXJfZ3JvdXBzIE9OIHZ0aWdlcl9jcm1lbnRpdHkuc21vd25lcmlkID0gdnRpZ2VyX2dyb3Vwcy5ncm91cGlkDQoJV0hFUkUgdnRpZ2VyX2NybWVudGl0eS5kZWxldGVkID0wDQoJQU5EIHZ0aWdlcl9pbnZvaWNlLmludm9pY2VpZCA+MCI7CQ0KCQ0KCQkJaWYoaXNfYXJyYXkoJHNhbGVzX3N0YWdlKSAmJiBjb3VudCgkc2FsZXNfc3RhZ2UpPjApDQoJCQl7DQoJCQkJJHN0cgk9CSInIi5pbXBsb2RlKCInLCciLCRzYWxlc19zdGFnZSkuIiciOw0KCQkJCSRxdWVyeS49IiBBTkQgdnRpZ2VyX2ludm9pY2UuaW52b2ljZXN0YXR1cyBJTiAoIi4kc3RyLiIpIjsNCgkJCX0NCgkJCSRxdWVyeS49IiBPUkRFUiBCWSB2dGlnZXJfaW52b2ljZS5pbnZvaWNlc3RhdHVzIjsNCgkJCQ0KCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgkcXVlcnksIGFycmF5KCkpOwkJDQoJCQlpZiAoJGFkYi0+bnVtX3Jvd3MoJHJlc3VsdCkpIHsNCgkJCQl3aGlsZSAoJHJlc3VsdHJvdyA9ICRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCSRyb3dbJHJlc3VsdHJvd1snaW52b2ljZWlkJ11dWyJpbnZvaWNlX25vIl0gCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snaW52b2ljZV9ubyddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93WydpbnZvaWNlaWQnXV1bInN1YmplY3QiXSAJCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc3ViamVjdCddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93WydpbnZvaWNlaWQnXV1bImludm9pY2VzdGF0dXMiXSAJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydpbnZvaWNlc3RhdHVzJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ2ludm9pY2VpZCddXVsiaW52b2ljZWRhdGUiXSAJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydpbnZvaWNlZGF0ZSddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93WydpbnZvaWNlaWQnXV1bInRvdGFsIl0gCQkJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93Wyd0b3RhbCddKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJDQoJCWlmKCRtb2R1bGVfbmFtZSA9PSAnUHVyY2hhc2UgT3JkZXInKQ0KCQl7DQoJCQkkcXVlcnkJPSJTRUxFQ1QgdnRpZ2VyX3B1cmNoYXNlb3JkZXIucHVyY2hhc2VvcmRlcl9ubyx2dGlnZXJfcHVyY2hhc2VvcmRlci5zdWJqZWN0LHZ0aWdlcl9wdXJjaGFzZW9yZGVyLnRvdGFsLCB2dGlnZXJfcHVyY2hhc2VvcmRlci5wb3N0YXR1cyx2dGlnZXJfcHVyY2hhc2VvcmRlci5yZXF1aXNpdGlvbl9ubywgdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQsIHZ0aWdlcl9wdXJjaGFzZW9yZGVyLnB1cmNoYXNlb3JkZXJpZA0KCUZST00gdnRpZ2VyX3B1cmNoYXNlb3JkZXINCglJTk5FUiBKT0lOIHZ0aWdlcl9jcm1lbnRpdHkgT04gdnRpZ2VyX3B1cmNoYXNlb3JkZXIucHVyY2hhc2VvcmRlcmlkID0gdnRpZ2VyX2NybWVudGl0eS5jcm1pZA0KCUxFRlQgSk9JTiB2dGlnZXJfdXNlcnMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfdXNlcnMuaWQNCglMRUZUIEpPSU4gdnRpZ2VyX2dyb3VwcyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl9ncm91cHMuZ3JvdXBpZA0KCVdIRVJFIHZ0aWdlcl9jcm1lbnRpdHkuZGVsZXRlZCA9MA0KCUFORCB2dGlnZXJfcHVyY2hhc2VvcmRlci5wdXJjaGFzZW9yZGVyaWQgPjAiOwkNCgkNCgkJCWlmKGlzX2FycmF5KCRzYWxlc19zdGFnZSkgJiYgY291bnQoJHNhbGVzX3N0YWdlKT4wKQ0KCQkJew0KCQkJCSRzdHIJPQkiJyIuaW1wbG9kZSgiJywnIiwkc2FsZXNfc3RhZ2UpLiInIjsNCgkJCQkkcXVlcnkuPSIgQU5EIHZ0aWdlcl9wdXJjaGFzZW9yZGVyLnBvc3RhdHVzIElOICgiLiRzdHIuIikiOw0KCQkJfQ0KCQkJJHF1ZXJ5Lj0iIE9SREVSIEJZIHZ0aWdlcl9wdXJjaGFzZW9yZGVyLnBvc3RhdHVzIjsNCgkJCQ0KCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgkcXVlcnksIGFycmF5KCkpOwkJDQoJCQlpZiAoJGFkYi0+bnVtX3Jvd3MoJHJlc3VsdCkpIHsNCgkJCQl3aGlsZSAoJHJlc3VsdHJvdyA9ICRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCSRyb3dbJHJlc3VsdHJvd1sncHVyY2hhc2VvcmRlcmlkJ11dWyJwdXJjaGFzZW9yZGVyX25vIl0gPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydwdXJjaGFzZW9yZGVyX25vJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3B1cmNoYXNlb3JkZXJpZCddXVsic3ViamVjdCJdIAkJCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc3ViamVjdCddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93WydwdXJjaGFzZW9yZGVyaWQnXV1bInBvc3RhdHVzIl0gCQk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3Bvc3RhdHVzJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3B1cmNoYXNlb3JkZXJpZCddXVsidG90YWwiXSAJCQk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3RvdGFsJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3B1cmNoYXNlb3JkZXJpZCddXVsicmVxdWlzaXRpb25fbm8iXSAJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydyZXF1aXNpdGlvbl9ubyddKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJDQoJCWlmKCRtb2R1bGVfbmFtZSA9PSAnU2FsZXMgT3JkZXInKQ0KCQl7DQoJCQkkcXVlcnkJPQkiU0VMRUNUIHZ0aWdlcl9zYWxlc29yZGVyLnNhbGVzb3JkZXJfbm8sIHZ0aWdlcl9zYWxlc29yZGVyLnN1YmplY3QsIHZ0aWdlcl9zYWxlc29yZGVyLnRvdGFsLCB2dGlnZXJfc2FsZXNvcmRlci5zb3N0YXR1cywgdnRpZ2VyX3NhbGVzb3JkZXIuZHVlZGF0ZSwgdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQsIHZ0aWdlcl9zYWxlc29yZGVyLnNhbGVzb3JkZXJpZA0KCUZST00gdnRpZ2VyX3NhbGVzb3JkZXINCglJTk5FUiBKT0lOIHZ0aWdlcl9jcm1lbnRpdHkgT04gdnRpZ2VyX3NhbGVzb3JkZXIuc2FsZXNvcmRlcmlkID0gdnRpZ2VyX2NybWVudGl0eS5jcm1pZA0KCUxFRlQgSk9JTiB2dGlnZXJfdXNlcnMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfdXNlcnMuaWQNCglMRUZUIEpPSU4gdnRpZ2VyX2dyb3VwcyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl9ncm91cHMuZ3JvdXBpZA0KCVdIRVJFIHZ0aWdlcl9jcm1lbnRpdHkuZGVsZXRlZCA9MA0KCUFORCB2dGlnZXJfc2FsZXNvcmRlci5zYWxlc29yZGVyaWQgPjAiOwkNCgkNCgkJCWlmKGlzX2FycmF5KCRzYWxlc19zdGFnZSkgJiYgY291bnQoJHNhbGVzX3N0YWdlKT4wKQ0KCQkJew0KCQkJCSRzdHIJPQkiJyIuaW1wbG9kZSgiJywnIiwkc2FsZXNfc3RhZ2UpLiInIjsNCgkJCQkkcXVlcnkuPSIgQU5EIHZ0aWdlcl9zYWxlc29yZGVyLnNvc3RhdHVzIElOICgiLiRzdHIuIikiOw0KCQkJfQ0KCQkJJHF1ZXJ5Lj0iIE9SREVSIEJZIHZ0aWdlcl9zYWxlc29yZGVyLnNvc3RhdHVzIjsNCgkJCQ0KCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgkcXVlcnksIGFycmF5KCkpOwkJDQoJCQlpZiAoJGFkYi0+bnVtX3Jvd3MoJHJlc3VsdCkpIHsNCgkJCQl3aGlsZSAoJHJlc3VsdHJvdyA9ICRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCSRyb3dbJHJlc3VsdHJvd1snc2FsZXNvcmRlcmlkJ11dWyJzYWxlc29yZGVyX25vIl0gCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc2FsZXNvcmRlcl9ubyddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93WydzYWxlc29yZGVyaWQnXV1bInN1YmplY3QiXSAJCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc3ViamVjdCddKTsNCgkJCQkJJHJvd1skcmVzdWx0cm93WydzYWxlc29yZGVyaWQnXV1bInNvc3RhdHVzIl0gCQk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3Nvc3RhdHVzJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3NhbGVzb3JkZXJpZCddXVsidG90YWwiXSAJCQk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3RvdGFsJ10pOw0KCQkJCQkkcm93WyRyZXN1bHRyb3dbJ3NhbGVzb3JkZXJpZCddXVsiZHVlZGF0ZSJdIAkJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydkdWVkYXRlJ10pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJHJvdzsNCgl9DQoJZnVuY3Rpb24gZ2V0QWxsU3RhZ2VzKCRmbGFnPTApIHsNCgkNCgkJZ2xvYmFsICRhZGIsJG1vZF9zdHJpbmdzOw0KCQkNCgkNCgkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgiU0VMRUNUICogRlJPTSB2dGlnZXJfc2FsZXNfc3RhZ2UgT1JERVIgQlkgc2FsZXNfc3RhZ2VfaWQgQVNDIiwgYXJyYXkoKSk7CQkNCgkJJHJvd3MgPSBhcnJheSgpOw0KCQkNCgkJaWYgKCRhZGItPm51bV9yb3dzKCRyZXN1bHQpKSB7DQoJCQl3aGlsZSAoJHJlc3VsdHJvdyA9ICRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpKSB7CQkJDQoJCQkJaWYoJGZsYWcpDQoJCQkJew0KCQkJCQlpZigkbW9kX3N0cmluZ3NbJHJlc3VsdHJvd1snc2FsZXNfc3RhZ2UnXV0pDQoJCQkJCXsNCgkJCQkJCSRyb3dbZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc2FsZXNfc3RhZ2UnXSldID0gZGVjb2RlX2h0bWwoJG1vZF9zdHJpbmdzWyRyZXN1bHRyb3dbJ3NhbGVzX3N0YWdlJ11dKTsNCgkJCQkJfWVsc2V7DQoJCQkJCQkkcm93W2RlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3NhbGVzX3N0YWdlJ10pXSA9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3NhbGVzX3N0YWdlJ10pOw0KCQkJCQl9DQoJCQkJfWVsc2V7DQoJCQkJCSRyb3dbZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc2FsZXNfc3RhZ2UnXSldID0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc2FsZXNfc3RhZ2UnXSk7DQoJCQkJfQ0KCQkJCQ0KCQkJDQoJCQl9DQoJCX0NCgkJDQoJCXJldHVybiAkcm93Ow0KCQkNCgkJDQoJfQ0KCQ0KCWZ1bmN0aW9uIGdldFN0YWdlc0RhdGFGdW5uZWwoJHNhbGVzX3N0YWdlLCRzYWxlc19zdGFnZV9hbGwpDQoJew0KCQkJDQoJCQlnbG9iYWwgJGFkYjsNCgkJCSRyb3dzID0gYXJyYXkoKTsNCgkJCQkJDQoJCQkJaWYoaXNfYXJyYXkoJHNhbGVzX3N0YWdlKSAmJiBjb3VudCgkc2FsZXNfc3RhZ2UpPT0wKQ0KCQkJCXsNCgkJCQkJDQoJCQkJCSRzYWxlc19zdGFnZQk9CSRzYWxlc19zdGFnZV9hbGw7DQoJCQkJDQoJCQkJfQ0KCQ0KCQkJCWZvcmVhY2goJHNhbGVzX3N0YWdlIGFzICRrZXk9PiR2YWx1ZSkNCgkJCQl7DQoJCQkJCQ0KCQkJCQkkcXVlcnkJPQkiU0VMRUNUIGNvdW50KCopIEFTIGNvdW50ICBGUk9NIHZ0aWdlcl9wb3RlbnRpYWwgSU5ORVIgSk9JTiB2dGlnZXJfY3JtZW50aXR5IE9OIHZ0aWdlcl9wb3RlbnRpYWwucG90ZW50aWFsaWQgPSB2dGlnZXJfY3JtZW50aXR5LmNybWlkIExFRlQgSk9JTiB2dGlnZXJfdXNlcnMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfdXNlcnMuaWQgTEVGVCBKT0lOIHZ0aWdlcl9ncm91cHMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfZ3JvdXBzLmdyb3VwaWQgV0hFUkUgdnRpZ2VyX2NybWVudGl0eS5kZWxldGVkPTAgQU5EIHZ0aWdlcl9wb3RlbnRpYWwucG90ZW50aWFsaWQgPiAwIEFORCB2dGlnZXJfcG90ZW50aWFsLnNhbGVzX3N0YWdlID0gJyIuJHZhbHVlLiInIjsNCgkJCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgkcXVlcnksIGFycmF5KCkpOw0KCQkNCgkJCQkJaWYoJGFkYi0+bnVtX3Jvd3MoJHJlc3VsdCk+MCkNCgkJCQkJew0KCQkJCQkJJHJlc3VsdHJvdyAJPSAJJGFkYi0+ZmV0Y2hfYXJyYXkoJHJlc3VsdCk7CQkJCQkJDQoJCQkJCQkkY250CQk9CSRyZXN1bHRyb3dbJ2NvdW50J107DQoJCQkJCQlpZigkY250KQ0KCQkJCQkJew0KCQkJCQkJCSRyb3dbJHZhbHVlXSA9ICRjbnQ7DQoJCQkJCQl9DQoJCQkJCX0JDQoNCgkJCQl9DQoJCQ0KCQlyZXR1cm4gJHJvdzsNCgl9DQoJDQoJZnVuY3Rpb24gcmFuZF9jb2xvckNvZGUoKXsNCgkJJHIgPSBkZWNoZXgobXRfcmFuZCgwLDI1NSkpOyAvLyBnZW5lcmF0ZSB0aGUgcmVkIGNvbXBvbmVudA0KCQkkZyA9IGRlY2hleChtdF9yYW5kKDAsMjU1KSk7IC8vIGdlbmVyYXRlIHRoZSBncmVlbiBjb21wb25lbnQNCgkJJGIgPSBkZWNoZXgobXRfcmFuZCgwLDI1NSkpOyAvLyBnZW5lcmF0ZSB0aGUgYmx1ZSBjb21wb25lbnQNCgkJJHJnYiA9ICRyLiRnLiRiOw0KCQlpZigkciA9PSAkZyAmJiAkZyA9PSAkYil7DQoJCQkkcmdiID0gc3Vic3RyKCRyZ2IsMCwzKTsgLy8gc2hvcnRlciB2ZXJzaW9uDQoJCX0NCgkJcmV0dXJuICcjJy4kcmdiOw0KCX0NCg0KCQ0KCWZ1bmN0aW9uIGdldFN0YWdlc0RhdGEoJHNhbGVzX3N0YWdlKQ0KCXsNCgkJCWdsb2JhbCAkYWRiLCRtb2Rfc3RyaW5nczsNCgkJCSRyb3dzID0gYXJyYXkoKTsNCgkJCSRxdWVyeQk9CSJTRUxFQ1QgdnRpZ2VyX3BvdGVudGlhbC5wb3RlbnRpYWxfbm8sdnRpZ2VyX3BvdGVudGlhbC5wb3RlbnRpYWx0eXBlLHZ0aWdlcl9wb3RlbnRpYWwuYW1vdW50LCB2dGlnZXJfcG90ZW50aWFsLnBvdGVudGlhbG5hbWUsIHZ0aWdlcl9wb3RlbnRpYWwucmVsYXRlZF90bywgdnRpZ2VyX3BvdGVudGlhbC5zYWxlc19zdGFnZSwgdnRpZ2VyX3BvdGVudGlhbC5sZWFkc291cmNlLCB2dGlnZXJfcG90ZW50aWFsLmNsb3NpbmdkYXRlLCB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCwgdnRpZ2VyX3BvdGVudGlhbC5wb3RlbnRpYWxpZA0KCQkJCUZST00gdnRpZ2VyX3BvdGVudGlhbA0KCQkJCUlOTkVSIEpPSU4gdnRpZ2VyX2NybWVudGl0eSBPTiB2dGlnZXJfcG90ZW50aWFsLnBvdGVudGlhbGlkID0gdnRpZ2VyX2NybWVudGl0eS5jcm1pZA0KCQkJCUxFRlQgSk9JTiB2dGlnZXJfdXNlcnMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfdXNlcnMuaWQNCgkJCQlMRUZUIEpPSU4gdnRpZ2VyX2dyb3VwcyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl9ncm91cHMuZ3JvdXBpZA0KCQkJCVdIRVJFIHZ0aWdlcl9jcm1lbnRpdHkuZGVsZXRlZCA9MA0KCQkJCUFORCB2dGlnZXJfcG90ZW50aWFsLnBvdGVudGlhbGlkID4wICI7CQ0KDQoJCWlmKGlzX2FycmF5KCRzYWxlc19zdGFnZSkgJiYgY291bnQoJHNhbGVzX3N0YWdlKT4wKQ0KCQl7DQoJCQkkc3RyCT0JIiciLmltcGxvZGUoIicsJyIsJHNhbGVzX3N0YWdlKS4iJyI7DQoJCQkkcXVlcnkuPSIgQU5EIHZ0aWdlcl9wb3RlbnRpYWwuc2FsZXNfc3RhZ2UgSU4gKCIuJHN0ci4iKSI7DQoJCX0NCgkJJHF1ZXJ5Lj0iIE9SREVSIEJZIHZ0aWdlcl9wb3RlbnRpYWwuc2FsZXNfc3RhZ2UiOw0KCQkkcmVzdWx0ID0gJGFkYi0+cHF1ZXJ5KCRxdWVyeSwgYXJyYXkoKSk7CQkNCgkJaWYgKCRhZGItPm51bV9yb3dzKCRyZXN1bHQpKSB7DQoJCQl3aGlsZSAoJHJlc3VsdHJvdyA9ICRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJJHJvd1skcmVzdWx0cm93Wydwb3RlbnRpYWxpZCddXVsicG90ZW50aWFsbmFtZSJdIAk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3BvdGVudGlhbG5hbWUnXSk7DQoJCQkJJHJvd1skcmVzdWx0cm93Wydwb3RlbnRpYWxpZCddXVsic2FsZXNfc3RhZ2UiXSAJCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc2FsZXNfc3RhZ2UnXSk7DQoJCQkJJHJvd1skcmVzdWx0cm93Wydwb3RlbnRpYWxpZCddXVsibGVhZHNvdXJjZSJdIAkJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydsZWFkc291cmNlJ10pOw0KCQkJCSRyb3dbJHJlc3VsdHJvd1sncG90ZW50aWFsaWQnXV1bImFtb3VudCJdIAkJCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snYW1vdW50J10pOw0KCQkJCSRyb3dbJHJlc3VsdHJvd1sncG90ZW50aWFsaWQnXV1bInBvdGVudGlhbHR5cGUiXSAJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93Wydwb3RlbnRpYWx0eXBlJ10pOw0KCQkJfQ0KCQl9DQoJCXJldHVybiAkcm93Ow0KCQ0KCX0NCglmdW5jdGlvbiBnZXRBbGxTdGFnZXNRdW90ZSgpIHsNCgkJZ2xvYmFsICRhZGI7DQoJCQkkcmVzdWx0ID0gJGFkYi0+cHF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHZ0aWdlcl9xdW90ZXN0YWdlIE9SREVSIEJZIHF1b3Rlc3RhZ2VpZCBBU0MiLCBhcnJheSgpKTsNCgkJCSRyb3dzID0gYXJyYXkoKTsNCgkJCWlmICgkYWRiLT5udW1fcm93cygkcmVzdWx0KSkgew0KCQkJCXdoaWxlICgkcmVzdWx0cm93ID0gJGFkYi0+ZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJJHJvd1tkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydxdW90ZXN0YWdlJ10pXSA9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3F1b3Rlc3RhZ2UnXSk7DQoJCQkJfQ0KCQkJfQ0KCQkNCgkJcmV0dXJuICRyb3c7DQoJfQ0KCWZ1bmN0aW9uIGdldEFsbFN0YWdlc0ludm9pY2UoKSB7DQoJCWdsb2JhbCAkYWRiOw0KCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgiU0VMRUNUICogRlJPTSB2dGlnZXJfaW52b2ljZXN0YXR1cyBPUkRFUiBCWSBpbnZvaWNlc3RhdHVzaWQgQVNDIiwgYXJyYXkoKSk7DQoJCQkkcm93cyA9IGFycmF5KCk7DQoJCQlpZiAoJGFkYi0+bnVtX3Jvd3MoJHJlc3VsdCkpIHsNCgkJCQl3aGlsZSAoJHJlc3VsdHJvdyA9ICRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpKSB7DQoJCQkJCSRyb3dbZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snaW52b2ljZXN0YXR1cyddKV0gPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydpbnZvaWNlc3RhdHVzJ10pOw0KCQkJCX0NCgkJCX0NCgkJDQoJCXJldHVybiAkcm93Ow0KCX0NCglmdW5jdGlvbiBnZXRBbGxTdGFnZXNTTygpIHsNCgkJZ2xvYmFsICRhZGI7DQoJCQkkcmVzdWx0ID0gJGFkYi0+cHF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHZ0aWdlcl9zb3N0YXR1cyBPUkRFUiBCWSBzb3N0YXR1c2lkIEFTQyIsIGFycmF5KCkpOw0KCQkJJHJvd3MgPSBhcnJheSgpOw0KCQkJaWYgKCRhZGItPm51bV9yb3dzKCRyZXN1bHQpKSB7DQoJCQkJd2hpbGUgKCRyZXN1bHRyb3cgPSAkYWRiLT5mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCQkkcm93W2RlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3Nvc3RhdHVzJ10pXSA9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3Nvc3RhdHVzJ10pOw0KCQkJCX0NCgkJCX0NCgkJDQoJCXJldHVybiAkcm93Ow0KCX0NCgkJZnVuY3Rpb24gZ2V0QWxsU3RhZ2VzUE8oKSB7DQoJCWdsb2JhbCAkYWRiOw0KCQkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgiU0VMRUNUICogRlJPTSB2dGlnZXJfcG9zdGF0dXMgT1JERVIgQlkgcG9zdGF0dXNpZCBBU0MiLCBhcnJheSgpKTsNCgkJCSRyb3dzID0gYXJyYXkoKTsNCgkJCWlmICgkYWRiLT5udW1fcm93cygkcmVzdWx0KSkgew0KCQkJCXdoaWxlICgkcmVzdWx0cm93ID0gJGFkYi0+ZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsNCgkJCQkJJHJvd1tkZWNvZGVfaHRtbCgkcmVzdWx0cm93Wydwb3N0YXR1cyddKV0gPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93Wydwb3N0YXR1cyddKTsNCgkJCQl9DQoJCQl9DQoJCQ0KCQlyZXR1cm4gJHJvdzsNCgl9DQoJZnVuY3Rpb24gZ2V0U3RhZ2VzRGF0YUZ1bm5lbFF1b3RlKCRzYWxlc19zdGFnZSwkc2FsZXNfc3RhZ2VfYWxsKQ0KCXsNCgkJCWdsb2JhbCAkYWRiOw0KCQkJJHJvd3MgPSBhcnJheSgpOw0KCQkJCQkNCgkJCQlpZihpc19hcnJheSgkc2FsZXNfc3RhZ2UpICYmIGNvdW50KCRzYWxlc19zdGFnZSk9PTApDQoJCQkJew0KCQkJCQkNCgkJCQkJJHNhbGVzX3N0YWdlCT0JJHNhbGVzX3N0YWdlX2FsbDsNCgkJCQkNCgkJCQl9DQoJDQoJCQkJZm9yZWFjaCgkc2FsZXNfc3RhZ2UgYXMgJGtleT0+JHZhbHVlKQ0KCQkJCXsNCgkJCQkJDQoJCQkJCSRxdWVyeQk9CSJTRUxFQ1QgY291bnQoICogKSBBUyBjb3VudA0KCQkJCQkJCQlGUk9NIHZ0aWdlcl9xdW90ZXN0YWdlDQoJCQkJCQkJCUlOTkVSIEpPSU4gdnRpZ2VyX2NybWVudGl0eSBPTiB2dGlnZXJfcXVvdGVzdGFnZS5xdW90ZXN0YWdlaWQgPSB2dGlnZXJfY3JtZW50aXR5LmNybWlkDQoJCQkJCQkJCUxFRlQgSk9JTiB2dGlnZXJfdXNlcnMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfdXNlcnMuaWQNCgkJCQkJCQkJTEVGVCBKT0lOIHZ0aWdlcl9ncm91cHMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfZ3JvdXBzLmdyb3VwaWQNCgkJCQkJCQkJV0hFUkUgdnRpZ2VyX2NybWVudGl0eS5kZWxldGVkID0wDQoJCQkJCQkJCUFORCB2dGlnZXJfcXVvdGVzdGFnZS5xdW90ZXN0YWdlaWQgPjANCgkJCQkJCQkJQU5EIHZ0aWdlcl9xdW90ZXN0YWdlLnF1b3Rlc3RhZ2UgPSciLiR2YWx1ZS4iJyI7DQoJCQkJCSRyZXN1bHQgPSAkYWRiLT5wcXVlcnkoJHF1ZXJ5LCBhcnJheSgpKTsNCgkJDQoJCQkJCWlmKCRhZGItPm51bV9yb3dzKCRyZXN1bHQpPjApDQoJCQkJCXsNCgkJCQkJCSRyZXN1bHRyb3cgCT0gCSRhZGItPmZldGNoX2FycmF5KCRyZXN1bHQpOwkJCQkJCQ0KCQkJCQkJJGNudAkJPQkkcmVzdWx0cm93Wydjb3VudCddOw0KCQkJCQkJaWYoJGNudCkNCgkJCQkJCXsNCgkJCQkJCQkkcm93WyR2YWx1ZV0gPSAkY250Ow0KCQkJCQkJfQ0KCQkJCQl9CQ0KDQoJCQkJfQ0KCQkNCgkJcmV0dXJuICRyb3c7DQoJfQ0KCWZ1bmN0aW9uIGdldFN0YWdlc0RhdGFRdW90ZSgkc2FsZXNfc3RhZ2UpDQoJew0KCQkJZ2xvYmFsICRhZGIsJG1vZF9zdHJpbmdzOw0KCQkJJHJvd3MgPSBhcnJheSgpOw0KCQkJJHF1ZXJ5CT0JIlNFTEVDVCB2dGlnZXJfcXVvdGVzLnF1b3RlX25vLCB2dGlnZXJfcXVvdGVzLnN1YmplY3QsIHZ0aWdlcl9xdW90ZXMudG90YWwsIHZ0aWdlcl9xdW90ZXMucXVvdGVzdGFnZSwgCQl2dGlnZXJfcXVvdGVzLnZhbGlkdGlsbCwgdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQsIHZ0aWdlcl9xdW90ZXMucXVvdGVpZA0KRlJPTSB2dGlnZXJfcXVvdGVzDQpJTk5FUiBKT0lOIHZ0aWdlcl9jcm1lbnRpdHkgT04gdnRpZ2VyX3F1b3Rlcy5xdW90ZWlkID0gdnRpZ2VyX2NybWVudGl0eS5jcm1pZA0KTEVGVCBKT0lOIHZ0aWdlcl91c2VycyBPTiB2dGlnZXJfY3JtZW50aXR5LnNtb3duZXJpZCA9IHZ0aWdlcl91c2Vycy5pZA0KTEVGVCBKT0lOIHZ0aWdlcl9ncm91cHMgT04gdnRpZ2VyX2NybWVudGl0eS5zbW93bmVyaWQgPSB2dGlnZXJfZ3JvdXBzLmdyb3VwaWQNCldIRVJFIHZ0aWdlcl9jcm1lbnRpdHkuZGVsZXRlZCA9MA0KQU5EIHZ0aWdlcl9xdW90ZXMucXVvdGVpZCA+MCI7CQ0KDQoJCWlmKGlzX2FycmF5KCRxdW90ZXN0YWdlKSAmJiBjb3VudCgkcXVvdGVzdGFnZSk+MCkNCgkJew0KCQkJJHN0cgk9CSInIi5pbXBsb2RlKCInLCciLCRxdW90ZXN0YWdlKS4iJyI7DQoJCQkkcXVlcnkuPSIgQU5EIHZ0aWdlcl9xdW90ZXMucXVvdGVzdGFnZSBJTiAoIi4kc3RyLiIpIjsNCgkJfQ0KCQkkcXVlcnkuPSIgT1JERVIgQlkgdnRpZ2VyX3F1b3Rlcy5xdW90ZXN0YWdlIjsNCgkJJHJlc3VsdCA9ICRhZGItPnBxdWVyeSgkcXVlcnksIGFycmF5KCkpOwkJDQoJCWlmICgkYWRiLT5udW1fcm93cygkcmVzdWx0KSkgew0KCQkJd2hpbGUgKCRyZXN1bHRyb3cgPSAkYWRiLT5mZXRjaF9hcnJheSgkcmVzdWx0KSkgew0KCQkJCSRyb3dbJHJlc3VsdHJvd1sncXVvdGVpZCddXVsicXVvdGVfbm8iXSAJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93WydxdW90ZV9ubyddKTsNCgkJCQkkcm93WyRyZXN1bHRyb3dbJ3F1b3RlaWQnXV1bInN1YmplY3QiXSAJCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1snc3ViamVjdCddKTsNCgkJCQkkcm93WyRyZXN1bHRyb3dbJ3F1b3RlaWQnXV1bInF1b3Rlc3RhZ2UiXSAJCT0gZGVjb2RlX2h0bWwoJHJlc3VsdHJvd1sncXVvdGVzdGFnZSddKTsNCgkJCQkkcm93WyRyZXN1bHRyb3dbJ3F1b3RlaWQnXV1bInRvdGFsIl0gCQkJPSBkZWNvZGVfaHRtbCgkcmVzdWx0cm93Wyd0b3RhbCddKTsNCgkJCQkkcm93WyRyZXN1bHRyb3dbJ3F1b3RlaWQnXV1bInZhbGlkdGlsbCJdIAk9IGRlY29kZV9odG1sKCRyZXN1bHRyb3dbJ3ZhbGlkdGlsbCddKTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gJHJvdzsNCgl9DQoJDQp9DQoNCj8+")); ?>
Function Calls
| base64_decode | 1 |
Stats
| MD5 | 5386ae77ca47a5db3bbb2529e76b4aed |
| Eval Count | 1 |
| Decode Time | 101 ms |