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("PD9waHAgDQoJLy9Mb2dpbiBWYWxpZGF0aW9uIFN0YXJ0DQoJaW5jbHVkZ..
Decoded Output download
?>b'<?php
//Login Validation Start
include(\'../db.php\');
include(\'../set_pnr.php\');
ob_start();
/*---------------------All Ecode Meaning start-------------------------
1. Legal=Date || Encode=replace(d,)
2. Legal=Origin || Encode=replace(o,xss)
3. Legal=Destination || Encode=replace(o,xsss)
4. Legal=Trip || Encode=typeofmodule
5. Legal=Bus || Encode=typeofkgb
6. Legal=Route From || Encode=replace(r,f)
7. Legal=Route To || Encode=replace(r,t)
8. Legal=Route price || Encode=replace(r,p)
9. Legal=Trip Time || Encode=typeofkgc
---------------------All Ecode Meaning End-------------------------------*/
if(!isset($_COOKIE[\'agent_id\'])){
echo \'
<script>window.location.href="../login.php"</script>
\';
}
if(isset($_POST[\'logout\'])){
$id_name=\'agent_id\';
$id=\'\';
setcookie($id_name,$id,time() - (3600), "/");
header(\'location:../index.php\');
}
$agent_id=$_COOKIE[\'agent_id\'];
//Login Validation End
//initial seat css model start
$bus=htmlspecialchars(urldecode(base64_decode($_GET[\'typeofkgb\'])));
$seat_model_select="select * from bus where bus_name=\'".$bus."\'";
$seat_model_select_query=mysqli_query($db,$seat_model_select);
$seat_model_row=mysqli_fetch_assoc($seat_model_select_query);
$seat_model=$seat_model_row[\'seat_model\'];
$seat_table_select="select * from $seat_model where id=\'1\'";
$seat_table_query=mysqli_query($db,$seat_table_select);
$seat_table_row=mysqli_fetch_assoc($seat_table_query);
$seat_css=$seat_table_row[\'css\'];
//initial seat css model end
//Header Function Start
$profile_select="select * from all_user where id=\'".$agent_id."\'";
$profile_query=mysqli_query($db,$profile_select);
$profile_row=mysqli_fetch_assoc($profile_query);
$agent_name=$profile_row[\'name\'];
$agent_counter=$profile_row[\'counter\'];
if($profile_row[\'status\']!=\'active\'){
$id_name=\'agent_id\';
$id=\'\';
setcookie($id_name,$id,time() - (3600), "/");
header(\'location:../login.php\');
}
//Today function start
if(isset($_POST[\'today\'])){
if(!empty($_GET[\'replace(o,xss)\'])&&!empty($_GET[\'replace(o,xsss)\'])){
header(\'location:../Trip?length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for<24&&replace(b,)=MjAyMWjDuIoPaSh==&&(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,)},makeArray:function(a,b)&&replace(p,)=MjAyMW9YiSqQkHvX==&&{var c=b||[];&&replace(o,xss)=\'.htmlspecialchars($_GET[\'replace(o,xss)\']).\'&&return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var replace(w,)=MjAyMW9YiSqQkH7I==!!a&&"length"&&replace(o,xsss)=\'.htmlspecialchars($_GET[\'replace(o,xsss)\']).\'&&in{return e.call(this)},&& replace(d,)=\'.htmlspecialchars($_GET[\'replace(d,)\']).\'&&get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)}&&replace(n,)=MjAyMW9YiS8R5kHvX==,pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call\');
}
else{
header(\'location:../Trip?makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.mergefor<24&&replace(b,)=MjAyMW9YiSqQkHvX==&&(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c)&&replace(d,)=\'.htmlspecialchars($_GET[\'replace(d,)\']).\'&&{var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return String Function Array Date RegExp Object &&replace(o,xsb)=MjAyMW9YoP03QkHvX==&&Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"&&replace(p,)=MjAyMWJqY7oO9R6==&&in{return e.call(this)}\');
}
}
//Today function end
//Header Function End
//GET URL Validation Start
if(isset($_GET[\'typeofmodule\'])&&isset($_GET[\'replace(d,)\'])){
$trip_name=htmlspecialchars(urldecode(base64_decode($_GET[\'typeofmodule\'])));
$trip_date=htmlspecialchars(urldecode(base64_decode($_GET[\'replace(d,)\'])));
//date convert start
$year=$trip_date[0].$trip_date[1].$trip_date[2].$trip_date[3];
$day=$trip_date[8].$trip_date[9];
$month=$trip_date[5].$trip_date[6];
if($month==\'01\'){$month=\'Jan\';}else if($month==\'02\'){$month=\'Feb\';}else if($month==\'03\'){$month=\'Mar\';}else if($month==\'04\'){$month=\'Apr\';}else if($month==\'05\'){$month=\'May\';}else if($month==\'06\'){$month=\'Jun\';}else if($month==\'07\'){$month=\'Jul\';}else if($month==\'08\'){$month=\'Aug\';}else if($month==\'09\'){$month=\'Sep\';}else if($month==\'10\'){$month=\'Oct\';}else if($month==\'11\'){$month=\'Nov\';}else if($month==\'12\'){$month=\'Dec\';}
//date convert end
}
else{
header(\'location:../Trip?makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in{return e.call(this)}\');
}
//GET URL Validation End
//Animation Varriable Start
$animate=\'\';
$animate_2=\'\';
//Animation Varriable End
//Refresh Function Start
if(isset($_POST[\'refresh\'])){
$animate=\'animated zoomIn\';
$animate_2=\'animated flash\';
//Release Seat Start
$release_main_time=strtotime(date("H:i:s"));
$release_select="select * from ticket where status=1";
$release_query=mysqli_query($db,$release_select);
while($release_row=mysqli_fetch_assoc($release_query)){
$id=$release_row[\'id\'];
$release_stop_time=$release_row[\'stop_time\'];
if($release_main_time>$release_stop_time){
$release_update="update ticket set passenger_name=\'\',mobile=\'\',gender=\'\',user_name=\'\',bappy_from=\'\',bappy_to=\'\',boarding=\'\',dropping=\'\',issud_time=\'\',serial=\'\',stop_time=\'\',status=\'\',booking=\'\',pnr=\'\',departure_time=\'\',seat_fare=\'\',total_fare=\'\',discount=\'\',commission=\'\',counter=\'\' where id=\'".$id."\'";
$release_update_query=mysqli_query($db,$release_update);
}
}
//Release Seat End
}
//Refresh Function End
//Sold Ticket Function Start
$sold_ticket_select="select * from ticket where trip=\'".$trip_name."\'&&booking=\'booked\'&&journey_date=\'".$trip_date."\'";
$sold_ticket_query=mysqli_query($db,$sold_ticket_select);
$sold_ticket_count=mysqli_num_rows($sold_ticket_query);
//Sold Ticket Function End
//Available Ticket Function Start
$free_ticket_select="select * from ticket where trip=\'".$trip_name."\'&&booking=\'\'&&journey_date=\'".$trip_date."\'";
$free_ticket_query=mysqli_query($db,$free_ticket_select);
$free_ticket_count=mysqli_num_rows($free_ticket_query);
//Available Ticket Function End
/*---------------------------------------Necessary Query Start----------------------------------------------*/
//Counter Information Select Start
$counter_select="select * from all_counter where name=\'".$agent_counter."\'";
$counter_query=mysqli_query($db,$counter_select);
$counter_row=mysqli_fetch_assoc($counter_query);
$discount_permission=$counter_row[\'discount\'];
$commission=$counter_row[\'commission\'];
//Counter Information Select Start
/*---------------------------------------Necessary Query End----------------------------------------------*/
/*---------------------------------------Necessary Varriable Start----------------------------------------------*/
$stop_time = date("H:i:s",strtotime(date("H:i:s")." +5 minutes"));//after 5 minutes time
$stop_time = strtotime($stop_time);//after 5 minutes (Digit) time
/*---------------------------------------Necessary Varriable end----------------------------------------------*/
$trip_time=htmlspecialchars(urldecode(base64_decode($_GET[\'typeofkgc\'])));
?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>Booking</title>
<script src="../js/jquery.min.js"></script>
<script src="../js/foopicker.js"></script><!--Date Picker JS--->
<style>
<?php echo $seat_css?>
</style>
<!-- Custom Fonts -->
<link href="../font-awesome/css/all.min.css" rel="stylesheet">
<link href="../font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="../css/animation.css" />
<link rel="stylesheet" href="../css/responsive.css" />
<link rel="stylesheet" href="../css/print.css" />
<link rel="stylesheet" href="../css/seat.css" />
</head>
<body>
<!----------------------------------------------Page Loader Section Start------------------------------------------->
<!---preload start--->
<div class="sub_print" style="display:none;">
<div class="main_print">
</div>
</div>
<!---preload end--->
<!---print load start--->
<div class="load_wrapper" style="display:none;">
<div class="loader"></div>
</div>
<!---print load end--->
<!---Alert wrapper start--->
<div style="position:absolute;top:0;left:0;right:0;bottom:0;background:red;display:none;" id="alert"></div>
<!---Alert wrapper end--->
<!----------------------------------------------Page Loader Section End------------------------------------------->
<?php
/*---------------------------------------Seat Book Development Start----------------------------------------------*/
//Seat A1 Start
if(isset($_POST[\'seat1\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'A1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'A1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"A1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'A1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat A1 End
//Seat A2 Start
if(isset($_POST[\'seat2\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'A2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'A2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"A2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'A2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat A2 End
//Seat A3 Start
if(isset($_POST[\'seat3\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'A3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'A3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"A3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'A3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat A3 End
//Seat A4 Start
if(isset($_POST[\'seat4\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'A4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'A4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"A4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'A4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat A4 End
//Seat B1 Start
if(isset($_POST[\'seat5\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'B1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'B1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"B1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'B1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat B1 End
//Seat B2 Start
if(isset($_POST[\'seat6\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'B2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'B2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"B2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'B2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat B2 End
//Seat B3 Start
if(isset($_POST[\'seat7\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'B3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'B3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"B3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'B3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat B3 End
//Seat B4 Start
if(isset($_POST[\'seat8\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'B4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'B4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"B4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'B4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat B4 End
//Seat C1 Start
if(isset($_POST[\'seat9\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'C1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'C1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"C1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'C1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat C1 End
//Seat C2 Start
if(isset($_POST[\'seat10\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'C2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'C2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"C2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'C2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat C2 End
//Seat C3 Start
if(isset($_POST[\'seat11\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'C3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'C3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"C3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'C3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat C3 End
//Seat C4 Start
if(isset($_POST[\'seat12\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'C4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'C4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"C4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'C4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat C4 End
//Seat D1 Start
if(isset($_POST[\'seat13\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'D1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'D1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"D1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'D1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat D1 End
//Seat D2 Start
if(isset($_POST[\'seat14\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'D2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'D2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"D2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'D2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat D2 End
//Seat D3 Start
if(isset($_POST[\'seat15\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'D3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'D3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"D3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'D3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat D3 End
//Seat D4 Start
if(isset($_POST[\'seat16\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'D4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'D4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"D4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'D4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat D4 End
//Seat E1 Start
if(isset($_POST[\'seat17\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'E1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'E1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"E1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'E1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat E1 End
//Seat E2 Start
if(isset($_POST[\'seat18\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'E2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'E2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"E2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'E2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat E2 End
//Seat E3 Start
if(isset($_POST[\'seat19\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'E3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'E3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"E3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'E3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat E3 End
//Seat E4 Start
if(isset($_POST[\'seat20\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'E4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'E4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"E4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'E4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat E4 End
//Seat F1 Start
if(isset($_POST[\'seat21\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'F1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'F1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"F1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'F1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat F1 End
//Seat F2 Start
if(isset($_POST[\'seat22\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'F2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'F2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"F2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'F2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat F2 End
//Seat F3 Start
if(isset($_POST[\'seat23\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'F3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'F3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"F3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'F3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat F3 End
//Seat F4 Start
if(isset($_POST[\'seat24\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'F4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'F4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"F4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'F4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat F4 End
//Seat G1 Start
if(isset($_POST[\'seat25\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'G1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'G1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"G1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'G1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat G1 End
//Seat G2 Start
if(isset($_POST[\'seat26\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'G2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'G2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"G2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'G2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat G2 End
//Seat G3 Start
if(isset($_POST[\'seat27\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'G3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'G3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"G3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'G3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat G3 End
//Seat G4 Start
if(isset($_POST[\'seat28\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'G4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'G4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"G4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'G4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat G4 End
//Seat H1 Start
if(isset($_POST[\'seat29\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'H1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'H1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"H1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'H1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat H1 End
//Seat H2 Start
if(isset($_POST[\'seat30\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'H2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'H2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"H2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'H2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat H2 End
//Seat H3 Start
if(isset($_POST[\'seat31\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'H3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'H3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"H3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'H3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat H3 End
//Seat H4 Start
if(isset($_POST[\'seat32\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'H4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'H4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"H4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'H4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat H4 End
//Seat I1 Start
if(isset($_POST[\'seat33\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'I1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'I1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"I1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'I1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat I1 End
//Seat I2 Start
if(isset($_POST[\'seat34\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'I2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'I2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"I2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'I2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat I2 End
//Seat I3 Start
if(isset($_POST[\'seat35\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'I3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'I3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"I3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'I3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat I3 End
//Seat I4 Start
if(isset($_POST[\'seat36\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'I4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'I4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"I4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'I4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat I4 End
//Seat J1 Start
if(isset($_POST[\'seat37\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'J1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'J1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"J1",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'J1\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat J1 End
//Seat J2 Start
if(isset($_POST[\'seat38\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'J2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'J2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"J2",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'J2\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat J2 End
//Seat J3 Start
if(isset($_POST[\'seat39\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'J3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'J3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"J3",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'J3\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat J3 End
//Seat J4 Start
if(isset($_POST[\'seat40\'])){
//Seat Count Start
$seat_count_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$seat_select_query=mysqli_query($db,$seat_count_select);
$user_row=mysqli_fetch_assoc($seat_select_query);
$seat_count=mysqli_num_rows($seat_select_query);
//Seat Count End
//Booking Check Start
$check="select * from ticket where seat_name=\'J4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$check_query=mysqli_query($db,$check);
$check_row=mysqli_fetch_assoc($check_query);
$d_user_name=$check_row[\'user_name\'];
$booking_status=$check_row[\'booking\'];
//Booking Check End
//cancel seat in click start
if($check_row[\'user_name\']==$agent_name&&empty($booking_status)){
$update="update ticket set status=\'\',user_name=\'\',stop_time=\'\' where seat_name=\'J4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$query=mysqli_query($db,$update);
}
//cancel seat in click end
//selected sit alert start
else if($check_row[\'user_name\']!=$agent_name&&$check_row[\'status\']==1){
echo \'<script>alert("This sit is Selected By (ABCDEF)")</script>\';
}
//selected sit alert end
//Booked sit alert start
else if($booking_status==\'booked\'){
echo \'<script>
$.post("../final_book.php",{seat:"J4",trip:"\'.$trip_name.\'",date:"\'.$trip_date.\'"},function(data){$(".main_print").html(data)});
</script>\';
}
//Booked sit alert end
//Seat Book Limit start
else if($seat_count==5){
echo "
<script>alert(\'you Only Book Five Seats\')</script>
";
}
//Seat Book Limit end
//seat book user data send start
else if(empty($d_user_name)){
if(isset($_GET[\'replace(r,p)\'])){//Check GET Route
$update="update ticket set status=1,user_name=\'".$agent_name."\',stop_time=\'".$stop_time."\' where seat_name=\'J4\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";//user name send
$u_query=mysqli_query($db,$update);
$all_stop_time_update="update ticket set stop_time=\'".$stop_time."\' where user_name=\'".$agent_name."\'&&status=1";
$all_stop_time_update_query=mysqli_query($db,$all_stop_time_update);//All Seat Stop Time Is Same
}else{
echo \'<script>alert("Select Route Frist")</script>\';
}//Check GET Route End
}
//seat book user data send end
}
//Seat J4 End
/*---------------------------------------Seat Book Development End----------------------------------------------*/
?>
<!-------------------------------------------Main HTML Without Head And First Body----------------------------------->
<div class="seat_mother">
<!---Header Area Start--->
<div class="heading">
<form method="post"><!---Form For Header--->
<div class="logo" onclick="redirect()" style="cursor:pointer;"></div>
<button class="today" style="cursor:pointer;" name="today"><i class="fas fa-arrow-circle-left"></i> Back</button>
<span class="heading_date"><?php echo $day.\' \'.$month.\' \'.$year;?></span>
<span class="heading_trip"><?php echo $trip_name?></span>
<div class="counter">
<div class="title">Chaklader Paribohon</div>
<div class="title_2"><?php echo $agent_counter?></div>
</div>
<div class="name">Welcome   <span style="font-weight:bold;font-size:14px;color:#235a9e;"><?php echo $agent_name?></span></div>
<div class="menu" style="cursor:pointer;"><i class="fas fa-bars color"></i></div>
<div class="clear"></div>
<div class="side_bar">
<div class="main_manu">
<ul style="list-style:none;margin:0px;padding:0px;">
<li><i class="fas fa-list-alt"></i> <a href="#" style="text-decoration:none;color:#000;">Challan</a></li>
<li><i class="fas fa-lock"></i> <a href="#" style="text-decoration:none;color:#000;">Change Password</a></li>
<li><i class="fas fa-sign-out-alt"></i> <a href="#" style="text-decoration:none;color:#000;"><button name="logout" style="background:transparent;border:none;font-size:18px;font-family:auto;padding:0px;cursor:pointer;">Sign out</button></a></li>
</form>
</ul>
</div>
</div>
</div>
<!---Header Area End--->
<div class="padding_1">
<form method="post"><!---Form For Seat & Route--->
<div class="seat_box">
<div class="seat_box_heading">
<div class="sold"><span class="sold_content_1">Sold</span><br><span class="sold_content_2"><?php echo $sold_ticket_count?></span></div>
<div class="available">
<span class="available_content_1">Available</span><br><span class="available_content_2"><?php echo $free_ticket_count?></span>
</div>
<button class="refresh <?php echo $animate_2?>" name="refresh"><i class="fas fa-sync"></i> Refresh</button>
<div class="clear"></div>
</div>
<!---------------------------------------Seat Development Without Book Start-------------------------------------------->
<div id="main_seat" class="<?php echo $animate?>">
<!---All Seat And Information Select Start--->
<?php
$seat_select="select * from ticket where trip=\'".$trip_name."\' && journey_date=\'".$trip_date."\'";
$seat_query=mysqli_query($db,$seat_select);
$seat_class=1;//For Seat Class Varriable
while($seat_row=mysqli_fetch_assoc($seat_query)){
$seat=$seat_row[\'seat_name\'];
$status=$seat_row[\'status\'];
$booking=$seat_row[\'booking\'];
$gender=$seat_row[\'gender\'];
$user_name_db=$seat_row[\'user_name\'];
if($status==1&&$user_name_db==$agent_name){
$background=\'#47ff25\';//seat Color Varriable
$color=\'#ff0000\';
}
else if($status==1&&$user_name_db!=$agent_name){
$background=\'blue\';//seat Color Varriable
$color=\'#ff0000\';
}
else if($gender==\'F\'){
$background=\'#ff34e6\';//seat Color Varriable
$color=\'#000\';
}
else if($booking==\'booked\'){
$background=\'#ff0033\';//seat Color Varriable
$color=\'#000\';
}
else{
$background=\'green\';//seat Color Varriable
$color=\'#fff\';
}
if($trip_time!=\'Time Over\'){//Time Function Check
?>
<button class="s<?php echo $seat_class?> seat" name="seat<?php echo $seat_class?>" style="background:<?php echo $background?>;color:<?php echo $color?>"><?php echo $seat?></button>
<?php }else{?>
<div class="s<?php echo $seat_class?> seat" name="seat<?php echo $seat_class?>" style="background:<?php echo $background?>;color:<?php echo $color?>;width:64px;text-align:center;line-height:32px;"><?php echo $seat?></div><?php }?>
<?php $seat_class++;}?>
<!---All Seat And Information Select End--->
<div class="clear"></div>
</div>
</div>
<!---------------------------------------Seat Development Without Book End-------------------------------------------->
<!----------------------------------------Route Submit Development Start------------------------------------------------>
<div class="second_area">
<div class="route_box">
<div class="select_route">
<div class="route_margin">
<label>Route Select (<i class="fas fa-bahai"></i>)</label><br>
<?php
//Route Submit PHP Start
if(isset($_POST[\'route_submit\'])){
$main_route=$_POST[\'select_route\'];
$explode_route=explode("|",$main_route);
$route_form=$explode_route[0];
$route_to=$explode_route[1];
$route_price=$explode_route[2];
//header(\'location:../Book?typeofkgc=\'.$_GET[\'typeofkgc\'].\'&&replace(r,f)=\'.urlencode(base64_encode($route_form)).\'&&replace(r,t)=\'.urlencode(base64_encode($route_to)).\'&&replace(r,p)=\'.urlencode(base64_encode($route_price)).\'\');
echo \'<script>window.location.href="../Book"</script>\';
}
//Route Submit PHP End
?>
<select onchange="$(\'#route_submit\').click()" name="select_route">
<?php
//GET URL > Check From,To,Price Start
if(isset($_GET[\'replace(r,f)\'])){
$bappy_from=htmlspecialchars(urldecode(base64_decode($_GET[\'replace(r,f)\'])));
$bappy_to=htmlspecialchars(urldecode(base64_decode($_GET[\'replace(r,t)\'])));
$ticket_price=htmlspecialchars(urldecode(base64_decode($_GET[\'replace(r,p)\'])));
$show_route=$bappy_from.\'-\'.$bappy_to.\'-(\'.$ticket_price.\'.00 TK)\';//Adjust All Type Of GET Route
echo \'<option value="">\'.$show_route.\'</option>\';
//show without get route start
//id select start
$id_select="select id from price where bappy_from=\'".$bappy_from."\'&&bappy_to=\'".$bappy_to."\'&&price=\'".$ticket_price."\'";
$id_query=mysqli_query($db,$id_select);
$id_row=mysqli_fetch_assoc($id_query);
$unique_id=$id_row[\'id\'];
//id select end
$not_match_route_select="select * from price where trip=\'".$trip_name."\'&&id!=\'".$unique_id."\'";
$b=mysqli_query($db,$not_match_route_select);
while($r=mysqli_fetch_assoc($b)){
$nm_from=$r[\'bappy_from\'];//Not Match Variable
$nm_to=$r[\'bappy_to\'];//Not Match Variable
$nm_price=$r[\'price\'];//Not Match Variable
$nm_route_all=$nm_from.\'-\'.$nm_to.\'-(\'.$nm_price.\'.00 TK)\';
$this_route_value=$nm_from.\'|\'.$nm_to.\'|\'.$nm_price;//Make All Type Of GET Route Value
echo \'<option value="\'.$this_route_value.\'">\'.$nm_route_all.\'</option>\';
}
//show without get route end
}else{
//GET URL > Check From,To,Price End
?>
<!-- If Not Set GET From,To,Price --->
<option value="">Select Route</option>
<?php
$route_price_select="select * from price where trip=\'".$trip_name."\'";
$route_price_query=mysqli_query($db,$route_price_select);
while($route_price_row=mysqli_fetch_assoc($route_price_query)){
$from=$route_price_row[\'bappy_from\'];
$to=$route_price_row[\'bappy_to\'];
$route_price=$route_price_row[\'price\'];
$route_price_all=$from.\'-\'.$to.\'-(\'.$route_price.\'.00 TK)\';
?>
<option value="<?php echo $from?>|<?php echo $to?>|<?php echo $route_price?>" class="select_hide"><?php echo $from.\'-\'.$to.\'-(\'.$route_price.\'.00 TK)\'?></option>
<?php }}?>
</select>
<button name="route_submit" id="route_submit" style="opacity:0;">Bappy</button>
</div>
</div>
</div>
</form>
<!----------------------------------------Route Submit Development End------------------------------------------------>
<!----------------------------------------Boarding Submit Development Start-------------------------------------------->
<form method="post" autocomplete="off"><!---Form For Final--->
<div class="boarding_box">
<div class="select_boarding">
<div class="boarding_margin">
<label>Boarding Point (<i class="fas fa-bahai"></i>)</label><br>
<select name="boarding" required>
<?php
if(isset($_GET[\'replace(r,f)\'])){
//Own Counter Boarding Start
$self_boarding_select="select * from main_boarding where boarding_counter=\'".$agent_counter."\'&&boarding_city=\'".$bappy_from."\'&&trip=\'".$trip_name."\'";
$self_boarding_query=mysqli_query($db,$self_boarding_select);
$self_boarding_count=mysqli_num_rows($self_boarding_query);
if($self_boarding_count>0){
$self_boarding_row=mysqli_fetch_assoc($self_boarding_query);
$self_boarding_id=$self_boarding_row[\'id\'];
$self_boarding_point=$self_boarding_row[\'boarding_point\'];
$self_boarding_time=$self_boarding_row[\'national_time\'];
echo \'<option value="\'.$self_boarding_point.\'-\'.$self_boarding_time.\'">\'.$self_boarding_point.\' - \'.$self_boarding_time.\'</option>\';
//Own Counter Boarding End
//Select Boarding Without Own Start
$boarding_select="select * from main_boarding where id!=\'".$self_boarding_id."\'&&boarding_city=\'".$bappy_from."\'&&trip=\'".$trip_name."\'";
$boarding_query=mysqli_query($db,$boarding_select);
while($boarding_row=mysqli_fetch_assoc($boarding_query)){
$boarding_point=$boarding_row[\'boarding_point\'];
$boarding_time=$boarding_row[\'national_time\'];
echo \'<option value="\'.$boarding_point.\'-\'.$boarding_time.\'">\'.$boarding_point.\' - \'.$boarding_time.\'</option>\';
}
//Select Boarding Without Own End
}
else{
echo \'<option value="">Select Boarding Point</option>\';
$boarding_select="select * from main_boarding where boarding_city=\'".$bappy_from."\'&&trip=\'".$trip_name."\'";
$boarding_query=mysqli_query($db,$boarding_select);
while($boarding_row=mysqli_fetch_assoc($boarding_query)){
$boarding_point=$boarding_row[\'boarding_point\'];
$boarding_time=$boarding_row[\'national_time\'];
echo \'<option value="\'.$boarding_point.\'-\'.$boarding_time.\'">\'.$boarding_point.\' - \'.$boarding_time.\'</option>\';
}
}
}
else{
echo \'<option value="">Select Boarding Point</option>\';
}
?>
</select>
</div>
</div>
</div>
<!----------------------------------------Boarding Submit Development End-------------------------------------------->
<!----------------------------------------Dropping Submit Development Start-------------------------------------------->
<div class="dropping_box">
<div class="select_dropping">
<div class="dropping_margin">
<label>Dropping Point (<i class="fas fa-bahai"></i>)</label><br>
<select name="dropping" required>
<?php
if(isset($_GET[\'replace(r,t)\'])){
$dropping_select="select * from main_dropping where dropping_city=\'".$bappy_to."\'&&trip=\'".$trip_name."\'";
$dropping_query=mysqli_query($db,$dropping_select);
while($dropping_row=mysqli_fetch_assoc($dropping_query)){
$dropping_point=$dropping_row[\'dropping_point\'];
$dropping_time=$dropping_row[\'dropping_time\'];
echo \'<option value="\'.$dropping_point.\'-\'.$dropping_time.\'">\'.$dropping_point.\' - \'.$dropping_time.\'</option>\';
}
}
else{
echo \'<option value="">Select Dropping Point</option>\';
}
?>
</select>
</div>
</div>
</div>
<!----------------------------------------Dropping Submit Development End-------------------------------------------->
<?php
if(isset($_GET[\'replace(r,p)\'])){
?>
<div class="ticket_price" align="center">
<div class="ticket_price_2">
<label>Ticket Price</label><br>
<div class="ticket_bar"><?php echo $ticket_price?>.00 TK</div>
</div>
</div>
<?php }?>
<div class="booking_type" align="center">
<div class="booking_type_2">
<label>Booking Type</label><br>
<div class="booking_bar">Paid ✓</div>
</div>
</div>
</div>
<!---------------------------------------------Passenger Information Area Start-------------------------------------->
<!-----------------------Countdown Select PHP Start----------------------->
<?php
$countdown_select="select * from ticket where trip=\'".$trip_name."\' && journey_date=\'".$trip_date."\'&&user_name=\'".$agent_name."\'&&status=1";
$countdown_query=mysqli_query($db,$countdown_select);
$countdown_row=mysqli_fetch_assoc($countdown_query);
if(!empty($countdown_row)){
$countdown_end_time=$countdown_row[\'stop_time\'];
echo $countdown_end_time=date(\'H:i:s\',$countdown_end_time);
}
$countdown_date=date(\'M d,2020\');
$countdown_date=date(\'M d,Y\', strtotime($countdown_date. \' + 1 days\'));
?>
<!-----------------------Countdown Select PHP End----------------------->
<?php
//-----Discount Validation Start
if($discount_permission==\'yes\'){
if(!empty($_POST[\'discount\'])){
$discount=$_POST[\'discount\'];
$ticket_price=$ticket_price-$discount;
}else{$discount="";}
}else{$discount="";}
//-----Discount Validation End
?>
<div class="name_box">
<div class="name_heading"><i class="fas fa-info-circle"></i> Passenger Information</div>
<?php
$i=1;
$passenger_select="select * from ticket where status=1&&user_name=\'".$agent_name."\'&&trip=\'".$trip_name."\'&&journey_date=\'".$trip_date."\'";
$passenger_select_query=mysqli_query($db,$passenger_select);
$passenger_count=mysqli_num_rows($passenger_select_query);
if(!empty($ticket_price)){
$total_ticket_price=htmlspecialchars(urldecode(base64_decode($_GET[\'replace(r,p)\'])))*$passenger_count;//Total Ticket Price
while($passenger_row=mysqli_fetch_assoc($passenger_select_query)){
$seat_name=$passenger_row[\'seat_name\'];
?>
<div class="main_info">
<div class="serial"><?php echo $i?></div>
<div class="seat_info"><?php echo $seat_name?></div>
<div class="gender">
<select name="<?php echo $seat_name?>">
<option value="M">Male</option>
<option value="F">Female</option>
</select>
</div>
<div class="price"><?php echo $ticket_price?> TK</div>
<div class="remove" value="<?php echo $seat_name?>">Cancel</div>
<div class="timer" id="<?php echo $i?>timer"><div class="lds-dual-ring"></div></div>
<div class="clear"></div>
<div style="position:fixed;top:0px;" class="bbb"></div>
<script>
$(".remove").click(function(){
$(this).css("background","#000");
var seat_no=$(this).attr("value");
$.post("../final_book.php",{remove:0,trip_name:"<?php echo $trip_name?>",trip_date:"<?php echo $trip_date?>",seat_no:seat_no});
window.location.href="";
});
</script>
<!---------------------------CountDown Timer Section Start------------------------>
<!-- Display the countdown timer in an element -->
<p id="demo"></p>
<script>
// Set the date we\'re counting down to
var countDownDate = new Date("<?php echo $countdown_date?> <?php echo $countdown_end_time?>").getTime();
// Update the count down every 1 second
var x = setInterval(function() {
// Get today\'s date and time
var now = new Date().getTime();
// Find the distance between now and the count down date
var distance = countDownDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Display the result in the element with id="demo"
document.getElementById("<?php echo $i?>timer").innerHTML ="0"+minutes + ": " + seconds;
if(seconds<10){
document.getElementById("<?php echo $i?>timer").innerHTML = "0"+minutes + ":0" + seconds;
}
// If the count down is finished, write some text
/*if (distance < 0) {
clearInterval(x);
$(".sub_print").show();
setTimeout(function(){
$(".refresh").click();
},2000);
}*/
if(minutes==0&&seconds==0){
clearInterval(x);
$(".sub_print").show();
setTimeout(function(){
$(".refresh").click();
},2000);
}
}, 1000);
</script>
<!---------------------------CountDown Timer Section End------------------------>
</div>
<?php
/*-----------------------Send All Data Temporari Table Start-----------------------*/
if(isset($_POST[\'confirm\'])){
$passenger_name=strtoupper($_POST[\'passenger_name\']);
$mobile_number=$_POST[\'mobile_number\'];
$gender=$_POST[$seat_name];
$boarding=$_POST[\'boarding\'];
$explode_boarding=explode("-",$boarding);
$boarding_point=$explode_boarding[0];
$boarding_time=$explode_boarding[1];
$dropping=$_POST[\'dropping\'];
$explode_dropping=explode("-",$dropping);
$dropping_point=$explode_dropping[0];
$_SESSION[\'pnr\']=$pnr;//send pnr in session
//Final Send Query Temporari Table Start
$delete_tmp="delete from tmp_table where user_name=\'".$agent_name."\'&&pnr!=\'".$pnr."\'";
$delete_tmp_query=mysqli_query($db,$delete_tmp);
$serial_select="select * from ticket where booking=\'booked\'";
$serial_select_query=mysqli_query($db,$serial_select);
$serial_count=mysqli_num_rows($serial_select_query);
$main_serial=$serial_count+1;
$tmp_insert="insert into tmp_table(seat_name,passenger_name,mobile,gender,user_name,bappy_from,bappy_to,boarding,dropping,issud_date,issud_time,serial,stop_time,status,booking,pnr,trip,journey_date,departure_time,seat_fare,total_fare,discount,commission,counter)values(\'".$seat_name."\',\'".$passenger_name."\',\'".$mobile_number."\',\'".$gender."\',\'".$agent_name."\',\'".$bappy_from."\',\'".$bappy_to."\',\'".$boarding_point."\',\'".$dropping_point."\',\'".$main_date."\',\'".$main_time."\',\'".$main_serial."\',\'\',\'0\',\'booked\',\'".$pnr."\',\'".$trip_name."\',\'".$trip_date."\',\'".$boarding_time."\',\'".$ticket_price."\',\'".$total_ticket_price."\',\'".$discount."\',\'".$commission."\',\'".$agent_counter."\')";
$tmp_insert_query=mysqli_query($db,$tmp_insert);
//Final Send Query Temporari Table End
//Show Confirm Box Start
//Discount Show Or Hide Development Start
if(!empty($_POST[\'discount\'])){
$discount_display=\'display:block\';
$confirm_box_discount=$_POST[\'discount\']*$passenger_count;
$confirm_box_total=$total_ticket_price-$confirm_box_discount;
}else{
$discount_display=\'display:none\';
$confirm_box_discount=\'\';
$confirm_box_total=\'\';}
//Discount Show Or Hide Development End
echo \'
<div class="sub_final_confirm">
<div class="final_confirm">
<span style="margin-bottom:10px;">Route : \'.$bappy_from.\' - \'.$bappy_to.\'  - (BDT. \'.$total_ticket_price.\'.00 )</span>
<span style="margin-bottom:10px;\'.$discount_display.\'">Discount:\'.$confirm_box_discount.\' Taka</span>
<span style="margin-bottom:10px;\'.$discount_display.\'">Sub Total:\'.$confirm_box_total.\' Taka</span>
<span style="margin-bottom:10px;">Booking Type : Paid</span>
<span>Are you sure? want to proceed? </span>
<div class="cancel" name="cancel">No</div>
<div class="yes" name="final_book">Yes</div>
<div class="clear"></div>
</div>
</div>
\';
//Show Confirm Box End
//final send data in JQUERY start
$send_pnr=$_SESSION[\'pnr\'];
echo \'
<script>
$(".cancel").click(function(){
$(".sub_final_confirm").slideUp(500);
$.post("../final_book.php",{delete_pnr:"\'.$send_pnr.\'"},function(data){$(".last").html(data)});
});
$(".yes").click(function(){
$(".last").show();
$(".sub_final_confirm").hide();
$.post("../final_book.php",{pnr:"\'.$send_pnr.\'"},function(data){$(".main_print").html(data)});
});
</script>
\';
//final send in JQUERY data end
}
/*-----------------------Send All Data Temporari Table End-----------------------*/
?>
<?php $i++;}}?>
<div class="clear"></div>
<!---------------------------------------------Passenger Information Area End-------------------------------------->
<!--------------------------------------------------Discount Section Start----------------------------------------->
<?php
if($passenger_count>0&&!empty($ticket_price)){
?>
<script type="text/javascript">
function calculateDiscount() {
var main_price = document.getElementById("main_price").value;
var count="<?php echo $passenger_count?>";
var discount = document.getElementById("discount").value;
var math=discount*count;
total = eval(main_price - math);
if(total<=0){
alert("Please Check Discount");
document.getElementById(\'discount\').value ="";
document.getElementById(\'total_index\').innerHTML ="Sub Total:";
document.getElementById(\'total_price\').innerHTML ="<?php echo $total_ticket_price?>";
document.getElementById(\'show_discount\').style.display ="none";
document.getElementById(\'discount_total\').style.display ="none";
}
else{
document.getElementById(\'total_index\').innerHTML ="Total:";
document.getElementById(\'show_discount_price\').innerHTML = math;
document.getElementById(\'show_discount\').style.display ="block";
document.getElementById(\'discount_total\').style.display ="block";
document.getElementById(\'discount_total_price\').innerHTML =total;
}
}
</script>
<div class="total" id="sub_total"><span id="total_index">Sub Total:</span> <span id="total_price"><?php echo $total_ticket_price?></span> Tk</div>
<div class="show_discount" id="show_discount">Discount: <span id="show_discount_price"><?php echo $total_ticket_price?></span> Tk</div>
<div class="discount_total" id="discount_total">Sub Total: <span id="discount_total_price"><?php echo $total_ticket_price?></span> Tk</div>
<!--------------------------------------------------Discount Section End----------------------------------------->
<?php }?>
<div class="passenger_name">
<div class="passenger_name_1">Passenger Name</div>
<div class="passenger_name_2"><input type="text" placeholder="Passenger Name" name="passenger_name" maxlength="20" required /></div>
</div>
<div class="passenger_mobile">
<div class="passenger_mobile_1">Passenger Mobile Number</div>
<div class="passenger_mobile_2"><input type="text" placeholder="Mobile Number" name="mobile_number" maxlength="11" minlength="1" onkeypress=\'validate(event)\' required /></div>
</div>
<!---Discount Div Only Start--->
<?php
if($discount_permission==\'yes\'){
?>
<div class="discount">
<div class="discount_1">Discount Per Ticket</div>
<input type="hidden" id="main_price" value="<?php echo $total_ticket_price?>" />
<div class="discount_2"><input id="discount" type="text" placeholder="Discount" name="discount" onkeypress=\'validate(event)\' onkeyup="calculateDiscount()"/></div>
</div>
<?php }?>
<!---Discount Div Only End--->
<?php if($passenger_count>0){?><button class="on_confirm" name="confirm">Confirm</button><?php }else{?>
<div class="off_confirm">Confirm</div><?php }?>
</div>
<div class="clear"></div>
</form>
</div>
</div>
<!---<div class="footer"><span class="status">Status:</span><i class="fas fa-signal"></i><span class="online">Online</span></div>--->
</body>
</html>
<!------------------------------------Hide Select Option in Time Over Start------------------------------------->
<?php
if($trip_time==\'Time Over\'){
echo \'
<script>$(".select_hide").hide();</script>
<div class="time_over_wrapper">
<div class="time_over_content">This Trip is Out Of Time</div>
</div>
\';
}
?>
<!------------------------------------Hide Select Option in Time Over End------------------------------------->
<script>
$(".menu").click(function(){
$(".side_bar").slideDown(300);
});
$(".side_bar").click(function(){
$(".side_bar").slideUp(300);
});
$(".main_manu").click(function(){
$(".side_bar").slideUp(300);
});
</script>
<script>
function validate(evt) {
var theEvent = evt || window.event;
// Handle paste
if (theEvent.type === \'paste\') {
key = event.clipboardData.getData(\'text/plain\');
} else {
// Handle key press
var key = theEvent.keyCode || theEvent.which;
key = String.fromCharCode(key);
}
var regex = /[0-9]|./;
if( !regex.test(key) ) {
theEvent.returnValue = false;
if(theEvent.preventDefault) theEvent.preventDefault();
}
}
//Image Click And Redirect
function redirect(){
window.location.href=\'../Trip?makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in{return e.call(this)}\';
}
//Image Click And Redirect
</script>
<script>
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
</script>'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHAgDQoJLy9Mb2dpbiBWYWxpZGF0aW9uIFN0YXJ0DQoJaW5jbHVkZSgnLi4vZGIucGhwJyk7DQoJaW5jbHVkZSgnLi4vc2V0X3Buci5waHAnKTsNCglvYl9zdGFydCgpOw0KCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tQWxsIEVjb2RlIE1lYW5pbmcgc3RhcnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCTEuIExlZ2FsPURhdGUgfHwgRW5jb2RlPXJlcGxhY2UoZCwpIA0KCQkyLiBMZWdhbD1PcmlnaW4gfHwgRW5jb2RlPXJlcGxhY2Uobyx4c3MpIA0KCQkzLiBMZWdhbD1EZXN0aW5hdGlvbiB8fCBFbmNvZGU9cmVwbGFjZShvLHhzc3MpIA0KCQk0LiBMZWdhbD1UcmlwIHx8IEVuY29kZT10eXBlb2Ztb2R1bGUgIA0KCQk1LiBMZWdhbD1CdXMgfHwgRW5jb2RlPXR5cGVvZmtnYiAgDQoJCTYuIExlZ2FsPVJvdXRlIEZyb20gfHwgRW5jb2RlPXJlcGxhY2UocixmKSAgIA0KCQk3LiBMZWdhbD1Sb3V0ZSBUbyB8fCBFbmNvZGU9cmVwbGFjZShyLHQpICAgDQoJCTguIExlZ2FsPVJvdXRlIHByaWNlIHx8IEVuY29kZT1yZXBsYWNlKHIscCkgIA0KCQk5LiBMZWdhbD1UcmlwIFRpbWUgfHwgRW5jb2RlPXR5cGVvZmtnYw0KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLUFsbCBFY29kZSBNZWFuaW5nIEVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyANCglpZighaXNzZXQoJF9DT09LSUVbJ2FnZW50X2lkJ10pKXsNCgkJZWNobyAnDQoJCQk8c2NyaXB0PndpbmRvdy5sb2NhdGlvbi5ocmVmPSIuLi9sb2dpbi5waHAiPC9zY3JpcHQ+DQoJCSc7DQoJfQ0KCWlmKGlzc2V0KCRfUE9TVFsnbG9nb3V0J10pKXsNCgkJJGlkX25hbWU9J2FnZW50X2lkJzsNCgkJJGlkPScnOw0KCQlzZXRjb29raWUoJGlkX25hbWUsJGlkLHRpbWUoKSAtICgzNjAwKSwgIi8iKTsNCgkJaGVhZGVyKCdsb2NhdGlvbjouLi9pbmRleC5waHAnKTsNCgkJDQoJfQ0KCSRhZ2VudF9pZD0kX0NPT0tJRVsnYWdlbnRfaWQnXTsNCgkvL0xvZ2luIFZhbGlkYXRpb24gRW5kDQoJDQoJLy9pbml0aWFsIHNlYXQgY3NzIG1vZGVsIHN0YXJ0DQoJJGJ1cz1odG1sc3BlY2lhbGNoYXJzKHVybGRlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWyd0eXBlb2ZrZ2InXSkpKTsNCgkkc2VhdF9tb2RlbF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gYnVzIHdoZXJlIGJ1c19uYW1lPSciLiRidXMuIiciOw0KCSRzZWF0X21vZGVsX3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X21vZGVsX3NlbGVjdCk7DQoJJHNlYXRfbW9kZWxfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9tb2RlbF9zZWxlY3RfcXVlcnkpOw0KCSRzZWF0X21vZGVsPSRzZWF0X21vZGVsX3Jvd1snc2VhdF9tb2RlbCddOw0KCSRzZWF0X3RhYmxlX3NlbGVjdD0ic2VsZWN0ICogZnJvbSAkc2VhdF9tb2RlbCB3aGVyZSBpZD0nMSciOw0KCSRzZWF0X3RhYmxlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfdGFibGVfc2VsZWN0KTsNCgkkc2VhdF90YWJsZV9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3RhYmxlX3F1ZXJ5KTsNCgkkc2VhdF9jc3M9JHNlYXRfdGFibGVfcm93Wydjc3MnXTsNCgkvL2luaXRpYWwgc2VhdCBjc3MgbW9kZWwgZW5kDQoJDQoJLy9IZWFkZXIgRnVuY3Rpb24gU3RhcnQNCgkkcHJvZmlsZV9zZWxlY3Q9InNlbGVjdCAqIGZyb20gYWxsX3VzZXIgd2hlcmUgaWQ9JyIuJGFnZW50X2lkLiInIjsNCgkkcHJvZmlsZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRwcm9maWxlX3NlbGVjdCk7DQoJJHByb2ZpbGVfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkcHJvZmlsZV9xdWVyeSk7DQoJJGFnZW50X25hbWU9JHByb2ZpbGVfcm93WyduYW1lJ107DQoJJGFnZW50X2NvdW50ZXI9JHByb2ZpbGVfcm93Wydjb3VudGVyJ107DQoJaWYoJHByb2ZpbGVfcm93WydzdGF0dXMnXSE9J2FjdGl2ZScpew0KCQkkaWRfbmFtZT0nYWdlbnRfaWQnOw0KCQkkaWQ9Jyc7DQoJCXNldGNvb2tpZSgkaWRfbmFtZSwkaWQsdGltZSgpIC0gKDM2MDApLCAiLyIpOw0KCQloZWFkZXIoJ2xvY2F0aW9uOi4uL2xvZ2luLnBocCcpOw0KCX0NCgkNCgkgLy9Ub2RheSBmdW5jdGlvbiBzdGFydA0KCQlpZihpc3NldCgkX1BPU1RbJ3RvZGF5J10pKXsNCgkJCWlmKCFlbXB0eSgkX0dFVFsncmVwbGFjZShvLHhzcyknXSkmJiFlbXB0eSgkX0dFVFsncmVwbGFjZShvLHhzc3MpJ10pKXsNCgkJCQloZWFkZXIoJ2xvY2F0aW9uOi4uL1RyaXA/bGVuZ3RoO2M+ZDtkKyspaWYoYi5jYWxsKGFbZF0sZCxhW2RdKT09PSExKWJyZWFrfWVsc2UgZm9yPDI0JiZyZXBsYWNlKGIsKT1NakF5TVdqRHVJb1BhU2g9PSYmKGQgaW4gYSlpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6KGErIiIpLnJlcGxhY2UobywpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKSYmcmVwbGFjZShwLCk9TWpBeU1XOVlpU3FRa0h2WD09JiZ7dmFyIGM9Ynx8W107JiZyZXBsYWNlKG8seHNzKT0nLmh0bWxzcGVjaWFsY2hhcnMoJF9HRVRbJ3JlcGxhY2Uobyx4c3MpJ10pLicmJnJldHVybiBudWxsIT1hJiYocyhPYmplY3QoYSkpP24ubWVyZ2UoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmcuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihoKXJldHVybiBoLmNhbGwoYixhLGMpO2ZvcihkPWIubGVuZ3RoLGM9Yz8wPmM/TWF0aC5tYXgoMCxkK2MpOmM6MDtkPmM7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBzKGEpe3ZhciByZXBsYWNlKHcsKT1NakF5TVc5WWlTcVFrSDdJPT0hIWEmJiJsZW5ndGgiJiZyZXBsYWNlKG8seHNzcyk9Jy5odG1sc3BlY2lhbGNoYXJzKCRfR0VUWydyZXBsYWNlKG8seHNzcyknXSkuJyYmaW57cmV0dXJuIGUuY2FsbCh0aGlzKX0sJiYgcmVwbGFjZShkLCk9Jy5odG1sc3BlY2lhbGNoYXJzKCRfR0VUWydyZXBsYWNlKGQsKSddKS4nJiZnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTplLmNhbGwodGhpcyl9JiZyZXBsYWNlKG4sKT1NakF5TVc5WWlTOFI1a0h2WD09LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1uLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiBuLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbCcpOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQloZWFkZXIoJ2xvY2F0aW9uOi4uL1RyaXA/bWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZWZvcjwyNCYmcmVwbGFjZShiLCk9TWpBeU1XOVlpU3FRa0h2WD09JiYoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmcuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKSYmcmVwbGFjZShkLCk9Jy5odG1sc3BlY2lhbGNoYXJzKCRfR0VUWydyZXBsYWNlKGQsKSddKS4nJiZ7dmFyIGQ7aWYoYil7aWYoaClyZXR1cm4gaC5jYWxsKGIsYSxjKTtmb3IoZD1iLmxlbmd0aCxjPWM/MD5jP01hdGgubWF4KDAsZCtjKTpjOjA7ZD5jO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0ICYmcmVwbGFjZShvLHhzYik9TWpBeU1XOVlvUDAzUWtIdlg9PSYmRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBzKGEpe3ZhciBiPSEhYSYmImxlbmd0aCImJnJlcGxhY2UocCwpPU1qQXlNV0pxWTdvTzlSNj09JiZpbntyZXR1cm4gZS5jYWxsKHRoaXMpfScpOw0KCQkJfQ0KCQl9DQoJICAvL1RvZGF5IGZ1bmN0aW9uIGVuZA0KCS8vSGVhZGVyIEZ1bmN0aW9uIEVuZA0KCQ0KCS8vR0VUIFVSTCBWYWxpZGF0aW9uIFN0YXJ0DQoJaWYoaXNzZXQoJF9HRVRbJ3R5cGVvZm1vZHVsZSddKSYmaXNzZXQoJF9HRVRbJ3JlcGxhY2UoZCwpJ10pKXsNCgkJJHRyaXBfbmFtZT1odG1sc3BlY2lhbGNoYXJzKHVybGRlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWyd0eXBlb2Ztb2R1bGUnXSkpKTsNCgkJJHRyaXBfZGF0ZT1odG1sc3BlY2lhbGNoYXJzKHVybGRlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWydyZXBsYWNlKGQsKSddKSkpOw0KCQkNCgkJDQoJCS8vZGF0ZSBjb252ZXJ0IHN0YXJ0DQoJCSAkeWVhcj0kdHJpcF9kYXRlWzBdLiR0cmlwX2RhdGVbMV0uJHRyaXBfZGF0ZVsyXS4kdHJpcF9kYXRlWzNdOw0KCQkgJGRheT0kdHJpcF9kYXRlWzhdLiR0cmlwX2RhdGVbOV07DQoJCSAkbW9udGg9JHRyaXBfZGF0ZVs1XS4kdHJpcF9kYXRlWzZdOw0KCQkgaWYoJG1vbnRoPT0nMDEnKXskbW9udGg9J0phbic7fWVsc2UgaWYoJG1vbnRoPT0nMDInKXskbW9udGg9J0ZlYic7fWVsc2UgaWYoJG1vbnRoPT0nMDMnKXskbW9udGg9J01hcic7fWVsc2UgaWYoJG1vbnRoPT0nMDQnKXskbW9udGg9J0Fwcic7fWVsc2UgaWYoJG1vbnRoPT0nMDUnKXskbW9udGg9J01heSc7fWVsc2UgaWYoJG1vbnRoPT0nMDYnKXskbW9udGg9J0p1bic7fWVsc2UgaWYoJG1vbnRoPT0nMDcnKXskbW9udGg9J0p1bCc7fWVsc2UgaWYoJG1vbnRoPT0nMDgnKXskbW9udGg9J0F1Zyc7fWVsc2UgaWYoJG1vbnRoPT0nMDknKXskbW9udGg9J1NlcCc7fWVsc2UgaWYoJG1vbnRoPT0nMTAnKXskbW9udGg9J09jdCc7fWVsc2UgaWYoJG1vbnRoPT0nMTEnKXskbW9udGg9J05vdic7fWVsc2UgaWYoJG1vbnRoPT0nMTInKXskbW9udGg9J0RlYyc7fQ0KCQkvL2RhdGUgY29udmVydCBlbmQNCgkJDQoJCQ0KCX0NCgllbHNlew0KCQloZWFkZXIoJ2xvY2F0aW9uOi4uL1RyaXA/bWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGgpcmV0dXJuIGguY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtpWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHMoYSl7dmFyIGI9ISFhJiYibGVuZ3RoImlue3JldHVybiBlLmNhbGwodGhpcyl9Jyk7DQoJfQ0KCS8vR0VUIFVSTCBWYWxpZGF0aW9uIEVuZA0KCQ0KCQ0KCQ0KCQ0KCS8vQW5pbWF0aW9uIFZhcnJpYWJsZSBTdGFydA0KCSRhbmltYXRlPScnOw0KCSRhbmltYXRlXzI9Jyc7DQoJLy9BbmltYXRpb24gVmFycmlhYmxlIEVuZA0KCQ0KCQ0KCQ0KCQ0KCS8vUmVmcmVzaCBGdW5jdGlvbiBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsncmVmcmVzaCddKSl7DQoJCSRhbmltYXRlPSdhbmltYXRlZCB6b29tSW4nOw0KCQkkYW5pbWF0ZV8yPSdhbmltYXRlZCBmbGFzaCc7DQoJCS8vUmVsZWFzZSBTZWF0IFN0YXJ0DQoJCSRyZWxlYXNlX21haW5fdGltZT1zdHJ0b3RpbWUoZGF0ZSgiSDppOnMiKSk7DQoJCSRyZWxlYXNlX3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEiOw0KCQkkcmVsZWFzZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRyZWxlYXNlX3NlbGVjdCk7DQoJCXdoaWxlKCRyZWxlYXNlX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHJlbGVhc2VfcXVlcnkpKXsNCgkJJGlkPSRyZWxlYXNlX3Jvd1snaWQnXTsNCgkJJHJlbGVhc2Vfc3RvcF90aW1lPSRyZWxlYXNlX3Jvd1snc3RvcF90aW1lJ107DQoJCWlmKCRyZWxlYXNlX21haW5fdGltZT4kcmVsZWFzZV9zdG9wX3RpbWUpew0KCQkJJHJlbGVhc2VfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBwYXNzZW5nZXJfbmFtZT0nJyxtb2JpbGU9JycsZ2VuZGVyPScnLHVzZXJfbmFtZT0nJyxiYXBweV9mcm9tPScnLGJhcHB5X3RvPScnLGJvYXJkaW5nPScnLGRyb3BwaW5nPScnLGlzc3VkX3RpbWU9Jycsc2VyaWFsPScnLHN0b3BfdGltZT0nJyxzdGF0dXM9JycsYm9va2luZz0nJyxwbnI9JycsZGVwYXJ0dXJlX3RpbWU9Jycsc2VhdF9mYXJlPScnLHRvdGFsX2ZhcmU9JycsZGlzY291bnQ9JycsY29tbWlzc2lvbj0nJyxjb3VudGVyPScnIHdoZXJlIGlkPSciLiRpZC4iJyI7DQoJCQkkcmVsZWFzZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkcmVsZWFzZV91cGRhdGUpOw0KCQkgIH0NCgkJfQ0KCQkvL1JlbGVhc2UgU2VhdCBFbmQNCgl9DQoJLy9SZWZyZXNoIEZ1bmN0aW9uIEVuZA0KCQ0KDQoJDQoJDQoJLy9Tb2xkIFRpY2tldCBGdW5jdGlvbiBTdGFydA0KCSRzb2xkX3RpY2tldF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmYm9va2luZz0nYm9va2VkJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSRzb2xkX3RpY2tldF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzb2xkX3RpY2tldF9zZWxlY3QpOw0KCSRzb2xkX3RpY2tldF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNvbGRfdGlja2V0X3F1ZXJ5KTsNCgkvL1NvbGQgVGlja2V0IEZ1bmN0aW9uIEVuZA0KCQ0KCQ0KCS8vQXZhaWxhYmxlIFRpY2tldCBGdW5jdGlvbiBTdGFydA0KCSRmcmVlX3RpY2tldF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmYm9va2luZz0nJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSRmcmVlX3RpY2tldF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRmcmVlX3RpY2tldF9zZWxlY3QpOw0KCSRmcmVlX3RpY2tldF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJGZyZWVfdGlja2V0X3F1ZXJ5KTsNCgkvL0F2YWlsYWJsZSBUaWNrZXQgRnVuY3Rpb24gRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJDQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1OZWNlc3NhcnkgUXVlcnkgU3RhcnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCgkNCgkvL0NvdW50ZXIgSW5mb3JtYXRpb24gU2VsZWN0IFN0YXJ0DQoJJGNvdW50ZXJfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIGFsbF9jb3VudGVyIHdoZXJlIG5hbWU9JyIuJGFnZW50X2NvdW50ZXIuIiciOw0KCSRjb3VudGVyX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNvdW50ZXJfc2VsZWN0KTsNCgkkY291bnRlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjb3VudGVyX3F1ZXJ5KTsNCgkkZGlzY291bnRfcGVybWlzc2lvbj0kY291bnRlcl9yb3dbJ2Rpc2NvdW50J107DQoJJGNvbW1pc3Npb249JGNvdW50ZXJfcm93Wydjb21taXNzaW9uJ107DQoJLy9Db3VudGVyIEluZm9ybWF0aW9uIFNlbGVjdCBTdGFydA0KCQ0KCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTmVjZXNzYXJ5IFF1ZXJ5IEVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTmVjZXNzYXJ5IFZhcnJpYWJsZSBTdGFydC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCSRzdG9wX3RpbWUgPSBkYXRlKCJIOmk6cyIsc3RydG90aW1lKGRhdGUoIkg6aTpzIikuIiArNSBtaW51dGVzIikpOy8vYWZ0ZXIgNSBtaW51dGVzIHRpbWUNCgkkc3RvcF90aW1lID0gc3RydG90aW1lKCRzdG9wX3RpbWUpOy8vYWZ0ZXIgNSBtaW51dGVzIChEaWdpdCkgdGltZSANCgkNCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU5lY2Vzc2FyeSBWYXJyaWFibGUgZW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJDQoJJHRyaXBfdGltZT1odG1sc3BlY2lhbGNoYXJzKHVybGRlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWyd0eXBlb2ZrZ2MnXSkpKTsNCgkNCgkNCgkNCj8+DQo8IURPQ1RZUEUgSFRNTD4NCjxodG1sIGxhbmc9ImVuLVVTIj4NCjxoZWFkPg0KCTxtZXRhIGNoYXJzZXQ9IlVURi04Ij4NCgk8dGl0bGU+Qm9va2luZzwvdGl0bGU+DQoJPHNjcmlwdCBzcmM9Ii4uL2pzL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0Pg0KCTxzY3JpcHQgc3JjPSIuLi9qcy9mb29waWNrZXIuanMiPjwvc2NyaXB0PjwhLS1EYXRlIFBpY2tlciBKUy0tLT4NCgk8c3R5bGU+DQoJCTw/cGhwIGVjaG8gJHNlYXRfY3NzPz4NCgk8L3N0eWxlPg0KCTwhLS0gQ3VzdG9tIEZvbnRzIC0tPg0KCTxsaW5rIGhyZWY9Ii4uL2ZvbnQtYXdlc29tZS9jc3MvYWxsLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+DQogICAgPGxpbmsgaHJlZj0iLi4vZm9udC1hd2Vzb21lL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQoJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9jc3MvYW5pbWF0aW9uLmNzcyIgLz4NCgk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2Nzcy9yZXNwb25zaXZlLmNzcyIgLz4NCgk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2Nzcy9wcmludC5jc3MiIC8+DQoJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9jc3Mvc2VhdC5jc3MiIC8+DQo8L2hlYWQ+DQo8Ym9keT4NCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVBhZ2UgTG9hZGVyIFNlY3Rpb24gU3RhcnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPg0KCQk8IS0tLXByZWxvYWQgc3RhcnQtLS0+DQo8ZGl2IGNsYXNzPSJzdWJfcHJpbnQiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4NCgkJPGRpdiBjbGFzcz0ibWFpbl9wcmludCI+DQoJCQkNCgkJCQ0KCQk8L2Rpdj4NCjwvZGl2Pg0KCQk8IS0tLXByZWxvYWQgZW5kLS0tPg0KCQkNCgkJDQoJCTwhLS0tcHJpbnQgbG9hZCBzdGFydC0tLT4NCjxkaXYgY2xhc3M9ImxvYWRfd3JhcHBlciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPg0KCQk8ZGl2IGNsYXNzPSJsb2FkZXIiPjwvZGl2Pg0KPC9kaXY+DQoJCTwhLS0tcHJpbnQgbG9hZCBlbmQtLS0+DQoNCgkJPCEtLS1BbGVydCB3cmFwcGVyIHN0YXJ0LS0tPg0KPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7YmFja2dyb3VuZDpyZWQ7ZGlzcGxheTpub25lOyIgaWQ9ImFsZXJ0Ij48L2Rpdj4NCgkJPCEtLS1BbGVydCB3cmFwcGVyIGVuZC0tLT4NCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVBhZ2UgTG9hZGVyIFNlY3Rpb24gRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4NCjw/cGhwDQoJDQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TZWF0IEJvb2sgRGV2ZWxvcG1lbnQgU3RhcnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCgkvL1NlYXQgQTEgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQxJ10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdBMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdBMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJBMSIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCQ0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nQTEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgQTEgRW5kDQoJCQ0KCQkNCgkJDQoJCQ0KCQkNCgkJDQoJCQ0KCQkNCgkvL1NlYXQgQTIgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQyJ10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdBMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdBMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJBMiIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdBMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBBMiBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgQTMgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQzJ10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdBMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdBMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJBMyIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdBMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBBMyBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgQTQgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQ0J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdBNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdBNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJBNCIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdBNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBBNCBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgQjEgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQ1J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdCMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdCMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJCMSIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdCMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBCMSBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgQjIgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQ2J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdCMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdCMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJCMiIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdCMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBCMiBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgQjMgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQ3J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdCMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdCMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJCMyIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdCMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBCMyBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgQjQgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQ4J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdCNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdCNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJCNCIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdCNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBCNCBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgQzEgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQ5J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdDMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdDMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJDMSIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdDMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBDMSBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgQzIgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQxMCddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nQzInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nQzInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiQzIiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nQzInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgQzIgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEMzIFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MTEnXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0MzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0MzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkMzIix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0MzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEMzIEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBDNCBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDEyJ10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdDNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdDNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJDNCIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdDNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBDNCBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgRDEgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQxMyddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nRDEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nRDEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiRDEiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nRDEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgRDEgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEQyIFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MTQnXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0QyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0QyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkQyIix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0QyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEQyIEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBEMyBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDE1J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdEMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdEMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJEMyIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdEMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBEMyBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgRDQgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQxNiddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nRDQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nRDQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiRDQiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nRDQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgRDQgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEUxIFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MTcnXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0UxJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0UxJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkUxIix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0UxJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEUxIEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBFMiBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDE4J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdFMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdFMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJFMiIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdFMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBFMiBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgRTMgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQxOSddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nRTMnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nRTMnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiRTMiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nRTMnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgRTMgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEU0IFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MjAnXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0U0JyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0U0JyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkU0Iix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0U0JyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEU0IEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBGMSBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDIxJ10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdGMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdGMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJGMSIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdGMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBGMSBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgRjIgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQyMiddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nRjInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nRjInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiRjIiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nRjInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgRjIgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEYzIFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MjMnXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0YzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0YzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkYzIix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0YzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEYzIEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBGNCBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDI0J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdGNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdGNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJGNCIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdGNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBGNCBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgRzEgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQyNSddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nRzEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nRzEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiRzEiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nRzEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgRzEgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEcyIFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MjYnXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0cyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0cyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkcyIix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0cyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEcyIEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBHMyBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDI3J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdHMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdHMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJHMyIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdHMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBHMyBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgRzQgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQyOCddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nRzQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nRzQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiRzQiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nRzQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgRzQgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEgxIFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MjknXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0gxJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0gxJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkgxIix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0gxJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEgxIEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBIMiBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDMwJ10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdIMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdIMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJIMiIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdIMicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBIMiBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgSDMgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQzMSddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nSDMnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nSDMnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiSDMiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nSDMnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgSDMgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEg0IFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MzInXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0g0JyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0g0JyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6Ikg0Iix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0g0JyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEg0IEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBJMSBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDMzJ10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdJMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdJMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJJMSIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdJMScmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBJMSBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgSTIgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQzNCddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nSTInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nSTInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiSTIiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nSTInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgSTIgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEkzIFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MzUnXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0kzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0kzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkkzIix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0kzJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEkzIEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBJNCBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDM2J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdJNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdJNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJJNCIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdJNCcmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBJNCBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgSjEgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQzNyddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nSjEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nSjEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiSjEiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nSjEnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgSjEgRW5kDQoJDQoJDQoJDQoJDQoJDQoJDQoJLy9TZWF0IEoyIFN0YXJ0DQoJaWYoaXNzZXQoJF9QT1NUWydzZWF0MzgnXSkpew0KCSAvL1NlYXQgQ291bnQgU3RhcnQNCgkgJHNlYXRfY291bnRfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzdGF0dXM9MSYmdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJHNlYXRfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfY291bnRfc2VsZWN0KTsNCgkgJHVzZXJfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAkc2VhdF9jb3VudD1teXNxbGlfbnVtX3Jvd3MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgLy9TZWF0IENvdW50IEVuZA0KCSAvL0Jvb2tpbmcgQ2hlY2sgU3RhcnQNCgkgJGNoZWNrPSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSBzZWF0X25hbWU9J0oyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRjaGVja19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRjaGVjayk7DQoJICRjaGVja19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRjaGVja19xdWVyeSk7DQoJICRkX3VzZXJfbmFtZT0kY2hlY2tfcm93Wyd1c2VyX25hbWUnXTsNCgkgJGJvb2tpbmdfc3RhdHVzPSRjaGVja19yb3dbJ2Jvb2tpbmcnXTsNCgkgLy9Cb29raW5nIENoZWNrIEVuZA0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIHN0YXJ0DQoJIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddPT0kYWdlbnRfbmFtZSYmZW1wdHkoJGJvb2tpbmdfc3RhdHVzKSl7DQoJIAkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9JycsdXNlcl9uYW1lPScnLHN0b3BfdGltZT0nJyB3aGVyZSBzZWF0X25hbWU9J0oyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICAgICRxdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCSB9DQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgZW5kIA0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRjaGVja19yb3dbJ3VzZXJfbmFtZSddIT0kYWdlbnRfbmFtZSYmJGNoZWNrX3Jvd1snc3RhdHVzJ109PTEpew0KCSAJZWNobyAnPHNjcmlwdD5hbGVydCgiVGhpcyBzaXQgaXMgU2VsZWN0ZWQgQnkgKEFCQ0RFRikiKTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgZW5kDQoJIC8vQm9va2VkIHNpdCBhbGVydCBzdGFydA0KCSBlbHNlIGlmKCRib29raW5nX3N0YXR1cz09J2Jvb2tlZCcpew0KCSAJZWNobyAnPHNjcmlwdD4NCgkgCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3NlYXQ6IkoyIix0cmlwOiInLiR0cmlwX25hbWUuJyIsZGF0ZToiJy4kdHJpcF9kYXRlLicifSxmdW5jdGlvbihkYXRhKXskKCIubWFpbl9wcmludCIpLmh0bWwoZGF0YSl9KTsNCgkgCQkJPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgZW5kDQoJIC8vU2VhdCBCb29rIExpbWl0IHN0YXJ0DQoJIGVsc2UgaWYoJHNlYXRfY291bnQ9PTUpew0KCSAJZWNobyAiDQoJIAkJPHNjcmlwdD5hbGVydCgneW91IE9ubHkgQm9vayBGaXZlIFNlYXRzJyk8L3NjcmlwdD4NCgkgCSI7DQoJIH0NCgkgLy9TZWF0IEJvb2sgTGltaXQgZW5kDQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIHN0YXJ0DQoJIGVsc2UgaWYoZW1wdHkoJGRfdXNlcl9uYW1lKSl7DQoJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIscCknXSkpey8vQ2hlY2sgR0VUIFJvdXRlDQoJCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0xLHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyxzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSBzZWF0X25hbWU9J0oyJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7Ly91c2VyIG5hbWUgc2VuZA0KCQkkdV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCR1cGRhdGUpOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkkYWxsX3N0b3BfdGltZV91cGRhdGVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkYWxsX3N0b3BfdGltZV91cGRhdGUpOy8vQWxsIFNlYXQgU3RvcCBUaW1lIElzIFNhbWUNCgkJfWVsc2V7DQoJCQllY2hvICc8c2NyaXB0PmFsZXJ0KCJTZWxlY3QgUm91dGUgRnJpc3QiKTwvc2NyaXB0Pic7DQoJCX0vL0NoZWNrIEdFVCBSb3V0ZSBFbmQNCgkgfQ0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBlbmQNCgl9DQoJLy9TZWF0IEoyIEVuZA0KCQ0KCQ0KCQ0KCQ0KCQ0KCQ0KCS8vU2VhdCBKMyBTdGFydA0KCWlmKGlzc2V0KCRfUE9TVFsnc2VhdDM5J10pKXsNCgkgLy9TZWF0IENvdW50IFN0YXJ0DQoJICRzZWF0X2NvdW50X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJICRzZWF0X3NlbGVjdF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWF0X2NvdW50X3NlbGVjdCk7DQoJICR1c2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfc2VsZWN0X3F1ZXJ5KTsNCgkgJHNlYXRfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJIC8vU2VhdCBDb3VudCBFbmQNCgkgLy9Cb29raW5nIENoZWNrIFN0YXJ0DQoJICRjaGVjaz0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc2VhdF9uYW1lPSdKMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkY2hlY2tfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkY2hlY2spOw0KCSAkY2hlY2tfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkY2hlY2tfcXVlcnkpOw0KCSAkZF91c2VyX25hbWU9JGNoZWNrX3Jvd1sndXNlcl9uYW1lJ107DQoJICRib29raW5nX3N0YXR1cz0kY2hlY2tfcm93Wydib29raW5nJ107DQoJIC8vQm9va2luZyBDaGVjayBFbmQNCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBzdGFydA0KCSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXT09JGFnZW50X25hbWUmJmVtcHR5KCRib29raW5nX3N0YXR1cykpew0KCSAJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPScnLHVzZXJfbmFtZT0nJyxzdG9wX3RpbWU9Jycgd2hlcmUgc2VhdF9uYW1lPSdKMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAgICAkcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkgfQ0KCSAvL2NhbmNlbCBzZWF0IGluIGNsaWNrIGVuZCANCgkgLy9zZWxlY3RlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkY2hlY2tfcm93Wyd1c2VyX25hbWUnXSE9JGFnZW50X25hbWUmJiRjaGVja19yb3dbJ3N0YXR1cyddPT0xKXsNCgkgCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlRoaXMgc2l0IGlzIFNlbGVjdGVkIEJ5IChBQkNERUYpIik8L3NjcmlwdD4nOw0KCSB9DQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL0Jvb2tlZCBzaXQgYWxlcnQgc3RhcnQNCgkgZWxzZSBpZigkYm9va2luZ19zdGF0dXM9PSdib29rZWQnKXsNCgkgCWVjaG8gJzxzY3JpcHQ+DQoJIAkJCSQucG9zdCgiLi4vZmluYWxfYm9vay5waHAiLHtzZWF0OiJKMyIsdHJpcDoiJy4kdHJpcF9uYW1lLiciLGRhdGU6IicuJHRyaXBfZGF0ZS4nIn0sZnVuY3Rpb24oZGF0YSl7JCgiLm1haW5fcHJpbnQiKS5odG1sKGRhdGEpfSk7DQoJIAkJCTwvc2NyaXB0Pic7DQoJIH0NCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IGVuZA0KCSAvL1NlYXQgQm9vayBMaW1pdCBzdGFydA0KCSBlbHNlIGlmKCRzZWF0X2NvdW50PT01KXsNCgkgCWVjaG8gIg0KCSAJCTxzY3JpcHQ+YWxlcnQoJ3lvdSBPbmx5IEJvb2sgRml2ZSBTZWF0cycpPC9zY3JpcHQ+DQoJIAkiOw0KCSB9DQoJIC8vU2VhdCBCb29rIExpbWl0IGVuZA0KCSAvL3NlYXQgYm9vayB1c2VyIGRhdGEgc2VuZCBzdGFydA0KCSBlbHNlIGlmKGVtcHR5KCRkX3VzZXJfbmFtZSkpew0KCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLHApJ10pKXsvL0NoZWNrIEdFVCBSb3V0ZQ0KCQkkdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdGF0dXM9MSx1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicsc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgc2VhdF9uYW1lPSdKMycmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOy8vdXNlciBuYW1lIHNlbmQNCgkJJHVfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkdXBkYXRlKTsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlPSJ1cGRhdGUgdGlja2V0IHNldCBzdG9wX3RpbWU9JyIuJHN0b3BfdGltZS4iJyB3aGVyZSB1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnN0YXR1cz0xIjsNCgkJJGFsbF9zdG9wX3RpbWVfdXBkYXRlX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGFsbF9zdG9wX3RpbWVfdXBkYXRlKTsvL0FsbCBTZWF0IFN0b3AgVGltZSBJcyBTYW1lDQoJCX1lbHNlew0KCQkJZWNobyAnPHNjcmlwdD5hbGVydCgiU2VsZWN0IFJvdXRlIEZyaXN0Iik8L3NjcmlwdD4nOw0KCQl9Ly9DaGVjayBHRVQgUm91dGUgRW5kDQoJIH0NCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgZW5kDQoJfQ0KCS8vU2VhdCBKMyBFbmQNCgkNCgkNCgkNCgkNCgkNCgkNCgkvL1NlYXQgSjQgU3RhcnQNCglpZihpc3NldCgkX1BPU1RbJ3NlYXQ0MCddKSl7DQoJIC8vU2VhdCBDb3VudCBTdGFydA0KCSAkc2VhdF9jb3VudF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHN0YXR1cz0xJiZ1c2VyX25hbWU9JyIuJGFnZW50X25hbWUuIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIiciOw0KCSAkc2VhdF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VhdF9jb3VudF9zZWxlY3QpOw0KCSAkdXNlcl9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWF0X3NlbGVjdF9xdWVyeSk7DQoJICRzZWF0X2NvdW50PW15c3FsaV9udW1fcm93cygkc2VhdF9zZWxlY3RfcXVlcnkpOw0KCSAvL1NlYXQgQ291bnQgRW5kDQoJIC8vQm9va2luZyBDaGVjayBTdGFydA0KCSAkY2hlY2s9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIHNlYXRfbmFtZT0nSjQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgJGNoZWNrX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNoZWNrKTsNCgkgJGNoZWNrX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNoZWNrX3F1ZXJ5KTsNCgkgJGRfdXNlcl9uYW1lPSRjaGVja19yb3dbJ3VzZXJfbmFtZSddOw0KCSAkYm9va2luZ19zdGF0dXM9JGNoZWNrX3Jvd1snYm9va2luZyddOw0KCSAvL0Jvb2tpbmcgQ2hlY2sgRW5kDQoJIC8vY2FuY2VsIHNlYXQgaW4gY2xpY2sgc3RhcnQNCgkgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ109PSRhZ2VudF9uYW1lJiZlbXB0eSgkYm9va2luZ19zdGF0dXMpKXsNCgkgCSR1cGRhdGU9InVwZGF0ZSB0aWNrZXQgc2V0IHN0YXR1cz0nJyx1c2VyX25hbWU9Jycsc3RvcF90aW1lPScnIHdoZXJlIHNlYXRfbmFtZT0nSjQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkgICAgJHF1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJIH0NCgkgLy9jYW5jZWwgc2VhdCBpbiBjbGljayBlbmQgDQoJIC8vc2VsZWN0ZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGNoZWNrX3Jvd1sndXNlcl9uYW1lJ10hPSRhZ2VudF9uYW1lJiYkY2hlY2tfcm93WydzdGF0dXMnXT09MSl7DQoJIAllY2hvICc8c2NyaXB0PmFsZXJ0KCJUaGlzIHNpdCBpcyBTZWxlY3RlZCBCeSAoQUJDREVGKSIpPC9zY3JpcHQ+JzsNCgkgfQ0KCSAvL3NlbGVjdGVkIHNpdCBhbGVydCBlbmQNCgkgLy9Cb29rZWQgc2l0IGFsZXJ0IHN0YXJ0DQoJIGVsc2UgaWYoJGJvb2tpbmdfc3RhdHVzPT0nYm9va2VkJyl7DQoJIAllY2hvICc8c2NyaXB0Pg0KCSAJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7c2VhdDoiSjQiLHRyaXA6IicuJHRyaXBfbmFtZS4nIixkYXRlOiInLiR0cmlwX2RhdGUuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCSAJCQk8L3NjcmlwdD4nOw0KCSB9DQoJIC8vQm9va2VkIHNpdCBhbGVydCBlbmQNCgkgLy9TZWF0IEJvb2sgTGltaXQgc3RhcnQNCgkgZWxzZSBpZigkc2VhdF9jb3VudD09NSl7DQoJIAllY2hvICINCgkgCQk8c2NyaXB0PmFsZXJ0KCd5b3UgT25seSBCb29rIEZpdmUgU2VhdHMnKTwvc2NyaXB0Pg0KCSAJIjsNCgkgfQ0KCSAvL1NlYXQgQm9vayBMaW1pdCBlbmQNCgkgLy9zZWF0IGJvb2sgdXNlciBkYXRhIHNlbmQgc3RhcnQNCgkgZWxzZSBpZihlbXB0eSgkZF91c2VyX25hbWUpKXsNCgkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7Ly9DaGVjayBHRVQgUm91dGUNCgkJJHVwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RhdHVzPTEsdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInLHN0b3BfdGltZT0nIi4kc3RvcF90aW1lLiInIHdoZXJlIHNlYXRfbmFtZT0nSjQnJiZ0cmlwPSciLiR0cmlwX25hbWUuIicmJmpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsvL3VzZXIgbmFtZSBzZW5kDQoJCSR1X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHVwZGF0ZSk7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZT0idXBkYXRlIHRpY2tldCBzZXQgc3RvcF90aW1lPSciLiRzdG9wX3RpbWUuIicgd2hlcmUgdXNlcl9uYW1lPSciLiRhZ2VudF9uYW1lLiInJiZzdGF0dXM9MSI7DQoJCSRhbGxfc3RvcF90aW1lX3VwZGF0ZV9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRhbGxfc3RvcF90aW1lX3VwZGF0ZSk7Ly9BbGwgU2VhdCBTdG9wIFRpbWUgSXMgU2FtZQ0KCQl9ZWxzZXsNCgkJCWVjaG8gJzxzY3JpcHQ+YWxlcnQoIlNlbGVjdCBSb3V0ZSBGcmlzdCIpPC9zY3JpcHQ+JzsNCgkJfS8vQ2hlY2sgR0VUIFJvdXRlIEVuZA0KCSB9DQoJIC8vc2VhdCBib29rIHVzZXIgZGF0YSBzZW5kIGVuZA0KCX0NCgkvL1NlYXQgSjQgRW5kDQoJDQoJCQ0KCQkNCgkJDQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TZWF0IEJvb2sgRGV2ZWxvcG1lbnQgRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJDQo/Pg0KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTWFpbiBIVE1MIFdpdGhvdXQgSGVhZCBBbmQgRmlyc3QgQm9keS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPg0KCTxkaXYgY2xhc3M9InNlYXRfbW90aGVyIj4NCgkgIDwhLS0tSGVhZGVyIEFyZWEgU3RhcnQtLS0+DQoJCTxkaXYgY2xhc3M9ImhlYWRpbmciPg0KCQk8Zm9ybSBtZXRob2Q9InBvc3QiPjwhLS0tRm9ybSBGb3IgSGVhZGVyLS0tPg0KCQkJPGRpdiBjbGFzcz0ibG9nbyIgb25jbGljaz0icmVkaXJlY3QoKSIgc3R5bGU9ImN1cnNvcjpwb2ludGVyOyI+PC9kaXY+DQoJCQk8YnV0dG9uIGNsYXNzPSJ0b2RheSIgc3R5bGU9ImN1cnNvcjpwb2ludGVyOyIgbmFtZT0idG9kYXkiPjxpIGNsYXNzPSJmYXMgZmEtYXJyb3ctY2lyY2xlLWxlZnQiPjwvaT4gQmFjazwvYnV0dG9uPg0KCQkJPHNwYW4gY2xhc3M9ImhlYWRpbmdfZGF0ZSI+PD9waHAgZWNobyAkZGF5LicgJy4kbW9udGguJyAnLiR5ZWFyOz8+PC9zcGFuPg0KCQkJPHNwYW4gY2xhc3M9ImhlYWRpbmdfdHJpcCI+PD9waHAgZWNobyAkdHJpcF9uYW1lPz48L3NwYW4+DQoJCQk8ZGl2IGNsYXNzPSJjb3VudGVyIj4NCgkJCQk8ZGl2IGNsYXNzPSJ0aXRsZSI+Q2hha2xhZGVyIFBhcmlib2hvbjwvZGl2Pg0KCQkJCTxkaXYgY2xhc3M9InRpdGxlXzIiPjw/cGhwIGVjaG8gJGFnZW50X2NvdW50ZXI/PjwvZGl2Pg0KCQkJPC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSJuYW1lIj5XZWxjb21lICZuYnNwIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiMyMzVhOWU7Ij48P3BocCBlY2hvICRhZ2VudF9uYW1lPz48L3NwYW4+PC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSJtZW51IiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7Ij48aSBjbGFzcz0iZmFzIGZhLWJhcnMgY29sb3IiPjwvaT48L2Rpdj4NCgkJCTxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj4NCgkJCTxkaXYgY2xhc3M9InNpZGVfYmFyIj4NCgkJCQk8ZGl2IGNsYXNzPSJtYWluX21hbnUiPg0KCQkJCQk8dWwgc3R5bGU9Imxpc3Qtc3R5bGU6bm9uZTttYXJnaW46MHB4O3BhZGRpbmc6MHB4OyI+DQoJCQkJCQk8bGk+PGkgY2xhc3M9ImZhcyBmYS1saXN0LWFsdCI+PC9pPiA8YSBocmVmPSIjIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6IzAwMDsiPkNoYWxsYW48L2E+PC9saT4NCgkJCQkJCTxsaT48aSBjbGFzcz0iZmFzIGZhLWxvY2siPjwvaT4gPGEgaHJlZj0iIyIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiMwMDA7Ij5DaGFuZ2UgUGFzc3dvcmQ8L2E+PC9saT4NCgkJCQkJCTxsaT48aSBjbGFzcz0iZmFzIGZhLXNpZ24tb3V0LWFsdCI+PC9pPiA8YSBocmVmPSIjIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6IzAwMDsiPjxidXR0b24gbmFtZT0ibG9nb3V0IiBzdHlsZT0iYmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTtmb250LXNpemU6MThweDtmb250LWZhbWlseTphdXRvO3BhZGRpbmc6MHB4O2N1cnNvcjpwb2ludGVyOyI+U2lnbiBvdXQ8L2J1dHRvbj48L2E+PC9saT4NCgkJPC9mb3JtPg0KCQkJCQk8L3VsPg0KCQkJCTwvZGl2Pg0KCQkJPC9kaXY+DQoJCTwvZGl2Pg0KCTwhLS0tSGVhZGVyIEFyZWEgRW5kLS0tPg0KCQk8ZGl2IGNsYXNzPSJwYWRkaW5nXzEiPg0KCQk8Zm9ybSBtZXRob2Q9InBvc3QiPjwhLS0tRm9ybSBGb3IgU2VhdCAmIFJvdXRlLS0tPg0KCQkJPGRpdiBjbGFzcz0ic2VhdF9ib3giPg0KCQkJCTxkaXYgY2xhc3M9InNlYXRfYm94X2hlYWRpbmciPg0KCQkJCQk8ZGl2IGNsYXNzPSJzb2xkIj48c3BhbiBjbGFzcz0ic29sZF9jb250ZW50XzEiPlNvbGQ8L3NwYW4+PGJyPjxzcGFuIGNsYXNzPSJzb2xkX2NvbnRlbnRfMiI+PD9waHAgZWNobyAkc29sZF90aWNrZXRfY291bnQ/Pjwvc3Bhbj48L2Rpdj4NCgkJCQkJPGRpdiBjbGFzcz0iYXZhaWxhYmxlIj4NCgkJCQkJCTxzcGFuIGNsYXNzPSJhdmFpbGFibGVfY29udGVudF8xIj5BdmFpbGFibGU8L3NwYW4+PGJyPjxzcGFuIGNsYXNzPSJhdmFpbGFibGVfY29udGVudF8yIj48P3BocCBlY2hvICRmcmVlX3RpY2tldF9jb3VudD8+PC9zcGFuPg0KCQkJCQk8L2Rpdj4NCgkJCQkJPGJ1dHRvbiBjbGFzcz0icmVmcmVzaCA8P3BocCBlY2hvICRhbmltYXRlXzI/PiIgbmFtZT0icmVmcmVzaCI+PGkgY2xhc3M9ImZhcyBmYS1zeW5jIj48L2k+IFJlZnJlc2g8L2J1dHRvbj4NCgkJCQkJPGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2Pg0KCQkJCTwvZGl2Pg0KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TZWF0IERldmVsb3BtZW50IFdpdGhvdXQgQm9vayBTdGFydC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPg0KCQkJCTxkaXYgaWQ9Im1haW5fc2VhdCIgY2xhc3M9Ijw/cGhwIGVjaG8gJGFuaW1hdGU/PiI+DQoJCQkJPCEtLS1BbGwgU2VhdCBBbmQgSW5mb3JtYXRpb24gU2VsZWN0IFN0YXJ0LS0tPg0KCQkJCQk8P3BocCANCgkJCQkJCSRzZWF0X3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgdHJpcD0nIi4kdHJpcF9uYW1lLiInICYmIGpvdXJuZXlfZGF0ZT0nIi4kdHJpcF9kYXRlLiInIjsNCgkJCQkJCSRzZWF0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHNlYXRfc2VsZWN0KTsNCgkJCQkJCSRzZWF0X2NsYXNzPTE7Ly9Gb3IgU2VhdCBDbGFzcyBWYXJyaWFibGUNCgkJCQkJCXdoaWxlKCRzZWF0X3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHNlYXRfcXVlcnkpKXsNCgkJCQkJCQkkc2VhdD0kc2VhdF9yb3dbJ3NlYXRfbmFtZSddOw0KCQkJCQkJCSRzdGF0dXM9JHNlYXRfcm93WydzdGF0dXMnXTsNCgkJCQkJCQkkYm9va2luZz0kc2VhdF9yb3dbJ2Jvb2tpbmcnXTsNCgkJCQkJCQkkZ2VuZGVyPSRzZWF0X3Jvd1snZ2VuZGVyJ107DQoJCQkJCQkJJHVzZXJfbmFtZV9kYj0kc2VhdF9yb3dbJ3VzZXJfbmFtZSddOw0KCQkJCQkJCWlmKCRzdGF0dXM9PTEmJiR1c2VyX25hbWVfZGI9PSRhZ2VudF9uYW1lKXsNCgkJCQkJCQkkYmFja2dyb3VuZD0nIzQ3ZmYyNSc7Ly9zZWF0IENvbG9yIFZhcnJpYWJsZQ0KCQkJCQkJCSRjb2xvcj0nI2ZmMDAwMCc7DQoJCQkJCQkJfQ0KCQkJCQkJCWVsc2UgaWYoJHN0YXR1cz09MSYmJHVzZXJfbmFtZV9kYiE9JGFnZW50X25hbWUpew0KCQkJCQkJCSRiYWNrZ3JvdW5kPSdibHVlJzsvL3NlYXQgQ29sb3IgVmFycmlhYmxlDQoJCQkJCQkJJGNvbG9yPScjZmYwMDAwJzsNCgkJCQkJCQl9DQoJCQkJCQkJZWxzZSBpZigkZ2VuZGVyPT0nRicpew0KCQkJCQkJCQkkYmFja2dyb3VuZD0nI2ZmMzRlNic7Ly9zZWF0IENvbG9yIFZhcnJpYWJsZQ0KCQkJCQkJCQkkY29sb3I9JyMwMDAnOw0KCQkJCQkJCX0NCgkJCQkJCQllbHNlIGlmKCRib29raW5nPT0nYm9va2VkJyl7DQoJCQkJCQkJCSRiYWNrZ3JvdW5kPScjZmYwMDMzJzsvL3NlYXQgQ29sb3IgVmFycmlhYmxlDQoJCQkJCQkJCSRjb2xvcj0nIzAwMCc7DQoJCQkJCQkJfQ0KCQkJCQkJCWVsc2V7DQoJCQkJCQkJCSRiYWNrZ3JvdW5kPSdncmVlbic7Ly9zZWF0IENvbG9yIFZhcnJpYWJsZQ0KCQkJCQkJCQkkY29sb3I9JyNmZmYnOw0KCQkJCQkJCX0NCgkJCQkJCQkNCgkJCQkJCWlmKCR0cmlwX3RpbWUhPSdUaW1lIE92ZXInKXsvL1RpbWUgRnVuY3Rpb24gQ2hlY2sJDQoJCQkJCT8+DQoJCQkJCTxidXR0b24gY2xhc3M9InM8P3BocCBlY2hvICRzZWF0X2NsYXNzPz4gc2VhdCIgbmFtZT0ic2VhdDw/cGhwIGVjaG8gJHNlYXRfY2xhc3M/PiIgc3R5bGU9ImJhY2tncm91bmQ6PD9waHAgZWNobyAkYmFja2dyb3VuZD8+O2NvbG9yOjw/cGhwIGVjaG8gJGNvbG9yPz4iPjw/cGhwIGVjaG8gJHNlYXQ/PjwvYnV0dG9uPg0KCQkJCQk8P3BocCB9ZWxzZXs/Pg0KCQkJCQk8ZGl2IGNsYXNzPSJzPD9waHAgZWNobyAkc2VhdF9jbGFzcz8+IHNlYXQiIG5hbWU9InNlYXQ8P3BocCBlY2hvICRzZWF0X2NsYXNzPz4iIHN0eWxlPSJiYWNrZ3JvdW5kOjw/cGhwIGVjaG8gJGJhY2tncm91bmQ/Pjtjb2xvcjo8P3BocCBlY2hvICRjb2xvcj8+O3dpZHRoOjY0cHg7dGV4dC1hbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6MzJweDsiPjw/cGhwIGVjaG8gJHNlYXQ/PjwvZGl2Pjw/cGhwIH0/Pg0KCQkJCQk8P3BocCAkc2VhdF9jbGFzcysrO30/Pg0KCQkJCQk8IS0tLUFsbCBTZWF0IEFuZCBJbmZvcm1hdGlvbiBTZWxlY3QgRW5kLS0tPg0KCQkJCQk8ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+DQoJCQkJPC9kaXY+DQoJCQk8L2Rpdj4NCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU2VhdCBEZXZlbG9wbWVudCBXaXRob3V0IEJvb2sgRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+DQoNCg0KDQoNCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVJvdXRlIFN1Ym1pdCBEZXZlbG9wbWVudCBTdGFydC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4NCgkJDQoJCQk8ZGl2IGNsYXNzPSJzZWNvbmRfYXJlYSI+DQoJCQkJPGRpdiBjbGFzcz0icm91dGVfYm94Ij4NCgkJCQkJPGRpdiBjbGFzcz0ic2VsZWN0X3JvdXRlIj4NCgkJCQkJCTxkaXYgY2xhc3M9InJvdXRlX21hcmdpbiI+DQoJCQkJCQkJPGxhYmVsPlJvdXRlIFNlbGVjdCAoPGkgY2xhc3M9ImZhcyBmYS1iYWhhaSI+PC9pPik8L2xhYmVsPjxicj4NCgkJCQkJCQk8P3BocCANCgkJCQkJCQkJLy9Sb3V0ZSBTdWJtaXQgUEhQIFN0YXJ0DQoJCQkJCQkJCWlmKGlzc2V0KCRfUE9TVFsncm91dGVfc3VibWl0J10pKXsNCgkJCQkJCQkJCSRtYWluX3JvdXRlPSRfUE9TVFsnc2VsZWN0X3JvdXRlJ107DQoJCQkJCQkJCQkkZXhwbG9kZV9yb3V0ZT1leHBsb2RlKCJ8IiwkbWFpbl9yb3V0ZSk7DQoJCQkJCQkJCQkkcm91dGVfZm9ybT0kZXhwbG9kZV9yb3V0ZVswXTsNCgkJCQkJCQkJCSRyb3V0ZV90bz0kZXhwbG9kZV9yb3V0ZVsxXTsNCgkJCQkJCQkJCSRyb3V0ZV9wcmljZT0kZXhwbG9kZV9yb3V0ZVsyXTsNCgkJCQkJCQkJCS8vaGVhZGVyKCdsb2NhdGlvbjouLi9Cb29rP3R5cGVvZmtnYz0nLiRfR0VUWyd0eXBlb2ZrZ2MnXS4nJiZyZXBsYWNlKHIsZik9Jy51cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkcm91dGVfZm9ybSkpLicmJnJlcGxhY2Uocix0KT0nLnVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRyb3V0ZV90bykpLicmJnJlcGxhY2UocixwKT0nLnVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRyb3V0ZV9wcmljZSkpLicnKTsNCgkJCQkJCQkJCWVjaG8gJzxzY3JpcHQ+d2luZG93LmxvY2F0aW9uLmhyZWY9Ii4uL0Jvb2siPC9zY3JpcHQ+JzsNCgkJCQkJCQkJCQ0KCQkJCQkJCQl9DQoJCQkJCQkJCS8vUm91dGUgU3VibWl0IFBIUCBFbmQNCgkJCQkJCQk/Pg0KCQkJCQkJCTxzZWxlY3Qgb25jaGFuZ2U9IiQoJyNyb3V0ZV9zdWJtaXQnKS5jbGljaygpIiBuYW1lPSJzZWxlY3Rfcm91dGUiPg0KCQkJCQkJCQk8P3BocCANCgkJCQkJCQkJCS8vR0VUIFVSTCA+IENoZWNrIEZyb20sVG8sUHJpY2UgU3RhcnQNCgkJCQkJCQkJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIsZiknXSkpew0KCQkJCQkJCQkJCSRiYXBweV9mcm9tPWh0bWxzcGVjaWFsY2hhcnModXJsZGVjb2RlKGJhc2U2NF9kZWNvZGUoJF9HRVRbJ3JlcGxhY2UocixmKSddKSkpOw0KCQkJCQkJCQkJCSRiYXBweV90bz1odG1sc3BlY2lhbGNoYXJzKHVybGRlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWydyZXBsYWNlKHIsdCknXSkpKTsNCgkJCQkJCQkJCQkkdGlja2V0X3ByaWNlPWh0bWxzcGVjaWFsY2hhcnModXJsZGVjb2RlKGJhc2U2NF9kZWNvZGUoJF9HRVRbJ3JlcGxhY2UocixwKSddKSkpOw0KCQkJCQkJCQkJCSRzaG93X3JvdXRlPSRiYXBweV9mcm9tLictJy4kYmFwcHlfdG8uJy0oJy4kdGlja2V0X3ByaWNlLicuMDAgVEspJzsvL0FkanVzdCBBbGwgVHlwZSBPZiBHRVQgUm91dGUNCgkJCQkJCQkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSIiPicuJHNob3dfcm91dGUuJzwvb3B0aW9uPic7DQoJCQkJCQkJCQkJLy9zaG93IHdpdGhvdXQgZ2V0IHJvdXRlIHN0YXJ0DQoJCQkJCQkJCQkJLy9pZCBzZWxlY3Qgc3RhcnQNCgkJCQkJCQkJCQkkaWRfc2VsZWN0PSJzZWxlY3QgaWQgZnJvbSBwcmljZSB3aGVyZSBiYXBweV9mcm9tPSciLiRiYXBweV9mcm9tLiInJiZiYXBweV90bz0nIi4kYmFwcHlfdG8uIicmJnByaWNlPSciLiR0aWNrZXRfcHJpY2UuIiciOw0KCQkJCQkJCQkJCSRpZF9xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRpZF9zZWxlY3QpOw0KCQkJCQkJCQkJCSRpZF9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRpZF9xdWVyeSk7DQoJCQkJCQkJCQkJJHVuaXF1ZV9pZD0kaWRfcm93WydpZCddOw0KCQkJCQkJCQkJCS8vaWQgc2VsZWN0IGVuZA0KCQkJCQkJCQkJCSRub3RfbWF0Y2hfcm91dGVfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHByaWNlIHdoZXJlIHRyaXA9JyIuJHRyaXBfbmFtZS4iJyYmaWQhPSciLiR1bmlxdWVfaWQuIiciOw0KCQkJCQkJCQkJCSRiPW15c3FsaV9xdWVyeSgkZGIsJG5vdF9tYXRjaF9yb3V0ZV9zZWxlY3QpOw0KCQkJCQkJCQkJCXdoaWxlKCRyPW15c3FsaV9mZXRjaF9hc3NvYygkYikpew0KCQkJCQkJCQkJCSRubV9mcm9tPSRyWydiYXBweV9mcm9tJ107Ly9Ob3QgTWF0Y2ggVmFyaWFibGUNCgkJCQkJCQkJCQkkbm1fdG89JHJbJ2JhcHB5X3RvJ107Ly9Ob3QgTWF0Y2ggVmFyaWFibGUNCgkJCQkJCQkJCQkkbm1fcHJpY2U9JHJbJ3ByaWNlJ107Ly9Ob3QgTWF0Y2ggVmFyaWFibGUNCgkJCQkJCQkJCQkkbm1fcm91dGVfYWxsPSRubV9mcm9tLictJy4kbm1fdG8uJy0oJy4kbm1fcHJpY2UuJy4wMCBUSyknOw0KCQkJCQkJCQkJCSR0aGlzX3JvdXRlX3ZhbHVlPSRubV9mcm9tLid8Jy4kbm1fdG8uJ3wnLiRubV9wcmljZTsvL01ha2UgQWxsIFR5cGUgT2YgR0VUIFJvdXRlIFZhbHVlDQoJCQkJCQkJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kdGhpc19yb3V0ZV92YWx1ZS4nIj4nLiRubV9yb3V0ZV9hbGwuJzwvb3B0aW9uPic7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCS8vc2hvdyB3aXRob3V0IGdldCByb3V0ZSBlbmQNCgkJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJLy9HRVQgVVJMID4gQ2hlY2sgRnJvbSxUbyxQcmljZSBFbmQNCgkJCQkJCQkJCQ0KCQkJCQkJCQk/Pg0KCQkJCQkJCQk8IS0tIElmIE5vdCBTZXQgR0VUIEZyb20sVG8sUHJpY2UgLS0tPiANCgkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIj5TZWxlY3QgUm91dGU8L29wdGlvbj4NCgkJCQkJCQkJPD9waHAgDQoJCQkJCQkJCQkkcm91dGVfcHJpY2Vfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHByaWNlIHdoZXJlIHRyaXA9JyIuJHRyaXBfbmFtZS4iJyI7DQoJCQkJCQkJCQkkcm91dGVfcHJpY2VfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkcm91dGVfcHJpY2Vfc2VsZWN0KTsNCgkJCQkJCQkJCXdoaWxlKCRyb3V0ZV9wcmljZV9yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRyb3V0ZV9wcmljZV9xdWVyeSkpew0KCQkJCQkJCQkJJGZyb209JHJvdXRlX3ByaWNlX3Jvd1snYmFwcHlfZnJvbSddOw0KCQkJCQkJCQkJJHRvPSRyb3V0ZV9wcmljZV9yb3dbJ2JhcHB5X3RvJ107DQoJCQkJCQkJCQkkcm91dGVfcHJpY2U9JHJvdXRlX3ByaWNlX3Jvd1sncHJpY2UnXTsNCgkJCQkJCQkJCSRyb3V0ZV9wcmljZV9hbGw9JGZyb20uJy0nLiR0by4nLSgnLiRyb3V0ZV9wcmljZS4nLjAwIFRLKSc7DQoJCQkJCQkJCT8+DQoJCQkJCQkJCTxvcHRpb24gIHZhbHVlPSI8P3BocCBlY2hvICRmcm9tPz58PD9waHAgZWNobyAkdG8/Pnw8P3BocCBlY2hvICRyb3V0ZV9wcmljZT8+IiBjbGFzcz0ic2VsZWN0X2hpZGUiPjw/cGhwIGVjaG8gJGZyb20uJy0nLiR0by4nLSgnLiRyb3V0ZV9wcmljZS4nLjAwIFRLKSc/Pjwvb3B0aW9uPg0KCQkJCQkJCQkNCgkJCQkJCQkJPD9waHAgfX0/Pg0KCQkJCQkJCTwvc2VsZWN0Pg0KCQkJCQkJCTxidXR0b24gbmFtZT0icm91dGVfc3VibWl0IiBpZD0icm91dGVfc3VibWl0IiBzdHlsZT0ib3BhY2l0eTowOyI+QmFwcHk8L2J1dHRvbj4NCgkJDQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCTwvZm9ybT4JDQo8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Sb3V0ZSBTdWJtaXQgRGV2ZWxvcG1lbnQgRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPg0KDQoNCg0KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQm9hcmRpbmcgU3VibWl0IERldmVsb3BtZW50IFN0YXJ0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CQ0KCQk8Zm9ybSBtZXRob2Q9InBvc3QiIGF1dG9jb21wbGV0ZT0ib2ZmIj48IS0tLUZvcm0gRm9yIEZpbmFsLS0tPg0KCQkJCTxkaXYgY2xhc3M9ImJvYXJkaW5nX2JveCI+DQoJCQkJCTxkaXYgY2xhc3M9InNlbGVjdF9ib2FyZGluZyI+DQoJCQkJCQk8ZGl2IGNsYXNzPSJib2FyZGluZ19tYXJnaW4iPg0KCQkJCQkJCTxsYWJlbD5Cb2FyZGluZyBQb2ludCAoPGkgY2xhc3M9ImZhcyBmYS1iYWhhaSI+PC9pPik8L2xhYmVsPjxicj4NCgkJCQkJCQk8c2VsZWN0IG5hbWU9ImJvYXJkaW5nIiByZXF1aXJlZD4NCgkJCQkJCQkJPD9waHAgDQoJCQkJCQkJCQlpZihpc3NldCgkX0dFVFsncmVwbGFjZShyLGYpJ10pKXsNCgkJCQkJCQkJCQkvL093biBDb3VudGVyIEJvYXJkaW5nIFN0YXJ0DQoJCQkJCQkJCQkJJHNlbGZfYm9hcmRpbmdfc2VsZWN0PSJzZWxlY3QgKiBmcm9tIG1haW5fYm9hcmRpbmcgd2hlcmUgYm9hcmRpbmdfY291bnRlcj0nIi4kYWdlbnRfY291bnRlci4iJyYmYm9hcmRpbmdfY2l0eT0nIi4kYmFwcHlfZnJvbS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInIjsNCgkJCQkJCQkJCQkkc2VsZl9ib2FyZGluZ19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRzZWxmX2JvYXJkaW5nX3NlbGVjdCk7DQoJCQkJCQkJCQkJJHNlbGZfYm9hcmRpbmdfY291bnQ9bXlzcWxpX251bV9yb3dzKCRzZWxmX2JvYXJkaW5nX3F1ZXJ5KTsNCgkJCQkJCQkJCQlpZigkc2VsZl9ib2FyZGluZ19jb3VudD4wKXsNCgkJCQkJCQkJCQkkc2VsZl9ib2FyZGluZ19yb3c9bXlzcWxpX2ZldGNoX2Fzc29jKCRzZWxmX2JvYXJkaW5nX3F1ZXJ5KTsNCgkJCQkJCQkJCQkkc2VsZl9ib2FyZGluZ19pZD0kc2VsZl9ib2FyZGluZ19yb3dbJ2lkJ107DQoJCQkJCQkJCQkJJHNlbGZfYm9hcmRpbmdfcG9pbnQ9JHNlbGZfYm9hcmRpbmdfcm93Wydib2FyZGluZ19wb2ludCddOw0KCQkJCQkJCQkJCSRzZWxmX2JvYXJkaW5nX3RpbWU9JHNlbGZfYm9hcmRpbmdfcm93WyduYXRpb25hbF90aW1lJ107DQoJCQkJCQkJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kc2VsZl9ib2FyZGluZ19wb2ludC4nLScuJHNlbGZfYm9hcmRpbmdfdGltZS4nIj4nLiRzZWxmX2JvYXJkaW5nX3BvaW50LicgLSAnLiRzZWxmX2JvYXJkaW5nX3RpbWUuJzwvb3B0aW9uPic7DQoJCQkJCQkJCQkJLy9Pd24gQ291bnRlciBCb2FyZGluZyBFbmQNCgkJCQkJCQkJCQkvL1NlbGVjdCBCb2FyZGluZyBXaXRob3V0IE93biBTdGFydA0KCQkJCQkJCQkJCSRib2FyZGluZ19zZWxlY3Q9InNlbGVjdCAqIGZyb20gbWFpbl9ib2FyZGluZyB3aGVyZSBpZCE9JyIuJHNlbGZfYm9hcmRpbmdfaWQuIicmJmJvYXJkaW5nX2NpdHk9JyIuJGJhcHB5X2Zyb20uIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyI7DQoJCQkJCQkJCQkJJGJvYXJkaW5nX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGJvYXJkaW5nX3NlbGVjdCk7DQoJCQkJCQkJCQkJd2hpbGUoJGJvYXJkaW5nX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGJvYXJkaW5nX3F1ZXJ5KSl7DQoJCQkJCQkJCQkJJGJvYXJkaW5nX3BvaW50PSRib2FyZGluZ19yb3dbJ2JvYXJkaW5nX3BvaW50J107DQoJCQkJCQkJCQkJJGJvYXJkaW5nX3RpbWU9JGJvYXJkaW5nX3Jvd1snbmF0aW9uYWxfdGltZSddOw0KCQkJCQkJCQkJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuJGJvYXJkaW5nX3BvaW50LictJy4kYm9hcmRpbmdfdGltZS4nIj4nLiRib2FyZGluZ19wb2ludC4nIC0gJy4kYm9hcmRpbmdfdGltZS4nPC9vcHRpb24+JzsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJLy9TZWxlY3QgQm9hcmRpbmcgV2l0aG91dCBPd24gRW5kDQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCWVsc2V7DQoJCQkJCQkJCQkJCWVjaG8gJzxvcHRpb24gdmFsdWU9IiI+U2VsZWN0IEJvYXJkaW5nIFBvaW50PC9vcHRpb24+JzsNCgkJCQkJCQkJCQkJJGJvYXJkaW5nX3NlbGVjdD0ic2VsZWN0ICogZnJvbSBtYWluX2JvYXJkaW5nIHdoZXJlIGJvYXJkaW5nX2NpdHk9JyIuJGJhcHB5X2Zyb20uIicmJnRyaXA9JyIuJHRyaXBfbmFtZS4iJyI7DQoJCQkJCQkJCQkJCSRib2FyZGluZ19xdWVyeT1teXNxbGlfcXVlcnkoJGRiLCRib2FyZGluZ19zZWxlY3QpOw0KCQkJCQkJCQkJCQl3aGlsZSgkYm9hcmRpbmdfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkYm9hcmRpbmdfcXVlcnkpKXsNCgkJCQkJCQkJCQkJJGJvYXJkaW5nX3BvaW50PSRib2FyZGluZ19yb3dbJ2JvYXJkaW5nX3BvaW50J107DQoJCQkJCQkJCQkJCSRib2FyZGluZ190aW1lPSRib2FyZGluZ19yb3dbJ25hdGlvbmFsX3RpbWUnXTsNCgkJCQkJCQkJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kYm9hcmRpbmdfcG9pbnQuJy0nLiRib2FyZGluZ190aW1lLiciPicuJGJvYXJkaW5nX3BvaW50LicgLSAnLiRib2FyZGluZ190aW1lLic8L29wdGlvbj4nOw0KCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZWxzZXsNCgkJCQkJCQkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSIiPlNlbGVjdCBCb2FyZGluZyBQb2ludDwvb3B0aW9uPic7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCT8+DQoJCQkJCQkJPC9zZWxlY3Q+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+CQ0KCQkJDQo8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Cb2FyZGluZyBTdWJtaXQgRGV2ZWxvcG1lbnQgRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+DQoNCg0KDQoJCQkJDQo8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Ecm9wcGluZyBTdWJtaXQgRGV2ZWxvcG1lbnQgU3RhcnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4JCQkJDQoJCQkJPGRpdiBjbGFzcz0iZHJvcHBpbmdfYm94Ij4NCgkJCQkJPGRpdiBjbGFzcz0ic2VsZWN0X2Ryb3BwaW5nIj4NCgkJCQkJCTxkaXYgY2xhc3M9ImRyb3BwaW5nX21hcmdpbiI+DQoJCQkJCQkJPGxhYmVsPkRyb3BwaW5nIFBvaW50ICg8aSBjbGFzcz0iZmFzIGZhLWJhaGFpIj48L2k+KTwvbGFiZWw+PGJyPg0KCQkJCQkJCTxzZWxlY3QgbmFtZT0iZHJvcHBpbmciIHJlcXVpcmVkPg0KCQkJCQkJCQk8P3BocCANCgkJCQkJCQkJCWlmKGlzc2V0KCRfR0VUWydyZXBsYWNlKHIsdCknXSkpew0KCQkJCQkJCQkJJGRyb3BwaW5nX3NlbGVjdD0ic2VsZWN0ICogZnJvbSBtYWluX2Ryb3BwaW5nIHdoZXJlIGRyb3BwaW5nX2NpdHk9JyIuJGJhcHB5X3RvLiInJiZ0cmlwPSciLiR0cmlwX25hbWUuIiciOw0KCQkJCQkJCQkJJGRyb3BwaW5nX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGRyb3BwaW5nX3NlbGVjdCk7DQoJCQkJCQkJCQl3aGlsZSgkZHJvcHBpbmdfcm93PW15c3FsaV9mZXRjaF9hc3NvYygkZHJvcHBpbmdfcXVlcnkpKXsNCgkJCQkJCQkJCSRkcm9wcGluZ19wb2ludD0kZHJvcHBpbmdfcm93Wydkcm9wcGluZ19wb2ludCddOw0KCQkJCQkJCQkJJGRyb3BwaW5nX3RpbWU9JGRyb3BwaW5nX3Jvd1snZHJvcHBpbmdfdGltZSddOw0KCQkJCQkJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kZHJvcHBpbmdfcG9pbnQuJy0nLiRkcm9wcGluZ190aW1lLiciPicuJGRyb3BwaW5nX3BvaW50LicgLSAnLiRkcm9wcGluZ190aW1lLic8L29wdGlvbj4nOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWVsc2V7DQoJCQkJCQkJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iIj5TZWxlY3QgRHJvcHBpbmcgUG9pbnQ8L29wdGlvbj4nOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQk/Pg0KCQkJCQkJCTwvc2VsZWN0Pg0KCQkJCQkJPC9kaXY+DQoJCQkJCTwvZGl2Pg0KCQkJCTwvZGl2Pg0KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRHJvcHBpbmcgU3VibWl0IERldmVsb3BtZW50IEVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgkNCgkJCQk8P3BocCANCgkJCQkJaWYoaXNzZXQoJF9HRVRbJ3JlcGxhY2UocixwKSddKSl7DQoJCQkJPz4NCgkJCQk8ZGl2IGNsYXNzPSJ0aWNrZXRfcHJpY2UiIGFsaWduPSJjZW50ZXIiPg0KCQkJCQk8ZGl2IGNsYXNzPSJ0aWNrZXRfcHJpY2VfMiI+DQoJCQkJCQk8bGFiZWw+VGlja2V0IFByaWNlPC9sYWJlbD48YnI+DQoJCQkJCQk8ZGl2IGNsYXNzPSJ0aWNrZXRfYmFyIj48P3BocCBlY2hvICR0aWNrZXRfcHJpY2U/Pi4wMCBUSzwvZGl2Pg0KCQkJCQk8L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCQk8P3BocCB9Pz4NCgkJCQkNCgkJCQk8ZGl2IGNsYXNzPSJib29raW5nX3R5cGUiIGFsaWduPSJjZW50ZXIiPg0KCQkJCQk8ZGl2IGNsYXNzPSJib29raW5nX3R5cGVfMiI+DQoJCQkJCQk8bGFiZWw+Qm9va2luZyBUeXBlPC9sYWJlbD48YnI+DQoJCQkJCQk8ZGl2IGNsYXNzPSJib29raW5nX2JhciI+UGFpZCAmIzEwMDAzOzwvZGl2Pg0KCQkJCQk8L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCTwvZGl2Pg0KCQkNCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUGFzc2VuZ2VyIEluZm9ybWF0aW9uIEFyZWEgU3RhcnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4JDQoJCQkJPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNvdW50ZG93biBTZWxlY3QgUEhQIFN0YXJ0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+DQoJCQkJPD9waHAgDQoJCQkJCSRjb3VudGRvd25fc2VsZWN0PSJzZWxlY3QgKiBmcm9tIHRpY2tldCB3aGVyZSB0cmlwPSciLiR0cmlwX25hbWUuIicgJiYgam91cm5leV9kYXRlPSciLiR0cmlwX2RhdGUuIicmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmc3RhdHVzPTEiOw0KCQkJCQkkY291bnRkb3duX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGNvdW50ZG93bl9zZWxlY3QpOw0KCQkJCQkkY291bnRkb3duX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJGNvdW50ZG93bl9xdWVyeSk7DQoJCQkJCWlmKCFlbXB0eSgkY291bnRkb3duX3Jvdykpew0KCQkJCQkJJGNvdW50ZG93bl9lbmRfdGltZT0kY291bnRkb3duX3Jvd1snc3RvcF90aW1lJ107DQoJCQkJCQllY2hvICRjb3VudGRvd25fZW5kX3RpbWU9ZGF0ZSgnSDppOnMnLCRjb3VudGRvd25fZW5kX3RpbWUpOw0KCQkJCQl9DQoJCQkJCSRjb3VudGRvd25fZGF0ZT1kYXRlKCdNIGQsMjAyMCcpOw0KCQkJCQkkY291bnRkb3duX2RhdGU9ZGF0ZSgnTSBkLFknLCBzdHJ0b3RpbWUoJGNvdW50ZG93bl9kYXRlLiAnICsgMSBkYXlzJykpOw0KCQkJCT8+DQoJCQkJPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNvdW50ZG93biBTZWxlY3QgUEhQIEVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPg0KCQkJCTw/cGhwIA0KCQkJCQkvLy0tLS0tRGlzY291bnQgVmFsaWRhdGlvbiBTdGFydA0KCQkJCQlpZigkZGlzY291bnRfcGVybWlzc2lvbj09J3llcycpew0KCQkJCQkJaWYoIWVtcHR5KCRfUE9TVFsnZGlzY291bnQnXSkpew0KCQkJCQkJCSRkaXNjb3VudD0kX1BPU1RbJ2Rpc2NvdW50J107DQoJCQkJCQkJJHRpY2tldF9wcmljZT0kdGlja2V0X3ByaWNlLSRkaXNjb3VudDsNCgkJCQkJCX1lbHNleyRkaXNjb3VudD0iIjt9DQoJCQkJCX1lbHNleyRkaXNjb3VudD0iIjt9DQoJCQkJCS8vLS0tLS1EaXNjb3VudCBWYWxpZGF0aW9uIEVuZA0KCQkJCT8+DQoJCQk8ZGl2IGNsYXNzPSJuYW1lX2JveCI+DQoJCQkJPGRpdiBjbGFzcz0ibmFtZV9oZWFkaW5nIj48aSBjbGFzcz0iZmFzIGZhLWluZm8tY2lyY2xlIj48L2k+IFBhc3NlbmdlciBJbmZvcm1hdGlvbjwvZGl2Pg0KCQkJCTw/cGhwIA0KCQkJCQkkaT0xOw0KCQkJCQkkcGFzc2VuZ2VyX3NlbGVjdD0ic2VsZWN0ICogZnJvbSB0aWNrZXQgd2hlcmUgc3RhdHVzPTEmJnVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmdHJpcD0nIi4kdHJpcF9uYW1lLiInJiZqb3VybmV5X2RhdGU9JyIuJHRyaXBfZGF0ZS4iJyI7DQoJCQkJCSRwYXNzZW5nZXJfc2VsZWN0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHBhc3Nlbmdlcl9zZWxlY3QpOw0KCQkJCQkkcGFzc2VuZ2VyX2NvdW50PW15c3FsaV9udW1fcm93cygkcGFzc2VuZ2VyX3NlbGVjdF9xdWVyeSk7DQoJCQkJCWlmKCFlbXB0eSgkdGlja2V0X3ByaWNlKSl7DQoJCQkJCSR0b3RhbF90aWNrZXRfcHJpY2U9aHRtbHNwZWNpYWxjaGFycyh1cmxkZWNvZGUoYmFzZTY0X2RlY29kZSgkX0dFVFsncmVwbGFjZShyLHApJ10pKSkqJHBhc3Nlbmdlcl9jb3VudDsvL1RvdGFsIFRpY2tldCBQcmljZQ0KCQkJCQl3aGlsZSgkcGFzc2VuZ2VyX3Jvdz1teXNxbGlfZmV0Y2hfYXNzb2MoJHBhc3Nlbmdlcl9zZWxlY3RfcXVlcnkpKXsNCgkJCQkJJHNlYXRfbmFtZT0kcGFzc2VuZ2VyX3Jvd1snc2VhdF9uYW1lJ107DQoJCQkJPz4NCgkJCQk8ZGl2IGNsYXNzPSJtYWluX2luZm8iPg0KCQkJCQk8ZGl2IGNsYXNzPSJzZXJpYWwiPjw/cGhwIGVjaG8gJGk/PjwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJzZWF0X2luZm8iPjw/cGhwIGVjaG8gJHNlYXRfbmFtZT8+PC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9ImdlbmRlciI+DQoJCQkJCQk8c2VsZWN0IG5hbWU9Ijw/cGhwIGVjaG8gJHNlYXRfbmFtZT8+Ij4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSJNIj5NYWxlPC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iRiI+RmVtYWxlPC9vcHRpb24+DQoJCQkJCQk8L3NlbGVjdD4NCgkJCQkJPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9InByaWNlIj48P3BocCBlY2hvICR0aWNrZXRfcHJpY2U/PiBUSzwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJyZW1vdmUiIHZhbHVlPSI8P3BocCBlY2hvICRzZWF0X25hbWU/PiI+Q2FuY2VsPC9kaXY+DQoJCQkJCTxkaXYgY2xhc3M9InRpbWVyIiBpZD0iPD9waHAgZWNobyAkaT8+dGltZXIiPjxkaXYgY2xhc3M9Imxkcy1kdWFsLXJpbmciPjwvZGl2PjwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+DQoJCQkJCTxkaXYgc3R5bGU9InBvc2l0aW9uOmZpeGVkO3RvcDowcHg7IiBjbGFzcz0iYmJiIj48L2Rpdj4NCgkJCQkJPHNjcmlwdD4NCgkJCQkJCSQoIi5yZW1vdmUiKS5jbGljayhmdW5jdGlvbigpew0KCQkJCQkJCSQodGhpcykuY3NzKCJiYWNrZ3JvdW5kIiwiIzAwMCIpOw0KCQkJCQkJCXZhciBzZWF0X25vPSQodGhpcykuYXR0cigidmFsdWUiKTsNCgkJCQkJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7cmVtb3ZlOjAsdHJpcF9uYW1lOiI8P3BocCBlY2hvICR0cmlwX25hbWU/PiIsdHJpcF9kYXRlOiI8P3BocCBlY2hvICR0cmlwX2RhdGU/PiIsc2VhdF9ubzpzZWF0X25vfSk7DQoJCQkJCQkJd2luZG93LmxvY2F0aW9uLmhyZWY9IiI7DQoJCQkJCQl9KTsNCgkJCQkJPC9zY3JpcHQ+DQoJCQkJCTwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQ291bnREb3duIFRpbWVyIFNlY3Rpb24gU3RhcnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+DQoJCQkJCTwhLS0gRGlzcGxheSB0aGUgY291bnRkb3duIHRpbWVyIGluIGFuIGVsZW1lbnQgLS0+DQoJCQkJCQkJPHAgaWQ9ImRlbW8iPjwvcD4NCgkJCQkJCQkNCgkJCQkJCQk8c2NyaXB0Pg0KCQkJCQkJCS8vIFNldCB0aGUgZGF0ZSB3ZSdyZSBjb3VudGluZyBkb3duIHRvDQoJCQkJCQkJdmFyIGNvdW50RG93bkRhdGUgPSBuZXcgRGF0ZSgiPD9waHAgZWNobyAkY291bnRkb3duX2RhdGU/PiA8P3BocCBlY2hvICRjb3VudGRvd25fZW5kX3RpbWU/PiIpLmdldFRpbWUoKTsNCgkJCQkJCQkNCgkJCQkJCQkvLyBVcGRhdGUgdGhlIGNvdW50IGRvd24gZXZlcnkgMSBzZWNvbmQNCgkJCQkJCQl2YXIgeCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgew0KCQkJCQkJCQ0KCQkJCQkJCS8vIEdldCB0b2RheSdzIGRhdGUgYW5kIHRpbWUNCgkJCQkJCQl2YXIgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7DQoJCQkJCQkJDQoJCQkJCQkJLy8gRmluZCB0aGUgZGlzdGFuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSBjb3VudCBkb3duIGRhdGUNCgkJCQkJCQl2YXIgZGlzdGFuY2UgPSBjb3VudERvd25EYXRlIC0gbm93Ow0KCQkJCQkJCQ0KCQkJCQkJCS8vIFRpbWUgY2FsY3VsYXRpb25zIGZvciBkYXlzLCBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcw0KCQkJCQkJCXZhciBkYXlzID0gTWF0aC5mbG9vcihkaXN0YW5jZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7DQoJCQkJCQkJdmFyIGhvdXJzID0gTWF0aC5mbG9vcigoZGlzdGFuY2UgJSAoMTAwMCAqIDYwICogNjAgKiAyNCkpIC8gKDEwMDAgKiA2MCAqIDYwKSk7DQoJCQkJCQkJdmFyIG1pbnV0ZXMgPSBNYXRoLmZsb29yKChkaXN0YW5jZSAlICgxMDAwICogNjAgKiA2MCkpIC8gKDEwMDAgKiA2MCkpOw0KCQkJCQkJCXZhciBzZWNvbmRzID0gTWF0aC5mbG9vcigoZGlzdGFuY2UgJSAoMTAwMCAqIDYwKSkgLyAxMDAwKTsNCgkJCQkJCQkNCgkJCQkJCQkvLyBEaXNwbGF5IHRoZSByZXN1bHQgaW4gdGhlIGVsZW1lbnQgd2l0aCBpZD0iZGVtbyINCgkJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiPD9waHAgZWNobyAkaT8+dGltZXIiKS5pbm5lckhUTUwgPSIwIittaW51dGVzICsgIjogIiArIHNlY29uZHM7DQoJCQkJCQkJaWYoc2Vjb25kczwxMCl7DQoJCQkJCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCI8P3BocCBlY2hvICRpPz50aW1lciIpLmlubmVySFRNTCA9ICIwIittaW51dGVzICsgIjowIiArIHNlY29uZHM7DQoJCQkJCQkJfQ0KCQkJCQkJCS8vIElmIHRoZSBjb3VudCBkb3duIGlzIGZpbmlzaGVkLCB3cml0ZSBzb21lIHRleHQNCgkJCQkJCQkvKmlmIChkaXN0YW5jZSA8IDApIHsNCgkJCQkJCQkJY2xlYXJJbnRlcnZhbCh4KTsNCgkJCQkJCQkJJCgiLnN1Yl9wcmludCIpLnNob3coKTsNCgkJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpew0KCQkJCQkJCQkJJCgiLnJlZnJlc2giKS5jbGljaygpOw0KCQkJCQkJCQl9LDIwMDApOw0KCQkJCQkJCX0qLw0KCQkJCQkJCWlmKG1pbnV0ZXM9PTAmJnNlY29uZHM9PTApew0KCQkJCQkJCQljbGVhckludGVydmFsKHgpOw0KCQkJCQkJCQkkKCIuc3ViX3ByaW50Iikuc2hvdygpOw0KCQkJCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQoJCQkJCQkJCQkkKCIucmVmcmVzaCIpLmNsaWNrKCk7DQoJCQkJCQkJCX0sMjAwMCk7DQoJCQkJCQkJfQ0KCQkJCQkJCX0sIDEwMDApOw0KCQkJCQkJCTwvc2NyaXB0Pg0KCQkJCQk8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUNvdW50RG93biBUaW1lciBTZWN0aW9uIEVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4NCgkJCQk8L2Rpdj4NCgkJCQk8P3BocCANCgkJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNlbmQgQWxsIERhdGEgVGVtcG9yYXJpIFRhYmxlIFN0YXJ0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCQkJCQlpZihpc3NldCgkX1BPU1RbJ2NvbmZpcm0nXSkpew0KCQkJCQkJJHBhc3Nlbmdlcl9uYW1lPXN0cnRvdXBwZXIoJF9QT1NUWydwYXNzZW5nZXJfbmFtZSddKTsNCgkJCQkJCSRtb2JpbGVfbnVtYmVyPSRfUE9TVFsnbW9iaWxlX251bWJlciddOw0KCQkJCQkJJGdlbmRlcj0kX1BPU1RbJHNlYXRfbmFtZV07DQoJCQkJCQkkYm9hcmRpbmc9JF9QT1NUWydib2FyZGluZyddOw0KCQkJCQkJJGV4cGxvZGVfYm9hcmRpbmc9ZXhwbG9kZSgiLSIsJGJvYXJkaW5nKTsNCgkJCQkJCSRib2FyZGluZ19wb2ludD0kZXhwbG9kZV9ib2FyZGluZ1swXTsNCgkJCQkJCSRib2FyZGluZ190aW1lPSRleHBsb2RlX2JvYXJkaW5nWzFdOw0KCQkJCQkJJGRyb3BwaW5nPSRfUE9TVFsnZHJvcHBpbmcnXTsNCgkJCQkJCSRleHBsb2RlX2Ryb3BwaW5nPWV4cGxvZGUoIi0iLCRkcm9wcGluZyk7DQoJCQkJCQkkZHJvcHBpbmdfcG9pbnQ9JGV4cGxvZGVfZHJvcHBpbmdbMF07DQoJCQkJCQkkX1NFU1NJT05bJ3BuciddPSRwbnI7Ly9zZW5kIHBuciBpbiBzZXNzaW9uDQoJCQkJCQkvL0ZpbmFsIFNlbmQgUXVlcnkgVGVtcG9yYXJpIFRhYmxlIFN0YXJ0DQoJCQkJCQkkZGVsZXRlX3RtcD0iZGVsZXRlIGZyb20gdG1wX3RhYmxlIHdoZXJlIHVzZXJfbmFtZT0nIi4kYWdlbnRfbmFtZS4iJyYmcG5yIT0nIi4kcG5yLiInIjsNCgkJCQkJCSRkZWxldGVfdG1wX3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJGRlbGV0ZV90bXApOw0KCQkJCQkJJHNlcmlhbF9zZWxlY3Q9InNlbGVjdCAqIGZyb20gdGlja2V0IHdoZXJlIGJvb2tpbmc9J2Jvb2tlZCciOw0KCQkJCQkJJHNlcmlhbF9zZWxlY3RfcXVlcnk9bXlzcWxpX3F1ZXJ5KCRkYiwkc2VyaWFsX3NlbGVjdCk7DQoJCQkJCQkkc2VyaWFsX2NvdW50PW15c3FsaV9udW1fcm93cygkc2VyaWFsX3NlbGVjdF9xdWVyeSk7DQoJCQkJCQkkbWFpbl9zZXJpYWw9JHNlcmlhbF9jb3VudCsxOw0KCQkJCQkJJHRtcF9pbnNlcnQ9Imluc2VydCBpbnRvIHRtcF90YWJsZShzZWF0X25hbWUscGFzc2VuZ2VyX25hbWUsbW9iaWxlLGdlbmRlcix1c2VyX25hbWUsYmFwcHlfZnJvbSxiYXBweV90byxib2FyZGluZyxkcm9wcGluZyxpc3N1ZF9kYXRlLGlzc3VkX3RpbWUsc2VyaWFsLHN0b3BfdGltZSxzdGF0dXMsYm9va2luZyxwbnIsdHJpcCxqb3VybmV5X2RhdGUsZGVwYXJ0dXJlX3RpbWUsc2VhdF9mYXJlLHRvdGFsX2ZhcmUsZGlzY291bnQsY29tbWlzc2lvbixjb3VudGVyKXZhbHVlcygnIi4kc2VhdF9uYW1lLiInLCciLiRwYXNzZW5nZXJfbmFtZS4iJywnIi4kbW9iaWxlX251bWJlci4iJywnIi4kZ2VuZGVyLiInLCciLiRhZ2VudF9uYW1lLiInLCciLiRiYXBweV9mcm9tLiInLCciLiRiYXBweV90by4iJywnIi4kYm9hcmRpbmdfcG9pbnQuIicsJyIuJGRyb3BwaW5nX3BvaW50LiInLCciLiRtYWluX2RhdGUuIicsJyIuJG1haW5fdGltZS4iJywnIi4kbWFpbl9zZXJpYWwuIicsJycsJzAnLCdib29rZWQnLCciLiRwbnIuIicsJyIuJHRyaXBfbmFtZS4iJywnIi4kdHJpcF9kYXRlLiInLCciLiRib2FyZGluZ190aW1lLiInLCciLiR0aWNrZXRfcHJpY2UuIicsJyIuJHRvdGFsX3RpY2tldF9wcmljZS4iJywnIi4kZGlzY291bnQuIicsJyIuJGNvbW1pc3Npb24uIicsJyIuJGFnZW50X2NvdW50ZXIuIicpIjsNCgkJCQkJCSR0bXBfaW5zZXJ0X3F1ZXJ5PW15c3FsaV9xdWVyeSgkZGIsJHRtcF9pbnNlcnQpOw0KCQkJCQkJLy9GaW5hbCBTZW5kIFF1ZXJ5IFRlbXBvcmFyaSBUYWJsZSBFbmQNCgkJCQkJCQ0KCQkJCQkJDQoJCQkJCQkNCgkJCQkJCQ0KCQkJCQkJLy9TaG93IENvbmZpcm0gQm94IFN0YXJ0DQoJCQkJCQkNCgkJCQkJCQkvL0Rpc2NvdW50IFNob3cgT3IgSGlkZSBEZXZlbG9wbWVudCBTdGFydA0KCQkJCQkJCQlpZighZW1wdHkoJF9QT1NUWydkaXNjb3VudCddKSl7DQoJCQkJCQkJCSRkaXNjb3VudF9kaXNwbGF5PSdkaXNwbGF5OmJsb2NrJzsNCgkJCQkJCQkJJGNvbmZpcm1fYm94X2Rpc2NvdW50PSRfUE9TVFsnZGlzY291bnQnXSokcGFzc2VuZ2VyX2NvdW50Ow0KCQkJCQkJCQkkY29uZmlybV9ib3hfdG90YWw9JHRvdGFsX3RpY2tldF9wcmljZS0kY29uZmlybV9ib3hfZGlzY291bnQ7DQoJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJJGRpc2NvdW50X2Rpc3BsYXk9J2Rpc3BsYXk6bm9uZSc7DQoJCQkJCQkJCQkkY29uZmlybV9ib3hfZGlzY291bnQ9Jyc7DQoJCQkJCQkJCQkkY29uZmlybV9ib3hfdG90YWw9Jyc7fQ0KCQkJCQkJCS8vRGlzY291bnQgU2hvdyBPciBIaWRlIERldmVsb3BtZW50IEVuZA0KCQkJCQkJCQ0KCQkJCQkJCQ0KCQkJCQkJZWNobyAnDQoJCQkJCQkJPGRpdiBjbGFzcz0ic3ViX2ZpbmFsX2NvbmZpcm0iPg0KCQkJCQkJCQ0KCQkJCQkJCQk8ZGl2IGNsYXNzPSJmaW5hbF9jb25maXJtIj4NCgkJCQkJCQkJDQoJCQkJCQkJCQk8c3BhbiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4OyI+Um91dGUgOiAnLiRiYXBweV9mcm9tLicgLSAnLiRiYXBweV90by4nICZuYnNwLSAoQkRULiAnLiR0b3RhbF90aWNrZXRfcHJpY2UuJy4wMCApPC9zcGFuPg0KCQkJCQkJCQkJDQoJCQkJCQkJCQk8c3BhbiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4OycuJGRpc2NvdW50X2Rpc3BsYXkuJyI+RGlzY291bnQ6Jy4kY29uZmlybV9ib3hfZGlzY291bnQuJyBUYWthPC9zcGFuPg0KCQkJCQkJCQkJDQoJCQkJCQkJCQk8c3BhbiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4OycuJGRpc2NvdW50X2Rpc3BsYXkuJyI+U3ViIFRvdGFsOicuJGNvbmZpcm1fYm94X3RvdGFsLicgVGFrYTwvc3Bhbj4NCgkJCQkJCQkJCQ0KCQkJCQkJCQkJPHNwYW4gc3R5bGU9Im1hcmdpbi1ib3R0b206MTBweDsiPkJvb2tpbmcgVHlwZSA6IFBhaWQ8L3NwYW4+DQoJCQkJCQkJCQkNCgkJCQkJCQkJPHNwYW4+QXJlIHlvdSBzdXJlPyB3YW50IHRvIHByb2NlZWQ/IDwvc3Bhbj4NCgkJCQkJCQkJDQoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJjYW5jZWwiIG5hbWU9ImNhbmNlbCI+Tm88L2Rpdj4NCgkJCQkJCQkJCTxkaXYgY2xhc3M9InllcyIgbmFtZT0iZmluYWxfYm9vayI+WWVzPC9kaXY+DQoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+DQoJCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJJzsNCgkJCQkJCS8vU2hvdyBDb25maXJtIEJveCBFbmQNCgkJCQkJCS8vZmluYWwgc2VuZCBkYXRhIGluIEpRVUVSWSBzdGFydA0KCQkJCQkJJHNlbmRfcG5yPSRfU0VTU0lPTlsncG5yJ107DQoJCQkJCQllY2hvICcNCgkJCQkJCQk8c2NyaXB0Pg0KCQkJCQkJCQkkKCIuY2FuY2VsIikuY2xpY2soZnVuY3Rpb24oKXsNCgkJCQkJCQkJJCgiLnN1Yl9maW5hbF9jb25maXJtIikuc2xpZGVVcCg1MDApOw0KCQkJCQkJCQkkLnBvc3QoIi4uL2ZpbmFsX2Jvb2sucGhwIix7ZGVsZXRlX3BucjoiJy4kc2VuZF9wbnIuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5sYXN0IikuaHRtbChkYXRhKX0pOw0KCQkJCQkJCQl9KTsNCgkJCQkJCQkJJCgiLnllcyIpLmNsaWNrKGZ1bmN0aW9uKCl7DQoJCQkJCQkJCQkkKCIubGFzdCIpLnNob3coKTsNCgkJCQkJCQkJCSQoIi5zdWJfZmluYWxfY29uZmlybSIpLmhpZGUoKTsNCgkJCQkJCQkJJC5wb3N0KCIuLi9maW5hbF9ib29rLnBocCIse3BucjoiJy4kc2VuZF9wbnIuJyJ9LGZ1bmN0aW9uKGRhdGEpeyQoIi5tYWluX3ByaW50IikuaHRtbChkYXRhKX0pOw0KCQkJCQkJCQkNCgkJCQkJCQkJfSk7DQoJCQkJCQkJPC9zY3JpcHQ+DQoJCQkJCSc7DQoJCQkJCS8vZmluYWwgc2VuZCBpbiBKUVVFUlkgZGF0YSBlbmQNCgkJCQkJfQ0KCQkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU2VuZCBBbGwgRGF0YSBUZW1wb3JhcmkgVGFibGUgRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCQkJCT8+DQoJCQkJPD9waHAgJGkrKzt9fT8+DQoJCQkJCQ0KCQkJCTxkaXYgY2xhc3M9ImNsZWFyIj48L2Rpdj4NCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUGFzc2VuZ2VyIEluZm9ybWF0aW9uIEFyZWEgRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+DQoNCg0KDQoNCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EaXNjb3VudCBTZWN0aW9uIFN0YXJ0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+DQoJCQkJPD9waHAgDQoJCQkJCWlmKCRwYXNzZW5nZXJfY291bnQ+MCYmIWVtcHR5KCR0aWNrZXRfcHJpY2UpKXsNCgkJCQk/Pg0KCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCg0KCQkJCWZ1bmN0aW9uIGNhbGN1bGF0ZURpc2NvdW50KCkgew0KCQkNCgkJCQl2YXIgbWFpbl9wcmljZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluX3ByaWNlIikudmFsdWU7DQoJCQkJdmFyIGNvdW50PSI8P3BocCBlY2hvICRwYXNzZW5nZXJfY291bnQ/PiI7DQoJCQkJdmFyIGRpc2NvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRpc2NvdW50IikudmFsdWU7DQoJCQkJdmFyIG1hdGg9ZGlzY291bnQqY291bnQ7DQoJCQkJdG90YWwgPSBldmFsKG1haW5fcHJpY2UgLSBtYXRoKTsNCgkJCQlpZih0b3RhbDw9MCl7DQoJCQkJCWFsZXJ0KCJQbGVhc2UgQ2hlY2sgRGlzY291bnQiKTsNCgkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvdW50JykudmFsdWUgPSIiOw0KCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90YWxfaW5kZXgnKS5pbm5lckhUTUwgPSJTdWIgVG90YWw6IjsNCgkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdGFsX3ByaWNlJykuaW5uZXJIVE1MID0iPD9waHAgZWNobyAkdG90YWxfdGlja2V0X3ByaWNlPz4iOw0KCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hvd19kaXNjb3VudCcpLnN0eWxlLmRpc3BsYXkgPSJub25lIjsNCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzY291bnRfdG90YWwnKS5zdHlsZS5kaXNwbGF5ID0ibm9uZSI7DQoJCQkJfQ0KCQkJCWVsc2V7DQoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdGFsX2luZGV4JykuaW5uZXJIVE1MID0iVG90YWw6IjsNCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hvd19kaXNjb3VudF9wcmljZScpLmlubmVySFRNTCA9IG1hdGg7DQoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nob3dfZGlzY291bnQnKS5zdHlsZS5kaXNwbGF5ID0iYmxvY2siOw0KCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3VudF90b3RhbCcpLnN0eWxlLmRpc3BsYXkgPSJibG9jayI7DQoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvdW50X3RvdGFsX3ByaWNlJykuaW5uZXJIVE1MID10b3RhbDsNCgkJCQl9DQoJCQkJfQ0KCQkJCTwvc2NyaXB0Pg0KCQkJCTxkaXYgY2xhc3M9InRvdGFsIiBpZD0ic3ViX3RvdGFsIj48c3BhbiBpZD0idG90YWxfaW5kZXgiPlN1YiBUb3RhbDo8L3NwYW4+IDxzcGFuIGlkPSJ0b3RhbF9wcmljZSI+PD9waHAgZWNobyAkdG90YWxfdGlja2V0X3ByaWNlPz48L3NwYW4+IFRrPC9kaXY+DQoJCQkJPGRpdiBjbGFzcz0ic2hvd19kaXNjb3VudCIgaWQ9InNob3dfZGlzY291bnQiPkRpc2NvdW50OiA8c3BhbiBpZD0ic2hvd19kaXNjb3VudF9wcmljZSI+PD9waHAgZWNobyAkdG90YWxfdGlja2V0X3ByaWNlPz48L3NwYW4+IFRrPC9kaXY+DQoJCQkJPGRpdiBjbGFzcz0iZGlzY291bnRfdG90YWwiIGlkPSJkaXNjb3VudF90b3RhbCI+U3ViIFRvdGFsOiA8c3BhbiBpZD0iZGlzY291bnRfdG90YWxfcHJpY2UiPjw/cGhwIGVjaG8gJHRvdGFsX3RpY2tldF9wcmljZT8+PC9zcGFuPiBUazwvZGl2Pg0KPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURpc2NvdW50IFNlY3Rpb24gRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+DQoJCQkJPD9waHAgfT8+DQoJCQkJPGRpdiBjbGFzcz0icGFzc2VuZ2VyX25hbWUiPg0KCQkJCQk8ZGl2IGNsYXNzPSJwYXNzZW5nZXJfbmFtZV8xIj5QYXNzZW5nZXIgTmFtZTwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJwYXNzZW5nZXJfbmFtZV8yIj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlBhc3NlbmdlciBOYW1lIiBuYW1lPSJwYXNzZW5nZXJfbmFtZSIgbWF4bGVuZ3RoPSIyMCIgcmVxdWlyZWQgLz48L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCQkNCgkJCQk8ZGl2IGNsYXNzPSJwYXNzZW5nZXJfbW9iaWxlIj4NCgkJCQkJPGRpdiBjbGFzcz0icGFzc2VuZ2VyX21vYmlsZV8xIj5QYXNzZW5nZXIgTW9iaWxlIE51bWJlcjwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJwYXNzZW5nZXJfbW9iaWxlXzIiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iTW9iaWxlIE51bWJlciIgbmFtZT0ibW9iaWxlX251bWJlciIgbWF4bGVuZ3RoPSIxMSIgbWlubGVuZ3RoPSIxIiBvbmtleXByZXNzPSd2YWxpZGF0ZShldmVudCknIHJlcXVpcmVkIC8+PC9kaXY+DQoJCQkJPC9kaXY+DQoJCQkJPCEtLS1EaXNjb3VudCBEaXYgT25seSBTdGFydC0tLT4NCgkJCQk8P3BocCANCgkJCQkJaWYoJGRpc2NvdW50X3Blcm1pc3Npb249PSd5ZXMnKXsNCgkJCQk/Pg0KCQkJCTxkaXYgY2xhc3M9ImRpc2NvdW50Ij4NCgkJCQkJPGRpdiBjbGFzcz0iZGlzY291bnRfMSI+RGlzY291bnQgUGVyIFRpY2tldDwvZGl2Pg0KCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0ibWFpbl9wcmljZSIgdmFsdWU9Ijw/cGhwIGVjaG8gJHRvdGFsX3RpY2tldF9wcmljZT8+IiAvPg0KCQkJCQk8ZGl2IGNsYXNzPSJkaXNjb3VudF8yIj48aW5wdXQgaWQ9ImRpc2NvdW50IiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iRGlzY291bnQiIG5hbWU9ImRpc2NvdW50IiBvbmtleXByZXNzPSd2YWxpZGF0ZShldmVudCknIG9ua2V5dXA9ImNhbGN1bGF0ZURpc2NvdW50KCkiLz48L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCQk8P3BocCB9Pz4NCgkJCQk8IS0tLURpc2NvdW50IERpdiBPbmx5IEVuZC0tLT4NCgkJCQkNCgkJCQk8P3BocCBpZigkcGFzc2VuZ2VyX2NvdW50PjApez8+PGJ1dHRvbiBjbGFzcz0ib25fY29uZmlybSIgbmFtZT0iY29uZmlybSI+Q29uZmlybTwvYnV0dG9uPjw/cGhwIH1lbHNlez8+DQoJCQkJPGRpdiBjbGFzcz0ib2ZmX2NvbmZpcm0iPkNvbmZpcm08L2Rpdj48P3BocCB9Pz4NCgkJCTwvZGl2Pg0KCQkJPGRpdiBjbGFzcz0iY2xlYXIiPjwvZGl2PgkNCgkJPC9mb3JtPgkNCgkJPC9kaXY+DQoJCQ0KCTwvZGl2Pg0KCQ0KCQ0KCTwhLS0tPGRpdiBjbGFzcz0iZm9vdGVyIj48c3BhbiBjbGFzcz0ic3RhdHVzIj5TdGF0dXM6PC9zcGFuPjxpIGNsYXNzPSJmYXMgZmEtc2lnbmFsIj48L2k+PHNwYW4gY2xhc3M9Im9ubGluZSI+T25saW5lPC9zcGFuPjwvZGl2Pi0tLT4NCjwvYm9keT4NCjwvaHRtbD4NCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSGlkZSBTZWxlY3QgT3B0aW9uIGluIFRpbWUgT3ZlciBTdGFydC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+DQo8P3BocCANCglpZigkdHJpcF90aW1lPT0nVGltZSBPdmVyJyl7DQoJCWVjaG8gJw0KCQkJPHNjcmlwdD4kKCIuc2VsZWN0X2hpZGUiKS5oaWRlKCk7PC9zY3JpcHQ+DQoJCQk8ZGl2IGNsYXNzPSJ0aW1lX292ZXJfd3JhcHBlciI+DQoJCQkJPGRpdiBjbGFzcz0idGltZV9vdmVyX2NvbnRlbnQiPlRoaXMgVHJpcCBpcyBPdXQgT2YgVGltZTwvZGl2Pg0KCQkJCQ0KCQkJPC9kaXY+DQoJCSc7DQoJfQ0KPz4NCjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSGlkZSBTZWxlY3QgT3B0aW9uIGluIFRpbWUgT3ZlciBFbmQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPg0KPHNjcmlwdD4NCgkkKCIubWVudSIpLmNsaWNrKGZ1bmN0aW9uKCl7DQoJCSQoIi5zaWRlX2JhciIpLnNsaWRlRG93bigzMDApOw0KCX0pOw0KCSQoIi5zaWRlX2JhciIpLmNsaWNrKGZ1bmN0aW9uKCl7DQoJCSQoIi5zaWRlX2JhciIpLnNsaWRlVXAoMzAwKTsNCgl9KTsNCgkkKCIubWFpbl9tYW51IikuY2xpY2soZnVuY3Rpb24oKXsNCgkJJCgiLnNpZGVfYmFyIikuc2xpZGVVcCgzMDApOw0KCX0pOw0KPC9zY3JpcHQ+DQo8c2NyaXB0Pg0KCWZ1bmN0aW9uIHZhbGlkYXRlKGV2dCkgew0KICB2YXIgdGhlRXZlbnQgPSBldnQgfHwgd2luZG93LmV2ZW50Ow0KDQogIC8vIEhhbmRsZSBwYXN0ZQ0KICBpZiAodGhlRXZlbnQudHlwZSA9PT0gJ3Bhc3RlJykgew0KICAgICAga2V5ID0gZXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7DQogIH0gZWxzZSB7DQogIC8vIEhhbmRsZSBrZXkgcHJlc3MNCiAgICAgIHZhciBrZXkgPSB0aGVFdmVudC5rZXlDb2RlIHx8IHRoZUV2ZW50LndoaWNoOw0KICAgICAga2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXkpOw0KICB9DQogIHZhciByZWdleCA9IC9bMC05XXwuLzsNCiAgaWYoICFyZWdleC50ZXN0KGtleSkgKSB7DQogICAgdGhlRXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsNCiAgICBpZih0aGVFdmVudC5wcmV2ZW50RGVmYXVsdCkgdGhlRXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgfQ0KfQ0KDQoNCg0KDQovL0ltYWdlIENsaWNrIEFuZCBSZWRpcmVjdA0KZnVuY3Rpb24gcmVkaXJlY3QoKXsNCgl3aW5kb3cubG9jYXRpb24uaHJlZj0nLi4vVHJpcD9tYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtyZXR1cm4gbnVsbCE9YSYmKHMoT2JqZWN0KGEpKT9uLm1lcmdlKGMsInN0cmluZyI9PXR5cGVvZiBhP1thXTphKTpnLmNhbGwoYyxhKSksY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYil7aWYoaClyZXR1cm4gaC5jYWxsKGIsYSxjKTtmb3IoZD1iLmxlbmd0aCxjPWM/MD5jP01hdGgubWF4KDAsZCtjKTpjOjA7ZD5jO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj0hIWEmJiJsZW5ndGgiaW57cmV0dXJuIGUuY2FsbCh0aGlzKX0nOw0KfQ0KLy9JbWFnZSBDbGljayBBbmQgUmVkaXJlY3QNCjwvc2NyaXB0Pg0KPHNjcmlwdD4NCglpZiAoIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSApIHsNCgkJd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCBudWxsLCBudWxsLCB3aW5kb3cubG9jYXRpb24uaHJlZiApOw0KCQl9DQo8L3NjcmlwdD4=")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | dcc997574f43ffb76c2e23c5f8065044 |
Eval Count | 1 |
Decode Time | 193 ms |