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 /* Copyright (c) Nicsoft LLC */ eval( '?>' . base64_decode('PD9waHAKCmluY2x1ZGUgJy4u..
Decoded Output download
?>b'<?php
include \'../inc/auth_header.php\';
include \'ASP_FormElements.php\';
include \'ASP_CodeBehindElements.php\';
include \'ASP_ConfirmationElements.php\';
include \'ASP_BuilderElements.php\';
include \'ASP_CommonElements.php\';
class ASP_Parser {
private $formElement;
private $temp_master_string;
private $temp_page_string;
private $temp_form_string;
private $temp_xml_string;
private $temp_php_string;
private $codeBehindElement = NULL;
private $pageArray;
private $samePage_array = array();
public function __construct() {
$this->formElement = new ASP_FormElements();
$this->codeBehindElement = new ASP_CodeBehindElements();
$this->confirmElement = new ASP_ConfirmationElements();
$this->builderElement = new ASP_BuilderElements();
$this->commonElement = new ASP_CommonElements();
$this->pageArray = array();
}
public function parse_asp_form($xml_schema_data){
$this->temp_master_string = \'\';
$this->temp_form_string = \'\';
$this->temp_field_string = \'\';
try{
$xml = new SimpleXMLElement($xml_schema_data);
} catch(Exception $e){
echo $e;
die;
}
foreach ($xml->page as $idx=>$page){
$this->temp_form_string = \'\';
$js_lib_move = \'\';
$has_auto_suggest = 0;
$has_colorpicker = 0;
$has_jslider = 0;
if((int) $page->jslibrary == ""){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery/jquery.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery.min.js\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/jquery/jquery.min.js\"></script>";
}
if((int) $page->jslibrary == 1){
@mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
copy("../movefiles/jslibs/prototype.js", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'prototype.js\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/prototype.js\"></script>";
}
if((int) $page->jslibrary == 2){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\' . \'scriptaculous/\', DIRECTORY_MOD);
copy("../movefiles/jslibs/prototype.js", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'prototype.js\');
copy("../movefiles/jslibs/scriptaculous/scriptaculous.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'scriptaculous.js\');
copy("../movefiles/jslibs/scriptaculous/effects.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'effects.js\');
copy("../movefiles/jslibs/scriptaculous/dragdrop.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'dragdrop.js\');
copy("../movefiles/jslibs/scriptaculous/builder.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'builder.js\');
mkdir("../../output/forms/{$xml->jobname}" . \'/js/tooltips\', DIRECTORY_MOD);
$this->dircopy("../movefiles/jslibs/tooltips", "../../output/forms/{$xml->jobname}" . \'/js/tooltips/\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/prototype.js\"></script>";
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/scriptaculous/scriptaculous.js?load=effects,dragdrop,builder\"></script>";
$js_lib_move .= "
<!-- tooltips -->";
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/tooltips/tooltips.js\"></script>";
$js_lib_move .= "
<link rel=\"stylesheet\" type=\"text/css\" href=\"js/tooltips/tooltips.css\"/>";
$js_lib_move .= <<< EOF
<script type="text/javascript">
document.observe(\'dom:loaded\', function(){
$$(".fb-tooltip").each( function(link) {
new Tooltip(link, {});
});
});
</script>
EOF;
}
if((int) $page->jslibrary == 3){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\' . \'scriptaculous/\', DIRECTORY_MOD);
copy("../movefiles/jslibs/prototype.js", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'prototype.js\');
copy("../movefiles/jslibs/scriptaculous/scriptaculous.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'scriptaculous.js\');
copy("../movefiles/jslibs/scriptaculous/effects.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'effects.js\');
copy("../movefiles/jslibs/scriptaculous/dragdrop.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'dragdrop.js\');
copy("../movefiles/jslibs/scriptaculous/builder.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'builder.js\');
copy("../movefiles/jslibs/scriptaculous/controls.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'controls.js\');
copy("../movefiles/jslibs/scriptaculous/slider.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'slider.js\');
copy("../movefiles/jslibs/scriptaculous/sound.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'sound.js\');
mkdir("../../output/forms/{$xml->jobname}" . \'/js/tooltips\', DIRECTORY_MOD);
$this->dircopy("../movefiles/jslibs/tooltips", "../../output/forms/{$xml->jobname}" . \'/js/tooltips/\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/prototype.js\"></script>";
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/scriptaculous/scriptaculous.js\"></script>";
$js_lib_move .= "
<!-- tooltips -->";
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/tooltips/tooltips.js\"></script>";
$js_lib_move .= "
<link rel=\"stylesheet\" type=\"text/css\" href=\"js/tooltips/tooltips.css\"/>";
$js_lib_move .= <<< EOF
<script type="text/javascript">
document.observe(\'dom:loaded\', function(){
$$(".fb-tooltip").each( function(link) {
new Tooltip(link, {});
});
});
</script>
EOF;
}
if((int) $page->jslibrary == 4){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
copy("../movefiles/jslibs/dojo.js", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'dojo.js\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/dojo.js\"></script>";
}
if((int) $page->jslibrary == 5){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
$this->dircopy("../movefiles/jslibs/dojoroot", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'dojoroot/\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/dojoroot/dojo/dojo.js\"></script>";
}
if((int) $page->jslibrary == 6){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery/jquery.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery.min.js\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/jquery/jquery.min.js\"></script>";
}
if((int) $page->jslibrary == 7){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery/jquery-full.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery-full.js\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/jquery/jquery-full.js\"></script>";
}
if((int) $page->jslibrary == 8){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery/jquery.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery.min.js\');
copy("../movefiles/jslibs/jquery/jquery-ui-1.8.2.core.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery-ui-1.8.2.core.min.js\');
$this->dircopy("../movefiles/jslibs/jquery/css", "../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\');
$js_lib_move = "<!-- jquery includes -->
";
$js_lib_move .= "<link type=\"text/css\" href=\"js/jquery/css/ui-lightness/jquery-ui-1.8.2.custom.css\" rel=\"stylesheet\" />
";
$js_lib_move .= "<script type=\"text/javascript\" src=\"js/jquery/jquery.min.js\"></script>
";
$js_lib_move .= "<script type=\"text/javascript\" src=\"js/jquery/jquery-ui-1.8.2.core.min.js\"></script>";
}
if((int) $page->jslibrary == 9){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery/jquery.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery.min.js\');
copy("../movefiles/jslibs/jquery/jquery-ui-1.8.2.full.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery-ui-1.8.2.full.min.js\');
$this->dircopy("../movefiles/jslibs/jquery/css", "../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\');
$js_lib_move = "<!-- jquery includes -->
";
$js_lib_move .= "<link type=\"text/css\" href=\"js/jquery/css/ui-lightness/jquery-ui-1.8.2.custom.css\" rel=\"stylesheet\" />
";
$js_lib_move .= "<script type=\"text/javascript\" src=\"js/jquery/jquery.min.js\"></script>
";
$js_lib_move .= "<script type=\"text/javascript\" src=\"js/jquery/jquery-ui-1.8.2.full.min.js\"></script>";
}
if((int) $page->jslibrary == 10){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery/jquery.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery.min.js\');
copy("../movefiles/jslibs/jquery/jquery-ui-1.8.2.full.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery-ui-1.8.2.full.min.js\');
$this->dircopy("../movefiles/jslibs/jquery/css", "../../output/forms/{$xml->jobname}" . \'/js/jquery/css/\');
$js_lib_move = "<!-- jquery includes -->
";
$js_lib_move .= "<link type=\"text/css\" href=\"js/jquery/css/custom-theme/jquery-ui-1.8.2.custom.css\" rel=\"stylesheet\" />
";
$js_lib_move .= "<script type=\"text/javascript\" src=\"js/jquery/jquery.min.js\"></script>
";
$js_lib_move .= "<script type=\"text/javascript\" src=\"js/jquery/jquery-ui-1.8.2.full.min.js\"></script>";
}
if((int) $page->jslibrary == 11){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery.mobile/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery.mobile/\', DIRECTORY_MOD);
}
$this->dircopy("../movefiles/jslibs/jquery.mobile", "../../output/forms/{$xml->jobname}" . \'/js/jquery.mobile/\');
$js_lib_move = "<!-- jQuery Mobile Includes -->
";
$js_lib_move .= "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
$js_lib_move .= "<link rel=\"stylesheet\" href=\"js/jquery.mobile/jquery.mobile.min.css\" />";
$js_lib_move .= "<script src=\"js/jquery.mobile/jquery.min.js\"></script>";
$js_lib_move .= "<script src=\"js/jquery.mobile/jquery.mobile.min.js\"></script>";
}
$js_lib_move_conditional = \'\';
if((int)$page->jslibrary != 2 || (int)$page->jslibrary != 3){
foreach($page->form->field as $fld){
if((int)$fld->conditional->animation != 0){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\' . \'scriptaculous/\', DIRECTORY_MOD);
copy("../movefiles/jslibs/prototype.js", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'prototype.js\');
copy("../movefiles/jslibs/scriptaculous/scriptaculous.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'scriptaculous.js\');
copy("../movefiles/jslibs/scriptaculous/effects.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'effects.js\');
copy("../movefiles/jslibs/scriptaculous/dragdrop.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'dragdrop.js\');
$js_lib_move_conditional = "<script type=\"text/javascript\" src=\"js/prototype.js\"></script>";
$js_lib_move_conditional .= "
<script type=\"text/javascript\" src=\"js/scriptaculous/scriptaculous.js?load=effects,dragdrop\"></script>";
}
}
}
if($page->additionaljslibrary != \'\' && $page->additionaljslibrary != \'0\'){
if(file_exists("../movefiles/additional-jslibs/{$page->additionaljslibrary}/rackforms-include-code.txt")){
$additional_js_include_code = file_get_contents("../movefiles/additional-jslibs/{$page->additionaljslibrary}/rackforms-include-code.txt");
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\' . $page->additionaljslibrary . \'/\', DIRECTORY_MOD);
$this->dircopy("../movefiles/additional-jslibs/{$page->additionaljslibrary}", "../../output/forms/{$xml->jobname}" . "/js/{$page->additionaljslibrary}/");
$js_lib_move = "<!-- RackForms Additional JS Library -->";
$js_lib_move .= $additional_js_include_code;
}
}
$js_lib_move_tooltips = "";
$hasTooltips = false;
foreach($page->form->field as $fld){
if((string)$fld->tooltip->text != ""){
$hasTooltips = true;
}
}
if($hasTooltips == true){
$t = (int)$page->jslibrary;
if($t != 6 && $t != 7 && $t != 8 && $t != 9 && $t != 10){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/gfx/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/gfx/\', DIRECTORY_MOD);
}
$this->dircopy("../movefiles/jslibs/jquery/tools/gfx", "../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/gfx/\');
copy("../movefiles/jslibs/jquery/tools/jquery.tools.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/\' . \'jquery.tools.min.js\');
copy("../movefiles/jslibs/jquery/jquery.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery.min.js\');
$js_lib_move_tooltips = "<script type=\"text/javascript\" src=\"js/jquery/jquery.min.js\"></script>
";
$js_lib_move_tooltips .= "<script type=\"text/javascript\" src=\"js/jquery/tools/jquery.tools.min.js\"></script>";
$js_lib_move_tooltips .= <<<EOH
<script type="text/javascript">
jQuery.noConflict();
var \$j = jQuery;
</script>
<style type="text/css">
/* simple css-based tooltip */
.fbtooltip {
background-color:#000;
border:1px solid #fff;
padding:10px 15px;
width:200px;
display:none;
color:#fff;
text-align:left;
font-size:12px;
/* outline radius for mozilla/firefox only */
-moz-box-shadow:0 0 10px #000;
-webkit-box-shadow:0 0 10px #000;
}
</style>
EOH;
} else {
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/gfx/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/gfx/\', DIRECTORY_MOD);
}
$this->dircopy("../movefiles/jslibs/jquery/tools/gfx", "../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/gfx/\');
copy("../movefiles/jslibs/jquery/tools/jquery.tools.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/tools/\' . \'jquery.tools.min.js\');
$js_lib_move_tooltips = "<script type=\"text/javascript\" src=\"js/jquery/tools/jquery.tools.min.js\"></script>";
$js_lib_move_tooltips .= <<<EOH
<script type="text/javascript">
jQuery.noConflict();
var \$j = jQuery;
</script>
<style type="text/css">
/* simple css-based tooltip */
.fbtooltip {
background-color:#000;
border:1px solid #fff;
padding:10px 15px;
width:200px;
display:none;
color:#fff;
text-align:left;
font-size:12px;
/* outline radius for mozilla/firefox only */
-moz-box-shadow:0 0 10px #000;
-webkit-box-shadow:0 0 10px #000;
}
</style>
EOH;
}
}
$ajax_js_included = false; $calculation_js_included = false; $bucket_repeater_js_included = false;
foreach($page->form->field as $fld){
if((string)$fld->type == \'ajax\'){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/prototype.js", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'prototype.js\');
if($js_lib_move_conditional == "" && !$ajax_js_included){
$ajax_js_included = true;
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/prototype.js\"></script>";
}
}
if((string)$fld->type == \'barcode\'){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/lib/barcode/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/lib/barcode/\', DIRECTORY_MOD);
}
$this->dircopy("../movefiles/lib/barcode", "../../output/forms/{$xml->jobname}" . \'/lib/barcode/\');
}
if((string)$fld->type == \'signature\'){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/lib/signature-pad/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/lib/signature-pad/\', DIRECTORY_MOD);
}
$this->dircopy("../movefiles/lib/signature-pad", "../../output/forms/{$xml->jobname}" . \'/lib/signature-pad/\');
if((int)$page->jslibrary != 6 && (int)$page->jslibrary != 7){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery/jquery.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery.min.js\');
}
$js_lib_move .= <<<EOF
<!-- Signature Pad -->
<!--[if lt IE 9]><script src="lib/signature-pad/build/flashcanvas.js"></script><![endif]-->
<script src="js/jquery/jquery.min.js"></script>
<script type="text/javascript">
jQuery.noConflict();
var \$j = jQuery;
</script>
<!-- <script src="lib/signature-pad/build/jquery.signaturepad.min.js"></script> -->
<script src="lib/signature-pad/jquery.signaturepad.js"></script>
<script src="lib/signature-pad/build/json2.min.js"></script>
<link rel="stylesheet" href="lib/signature-pad/build/jquery.signaturepad.css">
<!-- Signature Pad -->
EOF;
}
if((int) $page->errorstyle == 3){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery/jquery.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery.min.js\');
copy("../movefiles/jslibs/jquery/jquery-full.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery/\' . \'jquery-full.js\');
$js_lib_move = "<script type=\"text/javascript\" src=\"js/jquery/jquery.min.js\"></script>";
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jquery.validate/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/jquery.validate/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/jquery.validate/dist/jquery.validate.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery.validate/\' . \'jquery.validate.min.js\');
copy("../movefiles/jslibs/jquery.validate/dist/jquery.validate.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery.validate/\' . \'jquery.validate.js\');
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/jquery.validate/jquery.validate.min.js\"></script>";
copy("../movefiles/jslibs/jquery.validate/dist/additional-methods.min.js", "../../output/forms/{$xml->jobname}" . \'/js/jquery.validate/\' . \'additional-methods.min.js\');
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/jquery.validate/additional-methods.min.js\"></script>";
}
if((string)$fld->type == \'calculation\' && (int)$fld->enabled == 1){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
copy("../movefiles/jslibs/prototype.js", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'prototype.js\');
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/lib/calculation.js\')){
copy("../movefiles/lib/calculation.js", "../../output/forms/{$xml->jobname}" . \'/lib/\' . \'calculation.js\');
}
if($js_lib_move_conditional == "" && !$ajax_js_included){
$ajax_js_included = true;
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/prototype.js\"></script>";
}
if(!$calculation_js_included){
$calculation_js_included = true;
$js_lib_move .= "
<script type=\"text/javascript\" src=\"lib/calculation.js\"></script>";
}
}
if((string)$fld->type == \'bucket\' && isset($fld->repeater) && (string)$fld->repeater->enabled == \'1\'){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\' . \'prototype.js\')){
copy("../movefiles/jslibs/prototype.js", "../../output/forms/{$xml->jobname}" . \'/js/\' . \'prototype.js\');
}
if($fld->repeater->add_animation != 0 || $fld->repeater->remove_animation != 0){
if((int)$page->jslibrary != 2 || (int)$page->jslibrary != 3){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/\' . \'scriptaculous/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/js/\' . \'scriptaculous/\', DIRECTORY_MOD);
}
@copy("../movefiles/jslibs/scriptaculous/scriptaculous.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'scriptaculous.js\');
@copy("../movefiles/jslibs/scriptaculous/effects.js", "../../output/forms/{$xml->jobname}" . \'/js/scriptaculous/\' . \'effects.js\');
$js_lib_move_conditional .= "
<script type=\"text/javascript\" src=\"js/scriptaculous/scriptaculous.js?load=effects\"></script>";
}
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/bucket-repeater/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/bucket-repeater/\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/bucket-repeater/process-bucket.js\')){
copy("../movefiles/bucket-repeater/process-bucket.js", "../../output/forms/{$xml->jobname}" . \'/bucket-repeater/process-bucket.js\');
$js_lib_move .= "
<script type=\"text/javascript\" src=\"bucket-repeater/process-bucket.js\"></script>";
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/bucket-repeater/img/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/bucket-repeater/img/\', DIRECTORY_MOD);
copy("../movefiles/bucket-repeater/img/button-duplicate.png", "../../output/forms/{$xml->jobname}" . \'/bucket-repeater/img/button-duplicate.png\');
copy("../movefiles/bucket-repeater/img/button-remove.png", "../../output/forms/{$xml->jobname}" . \'/bucket-repeater/img/button-remove.png\');
copy("../movefiles/bucket-repeater/img/button-blank.png", "../../output/forms/{$xml->jobname}" . \'/bucket-repeater/img/button-blank.png\');
}
if(!$ajax_js_included && !$calculation_js_included && !$bucket_repeater_js_included){
$ajax_js_included = true;
$bucket_repeater_js_included = true;
$js_lib_move .= "
<script type=\"text/javascript\" src=\"js/prototype.js\"></script>";
}
}
}
$conditionalPageLoadCode = \'\';
$this->formElement->resetConditionalEventCode("");
foreach($page->form->field as $fld){
if(isset($fld->conditional) && (int)$fld->conditional->event != 0){
$samepage = false;
foreach($page->form->field as $f){
if(isset($f->id)){
if((string)$f->id == (string)$fld->conditional->field){
$samepage = true;
}
}
if(isset($f->wrapperclass)){
if((string)$f->wrapperclass == (string)$fld->conditional->wrapper){
$samepage = true;
}
}
}
if($samepage == true){
$this->formElement->addCondtionalLoadEvent($fld->type, $fld->id, $fld->conditional, $samepage);
} else {
$tmp_holder = array($fld->type, $fld->id, $fld->conditional, $samepage);
$this->samePage_array["{$fld->conditional->field}"] = $tmp_holder;
}
}
}
foreach($page->form->field as $f){
foreach($this->samePage_array as $sp => $sp_val){
if(isset($f->name) && $f->name != \'\'){
if($sp == $f->name){
$this->formElement->addCondtionalLoadEvent((string)$sp_val[0], (string)$sp_val[1], (object)$sp_val[2], $sp_val[3]);
unset($this->samePage_array["{$f->name}"]);
}
}
if(isset($f->wrapperclass) && $f->wrapperclass != \'\'){
$t = (string)$sp_val[2]->wrapper;
if($t == $f->wrapperclass){
$this->formElement->addCondtionalLoadEvent((string)$sp_val[0], (string)$sp_val[1], (object)$sp_val[2], $sp_val[3]);
unset($this->samePage_array["{$f->name}"]);
}
}
}
}
if(!isset($datagrid_items)){
$datagrid_items = array();
}
foreach($page->form->field as $f){
if((string)$f->type == \'datagrid\'){
$datagrid_items[] = "\'" . (string)$f->name . "|" . (string)$f->grid_properties->label_display . "\'";
}
}
$conditionalPageLoadCode = $this->formElement->getConditionalEventCode();
if($conditionalPageLoadCode != ""){
$this->formElement->prepConditionalEventCode();
$conditionalPageLoadCode = $this->formElement->getConditionalEventCode();
}
switch($page->pagetype){
case \'0\' :
foreach ($page->form as $form){
$error_trap_hit = 0;
$job_id = $this->getJobId($xml->jobname);
$this->temp_form_string .= $this->formElement->create_asp_open_block($page->name);
$include_calendar_js = 0;
$tinymce = 0; $tripped = false;
foreach ($form->field as $field){
$type = (string) $field->{\'type\'};
if($type == \'calendar\'){
$include_calendar_js = 1;
}
if($type == \'textarea\' && !$tripped){
$tripped = true;
$tinymce = (string)$field->tinymce;
if($tinymce != 0){
mkdir("../../output/forms/{$xml->jobname}" . \'/tiny_mce/\', DIRECTORY_MOD);
$this->dircopy("../js/tinymce_export/jscripts/tiny_mce", "../../output/forms/{$xml->jobname}" . \'/tiny_mce/\');
}
}
if($type == \'text\'){
if((int)$field->autosuggest->enable == 1){
@mkdir("../../output/forms/{$xml->jobname}" . \'/js\', DIRECTORY_MOD);
@mkdir("../../output/forms/{$xml->jobname}" . \'/js/autosuggest\', DIRECTORY_MOD);
$this->dircopy("../movefiles/jslibs/autosuggest", "../../output/forms/{$xml->jobname}" . \'/js/autosuggest/\');
$has_auto_suggest = 1;
}
if((int)$field->colorpicker->enable == 1){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js\')){
@mkdir("../../output/forms/{$xml->jobname}" . \'/js\', DIRECTORY_MOD);
}
@mkdir("../../output/forms/{$xml->jobname}" . \'/js/colorpicker\', DIRECTORY_MOD);
$this->dircopy("../movefiles/jslibs/colorpicker", "../../output/forms/{$xml->jobname}" . \'/js/colorpicker/\');
$has_colorpicker = 1;
}
if((int)$field->jslider->enable == 1){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js\')){
@mkdir("../../output/forms/{$xml->jobname}" . \'/js\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/jslider\')){
@mkdir("../../output/forms/{$xml->jobname}" . \'/js/jslider\', DIRECTORY_MOD);
$this->dircopy("../movefiles/jslibs/jslider", "../../output/forms/{$xml->jobname}" . \'/js/jslider/\');
}
$has_jslider = 1;
}
}
}
$this->temp_form_string .= $this->formElement->create_page_pdf_start($page);
$this->temp_form_string .= $this->formElement->create_page_start($page,
$js_lib_move,
$js_lib_move_conditional,
$js_lib_move_tooltips,
$include_calendar_js,
$tinymce,
$has_auto_suggest,
$has_colorpicker,
$has_jslider,
$conditionalPageLoadCode);
$this->temp_form_string .= $this->formElement->create_form_start($form, $page, $xml->jobname);
$bucket_temp_data = array();
$valid_bucket_names = array();
foreach ($form->field as $field){
if($field->type == \'bucket\' && (string)$field->repeater->enabled == \'1\'){
$valid_bucket_names[] = "\'" . $field->name . "\'";
}
}
foreach ($form->field as $field){
if($field->type == \'bucket\'){
$contained_fields = array();
$contained_wrapper_classes = array();
$contained_conditionals = array();
foreach ($form->field as $f){
if(isset($f->bucket) && $f->bucket == \'bucket_\' . $field->DOM_id){
$contained_fields["{$f->name}"] = $f->type;
if((string)$f->wrapperclass != \'\'){
if(!in_array($f->wrapperclass, $contained_wrapper_classes)){
$contained_wrapper_classes[] = (string)$f->wrapperclass;
}
}
if(isset($f->conditional) && isset($f->conditional->event) && (string)$f->conditional->event != "0"){
$contained_conditionals["{$f->name}"] = $this->formElement->addCondtionalLoadEventForBucketRepeaters($f->type, $f->id, $f->conditional);;
}
}
}
if($page->layout == 1) { $bucket_temp_data["{$field->DOM_id}"] = $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $bucket_temp_data["{$field->DOM_id}"] = $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$bucket_temp_data["{$field->DOM_id}"] .= $this->formElement->create_bucket_start($field,
$valid_bucket_names,
$contained_fields,
$contained_wrapper_classes,
$contained_conditionals);
}
}
foreach ($form->field as $field){
$type = (string) $field->{\'type\'};
switch ($type){
case \'bucket\' :
$this->temp_form_string .= "##" . $field->DOM_id . "##";
break;
case \'block\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_block($field, $page->tablemode);
} else {
$this->temp_form_string .= $this->formElement->create_block($field, $page->tablemode);
}
break;
case \'separator\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_separator($field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, null, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_separator($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'spacer\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_spacer($field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, null, null, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_spacer($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'barcode\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_barcode($field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, null, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_barcode($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'signature\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_signature((int)$page->pdf->output_mode, $field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_signature((int)$page->pdf->enable_pdf, $field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'image\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_image($field, $xml->jobname, $form->name, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, null, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_image($field, $xml->jobname, $form->name, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'video\' :
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js\')){
@mkdir("../../output/forms/{$xml->jobname}" . \'/js\', DIRECTORY_MOD);
}
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/js/video-js\')){
@mkdir("../../output/forms/{$xml->jobname}" . \'/js/video-js\', DIRECTORY_MOD);
$this->dircopy("../movefiles/jslibs/video-js", "../../output/forms/{$xml->jobname}" . \'/js/video-js/\');
}
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_video($field, $xml->jobname, $form->name, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, null, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_video($field, $xml->jobname, $form->name, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'sectionheader\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_section_text($field, $page);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, null, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_section_text($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'bodycopy\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_body_copy($field, $page);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, null, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_body_copy($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'ajax\' :
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/lib/ajax/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/lib/ajax/\', DIRECTORY_MOD);
}
$jobpath = "../../output/forms/{$xml->jobname}" . \'/lib/ajax/\';
if($field->dbconnector == \'\') {
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
$this->temp_form_string .= $this->formElement->create_ajax($field, $jobpath);
break;
case \'calculation\' :
if((string)$field->enabled == \'1\'){
$this->temp_form_string .= $this->formElement->create_calculation($field, $page);
}
break;
case \'text\' :
$tmp_datasource = new stdClass();
$tmp_datasource->datasource = (int)$field->datasource;
$tmp_datasource->sourcetype = (int)$field->sourcetype;
$tmp_datasource->sourcesql = (string)$field->sourcesql;
$tmp_datasource->sourcesqlparams = (string)$field->sourcesqlparams;
$tmp_datasource->dbhost = (string)$field->dbhost;
$tmp_datasource->dbschema = (string)$field->dbschema;
$tmp_datasource->dbuser = (string)$field->dbuser;
$tmp_datasource->dbpwd = (string)$field->dbpwd;
$tmp_datasource->dbsocket = (string)$field->dbsocket;
$tmp_datasource->dbport = (string)$field->dbport;
$tmp_datasource->dbdsn = (string)$field->dbdsn;
$tmp_datasource->dbconnector = (string)$field->dbconnector;
$tmp_datasource->dbdebuglevel = (int)$field->dbdebuglevel;
if((int)$field->autosuggest->mode == 0){
if($tmp_datasource->dbconnector == \'\') {
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
}
$savepath = "../../output/forms/{$xml->jobname}" . \'/js/autosuggest/\';
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_text($field, $tmp_datasource, $savepath, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_text($field, $tmp_datasource, $savepath, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'password\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_password($field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_password($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'textarea\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_textarea($field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_textarea($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'submit\' :
if((int)$field->captcha == 1){
copy("../movefiles/security/Captcha/CaptchaSecurityImages.php", "../../output/forms/{$xml->jobname}" . \'/security/Captcha/\' . \'CaptchaSecurityImages.php\');
copy("../movefiles/security/Captcha/monofont.ttf", "../../output/forms/{$xml->jobname}" . \'/security/Captcha/\' . \'monofont.ttf\');
}
if((int)$field->captcha == 2){
copy("../movefiles/security/reCaptcha/recaptchalib.php", "../../output/forms/{$xml->jobname}" . \'/security/reCaptcha/\' . \'recaptchalib.php\');
}
if((int)$field->captcha == 3){
copy("../movefiles/security/3DCaptcha/src/TextGen.php", "../../output/forms/{$xml->jobname}" . \'/security/3DCaptcha/\' . \'TextGen.php\');
copy("../movefiles/security/3DCaptcha/src/3DCaptcha.php", "../../output/forms/{$xml->jobname}" . \'/security/3DCaptcha/\' . \'3DCaptcha.php\');
copy("../movefiles/security/3DCaptcha/src/3DCaptcha.ttf", "../../output/forms/{$xml->jobname}" . \'/security/3DCaptcha/\' . \'3DCaptcha.ttf\');
}
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_submit_button($field, $xml->security, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_submit_button($field, $xml->security, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'reset\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_reset_button($form, $field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_reset_button($form, $field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'button\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_button_button($field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_button_button($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'print\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_node = $this->getBucketDetails($form, $bucket_id[1]);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field, $bucket_node);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_button_print($field, $page->tablemode, $bucket_node);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field, $field->wrapperclass, $field->conditional, $page, $field->elementpos); }
$this->temp_form_string .= $this->formElement->create_button_print($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page, $field, $field->elementpos); }
}
break;
case \'select\' :
$items_array = array();
foreach($field->selectitems as $itm){
$items_array[] = $itm;
}
if((string)$field->select_text_options != ""){
$map_array = $this->append_select_item_text_based_list((string)$field->select_text_options, count($items_array));
$items_array = array_merge($items_array, $map_array);
}
if((int) $field->datasource == 1){
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
}
if((string) $field->dbconnector == \'\' && (string) $field->dbhost == \'\'){
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_select($items_array, $field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_select($items_array, $field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'radio\' :
$items_array = array();
foreach($field->selectitems as $itm){
$items_array[] = $itm;
}
if((string)$field->select_text_options != ""){
$map_array = $this->append_select_item_text_based_list((string)$field->select_text_options, count($items_array));
$items_array = array_merge($items_array, $map_array);
}
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
if($fieldtype != "select" && $page->layout == 0) {
$dims = explode(\',\', $page->dim);
$_width = "width:{$dims[0]}px;";
if(isset($bucket_node) && $bucket_node != "" && (int)$bucket_node->repeater->responsive == 1){
$_width = \'width: 85%;\';
}
$bucket_temp_data["{$bucket_id[1]}"] .= "<div class=\"fb-checkbox-wrapper\" style=\"{$_width}\">";
}
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_multiselect($page, $items_array, $field, $page->tablemode);
if($page->layout == 0) {
$bucket_temp_data["{$bucket_id[1]}"] .= "</div>";
}
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
if($page->layout == 0) {
$dims = explode(\',\', $page->dim);
$this->temp_form_string .= "<div class=\"fb-checkbox-wrapper\" style=\"width:{$dims[0]}px\">";
}
$this->temp_form_string .= $this->formElement->create_multiselect($page, $items_array, $field, $page->tablemode);
if($page->layout == 0) {
$this->temp_form_string .= "</div>";
}
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'checkbox\' :
$items_array = array();
foreach($field->selectitems as $itm){
$items_array[] = $itm;
}
if((int) $field->datasource == 1){
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
}
if((string) $field->dbconnector == \'\' && (string) $field->dbhost == \'\'){
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
if((string)$field->select_text_options != ""){
$map_array = $this->append_select_item_text_based_list((string)$field->select_text_options, count($items_array));
$items_array = array_merge($items_array, $map_array);
}
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
if($fieldtype != "select" && $page->layout == 0) {
$dims = explode(\',\', $page->dim);
$_width = "width:{$dims[0]}px;";
if(isset($bucket_node) && $bucket_node != "" && (int)$bucket_node->repeater->responsive == 1){
$_width = \'width: 85%;\';
}
$bucket_temp_data["{$bucket_id[1]}"] .= "<div class=\"fb-checkbox-wrapper\" style=\"{$_width}\">";
}
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_multiselect($page, $items_array, $field, $page->tablemode);
if($page->layout == 0) {
$bucket_temp_data["{$bucket_id[1]}"] .= "</div>";
}
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
$bucket_temp_data["{$bucket_id[1]}"] .= \'<div style="clear:both;"></div>\';
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
if($page->layout == 0) {
$dims = explode(\',\', $page->dim);
$this->temp_form_string .= "<div class=\"fb-checkbox-wrapper\" style=\"width:{$dims[0]}px\">";
}
$this->temp_form_string .= $this->formElement->create_multiselect($page, $items_array, $field, $page->tablemode);
if($page->layout == 0) {
$this->temp_form_string .= "</div>";
}
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
$this->temp_form_string .= \'<div style="clear:both;"></div>\';
}
break;
case \'hidden\' :
$this->temp_form_string .= $this->formElement->create_hidden($field->label,
$field->name,
$field->id,
$field->defaultvalue);
break;
case \'file\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_file_upload_spec($field->maxfilesize, \'full\');
if(isset($field->html5) && (int)$field->html5 == 1){
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_html5_file($field, $page->tablemode);
} else {
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_file($field, $page->tablemode);
}
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_file_upload_spec($field->maxfilesize, \'full\');
if(isset($field->html5) && (int)$field->html5 == 1){
$this->temp_form_string .= $this->formElement->create_html5_file($field, $page->tablemode, $xml->jobname, $xml->db_key);
} else {
$this->temp_form_string .= $this->formElement->create_file($field, $page->tablemode);
}
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'multifile\' :
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/lib/uploadify/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/lib/uploadify/\', DIRECTORY_MOD);
$this->dircopy("../movefiles/lib/uploadify", "../../output/forms/{$xml->jobname}" . \'/lib/uploadify/\');
}
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_multifile($field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_multifile($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'calendar\' :
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/calendar/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/calendar/\', DIRECTORY_MOD);
}
copy("../movefiles/calendar/CalendarPopup.js", "../../output/forms/{$xml->jobname}" . \'/calendar/\' . \'CalendarPopup.js\');
copy("../movefiles/calendar/cal-style-0.css", "../../output/forms/{$xml->jobname}" . \'/calendar/\' . \'cal-style-0.css\');
copy("../movefiles/calendar/cal-0.png", "../../output/forms/{$xml->jobname}" . \'/calendar/\' . \'cal-0.png\');
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_calendar($field, $page);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_calendar($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'datagrid\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_datagrid($field, $page);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_datagrid($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'survey\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_survey($field, $page);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_survey($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
case \'errortrap\' :
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_errortrap($page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, null, null, $page); }
$this->temp_form_string .= $this->formElement->create_errortrap($page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
$error_trap_hit = 1;
break;
case \'query\' :
if((int)$field->query_top == 0){
if($field->dbconnector == \'\') {
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
$use_php_tags = 1;
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_query($xml->jobname,
$field->sourcetype,
$field->dbhost,
$field->dbschema,
$field->mongocollection,
$field->dbuser,
$field->dbpwd,
$field->dbsocket,
$field->dbport,
$field->dbdsn,
$field->dbconnector,
$field->query_sql,
$field->query_variables,
$field->query_mysql4compat,
$field->query_debug_level,
$field->condition,
$field->query_insertid,
$field->query_return_result_var,
$field->query_function_call,
$field->query_function_returns_result,
$field->query_code,
$field->query_append_label,
$field->query_append_value,
$field->query_append_position,
$use_php_tags,
$field->create_elements,
$field);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start(null, null, null, $page); }
$this->temp_form_string .= $this->formElement->create_query($xml->jobname,
$field->sourcetype,
$field->dbhost,
$field->dbschema,
$field->mongocollection,
$field->dbuser,
$field->dbpwd,
$field->dbsocket,
$field->dbport,
$field->dbdsn,
$field->dbconnector,
$field->query_sql,
$field->query_variables,
$field->query_mysql4compat,
$field->query_debug_level,
$field->condition,
$field->query_insertid,
$field->query_return_result_var,
$field->query_function_call,
$field->query_function_returns_result,
$field->query_code,
$field->query_append_label,
$field->query_append_value,
$field->query_append_position,
$use_php_tags,
$field->create_elements,
$field);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
}
break;
case \'ecomm\' :
if($field->dbconnector == \'\') {
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
if(isset($field->bucket) && (string)$field->bucket != ""){
$bucket_id = explode(\'bucket_\', (string)$field->bucket);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->create_ecomm($field, $page->tablemode);
$bucket_temp_data["{$bucket_id[1]}"] .= $this->formElement->createPositionDivEnd();
} else {
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivStart($field->cords, $field->{\'id\'}, $field->zindex, $field->wrapperclass, $field->conditional); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_start($field->{\'id\'}, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_ecomm($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $this->temp_form_string .= $this->formElement->create_li_end($page->tablemode); }
}
break;
}
}
foreach ($bucket_temp_data as $key=>$bucket_value){
$bucket_value .= $this->formElement->create_bucket_end($field);
if($page->layout == 1) { $bucket_value .= $this->formElement->createPositionDivEnd(); }
if($page->layout == 0) { $bucket_value .= $this->formElement->create_li_end($page->tablemode); }
$this->temp_form_string = str_replace("##" . $key . "##", $bucket_value, $this->temp_form_string);
foreach ($form->field as $field){
if($field->type == \'bucket\' && $field->DOM_id == $key && (string)$field->repeater->enabled == \'1\'){
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/bucket-repeater/process-bucket.php\')){
copy("../movefiles/bucket-repeater/process-bucket.php", "../../output/forms/{$xml->jobname}" . \'/bucket-repeater/\' . \'process-bucket.php\');
}
file_put_contents("../../output/forms/{$xml->jobname}" . \'/bucket-repeater/\' . $field->name . \'.php\', $bucket_value);
}
}
}
$this->temp_form_string .= $this->formElement->create_form_end($page->layout, $error_trap_hit, $page->tablemode);
$this->temp_form_string .= $this->formElement->create_page_end($page->phpfooter, $page->phpbottom, $page->exportmode);
$this->temp_form_string .= $this->formElement->create_page_pdf_end($page->pdf, $page->title, $page->form->onsuccess);
}
break;
case \'1\' :
$pass = 0;
$db_key = $this->getJobId($xml->jobname);
$this->temp_form_string .= $this->confirmElement->create_asp_open_block($page->name);
$this->temp_form_string .= $this->confirmElement->create_page_start($page, $js_lib_move);
$this->temp_form_string .= $this->confirmElement->create_wrapper_start($page, $xml->jobname);
foreach ($page->form as $form){
$ct = count($form->field);
$i = 1;
foreach ($form->field as $field){
$type = (string) $field->{\'type\'};
$pass = 1;
switch ($type){
case \'confirm_text\' :
if($pass == 1){
$this->temp_form_string .= $this->confirmElement->create_display_error_trap();
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->confirmElement->create_confirm_text($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
$this->temp_form_string .= $this->confirmElement->create_display_error_trap_end();
}
break;
case \'sectionheader\' :
if($pass == 1){
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->confirmElement->create_section_text($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
case \'bodycopy\' :
if($pass == 1){
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->confirmElement->create_body_copy($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
case \'image\' :
if($pass == 1){
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_image($field, $xml->jobname, $form->name, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
case \'video\' :
if($pass == 1){
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_video($field, $xml->jobname, $form->name, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
case \'separator\' :
if($pass == 1){
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_separator($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
case \'spacer\' :
if($pass == 1){
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_spacer($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
case \'barcode\' :
if($pass == 1){
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_barcode($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
}
$i++;
}
}
$this->temp_form_string .= $this->confirmElement->create_wrapper_end();
$this->temp_form_string .= $this->confirmElement->create_page_end($page);
break;
case \'2\' :
$pass = 0;
foreach ($page->form as $form){
$error_trap_hit = 0;
$this->temp_form_string .= $this->builderElement->create_php_top($page->phptop);
$this->temp_form_string .= $this->builderElement->create_php_open_block($xml->jobname,
$page->name,
$xml->security,
$xml->phppath);
$include_calendar_js = 0;
$tinymce = 0; $tripped = false;
foreach ($form->field as $field){
$type = (string) $field->{\'type\'};
if($type == \'calendar\'){
$include_calendar_js = 1;
}
if($type == \'textarea\' && !$tripped){
$tripped = true;
$tinymce = (string)$field->tinymce;
if($tinymce != 0){
mkdir("../../output/forms/{$xml->jobname}" . \'/tiny_mce/\', DIRECTORY_MOD);
$this->dircopy("../js/tinymce_export/jscripts/tiny_mce", "../../output/forms/{$xml->jobname}" . \'/tiny_mce/\');
}
}
if($type == \'query\' && (string)$field->query_top == \'1\'){
if($field->dbconnector == \'\') {
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
$use_php_tags = 1;
$this->temp_form_string .= $this->formElement->create_query($xml->jobname,
$field->sourcetype,
$field->dbhost,
$field->dbschema,
$field->mongocollection,
$field->dbuser,
$field->dbpwd,
$field->dbsocket,
$field->dbport,
$field->dbdsn,
$field->dbconnector,
$field->query_sql,
$field->query_variables,
$field->query_mysql4compat,
$field->query_debug_level,
$field->condition,
$field->query_insertid,
$field->query_return_result_var,
$field->query_function_call,
$field->query_function_returns_result,
$field->query_code,
$field->query_append_label,
$field->query_append_value,
$field->query_append_position,
$use_php_tags,
$field->create_elements,
$field);
}
if($type == \'builder_repeater\') {
$ret = $this->builderElement->create_repeater($xml, $field);
$this->temp_form_string .= $ret[0];
$code = $ret[1];
}
}
$this->temp_form_string .= $this->formElement->create_page_pdf_start($page);
$this->temp_form_string .= $this->builderElement->create_page_start($page, $field, $js_lib_move, $include_calendar_js, $tinymce);
$this->temp_form_string .= $this->builderElement->create_form_start($form, $page, $xml->jobname);
foreach ($form->field as $field){
$type = (string) $field->{\'type\'};
switch ($type){
case \'builder_repeater\' :
if(!file_exists("../../output/forms/{$xml->jobname}" . \'/builder/\')){
mkdir("../../output/forms/{$xml->jobname}" . \'/builder/\', DIRECTORY_MOD);
}
copy("../movefiles/builder/utility.php", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'utility.php\');
if($field->dbconnector == \'\') {
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
if($field->repeater_paging == \'1\') {
copy("../movefiles/builder/RecordPage.php", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'RecordPage.php\');
copy("../movefiles/builder/pager.php", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'pager.php\');
copy("../movefiles/builder/pager.css", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'pager.css\');
copy("../movefiles/builder/ASC.png", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'ASC.png\');
copy("../movefiles/builder/DESC.png", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'DESC.png\');
copy("../movefiles/builder/ASC_ACTIVE.png", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'ASC_ACTIVE.png\');
copy("../movefiles/builder/DESC_ACTIVE.png", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'DESC_ACTIVE.png\');
}
if((int)$page->exportmode == 0){
copy("../movefiles/builder/builderform.js", "../../output/forms/{$xml->jobname}" . \'/builder/\' . \'builderform.js\');
}
if($page->layout == 1 && $page->exportmode == 0) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0 && $page->exportmode == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->builderElement->create_repeater_body($xml->jobname, $code);
if($page->layout == 1 && $page->exportmode == 0) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0 && $page->exportmode == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
break;
case \'confirm_text\' :
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->confirmElement->create_confirm_text($field->{\'label\'},
$field->color,
$field->fontsize,
$field->tablemode,
$field->style,
$page->pagepadding,
$page->dim);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
break;
case \'image\' :
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_image($field, $xml->jobname, $form->name, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
break;
case \'video\' :
if($pass == 1){
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_video($field, $xml->jobname, $form->name, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
case \'separator\' :
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_separator($field, $page->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
break;
case \'spacer\' :
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_spacer($field->height, $field->tablemode);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
break;
case \'sectionheader\' :
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->confirmElement->create_section_text($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
break;
case \'bodycopy\' :
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->confirmElement->create_body_copy($field, $page);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
break;
case \'query\' :
if((int)$field->query_top == 0){
if($field->dbconnector == \'\') {
copy("../movefiles/config.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'config.php\');
}
copy("../movefiles/Database.php", "../../output/forms/{$xml->jobname}" . \'/\' . \'Database.php\');
$use_php_tags = 1;
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_start($field->cords, $field->wrapperclass, $field->zindex); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_start(null, $field->wrapperclass, $field->conditional, $page); }
$this->temp_form_string .= $this->formElement->create_query($xml->jobname,
$field->sourcetype,
$field->dbhost,
$field->dbschema,
$field->mongocollection,
$field->dbuser,
$field->dbpwd,
$field->dbsocket,
$field->dbport,
$field->dbdsn,
$field->dbconnector,
$field->query_sql,
$field->query_variables,
$field->query_mysql4compat,
$field->query_debug_level,
$field->condition,
$field->query_insertid,
$field->query_return_result_var,
$field->query_function_call,
$field->query_function_returns_result,
$field->query_code,
$field->query_append_label,
$field->query_append_value,
$field->query_append_position,
$use_php_tags,
$field->create_elements,
$field);
if($page->layout == 1) { $this->temp_form_string .= $this->confirmElement->create_position_div_end(); }
if($page->layout == 0) { $this->temp_form_string .= $this->confirmElement->create_li_end($page->tablemode); }
}
break;
}
}
$this->temp_form_string .= $this->builderElement->create_form_end($page->layout, $error_trap_hit, $page->exportmode);
$this->temp_form_string .= $this->builderElement->create_page_end($page->exportmode, $page->phpfooter, $page->phpbottom);
$this->temp_form_string .= $this->formElement->create_page_pdf_end($page->pdf, $page->title, $page->form->onsuccess);
}
}
$this->pageArray["{$page->name}"] = $this->temp_form_string;
}
}
public function parse_asp_code_behind_file($xml_schema_data){
$this->temp_php_string = \'\';
$php_processor = \'\';
$on_success = \'\';
$on_fail = \'\';
$xml = new SimpleXMLElement($xml_schema_data);
$db_key = $this->getJobId($xml->jobname);
$form_object_class = <<<EOF
public class FormEntry
{
EOF;
$form_object_assignment = <<<EOF
public FormEntry CreateFormEntry()
{
FormEntry retVal = new FormEntry() {
EOF;
$object_count = 0;
foreach ($xml->page as $page ){
foreach($page->form->field as $idx=>$field){
$type = (string) $field->{\'type\'};
if($type == "text" || $type == "password" || $type == "textarea" || $type == "select" || $type == "radio" || $type == "checkbox" || $type == "hidden" || $type == "calendar"){
$form_object_class .= " public string {$field->name} = \"\";
";
if($object_count != 0){
$form_object_assignment .= " ,";
} else {
$form_object_assignment .= " ";
}
$form_object_assignment .= "{$field->name} = (string)Session[\"{$field->name}\"]
";
$object_count++;
}
}
}
$form_object_class .= <<<EOF
}
EOF;
$form_object_assignment .= <<<EOF
};
return retVal;
}
EOF;
$form_list_assignment = <<<EOF
public List<string> CreateFormEntryList()
{
List<string> l = new List<string>();
EOF;
foreach ($xml->page as $page ){
foreach($page->form->field as $idx=>$field){
$type = (string) $field->{\'type\'};
if($type == "text" || $type == "password" || $type == "textarea" || $type == "select" || $type == "radio" || $type == "checkbox" || $type == "hidden" || $type == "calendar"){
if($idx != 0){
$form_list_assignment .= " ";
} else {
$form_list_assignment .= " ";
}
$form_list_assignment .= "l.Add((string)Session[\"{$field->name}\"]);
";
}
}
}
$form_list_assignment .= <<<EOF
return l;
}
EOF;
$form_dict_assignment = <<<EOF
public Dictionary<string, Dictionary<string, string>> CreateFormEntryDictionary()
{
Dictionary<string, Dictionary<string, string> > d = new Dictionary<string, Dictionary<string, string> >();
Dictionary<string, string> i = new Dictionary<string, string>();
EOF;
foreach ($xml->page as $page ){
foreach($page->form->field as $idx=>$field){
$type = (string) $field->{\'type\'};
if($type == "text" || $type == "password" || $type == "textarea" || $type == "select" || $type == "radio" || $type == "checkbox" || $type == "hidden" || $type == "calendar"){
$form_dict_assignment .= " i = new Dictionary<string, string>();
";
$form_dict_assignment .= " i.Add(\"name\", \"{$field->name}\");
";
$form_dict_assignment .= " i.Add(\"label\", \"{$field->label}\");
";
$form_dict_assignment .= " i.Add(\"value\", (string)Session[\"{$field->name}\"]);
";
$form_dict_assignment .= " d.Add(\"{$field->name}\", i);
";
}
}
}
$form_dict_assignment .= <<<EOF
return d;
}
EOF;
foreach($xml->page as $page){
$this->temp_php_string = "";
$confirmation_process_code = array(\'\', \'\');
if($page->pagetype == "1"){
$confirmation_process_code = $this->codeBehindElement->create_asp_confirm_items($field, $page, $xml->jobname);
}
$this->temp_php_string .= $this->codeBehindElement->create_asp_open($xml, $page, $form_object_class, $form_object_assignment, $form_list_assignment, $form_dict_assignment, $confirmation_process_code);
foreach($page->form->field as $field){
$type = (string) $field->{\'type\'};
switch ($type){
case \'submit\' :
$process_page = null;
if($page->form->onsuccess != ""){
foreach($xml->page->form as $_f){
if($_f->name == $page->form->onsuccess)
$process_page = $_f;
}
}
$this->temp_php_string .= $this->codeBehindElement->create_asp_submit($field, $page, $process_page);
break;
}
}
$this->temp_php_string .= $this->codeBehindElement->create_asp_close();
$this->temp_php_string .= $this->codeBehindElement->create_php_close();
$this->pageArray["{$page->name}"] = $this->temp_php_string;
}
}
public function getPage(){
return $this->pageArray;
}
public function getJobId($job_name){
$job_name = str_replace(\'-mobile\', \'\', (string)$job_name);
$sql = "SELECT id, job_name FROM fb_jobs WHERE job_name = \'{$job_name}\'";
$result = Database::pdo_query($sql);
return $result[0][\'id\'];
}
public function dircopy($source, $dest, $folderPermission=DIRECTORY_MOD, $filePermission=0644) {
$result=false;
if (is_file($source)) {
if(is_dir($dest)) {
if ($dest[strlen($dest)-1]!=\'/\')
$__dest=$dest."/";
$__dest .= basename($source);
}
else {
$__dest=$dest;
}
$result=copy($source, $__dest);
chmod($__dest,$filePermission);
}
elseif(is_dir($source)) {
if(!is_dir($dest)) {
@mkdir($dest,$folderPermission);
chmod($dest,$folderPermission);
}
if ($source[strlen($source)-1]!=\'/\')
$source=$source."/";
if ($dest[strlen($dest)-1]!=\'/\')
$dest=$dest."/";
$result = true;
$dirHandle=opendir($source);
while($file=readdir($dirHandle)) {
if($file!="." && $file!="..") {
$result=$this->dircopy($source.$file, $dest.$file, $folderPermission, $filePermission);
}
}
closedir($dirHandle);
}
else {
$result=false;
}
return $result;
}
public function full_copy( $source, $target )
{
if ( is_dir( $source ) )
{
@mkdir( $target , DIRECTORY_MOD);
$d = dir( $source );
while ( FALSE !== ( $entry = $d->read() ) )
{
if ( $entry == \'.\' || $entry == \'..\' )
{
continue;
}
$Entry = $source . \'/\' . $entry;
if ( is_dir( $Entry ) )
{
$this->full_copy( $Entry, $target . \'/\' . $entry );
continue;
}
copy( $Entry, $target . \'/\' . $entry );
}
$d->close();
}else
{
copy( $source, $target );
}
}
public function append_select_item_text_based_list($select_options, $count){
$select_text_options = explode("
", (string)$select_options);
$map_array = array();
foreach($select_text_options as $s){
$t = explode("|", $s);
$t = count($t);
if($t != 1){
$tmp = explode("|", $s);
if(substr($s, 0, 1) == ">"){
$selected = 1;
$tmp[0] = str_replace(">", "", $tmp[0]);
} else {
$selected = 0;
}
$map_array[] = (object)array("name"=>$tmp[0], "value"=>$tmp[1], "id"=>$count, "selected"=>$selected);
} else {
if(substr($s, 0, 1) == ">"){
$selected = 1;
$s = str_replace(">", "", $s);
} else {
$selected = 0;
}
$map_array[] = (object)array("name"=>$s, "value"=>$s, "id"=>$count, "selected"=>$selected);
}
$count++;
}
return $map_array;
}
}
?>'
Did this file decode correctly?
Original Code
<?php /* Copyright (c) Nicsoft LLC */ eval( '?>' . base64_decode('PD9waHAKCmluY2x1ZGUgJy4uL2luYy9hdXRoX2hlYWRlci5waHAnOwoKaW5jbHVkZSAnQVNQX0Zvcm1FbGVtZW50cy5waHAnOwppbmNsdWRlICdBU1BfQ29kZUJlaGluZEVsZW1lbnRzLnBocCc7CmluY2x1ZGUgJ0FTUF9Db25maXJtYXRpb25FbGVtZW50cy5waHAnOwppbmNsdWRlICdBU1BfQnVpbGRlckVsZW1lbnRzLnBocCc7CmluY2x1ZGUgJ0FTUF9Db21tb25FbGVtZW50cy5waHAnOwoKCmNsYXNzIEFTUF9QYXJzZXIgewoJCglwcml2YXRlICRmb3JtRWxlbWVudDsKCQoJcHJpdmF0ZSAkdGVtcF9tYXN0ZXJfc3RyaW5nOwoJcHJpdmF0ZSAkdGVtcF9wYWdlX3N0cmluZzsKCXByaXZhdGUgJHRlbXBfZm9ybV9zdHJpbmc7Cglwcml2YXRlICR0ZW1wX3htbF9zdHJpbmc7Cglwcml2YXRlICR0ZW1wX3BocF9zdHJpbmc7CgkKCQoJcHJpdmF0ZSAkY29kZUJlaGluZEVsZW1lbnQgPSBOVUxMOwoJCglwcml2YXRlICRwYWdlQXJyYXk7CgkKCQoJcHJpdmF0ZSAkc2FtZVBhZ2VfYXJyYXkgPSBhcnJheSgpOwoKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCQkkdGhpcy0+Zm9ybUVsZW1lbnQgPSBuZXcgQVNQX0Zvcm1FbGVtZW50cygpOwoJCSR0aGlzLT5jb2RlQmVoaW5kRWxlbWVudCA9IG5ldyBBU1BfQ29kZUJlaGluZEVsZW1lbnRzKCk7CgkJJHRoaXMtPmNvbmZpcm1FbGVtZW50ID0gbmV3IEFTUF9Db25maXJtYXRpb25FbGVtZW50cygpOwoJCSR0aGlzLT5idWlsZGVyRWxlbWVudCA9IG5ldyBBU1BfQnVpbGRlckVsZW1lbnRzKCk7CgkJJHRoaXMtPmNvbW1vbkVsZW1lbnQgPSBuZXcgQVNQX0NvbW1vbkVsZW1lbnRzKCk7CgkJJHRoaXMtPnBhZ2VBcnJheSA9IGFycmF5KCk7Cgl9CgkKCQoJcHVibGljIGZ1bmN0aW9uIHBhcnNlX2FzcF9mb3JtKCR4bWxfc2NoZW1hX2RhdGEpewoJCQoJCSR0aGlzLT50ZW1wX21hc3Rlcl9zdHJpbmcgPSAnJzsKCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyA9ICcnOwoJCSR0aGlzLT50ZW1wX2ZpZWxkX3N0cmluZyA9ICcnOwoJCQoJCXRyeXsKCQkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxfc2NoZW1hX2RhdGEpOwoJCX0gY2F0Y2goRXhjZXB0aW9uICRlKXsKCQkJZWNobyAkZTsKCQkJZGllOwoJCX0KCQkKCQlmb3JlYWNoICgkeG1sLT5wYWdlIGFzICRpZHg9PiRwYWdlKXsJCQoJCQkKCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgPSAnJzsKCQkJCgkJCSRqc19saWJfbW92ZSA9ICcnOyAKCQkJCgkJCQoJCQkkaGFzX2F1dG9fc3VnZ2VzdCA9IDA7CgkJCQoJCQkKCQkJJGhhc19jb2xvcnBpY2tlciA9IDA7CgkJCQoJCQkKCQkJJGhhc19qc2xpZGVyID0gMDsKCQkJCgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJCgkJCWlmKChpbnQpICRwYWdlLT5qc2xpYnJhcnkgPT0gIiIpeyAKCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycpKXsKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJfQoJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycpKXsKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCX0KCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvanF1ZXJ5L2pxdWVyeS5taW4uanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nIC4gJ2pxdWVyeS5taW4uanMnKTsKCQkJCSRqc19saWJfbW92ZSA9ICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9qcXVlcnkvanF1ZXJ5Lm1pbi5qc1wiPjwvc2NyaXB0PiI7CgkJCX0KCQkJCgoKCQkJaWYoKGludCkgJHBhZ2UtPmpzbGlicmFyeSA9PSAxKXsgCgkJCQlAbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvcHJvdG90eXBlLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nIC4gJ3Byb3RvdHlwZS5qcycpOwoJCQkJJGpzX2xpYl9tb3ZlID0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL3Byb3RvdHlwZS5qc1wiPjwvc2NyaXB0PiI7CgkJCX0KCQkJaWYoKGludCkgJHBhZ2UtPmpzbGlicmFyeSA9PSAyKXsgCgkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nIC4gJ3NjcmlwdGFjdWxvdXMvJywgRElSRUNUT1JZX01PRCk7CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3Byb3RvdHlwZS5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJyAuICdwcm90b3R5cGUuanMnKTsKCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvc2NyaXB0YWN1bG91cy9zY3JpcHRhY3Vsb3VzLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9zY3JpcHRhY3Vsb3VzLycgLiAnc2NyaXB0YWN1bG91cy5qcycpOwoJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9zY3JpcHRhY3Vsb3VzL2VmZmVjdHMuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3NjcmlwdGFjdWxvdXMvJyAuICdlZmZlY3RzLmpzJyk7CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3NjcmlwdGFjdWxvdXMvZHJhZ2Ryb3AuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3NjcmlwdGFjdWxvdXMvJyAuICdkcmFnZHJvcC5qcycpOwoJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9zY3JpcHRhY3Vsb3VzL2J1aWxkZXIuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3NjcmlwdGFjdWxvdXMvJyAuICdidWlsZGVyLmpzJyk7CgkJCQkKCQkJCQoJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy90b29sdGlwcycsIERJUkVDVE9SWV9NT0QpOwoJCQkJJHRoaXMtPmRpcmNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvdG9vbHRpcHMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3Rvb2x0aXBzLycpOwoJCQkKCQkJCSRqc19saWJfbW92ZSA9ICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9wcm90b3R5cGUuanNcIj48L3NjcmlwdD4iOwoJCQkJJGpzX2xpYl9tb3ZlIC49ICJcbjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL3NjcmlwdGFjdWxvdXMvc2NyaXB0YWN1bG91cy5qcz9sb2FkPWVmZmVjdHMsZHJhZ2Ryb3AsYnVpbGRlclwiPjwvc2NyaXB0PiI7CgkJCQkKCQkJCSRqc19saWJfbW92ZSAuPSAiXG5cbjwhLS0gdG9vbHRpcHMgLS0+IjsKCQkJCSRqc19saWJfbW92ZSAuPSAiXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy90b29sdGlwcy90b29sdGlwcy5qc1wiPjwvc2NyaXB0PiI7CgkJCQkkanNfbGliX21vdmUgLj0gIlxuPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCJqcy90b29sdGlwcy90b29sdGlwcy5jc3NcIi8+IjsKCQkJCQoJCQkJJGpzX2xpYl9tb3ZlIC49IDw8PCBFT0YKCQkJCQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmRvY3VtZW50Lm9ic2VydmUoJ2RvbTpsb2FkZWQnLCBmdW5jdGlvbigpewoJJCQoIi5mYi10b29sdGlwIikuZWFjaCggZnVuY3Rpb24obGluaykgewoJCW5ldyBUb29sdGlwKGxpbmssIHt9KTsKCX0pOwp9KTsKPC9zY3JpcHQ+CgpFT0Y7CgkJCQkKCQkJfQoJCQlpZigoaW50KSAkcGFnZS0+anNsaWJyYXJ5ID09IDMpeyAKCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycgLiAnc2NyaXB0YWN1bG91cy8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvcHJvdG90eXBlLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nIC4gJ3Byb3RvdHlwZS5qcycpOwoJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9zY3JpcHRhY3Vsb3VzL3NjcmlwdGFjdWxvdXMuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3NjcmlwdGFjdWxvdXMvJyAuICdzY3JpcHRhY3Vsb3VzLmpzJyk7CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3NjcmlwdGFjdWxvdXMvZWZmZWN0cy5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvc2NyaXB0YWN1bG91cy8nIC4gJ2VmZmVjdHMuanMnKTsKCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvc2NyaXB0YWN1bG91cy9kcmFnZHJvcC5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvc2NyaXB0YWN1bG91cy8nIC4gJ2RyYWdkcm9wLmpzJyk7CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3NjcmlwdGFjdWxvdXMvYnVpbGRlci5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvc2NyaXB0YWN1bG91cy8nIC4gJ2J1aWxkZXIuanMnKTsKCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvc2NyaXB0YWN1bG91cy9jb250cm9scy5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvc2NyaXB0YWN1bG91cy8nIC4gJ2NvbnRyb2xzLmpzJyk7CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3NjcmlwdGFjdWxvdXMvc2xpZGVyLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9zY3JpcHRhY3Vsb3VzLycgLiAnc2xpZGVyLmpzJyk7CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3NjcmlwdGFjdWxvdXMvc291bmQuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3NjcmlwdGFjdWxvdXMvJyAuICdzb3VuZC5qcycpOwoJCQkJCgkJCQkKCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvdG9vbHRpcHMnLCBESVJFQ1RPUllfTU9EKTsKCQkJCSR0aGlzLT5kaXJjb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3Rvb2x0aXBzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy90b29sdGlwcy8nKTsKCQkJCQoJCQkJJGpzX2xpYl9tb3ZlID0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL3Byb3RvdHlwZS5qc1wiPjwvc2NyaXB0PiI7CgkJCQkkanNfbGliX21vdmUgLj0gIlxuPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwianMvc2NyaXB0YWN1bG91cy9zY3JpcHRhY3Vsb3VzLmpzXCI+PC9zY3JpcHQ+IjsKCQkJCQoJCQkJJGpzX2xpYl9tb3ZlIC49ICJcblxuPCEtLSB0b29sdGlwcyAtLT4iOwoJCQkJJGpzX2xpYl9tb3ZlIC49ICJcbjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL3Rvb2x0aXBzL3Rvb2x0aXBzLmpzXCI+PC9zY3JpcHQ+IjsKCQkJCSRqc19saWJfbW92ZSAuPSAiXG48bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cImpzL3Rvb2x0aXBzL3Rvb2x0aXBzLmNzc1wiLz4iOwoJCQkJCgkJCQkkanNfbGliX21vdmUgLj0gPDw8IEVPRgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpkb2N1bWVudC5vYnNlcnZlKCdkb206bG9hZGVkJywgZnVuY3Rpb24oKXsKCSQkKCIuZmItdG9vbHRpcCIpLmVhY2goIGZ1bmN0aW9uKGxpbmspIHsKCQluZXcgVG9vbHRpcChsaW5rLCB7fSk7Cgl9KTsKfSk7Cjwvc2NyaXB0PgoKRU9GOwoKCQkJfQoJCQlpZigoaW50KSAkcGFnZS0+anNsaWJyYXJ5ID09IDQpeyAKCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2Rvam8uanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycgLiAnZG9qby5qcycpOwoJCQkJJGpzX2xpYl9tb3ZlID0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL2Rvam8uanNcIj48L3NjcmlwdD4iOwoJCQl9CgkJCQoJCQlpZigoaW50KSAkcGFnZS0+anNsaWJyYXJ5ID09IDUpeyAKCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQkKCQkJCSR0aGlzLT5kaXJjb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2Rvam9yb290IiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nIC4gJ2Rvam9yb290LycpOwoJCQkJJGpzX2xpYl9tb3ZlID0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL2Rvam9yb290L2Rvam8vZG9qby5qc1wiPjwvc2NyaXB0PiI7CgkJCX0KCQkJCgkJCQoJCQlpZigoaW50KSAkcGFnZS0+anNsaWJyYXJ5ID09IDYpeyAKCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycpKXsKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJfQoJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycpKXsKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCX0KCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvanF1ZXJ5L2pxdWVyeS5taW4uanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nIC4gJ2pxdWVyeS5taW4uanMnKTsKCQkJCSRqc19saWJfbW92ZSA9ICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9qcXVlcnkvanF1ZXJ5Lm1pbi5qc1wiPjwvc2NyaXB0PiI7CgkJCX0KCQkJCgkJCWlmKChpbnQpICRwYWdlLT5qc2xpYnJhcnkgPT0gNyl7IAoJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJykpewoJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQl9CgkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvJykpewoJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycsIERJUkVDVE9SWV9NT0QpOwoJCQkJfQoJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkvanF1ZXJ5LWZ1bGwuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nIC4gJ2pxdWVyeS1mdWxsLmpzJyk7CgkJCQkkanNfbGliX21vdmUgPSAiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwianMvanF1ZXJ5L2pxdWVyeS1mdWxsLmpzXCI+PC9zY3JpcHQ+IjsKCQkJfQoJCQkKCQkJCgkJCWlmKChpbnQpICRwYWdlLT5qc2xpYnJhcnkgPT0gOCl7IAoJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJykpewoJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQl9CgkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvJykpewoJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycsIERJUkVDVE9SWV9NT0QpOwoJCQkJfQoJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5L2Nzcy8nKSl7CgkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvY3NzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJfQoJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkvanF1ZXJ5Lm1pbi5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycgLiAnanF1ZXJ5Lm1pbi5qcycpOwoJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkvanF1ZXJ5LXVpLTEuOC4yLmNvcmUubWluLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvJyAuICdqcXVlcnktdWktMS44LjIuY29yZS5taW4uanMnKTsKCQkJCSR0aGlzLT5kaXJjb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2pxdWVyeS9jc3MiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS9jc3MvJyk7CgkJCQkKCQkJCSRqc19saWJfbW92ZSA9ICI8IS0tIGpxdWVyeSBpbmNsdWRlcyAtLT5cbiI7CgkJCQkkanNfbGliX21vdmUgLj0gIjxsaW5rIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCJqcy9qcXVlcnkvY3NzL3VpLWxpZ2h0bmVzcy9qcXVlcnktdWktMS44LjIuY3VzdG9tLmNzc1wiIHJlbD1cInN0eWxlc2hlZXRcIiAvPlxuIjsKCQkJCSRqc19saWJfbW92ZSAuPSAiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwianMvanF1ZXJ5L2pxdWVyeS5taW4uanNcIj48L3NjcmlwdD5cbiI7CgkJCQkkanNfbGliX21vdmUgLj0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL2pxdWVyeS9qcXVlcnktdWktMS44LjIuY29yZS5taW4uanNcIj48L3NjcmlwdD4iOwoJCQl9CgkJCQoJCQkKCQkJaWYoKGludCkgJHBhZ2UtPmpzbGlicmFyeSA9PSA5KXsgCgkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nKSl7CgkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCX0KCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nKSl7CgkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvJywgRElSRUNUT1JZX01PRCk7CgkJCQl9CgkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvY3NzLycpKXsKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS9jc3MvJywgRElSRUNUT1JZX01PRCk7CgkJCQl9CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2pxdWVyeS9qcXVlcnkubWluLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvJyAuICdqcXVlcnkubWluLmpzJyk7CgkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2pxdWVyeS9qcXVlcnktdWktMS44LjIuZnVsbC5taW4uanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nIC4gJ2pxdWVyeS11aS0xLjguMi5mdWxsLm1pbi5qcycpOwoJCQkJJHRoaXMtPmRpcmNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvanF1ZXJ5L2NzcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5L2Nzcy8nKTsKCQkJCQoJCQkJJGpzX2xpYl9tb3ZlID0gIjwhLS0ganF1ZXJ5IGluY2x1ZGVzIC0tPlxuIjsKCQkJCSRqc19saWJfbW92ZSAuPSAiPGxpbmsgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cImpzL2pxdWVyeS9jc3MvdWktbGlnaHRuZXNzL2pxdWVyeS11aS0xLjguMi5jdXN0b20uY3NzXCIgcmVsPVwic3R5bGVzaGVldFwiIC8+XG4iOwoJCQkJJGpzX2xpYl9tb3ZlIC49ICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9qcXVlcnkvanF1ZXJ5Lm1pbi5qc1wiPjwvc2NyaXB0PlxuIjsKCQkJCSRqc19saWJfbW92ZSAuPSAiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwianMvanF1ZXJ5L2pxdWVyeS11aS0xLjguMi5mdWxsLm1pbi5qc1wiPjwvc2NyaXB0PiI7CgkJCX0KCQkJCgkJCWlmKChpbnQpICRwYWdlLT5qc2xpYnJhcnkgPT0gMTApeyAKCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycpKXsKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJfQoJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycpKXsKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCX0KCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS9jc3MvJykpewoJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5L2Nzcy8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCX0KCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvanF1ZXJ5L2pxdWVyeS5taW4uanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nIC4gJ2pxdWVyeS5taW4uanMnKTsKCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvanF1ZXJ5L2pxdWVyeS11aS0xLjguMi5mdWxsLm1pbi5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycgLiAnanF1ZXJ5LXVpLTEuOC4yLmZ1bGwubWluLmpzJyk7CgkJCQkKCQkJCSR0aGlzLT5kaXJjb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2pxdWVyeS9jc3MiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS9jc3MvJyk7CgkJCQkKCQkJCSRqc19saWJfbW92ZSA9ICI8IS0tIGpxdWVyeSBpbmNsdWRlcyAtLT5cbiI7CgkJCQkkanNfbGliX21vdmUgLj0gIjxsaW5rIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCJqcy9qcXVlcnkvY3NzL2N1c3RvbS10aGVtZS9qcXVlcnktdWktMS44LjIuY3VzdG9tLmNzc1wiIHJlbD1cInN0eWxlc2hlZXRcIiAvPlxuIjsKCQkJCSRqc19saWJfbW92ZSAuPSAiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwianMvanF1ZXJ5L2pxdWVyeS5taW4uanNcIj48L3NjcmlwdD5cbiI7CgkJCQkkanNfbGliX21vdmUgLj0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL2pxdWVyeS9qcXVlcnktdWktMS44LjIuZnVsbC5taW4uanNcIj48L3NjcmlwdD4iOwoJCQl9CgkJCQoJCQkKCQkJaWYoKGludCkgJHBhZ2UtPmpzbGlicmFyeSA9PSAxMSl7IAoJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJykpewoJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQl9CgkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkubW9iaWxlLycpKXsKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS5tb2JpbGUvJywgRElSRUNUT1JZX01PRCk7CgkJCQl9CgkJCQkkdGhpcy0+ZGlyY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkubW9iaWxlIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkubW9iaWxlLycpOwoJCQkJCgkJCQkkanNfbGliX21vdmUgPSAiPCEtLSBqUXVlcnkgTW9iaWxlIEluY2x1ZGVzIC0tPlxuIjsKCQkJCSRqc19saWJfbW92ZSAuPSAiPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+IjsKCQkJCSRqc19saWJfbW92ZSAuPSAiPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCJqcy9qcXVlcnkubW9iaWxlL2pxdWVyeS5tb2JpbGUubWluLmNzc1wiIC8+IjsKCQkJCSRqc19saWJfbW92ZSAuPSAiPHNjcmlwdCBzcmM9XCJqcy9qcXVlcnkubW9iaWxlL2pxdWVyeS5taW4uanNcIj48L3NjcmlwdD4iOwoJCQkJJGpzX2xpYl9tb3ZlIC49ICI8c2NyaXB0IHNyYz1cImpzL2pxdWVyeS5tb2JpbGUvanF1ZXJ5Lm1vYmlsZS5taW4uanNcIj48L3NjcmlwdD4iOwoKCQkJfQoJCQkKCQkJCgkJCQoJCQkkanNfbGliX21vdmVfY29uZGl0aW9uYWwgPSAnJzsKCQkJCgkJCWlmKChpbnQpJHBhZ2UtPmpzbGlicmFyeSAhPSAyIHx8IChpbnQpJHBhZ2UtPmpzbGlicmFyeSAhPSAzKXsgCgkJCQlmb3JlYWNoKCRwYWdlLT5mb3JtLT5maWVsZCBhcyAkZmxkKXsKCQkJCQlpZigoaW50KSRmbGQtPmNvbmRpdGlvbmFsLT5hbmltYXRpb24gIT0gMCl7CgkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJyAuICdzY3JpcHRhY3Vsb3VzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3Byb3RvdHlwZS5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJyAuICdwcm90b3R5cGUuanMnKTsKCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9zY3JpcHRhY3Vsb3VzL3NjcmlwdGFjdWxvdXMuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3NjcmlwdGFjdWxvdXMvJyAuICdzY3JpcHRhY3Vsb3VzLmpzJyk7CgkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvc2NyaXB0YWN1bG91cy9lZmZlY3RzLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9zY3JpcHRhY3Vsb3VzLycgLiAnZWZmZWN0cy5qcycpOwoJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3NjcmlwdGFjdWxvdXMvZHJhZ2Ryb3AuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3NjcmlwdGFjdWxvdXMvJyAuICdkcmFnZHJvcC5qcycpOwoJCQkJCQkKCQkJCQkJJGpzX2xpYl9tb3ZlX2NvbmRpdGlvbmFsID0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL3Byb3RvdHlwZS5qc1wiPjwvc2NyaXB0PiI7CgkJCQkJCSRqc19saWJfbW92ZV9jb25kaXRpb25hbCAuPSAiXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9zY3JpcHRhY3Vsb3VzL3NjcmlwdGFjdWxvdXMuanM/bG9hZD1lZmZlY3RzLGRyYWdkcm9wXCI+PC9zY3JpcHQ+IjsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCQoJCQlpZigkcGFnZS0+YWRkaXRpb25hbGpzbGlicmFyeSAhPSAnJyAmJiAkcGFnZS0+YWRkaXRpb25hbGpzbGlicmFyeSAhPSAnMCcpewoJCQkJCgkJCQkKCQkJCWlmKGZpbGVfZXhpc3RzKCIuLi9tb3ZlZmlsZXMvYWRkaXRpb25hbC1qc2xpYnMveyRwYWdlLT5hZGRpdGlvbmFsanNsaWJyYXJ5fS9yYWNrZm9ybXMtaW5jbHVkZS1jb2RlLnR4dCIpKXsKCQkJCQkKCQkJCQkkYWRkaXRpb25hbF9qc19pbmNsdWRlX2NvZGUgPSBmaWxlX2dldF9jb250ZW50cygiLi4vbW92ZWZpbGVzL2FkZGl0aW9uYWwtanNsaWJzL3skcGFnZS0+YWRkaXRpb25hbGpzbGlicmFyeX0vcmFja2Zvcm1zLWluY2x1ZGUtY29kZS50eHQiKTsKCQkJCQkKCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJyAuICRwYWdlLT5hZGRpdGlvbmFsanNsaWJyYXJ5IC4gJy8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCQkKCQkJCQkkdGhpcy0+ZGlyY29weSgiLi4vbW92ZWZpbGVzL2FkZGl0aW9uYWwtanNsaWJzL3skcGFnZS0+YWRkaXRpb25hbGpzbGlicmFyeX0iLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAiL2pzL3skcGFnZS0+YWRkaXRpb25hbGpzbGlicmFyeX0vIik7CgkJCQkKCQkJCQkkanNfbGliX21vdmUgPSAiPCEtLSBSYWNrRm9ybXMgQWRkaXRpb25hbCBKUyBMaWJyYXJ5IC0tPiI7CgkJCQkJJGpzX2xpYl9tb3ZlIC49ICRhZGRpdGlvbmFsX2pzX2luY2x1ZGVfY29kZTsKCgkJCQl9CgkJCgkJCX0KCQkJCgkJCQoJCQkkanNfbGliX21vdmVfdG9vbHRpcHMgPSAiIjsgCgkJCSRoYXNUb29sdGlwcyA9IGZhbHNlOwoJCQlmb3JlYWNoKCRwYWdlLT5mb3JtLT5maWVsZCBhcyAkZmxkKXsKCQkJCQoJCQkJaWYoKHN0cmluZykkZmxkLT50b29sdGlwLT50ZXh0ICE9ICIiKXsKCQkJCQkkaGFzVG9vbHRpcHMgPSB0cnVlOwoJCQkJfQoJCQl9CgkJCQoJCQkKCQkJaWYoJGhhc1Rvb2x0aXBzID09IHRydWUpewoJCQkJJHQgPSAoaW50KSRwYWdlLT5qc2xpYnJhcnk7CgkJCQlpZigkdCAhPSA2ICYmICAkdCAhPSA3ICYmICAkdCAhPSA4ICYmICAkdCAhPSA5ICYmICAkdCAhPSAxMCl7CgkJCQkJCgkJCQkJCgkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJykpewoJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCX0KCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvJykpewoJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCQl9CgkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5L3Rvb2xzLycpKXsKCQkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvdG9vbHMvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJfQoJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS90b29scy9nZngvJykpewoJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS90b29scy9nZngvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJfQoJCQkJCQoJCQkJCSR0aGlzLT5kaXJjb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2pxdWVyeS90b29scy9nZngiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS90b29scy9nZngvJyk7CgkJCQkJCgkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkvdG9vbHMvanF1ZXJ5LnRvb2xzLm1pbi5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5L3Rvb2xzLycgLiAnanF1ZXJ5LnRvb2xzLm1pbi5qcycpOwoJCQkJCQoJCQkJCQoJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvanF1ZXJ5L2pxdWVyeS5taW4uanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nIC4gJ2pxdWVyeS5taW4uanMnKTsKCQkJCQkKCQkJCQkKCQkJCQkkanNfbGliX21vdmVfdG9vbHRpcHMgPSAiPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwianMvanF1ZXJ5L2pxdWVyeS5taW4uanNcIj48L3NjcmlwdD5cbiI7CgkJCQkJJGpzX2xpYl9tb3ZlX3Rvb2x0aXBzIC49ICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9qcXVlcnkvdG9vbHMvanF1ZXJ5LnRvb2xzLm1pbi5qc1wiPjwvc2NyaXB0PiI7CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJJGpzX2xpYl9tb3ZlX3Rvb2x0aXBzIC49IDw8PEVPSAo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CglqUXVlcnkubm9Db25mbGljdCgpOwoJdmFyIFwkaiA9IGpRdWVyeTsKPC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIHNpbXBsZSBjc3MtYmFzZWQgdG9vbHRpcCAqLwouZmJ0b29sdGlwIHsKCWJhY2tncm91bmQtY29sb3I6IzAwMDsKCWJvcmRlcjoxcHggc29saWQgI2ZmZjsKCXBhZGRpbmc6MTBweCAxNXB4OwoJd2lkdGg6MjAwcHg7CglkaXNwbGF5Om5vbmU7Cgljb2xvcjojZmZmOwoJdGV4dC1hbGlnbjpsZWZ0OwoJZm9udC1zaXplOjEycHg7CgoJLyogb3V0bGluZSByYWRpdXMgZm9yIG1vemlsbGEvZmlyZWZveCBvbmx5ICovCgktbW96LWJveC1zaGFkb3c6MCAwIDEwcHggIzAwMDsKCS13ZWJraXQtYm94LXNoYWRvdzowIDAgMTBweCAjMDAwOwp9Cjwvc3R5bGU+CkVPSDsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5L3Rvb2xzLycpKXsKCQkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvdG9vbHMvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJfQoJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS90b29scy9nZngvJykpewoJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS90b29scy9nZngvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJfQoJCQkJCQoJCQkJCSR0aGlzLT5kaXJjb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2pxdWVyeS90b29scy9nZngiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS90b29scy9nZngvJyk7CgkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkvdG9vbHMvanF1ZXJ5LnRvb2xzLm1pbi5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5L3Rvb2xzLycgLiAnanF1ZXJ5LnRvb2xzLm1pbi5qcycpOwoJCQkJCQoJCQkJCQoJCQkJCSRqc19saWJfbW92ZV90b29sdGlwcyA9ICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9qcXVlcnkvdG9vbHMvanF1ZXJ5LnRvb2xzLm1pbi5qc1wiPjwvc2NyaXB0PiI7CgkJCQkJJGpzX2xpYl9tb3ZlX3Rvb2x0aXBzIC49IDw8PEVPSAoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5Lm5vQ29uZmxpY3QoKTsKCXZhciBcJGogPSBqUXVlcnk7Cjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgovKiBzaW1wbGUgY3NzLWJhc2VkIHRvb2x0aXAgKi8KLmZidG9vbHRpcCB7CgliYWNrZ3JvdW5kLWNvbG9yOiMwMDA7Cglib3JkZXI6MXB4IHNvbGlkICNmZmY7CglwYWRkaW5nOjEwcHggMTVweDsKCXdpZHRoOjIwMHB4OwoJZGlzcGxheTpub25lOwoJY29sb3I6I2ZmZjsKCXRleHQtYWxpZ246bGVmdDsKCWZvbnQtc2l6ZToxMnB4OwoKCS8qIG91dGxpbmUgcmFkaXVzIGZvciBtb3ppbGxhL2ZpcmVmb3ggb25seSAqLwoJLW1vei1ib3gtc2hhZG93OjAgMCAxMHB4ICMwMDA7Cgktd2Via2l0LWJveC1zaGFkb3c6MCAwIDEwcHggIzAwMDsKfQo8L3N0eWxlPgpFT0g7CgkJCQl9CgkJCX0KCQkJCgoJCQkKCQkJCgkJCQoJCQkKCQkJCgkJCSRhamF4X2pzX2luY2x1ZGVkID0gZmFsc2U7ICRjYWxjdWxhdGlvbl9qc19pbmNsdWRlZCA9IGZhbHNlOyAkYnVja2V0X3JlcGVhdGVyX2pzX2luY2x1ZGVkID0gZmFsc2U7CgkJCQoJCQlmb3JlYWNoKCRwYWdlLT5mb3JtLT5maWVsZCBhcyAkZmxkKXsKCQkJCQoJCQkJaWYoKHN0cmluZykkZmxkLT50eXBlID09ICdhamF4Jyl7CgkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJykpewoJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCX0KCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3Byb3RvdHlwZS5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJyAuICdwcm90b3R5cGUuanMnKTsKCQkJCQkKCQkJCQlpZigkanNfbGliX21vdmVfY29uZGl0aW9uYWwgPT0gIiIgJiYgISRhamF4X2pzX2luY2x1ZGVkKXsKCQkJCQkJJGFqYXhfanNfaW5jbHVkZWQgPSB0cnVlOwoJCQkJCQkkanNfbGliX21vdmUgLj0gIlxuPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwianMvcHJvdG90eXBlLmpzXCI+PC9zY3JpcHQ+IjsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCQoJCQkJCgkJCQkKCQkJCWlmKChzdHJpbmcpJGZsZC0+dHlwZSA9PSAnYmFyY29kZScpewoJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2xpYi9iYXJjb2RlLycpKXsKCQkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9saWIvYmFyY29kZS8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCQl9CgkJCQkJJHRoaXMtPmRpcmNvcHkoIi4uL21vdmVmaWxlcy9saWIvYmFyY29kZSIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvbGliL2JhcmNvZGUvJyk7CgoJCQkJfQoJCQkJCgkJCQkKCQkJCQoJCQkJaWYoKHN0cmluZykkZmxkLT50eXBlID09ICdzaWduYXR1cmUnKXsKCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9saWIvc2lnbmF0dXJlLXBhZC8nKSl7CgkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvbGliL3NpZ25hdHVyZS1wYWQvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJfQoJCQkJCSR0aGlzLT5kaXJjb3B5KCIuLi9tb3ZlZmlsZXMvbGliL3NpZ25hdHVyZS1wYWQiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2xpYi9zaWduYXR1cmUtcGFkLycpOwoJCQkJCQoJCQkJCQoJCQkJCWlmKChpbnQpJHBhZ2UtPmpzbGlicmFyeSAhPSA2ICYmIChpbnQpJHBhZ2UtPmpzbGlicmFyeSAhPSA3KXsKCQkJCQkJCgkJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycpKXsKCQkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nKSl7CgkJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkvanF1ZXJ5Lm1pbi5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycgLiAnanF1ZXJ5Lm1pbi5qcycpOwoJCQkJCX0KCQkJCQkKCQkJCQkKCQkJCQkkanNfbGliX21vdmUgLj0gPDw8RU9GCgo8IS0tIFNpZ25hdHVyZSBQYWQgLS0+CjwhLS1baWYgbHQgSUUgOV0+PHNjcmlwdCBzcmM9ImxpYi9zaWduYXR1cmUtcGFkL2J1aWxkL2ZsYXNoY2FudmFzLmpzIj48L3NjcmlwdD48IVtlbmRpZl0tLT4KPHNjcmlwdCBzcmM9ImpzL2pxdWVyeS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCWpRdWVyeS5ub0NvbmZsaWN0KCk7Cgl2YXIgXCRqID0galF1ZXJ5Owo8L3NjcmlwdD4KCjwhLS0gPHNjcmlwdCBzcmM9ImxpYi9zaWduYXR1cmUtcGFkL2J1aWxkL2pxdWVyeS5zaWduYXR1cmVwYWQubWluLmpzIj48L3NjcmlwdD4gLS0+CjxzY3JpcHQgc3JjPSJsaWIvc2lnbmF0dXJlLXBhZC9qcXVlcnkuc2lnbmF0dXJlcGFkLmpzIj48L3NjcmlwdD4KCjxzY3JpcHQgc3JjPSJsaWIvc2lnbmF0dXJlLXBhZC9idWlsZC9qc29uMi5taW4uanMiPjwvc2NyaXB0PgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJsaWIvc2lnbmF0dXJlLXBhZC9idWlsZC9qcXVlcnkuc2lnbmF0dXJlcGFkLmNzcyI+CjwhLS0gU2lnbmF0dXJlIFBhZCAtLT4KCkVPRjsKCgkJCQl9IAoJCQkJCgkJCQkKCQkJCQoJCQkJCgkJCQlpZigoaW50KSAkcGFnZS0+ZXJyb3JzdHlsZSA9PSAzKXsKCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nKSl7CgkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJfQoJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nKSl7CgkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvanF1ZXJ5LycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCX0KCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL2pxdWVyeS9qcXVlcnkubWluLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkvJyAuICdqcXVlcnkubWluLmpzJyk7CgkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkvanF1ZXJ5LWZ1bGwuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS8nIC4gJ2pxdWVyeS1mdWxsLmpzJyk7CgkJCQkJJGpzX2xpYl9tb3ZlID0gIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL2pxdWVyeS9qcXVlcnkubWluLmpzXCI+PC9zY3JpcHQ+IjsKCQkJCQkKCQkJCQkKCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkudmFsaWRhdGUvJykpewoJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS52YWxpZGF0ZS8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCQl9CgkJCQkJCgkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkudmFsaWRhdGUvZGlzdC9qcXVlcnkudmFsaWRhdGUubWluLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkudmFsaWRhdGUvJyAuICdqcXVlcnkudmFsaWRhdGUubWluLmpzJyk7CgkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkudmFsaWRhdGUvZGlzdC9qcXVlcnkudmFsaWRhdGUuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pxdWVyeS52YWxpZGF0ZS8nIC4gJ2pxdWVyeS52YWxpZGF0ZS5qcycpOwoJCQkJCSRqc19saWJfbW92ZSAuPSAiXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9qcXVlcnkudmFsaWRhdGUvanF1ZXJ5LnZhbGlkYXRlLm1pbi5qc1wiPjwvc2NyaXB0PiI7CgkJCQkJCgkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qcXVlcnkudmFsaWRhdGUvZGlzdC9hZGRpdGlvbmFsLW1ldGhvZHMubWluLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qcXVlcnkudmFsaWRhdGUvJyAuICdhZGRpdGlvbmFsLW1ldGhvZHMubWluLmpzJyk7CgkJCQkJJGpzX2xpYl9tb3ZlIC49ICJcbjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImpzL2pxdWVyeS52YWxpZGF0ZS9hZGRpdGlvbmFsLW1ldGhvZHMubWluLmpzXCI+PC9zY3JpcHQ+IjsKCQkJCX0KCQkJCQoJCQkJCgkJCQkKCQkJCWlmKChzdHJpbmcpJGZsZC0+dHlwZSA9PSAnY2FsY3VsYXRpb24nICYmIChpbnQpJGZsZC0+ZW5hYmxlZCA9PSAxKXsgCgkJCQkJCgkJCQkJCgkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJykpewoJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCX0KCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3Byb3RvdHlwZS5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJyAuICdwcm90b3R5cGUuanMnKTsKCQkJCQkKCQkJCQkKCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9saWIvY2FsY3VsYXRpb24uanMnKSl7CgkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9saWIvY2FsY3VsYXRpb24uanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2xpYi8nIC4gJ2NhbGN1bGF0aW9uLmpzJyk7CgkJCQkJfQoJCQkJCQoJCQkJCQoJCQkJCWlmKCRqc19saWJfbW92ZV9jb25kaXRpb25hbCA9PSAiIiAmJiAhJGFqYXhfanNfaW5jbHVkZWQpewoJCQkJCQkkYWpheF9qc19pbmNsdWRlZCA9IHRydWU7CgkJCQkJCSRqc19saWJfbW92ZSAuPSAiXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9wcm90b3R5cGUuanNcIj48L3NjcmlwdD4iOwoJCQkJCX0KCQkJCQkKCQkJCQkKCQkJCQlpZighJGNhbGN1bGF0aW9uX2pzX2luY2x1ZGVkKXsKCQkJCQkJJGNhbGN1bGF0aW9uX2pzX2luY2x1ZGVkID0gdHJ1ZTsgCgkJCQkJCSRqc19saWJfbW92ZSAuPSAiXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJsaWIvY2FsY3VsYXRpb24uanNcIj48L3NjcmlwdD4iOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJCgkJCQlpZigoc3RyaW5nKSRmbGQtPnR5cGUgPT0gJ2J1Y2tldCcgJiYgaXNzZXQoJGZsZC0+cmVwZWF0ZXIpICYmIChzdHJpbmcpJGZsZC0+cmVwZWF0ZXItPmVuYWJsZWQgPT0gJzEnKXsKCQkJCQkKCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy8nKSl7CgkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJfQoJCQkJCQoJCQkJCQoJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycgLiAncHJvdG90eXBlLmpzJykpewoJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvanNsaWJzL3Byb3RvdHlwZS5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJyAuICdwcm90b3R5cGUuanMnKTsKCQkJCQl9CgkJCQkJCgkJCQkJCgkJCQkJaWYoJGZsZC0+cmVwZWF0ZXItPmFkZF9hbmltYXRpb24gIT0gMCB8fCAkZmxkLT5yZXBlYXRlci0+cmVtb3ZlX2FuaW1hdGlvbiAhPSAwKXsKCQkJCQkJCgkJCQkJCWlmKChpbnQpJHBhZ2UtPmpzbGlicmFyeSAhPSAyIHx8IChpbnQpJHBhZ2UtPmpzbGlicmFyeSAhPSAzKXsgCgkJCQkJCQkKCQkJCQkJCQoJCQkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvJyAuICdzY3JpcHRhY3Vsb3VzLycpKXsKCQkJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzLycgLiAnc2NyaXB0YWN1bG91cy8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJQGNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvc2NyaXB0YWN1bG91cy9zY3JpcHRhY3Vsb3VzLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9zY3JpcHRhY3Vsb3VzLycgLiAnc2NyaXB0YWN1bG91cy5qcycpOwoJCQkJCQkJQGNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvc2NyaXB0YWN1bG91cy9lZmZlY3RzLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9zY3JpcHRhY3Vsb3VzLycgLiAnZWZmZWN0cy5qcycpOwoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJCSRqc19saWJfbW92ZV9jb25kaXRpb25hbCAuPSAiXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJqcy9zY3JpcHRhY3Vsb3VzL3NjcmlwdGFjdWxvdXMuanM/bG9hZD1lZmZlY3RzXCI+PC9zY3JpcHQ+IjsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJCQoJCQkJCQoJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2J1Y2tldC1yZXBlYXRlci8nKSl7CgkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvYnVja2V0LXJlcGVhdGVyLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCX0KCQkJCQkKCQkJCQkKCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWNrZXQtcmVwZWF0ZXIvcHJvY2Vzcy1idWNrZXQuanMnKSl7CgkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9idWNrZXQtcmVwZWF0ZXIvcHJvY2Vzcy1idWNrZXQuanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2J1Y2tldC1yZXBlYXRlci9wcm9jZXNzLWJ1Y2tldC5qcycpOwoJCQkJCQkKCQkJCQkJCgkJCQkJCSRqc19saWJfbW92ZSAuPSAiXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJidWNrZXQtcmVwZWF0ZXIvcHJvY2Vzcy1idWNrZXQuanNcIj48L3NjcmlwdD4iOwoJCQkJCX0KCQkJCQkKCQkJCQkKCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWNrZXQtcmVwZWF0ZXIvaW1nLycpKXsKCQkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWNrZXQtcmVwZWF0ZXIvaW1nLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvYnVja2V0LXJlcGVhdGVyL2ltZy9idXR0b24tZHVwbGljYXRlLnBuZyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvYnVja2V0LXJlcGVhdGVyL2ltZy9idXR0b24tZHVwbGljYXRlLnBuZycpOwoJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvYnVja2V0LXJlcGVhdGVyL2ltZy9idXR0b24tcmVtb3ZlLnBuZyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvYnVja2V0LXJlcGVhdGVyL2ltZy9idXR0b24tcmVtb3ZlLnBuZycpOwoJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvYnVja2V0LXJlcGVhdGVyL2ltZy9idXR0b24tYmxhbmsucG5nIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWNrZXQtcmVwZWF0ZXIvaW1nL2J1dHRvbi1ibGFuay5wbmcnKTsKCQkJCQl9CgkJCQkJCgkJCQkJCgkJCQkJaWYoISRhamF4X2pzX2luY2x1ZGVkICYmICEkY2FsY3VsYXRpb25fanNfaW5jbHVkZWQgJiYgISRidWNrZXRfcmVwZWF0ZXJfanNfaW5jbHVkZWQpewoJCQkJCQkkYWpheF9qc19pbmNsdWRlZCA9IHRydWU7CgkJCQkJCSRidWNrZXRfcmVwZWF0ZXJfanNfaW5jbHVkZWQgPSB0cnVlOwoJCQkJCQkkanNfbGliX21vdmUgLj0gIlxuPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwianMvcHJvdG90eXBlLmpzXCI+PC9zY3JpcHQ+IjsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoJCQl9CgkJCQoJCQkKCQkJJGNvbmRpdGlvbmFsUGFnZUxvYWRDb2RlID0gJyc7IAoJCQkkdGhpcy0+Zm9ybUVsZW1lbnQtPnJlc2V0Q29uZGl0aW9uYWxFdmVudENvZGUoIiIpOwoJCQkKCgkJCWZvcmVhY2goJHBhZ2UtPmZvcm0tPmZpZWxkIGFzICRmbGQpewoJCQkJaWYoaXNzZXQoJGZsZC0+Y29uZGl0aW9uYWwpICYmIChpbnQpJGZsZC0+Y29uZGl0aW9uYWwtPmV2ZW50ICE9IDApewoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCSRzYW1lcGFnZSA9IGZhbHNlOwoJCQkJCQoJCQkJCWZvcmVhY2goJHBhZ2UtPmZvcm0tPmZpZWxkIGFzICRmKXsKCQkJCQkJaWYoaXNzZXQoJGYtPmlkKSl7CgkJCQkJCQlpZigoc3RyaW5nKSRmLT5pZCA9PSAoc3RyaW5nKSRmbGQtPmNvbmRpdGlvbmFsLT5maWVsZCl7IAoJCQkJCQkJCSRzYW1lcGFnZSA9IHRydWU7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJaWYoaXNzZXQoJGYtPndyYXBwZXJjbGFzcykpewoJCQkJCQkJaWYoKHN0cmluZykkZi0+d3JhcHBlcmNsYXNzID09IChzdHJpbmcpJGZsZC0+Y29uZGl0aW9uYWwtPndyYXBwZXIpeyAKCQkJCQkJCQkkc2FtZXBhZ2UgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCQoJCQkJCWlmKCRzYW1lcGFnZSA9PSB0cnVlKXsKCQkJCQkJJHRoaXMtPmZvcm1FbGVtZW50LT5hZGRDb25kdGlvbmFsTG9hZEV2ZW50KCRmbGQtPnR5cGUsICRmbGQtPmlkLCAkZmxkLT5jb25kaXRpb25hbCwgJHNhbWVwYWdlKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJJHRtcF9ob2xkZXIgPSBhcnJheSgkZmxkLT50eXBlLCAkZmxkLT5pZCwgJGZsZC0+Y29uZGl0aW9uYWwsICRzYW1lcGFnZSk7CgkJCQkJCSR0aGlzLT5zYW1lUGFnZV9hcnJheVsieyRmbGQtPmNvbmRpdGlvbmFsLT5maWVsZH0iXSA9ICR0bXBfaG9sZGVyOwkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCX0KCQkJCgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJZm9yZWFjaCgkcGFnZS0+Zm9ybS0+ZmllbGQgYXMgJGYpewoJCQkJZm9yZWFjaCgkdGhpcy0+c2FtZVBhZ2VfYXJyYXkgYXMgJHNwID0+ICRzcF92YWwpewoJCQkJCQoJCQkJCQoJCQkJCWlmKGlzc2V0KCRmLT5uYW1lKSAmJiAkZi0+bmFtZSAhPSAnJyl7CgkJCQkJCWlmKCRzcCA9PSAkZi0+bmFtZSl7CgkJCQkJCQkkdGhpcy0+Zm9ybUVsZW1lbnQtPmFkZENvbmR0aW9uYWxMb2FkRXZlbnQoKHN0cmluZykkc3BfdmFsWzBdLCAoc3RyaW5nKSRzcF92YWxbMV0sIChvYmplY3QpJHNwX3ZhbFsyXSwgJHNwX3ZhbFszXSk7CgkJCQkJCQkKCQkJCQkJCXVuc2V0KCR0aGlzLT5zYW1lUGFnZV9hcnJheVsieyRmLT5uYW1lfSJdKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkKCQkJCQkKCQkJCQlpZihpc3NldCgkZi0+d3JhcHBlcmNsYXNzKSAmJiAkZi0+d3JhcHBlcmNsYXNzICE9ICcnKXsKCQkJCQkJJHQgPSAoc3RyaW5nKSRzcF92YWxbMl0tPndyYXBwZXI7CgkJCQkJCWlmKCR0ID09ICRmLT53cmFwcGVyY2xhc3MpewoJCQkJCQkJJHRoaXMtPmZvcm1FbGVtZW50LT5hZGRDb25kdGlvbmFsTG9hZEV2ZW50KChzdHJpbmcpJHNwX3ZhbFswXSwgKHN0cmluZykkc3BfdmFsWzFdLCAob2JqZWN0KSRzcF92YWxbMl0sICRzcF92YWxbM10pOwoJCQkJCQkJCgkJCQkJCQl1bnNldCgkdGhpcy0+c2FtZVBhZ2VfYXJyYXlbInskZi0+bmFtZX0iXSk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQl9CgkJCX0KCQkJCgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJaWYoIWlzc2V0KCRkYXRhZ3JpZF9pdGVtcykpewoJCQkJJGRhdGFncmlkX2l0ZW1zID0gYXJyYXkoKTsgCgkJCX0KCQkJCgkJCWZvcmVhY2goJHBhZ2UtPmZvcm0tPmZpZWxkIGFzICRmKXsKCgkJCQkKCQkJCWlmKChzdHJpbmcpJGYtPnR5cGUgPT0gJ2RhdGFncmlkJyl7CgkJCQkJJGRhdGFncmlkX2l0ZW1zW10gPSAiJyIgLiAoc3RyaW5nKSRmLT5uYW1lIC4gInwiIC4gKHN0cmluZykkZi0+Z3JpZF9wcm9wZXJ0aWVzLT5sYWJlbF9kaXNwbGF5IC4gIiciOwoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCQoJCQkkY29uZGl0aW9uYWxQYWdlTG9hZENvZGUgPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmdldENvbmRpdGlvbmFsRXZlbnRDb2RlKCk7CgkJCQoJCQlpZigkY29uZGl0aW9uYWxQYWdlTG9hZENvZGUgIT0gIiIpewoJCQkJJHRoaXMtPmZvcm1FbGVtZW50LT5wcmVwQ29uZGl0aW9uYWxFdmVudENvZGUoKTsKCQkJCSRjb25kaXRpb25hbFBhZ2VMb2FkQ29kZSA9ICR0aGlzLT5mb3JtRWxlbWVudC0+Z2V0Q29uZGl0aW9uYWxFdmVudENvZGUoKTsKCQkJfQoJCQkJCgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJCgkJCQoJCQkKCQkJCgkJCQoJCQlzd2l0Y2goJHBhZ2UtPnBhZ2V0eXBlKXsKCQkJCQoJCQkJY2FzZSAnMCcgOiAKCQkJCQkKCQkJCQlmb3JlYWNoICgkcGFnZS0+Zm9ybSBhcyAkZm9ybSl7CgkJCQkJCQoJCQkJCQkKCQkJCQkJJGVycm9yX3RyYXBfaGl0ID0gMDsKCQkJCQkJCgkJCQkJCQoJCQkJCQkkam9iX2lkID0gJHRoaXMtPmdldEpvYklkKCR4bWwtPmpvYm5hbWUpOwoJCQkJCQkKCgkJCQkJCQoJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9hc3Bfb3Blbl9ibG9jaygkcGFnZS0+bmFtZSk7CgkJCQkJCQoJCQkJCQkKCQkJCQkJCgkJCQkJCSRpbmNsdWRlX2NhbGVuZGFyX2pzID0gMDsKCQkJCQkJJHRpbnltY2UgPSAwOyAkdHJpcHBlZCA9IGZhbHNlOwoJCQkJCQkKCQkJCQkJZm9yZWFjaCAoJGZvcm0tPmZpZWxkIGFzICRmaWVsZCl7CgoJCQkJCQkJJHR5cGUgPSAoc3RyaW5nKSAkZmllbGQtPnsndHlwZSd9OwoJCQkJCQkJaWYoJHR5cGUgPT0gJ2NhbGVuZGFyJyl7CgkJCQkJCQkJJGluY2x1ZGVfY2FsZW5kYXJfanMgPSAxOwoJCQkJCQkJfQoJCQkJCQkJaWYoJHR5cGUgPT0gJ3RleHRhcmVhJyAmJiAhJHRyaXBwZWQpewoJCQkJCQkJCSR0cmlwcGVkID0gdHJ1ZTsKCQkJCQkJCQkkdGlueW1jZSA9IChzdHJpbmcpJGZpZWxkLT50aW55bWNlOwoJCQkJCQkJCQoJCQkJCQkJCWlmKCR0aW55bWNlICE9IDApewoJCQkJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL3RpbnlfbWNlLycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCQkJCQkKCQkJCQkJCQkJJHRoaXMtPmRpcmNvcHkoIi4uL2pzL3RpbnltY2VfZXhwb3J0L2pzY3JpcHRzL3RpbnlfbWNlIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy90aW55X21jZS8nKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJCQoJCQkJCQkJaWYoJHR5cGUgPT0gJ3RleHQnKXsKCQkJCQkJCQkKCQkJCQkJCQlpZigoaW50KSRmaWVsZC0+YXV0b3N1Z2dlc3QtPmVuYWJsZSA9PSAxKXsKCQkJCQkJCQkJQG1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMnLCBESVJFQ1RPUllfTU9EKTsKCQkJCQkJCQkJQG1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvYXV0b3N1Z2dlc3QnLCBESVJFQ1RPUllfTU9EKTsKCQkJCQkJCQkJJHRoaXMtPmRpcmNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvYXV0b3N1Z2dlc3QiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2F1dG9zdWdnZXN0LycpOwoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCSRoYXNfYXV0b19zdWdnZXN0ID0gMTsKCQkJCQkJCQl9CgkJCQkJCQkJCgkJCQkJCQkJCgkJCQkJCQkJCgkJCQkJCQkJaWYoKGludCkkZmllbGQtPmNvbG9ycGlja2VyLT5lbmFibGUgPT0gMSl7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMnKSl7CgkJCQkJCQkJCQlAbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQlAbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9jb2xvcnBpY2tlcicsIERJUkVDVE9SWV9NT0QpOwoJCQkJCQkJCQkkdGhpcy0+ZGlyY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9jb2xvcnBpY2tlciIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvY29sb3JwaWNrZXIvJyk7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJJGhhc19jb2xvcnBpY2tlciA9IDE7CgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCWlmKChpbnQpJGZpZWxkLT5qc2xpZGVyLT5lbmFibGUgPT0gMSl7CgkJCQkJCQkJCQoJCQkJCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcycpKXsKCQkJCQkJCQkJCUBta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzJywgRElSRUNUT1JZX01PRCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL2pzbGlkZXInKSl7CgkJCQkJCQkJCQlAbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qc2xpZGVyJywgRElSRUNUT1JZX01PRCk7CgkJCQkJCQkJCQkkdGhpcy0+ZGlyY29weSgiLi4vbW92ZWZpbGVzL2pzbGlicy9qc2xpZGVyIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy9qc2xpZGVyLycpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJJGhhc19qc2xpZGVyID0gMTsKCQkJCQkJCQl9CgoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQkJCgkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3BhZ2VfcGRmX3N0YXJ0KCRwYWdlKTsKCQkJCQkJCgkJCQkJCQoJCQkJCQkKCQkJCQkJCgkJCQkJCQoJCQkJCQkKCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfcGFnZV9zdGFydCgkcGFnZSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkanNfbGliX21vdmUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGpzX2xpYl9tb3ZlX2NvbmRpdGlvbmFsLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRqc19saWJfbW92ZV90b29sdGlwcywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkaW5jbHVkZV9jYWxlbmRhcl9qcywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkdGlueW1jZSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkaGFzX2F1dG9fc3VnZ2VzdCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkaGFzX2NvbG9ycGlja2VyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRoYXNfanNsaWRlciwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkY29uZGl0aW9uYWxQYWdlTG9hZENvZGUpOwoJCQkJCQkKCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfZm9ybV9zdGFydCgkZm9ybSwgJHBhZ2UsICR4bWwtPmpvYm5hbWUpOwoKCQkJCQkJCgkJCQkJCQoJCQkJCQkKCQkJCQkJCgkJCQkJCSRidWNrZXRfdGVtcF9kYXRhID0gYXJyYXkoKTsKCQkJCQkJCgkJCQkJCQoJCQkJCQkkdmFsaWRfYnVja2V0X25hbWVzID0gYXJyYXkoKTsKCQkJCQkJZm9yZWFjaCAoJGZvcm0tPmZpZWxkIGFzICRmaWVsZCl7CgkJCQkJCQlpZigkZmllbGQtPnR5cGUgPT0gJ2J1Y2tldCcgJiYgKHN0cmluZykkZmllbGQtPnJlcGVhdGVyLT5lbmFibGVkID09ICcxJyl7CgkJCQkJCQkJJHZhbGlkX2J1Y2tldF9uYW1lc1tdID0gIiciIC4gJGZpZWxkLT5uYW1lIC4gIiciOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCQoJCQkJCQlmb3JlYWNoICgkZm9ybS0+ZmllbGQgYXMgJGZpZWxkKXsKCQkJCQkJCQoJCQkJCQkJaWYoJGZpZWxkLT50eXBlID09ICdidWNrZXQnKXsKCQkJCQkJCQkKCQkJCQkJCQkKCQkJCQkJCQkkY29udGFpbmVkX2ZpZWxkcyA9IGFycmF5KCk7CgkJCQkJCQkJJGNvbnRhaW5lZF93cmFwcGVyX2NsYXNzZXMgPSBhcnJheSgpOyAKCQkJCQkJCQkkY29udGFpbmVkX2NvbmRpdGlvbmFscyA9IGFycmF5KCk7CgkJCQkJCQkJCgkJCQkJCQkJZm9yZWFjaCAoJGZvcm0tPmZpZWxkIGFzICRmKXsKCQkJCQkJCQkJaWYoaXNzZXQoJGYtPmJ1Y2tldCkgJiYgJGYtPmJ1Y2tldCA9PSAnYnVja2V0XycgLiAkZmllbGQtPkRPTV9pZCl7CgkJCQkJCQkJCQkkY29udGFpbmVkX2ZpZWxkc1sieyRmLT5uYW1lfSJdID0gJGYtPnR5cGU7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoKHN0cmluZykkZi0+d3JhcHBlcmNsYXNzICE9ICcnKXsKCQkJCQkJCQkJCQlpZighaW5fYXJyYXkoJGYtPndyYXBwZXJjbGFzcywgJGNvbnRhaW5lZF93cmFwcGVyX2NsYXNzZXMpKXsKCQkJCQkJCQkJCQkJJGNvbnRhaW5lZF93cmFwcGVyX2NsYXNzZXNbXSA9IChzdHJpbmcpJGYtPndyYXBwZXJjbGFzczsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoaXNzZXQoJGYtPmNvbmRpdGlvbmFsKSAmJiBpc3NldCgkZi0+Y29uZGl0aW9uYWwtPmV2ZW50KSAmJiAoc3RyaW5nKSRmLT5jb25kaXRpb25hbC0+ZXZlbnQgIT0gIjAiKXsKCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQkkY29udGFpbmVkX2NvbmRpdGlvbmFsc1sieyRmLT5uYW1lfSJdID0gJHRoaXMtPmZvcm1FbGVtZW50LT5hZGRDb25kdGlvbmFsTG9hZEV2ZW50Rm9yQnVja2V0UmVwZWF0ZXJzKCRmLT50eXBlLCAkZi0+aWQsICRmLT5jb25kaXRpb25hbCk7OwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkYnVja2V0X3RlbXBfZGF0YVsieyRmaWVsZC0+RE9NX2lkfSJdID0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOyB9CgkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICRidWNrZXRfdGVtcF9kYXRhWyJ7JGZpZWxkLT5ET01faWR9Il0gID0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQoJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkKCQkJCQkJCQkKCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRmaWVsZC0+RE9NX2lkfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2J1Y2tldF9zdGFydCgkZmllbGQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgJHZhbGlkX2J1Y2tldF9uYW1lcywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAkY29udGFpbmVkX2ZpZWxkcywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAkY29udGFpbmVkX3dyYXBwZXJfY2xhc3NlcywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAkY29udGFpbmVkX2NvbmRpdGlvbmFscyk7CgkJCQkJCQkJCgkJCQkJCQkJCgoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkKCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQoJCQkJCQlmb3JlYWNoICgkZm9ybS0+ZmllbGQgYXMgJGZpZWxkKXsKCQkJCQkJCQoJCQkJCQkJJHR5cGUgPSAoc3RyaW5nKSAkZmllbGQtPnsndHlwZSd9OwoJCQkJCQkJCgkJCQkJCQlzd2l0Y2ggKCR0eXBlKXsKCQkJCQkJCQkKCQkJCQkJCQkKCQkJCQkJCQljYXNlICdidWNrZXQnIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAiIyMiIC4gJGZpZWxkLT5ET01faWQgLiAiIyMiOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnYmxvY2snIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfaWQgPSBleHBsb2RlKCdidWNrZXRfJywgKHN0cmluZykkZmllbGQtPmJ1Y2tldCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9ibG9jaygkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2Jsb2NrKCRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnc2VwYXJhdG9yJyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9zZXBhcmF0b3IoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0gZWxzZSB7IAoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsIG51bGwsICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3NlcGFyYXRvcigkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ3NwYWNlcicgOgoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9zcGFjZXIoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0gZWxzZSB7IAoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsIG51bGwsIG51bGwsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KG51bGwsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfc3BhY2VyKCRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQkKCQkJCQkJCQljYXNlICdiYXJjb2RlJyA6CgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfaWQgPSBleHBsb2RlKCdidWNrZXRfJywgKHN0cmluZykkZmllbGQtPmJ1Y2tldCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2JhcmNvZGUoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0gZWxzZSB7IAoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsIG51bGwsICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2JhcmNvZGUoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnc2lnbmF0dXJlJyA6CgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfaWQgPSBleHBsb2RlKCdidWNrZXRfJywgKHN0cmluZykkZmllbGQtPmJ1Y2tldCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3NpZ25hdHVyZSgoaW50KSRwYWdlLT5wZGYtPm91dHB1dF9tb2RlLCAkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydCgkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9zaWduYXR1cmUoKGludCkkcGFnZS0+cGRmLT5lbmFibGVfcGRmLCAkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQljYXNlICdpbWFnZScgOgoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9pbWFnZSgkZmllbGQsICR4bWwtPmpvYm5hbWUsICRmb3JtLT5uYW1lLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0gZWxzZSB7IAoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsIG51bGwsICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2ltYWdlKCRmaWVsZCwgJHhtbC0+am9ibmFtZSwgJGZvcm0tPm5hbWUsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAndmlkZW8nIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzJykpewoJCQkJCQkJCQkJQG1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMnLCBESVJFQ1RPUllfTU9EKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvdmlkZW8tanMnKSl7CgkJCQkJCQkJCQlAbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9qcy92aWRlby1qcycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCQkJCQkJJHRoaXMtPmRpcmNvcHkoIi4uL21vdmVmaWxlcy9qc2xpYnMvdmlkZW8tanMiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2pzL3ZpZGVvLWpzLycpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfaWQgPSBleHBsb2RlKCdidWNrZXRfJywgKHN0cmluZykkZmllbGQtPmJ1Y2tldCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV92aWRlbygkZmllbGQsICR4bWwtPmpvYm5hbWUsICRmb3JtLT5uYW1lLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCBudWxsLCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV92aWRlbygkZmllbGQsICR4bWwtPmpvYm5hbWUsICRmb3JtLT5uYW1lLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnc2VjdGlvbmhlYWRlcicgOgoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9zZWN0aW9uX3RleHQoJGZpZWxkLCAkcGFnZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCBudWxsLCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9zZWN0aW9uX3RleHQoJGZpZWxkLCAkcGFnZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQljYXNlICdib2R5Y29weScgOgoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9ib2R5X2NvcHkoJGZpZWxkLCAkcGFnZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsIG51bGwsICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2JvZHlfY29weSgkZmllbGQsICRwYWdlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQkKCQkJCQkJCQljYXNlICdhamF4JyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2xpYi9hamF4LycpKXsKCQkJCQkJCQkJCW1rZGlyKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvbGliL2FqYXgvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJCQkJCX0KCQkJCQkKCQkJCQkJCQkJJGpvYnBhdGggPSAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2xpYi9hamF4Lyc7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoJGZpZWxkLT5kYmNvbm5lY3RvciA9PSAnJykgeyAKCQkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9jb25maWcucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy8nIC4gJ2NvbmZpZy5waHAnKTsgCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9EYXRhYmFzZS5waHAiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnLycgLiAnRGF0YWJhc2UucGhwJyk7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9hamF4KCRmaWVsZCwgJGpvYnBhdGgpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2NhbGN1bGF0aW9uJyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoKHN0cmluZykkZmllbGQtPmVuYWJsZWQgPT0gJzEnKXsKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2NhbGN1bGF0aW9uKCRmaWVsZCwgJHBhZ2UpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQljYXNlICd0ZXh0JyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkkdG1wX2RhdGFzb3VyY2UgPSBuZXcgc3RkQ2xhc3MoKTsKCQkJCQkJCQkJCgkJCQkJCQkJCSR0bXBfZGF0YXNvdXJjZS0+ZGF0YXNvdXJjZSA9IChpbnQpJGZpZWxkLT5kYXRhc291cmNlOwoJCQkJCQkJCQkkdG1wX2RhdGFzb3VyY2UtPnNvdXJjZXR5cGUgPSAoaW50KSRmaWVsZC0+c291cmNldHlwZTsKCQkJCQkJCQkJJHRtcF9kYXRhc291cmNlLT5zb3VyY2VzcWwgPSAoc3RyaW5nKSRmaWVsZC0+c291cmNlc3FsOwoJCQkJCQkJCQkkdG1wX2RhdGFzb3VyY2UtPnNvdXJjZXNxbHBhcmFtcyA9IChzdHJpbmcpJGZpZWxkLT5zb3VyY2VzcWxwYXJhbXM7CgkJCQkJCQkJCQoJCQkJCQkJCQkkdG1wX2RhdGFzb3VyY2UtPmRiaG9zdCA9IChzdHJpbmcpJGZpZWxkLT5kYmhvc3Q7CgkJCQkJCQkJCSR0bXBfZGF0YXNvdXJjZS0+ZGJzY2hlbWEgPSAoc3RyaW5nKSRmaWVsZC0+ZGJzY2hlbWE7CgkJCQkJCQkJCSR0bXBfZGF0YXNvdXJjZS0+ZGJ1c2VyID0gKHN0cmluZykkZmllbGQtPmRidXNlcjsKCQkJCQkJCQkJJHRtcF9kYXRhc291cmNlLT5kYnB3ZCA9IChzdHJpbmcpJGZpZWxkLT5kYnB3ZDsKCQkJCQkJCQkJJHRtcF9kYXRhc291cmNlLT5kYnNvY2tldCA9IChzdHJpbmcpJGZpZWxkLT5kYnNvY2tldDsKCQkJCQkJCQkJJHRtcF9kYXRhc291cmNlLT5kYnBvcnQgPSAoc3RyaW5nKSRmaWVsZC0+ZGJwb3J0OwoJCQkJCQkJCQkkdG1wX2RhdGFzb3VyY2UtPmRiZHNuID0gKHN0cmluZykkZmllbGQtPmRiZHNuOwoJCQkJCQkJCQkkdG1wX2RhdGFzb3VyY2UtPmRiY29ubmVjdG9yID0gKHN0cmluZykkZmllbGQtPmRiY29ubmVjdG9yOwoJCQkJCQkJCQkkdG1wX2RhdGFzb3VyY2UtPmRiZGVidWdsZXZlbCA9IChpbnQpJGZpZWxkLT5kYmRlYnVnbGV2ZWw7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoKGludCkkZmllbGQtPmF1dG9zdWdnZXN0LT5tb2RlID09IDApewoJCQkJCQkJCQkJaWYoJHRtcF9kYXRhc291cmNlLT5kYmNvbm5lY3RvciA9PSAnJykgeyAKCQkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvY29uZmlnLnBocCIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvJyAuICdjb25maWcucGhwJyk7IAoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvRGF0YWJhc2UucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy8nIC4gJ0RhdGFiYXNlLnBocCcpOwoJCQkJCQkJCQl9CgkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCSRzYXZlcGF0aCA9ICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvanMvYXV0b3N1Z2dlc3QvJzsKCQkJCQkJCQkJCgoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV90ZXh0KCRmaWVsZCwgJHRtcF9kYXRhc291cmNlLCAkc2F2ZXBhdGgsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KCRmaWVsZC0+eydpZCd9LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3RleHQoJGZpZWxkLCAkdG1wX2RhdGFzb3VyY2UsICRzYXZlcGF0aCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAncGFzc3dvcmQnIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfaWQgPSBleHBsb2RlKCdidWNrZXRfJywgKHN0cmluZykkZmllbGQtPmJ1Y2tldCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9wYXNzd29yZCgkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0gZWxzZSB7IAoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQoJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfcGFzc3dvcmQoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQljYXNlICd0ZXh0YXJlYScgOgoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCWlmKGlzc2V0KCRmaWVsZC0+YnVja2V0KSAmJiAoc3RyaW5nKSRmaWVsZC0+YnVja2V0ICE9ICIiKXsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF9pZCA9IGV4cGxvZGUoJ2J1Y2tldF8nLCAoc3RyaW5nKSRmaWVsZC0+YnVja2V0KTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOwoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3RleHRhcmVhKCRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydCgkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfdGV4dGFyZWEoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ3N1Ym1pdCcgOgoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoKGludCkkZmllbGQtPmNhcHRjaGEgPT0gMSl7CgkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvc2VjdXJpdHkvQ2FwdGNoYS9DYXB0Y2hhU2VjdXJpdHlJbWFnZXMucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9zZWN1cml0eS9DYXB0Y2hhLycgLiAnQ2FwdGNoYVNlY3VyaXR5SW1hZ2VzLnBocCcpOwoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL3NlY3VyaXR5L0NhcHRjaGEvbW9ub2ZvbnQudHRmIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9zZWN1cml0eS9DYXB0Y2hhLycgLiAnbW9ub2ZvbnQudHRmJyk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYoKGludCkkZmllbGQtPmNhcHRjaGEgPT0gMil7CgkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvc2VjdXJpdHkvcmVDYXB0Y2hhL3JlY2FwdGNoYWxpYi5waHAiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL3NlY3VyaXR5L3JlQ2FwdGNoYS8nIC4gJ3JlY2FwdGNoYWxpYi5waHAnKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZigoaW50KSRmaWVsZC0+Y2FwdGNoYSA9PSAzKXsKCQkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9zZWN1cml0eS8zRENhcHRjaGEvc3JjL1RleHRHZW4ucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9zZWN1cml0eS8zRENhcHRjaGEvJyAuICdUZXh0R2VuLnBocCcpOwoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL3NlY3VyaXR5LzNEQ2FwdGNoYS9zcmMvM0RDYXB0Y2hhLnBocCIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvc2VjdXJpdHkvM0RDYXB0Y2hhLycgLiAnM0RDYXB0Y2hhLnBocCcpOwoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL3NlY3VyaXR5LzNEQ2FwdGNoYS9zcmMvM0RDYXB0Y2hhLnR0ZiIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvc2VjdXJpdHkvM0RDYXB0Y2hhLycgLiAnM0RDYXB0Y2hhLnR0ZicpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfc3VibWl0X2J1dHRvbigkZmllbGQsICR4bWwtPnNlY3VyaXR5LCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KCRmaWVsZC0+eydpZCd9LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfc3VibWl0X2J1dHRvbigkZmllbGQsICR4bWwtPnNlY3VyaXR5LCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQljYXNlICdyZXNldCcgOgoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCWlmKGlzc2V0KCRmaWVsZC0+YnVja2V0KSAmJiAoc3RyaW5nKSRmaWVsZC0+YnVja2V0ICE9ICIiKXsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF9pZCA9IGV4cGxvZGUoJ2J1Y2tldF8nLCAoc3RyaW5nKSRmaWVsZC0+YnVja2V0KTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOwoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3Jlc2V0X2J1dHRvbigkZm9ybSwgJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KG51bGwsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfcmVzZXRfYnV0dG9uKCRmb3JtLCAkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnYnV0dG9uJyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCWlmKGlzc2V0KCRmaWVsZC0+YnVja2V0KSAmJiAoc3RyaW5nKSRmaWVsZC0+YnVja2V0ICE9ICIiKXsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF9pZCA9IGV4cGxvZGUoJ2J1Y2tldF8nLCAoc3RyaW5nKSRmaWVsZC0+YnVja2V0KTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOwoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2J1dHRvbl9idXR0b24oJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KCRmaWVsZC0+eydpZCd9LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2J1dHRvbl9idXR0b24oJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ3ByaW50JyA6CgkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X25vZGUgPSAkdGhpcy0+Z2V0QnVja2V0RGV0YWlscygkZm9ybSwgJGJ1Y2tldF9pZFsxXSk7CgkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZCwgJGJ1Y2tldF9ub2RlKTsKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9idXR0b25fcHJpbnQoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlLCAkYnVja2V0X25vZGUpOwoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydCgkZmllbGQsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSwgJGZpZWxkLT5lbGVtZW50cG9zKTsgfQoJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfYnV0dG9uX3ByaW50KCRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLCAkZmllbGQsICRmaWVsZC0+ZWxlbWVudHBvcyk7IH0KCQkJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnc2VsZWN0JyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkkaXRlbXNfYXJyYXkgPSBhcnJheSgpOwoJCQkJCQkJCQlmb3JlYWNoKCRmaWVsZC0+c2VsZWN0aXRlbXMgYXMgJGl0bSl7CgkJCQkJCQkJCQkkaXRlbXNfYXJyYXlbXSA9ICRpdG07CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoKHN0cmluZykkZmllbGQtPnNlbGVjdF90ZXh0X29wdGlvbnMgIT0gIiIpewoJCQkJCQkJCQkJJG1hcF9hcnJheSA9ICR0aGlzLT5hcHBlbmRfc2VsZWN0X2l0ZW1fdGV4dF9iYXNlZF9saXN0KChzdHJpbmcpJGZpZWxkLT5zZWxlY3RfdGV4dF9vcHRpb25zLCBjb3VudCgkaXRlbXNfYXJyYXkpKTsKCQkJCQkJCQkJCSRpdGVtc19hcnJheSA9IGFycmF5X21lcmdlKCRpdGVtc19hcnJheSwgJG1hcF9hcnJheSk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZigoaW50KSAkZmllbGQtPmRhdGFzb3VyY2UgPT0gMSl7CgkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvRGF0YWJhc2UucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy8nIC4gJ0RhdGFiYXNlLnBocCcpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmKChzdHJpbmcpICRmaWVsZC0+ZGJjb25uZWN0b3IgPT0gJycgJiYgKHN0cmluZykgJGZpZWxkLT5kYmhvc3QgPT0gJycpewoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2NvbmZpZy5waHAiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnLycgLiAnY29uZmlnLnBocCcpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCWlmKGlzc2V0KCRmaWVsZC0+YnVja2V0KSAmJiAoc3RyaW5nKSRmaWVsZC0+YnVja2V0ICE9ICIiKXsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF9pZCA9IGV4cGxvZGUoJ2J1Y2tldF8nLCAoc3RyaW5nKSRmaWVsZC0+YnVja2V0KTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOwoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3NlbGVjdCgkaXRlbXNfYXJyYXksICRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydCgkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9zZWxlY3QoJGl0ZW1zX2FycmF5LCAkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAncmFkaW8nIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkkaXRlbXNfYXJyYXkgPSBhcnJheSgpOwoJCQkJCQkJCQkKCQkJCQkJCQkJZm9yZWFjaCgkZmllbGQtPnNlbGVjdGl0ZW1zIGFzICRpdG0pewoJCQkJCQkJCQkJJGl0ZW1zX2FycmF5W10gPSAkaXRtOwoJCQkJCQkJCQl9CgkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoKHN0cmluZykkZmllbGQtPnNlbGVjdF90ZXh0X29wdGlvbnMgIT0gIiIpewoJCQkJCQkJCQkJJG1hcF9hcnJheSA9ICR0aGlzLT5hcHBlbmRfc2VsZWN0X2l0ZW1fdGV4dF9iYXNlZF9saXN0KChzdHJpbmcpJGZpZWxkLT5zZWxlY3RfdGV4dF9vcHRpb25zLCBjb3VudCgkaXRlbXNfYXJyYXkpKTsKCQkJCQkJCQkJCSRpdGVtc19hcnJheSA9IGFycmF5X21lcmdlKCRpdGVtc19hcnJheSwgJG1hcF9hcnJheSk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJGZpZWxkdHlwZSAhPSAic2VsZWN0IiAmJiAkcGFnZS0+bGF5b3V0ID09IDApIHsKCQkJCQkJCQkJCQkkZGltcyA9IGV4cGxvZGUoJywnLCAkcGFnZS0+ZGltKTsKCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQkkX3dpZHRoID0gIndpZHRoOnskZGltc1swXX1weDsiOwoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCWlmKGlzc2V0KCRidWNrZXRfbm9kZSkgJiYgJGJ1Y2tldF9ub2RlICE9ICIiICYmIChpbnQpJGJ1Y2tldF9ub2RlLT5yZXBlYXRlci0+cmVzcG9uc2l2ZSA9PSAxKXsKCQkJCQkJCQkJCQkJJF93aWR0aCA9ICd3aWR0aDogODUlOyc7CgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAiPGRpdiBjbGFzcz1cImZiLWNoZWNrYm94LXdyYXBwZXJcIiBzdHlsZT1cInskX3dpZHRofVwiPiI7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9tdWx0aXNlbGVjdCgkcGFnZSwgJGl0ZW1zX2FycmF5LCAkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgewoJCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAiPC9kaXY+IjsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0gZWxzZSB7IAoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQoJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7CgkJCQkJCQkJCQkJJGRpbXMgPSBleHBsb2RlKCcsJywgJHBhZ2UtPmRpbSk7CgkJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gIjxkaXYgY2xhc3M9XCJmYi1jaGVja2JveC13cmFwcGVyXCIgc3R5bGU9XCJ3aWR0aDp7JGRpbXNbMF19cHhcIj4iOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9tdWx0aXNlbGVjdCgkcGFnZSwgJGl0ZW1zX2FycmF5LCAkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgewoJCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICI8L2Rpdj4iOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQl9CgoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnY2hlY2tib3gnIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkkaXRlbXNfYXJyYXkgPSBhcnJheSgpOwoJCQkJCQkJCQlmb3JlYWNoKCRmaWVsZC0+c2VsZWN0aXRlbXMgYXMgJGl0bSl7CgkJCQkJCQkJCQkkaXRlbXNfYXJyYXlbXSA9ICRpdG07CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZigoaW50KSAkZmllbGQtPmRhdGFzb3VyY2UgPT0gMSl7CgkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvRGF0YWJhc2UucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy8nIC4gJ0RhdGFiYXNlLnBocCcpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQlpZigoc3RyaW5nKSAkZmllbGQtPmRiY29ubmVjdG9yID09ICcnICYmIChzdHJpbmcpICRmaWVsZC0+ZGJob3N0ID09ICcnKXsKCQkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9jb25maWcucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy8nIC4gJ2NvbmZpZy5waHAnKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZigoc3RyaW5nKSRmaWVsZC0+c2VsZWN0X3RleHRfb3B0aW9ucyAhPSAiIil7CgkJCQkJCQkJCQkkbWFwX2FycmF5ID0gJHRoaXMtPmFwcGVuZF9zZWxlY3RfaXRlbV90ZXh0X2Jhc2VkX2xpc3QoKHN0cmluZykkZmllbGQtPnNlbGVjdF90ZXh0X29wdGlvbnMsIGNvdW50KCRpdGVtc19hcnJheSkpOwoJCQkJCQkJCQkJJGl0ZW1zX2FycmF5ID0gYXJyYXlfbWVyZ2UoJGl0ZW1zX2FycmF5LCAkbWFwX2FycmF5KTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkZmllbGR0eXBlICE9ICJzZWxlY3QiICYmICRwYWdlLT5sYXlvdXQgPT0gMCkgewoJCQkJCQkJCQkJCSRkaW1zID0gZXhwbG9kZSgnLCcsICRwYWdlLT5kaW0pOwoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCSRfd2lkdGggPSAid2lkdGg6eyRkaW1zWzBdfXB4OyI7CgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJaWYoaXNzZXQoJGJ1Y2tldF9ub2RlKSAmJiAkYnVja2V0X25vZGUgIT0gIiIgJiYgKGludCkkYnVja2V0X25vZGUtPnJlcGVhdGVyLT5yZXNwb25zaXZlID09IDEpewoJCQkJCQkJCQkJCQkkX3dpZHRoID0gJ3dpZHRoOiA4NSU7JzsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICI8ZGl2IGNsYXNzPVwiZmItY2hlY2tib3gtd3JhcHBlclwiIHN0eWxlPVwieyRfd2lkdGh9XCI+IjsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX211bHRpc2VsZWN0KCRwYWdlLCAkaXRlbXNfYXJyYXksICRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7CgkJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICI8L2Rpdj4iOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICc8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+JzsKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KCRmaWVsZC0+eydpZCd9LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7CgkJCQkJCQkJCQkJJGRpbXMgPSBleHBsb2RlKCcsJywgJHBhZ2UtPmRpbSk7CgkJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gIjxkaXYgY2xhc3M9XCJmYi1jaGVja2JveC13cmFwcGVyXCIgc3R5bGU9XCJ3aWR0aDp7JGRpbXNbMF19cHhcIj4iOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9tdWx0aXNlbGVjdCgkcGFnZSwgJGl0ZW1zX2FycmF5LCAkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgewoJCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICI8L2Rpdj4iOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJzxkaXYgc3R5bGU9ImNsZWFyOmJvdGg7Ij48L2Rpdj4nOwoJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2hpZGRlbicgOgoJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9oaWRkZW4oJGZpZWxkLT5sYWJlbCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+bmFtZSwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmlkLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGVmYXVsdHZhbHVlKTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2ZpbGUnIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfaWQgPSBleHBsb2RlKCdidWNrZXRfJywgKHN0cmluZykkZmllbGQtPmJ1Y2tldCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfZmlsZV91cGxvYWRfc3BlYygkZmllbGQtPm1heGZpbGVzaXplLCAnZnVsbCcpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKGlzc2V0KCRmaWVsZC0+aHRtbDUpICYmIChpbnQpJGZpZWxkLT5odG1sNSA9PSAxKXsKCQkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfaHRtbDVfZmlsZSgkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfZmlsZSgkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydCgkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2ZpbGVfdXBsb2FkX3NwZWMoJGZpZWxkLT5tYXhmaWxlc2l6ZSwgJ2Z1bGwnKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5odG1sNSkgJiYgKGludCkkZmllbGQtPmh0bWw1ID09IDEpewoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2h0bWw1X2ZpbGUoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlLCAkeG1sLT5qb2JuYW1lLCAkeG1sLT5kYl9rZXkpOwoJCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9maWxlKCRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnbXVsdGlmaWxlJyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCWlmKCFmaWxlX2V4aXN0cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2xpYi91cGxvYWRpZnkvJykpewoJCQkJCQkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9saWIvdXBsb2FkaWZ5LycsIERJUkVDVE9SWV9NT0QpOwoJCQkJCQkJCQkJJHRoaXMtPmRpcmNvcHkoIi4uL21vdmVmaWxlcy9saWIvdXBsb2FkaWZ5IiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9saWIvdXBsb2FkaWZ5LycpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2NvbmZpZy5waHAiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnLycgLiAnY29uZmlnLnBocCcpOyAKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfaWQgPSBleHBsb2RlKCdidWNrZXRfJywgKHN0cmluZykkZmllbGQtPmJ1Y2tldCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsKCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbXVsdGlmaWxlKCRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KCRmaWVsZC0+eydpZCd9LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX211bHRpZmlsZSgkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2NhbGVuZGFyJyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvY2FsZW5kYXIvJykpewoJCQkJCQkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9jYWxlbmRhci8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvY2FsZW5kYXIvQ2FsZW5kYXJQb3B1cC5qcyIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvY2FsZW5kYXIvJyAuICdDYWxlbmRhclBvcHVwLmpzJyk7CgkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9jYWxlbmRhci9jYWwtc3R5bGUtMC5jc3MiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2NhbGVuZGFyLycgLiAnY2FsLXN0eWxlLTAuY3NzJyk7CgkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9jYWxlbmRhci9jYWwtMC5wbmciLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2NhbGVuZGFyLycgLiAnY2FsLTAucG5nJyk7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2NhbGVuZGFyKCRmaWVsZCwgJHBhZ2UpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KCRmaWVsZC0+eydpZCd9LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2NhbGVuZGFyKCRmaWVsZCwgJHBhZ2UpOwoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnZGF0YWdyaWQnIDoKCgkJCQkJCQkJCQoJCQkJCQkJCQlpZihpc3NldCgkZmllbGQtPmJ1Y2tldCkgJiYgKHN0cmluZykkZmllbGQtPmJ1Y2tldCAhPSAiIil7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfaWQgPSBleHBsb2RlKCdidWNrZXRfJywgKHN0cmluZykkZmllbGQtPmJ1Y2tldCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsKCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfZGF0YWdyaWQoJGZpZWxkLCAkcGFnZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KCRmaWVsZC0+eydpZCd9LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2RhdGFncmlkKCRmaWVsZCwgJHBhZ2UpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ3N1cnZleScgOgoKCQkJCQkJCQkJCgkJCQkJCQkJCWlmKGlzc2V0KCRmaWVsZC0+YnVja2V0KSAmJiAoc3RyaW5nKSRmaWVsZC0+YnVja2V0ICE9ICIiKXsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF9pZCA9IGV4cGxvZGUoJ2J1Y2tldF8nLCAoc3RyaW5nKSRmaWVsZC0+YnVja2V0KTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOwoKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9zdXJ2ZXkoJGZpZWxkLCAkcGFnZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2RW5kKCk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQl9IGVsc2UgeyAKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZTdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPnsnaWQnfSwgJGZpZWxkLT56aW5kZXgsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KCRmaWVsZC0+eydpZCd9LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3N1cnZleSgkZmllbGQsICRwYWdlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQljYXNlICdlcnJvcnRyYXAnIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X2lkID0gZXhwbG9kZSgnYnVja2V0XycsIChzdHJpbmcpJGZpZWxkLT5idWNrZXQpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2Vycm9ydHJhcCgkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0gZWxzZSB7IAoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgbnVsbCwgbnVsbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2Vycm9ydHJhcCgkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkkZXJyb3JfdHJhcF9oaXQgPSAxOwoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ3F1ZXJ5JyA6CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoKGludCkkZmllbGQtPnF1ZXJ5X3RvcCA9PSAwKXsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJGZpZWxkLT5kYmNvbm5lY3RvciA9PSAnJykgeyAKCQkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvY29uZmlnLnBocCIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvJyAuICdjb25maWcucGhwJyk7IAoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvRGF0YWJhc2UucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy8nIC4gJ0RhdGFiYXNlLnBocCcpOwoJCQkJCQkJCQkJJHVzZV9waHBfdGFncyA9IDE7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoaXNzZXQoJGZpZWxkLT5idWNrZXQpICYmIChzdHJpbmcpJGZpZWxkLT5idWNrZXQgIT0gIiIpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkJJGJ1Y2tldF9pZCA9IGV4cGxvZGUoJ2J1Y2tldF8nLCAoc3RyaW5nKSRmaWVsZC0+YnVja2V0KTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7CgoJCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9xdWVyeSgkeG1sLT5qb2JuYW1lLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnNvdXJjZXR5cGUsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJob3N0LCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRic2NoZW1hLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+bW9uZ29jb2xsZWN0aW9uLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRidXNlciwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYnB3ZCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYnNvY2tldCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYnBvcnQsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJkc24sCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYmNvbm5lY3RvciwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9zcWwsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfdmFyaWFibGVzLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X215c3FsNGNvbXBhdCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9kZWJ1Z19sZXZlbCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5jb25kaXRpb24sIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfaW5zZXJ0aWQsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfcmV0dXJuX3Jlc3VsdF92YXIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9mdW5jdGlvbl9jYWxsLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfZnVuY3Rpb25fcmV0dXJuc19yZXN1bHQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9jb2RlLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2FwcGVuZF9sYWJlbCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9hcHBlbmRfdmFsdWUsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfYXBwZW5kX3Bvc2l0aW9uLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkdXNlX3BocF90YWdzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+Y3JlYXRlX2VsZW1lbnRzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZCk7CgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJJGJ1Y2tldF90ZW1wX2RhdGFbInskYnVja2V0X2lkWzFdfSJdIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsKCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJfSBlbHNlIHsgCgoJCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZVBvc2l0aW9uRGl2U3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+emluZGV4LCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCk7IH0KCQkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgbnVsbCwgbnVsbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3F1ZXJ5KCR4bWwtPmpvYm5hbWUsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+c291cmNldHlwZSwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYmhvc3QsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJzY2hlbWEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5tb25nb2NvbGxlY3Rpb24sIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJ1c2VyLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRicHdkLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRic29ja2V0LCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRicG9ydCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYmRzbiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRiY29ubmVjdG9yLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X3NxbCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV92YXJpYWJsZXMsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfbXlzcWw0Y29tcGF0LCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2RlYnVnX2xldmVsLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmNvbmRpdGlvbiwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9pbnNlcnRpZCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9yZXR1cm5fcmVzdWx0X3ZhciwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2Z1bmN0aW9uX2NhbGwsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9mdW5jdGlvbl9yZXR1cm5zX3Jlc3VsdCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2NvZGUsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfYXBwZW5kX2xhYmVsLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2FwcGVuZF92YWx1ZSwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9hcHBlbmRfcG9zaXRpb24sIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSR1c2VfcGhwX3RhZ3MsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5jcmVhdGVfZWxlbWVudHMsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkKTsKCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOyB9CgkJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkKCQkJCQkJCQkKCQkJCQkJCQkKCQkJCQkJCQljYXNlICdlY29tbScgOgoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZigkZmllbGQtPmRiY29ubmVjdG9yID09ICcnKSB7IAoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2NvbmZpZy5waHAiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnLycgLiAnY29uZmlnLnBocCcpOyAKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL0RhdGFiYXNlLnBocCIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvJyAuICdEYXRhYmFzZS5waHAnKTsKCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCWlmKGlzc2V0KCRmaWVsZC0+YnVja2V0KSAmJiAoc3RyaW5nKSRmaWVsZC0+YnVja2V0ICE9ICIiKXsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJGJ1Y2tldF9pZCA9IGV4cGxvZGUoJ2J1Y2tldF8nLCAoc3RyaW5nKSRmaWVsZC0+YnVja2V0KTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOwoKCQkJCQkJCQkJCSRidWNrZXRfdGVtcF9kYXRhWyJ7JGJ1Y2tldF9pZFsxXX0iXSAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9lY29tbSgkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkYnVja2V0X3RlbXBfZGF0YVsieyRidWNrZXRfaWRbMV19Il0gLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdkVuZCgpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfSBlbHNlIHsgCgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVQb3NpdGlvbkRpdlN0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+eydpZCd9LCAkZmllbGQtPnppbmRleCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQoJGZpZWxkLT57J2lkJ30sICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfZWNvbW0oJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJCgkJCQkJCQoJCQkJCQlmb3JlYWNoICgkYnVja2V0X3RlbXBfZGF0YSBhcyAka2V5PT4kYnVja2V0X3ZhbHVlKXsKCQkJCQkJCQoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJCSRidWNrZXRfdmFsdWUgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfYnVja2V0X2VuZCgkZmllbGQpOwoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkYnVja2V0X3ZhbHVlIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlUG9zaXRpb25EaXZFbmQoKTsgfQoJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICRidWNrZXRfdmFsdWUgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCgkJCQkJCQkKCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nID0gc3RyX3JlcGxhY2UoIiMjIiAuICRrZXkgLiAiIyMiLCAkYnVja2V0X3ZhbHVlLCAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyk7CQoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJCQoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJCQoJCQkJCQkJZm9yZWFjaCAoJGZvcm0tPmZpZWxkIGFzICRmaWVsZCl7CgkJCQkJCQkKCQkJCQkJCQlpZigkZmllbGQtPnR5cGUgPT0gJ2J1Y2tldCcgJiYgJGZpZWxkLT5ET01faWQgPT0gJGtleSAmJiAoc3RyaW5nKSRmaWVsZC0+cmVwZWF0ZXItPmVuYWJsZWQgPT0gJzEnKXsKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZighZmlsZV9leGlzdHMoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWNrZXQtcmVwZWF0ZXIvcHJvY2Vzcy1idWNrZXQucGhwJykpewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9idWNrZXQtcmVwZWF0ZXIvcHJvY2Vzcy1idWNrZXQucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWNrZXQtcmVwZWF0ZXIvJyAuICdwcm9jZXNzLWJ1Y2tldC5waHAnKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQl9CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlmaWxlX3B1dF9jb250ZW50cygiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2J1Y2tldC1yZXBlYXRlci8nIC4gJGZpZWxkLT5uYW1lIC4gJy5waHAnLCAkYnVja2V0X3ZhbHVlKTsKCQkJCQkJCQkJCgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQkJCgkJCQkJCQoJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9mb3JtX2VuZCgkcGFnZS0+bGF5b3V0LCAkZXJyb3JfdHJhcF9oaXQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9wYWdlX2VuZCgkcGFnZS0+cGhwZm9vdGVyLCAkcGFnZS0+cGhwYm90dG9tLCAkcGFnZS0+ZXhwb3J0bW9kZSk7CgkJCQkJCQoJCQkJCQkKCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfcGFnZV9wZGZfZW5kKCRwYWdlLT5wZGYsICRwYWdlLT50aXRsZSwgJHBhZ2UtPmZvcm0tPm9uc3VjY2Vzcyk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJY2FzZSAnMScgOiAKCQkJCQkKCQkJCQkkcGFzcyA9IDA7IAoJCQkJCQoJCQkJCQoJCQkJCSRkYl9rZXkgPSAkdGhpcy0+Z2V0Sm9iSWQoJHhtbC0+am9ibmFtZSk7CgkJCQkJCgkJCQkJCgkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfYXNwX29wZW5fYmxvY2soJHBhZ2UtPm5hbWUpOwoJCQkJCQoJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3BhZ2Vfc3RhcnQoJHBhZ2UsICRqc19saWJfbW92ZSk7CgkJCQkJCgkJCQkJCgkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfd3JhcHBlcl9zdGFydCgkcGFnZSwgJHhtbC0+am9ibmFtZSk7CgkJCQkJCQoJCQkJCWZvcmVhY2ggKCRwYWdlLT5mb3JtIGFzICRmb3JtKXsKCgkJCQkJCSRjdCA9IGNvdW50KCRmb3JtLT5maWVsZCk7CgkJCQkJCSRpID0gMTsKCQkJCQkJZm9yZWFjaCAoJGZvcm0tPmZpZWxkIGFzICRmaWVsZCl7CgkJCQkJCQkkdHlwZSA9IChzdHJpbmcpICRmaWVsZC0+eyd0eXBlJ307CgkJCQkJCQkkcGFzcyA9IDE7CgkJCQkJCQlzd2l0Y2ggKCR0eXBlKXsKCQkJCQkJCQkKCQkJCQkJCQljYXNlICdjb25maXJtX3RleHQnIDoKCQkJCQkJCQkJaWYoJHBhc3MgPT0gMSl7CgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9kaXNwbGF5X2Vycm9yX3RyYXAoKTsKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfc3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+emluZGV4KTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KG51bGwsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfY29uZmlybV90ZXh0KCRmaWVsZCwgJHBhZ2UpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X2VuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9kaXNwbGF5X2Vycm9yX3RyYXBfZW5kKCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ3NlY3Rpb25oZWFkZXInIDoKCQkJCQkJCQkJaWYoJHBhc3MgPT0gMSl7CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X3N0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPnppbmRleCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3NlY3Rpb25fdGV4dCgkZmllbGQsICRwYWdlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9lbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQl9CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQljYXNlICdib2R5Y29weScgOgoJCQkJCQkJCQlpZigkcGFzcyA9PSAxKXsKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfc3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+emluZGV4KTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KG51bGwsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfYm9keV9jb3B5KCRmaWVsZCwgJHBhZ2UpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X2VuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCX0KCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2ltYWdlJyA6CgkJCQkJCQkJCWlmKCRwYXNzID09IDEpewoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9zdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT56aW5kZXgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2ltYWdlKCRmaWVsZCwgJHhtbC0+am9ibmFtZSwgJGZvcm0tPm5hbWUsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X2VuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCX0KCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ3ZpZGVvJyA6CgkJCQkJCQkJCWlmKCRwYXNzID09IDEpewoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9zdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT56aW5kZXgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3ZpZGVvKCRmaWVsZCwgJHhtbC0+am9ibmFtZSwgJGZvcm0tPm5hbWUsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X2VuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCX0KCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ3NlcGFyYXRvcicgOgoJCQkJCQkJCQlpZigkcGFzcyA9PSAxKXsKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfc3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+emluZGV4KTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KG51bGwsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfc2VwYXJhdG9yKCRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfZW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJfQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnc3BhY2VyJyA6CgkJCQkJCQkJCWlmKCRwYXNzID09IDEpewoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9zdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPndyYXBwZXJjbGFzcyk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmZvcm1FbGVtZW50LT5jcmVhdGVfc3BhY2VyKCRmaWVsZCwgJHBhZ2UtPnRhYmxlbW9kZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfZW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJfQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnYmFyY29kZScgOgoJCQkJCQkJCQlpZigkcGFzcyA9PSAxKXsKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfc3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+emluZGV4KTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX3N0YXJ0KG51bGwsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPmNvbmRpdGlvbmFsLCAkcGFnZSk7IH0KCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX2JhcmNvZGUoJGZpZWxkLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfZW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJfQoJCQkJCQkJCQlicmVhazsKCgoJCQkJCQkJCX0KCgkJCQkJCQkJCgkJCQkJCQkJJGkrKzsgCgkJCQkJCQl9CgoJCQkJCX0KCQkJCQkKCgkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfd3JhcHBlcl9lbmQoKTsKCgkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcGFnZV9lbmQoJHBhZ2UpOwoJCQkJCgkJCQkJCgkJCQkJYnJlYWs7CgkJCQkKCQkJCQoJCQkJY2FzZSAnMicgOgoJCQkJCQoJCQkJCSRwYXNzID0gMDsgCgkJCQkJCgkJCQkJZm9yZWFjaCAoJHBhZ2UtPmZvcm0gYXMgJGZvcm0pewoJCQkJCQkKCQkJCQkJCgkJCQkJCSRlcnJvcl90cmFwX2hpdCA9IDA7CgkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5idWlsZGVyRWxlbWVudC0+Y3JlYXRlX3BocF90b3AoJHBhZ2UtPnBocHRvcCk7CgkJCQkJCQoJCQkJCQkKCQkJCQkJCgkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5idWlsZGVyRWxlbWVudC0+Y3JlYXRlX3BocF9vcGVuX2Jsb2NrKCR4bWwtPmpvYm5hbWUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRwYWdlLT5uYW1lLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkeG1sLT5zZWN1cml0eSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJHhtbC0+cGhwcGF0aCk7CgkJCQkJCQoJCQkJCQkkaW5jbHVkZV9jYWxlbmRhcl9qcyA9IDA7CgkJCQkJCSR0aW55bWNlID0gMDsgJHRyaXBwZWQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJCQoJCQkJCQlmb3JlYWNoICgkZm9ybS0+ZmllbGQgYXMgJGZpZWxkKXsKCQkJCQkJCSR0eXBlID0gKHN0cmluZykgJGZpZWxkLT57J3R5cGUnfTsKCQkJCQkJCWlmKCR0eXBlID09ICdjYWxlbmRhcicpewoJCQkJCQkJCSRpbmNsdWRlX2NhbGVuZGFyX2pzID0gMTsKCQkJCQkJCX0KCQkJCQkJCWlmKCR0eXBlID09ICd0ZXh0YXJlYScgJiYgISR0cmlwcGVkKXsKCQkJCQkJCQkkdHJpcHBlZCA9IHRydWU7CgkJCQkJCQkJJHRpbnltY2UgPSAoc3RyaW5nKSRmaWVsZC0+dGlueW1jZTsKCQkJCQkJCQkKCQkJCQkJCQlpZigkdGlueW1jZSAhPSAwKXsKCQkJCQkJCQkJbWtkaXIoIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy90aW55X21jZS8nLCBESVJFQ1RPUllfTU9EKTsKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkkdGhpcy0+ZGlyY29weSgiLi4vanMvdGlueW1jZV9leHBvcnQvanNjcmlwdHMvdGlueV9tY2UiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL3RpbnlfbWNlLycpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJCgkJCQkJCQlpZigkdHlwZSA9PSAncXVlcnknICYmIChzdHJpbmcpJGZpZWxkLT5xdWVyeV90b3AgPT0gJzEnKXsKCQkJCQkJCQkKCQkJCQkJCQlpZigkZmllbGQtPmRiY29ubmVjdG9yID09ICcnKSB7IAoJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvY29uZmlnLnBocCIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvJyAuICdjb25maWcucGhwJyk7IAoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvRGF0YWJhc2UucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy8nIC4gJ0RhdGFiYXNlLnBocCcpOwoJCQkJCQkJCSR1c2VfcGhwX3RhZ3MgPSAxOwoJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3F1ZXJ5KCR4bWwtPmpvYm5hbWUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5zb3VyY2V0eXBlLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRiaG9zdCwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYnNjaGVtYSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPm1vbmdvY29sbGVjdGlvbiwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYnVzZXIsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJwd2QsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJzb2NrZXQsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJwb3J0LCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRiZHNuLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJjb25uZWN0b3IsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfc3FsLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X3ZhcmlhYmxlcywgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9teXNxbDRjb21wYXQsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfZGVidWdfbGV2ZWwsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+Y29uZGl0aW9uLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2luc2VydGlkLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X3JldHVybl9yZXN1bHRfdmFyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfZnVuY3Rpb25fY2FsbCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2Z1bmN0aW9uX3JldHVybnNfcmVzdWx0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfY29kZSwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9hcHBlbmRfbGFiZWwsIAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfYXBwZW5kX3ZhbHVlLCAKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2FwcGVuZF9wb3NpdGlvbiwgCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJHVzZV9waHBfdGFncywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmNyZWF0ZV9lbGVtZW50cywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQpOwoJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCQkKCQkJCQkJCQoJCQkJCQkJaWYoJHR5cGUgPT0gJ2J1aWxkZXJfcmVwZWF0ZXInKSB7CgkJCQkJCQkJJHJldCA9ICR0aGlzLT5idWlsZGVyRWxlbWVudC0+Y3JlYXRlX3JlcGVhdGVyKCR4bWwsICRmaWVsZCk7CgkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHJldFswXTsKCQkJCQkJCQkkY29kZSA9ICRyZXRbMV07CgkJCQkJCQl9CQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkKCQkJCQkJCgkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3BhZ2VfcGRmX3N0YXJ0KCRwYWdlKTsKCQkJCQkJCgkJCQkJCQoJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+YnVpbGRlckVsZW1lbnQtPmNyZWF0ZV9wYWdlX3N0YXJ0KCRwYWdlLCAkZmllbGQsICRqc19saWJfbW92ZSwgJGluY2x1ZGVfY2FsZW5kYXJfanMsICR0aW55bWNlKTsKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmJ1aWxkZXJFbGVtZW50LT5jcmVhdGVfZm9ybV9zdGFydCgkZm9ybSwgJHBhZ2UsICR4bWwtPmpvYm5hbWUpOwoJCQkJCQkKCQkJCQkJCgkJCQkJCQoJCQkJCQlmb3JlYWNoICgkZm9ybS0+ZmllbGQgYXMgJGZpZWxkKXsKCQkJCQkJCSR0eXBlID0gKHN0cmluZykgJGZpZWxkLT57J3R5cGUnfTsKCQkJCQkJCXN3aXRjaCAoJHR5cGUpewoJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2J1aWxkZXJfcmVwZWF0ZXInIDoKCQkJCQkJCQkJaWYoIWZpbGVfZXhpc3RzKCIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvYnVpbGRlci8nKSl7CgkJCQkJCQkJCQlta2RpcigiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2J1aWxkZXIvJywgRElSRUNUT1JZX01PRCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvYnVpbGRlci91dGlsaXR5LnBocCIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvYnVpbGRlci8nIC4gJ3V0aWxpdHkucGhwJyk7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoJGZpZWxkLT5kYmNvbm5lY3RvciA9PSAnJykgeyAKCQkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9jb25maWcucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy8nIC4gJ2NvbmZpZy5waHAnKTsgCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9EYXRhYmFzZS5waHAiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnLycgLiAnRGF0YWJhc2UucGhwJyk7CgkJCQkJCQkJCQoJCQkJCQkJCQlpZigkZmllbGQtPnJlcGVhdGVyX3BhZ2luZyA9PSAnMScpIHsKCQkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9idWlsZGVyL1JlY29yZFBhZ2UucGhwIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWlsZGVyLycgLiAnUmVjb3JkUGFnZS5waHAnKTsKCQkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9idWlsZGVyL3BhZ2VyLnBocCIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvYnVpbGRlci8nIC4gJ3BhZ2VyLnBocCcpOwoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2J1aWxkZXIvcGFnZXIuY3NzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWlsZGVyLycgLiAncGFnZXIuY3NzJyk7CgkJCQkJCQkJCQljb3B5KCIuLi9tb3ZlZmlsZXMvYnVpbGRlci9BU0MucG5nIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWlsZGVyLycgLiAnQVNDLnBuZycpOwoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2J1aWxkZXIvREVTQy5wbmciLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2J1aWxkZXIvJyAuICdERVNDLnBuZycpOwoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2J1aWxkZXIvQVNDX0FDVElWRS5wbmciLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnL2J1aWxkZXIvJyAuICdBU0NfQUNUSVZFLnBuZycpOwoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2J1aWxkZXIvREVTQ19BQ1RJVkUucG5nIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWlsZGVyLycgLiAnREVTQ19BQ1RJVkUucG5nJyk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoKGludCkkcGFnZS0+ZXhwb3J0bW9kZSA9PSAwKXsKCQkJCQkJCQkJCWNvcHkoIi4uL21vdmVmaWxlcy9idWlsZGVyL2J1aWxkZXJmb3JtLmpzIiwgIi4uLy4uL291dHB1dC9mb3Jtcy97JHhtbC0+am9ibmFtZX0iIC4gJy9idWlsZGVyLycgLiAnYnVpbGRlcmZvcm0uanMnKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxICYmICRwYWdlLT5leHBvcnRtb2RlID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X3N0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPnppbmRleCk7IH0KCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwICYmICRwYWdlLT5leHBvcnRtb2RlID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmJ1aWxkZXJFbGVtZW50LT5jcmVhdGVfcmVwZWF0ZXJfYm9keSgkeG1sLT5qb2JuYW1lLCAkY29kZSk7CgkJCQkJCQkJCQoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxICYmICRwYWdlLT5leHBvcnRtb2RlID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X2VuZCgpOyB9CgkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCAmJiAkcGFnZS0+ZXhwb3J0bW9kZSA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2NvbmZpcm1fdGV4dCcgOgoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9zdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT56aW5kZXgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfY29uZmlybV90ZXh0KCRmaWVsZC0+eydsYWJlbCd9LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5jb2xvciwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+Zm9udHNpemUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnRhYmxlbW9kZSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+c3R5bGUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkcGFnZS0+cGFnZXBhZGRpbmcsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkcGFnZS0+ZGltKTsKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfZW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2ltYWdlJyA6CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X3N0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPnppbmRleCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9pbWFnZSgkZmllbGQsICR4bWwtPmpvYm5hbWUsICRmb3JtLT5uYW1lLCAkcGFnZS0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9lbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAndmlkZW8nIDoKCQkJCQkJCQkJCWlmKCRwYXNzID09IDEpewoJCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfc3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+emluZGV4KTsgfQoJCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgoJCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3ZpZGVvKCRmaWVsZCwgJHhtbC0+am9ibmFtZSwgJGZvcm0tPm5hbWUsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfZW5kKCk7IH0KCQkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnc2VwYXJhdG9yJyA6CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X3N0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPnppbmRleCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3NlcGFyYXRvcigkZmllbGQsICRwYWdlLT50YWJsZW1vZGUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X2VuZCgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfZW5kKCRwYWdlLT50YWJsZW1vZGUpOyB9CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQljYXNlICdzcGFjZXInIDoKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfc3RhcnQoJGZpZWxkLT5jb3JkcywgJGZpZWxkLT53cmFwcGVyY2xhc3MpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9zcGFjZXIoJGZpZWxkLT5oZWlnaHQsICRmaWVsZC0+dGFibGVtb2RlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9lbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJY2FzZSAnc2VjdGlvbmhlYWRlcicgOgoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9zdGFydCgkZmllbGQtPmNvcmRzLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT56aW5kZXgpOyB9CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDApIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfbGlfc3RhcnQobnVsbCwgJGZpZWxkLT53cmFwcGVyY2xhc3MsICRmaWVsZC0+Y29uZGl0aW9uYWwsICRwYWdlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9zZWN0aW9uX3RleHQoJGZpZWxkLCAkcGFnZSk7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMSkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9wb3NpdGlvbl9kaXZfZW5kKCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9lbmQoJHBhZ2UtPnRhYmxlbW9kZSk7IH0KCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQoJCQkJCQkJCWNhc2UgJ2JvZHljb3B5JyA6CgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X3N0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPnppbmRleCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2JvZHlfY29weSgkZmllbGQsICRwYWdlKTsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9lbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQkJCQkJCgkJCQkJCQkJY2FzZSAncXVlcnknIDoKCQkJCQkJCQkJCgkJCQkJCQkJCQoJCQkJCQkJCQlpZigoaW50KSRmaWVsZC0+cXVlcnlfdG9wID09IDApewoJCQkJCQkJCQkJCgkJCQkJCQkJCQkKCQkJCQkJCQkJCWlmKCRmaWVsZC0+ZGJjb25uZWN0b3IgPT0gJycpIHsgCgkJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL2NvbmZpZy5waHAiLCAiLi4vLi4vb3V0cHV0L2Zvcm1zL3skeG1sLT5qb2JuYW1lfSIgLiAnLycgLiAnY29uZmlnLnBocCcpOyAKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJY29weSgiLi4vbW92ZWZpbGVzL0RhdGFiYXNlLnBocCIsICIuLi8uLi9vdXRwdXQvZm9ybXMveyR4bWwtPmpvYm5hbWV9IiAuICcvJyAuICdEYXRhYmFzZS5waHAnKTsKCQkJCQkJCQkJCSR1c2VfcGhwX3RhZ3MgPSAxOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQlpZigkcGFnZS0+bGF5b3V0ID09IDEpIHsgJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmNvbmZpcm1FbGVtZW50LT5jcmVhdGVfcG9zaXRpb25fZGl2X3N0YXJ0KCRmaWVsZC0+Y29yZHMsICRmaWVsZC0+d3JhcHBlcmNsYXNzLCAkZmllbGQtPnppbmRleCk7IH0KCQkJCQkJCQkJCWlmKCRwYWdlLT5sYXlvdXQgPT0gMCkgeyAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Y29uZmlybUVsZW1lbnQtPmNyZWF0ZV9saV9zdGFydChudWxsLCAkZmllbGQtPndyYXBwZXJjbGFzcywgJGZpZWxkLT5jb25kaXRpb25hbCwgJHBhZ2UpOyB9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5mb3JtRWxlbWVudC0+Y3JlYXRlX3F1ZXJ5KCR4bWwtPmpvYm5hbWUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnNvdXJjZXR5cGUsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRiaG9zdCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJzY2hlbWEsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPm1vbmdvY29sbGVjdGlvbiwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJ1c2VyLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5kYnB3ZCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJzb2NrZXQsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRicG9ydCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+ZGJkc24sCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPmRiY29ubmVjdG9yLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9zcWwsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X3ZhcmlhYmxlcywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfbXlzcWw0Y29tcGF0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9kZWJ1Z19sZXZlbCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+Y29uZGl0aW9uLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9pbnNlcnRpZCwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfcmV0dXJuX3Jlc3VsdF92YXIsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2Z1bmN0aW9uX2NhbGwsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2Z1bmN0aW9uX3JldHVybnNfcmVzdWx0LAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9jb2RlLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkLT5xdWVyeV9hcHBlbmRfbGFiZWwsCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkkZmllbGQtPnF1ZXJ5X2FwcGVuZF92YWx1ZSwKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+cXVlcnlfYXBwZW5kX3Bvc2l0aW9uLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJHVzZV9waHBfdGFncywKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSRmaWVsZC0+Y3JlYXRlX2VsZW1lbnRzLAoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJJGZpZWxkKTsKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAxKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX3Bvc2l0aW9uX2Rpdl9lbmQoKTsgfQoJCQkJCQkJCQkJaWYoJHBhZ2UtPmxheW91dCA9PSAwKSB7ICR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5jb25maXJtRWxlbWVudC0+Y3JlYXRlX2xpX2VuZCgkcGFnZS0+dGFibGVtb2RlKTsgfQoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkKCQkJCQkJCQkJCgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJJHRoaXMtPnRlbXBfZm9ybV9zdHJpbmcgLj0gJHRoaXMtPmJ1aWxkZXJFbGVtZW50LT5jcmVhdGVfZm9ybV9lbmQoJHBhZ2UtPmxheW91dCwgJGVycm9yX3RyYXBfaGl0LCAkcGFnZS0+ZXhwb3J0bW9kZSk7CgkJCQkJCSR0aGlzLT50ZW1wX2Zvcm1fc3RyaW5nIC49ICR0aGlzLT5idWlsZGVyRWxlbWVudC0+Y3JlYXRlX3BhZ2VfZW5kKCRwYWdlLT5leHBvcnRtb2RlLCAkcGFnZS0+cGhwZm9vdGVyLCAkcGFnZS0+cGhwYm90dG9tKTsKCQkJCQkJCgkJCQkJCQoJCQkJCQkkdGhpcy0+dGVtcF9mb3JtX3N0cmluZyAuPSAkdGhpcy0+Zm9ybUVsZW1lbnQtPmNyZWF0ZV9wYWdlX3BkZl9lbmQoJHBhZ2UtPnBkZiwgJHBhZ2UtPnRpdGxlLCAkcGFnZS0+Zm9ybS0+b25zdWNjZXNzKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQkJCQkJCgkJCX0KCQkkdGhpcy0+cGFnZUFycmF5WyJ7JHBhZ2UtPm5hbWV9Il0gPSAkdGhpcy0+dGVtcF9mb3JtX3N0cmluZzsKCQl9CgkJCgl9CgkKCQoJCgkKCXB1YmxpYyBmdW5jdGlvbiBwYXJzZV9hc3BfY29kZV9iZWhpbmRfZmlsZSgkeG1sX3NjaGVtYV9kYXRhKXsKCQkkdGhpcy0+dGVtcF9waHBfc3RyaW5nID0gJyc7CgkJJHBocF9wcm9jZXNzb3IgPSAnJzsKCQkkb25fc3VjY2VzcyA9ICcnOwoJCSRvbl9mYWlsID0gJyc7CgkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxfc2NoZW1hX2RhdGEpOwoJCQoJCQoJCSRkYl9rZXkgPSAkdGhpcy0+Z2V0Sm9iSWQoJHhtbC0+am9ibmFtZSk7CgkJCgkJCgkJCgkJCgkJJGZvcm1fb2JqZWN0X2NsYXNzID0gPDw8RU9GCnB1YmxpYyBjbGFzcyBGb3JtRW50cnkKICAgIHsKCkVPRjsKCQkJCgkJCQoJCSRmb3JtX29iamVjdF9hc3NpZ25tZW50ID0gPDw8RU9GCgkJCiAgICBwdWJsaWMgRm9ybUVudHJ5IENyZWF0ZUZvcm1FbnRyeSgpCiAgICB7CiAgICAgICAJRm9ybUVudHJ5IHJldFZhbCA9IG5ldyBGb3JtRW50cnkoKSB7CgpFT0Y7CgkJCQoJCSRvYmplY3RfY291bnQgPSAwOwoJCQoJCQoJCWZvcmVhY2ggKCR4bWwtPnBhZ2UgYXMgJHBhZ2UgKXsKCQkJCgkJCWZvcmVhY2goJHBhZ2UtPmZvcm0tPmZpZWxkIGFzICRpZHg9PiRmaWVsZCl7CgkJCQkkdHlwZSA9IChzdHJpbmcpICRmaWVsZC0+eyd0eXBlJ307CgkJCQkJCgkJCQkKCQkJCWlmKCR0eXBlID09ICJ0ZXh0IiB8fCAkdHlwZSA9PSAicGFzc3dvcmQiIHx8ICR0eXBlID09ICJ0ZXh0YXJlYSIgfHwgJHR5cGUgPT0gInNlbGVjdCIgfHwgJHR5cGUgPT0gInJhZGlvIiB8fCAkdHlwZSA9PSAiY2hlY2tib3giIHx8ICR0eXBlID09ICJoaWRkZW4iIHx8ICR0eXBlID09ICJjYWxlbmRhciIpewoJCQkJCQoJCQkJCSRmb3JtX29iamVjdF9jbGFzcyAuPSAiXHRcdHB1YmxpYyBzdHJpbmcgeyRmaWVsZC0+bmFtZX0gPSBcIlwiO1xuIjsKCQkJCQkKCQkJCQlpZigkb2JqZWN0X2NvdW50ICE9IDApewoJCQkJCQkkZm9ybV9vYmplY3RfYXNzaWdubWVudCAuPSAiXHRcdFx0LCI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGZvcm1fb2JqZWN0X2Fzc2lnbm1lbnQgLj0gIlx0XHRcdCI7CgkJCQkJfQoJCQkJCQkKCQkJCQkkZm9ybV9vYmplY3RfYXNzaWdubWVudCAuPSAieyRmaWVsZC0+bmFtZX0gPSAoc3RyaW5nKVNlc3Npb25bXCJ7JGZpZWxkLT5uYW1lfVwiXVxuIjsKCQkJCQkKCQkJCQkkb2JqZWN0X2NvdW50Kys7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCQoJCQkJCQoJCQl9CgkJfQoJCQkKCQkkZm9ybV9vYmplY3RfY2xhc3MgLj0gPDw8RU9GCiAgICB9CkVPRjsKCQkKCQkkZm9ybV9vYmplY3RfYXNzaWdubWVudCAuPSA8PDxFT0YKICAgICAgIAl9OwoJCQogICAgICAgCXJldHVybiByZXRWYWw7CiAgICB9CkVPRjsKCgkJCgkJCgkJCgkJCgkJCgkJCgkJJGZvcm1fbGlzdF9hc3NpZ25tZW50ID0gPDw8RU9GCgkJCiAgICBwdWJsaWMgTGlzdDxzdHJpbmc+IENyZWF0ZUZvcm1FbnRyeUxpc3QoKQogICAgewogICAgICAgCUxpc3Q8c3RyaW5nPiBsID0gbmV3IExpc3Q8c3RyaW5nPigpOwpcbgpFT0Y7CgkJCQoJCQoJCWZvcmVhY2ggKCR4bWwtPnBhZ2UgYXMgJHBhZ2UgKXsKCQkJZm9yZWFjaCgkcGFnZS0+Zm9ybS0+ZmllbGQgYXMgJGlkeD0+JGZpZWxkKXsKCQkJCSR0eXBlID0gKHN0cmluZykgJGZpZWxkLT57J3R5cGUnfTsKCQkJCQkKCQkJCQoJCQkJaWYoJHR5cGUgPT0gInRleHQiIHx8ICR0eXBlID09ICJwYXNzd29yZCIgfHwgJHR5cGUgPT0gInRleHRhcmVhIiB8fCAkdHlwZSA9PSAic2VsZWN0IiB8fCAkdHlwZSA9PSAicmFkaW8iIHx8ICR0eXBlID09ICJjaGVja2JveCIgfHwgJHR5cGUgPT0gImhpZGRlbiIgfHwgJHR5cGUgPT0gImNhbGVuZGFyIil7CgkJCQkJCQoJCQkJCWlmKCRpZHggIT0gMCl7CgkJCQkJCSRmb3JtX2xpc3RfYXNzaWdubWVudCAuPSAiXHRcdCI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGZvcm1fbGlzdF9hc3NpZ25tZW50IC49ICJcdFx0IjsKCQkJCQl9CgkJCgkJCQkJJGZvcm1fbGlzdF9hc3NpZ25tZW50IC49ICJsLkFkZCgoc3RyaW5nKVNlc3Npb25bXCJ7JGZpZWxkLT5uYW1lfVwiXSk7XG4iOwoJCQkJCQkKCQkJCX0KCQkKCQkJCQkKCQkJfQoJCX0KCQkKCQkkZm9ybV9saXN0X2Fzc2lnbm1lbnQgLj0gPDw8RU9GCgogICAgICAgCXJldHVybiBsOwogICAgfQpFT0Y7CgkJCgkJCgkJCgkJCgkJCgkJCgkJJGZvcm1fZGljdF9hc3NpZ25tZW50ID0gPDw8RU9GCgkJCiAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+PiBDcmVhdGVGb3JtRW50cnlEaWN0aW9uYXJ5KCkKICAgIHsKICAgICAgIAlEaWN0aW9uYXJ5PHN0cmluZywgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gPiBkID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiA+KCk7CgkJCQkKCQlEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBpID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7ClxuCkVPRjsKCQkJCgkJCgkJZm9yZWFjaCAoJHhtbC0+cGFnZSBhcyAkcGFnZSApewoJCQlmb3JlYWNoKCRwYWdlLT5mb3JtLT5maWVsZCBhcyAkaWR4PT4kZmllbGQpewoJCQkJJHR5cGUgPSAoc3RyaW5nKSAkZmllbGQtPnsndHlwZSd9OwoJCQkJCQoJCQkJaWYoJHR5cGUgPT0gInRleHQiIHx8ICR0eXBlID09ICJwYXNzd29yZCIgfHwgJHR5cGUgPT0gInRleHRhcmVhIiB8fCAkdHlwZSA9PSAic2VsZWN0IiB8fCAkdHlwZSA9PSAicmFkaW8iIHx8ICR0eXBlID09ICJjaGVja2JveCIgfHwgJHR5cGUgPT0gImhpZGRlbiIgIHx8ICR0eXBlID09ICJjYWxlbmRhciIpewoKCQkJCQkkZm9ybV9kaWN0X2Fzc2lnbm1lbnQgLj0gIlx0XHRpID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiI7CgkJCQkJCgkJCQkJJGZvcm1fZGljdF9hc3NpZ25tZW50IC49ICJcdFx0aS5BZGQoXCJuYW1lXCIsIFwieyRmaWVsZC0+bmFtZX1cIik7XG4iOwoJCQkJCSRmb3JtX2RpY3RfYXNzaWdubWVudCAuPSAiXHRcdGkuQWRkKFwibGFiZWxcIiwgXCJ7JGZpZWxkLT5sYWJlbH1cIik7XG4iOwoJCQkJCSRmb3JtX2RpY3RfYXNzaWdubWVudCAuPSAiXHRcdGkuQWRkKFwidmFsdWVcIiwgKHN0cmluZylTZXNzaW9uW1wieyRmaWVsZC0+bmFtZX1cIl0pO1xuIjsKCQkJCQkKCQkJCQkkZm9ybV9kaWN0X2Fzc2lnbm1lbnQgLj0gIlx0XHRkLkFkZChcInskZmllbGQtPm5hbWV9XCIsIGkpO1xuXG4iOwoJCQkJCgkJCQl9CgkJCX0KCQl9CgkJCgkJJGZvcm1fZGljdF9hc3NpZ25tZW50IC49IDw8PEVPRgpcbgoJCXJldHVybiBkOwoJfQpFT0Y7CgkJCgkJCgkJCgkJCgkJCgkJCgkJZm9yZWFjaCgkeG1sLT5wYWdlIGFzICRwYWdlKXsKCQkJCgkJCQoJCQkkdGhpcy0+dGVtcF9waHBfc3RyaW5nID0gIiI7CgkJCQoJCQkKCQkJJGNvbmZpcm1hdGlvbl9wcm9jZXNzX2NvZGUgPSBhcnJheSgnJywgJycpOwoJCQkKCQkJaWYoJHBhZ2UtPnBhZ2V0eXBlID09ICIxIil7CgkJCQkKCQkJCQoJCQkJJGNvbmZpcm1hdGlvbl9wcm9jZXNzX2NvZGUgPSAkdGhpcy0+Y29kZUJlaGluZEVsZW1lbnQtPmNyZWF0ZV9hc3BfY29uZmlybV9pdGVtcygkZmllbGQsICRwYWdlLCAkeG1sLT5qb2JuYW1lKTsKCQkJCQoJCQl9CgkJCQoJCQkKCQkJCgkJCSR0aGlzLT50ZW1wX3BocF9zdHJpbmcgLj0gJHRoaXMtPmNvZGVCZWhpbmRFbGVtZW50LT5jcmVhdGVfYXNwX29wZW4oJHhtbCwgJHBhZ2UsICRmb3JtX29iamVjdF9jbGFzcywgJGZvcm1fb2JqZWN0X2Fzc2lnbm1lbnQsICRmb3JtX2xpc3RfYXNzaWdubWVudCwgJGZvcm1fZGljdF9hc3NpZ25tZW50LCAkY29uZmlybWF0aW9uX3Byb2Nlc3NfY29kZSk7CgoJCQkKCQkJZm9yZWFjaCgkcGFnZS0+Zm9ybS0+ZmllbGQgYXMgJGZpZWxkKXsKCQkJCQkKCQkJCSR0eXBlID0gKHN0cmluZykgJGZpZWxkLT57J3R5cGUnfTsKCQkJCQkKCQkJCXN3aXRjaCAoJHR5cGUpewoJCQkKCQkJCQljYXNlICdzdWJtaXQnIDoKCQkJCQkJCgkJCQkJCQoJCQkJCQkkcHJvY2Vzc19wYWdlID0gbnVsbDsKCQkJCQkJaWYoJHBhZ2UtPmZvcm0tPm9uc3VjY2VzcyAhPSAiIil7CgkJCQkJCQlmb3JlYWNoKCR4bWwtPnBhZ2UtPmZvcm0gYXMgJF9mKXsKCQkJCQkJCQlpZigkX2YtPm5hbWUgPT0gJHBhZ2UtPmZvcm0tPm9uc3VjY2VzcykKCQkJCQkJCQkJJHByb2Nlc3NfcGFnZSA9ICRfZjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQkJCgkJCQkJCSR0aGlzLT50ZW1wX3BocF9zdHJpbmcgLj0gJHRoaXMtPmNvZGVCZWhpbmRFbGVtZW50LT5jcmVhdGVfYXNwX3N1Ym1pdCgkZmllbGQsICRwYWdlLCAkcHJvY2Vzc19wYWdlKTsKCQkJCQkJCQoJCQkJCQlicmVhazsKCQkJCQkJCQoJCQkJfQoJCQl9CgkJCQoJCQkkdGhpcy0+dGVtcF9waHBfc3RyaW5nIC49ICR0aGlzLT5jb2RlQmVoaW5kRWxlbWVudC0+Y3JlYXRlX2FzcF9jbG9zZSgpOwoJCQkJIAoJCQkkdGhpcy0+dGVtcF9waHBfc3RyaW5nIC49ICR0aGlzLT5jb2RlQmVoaW5kRWxlbWVudC0+Y3JlYXRlX3BocF9jbG9zZSgpOwoKCQkJJHRoaXMtPnBhZ2VBcnJheVsieyRwYWdlLT5uYW1lfSJdID0gJHRoaXMtPnRlbXBfcGhwX3N0cmluZzsKCQkJCgkJfQoJCQoJfQoJCgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRQYWdlKCl7CgkJcmV0dXJuICR0aGlzLT5wYWdlQXJyYXk7Cgl9CgkKCQoJcHVibGljIGZ1bmN0aW9uIGdldEpvYklkKCRqb2JfbmFtZSl7CgkJCgkJCgkJCgkJCgkJCgkJCgkJCgkJCgkJCgkJCgkJJGpvYl9uYW1lID0gc3RyX3JlcGxhY2UoJy1tb2JpbGUnLCAnJywgKHN0cmluZykkam9iX25hbWUpOwoJCQkJCQkKCQkkc3FsID0gIlNFTEVDVCBpZCwgam9iX25hbWUgRlJPTSBmYl9qb2JzIFdIRVJFIGpvYl9uYW1lID0gJ3skam9iX25hbWV9JyI7CgkJJHJlc3VsdCA9IERhdGFiYXNlOjpwZG9fcXVlcnkoJHNxbCk7CgkJCgkJcmV0dXJuICRyZXN1bHRbMF1bJ2lkJ107Cgl9CgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCglwdWJsaWMgZnVuY3Rpb24gZGlyY29weSgkc291cmNlLCAkZGVzdCwgJGZvbGRlclBlcm1pc3Npb249RElSRUNUT1JZX01PRCwgJGZpbGVQZXJtaXNzaW9uPTA2NDQpIHsKCgkJCgkJCgkJCgkJCgkJCgkgICAgJHJlc3VsdD1mYWxzZTsKCSAgIAoJICAgIGlmIChpc19maWxlKCRzb3VyY2UpKSB7IAoJICAgICAgICBpZihpc19kaXIoJGRlc3QpKSB7IAoJICAgICAgICAgICAgaWYgKCRkZXN0W3N0cmxlbigkZGVzdCktMV0hPScvJykgCgkgICAgICAgICAgICAgICAgJF9fZGVzdD0kZGVzdC4iLyI7CgkgICAgICAgICAgICAkX19kZXN0IC49IGJhc2VuYW1lKCRzb3VyY2UpOwoJICAgICAgICAgICAgfQoJICAgICAgICBlbHNlIHsgCgkgICAgICAgICAgICAkX19kZXN0PSRkZXN0OwoJICAgICAgICAgICAgfQoJICAgICAgICAkcmVzdWx0PWNvcHkoJHNvdXJjZSwgJF9fZGVzdCk7CgkgICAgICAgIGNobW9kKCRfX2Rlc3QsJGZpbGVQZXJtaXNzaW9uKTsKCSAgICAgICAgfQoJICAgIGVsc2VpZihpc19kaXIoJHNvdXJjZSkpIHsgCgkgICAgICAgIGlmKCFpc19kaXIoJGRlc3QpKSB7IAoJICAgICAgICAgICAgQG1rZGlyKCRkZXN0LCRmb2xkZXJQZXJtaXNzaW9uKTsKCSAgICAgICAgICAgIGNobW9kKCRkZXN0LCRmb2xkZXJQZXJtaXNzaW9uKTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgaWYgKCRzb3VyY2Vbc3RybGVuKCRzb3VyY2UpLTFdIT0nLycpIAoJICAgICAgICAgICAgJHNvdXJjZT0kc291cmNlLiIvIjsKCSAgICAgICAgaWYgKCRkZXN0W3N0cmxlbigkZGVzdCktMV0hPScvJykgCgkgICAgICAgICAgICAkZGVzdD0kZGVzdC4iLyI7CgkKCSAgICAgICAgCgkgICAgICAgICRyZXN1bHQgPSB0cnVlOyAKCSAgICAgICAgJGRpckhhbmRsZT1vcGVuZGlyKCRzb3VyY2UpOwoJICAgICAgICB3aGlsZSgkZmlsZT1yZWFkZGlyKCRkaXJIYW5kbGUpKSB7IAoJICAgICAgICAgICAgaWYoJGZpbGUhPSIuIiAmJiAkZmlsZSE9Ii4uIikgeyAKCQoJICAgICAgICAgICAgICAgICRyZXN1bHQ9JHRoaXMtPmRpcmNvcHkoJHNvdXJjZS4kZmlsZSwgJGRlc3QuJGZpbGUsICRmb2xkZXJQZXJtaXNzaW9uLCAkZmlsZVBlcm1pc3Npb24pOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgY2xvc2VkaXIoJGRpckhhbmRsZSk7CgkgICAgICAgIH0KCSAgICBlbHNlIHsKCSAgICAgICAgJHJlc3VsdD1mYWxzZTsKCSAgICAgICAgfQoJICAgIHJldHVybiAkcmVzdWx0OyAKICAgIAoJfQoJCgkKCXB1YmxpYyBmdW5jdGlvbiBmdWxsX2NvcHkoICRzb3VyY2UsICR0YXJnZXQgKQogICAgewogICAgICAgIGlmICggaXNfZGlyKCAkc291cmNlICkgKQogICAgICAgIHsKICAgICAgICAgICAgQG1rZGlyKCAkdGFyZ2V0ICwgRElSRUNUT1JZX01PRCk7CiAgICAgICAgICAgCiAgICAgICAgICAgICRkID0gZGlyKCAkc291cmNlICk7CiAgICAgICAgICAgCiAgICAgICAgICAgIHdoaWxlICggRkFMU0UgIT09ICggJGVudHJ5ID0gJGQtPnJlYWQoKSApICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkZW50cnkgPT0gJy4nIHx8ICRlbnRyeSA9PSAnLi4nICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkRW50cnkgPSAkc291cmNlIC4gJy8nIC4gJGVudHJ5OyAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoIGlzX2RpciggJEVudHJ5ICkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5mdWxsX2NvcHkoICRFbnRyeSwgJHRhcmdldCAuICcvJyAuICRlbnRyeSApOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29weSggJEVudHJ5LCAkdGFyZ2V0IC4gJy8nIC4gJGVudHJ5ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAKICAgICAgICAgICAgJGQtPmNsb3NlKCk7CiAgICAgICAgfWVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNvcHkoICRzb3VyY2UsICR0YXJnZXQgKTsKICAgICAgICB9CiAgICB9CgkKICAgIHB1YmxpYyBmdW5jdGlvbiBhcHBlbmRfc2VsZWN0X2l0ZW1fdGV4dF9iYXNlZF9saXN0KCRzZWxlY3Rfb3B0aW9ucywgJGNvdW50KXsKICAgIAkKCQkkc2VsZWN0X3RleHRfb3B0aW9ucyA9IGV4cGxvZGUoIlxuIiwgKHN0cmluZykkc2VsZWN0X29wdGlvbnMpOwoJCQoJCQoJCSRtYXBfYXJyYXkgPSBhcnJheSgpOwoKCQlmb3JlYWNoKCRzZWxlY3RfdGV4dF9vcHRpb25zIGFzICRzKXsKCQkJJHQgPSBleHBsb2RlKCJ8IiwgJHMpOwoJCQkkdCA9IGNvdW50KCR0KTsKCQkJaWYoJHQgIT0gMSl7CgkJCQkkdG1wID0gZXhwbG9kZSgifCIsICRzKTsKCQkJCWlmKHN1YnN0cigkcywgMCwgMSkgPT0gIj4iKXsKCQkJCQkkc2VsZWN0ZWQgPSAxOwoJCQkJCQoJCQkJCQoJCQkJCSR0bXBbMF0gPSBzdHJfcmVwbGFjZSgiPiIsICIiLCAkdG1wWzBdKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHNlbGVjdGVkID0gMDsKCQkJCX0KCQkJCQoJCQkJJG1hcF9hcnJheVtdID0gKG9iamVjdClhcnJheSgibmFtZSI9PiR0bXBbMF0sICJ2YWx1ZSI9PiR0bXBbMV0sICJpZCI9PiRjb3VudCwgInNlbGVjdGVkIj0+JHNlbGVjdGVkKTsgCgkJCX0gZWxzZSB7CgkJCQlpZihzdWJzdHIoJHMsIDAsIDEpID09ICI+Iil7CgkJCQkJJHNlbGVjdGVkID0gMTsKCQkJCQkkcyA9IHN0cl9yZXBsYWNlKCI+IiwgIiIsICRzKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHNlbGVjdGVkID0gMDsKCQkJCX0KCQkJCSRtYXBfYXJyYXlbXSA9IChvYmplY3QpYXJyYXkoIm5hbWUiPT4kcywgInZhbHVlIj0+JHMsICJpZCI9PiRjb3VudCwgInNlbGVjdGVkIj0+JHNlbGVjdGVkKTsKCQkJfQoJCQkkY291bnQrKzsKCQl9CgoJCQoJCXJldHVybiAkbWFwX2FycmF5OwoJCQkJCQkJCQkKICAgIH0KICAgIAogICAgCgkKfQoKPz4=')); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | e6ef0f0de4262bdc2daaf69afcd67299 |
Eval Count | 1 |
Decode Time | 567 ms |