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 $_F=__FILE__;$_C1353562110='Pz48PzcyNwoKSEMgKCFDWWdvSkg4Z19tUkhiSmIoIkk3N19vWEliYl9J..
Decoded Output download
?><?php
if (!function_exists("app_class_autoloader")) {
include("../lib/app_top.php");
}
if (!isset($_SESSION[SESSION_VAR_NAME]['user_id'])) {
header("location: ../error_401.php");
exit();
} else {
$page_ctl = new page_access_ctl($db);
if ($page_ctl->hasPermission('513', $_SESSION[SESSION_VAR_NAME]['role'])) {
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
$sel_workflow = $_REQUEST['sel_workflow'];
//print_r($_REQUEST);
$r_f_im_1 = explode(',',$_REQUEST['r_f_im_1']);
$r_f_im_2 = explode(',',$_REQUEST['r_f_im_2']);
$r_f_im_3 = explode(',',$_REQUEST['r_f_im_3']);
// print_r($r_f_im_1);
// print_r($r_f_im_2);
// print_r($r_f_im_3);
// exit();
//ini_set('display_errors', '1');
$pid = $_REQUEST['pid'];
$f_values = $_REQUEST['f_values'];
$filter_wf = $_REQUEST['filter_wf'];
$Workflow = new workflow($db);
$WBuilder = new workflow_builder($db);
$WRole = new workflow_role($db);
$WRule = new workflow_rule($db);
$DocSet = new doc_set($db);
$User = new user($db);
$Leave = new leave($db);
$File = new file_manager($db);
$Project = new project($db);
$IndexMaster = new index_master($db);
$indexGroup = new index_group($db);
if ($sel_workflow > 0) {
$workflowstep_details = $Workflow->get_WBuilderValue_ByBID($sel_workflow);
$no_step_details = count($workflowstep_details);
$t_days = $workflowstep_details[0]['target_days'];
} else {
$t_days = 0;
}
$Data_Table = new data_table($db);
$aColumns = array('id','workflow_prefix', 'project_id', 'im_id', 'im_id', 'im_id');
$aColumnsx = array('wd.record_set_id','wp.prefix', 'b.project_id', 'b.workflow_title', 'wd.id', 'wd.im_id', 'wd.created_by', 'wd.created_at', 'wd.created_by', 'wr.user_id');
$Data_Table->set_aColumns($aColumns);
$cnt = count($matches_record);
if ($cnt > 0) {
for ($col = 0; $col < count($matches_record); $col++) {
array_push($Custom_Columns, $matches_record[$col]);
}
}
$sIndexColumn = "id ";
$Data_Table->set_sIndexColumn($sIndexColumn);
$sTable = "workflow_im";
$Data_Table->set_sTable($sTable);
$Data_Table->set_sIndexColumn($sIndexColumn);
$Data_Table->set_sEcho($_GET['sEcho']);
$Data_Table->set_iDisplayStart($_GET['iDisplayStart']);
$Data_Table->set_iDisplayLength($_GET['iDisplayLength']);
$Data_Table->set_iSortCol_0($_GET['iSortCol_0']);
$Data_Table->set_iSortingCols($_GET['iSortingCols']);
$rResult = array();
$Data_Table->sLimit = "";
if (isset($Data_Table->iDisplayStart) && $Data_Table->iDisplayLength != '-1') {
$Data_Table->sLimit = "LIMIT " . intval($Data_Table->iDisplayStart) . ", " . intval($Data_Table->iDisplayLength);
}
#===================================================================>>
# ORDER BY
#===================================================================>>
$sOrder = "";
if (isset($_GET['iSortCol_0'])) {
$sOrder = "ORDER BY ";
for ($i = 0; $i < intval($_GET['iSortingCols']); $i++) {
if ($_GET['bSortable_' . intval($_GET['iSortCol_' . $i])] == "true") {
if ($aColumns[intval($_GET['iSortCol_' . $i])] == 'p.doc_id') {
$sOrder .= 'INET_ATON(' . $aColumns[intval($_GET['iSortCol_' . $i])] . ") " . ($_GET['sSortDir_' . $i] === 'asc' ? 'asc' : 'desc') . ", ";
} else {
$sOrder .= $aColumns[intval($_GET['iSortCol_' . $i])] . " " . ($_GET['sSortDir_' . $i] === 'asc' ? 'asc' : 'desc') . ", ";
}
}
}
$sOrder = substr_replace($sOrder, "", -2);
if ($sOrder == "ORDER BY") {
$sOrder = " ";
}
}
$Data_Table->set_sOrder($sOrder);
#===================================================================>>
# SEARCH
#===================================================================>>
if ($sel_workflow > 0) {
$imf_info = $WBuilder->get_IMFields_ByBID($sel_workflow);
} else {
$imf_info = $WBuilder->get_IMFields_ByPID($pid);
}
$im_fields_arr = array_column($imf_info, 'imf_id');
$im_fields_result = array_unique($im_fields_arr);
$sWhere = "";
if (isset($_GET['sSearch']) && $_GET['sSearch'] != "") {
//$sWhere = "WHERE (";
if (count($im_fields_arr) > 0) {
if ($sel_workflow > 0) {
$sWhere = "AND ( ( b.workflow_title LIKE :SEARCH_VALUE_1 OR wp.prefix LIKE :SEARCH_VALUE_1 OR CONCAT(wd.builder_id, '.', wd.record_set_id) LIKE :SEARCH_VALUE_2) OR (";
} else {
$sWhere = "AND (b.workflow_title LIKE :SEARCH_VALUE_1 OR wp.prefix LIKE :SEARCH_VALUE_1 OR CONCAT(wd.builder_id, '.', wd.record_set_id) LIKE :SEARCH_VALUE_2 OR (";
}
} else {
if ($sel_workflow > 0) {
$sWhere = "AND ((b.workflow_title LIKE :SEARCH_VALUE_1 OR wp.prefix LIKE :SEARCH_VALUE_1 OR CONCAT(wd.builder_id, '.', wd.record_set_id) LIKE :SEARCH_VALUE_2) ) ";
} else {
$sWhere = "AND (b.workflow_title LIKE :SEARCH_VALUE_1 OR wp.prefix LIKE :SEARCH_VALUE_1 OR CONCAT(wd.builder_id, '.', wd.record_set_id) LIKE :SEARCH_VALUE_2 ) ";
}
}
$search_value_bind_count = 2;
$sSearch_arr = explode(',', htmlspecialchars($_GET['sSearch'], ENT_QUOTES));
if (count($sSearch_arr) > 0) {
$z = 0;
foreach ($imf_info as $key => $builder_imf) {
$sWhere .= '(';
if (APP_DB == "MYSQL") {
$y = 0;
$str = generateRandomString();
$sWhere .= " wd.record_set_id IN(";
$rand_str1 = str_shuffle($str);
foreach ($sSearch_arr as $sSearch_val) {
$search_value_bind_count++;
$search_value_bind_str = ':SEARCH_VALUE_' . $search_value_bind_count;
if ($y == 0) {
$sWhere .= " (select " . $rand_str1 . ".id FROM _dynamic_im_" . $builder_imf['im_id'] . " AS " . $rand_str1 . " WHERE ";
}
$sWhere .= " " . $rand_str1 . ".im_field_" . $builder_imf['imf_id'] . " LIKE " . $search_value_bind_str . " ";
if ($y + 1 != count($sSearch_arr)) {
$sWhere .= 'OR ';
} else {
$sWhere .= ' ) ';
}
$y++;
}
$sWhere .= ") ";
} else {
$y = 0;
$str = generateRandomString();
$sWhere .= " wd.record_set_id IN(";
$rand_str1 = str_shuffle($str);
foreach ($sSearch_arr as $sSearch_val) {
$search_value_bind_count++;
$search_value_bind_str = ':SEARCH_VALUE_' . $search_value_bind_count;
if ($y == 0) {
$sWhere .= " (select " . $rand_str1 . ".id FROM _dynamic_im_" . $builder_imf['im_id'] . " AS " . $rand_str1 . " WHERE ";
}
$sWhere .= " " . $rand_str1 . ".im_field_" . $builder_imf['imf_id'] . " LIKE " . $search_value_bind_str . " ";
if ($y + 1 != count($sSearch_arr)) {
$sWhere .= 'OR ';
} else {
$sWhere .= ' ) ';
}
$y++;
}
$sWhere .= ") ";
}
$sWhere .= " OR ";
if (APP_DB == "MYSQL") {
$y = 0;
$sWhere .= " wd.record_set_id IN(";
$str = generateRandomString();
foreach ($sSearch_arr as $sSearch_val) {
$search_value_bind_count++;
$search_value_bind_str = ':SEARCH_VALUE_' . $search_value_bind_count;
$rand_str1 = str_shuffle($str);
$rand_str2 = str_shuffle($str);
$sWhere .= " (select " . $rand_str1 . ".id FROM _dynamic_im_" . $builder_imf['im_id'] . " AS " . $rand_str1 . " LEFT OUTER JOIN index_master_field_extend AS " . $rand_str2 . " ON(" . $rand_str2 . ".id= " . $rand_str1 . ".im_field_" . $builder_imf['imf_id'] . ") WHERE " . $rand_str2 . ".field_value LIKE " . $search_value_bind_str . ") ";
if ($y + 1 != count($sSearch_arr)) {
$sWhere .= ', ';
} else {
$sWhere .= '';
}
$y++;
}
$sWhere .= ") ";
} else {
$y = 0;
$str = generateRandomString();
$sWhere .= " wd.record_set_id IN(";
$rand_str1 = str_shuffle($str);
$rand_str2 = str_shuffle($str);
foreach ($sSearch_arr as $sSearch_val) {
$search_value_bind_count++;
$search_value_bind_str = ':SEARCH_VALUE_' . $search_value_bind_count;
if ($y == 0) {
$sWhere .= " (select " . $rand_str1 . ".id FROM _dynamic_im_" . $builder_imf['im_id'] . " AS " . $rand_str1 . " LEFT OUTER JOIN index_master_field_extend AS " . $rand_str2 . " ON(cast(" . $rand_str2 . ".id as varchar(max)) = cast(" . $rand_str1 . ".im_field_" . $builder_imf['imf_id'] . " as varchar(max))) WHERE ";
}
$sWhere .= " " . $rand_str2 . ".field_value LIKE " . $search_value_bind_str . " ";
if ($y + 1 != count($sSearch_arr)) {
$sWhere .= 'OR ';
} else {
$sWhere .= ' ) ';
}
$y++;
}
$sWhere .= ") ";
}
if ($z + 1 != count($imf_info)) {
$sWhere .= ') OR';
} else {
if (count($im_fields_arr) > 0) {
$sWhere .= '))';
} else {
$sWhere .= ')';
}
}
$z++;
}
} else {
$z = 0;
foreach ($imf_info as $key => $builder_imf) {
$sWhere .= '(';
if (APP_DB == "MYSQL") {
$y = 0;
$str = generateRandomString();
$sWhere .= " wd.record_set_id IN(";
$rand_str1 = str_shuffle($str);
foreach ($sSearch_arr as $sSearch_val) {
$search_value_bind_count++;
$search_value_bind_str = ':SEARCH_VALUE_' . $search_value_bind_count;
if ($y == 0) {
$sWhere .= " (select " . $rand_str1 . ".id FROM _dynamic_im_" . $builder_imf['im_id'] . " AS " . $rand_str1 . " WHERE ";
}
$sWhere .= " " . $rand_str1 . ".im_field_" . $builder_imf['imf_id'] . " LIKE " . $search_value_bind_str . " ";
if ($y + 1 != count($sSearch_arr)) {
$sWhere .= 'OR ';
} else {
$sWhere .= ' ) ';
}
$y++;
}
$sWhere .= ") ";
} else {
$y = 0;
$str = generateRandomString();
$sWhere .= " wd.record_set_id IN(";
$rand_str1 = str_shuffle($str);
foreach ($sSearch_arr as $sSearch_val) {
$search_value_bind_count++;
$search_value_bind_str = ':SEARCH_VALUE_' . $search_value_bind_count;
if ($y == 0) {
$sWhere .= " (select " . $rand_str1 . ".id FROM _dynamic_im_" . $builder_imf['im_id'] . " AS " . $rand_str1 . " WHERE ";
}
$sWhere .= " " . $rand_str1 . ".im_field_" . $builder_imf['imf_id'] . " LIKE " . $search_value_bind_str . " ";
if ($y + 1 != count($sSearch_arr)) {
$sWhere .= 'OR ';
} else {
$sWhere .= ' ) ';
}
$y++;
}
$sWhere .= ") ";
}
$sWhere .= " OR ";
if (APP_DB == "MYSQL") {
$y = 0;
$sWhere .= " wd.record_set_id IN(";
$str = generateRandomString();
foreach ($sSearch_arr as $sSearch_val) {
$search_value_bind_count++;
$search_value_bind_str = ':SEARCH_VALUE_' . $search_value_bind_count;
$rand_str1 = str_shuffle($str);
$rand_str2 = str_shuffle($str);
$sWhere .= " (select " . $rand_str1 . ".id FROM _dynamic_im_" . $builder_imf['im_id'] . " AS " . $rand_str1 . " LEFT OUTER JOIN index_master_field_extend AS " . $rand_str2 . " ON(" . $rand_str2 . ".id= " . $rand_str1 . ".im_field_" . $builder_imf['imf_id'] . ") WHERE " . $rand_str2 . ".field_value LIKE " . $search_value_bind_str . ") ";
if ($y + 1 != count($sSearch_arr)) {
$sWhere .= ', ';
} else {
$sWhere .= '';
}
$y++;
}
$sWhere .= ") ";
} else {
$y = 0;
$sWhere .= " wd.record_set_id IN(";
$str = generateRandomString();
foreach ($sSearch_arr as $sSearch_val) {
$search_value_bind_count++;
$search_value_bind_str = ':SEARCH_VALUE_' . $search_value_bind_count;
$rand_str1 = str_shuffle($str);
$rand_str2 = str_shuffle($str);
$sWhere .= " (select " . $rand_str1 . ".id FROM _dynamic_im_" . $builder_imf['im_id'] . " AS " . $rand_str1 . " LEFT OUTER JOIN index_master_field_extend AS " . $rand_str2 . " ON(cast(" . $rand_str2 . ".id as varchar(max))= cast(" . $rand_str1 . ".im_field_" . $builder_imf['imf_id'] . " as varchar(max))) WHERE " . $rand_str2 . ".field_value LIKE " . $search_value_bind_str . ") ";
if ($y + 1 != count($sSearch_arr)) {
$sWhere .= ', ';
} else {
$sWhere .= '';
}
$y++;
}
$sWhere .= ") ";
}
if ($z + 1 != count($imf_info)) {
$sWhere .= ') OR';
} else {
if (count($im_fields_arr) > 0) {
$sWhere .= '))';
} else {
$sWhere .= ')';
}
}
$z++;
}
}
if ($sel_workflow > 0) {
$sWhere .= ')';
}
}
//get the variables using request
$r_f_im_1_chzn = $r_f_im_1[0];
$r_f_ims_1 = $r_f_im_1[1];
$r_f_im_2_chzn = $r_f_im_2[0];
$r_f_ims_2= $r_f_im_2[1];
$r_f_im_3_chzn = $r_f_im_3[0];
$r_f_ims_3= $r_f_im_3[1];
$r_f_im_range_1= $r_f_im_1[2];
$r_f_im_range_2= $r_f_im_2[2];
$r_f_im_range_3= $r_f_im_3[2];
$operator_two = $_REQUEST['operator_two'];
$operator = $_REQUEST['operator'];
$operator_three = $_REQUEST['operator_three'];
$date_string_im1 = explode('-',$r_f_ims_1);
$date_string_im_chzn1 = explode('_',$r_f_im_1_chzn);
$is_im_search_one = 0;
$is_im_search_two = 0;
$is_im_search_three = 0;
if(strtotime($date_string_im1[0])){
$is_date1 = $IndexMaster->getIndexFieldName($pid,$date_string_im_chzn1[2]);
if($is_date1[0]['field_type'] == 'Date'){
$is_im_search_one = 1;
$start_date1 = date("d-m-Y", strtotime($date_string_im1[0]) );
$end_date1 = date("d-m-Y", strtotime($date_string_im1[1]) );
$r_f_im_1 = $start_date1;
}
// it's in date format
}
$date_string_im2 = explode('-',$r_f_ims_2);
$date_string_im_chzn2 = explode('-',$r_f_im_2_chzn);
if(strtotime($date_string_im2[0])){
$is_date2 = $IndexMaster->getIndexFieldName($pid,$date_string_im_chzn2[2]);
if($is_date2[0]['field_type'] == 'Date'){
$is_im_search_two = 1;
$start_date2 = date("d-m-Y", strtotime($date_string_im2[0]) );
$end_date2= date("d-m-Y", strtotime($date_string_im2[1]) );
}
// it's in date format
}
$date_string_im3 = explode('-',$r_f_ims_3);
$date_string_im_chzn3 = explode('-',$r_f_im_3_chzn);
if(strtotime($date_string_im3[0])){
$is_date3 = $IndexMaster->getIndexFieldName($pid,$date_string_im_chzn3[2]);
if($is_date3[0]['field_type'] == 'Date'){
$is_im_search_three = 1;
$start_date3 = date("d-m-Y", strtotime($date_string_im3[0]) );
$end_date3 = date("d-m-Y", strtotime($date_string_im3[1]) );
}
// it's in date format
}
if(!empty($r_f_im_range_1)){
$is_im_searchr_one = 1;
$start_range1 = $r_f_ims_1;
$end_range1= $r_f_im_range_1;
// it's in date format
}
if(!empty($r_f_im_range_2)){
$is_im_searchr_two = 1;
$start_range2 = $r_f_ims_2;
$end_range2 = $r_f_im_range_2;
// it's in date format
}
if(!empty($r_f_im_range_3)){
$is_im_searchr_three = 1;
$start_range3 = $r_f_ims_3;
$end_range3= $r_f_im_range_3;
// it's in date format
}
//check condition for all three
$str = generateRandomString();
$rand_str1 = str_shuffle($str);
$is_im_search = 0;
if(!empty($r_f_ims_1) || !empty($r_f_ims_2) || !empty($r_f_ims_3)){
$sWhere .= " And wd.record_set_id in (select " . $rand_str1 . ".id FROM _dynamic_im_" . $imf_info[0]['im_id'] . " AS " . $rand_str1 . " WHERE ";
$is_im_search = 1;
}
if(!empty($r_f_im_1_chzn) && !empty($r_f_im_1)){
//$sWhere .= " AND ";
if($is_im_search_one == 1){
$sWhere .= 'STR_TO_DATE('.$r_f_im_1_chzn .",'%d-%m-%Y') BETWEEN STR_TO_DATE('" . $start_date1 . "','%d-%m-%Y') AND STR_TO_DATE('" . $end_date1 . "','%d-%m-%Y')";
}elseif($is_im_searchr_one == 1){
$sWhere .= $r_f_im_1_chzn . ' BETWEEN '. $start_range1 . " AND " . $end_range1 ;
}else{
$sWhere .= $r_f_im_1_chzn ." LIKE '%" . $r_f_ims_1 . "%' ";
}
}
if(!empty($r_f_im_2_chzn) && !empty($r_f_im_2)){
$sWhere .= $operator_two.' ';
if($is_im_search_two == 1){
$sWhere .= 'STR_TO_DATE('.$r_f_im_2_chzn .",'%d-%m-%Y') BETWEEN STR_TO_DATE('" . $start_date2 . "','%d-%m-%Y') AND STR_TO_DATE('" . $end_date2 . "','%d-%m-%Y')";
}elseif($is_im_searchr_two == 1){
$sWhere .= $r_f_im_2_chzn . ' BETWEEN '. $start_range2 . " AND " . $end_range2 ;
}else{
$sWhere .= $r_f_im_2_chzn ." LIKE '%" . $r_f_ims_2 . "%' ";
}
}if(!empty($r_f_im_3) && !empty($r_f_im_3_chzn)){
$sWhere .= $operator_three.' ';
//$sWhere .= $r_f_im_3_chzn ." BETWEEN '" . $start_date . "' AND '" . $end_date . "'";
if($is_im_search_three == 1){
$sWhere .= 'STR_TO_DATE('.$r_f_im_3_chzn .",'%d-%m-%Y') BETWEEN STR_TO_DATE('" . $start_date3 . "','%d-%m-%Y') AND STR_TO_DATE('" . $end_date3 . "','%d-%m-%Y')";
}elseif($is_im_searchr_three == 1){
$sWhere .= $r_f_im_3_chzn . ' BETWEEN '. $start_range3 . " AND " . $end_range3 ;
}else{
$sWhere .= $r_f_im_3_chzn ." LIKE '%" . $r_f_ims_3 . "%' ";
}
// $sWhere .= " AND ";
}
if($is_im_search == 1){
$sWhere .= ") ";
}
#===============================================================>>
# DATATABLE - SEARCH
#===============================================================>>
for ($i = 0; $i < count($aColumnsx); $i++) {
if (isset($_GET['bSearchable_' . $i]) && $_GET['bSearchable_' . $i] == "true" && $_GET['sSearch_' . $i] != '') {
$sWhere .= " AND ";
if ($aColumnsx[$i] != 'wd.id') {
$sWhere .= $aColumnsx[$i] . " LIKE '%" . $_GET['sSearch_' . $i] . "%' ";
}
}
}
#===============================================================>>
# DEFINE ORDER BY & SEARCH QUERIES
#===============================================================>>
if (empty($sOrder) || trim($sOrder) == '') {
$sOrder = 'ORDER BY id DESC';
$Data_Table->set_sOrder($sOrder);
}
$Data_Table->set_sWhere($sWhere);
$Workflow->setSWhere($sWhere);
//echo $sWhere;
#===============================================================>>
# FILTER
#===============================================================>>
if (!empty($f_values)) {
$div_filter = explode(',', $f_values);
$no_filter_values = count($div_filter);
if ($no_filter_values > 0) {
$filter_query = '(';
for ($x = 0; $x < $no_filter_values; $x++) {
$filter_value = $div_filter[$x];
if ($x + 1 == $no_filter_values) {
$f_op = '';
} else {
$f_op = ' OR ';
}
//}
if ($filter_value == 'over_due') {
if (APP_DB == "MYSQL") {
$filter_query .= " FROM_UNIXTIME(DATE(DATE_ADD(wd.updated_at,INTERVAL bv.target_days DAY))) < FROM_UNIXTIME(DATE(curdate())) " . $f_op;
} else {
$filter_query .= " ( cast(dateadd(day,cast(bv.target_days as int),wd.updated_at) as date)) < cast(getdate() as date) " . $f_op;
}
}
if ($filter_value == 'due_today') {
if (APP_DB == "MYSQL") {
$filter_query .= " FROM_UNIXTIME(DATE(DATE_ADD(wd.updated_at, INTERVAL (bv.target_days) DAY))) = FROM_UNIXTIME(DATE(curdate())) " . $f_op;
} else {
$filter_query .= " ( cast(dateadd(day,cast(bv.target_days as int),wd.updated_at) as date)) = cast(getdate() as date) " . $f_op;
}
}
if ($filter_value == 'due_tomorrow') {
if (APP_DB == "MYSQL") {
$filter_query .= "' (FROM_UNIXTIME(DATE(wd.updated_at)) = FROM_UNIXTIME(CURDATE() + INTERVAL 1 DAY)) ' " . $f_op;
} else {
$filter_query .= "cast(wd.updated_at as date) = cast(dateadd(day,1,getdate()) as date) " . $f_op;
}
}
if ($filter_value == 'due_complete') {
$filter_query .= " (wd.a_status = 1 OR wd.a_status = 2) " . $f_op;
}
if ($filter_value == 'not_due') {
if (APP_DB == "MYSQL") {
$filter_query .= " FROM_UNIXTIME(DATE(DATE_ADD(wd.updated_at, INTERVAL bv.target_days DAY))) > FROM_UNIXTIME(DATE(curdate())) " . $f_op;
} else {
$filter_query .= " ( cast(dateadd(day,cast(bv.target_days as int),wd.updated_at) as date)) > cast(getdate() as date) " . $f_op;
}
}
if ($filter_value == 'completed') {
if (APP_DB == "MYSQL") {
$filter_query .= "completed";
} else {
$filter_query .= "completed";
}
}
if ($filter_value == 'inprocess') {
if (APP_DB == "MYSQL") {
$filter_query .= "inprocess";
} else {
$filter_query .= "inprocess";
}
}
if ($filter_value == 'interrupted') {
if (APP_DB == "MYSQL") {
$filter_query .= "interrupted";
} else {
$filter_query .= "interrupted";
}
}
}
$filter_query .= ')';
}
} else {
$filter_query = '';
}
#===============================================================>>
# QUERY FUNCTIONS
#===============================================================>>
if ($sel_workflow > 0) {
$WBuilder = new workflow_builder($db);
$last_step_info = $WBuilder->get_WBuilderValue_Last_BId($sel_workflow);
$last_step_id = $last_step_info[0]['id'];
$all_wim_details = $Workflow->getWorkFlow_IM_User($_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'], $_SESSION[SESSION_VAR_NAME]['role'], $_SESSION[SESSION_VAR_NAME]['user_id'], $pid, $sel_workflow, $filter_query, $last_step_id, $Data_Table->sLimit, $filter_wf_query, $_GET['sSearch'], $search_value_bind_count);
// if ($_SESSION[SESSION_VAR_NAME]['role'] == 1) {
// $all_wim_details = $Workflow->getWorkFlow_IM_User($_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'], $_SESSION[SESSION_VAR_NAME]['role'], $_SESSION[SESSION_VAR_NAME]['user_id'], $pid, $sel_workflow, $filter_query, $last_step_id, $Data_Table->sLimit, $filter_wf_query, $_GET['sSearch'], $search_value_bind_count);
// } else {
// $all_wim_details = $Workflow->getWorkFlow_IM_User($_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'], $_SESSION[SESSION_VAR_NAME]['role'], $_SESSION[SESSION_VAR_NAME]['user_id'], $pid, $sel_workflow, $filter_query, $last_step_id, $Data_Table->sLimit, $filter_wf_query, $_GET['sSearch'], $search_value_bind_count);
// }
if (APP_DB == "MSSQL") {
$all_wim_details_count = $Workflow->getWorkFlow_IM_User_all($_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'], $_SESSION[SESSION_VAR_NAME]['role'], $_SESSION[SESSION_VAR_NAME]['user_id'], $pid, $sel_workflow, $filter_query, $last_step_id, $Data_Table->sLimit, $filter_wf_query, $_GET['sSearch'], $search_value_bind_count);
}
} else {
$all_wim_details = $Workflow->getWorkFlow_IM_AllUser($_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'], $_SESSION[SESSION_VAR_NAME]['role'], $_SESSION[SESSION_VAR_NAME]['user_id'], $pid, $filter_query, $Data_Table->sLimit, $_GET['sSearch'], $search_value_bind_count);
// if ($_SESSION[SESSION_VAR_NAME]['role'] == 1) {
// $all_wim_details = $Workflow->getWorkFlow_IM_AllUser($_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'], $_SESSION[SESSION_VAR_NAME]['role'], $_SESSION[SESSION_VAR_NAME]['user_id'], $pid, $filter_query, $Data_Table->sLimit, $_GET['sSearch'], $search_value_bind_count);
// } else {
// $all_wim_details = $Workflow->getWorkFlow_IM_AllUser($_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'], $_SESSION[SESSION_VAR_NAME]['role'], $_SESSION[SESSION_VAR_NAME]['user_id'], $pid, $filter_query, $Data_Table->sLimit, $_GET['sSearch'], $search_value_bind_count);
// }
if (APP_DB == "MSSQL") {
$all_wim_details_count = $Workflow->getWorkFlow_IM_AllUser_all($_SESSION[SESSION_VAR_NAME]['empdash']['emp_role'], $_SESSION[SESSION_VAR_NAME]['role'], $_SESSION[SESSION_VAR_NAME]['user_id'], $pid, $filter_query, $Data_Table->sLimit, $_GET['sSearch'], $search_value_bind_count);
}
}
$no_wim_all_details = count($all_wim_details);
//echo $no_wim_all_details;
$rResult = $all_wim_details;
$rResult = array_map("unserialize", array_unique(array_map("serialize", $rResult)));
$Data_Table->rResult = array_values($rResult);
//$sQuery = "SELECT FOUND_ROWS() as FOUND_ROWS from workflow_im";
$sQuery = "SELECT FOUND_ROWS()";
if (APP_DB == "MYSQL") {
$rResultFilterTotal = $Data_Table->DataTable_Query($sQuery);
} else {
}
//print_r($Data_Table->rResult);
if (APP_DB == "MYSQL") {
if (!empty($rResultFilterTotal[0]['FOUND_ROWS()'])) {
$Data_Table->iFilteredTotal = $rResultFilterTotal[0]['FOUND_ROWS()'];
} else {
$Data_Table->iFilteredTotal = 0;
}
} else {
$Data_Table->iFilteredTotal = $all_wim_details_count[0]['count_1'];
}
$output = array(
"sEcho" => intval($Data_Table->sEcho),
"iTotalRecords" => $Data_Table->DataTable_iTotal(),
"iTotalDisplayRecords" => $Data_Table->iFilteredTotal,
"aaData" => array()
);
//print_r($output);
$Custom_Columns = array('"logid"', 'id', 'logid', 'user_name', 'main_module', 'sub_module', 'trigger_process', 'triggers', 'log_datetime', 'action');
#===============================================================>>
# TABLE - VALUES
#===============================================================>>
$user_dept_id = $_SESSION[SESSION_VAR_NAME]['dept_id'];
$workflow_amenment = new workflow_amenment($db);
for ($x = 0; $x < count($Data_Table->rResult); $x++) {
$builder_id = $Data_Table->rResult[$x]['builder_id'];
$is_workflow_type = $WBuilder->get_WBuilder_Id($builder_id);
// if($_SESSION[SESSION_VAR_NAME]['role'] != 1 && $is_workflow_type[0]['workflow_type'] == 2){
// $department_id = $Data_Table->rResult[$x]['department_id'];
// if($department_id != $user_dept_id){
// continue;
// }
// }
$row = array();
$wim_id = $Data_Table->rResult[$x]['wim_id'];
$bvid = $Data_Table->rResult[$x]['a_builder_value_id'];
$referred_user_id = $Data_Table->rResult[$x]['user_id'];
$pid = $Data_Table->rResult[$x]['project_id'];
$im_rid = $Data_Table->rResult[$x]['record_set_id'];
$builder_id = $Data_Table->rResult[$x]['builder_id'];
$WBuilder->setProjectId($pid);
$wf_im_settings = $WBuilder->getIMSetting_ByBuilderID($builder_id);
$builder_imf_info = $WBuilder->get_IMFields_ByBID($builder_id);
$builder_imf_info_arr = array_column($builder_imf_info, 'imf_id');
$im_id = $wf_im_settings[0]['im_id'];
$record_details = $Workflow->getWIM_ByID($wim_id);
$workflowstep_details = $WBuilder->get_WBuilderValue_Id($bvid);
$no_step_details = count($workflowstep_details);
$builder_details = $WBuilder->get_WBuilder_Id($builder_id);
$im_details = $IndexMaster->getIndexMaster_ById($im_id);
$IndexMaster->setRecordId($im_rid);
$index_value_details = $IndexMaster->getIndexValue_ByRecordSetId($im_id);
$user_info = $User->getUserName_ById($index_value_details[0]['added_by']);
if (in_array('id', $aColumns)) {
$row[] = '<input type="checkbox" name="id[]" class="case" value="' . $wim_id . '">';
}
$amenment_details = $workflow_amenment->getworkflow_amenment($builder_id, $im_id, $im_rid);
if (!empty($amenment_details)) {
$amenment = "<span data-m_builder_id=" . $builder_id . " data-m_im_id=" . $im_id . " data-m_im_rid=" . $im_rid . " data-toggle='modal' class='amenment_details' data-target='#myModal' style='cursor: pointer;'><i class='icon-info-sign'></i></span>";
} else {
$amenment = "";
}
if (in_array('id', $aColumns)) {
$row[] = $builder_id . '.' . $im_rid;
}
if (in_array('workflow_prefix', $aColumns)) {
$row[] = $Data_Table->rResult[$x]['prefix'];
//$prefix_data = $WBuilder->get_workflow_prefix($builder_id,$im_id,$im_rid);
//$row[] = $prefix_data[0]['prefix'];
}
if ($sel_workflow < 0) {
if (in_array('project_id', $aColumns)) {
$row[] = $builder_details[0]['workflow_title'];
}
if (in_array('im_id', $aColumns)) {
$row[] = $im_details[0]['index_master'];
}
$builder_imf_info = $WBuilder->get_PIMField_ByBID($builder_id);
if (count($builder_imf_info) > 0) {
foreach ($builder_imf_info as $builder_imf) {
$im_field_info = $IndexMaster->getIndexField_ById($builder_imf["imf_id"]);
$row[] = $im_field_info[0]['field_name'];
$d_field_name_table = $im_field_info[0]['field_name_table'];
if ($im_field_info[0]['field_type'] == 'Select Menu') {
$imaster_form = new imaster_form($db);
$formBuilder_id = $imaster_form->getFormByImasterId($im_field_info[0]['index_master_id']);
if(!empty($formBuilder_id)){
$json = json_decode(stripslashes(html_entity_decode($formBuilder_id[0]['form_json'])), true );
foreach($json['fields'] as $k => $v){
if($json['fields'][$k]['attrs']['name'] == $im_field_info[0]['field_name_table']){
$select_im_fid_arr = explode(">", $json['fields'][$k]['attrs']['form_builder_selection_value']);
}
}
if(!empty($select_im_fid_arr[0])){
$IndexMaster->setProjectId($im_field_info[0]['project_id']);
$IndexMaster->setIndexMaster($select_im_fid_arr[0]);
$MasterAvilability = $IndexMaster->CheckIndexMaster_availability();
if (!empty($MasterAvilability)) {
$imasterid = $MasterAvilability[0]['id'];
}
$select_imf_data = $IndexMaster->getFieldByName($imasterid, trim($select_im_fid_arr[1]));
if($select_imf_data[0]['field_type'] == 'Select Menu'){
$fieldid = $select_imf_data[0]['id'];
$selectmenu_extend_info = $IndexMaster->getFieldExtend_ById($fieldid);
}
else{
$imf_value = $index_value_details[0][$d_field_name_table];
}
}
else{
$selectmenu_extend_info = $IndexMaster->getFieldExtend_ById($index_value_details[0][$d_field_name_table]);
}
}
else{
$selectmenu_extend_info = $IndexMaster->getFieldExtend_ById($index_value_details[0][$d_field_name_table]);
}
if(!empty($selectmenu_extend_info)){
$field_value = $selectmenu_extend_info[0]['field_value'];
if (empty($field_value) && $field_value == '') {
$imf_value = 'Unavailable!';
} else {
$imf_value = $field_value;
}
}
else{
$imf_value = $index_value_details[0][$d_field_name_table];
}
} else if ($im_field_info[0]['field_type'] == 'Checkbox' || $im_field_info[0]['field_type'] == 'Radio') {
$imfield_checkradio_ids = explode(",", $index_value_details[0][$d_field_name_table]);
$field_value_arr = array();
for ($chrd = 0; $chrd < count($imfield_checkradio_ids); $chrd++) {
$selectmenu_extend_info = $IndexMaster->getFieldExtend_ById($imfield_checkradio_ids[$chrd]);
array_push($field_value_arr, $selectmenu_extend_info[0]['field_value']);
}
$field_value = implode(",", $field_value_arr);
if (empty($field_value) && $field_value == '') {
$imf_value = 'Unavailable!';
} else {
$imf_value = $field_value;
}
} else {
$imf_value = $index_value_details[0][$d_field_name_table];
}
$row[] = $imf_value;
}
} else {
$row[] = ' ';
$row[] = ' ';
}
} else if ($sel_workflow > 0) {
if (in_array('im_id', $aColumns)) {
$builder_imf_info = $WBuilder->get_IMFields_ByBID($builder_id);
$builder_imf_info_arr = array_column($builder_imf_info, 'imf_id');
//print_r($builder_imf_info_arr);
foreach ($builder_imf_info as $builder_imf) {
$selectmenu_extend_info = "";
$im_field_info = $IndexMaster->getIndexField_ById($builder_imf["imf_id"]);
$d_field_name_table = $im_field_info[0]['field_name_table'];
//$IndexMaster->setRecordId($im_rid);
//$index_value_details = $IndexMaster->getIndexValue_ByRecordSetId($im_id);
if ($im_field_info[0]['field_type'] == 'Select Menu') {
$imaster_form = new imaster_form($db);
$formBuilder_id = $imaster_form->getFormByImasterId($im_field_info[0]['index_master_id']);
if(!empty($formBuilder_id)){
$json = json_decode(stripslashes(html_entity_decode($formBuilder_id[0]['form_json'])), true );
foreach($json['fields'] as $k => $v){
if($json['fields'][$k]['attrs']['name'] == $im_field_info[0]['field_name_table']){
$select_im_fid_arr = explode(">", $json['fields'][$k]['attrs']['form_builder_selection_value']);
}
}
if(!empty($select_im_fid_arr[0])){
$IndexMaster->setProjectId($im_field_info[0]['project_id']);
$IndexMaster->setIndexMaster($select_im_fid_arr[0]);
$MasterAvilability = $IndexMaster->CheckIndexMaster_availability();
if (!empty($MasterAvilability)) {
$imasterid = $MasterAvilability[0]['id'];
}
$select_imf_data = $IndexMaster->getFieldByName($imasterid, trim($select_im_fid_arr[1]));
if($select_imf_data[0]['field_type'] == "Select Menu"){
$fieldid = $select_imf_data[0]['id'];
$selectmenu_extend_info = $IndexMaster->getFieldExtend_ById($fieldid);
}
}
else{
$selectmenu_extend_info = $IndexMaster->getFieldExtend_ById($index_value_details[0][$d_field_name_table]);
}
}
else{
$selectmenu_extend_info = $IndexMaster->getFieldExtend_ById($index_value_details[0][$d_field_name_table]);
}
$field_value = $selectmenu_extend_info[0]['field_value'];
if (empty($field_value) && $field_value == '') {
$imf_value = 'Unavailable!';
$imf_value = $index_value_details[0][$d_field_name_table];
} else {
$imf_value = $field_value;
}
} else if ($im_field_info[0]['field_type'] == 'Checkbox' || $im_field_info[0]['field_type'] == 'Radio') {
$imfield_checkradio_ids = explode(",", $index_value_details[0][$d_field_name_table]);
$field_value_arr = array();
for ($chrd = 0; $chrd < count($imfield_checkradio_ids); $chrd++) {
$selectmenu_extend_info = $IndexMaster->getFieldExtend_ById($imfield_checkradio_ids[$chrd]);
array_push($field_value_arr, $selectmenu_extend_info[0]['field_value']);
}
$field_value = implode(",", $field_value_arr);
if (empty($field_value) && $field_value == '') {
$imf_value = 'Unavailable!';
} else {
$imf_value = $field_value;
}
} else {
$imf_value = $index_value_details[0][$d_field_name_table];
}
$row[] = $imf_value;
}
}
}
#=============================================================>>
# DOC-SET
#=============================================================>>
$total_docset_files_count = 0;
$doc_set_values = $WBuilder->getBuilderDocSet_ByBTId($bvid);
$no_doc_set_values = count($doc_set_values);
$doc_set = new doc_set($db);
$docset = '';
for ($ik = 0; $ik < $no_doc_set_values; $ik++) {
$docset .= $doc_set_values[$ik]['doc_set_value_id'] . ",";
}
$docset = substr($docset, 0, -1);
$Category = new category($db);
$category_detail = $Category->getUser_AccessCategoriesByUserId($_SESSION[SESSION_VAR_NAME]['user_id']);
$IndexMaster->setIndexMasterId($im_id);
$pdobind_array = array();
//print_r($docset);
$join_per = '';
if (!($_SESSION[SESSION_VAR_NAME]['role'] == 1 || $_SESSION[SESSION_VAR_NAME]['role'] == 2)) {
if (APP_DB == "MYSQL") {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id
JOIN doc_set_permissions as ds ON ds.user_group = '" . $_SESSION[SESSION_VAR_NAME]['role'] . "' AND IF(p.doc_type = 0, ds.doc_set_dropdown_value_id = dpt.index_field_value,ds.doc_set_dropdown_value_id = p.doc_type) AND IF(ds.view_r = 1, 1, IF(ds.privateview_r = 1, p.user_id = '" . $_SESSION[SESSION_VAR_NAME]['user_id'] . "', 0)) ";
} else {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id
JOIN doc_set_permissions as ds ON ds.user_group = '" . $_SESSION[SESSION_VAR_NAME]['role'] . "' AND (ds.doc_set_dropdown_value_id = dpt.index_field_value or ds.doc_set_dropdown_value_id = p.doc_type) AND iIF(ds.view_r = 1, 1, iIF(ds.privateview_r = 1,(select top 1 [user].id from [user] where [user].id= '" . $_SESSION[SESSION_VAR_NAME]['user_id'] . "'), 0))<>'' ";
}
} else {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id";
}
if ($category_detail[0]['cate'] == '') {
$category_detail[0]['cate'] = ':CAT_ID';
$pdobind_array[":CAT_ID"] = array(0 => '0', 1 => PDO::PARAM_STR);
}
if ($category_detail[0]['cate'] == '') {
$category_detail[0]['cate'] = '0';
}
$DocCountResult = $IndexMaster->getDocDetailsByIndexMasterRecord($im_rid, $im_id, '', '', $category_detail, $join_per, $pdobind_array);
if (APP_DB == "MSSQL") {
$DocCountResult = $IndexMaster->getDocDetailsByIndexMasterRecord_all($im_rid, $im_id, '', '', $category_detail, $join_per, $pdobind_array);
}
$Docset_DataTable = new data_table($db);
if (APP_DB == "MSSQL") {
$total_docset_files_count = $DocCountResult[0]['count_1'];
} else {
$docset_Query = "SELECT FOUND_ROWS() as FOUND_ROWS";
$docset_ResultFilterTotal = $Docset_DataTable->DataTable_Query($docset_Query);
$total_docset_files_count = $docset_ResultFilterTotal[0]['FOUND_ROWS'];
}
$row[] = '<a href="index.php?rq=' . encrypt_url("workflow/wim_editform2.php", APP_ENCRYPTION_SALT) . '&wim_id=' . $wim_id . '&pid=' . $pid . '&builder_id=' . $builder_id . '&im_id=' . $im_id . '&imf_id=' . $imf_id . '&im_rid=' . $im_rid . '&itag=' . encrypt_url('imodule', APP_ENCRYPTION_SALT) . '&a_tab_main=tab-files&a_tab_sub=tab-docset&a_tab_sub2=tab-filepreview" title="Update" class="table_tool_link" target="_blank" ><span class="badge badge-info">' . $total_docset_files_count . '</span></a>';
#=============================================================>>
# END - DOC-SET
#=============================================================>>
$row[] = $user_info[0]['fname'] . ' ' . $user_info[0]['mname'] . '' . $user_info[0]['lname'] . ' ' . $amenment;
$row[] = date('Y-m-d h:i a', strtotime($index_value_details[0]['log_datetime']));
$wim_last_status = $Workflow->get_WIMStatus_BId_RID($builder_id, $im_rid);
$last_updated_user_info = $User->getUserName_ById($wim_last_status[0]['created_by']);
$row[] = $last_updated_user_info[0]['fname'] . ' ' . $last_updated_user_info[0]['mname'] . '' . $last_updated_user_info[0]['lname'];
$row[] = !empty($wim_last_status[0]['created_at']) ? date('Y-m-d h:i a', strtotime($wim_last_status[0]['created_at'])) : '';
if (empty($no_step_details)) {
$row[] = '<span class="label label-important">Data Mismatch!</span>';
} else {
for ($i = 0; $i < $no_step_details; $i++) {
$step_str = '';
$builder_value_id = $workflowstep_details[$i]['id'];
$role_master_id = $workflowstep_details[$i]['role_master_id'];
if (empty($workflowstep_details[$i]['target_days'])) {
$target_days = 0;
} else {
$target_days = $workflowstep_details[$i]['target_days'];
}
$step_type = $workflowstep_details[$i]['step_type'];
$workflow_latest_status = $Workflow->get_WIMStatus_LatestRID($builder_value_id, $wim_id, $im_rid);
$wim_aroles = $WBuilder->get_workflow_im_Aroles_ByBvidRId($im_id, $im_rid, $builder_value_id);
$wim_lroles = $WBuilder->get_workflow_im_Lusers($pid, $workflowstep_details[$i]['builder_id'], $builder_value_id, $im_id, $im_rid);
$wim_lroles_ref_str = $pid . ',' . $workflowstep_details[$i]['builder_id'] . ',' . $builder_value_id . ',' . $im_id . ',' . $im_rid;
$workflow_latest_status_value = $workflow_latest_status[0]['status'];
$last_step_approved_updated_date = $workflow_latest_status[0]['created_at'];
$WBuilder->setProjectId($pid);
$WBuilder->setBuilderId($sel_workflow);
$WBuilder->setBuilderValueId($builder_value_id);
if ($workflowstep_details[$i]['role_master_id'] < 0 && $workflowstep_details[$i]['rule_id'] > 0) {
$rule_id = $workflowstep_details[$i]['rule_id'];
$rule_info = $WRule->get_Rule_ID($rule_id);
$formula_details = $WRule->get_formula_byRule($rule_id);
$no_formulas = count($formula_details);
if (!empty($rule_info[0]['doc_set'])) {
$docset_id = $rule_info[0]['doc_set'];
$docset_info = $DocSet->get_dropdown_field_value_by_id($docset_id);
$rule_docset_value = $docset_info[0]['dropdown_name'];
//==============================================================
// INDEX MASTER - DOCSET FILES
//==============================================================
$Category = new category($db);
$category_detail = $Category->getUser_AccessCategoriesByUserId($_SESSION[SESSION_VAR_NAME]['user_id']);
$IndexMaster->setIndexMasterId($index_master_id);
$join_per = '';
if (!($_SESSION[SESSION_VAR_NAME]['role'] == 1 || $_SESSION[SESSION_VAR_NAME]['role'] == 2)) {
if (APP_DB == "MYSQL") {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id
JOIN doc_set_permissions as ds ON ds.user_group = '" . $_SESSION[SESSION_VAR_NAME]['role'] . "' AND IF(p.doc_type = 0, ds.doc_set_dropdown_value_id = dpt.index_field_value,ds.doc_set_dropdown_value_id = p.doc_type) AND IF(ds.view_r = 1, 1, IF(ds.privateview_r = 1, p.user_id = '" . $_SESSION[SESSION_VAR_NAME]['user_id'] . "', 0)) ";
} else {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id
JOIN doc_set_permissions as ds ON ds.user_group = '" . $_SESSION[SESSION_VAR_NAME]['role'] . "' AND (ds.doc_set_dropdown_value_id = dpt.index_field_value or ds.doc_set_dropdown_value_id = p.doc_type) AND iIF(ds.view_r = 1, 1, iIF(ds.privateview_r = 1,(select top 1 [user].id from [user] where [user].id= '" . $_SESSION[SESSION_VAR_NAME]['user_id'] . "'), 0))<>'' ";
}
} else {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id";
}
if ($category_detail[0]['cate'] == '') {
$category_detail[0]['cate'] = '0';
}
$rResult = $IndexMaster->getDocDetailsByIndexMasterRecord($im_rid, $index_master_id, $sOrder, $sLimit, $category_detail, $join_per);
for ($y = 0; $y < count($rResult); $y++) {
$doc_id = $rResult[$y]['doc_id'];
$doc_details = $File->getDoc_ByID($doc_id);
$doc_set_value = $DocSet->get_dropdown_field_value_by_id($doc_details[0]['doc_type']);
$docset_value = $doc_set_value[0]['dropdown_name'];
if ($rule_docset_value == $docset_value) {
$exists_docset = 1;
break;
} else {
$exists_docset = 0;
}
}
//==============================================================
// END - INDEX MASTER - DOCSET FILES
//==============================================================
if (!empty($rule_docset_value) && !empty($exists_docset)) {
for ($y = 0; $y < $no_formulas; $y++) {
$varA1 = $rule_docset_value;
$varB1 = $formula_details[$y]['input_value'];
$op1 = $formula_details[$y]['logical_operator'];
$varA2 = $rule_docset_value;
$varB2 = $formula_details[$y]['input_value2'];
$op2 = $formula_details[$y]['logical_operator2'];
$cond1 = if_cond($varA1, $op1, $varB1);
$cond2 = if_cond($varA2, $op2, $varB2);
if ($cond1 == 'true' || $cond2 == 'true') {
$role_master_id = $formula_details[$y]['role_master_id'];
break;
}
}
}
} else if (!empty($rule_info[0]['index_group_id']) && !empty($rule_info[0]['index_field_id'])) {
$rule_ig_id = $rule_info[0]['index_group_id'];
$rule_igf_id = $rule_info[0]['index_field_id'];
$rule_ig_value = $formula_details[0]['input_value'];
//==============================================================
// INDEX GROUP - DOCSET FILES
//==============================================================
$Category = new category($db);
$category_detail = $Category->getUser_AccessCategoriesByUserId($_SESSION[SESSION_VAR_NAME]['user_id']);
$IndexMaster->setIndexMasterId($index_master_id);
$join_per = '';
if (!($_SESSION[SESSION_VAR_NAME]['role'] == 1 || $_SESSION[SESSION_VAR_NAME]['role'] == 2)) {
if (APP_DB == "MYSQL") {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id
JOIN doc_set_permissions as ds ON ds.user_group = '" . $_SESSION[SESSION_VAR_NAME]['role'] . "' AND IF(p.doc_type = 0, ds.doc_set_dropdown_value_id = dpt.index_field_value,ds.doc_set_dropdown_value_id = p.doc_type) AND IF(ds.view_r = 1, 1, IF(ds.privateview_r = 1, p.user_id = '" . $_SESSION[SESSION_VAR_NAME]['user_id'] . "', 0)) ";
} else {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id
JOIN doc_set_permissions as ds ON ds.user_group = '" . $_SESSION[SESSION_VAR_NAME]['role'] . "' AND (ds.doc_set_dropdown_value_id = dpt.index_field_value or ds.doc_set_dropdown_value_id = p.doc_type) AND iIF(ds.view_r = 1, 1, iIF(ds.privateview_r = 1,(select top 1 [user].id from [user] where [user].id= '" . $_SESSION[SESSION_VAR_NAME]['user_id'] . "'), 0))<>'' ";
}
} else {
$join_per .= " LEFT JOIN doc_set_dropdown_values dsv on dsv.id = p.doc_type LEFT JOIN doc_page_tag dpt on dpt.doc_id = p.id";
}
if ($category_detail[0]['cate'] == '') {
$category_detail[0]['cate'] = '0';
}
$rResult = $IndexMaster->getDocDetailsByIndexMasterRecord($im_rid, $index_master_id, $sOrder, $sLimit, $category_detail, $join_per);
for ($y = 0; $y < count($rResult); $y++) {
$doc_id = $rResult[$y]['doc_id'];
$doc_details = $File->getDoc_ByID($doc_id);
$indexGroup->setIndexGroupId($rule_ig_id);
$ig_info = $indexGroup->getField_name($doc_id, '*');
$ig_value = $ig_info[0]['ig_field_' . $rule_igf_id];
if ($rule_ig_value == $ig_value) {
$exists_ig = 1;
break;
} else {
$exists_ig = 0;
}
}
//==============================================================
// END - INDEX GROUP - DOCSET FILES
//==============================================================
if (!empty($rule_ig_value) && !empty($exists_ig)) {
for ($y = 0; $y < $no_formulas; $y++) {
$varA1 = $rule_ig_value;
$varB1 = $formula_details[$y]['input_value'];
$op1 = $formula_details[$y]['logical_operator'];
$varA2 = $rule_ig_value;
$varB2 = $formula_details[$y]['input_value2'];
$op2 = $formula_details[$y]['logical_operator2'];
$cond1 = if_cond($varA1, $op1, $varB1);
$cond2 = if_cond($varA2, $op2, $varB2);
if ($cond1 == 'true' || $cond2 == 'true') {
$role_master_id = $formula_details[$y]['role_master_id'];
break;
}
}
}
} else if (!empty($rule_info[0]['index_master']) && !empty($rule_info[0]['index_master_field'])) {
$role_master_id = $record_details[0]['a_role_master_id'];
}
} else {
$role_master_id = $record_details[0]['a_role_master_id'];
}
if (count($record_details) > 0) {
$WRole->setRoleMasterId($role_master_id);
$role_usergroups = $WRole->get_Assigned_Usergroup();
foreach ($role_usergroups as $role_usergroup) {
if ($role_usergroup['role_type'] == 1) {
$primary_usergroup_info = $User->getUserGroup_byId($role_usergroup['user_group_id']);
$primary_usergroup = $primary_usergroup_info[0]['name'];
$primary_usergroup_id = $primary_usergroup_info[0]['id'];
}
if ($role_usergroup['role_type'] == 0) {
$secondary_usergroup_info = $User->getUserGroup_byId($role_usergroup['user_group_id']);
$secondary_usergroup = $secondary_usergroup_info[0]['name'];
$secondary_usergroup_id = $secondary_usergroup_info[0]['id'];
}
}
// echo $primary_usergroup;
if (!empty($primary_usergroup_id)) {
$user_info_usergroup = $Workflow->getUsers_UserGroup($pid, $primary_usergroup_id);
$tot_users_usergroup = count($user_info_usergroup);
$off_user_info_usergroup = $Workflow->getOFFUsers_UserGroup($pid, $primary_usergroup_id);
$tot_off_users_usergroup = count($off_user_info_usergroup);
//echo $tot_off_users_usergroup . '/' . $tot_users_usergroup . '<br>';
if ($tot_users_usergroup > 0) {
$usergroup_details = $User->getUserGroup_byId($primary_usergroup_id);
$a_user_group = $primary_usergroup_id;
$a_user_group_name = $usergroup_details[0]['name'];
} else {
$user_info_usergroup = $Workflow->getUsers_UserGroup($pid, $secondary_usergroup_id);
$tot_users_usergroup = count($user_info_usergroup);
//$off_user_info_usergroup = $Workflow->getOFFUsers_UserGroup($pid, $secondary_usergroup_id);
//$tot_off_users_usergroup = count($off_user_info_usergroup);
//echo $tot_users_usergroup.'/'.$tot_off_users_usergroup.'<br>||';
if ($tot_users_usergroup > 0) {
$usergroup_details = $User->getUserGroup_byId($primary_usergroup_id);
$a_user_group = $secondary_usergroup_id;
$a_user_group_name = $usergroup_details[0]['name'];
} else {
$a_user_group = 0;
$a_user_group_name = 'Work-flow Manager';
}
}
}
if ($i == 0) {
if ($workflow_latest_status[0]['status'] == '7' || $workflow_latest_status[0]['status'] == '8') {
$workflow_start_status = $Workflow->get_WIMStatus_StartRID($builder_value_id, $wim_id, $im_rid);
$date1 = date_create(DATE);
$date2 = date_create($workflow_start_status[0]['created_at']);
date_add($date2, date_interval_create_from_date_string($target_days . ' days'));
$diff = date_diff($date1, $date2);
$outstanding_days = $diff->format("%r%a days");
//$outstanding_days = '';
$due_date = $diff->format("%r%a");
if ($due_date <= 0) {
$days_class = 'label-important';
} else {
$days_class = 'label-success';
}
} else if ($workflow_latest_status[0]['status'] == '1' || $workflow_latest_status[0]['status'] == '2') {
$date1 = date_create(DATE);
$date2 = date_create($last_step_approved_updated_date);
date_add($date2, date_interval_create_from_date_string($target_days . ' days'));
$diff = date_diff($date1, $date2);
//$outstanding_days = $diff->format("%r%a days");
$outstanding_days = '';
$due_date = $diff->format("%r%a");
if ($due_date <= 0) {
$days_class = 'label-important';
} else {
$days_class = 'label-success';
}
} else {
$date1 = date_create(DATE);
$date2 = date_create($record_details[0]['updated_at']);
date_add($date2, date_interval_create_from_date_string($target_days . ' days'));
$diff = date_diff($date1, $date2);
//$diff = $date1->diff($date2);
$outstanding_days = $diff->format("%r%a days");
$due_date = $diff->format("%r%a");
if ($due_date <= 0) {
$days_class = 'label-important';
} else {
$days_class = 'label-success';
}
}
} else {
if ($workflow_latest_status[0]['status'] == '7' || $workflow_latest_status[0]['status'] == '8') {
$workflow_start_status = $Workflow->get_WIMStatus_StartRID($builder_value_id, $wim_id, $im_rid);
$date1 = date_create(DATE);
$date2 = date_create($workflow_start_status[0]['created_at']);
date_add($date2, date_interval_create_from_date_string($target_days . ' days'));
$diff = date_diff($date1, $date2);
$outstanding_days = $diff->format("%r%a days");
//$outstanding_days = '';
$due_date = $diff->format("%r%a");
if ($due_date <= 0) {
$days_class = 'label-important';
} else {
$days_class = 'label-success';
}
} elseif ($workflow_latest_status[0]['status'] == '1' || $workflow_latest_status[0]['status'] == '2' || $workflow_latest_status[0]['status'] == '10') {
$date1 = date_create(DATE_TIME);
$date2 = date_create($last_step_approved_updated_date);
date_add($date2, date_interval_create_from_date_string($target_days . ' days'));
$diff = date_diff($date2, $date1);
$outstanding_days = $diff->format("%R%a days");
$outstanding_days = '';
//echo '['.DATE_TIME.']'.$last_step_approved_updated_date;
$due_date = $diff->format("%r%a");
if ($due_date <= 0) {
$days_class = 'label-important';
} else {
$days_class = 'label-success';
}
} else {
$date1 = date_create(DATE);
$date2 = date_create($record_details[0]['updated_at']);
date_add($date2, date_interval_create_from_date_string($target_days . ' days'));
$diff = date_diff($date1, $date2);
//$diff = $date1->diff($date2);
$outstanding_days = $diff->format("%r%a days");
$due_date = $diff->format("%r%a");
if ($due_date <= 0) {
$days_class = 'label-important';
} else {
$days_class = 'label-success';
}
}
}
if ($step_type == '2') {
$step_type_icon = '<i class="fa fa-random"></i> ';
} else {
$step_type_icon = '<i class="fa fa-long-arrow-right"></i> ';
}
$step_str .= $step_type_icon;
if (count($workflow_latest_status) > 0) {
if ($workflow_latest_status[0]['status'] == '15') {
$last_approved = $Workflow->get_LastApproved_ByRID($builder_id, $im_rid);
$step_str .= ' <span class="label label-success">' . $workflowstep_details[$i]['step_name'] . '</span>';
} else {
$step_str .= ' <span class="label label-success">' . $workflowstep_details[$i]['step_name'] . '</span>';
}
if (($workflow_latest_status[0]['status'] == '' || $workflow_latest_status[0]['status'] == '0')) {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-warning" itemref="Pending">P</span> ';
} else if ($workflow_latest_status[0]['status'] == '1') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-success" itemref="Approved">A</span> ';
} else if ($workflow_latest_status[0]['status'] == '2') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label " itemref="Escalated">E</span> ';
} else if ($workflow_latest_status[0]['status'] == '3') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-important" itemref="Rejected">R</span> ';
} else if ($workflow_latest_status[0]['status'] == '4') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-success" itemref="End as Approval">EA</span> ';
} else if ($workflow_latest_status[0]['status'] == '5') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-important" itemref="End as Rejected">ER</span> ';
} else if ($workflow_latest_status[0]['status'] == '6') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-inverse" itemref="Hold">H</span> ';
} else if ($workflow_latest_status[0]['status'] == '7') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-info" itemref="Referred Inprocess">RI</span> ';
} else if ($workflow_latest_status[0]['status'] == '8') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-info" itemref="Referred Closed">RC</span> ';
} else if ($workflow_latest_status[0]['status'] == '9') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-important" itemref="Force Closed">FC</span> ';
} else if ($workflow_latest_status[0]['status'] == '10' && !empty(count($wim_aroles))) {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-warning" itemref="Approve(User)">AU</span> ';
} else if ($workflow_latest_status[0]['status'] == '15') {
//$last_status_without_na = $Workflow->get_Workflow_im_last_approved_NA($builder_id, $bvid, $im_rid);
//if ($last_status_without_na[0]["status"] == '1') {
//$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-success" itemref="Approved">A</span> ';
//} else {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label " itemref="Closed">Closed</span> ';
//}
} else if ($workflow_latest_status[0]['status'] == '16') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-warning" itemref="Delegated">D</span> ';
} else if ($workflow_latest_status[0]['status'] == '17') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-warning" itemref="Flexi-flow">F</span> ';
} else if ($workflow_latest_status[0]['status'] == '18') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-info" itemref="Assigned to user">AU</span> ';
} else if ($workflow_latest_status[0]['status'] == '19') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-warning" itemref="Round Robin">RR</span> ';
} else if ($workflow_latest_status[0]['status'] == '20') {
$step_str .= ' <span name="chkbox_workflow_status" itemref="' . $wim_lroles_ref_str . '" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_LUsers label label-info" itemref="Lateral flow - Inprocess">LI</span> ';
} else if ($workflow_latest_status[0]['status'] == '21') {
$step_str .= ' <span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-warning" itemref="Lateral flow - Closed">LC</span> ';
}
if (count($wim_aroles) > 0) {
foreach ($wim_aroles as $wim_arole) {
$user_info = $User->getUsers_ById($wim_arole['user_id']);
$user_group_info = $User->getUserGroup_byId($user_info[0]['role']);
if ($record_details[0]['a_status'] == 10) {
$c_r_status = 'Approved to user';
} else if ($record_details[0]['a_status'] == 7) {
$c_r_status = 'Referred';
} else if ($record_details[0]['a_status'] == 16) {
$c_r_status = 'Delegate';
}
$step_str .= ' <span class="label_usergroup label label-info " itemref="' . $role_master_id . "_" . $wim_arole['user_id']. '"><i class="icon-user"></i> ' . $user_info[0]['fname'] . ' ' . $user_info[0]['mname'] . ' ' . $user_info[0]['lname'] . '</span> ';
}
} else {
$step_str .= ' <span class="label_usergroup label label-info " itemref="' . $role_master_id . "_" . $wim_arole['user_id'] . '"><i class="icon-group"></i> ' . $a_user_group_name . '</span> ';
}
if (!empty($outstanding_days)) {
if ($record_details[0]['a_status'] != 1 && $record_details[0]['a_status'] != 4 && $record_details[0]['a_status'] != 5 && $record_details[0]['a_status'] != 15) {
$step_str .= '<span class="label ' . $days_class . '"><i class="icon-time"></i> ' . $outstanding_days . ' </span> ';
}
}
if ($accessing_user_id == $_SESSION[SESSION_VAR_NAME]['user_id'] && ($workflow_latest_status[0]['status'] != '1' && $workflow_latest_status[0]['status'] != '2')) {
//$step_str .= '<span title="' . $workflowstep_details[$i]['id'] . '" id="' . $sel_workflow . '|' . $builder_value_id . '|' . $doc_id . '|' . $pid . '" class="label label-important label_assign_user" style="cursor: pointer;"><i class="icon-"></i>Assign</span> ';
}
} else {
$step_str .= '<span class="label label-success">' . $workflowstep_details[$i]['step_name'] . '</span>';
$step_str .= '<span name="chkbox_workflow_status" title="' . $doc_details_re[$i]['id'] . '.' . $workflowstep_details[$i]['id'] . '" style="cursor:pointer;" class="label_status label label-warning" itemref="Pending">P</span> ';
if (count($wim_aroles) > 0) {
foreach ($wim_aroles as $wim_arole) {
$user_info = $User->getUsers_ById($wim_arole['user_id']);
$user_group_info = $User->getUserGroup_byId($user_info[0]['role']);
if ($record_details[0]['a_status'] == 10) {
$c_r_status = 'Approved to user';
} else if ($record_details[0]['a_status'] == 7) {
$c_r_status = 'Referred';
} else if ($record_details[0]['a_status'] == 16) {
$c_r_status = 'Delegate';
}
$step_str .= ' <span class="label_usergroup label label-info " itemref="' . $role_master_id . "_" . $wim_arole['user_id']. '"><i class="icon-user"></i> ' . $user_info[0]['fname'] . ' ' . $user_info[0]['mname'] . ' ' . $user_info[0]['lname'] . '</span> ';
}
} else {
$step_str .= ' <span class="label_usergroup label label-info " itemref="' . "_" . $wim_arole['user_id']. $role_master_id . '"><i class="icon-group"></i> ' . $a_user_group_name . '</span> ';
}
if ($accessing_user_id == $_SESSION[SESSION_VAR_NAME]['user_id'] && ($workflow_latest_status[0]['status'] != '1' && $workflow_latest_status[0]['status'] != '2')) {
//$step_str .= '<span title="' . $workflowstep_details[$i]['id'] . '" id="' . $sel_workflow . '|' . $builder_value_id . '|' . $doc_id . '|' . $pid . '" class="label label-important label_assign_user" style="cursor: pointer;"><i class="icon-"></i>Assign</span> ';
}
if (!empty($outstanding_days)) {
if ($record_details[0]['a_status'] != 1 && $record_details[0]['a_status'] != 4 && $record_details[0]['a_status'] != 5 && $record_details[0]['a_status'] != 15) {
$step_str .= '<span class="label ' . $days_class . '"><i class="icon-time"></i> ' . $outstanding_days . ' </span> ';
}
}
}
if ($i + 1 == $no_step_details && ($workflow_latest_status[0]['status'] == '1' || $workflow_latest_status[0]['status'] == '2')) {
$step_str .= '<span class="label label-i "><i class="icon-calendar"></i> ' . date("d-m-Y", strtotime($record_details[0]["updated_at"])) . ' </span> ';
}
if ($workflow_latest_status[0]['status'] == '1') {
$last_workflow_step_status = $workflow_latest_status[0]['status'];
$last_step_approved_updated_date = $workflow_latest_status[0]['log_datetime'];
} else {
$last_workflow_step_status = '';
$last_step_approved_updated_date = $current_step_target_date;
}
//echo $last_step_approved_updated_date.'/'.$current_step_target_date;
$workflow_latest_status = '';
$primary_usergroup = '';
$secondary_usergroup = '';
if ($record_details[0]['a_builder_value_id'] == $builder_value_id) {
if ($record_details[0]['a_status'] != '1' && $record_details[0]['a_status'] != 2) {
//$step_str .= '<span class="blink_button badge badge-important" title="Unassigned" style="padding: 0px 3px 0px 3px;font-size: 10px;"> <i class="fa fa-dot-circle-o" aria-hidden="true"></i></span>';
}
}
if (!empty($record_details[0]['a_builder_value_id'])) {
if ($record_details[0]['a_builder_value_id'] == $workflowstep_details[$i]['id']) {
if ($_SESSION[SESSION_VAR_NAME]['role'] == $record_details[0]['a_user_group']) {
$row[] = $step_str;
break;
} elseif (($_SESSION[SESSION_VAR_NAME]['role'] == '1' || $_SESSION[SESSION_VAR_NAME]['role'] == '2') && $record_details[0]['a_status'] != 1) {
$row[] = $step_str;
break;
} else {
$row[] = $step_str;
}
} else {
if ($i + 1 == $no_step_details) {
if (empty($referred_user_id)) {
$row[] = '<span class="label label-important">Record Mismatch!</span>';
} else {
$row[] = $step_str;
}
break;
}
}
} else {
$row[] = '<span class="label label-important">Unable to start!</span>';
$hide_action = 1;
break;
}
} else {
$row[] = ' ';
}
$step_str = '';
$outstanding_days = '';
$step_str = '';
}
}
if ($hide_action != 1) {
ob_start();
include '../workflow/wim_data_actions.php';
$action_data = ob_get_contents();
ob_end_clean();
$row[] = $action_data;
} else {
$row[] = '';
}
$hide_action = 0;
$output['aaData'][] = $row;
}
echo json_encode($output);
} else {
echo "You are not authorised to view";
}
} else {
$page_ctl->log_indirect_access();
include("../error_403.php");
}
}
?>
Did this file decode correctly?
Original Code
<?php $_F=__FILE__;$_C1353562110='Pz48PzcyNwoKSEMgKCFDWWdvSkg4Z19tUkhiSmIoIkk3N19vWEliYl9JWUo4WDhJRW05IikpIHsKICAgIEhnb1hZRW0oIi4uL1hIay9JNzdfSjg3LjcyNyIpOwp9CkhDICghSGJibUooJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydZYm05X0hFJ10pKSB7CiAgICAybUlFbTkoIlg4b0lKSDhnOiAuLi9tOTk4OV93eEcuNzI3Iik7CiAgICBtUkhKKCk7Cn0gbVhibSB7CiAgICAkN0lGbV9vSlggPSBnbXUgN0lGbV9Jb29tYmJfb0pYKCRFayk7CiAgICBIQyAoJDdJRm1fb0pYLT4ySWJObTljSGJiSDhnKCdkR0wnLCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSkpIHsKCiAgICAgICAgSEMgKEhiYm1KKCRfeW5WNW5WWydwWlpOX0tfVm5RZW55Wm5CX08xWnAnXSkgJiYgIW1jN0psKCRfeW5WNW5WWydwWlpOX0tfVm5RZW55Wm5CX08xWnAnXSkgJiYgYko5SjhYOHVtOSgkX3luVjVuVlsncFpaTl9LX1ZuUWVueVpuQl9PMVpwJ10pID09ICdSY1gySko3OW0zWW1iSicpIHsKCiAgICAgICAgICAgICRibVhfdTg5ckNYOHUgPSAkX1ZuUWVueVpbJ2JtWF91ODlyQ1g4dSddOwoKICAgICAgICAgICAgLy83OUhnSl85KCRfVm5RZW55Wik7CgogICAgICAgICAgICAKICAgICAgICAgICAgJDlfQ19IY19HID0gbVI3WDhFbSgnLCcsJF9WblFlbnlaWyc5X0NfSGNfRyddKTsKICAgICAgICAgICAgJDlfQ19IY190ID0gbVI3WDhFbSgnLCcsJF9WblFlbnlaWyc5X0NfSGNfdCddKTsKICAgICAgICAgICAgJDlfQ19IY19MID0gbVI3WDhFbSgnLCcsJF9WblFlbnlaWyc5X0NfSGNfTCddKTsKICAgICAgICAgICAgLy8gIDc5SGdKXzkoJDlfQ19IY19HKTsKICAgICAgICAgICAgLy8gIDc5SGdKXzkoJDlfQ19IY190KTsKICAgICAgICAgICAgLy8gIDc5SGdKXzkoJDlfQ19IY19MKTsKICAgICAgICAgICAgLy8gbVJISigpOwogICAgICAgICAgICAvL0hnSF9ibUooJ0VIYjdYSWxfbTk5ODliJywgJ0cnKTsKCiAgICAgICAgICAgICQ3SEUgPSAkX1ZuUWVueVpbJzdIRSddOwogICAgICAgICAgICAkQ180SVhZbWIgPSAkX1ZuUWVueVpbJ0NfNElYWW1iJ107CiAgICAgICAgICAgICRDSFhKbTlfdUMgPSAkX1ZuUWVueVpbJ0NIWEptOV91QyddOwogICAgICAgICAgICAkTzg5ckNYOHUgPSBnbXUgdTg5ckNYOHUoJEVrKTsKICAgICAgICAgICAgJE9qWUhYRW05ID0gZ211IHU4OXJDWDh1X2tZSFhFbTkoJEVrKTsKICAgICAgICAgICAgJE9WOFhtID0gZ211IHU4OXJDWDh1Xzk4WG0oJEVrKTsKICAgICAgICAgICAgJE9WWVhtID0gZ211IHU4OXJDWDh1XzlZWG0oJEVrKTsKICAgICAgICAgICAgJEI4b3ltSiA9IGdtdSBFOG9fYm1KKCRFayk7CiAgICAgICAgICAgICRlYm05ID0gZ211IFlibTkoJEVrKTsKCiAgICAgICAgICAgICRTbUk0bSA9IGdtdSBYbUk0bSgkRWspOwogICAgICAgICAgICAkREhYbSA9IGdtdSBDSFhtX2NJZ0lGbTkoJEVrKTsKICAgICAgICAgICAgJE45OFRtb0ogPSBnbXUgNzk4VG1vSigkRWspOwoKICAgICAgICAgICAgJDFnRW1SaEliSm05ID0gZ211IEhnRW1SX2NJYkptOSgkRWspOwogICAgICAgICAgICAkSGdFbVJ6OThZNyA9IGdtdSBIZ0VtUl9GOThZNygkRWspOwoKCiAgICAgICAgICAgIEhDICgkYm1YX3U4OXJDWDh1ID4geCkgewogICAgICAgICAgICAgICAgJHU4OXJDWDh1YkptN19FbUpJSFhiID0gJE84OXJDWDh1LT5GbUpfT2pZSFhFbTk1SVhZbV9qbGoxQigkYm1YX3U4OXJDWDh1KTsKICAgICAgICAgICAgICAgICRnOF9iSm03X0VtSklIWGIgPSBvOFlnSigkdTg5ckNYOHViSm03X0VtSklIWGIpOwogICAgICAgICAgICAgICAgJEpfRUlsYiA9ICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlt4XVsnSkk5Rm1KX0VJbGInXTsKICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICRKX0VJbGIgPSB4OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQklKSV9aSWtYbSA9IGdtdSBFSUpJX0pJa1htKCRFayk7CgogICAgICAgICAgICAkSTY4WFljZ2IgPSBJOTlJbCgnSEUnLCd1ODlyQ1g4dV83OW1DSFInLCAnNzk4VG1vSl9IRScsICdIY19IRScsICdIY19IRScsICdIY19IRScpOwogICAgICAgICAgICAkSTY4WFljZ2JSID0gSTk5SWwoJ3VFLjltbzg5RV9ibUpfSEUnLCd1Ny43OW1DSFInLCAnay43OThUbW9KX0hFJywgJ2sudTg5ckNYOHVfSkhKWG0nLCAndUUuSEUnLCAndUUuSGNfSEUnLCAndUUubzltSUptRV9rbCcsICd1RS5vOW1JSm1FX0lKJywgJ3VFLm85bUlKbUVfa2wnLCAndTkuWWJtOV9IRScpOwogICAgICAgICAgICAkQklKSV9aSWtYbS0+Ym1KX0k2OFhZY2diKCRJNjhYWWNnYik7CiAgICAgICAgICAgICRvZ0ogPSBvOFlnSigkY0lKbzJtYl85bW84OUUpOwogICAgICAgICAgICBIQyAoJG9nSiA+IHgpIHsKICAgICAgICAgICAgICAgIEM4OSAoJG84WCA9IHg7ICRvOFggPCBvOFlnSigkY0lKbzJtYl85bW84OUUpOyAkbzhYKyspIHsKICAgICAgICAgICAgICAgICAgICBJOTlJbF83WWIyKCQ2WWJKOGNfNjhYWWNnYiwgJGNJSm8ybWJfOW1vODlFWyRvOFhdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICRiMWdFbVI2OFhZY2cgPSAiSEUgIjsKICAgICAgICAgICAgJEJJSklfWklrWG0tPmJtSl9iMWdFbVI2OFhZY2coJGIxZ0VtUjY4WFljZyk7CgoKICAgICAgICAgICAgJGJaSWtYbSA9ICJ1ODlyQ1g4dV9IYyI7CiAgICAgICAgICAgICRCSUpJX1pJa1htLT5ibUpfYlpJa1htKCRiWklrWG0pOwogICAgICAgICAgICAkQklKSV9aSWtYbS0+Ym1KX2IxZ0VtUjY4WFljZygkYjFnRW1SNjhYWWNnKTsKCiAgICAgICAgICAgICRCSUpJX1pJa1htLT5ibUpfYm5vMjgoJF96blpbJ2JubzI4J10pOwogICAgICAgICAgICAkQklKSV9aSWtYbS0+Ym1KX0hCSGI3WElseUpJOUooJF96blpbJ0hCSGI3WElseUpJOUonXSk7CiAgICAgICAgICAgICRCSUpJX1pJa1htLT5ibUpfSEJIYjdYSWxTbWdGSjIoJF96blpbJ0hCSGI3WElsU21nRkoyJ10pOwoKICAgICAgICAgICAgJEJJSklfWklrWG0tPmJtSl9IeTg5SjY4WF94KCRfem5aWydIeTg5SjY4WF94J10pOwogICAgICAgICAgICAkQklKSV9aSWtYbS0+Ym1KX0h5ODlKSGdGNjhYYigkX3puWlsnSHk4OUpIZ0Y2OFhiJ10pOwoKICAgICAgICAgICAgJDlWbWJZWEogPSBJOTlJbCgpOwoKCiAgICAgICAgICAgICRCSUpJX1pJa1htLT5iU0hjSEogPSAiIjsKICAgICAgICAgICAgSEMgKEhiYm1KKCRCSUpJX1pJa1htLT5IQkhiN1hJbHlKSTlKKSAmJiAkQklKSV9aSWtYbS0+SEJIYjdYSWxTbWdGSjIgIT0gJy1HJykgewogICAgICAgICAgICAgICAgJEJJSklfWklrWG0tPmJTSGNISiA9ICJTMWgxWiAiIC4gSGdKNElYKCRCSUpJX1pJa1htLT5IQkhiN1hJbHlKSTlKKSAuICIsICIgLiBIZ0o0SVgoJEJJSklfWklrWG0tPkhCSGI3WElsU21nRkoyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgogICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZCblYganEKICAgICAgICAgICAgIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgoKICAgICAgICAgICAgJGJQOUVtOSA9ICIiOwogICAgICAgICAgICBIQyAoSGJibUooJF96blpbJ0h5ODlKNjhYX3gnXSkpIHsKICAgICAgICAgICAgICAgICRiUDlFbTkgPSAiUFZCblYganEgICI7CiAgICAgICAgICAgICAgICBDODkgKCRIID0geDsgJEggPCBIZ0o0SVgoJF96blpbJ0h5ODlKSGdGNjhYYiddKTsgJEgrKykgewoKICAgICAgICAgICAgICAgICAgICBIQyAoJF96blpbJ2t5ODlKSWtYbV8nIC4gSGdKNElYKCRfem5aWydIeTg5SjY4WF8nIC4gJEhdKV0gPT0gIko5WW0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkSTY4WFljZ2JbSGdKNElYKCRfem5aWydIeTg5SjY4WF8nIC4gJEhdKV0gPT0gJzcuRThvX0hFJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJQOUVtOSAuPSAnMXZuWl9BWlB2KCcgLiAkSTY4WFljZ2JbSGdKNElYKCRfem5aWydIeTg5SjY4WF8nIC4gJEhdKV0gLiAiKSAgIiAuICgkX3puWlsnYnk4OUpCSDlfJyAuICRIXSA9PT0gJ0libycgPyAnSWJvJyA6ICdFbWJvJykgLiAiLCAiOwogICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJQOUVtOSAuPSAkSTY4WFljZ2JbSGdKNElYKCRfem5aWydIeTg5SjY4WF8nIC4gJEhdKV0gLiAiICIgLiAoJF96blpbJ2J5ODlKQkg5XycgLiAkSF0gPT09ICdJYm8nID8gJ0libycgOiAnRW1ibycpIC4gIiwgIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkYlA5RW05ID0gYllrYko5XzltN1hJb20oJGJQOUVtOSwgIiIsIC10KTsKCiAgICAgICAgICAgICAgICBIQyAoJGJQOUVtOSA9PSAiUFZCblYganEiKSB7CiAgICAgICAgICAgICAgICAgICAgJGJQOUVtOSA9ICIgICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEJJSklfWklrWG0tPmJtSl9iUDlFbTkoJGJQOUVtOSk7CgoKICAgICAgICAgICAgIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgogICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgeW5BVjZwCiAgICAgICAgICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pj4KCiAgICAgICAgICAgIEhDICgkYm1YX3U4OXJDWDh1ID4geCkgewogICAgICAgICAgICAgICAgJEhjQ19IZ0M4ID0gJE9qWUhYRW05LT5GbUpfMWhESG1YRWJfamxqMUIoJGJtWF91ODlyQ1g4dSk7CiAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAkSGNDX0hnQzggPSAkT2pZSFhFbTktPkZtSl8xaERIbVhFYl9qbE4xQigkN0hFKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEhjX0NIbVhFYl9JOTkgPSBJOTlJbF9vOFhZY2coJEhjQ19IZ0M4LCAnSGNDX0hFJyk7CgogICAgICAgICAgICAkSGNfQ0htWEViXzltYllYSiA9IEk5OUlsX1lnSDNZbSgkSGNfQ0htWEViX0k5OSk7CgogICAgICAgICAgICAkYk8ybTltID0gIiI7CiAgICAgICAgICAgIEhDIChIYmJtSigkX3puWlsnYnltSTlvMiddKSAmJiAkX3puWlsnYnltSTlvMiddICE9ICIiKSB7CgogICAgICAgICAgICAgICAgLy8kYk8ybTltID0gIk9wblZuICgiOwoKICAgICAgICAgICAgICAgIEhDIChvOFlnSigkSGNfQ0htWEViX0k5OSkgPiB4KSB7CiAgICAgICAgICAgICAgICAgICAgSEMgKCRibVhfdTg5ckNYOHUgPiB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gPSAiQXZCICAoICggay51ODlyQ1g4dV9KSEpYbSBTMWluIDp5bkFWNnBfNUFTZW5fRyBQViB1Ny43OW1DSFIgUzFpbiA6eW5BVjZwXzVBU2VuX0cgUFYgNlB2NkFaKHVFLmtZSFhFbTlfSEUsICcuJywgdUUuOW1vODlFX2JtSl9IRSkgUzFpbiA6eW5BVjZwXzVBU2VuX3QpICBQViAoIjsKICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltID0gIkF2QiAgKGsudTg5ckNYOHVfSkhKWG0gUzFpbiA6eW5BVjZwXzVBU2VuX0cgUFYgdTcuNzltQ0hSIFMxaW4gOnluQVY2cF81QVNlbl9HIFBWIDZQdjZBWih1RS5rWUhYRW05X0hFLCAnLicsIHVFLjltbzg5RV9ibUpfSEUpIFMxaW4gOnluQVY2cF81QVNlbl90ICBQViAoIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgIEhDICgkYm1YX3U4OXJDWDh1ID4geCkgewogICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltID0gIkF2QiAgKChrLnU4OXJDWDh1X0pISlhtIFMxaW4gOnluQVY2cF81QVNlbl9HIFBWIHU3Ljc5bUNIUiBTMWluIDp5bkFWNnBfNUFTZW5fRyBQViA2UHY2QVoodUUua1lIWEVtOV9IRSwgJy4nLCB1RS45bW84OUVfYm1KX0hFKSBTMWluIDp5bkFWNnBfNUFTZW5fdCkgKSAiOwogICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gPSAiQXZCICAoay51ODlyQ1g4dV9KSEpYbSBTMWluIDp5bkFWNnBfNUFTZW5fRyBQViB1Ny43OW1DSFIgUzFpbiA6eW5BVjZwXzVBU2VuX0cgUFYgNlB2NkFaKHVFLmtZSFhFbTlfSEUsICcuJywgdUUuOW1vODlFX2JtSl9IRSkgUzFpbiA6eW5BVjZwXzVBU2VuX3QgKSAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSiA9IHQ7CgogICAgICAgICAgICAgICAgJGJ5bUk5bzJfSTk5ID0gbVI3WDhFbSgnLCcsIDJKY1hiN21vSElYbzJJOWIoJF96blpbJ2J5bUk5bzInXSwgbnZaX1FlUFpueSkpOwoKICAgICAgICAgICAgICAgIEhDIChvOFlnSigkYnltSTlvMl9JOTkpID4geCkgewoKICAgICAgICAgICAgICAgICAgICAkZiA9IHg7CiAgICAgICAgICAgICAgICAgICAgQzg5bUlvMiAoJEhjQ19IZ0M4IEliICRybWwgPT4gJGtZSFhFbTlfSGNDKSB7CgoKICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAnKCc7CiAgICAgICAgICAgICAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImhxeVFTIikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSjkgPSBGbWdtOUlKbVZJZ0U4Y3lKOUhnRigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIHVFLjltbzg5RV9ibUpfSEUgMXYoIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5SWdFX2JKOUcgPSBiSjlfYjJZQ0NYbSgkYko5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDODltSW8yICgkYnltSTlvMl9JOTkgSWIgJGJ5bUk5bzJfNElYKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRibUk5bzJfNElYWW1fa0hnRV9iSjkgPSAnOnluQVY2cF81QVNlbl8nIC4gJGJtSTlvMl80SVhZbV9rSGdFX284WWdKOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRsID09IHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIChibVhtb0ogIiAuICQ5SWdFX2JKOUcgLiAiLkhFIERWUGggX0VsZ0ljSG9fSGNfIiAuICRrWUhYRW05X0hjQ1snSGNfSEUnXSAuICIgQXkgIiAuICQ5SWdFX2JKOUcgLiAiIE9wblZuICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gIiAiIC4gJDlJZ0VfYko5RyAuICIuSGNfQ0htWEVfIiAuICRrWUhYRW05X0hjQ1snSGNDX0hFJ10gLiAiIFMxaW4gIiAuICRibUk5bzJfNElYWW1fa0hnRV9iSjkgLiAiICI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkbCArIEcgIT0gbzhZZ0ooJGJ5bUk5bzJfSTk5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICdQViAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJyApICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICIpICI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbCA9IHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYko5ID0gRm1nbTlJSm1WSWdFOGN5SjlIZ0YoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICIgdUUuOW1vODlFX2JtSl9IRSAxdigiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDlJZ0VfYko5RyA9IGJKOV9iMllDQ1htKCRiSjkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQzg5bUlvMiAoJGJ5bUk5bzJfSTk5IEliICRieW1JOW8yXzRJWCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRibUk5bzJfNElYWW1fa0hnRV9iSjkgPSAnOnluQVY2cF81QVNlbl8nIC4gJGJtSTlvMl80SVhZbV9rSGdFX284WWdKOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJGwgPT0geCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICIgKGJtWG1vSiAgIiAuICQ5SWdFX2JKOUcgLiAiLkhFIERWUGggX0VsZ0ljSG9fSGNfIiAuICRrWUhYRW05X0hjQ1snSGNfSEUnXSAuICIgQXkgIiAuICQ5SWdFX2JKOUcgLiAiIE9wblZuICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICIgIiAuICQ5SWdFX2JKOUcgLiAiLkhjX0NIbVhFXyIgLiAka1lIWEVtOV9IY0NbJ0hjQ19IRSddIC4gIiBTMWluICIgLiAkYm1JOW8yXzRJWFltX2tIZ0VfYko5IC4gIiAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkbCArIEcgIT0gbzhZZ0ooJGJ5bUk5bzJfSTk5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICdQViAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJyApICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICIpICI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIFBWICI7CiAgICAgICAgICAgICAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImhxeVFTIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwgPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIHVFLjltbzg5RV9ibUpfSEUgMXYoIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSjkgPSBGbWdtOUlKbVZJZ0U4Y3lKOUhnRigpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEM4OW1JbzIgKCRieW1JOW8yX0k5OSBJYiAkYnltSTlvMl80SVgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1JOW8yXzRJWFltX2tIZ0VfbzhZZ0orKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1JOW8yXzRJWFltX2tIZ0VfYko5ID0gJzp5bkFWNnBfNUFTZW5fJyAuICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDlJZ0VfYko5RyA9IGJKOV9iMllDQ1htKCRiSjkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5SWdFX2JKOXQgPSBiSjlfYjJZQ0NYbSgkYko5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIChibVhtb0ogIiAuICQ5SWdFX2JKOUcgLiAiLkhFIERWUGggX0VsZ0ljSG9fSGNfIiAuICRrWUhYRW05X0hjQ1snSGNfSEUnXSAuICIgQXkgIiAuICQ5SWdFX2JKOUcgLiAiIFNuRFogUGVablYgVVAxdiBIZ0VtUl9jSWJKbTlfQ0htWEVfbVJKbWdFIEF5ICIgLiAkOUlnRV9iSjl0IC4gIiBQdigiIC4gJDlJZ0VfYko5dCAuICIuSEU9ICIgLiAkOUlnRV9iSjlHIC4gIi5IY19DSG1YRV8iIC4gJGtZSFhFbTlfSGNDWydIY0NfSEUnXSAuICIpIE9wblZuICIgLiAkOUlnRV9iSjl0IC4gIi5DSG1YRV80SVhZbSBTMWluICIgLiAkYm1JOW8yXzRJWFltX2tIZ0VfYko5IC4gIikgIjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRsICsgRyAhPSBvOFlnSigkYnltSTlvMl9JOTkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJywgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiKSAiOwogICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbCA9IHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYko5ID0gRm1nbTlJSm1WSWdFOGN5SjlIZ0YoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICIgdUUuOW1vODlFX2JtSl9IRSAxdigiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDlJZ0VfYko5RyA9IGJKOV9iMllDQ1htKCRiSjkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDlJZ0VfYko5dCA9IGJKOV9iMllDQ1htKCRiSjkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQzg5bUlvMiAoJGJ5bUk5bzJfSTk5IEliICRieW1JOW8yXzRJWCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRibUk5bzJfNElYWW1fa0hnRV9iSjkgPSAnOnluQVY2cF81QVNlbl8nIC4gJGJtSTlvMl80SVhZbV9rSGdFX284WWdKOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJGwgPT0geCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIChibVhtb0ogICIgLiAkOUlnRV9iSjlHIC4gIi5IRSBEVlBoIF9FbGdJY0hvX0hjXyIgLiAka1lIWEVtOV9IY0NbJ0hjX0hFJ10gLiAiIEF5ICIgLiAkOUlnRV9iSjlHIC4gIiBTbkRaIFBlWm5WIFVQMXYgSGdFbVJfY0liSm05X0NIbVhFX21SSm1nRSBBeSAiIC4gJDlJZ0VfYko5dCAuICIgUHYob0liSigiIC4gJDlJZ0VfYko5dCAuICIuSEUgSWIgNEk5bzJJOShjSVIpKSA9IG9JYkooIiAuICQ5SWdFX2JKOUcgLiAiLkhjX0NIbVhFXyIgLiAka1lIWEVtOV9IY0NbJ0hjQ19IRSddIC4gIiBJYiA0STlvMkk5KGNJUikpKSBPcG5WbiAgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gIiAiIC4gJDlJZ0VfYko5dCAuICIuQ0htWEVfNElYWW0gUzFpbiAiIC4gJGJtSTlvMl80SVhZbV9rSGdFX2JKOSAuICIgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJGwgKyBHICE9IG84WWdKKCRieW1JOW8yX0k5OSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAnUFYgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICcgKSAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiKSAiOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBIQyAoJGYgKyBHICE9IG84WWdKKCRIY0NfSGdDOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJykgUFYnOwogICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAobzhZZ0ooJEhjX0NIbVhFYl9JOTkpID4geCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJykpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgoKICAgICAgICAgICAgICAgICAgICAgICAgJGYrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IG1YYm0gewoKCiAgICAgICAgICAgICAgICAgICAgJGYgPSB4OwogICAgICAgICAgICAgICAgICAgIEM4OW1JbzIgKCRIY0NfSGdDOCBJYiAkcm1sID0+ICRrWUhYRW05X0hjQykgewoKICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAnKCc7CiAgICAgICAgICAgICAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImhxeVFTIikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSjkgPSBGbWdtOUlKbVZJZ0U4Y3lKOUhnRigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIHVFLjltbzg5RV9ibUpfSEUgMXYoIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5SWdFX2JKOUcgPSBiSjlfYjJZQ0NYbSgkYko5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEM4OW1JbzIgKCRieW1JOW8yX0k5OSBJYiAkYnltSTlvMl80SVgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1JOW8yXzRJWFltX2tIZ0VfbzhZZ0orKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1JOW8yXzRJWFltX2tIZ0VfYko5ID0gJzp5bkFWNnBfNUFTZW5fJyAuICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRsID09IHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIChibVhtb0ogIiAuICQ5SWdFX2JKOUcgLiAiLkhFIERWUGggX0VsZ0ljSG9fSGNfIiAuICRrWUhYRW05X0hjQ1snSGNfSEUnXSAuICIgQXkgIiAuICQ5SWdFX2JKOUcgLiAiIE9wblZuICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gIiAiIC4gJDlJZ0VfYko5RyAuICIuSGNfQ0htWEVfIiAuICRrWUhYRW05X0hjQ1snSGNDX0hFJ10gLiAiIFMxaW4gIiAuICRibUk5bzJfNElYWW1fa0hnRV9iSjkgLiAiICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRsICsgRyAhPSBvOFlnSigkYnltSTlvMl9JOTkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJ1BWICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAnICkgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gIikgIjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSjkgPSBGbWdtOUlKbVZJZ0U4Y3lKOUhnRigpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gIiB1RS45bW84OUVfYm1KX0hFIDF2KCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOUlnRV9iSjlHID0gYko5X2IyWUNDWG0oJGJKOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDODltSW8yICgkYnltSTlvMl9JOTkgSWIgJGJ5bUk5bzJfNElYKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJtSTlvMl80SVhZbV9rSGdFX284WWdKKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJtSTlvMl80SVhZbV9rSGdFX2JKOSA9ICc6eW5BVjZwXzVBU2VuXycgLiAkYm1JOW8yXzRJWFltX2tIZ0VfbzhZZ0o7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkbCA9PSB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gIiAoYm1YbW9KICAiIC4gJDlJZ0VfYko5RyAuICIuSEUgRFZQaCBfRWxnSWNIb19IY18iIC4gJGtZSFhFbTlfSGNDWydIY19IRSddIC4gIiBBeSAiIC4gJDlJZ0VfYko5RyAuICIgT3BuVm4gIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gIiAiIC4gJDlJZ0VfYko5RyAuICIuSGNfQ0htWEVfIiAuICRrWUhYRW05X0hjQ1snSGNDX0hFJ10gLiAiIFMxaW4gIiAuICRibUk5bzJfNElYWW1fa0hnRV9iSjkgLiAiICI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRsICsgRyAhPSBvOFlnSigkYnltSTlvMl9JOTkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJ1BWICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAnICkgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gIikgIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIFBWICI7CiAgICAgICAgICAgICAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImhxeVFTIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwgPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIHVFLjltbzg5RV9ibUpfSEUgMXYoIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSjkgPSBGbWdtOUlKbVZJZ0U4Y3lKOUhnRigpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEM4OW1JbzIgKCRieW1JOW8yX0k5OSBJYiAkYnltSTlvMl80SVgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1JOW8yXzRJWFltX2tIZ0VfbzhZZ0orKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1JOW8yXzRJWFltX2tIZ0VfYko5ID0gJzp5bkFWNnBfNUFTZW5fJyAuICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDlJZ0VfYko5RyA9IGJKOV9iMllDQ1htKCRiSjkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5SWdFX2JKOXQgPSBiSjlfYjJZQ0NYbSgkYko5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIChibVhtb0ogIiAuICQ5SWdFX2JKOUcgLiAiLkhFIERWUGggX0VsZ0ljSG9fSGNfIiAuICRrWUhYRW05X0hjQ1snSGNfSEUnXSAuICIgQXkgIiAuICQ5SWdFX2JKOUcgLiAiIFNuRFogUGVablYgVVAxdiBIZ0VtUl9jSWJKbTlfQ0htWEVfbVJKbWdFIEF5ICIgLiAkOUlnRV9iSjl0IC4gIiBQdigiIC4gJDlJZ0VfYko5dCAuICIuSEU9ICIgLiAkOUlnRV9iSjlHIC4gIi5IY19DSG1YRV8iIC4gJGtZSFhFbTlfSGNDWydIY0NfSEUnXSAuICIpIE9wblZuICIgLiAkOUlnRV9iSjl0IC4gIi5DSG1YRV80SVhZbSBTMWluICIgLiAkYm1JOW8yXzRJWFltX2tIZ0VfYko5IC4gIikgIjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRsICsgRyAhPSBvOFlnSigkYnltSTlvMl9JOTkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJywgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiKSAiOwogICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGwgPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIHVFLjltbzg5RV9ibUpfSEUgMXYoIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSjkgPSBGbWdtOUlKbVZJZ0U4Y3lKOUhnRigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQzg5bUlvMiAoJGJ5bUk5bzJfSTk5IEliICRieW1JOW8yXzRJWCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1JOW8yXzRJWFltX2tIZ0VfbzhZZ0orKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1JOW8yXzRJWFltX2tIZ0VfYko5ID0gJzp5bkFWNnBfNUFTZW5fJyAuICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDlJZ0VfYko5RyA9IGJKOV9iMllDQ1htKCRiSjkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5SWdFX2JKOXQgPSBiSjlfYjJZQ0NYbSgkYko5KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIChibVhtb0ogICIgLiAkOUlnRV9iSjlHIC4gIi5IRSBEVlBoIF9FbGdJY0hvX0hjXyIgLiAka1lIWEVtOV9IY0NbJ0hjX0hFJ10gLiAiIEF5ICIgLiAkOUlnRV9iSjlHIC4gIiBTbkRaIFBlWm5WIFVQMXYgSGdFbVJfY0liSm05X0NIbVhFX21SSm1nRSBBeSAiIC4gJDlJZ0VfYko5dCAuICIgUHYob0liSigiIC4gJDlJZ0VfYko5dCAuICIuSEUgSWIgNEk5bzJJOShjSVIpKT0gb0liSigiIC4gJDlJZ0VfYko5RyAuICIuSGNfQ0htWEVfIiAuICRrWUhYRW05X0hjQ1snSGNDX0hFJ10gLiAiIEliIDRJOW8ySTkoY0lSKSkpIE9wblZuICIgLiAkOUlnRV9iSjl0IC4gIi5DSG1YRV80SVhZbSBTMWluICIgLiAkYm1JOW8yXzRJWFltX2tIZ0VfYko5IC4gIikgIjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRsICsgRyAhPSBvOFlnSigkYnltSTlvMl9JOTkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJywgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiKSAiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkZiArIEcgIT0gbzhZZ0ooJEhjQ19IZ0M4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAnKSBQVic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAobzhZZ0ooJEhjX0NIbVhFYl9JOTkpID4geCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJykpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGYrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIQyAoJGJtWF91ODlyQ1g4dSA+IHgpIHsKICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICcpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvL0ZtSiBKMm0gNEk5SElrWG1iIFliSGdGIDltM1ltYkoKICAgICAgICAgICAgICAgICQ5X0NfSGNfR19vMmZnID0gJDlfQ19IY19HW3hdOwogICAgICAgICAgICAgICAgJDlfQ19IY2JfRyA9ICQ5X0NfSGNfR1tHXTsKICAgICAgICAgICAgICAgICQ5X0NfSGNfdF9vMmZnID0gICQ5X0NfSGNfdFt4XTsKICAgICAgICAgICAgICAgICQ5X0NfSGNiX3Q9ICAkOV9DX0hjX3RbR107CiAgICAgICAgICAgICAgICAkOV9DX0hjX0xfbzJmZyA9ICAkOV9DX0hjX0xbeF07CiAgICAgICAgICAgICAgICAkOV9DX0hjYl9MPSAgJDlfQ19IY19MW0ddOwogICAgICAgICAgICAgICAgJDlfQ19IY185SWdGbV9HPSAgJDlfQ19IY19HW3RdOwogICAgICAgICAgICAgICAgJDlfQ19IY185SWdGbV90PSAgJDlfQ19IY190W3RdOwogICAgICAgICAgICAgICAgJDlfQ19IY185SWdGbV9MPSAgJDlfQ19IY19MW3RdOwoKICAgICAgICAgICAgICAgICQ4N205SUo4OV9KdTggPSAkX1ZuUWVueVpbJzg3bTlJSjg5X0p1OCddOwogICAgICAgICAgICAgICAgJDg3bTlJSjg5ID0gJF9WblFlbnlaWyc4N205SUo4OSddOwogICAgICAgICAgICAgICAgJDg3bTlJSjg5X0oyOW1tID0gJF9WblFlbnlaWyc4N205SUo4OV9KMjltbSddOwoKCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkRUlKbV9iSjlIZ0ZfSGNHID0gbVI3WDhFbSgnLScsJDlfQ19IY2JfRyk7CiAgICAgICAgICAgICAgICAkRUlKbV9iSjlIZ0ZfSGNfbzJmZ0cgPSBtUjdYOEVtKCdfJywkOV9DX0hjX0dfbzJmZyk7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkSGJfSGNfYm1JOW8yXzhnbSA9IHg7CiAgICAgICAgICAgICAgICAkSGJfSGNfYm1JOW8yX0p1OCA9IHg7CiAgICAgICAgICAgICAgICAkSGJfSGNfYm1JOW8yX0oyOW1tID0geDsKCiAgICAgICAgICAgICAgICBIQyhiSjlKOEpIY20oJEVJSm1fYko5SGdGX0hjR1t4XSkpewogICAgICAgICAgICAgICAgICAgICRIYl9FSUptRyA9ICAkMWdFbVJoSWJKbTktPkZtSjFnRW1SREhtWEV2SWNtKCQ3SEUsJEVJSm1fYko5SGdGX0hjX28yZmdHW3RdKTsKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIEhDKCRIYl9FSUptR1t4XVsnQ0htWEVfSmw3bSddID09ICdCSUptJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICRIYl9IY19ibUk5bzJfOGdtID0gRzsKICAgICAgICAgICAgICAgICAgICAgICAgJGJKSTlKX0VJSm1HID0gRUlKbSgiRS1jLXEiLCBiSjlKOEpIY20oJEVJSm1fYko5SGdGX0hjR1t4XSkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJG1nRV9FSUptRyA9IEVJSm0oIkUtYy1xIiwgYko5SjhKSGNtKCRFSUptX2JKOUhnRl9IY0dbR10pICk7CiAgICAgICAgICAgICAgICAgICAgICAgICQ5X0NfSGNfRyA9ICRiSkk5Sl9FSUptRzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gSEonYiBIZyBFSUptIEM4OWNJSgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRFSUptX2JKOUhnRl9IY3QgPSBtUjdYOEVtKCctJywkOV9DX0hjYl90KTsKICAgICAgICAgICAgICAgICRFSUptX2JKOUhnRl9IY19vMmZndCA9IG1SN1g4RW0oJy0nLCQ5X0NfSGNfdF9vMmZnKTsKICAgICAgICAgICAgICAgIEhDKGJKOUo4SkhjbSgkRUlKbV9iSjlIZ0ZfSGN0W3hdKSl7CiAgICAgICAgICAgICAgICAgICAgJEhiX0VJSm10ID0gICQxZ0VtUmhJYkptOS0+Rm1KMWdFbVJESG1YRXZJY20oJDdIRSwkRUlKbV9iSjlIZ0ZfSGNfbzJmZ3RbdF0pOwogICAgICAgICAgICAgICAgICAgIEhDKCRIYl9FSUptdFt4XVsnQ0htWEVfSmw3bSddID09ICdCSUptJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICRIYl9IY19ibUk5bzJfSnU4ID0gRzsKICAgICAgICAgICAgICAgICAgICAgICAgJGJKSTlKX0VJSm10ID0gRUlKbSgiRS1jLXEiLCBiSjlKOEpIY20oJEVJSm1fYko5SGdGX0hjdFt4XSkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJG1nRV9FSUptdD0gRUlKbSgiRS1jLXEiLCBiSjlKOEpIY20oJEVJSm1fYko5SGdGX0hjdFtHXSkgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gSEonYiBIZyBFSUptIEM4OWNJSgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRFSUptX2JKOUhnRl9IY0wgPSBtUjdYOEVtKCctJywkOV9DX0hjYl9MKTsKICAgICAgICAgICAgICAgICRFSUptX2JKOUhnRl9IY19vMmZnTCA9IG1SN1g4RW0oJy0nLCQ5X0NfSGNfTF9vMmZnKTsKICAgICAgICAgICAgICAgICBIQyhiSjlKOEpIY20oJEVJSm1fYko5SGdGX0hjTFt4XSkpewogICAgICAgICAgICAgICAgICAgICRIYl9FSUptTCA9ICAkMWdFbVJoSWJKbTktPkZtSjFnRW1SREhtWEV2SWNtKCQ3SEUsJEVJSm1fYko5SGdGX0hjX28yZmdMW3RdKTsKICAgICAgICAgICAgICAgICAgICBIQygkSGJfRUlKbUxbeF1bJ0NIbVhFX0psN20nXSA9PSAnQklKbScpewogICAgICAgICAgICAgICAgICAgICAgICAkSGJfSGNfYm1JOW8yX0oyOW1tID0gRzsKICAgICAgICAgICAgICAgICAgICAgICAgJGJKSTlKX0VJSm1MID0gRUlKbSgiRS1jLXEiLCBiSjlKOEpIY20oJEVJSm1fYko5SGdGX0hjTFt4XSkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJG1nRV9FSUptTCA9IEVJSm0oIkUtYy1xIiwgYko5SjhKSGNtKCRFSUptX2JKOUhnRl9IY0xbR10pICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEhKJ2IgSGcgRUlKbSBDODljSUoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIQyghbWM3SmwoJDlfQ19IY185SWdGbV9HKSl7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJEhiX0hjX2JtSTlvMjlfOGdtID0gRzsKICAgICAgICAgICAgICAgICAgICAkYkpJOUpfOUlnRm1HID0gJDlfQ19IY2JfRzsKICAgICAgICAgICAgICAgICAgICAkbWdFXzlJZ0ZtRz0gJDlfQ19IY185SWdGbV9HOwogICAgICAgICAgICAgICAgICAgIC8vIEhKJ2IgSGcgRUlKbSBDODljSUoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIQyghbWM3SmwoJDlfQ19IY185SWdGbV90KSl7CiAgICAgICAgICAgICAgICAgICAgJEhiX0hjX2JtSTlvMjlfSnU4ID0gRzsKICAgICAgICAgICAgICAgICAgICAkYkpJOUpfOUlnRm10ID0gJDlfQ19IY2JfdDsKICAgICAgICAgICAgICAgICAgICAkbWdFXzlJZ0ZtdCA9ICQ5X0NfSGNfOUlnRm1fdDsKICAgICAgICAgICAgICAgICAgICAvLyBISidiIEhnIEVJSm0gQzg5Y0lKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSEMoIW1jN0psKCQ5X0NfSGNfOUlnRm1fTCkpewogICAgICAgICAgICAgICAgICAgICRIYl9IY19ibUk5bzI5X0oyOW1tID0gRzsKICAgICAgICAgICAgICAgICAgICAkYkpJOUpfOUlnRm1MID0gJDlfQ19IY2JfTDsKICAgICAgICAgICAgICAgICAgICAkbWdFXzlJZ0ZtTD0gJDlfQ19IY185SWdGbV9MOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEhKJ2IgSGcgRUlKbSBDODljSUoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy9vMm1vciBvOGdFSEpIOGcgQzg5IElYWCBKMjltbQogICAgICAgICAgICAgICAgJGJKOSA9IEZtZ205SUptVklnRThjeUo5SGdGKCk7CiAgICAgICAgICAgICAgICAkOUlnRV9iSjlHID0gYko5X2IyWUNDWG0oJGJKOSk7CiAgICAgICAgICAgICAgICAkSGJfSGNfYm1JOW8yID0geDsKICAgICAgICAgICAgICAgIEhDKCFtYzdKbCgkOV9DX0hjYl9HKSB8fCAgIW1jN0psKCQ5X0NfSGNiX3QpIHx8ICFtYzdKbCgkOV9DX0hjYl9MKSl7CiAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAiIEFnRSB1RS45bW84OUVfYm1KX0hFIEhnIChibVhtb0ogICIgLiAkOUlnRV9iSjlHIC4gIi5IRSBEVlBoIF9FbGdJY0hvX0hjXyIgLiAkSGNDX0hnQzhbeF1bJ0hjX0hFJ10gLiAiIEF5ICIgLiAkOUlnRV9iSjlHIC4gIiBPcG5WbiAiOwogICAgICAgICAgICAgICAgICAgICRIYl9IY19ibUk5bzIgPSBHOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEhDKCFtYzdKbCgkOV9DX0hjX0dfbzJmZykgJiYgIW1jN0psKCQ5X0NfSGNfRykpewogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyRiTzJtOW0gLj0gIiBBdkIgIjsKCiAgICAgICAgICAgICAgICAgICAgSEMoJEhiX0hjX2JtSTlvMl84Z20gPT0gRyl7CiAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJ3laVl9aUF9CQVpuKCcuJDlfQ19IY19HX28yZmcgLiIsJyVFLSVjLSVxJykgam5aT25udiB5WlZfWlBfQkFabignIiAuICRiSkk5Sl9FSUptRyAuICInLCclRS0lYy0lcScpIEF2QiAgeVpWX1pQX0JBWm4oJyIgLiAkbWdFX0VJSm1HIC4gIicsJyVFLSVjLSVxJykiOwogICAgICAgICAgICAgICAgICAgIH1tWGJtSEMoJEhiX0hjX2JtSTlvMjlfOGdtID09IEcpewogICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICQ5X0NfSGNfR19vMmZnIC4gJyBqblpPbm52ICcuICRiSkk5Sl85SWdGbUcgLiAiIEF2QiAiIC4gJG1nRV85SWdGbUcgOwogICAgICAgICAgICAgICAgICAgIH1tWGJtewogICAgICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICQ5X0NfSGNfR19vMmZnIC4iIFMxaW4gJyUiIC4gJDlfQ19IY2JfRyAuICIlJyAiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIQyghbWM3SmwoJDlfQ19IY190X28yZmcpICYmICFtYzdKbCgkOV9DX0hjX3QpKXsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAkODdtOUlKODlfSnU4LicgJzsKICAgICAgICAgICAgICAgICAgICAgSEMoJEhiX0hjX2JtSTlvMl9KdTggPT0gRyl7CiAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJ3laVl9aUF9CQVpuKCcuJDlfQ19IY190X28yZmcgLiIsJyVFLSVjLSVxJykgam5aT25udiB5WlZfWlBfQkFabignIiAuICRiSkk5Sl9FSUptdCAuICInLCclRS0lYy0lcScpIEF2QiAgeVpWX1pQX0JBWm4oJyIgLiAkbWdFX0VJSm10IC4gIicsJyVFLSVjLSVxJykiOwogICAgICAgICAgICAgICAgICAgICB9bVhibUhDKCRIYl9IY19ibUk5bzI5X0p1OCA9PSBHKXsKICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAkOV9DX0hjX3RfbzJmZyAuICcgam5aT25udiAnLiAkYkpJOUpfOUlnRm10IC4gIiBBdkIgIiAuICRtZ0VfOUlnRm10IDsKICAgICAgICAgICAgICAgICAgICB9bVhibXsKICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAkOV9DX0hjX3RfbzJmZyAuIiBTMWluICclIiAuICQ5X0NfSGNiX3QgLiAiJScgIjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfUhDKCFtYzdKbCgkOV9DX0hjX0wpICYmICFtYzdKbCgkOV9DX0hjX0xfbzJmZykpewogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICQ4N205SUo4OV9KMjltbS4nICc7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8kYk8ybTltIC49ICQ5X0NfSGNfTF9vMmZnIC4iIGpuWk9ubnYgJyIgLiAkYkpJOUpfRUlKbSAuICInIEF2QiAgJyIgLiAkbWdFX0VJSm0gLiAiJyI7CiAgICAgICAgICAgICAgICAgICAgIEhDKCRIYl9IY19ibUk5bzJfSjI5bW0gPT0gRyl7CiAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJ3laVl9aUF9CQVpuKCcuJDlfQ19IY19MX28yZmcgLiIsJyVFLSVjLSVxJykgam5aT25udiB5WlZfWlBfQkFabignIiAuICRiSkk5Sl9FSUptTCAuICInLCclRS0lYy0lcScpIEF2QiAgeVpWX1pQX0JBWm4oJyIgLiAkbWdFX0VJSm1MIC4gIicsJyVFLSVjLSVxJykiOwogICAgICAgICAgICAgICAgICAgIH1tWGJtSEMoJEhiX0hjX2JtSTlvMjlfSjI5bW0gPT0gRyl7CiAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJDlfQ19IY19MX28yZmcgLiAnIGpuWk9ubnYgJy4gJGJKSTlKXzlJZ0ZtTCAuICIgQXZCICIgLiAkbWdFXzlJZ0ZtTCA7CiAgICAgICAgICAgICAgICAgICAgfW1YYm17CiAgICAgICAgICAgICAgICAgICAgICAgICRiTzJtOW0gLj0gJDlfQ19IY19MX28yZmcgLiIgUzFpbiAnJSIgLiAkOV9DX0hjYl9MIC4gIiUnICI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgICAgLy8gJGJPMm05bSAuPSAiIEF2QiAiOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEMoJEhiX0hjX2JtSTlvMiA9PSBHKXsKICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICIpICI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4+CiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIEJBWkFaQWpTbiAtIHluQVY2cAogICAgICAgICAgICAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pj4KCgogICAgICAgICAgICBDODkgKCRIID0geDsgJEggPCBvOFlnSigkSTY4WFljZ2JSKTsgJEgrKykgewoKICAgICAgICAgICAgICAgIEhDIChIYmJtSigkX3puWlsna3ltSTlvMklrWG1fJyAuICRIXSkgJiYgJF96blpbJ2t5bUk5bzJJa1htXycgLiAkSF0gPT0gIko5WW0iICYmICRfem5aWydieW1JOW8yXycgLiAkSF0gIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkYk8ybTltIC49ICIgQXZCICI7CiAgICAgICAgICAgICAgICAgICAgSEMgKCRJNjhYWWNnYlJbJEhdICE9ICd1RS5IRScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJPMm05bSAuPSAkSTY4WFljZ2JSWyRIXSAuICIgUzFpbiAnJSIgLiAkX3puWlsnYnltSTlvMl8nIC4gJEhdIC4gIiUnICI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKCiAgICAgICAgICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgogICAgICAgICAgICAjICAgICAgICAgICAgICAgIEJuRDF2biBQVkJuViBqcSAmIHluQVY2cCBRZW5WMW55IAogICAgICAgICAgICAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pj4KCiAgICAgICAgICAgIEhDIChtYzdKbCgkYlA5RW05KSB8fCBKOUhjKCRiUDlFbTkpID09ICcnKSB7CiAgICAgICAgICAgICAgICAkYlA5RW05ID0gJ1BWQm5WIGpxIEhFIEJueTYnOwogICAgICAgICAgICAgICAgJEJJSklfWklrWG0tPmJtSl9iUDlFbTkoJGJQOUVtOSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRCSUpJX1pJa1htLT5ibUpfYk8ybTltKCRiTzJtOW0pOwoKICAgICAgICAgICAgJE84OXJDWDh1LT5ibUp5TzJtOW0oJGJPMm05bSk7CiAgICAgICAgICAgIC8vbW8yOCAkYk8ybTltOwogICAgICAgICAgICAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pj4KICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgRDFTWm5WCiAgICAgICAgICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgoKICAgICAgICAgICAgSEMgKCFtYzdKbCgkQ180SVhZbWIpKSB7CiAgICAgICAgICAgICAgICAkRUg0X0NIWEptOSA9IG1SN1g4RW0oJywnLCAkQ180SVhZbWIpOwogICAgICAgICAgICAgICAgJGc4X0NIWEptOV80SVhZbWIgPSBvOFlnSigkRUg0X0NIWEptOSk7CiAgICAgICAgICAgICAgICBIQyAoJGc4X0NIWEptOV80SVhZbWIgPiB4KSB7CiAgICAgICAgICAgICAgICAgICAgJENIWEptOV8zWW05bCA9ICcoJzsKCiAgICAgICAgICAgICAgICAgICAgQzg5ICgkUiA9IHg7ICRSIDwgJGc4X0NIWEptOV80SVhZbWI7ICRSKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENIWEptOV80SVhZbSA9ICRFSDRfQ0hYSm05WyRSXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkUiArIEcgPT0gJGc4X0NIWEptOV80SVhZbWIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDXzg3ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ184NyA9ICcgUFYgJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvL30KCiAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkQ0hYSm05XzRJWFltID09ICc4NG05X0VZbScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImhxeVFTIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDSFhKbTlfM1ltOWwgLj0gIiAgRFZQaF9ldjFLWjFobihCQVpuKEJBWm5fQUJCKHVFLlk3RUlKbUVfSUosMXZablY1QVMgazQuSkk5Rm1KX0VJbGIgQkFxKSkpIDwgRFZQaF9ldjFLWjFobihCQVpuKG9ZOUVJSm0oKSkpICIgLiAkQ184NzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENIWEptOV8zWW05bCAuPSAiICAoICBvSWJKKEVJSm1JRUUoRUlsLG9JYkooazQuSkk5Rm1KX0VJbGIgSWIgSGdKKSx1RS5ZN0VJSm1FX0lKKSBJYiBFSUptKSkgPCBvSWJKKEZtSkVJSm0oKSBJYiBFSUptKSAiIC4gJENfODc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkQ0hYSm05XzRJWFltID09ICdFWW1fSjhFSWwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoQU5OX0JqID09ICJocXlRUyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0hYSm05XzNZbTlsIC49ICIgIERWUGhfZXYxS1oxaG4oQkFabihCQVpuX0FCQih1RS5ZN0VJSm1FX0lKLCAxdlpuVjVBUyAoazQuSkk5Rm1KX0VJbGIpIEJBcSkpKSA9IERWUGhfZXYxS1oxaG4oQkFabihvWTlFSUptKCkpKSAiIC4gJENfODc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDSFhKbTlfM1ltOWwgLj0gIiAoICBvSWJKKEVJSm1JRUUoRUlsLG9JYkooazQuSkk5Rm1KX0VJbGIgSWIgSGdKKSx1RS5ZN0VJSm1FX0lKKSBJYiBFSUptKSkgPSBvSWJKKEZtSkVJSm0oKSBJYiBFSUptKSAiIC4gJENfODc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkQ0hYSm05XzRJWFltID09ICdFWW1fSjhjODk5OHUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoQU5OX0JqID09ICJocXlRUyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0hYSm05XzNZbTlsIC49ICInIChEVlBoX2V2MUtaMWhuKEJBWm4odUUuWTdFSUptRV9JSikpID0gRFZQaF9ldjFLWjFobig2ZVZCQVpuKCkgKyAxdlpuVjVBUyBHIEJBcSkpICcgIiAuICRDXzg3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0hYSm05XzNZbTlsIC49ICJvSWJKKHVFLlk3RUlKbUVfSUogSWIgRUlKbSkgPSBvSWJKKEVJSm1JRUUoRUlsLEcsRm1KRUlKbSgpKSBJYiBFSUptKSAiIC4gJENfODc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkQ0hYSm05XzRJWFltID09ICdFWW1fbzhjN1htSm0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0hYSm05XzNZbTlsIC49ICIgKHVFLklfYkpJSlliID0gRyBQViB1RS5JX2JKSUpZYiA9IHQpICIgLiAkQ184NzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRDSFhKbTlfNElYWW0gPT0gJ2c4Sl9FWW0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoQU5OX0JqID09ICJocXlRUyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0hYSm05XzNZbTlsIC49ICIgRFZQaF9ldjFLWjFobihCQVpuKEJBWm5fQUJCKHVFLlk3RUlKbUVfSUosIDF2Wm5WNUFTIGs0LkpJOUZtSl9FSWxiIEJBcSkpKSA+IERWUGhfZXYxS1oxaG4oQkFabihvWTlFSUptKCkpKSAiIC4gJENfODc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0hYSm05XzNZbTlsIC49ICIgKCAgb0liSihFSUptSUVFKEVJbCxvSWJKKGs0LkpJOUZtSl9FSWxiIEliIEhnSiksdUUuWTdFSUptRV9JSikgSWIgRUlKbSkpID4gb0liSihGbUpFSUptKCkgSWIgRUlKbSkgIiAuICRDXzg3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBIQyAoJENIWEptOV80SVhZbSA9PSAnbzhjN1htSm1FJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKEFOTl9CaiA9PSAiaHF5UVMiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENIWEptOV8zWW05bCAuPSAibzhjN1htSm1FIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDSFhKbTlfM1ltOWwgLj0gIm84YzdYbUptRSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkQ0hYSm05XzRJWFltID09ICdIZzc5OG9tYmInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoQU5OX0JqID09ICJocXlRUyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0hYSm05XzNZbTlsIC49ICJIZzc5OG9tYmIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENIWEptOV8zWW05bCAuPSAiSGc3OThvbWJiIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRDSFhKbTlfNElYWW0gPT0gJ0hnSm05OVk3Sm1FJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKEFOTl9CaiA9PSAiaHF5UVMiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENIWEptOV8zWW05bCAuPSAiSGdKbTk5WTdKbUUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENIWEptOV8zWW05bCAuPSAiSGdKbTk5WTdKbUUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRDSFhKbTlfM1ltOWwgLj0gJyknOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgJENIWEptOV8zWW05bCA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pj4KICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgUWVuVnEgRGV2NloxUHZ5CiAgICAgICAgICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgoKICAgICAgICAgICAgSEMgKCRibVhfdTg5ckNYOHUgPiB4KSB7CgogICAgICAgICAgICAgICAgJE9qWUhYRW05ID0gZ211IHU4OXJDWDh1X2tZSFhFbTkoJEVrKTsKICAgICAgICAgICAgICAgICRYSWJKX2JKbTdfSGdDOCA9ICRPallIWEVtOS0+Rm1KX09qWUhYRW05NUlYWW1fU0liSl9qMUUoJGJtWF91ODlyQ1g4dSk7CiAgICAgICAgICAgICAgICAkWEliSl9iSm03X0hFID0gJFhJYkpfYkptN19IZ0M4W3hdWydIRSddOwoKICAgICAgICAgICAgICAgICRJWFhfdUhjX0VtSklIWGIgPSAkTzg5ckNYOHUtPkZtSk84OXJEWDh1XzFoX2VibTkoJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydtYzdFSWIyJ11bJ21jN185OFhtJ10sICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddLCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJ1libTlfSEUnXSwgJDdIRSwgJGJtWF91ODlyQ1g4dSwgJENIWEptOV8zWW05bCwgJFhJYkpfYkptN19IRSwgJEJJSklfWklrWG0tPmJTSGNISiwgJENIWEptOV91Q18zWW05bCwgJF96blpbJ2J5bUk5bzInXSwgJGJtSTlvMl80SVhZbV9rSGdFX284WWdKKTsKCiAgICAgICAgICAgICAgICAvLyBIQyAoJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWyc5OFhtJ10gPT0gRykgewogICAgICAgICAgICAgICAgLy8gICAgICRJWFhfdUhjX0VtSklIWGIgPSAkTzg5ckNYOHUtPkZtSk84OXJEWDh1XzFoX2VibTkoJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydtYzdFSWIyJ11bJ21jN185OFhtJ10sICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddLCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJ1libTlfSEUnXSwgJDdIRSwgJGJtWF91ODlyQ1g4dSwgJENIWEptOV8zWW05bCwgJFhJYkpfYkptN19IRSwgJEJJSklfWklrWG0tPmJTSGNISiwgJENIWEptOV91Q18zWW05bCwgJF96blpbJ2J5bUk5bzInXSwgJGJtSTlvMl80SVhZbV9rSGdFX284WWdKKTsKICAgICAgICAgICAgICAgIC8vIH0gbVhibSB7CiAgICAgICAgICAgICAgICAvLyAgICAgJElYWF91SGNfRW1KSUhYYiA9ICRPODlyQ1g4dS0+Rm1KTzg5ckRYOHVfMWhfZWJtOSgkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJ21jN0VJYjInXVsnbWM3Xzk4WG0nXSwgJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWyc5OFhtJ10sICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnWWJtOV9IRSddLCAkN0hFLCAkYm1YX3U4OXJDWDh1LCAkQ0hYSm05XzNZbTlsLCAkWEliSl9iSm03X0hFLCAkQklKSV9aSWtYbS0+YlNIY0hKLCAkQ0hYSm05X3VDXzNZbTlsLCAkX3puWlsnYnltSTlvMiddLCAkYm1JOW8yXzRJWFltX2tIZ0VfbzhZZ0opOwogICAgICAgICAgICAgICAgLy8gfQoKCiAgICAgICAgICAgICAgICBIQyAoQU5OX0JqID09ICJoeXlRUyIpIHsKCiAgICAgICAgICAgICAgICAgICAgJElYWF91SGNfRW1KSUhYYl9vOFlnSiA9ICRPODlyQ1g4dS0+Rm1KTzg5ckRYOHVfMWhfZWJtOV9JWFgoJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydtYzdFSWIyJ11bJ21jN185OFhtJ10sICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddLCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJ1libTlfSEUnXSwgJDdIRSwgJGJtWF91ODlyQ1g4dSwgJENIWEptOV8zWW05bCwgJFhJYkpfYkptN19IRSwgJEJJSklfWklrWG0tPmJTSGNISiwgJENIWEptOV91Q18zWW05bCwgJF96blpbJ2J5bUk5bzInXSwgJGJtSTlvMl80SVhZbV9rSGdFX284WWdKKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBtWGJtIHsKCiAgICAgICAgICAgICAgICAkSVhYX3VIY19FbUpJSFhiID0gJE84OXJDWDh1LT5GbUpPODlyRFg4dV8xaF9BWFhlYm05KCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnbWM3RUliMiddWydtYzdfOThYbSddLCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSwgJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydZYm05X0hFJ10sICQ3SEUsICRDSFhKbTlfM1ltOWwsICRCSUpJX1pJa1htLT5iU0hjSEosICRfem5aWydieW1JOW8yJ10sICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSik7CgogICAgICAgICAgICAgICAgLy8gSEMgKCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddID09IEcpIHsKICAgICAgICAgICAgICAgIC8vICAgICAkSVhYX3VIY19FbUpJSFhiID0gJE84OXJDWDh1LT5GbUpPODlyRFg4dV8xaF9BWFhlYm05KCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnbWM3RUliMiddWydtYzdfOThYbSddLCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSwgJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydZYm05X0hFJ10sICQ3SEUsICRDSFhKbTlfM1ltOWwsICRCSUpJX1pJa1htLT5iU0hjSEosICRfem5aWydieW1JOW8yJ10sICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSik7CiAgICAgICAgICAgICAgICAvLyB9IG1YYm0gewogICAgICAgICAgICAgICAgLy8gICAgICRJWFhfdUhjX0VtSklIWGIgPSAkTzg5ckNYOHUtPkZtSk84OXJEWDh1XzFoX0FYWGVibTkoJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydtYzdFSWIyJ11bJ21jN185OFhtJ10sICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddLCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJ1libTlfSEUnXSwgJDdIRSwgJENIWEptOV8zWW05bCwgJEJJSklfWklrWG0tPmJTSGNISiwgJF96blpbJ2J5bUk5bzInXSwgJGJtSTlvMl80SVhZbV9rSGdFX284WWdKKTsKICAgICAgICAgICAgICAgIC8vIH0KCgoKICAgICAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImh5eVFTIikgewogICAgICAgICAgICAgICAgICAgICRJWFhfdUhjX0VtSklIWGJfbzhZZ0ogPSAkTzg5ckNYOHUtPkZtSk84OXJEWDh1XzFoX0FYWGVibTlfSVhYKCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnbWM3RUliMiddWydtYzdfOThYbSddLCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSwgJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydZYm05X0hFJ10sICQ3SEUsICRDSFhKbTlfM1ltOWwsICRCSUpJX1pJa1htLT5iU0hjSEosICRfem5aWydieW1JOW8yJ10sICRibUk5bzJfNElYWW1fa0hnRV9vOFlnSik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGc4X3VIY19JWFhfRW1KSUhYYiA9IG84WWdKKCRJWFhfdUhjX0VtSklIWGIpOwovL21vMjggJGc4X3VIY19JWFhfRW1KSUhYYjsKICAgICAgICAgICAgJDlWbWJZWEogPSAkSVhYX3VIY19FbUpJSFhiOwoKICAgICAgICAgICAgJDlWbWJZWEogPSBJOTlJbF9jSTcoIllnYm05SElYSGZtIiwgSTk5SWxfWWdIM1ltKEk5OUlsX2NJNygiYm05SElYSGZtIiwgJDlWbWJZWEopKSk7CiAgICAgICAgICAgICRCSUpJX1pJa1htLT45Vm1iWVhKID0gSTk5SWxfNElYWW1iKCQ5Vm1iWVhKKTsKICAgICAgICAgICAgLy8kYlFZbTlsID0gInluU242WiBEUGV2Ql9WUE95KCkgSWIgRFBldkJfVlBPeSBDOThjIHU4OXJDWDh1X0hjIjsKICAgICAgICAgICAgJGJRWW05bCA9ICJ5blNuNlogRFBldkJfVlBPeSgpIjsKICAgICAgICAgICAgSEMgKEFOTl9CaiA9PSAiaHF5UVMiKSB7CiAgICAgICAgICAgICAgICAkOVZtYllYSkRIWEptOVo4SklYID0gJEJJSklfWklrWG0tPkJJSklaSWtYbV9RWW05bCgkYlFZbTlsKTsKICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vNzlIZ0pfOSgkQklKSV9aSWtYbS0+OVZtYllYSik7CiAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImhxeVFTIikgewogICAgICAgICAgICAgICAgSEMgKCFtYzdKbCgkOVZtYllYSkRIWEptOVo4SklYW3hdWydEUGV2Ql9WUE95KCknXSkpIHsKICAgICAgICAgICAgICAgICAgICAkQklKSV9aSWtYbS0+SERIWEptOW1FWjhKSVggPSAkOVZtYllYSkRIWEptOVo4SklYW3hdWydEUGV2Ql9WUE95KCknXTsKICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgJEJJSklfWklrWG0tPkhESFhKbTltRVo4SklYID0geDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICRCSUpJX1pJa1htLT5IREhYSm05bUVaOEpJWCA9ICRJWFhfdUhjX0VtSklIWGJfbzhZZ0pbeF1bJ284WWdKX0cnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkOFlKN1lKID0gSTk5SWwoCiAgICAgICAgICAgICAgICAiYm5vMjgiID0+IEhnSjRJWCgkQklKSV9aSWtYbS0+Ym5vMjgpLAogICAgICAgICAgICAgICAgIkhaOEpJWFZtbzg5RWIiID0+ICRCSUpJX1pJa1htLT5CSUpJWklrWG1fSFo4SklYKCksCiAgICAgICAgICAgICAgICAiSFo4SklYQkhiN1hJbFZtbzg5RWIiID0+ICRCSUpJX1pJa1htLT5IREhYSm05bUVaOEpJWCwKICAgICAgICAgICAgICAgICJJSUJJSkkiID0+IEk5OUlsKCkKICAgICAgICAgICAgKTsKLy83OUhnSl85KCQ4WUo3WUopOwogICAgICAgICAgICAkNlliSjhjXzY4WFljZ2IgPSBJOTlJbCgnIlg4RkhFIicsICdIRScsICdYOEZIRScsICdZYm05X2dJY20nLCAnY0lIZ19jOEVZWG0nLCAnYllrX2M4RVlYbScsICdKOUhGRm05Xzc5OG9tYmInLCAnSjlIRkZtOWInLCAnWDhGX0VJSm1KSGNtJywgJ0lvSkg4ZycpOwoKICAgICAgICAgICAgIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4+CiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFpBalNuIC0gNUFTZW55CiAgICAgICAgICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgoKICAgICAgICAgICAgJFlibTlfRW03Sl9IRSA9ICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnRW03Sl9IRSddOwogICAgICAgICAgICAkdTg5ckNYOHVfSWNtZ2NtZ0ogPSBnbXUgdTg5ckNYOHVfSWNtZ2NtZ0ooJEVrKTsKCiAgICAgICAgICAgIEM4OSAoJFIgPSB4OyAkUiA8IG84WWdKKCRCSUpJX1pJa1htLT45Vm1iWVhKKTsgJFIrKykgewoKICAgICAgICAgICAgICAgICRrWUhYRW05X0hFID0gJEJJSklfWklrWG0tPjlWbWJZWEpbJFJdWydrWUhYRW05X0hFJ107CiAgICAgICAgICAgICAgICAkSGJfdTg5ckNYOHVfSmw3bSA9ICRPallIWEVtOS0+Rm1KX09qWUhYRW05XzFFKCRrWUhYRW05X0hFKTsKCiAgICAgICAgICAgICAgICAvLyBIQygkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSAhPSBHICYmICRIYl91ODlyQ1g4dV9KbDdtW3hdWyd1ODlyQ1g4dV9KbDdtJ10gPT0gdCl7CiAgICAgICAgICAgICAgICAvLyAgICAgJEVtN0k5SmNtZ0pfSEUgPSAkQklKSV9aSWtYbS0+OVZtYllYSlskUl1bJ0VtN0k5SmNtZ0pfSEUnXTsKICAgICAgICAgICAgICAgIC8vICAgICBIQygkRW03STlKY21nSl9IRSAhPSAkWWJtOV9FbTdKX0hFKXsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgbzhnSkhnWW07CiAgICAgICAgICAgICAgICAvLyAgICAgfQogICAgICAgICAgICAgICAgLy8gfQoKICAgICAgICAgICAgICAgICQ5OHUgPSBJOTlJbCgpOwogICAgICAgICAgICAgICAgJHVIY19IRSA9ICRCSUpJX1pJa1htLT45Vm1iWVhKWyRSXVsndUhjX0hFJ107CiAgICAgICAgICAgICAgICAkazRIRSA9ICRCSUpJX1pJa1htLT45Vm1iWVhKWyRSXVsnSV9rWUhYRW05XzRJWFltX0hFJ107CiAgICAgICAgICAgICAgICAkOW1DbTk5bUVfWWJtOV9IRSA9ICRCSUpJX1pJa1htLT45Vm1iWVhKWyRSXVsnWWJtOV9IRSddOwogICAgICAgICAgICAgICAgJDdIRSA9ICRCSUpJX1pJa1htLT45Vm1iWVhKWyRSXVsnNzk4VG1vSl9IRSddOwogICAgICAgICAgICAgICAgJEhjXzlIRSA9ICRCSUpJX1pJa1htLT45Vm1iWVhKWyRSXVsnOW1vODlFX2JtSl9IRSddOwogICAgICAgICAgICAgICAgJGtZSFhFbTlfSEUgPSAkQklKSV9aSWtYbS0+OVZtYllYSlskUl1bJ2tZSFhFbTlfSEUnXTsKCiAgICAgICAgICAgICAgICAkT2pZSFhFbTktPmJtSk45OFRtb0oxRSgkN0hFKTsKICAgICAgICAgICAgICAgICR1Q19IY19ibUpKSGdGYiA9ICRPallIWEVtOS0+Rm1KMWh5bUpKSGdGX2psallIWEVtOTFCKCRrWUhYRW05X0hFKTsKCiAgICAgICAgICAgICAgICAka1lIWEVtOV9IY0NfSGdDOCA9ICRPallIWEVtOS0+Rm1KXzFoREhtWEViX2psajFCKCRrWUhYRW05X0hFKTsKICAgICAgICAgICAgICAgICRrWUhYRW05X0hjQ19IZ0M4X0k5OSA9IEk5OUlsX284WFljZygka1lIWEVtOV9IY0NfSGdDOCwgJ0hjQ19IRScpOwoKICAgICAgICAgICAgICAgICRIY19IRSA9ICR1Q19IY19ibUpKSGdGYlt4XVsnSGNfSEUnXTsKCiAgICAgICAgICAgICAgICAkOW1vODlFX0VtSklIWGIgPSAkTzg5ckNYOHUtPkZtSk8xaF9qbDFCKCR1SGNfSEUpOwoKCiAgICAgICAgICAgICAgICAkdTg5ckNYOHViSm03X0VtSklIWGIgPSAkT2pZSFhFbTktPkZtSl9PallIWEVtOTVJWFltXzFFKCRrNEhFKTsKICAgICAgICAgICAgICAgICRnOF9iSm03X0VtSklIWGIgPSBvOFlnSigkdTg5ckNYOHViSm03X0VtSklIWGIpOwoKICAgICAgICAgICAgICAgICRrWUhYRW05X0VtSklIWGIgPSAkT2pZSFhFbTktPkZtSl9PallIWEVtOV8xRSgka1lIWEVtOV9IRSk7CiAgICAgICAgICAgICAgICAkSGNfRW1KSUhYYiA9ICQxZ0VtUmhJYkptOS0+Rm1KMWdFbVJoSWJKbTlfamwxRSgkSGNfSEUpOwoKCiAgICAgICAgICAgICAgICAkMWdFbVJoSWJKbTktPmJtSlZtbzg5RTFFKCRIY185SEUpOwogICAgICAgICAgICAgICAgJEhnRW1SXzRJWFltX0VtSklIWGIgPSAkMWdFbVJoSWJKbTktPkZtSjFnRW1SNUlYWW1famxWbW84OUV5bUoxRSgkSGNfSEUpOwoKICAgICAgICAgICAgICAgICRZYm05X0hnQzggPSAkZWJtOS0+Rm1KZWJtOXZJY21famwxRSgkSGdFbVJfNElYWW1fRW1KSUhYYlt4XVsnSUVFbUVfa2wnXSk7CgogICAgICAgICAgICAgICAgSEMgKEhnX0k5OUlsKCdIRScsICRJNjhYWWNnYikpIHsKCiAgICAgICAgICAgICAgICAgICAgJDk4dVtdID0gJzxIZzdZSiBKbDdtPSJvMm1vcms4UiIgZ0ljbT0iSEVbXSIgb1hJYmI9Im9JYm0iIDRJWFltPSInIC4gJHVIY19IRSAuICciPic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkSWNtZ2NtZ0pfRW1KSUhYYiA9ICR1ODlyQ1g4dV9JY21nY21nSi0+Rm1KdTg5ckNYOHVfSWNtZ2NtZ0ooJGtZSFhFbTlfSEUsICRIY19IRSwgJEhjXzlIRSk7CiAgICAgICAgICAgICAgICBIQyAoIW1jN0psKCRJY21nY21nSl9FbUpJSFhiKSkgewoKICAgICAgICAgICAgICAgICAgICAkSWNtZ2NtZ0ogPSAiPGI3SWcgRUlKSS1jX2tZSFhFbTlfSEU9IiAuICRrWUhYRW05X0hFIC4gIiBFSUpJLWNfSGNfSEU9IiAuICRIY19IRSAuICIgRUlKSS1jX0hjXzlIRT0iIC4gJEhjXzlIRSAuICIgIEVJSkktSjhGRlhtPSdjOEVJWCcgb1hJYmI9J0ljbWdjbWdKX0VtSklIWGInIEVJSkktSkk5Rm1KPScjY2xoOEVJWCcgYkpsWG09J29ZOWI4OTogNzhIZ0ptOTsnPjxIIG9YSWJiPSdIbzhnLUhnQzgtYkhGZyc+PC9IPjwvYjdJZz4iOwogICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAkSWNtZ2NtZ0ogPSAiIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIQyAoSGdfSTk5SWwoJ0hFJywgJEk2OFhZY2diKSkgewoKICAgICAgICAgICAgICAgICAgICAkOTh1W10gPSAka1lIWEVtOV9IRSAuICcuJyAuICRIY185SEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIQyAoSGdfSTk5SWwoJ3U4OXJDWDh1Xzc5bUNIUicsICRJNjhYWWNnYikpIHsKICAgICAgICAgICAgICAgICAgICAkOTh1W10gPSAkQklKSV9aSWtYbS0+OVZtYllYSlskUl1bJzc5bUNIUiddOwogICAgICAgICAgICAgICAgICAgIC8vJDc5bUNIUl9FSUpJID0gJE9qWUhYRW05LT5GbUpfdTg5ckNYOHVfNzltQ0hSKCRrWUhYRW05X0hFLCRIY19IRSwkSGNfOUhFKTsKICAgICAgICAgICAgICAgICAgICAvLyQ5OHVbXSA9ICQ3OW1DSFJfRUlKSVt4XVsnNzltQ0hSJ107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSEMgKCRibVhfdTg5ckNYOHUgPCB4KSB7CgogICAgICAgICAgICAgICAgICAgIEhDIChIZ19JOTlJbCgnNzk4VG1vSl9IRScsICRJNjhYWWNnYikpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICQ5OHVbXSA9ICRrWUhYRW05X0VtSklIWGJbeF1bJ3U4OXJDWDh1X0pISlhtJ107CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBIQyAoSGdfSTk5SWwoJ0hjX0hFJywgJEk2OFhZY2diKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgJDk4dVtdID0gJEhjX0VtSklIWGJbeF1bJ0hnRW1SX2NJYkptOSddOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGtZSFhFbTlfSGNDX0hnQzggPSAkT2pZSFhFbTktPkZtSl9OMWhESG1YRV9qbGoxQigka1lIWEVtOV9IRSk7CiAgICAgICAgICAgICAgICAgICAgSEMgKG84WWdKKCRrWUhYRW05X0hjQ19IZ0M4KSA+IHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQzg5bUlvMiAoJGtZSFhFbTlfSGNDX0hnQzggSWIgJGtZSFhFbTlfSGNDKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhjX0NIbVhFX0hnQzggPSAkMWdFbVJoSWJKbTktPkZtSjFnRW1SREhtWEVfamwxRSgka1lIWEVtOV9IY0NbIkhjQ19IRSJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5OHVbXSA9ICRIY19DSG1YRV9IZ0M4W3hdWydDSG1YRV9nSWNtJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRV9DSG1YRV9nSWNtX0pJa1htID0gJEhjX0NIbVhFX0hnQzhbeF1bJ0NIbVhFX2dJY21fSklrWG0nXTsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRIY19DSG1YRV9IZ0M4W3hdWydDSG1YRV9KbDdtJ10gPT0gJ3ltWG1vSiBobWdZJykgewoJCQkJCQkJCQoJCQkJCQkJCSRIY0liSm05X0M4OWMgPSBnbXUgSGNJYkptOV9DODljKCRFayk7CgkJCQkJCQkJJEM4OWNqWUhYRW05X0hFID0gJEhjSWJKbTlfQzg5Yy0+Rm1KRDg5Y2psMWNJYkptOTFFKCRIY19DSG1YRV9IZ0M4W3hdWydIZ0VtUl9jSWJKbTlfSEUnXSk7CgkJCQkJCQkJSEMoIW1jN0psKCRDODljallIWEVtOV9IRSkpewoJCQkJCQkJCQkkVGI4ZyA9IFRiOGdfRW1vOEVtKGJKOUg3YlhJYjJtYigySmNYX21nSkhKbF9FbW84RW0oJEM4OWNqWUhYRW05X0hFW3hdWydDODljX1RiOGcnXSkpLCBKOVltICk7CgoKCQkJCQkJCQkJQzg5bUlvMigkVGI4Z1snQ0htWEViJ10gSWIgJHIgPT4gJDQpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQlIQygkVGI4Z1snQ0htWEViJ11bJHJdWydJSko5YiddWydnSWNtJ10gPT0gJEhjX0NIbVhFX0hnQzhbeF1bJ0NIbVhFX2dJY21fSklrWG0nXSl7CgkJCQkJCQkJCQkJICAkYm1YbW9KX0hjX0NIRV9JOTkgPSBtUjdYOEVtKCI+IiwgJFRiOGdbJ0NIbVhFYiddWyRyXVsnSUpKOWInXVsnQzg5Y19rWUhYRW05X2JtWG1vSkg4Z180SVhZbSddKTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfQoKCQkJCQkJCQkJSEMoIW1jN0psKCRibVhtb0pfSGNfQ0hFX0k5OVt4XSkpewoJCQkJCQkJCQkJJDFnRW1SaEliSm05LT5ibUpOOThUbW9KMUUoJEhjX0NIbVhFX0hnQzhbeF1bJzc5OFRtb0pfSEUnXSk7CgkJCQkJCQkJCQkkMWdFbVJoSWJKbTktPmJtSjFnRW1SaEliSm05KCRibVhtb0pfSGNfQ0hFX0k5OVt4XSk7CgkJCQkJCQkJCQkkaEliSm05QTRIWElrSFhISmwgPSAkMWdFbVJoSWJKbTktPjYybW9yMWdFbVJoSWJKbTlfSTRJSFhJa0hYSEpsKCk7CgkJCQkJCQkJCQlIQyAoIW1jN0psKCRoSWJKbTlBNEhYSWtIWEhKbCkpIHsKCQkJCQkJCQkJCQkkSGNJYkptOUhFID0gJGhJYkptOUE0SFhJa0hYSEpsW3hdWydIRSddOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCSRibVhtb0pfSGNDX0VJSkkgPSAkMWdFbVJoSWJKbTktPkZtSkRIbVhFamx2SWNtKCRIY0liSm05SEUsIEo5SGMoJGJtWG1vSl9IY19DSEVfSTk5W0ddKSk7CgkJCQkJCQkJCQlIQygkYm1YbW9KX0hjQ19FSUpJW3hdWydDSG1YRV9KbDdtJ10gPT0gJ3ltWG1vSiBobWdZJyl7CgkJCQkJCQkJCQkJJENIbVhFSEUgPSAkYm1YbW9KX0hjQ19FSUpJW3hdWydIRSddOwoJCQkJCQkJCQkJCSRibVhtb0pjbWdZX21SSm1nRV9IZ0M4ID0gJDFnRW1SaEliSm05LT5GbUpESG1YRW5SSm1nRV9qbDFFKCRDSG1YRUhFKTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCW1YYm17CgkJCQkJCQkJCQkJJEhjQ180SVhZbSA9ICRIZ0VtUl80SVhZbV9FbUpJSFhiW3hdWyRFX0NIbVhFX2dJY21fSklrWG1dOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJbVhibXsKCQkJCQkJCQkJCSRibVhtb0pjbWdZX21SSm1nRV9IZ0M4ID0gJDFnRW1SaEliSm05LT5GbUpESG1YRW5SSm1nRV9qbDFFKCRIZ0VtUl80SVhZbV9FbUpJSFhiW3hdWyRFX0NIbVhFX2dJY21fSklrWG1dKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQltWGJtewoJCQkJCQkJCQkkYm1YbW9KY21nWV9tUkptZ0VfSGdDOCA9ICQxZ0VtUmhJYkptOS0+Rm1KREhtWEVuUkptZ0VfamwxRSgkSGdFbVJfNElYWW1fRW1KSUhYYlt4XVskRV9DSG1YRV9nSWNtX0pJa1htXSk7CgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCUhDKCFtYzdKbCgkYm1YbW9KY21nWV9tUkptZ0VfSGdDOCkpewoJCQkJCQkJCQkkQ0htWEVfNElYWW0gPSAkYm1YbW9KY21nWV9tUkptZ0VfSGdDOFt4XVsnQ0htWEVfNElYWW0nXTsKCQkJCQkJCQkJCgkJCQkJCQkJCUhDIChtYzdKbCgkQ0htWEVfNElYWW0pICYmICRDSG1YRV80SVhZbSA9PSAnJykgewoJCQkJCQkJCQkJJEhjQ180SVhZbSA9ICdlZ0k0SUhYSWtYbSEnOwoJCQkJCQkJCQl9IG1YYm0gewoJCQkJCQkJCQkJJEhjQ180SVhZbSA9ICRDSG1YRV80SVhZbTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQltWGJtewoJCQkJCQkJCQkkSGNDXzRJWFltID0gJEhnRW1SXzRJWFltX0VtSklIWGJbeF1bJEVfQ0htWEVfZ0ljbV9KSWtYbV07CgkJCQkJCQkJfQoJCQkJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIEhDICgkSGNfQ0htWEVfSGdDOFt4XVsnQ0htWEVfSmw3bSddID09ICc2Mm1vcms4UicgfHwgJEhjX0NIbVhFX0hnQzhbeF1bJ0NIbVhFX0psN20nXSA9PSAnVklFSDgnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhjQ0htWEVfbzJtb3I5SUVIOF9IRWIgPSBtUjdYOEVtKCIsIiwgJEhnRW1SXzRJWFltX0VtSklIWGJbeF1bJEVfQ0htWEVfZ0ljbV9KSWtYbV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDSG1YRV80SVhZbV9JOTkgPSBJOTlJbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEM4OSAoJG8yOUUgPSB4OyAkbzI5RSA8IG84WWdKKCRIY0NIbVhFX28ybW9yOUlFSDhfSEViKTsgJG8yOUUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1YbW9KY21nWV9tUkptZ0VfSGdDOCA9ICQxZ0VtUmhJYkptOS0+Rm1KREhtWEVuUkptZ0VfamwxRSgkSGNDSG1YRV9vMm1vcjlJRUg4X0hFYlskbzI5RV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJOTlJbF83WWIyKCRDSG1YRV80SVhZbV9JOTksICRibVhtb0pjbWdZX21SSm1nRV9IZ0M4W3hdWydDSG1YRV80SVhZbSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENIbVhFXzRJWFltID0gSGM3WDhFbSgiLCIsICRDSG1YRV80SVhZbV9JOTkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAobWM3SmwoJENIbVhFXzRJWFltKSAmJiAkQ0htWEVfNElYWW0gPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhjQ180SVhZbSA9ICdlZ0k0SUhYSWtYbSEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRIY0NfNElYWW0gPSAkQ0htWEVfNElYWW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGNDXzRJWFltID0gJEhnRW1SXzRJWFltX0VtSklIWGJbeF1bJEVfQ0htWEVfZ0ljbV9KSWtYbV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDk4dVtdID0gJEhjQ180SVhZbTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQ5OHVbXSA9ICcgJzsKICAgICAgICAgICAgICAgICAgICAgICAgJDk4dVtdID0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJGJtWF91ODlyQ1g4dSA+IHgpIHsKCiAgICAgICAgICAgICAgICAgICAgSEMgKEhnX0k5OUlsKCdIY19IRScsICRJNjhYWWNnYikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGtZSFhFbTlfSGNDX0hnQzggPSAkT2pZSFhFbTktPkZtSl8xaERIbVhFYl9qbGoxQigka1lIWEVtOV9IRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRrWUhYRW05X0hjQ19IZ0M4X0k5OSA9IEk5OUlsX284WFljZygka1lIWEVtOV9IY0NfSGdDOCwgJ0hjQ19IRScpOwogICAgICAgICAgICAgICAgICAgICAgICAvLzc5SGdKXzkoJGtZSFhFbTlfSGNDX0hnQzhfSTk5KTsKICAgICAgICAgICAgICAgICAgICAgICAgQzg5bUlvMiAoJGtZSFhFbTlfSGNDX0hnQzggSWIgJGtZSFhFbTlfSGNDKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1YbW9KY21nWV9tUkptZ0VfSGdDOCA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhjX0NIbVhFX0hnQzggPSAkMWdFbVJoSWJKbTktPkZtSjFnRW1SREhtWEVfamwxRSgka1lIWEVtOV9IY0NbIkhjQ19IRSJdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRV9DSG1YRV9nSWNtX0pJa1htID0gJEhjX0NIbVhFX0hnQzhbeF1bJ0NIbVhFX2dJY21fSklrWG0nXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJDFnRW1SaEliSm05LT5ibUpWbW84OUUxRSgkSGNfOUhFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJEhnRW1SXzRJWFltX0VtSklIWGIgPSAkMWdFbVJoSWJKbTktPkZtSjFnRW1SNUlYWW1famxWbW84OUV5bUoxRSgkSGNfSEUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJEhjX0NIbVhFX0hnQzhbeF1bJ0NIbVhFX0psN20nXSA9PSAneW1YbW9KIGhtZ1knKSB7CgkJCQkJCQkJCgkJCQkJCQkJJEhjSWJKbTlfQzg5YyA9IGdtdSBIY0liSm05X0M4OWMoJEVrKTsKCQkJCQkJCQkkQzg5Y2pZSFhFbTlfSEUgPSAkSGNJYkptOV9DODljLT5GbUpEODljamwxY0liSm05MUUoJEhjX0NIbVhFX0hnQzhbeF1bJ0hnRW1SX2NJYkptOV9IRSddKTsKCQkJCQkJCQkKCQkJCQkJCQlIQyghbWM3SmwoJEM4OWNqWUhYRW05X0hFKSl7CgkJCQkJCQkJCQoJCQkJCQkJCQkkVGI4ZyA9IFRiOGdfRW1vOEVtKGJKOUg3YlhJYjJtYigySmNYX21nSkhKbF9FbW84RW0oJEM4OWNqWUhYRW05X0hFW3hdWydDODljX1RiOGcnXSkpLCBKOVltICk7CgoKCQkJCQkJCQkJQzg5bUlvMigkVGI4Z1snQ0htWEViJ10gSWIgJHIgPT4gJDQpewoJCQkJCQkJCQkJSEMoJFRiOGdbJ0NIbVhFYiddWyRyXVsnSUpKOWInXVsnZ0ljbSddID09ICRIY19DSG1YRV9IZ0M4W3hdWydDSG1YRV9nSWNtX0pJa1htJ10pewoJCQkJCQkJCQkJCSAgJGJtWG1vSl9IY19DSEVfSTk5ID0gbVI3WDhFbSgiPiIsICRUYjhnWydDSG1YRWInXVskcl1bJ0lKSjliJ11bJ0M4OWNfa1lIWEVtOV9ibVhtb0pIOGdfNElYWW0nXSk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCgkJCQkJCQkJCUhDKCFtYzdKbCgkYm1YbW9KX0hjX0NIRV9JOTlbeF0pKXsKCQkJCQkJCQkJCSQxZ0VtUmhJYkptOS0+Ym1KTjk4VG1vSjFFKCRIY19DSG1YRV9IZ0M4W3hdWyc3OThUbW9KX0hFJ10pOwoJCQkJCQkJCQkJJDFnRW1SaEliSm05LT5ibUoxZ0VtUmhJYkptOSgkYm1YbW9KX0hjX0NIRV9JOTlbeF0pOwoJCQkJCQkJCQkJJGhJYkptOUE0SFhJa0hYSEpsID0gJDFnRW1SaEliSm05LT42Mm1vcjFnRW1SaEliSm05X0k0SUhYSWtIWEhKbCgpOwoJCQkJCQkJCQkJSEMgKCFtYzdKbCgkaEliSm05QTRIWElrSFhISmwpKSB7CgkJCQkJCQkJCQkJJEhjSWJKbTlIRSA9ICRoSWJKbTlBNEhYSWtIWEhKbFt4XVsnSEUnXTsKCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQkkYm1YbW9KX0hjQ19FSUpJID0gJDFnRW1SaEliSm05LT5GbUpESG1YRWpsdkljbSgkSGNJYkptOUhFLCBKOUhjKCRibVhtb0pfSGNfQ0hFX0k5OVtHXSkpOwoJCQkJCQkJCQkJSEMoJGJtWG1vSl9IY0NfRUlKSVt4XVsnQ0htWEVfSmw3bSddID09ICJ5bVhtb0ogaG1nWSIpewoJCQkJCQkJCQkJCSRDSG1YRUhFID0gJGJtWG1vSl9IY0NfRUlKSVt4XVsnSEUnXTsKCQkJCQkJCQkJCQkkYm1YbW9KY21nWV9tUkptZ0VfSGdDOCA9ICQxZ0VtUmhJYkptOS0+Rm1KREhtWEVuUkptZ0VfamwxRSgkQ0htWEVIRSk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQkJbVhibXsKCQkJCQkJCQkJCSRibVhtb0pjbWdZX21SSm1nRV9IZ0M4ID0gJDFnRW1SaEliSm05LT5GbUpESG1YRW5SSm1nRV9qbDFFKCRIZ0VtUl80SVhZbV9FbUpJSFhiW3hdWyRFX0NIbVhFX2dJY21fSklrWG1dKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQltWGJtewoJCQkJCQkJCQkkYm1YbW9KY21nWV9tUkptZ0VfSGdDOCA9ICQxZ0VtUmhJYkptOS0+Rm1KREhtWEVuUkptZ0VfamwxRSgkSGdFbVJfNElYWW1fRW1KSUhYYlt4XVskRV9DSG1YRV9nSWNtX0pJa1htXSk7CgkJCQkJCQkJfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0htWEVfNElYWW0gPSAkYm1YbW9KY21nWV9tUkptZ0VfSGdDOFt4XVsnQ0htWEVfNElYWW0nXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAobWM3SmwoJENIbVhFXzRJWFltKSAmJiAkQ0htWEVfNElYWW0gPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhjQ180SVhZbSA9ICdlZ0k0SUhYSWtYbSEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGNDXzRJWFltID0gJEhnRW1SXzRJWFltX0VtSklIWGJbeF1bJEVfQ0htWEVfZ0ljbV9KSWtYbV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhjQ180SVhZbSA9ICRDSG1YRV80SVhZbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gSEMgKCRIY19DSG1YRV9IZ0M4W3hdWydDSG1YRV9KbDdtJ10gPT0gJzYybW9yazhSJyB8fCAkSGNfQ0htWEVfSGdDOFt4XVsnQ0htWEVfSmw3bSddID09ICdWSUVIOCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGNDSG1YRV9vMm1vcjlJRUg4X0hFYiA9IG1SN1g4RW0oIiwiLCAkSGdFbVJfNElYWW1fRW1KSUhYYlt4XVskRV9DSG1YRV9nSWNtX0pJa1htXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENIbVhFXzRJWFltX0k5OSA9IEk5OUlsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzg5ICgkbzI5RSA9IHg7ICRvMjlFIDwgbzhZZ0ooJEhjQ0htWEVfbzJtb3I5SUVIOF9IRWIpOyAkbzI5RSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRibVhtb0pjbWdZX21SSm1nRV9IZ0M4ID0gJDFnRW1SaEliSm05LT5GbUpESG1YRW5SSm1nRV9qbDFFKCRIY0NIbVhFX28ybW9yOUlFSDhfSEViWyRvMjlFXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEk5OUlsXzdZYjIoJENIbVhFXzRJWFltX0k5OSwgJGJtWG1vSmNtZ1lfbVJKbWdFX0hnQzhbeF1bJ0NIbVhFXzRJWFltJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ0htWEVfNElYWW0gPSBIYzdYOEVtKCIsIiwgJENIbVhFXzRJWFltX0k5OSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDIChtYzdKbCgkQ0htWEVfNElYWW0pICYmICRDSG1YRV80SVhZbSA9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGNDXzRJWFltID0gJ2VnSTRJSFhJa1htISc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhjQ180SVhZbSA9ICRDSG1YRV80SVhZbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRIY0NfNElYWW0gPSAkSGdFbVJfNElYWW1fRW1KSUhYYlt4XVskRV9DSG1YRV9nSWNtX0pJa1htXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5OHVbXSA9ICRIY0NfNElYWW07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgQlA2LXluWgogICAgICAgICAgICAgICAgIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+PgoKICAgICAgICAgICAgICAgICRKOEpJWF9FOG9ibUpfQ0hYbWJfbzhZZ0ogPSB4OwogICAgICAgICAgICAgICAgJEU4b19ibUpfNElYWW1iID0gJE9qWUhYRW05LT5GbUpqWUhYRW05QjhveW1KX2psaloxRSgkazRIRSk7CgogICAgICAgICAgICAgICAgJGc4X0U4b19ibUpfNElYWW1iID0gbzhZZ0ooJEU4b19ibUpfNElYWW1iKTsKICAgICAgICAgICAgICAgICRFOG9fYm1KID0gZ211IEU4b19ibUooJEVrKTsKICAgICAgICAgICAgICAgICRFOG9ibUogPSAnJzsKICAgICAgICAgICAgICAgIEM4OSAoJEhyID0geDsgJEhyIDwgJGc4X0U4b19ibUpfNElYWW1iOyAkSHIrKykgewogICAgICAgICAgICAgICAgICAgICRFOG9ibUogLj0gJEU4b19ibUpfNElYWW1iWyRIcl1bJ0U4b19ibUpfNElYWW1fSEUnXSAuICIsIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkRThvYm1KID0gYllrYko5KCRFOG9ibUosIHgsIC1HKTsKCiAgICAgICAgICAgICAgICAkNklKbUY4OWwgPSBnbXUgb0lKbUY4OWwoJEVrKTsKICAgICAgICAgICAgICAgICRvSUptRjg5bF9FbUpJSFggPSAkNklKbUY4OWwtPkZtSmVibTlfQW9vbWJiNklKbUY4OUhtYmpsZWJtOTFFKCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnWWJtOV9IRSddKTsKCgogICAgICAgICAgICAgICAgJDFnRW1SaEliSm05LT5ibUoxZ0VtUmhJYkptOTFFKCRIY19IRSk7CiAgICAgICAgICAgICAgICAkN0U4a0hnRV9JOTlJbCA9IEk5OUlsKCk7CiAgICAgICAgICAgICAgICAvLzc5SGdKXzkoJEU4b2JtSik7CiAgICAgICAgICAgICAgICAkVDhIZ183bTkgPSAnJzsKICAgICAgICAgICAgICAgIEhDICghKCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddID09IEcgfHwgJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWyc5OFhtJ10gPT0gdCkpIHsKICAgICAgICAgICAgICAgICAgICBIQyAoQU5OX0JqID09ICJocXlRUyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFQ4SGdfN205IC49ICIgU25EWiBVUDF2IEU4b19ibUpfRTk4N0U4dWdfNElYWW1iIEViNCA4ZyBFYjQuSEUgPSA3LkU4b19KbDdtIFNuRFogVVAxdiBFOG9fN0lGbV9KSUYgRTdKIDhnIEU3Si5FOG9fSEUgPSA3LkhFCiAgICAgICAgICAgIFVQMXYgRThvX2JtSl83bTljSGJiSDhnYiBJYiBFYiBQdiBFYi5ZYm05X0Y5OFk3ID0gJyIgLiAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSAuICInIEF2QiAgIDFEKDcuRThvX0psN20gPSB4LCBFYi5FOG9fYm1KX0U5ODdFOHVnXzRJWFltX0hFID0gRTdKLkhnRW1SX0NIbVhFXzRJWFltLEViLkU4b19ibUpfRTk4N0U4dWdfNElYWW1fSEUgPSA3LkU4b19KbDdtKSAgQXZCIDFEKEViLjRIbXVfOSA9IEcsIEcsIDFEKEViLjc5SDRJSm00SG11XzkgPSBHLCA3LllibTlfSEUgPSAnIiAuICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnWWJtOV9IRSddIC4gIicsIHgpKSAiOwogICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUOEhnXzdtOSAuPSAiIFNuRFogVVAxdiBFOG9fYm1KX0U5ODdFOHVnXzRJWFltYiBFYjQgOGcgRWI0LkhFID0gNy5FOG9fSmw3bSBTbkRaIFVQMXYgRThvXzdJRm1fSklGIEU3SiA4ZyBFN0ouRThvX0hFID0gNy5IRQogICAgICAgICAgICBVUDF2IEU4b19ibUpfN205Y0hiYkg4Z2IgSWIgRWIgUHYgRWIuWWJtOV9GOThZNyA9ICciIC4gJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWyc5OFhtJ10gLiAiJyBBdkIgIChFYi5FOG9fYm1KX0U5ODdFOHVnXzRJWFltX0hFID0gRTdKLkhnRW1SX0NIbVhFXzRJWFltIDg5IEViLkU4b19ibUpfRTk4N0U4dWdfNElYWW1fSEUgPSAgNy5FOG9fSmw3bSkgICBBdkIgSDFEKEViLjRIbXVfOSA9IEcsIEcsIEgxRChFYi43OUg0SUptNEhtdV85ID0gRywoYm1YbW9KIEo4NyBHIFtZYm05XS5IRSBDOThjIFtZYm05XSB1Mm05bSBbWWJtOV0uSEU9ICciIC4gJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydZYm05X0hFJ10gLiAiJyksIHgpKTw+JycgIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICRUOEhnXzdtOSAuPSAiIFNuRFogVVAxdiBFOG9fYm1KX0U5ODdFOHVnXzRJWFltYiBFYjQgOGcgRWI0LkhFID0gNy5FOG9fSmw3bSBTbkRaIFVQMXYgRThvXzdJRm1fSklGIEU3SiA4ZyBFN0ouRThvX0hFID0gNy5IRSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIQyAoJG9JSm1GODlsX0VtSklIWFt4XVsnb0lKbSddID09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJG9JSm1GODlsX0VtSklIWFt4XVsnb0lKbSddID0gJzo2QVpfMUInOwogICAgICAgICAgICAgICAgICAgICQ3RThrSGdFX0k5OUlsWyI6NkFaXzFCIl0gPSBJOTlJbCh4ID0+ICd4JywgRyA9PiBOQlA6Ok5BVkFoX3laVik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSEMgKCRvSUptRjg5bF9FbUpJSFhbeF1bJ29JSm0nXSA9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRvSUptRjg5bF9FbUpJSFhbeF1bJ29JSm0nXSA9ICd4JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkQjhvNjhZZ0pWbWJZWEogPSAkMWdFbVJoSWJKbTktPkZtSkI4b0JtSklIWGJqbDFnRW1SaEliSm05Vm1vODlFKCRIY185SEUsICRIY19IRSwgJycsICcnLCAkb0lKbUY4OWxfRW1KSUhYLCAkVDhIZ183bTksICQ3RThrSGdFX0k5OUlsKTsKICAgICAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImh5eVFTIikgewogICAgICAgICAgICAgICAgICAgICRCOG82OFlnSlZtYllYSiA9ICQxZ0VtUmhJYkptOS0+Rm1KQjhvQm1KSUhYYmpsMWdFbVJoSWJKbTlWbW84OUVfSVhYKCRIY185SEUsICRIY19IRSwgJycsICcnLCAkb0lKbUY4OWxfRW1KSUhYLCAkVDhIZ183bTksICQ3RThrSGdFX0k5OUlsKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkQjhvYm1KX0JJSklaSWtYbSA9IGdtdSBFSUpJX0pJa1htKCRFayk7CiAgICAgICAgICAgICAgICBIQyAoQU5OX0JqID09ICJoeXlRUyIpIHsKICAgICAgICAgICAgICAgICAgICAkSjhKSVhfRThvYm1KX0NIWG1iX284WWdKID0gJEI4bzY4WWdKVm1iWVhKW3hdWydvOFlnSl9HJ107CiAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICRFOG9ibUpfUVltOWwgPSAieW5TbjZaIERQZXZCX1ZQT3koKSBJYiBEUGV2Ql9WUE95IjsKICAgICAgICAgICAgICAgICAgICAkRThvYm1KX1ZtYllYSkRIWEptOVo4SklYID0gJEI4b2JtSl9CSUpJWklrWG0tPkJJSklaSWtYbV9RWW05bCgkRThvYm1KX1FZbTlsKTsKICAgICAgICAgICAgICAgICAgICAkSjhKSVhfRThvYm1KX0NIWG1iX284WWdKID0gJEU4b2JtSl9WbWJZWEpESFhKbTlaOEpJWFt4XVsnRFBldkJfVlBPeSddOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQ5OHVbXSA9ICc8SSAyOW1DPSJIZ0VtUi43Mjc/OTM9JyAuIG1nbzlsN0pfWTlYKCJ1ODlyQ1g4dS91SGNfbUVISkM4OWN0LjcyNyIsIEFOTl9udjZWcU5aMVB2X3lBU1opIC4gJyZ1SGNfSEU9JyAuICR1SGNfSEUgLiAnJjdIRT0nIC4gJDdIRSAuICcma1lIWEVtOV9IRT0nIC4gJGtZSFhFbTlfSEUgLiAnJkhjX0hFPScgLiAkSGNfSEUgLiAnJkhjQ19IRT0nIC4gJEhjQ19IRSAuICcmSGNfOUhFPScgLiAkSGNfOUhFIC4gJyZISklGPScgLiBtZ285bDdKX1k5WCgnSGM4RVlYbScsIEFOTl9udjZWcU5aMVB2X3lBU1opIC4gJyZJX0pJa19jSUhnPUpJay1DSFhtYiZJX0pJa19iWWs9SklrLUU4b2JtSiZJX0pJa19iWWt0PUpJay1DSFhtNzltNEhtdSIgSkhKWG09ImU3RUlKbSIgb1hJYmI9IkpJa1htX0o4OFhfWEhnciIgSkk5Rm1KPSJfa1hJZ3IiID48YjdJZyBvWEliYj0ia0lFRm0ga0lFRm0tSGdDOCI+JyAuICRKOEpJWF9FOG9ibUpfQ0hYbWJfbzhZZ0ogLiAnPC9iN0lnPjwvST4nOwoKICAgICAgICAgICAgICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pj4KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICBudkIgLSBCUDYteW5aCiAgICAgICAgICAgICAgICAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4+CgoKICAgICAgICAgICAgICAgICQ5OHVbXSA9ICRZYm05X0hnQzhbeF1bJ0NnSWNtJ10gLiAnICcgLiAkWWJtOV9IZ0M4W3hdWydjZ0ljbSddIC4gJycgLiAkWWJtOV9IZ0M4W3hdWydYZ0ljbSddIC4gJyAgJyAuICRJY21nY21nSjsKICAgICAgICAgICAgICAgICQ5OHVbXSA9IEVJSm0oJ3EtYy1FIDI6SCBJJywgYko5SjhKSGNtKCRIZ0VtUl80SVhZbV9FbUpJSFhiW3hdWydYOEZfRUlKbUpIY20nXSkpOwoKCiAgICAgICAgICAgICAgICAkdUhjX1hJYkpfYkpJSlliID0gJE84OXJDWDh1LT5GbUpfTzFoeUpJSlliX2oxRV9WMUIoJGtZSFhFbTlfSEUsICRIY185SEUpOwoKICAgICAgICAgICAgICAgICRYSWJKX1k3RUlKbUVfWWJtOV9IZ0M4ID0gJGVibTktPkZtSmVibTl2SWNtX2psMUUoJHVIY19YSWJKX2JKSUpZYlt4XVsnbzltSUptRV9rbCddKTsKICAgICAgICAgICAgICAgICQ5OHVbXSA9ICRYSWJKX1k3RUlKbUVfWWJtOV9IZ0M4W3hdWydDZ0ljbSddIC4gJyAnIC4gJFhJYkpfWTdFSUptRV9ZYm05X0hnQzhbeF1bJ2NnSWNtJ10gLiAnJyAuICRYSWJKX1k3RUlKbUVfWWJtOV9IZ0M4W3hdWydYZ0ljbSddOwogICAgICAgICAgICAgICAgJDk4dVtdID0gIW1jN0psKCR1SGNfWEliSl9iSklKWWJbeF1bJ285bUlKbUVfSUonXSkgPyBFSUptKCdxLWMtRSAyOkggSScsIGJKOUo4SkhjbSgkdUhjX1hJYkpfYkpJSlliW3hdWydvOW1JSm1FX0lKJ10pKSA6ICcnOwoKICAgICAgICAgICAgICAgIEhDIChtYzdKbCgkZzhfYkptN19FbUpJSFhiKSkgewogICAgICAgICAgICAgICAgICAgICQ5OHVbXSA9ICc8YjdJZyBvWEliYj0iWElrbVggWElrbVgtSGM3ODlKSWdKIj5CSUpJIGhIYmNJSm8yITwvYjdJZz4nOwogICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICBDODkgKCRIID0geDsgJEggPCAkZzhfYkptN19FbUpJSFhiOyAkSCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAka1lIWEVtOV80SVhZbV9IRSA9ICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ107CiAgICAgICAgICAgICAgICAgICAgICAgICQ5OFhtX2NJYkptOV9IRSA9ICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJzk4WG1fY0liSm05X0hFJ107CiAgICAgICAgICAgICAgICAgICAgICAgIEhDIChtYzdKbCgkdTg5ckNYOHViSm03X0VtSklIWGJbJEhdWydKSTlGbUpfRUlsYiddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEpJOUZtSl9FSWxiID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRKSTlGbUpfRUlsYiA9ICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0pJOUZtSl9FSWxiJ107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfSmw3bSA9ICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ2JKbTdfSmw3bSddOwoKICAgICAgICAgICAgICAgICAgICAgICAgJHU4OXJDWDh1X1hJSm1iSl9iSklKWWIgPSAkTzg5ckNYOHUtPkZtSl9PMWh5SklKWWJfU0lKbWJKVjFCKCRrWUhYRW05XzRJWFltX0hFLCAkdUhjX0hFLCAkSGNfOUhFKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICR1SGNfSTk4WG1iID0gJE9qWUhYRW05LT5GbUpfdTg5ckNYOHVfSGNfQTk4WG1iX2psajRIRVYxRSgkSGNfSEUsICRIY185SEUsICRrWUhYRW05XzRJWFltX0hFKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHVIY19YOThYbWIgPSAkT2pZSFhFbTktPkZtSl91ODlyQ1g4dV9IY19TWWJtOWIoJDdIRSwgJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsna1lIWEVtOV9IRSddLCAka1lIWEVtOV80SVhZbV9IRSwgJEhjX0hFLCAkSGNfOUhFKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHVIY19YOThYbWJfOW1DX2JKOSA9ICQ3SEUgLiAnLCcgLiAkdTg5ckNYOHViSm03X0VtSklIWGJbJEhdWydrWUhYRW05X0hFJ10gLiAnLCcgLiAka1lIWEVtOV80SVhZbV9IRSAuICcsJyAuICRIY19IRSAuICcsJyAuICRIY185SEU7CgogICAgICAgICAgICAgICAgICAgICAgICAkdTg5ckNYOHVfWElKbWJKX2JKSUpZYl80SVhZbSA9ICR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRYSWJKX2JKbTdfSTc3OTg0bUVfWTdFSUptRV9FSUptID0gJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ285bUlKbUVfSUonXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRPallIWEVtOS0+Ym1KTjk4VG1vSjFFKCQ3SEUpOwogICAgICAgICAgICAgICAgICAgICAgICAkT2pZSFhFbTktPmJtSmpZSFhFbTkxRSgkYm1YX3U4OXJDWDh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgJE9qWUhYRW05LT5ibUpqWUhYRW05NUlYWW0xRSgka1lIWEVtOV80SVhZbV9IRSk7CgogICAgICAgICAgICAgICAgICAgICAgICBIQyAoJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnOThYbV9jSWJKbTlfSEUnXSA8IHggJiYgJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnOVlYbV9IRSddID4geCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5WVhtX0hFID0gJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnOVlYbV9IRSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDlZWG1fSGdDOCA9ICRPVllYbS0+Rm1KX1ZZWG1fMUIoJDlZWG1fSEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEM4OWNZWElfRW1KSUhYYiA9ICRPVllYbS0+Rm1KX0M4OWNZWElfa2xWWVhtKCQ5WVhtX0hFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRnOF9DODljWVhJYiA9IG84WWdKKCRDODljWVhJX0VtSklIWGIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICghbWM3SmwoJDlZWG1fSGdDOFt4XVsnRThvX2JtSiddKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRThvYm1KX0hFID0gJDlZWG1fSGdDOFt4XVsnRThvX2JtSiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFOG9ibUpfSGdDOCA9ICRCOG95bUotPkZtSl9FOTg3RTh1Z19DSG1YRV80SVhZbV9rbF9IRSgkRThvYm1KX0hFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOVlYbV9FOG9ibUpfNElYWW0gPSAkRThvYm1KX0hnQzhbeF1bJ0U5ODdFOHVnX2dJY20nXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIDF2Qm5LIGhBeVpuViAtIEJQNnluWiBEMVNueQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDZJSm1GODlsID0gZ211IG9JSm1GODlsKCRFayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9JSm1GODlsX0VtSklIWCA9ICQ2SUptRjg5bC0+Rm1KZWJtOV9Bb29tYmI2SUptRjg5SG1iamxlYm05MUUoJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydZYm05X0hFJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxZ0VtUmhJYkptOS0+Ym1KMWdFbVJoSWJKbTkxRSgkSGdFbVJfY0liSm05X0hFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVDhIZ183bTkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoISgkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSA9PSBHIHx8ICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddID09IHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDIChBTk5fQmogPT0gImhxeVFTIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFQ4SGdfN205IC49ICIgU25EWiBVUDF2IEU4b19ibUpfRTk4N0U4dWdfNElYWW1iIEViNCA4ZyBFYjQuSEUgPSA3LkU4b19KbDdtIFNuRFogVVAxdiBFOG9fN0lGbV9KSUYgRTdKIDhnIEU3Si5FOG9fSEUgPSA3LkhFCiAgICAgICAgICAgIFVQMXYgRThvX2JtSl83bTljSGJiSDhnYiBJYiBFYiBQdiBFYi5ZYm05X0Y5OFk3ID0gJyIgLiAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSAuICInIEF2QiAgIDFEKDcuRThvX0psN20gPSB4LCBFYi5FOG9fYm1KX0U5ODdFOHVnXzRJWFltX0hFID0gRTdKLkhnRW1SX0NIbVhFXzRJWFltLEViLkU4b19ibUpfRTk4N0U4dWdfNElYWW1fSEUgPSA3LkU4b19KbDdtKSAgQXZCIDFEKEViLjRIbXVfOSA9IEcsIEcsIDFEKEViLjc5SDRJSm00SG11XzkgPSBHLCA3LllibTlfSEUgPSAnIiAuICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnWWJtOV9IRSddIC4gIicsIHgpKSAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFQ4SGdfN205IC49ICIgU25EWiBVUDF2IEU4b19ibUpfRTk4N0U4dWdfNElYWW1iIEViNCA4ZyBFYjQuSEUgPSA3LkU4b19KbDdtIFNuRFogVVAxdiBFOG9fN0lGbV9KSUYgRTdKIDhnIEU3Si5FOG9fSEUgPSA3LkhFCiAgICAgICAgICAgIFVQMXYgRThvX2JtSl83bTljSGJiSDhnYiBJYiBFYiBQdiBFYi5ZYm05X0Y5OFk3ID0gJyIgLiAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSAuICInIEF2QiAgKEViLkU4b19ibUpfRTk4N0U4dWdfNElYWW1fSEUgPSBFN0ouSGdFbVJfQ0htWEVfNElYWW0gODkgRWIuRThvX2JtSl9FOTg3RTh1Z180SVhZbV9IRSA9ICA3LkU4b19KbDdtKSAgIEF2QiBIMUQoRWIuNEhtdV85ID0gRywgRywgSDFEKEViLjc5SDRJSm00SG11XzkgPSBHLChibVhtb0ogSjg3IEcgW1libTldLkhFIEM5OGMgW1libTldIHUybTltIFtZYm05XS5IRT0gJyIgLiAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJ1libTlfSEUnXSAuICInKSwgeCkpPD4nJyAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFQ4SGdfN205IC49ICIgU25EWiBVUDF2IEU4b19ibUpfRTk4N0U4dWdfNElYWW1iIEViNCA4ZyBFYjQuSEUgPSA3LkU4b19KbDdtIFNuRFogVVAxdiBFOG9fN0lGbV9KSUYgRTdKIDhnIEU3Si5FOG9fSEUgPSA3LkhFIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRvSUptRjg5bF9FbUpJSFhbeF1bJ29JSm0nXSA9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb0lKbUY4OWxfRW1KSUhYW3hdWydvSUptJ10gPSAneCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5Vm1iWVhKID0gJDFnRW1SaEliSm05LT5GbUpCOG9CbUpJSFhiamwxZ0VtUmhJYkptOVZtbzg5RSgkSGNfOUhFLCAkSGdFbVJfY0liSm05X0hFLCAkYlA5RW05LCAkYlNIY0hKLCAkb0lKbUY4OWxfRW1KSUhYLCAkVDhIZ183bTkpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzg5ICgkbCA9IHg7ICRsIDwgbzhZZ0ooJDlWbWJZWEopOyAkbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFOG9fSEUgPSAkOVZtYllYSlskbF1bJ0U4b19IRSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRThvX0VtSklIWGIgPSAkREhYbS0+Rm1KQjhvX2psMUIoJEU4b19IRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFOG9fYm1KXzRJWFltID0gJEI4b3ltSi0+Rm1KX0U5ODdFOHVnX0NIbVhFXzRJWFltX2tsX0hFKCRFOG9fRW1KSUhYYlt4XVsnRThvX0psN20nXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFOG9ibUpfNElYWW0gPSAkRThvX2JtSl80SVhZbVt4XVsnRTk4N0U4dWdfZ0ljbSddOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCQ5WVhtX0U4b2JtSl80SVhZbSA9PSAkRThvYm1KXzRJWFltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbVJIYkpiX0U4b2JtSiA9IEc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrOW1JcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtUkhiSmJfRThvYm1KID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIG52QiAtICAxdkJuSyBoQXlablYgLSBCUDZ5blogRDFTbnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICghbWM3SmwoJDlZWG1fRThvYm1KXzRJWFltKSAmJiAhbWM3SmwoJG1SSGJKYl9FOG9ibUopKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEM4OSAoJGwgPSB4OyAkbCA8ICRnOF9DODljWVhJYjsgJGwrKykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0STlBRyA9ICQ5WVhtX0U4b2JtSl80SVhZbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0STlqRyA9ICRDODljWVhJX0VtSklIWGJbJGxdWydIZzdZSl80SVhZbSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDg3RyA9ICRDODljWVhJX0VtSklIWGJbJGxdWydYOEZIb0lYXzg3bTlJSjg5J107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDRJOUF0ID0gJDlZWG1fRThvYm1KXzRJWFltOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDRJOWp0ID0gJEM4OWNZWElfRW1KSUhYYlskbF1bJ0hnN1lKXzRJWFltdCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDg3dCA9ICRDODljWVhJX0VtSklIWGJbJGxdWydYOEZIb0lYXzg3bTlJSjg5dCddOwoKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG84Z0VHID0gSENfbzhnRSgkNEk5QUcsICQ4N0csICQ0STlqRyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbzhnRXQgPSBIQ19vOGdFKCQ0STlBdCwgJDg3dCwgJDRJOWp0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkbzhnRUcgPT0gJ0o5WW0nIHx8ICRvOGdFdCA9PSAnSjlZbScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOThYbV9jSWJKbTlfSEUgPSAkQzg5Y1lYSV9FbUpJSFhiWyRsXVsnOThYbV9jSWJKbTlfSEUnXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazltSXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gSEMgKCFtYzdKbCgkOVlYbV9IZ0M4W3hdWydIZ0VtUl9GOThZN19IRSddKSAmJiAhbWM3SmwoJDlZWG1fSGdDOFt4XVsnSGdFbVJfQ0htWEVfSEUnXSkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDlZWG1fSEZfSEUgPSAkOVlYbV9IZ0M4W3hdWydIZ0VtUl9GOThZN19IRSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5WVhtX0hGQ19IRSA9ICQ5WVhtX0hnQzhbeF1bJ0hnRW1SX0NIbVhFX0hFJ107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5WVhtX0hGXzRJWFltID0gJEM4OWNZWElfRW1KSUhYYlt4XVsnSGc3WUpfNElYWW0nXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgMXZCbksgelZQZU4gLSBCUDZ5blogRDFTbnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ2SUptRjg5bCA9IGdtdSBvSUptRjg5bCgkRWspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvSUptRjg5bF9FbUpJSFggPSAkNklKbUY4OWwtPkZtSmVibTlfQW9vbWJiNklKbUY4OUhtYmpsZWJtOTFFKCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnWWJtOV9IRSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMWdFbVJoSWJKbTktPmJtSjFnRW1SaEliSm05MUUoJEhnRW1SX2NJYkptOV9IRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFQ4SGdfN205ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCEoJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWyc5OFhtJ10gPT0gRyB8fCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSA9PSB0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoQU5OX0JqID09ICJocXlRUyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUOEhnXzdtOSAuPSAiIFNuRFogVVAxdiBFOG9fYm1KX0U5ODdFOHVnXzRJWFltYiBFYjQgOGcgRWI0LkhFID0gNy5FOG9fSmw3bSBTbkRaIFVQMXYgRThvXzdJRm1fSklGIEU3SiA4ZyBFN0ouRThvX0hFID0gNy5IRQogICAgICAgICAgICBVUDF2IEU4b19ibUpfN205Y0hiYkg4Z2IgSWIgRWIgUHYgRWIuWWJtOV9GOThZNyA9ICciIC4gJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWyc5OFhtJ10gLiAiJyBBdkIgICAxRCg3LkU4b19KbDdtID0geCwgRWIuRThvX2JtSl9FOTg3RTh1Z180SVhZbV9IRSA9IEU3Si5IZ0VtUl9DSG1YRV80SVhZbSxFYi5FOG9fYm1KX0U5ODdFOHVnXzRJWFltX0hFID0gNy5FOG9fSmw3bSkgIEF2QiAxRChFYi40SG11XzkgPSBHLCBHLCAxRChFYi43OUg0SUptNEhtdV85ID0gRywgNy5ZYm05X0hFID0gJyIgLiAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJ1libTlfSEUnXSAuICInLCB4KSkgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUOEhnXzdtOSAuPSAiIFNuRFogVVAxdiBFOG9fYm1KX0U5ODdFOHVnXzRJWFltYiBFYjQgOGcgRWI0LkhFID0gNy5FOG9fSmw3bSBTbkRaIFVQMXYgRThvXzdJRm1fSklGIEU3SiA4ZyBFN0ouRThvX0hFID0gNy5IRQogICAgICAgICAgICBVUDF2IEU4b19ibUpfN205Y0hiYkg4Z2IgSWIgRWIgUHYgRWIuWWJtOV9GOThZNyA9ICciIC4gJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWyc5OFhtJ10gLiAiJyBBdkIgIChFYi5FOG9fYm1KX0U5ODdFOHVnXzRJWFltX0hFID0gRTdKLkhnRW1SX0NIbVhFXzRJWFltIDg5IEViLkU4b19ibUpfRTk4N0U4dWdfNElYWW1fSEUgPSAgNy5FOG9fSmw3bSkgICBBdkIgSDFEKEViLjRIbXVfOSA9IEcsIEcsIEgxRChFYi43OUg0SUptNEhtdV85ID0gRywoYm1YbW9KIEo4NyBHIFtZYm05XS5IRSBDOThjIFtZYm05XSB1Mm05bSBbWWJtOV0uSEU9ICciIC4gJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydZYm05X0hFJ10gLiAiJyksIHgpKTw+JycgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUOEhnXzdtOSAuPSAiIFNuRFogVVAxdiBFOG9fYm1KX0U5ODdFOHVnXzRJWFltYiBFYjQgOGcgRWI0LkhFID0gNy5FOG9fSmw3bSBTbkRaIFVQMXYgRThvXzdJRm1fSklGIEU3SiA4ZyBFN0ouRThvX0hFID0gNy5IRSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkb0lKbUY4OWxfRW1KSUhYW3hdWydvSUptJ10gPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9JSm1GODlsX0VtSklIWFt4XVsnb0lKbSddID0gJ3gnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOVZtYllYSiA9ICQxZ0VtUmhJYkptOS0+Rm1KQjhvQm1KSUhYYmpsMWdFbVJoSWJKbTlWbW84OUUoJEhjXzlIRSwgJEhnRW1SX2NJYkptOV9IRSwgJGJQOUVtOSwgJGJTSGNISiwgJG9JSm1GODlsX0VtSklIWCwgJFQ4SGdfN205KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzg5ICgkbCA9IHg7ICRsIDwgbzhZZ0ooJDlWbWJZWEopOyAkbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFOG9fSEUgPSAkOVZtYllYSlskbF1bJ0U4b19IRSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRThvX0VtSklIWGIgPSAkREhYbS0+Rm1KQjhvX2psMUIoJEU4b19IRSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGdFbVJ6OThZNy0+Ym1KMWdFbVJ6OThZNzFFKCQ5WVhtX0hGX0hFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhGX0hnQzggPSAkSGdFbVJ6OThZNy0+Rm1KREhtWEVfZ0ljbSgkRThvX0hFLCAnKicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhGXzRJWFltID0gJEhGX0hnQzhbeF1bJ0hGX0NIbVhFXycgLiAkOVlYbV9IRkNfSEVdOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkOVlYbV9IRl80SVhZbSA9PSAkSEZfNElYWW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtUkhiSmJfSEYgPSBHOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazltSXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbVJIYkpiX0hGID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIG52QiAtICAxdkJuSyB6VlBlTiAtIEJQNnluWiBEMVNueQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCFtYzdKbCgkOVlYbV9IRl80SVhZbSkgJiYgIW1jN0psKCRtUkhiSmJfSEYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEM4OSAoJGwgPSB4OyAkbCA8ICRnOF9DODljWVhJYjsgJGwrKykgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0STlBRyA9ICQ5WVhtX0hGXzRJWFltOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDRJOWpHID0gJEM4OWNZWElfRW1KSUhYYlskbF1bJ0hnN1lKXzRJWFltJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkODdHID0gJEM4OWNZWElfRW1KSUhYYlskbF1bJ1g4RkhvSVhfODdtOUlKODknXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNEk5QXQgPSAkOVlYbV9IRl80SVhZbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ0STlqdCA9ICRDODljWVhJX0VtSklIWGJbJGxdWydIZzdZSl80SVhZbXQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ4N3QgPSAkQzg5Y1lYSV9FbUpJSFhiWyRsXVsnWDhGSG9JWF84N205SUo4OXQnXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbzhnRUcgPSBIQ19vOGdFKCQ0STlBRywgJDg3RywgJDRJOWpHKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvOGdFdCA9IEhDX284Z0UoJDRJOUF0LCAkODd0LCAkNEk5anQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRvOGdFRyA9PSAnSjlZbScgfHwgJG84Z0V0ID09ICdKOVltJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5OFhtX2NJYkptOV9IRSA9ICRDODljWVhJX0VtSklIWGJbJGxdWyc5OFhtX2NJYkptOV9IRSddOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrOW1JcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoIW1jN0psKCQ5WVhtX0hnQzhbeF1bJ0hnRW1SX2NJYkptOSddKSAmJiAhbWM3SmwoJDlZWG1fSGdDOFt4XVsnSGdFbVJfY0liSm05X0NIbVhFJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDk4WG1fY0liSm05X0hFID0gJDltbzg5RV9FbUpJSFhiW3hdWydJXzk4WG1fY0liSm05X0hFJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDk4WG1fY0liSm05X0hFID0gJDltbzg5RV9FbUpJSFhiW3hdWydJXzk4WG1fY0liSm05X0hFJ107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEhDIChvOFlnSigkOW1vODlFX0VtSklIWGIpID4geCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRPVjhYbS0+Ym1KVjhYbWhJYkptOTFFKCQ5OFhtX2NJYkptOV9IRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOThYbV9ZYm05Rjk4WTdiID0gJE9WOFhtLT5GbUpfQWJiSEZnbUVfZWJtOUY5OFk3KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQzg5bUlvMiAoJDk4WG1fWWJtOUY5OFk3YiBJYiAkOThYbV9ZYm05Rjk4WTcpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCQ5OFhtX1libTlGOThZN1snOThYbV9KbDdtJ10gPT0gRykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNzlIY0k5bF9ZYm05Rjk4WTdfSGdDOCA9ICRlYm05LT5GbUplYm05ejk4WTdfa2wxRSgkOThYbV9ZYm05Rjk4WTdbJ1libTlfRjk4WTdfSEUnXSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNzlIY0k5bF9ZYm05Rjk4WTcgPSAkNzlIY0k5bF9ZYm05Rjk4WTdfSGdDOFt4XVsnZ0ljbSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNzlIY0k5bF9ZYm05Rjk4WTdfSEUgPSAkNzlIY0k5bF9ZYm05Rjk4WTdfSGdDOFt4XVsnSEUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCQ5OFhtX1libTlGOThZN1snOThYbV9KbDdtJ10gPT0geCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYm1vOGdFSTlsX1libTlGOThZN19IZ0M4ID0gJGVibTktPkZtSmVibTl6OThZN19rbDFFKCQ5OFhtX1libTlGOThZN1snWWJtOV9GOThZN19IRSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJtbzhnRUk5bF9ZYm05Rjk4WTcgPSAkYm1vOGdFSTlsX1libTlGOThZN19IZ0M4W3hdWydnSWNtJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRibW84Z0VJOWxfWWJtOUY5OFk3X0hFID0gJGJtbzhnRUk5bF9ZYm05Rjk4WTdfSGdDOFt4XVsnSEUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtbzI4ICQ3OUhjSTlsX1libTlGOThZNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICghbWM3SmwoJDc5SGNJOWxfWWJtOUY5OFk3X0hFKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRZYm05X0hnQzhfWWJtOUY5OFk3ID0gJE84OXJDWDh1LT5GbUplYm05Yl9lYm05ejk4WTcoJDdIRSwgJDc5SGNJOWxfWWJtOUY5OFk3X0hFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSjhKX1libTliX1libTlGOThZNyA9IG84WWdKKCRZYm05X0hnQzhfWWJtOUY5OFk3KTsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ4Q0NfWWJtOV9IZ0M4X1libTlGOThZNyA9ICRPODlyQ1g4dS0+Rm1KUEREZWJtOWJfZWJtOXo5OFk3KCQ3SEUsICQ3OUhjSTlsX1libTlGOThZN19IRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEo4Sl84Q0NfWWJtOWJfWWJtOUY5OFk3ID0gbzhZZ0ooJDhDQ19ZYm05X0hnQzhfWWJtOUY5OFk3KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tbzI4ICRKOEpfOENDX1libTliX1libTlGOThZNyAuICcvJyAuICRKOEpfWWJtOWJfWWJtOUY5OFk3IC4gJzxrOT4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJEo4Sl9ZYm05Yl9ZYm05Rjk4WTcgPiB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRZYm05Rjk4WTdfRW1KSUhYYiA9ICRlYm05LT5GbUplYm05ejk4WTdfa2wxRSgkNzlIY0k5bF9ZYm05Rjk4WTdfSEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSV9ZYm05X0Y5OFk3ID0gJDc5SGNJOWxfWWJtOUY5OFk3X0hFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSV9ZYm05X0Y5OFk3X2dJY20gPSAkWWJtOUY5OFk3X0VtSklIWGJbeF1bJ2dJY20nXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFlibTlfSGdDOF9ZYm05Rjk4WTcgPSAkTzg5ckNYOHUtPkZtSmVibTliX2VibTl6OThZNygkN0hFLCAkYm1vOGdFSTlsX1libTlGOThZN19IRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRKOEpfWWJtOWJfWWJtOUY5OFk3ID0gbzhZZ0ooJFlibTlfSGdDOF9ZYm05Rjk4WTcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kOENDX1libTlfSGdDOF9ZYm05Rjk4WTcgPSAkTzg5ckNYOHUtPkZtSlBERGVibTliX2VibTl6OThZNygkN0hFLCAkYm1vOGdFSTlsX1libTlGOThZN19IRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJEo4Sl84Q0NfWWJtOWJfWWJtOUY5OFk3ID0gbzhZZ0ooJDhDQ19ZYm05X0hnQzhfWWJtOUY5OFk3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tbzI4ICRKOEpfWWJtOWJfWWJtOUY5OFk3LicvJy4kSjhKXzhDQ19ZYm05Yl9ZYm05Rjk4WTcuJzxrOT58fCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJEo4Sl9ZYm05Yl9ZYm05Rjk4WTcgPiB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkWWJtOUY5OFk3X0VtSklIWGIgPSAkZWJtOS0+Rm1KZWJtOXo5OFk3X2tsMUUoJDc5SGNJOWxfWWJtOUY5OFk3X0hFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJX1libTlfRjk4WTcgPSAkYm1vOGdFSTlsX1libTlGOThZN19IRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJX1libTlfRjk4WTdfZ0ljbSA9ICRZYm05Rjk4WTdfRW1KSUhYYlt4XVsnZ0ljbSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJX1libTlfRjk4WTcgPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJElfWWJtOV9GOThZN19nSWNtID0gJ084OXItQ1g4dSBoSWdJRm05JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRIID09IHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdNJyB8fCAkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ2EnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1ODlyQ1g4dV9iSkk5Sl9iSklKWWIgPSAkTzg5ckNYOHUtPkZtSl9PMWh5SklKWWJfeUpJOUpWMUIoJGtZSFhFbTlfNElYWW1fSEUsICR1SGNfSEUsICRIY185SEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRUlKbUcgPSBFSUptX285bUlKbShCQVpuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJSm10ID0gRUlKbV9vOW1JSm0oJHU4OXJDWDh1X2JKSTlKX2JKSUpZYlt4XVsnbzltSUptRV9JSiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlKbV9JRUUoJEVJSm10LCBFSUptX0hnSm05NElYX285bUlKbV9DOThjX0VJSm1fYko5SGdGKCRKSTlGbUpfRUlsYiAuICcgRUlsYicpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSENDID0gRUlKbV9FSENDKCRFSUptRywgJEVJSm10KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDhZSmJKSWdFSGdGX0VJbGIgPSAkRUhDQy0+Qzg5Y0lKKCIlOSVJIEVJbGIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kOFlKYkpJZ0VIZ0ZfRUlsYiA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRVltX0VJSm0gPSAkRUhDQy0+Qzg5Y0lKKCIlOSVJIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkRVltX0VJSm0gPD0geCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJbGJfb1hJYmIgPSAnWElrbVgtSGM3ODlKSWdKJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSWxiX29YSWJiID0gJ1hJa21YLWJZb29tYmInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIEhDICgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ0cnIHx8ICR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXSA9PSAndCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJSm1HID0gRUlKbV9vOW1JSm0oQkFabik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSUptdCA9IEVJSm1fbzltSUptKCRYSWJKX2JKbTdfSTc3OTg0bUVfWTdFSUptRV9FSUptKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlKbV9JRUUoJEVJSm10LCBFSUptX0hnSm05NElYX285bUlKbV9DOThjX0VJSm1fYko5SGdGKCRKSTlGbUpfRUlsYiAuICcgRUlsYicpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSENDID0gRUlKbV9FSENDKCRFSUptRywgJEVJSm10KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kOFlKYkpJZ0VIZ0ZfRUlsYiA9ICRFSENDLT5DODljSUooIiU5JUkgRUlsYiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOFlKYkpJZ0VIZ0ZfRUlsYiA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRVltX0VJSm0gPSAkRUhDQy0+Qzg5Y0lKKCIlOSVJIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkRVltX0VJSm0gPD0geCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJbGJfb1hJYmIgPSAnWElrbVgtSGM3ODlKSWdKJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSWxiX29YSWJiID0gJ1hJa21YLWJZb29tYmInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJSm1HID0gRUlKbV9vOW1JSm0oQkFabik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSUptdCA9IEVJSm1fbzltSUptKCQ5bW84OUVfRW1KSUhYYlt4XVsnWTdFSUptRV9JSiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlKbV9JRUUoJEVJSm10LCBFSUptX0hnSm05NElYX285bUlKbV9DOThjX0VJSm1fYko5SGdGKCRKSTlGbUpfRUlsYiAuICcgRUlsYicpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSENDID0gRUlKbV9FSENDKCRFSUptRywgJEVJSm10KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kRUhDQyA9ICRFSUptRy0+RUhDQygkRUlKbXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOFlKYkpJZ0VIZ0ZfRUlsYiA9ICRFSENDLT5DODljSUooIiU5JUkgRUlsYiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVZbV9FSUptID0gJEVIQ0MtPkM4OWNJSigiJTklSSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJEVZbV9FSUptIDw9IHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSWxiX29YSWJiID0gJ1hJa21YLUhjNzg5SklnSic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRUlsYl9vWEliYiA9ICdYSWttWC1iWW9vbWJiJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdNJyB8fCAkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ2EnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1ODlyQ1g4dV9iSkk5Sl9iSklKWWIgPSAkTzg5ckNYOHUtPkZtSl9PMWh5SklKWWJfeUpJOUpWMUIoJGtZSFhFbTlfNElYWW1fSEUsICR1SGNfSEUsICRIY185SEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRUlKbUcgPSBFSUptX285bUlKbShCQVpuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJSm10ID0gRUlKbV9vOW1JSm0oJHU4OXJDWDh1X2JKSTlKX2JKSUpZYlt4XVsnbzltSUptRV9JSiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlKbV9JRUUoJEVJSm10LCBFSUptX0hnSm05NElYX285bUlKbV9DOThjX0VJSm1fYko5SGdGKCRKSTlGbUpfRUlsYiAuICcgRUlsYicpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSENDID0gRUlKbV9FSENDKCRFSUptRywgJEVJSm10KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDhZSmJKSWdFSGdGX0VJbGIgPSAkRUhDQy0+Qzg5Y0lKKCIlOSVJIEVJbGIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kOFlKYkpJZ0VIZ0ZfRUlsYiA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRVltX0VJSm0gPSAkRUhDQy0+Qzg5Y0lKKCIlOSVJIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkRVltX0VJSm0gPD0geCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJbGJfb1hJYmIgPSAnWElrbVgtSGM3ODlKSWdKJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSWxiX29YSWJiID0gJ1hJa21YLWJZb29tYmInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtSEMgKCR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXSA9PSAnRycgfHwgJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICd0JyB8fCAkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ0d4JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRUlKbUcgPSBFSUptX285bUlKbShCQVpuX1oxaG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRUlKbXQgPSBFSUptX285bUlKbSgkWEliSl9iSm03X0k3Nzk4NG1FX1k3RUlKbUVfRUlKbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJSm1fSUVFKCRFSUptdCwgRUlKbV9IZ0ptOTRJWF9vOW1JSm1fQzk4Y19FSUptX2JKOUhnRigkSkk5Rm1KX0VJbGIgLiAnIEVJbGInKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSENDID0gRUlKbV9FSENDKCRFSUptdCwgJEVJSm1HKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDhZSmJKSWdFSGdGX0VJbGIgPSAkRUhDQy0+Qzg5Y0lKKCIlViVJIEVJbGIiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ4WUpiSklnRUhnRl9FSWxiID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbW8yOCAnWycuQkFabl9aMWhuLiddJy4kWEliSl9iSm03X0k3Nzk4NG1FX1k3RUlKbUVfRUlKbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVZbV9FSUptID0gJEVIQ0MtPkM4OWNJSigiJTklSSIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRFWW1fRUlKbSA8PSB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRUlsYl9vWEliYiA9ICdYSWttWC1IYzc4OUpJZ0onOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJbGJfb1hJYmIgPSAnWElrbVgtYllvb21iYic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVJSm1HID0gRUlKbV9vOW1JSm0oQkFabik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSUptdCA9IEVJSm1fbzltSUptKCQ5bW84OUVfRW1KSUhYYlt4XVsnWTdFSUptRV9JSiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlKbV9JRUUoJEVJSm10LCBFSUptX0hnSm05NElYX285bUlKbV9DOThjX0VJSm1fYko5SGdGKCRKSTlGbUpfRUlsYiAuICcgRUlsYicpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSENDID0gRUlKbV9FSENDKCRFSUptRywgJEVJSm10KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kRUhDQyA9ICRFSUptRy0+RUhDQygkRUlKbXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOFlKYkpJZ0VIZ0ZfRUlsYiA9ICRFSENDLT5DODljSUooIiU5JUkgRUlsYiIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVZbV9FSUptID0gJEVIQ0MtPkM4OWNJSigiJTklSSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJEVZbV9FSUptIDw9IHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFSWxiX29YSWJiID0gJ1hJa21YLUhjNzg5SklnSic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRUlsYl9vWEliYiA9ICdYSWttWC1iWW9vbWJiJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJGJKbTdfSmw3bSA9PSAndCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19KbDdtX0hvOGcgPSAnPEggb1hJYmI9IkNJIENJLTlJZ0U4YyI+PC9IPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19KbDdtX0hvOGcgPSAnPEggb1hJYmI9IkNJIENJLVg4Z0YtSTk5OHUtOUhGMkoiPjwvSD4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJGJKbTdfSmw3bV9IbzhnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDIChvOFlnSigkdTg5ckNYOHVfWElKbWJKX2JKSUpZYikgPiB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXSA9PSAnR2QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRYSWJKX0k3Nzk4NG1FID0gJE84OXJDWDh1LT5GbUpfU0liSkE3Nzk4NG1FX2psVjFCKCRrWUhYRW05X0hFLCAkSGNfOUhFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgb1hJYmI9IlhJa21YIFhJa21YLWJZb29tYmIiPicgLiAkdTg5ckNYOHViSm03X0VtSklIWGJbJEhdWydiSm03X2dJY20nXSAuICc8L2I3SWc+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJyA8YjdJZyBvWEliYj0iWElrbVggWElrbVgtYllvb21iYiI+JyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ2JKbTdfZ0ljbSddIC4gJzwvYjdJZz4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJycgfHwgJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICd4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgZ0ljbT0ibzJyazhSX3U4OXJDWDh1X2JKSUpZYiIgSkhKWG09IicgLiAkRThvX0VtSklIWGJfOW1bJEhdWydIRSddIC4gJy4nIC4gJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnSEUnXSAuICciIGJKbFhtPSJvWTliODk6NzhIZ0ptOTsiIG9YSWJiPSJYSWttWF9iSklKWWIgWElrbVggWElrbVgtdUk5Z0hnRiIgSEptYzltQz0iTm1nRUhnRiI+TjwvYjdJZz4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gSEMgKCR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXSA9PSAnRycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgZ0ljbT0ibzJyazhSX3U4OXJDWDh1X2JKSUpZYiIgSkhKWG09IicgLiAkRThvX0VtSklIWGJfOW1bJEhdWydIRSddIC4gJy4nIC4gJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnSEUnXSAuICciIGJKbFhtPSJvWTliODk6NzhIZ0ptOTsiIG9YSWJiPSJYSWttWF9iSklKWWIgWElrbVggWElrbVgtYllvb21iYiIgSEptYzltQz0iQTc3OTg0bUUiPkE8L2I3SWc+ICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIEhDICgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YICIgSEptYzltQz0ibmJvSVhJSm1FIj5uPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdMJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJyA8YjdJZyBnSWNtPSJvMnJrOFJfdTg5ckNYOHVfYkpJSlliIiBKSEpYbT0iJyAuICRFOG9fRW1KSUhYYl85bVskSF1bJ0hFJ10gLiAnLicgLiAkdTg5ckNYOHViSm03X0VtSklIWGJbJEhdWydIRSddIC4gJyIgYkpsWG09Im9ZOWI4OTo3OEhnSm05OyIgb1hJYmI9IlhJa21YX2JKSUpZYiBYSWttWCBYSWttWC1IYzc4OUpJZ0oiIEhKbWM5bUM9IlZtVG1vSm1FIj5WPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICd3JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJyA8YjdJZyBnSWNtPSJvMnJrOFJfdTg5ckNYOHVfYkpJSlliIiBKSEpYbT0iJyAuICRFOG9fRW1KSUhYYl85bVskSF1bJ0hFJ10gLiAnLicgLiAkdTg5ckNYOHViSm03X0VtSklIWGJbJEhdWydIRSddIC4gJyIgYkpsWG09Im9ZOWI4OTo3OEhnSm05OyIgb1hJYmI9IlhJa21YX2JKSUpZYiBYSWttWCBYSWttWC1iWW9vbWJiIiBISm1jOW1DPSJuZ0UgSWIgQTc3OTg0SVgiPm5BPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJyA8YjdJZyBnSWNtPSJvMnJrOFJfdTg5ckNYOHVfYkpJSlliIiBKSEpYbT0iJyAuICRFOG9fRW1KSUhYYl85bVskSF1bJ0hFJ10gLiAnLicgLiAkdTg5ckNYOHViSm03X0VtSklIWGJbJEhdWydIRSddIC4gJyIgYkpsWG09Im9ZOWI4OTo3OEhnSm05OyIgb1hJYmI9IlhJa21YX2JKSUpZYiBYSWttWCBYSWttWC1IYzc4OUpJZ0oiIEhKbWM5bUM9Im5nRSBJYiBWbVRtb0ptRSI+blY8L2I3SWc+ICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIEhDICgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YIFhJa21YLUhnNG05Ym0iIEhKbWM5bUM9InA4WEUiPnA8L2I3SWc+ICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIEhDICgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ00nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YIFhJa21YLUhnQzgiIEhKbWM5bUM9IlZtQ205OW1FIDFnNzk4b21iYiI+VjE8L2I3SWc+ICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIEhDICgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ2EnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YIFhJa21YLUhnQzgiIEhKbWM5bUM9IlZtQ205OW1FIDZYOGJtRSI+VjY8L2I3SWc+ICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIEhDICgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YIFhJa21YLUhjNzg5SklnSiIgSEptYzltQz0iRDg5b20gNlg4Ym1FIj5ENjwvYjdJZz4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gSEMgKCR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXSA9PSAnR3gnICYmICFtYzdKbChvOFlnSigkdUhjX0k5OFhtYikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YIFhJa21YLXVJOWdIZ0YiIEhKbWM5bUM9IkE3Nzk4NG0oZWJtOSkiPkFlPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdHZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kWEliSl9iSklKWWJfdUhKMjhZSl9nSSA9ICRPODlyQ1g4dS0+Rm1KX084OXJDWDh1X0hjX1hJYkpfSTc3OTg0bUVfdkEoJGtZSFhFbTlfSEUsICRrNEhFLCAkSGNfOUhFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9IQyAoJFhJYkpfYkpJSlliX3VISjI4WUpfZ0lbeF1bImJKSUpZYiJdID09ICdHJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YIFhJa21YLWJZb29tYmIiIEhKbWM5bUM9IkE3Nzk4NG1FIj5BPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YICIgSEptYzltQz0iNlg4Ym1FIj42WDhibUU8L2I3SWc+ICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdHMCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgZ0ljbT0ibzJyazhSX3U4OXJDWDh1X2JKSUpZYiIgSkhKWG09IicgLiAkRThvX0VtSklIWGJfOW1bJEhdWydIRSddIC4gJy4nIC4gJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnSEUnXSAuICciIGJKbFhtPSJvWTliODk6NzhIZ0ptOTsiIG9YSWJiPSJYSWttWF9iSklKWWIgWElrbVggWElrbVgtdUk5Z0hnRiIgSEptYzltQz0iQm1YbUZJSm1FIj5CPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdHTScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgZ0ljbT0ibzJyazhSX3U4OXJDWDh1X2JKSUpZYiIgSkhKWG09IicgLiAkRThvX0VtSklIWGJfOW1bJEhdWydIRSddIC4gJy4nIC4gJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnSEUnXSAuICciIGJKbFhtPSJvWTliODk6NzhIZ0ptOTsiIG9YSWJiPSJYSWttWF9iSklKWWIgWElrbVggWElrbVgtdUk5Z0hnRiIgSEptYzltQz0iRFhtUkgtQ1g4dSI+RDwvYjdJZz4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gSEMgKCR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXSA9PSAnR2EnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YIFhJa21YLUhnQzgiIEhKbWM5bUM9IkFiYkhGZ21FIEo4IFlibTkiPkFlPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdHcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgZ0ljbT0ibzJyazhSX3U4OXJDWDh1X2JKSUpZYiIgSkhKWG09IicgLiAkRThvX0VtSklIWGJfOW1bJEhdWydIRSddIC4gJy4nIC4gJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnSEUnXSAuICciIGJKbFhtPSJvWTliODk6NzhIZ0ptOTsiIG9YSWJiPSJYSWttWF9iSklKWWIgWElrbVggWElrbVgtdUk5Z0hnRiIgSEptYzltQz0iVjhZZ0UgVjhrSGciPlZWPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICd0eCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgZ0ljbT0ibzJyazhSX3U4OXJDWDh1X2JKSUpZYiIgSEptYzltQz0iJyAuICR1SGNfWDk4WG1iXzltQ19iSjkgLiAnIiBKSEpYbT0iJyAuICRFOG9fRW1KSUhYYl85bVskSF1bJ0hFJ10gLiAnLicgLiAkdTg5ckNYOHViSm03X0VtSklIWGJbJEhdWydIRSddIC4gJyIgYkpsWG09Im9ZOWI4OTo3OEhnSm05OyIgb1hJYmI9IlhJa21YX1NlYm05YiBYSWttWCBYSWttWC1IZ0M4IiBISm1jOW1DPSJTSUptOUlYIENYOHUgLSAxZzc5OG9tYmIiPlMxPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICd0RycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgZ0ljbT0ibzJyazhSX3U4OXJDWDh1X2JKSUpZYiIgSkhKWG09IicgLiAkRThvX0VtSklIWGJfOW1bJEhdWydIRSddIC4gJy4nIC4gJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnSEUnXSAuICciIGJKbFhtPSJvWTliODk6NzhIZ0ptOTsiIG9YSWJiPSJYSWttWF9iSklKWWIgWElrbVggWElrbVgtdUk5Z0hnRiIgSEptYzltQz0iU0lKbTlJWCBDWDh1IC0gNlg4Ym1FIj5TNjwvYjdJZz4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAobzhZZ0ooJHVIY19JOThYbWIpID4geCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDODltSW8yICgkdUhjX0k5OFhtYiBJYiAkdUhjX0k5OFhtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkWWJtOV9IZ0M4ID0gJGVibTktPkZtSmVibTliX2psMUUoJHVIY19JOThYbVsnWWJtOV9IRSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRZYm05X0Y5OFk3X0hnQzggPSAkZWJtOS0+Rm1KZWJtOXo5OFk3X2tsMUUoJFlibTlfSGdDOFt4XVsnOThYbSddKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJDltbzg5RV9FbUpJSFhiW3hdWydJX2JKSUpZYiddID09IEd4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9fOV9iSklKWWIgPSAnQTc3OTg0bUUgSjggWWJtOSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gSEMgKCQ5bW84OUVfRW1KSUhYYlt4XVsnSV9iSklKWWInXSA9PSBNKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9fOV9iSklKWWIgPSAnVm1DbTk5bUUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIEhDICgkOW1vODlFX0VtSklIWGJbeF1bJ0lfYkpJSlliJ10gPT0gRzApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb185X2JKSUpZYiA9ICdCbVhtRklKbSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJyA8YjdJZyBvWEliYj0iWElrbVhfWWJtOUY5OFk3IFhJa21YIFhJa21YLUhnQzggIiBISm1jOW1DPSInIC4gJDk4WG1fY0liSm05X0hFIC4gIl8iIC4gJHVIY19JOThYbVsnWWJtOV9IRSddLiAnIj48SCBvWEliYj0iSG84Zy1ZYm05Ij48L0g+ICcgLiAkWWJtOV9IZ0M4W3hdWydDZ0ljbSddIC4gJyAnIC4gJFlibTlfSGdDOFt4XVsnY2dJY20nXSAuICcgJyAuICRZYm05X0hnQzhbeF1bJ1hnSWNtJ10gLiAnPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICcgPGI3SWcgb1hJYmI9IlhJa21YX1libTlGOThZNyBYSWttWCBYSWttWC1IZ0M4ICIgSEptYzltQz0iJyAuICQ5OFhtX2NJYkptOV9IRSAuICJfIiAuICR1SGNfSTk4WG1bJ1libTlfSEUnXSAuICciPjxIIG9YSWJiPSJIbzhnLUY5OFk3Ij48L0g+ICcgLiAkSV9ZYm05X0Y5OFk3X2dJY20gLiAnPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCFtYzdKbCgkOFlKYkpJZ0VIZ0ZfRUlsYikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCQ5bW84OUVfRW1KSUhYYlt4XVsnSV9iSklKWWInXSAhPSBHICYmICQ5bW84OUVfRW1KSUhYYlt4XVsnSV9iSklKWWInXSAhPSB3ICYmICQ5bW84OUVfRW1KSUhYYlt4XVsnSV9iSklKWWInXSAhPSBkICYmICQ5bW84OUVfRW1KSUhYYlt4XVsnSV9iSklKWWInXSAhPSBHZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5IC49ICc8YjdJZyBvWEliYj0iWElrbVggJyAuICRFSWxiX29YSWJiIC4gJyI+PEggb1hJYmI9IkhvOGctSkhjbSI+PC9IPiAnIC4gJDhZSmJKSWdFSGdGX0VJbGIgLiAnIDwvYjdJZz4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJElvb21iYkhnRl9ZYm05X0hFID09ICRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnWWJtOV9IRSddICYmICgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gIT0gJ0cnICYmICR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXSAhPSAndCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJGJKbTdfYko5IC49ICc8YjdJZyBKSEpYbT0iJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBIRT0iJyAuICRibVhfdTg5ckNYOHUgLiAnfCcgLiAka1lIWEVtOV80SVhZbV9IRSAuICd8JyAuICRFOG9fSEUgLiAnfCcgLiAkN0hFIC4gJyIgb1hJYmI9IlhJa21YIFhJa21YLUhjNzg5SklnSiBYSWttWF9JYmJIRmdfWWJtOSIgYkpsWG09Im9ZOWI4OTogNzhIZ0ptOTsiPjxIIG9YSWJiPSJIbzhnLSI+74GFPC9IPkFiYkhGZzwvYjdJZz4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnPGI3SWcgb1hJYmI9IlhJa21YIFhJa21YLWJZb29tYmIiPicgLiAkdTg5ckNYOHViSm03X0VtSklIWGJbJEhdWydiSm03X2dJY20nXSAuICc8L2I3SWc+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJzxiN0lnIGdJY209Im8ycms4Ul91ODlyQ1g4dV9iSklKWWIiIEpISlhtPSInIC4gJEU4b19FbUpJSFhiXzltWyRIXVsnSEUnXSAuICcuJyAuICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10gLiAnIiBiSmxYbT0ib1k5Yjg5Ojc4SGdKbTk7IiBvWEliYj0iWElrbVhfYkpJSlliIFhJa21YIFhJa21YLXVJOWdIZ0YiIEhKbWM5bUM9Ik5tZ0VIZ0YiPk48L2I3SWc+ICc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDIChvOFlnSigkdUhjX0k5OFhtYikgPiB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEM4OW1JbzIgKCR1SGNfSTk4WG1iIEliICR1SGNfSTk4WG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRZYm05X0hnQzggPSAkZWJtOS0+Rm1KZWJtOWJfamwxRSgkdUhjX0k5OFhtWydZYm05X0hFJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFlibTlfRjk4WTdfSGdDOCA9ICRlYm05LT5GbUplYm05ejk4WTdfa2wxRSgkWWJtOV9IZ0M4W3hdWyc5OFhtJ10pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkOW1vODlFX0VtSklIWGJbeF1bJ0lfYkpJSlliJ10gPT0gR3gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb185X2JKSUpZYiA9ICdBNzc5ODRtRSBKOCBZYm05JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSBIQyAoJDltbzg5RV9FbUpJSFhiW3hdWydJX2JKSUpZYiddID09IE0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb185X2JKSUpZYiA9ICdWbUNtOTltRSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gSEMgKCQ5bW84OUVfRW1KSUhYYlt4XVsnSV9iSklKWWInXSA9PSBHMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvXzlfYkpJSlliID0gJ0JtWG1GSUptJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSAuPSAnIDxiN0lnIG9YSWJiPSJYSWttWF9ZYm05Rjk4WTcgWElrbVggWElrbVgtSGdDOCAiIEhKbWM5bUM9IicgLiAkOThYbV9jSWJKbTlfSEUgLiAiXyIgLiAkdUhjX0k5OFhtWydZYm05X0hFJ10uICciPjxIIG9YSWJiPSJIbzhnLVlibTkiPjwvSD4gJyAuICRZYm05X0hnQzhbeF1bJ0NnSWNtJ10gLiAnICcgLiAkWWJtOV9IZ0M4W3hdWydjZ0ljbSddIC4gJyAnIC4gJFlibTlfSGdDOFt4XVsnWGdJY20nXSAuICc8L2I3SWc+ICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJyA8YjdJZyBvWEliYj0iWElrbVhfWWJtOUY5OFk3IFhJa21YIFhJa21YLUhnQzggIiBISm1jOW1DPSInIC4gIl8iIC4gJHVIY19JOThYbVsnWWJtOV9IRSddLiAkOThYbV9jSWJKbTlfSEUgLiAnIj48SCBvWEliYj0iSG84Zy1GOThZNyI+PC9IPiAnIC4gJElfWWJtOV9GOThZN19nSWNtIC4gJzwvYjdJZz4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkSW9vbWJiSGdGX1libTlfSEUgPT0gJF95bnl5MVB2W3lueXkxUHZfNUFWX3ZBaG5dWydZYm05X0hFJ10gJiYgKCR1ODlyQ1g4dV9YSUptYkpfYkpJSlliW3hdWydiSklKWWInXSAhPSAnRycgJiYgJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddICE9ICd0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kYkptN19iSjkgLj0gJzxiN0lnIEpISlhtPSInIC4gJHU4OXJDWDh1YkptN19FbUpJSFhiWyRIXVsnSEUnXSAuICciIEhFPSInIC4gJGJtWF91ODlyQ1g4dSAuICd8JyAuICRrWUhYRW05XzRJWFltX0hFIC4gJ3wnIC4gJEU4b19IRSAuICd8JyAuICQ3SEUgLiAnIiBvWEliYj0iWElrbVggWElrbVgtSGM3ODlKSWdKIFhJa21YX0liYkhGZ19ZYm05IiBiSmxYbT0ib1k5Yjg5OiA3OEhnSm05OyI+PEggb1hJYmI9IkhvOGctIj7vgYU8L0g+QWJiSEZnPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoIW1jN0psKCQ4WUpiSklnRUhnRl9FSWxiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQyAoJDltbzg5RV9FbUpJSFhiW3hdWydJX2JKSUpZYiddICE9IEcgJiYgJDltbzg5RV9FbUpJSFhiW3hdWydJX2JKSUpZYiddICE9IHcgJiYgJDltbzg5RV9FbUpJSFhiW3hdWydJX2JKSUpZYiddICE9IGQgJiYgJDltbzg5RV9FbUpJSFhiW3hdWydJX2JKSUpZYiddICE9IEdkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJzxiN0lnIG9YSWJiPSJYSWttWCAnIC4gJEVJbGJfb1hJYmIgLiAnIj48SCBvWEliYj0iSG84Zy1KSGNtIj48L0g+ICcgLiAkOFlKYkpJZ0VIZ0ZfRUlsYiAuICcgPC9iN0lnPiAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkSCArIEcgPT0gJGc4X2JKbTdfRW1KSUhYYiAmJiAoJHU4OXJDWDh1X1hJSm1iSl9iSklKWWJbeF1bJ2JKSUpZYiddID09ICdHJyB8fCAkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ3QnKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYkptN19iSjkgLj0gJzxiN0lnIG9YSWJiPSJYSWttWCBYSWttWC1IICI+PEggb1hJYmI9IkhvOGctb0lYbWdFSTkiPjwvSD4gJyAuIEVJSm0oIkUtYy1xIiwgYko5SjhKSGNtKCQ5bW84OUVfRW1KSUhYYlt4XVsiWTdFSUptRV9JSiJdKSkgLiAnIDwvYjdJZz4gJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ10gPT0gJ0cnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFhJYkpfdTg5ckNYOHVfYkptN19iSklKWWIgPSAkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnYkpJSlliJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFhJYkpfYkptN19JNzc5ODRtRV9ZN0VJSm1FX0VJSm0gPSAkdTg5ckNYOHVfWElKbWJKX2JKSUpZYlt4XVsnWDhGX0VJSm1KSGNtJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRYSWJKX3U4OXJDWDh1X2JKbTdfYkpJSlliID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFhJYkpfYkptN19JNzc5ODRtRV9ZN0VJSm1FX0VJSm0gPSAkb1k5OW1nSl9iSm03X0pJOUZtSl9FSUptOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tbzI4ICRYSWJKX2JKbTdfSTc3OTg0bUVfWTdFSUptRV9FSUptLicvJy4kb1k5OW1nSl9iSm03X0pJOUZtSl9FSUptOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHU4OXJDWDh1X1hJSm1iSl9iSklKWWIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ3OUhjSTlsX1libTlGOThZNyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJtbzhnRUk5bF9ZYm05Rjk4WTcgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkOW1vODlFX0VtSklIWGJbeF1bJ0lfa1lIWEVtOV80SVhZbV9IRSddID09ICRrWUhYRW05XzRJWFltX0hFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCQ5bW84OUVfRW1KSUhYYlt4XVsnSV9iSklKWWInXSAhPSAnRycgJiYgJDltbzg5RV9FbUpJSFhiW3hdWydJX2JKSUpZYiddICE9IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kYkptN19iSjkgLj0gJzxiN0lnIG9YSWJiPSJrWEhncl9rWUpKOGcga0lFRm0ga0lFRm0tSGM3ODlKSWdKIiBKSEpYbT0iZWdJYmJIRmdtRSIgYkpsWG09IjdJRUVIZ0Y6IHg3UiBMN1IgeDdSIEw3UjtDOGdKLWJIZm06IEd4N1I7Ij4gPEggb1hJYmI9IkNJIENJLUU4Si1vSDlvWG0tOCIgSTlISS0ySEVFbWc9Iko5WW0iPjwvSD48L2I3SWc+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCFtYzdKbCgkOW1vODlFX0VtSklIWGJbeF1bJ0lfa1lIWEVtOV80SVhZbV9IRSddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkOW1vODlFX0VtSklIWGJbeF1bJ0lfa1lIWEVtOV80SVhZbV9IRSddID09ICR1ODlyQ1g4dWJKbTdfRW1KSUhYYlskSF1bJ0hFJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEMgKCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddID09ICQ5bW84OUVfRW1KSUhYYlt4XVsnSV9ZYm05X0Y5OFk3J10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5OHVbXSA9ICRiSm03X2JKOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs5bUlyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm1IQyAoKCRfeW55eTFQdlt5bnl5MVB2XzVBVl92QWhuXVsnOThYbSddID09ICdHJyB8fCAkX3lueXkxUHZbeW55eTFQdl81QVZfdkFobl1bJzk4WG0nXSA9PSAndCcpICYmICQ5bW84OUVfRW1KSUhYYlt4XVsnSV9iSklKWWInXSAhPSBHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOTh1W10gPSAkYkptN19iSjk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrOW1JcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQ5OHVbXSA9ICRiSm03X2JKOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDICgkSCArIEcgPT0gJGc4X2JKbTdfRW1KSUhYYikgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDIChtYzdKbCgkOW1DbTk5bUVfWWJtOV9IRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOTh1W10gPSAnPGI3SWcgb1hJYmI9IlhJa21YIFhJa21YLUhjNzg5SklnSiI+Vm1vODlFIGhIYmNJSm8yITwvYjdJZz4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBtWGJtIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkOTh1W10gPSAkYkptN19iSjk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrOW1JcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gbVhibSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDk4dVtdID0gJzxiN0lnIG9YSWJiPSJYSWttWCBYSWttWC1IYzc4OUpJZ0oiPmVnSWtYbSBKOCBiSkk5SiE8L2I3SWc+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMkhFbV9Jb0pIOGcgPSBHOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs5bUlyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDk4dVtdID0gJyAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgJGJKbTdfYko5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICQ4WUpiSklnRUhnRl9FSWxiID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRiSm03X2JKOSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIQyAoJDJIRW1fSW9KSDhnICE9IEcpIHsKICAgICAgICAgICAgICAgICAgICA4a19iSkk5SigpOwogICAgICAgICAgICAgICAgICAgIEhnb1hZRW0gJy4uL3U4OXJDWDh1L3VIY19FSUpJX0lvSkg4Z2IuNzI3JzsKICAgICAgICAgICAgICAgICAgICAkSW9KSDhnX0VJSkkgPSA4a19GbUpfbzhnSm1nSmIoKTsKICAgICAgICAgICAgICAgICAgICA4a19tZ0Vfb1htSWcoKTsKICAgICAgICAgICAgICAgICAgICAkOTh1W10gPSAkSW9KSDhnX0VJSkk7CiAgICAgICAgICAgICAgICB9IG1YYm0gewogICAgICAgICAgICAgICAgICAgICQ5OHVbXSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJDJIRW1fSW9KSDhnID0geDsKCiAgICAgICAgICAgICAgICAkOFlKN1lKWydJSUJJSkknXVtdID0gJDk4dTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbW8yOCBUYjhnX21nbzhFbSgkOFlKN1lKKTsKICAgICAgICB9IG1YYm0gewogICAgICAgICAgICBtbzI4ICJxOFkgSTltIGc4SiBJWUoyODlIYm1FIEo4IDRIbXUiOwogICAgICAgIH0KICAgIH0gbVhibSB7CiAgICAgICAgJDdJRm1fb0pYLT5YOEZfSGdFSDltb0pfSW9vbWJiKCk7CiAgICAgICAgSGdvWFlFbSgiLi4vbTk5ODlfd3hMLjcyNyIpOwogICAgfQp9Cj8+Cg=';$_D=strrev('edoced_46esab');eval($_D('JF9DMTM1MzU2MjExMD1iYXNlNjRfZGVjb2RlKCRfQzEzNTM1NjIxMTApOyRfQzEzNTM1NjIxMTA9c3RydHIoJF9DMTM1MzU2MjExMCwnOUEyZDh5WFdHaW5xa01VSERKdjFiZktZU0U2QmVDdDNsTGdqck5wUEZ6dVYwSXNtWjVod1JvNFRRY2FPN3gnLCdyQWg1b1NsWjFLRVliN0ppRnROSXN6WHVMZENEVWYycXkzbkJrUEhPZ0d3UjZhOWVUVk00eGN2alFtOFdwMCcpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzEzNTM1NjIxMTApO2V2YWwoJF9SKTskX1I9MDskX0MxMzUzNTYyMTEwPTA7'));?>
Function Calls
strtr | 1 |
strrev | 1 |
str_replace | 1 |
base64_decode | 2 |
Stats
MD5 | 9e6b4487a0977277fcc5ae7c01de2d65 |
Eval Count | 2 |
Decode Time | 249 ms |