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("Ci8qIExvZ2Fob2xpYyBXZWIgQW5hbHl0aWNzIHNvZnR3YXJlICAgICAgICAgICAg..
Decoded Output download
/* Logaholic Web Analytics software Copyright(c) 2005-2011 Logaholic B.V.
* All rights Reserved.
* This code is subject to the Logaholic license. Unauthorized copying is prohibited.
* [email protected] http://www.logaholic.com/License.txt
*/
$dont_close_session = true;
include_once "common.inc.php";
$profiles=1; // this is so it doesn't loop includes from top.php
// Which profile are we editing?
$curprofilename = @$_REQUEST["editconf"];
// Are we editing or creating a new one
$restoreDefaultDashboard = @$_REQUEST["restoredefaultdashboard"];
$edit = @$_REQUEST["edit"];
$new = @$_REQUEST["new"];
$install = @$_REQUEST["install"];
$save = @$_REQUEST["save"];
$del = @$_REQUEST["del"];
$backup = @$_REQUEST["backup"];
$specialq = @$_REQUEST["specialq"];
$mode = @$_REQUEST["mode"];
$search = @$_REQUEST["search"];
$sfield = @$_REQUEST["sfield"];
$update_countries = @$_REQUEST["update_countries"];
$set_profile_structure_version = @$_REQUEST["set_profile_structure_version"];
SecurityCheck(@$_REQUEST["newconfname"]);
if ($curprofilename && $validUserRequired && (!$session->isAdmin() && !$session->canAccessProfile($curprofilename))) {
die(_SORRY_NO_RIGHTS.": $curprofilename");
}
//edit profile
// Load the profile that we're currently trying to edit.
$editprofile = new SiteProfile($curprofilename);
if (isset($_REQUEST['copy_to'])) {
if (isset($_REQUEST['with_data'])) {
$editprofile->copyProfile($_REQUEST['copy_to'],true);
} else {
$editprofile->copyProfile($_REQUEST['copy_to'],false);
}
exit();
}
$saved = "";
$saveerror = false;
if ((isset($save)) && isset($_REQUEST) && (isset($curprofilename) || (isset($_REQUEST["newconfname"]) && isset($install)))) {
if ($editprofile->trackermode!=@$_REQUEST["trackermode"]) {
// we're switching data colection method.
if ($_REQUEST["trackermode"]==1) {
if ($_REQUEST["visitoridentmethod"]!=3) {
$_REQUEST["visitoridentmethod"]=3;
$saved .= "<br>Visitor Identification method was automatically changed to: Cookie<br>";
}
} else {
$saved .= "<br>Please check if Visitor Identification method on the Advanced tab is still correct<br>";
}
}
// These are all user editable values.
$editprofile->confdomain = (isset($_REQUEST["confdomain"])) ? $_REQUEST["confdomain"] : $editprofile->confdomain;
$editprofile->equivdomains = (isset($_REQUEST["equivdomains"])) ? $_REQUEST["equivdomains"] : $editprofile->equivdomains;
if (get_magic_quotes_gpc()) {
$editprofile->equivdomains = stripslashes($editprofile->equivdomains);
}
$editprofile->defaultfile = (isset($_REQUEST["defaultfile"])) ? $_REQUEST["defaultfile"] : $editprofile->defaultfile;
$editprofile->splitlogs = (isset($_REQUEST["splitlogs"])) ? $_REQUEST["splitlogs"] : 0; // Checkboxes don't get posted in IE if they're false.
$editprofile->splitfilter = (isset($_REQUEST["splitfilter"])) ? $_REQUEST["splitfilter"] : $editprofile->splitfilter;
$editprofile->splitfilternegative = (isset($_REQUEST["splitfilternegative"])) ? $_REQUEST["splitfilternegative"] : $editprofile->splitfilternegative;
$editprofile->trackermode = (isset($_REQUEST["trackermode"])) ? $_REQUEST["trackermode"] : $editprofile->trackermode;
$editprofile->skipips = (isset($_REQUEST["skipips"])) ? $_REQUEST["skipips"] : $editprofile->skipips;
if (get_magic_quotes_gpc()) {
$editprofile->skipips = stripslashes($editprofile->skipips);
}
$editprofile->skipfiles = (isset($_REQUEST["skipfiles"])) ? $_REQUEST["skipfiles"] : $editprofile->skipfiles;
$editprofile->targetfiles = (isset($_REQUEST["targetfiles"])) ? $_REQUEST["targetfiles"] : $editprofile->targetfiles;
$editprofile->usepagecache = (isset($_REQUEST["caching"])) ? $_REQUEST["caching"] : $editprofile->targetfiles;
$editprofile->animate = (isset($_REQUEST["animate"])) ? $_REQUEST["animate"] : $editprofile->animate;
$editprofile->timezonecorrection = (isset($_REQUEST["timezonecorrection"])) ? $_REQUEST["timezonecorrection"] : $editprofile->timezonecorrection;
$editprofile->timezone = (isset($_REQUEST["timezone"])) ? $_REQUEST["timezone"] : $editprofile->timezone;
$newvisitoridentmethod = (isset($_REQUEST["visitoridentmethod"])) ? $_REQUEST["visitoridentmethod"] : $editprofile->visitoridentmethod;
$visitoridentmethodswitched = ($editprofile->visitoridentmethod != $newvisitoridentmethod);
$editprofile->visitoridentmethod = $newvisitoridentmethod;
$editprofile->recursive = (isset($_REQUEST["recursive"])) ? $_REQUEST["recursive"] : 0;
$editprofile->ftpserver = (isset($_REQUEST["ftpserver"])) ? $_REQUEST["ftpserver"] : $editprofile->ftpserver;
$editprofile->ftpuser = (isset($_REQUEST["ftpuser"])) ? $_REQUEST["ftpuser"] : $editprofile->ftpuser;
$editprofile->ftppasswd = (isset($_REQUEST["ftppasswd"])) ? $_REQUEST["ftppasswd"] : $editprofile->ftppasswd;
$editprofile->ftpfullpath = (isset($_REQUEST["ftpfullpath"])) ? $_REQUEST["ftpfullpath"] : $editprofile->ftpfullpath;
$editprofile->visittimeout = (isset($_REQUEST["visittimeout"])) ? $_REQUEST["visittimeout"] : $editprofile->visittimeout;
$editprofile->urlparamfilter = (isset($_REQUEST["urlparamfilter"])) ? $_REQUEST["urlparamfilter"] : $editprofile->urlparamfilter;
$editprofile->urlparamfiltermode = (isset($_REQUEST["urlparamfiltermode"])) ? $_REQUEST["urlparamfiltermode"] : $editprofile->urlparamfiltermode;
$editprofile->googleparams = (isset($_REQUEST["googleparams"])) ? $_REQUEST["googleparams"] : $editprofile->googleparams;
$editprofile->feedurl = (isset($_REQUEST["feedurl"])) ? $_REQUEST["feedurl"] : $editprofile->feedurl;
$editprofile->feedburneruri = (isset($_REQUEST["feedburneruri"])) ? $_REQUEST["feedburneruri"] : $editprofile->feedburneruri;
$editprofile->facebooklogin = (isset($_REQUEST["facebooklogin"])) ? $_REQUEST["facebooklogin"] : $editprofile->facebooklogin;
$editprofile->logparsertype = (isset($_REQUEST["log_parser_type"])) ? $_REQUEST["log_parser_type"] : $editprofile->logparsertype;
$editprofile->includebackup = (isset($_REQUEST["includebackup"])) ? $_REQUEST["includebackup"] : $editprofile->includebackup;
// If we have proper security rights, edit these core values.
if (!$validUserRequired || $session->canAddProfiles()) {
if (get_magic_quotes_gpc()) {
// We're gonna have some slashes!
if (isset($_REQUEST["logfilefullpath"])) {$_REQUEST["logfilefullpath"] = stripslashes($_REQUEST["logfilefullpath"]); }
}
$editprofile->profilename = (isset($_REQUEST["newconfname"])) ? $_REQUEST["newconfname"] : $editprofile->profilename;
$editprofile->tablename = (isset($_REQUEST["tablename"])) ? $_REQUEST["tablename"] : $editprofile->tablename;
$editprofile->logfilefullpath = (isset($_REQUEST["logfilefullpath"])) ? str_replace("\", '/', $_REQUEST["logfilefullpath"]) : $editprofile->logfilefullpath;
}
// Check and see if variables are correctly set to save...
$cansave = true;
if (!$editprofile->profilename) {
$saved .= "<font color=\"red\">"._NO_PROFILE_NAME_ENTERED."</font><br>";
$cansave = false;
$saveerror = true;
$edit=1;
}
if (!$editprofile->tablename && $conf!="newcnf") {
$saved .= "<font color=\"red\">"._NO_MYSQL_TABLE_ENTERED."</font><br>";
$cansave = false;
$saveerror = true;
$edit=1;
}
if ($conf=="newcnf" || $new==1) {
$checklimits = "Select profilename from ".TBL_PROFILES;
$checklimitsresult = $db->Execute($checklimits) or die(_COULDNT_QUERY_PROFILES.". " . $db->ErrorMsg());
if (defined("_LIMIT_PROFILES") != 0) {
if ($checklimitsresult->RecordCount() > _LIMIT_PROFILES) {
$saved .= "<font color=\"red\">"._TOO_MANY_PROFILES."</font><br>";
$cansave = false;
$saveerror = true;
$edit=1;
}
}
}
if (defined("_ENABLE_IMPORTANT_PARAMETER_EDITOR_")) {
$important_param_count = $_REQUEST["importantparampagecount"];
for ($param_loop = 0; $param_loop < $important_param_count; $param_loop ++) {
unset($thisparam);
$thisparam = false;
if (($_REQUEST["paramid_".$param_loop]) && ($param_loop < $editprofile->getUrlParamCount())) {
// It's an existing one.
$thisparam =& $editprofile->getUrlParamByIndex($param_loop);
$thisparam["paramid"] = $_REQUEST["paramid_".$param_loop];
} else {
if ($_REQUEST["paramurl_".$param_loop] > "") {
$thisparam =& $editprofile->getUrlParamNew();
}
}
if ($thisparam) {
$thisparam["filename"] = $_REQUEST["paramurl_".$param_loop];
$thisparam["importantparams"] = $_REQUEST["paramnames_".$param_loop];
}
}
$important_param_count = $_REQUEST["importantparampagecount"];
for ($param_loop = 0; $param_loop < $important_param_count; $param_loop ++) {
if (@$_REQUEST["DeleteParam_" . $param_loop]) {
$editprofile->deleteUrlParams($param_loop);
}
}
}
if ($cansave) {
$editprofile->dieonsqlerror = false;
$editprofile->Save();
if ($validUserRequired) {
if ($session->canAddProfiles() && !$session->isAdmin()) {
//echo "Adding profile to user account";
// if the user can add profiles, he should be the default manager as well
$session->user_profiles[count($session->user_profiles)]=$editprofile->profilename;
$db->Execute("UPDATE ".TBL_USERS." SET PROFILES=concat(PROFILES,',$editprofile->profilename') WHERE username = '$session->username' ");
//echo "UPDATE _logaholic_users SET PROFILES=concat(PROFILES,',$editprofile->profilename') WHERE username = '$session->username' ";
}
}
/* we don't do this anymore */
/*
if ($editprofile->trackermode==1) {
$treal_path = realpath("index.php");
$tpath = dirname($treal_path);
$tracker_logfile=$tpath."/files/".$editprofile->profilename.".log";
$thandle = fopen ($tracker_logfile, "a");
//fwrite($thandle,"# Logfile created by Logaholic Web Analytics - www.logaholic.com
");
fclose($thandle);
@chmod($tracker_logfile, 0666);
}
*/
if ($editprofile->lastsqlerror) {
$saved .= "<font color=\"red\">".$editprofile->lastsqlerror."</font><br>";
$edit=1;
$saveerror = true;
} else {
$saved .= _PROFILE_CONF_SAVED.".<br>";
unset($edit);
unset($new);
}
if ($visitoridentmethodswitched) {
// We need to recalculate the current visitor identification method.
}
}
}
if (isset($install) && ($install==1) && (!$saveerror)) {
if ($q = @$db->Execute("select * from $editprofile->tablename limit 1")) {
$chk=$q->FetchRow();
//$saved=$saved."Mysql Table <b>$editprofile->tablename</b> already exists, skipping CREATE.<br>";
} else {
createDataTable($editprofile);
$saved=$saved."Created tables for <b>$editprofile->tablename</b> in database <b>$DatabaseName</b><br>"; //HELP!
}
$step=5;
$conf=$editprofile->profilename;
header("location: install.php?step=5&conf=".urlencode($editprofile->profilename)."&saved=".urlencode($saved));
exit();
}
if ($backup == 2) {
// Export the .gzipped backup file.
set_time_limit(86400);
$real_path = realpath("index.php");
$path = dirname($real_path);
$path = str_replace ("\", "/", $path);
if (@$upgrade!="true") {
// $q=$db->Execute("select timestamp, v.ipnumber as ipnumber,u.url as url,up.params as params,status,bytes,r.referrer as referrer,rp.params as refparams, AGENTS.name useragent from
// $editprofile->tablename as a, $editprofile->tablename_visitorids as v, $editprofile->tablename_urls as u,$editprofile->tablename_urlparams as up, $editprofile->tablename_referrers as r, $editprofile->tablename_refparams as rp, ".TBL_USER_AGENTS." as AGENTS where timestamp >= $from and timestamp <= $to and (a.visitorid=v.id and a.url=u.id and a.params=up.id and a.referrer=r.id and a.refparams=rp.id and a.useragentid = AGENTS.id) order by timestamp");
$q = $db->Execute("SELECT a.timestamp, v.ipnumber AS ipnumber, u.url AS url, up.params AS params, a.status, a.bytes, r.referrer AS referrer, rp.params AS refparams, b.useragent AS useragent FROM
{$editprofile->tablename} as a, {$editprofile->tablename_visitorids} AS v, {$editprofile->tablename_urls} AS u, {$editprofile->tablename_urlparams} AS up, {$editprofile->tablename_referrers} AS r, {$editprofile->tablename_refparams} AS rp, {$editprofile->tablename_useragents} AS b WHERE a.timestamp >= {$from} and a.timestamp <= {$to} AND (a.visitorid = v.id AND a.url = u.id AND a.params = up.id AND a.referrer = r.id AND a.refparams = rp.id AND a.useragentid = b.id) ORDER BY a.timestamp");
if ($mode=="csv") {
$bupfile=$path . "/files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".csv.gz";
} else {
$bupfile=$path . "/files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".log.gz";
}
} else {
// $q=$db->Execute("select $editprofile->tablename.*, AGENTS.name useragent from $editprofile->tablename left outer join ".TBL_USER_AGENTS." AGENTS on (useragentid = AGENTS.id) order by timestamp");
$q = $db->Execute("SELECT {$editprofile->tablename}.*, b.useragent AS useragent FROM {$editprofile->tablename} AS a, {$editprofile->tablename_useragent} AS b ON (a.useragentid = b.id) ORDER BY timestamp");
$bupfile=$path . "/files/$curprofilename.backup.log.gz";
}
//$gfile=exec("pwd") . "/files/global.php";
$fp = gzopen ($bupfile,"w");
if ($mode=="csv") {
// write a headre row
$buffer= "\"IP number\",\"Date\",\"URL\",\"Status\",\"Bytes\",\"Referrer\",\"Useragent\"
"; //HELP!
//echo $buffer;
gzwrite ($fp, $buffer);
}
while ($data=$q->FetchRow()) {
if ($data["refparams"]=="?") {
$data["refparams"]="";
}
$date=date("[d/M/Y:H:i:s +0000]",$data["timestamp"]);
if ($mode=="csv") {
$buffer= "\"$data[ipnumber]\",\"$date\",\"".$data["url"].$data["params"]."\",\"$data[status]\",\"$data[bytes]\",\"".$data["referrer"].$data["refparams"]."\",\"".$data["useragent"]."\"
";
} else {
$buffer= "$data[ipnumber] - - $date \"GET ".$data["url"].$data["params"]." HTTP/1.1\" ".$data["status"]." ".$data["bytes"]." \"".$data["referrer"].$data["refparams"]."\" \"".$data["useragent"]."\"
";
}
//echo $buffer;
gzwrite ($fp, $buffer);
}
gzclose ($fp);
if (@$upgrade!="true") {
if ($mode=="csv") {
echo "<P><li> "._OK_CSV_FILE_WRITTEN_IN." <b>$bupfile</b>.</P><P>"._PLEASE_DOWNLOAD_NOW.":<br> <b><a href=\"files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".csv.gz\"> files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".log.gz </a></b><ul><li>The first row in this file contains the column names</li><li>Fields in this CSV file are sperated by a comma</li><li>All fields are enclosed in \" \" double quotes.</li></ul></p>"; //HELP!
} else {
echo "<P><li> OK, log file written. Please download now:<br> <b><a href=\"files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".log.gz\"> files/$curprofilename.". date("Ymd",$from) . date("-Ymd",$to) . ".log.gz </a></b><P>";
}
echo "<P>We recommend to remove the file from the server once you have downloaded it.<P>";
} else {
@$db->Execute("drop table $editprofile->tablename");
@$db->Execute("drop table $editprofile->tablename_vpd");
@$db->Execute("drop table $editprofile->tablename_vpm");
@$db->Execute("drop table $editprofile->tablename_dailyurls");
@$db->Execute("drop table $editprofile->tablename_conversions");
createDataTable($editprofile);
echo "OK, log file written to $bupfile.<P> <a href=\"update.php?conf=$editprofile->profilename&upgrade=$bupfile\">Click here to continue upgrade</a>. (Imports you old log data back into the new database stucture)<P>When that is done, you can safely remove or archive the file: $bupfile";
}
exit();
}
if (isset($set_profile_structure_version)) {
if ($editprofile->profileloaded) {
if (!$validUserRequired || @$session->isAdmin()) {
echoWarning("Manually changed this profile's structure version to from $editprofile->structure_version to $set_profile_structure_version");
$editprofile->structure_version = $set_profile_structure_version;
$editprofile->Save();
// now we have to reload the profile (also the $profile one which is created in common and used in top to check versions!)
$editprofile->Load($editprofile->profilename);
$profile->Load($profile->profilename);
} else {
echoWarning(_SORRY_NO_PERMISSIONS);
}
}
}
include "top.php";
if (isset($_REQUEST['archivetable'])) {
include "includes/archivetable.php";
}
// No rights to create a new one? Turn off the "New" flag
if ($validUserRequired && (!$session->isAdmin() && !$session->canAddProfiles())) {
unset($new);
}
if ((isset($save)) && ($editprofile->profileloaded) && (!$saveerror)) {
if ($q = @$db->Execute("select * from $editprofile->tablename limit 1")) {
$chk=$q->FetchRow();
createDataTable($editprofile);
//$saved=$saved."Mysql Table <b>$editprofile->tablename</b> already exists, skipping CREATE.<br>";
} else {
createDataTable($editprofile);
$saved=$saved."Created tables for <b>$editprofile->tablename</b> in database <b>$DatabaseName</b><br>";
}
// Get The users facebook ID and TOKEN
if(!empty($editprofile->facebooklogin) && getProfileData($editprofile->profilename, $editprofile->profilename."facebookApi".$editprofile->facebooklogin , false ) == false){
deleteProfileData($editprofile->profilename, $editprofile->profilename."facebookApi%");
deleteProfileData($editprofile->profilename, $editprofile->profilename."facebookApiForm");
deleteProfileData($editprofile->profilename, $editprofile->profilename."facebookAppForm");
deleteProfileData($editprofile->profilename, $editprofile->profilename."facebookPageForm");
$saved.="<div id='facebook_feedback'></div>";
$saved.= "<script src='http://facebook.logaholic.com/facebook_access.php?email={$editprofile->facebooklogin}&conf={$editprofile->profilename}'></script>";
}
}
$start=getmicrotime();
if (!isset($del)) {
$del=0;
}
if ($del==1) {
if ($curprofilename!="") {
echo "<div class=\"indentbody\"><b>"._DATABASE_MAINTENANCE_OPTIONS.": <font color=red>$editprofile->profilename</font></b><p>";
echo "<P>"._PLEASE_CHOOSE_AN_OPTION.":<P><ul>";
//if (!$validUserRequired || @$session->canEditProfiles()) {
if (!$validUserRequired || @$session->canUpdateLogs()) {
echo "<li><a href=\"profiles.php?editconf=$curprofilename&backup=1\">"._BACKUP_EXPORT;
echo "<li><a href=\"profiles.php?editconf=$curprofilename&restoredefaultdashboard=1\"><b>". _RESTORE_DEFAULT_DASHBOARD . "</b></a><p>";
echo "<li><a href=\"get_reports.php?conf=$curprofilename\"><b>Install Reports</b></a><p>";
echo "<li><a href=\"profiles.php?editconf=$curprofilename&del=5\"> "._DELETE_DATE_RANGE;
echo "<LI> <a href=\"profiles.php?editconf=$curprofilename&del=2\" onclick=\"return confirm('"._DELETE_PROFILE_AND_DATABASE_ASSURANCE."')\">"._DELETE_PROFILE_AND_DATABASE."</a> <P>";
echo "<li> <a href=\"profiles.php?editconf=$curprofilename&del=4\" onclick=\"return confirm('"._DELETE_DATABASE_ASSURANCE."')\">"._DELETE_DATABASE."</a><p>";
echo "<li> <a href=\"profiles.php?editconf=$curprofilename&del=7\" onclick=\"return confirm('"._DELETE_SUMMARY_TABLES_ASSURANCE."')\">"._DELETE_SUMMARY_TABLES."</a><p>";
echo "<li><a href=\"profiles.php?editconf=$curprofilename&del=8\">"._DELETE_CACHE."</a><p></ul>";
}
if (!$validUserRequired || @$session->canUpdateLogs()) {
echo "<li><b>"._SPECIALTY_UPDATE_OPTIONS."</b>:<P><ul>";
echo "<li><a href=\"profiles.php?editconf=$curprofilename&update_countries=1\">Update Country Information in Database</a><p>";
echo "<li><a href=\"profiles.php?editconf=$curprofilename&del=11\"> "._UPDATE_SUMMARY_TABLES_WOUT_CHECKING."</a><p>";
echo "<li><a href=\"update.php?conf=$curprofilename&force=true\"> "._UPDATE_STATS_WOUT_DATE_RANGE_CHECKS."</a><p>";
echo "<li><a href=\"update.php?conf=$curprofilename&force=true&movedone=true\" onclick=\"return confirm('"._MOVE_TO_DONE_ASSURANCE."')\">"._MOVE_TO_DONE."</a><p></ul>";
}
echo "<li><a href=\"profiles.php?editconf=$curprofilename&edit=1\"> "._EDIT_PROFILE."</a><P>";
echo "<li><a href=\"profiles.php?editconf=$curprofilename\"> <b>"._CANCEL."</b></a></ul>";
echo "<P>";
if (!$validUserRequired || @$session->canAddProfiles()) {
if ($q = @$db->Execute("SELECT table_schema \"Data Base Name\", table_name, sum( data_length + index_length ) / 1024 / 1024 \"Data Base Size in MB\" FROM information_schema.TABLES where table_schema='$DatabaseName' and (table_name='$editprofile->tablename' or table_name like '$editprofile->tablename\_%') GROUP BY table_schema")) {
$chk=$q->FetchRow();
$info = _TOTAL_SIZE_OF_THIS_PROFILE." ".number_format($chk[2],0)." MB. ";
$q = $db->Execute("select count(*) from $editprofile->tablename");
$chk=$q->FetchRow();
$info.= _THERE_ARE." $chk[0] "._RECORDS_IN_MAIN_SPANNING." ";
$q = $db->Execute("select timestamp from $editprofile->tablename order by timestamp asc limit 1");
$chk=$q->FetchRow();
$from=$chk[0];
$info.= date("Y-m-d",$chk[0]) . " to ";
$q = $db->Execute("select timestamp from $editprofile->tablename order by timestamp desc limit 1");
$chk=$q->FetchRow();
$to=$chk[0];
$info.= date("Y-m-d, H:i:s",$chk[0]) . ". ("._SEE_MORE_STATISTICS_BELOW.")<br><br>";
$info.= "Profile stucture version is: $editprofile->structure_version";
echoNotice($info,"width:640px;");
}
}
if (!$validUserRequired || @$session->canAddProfiles()) {
$query= "SELECT table_name, table_rows, sum( data_length + index_length ) / 1024 / 1024 \"Data Base Size in MB\" ";
//$query .= ", concat(\"<a href=profiles.php?editconf=$curprofilename&archivetable=\",table_name,\">Create archive</a>\") as archive ";
$query .= "FROM information_schema.TABLES where table_schema='$DatabaseName' and (table_name='$editprofile->tablename' or table_name like '$editprofile->tablename\_%') GROUP BY table_name";
//$showfields="table name,"._RECORDS.","._SIZEINMB.", Archive";
$showfields="table name,"._RECORDS.","._SIZEINMB;
$labels=_DATABASE_STATISTICS;
//$mini=1;
echo "<table width=640><tr><td>";
@StatsTable($from,$to,$showfields,$labels,$query,$drilldown,$filter);
echo "</td></tr></table>";
}
echo "</div>" ;
exit();
}
}
if ($del==2) {
if ($editprofile->profileloaded) {
if (!$validUserRequired || @$session->canEditProfiles()) {
echo "<div class=indentbody><font color=red>Last Action:</font><br><i>";
$query = "Delete from ".TBL_PROFILES." where profileid = ".$editprofile->profileid;
if (!$db->Execute($query)) {
die(_COULDNT_DELETE_PROFILE." " . $db->ErrorMsg());
} else {
echo _DELETED_PROFILE.": <b>".$editprofile->profilename."</b><br>";
}
deleteProfileData($editprofile->profilename);
if (!$db->Execute("drop table ".$editprofile->tablename)) {
echo("<p>"._COULDNT_DROP_TABLE." ".$editprofile->tablename.", ".$db->ErrorMsg()."</p>");
} else {
echo _DROPPED_DB_TABLES.": <b>".$editprofile->profilename."</b><br>";
}
@$db->Execute("drop table $editprofile->tablename_vpd");
@$db->Execute("drop table $editprofile->tablename_vpm");
@$db->Execute("drop table $editprofile->tablename_dailyurls");
@$db->Execute("drop table $editprofile->tablename_conversions");
@$db->Execute("drop table $editprofile->tablename_urls");
@$db->Execute("drop table $editprofile->tablename_urlparams");
@$db->Execute("drop table $editprofile->tablename_keywords");
@$db->Execute("drop table $editprofile->tablename_referrers");
@$db->Execute("drop table $editprofile->tablename_refparams");
@$db->Execute("drop table $editprofile->tablename_sessionids");
@$db->Execute("drop table $editprofile->tablename_visitorids");
@$db->Execute("drop table $editprofile->tablename_screenres");
@$db->Execute("drop table $editprofile->tablename_colordepth");
@$db->Execute("drop table ".$editprofile->tablename."_tlength"); // these last 2 are semi temporary tables that should be deleted when running Total Duration and Timeon site Today reports, but we'll delete then here just in case.
@$db->Execute("drop table ".$editprofile->tablename."_vlength");
@$db->Execute("drop table $editprofile->tablename_trackerlog");
echo _SUMMARY_TABLES_DROPPED.".<br>"._DONE.".</i></div><hr noshade size=1><br>";
deleteProfileData($editprofile->profilename);
} else {
echo "<div class=\"indentbody\">";
echoWarning(_SORRY_NO_PERMISSIONS);
echo "<P> </P></div>";
}
}
}
if ($del==3) {
if ($editprofile->profileloaded) {
$query = "Delete from ".TBL_PROFILES." where profileid = ".$editprofile->profileid;
$db->Execute($query) or die("Couldn't delete profile. " . $db->ErrorMsg());
deleteProfileData($editprofile->profilename);
echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br>"._DELETED_PROFILE.": <b>$editprofile->profilename</b><br>"._PLEASE_DROP_DB_TABLES." <b>'$editprofile->tablename'</b> "._MANUALLY_OR_KEEP_IT."</i></div><hr noshade size=1><br>";
deleteProfileData($editprofile->profilename);
}
}
if ($del==4) {
if ($editprofile->profileloaded) {
if (!$validUserRequired || @$session->canEditProfiles()) {
deleteDataTable($editprofile);
createDataTable($editprofile);
// deleteProfileData($editprofile->profilename);
deleteProfileData($editprofile->profilename, "cache\_%");
deleteProfileData($editprofile->profilename, $editprofile->tablename."%\_cachearray");
deleteProfileData($editprofile->profilename, $editprofile->profilename.".cache\_%");
deleteProfileData($editprofile->profilename, $editprofile->profilename."cache_trail");
deleteProfileData($editprofile->profilename, "lastlogpos.%");
deleteProfileData($editprofile->profilename, "firstlogline.%");
deleteProfileData($editprofile->profilename, "1stlogline.%");
deleteProfileData($editprofile->profilename, "lastknownpos.%");
echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i>"._DELETED_DB_TABLES." <b>'$editprofile->tablename'</b> "._AND_SUMMARIES_PROFILE_SAVED."</i></div><hr noshade size=1><br>";
} else {
echo "<div class=\"indentbody\">";
echoWarning(_SORRY_NO_PERMISSIONS);
echo "<P> </P></div>";
}
}
}
if ($del==5) {
if ($editprofile->profileloaded) {
if (!$validUserRequired || @$session->canEditProfiles()) {
echo "<div class=\"indentbody\">"._DELETE_DATE_RANGE_FROM." <b>$editprofile->profilename</b><P><form method=get action=\"profiles.php\">";
echo "<input type=hidden name=del value=6>";
DateSelector($from,$to);
echo "<input type=radio name=what value=2 checked> "._DELETE_ALL_LOG_DATA."<br>";
echo "<input type=radio name=what value=1> "._DELETE_ONLY_DETAIL_DATA."<br>";
echo "<input type=radio name=what value=3> "._DELETE_ONLY_SUMMARY_DATA."<br>";
echo "<input type=hidden name=editconf value=\"$curprofilename\">";
echo "<input type=submit name=submit value=Delete> "._PLEASE_BE_PATIENT_DELETING_TAKES_A_WHILE."</div>";
exit();
} else {
echo "<div class=\"indentbody\">";
echoWarning(_SORRY_NO_PERMISSIONS);
echo "<P> </P></div>";
}
}
}
if ($del==6) {
if ($editprofile->profileloaded) {
$what = $_REQUEST["what"];
echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i>";
DeleteRange($editprofile,$what);
echo "</i></div><hr noshade size=1><br>";
}
}
if ($del==7) {
if ($editprofile->profileloaded) {
if (!$validUserRequired || @$session->canEditProfiles()) {
$db->Execute("drop table $editprofile->tablename_vpd");
$db->Execute("drop table $editprofile->tablename_vpm");
$db->Execute("drop table $editprofile->tablename_dailyurls");
$db->Execute("drop table $editprofile->tablename_conversions");
createDataTable($editprofile);
echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i>"._DELETED_SUMMARY_DATA_IN_DATE_RANGE.". "._SUMMARIES_WILL_BE_RECALCULATED.".</i></div><hr noshade size=1><br>";
} else {
echo "<div class=\"indentbody\">";
echoWarning(_SORRY_NO_PERMISSIONS);
echo "<P> </P></div>";
}
}
}
if ($del==8) {
if ($editprofile->profileloaded) {
deleteProfileData($editprofile->profilename, "cache\_%");
deleteProfileData($editprofile->profilename, $editprofile->profilename."cache_trail");
echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i>"._ALL_CACHE_FILES_DELETED.".</i></div><hr noshade size=1><br>";
}
}
if ($del==9) { // this deletes a specific file or ip from the database
if ($editprofile->profileloaded) {
$fldname= $_REQUEST["fldname"];
$fldvalue= @$_REQUEST["fldvalue"];
echo "<div class=\"identbody\">"._DELETE." <font color=red>$fldvalue</font> "._FROM." <b>$editprofile->profilename</b><P><form method=post action=\"profiles.php\">";
echo "<input type=hidden name=del value=10>";
DateSelector($from,$to);
echo "<br>$fldname: <input type=text name=fldvalue value=\"$fldvalue\"> ("._EXACT_VALUE_ONLY.")<p>";
echo "<input type=hidden name=fldname value=\"$fldname\">";
echo "<input type=hidden name=editconf value=\"$curprofilename\">";
echo "<input type=checkbox name=recal value=\"1\" checked> "._RECALCULATE_SUMMARY_TABLES;
echo "<input type=submit name=submit value=Delete> </div>";
exit();
}
}
if ($del==10) {
if ($editprofile->profileloaded) {
$fldname= $_REQUEST["fldname"];
$fldvalue= @$_REQUEST["fldvalue"];
$recal= @$_REQUEST["recal"];
if ($fldname=="page") {
$q = @$db->Execute("select id from $editprofile->tablename_urls where url='$fldvalue'");
$page=$q->FetchRow();
$db->Execute("delete from $editprofile->tablename where timestamp >=$from and timestamp <=$to and url='$page[id]'");
$db->Execute("delete from $editprofile->tablename_dailyurls where timestamp >=$from and timestamp <=$to and url='$page[id]'");
$db->Execute("delete from $editprofile->tablename_conversions where timestamp >=$from and timestamp <=$to and url='$page[id]'");
} else if ($fldname=="ipnumber") {
$q = @$db->Execute("select id from $editprofile->tablename_visitorids where ipnumber='$fldvalue'");
while ($page=$q->FetchRow()) {
$db->Execute("delete from $editprofile->tablename where timestamp >=$from and timestamp <=$to and visitorid='$page[id]'");
$db->Execute("delete from $editprofile->tablename_conversions where timestamp >=$from and timestamp <=$to and visitorid='$page[id]'");
}
}
echo "<div class=\"indentbody\"><font color=red>Last Action:</font><br><i>";
if ($recal==1){
$db->Execute("delete from $editprofile->tablename_vpm where timestamp >=$from and timestamp <=$to");
$db->Execute("delete from $editprofile->tablename_vpd where timestamp >=$from and timestamp <=$to");
//$db->Execute("delete from $editprofile->tablename_screenres where timestamp >=$from and timestamp <=$to");
//$db->Execute("delete from $editprofile->tablename_colordepth where timestamp >=$from and timestamp <=$to");
echo "Deleted $fldname $fldvalue, will recalculate summary tables now ...";
//deleteProfileData($editprofile->profilename);
echo("<form name=progress>"._PROGRESS.":<br><input type=text name=perc size=1 value=\"0\" class=pbar>% ");
echo("<input type=text name=progbar size=46 value=\"|\" class=progbar><P>");
echo(_STATUS.": <input type=text name=ptext size=85 class=pbar value=\"start\" class=progbar><P>");
echo("</form>");
echo "<br><br>";
// function echoConsoleSafe($txt) {
// echo $txt;
// }
$profile = new SiteProfile($curprofilename);
$conf=$curprofilename;
$orist=$from;
?>
<script>
function pbar(p) {
self.document.forms.progress.perc.value=p;
self.document.forms.progress.progbar.value=self.document.forms.progress.progbar.value+'|';
}
function pstatus(p) {
self.document.forms.progress.ptext.value=p;
}
</script>
<?php
include "update_summaries.php";
echo "</div>";
}
echo _IF_YOU_WANT_TO_KEEP." <b>$fldvalue</b> "._OUT_OF_FUTURE_STATS." ";
if ($fldname=="page") {
echo _SKIP_FILES." ";
} else {
echo _SKIP_IP_NUMBERS." ";
}
echo _FIELD_ON_THE_DATA_COLLECTION_TAB_IN_YOUR." $curprofilename "._PROFILE_SETTINGS.".</i></div><hr noshade size=1><br>";
}
}
if ($del==11) { // this just does update_summaries without adding any new traffic from the log files
if ($editprofile->profileloaded) {
echo "<div class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br>";
echo "<i>"._UPDATE_SUMMARIES_WOUT_CHECKING_NEW_DATA."...</i>";
echo("<form name=progress>"._PROGRESS.":<br><input type=text name=perc size=1 value=\"0\" class=pbar>% ");
echo("<input type=text name=progbar size=46 value=\"|\" class=progbar><P>");
echo(_STATUS.": <input type=text name=ptext size=85 class=pbar value=\"start\" class=progbar><P>");
echo("</form>");
echo "<br><br>";
// function echoConsoleSafe($txt) {
// echo $txt;
// }
$profile = new SiteProfile($curprofilename);
$conf=$curprofilename;
//$orist=$from;
?>
<script>
function pbar(p) {
self.document.forms.progress.perc.value=p;
self.document.forms.progress.progbar.value=self.document.forms.progress.progbar.value+'|';
}
function pstatus(p) {
self.document.forms.progress.ptext.value=p;
}
</script>
<?php
include "update_summaries.php";
}
}
if ($update_countries==1) {
if ($editprofile->profileloaded) {
if (!$validUserRequired || @$session->canUpdateLogs()) {
echo "<div class=\"indentbody\"><h3>Update Geographic Location information for '$editprofile->profilename'</h3>";
echo "<p>You can use this tool if you have updated (or just installed) the Geo Location database and want to update country information on records already stored in your Logaholic database for this profile.</p>";
echo "<P>The date range will affect which visitors are checked (only visitorid's <em>first created</em> within the date range) and which records will be updated (only hits within the date range).</P>";
echo "<p><b>Select the date range you want to update geographic information for:</b></p>";
echo "<form method=get action=\"profiles.php\">";
echo "<input type=hidden name=\"update_countries\" value=2>";
$daterange = GetMaxDateRange($editprofile);
DateSelector($daterange['from'],$daterange['to']);
echo "<input type=hidden name=editconf value=\"$curprofilename\">";
echo "<input type=submit name=submit value=\""._UPDATE_NOW."\" style=\"margin-top:5px;font-size:14px;\">";
echo "</div></body></html>";
exit();
} else {
echo "<div class=\"indentbody\">";
echoWarning(_SORRY_NO_PERMISSIONS);
echo "<P> </P></div>";
}
}
}
if ($update_countries==2) {
if ($editprofile->profileloaded) {
if (!$validUserRequired || @$session->canUpdateLogs()) {
$profile=$editprofile;
include "includes/update_countries.php";
echo "<div class=\"indentbody\">";
$uc = new UpdateCountries();
$uc->DisplayProgress();
$uc->UpdateRange($from,$to);
echo "</div></body></html>";
exit();
} else {
echo "<div class=\"indentbody\">";
echoWarning(_SORRY_NO_PERMISSIONS);
echo "<P> </P></div>";
}
}
}
if (!isset($backup)) {
$backup=0;
}
if ($backup==1) {
echo "<div class=\"indentbody\"><b>"._BACKUP_EXPORT_DATE_RANGE_FROM." <font color=red>$curprofilename</font></b><P>";
echo "<form method=get action=\"profiles.php\">";
echo "<table width=450 class=smallborder><tr><td class=small>"._YOU_CAN_EXPORT_DATA_FROM_TABLE." ($editprofile->tablename) "._IN_ORDER_TO_BACKUP."</td></tr></table><P>";
echo "<input type=hidden name=backup value=2>";
DateSelector($from,$to);
echo "<input type=hidden name=editconf value=\"$curprofilename\">";
echo "<P>"._FILE_FORMAT.": <select name=\"mode\"><option value=\"logfile\" selected> "._APACHE_COMBINED_LOG_FILE_FORMAT." <option value=\"csv\"> "._CSV_FORMAT."</select></p>";
echo "<P><input type=submit name=submit value=\"Download Backup File\"></div>";
echo "</body></html>";
exit();
}
if (isset($_REQUEST["globalstats"])=="yes") {
echo "<div class='indentbody'> <br>";
include "includes/globalstats.php";
echo "</div></body></html>";
exit();
}
if(isset($restoreDefaultDashboard)){
$editprofile->setDefaultDashboard();
echo "<div class=\"indentbody\">";
echo "Your default desktop has been restored.";
echo "</div>";
}
if (!isset($edit) && (!isset($new))) {
// list all profiles
if ($saved!="") {
echo "<p class=\"indentbody\"><font color=red>"._LAST_ACTION.":</font><br><i><b>$editprofile->profilename</b> ".$saved."</i></p><hr noshade size=1><br>";
}
?>
<div class=indentbody>
<script language="javascript" type="text/javascript">
function prowOverEffect(object) {
if (object.className == 'profilerow') object.className = 'profilerowhighlight';
}
function prowOutEffect(object) {
if (object.className == 'profilerowhighlight') object.className = 'profilerow';
}
</script>
<?php
// see how many profiles there are in total, if it's more than 5 print a SEARCH BOX
$query = "Select count(*) from ".TBL_PROFILES.";";
$result = $db->Execute($query) or die(_COULDNT_QUERY_PROFILES." " . $db->ErrorMsg());
$result = $result->FetchRow();
$numprofiles=$result[0];
if ($result[0] > 5) {
if (($validUserRequired) && (!$session->isAdmin())) {
// you have to be admin to see the search box
} else {
?>
<form method="post" action="profiles.php">
Search profiles matching: <input type="text" name="search" value="<?php echo @$search; ?>">
in field:
<select name="sfield">
<option value="profilename" <?php if (@$sfield=="profilename") { echo "selected"; } ?>> <?php echo _PROFILE_NAME;?>
<option value="confdomain" <?php if (@$sfield=="confdomain") { echo "selected"; } ?>> <?php echo _DOMAIN_NAME;?>
</select>
<input type="submit" value="Search">
</form>
<br>
<?php
}
}
echo "<div style=\"width:600px;\">";
if (!$validUserRequired || $session->isAdmin() || $session->canAddProfiles()) {
echo "<div style=\"float:left;line-height:16px;padding-right:20px;margin-bottom:6px;\">";
if ((!defined("_LIMIT_PROFILES")) || (_LIMIT_PROFILES == 0)) {
echo "<img src=\"images/icons/add_profile.gif\" width=16 height=16 align=left alt=\"New\"> <a href=\"profiles.php?conf=newcnf&new=1\">"._CREATE_NEW_PROFILE."</a>";
} else {
if ($numprofiles >= _LIMIT_PROFILES) {
echo "<img src=\"images/icons/add_profile.gif\" width=16 height=16 align=left alt=\"Upgrade\"> "._TOO_MANY_PROFILES_PLEASE_UPGRADE."";
} else {
echo "<img src=\"images/icons/add_profile.gif\" width=16 height=16 align=left alt=\"New\"> <a href=\"profiles.php?conf=newcnf&new=1\">"._CREATE_NEW_PROFILE."</a>";
}
}
echo "</div>";
}
echo "<div style=\"float:left;line-height:16px;margin-bottom:6px;\"><img src=\"images/icons/pie.gif\" width=16 height=16 align=left alt=\"New\"> <a href=\"profiles.php?globalstats=yes\">"._GLOBAL_STATISTICS_OVERVIEW."</a></div>";
echo "</div>";
?>
<table cellpadding=6 cellspacing=0 border=0 style="min-width:600px;clear:both;">
<tr><td colspan=5 class=toplineblue bgcolor="#BBDDFF"><img src="images/icons/profiles.gif" width=16 height=16 align=left alt="<?php echo _MANAGE_PROFILES;?>"> <font size=3><b><?php echo _MANAGE_PROFILES;?></b></font></td></tr>
<?php
$query = "Select profilename,tablename,profileid from ".TBL_PROFILES;
// If we're limiting the visible profiles, then put a filter on to only pull those records.
if (($validUserRequired) && (!$session->isAdmin())) {
// Can't use implode here because we need to escape the entries.
$validprofiles = "";
for ($i = count($session->user_profiles)-1; $i >= 0; $i--) {
if ($validprofiles != "") { $validprofiles .= "\",\""; }
$validprofiles .= $db->escape($session->user_profiles[$i]);
}
$query .= " where profilename in (\"$validprofiles\")";
}
if (@$search) {
$query .= " where $sfield like '%$search%'";
}
$query.=" order by profilename";
if (defined("_LIMIT_PROFILES") != 0) {
$query.=" limit 0,"._LIMIT_PROFILES;
$num_of_items = _LIMIT_PROFILES;
} else {
/* Pagination config starts here */
$num_of_items = 0;
$max_links = 5;
$count_query = "SELECT COUNT(*) AS `max_profiles` FROM ".TBL_PROFILES;
$amount_result = $db->Execute($count_query);
$num_of_items = $amount_result->FetchRow();
$num_of_items = $num_of_items['max_profiles'];
if(!empty($_GET['num_pp'])) {
$items_per_page = $_GET['num_pp'];
} else {
$items_per_page = 10;
}
if(!empty($_GET['page_num'])) {
$page_num = $_GET['page_num'];
} else {
$page_num = 1;
}
$query .= " LIMIT ".floor(($page_num - 1) * $items_per_page).", ".$items_per_page;
/* Pagination config ends here */
}
$result = $db->Execute($query) or die(_COULDNT_QUERY_PROFILES." " . $db->ErrorMsg());
if ($result->RecordCount() == 0) {
echo "<tr><td colspan=5 class=\"profilerow\">"._YOU_HAVE_NO_ACTIVE_PROFILES.".</td></tr>";
} else {
while ($profile_row = $result->FetchRow()) {
$profilename = $profile_row[0];
$profile_tablename = $profile_row[1];
if ($conf==$profilename || $editconf==$profilename) {
$sel=" <font color=red>("._ACTIVE.")</font>";
$bgc="bgcolor=#CCFFCC";
$class="";
} else {
$sel="";
$bgc="";
$class="onmouseover=\"prowOverEffect(this)\" onmouseout=\"prowOutEffect(this)\"";
}
echo "<tr class=\"profilerow\" $class><td $bgc style=\"font-size:13px;\" class=\"dotline2\" title=\"{$profile_row[2]}\"><b>$profilename</b> $sel</td><td $bgc style=\"font-size:13px;\" class=dotline2><img src=\"images/icons/date.gif\" width=16 height=16 align=left alt=\""._VIEW_STATS."\"> <a href=\"index.php?conf=$profilename\">"._VIEW_STATS."</a></td>";
if ((!$validUserRequired) || ($session->canUpdateLogs())) {
echo "<td $bgc class=dotline2><img src=\"images/icons/update.gif\" width=16 height=16 align=left alt=\""._UPDATE_NOW."\"> <a href=\"update.php?conf=$profilename\">"._UPDATE_NOW."</a></td>";
}
if ((!$validUserRequired) || ($session->canEditProfiles())) {
/*
$rq= @$db->Execute("select count(*) from $profile_tablename");
$recs = @$rq->FetchRow();
$recs = number_format($recs[0], 0, '.', '');
echo "<td $bgc class=dotline2><img src=\"images/icons/edit.gif\" width=16 height=16 align=left alt=\"Edit\"><a href=\"profiles.php?editconf=$profilename&edit=1\">"._EDIT_PROFILE."</a></td><td $bgc class=dotline2 title=\"This profile contains $recs data records\"> <img src=\"images/icons/delete.gif\" width=16 height=16 align=left alt=\"Delete\"><a href=\"profiles.php?editconf=$profilename&del=1\">"._MAINTENANCE."</a></td></tr>";
*/
echo "<td $bgc class=dotline2><img src=\"images/icons/edit.gif\" width=16 height=16 align=left alt=\"Edit\"><a href=\"profiles.php?editconf=$profilename&edit=1\">"._EDIT_PROFILE."</a></td>";
}
if ((!$validUserRequired) || ($session->canUpdateLogs())) {
echo "<td $bgc class=dotline2> <img src=\"images/icons/delete.gif\" width=16 height=16 align=left alt=\"Delete\"><a href=\"profiles.php?editconf=$profilename&del=1\">"._MAINTENANCE."</a></td></tr>";
} else {
echo "</tr>";
}
}
if ($num_of_items > 10) {
echo "<tr><td cellspacing='0' cellpadding='0' colspan='5'>";
if (defined("_LIMIT_PROFILES") == 0) {
echo "<div class='profile_pagination'>";
if(ceil($num_of_items/$items_per_page) > 1) {
echo pagination($num_of_items, $items_per_page, $page_num, $max_links);
}
if(!empty($_GET['page_num'])) {
$url_extension = "?page_num=1&";
} else {
$url_extension = "?";
}
echo "<script type='text/javascript'>$(document).ready(function() { $(\"#num_pp\").change(function() { window.location = \"{$_SERVER['PHP_SELF']}{$url_extension}num_pp=\" + $(this).val() }); });</script>";
echo "<div class='select_num_per_page'>";
echo "<label for='pagination_num_per_page'>Number of profiles per page: </label>";
echo "<select id='num_pp' name='num_pp'>";
echo "<option "; if($items_per_page == 5) { echo "selected "; } echo "value='5'>5</option>";
echo "<option "; if($items_per_page == 10) { echo "selected "; } echo "value='10'>10</option>";
echo "<option "; if($items_per_page == 20) { echo "selected "; } echo "value='20'>20</option>";
echo "<option "; if($items_per_page == 50) { echo "selected "; } echo "value='50'>50</option>";
echo "<option "; if($items_per_page == 100) { echo "selected "; } echo "value='100'>100</option>";
echo "</select>";
echo "</div>";
echo "</div>";
}
echo "</td></tr>";
}
}
echo "</table><p>";
if ($validUserRequired && @$session->isAdmin()===false) {
$Notice="";
if (@$session->canEditProfiles()===false) {
$Notice.=_NO_PERMISSION_EDIT_PROFILE."<br>";
}
if (@$session->canAddProfiles()===false) {
$Notice.=_NO_PERMISSION_ADD_PROFILE."<br>";
}
if (@$session->canUpdateLogs()===false) {
$Notice.=_NO_PERMISSION_UPDATE."<br>";
}
if ($Notice!="" && _LOGAHOLIC_EDITION!=4) {
echo "<div style=\"width:600px;\">";
$Notice="<b>"._PLEASE_NOTE.":</b><br>".$Notice;
echoNotice($Notice);
echo "</div>";
}
}
echo "</div>";
}
/* Pagination functions starts here */
function pagination_link($page_number) {
$pagination_url = $_SERVER['PHP_SELF'].'?page_num='.$page_number;
if(!empty($_GET['num_pp'])) {
$pagination_url .= "&num_pp={$_GET['num_pp']}";
}
return $pagination_url;
}
function pagination($number_of_items, $items_pp, $page_number, $max_links) {
$total_pages = ceil($number_of_items/$items_pp);
if($page_number) {
if($page_number > 1) {
$prev = "<a href='".pagination_link(($page_number -1 ))."'>< Previous</a>";
$first = "<a href='".pagination_link(1)."'><< First Page</a>";
} else {
$prev = "<span>< Previous</span>";
$first = "<span><< First Page</span>";
}
}
if($page_number < $total_pages) {
$next = "<a href='".pagination_link(($page_number+1))."'>Next ></a>";
$last = "<a href='".pagination_link($total_pages)."'>Last Page >></a>";
} else {
$next = "<span>Next ></span>";
$last = "<span>Last Page >></span>";
}
echo $first;
echo $prev;
$loop = 0;
if($page_number >= $max_links) {
$page_counter = ceil($page_number - ($max_links-1));
} else {
$page_counter = 1;
}
if($total_pages < $max_links){
$max_links = $total_pages;
}
do{
if($page_counter == $page_number) {
echo "<strong>{$page_counter}</strong>";
} else {
echo "<a href='".pagination_link(($page_counter))."'>{$page_counter}</a>";
}
$page_counter++; $current_page=($page_counter+1);
$loop++;
} while ($max_links > $loop);
echo $next;
echo $last;
}
include "includes/editprofile.php";
echo "</body></html>";
Did this file decode correctly?
Original Code
<?php eval(base64_decode("Ci8qIExvZ2Fob2xpYyBXZWIgQW5hbHl0aWNzIHNvZnR3YXJlICAgICAgICAgICAgIENvcHlyaWdodChjKSAyMDA1LTIwMTEgTG9nYWhvbGljIEIuVi4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIFJlc2VydmVkLgogKiBUaGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgTG9nYWhvbGljIGxpY2Vuc2UuIFVuYXV0aG9yaXplZCBjb3B5aW5nIGlzIHByb2hpYml0ZWQuCiAqIHN1cHBvcnRAbG9nYWhvbGljLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmxvZ2Fob2xpYy5jb20vTGljZW5zZS50eHQKKi8gCgokZG9udF9jbG9zZV9zZXNzaW9uID0gdHJ1ZTsKCmluY2x1ZGVfb25jZSAiY29tbW9uLmluYy5waHAiOwoKJHByb2ZpbGVzPTE7ICAvLyB0aGlzIGlzIHNvIGl0IGRvZXNuJ3QgbG9vcCBpbmNsdWRlcyBmcm9tIHRvcC5waHAKCi8vIFdoaWNoIHByb2ZpbGUgYXJlIHdlIGVkaXRpbmc/CiRjdXJwcm9maWxlbmFtZSA9IEAkX1JFUVVFU1RbImVkaXRjb25mIl07CgovLyBBcmUgd2UgZWRpdGluZyBvciBjcmVhdGluZyBhIG5ldyBvbmUKJHJlc3RvcmVEZWZhdWx0RGFzaGJvYXJkID0gQCRfUkVRVUVTVFsicmVzdG9yZWRlZmF1bHRkYXNoYm9hcmQiXTsKJGVkaXQgPSBAJF9SRVFVRVNUWyJlZGl0Il07CiRuZXcgPSBAJF9SRVFVRVNUWyJuZXciXTsKJGluc3RhbGwgPSBAJF9SRVFVRVNUWyJpbnN0YWxsIl07CiRzYXZlID0gQCRfUkVRVUVTVFsic2F2ZSJdOwokZGVsID0gQCRfUkVRVUVTVFsiZGVsIl07CiRiYWNrdXAgPSBAJF9SRVFVRVNUWyJiYWNrdXAiXTsKJHNwZWNpYWxxID0gQCRfUkVRVUVTVFsic3BlY2lhbHEiXTsKJG1vZGUgPSBAJF9SRVFVRVNUWyJtb2RlIl07CiRzZWFyY2ggPSBAJF9SRVFVRVNUWyJzZWFyY2giXTsKJHNmaWVsZCA9IEAkX1JFUVVFU1RbInNmaWVsZCJdOwokdXBkYXRlX2NvdW50cmllcyA9IEAkX1JFUVVFU1RbInVwZGF0ZV9jb3VudHJpZXMiXTsKJHNldF9wcm9maWxlX3N0cnVjdHVyZV92ZXJzaW9uID0gQCRfUkVRVUVTVFsic2V0X3Byb2ZpbGVfc3RydWN0dXJlX3ZlcnNpb24iXTsgICAKU2VjdXJpdHlDaGVjayhAJF9SRVFVRVNUWyJuZXdjb25mbmFtZSJdKTsKCmlmICgkY3VycHJvZmlsZW5hbWUgJiYgJHZhbGlkVXNlclJlcXVpcmVkICYmICghJHNlc3Npb24tPmlzQWRtaW4oKSAmJiAhJHNlc3Npb24tPmNhbkFjY2Vzc1Byb2ZpbGUoJGN1cnByb2ZpbGVuYW1lKSkpIHsKCWRpZShfU09SUllfTk9fUklHSFRTLiI6ICRjdXJwcm9maWxlbmFtZSIpOwp9CgovL2VkaXQgcHJvZmlsZQovLyBMb2FkIHRoZSBwcm9maWxlIHRoYXQgd2UncmUgY3VycmVudGx5IHRyeWluZyB0byBlZGl0LgokZWRpdHByb2ZpbGUgPSBuZXcgU2l0ZVByb2ZpbGUoJGN1cnByb2ZpbGVuYW1lKTsKCmlmIChpc3NldCgkX1JFUVVFU1RbJ2NvcHlfdG8nXSkpIHsKICAgIGlmIChpc3NldCgkX1JFUVVFU1RbJ3dpdGhfZGF0YSddKSkgewogICAgICAgICRlZGl0cHJvZmlsZS0+Y29weVByb2ZpbGUoJF9SRVFVRVNUWydjb3B5X3RvJ10sdHJ1ZSk7ICAgIAogICAgfSBlbHNlIHsKICAgICAgICAkZWRpdHByb2ZpbGUtPmNvcHlQcm9maWxlKCRfUkVRVUVTVFsnY29weV90byddLGZhbHNlKTsgICAgCiAgICB9CiAgICBleGl0KCk7ICAgICAgICAKfQoKJHNhdmVkID0gIiI7CiRzYXZlZXJyb3IgPSBmYWxzZTsKCmlmICgoaXNzZXQoJHNhdmUpKSAmJiBpc3NldCgkX1JFUVVFU1QpICYmIChpc3NldCgkY3VycHJvZmlsZW5hbWUpIHx8IChpc3NldCgkX1JFUVVFU1RbIm5ld2NvbmZuYW1lIl0pICYmIGlzc2V0KCRpbnN0YWxsKSkpKSB7CgkKCWlmICgkZWRpdHByb2ZpbGUtPnRyYWNrZXJtb2RlIT1AJF9SRVFVRVNUWyJ0cmFja2VybW9kZSJdKSB7CiAgICAgICAgLy8gd2UncmUgc3dpdGNoaW5nIGRhdGEgY29sZWN0aW9uIG1ldGhvZC4KICAgICAgICBpZiAoJF9SRVFVRVNUWyJ0cmFja2VybW9kZSJdPT0xKSB7CiAgICAgICAgICAgIGlmICgkX1JFUVVFU1RbInZpc2l0b3JpZGVudG1ldGhvZCJdIT0zKSB7CiAgICAgICAgICAgICAgICAkX1JFUVVFU1RbInZpc2l0b3JpZGVudG1ldGhvZCJdPTM7CiAgICAgICAgICAgICAgICAkc2F2ZWQgLj0gIjxicj5WaXNpdG9yIElkZW50aWZpY2F0aW9uIG1ldGhvZCB3YXMgYXV0b21hdGljYWxseSBjaGFuZ2VkIHRvOiBDb29raWU8YnI+IjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzYXZlZCAuPSAiPGJyPlBsZWFzZSBjaGVjayBpZiBWaXNpdG9yIElkZW50aWZpY2F0aW9uIG1ldGhvZCBvbiB0aGUgQWR2YW5jZWQgdGFiIGlzIHN0aWxsIGNvcnJlY3Q8YnI+IjsgICAgCiAgICAgICAgfSAKICAgIH0KICAgIAogICAgLy8gVGhlc2UgYXJlIGFsbCB1c2VyIGVkaXRhYmxlIHZhbHVlcy4gICAgCgkkZWRpdHByb2ZpbGUtPmNvbmZkb21haW4gPSAoaXNzZXQoJF9SRVFVRVNUWyJjb25mZG9tYWluIl0pKSA/ICRfUkVRVUVTVFsiY29uZmRvbWFpbiJdIDogJGVkaXRwcm9maWxlLT5jb25mZG9tYWluOwoJJGVkaXRwcm9maWxlLT5lcXVpdmRvbWFpbnMgPSAoaXNzZXQoJF9SRVFVRVNUWyJlcXVpdmRvbWFpbnMiXSkpID8gJF9SRVFVRVNUWyJlcXVpdmRvbWFpbnMiXSA6ICRlZGl0cHJvZmlsZS0+ZXF1aXZkb21haW5zOwoJaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsKCQkkZWRpdHByb2ZpbGUtPmVxdWl2ZG9tYWlucyA9IHN0cmlwc2xhc2hlcygkZWRpdHByb2ZpbGUtPmVxdWl2ZG9tYWlucyk7Cgl9CgkkZWRpdHByb2ZpbGUtPmRlZmF1bHRmaWxlID0gKGlzc2V0KCRfUkVRVUVTVFsiZGVmYXVsdGZpbGUiXSkpID8gJF9SRVFVRVNUWyJkZWZhdWx0ZmlsZSJdIDogJGVkaXRwcm9maWxlLT5kZWZhdWx0ZmlsZTsKCSRlZGl0cHJvZmlsZS0+c3BsaXRsb2dzID0gKGlzc2V0KCRfUkVRVUVTVFsic3BsaXRsb2dzIl0pKSA/ICRfUkVRVUVTVFsic3BsaXRsb2dzIl0gOiAwOyAgLy8gQ2hlY2tib3hlcyBkb24ndCBnZXQgcG9zdGVkIGluIElFIGlmIHRoZXkncmUgZmFsc2UuCgkkZWRpdHByb2ZpbGUtPnNwbGl0ZmlsdGVyID0gKGlzc2V0KCRfUkVRVUVTVFsic3BsaXRmaWx0ZXIiXSkpID8gJF9SRVFVRVNUWyJzcGxpdGZpbHRlciJdIDogJGVkaXRwcm9maWxlLT5zcGxpdGZpbHRlcjsKICAgICRlZGl0cHJvZmlsZS0+c3BsaXRmaWx0ZXJuZWdhdGl2ZSA9IChpc3NldCgkX1JFUVVFU1RbInNwbGl0ZmlsdGVybmVnYXRpdmUiXSkpID8gJF9SRVFVRVNUWyJzcGxpdGZpbHRlcm5lZ2F0aXZlIl0gOiAkZWRpdHByb2ZpbGUtPnNwbGl0ZmlsdGVybmVnYXRpdmU7IAoJJGVkaXRwcm9maWxlLT50cmFja2VybW9kZSA9IChpc3NldCgkX1JFUVVFU1RbInRyYWNrZXJtb2RlIl0pKSA/ICRfUkVRVUVTVFsidHJhY2tlcm1vZGUiXSA6ICRlZGl0cHJvZmlsZS0+dHJhY2tlcm1vZGU7CiAgICAkZWRpdHByb2ZpbGUtPnNraXBpcHMgPSAoaXNzZXQoJF9SRVFVRVNUWyJza2lwaXBzIl0pKSA/ICRfUkVRVUVTVFsic2tpcGlwcyJdIDogJGVkaXRwcm9maWxlLT5za2lwaXBzOwoJaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsKCQkkZWRpdHByb2ZpbGUtPnNraXBpcHMgPSBzdHJpcHNsYXNoZXMoJGVkaXRwcm9maWxlLT5za2lwaXBzKTsKCX0KCSRlZGl0cHJvZmlsZS0+c2tpcGZpbGVzID0gKGlzc2V0KCRfUkVRVUVTVFsic2tpcGZpbGVzIl0pKSA/ICRfUkVRVUVTVFsic2tpcGZpbGVzIl0gOiAkZWRpdHByb2ZpbGUtPnNraXBmaWxlczsKCSRlZGl0cHJvZmlsZS0+dGFyZ2V0ZmlsZXMgPSAoaXNzZXQoJF9SRVFVRVNUWyJ0YXJnZXRmaWxlcyJdKSkgPyAkX1JFUVVFU1RbInRhcmdldGZpbGVzIl0gOiAkZWRpdHByb2ZpbGUtPnRhcmdldGZpbGVzOwoJJGVkaXRwcm9maWxlLT51c2VwYWdlY2FjaGUgPSAoaXNzZXQoJF9SRVFVRVNUWyJjYWNoaW5nIl0pKSA/ICRfUkVRVUVTVFsiY2FjaGluZyJdIDogJGVkaXRwcm9maWxlLT50YXJnZXRmaWxlczsKCSRlZGl0cHJvZmlsZS0+YW5pbWF0ZSA9IChpc3NldCgkX1JFUVVFU1RbImFuaW1hdGUiXSkpID8gJF9SRVFVRVNUWyJhbmltYXRlIl0gOiAkZWRpdHByb2ZpbGUtPmFuaW1hdGU7CiAgICAkZWRpdHByb2ZpbGUtPnRpbWV6b25lY29ycmVjdGlvbiA9IChpc3NldCgkX1JFUVVFU1RbInRpbWV6b25lY29ycmVjdGlvbiJdKSkgPyAkX1JFUVVFU1RbInRpbWV6b25lY29ycmVjdGlvbiJdIDogJGVkaXRwcm9maWxlLT50aW1lem9uZWNvcnJlY3Rpb247CiAgICAkZWRpdHByb2ZpbGUtPnRpbWV6b25lID0gKGlzc2V0KCRfUkVRVUVTVFsidGltZXpvbmUiXSkpID8gJF9SRVFVRVNUWyJ0aW1lem9uZSJdIDogJGVkaXRwcm9maWxlLT50aW1lem9uZTsKICAgICRuZXd2aXNpdG9yaWRlbnRtZXRob2QgPSAoaXNzZXQoJF9SRVFVRVNUWyJ2aXNpdG9yaWRlbnRtZXRob2QiXSkpID8gJF9SRVFVRVNUWyJ2aXNpdG9yaWRlbnRtZXRob2QiXSA6ICRlZGl0cHJvZmlsZS0+dmlzaXRvcmlkZW50bWV0aG9kOwogICAgJHZpc2l0b3JpZGVudG1ldGhvZHN3aXRjaGVkID0gKCRlZGl0cHJvZmlsZS0+dmlzaXRvcmlkZW50bWV0aG9kICE9ICRuZXd2aXNpdG9yaWRlbnRtZXRob2QpOwogICAgJGVkaXRwcm9maWxlLT52aXNpdG9yaWRlbnRtZXRob2QgPSAkbmV3dmlzaXRvcmlkZW50bWV0aG9kOwogICAgJGVkaXRwcm9maWxlLT5yZWN1cnNpdmUgPSAoaXNzZXQoJF9SRVFVRVNUWyJyZWN1cnNpdmUiXSkpID8gJF9SRVFVRVNUWyJyZWN1cnNpdmUiXSA6IDA7ICAgIAogICAgJGVkaXRwcm9maWxlLT5mdHBzZXJ2ZXIgPSAoaXNzZXQoJF9SRVFVRVNUWyJmdHBzZXJ2ZXIiXSkpID8gJF9SRVFVRVNUWyJmdHBzZXJ2ZXIiXSA6ICRlZGl0cHJvZmlsZS0+ZnRwc2VydmVyOwogICAgJGVkaXRwcm9maWxlLT5mdHB1c2VyID0gKGlzc2V0KCRfUkVRVUVTVFsiZnRwdXNlciJdKSkgPyAkX1JFUVVFU1RbImZ0cHVzZXIiXSA6ICRlZGl0cHJvZmlsZS0+ZnRwdXNlcjsKICAgICRlZGl0cHJvZmlsZS0+ZnRwcGFzc3dkID0gKGlzc2V0KCRfUkVRVUVTVFsiZnRwcGFzc3dkIl0pKSA/ICRfUkVRVUVTVFsiZnRwcGFzc3dkIl0gOiAkZWRpdHByb2ZpbGUtPmZ0cHBhc3N3ZDsKICAgICRlZGl0cHJvZmlsZS0+ZnRwZnVsbHBhdGggPSAoaXNzZXQoJF9SRVFVRVNUWyJmdHBmdWxscGF0aCJdKSkgPyAkX1JFUVVFU1RbImZ0cGZ1bGxwYXRoIl0gOiAkZWRpdHByb2ZpbGUtPmZ0cGZ1bGxwYXRoOwogICAgJGVkaXRwcm9maWxlLT52aXNpdHRpbWVvdXQgPSAoaXNzZXQoJF9SRVFVRVNUWyJ2aXNpdHRpbWVvdXQiXSkpID8gJF9SRVFVRVNUWyJ2aXNpdHRpbWVvdXQiXSA6ICRlZGl0cHJvZmlsZS0+dmlzaXR0aW1lb3V0OwogICAgJGVkaXRwcm9maWxlLT51cmxwYXJhbWZpbHRlciA9IChpc3NldCgkX1JFUVVFU1RbInVybHBhcmFtZmlsdGVyIl0pKSA/ICRfUkVRVUVTVFsidXJscGFyYW1maWx0ZXIiXSA6ICRlZGl0cHJvZmlsZS0+dXJscGFyYW1maWx0ZXI7CiAgICAkZWRpdHByb2ZpbGUtPnVybHBhcmFtZmlsdGVybW9kZSA9IChpc3NldCgkX1JFUVVFU1RbInVybHBhcmFtZmlsdGVybW9kZSJdKSkgPyAkX1JFUVVFU1RbInVybHBhcmFtZmlsdGVybW9kZSJdIDogJGVkaXRwcm9maWxlLT51cmxwYXJhbWZpbHRlcm1vZGU7CiAgICAkZWRpdHByb2ZpbGUtPmdvb2dsZXBhcmFtcyA9IChpc3NldCgkX1JFUVVFU1RbImdvb2dsZXBhcmFtcyJdKSkgPyAkX1JFUVVFU1RbImdvb2dsZXBhcmFtcyJdIDogJGVkaXRwcm9maWxlLT5nb29nbGVwYXJhbXM7CiAgICAkZWRpdHByb2ZpbGUtPmZlZWR1cmwgPSAoaXNzZXQoJF9SRVFVRVNUWyJmZWVkdXJsIl0pKSA/ICRfUkVRVUVTVFsiZmVlZHVybCJdIDogJGVkaXRwcm9maWxlLT5mZWVkdXJsOwogICAgJGVkaXRwcm9maWxlLT5mZWVkYnVybmVydXJpID0gKGlzc2V0KCRfUkVRVUVTVFsiZmVlZGJ1cm5lcnVyaSJdKSkgPyAkX1JFUVVFU1RbImZlZWRidXJuZXJ1cmkiXSA6ICRlZGl0cHJvZmlsZS0+ZmVlZGJ1cm5lcnVyaTsgCgkKCSRlZGl0cHJvZmlsZS0+ZmFjZWJvb2tsb2dpbiA9IChpc3NldCgkX1JFUVVFU1RbImZhY2Vib29rbG9naW4iXSkpID8gJF9SRVFVRVNUWyJmYWNlYm9va2xvZ2luIl0gOiAkZWRpdHByb2ZpbGUtPmZhY2Vib29rbG9naW47CgkKCSRlZGl0cHJvZmlsZS0+bG9ncGFyc2VydHlwZSA9IChpc3NldCgkX1JFUVVFU1RbImxvZ19wYXJzZXJfdHlwZSJdKSkgPyAkX1JFUVVFU1RbImxvZ19wYXJzZXJfdHlwZSJdIDogJGVkaXRwcm9maWxlLT5sb2dwYXJzZXJ0eXBlOwogICAgJGVkaXRwcm9maWxlLT5pbmNsdWRlYmFja3VwID0gKGlzc2V0KCRfUkVRVUVTVFsiaW5jbHVkZWJhY2t1cCJdKSkgPyAkX1JFUVVFU1RbImluY2x1ZGViYWNrdXAiXSA6ICRlZGl0cHJvZmlsZS0+aW5jbHVkZWJhY2t1cDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJLy8gSWYgd2UgaGF2ZSBwcm9wZXIgc2VjdXJpdHkgcmlnaHRzLCBlZGl0IHRoZXNlIGNvcmUgdmFsdWVzLgoJaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgJHNlc3Npb24tPmNhbkFkZFByb2ZpbGVzKCkpICB7CgkJaWYgKGdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIHsKCQkJLy8gV2UncmUgZ29ubmEgaGF2ZSBzb21lIHNsYXNoZXMhCgkJCWlmIChpc3NldCgkX1JFUVVFU1RbImxvZ2ZpbGVmdWxscGF0aCJdKSkgeyRfUkVRVUVTVFsibG9nZmlsZWZ1bGxwYXRoIl0gPSBzdHJpcHNsYXNoZXMoJF9SRVFVRVNUWyJsb2dmaWxlZnVsbHBhdGgiXSk7IH0KCQl9CgkJCgkJJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSA9IChpc3NldCgkX1JFUVVFU1RbIm5ld2NvbmZuYW1lIl0pKSA/ICRfUkVRVUVTVFsibmV3Y29uZm5hbWUiXSA6ICRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWU7CgkJJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgPSAoaXNzZXQoJF9SRVFVRVNUWyJ0YWJsZW5hbWUiXSkpID8gJF9SRVFVRVNUWyJ0YWJsZW5hbWUiXSA6ICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lOwoJCSRlZGl0cHJvZmlsZS0+bG9nZmlsZWZ1bGxwYXRoID0gKGlzc2V0KCRfUkVRVUVTVFsibG9nZmlsZWZ1bGxwYXRoIl0pKSA/IHN0cl9yZXBsYWNlKCJcXCIsICcvJywgJF9SRVFVRVNUWyJsb2dmaWxlZnVsbHBhdGgiXSkgOiAkZWRpdHByb2ZpbGUtPmxvZ2ZpbGVmdWxscGF0aDsKCX0KCQoJLy8gQ2hlY2sgYW5kIHNlZSBpZiB2YXJpYWJsZXMgYXJlIGNvcnJlY3RseSBzZXQgdG8gc2F2ZS4uLgoJJGNhbnNhdmUgPSB0cnVlOwkKCWlmICghJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSkgewoJCSRzYXZlZCAuPSAiPGZvbnQgY29sb3I9XCJyZWRcIj4iLl9OT19QUk9GSUxFX05BTUVfRU5URVJFRC4iPC9mb250Pjxicj4iOwoJCSRjYW5zYXZlID0gZmFsc2U7CgkJJHNhdmVlcnJvciA9IHRydWU7CgkJJGVkaXQ9MTsKCX0KCgkKICAgIGlmICghJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgJiYgJGNvbmYhPSJuZXdjbmYiKSB7CgkJJHNhdmVkIC49ICI8Zm9udCBjb2xvcj1cInJlZFwiPiIuX05PX01ZU1FMX1RBQkxFX0VOVEVSRUQuIjwvZm9udD48YnI+IjsKCQkkY2Fuc2F2ZSA9IGZhbHNlOwoJCSRzYXZlZXJyb3IgPSB0cnVlOwoJCSRlZGl0PTE7Cgl9CiAgICAKICAgIAoJaWYgKCRjb25mPT0ibmV3Y25mIiB8fCAkbmV3PT0xKSB7CgkJJGNoZWNrbGltaXRzID0gIlNlbGVjdCBwcm9maWxlbmFtZSBmcm9tICIuVEJMX1BST0ZJTEVTOwoJCSRjaGVja2xpbWl0c3Jlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkY2hlY2tsaW1pdHMpIG9yIGRpZShfQ09VTEROVF9RVUVSWV9QUk9GSUxFUy4iLiAiIC4gJGRiLT5FcnJvck1zZygpKTsKCQlpZiAoZGVmaW5lZCgiX0xJTUlUX1BST0ZJTEVTIikgIT0gMCkgewoJCQkgIGlmICgkY2hlY2tsaW1pdHNyZXN1bHQtPlJlY29yZENvdW50KCkgPiBfTElNSVRfUFJPRklMRVMpIHsKCQkJCSAgJHNhdmVkIC49ICI8Zm9udCBjb2xvcj1cInJlZFwiPiIuX1RPT19NQU5ZX1BST0ZJTEVTLiI8L2ZvbnQ+PGJyPiI7CgkJCQkgICRjYW5zYXZlID0gZmFsc2U7CgkJCQkgICRzYXZlZXJyb3IgPSB0cnVlOwoJCQkJICAkZWRpdD0xOyAgICAgICAgICAgIAoJCQkgIH0KCQl9Cgl9CQkKCQoJaWYgKGRlZmluZWQoIl9FTkFCTEVfSU1QT1JUQU5UX1BBUkFNRVRFUl9FRElUT1JfIikpIHsKICAJJGltcG9ydGFudF9wYXJhbV9jb3VudCA9ICRfUkVRVUVTVFsiaW1wb3J0YW50cGFyYW1wYWdlY291bnQiXTsKICAJZm9yICgkcGFyYW1fbG9vcCA9IDA7ICRwYXJhbV9sb29wIDwgJGltcG9ydGFudF9wYXJhbV9jb3VudDsgJHBhcmFtX2xvb3AgKyspIHsKICAJCXVuc2V0KCR0aGlzcGFyYW0pOwogIAkJJHRoaXNwYXJhbSA9IGZhbHNlOwogIAkJaWYgKCgkX1JFUVVFU1RbInBhcmFtaWRfIi4kcGFyYW1fbG9vcF0pICYmICgkcGFyYW1fbG9vcCA8ICRlZGl0cHJvZmlsZS0+Z2V0VXJsUGFyYW1Db3VudCgpKSkgewogIAkJCS8vIEl0J3MgYW4gZXhpc3Rpbmcgb25lLgogIAkJCSR0aGlzcGFyYW0gPSYgJGVkaXRwcm9maWxlLT5nZXRVcmxQYXJhbUJ5SW5kZXgoJHBhcmFtX2xvb3ApOwogIAkJCSR0aGlzcGFyYW1bInBhcmFtaWQiXSA9ICRfUkVRVUVTVFsicGFyYW1pZF8iLiRwYXJhbV9sb29wXTsKICAJCX0gZWxzZSB7CiAgCQkJaWYgKCRfUkVRVUVTVFsicGFyYW11cmxfIi4kcGFyYW1fbG9vcF0gPiAiIikgewogIAkJCQkkdGhpc3BhcmFtID0mICRlZGl0cHJvZmlsZS0+Z2V0VXJsUGFyYW1OZXcoKTsKICAJCQl9CiAgCQl9CiAgCQlpZiAoJHRoaXNwYXJhbSkgewogIAkJCSR0aGlzcGFyYW1bImZpbGVuYW1lIl0gPSAkX1JFUVVFU1RbInBhcmFtdXJsXyIuJHBhcmFtX2xvb3BdOwogIAkJCSR0aGlzcGFyYW1bImltcG9ydGFudHBhcmFtcyJdID0gJF9SRVFVRVNUWyJwYXJhbW5hbWVzXyIuJHBhcmFtX2xvb3BdOwogIAkJfQogIAl9CiAgCQogIAkkaW1wb3J0YW50X3BhcmFtX2NvdW50ID0gJF9SRVFVRVNUWyJpbXBvcnRhbnRwYXJhbXBhZ2Vjb3VudCJdOwogIAlmb3IgKCRwYXJhbV9sb29wID0gMDsgJHBhcmFtX2xvb3AgPCAkaW1wb3J0YW50X3BhcmFtX2NvdW50OyAkcGFyYW1fbG9vcCArKykgewogIAkJaWYgKEAkX1JFUVVFU1RbIkRlbGV0ZVBhcmFtXyIgLiAkcGFyYW1fbG9vcF0pIHsKICAJCQkkZWRpdHByb2ZpbGUtPmRlbGV0ZVVybFBhcmFtcygkcGFyYW1fbG9vcCk7CiAgCQl9CiAgCX0KICB9CQoJaWYgKCRjYW5zYXZlKSB7CgoJCSRlZGl0cHJvZmlsZS0+ZGllb25zcWxlcnJvciA9IGZhbHNlOwoJCSRlZGl0cHJvZmlsZS0+U2F2ZSgpOwogICAgICAgIGlmICgkdmFsaWRVc2VyUmVxdWlyZWQpIHsKICAgICAgICBpZiAoJHNlc3Npb24tPmNhbkFkZFByb2ZpbGVzKCkgJiYgISRzZXNzaW9uLT5pc0FkbWluKCkpIHsKICAgICAgICAgICAgLy9lY2hvICJBZGRpbmcgcHJvZmlsZSB0byB1c2VyIGFjY291bnQiOwogICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBjYW4gYWRkIHByb2ZpbGVzLCBoZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgbWFuYWdlciBhcyB3ZWxsCiAgICAgICAgICAgICRzZXNzaW9uLT51c2VyX3Byb2ZpbGVzW2NvdW50KCRzZXNzaW9uLT51c2VyX3Byb2ZpbGVzKV09JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTsKICAgICAgICAgICAgJGRiLT5FeGVjdXRlKCJVUERBVEUgIi5UQkxfVVNFUlMuIiBTRVQgUFJPRklMRVM9Y29uY2F0KFBST0ZJTEVTLCcsJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZScpIFdIRVJFIHVzZXJuYW1lID0gJyRzZXNzaW9uLT51c2VybmFtZScgIik7CiAgICAgICAgICAgIC8vZWNobyAiVVBEQVRFIF9sb2dhaG9saWNfdXNlcnMgU0VUIFBST0ZJTEVTPWNvbmNhdChQUk9GSUxFUywnLCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUnKSBXSEVSRSB1c2VybmFtZSA9ICckc2Vzc2lvbi0+dXNlcm5hbWUnICI7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgfQoJCS8qIHdlIGRvbid0IGRvIHRoaXMgYW55bW9yZSAqLwogICAgICAgIC8qCgkJaWYgKCRlZGl0cHJvZmlsZS0+dHJhY2tlcm1vZGU9PTEpIHsKICAgICAgICAgICAgJHRyZWFsX3BhdGggPSByZWFscGF0aCgiaW5kZXgucGhwIik7CiAgICAgICAgICAgICR0cGF0aCA9IGRpcm5hbWUoJHRyZWFsX3BhdGgpOwogICAgICAgICAgICAkdHJhY2tlcl9sb2dmaWxlPSR0cGF0aC4iL2ZpbGVzLyIuJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iLmxvZyI7CiAgICAgICAgICAgICR0aGFuZGxlID0gZm9wZW4gKCR0cmFja2VyX2xvZ2ZpbGUsICJhIik7CiAgICAgICAgICAgIC8vZndyaXRlKCR0aGFuZGxlLCIjIExvZ2ZpbGUgY3JlYXRlZCBieSBMb2dhaG9saWMgV2ViIEFuYWx5dGljcyAtIHd3dy5sb2dhaG9saWMuY29tXG4iKTsKICAgICAgICAgICAgZmNsb3NlKCR0aGFuZGxlKTsKICAgICAgICAgICAgQGNobW9kKCR0cmFja2VyX2xvZ2ZpbGUsIDA2NjYpOwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIAogICAgaWYgKCRlZGl0cHJvZmlsZS0+bGFzdHNxbGVycm9yKSB7CgkJCSRzYXZlZCAuPSAiPGZvbnQgY29sb3I9XCJyZWRcIj4iLiRlZGl0cHJvZmlsZS0+bGFzdHNxbGVycm9yLiI8L2ZvbnQ+PGJyPiI7CgkJCSRlZGl0PTE7CgkJCSRzYXZlZXJyb3IgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCSRzYXZlZCAuPSBfUFJPRklMRV9DT05GX1NBVkVELiIuPGJyPiI7CgkJCXVuc2V0KCRlZGl0KTsKCQkJdW5zZXQoJG5ldyk7CgkJfQoJCWlmICgkdmlzaXRvcmlkZW50bWV0aG9kc3dpdGNoZWQpIHsKCQkJLy8gV2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgY3VycmVudCB2aXNpdG9yIGlkZW50aWZpY2F0aW9uIG1ldGhvZC4KCQl9Cgl9Cn0KCgppZiAoaXNzZXQoJGluc3RhbGwpICYmICgkaW5zdGFsbD09MSkgJiYgKCEkc2F2ZWVycm9yKSkgewogICAgaWYgKCRxID0gQCRkYi0+RXhlY3V0ZSgic2VsZWN0ICogZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSBsaW1pdCAxIikpIHsKICAgICAgICAkY2hrPSRxLT5GZXRjaFJvdygpOwogICAgICAgIC8vJHNhdmVkPSRzYXZlZC4iTXlzcWwgVGFibGUgPGI+JGVkaXRwcm9maWxlLT50YWJsZW5hbWU8L2I+IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZyBDUkVBVEUuPGJyPiI7CiAgICB9IGVsc2UgewogICAgICAgIGNyZWF0ZURhdGFUYWJsZSgkZWRpdHByb2ZpbGUpOwogICAgICAgICRzYXZlZD0kc2F2ZWQuIkNyZWF0ZWQgdGFibGVzIGZvciA8Yj4kZWRpdHByb2ZpbGUtPnRhYmxlbmFtZTwvYj4gaW4gZGF0YWJhc2UgPGI+JERhdGFiYXNlTmFtZTwvYj48YnI+IjsgLy9IRUxQIQogICAgfQogICAgCiAgICAkc3RlcD01OwogICAgJGNvbmY9JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTsKICAgIGhlYWRlcigibG9jYXRpb246IGluc3RhbGwucGhwP3N0ZXA9NSZjb25mPSIudXJsZW5jb2RlKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUpLiImc2F2ZWQ9Ii51cmxlbmNvZGUoJHNhdmVkKSk7CiAgICBleGl0KCk7Cn0KCmlmICgkYmFja3VwID09IDIpIHsKCS8vIEV4cG9ydCB0aGUgLmd6aXBwZWQgYmFja3VwIGZpbGUuCiAgICBzZXRfdGltZV9saW1pdCg4NjQwMCk7CiAgICAKICAgICRyZWFsX3BhdGggPSByZWFscGF0aCgiaW5kZXgucGhwIik7CiAgICAkcGF0aCA9IGRpcm5hbWUoJHJlYWxfcGF0aCk7CiAgICAkcGF0aCA9IHN0cl9yZXBsYWNlICgiXFwiLCAiLyIsICRwYXRoKTsKICAgIAogICAgCiAgICBpZiAoQCR1cGdyYWRlIT0idHJ1ZSIpIHsKCSAgICAvLyAkcT0kZGItPkV4ZWN1dGUoInNlbGVjdCB0aW1lc3RhbXAsIHYuaXBudW1iZXIgYXMgaXBudW1iZXIsdS51cmwgYXMgdXJsLHVwLnBhcmFtcyBhcyBwYXJhbXMsc3RhdHVzLGJ5dGVzLHIucmVmZXJyZXIgYXMgcmVmZXJyZXIscnAucGFyYW1zIGFzIHJlZnBhcmFtcywgQUdFTlRTLm5hbWUgdXNlcmFnZW50IGZyb20KCQkvLyAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSBhcyBhLCAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92aXNpdG9yaWRzIGFzIHYsICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3VybHMgYXMgdSwkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91cmxwYXJhbXMgYXMgdXAsICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3JlZmVycmVycyBhcyByLCAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9yZWZwYXJhbXMgYXMgcnAsICIuVEJMX1VTRVJfQUdFTlRTLiIgYXMgQUdFTlRTIHdoZXJlIHRpbWVzdGFtcCA+PSAkZnJvbSBhbmQgdGltZXN0YW1wIDw9ICR0byBhbmQgKGEudmlzaXRvcmlkPXYuaWQgYW5kIGEudXJsPXUuaWQgYW5kIGEucGFyYW1zPXVwLmlkIGFuZCBhLnJlZmVycmVyPXIuaWQgYW5kIGEucmVmcGFyYW1zPXJwLmlkIGFuZCBhLnVzZXJhZ2VudGlkID0gQUdFTlRTLmlkKSBvcmRlciBieSB0aW1lc3RhbXAiKTsKCQkkcSA9ICRkYi0+RXhlY3V0ZSgiU0VMRUNUIGEudGltZXN0YW1wLCB2LmlwbnVtYmVyIEFTIGlwbnVtYmVyLCB1LnVybCBBUyB1cmwsIHVwLnBhcmFtcyBBUyBwYXJhbXMsIGEuc3RhdHVzLCBhLmJ5dGVzLCByLnJlZmVycmVyIEFTIHJlZmVycmVyLCBycC5wYXJhbXMgQVMgcmVmcGFyYW1zLCBiLnVzZXJhZ2VudCBBUyB1c2VyYWdlbnQgRlJPTQoJCXskZWRpdHByb2ZpbGUtPnRhYmxlbmFtZX0gYXMgYSwgeyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3Zpc2l0b3JpZHN9IEFTIHYsIHskZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91cmxzfSBBUyB1LCB7JGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdXJscGFyYW1zfSBBUyB1cCwgeyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3JlZmVycmVyc30gQVMgciwgeyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3JlZnBhcmFtc30gQVMgcnAsIHskZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91c2VyYWdlbnRzfSBBUyBiIFdIRVJFIGEudGltZXN0YW1wID49IHskZnJvbX0gYW5kIGEudGltZXN0YW1wIDw9IHskdG99IEFORCAoYS52aXNpdG9yaWQgPSB2LmlkIEFORCBhLnVybCA9IHUuaWQgQU5EIGEucGFyYW1zID0gdXAuaWQgQU5EIGEucmVmZXJyZXIgPSByLmlkIEFORCBhLnJlZnBhcmFtcyA9IHJwLmlkIEFORCBhLnVzZXJhZ2VudGlkID0gYi5pZCkgT1JERVIgQlkgYS50aW1lc3RhbXAiKTsKCQkKICAgICAgICBpZiAoJG1vZGU9PSJjc3YiKSB7CiAgICAgICAgICAgICRidXBmaWxlPSRwYXRoIC4gIi9maWxlcy8kY3VycHJvZmlsZW5hbWUuIi4gZGF0ZSgiWW1kIiwkZnJvbSkgLiBkYXRlKCItWW1kIiwkdG8pIC4gIi5jc3YuZ3oiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRidXBmaWxlPSRwYXRoIC4gIi9maWxlcy8kY3VycHJvZmlsZW5hbWUuIi4gZGF0ZSgiWW1kIiwkZnJvbSkgLiBkYXRlKCItWW1kIiwkdG8pIC4gIi5sb2cuZ3oiOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLy8gJHE9JGRiLT5FeGVjdXRlKCJzZWxlY3QgJGVkaXRwcm9maWxlLT50YWJsZW5hbWUuKiwgQUdFTlRTLm5hbWUgdXNlcmFnZW50IGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgbGVmdCBvdXRlciBqb2luICIuVEJMX1VTRVJfQUdFTlRTLiIgQUdFTlRTIG9uICh1c2VyYWdlbnRpZCA9IEFHRU5UUy5pZCkgb3JkZXIgYnkgdGltZXN0YW1wIik7CgkJJHEgPSAkZGItPkV4ZWN1dGUoIlNFTEVDVCB7JGVkaXRwcm9maWxlLT50YWJsZW5hbWV9LiosIGIudXNlcmFnZW50IEFTIHVzZXJhZ2VudCBGUk9NIHskZWRpdHByb2ZpbGUtPnRhYmxlbmFtZX0gQVMgYSwgeyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3VzZXJhZ2VudH0gQVMgYiBPTiAoYS51c2VyYWdlbnRpZCA9IGIuaWQpIE9SREVSIEJZIHRpbWVzdGFtcCIpOwoJCQogICAgICAgICRidXBmaWxlPSRwYXRoIC4gIi9maWxlcy8kY3VycHJvZmlsZW5hbWUuYmFja3VwLmxvZy5neiI7ICAKICAgIH0gICAKICAgICAKICAgIAogICAgLy8kZ2ZpbGU9ZXhlYygicHdkIikgLiAiL2ZpbGVzL2dsb2JhbC5waHAiOwogICAgJGZwID0gZ3pvcGVuICgkYnVwZmlsZSwidyIpOwogICAgaWYgKCRtb2RlPT0iY3N2IikgewogICAgICAgIC8vIHdyaXRlIGEgaGVhZHJlIHJvdwogICAgICAgICRidWZmZXI9ICJcIklQIG51bWJlclwiLFwiRGF0ZVwiLFwiVVJMXCIsXCJTdGF0dXNcIixcIkJ5dGVzXCIsXCJSZWZlcnJlclwiLFwiVXNlcmFnZW50XCJcbiI7IC8vSEVMUCEKICAgICAgICAvL2VjaG8gJGJ1ZmZlcjsKICAgICAgICBnendyaXRlICgkZnAsICRidWZmZXIpOwogICAgfQogICAgd2hpbGUgKCRkYXRhPSRxLT5GZXRjaFJvdygpKSB7CiAgICAgICAgaWYgKCRkYXRhWyJyZWZwYXJhbXMiXT09Ij8iKSB7CiAgICAgICAgICAgICRkYXRhWyJyZWZwYXJhbXMiXT0iIjsKICAgICAgICB9CiAgICAgICAgJGRhdGU9ZGF0ZSgiW2QvTS9ZOkg6aTpzICswMDAwXSIsJGRhdGFbInRpbWVzdGFtcCJdKTsKICAgICAgICBpZiAoJG1vZGU9PSJjc3YiKSB7CiAgICAgICAgICAgICRidWZmZXI9ICJcIiRkYXRhW2lwbnVtYmVyXVwiLFwiJGRhdGVcIixcIiIuJGRhdGFbInVybCJdLiRkYXRhWyJwYXJhbXMiXS4iXCIsXCIkZGF0YVtzdGF0dXNdXCIsXCIkZGF0YVtieXRlc11cIixcIiIuJGRhdGFbInJlZmVycmVyIl0uJGRhdGFbInJlZnBhcmFtcyJdLiJcIixcIiIuJGRhdGFbInVzZXJhZ2VudCJdLiJcIlxuIjsgCiAgICAgICAgICAgIAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgJGJ1ZmZlcj0gIiRkYXRhW2lwbnVtYmVyXSAtIC0gJGRhdGUgXCJHRVQgIi4kZGF0YVsidXJsIl0uJGRhdGFbInBhcmFtcyJdLiIgSFRUUC8xLjFcIiAiLiRkYXRhWyJzdGF0dXMiXS4iICIuJGRhdGFbImJ5dGVzIl0uIiBcIiIuJGRhdGFbInJlZmVycmVyIl0uJGRhdGFbInJlZnBhcmFtcyJdLiJcIiBcIiIuJGRhdGFbInVzZXJhZ2VudCJdLiJcIlxuIjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9lY2hvICRidWZmZXI7CiAgICAgICAgZ3p3cml0ZSAoJGZwLCAkYnVmZmVyKTsKICAgIH0KICAgIGd6Y2xvc2UgKCRmcCk7CiAgICBpZiAoQCR1cGdyYWRlIT0idHJ1ZSIpIHsgCiAgICAgICAgaWYgKCRtb2RlPT0iY3N2IikgewogICAgICAgICAgICBlY2hvICI8UD48bGk+ICIuX09LX0NTVl9GSUxFX1dSSVRURU5fSU4uIiA8Yj4kYnVwZmlsZTwvYj4uPC9QPjxQPiIuX1BMRUFTRV9ET1dOTE9BRF9OT1cuIjo8YnI+IDxiPjxhIGhyZWY9XCJmaWxlcy8kY3VycHJvZmlsZW5hbWUuIi4gZGF0ZSgiWW1kIiwkZnJvbSkgLiBkYXRlKCItWW1kIiwkdG8pIC4gIi5jc3YuZ3pcIj4gZmlsZXMvJGN1cnByb2ZpbGVuYW1lLiIuIGRhdGUoIlltZCIsJGZyb20pIC4gZGF0ZSgiLVltZCIsJHRvKSAuICIubG9nLmd6IDwvYT48L2I+PHVsPjxsaT5UaGUgZmlyc3Qgcm93IGluIHRoaXMgZmlsZSBjb250YWlucyB0aGUgY29sdW1uIG5hbWVzPC9saT48bGk+RmllbGRzIGluIHRoaXMgQ1NWIGZpbGUgYXJlIHNwZXJhdGVkIGJ5IGEgY29tbWE8L2xpPjxsaT5BbGwgZmllbGRzIGFyZSBlbmNsb3NlZCBpbiBcIiBcIiBkb3VibGUgcXVvdGVzLjwvbGk+PC91bD48L3A+IjsgLy9IRUxQIQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjxQPjxsaT4gT0ssIGxvZyBmaWxlIHdyaXR0ZW4uIFBsZWFzZSBkb3dubG9hZCBub3c6PGJyPiA8Yj48YSBocmVmPVwiZmlsZXMvJGN1cnByb2ZpbGVuYW1lLiIuIGRhdGUoIlltZCIsJGZyb20pIC4gZGF0ZSgiLVltZCIsJHRvKSAuICIubG9nLmd6XCI+IGZpbGVzLyRjdXJwcm9maWxlbmFtZS4iLiBkYXRlKCJZbWQiLCRmcm9tKSAuIGRhdGUoIi1ZbWQiLCR0bykgLiAiLmxvZy5neiA8L2E+PC9iPjxQPiI7ICAgIAogICAgICAgIH0KICAgICAgICBlY2hvICI8UD5XZSByZWNvbW1lbmQgdG8gcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIHNlcnZlciBvbmNlIHlvdSBoYXZlIGRvd25sb2FkZWQgaXQuPFA+IjsKICAgIAogICAgfSBlbHNlIHsgCiAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSIpOwogICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdnBkIik7CiAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92cG0iKTsKICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2RhaWx5dXJscyIpOyAKICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2NvbnZlcnNpb25zIik7CiAgICAgICAgY3JlYXRlRGF0YVRhYmxlKCRlZGl0cHJvZmlsZSk7CiAgICAgICAgZWNobyAiT0ssIGxvZyBmaWxlIHdyaXR0ZW4gdG8gJGJ1cGZpbGUuPFA+IDxhIGhyZWY9XCJ1cGRhdGUucGhwP2NvbmY9JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSZ1cGdyYWRlPSRidXBmaWxlXCI+Q2xpY2sgaGVyZSB0byBjb250aW51ZSB1cGdyYWRlPC9hPi4gKEltcG9ydHMgeW91IG9sZCBsb2cgZGF0YSBiYWNrIGludG8gdGhlIG5ldyBkYXRhYmFzZSBzdHVjdHVyZSk8UD5XaGVuIHRoYXQgaXMgZG9uZSwgeW91IGNhbiBzYWZlbHkgcmVtb3ZlIG9yIGFyY2hpdmUgdGhlIGZpbGU6ICRidXBmaWxlIjsKICAgIH0gCiAgICBleGl0KCk7Cn0KCmlmIChpc3NldCgkc2V0X3Byb2ZpbGVfc3RydWN0dXJlX3ZlcnNpb24pKSB7CiAgICBpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CiAgICAgICAgaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5pc0FkbWluKCkpIHsKICAgICAgICAgICAgZWNob1dhcm5pbmcoIk1hbnVhbGx5IGNoYW5nZWQgdGhpcyBwcm9maWxlJ3Mgc3RydWN0dXJlIHZlcnNpb24gdG8gZnJvbSAkZWRpdHByb2ZpbGUtPnN0cnVjdHVyZV92ZXJzaW9uIHRvICRzZXRfcHJvZmlsZV9zdHJ1Y3R1cmVfdmVyc2lvbiIpOwogICAgICAgICAgICAkZWRpdHByb2ZpbGUtPnN0cnVjdHVyZV92ZXJzaW9uID0gJHNldF9wcm9maWxlX3N0cnVjdHVyZV92ZXJzaW9uOwogICAgICAgICAgICAkZWRpdHByb2ZpbGUtPlNhdmUoKTsKICAgICAgICAgICAgLy8gbm93IHdlIGhhdmUgdG8gcmVsb2FkIHRoZSBwcm9maWxlIChhbHNvIHRoZSAkcHJvZmlsZSBvbmUgd2hpY2ggaXMgY3JlYXRlZCBpbiBjb21tb24gYW5kIHVzZWQgaW4gdG9wIHRvIGNoZWNrIHZlcnNpb25zISkKICAgICAgICAgICAgJGVkaXRwcm9maWxlLT5Mb2FkKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUpOwogICAgICAgICAgICAkcHJvZmlsZS0+TG9hZCgkcHJvZmlsZS0+cHJvZmlsZW5hbWUpOyAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvV2FybmluZyhfU09SUllfTk9fUEVSTUlTU0lPTlMpOwogICAgICAgIH0gICAgICAgICAgICAKICAgIH0KfQoKaW5jbHVkZSAidG9wLnBocCI7CgppZiAoaXNzZXQoJF9SRVFVRVNUWydhcmNoaXZldGFibGUnXSkpIHsKICAgIGluY2x1ZGUgImluY2x1ZGVzL2FyY2hpdmV0YWJsZS5waHAiOwp9CgovLyBObyByaWdodHMgdG8gY3JlYXRlIGEgbmV3IG9uZT8gIFR1cm4gb2ZmIHRoZSAiTmV3IiBmbGFnCmlmICgkdmFsaWRVc2VyUmVxdWlyZWQgJiYgKCEkc2Vzc2lvbi0+aXNBZG1pbigpICYmICEkc2Vzc2lvbi0+Y2FuQWRkUHJvZmlsZXMoKSkpIHsKCXVuc2V0KCRuZXcpOwp9CgppZiAoKGlzc2V0KCRzYXZlKSkgJiYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgJiYgKCEkc2F2ZWVycm9yKSkgewoJaWYgKCRxID0gQCRkYi0+RXhlY3V0ZSgic2VsZWN0ICogZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSBsaW1pdCAxIikpIHsKCQkkY2hrPSRxLT5GZXRjaFJvdygpOwogICAgICAgIGNyZWF0ZURhdGFUYWJsZSgkZWRpdHByb2ZpbGUpOyAKCQkvLyRzYXZlZD0kc2F2ZWQuIk15c3FsIFRhYmxlIDxiPiRlZGl0cHJvZmlsZS0+dGFibGVuYW1lPC9iPiBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgQ1JFQVRFLjxicj4iOwoJfSBlbHNlIHsKCQljcmVhdGVEYXRhVGFibGUoJGVkaXRwcm9maWxlKTsKCQkkc2F2ZWQ9JHNhdmVkLiJDcmVhdGVkIHRhYmxlcyBmb3IgPGI+JGVkaXRwcm9maWxlLT50YWJsZW5hbWU8L2I+IGluIGRhdGFiYXNlIDxiPiREYXRhYmFzZU5hbWU8L2I+PGJyPiI7ICAKCX0KCQoJLy8gR2V0IFRoZSB1c2VycyBmYWNlYm9vayBJRCBhbmQgVE9LRU4KCWlmKCFlbXB0eSgkZWRpdHByb2ZpbGUtPmZhY2Vib29rbG9naW4pICYmIGdldFByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUuImZhY2Vib29rQXBpIi4kZWRpdHByb2ZpbGUtPmZhY2Vib29rbG9naW4gLCBmYWxzZSApID09IGZhbHNlKXsKCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiJmYWNlYm9va0FwaSUiKTsKCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiJmYWNlYm9va0FwaUZvcm0iKTsKCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiJmYWNlYm9va0FwcEZvcm0iKTsKCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiJmYWNlYm9va1BhZ2VGb3JtIik7CgkJJHNhdmVkLj0iPGRpdiBpZD0nZmFjZWJvb2tfZmVlZGJhY2snPjwvZGl2PiI7CgkJJHNhdmVkLj0gIjxzY3JpcHQgc3JjPSdodHRwOi8vZmFjZWJvb2subG9nYWhvbGljLmNvbS9mYWNlYm9va19hY2Nlc3MucGhwP2VtYWlsPXskZWRpdHByb2ZpbGUtPmZhY2Vib29rbG9naW59JmNvbmY9eyRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWV9Jz48L3NjcmlwdD4iOwoJfQp9CiRzdGFydD1nZXRtaWNyb3RpbWUoKTsKCmlmICghaXNzZXQoJGRlbCkpIHsKCSRkZWw9MDsgCn0KaWYgKCRkZWw9PTEpIHsKCSBpZiAoJGN1cnByb2ZpbGVuYW1lIT0iIikgewoJCWVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGI+Ii5fREFUQUJBU0VfTUFJTlRFTkFOQ0VfT1BUSU9OUy4iOiA8Zm9udCBjb2xvcj1yZWQ+JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTwvZm9udD48L2I+PHA+IjsKICAgICAgICBlY2hvICI8UD4iLl9QTEVBU0VfQ0hPT1NFX0FOX09QVElPTi4iOjxQPjx1bD4iOwogICAgICAgIC8vaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5jYW5FZGl0UHJvZmlsZXMoKSkgewogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuVXBkYXRlTG9ncygpKSB7ICAgICAgICAgICAgICAgICAgICAKCQkgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJmJhY2t1cD0xXCI+Ii5fQkFDS1VQX0VYUE9SVDsKCQkgICAgZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lJnJlc3RvcmVkZWZhdWx0ZGFzaGJvYXJkPTFcIj48Yj4iLiBfUkVTVE9SRV9ERUZBVUxUX0RBU0hCT0FSRCAuICI8L2I+PC9hPjxwPiI7CgkJICAgIGVjaG8gIjxsaT48YSBocmVmPVwiZ2V0X3JlcG9ydHMucGhwP2NvbmY9JGN1cnByb2ZpbGVuYW1lXCI+PGI+SW5zdGFsbCBSZXBvcnRzPC9iPjwvYT48cD4iOwoJCSAgICBlY2hvICI8bGk+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmZGVsPTVcIj4gIi5fREVMRVRFX0RBVEVfUkFOR0U7CiAgICAgICAgICAgIGVjaG8gIjxMST4gPGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmZGVsPTJcIiBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJyIuX0RFTEVURV9QUk9GSUxFX0FORF9EQVRBQkFTRV9BU1NVUkFOQ0UuIicpXCI+Ii5fREVMRVRFX1BST0ZJTEVfQU5EX0RBVEFCQVNFLiI8L2E+IDxQPiI7CiAgICAgICAgICAgIGVjaG8gIjxsaT4gPGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmZGVsPTRcIiBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJyIuX0RFTEVURV9EQVRBQkFTRV9BU1NVUkFOQ0UuIicpXCI+Ii5fREVMRVRFX0RBVEFCQVNFLiI8L2E+PHA+IjsKICAgICAgICAgICAgZWNobyAiPGxpPiA8YSBocmVmPVwicHJvZmlsZXMucGhwP2VkaXRjb25mPSRjdXJwcm9maWxlbmFtZSZkZWw9N1wiIG9uY2xpY2s9XCJyZXR1cm4gY29uZmlybSgnIi5fREVMRVRFX1NVTU1BUllfVEFCTEVTX0FTU1VSQU5DRS4iJylcIj4iLl9ERUxFVEVfU1VNTUFSWV9UQUJMRVMuIjwvYT48cD4iOwogICAgICAgICAgICBlY2hvICI8bGk+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmZGVsPThcIj4iLl9ERUxFVEVfQ0FDSEUuIjwvYT48cD48L3VsPiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuVXBkYXRlTG9ncygpKSB7IAogICAgICAgICAgICBlY2hvICI8bGk+PGI+Ii5fU1BFQ0lBTFRZX1VQREFURV9PUFRJT05TLiI8L2I+OjxQPjx1bD4iOwogICAgICAgICAgICBlY2hvICI8bGk+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmdXBkYXRlX2NvdW50cmllcz0xXCI+VXBkYXRlIENvdW50cnkgSW5mb3JtYXRpb24gaW4gRGF0YWJhc2U8L2E+PHA+IjsgCiAgICAgICAgICAgIGVjaG8gIjxsaT48YSBocmVmPVwicHJvZmlsZXMucGhwP2VkaXRjb25mPSRjdXJwcm9maWxlbmFtZSZkZWw9MTFcIj4gIi5fVVBEQVRFX1NVTU1BUllfVEFCTEVTX1dPVVRfQ0hFQ0tJTkcuIjwvYT48cD4iOwogICAgICAgICAgICBlY2hvICI8bGk+PGEgaHJlZj1cInVwZGF0ZS5waHA/Y29uZj0kY3VycHJvZmlsZW5hbWUmZm9yY2U9dHJ1ZVwiPiAiLl9VUERBVEVfU1RBVFNfV09VVF9EQVRFX1JBTkdFX0NIRUNLUy4iPC9hPjxwPiI7CiAgICAgICAgICAgIGVjaG8gIjxsaT48YSBocmVmPVwidXBkYXRlLnBocD9jb25mPSRjdXJwcm9maWxlbmFtZSZmb3JjZT10cnVlJm1vdmVkb25lPXRydWVcIiBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJyIuX01PVkVfVE9fRE9ORV9BU1NVUkFOQ0UuIicpXCI+Ii5fTU9WRV9UT19ET05FLiI8L2E+PHA+PC91bD4iOwogICAgICAgIH0KICAgICAgICBlY2hvICI8bGk+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmZWRpdD0xXCI+ICIuX0VESVRfUFJPRklMRS4iPC9hPjxQPiI7CgkJZWNobyAiPGxpPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JGN1cnByb2ZpbGVuYW1lXCI+IDxiPiIuX0NBTkNFTC4iPC9iPjwvYT48L3VsPiI7CiAgICAgICAgZWNobyAiPFA+IjsKICAgICAgICAKICAgICAgICBpZiAoISR2YWxpZFVzZXJSZXF1aXJlZCB8fCBAJHNlc3Npb24tPmNhbkFkZFByb2ZpbGVzKCkpIHsKICAgICAgICAgIGlmICgkcSA9IEAkZGItPkV4ZWN1dGUoIlNFTEVDVCB0YWJsZV9zY2hlbWEgXCJEYXRhIEJhc2UgTmFtZVwiLCB0YWJsZV9uYW1lLCBzdW0oIGRhdGFfbGVuZ3RoICsgaW5kZXhfbGVuZ3RoICkgLyAxMDI0IC8gMTAyNCBcIkRhdGEgQmFzZSBTaXplIGluIE1CXCIgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuVEFCTEVTIHdoZXJlIHRhYmxlX3NjaGVtYT0nJERhdGFiYXNlTmFtZScgYW5kICh0YWJsZV9uYW1lPSckZWRpdHByb2ZpbGUtPnRhYmxlbmFtZScgb3IgdGFibGVfbmFtZSBsaWtlICckZWRpdHByb2ZpbGUtPnRhYmxlbmFtZVxfJScpIEdST1VQIEJZIHRhYmxlX3NjaGVtYSIpKSB7CiAgICAgICAgICAgIAogICAgICAgICAgICAkY2hrPSRxLT5GZXRjaFJvdygpOwogICAgICAgICAgICAkaW5mbyA9IF9UT1RBTF9TSVpFX09GX1RISVNfUFJPRklMRS4iICIubnVtYmVyX2Zvcm1hdCgkY2hrWzJdLDApLiIgTUIuICI7CiAgICAgICAgICAgICRxID0gJGRiLT5FeGVjdXRlKCJzZWxlY3QgY291bnQoKikgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZSIpOwogICAgICAgICAgICAkY2hrPSRxLT5GZXRjaFJvdygpOwogICAgICAgICAgICAkaW5mby49IF9USEVSRV9BUkUuIiAkY2hrWzBdICIuX1JFQ09SRFNfSU5fTUFJTl9TUEFOTklORy4iICI7CiAgICAgICAgICAgICRxID0gJGRiLT5FeGVjdXRlKCJzZWxlY3QgdGltZXN0YW1wIGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgb3JkZXIgYnkgdGltZXN0YW1wIGFzYyBsaW1pdCAxIik7CiAgICAgICAgICAgICRjaGs9JHEtPkZldGNoUm93KCk7CiAgICAgICAgICAgICRmcm9tPSRjaGtbMF07CiAgICAgICAgICAgICRpbmZvLj0gZGF0ZSgiWS1tLWQiLCRjaGtbMF0pIC4gIiB0byAiOwogICAgICAgICAgICAkcSA9ICRkYi0+RXhlY3V0ZSgic2VsZWN0IHRpbWVzdGFtcCBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lIG9yZGVyIGJ5IHRpbWVzdGFtcCBkZXNjIGxpbWl0IDEiKTsKICAgICAgICAgICAgJGNoaz0kcS0+RmV0Y2hSb3coKTsKICAgICAgICAgICAgJHRvPSRjaGtbMF07CiAgICAgICAgICAgICRpbmZvLj0gZGF0ZSgiWS1tLWQsICBIOmk6cyIsJGNoa1swXSkgLiAiLiAoIi5fU0VFX01PUkVfU1RBVElTVElDU19CRUxPVy4iKTxicj48YnI+IjsKICAgICAgICAgICAgJGluZm8uPSAiUHJvZmlsZSBzdHVjdHVyZSB2ZXJzaW9uIGlzOiAkZWRpdHByb2ZpbGUtPnN0cnVjdHVyZV92ZXJzaW9uIjsKICAgICAgICAgICAgZWNob05vdGljZSgkaW5mbywid2lkdGg6NjQwcHg7Iik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuQWRkUHJvZmlsZXMoKSkgeyAKICAgICAgICAgICAgJHF1ZXJ5PSAiU0VMRUNUIHRhYmxlX25hbWUsIHRhYmxlX3Jvd3MsIHN1bSggZGF0YV9sZW5ndGggKyBpbmRleF9sZW5ndGggKSAvIDEwMjQgLyAxMDI0IFwiRGF0YSBCYXNlIFNpemUgaW4gTUJcIiAiOwogICAgICAgICAgICAvLyRxdWVyeSAuPSAiLCBjb25jYXQoXCI8YSBocmVmPXByb2ZpbGVzLnBocD9lZGl0Y29uZj0kY3VycHJvZmlsZW5hbWUmYXJjaGl2ZXRhYmxlPVwiLHRhYmxlX25hbWUsXCI+Q3JlYXRlIGFyY2hpdmU8L2E+XCIpIGFzIGFyY2hpdmUgIjsKICAgICAgICAgICAgJHF1ZXJ5IC49ICJGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5UQUJMRVMgd2hlcmUgdGFibGVfc2NoZW1hPSckRGF0YWJhc2VOYW1lJyBhbmQgKHRhYmxlX25hbWU9JyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lJyBvciB0YWJsZV9uYW1lIGxpa2UgJyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lXF8lJykgR1JPVVAgQlkgdGFibGVfbmFtZSI7CiAgICAgICAgICAgIC8vJHNob3dmaWVsZHM9InRhYmxlIG5hbWUsIi5fUkVDT1JEUy4iLCIuX1NJWkVJTk1CLiIsIEFyY2hpdmUiOwogICAgICAgICAgICAkc2hvd2ZpZWxkcz0idGFibGUgbmFtZSwiLl9SRUNPUkRTLiIsIi5fU0laRUlOTUI7CiAgICAgICAgICAgICRsYWJlbHM9X0RBVEFCQVNFX1NUQVRJU1RJQ1M7CiAgICAgICAgICAgIC8vJG1pbmk9MTsKICAgICAgICAgICAgZWNobyAiPHRhYmxlIHdpZHRoPTY0MD48dHI+PHRkPiI7CiAgICAgICAgICAgIEBTdGF0c1RhYmxlKCRmcm9tLCR0bywkc2hvd2ZpZWxkcywkbGFiZWxzLCRxdWVyeSwkZHJpbGxkb3duLCRmaWx0ZXIpOwogICAgICAgICAgICBlY2hvICI8L3RkPjwvdHI+PC90YWJsZT4iOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBlY2hvICI8L2Rpdj4iIDsKCQlleGl0KCk7CiAgICB9Cn0KCmlmICgkZGVsPT0yKSB7CglpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CiAgICAgICAgaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5jYW5FZGl0UHJvZmlsZXMoKSkgewogICAgICAgIAoJICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPWluZGVudGJvZHk+PGZvbnQgY29sb3I9cmVkPkxhc3QgQWN0aW9uOjwvZm9udD48YnI+PGk+IjsKCQkgICAgJHF1ZXJ5ID0gIkRlbGV0ZSBmcm9tICIuVEJMX1BST0ZJTEVTLiIgd2hlcmUgcHJvZmlsZWlkID0gIi4kZWRpdHByb2ZpbGUtPnByb2ZpbGVpZDsKCQkgICAgaWYgKCEkZGItPkV4ZWN1dGUoJHF1ZXJ5KSkgewoJCSAgICAgZGllKF9DT1VMRE5UX0RFTEVURV9QUk9GSUxFLiIgIiAuICRkYi0+RXJyb3JNc2coKSk7CgkJICAgIH0gZWxzZSB7CgkJCSAgICBlY2hvIF9ERUxFVEVEX1BST0ZJTEUuIjogPGI+Ii4kZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLiI8L2I+PGJyPiI7CgkJICAgIH0KCQkgICAgZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSk7CgkJICAgIGlmICghJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICIuJGVkaXRwcm9maWxlLT50YWJsZW5hbWUpKSB7CgkJCSAgICBlY2hvKCI8cD4iLl9DT1VMRE5UX0RST1BfVEFCTEUuIiAiLiRlZGl0cHJvZmlsZS0+dGFibGVuYW1lLiIsICIuJGRiLT5FcnJvck1zZygpLiI8L3A+Iik7CgkJICAgIH0gZWxzZSB7CgkJCSAgICBlY2hvIF9EUk9QUEVEX0RCX1RBQkxFUy4iOiA8Yj4iLiRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUuIjwvYj48YnI+IjsKCQkgICAgfQoJCSAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3ZwZCIpOwoJCSAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3ZwbSIpOwogICAgICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2RhaWx5dXJscyIpOyAKCQkgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9jb252ZXJzaW9ucyIpOwoJCSAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3VybHMiKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91cmxwYXJhbXMiKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9rZXl3b3JkcyIpOwogICAgICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3JlZmVycmVycyIpOwogICAgICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3JlZnBhcmFtcyIpOwogICAgICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3Nlc3Npb25pZHMiKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92aXNpdG9yaWRzIik7CiAgICAgICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfc2NyZWVucmVzIik7CiAgICAgICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfY29sb3JkZXB0aCIpOwogICAgICAgICAgICBAJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICIuJGVkaXRwcm9maWxlLT50YWJsZW5hbWUuIl90bGVuZ3RoIik7IC8vIHRoZXNlIGxhc3QgMiBhcmUgc2VtaSB0ZW1wb3JhcnkgdGFibGVzIHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBydW5uaW5nIFRvdGFsIER1cmF0aW9uIGFuZCBUaW1lb24gc2l0ZSBUb2RheSByZXBvcnRzLCBidXQgd2UnbGwgZGVsZXRlIHRoZW4gaGVyZSBqdXN0IGluIGNhc2UuCiAgICAgICAgICAgIEAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgIi4kZWRpdHByb2ZpbGUtPnRhYmxlbmFtZS4iX3ZsZW5ndGgiKTsKICAgICAgICAgICAgQCRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV90cmFja2VybG9nIik7CgkJICAgIAoJCSAgICBlY2hvIF9TVU1NQVJZX1RBQkxFU19EUk9QUEVELiIuPGJyPiIuX0RPTkUuIi48L2k+PC9kaXY+PGhyIG5vc2hhZGUgc2l6ZT0xPjxicj4iOwogICAgICAgICAgICBkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPiI7CiAgICAgICAgICAgIGVjaG9XYXJuaW5nKF9TT1JSWV9OT19QRVJNSVNTSU9OUyk7CiAgICAgICAgICAgIGVjaG8gIjxQPiZuYnNwOzwvUD48L2Rpdj4iOwogICAgICAgIH0gCgl9Cn0KCmlmICgkZGVsPT0zKSB7CgkgaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewoJCSAkcXVlcnkgPSAiRGVsZXRlIGZyb20gIi5UQkxfUFJPRklMRVMuIiB3aGVyZSBwcm9maWxlaWQgPSAiLiRlZGl0cHJvZmlsZS0+cHJvZmlsZWlkOwoJCSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KSBvciBkaWUoIkNvdWxkbid0IGRlbGV0ZSBwcm9maWxlLiAiIC4gJGRiLT5FcnJvck1zZygpKTsKCQkgZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSk7CgkJIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGZvbnQgY29sb3I9cmVkPiIuX0xBU1RfQUNUSU9OLiI6PC9mb250Pjxicj4iLl9ERUxFVEVEX1BST0ZJTEUuIjogPGI+JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTwvYj48YnI+Ii5fUExFQVNFX0RST1BfREJfVEFCTEVTLiIgPGI+JyRlZGl0cHJvZmlsZS0+dGFibGVuYW1lJzwvYj4gIi5fTUFOVUFMTFlfT1JfS0VFUF9JVC4iPC9pPjwvZGl2PjxociBub3NoYWRlIHNpemU9MT48YnI+IjsKICAgICAgICAgZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSk7IAoJIH0KfQoKaWYgKCRkZWw9PTQpIHsKCWlmICgkZWRpdHByb2ZpbGUtPnByb2ZpbGVsb2FkZWQpIHsKICAgICAgICBpZiAoISR2YWxpZFVzZXJSZXF1aXJlZCB8fCBAJHNlc3Npb24tPmNhbkVkaXRQcm9maWxlcygpKSB7CgkJCiAgICAgICAgICAgIGRlbGV0ZURhdGFUYWJsZSgkZWRpdHByb2ZpbGUpOyAKICAgICAgICAKCQkgICAgY3JlYXRlRGF0YVRhYmxlKCRlZGl0cHJvZmlsZSk7CgkJCiAgCSAgICAgICAgLy8gZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSk7CgkJCQoJCQlkZWxldGVQcm9maWxlRGF0YSgkZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lLCAiY2FjaGVcXyUiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgJGVkaXRwcm9maWxlLT50YWJsZW5hbWUuIiVcX2NhY2hlYXJyYXkiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZS4iLmNhY2hlXF8lIik7CgkJCWRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUuImNhY2hlX3RyYWlsIik7CgkJCWRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICJsYXN0bG9ncG9zLiUiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgImZpcnN0bG9nbGluZS4lIik7CgkJCWRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICIxc3Rsb2dsaW5lLiUiKTsKCQkJZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSwgImxhc3Rrbm93bnBvcy4lIik7CiAgCQoJCSAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPjxmb250IGNvbG9yPXJlZD4iLl9MQVNUX0FDVElPTi4iOjwvZm9udD48YnI+PGk+Ii5fREVMRVRFRF9EQl9UQUJMRVMuIiA8Yj4nJGVkaXRwcm9maWxlLT50YWJsZW5hbWUnPC9iPiAiLl9BTkRfU1VNTUFSSUVTX1BST0ZJTEVfU0FWRUQuIjwvaT48L2Rpdj48aHIgbm9zaGFkZSBzaXplPTE+PGJyPiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyAiPGRpdiBjbGFzcz1cImluZGVudGJvZHlcIj4iOwogICAgICAgICAgICBlY2hvV2FybmluZyhfU09SUllfTk9fUEVSTUlTU0lPTlMpOwogICAgICAgICAgICBlY2hvICI8UD4mbmJzcDs8L1A+PC9kaXY+IjsgCiAgICAgICAgfQoJfQp9CmlmICgkZGVsPT01KSB7CglpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CiAgICAgICAgaWYgKCEkdmFsaWRVc2VyUmVxdWlyZWQgfHwgQCRzZXNzaW9uLT5jYW5FZGl0UHJvZmlsZXMoKSkgewoJCSAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPiIuX0RFTEVURV9EQVRFX1JBTkdFX0ZST00uIiA8Yj4kZWRpdHByb2ZpbGUtPnByb2ZpbGVuYW1lPC9iPjxQPjxmb3JtIG1ldGhvZD1nZXQgYWN0aW9uPVwicHJvZmlsZXMucGhwXCI+IjsKCQkgICAgZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZGVsIHZhbHVlPTY+IjsKCQkgICAgRGF0ZVNlbGVjdG9yKCRmcm9tLCR0byk7CgkJICAgIGVjaG8gIjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9d2hhdCB2YWx1ZT0yIGNoZWNrZWQ+ICIuX0RFTEVURV9BTExfTE9HX0RBVEEuIjxicj4iOwogICAgICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXdoYXQgdmFsdWU9MT4gIi5fREVMRVRFX09OTFlfREVUQUlMX0RBVEEuIjxicj4iOwogICAgICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXdoYXQgdmFsdWU9Mz4gIi5fREVMRVRFX09OTFlfU1VNTUFSWV9EQVRBLiI8YnI+IjsKCQkgICAgZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZWRpdGNvbmYgdmFsdWU9XCIkY3VycHJvZmlsZW5hbWVcIj4iOwoJCSAgICBlY2hvICI8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9RGVsZXRlPiAgIi5fUExFQVNFX0JFX1BBVElFTlRfREVMRVRJTkdfVEFLRVNfQV9XSElMRS4iPC9kaXY+IjsKCQkgICAgZXhpdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+IjsKICAgICAgICAgICAgZWNob1dhcm5pbmcoX1NPUlJZX05PX1BFUk1JU1NJT05TKTsKICAgICAgICAgICAgZWNobyAiPFA+Jm5ic3A7PC9QPjwvZGl2PiI7CiAgICAgICAgfQoJfQp9CmlmICgkZGVsPT02KSB7CglpZiAoJGVkaXRwcm9maWxlLT5wcm9maWxlbG9hZGVkKSB7CgkJJHdoYXQgPSAkX1JFUVVFU1RbIndoYXQiXTsKCQllY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPjxmb250IGNvbG9yPXJlZD4iLl9MQVNUX0FDVElPTi4iOjwvZm9udD48YnI+PGk+IjsKICAgICAgICBEZWxldGVSYW5nZSgkZWRpdHByb2ZpbGUsJHdoYXQpOwogICAgICAgIAogICAgICAgIAogICAgICAgIGVjaG8gIjwvaT48L2Rpdj48aHIgbm9zaGFkZSBzaXplPTE+PGJyPiI7CiAgCX0KfQoKaWYgKCRkZWw9PTcpIHsKCWlmICgkZWRpdHByb2ZpbGUtPnByb2ZpbGVsb2FkZWQpIHsKICAgICAgICBpZiAoISR2YWxpZFVzZXJSZXF1aXJlZCB8fCBAJHNlc3Npb24tPmNhbkVkaXRQcm9maWxlcygpKSB7IAoJCSAgICAkZGItPkV4ZWN1dGUoImRyb3AgdGFibGUgJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdnBkIik7CgkJICAgICRkYi0+RXhlY3V0ZSgiZHJvcCB0YWJsZSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV92cG0iKTsKICAgICAgICAgICAgJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2RhaWx5dXJscyIpOyAKCQkgICAgJGRiLT5FeGVjdXRlKCJkcm9wIHRhYmxlICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX2NvbnZlcnNpb25zIik7CiAgICAgICAgICAgIGNyZWF0ZURhdGFUYWJsZSgkZWRpdHByb2ZpbGUpOwoJCSAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPjxmb250IGNvbG9yPXJlZD4iLl9MQVNUX0FDVElPTi4iOjwvZm9udD48YnI+PGk+Ii5fREVMRVRFRF9TVU1NQVJZX0RBVEFfSU5fREFURV9SQU5HRS4iLiAiLl9TVU1NQVJJRVNfV0lMTF9CRV9SRUNBTENVTEFURUQuIi48L2k+PC9kaXY+PGhyIG5vc2hhZGUgc2l6ZT0xPjxicj4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+IjsKICAgICAgICAgICAgZWNob1dhcm5pbmcoX1NPUlJZX05PX1BFUk1JU1NJT05TKTsKICAgICAgICAgICAgZWNobyAiPFA+Jm5ic3A7PC9QPjwvZGl2PiI7CiAgICAgICAgfSAgICAKCX0KfQppZiAoJGRlbD09OCkgewoJaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewoJCWRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICJjYWNoZVxfJSIpOwogICAgICAgIGRlbGV0ZVByb2ZpbGVEYXRhKCRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUsICRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUuImNhY2hlX3RyYWlsIik7CgkJZWNobyAiPGRpdiBjbGFzcz1cImluZGVudGJvZHlcIj48Zm9udCBjb2xvcj1yZWQ+Ii5fTEFTVF9BQ1RJT04uIjo8L2ZvbnQ+PGJyPjxpPiIuX0FMTF9DQUNIRV9GSUxFU19ERUxFVEVELiIuPC9pPjwvZGl2PjxociBub3NoYWRlIHNpemU9MT48YnI+IjsKCX0KfQoKaWYgKCRkZWw9PTkpIHsgLy8gdGhpcyBkZWxldGVzIGEgc3BlY2lmaWMgZmlsZSBvciBpcCBmcm9tIHRoZSBkYXRhYmFzZQogICAgaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewogICAgICAgICRmbGRuYW1lPSAkX1JFUVVFU1RbImZsZG5hbWUiXTsKICAgICAgICAkZmxkdmFsdWU9IEAkX1JFUVVFU1RbImZsZHZhbHVlIl07IAogICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpZGVudGJvZHlcIj4iLl9ERUxFVEUuIiA8Zm9udCBjb2xvcj1yZWQ+JGZsZHZhbHVlPC9mb250PiAiLl9GUk9NLiIgPGI+JGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZTwvYj48UD48Zm9ybSBtZXRob2Q9cG9zdCBhY3Rpb249XCJwcm9maWxlcy5waHBcIj4iOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWRlbCB2YWx1ZT0xMD4iOwogICAgICAgIERhdGVTZWxlY3RvcigkZnJvbSwkdG8pOwogICAgICAgIGVjaG8gIjxicj4kZmxkbmFtZTogPGlucHV0IHR5cGU9dGV4dCBuYW1lPWZsZHZhbHVlIHZhbHVlPVwiJGZsZHZhbHVlXCI+ICgiLl9FWEFDVF9WQUxVRV9PTkxZLiIpPHA+IjsKICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1mbGRuYW1lIHZhbHVlPVwiJGZsZG5hbWVcIj4iOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWVkaXRjb25mIHZhbHVlPVwiJGN1cnByb2ZpbGVuYW1lXCI+IjsKICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXJlY2FsIHZhbHVlPVwiMVwiIGNoZWNrZWQ+ICIuX1JFQ0FMQ1VMQVRFX1NVTU1BUllfVEFCTEVTOyAKICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1zdWJtaXQgdmFsdWU9RGVsZXRlPiAgPC9kaXY+IjsKCiAgICAgICAgZXhpdCgpOwogICAgfQp9CmlmICgkZGVsPT0xMCkgewogICAgaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewogICAgICAgICRmbGRuYW1lPSAkX1JFUVVFU1RbImZsZG5hbWUiXTsKICAgICAgICAkZmxkdmFsdWU9IEAkX1JFUVVFU1RbImZsZHZhbHVlIl07CiAgICAgICAgJHJlY2FsPSBAJF9SRVFVRVNUWyJyZWNhbCJdOwogICAgICAgIAogICAgICAgIAogICAgICAgIGlmICgkZmxkbmFtZT09InBhZ2UiKSB7CiAgICAgICAgICAgJHEgPSBAJGRiLT5FeGVjdXRlKCJzZWxlY3QgaWQgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV91cmxzIHdoZXJlIHVybD0nJGZsZHZhbHVlJyIpOwogICAgICAgICAgICRwYWdlPSRxLT5GZXRjaFJvdygpOwogICAgICAgICAgICRkYi0+RXhlY3V0ZSgiZGVsZXRlIGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWUgd2hlcmUgdGltZXN0YW1wID49JGZyb20gYW5kIHRpbWVzdGFtcCA8PSR0byBhbmQgdXJsPSckcGFnZVtpZF0nIik7CiAgICAgICAgICAgJGRiLT5FeGVjdXRlKCJkZWxldGUgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9kYWlseXVybHMgd2hlcmUgdGltZXN0YW1wID49JGZyb20gYW5kIHRpbWVzdGFtcCA8PSR0byBhbmQgdXJsPSckcGFnZVtpZF0nIik7CiAgICAgICAgICAgJGRiLT5FeGVjdXRlKCJkZWxldGUgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9jb252ZXJzaW9ucyB3aGVyZSB0aW1lc3RhbXAgPj0kZnJvbSBhbmQgdGltZXN0YW1wIDw9JHRvIGFuZCB1cmw9JyRwYWdlW2lkXSciKTsgICAgCiAgICAgICAgfSBlbHNlIGlmICgkZmxkbmFtZT09ImlwbnVtYmVyIikgewogICAgICAgICAgICAkcSA9IEAkZGItPkV4ZWN1dGUoInNlbGVjdCBpZCBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3Zpc2l0b3JpZHMgd2hlcmUgaXBudW1iZXI9JyRmbGR2YWx1ZSciKTsKICAgICAgICAgICAgd2hpbGUgKCRwYWdlPSRxLT5GZXRjaFJvdygpKSB7CiAgICAgICAgICAgICAgICAkZGItPkV4ZWN1dGUoImRlbGV0ZSBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lIHdoZXJlIHRpbWVzdGFtcCA+PSRmcm9tIGFuZCB0aW1lc3RhbXAgPD0kdG8gYW5kIHZpc2l0b3JpZD0nJHBhZ2VbaWRdJyIpOwogICAgICAgICAgICAgICAgJGRiLT5FeGVjdXRlKCJkZWxldGUgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9jb252ZXJzaW9ucyB3aGVyZSB0aW1lc3RhbXAgPj0kZnJvbSBhbmQgdGltZXN0YW1wIDw9JHRvIGFuZCB2aXNpdG9yaWQ9JyRwYWdlW2lkXSciKTsgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPjxmb250IGNvbG9yPXJlZD5MYXN0IEFjdGlvbjo8L2ZvbnQ+PGJyPjxpPiI7CiAgICAgICAgaWYgKCRyZWNhbD09MSl7IAogICAgICAgICAgICAkZGItPkV4ZWN1dGUoImRlbGV0ZSBmcm9tICRlZGl0cHJvZmlsZS0+dGFibGVuYW1lX3ZwbSB3aGVyZSB0aW1lc3RhbXAgPj0kZnJvbSBhbmQgdGltZXN0YW1wIDw9JHRvIik7CiAgICAgICAgICAgICRkYi0+RXhlY3V0ZSgiZGVsZXRlIGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfdnBkIHdoZXJlIHRpbWVzdGFtcCA+PSRmcm9tIGFuZCB0aW1lc3RhbXAgPD0kdG8iKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vJGRiLT5FeGVjdXRlKCJkZWxldGUgZnJvbSAkZWRpdHByb2ZpbGUtPnRhYmxlbmFtZV9zY3JlZW5yZXMgd2hlcmUgdGltZXN0YW1wID49JGZyb20gYW5kIHRpbWVzdGFtcCA8PSR0byIpOwogICAgICAgICAgICAvLyRkYi0+RXhlY3V0ZSgiZGVsZXRlIGZyb20gJGVkaXRwcm9maWxlLT50YWJsZW5hbWVfY29sb3JkZXB0aCB3aGVyZSB0aW1lc3RhbXAgPj0kZnJvbSBhbmQgdGltZXN0YW1wIDw9JHRvIik7CiAgICAgICAgICAgIGVjaG8gIkRlbGV0ZWQgJGZsZG5hbWUgJGZsZHZhbHVlLCB3aWxsIHJlY2FsY3VsYXRlIHN1bW1hcnkgdGFibGVzIG5vdyAuLi4iOwogICAgICAgICAgIC8vZGVsZXRlUHJvZmlsZURhdGEoJGVkaXRwcm9maWxlLT5wcm9maWxlbmFtZSk7CiAgICAgICAgICAgCiAgICAgICAgICAgZWNobygiPGZvcm0gbmFtZT1wcm9ncmVzcz4iLl9QUk9HUkVTUy4iOjxicj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGVyYyBzaXplPTEgdmFsdWU9XCIwXCIgY2xhc3M9cGJhcj4lICZuYnNwOyIpOwogICAgICAgICAgIGVjaG8oIjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wcm9nYmFyIHNpemU9NDYgdmFsdWU9XCJ8XCIgY2xhc3M9cHJvZ2Jhcj48UD4iKTsKICAgICAgICAgICBlY2hvKF9TVEFUVVMuIjogPGlucHV0IHR5cGU9dGV4dCBuYW1lPXB0ZXh0IHNpemU9ODUgY2xhc3M9cGJhciB2YWx1ZT1cInN0YXJ0XCIgY2xhc3M9cHJvZ2Jhcj48UD4iKTsKICAgICAgICAgICBlY2hvKCI8L2Zvcm0+Iik7CiAgICAgICAgICAgZWNobyAiPGJyPjxicj4iOwogICAgICAgICAgIC8vIGZ1bmN0aW9uIGVjaG9Db25zb2xlU2FmZSgkdHh0KSB7CiAgICAgICAgICAgICAgICAvLyBlY2hvICR0eHQ7ICAgCiAgICAgICAgICAgLy8gfQogICAgICAgICAgICRwcm9maWxlID0gbmV3IFNpdGVQcm9maWxlKCRjdXJwcm9maWxlbmFtZSk7CiAgICAgICAgICAgJGNvbmY9JGN1cnByb2ZpbGVuYW1lOwogICAgICAgICAgICRvcmlzdD0kZnJvbTsKICAgICAgICAgICA/PgogICAgICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICBmdW5jdGlvbiBwYmFyKHApIHsKICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuZm9ybXMucHJvZ3Jlc3MucGVyYy52YWx1ZT1wOwogICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudC5mb3Jtcy5wcm9ncmVzcy5wcm9nYmFyLnZhbHVlPXNlbGYuZG9jdW1lbnQuZm9ybXMucHJvZ3Jlc3MucHJvZ2Jhci52YWx1ZSsnfCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHN0YXR1cyhwKSB7CiAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50LmZvcm1zLnByb2dyZXNzLnB0ZXh0LnZhbHVlPXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgICAgIDw/cGhwCiAgICAgICAgICAgaW5jbHVkZSAidXBkYXRlX3N1bW1hcmllcy5waHAiOwogICAgICAgICAgIGVjaG8gIjwvZGl2PiI7CiAgICAgICAKICAgICAgIH0KICAgICAgIGVjaG8gX0lGX1lPVV9XQU5UX1RPX0tFRVAuIiA8Yj4kZmxkdmFsdWU8L2I+ICIuX09VVF9PRl9GVVRVUkVfU1RBVFMuIiAiOwogICAgICAgaWYgKCRmbGRuYW1lPT0icGFnZSIpIHsKICAgICAgICAgICAgZWNobyBfU0tJUF9GSUxFUy4iICI7CiAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvIF9TS0lQX0lQX05VTUJFUlMuIiAiOyAgCiAgICAgICB9CiAgICAgICBlY2hvIF9GSUVMRF9PTl9USEVfREFUQV9DT0xMRUNUSU9OX1RBQl9JTl9ZT1VSLiIgJGN1cnByb2ZpbGVuYW1lICIuX1BST0ZJTEVfU0VUVElOR1MuIi48L2k+PC9kaXY+PGhyIG5vc2hhZGUgc2l6ZT0xPjxicj4iOyAgIAogICAgICB9Cn0KCmlmICgkZGVsPT0xMSkgeyAvLyB0aGlzIGp1c3QgZG9lcyB1cGRhdGVfc3VtbWFyaWVzIHdpdGhvdXQgYWRkaW5nIGFueSBuZXcgdHJhZmZpYyBmcm9tIHRoZSBsb2cgZmlsZXMKICAgIGlmICgkZWRpdHByb2ZpbGUtPnByb2ZpbGVsb2FkZWQpIHsKICAgICAgIAogICAgICAgIGVjaG8gIjxkaXYgY2xhc3M9XCJpbmRlbnRib2R5XCI+PGZvbnQgY29sb3I9cmVkPiIuX0xBU1RfQUNUSU9OLiI6PC9mb250Pjxicj4iOyAKICAgICAgICAgICAgCiAgICAgICAgICAgZWNobyAiPGk+Ii5fVVBEQVRFX1NVTU1BUklFU19XT1VUX0NIRUNLSU5HX05FV19EQVRBLiIuLi48L2k+IjsKICAgICAgICAgICAKICAgICAgICAgICBlY2hvKCI8Zm9ybSBuYW1lPXByb2dyZXNzPiIuX1BST0dSRVNTLiI6PGJyPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wZXJjIHNpemU9MSB2YWx1ZT1cIjBcIiBjbGFzcz1wYmFyPiUgJm5ic3A7Iik7CiAgICAgICAgICAgZWNobygiPGlucHV0IHR5cGU9dGV4dCBuYW1lPXByb2diYXIgc2l6ZT00NiB2YWx1ZT1cInxcIiBjbGFzcz1wcm9nYmFyPjxQPiIpOwogICAgICAgICAgIGVjaG8oX1NUQVRVUy4iOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cHRleHQgc2l6ZT04NSBjbGFzcz1wYmFyIHZhbHVlPVwic3RhcnRcIiBjbGFzcz1wcm9nYmFyPjxQPiIpOwogICAgICAgICAgIGVjaG8oIjwvZm9ybT4iKTsKICAgICAgICAgICBlY2hvICI8YnI+PGJyPiI7CiAgICAgICAgICAgLy8gZnVuY3Rpb24gZWNob0NvbnNvbGVTYWZlKCR0eHQpIHsKICAgICAgICAgICAgICAgIC8vIGVjaG8gJHR4dDsgICAKICAgICAgICAgICAvLyB9CiAgICAgICAgICAgJHByb2ZpbGUgPSBuZXcgU2l0ZVByb2ZpbGUoJGN1cnByb2ZpbGVuYW1lKTsKICAgICAgICAgICAkY29uZj0kY3VycHJvZmlsZW5hbWU7CiAgICAgICAgICAgLy8kb3Jpc3Q9JGZyb207CiAgICAgICAgICAgPz4KICAgICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgZnVuY3Rpb24gcGJhcihwKSB7CiAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50LmZvcm1zLnByb2dyZXNzLnBlcmMudmFsdWU9cDsKICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuZm9ybXMucHJvZ3Jlc3MucHJvZ2Jhci52YWx1ZT1zZWxmLmRvY3VtZW50LmZvcm1zLnByb2dyZXNzLnByb2diYXIudmFsdWUrJ3wnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBzdGF0dXMocCkgewogICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudC5mb3Jtcy5wcm9ncmVzcy5wdGV4dC52YWx1ZT1wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc2NyaXB0PgogICAgICAgICAgICA8P3BocAogICAgICAgICAgIGluY2x1ZGUgInVwZGF0ZV9zdW1tYXJpZXMucGhwIjsKICAgICAgfQp9CgppZiAoJHVwZGF0ZV9jb3VudHJpZXM9PTEpIHsKICAgIGlmICgkZWRpdHByb2ZpbGUtPnByb2ZpbGVsb2FkZWQpIHsKICAgICAgICBpZiAoISR2YWxpZFVzZXJSZXF1aXJlZCB8fCBAJHNlc3Npb24tPmNhblVwZGF0ZUxvZ3MoKSkgewogICAgICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPjxoMz5VcGRhdGUgR2VvZ3JhcGhpYyBMb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgJyRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWUnPC9oMz4iOwogICAgICAgICAgICBlY2hvICI8cD5Zb3UgY2FuIHVzZSB0aGlzIHRvb2wgaWYgeW91IGhhdmUgdXBkYXRlZCAob3IganVzdCBpbnN0YWxsZWQpIHRoZSBHZW8gTG9jYXRpb24gZGF0YWJhc2UgYW5kIHdhbnQgdG8gdXBkYXRlIGNvdW50cnkgaW5mb3JtYXRpb24gb24gcmVjb3JkcyBhbHJlYWR5IHN0b3JlZCBpbiB5b3VyIExvZ2Fob2xpYyBkYXRhYmFzZSBmb3IgdGhpcyBwcm9maWxlLjwvcD4iOwogICAgICAgICAgICBlY2hvICI8UD5UaGUgZGF0ZSByYW5nZSB3aWxsIGFmZmVjdCB3aGljaCB2aXNpdG9ycyBhcmUgY2hlY2tlZCAob25seSB2aXNpdG9yaWQncyA8ZW0+Zmlyc3QgY3JlYXRlZDwvZW0+IHdpdGhpbiB0aGUgZGF0ZSByYW5nZSkgYW5kIHdoaWNoIHJlY29yZHMgd2lsbCBiZSB1cGRhdGVkIChvbmx5IGhpdHMgd2l0aGluIHRoZSBkYXRlIHJhbmdlKS48L1A+IjsKICAgICAgICAgICAgZWNobyAiPHA+PGI+U2VsZWN0IHRoZSBkYXRlIHJhbmdlIHlvdSB3YW50IHRvIHVwZGF0ZSBnZW9ncmFwaGljIGluZm9ybWF0aW9uIGZvcjo8L2I+PC9wPiI7CiAgICAgICAgICAgIGVjaG8gIjxmb3JtIG1ldGhvZD1nZXQgYWN0aW9uPVwicHJvZmlsZXMucGhwXCI+IjsKICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9XCJ1cGRhdGVfY291bnRyaWVzXCIgdmFsdWU9Mj4iOwogICAgICAgICAgICAkZGF0ZXJhbmdlID0gR2V0TWF4RGF0ZVJhbmdlKCRlZGl0cHJvZmlsZSk7CiAgICAgICAgICAgIERhdGVTZWxlY3RvcigkZGF0ZXJhbmdlWydmcm9tJ10sJGRhdGVyYW5nZVsndG8nXSk7CiAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWVkaXRjb25mIHZhbHVlPVwiJGN1cnByb2ZpbGVuYW1lXCI+IjsKICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPVwiIi5fVVBEQVRFX05PVy4iXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjVweDtmb250LXNpemU6MTRweDtcIj4iOwogICAgICAgICAgICBlY2hvICI8L2Rpdj48L2JvZHk+PC9odG1sPiI7CiAgICAgICAgICAgIGV4aXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPiI7CiAgICAgICAgICAgIGVjaG9XYXJuaW5nKF9TT1JSWV9OT19QRVJNSVNTSU9OUyk7CiAgICAgICAgICAgIGVjaG8gIjxQPiZuYnNwOzwvUD48L2Rpdj4iOwogICAgICAgIH0KICAgIH0gICAgICAgIAp9CmlmICgkdXBkYXRlX2NvdW50cmllcz09MikgewogICAgaWYgKCRlZGl0cHJvZmlsZS0+cHJvZmlsZWxvYWRlZCkgewogICAgICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8IEAkc2Vzc2lvbi0+Y2FuVXBkYXRlTG9ncygpKSB7CiAgICAgICAgICAgICRwcm9maWxlPSRlZGl0cHJvZmlsZTsKICAgICAgICAgICAgaW5jbHVkZSAiaW5jbHVkZXMvdXBkYXRlX2NvdW50cmllcy5waHAiOwogICAgICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPiI7CiAgICAgICAgICAgICR1YyA9IG5ldyBVcGRhdGVDb3VudHJpZXMoKTsKICAgICAgICAgICAgJHVjLT5EaXNwbGF5UHJvZ3Jlc3MoKTsKICAgICAgICAgICAgJHVjLT5VcGRhdGVSYW5nZSgkZnJvbSwkdG8pOwogICAgICAgICAgICBlY2hvICI8L2Rpdj48L2JvZHk+PC9odG1sPiI7CiAgICAgICAgICAgIGV4aXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPiI7CiAgICAgICAgICAgIGVjaG9XYXJuaW5nKF9TT1JSWV9OT19QRVJNSVNTSU9OUyk7CiAgICAgICAgICAgIGVjaG8gIjxQPiZuYnNwOzwvUD48L2Rpdj4iOwogICAgICAgIH0KICAgIH0gICAgICAgIAp9CgoKaWYgKCFpc3NldCgkYmFja3VwKSkgewoJJGJhY2t1cD0wOyAKfQppZiAoJGJhY2t1cD09MSkgewoJZWNobyAiPGRpdiBjbGFzcz1cImluZGVudGJvZHlcIj48Yj4iLl9CQUNLVVBfRVhQT1JUX0RBVEVfUkFOR0VfRlJPTS4iIDxmb250IGNvbG9yPXJlZD4kY3VycHJvZmlsZW5hbWU8L2ZvbnQ+PC9iPjxQPiI7CgllY2hvICI8Zm9ybSBtZXRob2Q9Z2V0IGFjdGlvbj1cInByb2ZpbGVzLnBocFwiPiI7CgllY2hvICI8dGFibGUgd2lkdGg9NDUwIGNsYXNzPXNtYWxsYm9yZGVyPjx0cj48dGQgY2xhc3M9c21hbGw+Ii5fWU9VX0NBTl9FWFBPUlRfREFUQV9GUk9NX1RBQkxFLiIgKCRlZGl0cHJvZmlsZS0+dGFibGVuYW1lKSAiLl9JTl9PUkRFUl9UT19CQUNLVVAuIjwvdGQ+PC90cj48L3RhYmxlPjxQPiI7CgllY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1iYWNrdXAgdmFsdWU9Mj4iOwoJRGF0ZVNlbGVjdG9yKCRmcm9tLCR0byk7CgllY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1lZGl0Y29uZiB2YWx1ZT1cIiRjdXJwcm9maWxlbmFtZVwiPiI7CiAgICBlY2hvICI8UD4iLl9GSUxFX0ZPUk1BVC4iOiA8c2VsZWN0IG5hbWU9XCJtb2RlXCI+PG9wdGlvbiB2YWx1ZT1cImxvZ2ZpbGVcIiBzZWxlY3RlZD4gIi5fQVBBQ0hFX0NPTUJJTkVEX0xPR19GSUxFX0ZPUk1BVC4iIDxvcHRpb24gdmFsdWU9XCJjc3ZcIj4gIi5fQ1NWX0ZPUk1BVC4iPC9zZWxlY3Q+PC9wPiI7IAoJZWNobyAiPFA+PGlucHV0IHR5cGU9c3VibWl0IG5hbWU9c3VibWl0IHZhbHVlPVwiRG93bmxvYWQgQmFja3VwIEZpbGVcIj48L2Rpdj4iOwogICAgZWNobyAiPC9ib2R5PjwvaHRtbD4iOwoJZXhpdCgpOwp9CgppZiAoaXNzZXQoJF9SRVFVRVNUWyJnbG9iYWxzdGF0cyJdKT09InllcyIpIHsgCiAgICBlY2hvICI8ZGl2IGNsYXNzPSdpbmRlbnRib2R5Jz4mbmJzcDs8YnI+IjsKICAgIGluY2x1ZGUgImluY2x1ZGVzL2dsb2JhbHN0YXRzLnBocCI7ICAgIAogICAgZWNobyAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iOwogICAgZXhpdCgpOwp9CmlmKGlzc2V0KCRyZXN0b3JlRGVmYXVsdERhc2hib2FyZCkpewoJJGVkaXRwcm9maWxlLT5zZXREZWZhdWx0RGFzaGJvYXJkKCk7CgllY2hvICI8ZGl2IGNsYXNzPVwiaW5kZW50Ym9keVwiPiI7CgllY2hvICJZb3VyIGRlZmF1bHQgZGVza3RvcCBoYXMgYmVlbiByZXN0b3JlZC4iOwoJZWNobyAiPC9kaXY+IjsKfQoKaWYgKCFpc3NldCgkZWRpdCkgJiYgKCFpc3NldCgkbmV3KSkpIHsKCSAKICAgIC8vIGxpc3QgYWxsIHByb2ZpbGVzCgkKICAgICBpZiAoJHNhdmVkIT0iIikgewoJCQllY2hvICI8cCBjbGFzcz1cImluZGVudGJvZHlcIj48Zm9udCBjb2xvcj1yZWQ+Ii5fTEFTVF9BQ1RJT04uIjo8L2ZvbnQ+PGJyPjxpPjxiPiRlZGl0cHJvZmlsZS0+cHJvZmlsZW5hbWU8L2I+ICIuJHNhdmVkLiI8L2k+PC9wPjxociBub3NoYWRlIHNpemU9MT48YnI+IjsKCSB9CgkgPz4KCSA8ZGl2IGNsYXNzPWluZGVudGJvZHk+CiAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgZnVuY3Rpb24gcHJvd092ZXJFZmZlY3Qob2JqZWN0KSB7CgkgICAgaWYgKG9iamVjdC5jbGFzc05hbWUgPT0gJ3Byb2ZpbGVyb3cnKSBvYmplY3QuY2xhc3NOYW1lID0gJ3Byb2ZpbGVyb3doaWdobGlnaHQnOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3dPdXRFZmZlY3Qob2JqZWN0KSB7CgkgICAgaWYgKG9iamVjdC5jbGFzc05hbWUgPT0gJ3Byb2ZpbGVyb3doaWdobGlnaHQnKSBvYmplY3QuY2xhc3NOYW1lID0gJ3Byb2ZpbGVyb3cnOwogICAgfQogICAgPC9zY3JpcHQ+CiAgICA8P3BocAogICAgICAgIAogICAgLy8gc2VlIGhvdyBtYW55IHByb2ZpbGVzIHRoZXJlIGFyZSBpbiB0b3RhbCwgaWYgaXQncyBtb3JlIHRoYW4gNSBwcmludCBhIFNFQVJDSCBCT1gKICAgICRxdWVyeSA9ICJTZWxlY3QgY291bnQoKikgZnJvbSAiLlRCTF9QUk9GSUxFUy4iOyI7CiAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSkgb3IgZGllKF9DT1VMRE5UX1FVRVJZX1BST0ZJTEVTLiIgIiAuICRkYi0+RXJyb3JNc2coKSk7CiAgICAkcmVzdWx0ID0gJHJlc3VsdC0+RmV0Y2hSb3coKTsgCiAgICAkbnVtcHJvZmlsZXM9JHJlc3VsdFswXTsgCiAgICBpZiAoJHJlc3VsdFswXSA+IDUpIHsKICAgICAgICBpZiAoKCR2YWxpZFVzZXJSZXF1aXJlZCkgJiYgKCEkc2Vzc2lvbi0+aXNBZG1pbigpKSkgewogICAgICAgICAgICAvLyB5b3UgaGF2ZSB0byBiZSBhZG1pbiB0byBzZWUgdGhlIHNlYXJjaCBib3gKICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAKICAgICAgICA/PgogICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249InByb2ZpbGVzLnBocCI+CiAgICAgICAgICBTZWFyY2ggcHJvZmlsZXMgbWF0Y2hpbmc6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzZWFyY2giIHZhbHVlPSI8P3BocCBlY2hvIEAkc2VhcmNoOyA/PiI+IAogICAgICAgICAgaW4gZmllbGQ6IAogICAgICAgICAgICA8c2VsZWN0IG5hbWU9InNmaWVsZCI+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJwcm9maWxlbmFtZSIgPD9waHAgaWYgKEAkc2ZpZWxkPT0icHJvZmlsZW5hbWUiKSB7IGVjaG8gInNlbGVjdGVkIjsgfSA/Pj4gPD9waHAgZWNobyBfUFJPRklMRV9OQU1FOz8+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJjb25mZG9tYWluIiA8P3BocCBpZiAoQCRzZmllbGQ9PSJjb25mZG9tYWluIikgeyBlY2hvICJzZWxlY3RlZCI7IH0gPz4+IDw/cGhwIGVjaG8gX0RPTUFJTl9OQU1FOz8+CiAgICAgICAgICAgIDwvc2VsZWN0PiAgICAgCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPiAgICAKICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDxicj4KICAgICAgICAgIDw/cGhwCiAgICAgICAgfSAgIAogICAgfQogICAgCiAgICBlY2hvICI8ZGl2IHN0eWxlPVwid2lkdGg6NjAwcHg7XCI+IjsKICAgIGlmICghJHZhbGlkVXNlclJlcXVpcmVkIHx8ICRzZXNzaW9uLT5pc0FkbWluKCkgfHwgJHNlc3Npb24tPmNhbkFkZFByb2ZpbGVzKCkpIHsKICAgICAgICBlY2hvICI8ZGl2IHN0eWxlPVwiZmxvYXQ6bGVmdDtsaW5lLWhlaWdodDoxNnB4O3BhZGRpbmctcmlnaHQ6MjBweDttYXJnaW4tYm90dG9tOjZweDtcIj4iOwogICAgICAgIGlmICgoIWRlZmluZWQoIl9MSU1JVF9QUk9GSUxFUyIpKSB8fCAoX0xJTUlUX1BST0ZJTEVTID09IDApKSB7CiAgICAgICAgICAgIGVjaG8gIjxpbWcgc3JjPVwiaW1hZ2VzL2ljb25zL2FkZF9wcm9maWxlLmdpZlwiIHdpZHRoPTE2IGhlaWdodD0xNiBhbGlnbj1sZWZ0IGFsdD1cIk5ld1wiPiA8YSBocmVmPVwicHJvZmlsZXMucGhwP2NvbmY9bmV3Y25mJmFtcDtuZXc9MVwiPiIuX0NSRUFURV9ORVdfUFJPRklMRS4iPC9hPiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRudW1wcm9maWxlcyA+PSBfTElNSVRfUFJPRklMRVMpIHsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbWcgc3JjPVwiaW1hZ2VzL2ljb25zL2FkZF9wcm9maWxlLmdpZlwiIHdpZHRoPTE2IGhlaWdodD0xNiBhbGlnbj1sZWZ0IGFsdD1cIlVwZ3JhZGVcIj4gIi5fVE9PX01BTllfUFJPRklMRVNfUExFQVNFX1VQR1JBREUuIiI7ICAgICAgCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlY2hvICI8aW1nIHNyYz1cImltYWdlcy9pY29ucy9hZGRfcHJvZmlsZS5naWZcIiB3aWR0aD0xNiBoZWlnaHQ9MTYgYWxpZ249bGVmdCBhbHQ9XCJOZXdcIj4gPGEgaHJlZj1cInByb2ZpbGVzLnBocD9jb25mPW5ld2NuZiZhbXA7bmV3PTFcIj4iLl9DUkVBVEVfTkVXX1BST0ZJTEUuIjwvYT4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVjaG8gIjwvZGl2PiI7ICAgICAgICAgIAogICAgfQogICAgCiAgICBlY2hvICI8ZGl2IHN0eWxlPVwiZmxvYXQ6bGVmdDtsaW5lLWhlaWdodDoxNnB4O21hcmdpbi1ib3R0b206NnB4O1wiPjxpbWcgc3JjPVwiaW1hZ2VzL2ljb25zL3BpZS5naWZcIiB3aWR0aD0xNiBoZWlnaHQ9MTYgYWxpZ249bGVmdCBhbHQ9XCJOZXdcIj4gPGEgaHJlZj1cInByb2ZpbGVzLnBocD9nbG9iYWxzdGF0cz15ZXNcIj4iLl9HTE9CQUxfU1RBVElTVElDU19PVkVSVklFVy4iPC9hPjwvZGl2PiI7CiAgICBlY2hvICI8L2Rpdj4iOyAKICAgICAKCT8+CiAgICAKICAgIDx0YWJsZSBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTAgYm9yZGVyPTAgc3R5bGU9Im1pbi13aWR0aDo2MDBweDtjbGVhcjpib3RoOyI+CgkJPHRyPjx0ZCBjb2xzcGFuPTUgIGNsYXNzPXRvcGxpbmVibHVlIGJnY29sb3I9IiNCQkRERkYiPjxpbWcgc3JjPSJpbWFnZXMvaWNvbnMvcHJvZmlsZXMuZ2lmIiB3aWR0aD0xNiBoZWlnaHQ9MTYgYWxpZ249bGVmdCBhbHQ9Ijw/cGhwIGVjaG8gX01BTkFHRV9QUk9GSUxFUzs/PiI+ICZuYnNwOyZuYnNwOzxmb250IHNpemU9Mz48Yj48P3BocCBlY2hvIF9NQU5BR0VfUFJPRklMRVM7Pz48L2I+PC9mb250PjwvdGQ+PC90cj4KCTw/cGhwICAgICAgIAogICAgCiAgICAkcXVlcnkgPSAiU2VsZWN0IHByb2ZpbGVuYW1lLHRhYmxlbmFtZSxwcm9maWxlaWQgZnJvbSAiLlRCTF9QUk9GSUxFUzsKCQoJLy8gSWYgd2UncmUgbGltaXRpbmcgdGhlIHZpc2libGUgcHJvZmlsZXMsIHRoZW4gcHV0IGEgZmlsdGVyIG9uIHRvIG9ubHkgcHVsbCB0aG9zZSByZWNvcmRzLgoJaWYgKCgkdmFsaWRVc2VyUmVxdWlyZWQpICYmICghJHNlc3Npb24tPmlzQWRtaW4oKSkpIHsKCQkvLyBDYW4ndCB1c2UgaW1wbG9kZSBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBlc2NhcGUgdGhlIGVudHJpZXMuCgkJJHZhbGlkcHJvZmlsZXMgPSAiIjsKCQlmb3IgKCRpID0gY291bnQoJHNlc3Npb24tPnVzZXJfcHJvZmlsZXMpLTE7ICRpID49IDA7ICRpLS0pIHsKCQkJaWYgKCR2YWxpZHByb2ZpbGVzICE9ICIiKSB7ICR2YWxpZHByb2ZpbGVzIC49ICJcIixcIiI7IH0KCQkJJHZhbGlkcHJvZmlsZXMgLj0gJGRiLT5lc2NhcGUoJHNlc3Npb24tPnVzZXJfcHJvZmlsZXNbJGldKTsKCQl9CgkJJHF1ZXJ5IC49ICIgd2hlcmUgcHJvZmlsZW5hbWUgaW4gKFwiJHZhbGlkcHJvZmlsZXNcIikiOwoJfQoJaWYgKEAkc2VhcmNoKSB7CiAgICAgICAgJHF1ZXJ5IC49ICIgd2hlcmUgJHNmaWVsZCBsaWtlICclJHNlYXJjaCUnIjsgICAKICAgIH0KICAgIAogICAgJHF1ZXJ5Lj0iIG9yZGVyIGJ5IHByb2ZpbGVuYW1lIjsKCQogICAgaWYgKGRlZmluZWQoIl9MSU1JVF9QUk9GSUxFUyIpICE9IDApIHsKICAgICAgJHF1ZXJ5Lj0iIGxpbWl0IDAsIi5fTElNSVRfUFJPRklMRVM7CgkgICRudW1fb2ZfaXRlbXMgPSBfTElNSVRfUFJPRklMRVM7CiAgICB9IGVsc2UgewoJCS8qIFBhZ2luYXRpb24gY29uZmlnIHN0YXJ0cyBoZXJlICovCgkJJG51bV9vZl9pdGVtcyA9IDA7CgkJJG1heF9saW5rcyA9IDU7CgkJCgkJJGNvdW50X3F1ZXJ5ID0gIlNFTEVDVCBDT1VOVCgqKSBBUyBgbWF4X3Byb2ZpbGVzYCBGUk9NICIuVEJMX1BST0ZJTEVTOwoJCSRhbW91bnRfcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRjb3VudF9xdWVyeSk7CgkJCgkJJG51bV9vZl9pdGVtcyA9ICRhbW91bnRfcmVzdWx0LT5GZXRjaFJvdygpOwoJCSRudW1fb2ZfaXRlbXMgPSAkbnVtX29mX2l0ZW1zWydtYXhfcHJvZmlsZXMnXTsKCgkJaWYoIWVtcHR5KCRfR0VUWydudW1fcHAnXSkpIHsKCQkJJGl0ZW1zX3Blcl9wYWdlID0gJF9HRVRbJ251bV9wcCddOwoJCX0gZWxzZSB7CgkJCSRpdGVtc19wZXJfcGFnZSA9IDEwOwoJCX0KCQkKCQlpZighZW1wdHkoJF9HRVRbJ3BhZ2VfbnVtJ10pKSB7CgkJCSRwYWdlX251bSA9ICRfR0VUWydwYWdlX251bSddOwoJCX0gZWxzZSB7CgkJCSRwYWdlX251bSA9IDE7CgkJfQoJCSRxdWVyeSAuPSAiIExJTUlUICIuZmxvb3IoKCRwYWdlX251bSAtIDEpICogJGl0ZW1zX3Blcl9wYWdlKS4iLCAiLiRpdGVtc19wZXJfcGFnZTsKCQkvKiBQYWdpbmF0aW9uIGNvbmZpZyBlbmRzIGhlcmUgKi8KCX0KCQoJCgkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSkgb3IgZGllKF9DT1VMRE5UX1FVRVJZX1BST0ZJTEVTLiIgIiAuICRkYi0+RXJyb3JNc2coKSk7CiAgICBpZiAoJHJlc3VsdC0+UmVjb3JkQ291bnQoKSA9PSAwKSB7CgkJZWNobyAiPHRyPjx0ZCBjb2xzcGFuPTUgY2xhc3M9XCJwcm9maWxlcm93XCI+Ii5fWU9VX0hBVkVfTk9fQUNUSVZFX1BST0ZJTEVTLiIuPC90ZD48L3RyPiI7Cgl9IGVsc2UgewoJCXdoaWxlICgkcHJvZmlsZV9yb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpKSB7CgkJCSRwcm9maWxlbmFtZSA9ICRwcm9maWxlX3Jvd1swXTsKICAgICAgICAgICAgJHByb2ZpbGVfdGFibGVuYW1lID0gJHByb2ZpbGVfcm93WzFdOwoJCQlpZiAoJGNvbmY9PSRwcm9maWxlbmFtZSB8fCAkZWRpdGNvbmY9PSRwcm9maWxlbmFtZSkgewoJCQkJJHNlbD0iIDxmb250IGNvbG9yPXJlZD4oIi5fQUNUSVZFLiIpPC9mb250PiI7CgkJCQkkYmdjPSJiZ2NvbG9yPSNDQ0ZGQ0MiOwoJCQkJJGNsYXNzPSIiOwoJCQl9IGVsc2UgewoJCQkJJHNlbD0iIjsKCQkJCSRiZ2M9IiI7CgkJCQkkY2xhc3M9Im9ubW91c2VvdmVyPVwicHJvd092ZXJFZmZlY3QodGhpcylcIiBvbm1vdXNlb3V0PVwicHJvd091dEVmZmVjdCh0aGlzKVwiIjsKCQkJfQoJCQllY2hvICI8dHIgY2xhc3M9XCJwcm9maWxlcm93XCIgJGNsYXNzPjx0ZCAkYmdjIHN0eWxlPVwiZm9udC1zaXplOjEzcHg7XCIgY2xhc3M9XCJkb3RsaW5lMlwiIHRpdGxlPVwieyRwcm9maWxlX3Jvd1syXX1cIj48Yj4kcHJvZmlsZW5hbWU8L2I+ICRzZWw8L3RkPjx0ZCAkYmdjIHN0eWxlPVwiZm9udC1zaXplOjEzcHg7XCIgY2xhc3M9ZG90bGluZTI+PGltZyBzcmM9XCJpbWFnZXMvaWNvbnMvZGF0ZS5naWZcIiB3aWR0aD0xNiBoZWlnaHQ9MTYgYWxpZ249bGVmdCBhbHQ9XCIiLl9WSUVXX1NUQVRTLiJcIj4gPGEgaHJlZj1cImluZGV4LnBocD9jb25mPSRwcm9maWxlbmFtZVwiPiIuX1ZJRVdfU1RBVFMuIjwvYT48L3RkPiI7CgkJCWlmICgoISR2YWxpZFVzZXJSZXF1aXJlZCkgfHwgKCRzZXNzaW9uLT5jYW5VcGRhdGVMb2dzKCkpKSB7CiAgICAgICAgICAgICAgICBlY2hvICI8dGQgJGJnYyBjbGFzcz1kb3RsaW5lMj48aW1nIHNyYz1cImltYWdlcy9pY29ucy91cGRhdGUuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiIi5fVVBEQVRFX05PVy4iXCI+IDxhIGhyZWY9XCJ1cGRhdGUucGhwP2NvbmY9JHByb2ZpbGVuYW1lXCI+Ii5fVVBEQVRFX05PVy4iPC9hPjwvdGQ+IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCEkdmFsaWRVc2VyUmVxdWlyZWQpIHx8ICgkc2Vzc2lvbi0+Y2FuRWRpdFByb2ZpbGVzKCkpKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgJHJxPSBAJGRiLT5FeGVjdXRlKCJzZWxlY3QgY291bnQoKikgZnJvbSAkcHJvZmlsZV90YWJsZW5hbWUiKTsKICAgICAgICAgICAgICAgICRyZWNzID0gQCRycS0+RmV0Y2hSb3coKTsKICAgICAgICAgICAgICAgICRyZWNzID0gbnVtYmVyX2Zvcm1hdCgkcmVjc1swXSwgMCwgJy4nLCAnJyk7IAogICAgICAgICAgICAgICAgZWNobyAiPHRkICRiZ2MgY2xhc3M9ZG90bGluZTI+PGltZyBzcmM9XCJpbWFnZXMvaWNvbnMvZWRpdC5naWZcIiB3aWR0aD0xNiBoZWlnaHQ9MTYgYWxpZ249bGVmdCBhbHQ9XCJFZGl0XCI+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kcHJvZmlsZW5hbWUmYW1wO2VkaXQ9MVwiPiIuX0VESVRfUFJPRklMRS4iPC9hPjwvdGQ+PHRkICRiZ2MgY2xhc3M9ZG90bGluZTIgdGl0bGU9XCJUaGlzIHByb2ZpbGUgY29udGFpbnMgJHJlY3MgZGF0YSByZWNvcmRzXCI+IDxpbWcgc3JjPVwiaW1hZ2VzL2ljb25zL2RlbGV0ZS5naWZcIiB3aWR0aD0xNiBoZWlnaHQ9MTYgYWxpZ249bGVmdCBhbHQ9XCJEZWxldGVcIj48YSBocmVmPVwicHJvZmlsZXMucGhwP2VkaXRjb25mPSRwcm9maWxlbmFtZSZhbXA7ZGVsPTFcIj4iLl9NQUlOVEVOQU5DRS4iPC9hPjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGVjaG8gIjx0ZCAkYmdjIGNsYXNzPWRvdGxpbmUyPjxpbWcgc3JjPVwiaW1hZ2VzL2ljb25zL2VkaXQuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiRWRpdFwiPjxhIGhyZWY9XCJwcm9maWxlcy5waHA/ZWRpdGNvbmY9JHByb2ZpbGVuYW1lJmFtcDtlZGl0PTFcIj4iLl9FRElUX1BST0ZJTEUuIjwvYT48L3RkPiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCghJHZhbGlkVXNlclJlcXVpcmVkKSB8fCAoJHNlc3Npb24tPmNhblVwZGF0ZUxvZ3MoKSkpIHsKICAgICAgICAgICAgICAgIGVjaG8gIjx0ZCAkYmdjIGNsYXNzPWRvdGxpbmUyPiA8aW1nIHNyYz1cImltYWdlcy9pY29ucy9kZWxldGUuZ2lmXCIgd2lkdGg9MTYgaGVpZ2h0PTE2IGFsaWduPWxlZnQgYWx0PVwiRGVsZXRlXCI+PGEgaHJlZj1cInByb2ZpbGVzLnBocD9lZGl0Y29uZj0kcHJvZmlsZW5hbWUmYW1wO2RlbD0xXCI+Ii5fTUFJTlRFTkFOQ0UuIjwvYT48L3RkPjwvdHI+IjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gIjwvdHI+IjsgICAKICAgICAgICAgICAgfQoJCX0KCQkKCQlpZiAoJG51bV9vZl9pdGVtcyA+IDEwKSB7CgkJCWVjaG8gIjx0cj48dGQgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyBjb2xzcGFuPSc1Jz4iOwkJCQoJCQkJaWYgKGRlZmluZWQoIl9MSU1JVF9QUk9GSUxFUyIpID09IDApIHsKCQkJCQllY2hvICI8ZGl2IGNsYXNzPSdwcm9maWxlX3BhZ2luYXRpb24nPiI7CgkJCQkJCWlmKGNlaWwoJG51bV9vZl9pdGVtcy8kaXRlbXNfcGVyX3BhZ2UpID4gMSkgewoJCQkJCQkJZWNobyBwYWdpbmF0aW9uKCRudW1fb2ZfaXRlbXMsICRpdGVtc19wZXJfcGFnZSwgJHBhZ2VfbnVtLCAkbWF4X2xpbmtzKTsKCQkJCQkJfQoJCQkJCQlpZighZW1wdHkoJF9HRVRbJ3BhZ2VfbnVtJ10pKSB7CgkJCQkJCQkkdXJsX2V4dGVuc2lvbiA9ICI/cGFnZV9udW09MSYiOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHVybF9leHRlbnNpb24gPSAiPyI7CgkJCQkJCX0KCQkJCQkJZWNobyAiPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeyAkKFwiI251bV9wcFwiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7IHdpbmRvdy5sb2NhdGlvbiA9IFwieyRfU0VSVkVSWydQSFBfU0VMRiddfXskdXJsX2V4dGVuc2lvbn1udW1fcHA9XCIgKyAkKHRoaXMpLnZhbCgpIH0pOyB9KTs8L3NjcmlwdD4iOwoJCQkJCQllY2hvICI8ZGl2IGNsYXNzPSdzZWxlY3RfbnVtX3Blcl9wYWdlJz4iOwoJCQkJCQkJZWNobyAiPGxhYmVsIGZvcj0ncGFnaW5hdGlvbl9udW1fcGVyX3BhZ2UnPk51bWJlciBvZiBwcm9maWxlcyBwZXIgcGFnZTogPC9sYWJlbD4iOwoJCQkJCQkJZWNobyAiPHNlbGVjdCBpZD0nbnVtX3BwJyBuYW1lPSdudW1fcHAnPiI7CgkJCQkJCQkJZWNobyAiPG9wdGlvbiAiOyBpZigkaXRlbXNfcGVyX3BhZ2UgPT0gNSkgeyBlY2hvICJzZWxlY3RlZCAiOyB9IGVjaG8gInZhbHVlPSc1Jz41PC9vcHRpb24+IjsKCQkJCQkJCQllY2hvICI8b3B0aW9uICI7IGlmKCRpdGVtc19wZXJfcGFnZSA9PSAxMCkgeyBlY2hvICJzZWxlY3RlZCAiOyB9IGVjaG8gInZhbHVlPScxMCc+MTA8L29wdGlvbj4iOwoJCQkJCQkJCWVjaG8gIjxvcHRpb24gIjsgaWYoJGl0ZW1zX3Blcl9wYWdlID09IDIwKSB7IGVjaG8gInNlbGVjdGVkICI7IH0gZWNobyAidmFsdWU9JzIwJz4yMDwvb3B0aW9uPiI7CgkJCQkJCQkJZWNobyAiPG9wdGlvbiAiOyBpZigkaXRlbXNfcGVyX3BhZ2UgPT0gNTApIHsgZWNobyAic2VsZWN0ZWQgIjsgfSBlY2hvICJ2YWx1ZT0nNTAnPjUwPC9vcHRpb24+IjsKCQkJCQkJCQllY2hvICI8b3B0aW9uICI7IGlmKCRpdGVtc19wZXJfcGFnZSA9PSAxMDApIHsgZWNobyAic2VsZWN0ZWQgIjsgfSBlY2hvICJ2YWx1ZT0nMTAwJz4xMDA8L29wdGlvbj4iOwoJCQkJCQkJZWNobyAiPC9zZWxlY3Q+IjsKCQkJCQkJZWNobyAiPC9kaXY+IjsKCQkJCQllY2hvICI8L2Rpdj4iOwoJCQkJfQoJCQllY2hvICI8L3RkPjwvdHI+IjsKCQl9Cgl9CgllY2hvICI8L3RhYmxlPjxwPiI7CgkKICAgIGlmICgkdmFsaWRVc2VyUmVxdWlyZWQgJiYgQCRzZXNzaW9uLT5pc0FkbWluKCk9PT1mYWxzZSkgewogICAgICAgICROb3RpY2U9IiI7CiAgICAgICAgaWYgKEAkc2Vzc2lvbi0+Y2FuRWRpdFByb2ZpbGVzKCk9PT1mYWxzZSkgewogICAgICAgICAgICAkTm90aWNlLj1fTk9fUEVSTUlTU0lPTl9FRElUX1BST0ZJTEUuIjxicj4iOyAgIAogICAgICAgIH0KICAgICAgICBpZiAoQCRzZXNzaW9uLT5jYW5BZGRQcm9maWxlcygpPT09ZmFsc2UpIHsKICAgICAgICAgICAgJE5vdGljZS49X05PX1BFUk1JU1NJT05fQUREX1BST0ZJTEUuIjxicj4iOyAgIAogICAgICAgIH0KICAgICAgICBpZiAoQCRzZXNzaW9uLT5jYW5VcGRhdGVMb2dzKCk9PT1mYWxzZSkgewogICAgICAgICAgICAkTm90aWNlLj1fTk9fUEVSTUlTU0lPTl9VUERBVEUuIjxicj4iOyAgIAogICAgICAgIH0KICAgICAgICBpZiAoJE5vdGljZSE9IiIgJiYgX0xPR0FIT0xJQ19FRElUSU9OIT00KSB7CiAgICAgICAgICAgIGVjaG8gIjxkaXYgc3R5bGU9XCJ3aWR0aDo2MDBweDtcIj4iOwogICAgICAgICAgICAkTm90aWNlPSI8Yj4iLl9QTEVBU0VfTk9URS4iOjwvYj48YnI+Ii4kTm90aWNlOwogICAgICAgICAgICBlY2hvTm90aWNlKCROb3RpY2UpOwogICAgICAgICAgICBlY2hvICI8L2Rpdj4iOyAgICAKICAgICAgICB9CiAgICB9CiAgICBlY2hvICI8L2Rpdj4iOwp9CgovKiBQYWdpbmF0aW9uIGZ1bmN0aW9ucyBzdGFydHMgaGVyZSAqLwpmdW5jdGlvbiBwYWdpbmF0aW9uX2xpbmsoJHBhZ2VfbnVtYmVyKSB7CgkkcGFnaW5hdGlvbl91cmwgPSAkX1NFUlZFUlsnUEhQX1NFTEYnXS4nP3BhZ2VfbnVtPScuJHBhZ2VfbnVtYmVyOwoJaWYoIWVtcHR5KCRfR0VUWydudW1fcHAnXSkpIHsKCQkkcGFnaW5hdGlvbl91cmwgLj0gIiZudW1fcHA9eyRfR0VUWydudW1fcHAnXX0iOwoJfQoJcmV0dXJuICRwYWdpbmF0aW9uX3VybDsKfQoKZnVuY3Rpb24gcGFnaW5hdGlvbigkbnVtYmVyX29mX2l0ZW1zLCAkaXRlbXNfcHAsICRwYWdlX251bWJlciwgJG1heF9saW5rcykgewoJJHRvdGFsX3BhZ2VzID0gY2VpbCgkbnVtYmVyX29mX2l0ZW1zLyRpdGVtc19wcCk7CglpZigkcGFnZV9udW1iZXIpIHsKCQlpZigkcGFnZV9udW1iZXIgPiAxKSB7IAoJCQkkcHJldiA9ICI8YSBocmVmPSciLnBhZ2luYXRpb25fbGluaygoJHBhZ2VfbnVtYmVyIC0xICkpLiInPiZsdDsgUHJldmlvdXM8L2E+IjsgCgkJCSRmaXJzdCA9ICI8YSBocmVmPSciLnBhZ2luYXRpb25fbGluaygxKS4iJz4mbHQ7Jmx0OyBGaXJzdCBQYWdlPC9hPiI7IAoJCX0gZWxzZSB7CgkJCSRwcmV2ID0gIjxzcGFuPiZsdDsgUHJldmlvdXM8L3NwYW4+IjsKCQkJJGZpcnN0ID0gIjxzcGFuPiZsdDsmbHQ7IEZpcnN0IFBhZ2U8L3NwYW4+IjsKCQl9Cgl9CglpZigkcGFnZV9udW1iZXIgPCAkdG90YWxfcGFnZXMpIHsgCgkJJG5leHQgPSAiPGEgaHJlZj0nIi5wYWdpbmF0aW9uX2xpbmsoKCRwYWdlX251bWJlcisxKSkuIic+TmV4dCAmZ3Q7PC9hPiI7IAoJCSRsYXN0ID0gIjxhIGhyZWY9JyIucGFnaW5hdGlvbl9saW5rKCR0b3RhbF9wYWdlcykuIic+TGFzdCBQYWdlICZndDsmZ3Q7PC9hPiI7Cgl9IGVsc2UgewoJCSRuZXh0ID0gIjxzcGFuPk5leHQgJmd0Ozwvc3Bhbj4iOwoJCSRsYXN0ID0gIjxzcGFuPkxhc3QgUGFnZSAmZ3Q7Jmd0Ozwvc3Bhbj4iOwoJfQoJZWNobyAkZmlyc3Q7CgllY2hvICRwcmV2OwoJJGxvb3AgPSAwOwoJaWYoJHBhZ2VfbnVtYmVyID49ICRtYXhfbGlua3MpIHsKCQkkcGFnZV9jb3VudGVyID0gY2VpbCgkcGFnZV9udW1iZXIgLSAoJG1heF9saW5rcy0xKSk7Cgl9IGVsc2UgewoJCSRwYWdlX2NvdW50ZXIgPSAxOwoJfQoJaWYoJHRvdGFsX3BhZ2VzIDwgJG1heF9saW5rcyl7CgkJJG1heF9saW5rcyA9ICR0b3RhbF9wYWdlczsKCX0KCWRveyAKCQlpZigkcGFnZV9jb3VudGVyID09ICRwYWdlX251bWJlcikgewoJCQllY2hvICI8c3Ryb25nPnskcGFnZV9jb3VudGVyfTwvc3Ryb25nPiI7IAoJCX0gZWxzZSB7CgkJCWVjaG8gIjxhIGhyZWY9JyIucGFnaW5hdGlvbl9saW5rKCgkcGFnZV9jb3VudGVyKSkuIic+eyRwYWdlX2NvdW50ZXJ9PC9hPiI7CgkJfSAKCQkkcGFnZV9jb3VudGVyKys7ICRjdXJyZW50X3BhZ2U9KCRwYWdlX2NvdW50ZXIrMSk7CgkJJGxvb3ArKzsKCX0gd2hpbGUgKCRtYXhfbGlua3MgPiAkbG9vcCk7CgllY2hvICRuZXh0OwoJZWNobyAkbGFzdDsKfQoKaW5jbHVkZSAiaW5jbHVkZXMvZWRpdHByb2ZpbGUucGhwIjsKZWNobyAiPC9ib2R5PjwvaHRtbD4iOwo=")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | c57941c95b38ce89833eb76b0c6c056d |
Eval Count | 1 |
Decode Time | 119 ms |