Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval(base64_decode("c3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGZ1bmN0aW9uKCRub21icmVDbGFzZSkgey..

Decoded Output download

spl_autoload_register(function($nombreClase) { if (strpos($nombreClase, 'clases') !== FALSE) { if (is_file(str_replace('\', DIRECTORY_SEPARATOR, dirname(__FILE__) . '/' . $nombreClase . '.php'))) { require_once str_replace('\', DIRECTORY_SEPARATOR, dirname(__FILE__) . '/' . $nombreClase . '.php'); } } }, true, true); class imaxeanupdate extends Module { var $versionPS; var $idShop; public $forceCheck; const prefijo = 'imax_updateean_'; private static $cambiadoPorModulo = false, $cacheTraduccionesAtributo = array(); public $valoresCalculo = array('C' => 'Coste', 'P' => 'Venta'); public function __construct() { $this->name = 'imaxeanupdate'; $this->tab = 'administration'; $this->version = '1.76'; $this->author = 'Informax'; $this->sufijo = 'IMAX_UP_'; $this->tabla = 'imax_updateean_'; $this->fileMode = 'utf8'; $this->textMode = 'utf8'; $this->idManual = 99; $this->need_instance = 0; $this->fechaInicio = date('Y-m-d'); $this->fechaFin = date('Y-m-d'); $this->displayName = $this->l('Update by Reference'); $this->description = $this->l('Update by Reference'); $this->debug = 1; $this->numEspacios = 0; if (version_compare(_PS_VERSION_, '1.6.0.0 ', '>=')) { $this->versionPS = 16; $context = Context::getContext(); $this->idShop = $context->shop->id; $this->idLang = $context->language->id; } else if (version_compare(_PS_VERSION_, '1.5.0.0 ', '>=')) { $this->versionPS = 15; $context = Context::getContext(); $this->idShop = $context->shop->id; $this->idLang = $context->language->id; } else if (version_compare(_PS_VERSION_, '1.4.0.0 ', '>=')) { $this->versionPS = 14; $this->idLang = $cookie->id_lang; $this->idShop = 1; } else { $this->l("La version minima de funcionamiento para nuestros modulos es la 1.4"); die(); } parent::__construct(); if (Configuration::getGlobalValue($this->sufijo . 'LICENCIA') == '') { $this->warning = $this->l('La licencia no es valida. Es necesario configurar correctamente la licencia para usar este modulo'); } } public function install() { include(dirname(__FILE__) . '/configuration.php'); foreach ($configuracion AS $indice => $valor) { if (!Configuration::updateValue($indice, $valor)) { return false; } } if (!parent::install()) return false; foreach ($hooks as $hook) { if (!$this->registerHook($hook)) { $this->_errors[] = $this->l('Ha fallado la instalacion del hook:') . ' ' . $hook; return false; } } $token = md5(uniqid()); if (!$this->installTab()) { $this->_errors[] = $this->l('Error al instalar el tab'); return false; } Configuration::updateGlobalValue($this->sufijo . 'F', ''); Configuration::updateGlobalValue($this->sufijo . 'F_CHECK', 1000); Configuration::updateGlobalValue($this->sufijo . 'F_SERVER', 'http://licencia.informax.es/gestionarLicencias.php'); include(dirname(__FILE__) . '/sql-install.php'); foreach ($sql as $s) { if (!Db::getInstance()->execute($s)) { return false; } } $token = md5(uniqid()); Configuration::updateGlobalValue($this->sufijo . 'TOKEN_CRON', $token); $directorioAdmin = getcwd(); if (!@copy(dirname(__FILE__) . '/' . $this->name . 'Cron.php', $directorioAdmin . '/' . $this->name . 'Cron.php')) { $this->_errors[] = $this->l('Se ha producido un error al copiar el archivo de cron general a la carpeta de administracion'); return false; } if (is_file(dirname(__FILE__) . '/' . $this->name . 'Cron.php.imax') && !copy(dirname(__FILE__) . '/' . $this->name . 'Cron.php.imax', $directorioAdmin . '/' . $this->name . 'Cron.php.imax')) { $this->_errors[] = $this->l('Se ha producido un error al copiar el archivo de cron general a la carpeta de administracion'); return false; } if (!@copy(dirname(__FILE__) . '/' . $this->name . 'Ajax.php', $directorioAdmin . '/' . $this->name . 'Ajax.php')) { $this->_errors[] = $this->l('Se ha producido un error al copiar el archivo de cron general a la carpeta de administracion'); return false; } if (is_file(dirname(__FILE__) . '/' . $this->name . 'Ajax.php.imax') && !copy(dirname(__FILE__) . '/' . $this->name . 'Ajax.php.imax', $directorioAdmin . '/' . $this->name . 'Ajax.php.imax')) { $this->_errors[] = $this->l('Se ha producido un error al copiar el archivo de cron general a la carpeta de administracion'); return false; } if (!@copy(dirname(__FILE__) . '/datatableAjax.php', $directorioAdmin . '/datatableAjax.php')) { $this->_errors[] = $this->l('Se ha producido un error al copiar el archivo de datables general a la carpeta de administracion'); return false; } if (!@copy(dirname(__FILE__) . '/datatableAjax.php.imax', $directorioAdmin . '/datatableAjax.php.imax')) { $this->_errors[] = $this->l('Se ha producido un error al copiar el archivo de datables general a la carpeta de administracion'); return false; } if (!@copy(dirname(__FILE__) . '/datatable_lang.php', $directorioAdmin . '/datatable_lang.php')) { $this->_errors[] = $this->l('Se ha producido un error al copiar el archivo de lang general a la carpeta de administracion'); return false; } if (!@copy(dirname(__FILE__) . '/datatable_lang.php.imax', $directorioAdmin . '/datatable_lang.php.imax')) { $this->_errors[] = $this->l('Se ha producido un error al copiar el archivo de lang general a la carpeta de administracion'); return false; } $this->anotarStockInicial(); return true; } public function uninstall() { include(dirname(__FILE__) . '/configuration.php'); foreach ($configuracion AS $indice => $valor) { if (Configuration::get($indice) !== FALSE) { if (!Configuration::deleteByName($indice)) { return false; } } } include(dirname(__FILE__) . '/sql-unninstall.php'); foreach ($sql as $s) { if (!Db::getInstance()->execute($s)) { return false; } } $directorioAdmin = getcwd(); if (!unlink($directorioAdmin . '/' . $this->name . 'Cron.php')) { } if (!$this->uninstallTab()) { $this->_errors[] = $this->l('Error al eliminar el tab'); return false; } if (!parent::uninstall()) { return false; } return true; } private function crearTab($clase, $nombre, $padre = '') { if (!Tab::getIdFromClassName($clase)) { $tab = new Tab(); $tab->active = 1; $tab->class_name = $clase; $tab->name = array(); foreach (Language::getLanguages(true) as $lang) { $tab->name[$lang['id_lang']] = $nombre; } if ($padre == '') { $posicion = 0; } else { $posicion = Tab::getIdFromClassName($padre); } $tab->id_parent = intval($posicion); $tab->module = $this->name; try { if (!$tab->add()) { return false; } } catch (Exception $exc) { return false; } } return true; } private function borrarTab($clase) { $id_tab = (int) Tab::getIdFromClassName($clase); if ($id_tab) { $tab = new Tab($id_tab); try { if (!$tab->delete()) { return false; } } catch (Exception $exc) { return false; } } return true; } private function installTab() { include(dirname(__FILE__) . '/configuration.php'); if (isset($moduleTabRoot) && $moduleTabRoot) { $this->crearTab($moduleTabRoot['clase'], $moduleTabRoot['name']); } if (isset($moduleTabs) && $moduleTabs) { foreach ($moduleTabs AS $moduleTab) { $this->borrarTab($moduleTab['clase']); if (!$this->crearTab($moduleTab['clase'], $moduleTab['name'], $moduleTab['padre'])) { return false; } } } return true; } private function uninstallTab() { include(dirname(__FILE__) . '/configuration.php'); if (isset($moduleTabs) && $moduleTabs) { foreach ($moduleTabs AS $moduleTab) { if (!$this->borrarTab($moduleTab['clase'])) { return false; } } } if (isset($moduleTabRoot) && $moduleTabRoot) { $id_tab = (int) Tab::getIdFromClassName($moduleTabRoot['clase']); if ($id_tab && Tab::getNbTabs($id_tab) == 0) { if (!$this->borrarTab($moduleTabRoot['clase'])) { return false; } } } return true; } public function displayWarning($error) { if ($this->versionPS === 15) { $output = '
		<div class="module_error alert warn">
			' . $error . '
		</div>'; } else { $output = '<div class="bootstrap">' . '<p class="warning warn alert alert-warning">' . $error . '</p></div>'; } return $output; } function addCss($css) { $tab = Tools::getValue('tab', 0); if (!$tab || ($tab && $tab != 'AdminSelfUpgrade')) { $this->context->controller->addCss($this->_path . 'css/' . $css, 'all'); } return; } function addJs($js) { $tab = Tools::getValue('tab', 0); if (!$tab || ($tab && $tab != 'AdminSelfUpgrade')) { $this->context->controller->addJs($this->_path . 'js/' . $js); } return; } public function getContent() { $this->context->controller->addJQueryUI('ui.accordion'); $this->addCSS('css.css'); $this->addJS('functions.js'); $this->addCSS('publi.css'); $this->_html = $this->createHelpHeader(); if (!empty($_POST)) $this->_html .= $this->_postProcess(); $this->_displayForm(); $this->_html .= $this->getModuleFooter(); return $this->_html; } private function _postProcess() { $idTab = Tools::getValue('idTab'); $action = Tools::getValue('action'); $error = 0; if (isset($action) && $action != '') { if ($action == 'addUrl') { $url = trim(Tools::getValue('url')); $modoDebug = Tools::getValue('modoDebug'); if ($modoDebug != 1) { $modoDebug = 0; } if ($url) { if (Configuration::updateGlobalValue($this->sufijo . 'URL_MODULO', $url) && Configuration::updateGlobalValue($this->sufijo . 'MODO_DEBUG', $modoDebug)) { $this->_html .= $this->displayConfirmation('Guardado correcto'); } else { $this->_html .= $this->displayError('Ha ocurrido un error '); } } else { $this->_html .= $this->displayError('La url no debe estar en blanco'); } } if ($action == 'generarToken') { $token = md5(uniqid()); Configuration::updateGlobalValue($this->sufijo . 'TOKEN_CRON', $token); $this->_html .= $this->displayConfirmation($this->l('Token generado correctamente')); } if ($action == 'gestionLicencia') { $licencia = trim(Tools::getValue('licencia')); if (Configuration::updateGlobalValue($this->sufijo . 'LICENCIA', $licencia)) { $this->_html .= $this->displayConfirmation('Licencia guardada correctamente'); } else { $this->_html .= $this->displayError('Ha ocurrido un error al guardar la licencia'); } $this->forceCheck = 1; } if ($action == 'numElementos') { if (Configuration::updateGlobalValue($this->sufijo . 'NUM_ELEMENTOS', Tools::getValue('numElementos')) && Configuration::updateGlobalValue($this->sufijo . 'LOG_ACTIVO', Tools::getValue('logActivo'))) { $this->_html .= $this->displayConfirmation($this->l('Numero de elementos guardado correctamente')); } else { $this->_html .= $this->displayError($this->l('Numero de elementos guardado correctamente')); } } if ($action == 'procesoManual') { $this->procesoManual((int) Tools::getValue('idJob')); } if ($action == 'confModulo') { $formato = trim(Tools::getValue('formato')); $separador = trim(Tools::getValue('separador')); if (Configuration::updateGlobalValue($this->sufijo . 'FORMAT', $formato) && Configuration::updateGlobalValue($this->sufijo . 'POS', trim(Tools::getValue('pos'))) && Configuration::updateGlobalValue($this->sufijo . 'SEPARADOR', trim(Tools::getValue('separador'))) && Configuration::updateGlobalValue($this->sufijo . 'ENC', trim(Tools::getValue('enc'))) && Configuration::updateGlobalValue($this->sufijo . 'POS_STOCK', trim(Tools::getValuJ	JJH	Y\][\]Q[[YJ	\OYZ	PS[J][YJ	X[JJH	Y\][\]Q[[YJ	\OYZ	I[J][YJ	IJJH	Y\][\]Q[[YJ	\OYZ	Q[J][YJ	YJJJH	\O[H	\O\^P\X][	\O
	Y\X[X\YHX[Y[IJNH[H	\O[H	\O\^Q\	\O
	Y\X[X\YHX[Y[IJNHHHH]]H[[\^QJ
H	\O\^QQ^

NH]]H[[\^QQ^

H	\O][\
NY
Y\][][[YJ	\OYZ	PSPIHOH	H	\O[H	]\H\[OHYL	H	\O[H	]\H[\[\]\[	\O[H		\O
	USSHPSPHTHPPIH		\O[H		\O
	XH[X\[[Y\HX[XH[Y\H[X\H		\O[H	]	\O[H	]	\O[H	\O[\X[XJ
N	\OPXHH[ZY
I\OXX[XJ	\OPXJH	\O[H	]\H\[OHYL	H	\O[H	]\H[\[\]\[	\O[H		\O
	USSHPSPHTSQIH		\O[H		\O
	HZX]H[[[[X[XH\[Y\[[YH		\O[H		\O
	YH\ZH\X[YY[X^\HHHX\\]YZ\]X[\\]Y\[\[X[XHHY\XH		\O[H		\O
	[\HY\\H[X[XH]^YH[H[X[H\^Y\HYYY[[XX[H\HY\H[[ZY[H\]]YY\\[[\H		\O[H		\O
	HYH]YH\HY[ZH\[\]\H[X[X[YHX[XKXH[[[Z[[HHY[HHXHHHX\HHYH		\O[H	]	\O[H	]	\O[H	\O[\X[XJ
N	\OPXHH[H	X]\Z^HY\][]
	\OYZ	RVPUIN	Y[\Z^HY\][]
	\OYZ	RVQT	N	Y[\\Z^HY\][]
	\OYZ	TSVIN	YXH
[
H][YJ	YXNY
Z\]
	YXH	YXOH
H	YXHN	\O^O\OY]Y\URJ	ZK]\X\N	\O[H	BO[YHY[UXHYHY[UXH\HY[UX]

	YXOHJH[XYH	K		\O
	Y\\XZH	OHYHY[UX\HY[UX]

	YXOHH[XY
H			\O
	\\X\H	OHYHY[UX\HY[UX]

	YXOHH[XY
H			\O
	X\X\H	OHYHY[UX\HY[UX]

	YXOH
H[XY
H			\O
	X[XIH	OBBO[BBO]YHX\]YHY[UXTY]\HX][I

	YXOHJH[XY
H		\OY[\X[

H	]]YHY[UXY]\HX][I

	YXOHH[XY
H		\O\\
H	]]YHY[UXY]\HX][I

	YXOHH[XY
H		\OX\X\
H	]]YHY[UXY]\HX][I

	YXOH
H[XY
H		\O[\X[XJ
H	]]BBOX\HYBBOBBO[OBBBHY[UX]YY[X\[^X[YYBBBBHY[UXH^X[YY]Y\^N[[NY[
\Y[\YLX[QQQ]ZY\[\\[Y\YQQQ\\Y\YQQQ\]\YQQQBBBBHY[UXKY[UX][XYX[\[Y\Y\\Y\Y\]\YBBBBHX\X\YBBBBKX][H\^NNBBBBKX][K[XY\^NX[\\YY[LY[]BBBO[OBBO\\\U\X[H	\O]	\YZ[\X[H	\O]\YZ[
H	BBBI
Y[UX]KX[[

HBBBH	
Y[UX][XYK[[P\[XYNBBBH	
\KY\[XYNBBBH	
X][K[XYK[[P\[XYNBBBH	

\Y
Y]KY\[XYNBBB_JN	
[\X\[^K[
N	
[][YOXXYWHK]XY[JNBBO\HH]]H[[Y[\X[

H	YY\H\^J
N	YY\[\H\Y\]\Y\
NXX
	YY\[\\	YY[H	YY\HH\^J	YY[\Y\Y\K	YY[\[YIJNH	\Z\\H\Z\N]\Z\\
N	[XX[H\^J
NY
Y\][N][[YJ	QSQPSQSQS	JHXX
	\Z\\\	[XX[\H	[XX[HH\^J	[XX[\Y\Z\IK	[XX[\[YIJNHH	Y[X\H[XYN][XY\
N	\OX\KO\Y	[XX[\[J	[XX[JN	\OX\KO\Y	\W\	]XZ[
YJHTWTWN	\OX\KO\Y	\W\	]XZ[
[JHTWTWN	\OX\KO\Y	YZXIQV	\OXJN	\OX\KO\Y	YY\[J	YY\JN	\OX\KO\Y	Y[X\	Y[X\N	\OX\KO\Y	YZ[\		\O]\YZ[
JN]\	\O\^J	\O[YK	XR	NHXX[[[\[XX[

H	[X[H	XHX]X	\OY[	[X[L	YX		TNXX
	X\	XH	X[X[\HX]X]X]\Y	XYX	JNY
	X[X[\HXX
	X[X[\\	X[X[H	XH]Z[XN]]X[]P]Z[XPTX
	XYX	K	X[X[YX]X]IJN	[H	TPHS	QV[YZ\]XYXY]X]Y[HSQT

[
H	XYX	H		
[
H	X[X[YX]X]IH		
[
H	X	I][[J
KO^X]J	[
NHH[H	XH
[
H]Z[XN]]X[]P]Z[XPTX
	XYX	JN	[H	TPHS	QV[YZ\]XYXY]X]Y[HSQT
	XYX	_I	X	H][[J
KO^X]J	[
NHH	[X[
HLH[H
	XNH]]H[[X\X\
H	\OY	[[\N	\OY	KN	\OY	KN	[H	HX[H	\O]	\Y\HHYH^KX]\YKYHO	[H	]\H[X]	[\H	Y
	[HH[\\[YJSWH	\YJH[H
[HOOH
	[HHXY\	[JJJHY
	[HOH		[HOHH	[\H	\HP\][YOH	[H	[YH	\O]	\[H		[H	HHY\	[JNH	[H	[]\OH][YOH\[YOH	\O
	\H		[H	[\]\	[H]]H[[\\
H	[HY\][]
	\OYZ	SN	\Y[HH	\O]\YZ[
N	[Q[[Y[HY\][][[YJ	\OYZ	SWSSQSN	X]HY\][][[YJ	\OYZ	PUN	\X]\XHY\][][[YJ	\OYZ	TP	N	YH	\O]Y
N	H		[XH	[X[YOHYXX
	Y\	YH	[XH[[YOIYY_IYY_O[	H	HYH	\Y[H	\O[YH	[I	[	YI	YYH	\]H[	\Y[H	\O[YH	[I	[	YI	YYH	OH	[XH	[X	[H		[H	HX[HYS]]
	TTTUQTTIJH	Y]H[]\OHY[[YOHX[[YOH[Q[[Y[	\O
	[Y\[[Y[N	[H	[]\OHY[[YOHYX[YOH[]\OH^[YOH[Q[[Y[[YOH	[Q[[Y[	[]\OHX[YOHX][YOHH	
	X]	XYHXY	H			\O
	X]\H	[]\OHXZ][YOHX\\[Q[[Y[[YOH	\O
	X\\H	O	[H	Y[]Y[	\O
	\HXHX[X[	H	Y[	[H	\O\^U\[	\O
	[Y[\H\\	H	\OYY[\\\
JN	\\\H	\O[[X\\\\
NXX
	Y\	YHY
Y[\J	\\\YYWJJH	[H	\O\^P\X][	\O
	HH\\N	H	\\\YYWV\\IH			\O
	[[[\	H	\\\YYWV\JNHH	[H	HX[HYS]]
	TTTUQTTIJH	Y]H[]\OHY[[YOHX[[YOH\X[X[	[H	[]\OHY[[YOHYX[YOH	\O
	[X[H[XZH\\H			[X	[]\OHXZ][YOH[\\[[YOH	\O
	\HXHX[X[	H	O	[H	Y[]	[H	Y[]Y[	\O
	[HX\H	Y[	[H	]\H\	[H	\H\[\[\[\]\[	\O
	USSH			\O
	H[XXH[[Y[H]YH[XX\[XY[[\\X\HH		[H	]	[H		\O
	XH[X\]H\\[\X[H		[H		[H		[H	HX[HYS]]
	TTTUQTTIJH	Y]H[]\OHY[[YOHX[[YOH[\\[		\O
	[\H[[HY\X[N	[H	[]\OHY[[YOHYX[YOH[]\OHXZ][YOH[\\[[YOH	\O
	[\\[H	O	[H	X[	\O
	[XX[	H	X[X[[OHY	[	X[Y[]]\	[H]]H[[]Y
H]\][[J
KO^X]T	SPYH	QV	\OXH		NH]X[[]\YZ[
H	[\H^J		TTSJN	[[^HH\^W

	[JN	\YZ[H[\J		[NY
Y\][]
	SPQ	HOHJH	\H	H[H	\H	H	\H	TTTTSQIH	\YZ[	]\	\HXX[[XX[XJ	HH
H	]HH\^J
N	HY\][][[YJ	\OYZ	N	XHY\][][[YJ	\OYZ	PN	\HY\][][[YJ	\OYZ	TTN	]V\\HHY\][][[YJ	PRSN	]V[[HH	\O[YN	]VX[HH	XX[XI	]VX[XIHHY\][][[YJ	\OYZ	PSPINY
	XHL	HOHJH	H\[]
	\
N\]
	TUTSTQJN\]
	TPSQSU
JN\]
	TQS	]JN	]H\^X	
N	]HXJ	]N	[H\][	
NY
I]	]O\OH
HY\][\]Q[[YJ	\OYZ		NY\][\]Q[[YJ	\OYZ	P
[
H	X
JN]\[NH[HY\][\]Q[[YJ	\OYZ		]O\\NY\][\]Q[[YJ	\OYZ	P
N]\YNHH[HY\][\]Q[[YJ	\OYZ	P
[
H	X
JN]\YNHH]]H[[][[
H	[[HY\][][[YJ	\OYZ	N]\	[[H[[
	\	[[H		[HH[
HY
	[[OH	H	[[H	YX[\\	\O[YJNH]\\[
	\	[[NHXX[[[YX\J	YX	YX]X]K	Y]P[YY	Y	Y[XX[[\[
H	XH]X
	YX
NY
	XO\PY[YX[Y[Y[

H	]Z[XN\[	YX
H		Y[XX[[\[
H	\[YHYN	X[Y\HX[Y\XN]X[Y\
N	[XX[[\[H]\Z\J	Y[XX[[\[
N	[][[ZY[HY\][][[YJ	USPTQUS	N	[YYXX[H	X[Y\O]XX[]X[]Y\	YX	YX]X]K\^J	Y[XX[[\[
KYJNY
	[YYXX[	Y]P[YY
H	\[YH	X[Y\O[[TX
	YX	YX]X]K	[XX[[\[	[YYXX[H	Y]P[YY	[][[ZY[YK[][\YYJJJNH[ZY
	[YYXX[	Y]P[YY
H	\[YH	X[Y\OYX
	YX	YX]X]K	[XX[[\[	Y]P[YYH	[YYXX[	[][[ZY[
]
H	XOXKYK[][\YYJJJNH]Z[XN[^J	YX
NH[H]Z[XN]]X[]J	YX	YX]X]K	Y]P[YY	Y
N	\[YHYNH]\	\[YH]]H[[\\[[Y[	YH
H	\YH	[Q[[Y[HY\][][[YJ	\OYZ	SWSSQSNY
I[Q[[Y[H	[Q[[Y[HLH	[[Y\[X]Y[]\HH[[N\[XY
	\[X]Y[]\IN	[H	SP
H	QV	\OXH	\]QX[YHSTS	QV	\OXH	YKYHY	TH\YL	
	Y	SYKYH	
[
H	Y	H	SRU		[Q[[Y[	\[H][[J
KO^X]T	[
NXX
	\[T	[[Y[H	[X[XX[^XHH[N	[X[XH[N	Y[PX[X[H[N	X[[XXYH[NY
	[[Y[\X\JH	[[Y[\X\HH^J			[[Y[\X\JN	[[Y[[YYHH^J			[[Y[[YYJNH	[[Y[[YH	\O\\[[Y[
	[[Y[Y[YXYHOH[J	[[Y[X[JH\^J
[
H	[[Y[X[K
[
H	[[Y[Y]X]JJK	[[Y[Y[YXYK	[[Y[YYK	[[Y[YZK	[[Y[YZJNY
I[[Y[[YH	\O\]T\Y[J	[[Y[X[JK	[[Y[YJN[X^]
KOY	\O
	[[Y[[Y	H[J	[[Y[X[JK
K\^J	JN[YNHHY
	[[Y[\\YZ[\JHY
I[[Y[\X\JH	[[Y[HH\XJ	[[Y[\\YZ[\K	[J	[[Y[JJNH	[[Y[IHH\XJ	[[Y[\\YZ[\K	[J	[[Y[67FRuFVVVFw&V6u7G%&W6RFVVVFw6W&F$W2urrG&FVVVFw&V6ubFVVVFw6W&F$FV6W2uFVVVFv67FRu7G%&W6RFVVVFw6W&F$FV6W2urrG&FVVVFv67FRuFVVVFw&V6u7G%&W6RFVVVFw6W&F$FV6W2urrG&FVVVFw&V6ubFVVVFv6&7FW%7F6uFVVVFw7F6uBFVVVFw7F6uV6RFV6G&Ff6Sf&V6FVVVFv6&7FW%7F6u2F6fRF6&7FW"b7G'FvW"G&FVVVFw7F6u7G'FvW"G&F6&7FW"FV6G&FG'VSFVVVFw7F6uBFVVVFv6FFE7F6uF6fU'&VbFVVVFw7F6ubbFV6G&FFVVVFw7F6uFVVVFv67FRufBFVVVFv67FRuFVVVFw&V6ufBFVVVFw&V6ubFVVVFvf&VubbFVVVFw&V6uFVVVFv67FRuFVWf&V6GF2f&VFVVVFv67FRuFVVVFw&V6uFVVVFvf&VubFVWf&V6FVVVFw&V6uV&W%f&BFVWf&V6brrrrbFVVVFV6G&FvE&GV7EGG&'WFRuF6&6Wr6&FFVVVFV6G&FvE&GV7EGG&'WFRuGFVT6&6G'VSFE&GV7FF6&6E&GV7CV6RFE&GV7FFVVVFV6G&FvE&GV7BuGFVF5&GV7F&GV7CvWE64'&GV7BFE&GV7FG7F6&GV7F7F6f&SvWEVFGf&T'&GV7BFE&GV7FFVVVFV6G&FvE&GV7EGG&'WFRuf&V6GFVF5&GV7F2GFVF&GV7FbFVVVFwFVFubbFVVVFwFVFuGFVF&GV7FvE6u6FVS6Vc6WD6FWE6GFVF&GV7FvE6ubFVVVFw57F6u""G7F66bFVVVFw7F6ubFVVVFw7F6uFVVVFw7F6uFVVVFw7F6uFVVVFw7F6ubFVVVFv7E6uF&vV7F6F#vWD7F6RvWEfVRu4TT5B&vVe$rD%$Td6Vc&Vf'7F6WFFVtU$RE&GV7FrFE&GV7FrBDG&'WFwFVVVFV6G&FvE&GV7EGG&'WFRur"G7F6&GV7F7F6f&SvWEVFGf&T'&GV7BFE&GV7FFVVVFV6G&FvE&GV7EGG&'WFRubG7F6&GV7FbbF&vV7F6"F&vV7F6F&vV7F66VcF6&F$GVG'VSGF2Ff6%7F6ttFE&GV7FFVVVFV6G&FvE&GV7EGG&'WFRuFVVVFw7F6uGFVF&GV7FvE6uFVVVFvEv&TW6RuG7F66V6R6VcF6&F$GVG'VSGF2Ff6%7F6ttFE&GV7FFVVVFV6G&FvE&GV7EGG&'WFRuFVVVFw7F6uGFVF&GV7FvE6uFVVVFvEv&TW6Ru6VcF6&F$GVf6SV6RGF2Ff6%7F6ttFE&GV7FFVVVFV6G&FvE&GV7EGG&'WFRuGFVF&GV7FvE6uFVVVFvEv&TW6RubFVVVFV6G&FvE&GV7EGG&'WFRuF&WF7GV&RWr6&FFVVVFV6G&FvE&GV7EGG&'WFRuG&GV7F7GV&RWr&GV7BFE&GV7FV6RF&WF7GV&RWr&GV7BFE&GV7FG&GV7F7GV&RF&WF7GV&SFFF4W7V6f6V6W&RFVVVFvFF2ubFVVVFw5&V6W7V6f6uG&V6W7V6f6'FRFFF4W7V6f6FVVVFw5&V6W7V6f6uG&V6W7V6f6'FRV&W%f&BG&V6W7V6f6'FRbrrrrbG&V6W7V6f6'FRbFVVVFw5&V6W7V6f6fV6uFfV66FFF4W7V6f6FVVVFw5&V6W7V6f6fV6ubFVVVFw5&V6W7V6f6fV6fuFfV6fFFF4W7V6f6FVVVFw5&V6W7V6f6fV6fubFVVVFw4w'W&V6W7V6f6uFw'WFFF4W7V6f6FVVVFw4w'W&V6W7V6f6ubFVVVFV6G&FvE&GV7EGG&'WFRu7V6f5&6SFVWFT'&GV7DBFE&GV7FG&V6W7V6f6Wr7V6f5&6RG&V6W7V6f6&6RV&W%f&BFVVVFw&V6ubrrrrG&V6W7V6f6E6G&V6W7V6f6E6'BbFVVVFV6G&FvE&GV7EGG&'WFRuGF2FVWFT'&GV7DDGG&'WFTBFE&GV7FFVVVFV6G&FvE&GV7EGG&'WFRuG&V6W7V6f6E&GV7EGG&'WFRFVVVFV6G&FvE&GV7EGG&'WFRuG&V6W7V6f6g&VFGG&V6W7V6f6E&GV7BFE&GV7FG&V6W7V6f6E7W'&V7G&V6W7V6f6E6VG'G&V6W7V6f6Ew&WBFw'WFw'WG&V6W7V6f6E7W7FW"G&V6W7V6f6g&FfV66FFRuB2r7G'FFRG&FfV66srG&V6W7V6f6FFfV6fFFRuB2r7G'FFRG&FfV6fsrG&V6W7V6f6&VGV7FGRvVBsG&V6W7V6f6&VGV7FFbFVVVFV6G&FvE&GV7EGG&'WFRuG&V6W7V6f6&VGV7FFVVVFw&V6uG&V6W7V6f6'FSV6RG&V6W7V6f6&VGV7FFVVVFw&V6uG&V6W7V6f6'FSG&V6W7V6f6&VGV7FV&W%f&BG&V6W7V6f6&VGV7FbrrrrG'G&V6W7V6f6FB6F6W6WFFRbFVVVFv67FRuF6&47GV&RG'VSF&WF7GV&RvW6U&6RV&W%f&BFVVVFv67FRubrrrrbFVVVFw&V6uF6&47GV&RG'VSG&V66&FG'VSF&WF7GV&R&6RV&W%f&BFVVVFw&V6ubrrrrbFVVVFvVWFFRuF6&47GV&RG'VSF&WF7GV&RV2FVVVFvVWFFRuFFF56'6V"V6W&RFVVVFvFF2ubVGFVVVFvf'$FuFDFFVVVFvf'$FuV6RFDFVGFFF56'6V%FVVVFw4DFuFFF56'6V%FVVVFw4DFu6fwW&FvWDv&fVRu5uDTdTBrbFVVVFw4'&Ru""F6&5&GV7FG'VSG&GV7F7GV&RUFDFFFF56'6V%FVVVFw4'&RubFVVVFw4FW64&vu""F6&5&GV7FG'VSG&GV7F7GV&RFW67&FFDFFFF56'6V%FVVVFw4FW64&vubFVVVFw4FW646'Fu""F6&5&GV7FG'VSG&GV7F7GV&RFW67&F6'EFDFFFF56'6V%FVVVFw4FW646'FubFVVVFw4f&Tru""F6&5&GV7FG'VSG&GV7F7GV&Rf&UuFDFFFF56'6V%FVVVFw4f&TrubFVVVFw4f&TFW"u""F6&5&GV7FG'VSG&GV7F7GV&Rf&UFW%FDFFFF56'6V%FVVVFw4f&TFW"ubFVVVFw57F6u""bbFVVVFv7E6u7vF6G7F6666RGFWFFVVVFwFWFF7&FE67F6u'&V66RGFWFFVVVFwFWFF7&FE67F6u'&VbF7FFW7FFVDFVfW'bbFVVVFV6G&FvE&GV7EGG&'WFRuGF26W'F%FVW7FFVDFVfW'FE&GV7FFVVVFV6G&FvE&GV7EGG&'WFRu6fwW&FvWDv&fVRu54DTdTBrGFWFV6RF6&5&GV7FG'VSG&GV7F7GV&Rf&UrGFWFbF6&47GV&RF6&5&GV7FbbF&WF7GV&RG&GV7F7GV&RG'F&WF7GV&RWFFR6F6W6WFFWbF6&5&GV7FbbF&WF7GV&RG&GV7F7GV&RG'bGFVT6&6bbG&V66&FG&GV7F7GV&R&6RG&GV7F7GV&RvW6U&6RG&GV7F7GV&RWFFR6F6W6WFFWbFVVVFw4G&'WF&vVubbFVVVFw4G&'WFG&GV66ubbFVVVFvF&vVubbFVVVFvFFW7FubbFVVVFvG4w'WG&'WFuFDt&v6FWCvWD6FWBwVvRC6FWCvWD6FWBwVvRBFVVVFvF&vVuFG&'WF2&GV7CvWDGG&'WFW4f&F4'&GV7BG&GV7F7GV&RB6FWCvWD6FWBwVvRBFDt&vbFG&'WF2G66W4&vVW2WFRrrFVVVFw4G&'WF&vVu'&vG66W4&vVW2gV7FbGf"F6fRGf"G&Gf"G66W5G&GV66W2WFRrrFVVVFw4G&'WFG&GV66u'&vG66W5G&GV66W2gV7FbGf"F6fRGf"G&Gf"FG4w'WG&'WFWFRrrFVVVFvG4w'WG&'WFu'&vFG4w'WG&'WFgV7FbGf"F6fRGf"G&Gf"f&V6FG&'WF22FG&'WFbVG6VcF66UG&GV66W4G&'WFFG&'WFvEGG&'WFRuGG&GV66GF2'W66%G&GV66FG&'WFvEGG&'WFUw&WuFG&'WFvGG&'WFRuFFF56'6V"FG4w'WG&'WFG66W4&vVW2G66W5G&GV66W2bGG&GV66G'FG&'WF&WrGG&'WFRFG&'WFvEGG&'WFRubFG&'WF&UFVVVFvFFW7FuGG&GV66FG&'WF&UFVVVFvFFW7FuGG&GV66FG&'WF&6fR6VcF66UG&GV66W4G&'WFFG&'WFvEGG&'WFRuG'VS6F6W6WFFW6Vc6WDFVfVD6FWE6G&6W6F2svWDrFDrFVVVFvVu"2"GF2u&6W6F6'&V7Fr"Bf6W&FVVVFvD"uB&GV7FFVVVFV6G&FvE&GV7BuB6&6FVVVFV6G&FvE&GV7EGG&'WFRu7F6FVVVFw7F6u67FRFVVVFv67FRufVFFVVVFw&V6u"b'&vrrVVGF&WF7GV&RF&WF7GV&R6F6W6WFFW2V6s&SsV6FW3V6s&SssvWDrFDrFW2vWDW76vR2FW2vWD6FR'&vrrFW2GF2WFFU&6W6FFVVVFvVuFVVVFvD"uFFFWFRFFRuB2rG7uUDDRrD%$TdGF2F&v7GWFFTV6WB&6W6"rFFFWFRr"tU$R&6W6FBD"rBFVVVFvD"uD#vWD7F6RWV7WFRG7&WGW&G&6W6F3V&2gV7FFVWFT'&GV7DDGG&'WFTBFE&GV7BFE&GV7EGG&'WFRbF#vWD7F6RWV7WFRtDTUDRe$rD%$Tdw7V6f5&6VtU$RE&GV7FrBFE&GV7BrBE&GV7EGG&'WFRrFE&GV7EGG&'WFR6fwW&FWFFTv&fVRu55T4d5$4UdTEU$U5DdRr7V6f5&6S47W'&VFW6VBw7V6f5&6Rr&WGW&G'VS&WGW&f6S&fFRgV7F'W66%G&GV66FDw'WG&'WFF'&TG&'WFFFF2FG4w'WG&'WFG66W4&vVW2G66W5G&GV66W2G2'&6V&6FDw'WG&'WFFG4w'WG&'WFbG2f6RF6V&vVW2G66W4&vVW5G5F6VG&GV66W2G66W5G&GV66W5G5F'&W4&vVWFRrrFFF5F6V&vVW5'&vF'&W4&vVgV7FbGf"F6fRGf"GF2FW7FF"%7G'FvW"G&Gf"G5G&GV66'&6V&6GF2FW7FF"%7G'FvW"G&F'&TG&'WFF'&W4&vVbG5G&GV66f6RF'&W5G&GV6F2WFRrrFFF5F6VG&GV66W5&WGW&76WBF'&W5G&GV6F5G5G&GV66G&F'&W5G&GV6F5G5G&GV66f6R&fFRgV7FFW7FF"F6FVF6FV7G%&W6R'&|8r|8r|8"r|8Br|:r|:r|:Br|:"r|*r'&trtrtrtrvrvrvrvrvrF6FVF6FV7G%&W6R'&|8r|8r|8r|8r|:r|:r|:r|:r'&tRrtRrtRrtRrvRrvRrvRrvRrF6FVF6FV7G%&W6R'&|8r|8r|8r|8r|:r|:r|:r|:r'&trtrtrtrvrvrvrvrF6FVF6FV7G%&W6R'&|92r|9"r|9br|9Br|;2r|;"r|;br|;Br'&trtrtrtrvrvrvrvrF6FVF6FV7G%&W6R'&|9r|9r|9r|9r|;r|;r|;r|;r'&uRruRruRruRrwRrwRrwRrwRrF6FV&WGW&F6FV&fFRgV7F6W'F%FVW7FFVDFVfW'FE&GV7BFE&GV7EGG&'WFRFE6G6uF2FE&GV7BBFE&GV7CFE&GV7EGG&'WFRBFE&GV7EGG&'WFSFE6BFE6G6uF2BG6uF3&WGW&F#vWD7F6RWV7WFRu$U4RDrD%$Td&VE&E6&6E&GV7BE&GV7EGG&'WFRE66uF2dTU2rFE&GV7BrrFE&GV7EGG&'WFRrrFE6rrG6uF2r"V&27FF2gV7F6WD6FWE6FE6F6FWB6FWCvWD6FWBF6FWB6Wr6FE666WD6FWBFE6V&27FF2gV7F6WDFVfVD6FWE666WD6FWBBV&2gV7FVFVFW5&6W6"FD"G7u4TT5B6VBe$rD%$TdGF2F&wWFFTVrrtU$R&6W6FrFD"rBD"rBFD"rrG&W7VBD#vWD7F6RvWEfVRG7&WGW&G&W7VCV&2gV7FVF4FW66&v2G&W7VFF'&G7u4TT5Be$rD%$TdGF2F&v7GWFFTVrrtU$R&6W6FsG&W7VBD#vWD7F6RWV7WFU2G7f&V6G&W7VB2G"G&W7VFFG%vD"uG#&WGW&G&W7VFF&fFRgV7F'W66$VVVF2FV%AME0AAA1P)=%8}	}AI%a|=8}}A9}A%(M1
PL}}}I=4}	}AI%a|}((]!I%I(M1
PL}}}I=4}	}AI%a|}((]!I%Ilt}}}lt(M1
PL}}}I=4}	}AI%a|}((]!I}}%Il}}t%(M1
P}L}}I=4}	}AI%a|(]!I%I(M1
P}L}}I=4}	}AI%a|(]!I%I}lt}}(M1
P}L}}I=4}	}AI%a|}(]!I}}%IA)}A|}}A|A|)
5)}}}}%I}|%11
Y1=}
Q%Y<A))}
A%IM1
PAAI=4}	}AI%a|]!I))lAt%LM1
PI=4}	}AI%a|]!I))9)%IM1
PI=4}	}AI%a|]!I))AA
Alt)ltlt)lt)ltl}}t
Amtl}}tl}tAAmtl}tAA}AA
A
AMltM}ltM
A9}}9=P%8
A
%L(M1
P}}}I=4}	}AI%a|}(%99H)=%8}	}AI%a|=8}}(]!IMM

ME
l}t
l}}tMAA9}9=P%8AAA%L(M1
P}I=4}	}AI%a|(]!IMMAAMEAl}tAAAAl}tY1=lAtME
l}tUAQ}	}AI%a|9))%%IM1
PI=4}	}AI%a|]!I))lt}}}%I}|}}}%I}|!QQ@qq!QQ@lt}}%I}|ltltltlt}}}%I}|}}}%I}|Q@qqQ@lt}}%I}|ltltltltlt}}}%I}|}}}%I}|MQ@qqMQ@lt}}%I}|ltltltltlt}}}%I}|}}}%I}|5qq5%0lt}}%I}|ltltltltltltl5tlt}}}%I}|}}}%I}|5qq5%0%9	=`}}%I}|ltltltltltltl5tlt}}}%I}|}}}%I}|!QQ@qq!QQ@lt}}%I}|ltltlt9U10%1QI=4}	}AI%a|]!I))ltltl
t}}}}%I}|}}}}%I}|l=tUQlt}}}%I}|}}}%I}|
MXltppqq
MX}}%I}|lMtltlt}}}%I}|}}}%I}|
MX
MXltltlMtlAtl
tlQtlUtlt}}}%I}|}}}%I}|a50qqa50}}%I}|lat}}}%I}|}}}%I}|a50a50ltltlMtlAtl
tlQtlUtlt}}}%I}|}}}%I}|qq}}%I}|latlMt}}}%I}|}}}%I}|
MX
MXltltlMtlAtl
tlQtlUt9U10}}}%I}|%1M
Y	Q
!}M%iMM%1M)U}	}AI%a|Q}Q)QmtQltQmtQ}
A
1A
d %9MIP%9Q<}	}AI%a|)Y1UL)%15
}Qlt1Qlt}}%I}|}919}Qlt1Qlt}9)19)}}1
Y1%
9
%1Q=}MIYIlIEUMQ}UI$t11
YAM}M!=A}=5%819111}1M@1M}}@}!!A9%Y}%}% $this->l('Asistencia') . '</div>'; $html .= '</a>'; $html .= '</li>'; $html .= '<li>'; $html .= '<a target="_blank" href="http://docs.informax.es/?p=' . $this->idManual . '">'; $html .= '<img src="../modules/' . $this->name . '/img/ir-a-manuales.png">'; $html .= '<div>' . $this->l('Manuales') . '</div>'; $html .= '</a>'; $html .= '</li>'; $html .= '</ul>'; $html .= '</div>'; $html .= '</div>'; return $html; } public function getModuleFooter() { $url = Configuration::getGlobalValue(self::prefijo . 'URL_FALDON'); $html = '<div class="module-newsletter">'; $html .= '<form action="http://www.informax.es/subscribe/" method="post" target="_blank">
                    <input type="hidden" name="accion" value="newsletter">
                    <input type="hidden" name="idTab" value="1" />'; $html .= '<p>' . $this->l('Si deseas enterarte de todos los cambios en nuestros modulos, nuevos Modulos, como funciona Prestashop, apuntate a nuestras news') . '</p>'; $html .= ' <p>'; $html .= ' <label>' . $this->l('email') . '</label>'; $html .= '<input type="text" name="email" value="" />'; $html .= '<input type="submit" name="subscribe" value="' . $this->l('Guardar') . '" />'; $html .= '</p>'; $html .= '</form><br />'; $html .= '</div>'; $html .= '<div class="module-footer">'; $html .= '<div class="module-footer-left">'; $html .= $this->getDatosPubli('footera'); $html .= '</div>'; $html .= '<div class="module-footer-right">'; $html .= $this->getDatosPubli('footerb'); $html .= '</div>'; $html .= '</div>'; return $html; } public function getDatosPubli($tipo) { $datosCompletos = Configuration::getGlobalValue(self::prefijo . 'TXT_FILE'); $html = ''; if ($datosCompletos) { $aperturaA = ''; $cierreA = ''; $datosCompletos = @unserialize($datosCompletos); if (!is_array($datosCompletos)) { return ''; } shuffle($datosCompletos); foreach ($datosCompletos AS $datoElemento) { if ($datoElemento[1] == $tipo) { if (trim($datoElemento[2]) != '') { $aperturaA .= '<a href="' . $datoElemento[2] . '" target="_blank">'; $cierreA = '</a>'; } if (trim($datoElemento[0]) != '') { $html = $aperturaA . '<img src="' . Configuration::getGlobalValue(self::prefijo . 'URL_TXT') . '/img/' . $datoElemento[0] . '" />' . $cierreA; } return $html; } } } return $html; } public function getTxtFiles() { if (Configuration::getGlobalValue(self::prefijo . 'DESCARGA_ARCHIVO') < 10000) { Configuration::updateGlobalValue(self::prefijo . 'DESCARGA_ARCHIVO', Configuration::getGlobalValue(self::prefijo . 'DESCARGA_ARCHIVO') + 1); return false; } $url = Configuration::getGlobalValue(self::prefijo . 'URL_TXT') . '/' . Configuration::getGlobalValue(self::prefijo . 'TIPO') . '.txt'; $basedir_active = ini_get('open_basedir'); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 360); if (!$basedir_active) { curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); } $datos = curl_exec($ch); $infoCurl = curl_getinfo($ch); if (!isset($infoCurl['http_code']) || $infoCurl['http_code'] != 200) { return false; } Configuration::updateGlobalValue(self::prefijo . 'DESCARGA_ARCHIVO', 0); return Configuration::updateGlobalValue(self::prefijo . 'TXT_FILE', $this->readCsv($datos)); } private function readCsv($string) { $string = trim($string); $temp = explode("
", $string); $respuesta = array(); foreach ($temp AS $elemento) { $elementoInterno = array(); $elementoInterno = explode(";", $elemento); $respuesta[] = $elementoInterno; } return serialize($respuesta); } public function hookActionUpdateQuantity($params) { if (self::$cambiadoPorModulo) { $origen = 1; } else { $origen = 2; } $sql = 'REPLACE INTO `' . _DB_PREFIX_ . self::prefijo . "stockUpdate`  " . "(idProducto,idAtributo,stock,origen)" . " VALUES" . "  (" . (int) $params['id_product'] . ',' . (int) $params['id_product_attribute'] . ', ' . (int) $params['quantity'] . ', "' . trim($origen) . '")'; Db::getInstance()->execute($sql); } public function hookDisplayAdminProductsExtra($params) { $idProducto = (int) Tools::getValue('id_product'); $producto = new Product($idProducto); $html = '<table class="table"><thead><tr><th>' . $this->l('Articulo') . '</th><th>' . $this->l('Stock local') . '</th></tr></thead><tbody>'; $combinaciones = $producto->getAttributesResume($this->idLang); if ($combinaciones) { foreach ($combinaciones as $combinacion) { $stockTemp = Db::getInstance()->getValue('SELECT stock FROM `' . _DB_PREFIX_ . self::prefijo . "stockUpdate` WHERE origen = 2 and idProducto = '$idProducto' AND idAtributo = '{$combinacion['id_product_attribute']}'"); $stock = (is_numeric($stockTemp) ? $stockTemp : $this->l('Sin datos')); $html .= "<tr><td>({$combinacion['id_product_attribute']}) {$combinacion['attribute_designation']}</td><td>$stock</td></tr>"; } } else { $stockTemp = Db::getInstance()->getValue('SELECT stock FROM `' . _DB_PREFIX_ . self::prefijo . "stockUpdate` WHERE origen = 2 and idProducto = '$idProducto' AND idAtributo = 0"); $stock = (is_numeric($stockTemp) ? $stockTemp : $this->l('Sin datos')); $html .= "<tr><td>{$producto->name[$this->idLang]}</td><td>$stock</td></tr>"; } $html .= '</tbody></table>'; $this->smarty->assign(array('html' => $html)); return $this->display($this->name, 'views/admin/productTab.tpl'); } }

Did this file decode correctly?

Original Code

<?php 
eval(base64_decode("c3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGZ1bmN0aW9uKCRub21icmVDbGFzZSkgeyBpZiAoc3RycG9zKCRub21icmVDbGFzZSwgJ2NsYXNlcycpICE9PSBGQUxTRSkgeyBpZiAoaXNfZmlsZShzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCBkaXJuYW1lKF9fRklMRV9fKSAuICcvJyAuICRub21icmVDbGFzZSAuICcucGhwJykpKSB7IHJlcXVpcmVfb25jZSBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCBkaXJuYW1lKF9fRklMRV9fKSAuICcvJyAuICRub21icmVDbGFzZSAuICcucGhwJyk7IH0gfSB9LCB0cnVlLCB0cnVlKTsgY2xhc3MgaW1heGVhbnVwZGF0ZSBleHRlbmRzIE1vZHVsZSB7IHZhciAkdmVyc2lvblBTOyB2YXIgJGlkU2hvcDsgcHVibGljICRmb3JjZUNoZWNrOyBjb25zdCBwcmVmaWpvID0gJ2ltYXhfdXBkYXRlZWFuXyc7IHByaXZhdGUgc3RhdGljICRjYW1iaWFkb1Bvck1vZHVsbyA9IGZhbHNlLCAkY2FjaGVUcmFkdWNjaW9uZXNBdHJpYnV0byA9IGFycmF5KCk7IHB1YmxpYyAkdmFsb3Jlc0NhbGN1bG8gPSBhcnJheSgnQycgPT4gJ0Nvc3RlJywgJ1AnID0+ICdWZW50YScpOyBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7ICR0aGlzLT5uYW1lID0gJ2ltYXhlYW51cGRhdGUnOyAkdGhpcy0+dGFiID0gJ2FkbWluaXN0cmF0aW9uJzsgJHRoaXMtPnZlcnNpb24gPSAnMS43Nic7ICR0aGlzLT5hdXRob3IgPSAnSW5mb3JtYXgnOyAkdGhpcy0+c3VmaWpvID0gJ0lNQVhfVVBfJzsgJHRoaXMtPnRhYmxhID0gJ2ltYXhfdXBkYXRlZWFuXyc7ICR0aGlzLT5maWxlTW9kZSA9ICd1dGY4JzsgJHRoaXMtPnRleHRNb2RlID0gJ3V0ZjgnOyAkdGhpcy0+aWRNYW51YWwgPSA5OTsgJHRoaXMtPm5lZWRfaW5zdGFuY2UgPSAwOyAkdGhpcy0+ZmVjaGFJbmljaW8gPSBkYXRlKCdZLW0tZCcpOyAkdGhpcy0+ZmVjaGFGaW4gPSBkYXRlKCdZLW0tZCcpOyAkdGhpcy0+ZGlzcGxheU5hbWUgPSAkdGhpcy0+bCgnVXBkYXRlIGJ5IFJlZmVyZW5jZScpOyAkdGhpcy0+ZGVzY3JpcHRpb24gPSAkdGhpcy0+bCgnVXBkYXRlIGJ5IFJlZmVyZW5jZScpOyAkdGhpcy0+ZGVidWcgPSAxOyAkdGhpcy0+bnVtRXNwYWNpb3MgPSAwOyBpZiAodmVyc2lvbl9jb21wYXJlKF9QU19WRVJTSU9OXywgJzEuNi4wLjAgJywgJz49JykpIHsgJHRoaXMtPnZlcnNpb25QUyA9IDE2OyAkY29udGV4dCA9IENvbnRleHQ6OmdldENvbnRleHQoKTsgJHRoaXMtPmlkU2hvcCA9ICRjb250ZXh0LT5zaG9wLT5pZDsgJHRoaXMtPmlkTGFuZyA9ICRjb250ZXh0LT5sYW5ndWFnZS0+aWQ7IH0gZWxzZSBpZiAodmVyc2lvbl9jb21wYXJlKF9QU19WRVJTSU9OXywgJzEuNS4wLjAgJywgJz49JykpIHsgJHRoaXMtPnZlcnNpb25QUyA9IDE1OyAkY29udGV4dCA9IENvbnRleHQ6OmdldENvbnRleHQoKTsgJHRoaXMtPmlkU2hvcCA9ICRjb250ZXh0LT5zaG9wLT5pZDsgJHRoaXMtPmlkTGFuZyA9ICRjb250ZXh0LT5sYW5ndWFnZS0+aWQ7IH0gZWxzZSBpZiAodmVyc2lvbl9jb21wYXJlKF9QU19WRVJTSU9OXywgJzEuNC4wLjAgJywgJz49JykpIHsgJHRoaXMtPnZlcnNpb25QUyA9IDE0OyAkdGhpcy0+aWRMYW5nID0gJGNvb2tpZS0+aWRfbGFuZzsgJHRoaXMtPmlkU2hvcCA9IDE7IH0gZWxzZSB7ICR0aGlzLT5sKCJMYSB2ZXJzaW9uIG1pbmltYSBkZSBmdW5jaW9uYW1pZW50byBwYXJhIG51ZXN0cm9zIG1vZHVsb3MgZXMgbGEgMS40Iik7IGRpZSgpOyB9IHBhcmVudDo6X19jb25zdHJ1Y3QoKTsgaWYgKENvbmZpZ3VyYXRpb246OmdldEdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnTElDRU5DSUEnKSA9PSAnJykgeyAkdGhpcy0+d2FybmluZyA9ICR0aGlzLT5sKCdMYSBsaWNlbmNpYSBubyBlcyB2YWxpZGEuIEVzIG5lY2VzYXJpbyBjb25maWd1cmFyIGNvcnJlY3RhbWVudGUgbGEgbGljZW5jaWEgcGFyYSB1c2FyIGVzdGUgbW9kdWxvJyk7IH0gfSBwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbCgpIHsgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKSAuICcvY29uZmlndXJhdGlvbi5waHAnKTsgZm9yZWFjaCAoJGNvbmZpZ3VyYWNpb24gQVMgJGluZGljZSA9PiAkdmFsb3IpIHsgaWYgKCFDb25maWd1cmF0aW9uOjp1cGRhdGVWYWx1ZSgkaW5kaWNlLCAkdmFsb3IpKSB7IHJldHVybiBmYWxzZTsgfSB9IGlmICghcGFyZW50OjppbnN0YWxsKCkpIHJldHVybiBmYWxzZTsgZm9yZWFjaCAoJGhvb2tzIGFzICRob29rKSB7IGlmICghJHRoaXMtPnJlZ2lzdGVySG9vaygkaG9vaykpIHsgJHRoaXMtPl9lcnJvcnNbXSA9ICR0aGlzLT5sKCdIYSBmYWxsYWRvIGxhIGluc3RhbGFjaW9uIGRlbCBob29rOicpIC4gJyAnIC4gJGhvb2s7IHJldHVybiBmYWxzZTsgfSB9ICR0b2tlbiA9IG1kNSh1bmlxaWQoKSk7IGlmICghJHRoaXMtPmluc3RhbGxUYWIoKSkgeyAkdGhpcy0+X2Vycm9yc1tdID0gJHRoaXMtPmwoJ0Vycm9yIGFsIGluc3RhbGFyIGVsIHRhYicpOyByZXR1cm4gZmFsc2U7IH0gQ29uZmlndXJhdGlvbjo6dXBkYXRlR2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdGJywgJycpOyBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ0ZfQ0hFQ0snLCAxMDAwKTsgQ29uZmlndXJhdGlvbjo6dXBkYXRlR2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdGX1NFUlZFUicsICdodHRwOi8vbGljZW5jaWEuaW5mb3JtYXguZXMvZ2VzdGlvbmFyTGljZW5jaWFzLnBocCcpOyBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pIC4gJy9zcWwtaW5zdGFsbC5waHAnKTsgZm9yZWFjaCAoJHNxbCBhcyAkcykgeyBpZiAoIURiOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlKCRzKSkgeyByZXR1cm4gZmFsc2U7IH0gfSAkdG9rZW4gPSBtZDUodW5pcWlkKCkpOyBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ1RPS0VOX0NST04nLCAkdG9rZW4pOyAkZGlyZWN0b3Jpb0FkbWluID0gZ2V0Y3dkKCk7IGlmICghQGNvcHkoZGlybmFtZShfX0ZJTEVfXykgLiAnLycgLiAkdGhpcy0+bmFtZSAuICdDcm9uLnBocCcsICRkaXJlY3RvcmlvQWRtaW4gLiAnLycgLiAkdGhpcy0+bmFtZSAuICdDcm9uLnBocCcpKSB7ICR0aGlzLT5fZXJyb3JzW10gPSAkdGhpcy0+bCgnU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGNvcGlhciBlbCBhcmNoaXZvIGRlIGNyb24gZ2VuZXJhbCBhIGxhIGNhcnBldGEgZGUgYWRtaW5pc3RyYWNpb24nKTsgcmV0dXJuIGZhbHNlOyB9IGlmIChpc19maWxlKGRpcm5hbWUoX19GSUxFX18pIC4gJy8nIC4gJHRoaXMtPm5hbWUgLiAnQ3Jvbi5waHAuaW1heCcpICYmICFjb3B5KGRpcm5hbWUoX19GSUxFX18pIC4gJy8nIC4gJHRoaXMtPm5hbWUgLiAnQ3Jvbi5waHAuaW1heCcsICRkaXJlY3RvcmlvQWRtaW4gLiAnLycgLiAkdGhpcy0+bmFtZSAuICdDcm9uLnBocC5pbWF4JykpIHsgJHRoaXMtPl9lcnJvcnNbXSA9ICR0aGlzLT5sKCdTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY29waWFyIGVsIGFyY2hpdm8gZGUgY3JvbiBnZW5lcmFsIGEgbGEgY2FycGV0YSBkZSBhZG1pbmlzdHJhY2lvbicpOyByZXR1cm4gZmFsc2U7IH0gaWYgKCFAY29weShkaXJuYW1lKF9fRklMRV9fKSAuICcvJyAuICR0aGlzLT5uYW1lIC4gJ0FqYXgucGhwJywgJGRpcmVjdG9yaW9BZG1pbiAuICcvJyAuICR0aGlzLT5uYW1lIC4gJ0FqYXgucGhwJykpIHsgJHRoaXMtPl9lcnJvcnNbXSA9ICR0aGlzLT5sKCdTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY29waWFyIGVsIGFyY2hpdm8gZGUgY3JvbiBnZW5lcmFsIGEgbGEgY2FycGV0YSBkZSBhZG1pbmlzdHJhY2lvbicpOyByZXR1cm4gZmFsc2U7IH0gaWYgKGlzX2ZpbGUoZGlybmFtZShfX0ZJTEVfXykgLiAnLycgLiAkdGhpcy0+bmFtZSAuICdBamF4LnBocC5pbWF4JykgJiYgIWNvcHkoZGlybmFtZShfX0ZJTEVfXykgLiAnLycgLiAkdGhpcy0+bmFtZSAuICdBamF4LnBocC5pbWF4JywgJGRpcmVjdG9yaW9BZG1pbiAuICcvJyAuICR0aGlzLT5uYW1lIC4gJ0FqYXgucGhwLmltYXgnKSkgeyAkdGhpcy0+X2Vycm9yc1tdID0gJHRoaXMtPmwoJ1NlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjb3BpYXIgZWwgYXJjaGl2byBkZSBjcm9uIGdlbmVyYWwgYSBsYSBjYXJwZXRhIGRlIGFkbWluaXN0cmFjaW9uJyk7IHJldHVybiBmYWxzZTsgfSBpZiAoIUBjb3B5KGRpcm5hbWUoX19GSUxFX18pIC4gJy9kYXRhdGFibGVBamF4LnBocCcsICRkaXJlY3RvcmlvQWRtaW4gLiAnL2RhdGF0YWJsZUFqYXgucGhwJykpIHsgJHRoaXMtPl9lcnJvcnNbXSA9ICR0aGlzLT5sKCdTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY29waWFyIGVsIGFyY2hpdm8gZGUgZGF0YWJsZXMgZ2VuZXJhbCBhIGxhIGNhcnBldGEgZGUgYWRtaW5pc3RyYWNpb24nKTsgcmV0dXJuIGZhbHNlOyB9IGlmICghQGNvcHkoZGlybmFtZShfX0ZJTEVfXykgLiAnL2RhdGF0YWJsZUFqYXgucGhwLmltYXgnLCAkZGlyZWN0b3Jpb0FkbWluIC4gJy9kYXRhdGFibGVBamF4LnBocC5pbWF4JykpIHsgJHRoaXMtPl9lcnJvcnNbXSA9ICR0aGlzLT5sKCdTZSBoYSBwcm9kdWNpZG8gdW4gZXJyb3IgYWwgY29waWFyIGVsIGFyY2hpdm8gZGUgZGF0YWJsZXMgZ2VuZXJhbCBhIGxhIGNhcnBldGEgZGUgYWRtaW5pc3RyYWNpb24nKTsgcmV0dXJuIGZhbHNlOyB9IGlmICghQGNvcHkoZGlybmFtZShfX0ZJTEVfXykgLiAnL2RhdGF0YWJsZV9sYW5nLnBocCcsICRkaXJlY3RvcmlvQWRtaW4gLiAnL2RhdGF0YWJsZV9sYW5nLnBocCcpKSB7ICR0aGlzLT5fZXJyb3JzW10gPSAkdGhpcy0+bCgnU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGNvcGlhciBlbCBhcmNoaXZvIGRlIGxhbmcgZ2VuZXJhbCBhIGxhIGNhcnBldGEgZGUgYWRtaW5pc3RyYWNpb24nKTsgcmV0dXJuIGZhbHNlOyB9IGlmICghQGNvcHkoZGlybmFtZShfX0ZJTEVfXykgLiAnL2RhdGF0YWJsZV9sYW5nLnBocC5pbWF4JywgJGRpcmVjdG9yaW9BZG1pbiAuICcvZGF0YXRhYmxlX2xhbmcucGhwLmltYXgnKSkgeyAkdGhpcy0+X2Vycm9yc1tdID0gJHRoaXMtPmwoJ1NlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBjb3BpYXIgZWwgYXJjaGl2byBkZSBsYW5nIGdlbmVyYWwgYSBsYSBjYXJwZXRhIGRlIGFkbWluaXN0cmFjaW9uJyk7IHJldHVybiBmYWxzZTsgfSAkdGhpcy0+YW5vdGFyU3RvY2tJbmljaWFsKCk7IHJldHVybiB0cnVlOyB9IHB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoKSB7IGluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykgLiAnL2NvbmZpZ3VyYXRpb24ucGhwJyk7IGZvcmVhY2ggKCRjb25maWd1cmFjaW9uIEFTICRpbmRpY2UgPT4gJHZhbG9yKSB7IGlmIChDb25maWd1cmF0aW9uOjpnZXQoJGluZGljZSkgIT09IEZBTFNFKSB7IGlmICghQ29uZmlndXJhdGlvbjo6ZGVsZXRlQnlOYW1lKCRpbmRpY2UpKSB7IHJldHVybiBmYWxzZTsgfSB9IH0gaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKSAuICcvc3FsLXVubmluc3RhbGwucGhwJyk7IGZvcmVhY2ggKCRzcWwgYXMgJHMpIHsgaWYgKCFEYjo6Z2V0SW5zdGFuY2UoKS0+ZXhlY3V0ZSgkcykpIHsgcmV0dXJuIGZhbHNlOyB9IH0gJGRpcmVjdG9yaW9BZG1pbiA9IGdldGN3ZCgpOyBpZiAoIXVubGluaygkZGlyZWN0b3Jpb0FkbWluIC4gJy8nIC4gJHRoaXMtPm5hbWUgLiAnQ3Jvbi5waHAnKSkgeyB9IGlmICghJHRoaXMtPnVuaW5zdGFsbFRhYigpKSB7ICR0aGlzLT5fZXJyb3JzW10gPSAkdGhpcy0+bCgnRXJyb3IgYWwgZWxpbWluYXIgZWwgdGFiJyk7IHJldHVybiBmYWxzZTsgfSBpZiAoIXBhcmVudDo6dW5pbnN0YWxsKCkpIHsgcmV0dXJuIGZhbHNlOyB9IHJldHVybiB0cnVlOyB9IHByaXZhdGUgZnVuY3Rpb24gY3JlYXJUYWIoJGNsYXNlLCAkbm9tYnJlLCAkcGFkcmUgPSAnJykgeyBpZiAoIVRhYjo6Z2V0SWRGcm9tQ2xhc3NOYW1lKCRjbGFzZSkpIHsgJHRhYiA9IG5ldyBUYWIoKTsgJHRhYi0+YWN0aXZlID0gMTsgJHRhYi0+Y2xhc3NfbmFtZSA9ICRjbGFzZTsgJHRhYi0+bmFtZSA9IGFycmF5KCk7IGZvcmVhY2ggKExhbmd1YWdlOjpnZXRMYW5ndWFnZXModHJ1ZSkgYXMgJGxhbmcpIHsgJHRhYi0+bmFtZVskbGFuZ1snaWRfbGFuZyddXSA9ICRub21icmU7IH0gaWYgKCRwYWRyZSA9PSAnJykgeyAkcG9zaWNpb24gPSAwOyB9IGVsc2UgeyAkcG9zaWNpb24gPSBUYWI6OmdldElkRnJvbUNsYXNzTmFtZSgkcGFkcmUpOyB9ICR0YWItPmlkX3BhcmVudCA9IGludHZhbCgkcG9zaWNpb24pOyAkdGFiLT5tb2R1bGUgPSAkdGhpcy0+bmFtZTsgdHJ5IHsgaWYgKCEkdGFiLT5hZGQoKSkgeyByZXR1cm4gZmFsc2U7IH0gfSBjYXRjaCAoRXhjZXB0aW9uICRleGMpIHsgcmV0dXJuIGZhbHNlOyB9IH0gcmV0dXJuIHRydWU7IH0gcHJpdmF0ZSBmdW5jdGlvbiBib3JyYXJUYWIoJGNsYXNlKSB7ICRpZF90YWIgPSAoaW50KSBUYWI6OmdldElkRnJvbUNsYXNzTmFtZSgkY2xhc2UpOyBpZiAoJGlkX3RhYikgeyAkdGFiID0gbmV3IFRhYigkaWRfdGFiKTsgdHJ5IHsgaWYgKCEkdGFiLT5kZWxldGUoKSkgeyByZXR1cm4gZmFsc2U7IH0gfSBjYXRjaCAoRXhjZXB0aW9uICRleGMpIHsgcmV0dXJuIGZhbHNlOyB9IH0gcmV0dXJuIHRydWU7IH0gcHJpdmF0ZSBmdW5jdGlvbiBpbnN0YWxsVGFiKCkgeyBpbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pIC4gJy9jb25maWd1cmF0aW9uLnBocCcpOyBpZiAoaXNzZXQoJG1vZHVsZVRhYlJvb3QpICYmICRtb2R1bGVUYWJSb290KSB7ICR0aGlzLT5jcmVhclRhYigkbW9kdWxlVGFiUm9vdFsnY2xhc2UnXSwgJG1vZHVsZVRhYlJvb3RbJ25hbWUnXSk7IH0gaWYgKGlzc2V0KCRtb2R1bGVUYWJzKSAmJiAkbW9kdWxlVGFicykgeyBmb3JlYWNoICgkbW9kdWxlVGFicyBBUyAkbW9kdWxlVGFiKSB7ICR0aGlzLT5ib3JyYXJUYWIoJG1vZHVsZVRhYlsnY2xhc2UnXSk7IGlmICghJHRoaXMtPmNyZWFyVGFiKCRtb2R1bGVUYWJbJ2NsYXNlJ10sICRtb2R1bGVUYWJbJ25hbWUnXSwgJG1vZHVsZVRhYlsncGFkcmUnXSkpIHsgcmV0dXJuIGZhbHNlOyB9IH0gfSByZXR1cm4gdHJ1ZTsgfSBwcml2YXRlIGZ1bmN0aW9uIHVuaW5zdGFsbFRhYigpIHsgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKSAuICcvY29uZmlndXJhdGlvbi5waHAnKTsgaWYgKGlzc2V0KCRtb2R1bGVUYWJzKSAmJiAkbW9kdWxlVGFicykgeyBmb3JlYWNoICgkbW9kdWxlVGFicyBBUyAkbW9kdWxlVGFiKSB7IGlmICghJHRoaXMtPmJvcnJhclRhYigkbW9kdWxlVGFiWydjbGFzZSddKSkgeyByZXR1cm4gZmFsc2U7IH0gfSB9IGlmIChpc3NldCgkbW9kdWxlVGFiUm9vdCkgJiYgJG1vZHVsZVRhYlJvb3QpIHsgJGlkX3RhYiA9IChpbnQpIFRhYjo6Z2V0SWRGcm9tQ2xhc3NOYW1lKCRtb2R1bGVUYWJSb290WydjbGFzZSddKTsgaWYgKCRpZF90YWIgJiYgVGFiOjpnZXROYlRhYnMoJGlkX3RhYikgPT0gMCkgeyBpZiAoISR0aGlzLT5ib3JyYXJUYWIoJG1vZHVsZVRhYlJvb3RbJ2NsYXNlJ10pKSB7IHJldHVybiBmYWxzZTsgfSB9IH0gcmV0dXJuIHRydWU7IH0gcHVibGljIGZ1bmN0aW9uIGRpc3BsYXlXYXJuaW5nKCRlcnJvcikgeyBpZiAoJHRoaXMtPnZlcnNpb25QUyA9PT0gMTUpIHsgJG91dHB1dCA9ICcKCQk8ZGl2IGNsYXNzPSJtb2R1bGVfZXJyb3IgYWxlcnQgd2FybiI+CgkJCScgLiAkZXJyb3IgLiAnCgkJPC9kaXY+JzsgfSBlbHNlIHsgJG91dHB1dCA9ICc8ZGl2IGNsYXNzPSJib290c3RyYXAiPicgLiAnPHAgY2xhc3M9Indhcm5pbmcgd2FybiBhbGVydCBhbGVydC13YXJuaW5nIj4nIC4gJGVycm9yIC4gJzwvcD48L2Rpdj4nOyB9IHJldHVybiAkb3V0cHV0OyB9IGZ1bmN0aW9uIGFkZENzcygkY3NzKSB7ICR0YWIgPSBUb29sczo6Z2V0VmFsdWUoJ3RhYicsIDApOyBpZiAoISR0YWIgfHwgKCR0YWIgJiYgJHRhYiAhPSAnQWRtaW5TZWxmVXBncmFkZScpKSB7ICR0aGlzLT5jb250ZXh0LT5jb250cm9sbGVyLT5hZGRDc3MoJHRoaXMtPl9wYXRoIC4gJ2Nzcy8nIC4gJGNzcywgJ2FsbCcpOyB9IHJldHVybjsgfSBmdW5jdGlvbiBhZGRKcygkanMpIHsgJHRhYiA9IFRvb2xzOjpnZXRWYWx1ZSgndGFiJywgMCk7IGlmICghJHRhYiB8fCAoJHRhYiAmJiAkdGFiICE9ICdBZG1pblNlbGZVcGdyYWRlJykpIHsgJHRoaXMtPmNvbnRleHQtPmNvbnRyb2xsZXItPmFkZEpzKCR0aGlzLT5fcGF0aCAuICdqcy8nIC4gJGpzKTsgfSByZXR1cm47IH0gcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnQoKSB7ICR0aGlzLT5jb250ZXh0LT5jb250cm9sbGVyLT5hZGRKUXVlcnlVSSgndWkuYWNjb3JkaW9uJyk7ICR0aGlzLT5hZGRDU1MoJ2Nzcy5jc3MnKTsgJHRoaXMtPmFkZEpTKCdmdW5jdGlvbnMuanMnKTsgJHRoaXMtPmFkZENTUygncHVibGkuY3NzJyk7ICR0aGlzLT5faHRtbCA9ICR0aGlzLT5jcmVhdGVIZWxwSGVhZGVyKCk7IGlmICghZW1wdHkoJF9QT1NUKSkgJHRoaXMtPl9odG1sIC49ICR0aGlzLT5fcG9zdFByb2Nlc3MoKTsgJHRoaXMtPl9kaXNwbGF5Rm9ybSgpOyAkdGhpcy0+X2h0bWwgLj0gJHRoaXMtPmdldE1vZHVsZUZvb3RlcigpOyByZXR1cm4gJHRoaXMtPl9odG1sOyB9IHByaXZhdGUgZnVuY3Rpb24gX3Bvc3RQcm9jZXNzKCkgeyAkaWRUYWIgPSBUb29sczo6Z2V0VmFsdWUoJ2lkVGFiJyk7ICRhY3Rpb24gPSBUb29sczo6Z2V0VmFsdWUoJ2FjdGlvbicpOyAkZXJyb3IgPSAwOyBpZiAoaXNzZXQoJGFjdGlvbikgJiYgJGFjdGlvbiAhPSAnJykgeyBpZiAoJGFjdGlvbiA9PSAnYWRkVXJsJykgeyAkdXJsID0gdHJpbShUb29sczo6Z2V0VmFsdWUoJ3VybCcpKTsgJG1vZG9EZWJ1ZyA9IFRvb2xzOjpnZXRWYWx1ZSgnbW9kb0RlYnVnJyk7IGlmICgkbW9kb0RlYnVnICE9IDEpIHsgJG1vZG9EZWJ1ZyA9IDA7IH0gaWYgKCR1cmwpIHsgaWYgKENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnVVJMX01PRFVMTycsICR1cmwpICYmIENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnTU9ET19ERUJVRycsICRtb2RvRGVidWcpKSB7ICR0aGlzLT5faHRtbCAuPSAkdGhpcy0+ZGlzcGxheUNvbmZpcm1hdGlvbignR3VhcmRhZG8gY29ycmVjdG8nKTsgfSBlbHNlIHsgJHRoaXMtPl9odG1sIC49ICR0aGlzLT5kaXNwbGF5RXJyb3IoJ0hhIG9jdXJyaWRvIHVuIGVycm9yICcpOyB9IH0gZWxzZSB7ICR0aGlzLT5faHRtbCAuPSAkdGhpcy0+ZGlzcGxheUVycm9yKCdMYSB1cmwgbm8gZGViZSBlc3RhciBlbiBibGFuY28nKTsgfSB9IGlmICgkYWN0aW9uID09ICdnZW5lcmFyVG9rZW4nKSB7ICR0b2tlbiA9IG1kNSh1bmlxaWQoKSk7IENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnVE9LRU5fQ1JPTicsICR0b2tlbik7ICR0aGlzLT5faHRtbCAuPSAkdGhpcy0+ZGlzcGxheUNvbmZpcm1hdGlvbigkdGhpcy0+bCgnVG9rZW4gZ2VuZXJhZG8gY29ycmVjdGFtZW50ZScpKTsgfSBpZiAoJGFjdGlvbiA9PSAnZ2VzdGlvbkxpY2VuY2lhJykgeyAkbGljZW5jaWEgPSB0cmltKFRvb2xzOjpnZXRWYWx1ZSgnbGljZW5jaWEnKSk7IGlmIChDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ0xJQ0VOQ0lBJywgJGxpY2VuY2lhKSkgeyAkdGhpcy0+X2h0bWwgLj0gJHRoaXMtPmRpc3BsYXlDb25maXJtYXRpb24oJ0xpY2VuY2lhIGd1YXJkYWRhIGNvcnJlY3RhbWVudGUnKTsgfSBlbHNlIHsgJHRoaXMtPl9odG1sIC49ICR0aGlzLT5kaXNwbGF5RXJyb3IoJ0hhIG9jdXJyaWRvIHVuIGVycm9yIGFsIGd1YXJkYXIgbGEgbGljZW5jaWEnKTsgfSAkdGhpcy0+Zm9yY2VDaGVjayA9IDE7IH0gaWYgKCRhY3Rpb24gPT0gJ251bUVsZW1lbnRvcycpIHsgaWYgKENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnTlVNX0VMRU1FTlRPUycsIFRvb2xzOjpnZXRWYWx1ZSgnbnVtRWxlbWVudG9zJykpICYmIENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnTE9HX0FDVElWTycsIFRvb2xzOjpnZXRWYWx1ZSgnbG9nQWN0aXZvJykpKSB7ICR0aGlzLT5faHRtbCAuPSAkdGhpcy0+ZGlzcGxheUNvbmZpcm1hdGlvbigkdGhpcy0+bCgnTnVtZXJvIGRlIGVsZW1lbnRvcyBndWFyZGFkbyBjb3JyZWN0YW1lbnRlJykpOyB9IGVsc2UgeyAkdGhpcy0+X2h0bWwgLj0gJHRoaXMtPmRpc3BsYXlFcnJvcigkdGhpcy0+bCgnTnVtZXJvIGRlIGVsZW1lbnRvcyBndWFyZGFkbyBjb3JyZWN0YW1lbnRlJykpOyB9IH0gaWYgKCRhY3Rpb24gPT0gJ3Byb2Nlc29NYW51YWwnKSB7ICR0aGlzLT5wcm9jZXNvTWFudWFsKChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRKb2InKSk7IH0gaWYgKCRhY3Rpb24gPT0gJ2NvbmZNb2R1bG8nKSB7ICRmb3JtYXRvID0gdHJpbShUb29sczo6Z2V0VmFsdWUoJ2Zvcm1hdG8nKSk7ICRzZXBhcmFkb3IgPSB0cmltKFRvb2xzOjpnZXRWYWx1ZSgnc2VwYXJhZG9yJykpOyBpZiAoQ29uZmlndXJhdGlvbjo6dXBkYXRlR2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdGT1JNQVQnLCAkZm9ybWF0bykgJiYgQ29uZmlndXJhdGlvbjo6dXBkYXRlR2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdQT1MnLCB0cmltKFRvb2xzOjpnZXRWYWx1ZSgncG9zJykpKSAmJiBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ1NFUEFSQURPUicsIHRyaW0oVG9vbHM6OmdldFZhbHVlKCdzZXBhcmFkb3InKSkpICYmIENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnRU5DJywgdHJpbShUb29sczo6Z2V0VmFsdWUoJ2VuYycpKSkgJiYgQ29uZmlndXJhdGlvbjo6dXBkYXRlR2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdQT1NfU1RPQ0snLCB0cmltKFRvb2xzOjpnZXRWYWx1S 
gncG9zX3N0b2NrJykpKSAmJiBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ1BPU19QUkVDSU8nLCB0cmltKFRvb2xzOjpnZXRWYWx1ZSgncG9zX3ByZWNpbycpKSkgJiYgQ29uZmlndXJhdGlvbjo6dXBkYXRlR2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdQT1NfQ09TVEUnLCB0cmltKFRvb2xzOjpnZXRWYWx1ZSgncG9zX2Nvc3RlJykpKSAmJiBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ1BPU19SRUYnLCB0cmltKFRvb2xzOjpnZXRWYWx1ZSgncG9zX3JlZicpKSkpIHsgJHRoaXMtPl9odG1sIC49ICR0aGlzLT5kaXNwbGF5Q29uZmlybWF0aW9uKCR0aGlzLT5sKCdDb25maWd1cmFjaW9uIGd1YXJkYWRhIGNvcnJlY3RhbWVudGUnKSk7IH0gZWxzZSB7ICR0aGlzLT5faHRtbCAuPSAkdGhpcy0+ZGlzcGxheUVycm9yKCR0aGlzLT5sKCdDb25maWd1cmFjaW9uIGd1YXJkYWRhIGNvcnJlY3RhbWVudGUnKSk7IH0gfSB9IH0gcHJpdmF0ZSBmdW5jdGlvbiBfZGlzcGxheUZvcm0oKSB7ICR0aGlzLT5fZGlzcGxheUZvcm1FeHBvcnQoKTsgfSBwcml2YXRlIGZ1bmN0aW9uIF9kaXNwbGF5Rm9ybUV4cG9ydCgpIHsgJHRoaXMtPmdldFR4dEZpbGVzKCk7IGlmIChDb25maWd1cmF0aW9uOjpnZXRHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ0xJQ0VOQ0lBJykgPT0gJycpIHsgJHRoaXMtPl9odG1sIC49ICc8ZGl2IGNsYXNzPSJib290c3RyYXAiIHN0eWxlPSJ3aWR0aDoxMDAlIj4nOyAkdGhpcy0+X2h0bWwgLj0gJzxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPic7ICR0aGlzLT5faHRtbCAuPSAnPHA+JyAuICR0aGlzLT5sKCdBVEVOQ0lPTjogU1UgTElDRU5DSUEgRVNUQSBWQUNJQScpIC4gJzwvcD4nOyAkdGhpcy0+X2h0bWwgLj0gJzxwPicgLiAkdGhpcy0+bCgnRGViZSBpbnRyb2R1Y2lyIHVuIG51bWVybyBkZSBsaWNlbmNpYSB2YWxpZG8gcGFyYSBjb250aW51YXInKSAuICc8L3A+JzsgJHRoaXMtPl9odG1sIC49ICc8L2Rpdj4nOyAkdGhpcy0+X2h0bWwgLj0gJzwvZGl2Pic7ICR0aGlzLT5faHRtbCAuPSAkdGhpcy0+X21vc3RyYXJMaWNlbmNpYSgpOyAkdGhpcy0+Zm9yY2VDaGVjayA9IDA7IH0gZWxzZWlmICghJHRoaXMtPmNoZWNrTGljZW5jaWEoJHRoaXMtPmZvcmNlQ2hlY2spKSB7ICR0aGlzLT5faHRtbCAuPSAnPGRpdiBjbGFzcz0iYm9vdHN0cmFwIiBzdHlsZT0id2lkdGg6MTAwJSI+JzsgJHRoaXMtPl9odG1sIC49ICc8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4nOyAkdGhpcy0+X2h0bWwgLj0gJzxwPicgLiAkdGhpcy0+bCgnQVRFTkNJT046IFNVIExJQ0VOQ0lBIE5PIEVTIFZBTElEQScpIC4gJzwvcD4nOyAkdGhpcy0+X2h0bWwgLj0gJzxwPicgLiAkdGhpcy0+bCgnU2kgZWplY3V0YSBlbCBtb2R1bG8gc2luIGxpY2VuY2lhIGxvcyByZXN1bHRhZG9zIG5vIHNlcmFuIHZhbGlkb3MnKSAuICc8L3A+JzsgJHRoaXMtPl9odG1sIC49ICc8cD4nIC4gJHRoaXMtPmwoJ0hhZ2EgZXN0byBiYWpvIHN1IHJlc3BvbnNhYmlsaWRhZCwgSW5mb3JtYXggbm8gZGFyYSBzb3BvcnRlIG5pIGFjZXB0YXIgcXVlamFzIG8gcGV0aWNpb25lcyBkZXJpdmFkYXMgZGVsIHVzbyBzaW4gbGljZW5jaWEgZGUgbnVlc3Ryb3MgcHJvZHVjdG9zJykgLiAnPC9wPic7ICR0aGlzLT5faHRtbCAuPSAnPHA+JyAuICR0aGlzLT5sKCdFbCB1c28gZGUgbnVlc3RybyBzb2Z0d2FyZSBzaW4gbGljZW5jaWEgY29uc3RpdHV5ZSB1bmEgaW5mcmFjY2lvbiBkZSBsYXMgbGV5ZXMgZGUgcHJvcGllZGFkIGludGVsZWN0dWFsLCB5IHNlcmEgcHVlc3RhIGVuIGNvbm9jaW1pZW50byBkZSBsYXMgYXV0b3JpZGFkZXMgcGVydGluZW50ZXMnKSAuICc8L3A+JzsgJHRoaXMtPl9odG1sIC49ICc8cD4nIC4gJHRoaXMtPmwoJ1NpIGNyZWUgcXVlIGVzdGUgbWVuc2FqZSBlcyB1biBlcnJvciwgcG9yIGZhdm9yLCBwb25nYXNlIGVuIGNvbnRhY3RvIGNvbiBub3NvdHJvcywgZW52aWFuZG9ub3MgY29kaWdvIGRlIGxpY2VuY2lhLCBub21icmUgZGVsIG1vZHVsbywgZG9taW5pbyBkZSBsYSB0aWVuZGEgeSBjb3BpYSBkZSBsYSBmYWN0dXJhIGRlIHBhZ28nKSAuICc8L3A+JzsgJHRoaXMtPl9odG1sIC49ICc8L2Rpdj4nOyAkdGhpcy0+X2h0bWwgLj0gJzwvZGl2Pic7ICR0aGlzLT5faHRtbCAuPSAkdGhpcy0+X21vc3RyYXJMaWNlbmNpYSgpOyAkdGhpcy0+Zm9yY2VDaGVjayA9IDA7IH0gZWxzZSB7ICRhY3RpdmFyQWpheCA9IENvbmZpZ3VyYXRpb246OmdldCgkdGhpcy0+c3VmaWpvIC4gJ0FKQVhfQUNUSVZFJyk7ICR0aWVtcG9BamF4ID0gQ29uZmlndXJhdGlvbjo6Z2V0KCR0aGlzLT5zdWZpam8gLiAnQUpBWF9SRUZSRVNIJyk7ICR0aWVtcG9Nc2dBamF4ID0gQ29uZmlndXJhdGlvbjo6Z2V0KCR0aGlzLT5zdWZpam8gLiAnTVNHX0RFTEFZJyk7ICRpZFRhYiA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRUYWInKTsgaWYgKCFpc3NldCgkaWRUYWIpIHx8ICRpZFRhYiA9PSAwKSAkaWRUYWIgPSAxOyAkdGhpcy0+Y29udGV4dC0+Y29udHJvbGxlci0+YWRkSlF1ZXJ5VUkoJ3VpLmRhdGVwaWNrZXInKTsgJHRoaXMtPl9odG1sIC49ICcKCQk8dWwgaWQ9Im1lbnVUYWIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGlkPSJtZW51VGFiMSIgY2xhc3M9Im1lbnVUYWJCdXR0b24nIC4gKCgkaWRUYWIgPT0gMSkgPyAiIHNlbGVjdGVkIiA6ICIiKSAuICciPjEuICcgLiAkdGhpcy0+bCgnQ29uZmlndXJhciB0cmFiYWpvcycpIC4gJzwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgaWQ9Im1lbnVUYWIyIiBjbGFzcz0ibWVudVRhYkJ1dHRvbicgLiAoKCRpZFRhYiA9PSAyKSA/ICIgc2VsZWN0ZWQiIDogIiIgKSAuICciPjIuICcgLiAkdGhpcy0+bCgnUHJvY2VzYXIgRmljaGVybycpIC4gJzwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgaWQ9Im1lbnVUYWIzIiBjbGFzcz0ibWVudVRhYkJ1dHRvbicgLiAoKCRpZFRhYiA9PSAzKSA/ICIgc2VsZWN0ZWQiIDogIiIgKSAuICciPjMuICcgLiAkdGhpcy0+bCgnU3ViaXIgRmljaGVybycpIC4gJzwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgaWQ9Im1lbnVUYWI0IiBjbGFzcz0ibWVudVRhYkJ1dHRvbicgLiAoKCRpZFRhYiA9PSA0KSA/ICIgc2VsZWN0ZWQiIDogIiIgKSAuICciPjQuICcgLiAkdGhpcy0+bCgnTGljZW5jaWEnKSAuICc8L2xpPgoJCQk8L3VsPgoJCQk8ZGl2IGlkPSJ0YWJMaXN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1lbnVUYWIxU2hlZXQiIGNsYXNzPSJ0YWJJdGVtJyAuICgoJGlkVGFiID09IDEpID8gIiBzZWxlY3RlZCIgOiAiIiApIC4gJyI+JyAuICR0aGlzLT5fdGllbXBvUmVhbCgpIC4gJzwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibWVudVRhYjJTaGVldCIgY2xhc3M9InRhYkl0ZW0nIC4gKCgkaWRUYWIgPT0gMikgPyAiIHNlbGVjdGVkIiA6ICIiICkgLiAnIj4nIC4gJHRoaXMtPl9wcm9jZXNhcigpIC4gJzwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibWVudVRhYjNTaGVldCIgY2xhc3M9InRhYkl0ZW0nIC4gKCgkaWRUYWIgPT0gMykgPyAiIHNlbGVjdGVkIiA6ICIiICkgLiAnIj4nIC4gJHRoaXMtPl9zdWJpckZpY2hlcm8oKSAuICc8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1lbnVUYWI0U2hlZXQiIGNsYXNzPSJ0YWJJdGVtJyAuICgoJGlkVGFiID09IDQpID8gIiBzZWxlY3RlZCIgOiAiIiApIC4gJyI+JyAuICR0aGlzLT5fbW9zdHJhckxpY2VuY2lhKCkgLiAnPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoJCQk8YnIgY2xlYXI9ImxlZnQiIC8+CgkJCTxiciAvPgoJCQk8c3R5bGU+CgkJCQkjbWVudVRhYiB7IGZsb2F0OiBsZWZ0OyBwYWRkaW5nOiAwOyBtYXJnaW46IDA7IHRleHQtYWxpZ246IGxlZnQ7IH0KCQkJCSNtZW51VGFiIGxpIHsgdGV4dC1hbGlnbjogbGVmdDsgZmxvYXQ6IGxlZnQ7IGRpc3BsYXk6IGlubGluZTsgcGFkZGluZzogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBiYWNrZ3JvdW5kOiAjRUZFRkVGOyBmb250LXdlaWdodDogYm9sZDsgY3Vyc29yOiBwb2ludGVyOyBib3JkZXItbGVmdDogMXB4IHNvbGlkICNFRkVGRUY7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNFRkVGRUY7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjRUZFRkVGOyB9CgkJCQkjbWVudVRhYiBsaS5tZW51VGFiQnV0dG9uLnNlbGVjdGVkIHsgYmFja2dyb3VuZDogI0ZGRjZEMzsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjQ0NDQ0NDOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjQ0NDQ0NDOyBib3JkZXItdG9wOiAxcHggc29saWQgI0NDQ0NDQzsgfQoJCQkJI3RhYkxpc3QgeyBjbGVhcjogbGVmdDsgfQoJCQkJLnRhYkl0ZW0geyBkaXNwbGF5OiBub25lOyB9CgkJCQkudGFiSXRlbS5zZWxlY3RlZCB7IGRpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiAjRkZGRkYwOyBib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDOyBwYWRkaW5nOiAxMHB4OyBwYWRkaW5nLXRvcDogMjBweDsgfQoJCQk8L3N0eWxlPgoJCQk8c2NyaXB0PgogICAgICAgICAgICB2YXIgYmFzZVVybEVhbiA9ICInIC4gJHRoaXMtPl9wYXRoIC4gJyI7CiAgICAgICAgICAgIHZhciBhZG1pbnVybEVhbiA9ICInIC4gJHRoaXMtPmdldFVybEFkbWluKCkgLiAnIjsKCQkJCSQoIi5tZW51VGFiQnV0dG9uIikuY2xpY2soZnVuY3Rpb24gKCkgewoJCQkJICAkKCIubWVudVRhYkJ1dHRvbi5zZWxlY3RlZCIpLnJlbW92ZUNsYXNzKCJzZWxlY3RlZCIpOwoJCQkJICAkKHRoaXMpLmFkZENsYXNzKCJzZWxlY3RlZCIpOwoJCQkJICAkKCIudGFiSXRlbS5zZWxlY3RlZCIpLnJlbW92ZUNsYXNzKCJzZWxlY3RlZCIpOwoJCQkJICAkKCIjIiArIHRoaXMuaWQgKyAiU2hlZXQiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKCQkJCX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNsbGVuYXJNYXJnZW5UZXh0IikudmFsKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCJpbnB1dFtuYW1lPWNoZWNrbWVdIikuYXR0cigiY2hlY2tlZCIsIGZhbHNlKTsKCQkJPC9zY3JpcHQ+JzsgfSB9IHByaXZhdGUgZnVuY3Rpb24gX3RpZW1wb1JlYWwoKSB7ICRwcm92ZWVkb3JlcyA9IGFycmF5KCk7ICRwcm92ZWVkb3Jlc1RlbXAgPSBTdXBwbGllcjo6Z2V0U3VwcGxpZXJzKCk7IGZvcmVhY2ggKCRwcm92ZWVkb3Jlc1RlbXAgYXMgJHByb3ZlZWRvclRlbXApIHsgJHByb3ZlZWRvcmVzW10gPSBhcnJheSgkcHJvdmVlZG9yVGVtcFsnaWRfc3VwcGxpZXInXSwgJHByb3ZlZWRvclRlbXBbJ25hbWUnXSk7IH0gJHdhcmVob3VzZXMgPSBXYXJlaG91c2U6OmdldFdhcmVob3VzZXMoKTsgJGFsbWFjZW4gPSBBcnJheSgpOyBpZiAoQ29uZmlndXJhdGlvbkNvcmU6OmdldEdsb2JhbFZhbHVlKCdQU19BRFZBTkNFRF9TVE9DS19NQU5BR0VNRU5UJykpIHsgZm9yZWFjaCAoJHdhcmVob3VzZXMgYXMgJGFsbWFjZW5lcykgeyAkYWxtYWNlbltdID0gYXJyYXkoJGFsbWFjZW5lc1snaWRfd2FyZWhvdXNlJ10sICRhbG1hY2VuZXNbJ25hbWUnXSk7IH0gfSAkaWRpb21hcyA9IExhbmd1YWdlOjpnZXRMYW5ndWFnZXMoKTsgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhbG1hY2VuZXMnLCBqc29uX2VuY29kZSgkYWxtYWNlbikpOyAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Jhc2VfZGlyX3dwJywgVG9vbHM6OmdldFNob3BEb21haW5Tc2wodHJ1ZSkgLiBfX1BTX0JBU0VfVVJJX18pOyAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Jhc2VfZGlyJywgJy8vJyAuIFRvb2xzOjpnZXRTaG9wRG9tYWluU3NsKGZhbHNlKSAuIF9fUFNfQkFTRV9VUklfXyk7ICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJlZmlqb1RhYmxhJywgX0RCX1BSRUZJWF8gLiAkdGhpcy0+dGFibGEpOyAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3ZlZWRvcmVzJywganNvbl9lbmNvZGUoJHByb3ZlZWRvcmVzKSk7ICR0aGlzLT5zbWFydHktPmFzc2lnbignaWRpb21hcycsICRpZGlvbWFzKTsgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZG1pbnVybCcsICR0aGlzLT5nZXRVcmxBZG1pbigpKTsgcmV0dXJuICR0aGlzLT5kaXNwbGF5KCR0aGlzLT5uYW1lLCAndGFibGFKb2IudHBsJyk7IH0gcHVibGljIGZ1bmN0aW9uIGFub3RhclN0b2NrSW5pY2lhbCgpIHsgJGluaWNpbyA9IDA7IGRvIHsgJHByb2R1Y3RvcyA9IFByb2R1Y3Q6OmdldFByb2R1Y3RzKCR0aGlzLT5pZExhbmcsICRpbmljaW8sIDEwMCwgJ2lkX3Byb2R1Y3QnLCAnQVNDJyk7IGZvcmVhY2ggKCRwcm9kdWN0b3MgYXMgJHByb2R1Y3RvKSB7ICRjb21iaW5hY2lvbmVzID0gUHJvZHVjdDo6Z2V0UHJvZHVjdEF0dHJpYnV0ZXNJZHMoJHByb2R1Y3RvWydpZF9wcm9kdWN0J10pOyBpZiAoJGNvbWJpbmFjaW9uZXMpIHsgZm9yZWFjaCAoJGNvbWJpbmFjaW9uZXMgYXMgJGNvbWJpbmFjaW9uKSB7ICRzdG9ja1Byb2R1Y3RvID0gU3RvY2tBdmFpbGFibGU6OmdldFF1YW50aXR5QXZhaWxhYmxlQnlQcm9kdWN0KCRwcm9kdWN0b1snaWRfcHJvZHVjdCddLCAkY29tYmluYWNpb25bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ10pOyAkc3FsID0gJ1JFUExBQ0UgSU5UTyBgJyAuIF9EQl9QUkVGSVhfIC4gc2VsZjo6cHJlZmlqbyAuICJzdG9ja1VwZGF0ZWAgICIgLiAiKGlkUHJvZHVjdG8saWRBdHJpYnV0byxzdG9jayxvcmlnZW4pIiAuICIgVkFMVUVTIiAuICIgICgiIC4gKGludCkgJHByb2R1Y3RvWydpZF9wcm9kdWN0J10gLiAnLCcgLiAoaW50KSAkY29tYmluYWNpb25bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ10gLiAnLCAnIC4gKGludCkgJHN0b2NrUHJvZHVjdG8gLiAnLCAiMiIpJzsgRGI6OmdldEluc3RhbmNlKCktPmV4ZWN1dGUoJHNxbCk7IH0gfSBlbHNlIHsgJHN0b2NrUHJvZHVjdG8gPSAoaW50KSBTdG9ja0F2YWlsYWJsZTo6Z2V0UXVhbnRpdHlBdmFpbGFibGVCeVByb2R1Y3QoJHByb2R1Y3RvWydpZF9wcm9kdWN0J10pOyAkc3FsID0gJ1JFUExBQ0UgSU5UTyBgJyAuIF9EQl9QUkVGSVhfIC4gc2VsZjo6cHJlZmlqbyAuICJzdG9ja1VwZGF0ZWAgICIgLiAiKGlkUHJvZHVjdG8saWRBdHJpYnV0byxzdG9jayxvcmlnZW4pIiAuICIgVkFMVUVTIiAuICIgICgneyRwcm9kdWN0b1snaWRfcHJvZHVjdCddfScsIDAsICckc3RvY2tQcm9kdWN0bycsICcyJykiOyBEYjo6Z2V0SW5zdGFuY2UoKS0+ZXhlY3V0ZSgkc3FsKTsgfSB9ICRpbmljaW8gKz0gMTAwOyB9IHdoaWxlICgkcHJvZHVjdG9zKTsgfSBwcml2YXRlIGZ1bmN0aW9uIF9zdWJpckZpY2hlcm8oKSB7ICR0aGlzLT5hZGRKcygnZnVuY2lvbmVzLmpzJyk7ICR0aGlzLT5hZGRKcygnZHJvcHpvbmUuanMnKTsgJHRoaXMtPmFkZENzcygnZHJvcHpvbmUuY3NzJyk7ICRodG1sID0gJzxmb3JtIGFjdGlvbj0iJyAuICR0aGlzLT5fcGF0aCAuICd1cGxvYWQucGhwIiBjbGFzcz0iZHJvcHpvbmUiICAgaWQ9Im15LWF3ZXNvbWUtZHJvcHpvbmUiPjwvZm9ybT4nOyAkaHRtbCAuPSAnPGRpdiBjbGFzcz0iZmFsbGJhY2siPjwvZGl2Pic7ICRmaWxlcyA9ICcnOyBpZiAoJGhhbmRsZSA9IG9wZW5kaXIoZGlybmFtZShfX0ZJTEVfXykgLiAnL3VwbG9hZC8nKSkgeyB3aGlsZSAoZmFsc2UgIT09ICgkZW50cnkgPSByZWFkZGlyKCRoYW5kbGUpKSkgeyBpZiAoJGVudHJ5ICE9ICIuIiAmJiAkZW50cnkgIT0gIi4uIikgeyAkZmlsZXMgLj0gJzxwIGNsYXNzPSJib3JyYUFyY2hpdm8iIG5hbWU9IicgLiAkZW50cnkgLiAnIj48aW1nIHNyYz0iJyAuICR0aGlzLT5fcGF0aCAuICdib3JyYXIucG5nIiBhbHQ9IiIgLz4gJyAuICRlbnRyeSAuICc8L3A+JzsgfSB9IGNsb3NlZGlyKCRoYW5kbGUpOyB9ICRodG1sIC49ICc8cD48aW5wdXQgdHlwZT0iYnV0dG9uIiBuYW1lPSJib3JyYXJUb2RvcyIgdmFsdWU9IicgLiAkdGhpcy0+bCgnQm9ycmFyIHRvZG9zJykgLiAnIi8+PC9wPic7ICRodG1sIC49ICRmaWxlczsgcmV0dXJuICRodG1sOyB9IHByaXZhdGUgZnVuY3Rpb24gX3Byb2Nlc2FyKCkgeyAkdG9rZW4gPSBDb25maWd1cmF0aW9uOjpnZXQoJHRoaXMtPnN1ZmlqbyAuICdUT0tFTl9DUk9OJyk7ICR1cmxUaWVuZGEgPSAkdGhpcy0+Z2V0VXJsQWRtaW4oKTsgJG51bUVsZW1lbnRvcyA9IENvbmZpZ3VyYXRpb246OmdldEdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnTlVNX0VMRU1FTlRPUycpOyAkbG9nQWN0aXZvID0gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdMT0dfQUNUSVZPJyk7ICRkZXNhY3RpdmFyUHJvZHVjdG9zID0gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdERVNBQ19QUk9EJyk7ICRpZHNKb2IgPSAkdGhpcy0+Z2V0SWRKb2JzKCk7ICRjcm9ucyA9ICcnOyAkc2VsZWN0Sm9icyA9ICc8c2VsZWN0IG5hbWU9ImlkSm9iIj4nOyBmb3JlYWNoICgkaWRzSm9iIGFzICRpZEpvYikgeyAkc2VsZWN0Sm9icyAuPSAiPG9wdGlvbiB2YWx1ZT0neyRpZEpvYlsnaWRKb2InXX0nPnskaWRKb2JbJ2lkSm9iJ119PC9vcHRpb24+IjsgJGNyb25zIC49ICc8cD48YSBocmVmPSInIC4gJHVybFRpZW5kYSAuICR0aGlzLT5uYW1lIC4gJ0Nyb24ucGhwP3Rva2VuPScgLiAkdG9rZW4gLiAnJmlkSm9iPScgLiAkaWRKb2JbJ2lkSm9iJ10gLiAnIiB0YXJnZXQ9Il9ibGFuayI+JyAuICR1cmxUaWVuZGEgLiAkdGhpcy0+bmFtZSAuICdDcm9uLnBocD90b2tlbj0nIC4gJHRva2VuIC4gJyZpZEpvYj0nIC4gJGlkSm9iWydpZEpvYiddIC4gJzwvYT48L3A+JzsgfSAkc2VsZWN0Sm9icyAuPSAnPC9zZWxlY3Q+JzsgJGh0bWwgPSAnJzsgJGh0bWwgLj0gJzxmb3JtIGFjdGlvbj0iJyAuIFRvb2xzOjpzYWZlT3V0cHV0KCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICciIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9Im51bUVsZW1lbnRvcyI+CiAgICAgICAgICAgIDxwPicgLiAkdGhpcy0+bCgnTnVtZXJvIGVsZW1lbnRvcycpOyAkaHRtbCAuPSAnPGJyIC8+CiAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImlkVGFiIiB2YWx1ZT0iMiIgLz4KICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im51bUVsZW1lbnRvcyIgdmFsdWU9IicgLiAkbnVtRWxlbWVudG9zIC4gJyIgLz48L3A+CiAgICAgICAgIDxwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibG9nQWN0aXZvIiB2YWx1ZT0iMSIgJyAuICgkbG9nQWN0aXZvID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnKSAuICcgLz4gJyAuICR0aGlzLT5sKCdBY3RpdmFyIGxvZycpIC4gJzwvcD4KICAgICAgICAgPHA+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iZ3VhcmRhck51bUVsZW1lbnRvcyIgdmFsdWU9IicgLiAkdGhpcy0+bCgnR3VhcmRhcicpIC4gJyIgLz48L3A+CiAgICAgICAgPC9mb3JtPjxiciAvPic7ICRodG1sIC49ICc8cD48ZmllbGRzZXQ+PGxlZ2VuZD4nIC4gJHRoaXMtPmwoJ1Byb2Nlc28gZGUgRm9ybWEgTWFudWFsJykgLiAnPC9sZWdlbmQ+JzsgJGh0bWwgLj0gJHRoaXMtPmRpc3BsYXlXYXJuaW5nKCR0aGlzLT5sKCdQZW5kaWVudGVzIGRlIFByb2Nlc2FyOiAnKSAuICR0aGlzLT5wZWRpZW50ZXNQcm9jZXNhcigpKTsgJGRlc2NhcmdhcyA9ICR0aGlzLT51bHRpbWFzRGVzY2FyZ2FzKCk7IGZvcmVhY2ggKCRpZHNKb2IgYXMgJGlkSm9iKSB7IGlmICghZW1wdHkoJGRlc2Nhcmdhc1skaWRKb2JbJ2lkSm9iJ11dKSkgeyAkaHRtbCAuPSAkdGhpcy0+ZGlzcGxheUNvbmZpcm1hdGlvbigkdGhpcy0+bCgnSG9yYSBkZSBEZXNjYXJnYTogJykgLiAkZGVzY2FyZ2FzWyRpZEpvYlsnaWRKb2InXV1bJ2Rlc2NhcmdhJ10gLiAnLiAnIC4gJHRoaXMtPmwoJ1VsdGltbyBQcm9jZXNvOiAnKSAuICRkZXNjYXJnYXNbJGlkSm9iWydpZEpvYiddXVsncHJvY2VzbyddKTsgfSB9ICRodG1sIC49ICc8Zm9ybSBhY3Rpb249IicgLiBUb29sczo6c2FmZU91dHB1dCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgLiAnIiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJwcm9jZXNvTWFudWFsIj4nOyAkaHRtbCAuPSAnPGJyIC8+CiAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImlkVGFiIiB2YWx1ZT0iMiIgLz4KICAgICAgICA8cD4nIC4gJHRoaXMtPmwoJ1NlbGVjY2lvbmEgZWwgdHJhYmFqbyBhIHByb2Nlc2FyOicpIC4gJyAnIC4gJHNlbGVjdEpvYnMgLiAnPC9wPgogICAgICAgIDxwPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImdlbmVyYXJUb2tlbiIgdmFsdWU9IicgLiAkdGhpcy0+bCgnUG9yY2VzbyBkZSBGb3JtYSBNYW51YWwnKSAuICciIC8+PC9wPgogICAgICAgIDwvZm9ybT48YnIgLz4nOyAkaHRtbCAuPSAnPC9maWVsZHNldD48L3A+JzsgJGh0bWwgLj0gJzxmaWVsZHNldD48bGVnZW5kPicgLiAkdGhpcy0+bCgnVG9rZW4gZGUgYWNjZXNvIHBvciBjcm9uJykgLiAnPC9sZWdlbmQ+JzsgJGh0bWwgLj0gJzxkaXYgY2xhc3M9ImJvb3RzdHJhcCI+JzsgJGh0bWwgLj0gJzxwIGNsYXNzPSJ3YXJuaW5nIHdhcm4gYWxlcnQgIGFsZXJ0LXdhcm5pbmciPjxiPicgLiAkdGhpcy0+bCgnQVRFTkNJT046JykgLiAnPC9iPiAnIC4gJHRoaXMtPmwoJ1NpIGNhbWJpYSBlbCB0b2tlbiwgdGllbmUgcXVlIGNhbWJpYXJsbyB0YW1iaWVuIGVuIGxhcyB0YXJlYXMgZGUgY3JvbicpIC4gJzwvcD4nOyAkaHRtbCAuPSAnPC9kaXY+JzsgJGh0bWwgLj0gJzxwPicgLiAkdGhpcy0+bCgnRGViZSBlbnZpYXJsbyBwb3IgZ2V0IGEgbGFzIHVybHMgZGVsIHNlcnZpY2lvOicpIC4gJzxwPic7ICRodG1sIC49ICRjcm9uczsgJGh0bWwgLj0gJzxiciAvPic7ICRodG1sIC49ICc8Zm9ybSBhY3Rpb249IicgLiBUb29sczo6c2FmZU91dHB1dCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgLiAnIiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJnZW5lcmFyVG9rZW4iPgogICAgICAgICAgICAnIC4gJHRoaXMtPmwoJ0dlbmVyYSBlbCB0b2tlbiBkZSBjb25maWd1cmFjaW9uJyk7ICRodG1sIC49ICc8YnIgLz4KICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaWRUYWIiIHZhbHVlPSIyIiAvPgogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImdlbmVyYXJUb2tlbiIgdmFsdWU9IicgLiAkdGhpcy0+bCgnR2VuZXJhciBUb2tlbicpIC4gJyIgLz4KICAgICAgICA8L2Zvcm0+PGJyIC8+JzsgJGh0bWwgLj0gJzxsYWJlbD4nIC4gJHRoaXMtPmwoJ1Rva2VuIGFjdHVhbCcpIC4gJzogPC9sYWJlbD48bGFiZWwgc3R5bGU9IndpZHRoOjMwMHB4OyI+JyAuICR0b2tlbiAuICc8L2xhYmVsPjwvZmllbGRzZXQ+JzsgcmV0dXJuICRodG1sOyB9IHByaXZhdGUgZnVuY3Rpb24gZ2V0SWRKb2JzKCkgeyByZXR1cm4gRGI6OmdldEluc3RhbmNlKCktPmV4ZWN1dGVTKCdTRUxFQ1QgaWRKb2IgRlJPTSBgJyAuIF9EQl9QUkVGSVhfIC4gJHRoaXMtPnRhYmxhIC4gJ2pvYmAnKTsgfSBzdGF0aWMgZnVuY3Rpb24gZ2V0VXJsQWRtaW4oKSB7ICR0ZW1wID0gZXhwbG9kZSgnLycsICRfU0VSVkVSWydQSFBfU0VMRiddKTsgJGR1bW15ID0gYXJyYXlfcG9wKCgkdGVtcCkpOyAkdXJsQWRtaW4gPSBpbXBsb2RlKCcvJywgJHRlbXApOyBpZiAoQ29uZmlndXJhdGlvbjo6Z2V0KCdQU19TU0xfRU5BQkxFRCcpID09IDEpIHsgJHVybCA9ICdodHRwczovLyc7IH0gZWxzZSB7ICR1cmwgPSAnaHR0cDovLyc7IH0gJHVybCAuPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSAuICR1cmxBZG1pbiAuICcvJzsgcmV0dXJuICR1cmw7IH0gcHVibGljIGZ1bmN0aW9uIGNoZWNrTGljZW5jaWEoJGZvcmNlID0gMCkgeyAkZGF0YSA9IGFycmF5KCk7ICRmID0gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdGJyk7ICRjaGVjayA9IENvbmZpZ3VyYXRpb246OmdldEdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnRl9DSEVDSycpOyAkdXJsID0gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdGX1NFUlZFUicpOyAkZGF0YVsnc2VydmVyJ10gPSBDb25maWd1cmF0aW9uOjpnZXRHbG9iYWxWYWx1ZSgnUFNfU0hPUF9ET01BSU4nKTsgJGRhdGFbJ21vZHVsbyddID0gJHRoaXMtPm5hbWU7ICRkYXRhWydhY3Rpb24nXSA9ICdjaGVja0xpY2VuY2lhJzsgJGRhdGFbJ2xpY2VuY2lhJ10gPSBDb25maWd1cmF0aW9uOjpnZXRHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ0xJQ0VOQ0lBJyk7IGlmICgkY2hlY2sgPj0gMTAwIHx8ICRmb3JjZSA9PSAxKSB7ICRjaCA9IGN1cmxfaW5pdCgkdXJsKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCBUUlVFKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCA1KTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRkYXRhKTsgJGRhdG9zID0gY3VybF9leGVjKCRjaCk7ICRkYXRvcyA9IGpzb25fZGVjb2RlKCRkYXRvcyk7ICRpbmZvID0gY3VybF9nZXRpbmZvKCRjaCk7IGlmICghJGRhdG9zIHx8ICRkYXRvcy0+Y29kRXJyb3IgIT0gMCkgeyBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ0YnLCAnJyk7IENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnRl9DSEVDSycsIChpbnQpICRjaGVjayArIDEpOyByZXR1cm4gZmFsc2U7IH0gZWxzZSB7IENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKCR0aGlzLT5zdWZpam8gLiAnRicsICRkYXRvcy0+bXNnRXJyb3IpOyBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgkdGhpcy0+c3VmaWpvIC4gJ0ZfQ0hFQ0snLCAwKTsgcmV0dXJuIHRydWU7IH0gfSBlbHNlIHsgQ29uZmlndXJhdGlvbjo6dXBkYXRlR2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdGX0NIRUNLJywgKGludCkgJGNoZWNrICsgMSk7IHJldHVybiB0cnVlOyB9IH0gcHJpdmF0ZSBmdW5jdGlvbiBnZXRGdW5jdGlvbigpIHsgJGZ1bmN0aW9uID0gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdGJyk7IHJldHVybiAkZnVuY3Rpb247IH0gZnVuY3Rpb24gbCgkbXNnLCAkbW9kdWxvID0gJycsICRsb2NhbGUgPSBudWxsKSB7IGlmICgkbW9kdWxvID09ICcnKSB7ICRtb2R1bG8gPSAndHJhZHVjY2lvbmVzJyAuIHN0cnRvbG93ZXIoJHRoaXMtPm5hbWUpOyB9IHJldHVybiBwYXJlbnQ6OmwoJG1zZywgJG1vZHVsbyk7IH0gcHVibGljIGZ1bmN0aW9uIG1vZGlmaWNhclN0b2NrV0dBKCRpZF9wcm9kdWN0LCAkaWRfcHJvZHVjdF9hdHRyaWJ1dGUsICRudWV2YUNhbnRpZGFkLCAkaWRTaG9wLCAkaWRBbG1hY2VuUHJpbmNpcGFsKSB7ICRwcm9kdWN0byA9IG5ldyBQcm9kdWN0KCRpZF9wcm9kdWN0KTsgaWYgKCRwcm9kdWN0by0+dXNlQWR2YW5jZWRTdG9ja01hbmFnZW1lbnQoKSAmJiBTdG9ja0F2YWlsYWJsZTo6ZGVwZW5kc09uU3RvY2soJGlkX3Byb2R1Y3QpICYmICRpZEFsbWFjZW5QcmluY2lwYWwpIHsgJHJlc3VsdGFkbyA9IHRydWU7ICRzdG9ja01hbmFnZXIgPSBTdG9ja01hbmFnZXJGYWN0b3J5OjpnZXRNYW5hZ2VyKCk7ICRhbG1hY2VuUHJpbmNpcGFsID0gbmV3IFdhcmVob3VzZSgkaWRBbG1hY2VuUHJpbmNpcGFsKTsgJG1vdGl2b01vdmltaWVudG8gPSBDb25maWd1cmF0aW9uOjpnZXRHbG9iYWxWYWx1ZSgnUFNfU1RPQ0tfTVZUX0lOQ19SRUFTT05fREVGQVVMVCcpOyAkY2FudGlkYWRBY3R1YWwgPSAkc3RvY2tNYW5hZ2VyLT5nZXRQcm9kdWN0UmVhbFF1YW50aXRpZXMoJGlkX3Byb2R1Y3QsICRpZF9wcm9kdWN0X2F0dHJpYnV0ZSwgYXJyYXkoJGlkQWxtYWNlblByaW5jaXBhbCksIHRydWUpOyBpZiAoJGNhbnRpZGFkQWN0dWFsID4gJG51ZXZhQ2FudGlkYWQpIHsgJHJlc3VsdGFkbyA9ICRzdG9ja01hbmFnZXItPnJlbW92ZVByb2R1Y3QoJGlkX3Byb2R1Y3QsICRpZF9wcm9kdWN0X2F0dHJpYnV0ZSwgJGFsbWFjZW5QcmluY2lwYWwsICRjYW50aWRhZEFjdHVhbCAtICRudWV2YUNhbnRpZGFkLCAkbW90aXZvTW92aW1pZW50bywgdHJ1ZSwgbnVsbCwgMCwgbmV3IEVtcGxveWVlKDEpKTsgfSBlbHNlaWYgKCRjYW50aWRhZEFjdHVhbCA8ICRudWV2YUNhbnRpZGFkKSB7ICRyZXN1bHRhZG8gPSAkc3RvY2tNYW5hZ2VyLT5hZGRQcm9kdWN0KCRpZF9wcm9kdWN0LCAkaWRfcHJvZHVjdF9hdHRyaWJ1dGUsICRhbG1hY2VuUHJpbmNpcGFsLCAkbnVldmFDYW50aWRhZCAtICRjYW50aWRhZEFjdHVhbCwgJG1vdGl2b01vdmltaWVudG8sIChmbG9hdCkgJHByb2R1Y3RvLT5wcmljZSwgdHJ1ZSwgbnVsbCwgbmV3IEVtcGxveWVlKDEpKTsgfSBTdG9ja0F2YWlsYWJsZTo6c3luY2hyb25pemUoJGlkX3Byb2R1Y3QpOyB9IGVsc2UgeyBTdG9ja0F2YWlsYWJsZTo6c2V0UXVhbnRpdHkoJGlkX3Byb2R1Y3QsICRpZF9wcm9kdWN0X2F0dHJpYnV0ZSwgJG51ZXZhQ2FudGlkYWQsICRpZFNob3ApOyAkcmVzdWx0YWRvID0gdHJ1ZTsgfSByZXR1cm4gJHJlc3VsdGFkbzsgfSBwcml2YXRlIGZ1bmN0aW9uIHByb2Nlc2FyRWxlbWVudG9zKCRpZEpvYiA9IDApIHsgJHByb2Nlc2Fkb3MgPSAwOyAkbnVtRWxlbWVudG9zID0gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdOVU1fRUxFTUVOVE9TJyk7IGlmICghJG51bUVsZW1lbnRvcykgeyAkbnVtRWxlbWVudG9zID0gMTAwOyB9ICRpbnN0YWxhZG9Fc3RpbWF0ZWREZWxpdmVyeSA9IE1vZHVsZTo6aXNFbmFibGVkKCdlc3RpbWF0ZWRkZWxpdmVyeScpOyAkc3FsID0gJ1NFTEVDVCAqIEZST00gYCcgLiBfREJfUFJFRklYXyAuICR0aGlzLT50YWJsYSAuICd1cGRhdGVFYW5gIHVlIElOTkVSIEpPSU4gYCcgLiBfREJfUFJFRklYXyAuICR0aGlzLT50YWJsYSAuICdqb2JgIGogT04gdWUuaWRKb2IgPSBqLmlkSm9iJyAuICcgV0hFUkUgcHJvY2VzYWRvPTAnIC4gKCRpZEpvYiA/ICcgQU5EIHVlLmlkSm9iID0gJyAuIChpbnQpICRpZEpvYiA6ICcnKSAuICcgTElNSVQgMCwnIC4gJG51bUVsZW1lbnRvczsgJHJlc3VsdCA9IERCOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlUygkc3FsKTsgZm9yZWFjaCAoJHJlc3VsdCBBUyAkZWxlbWVudG8pIHsgJGNhbWJpb3NBY3R1YWxpemFibGUgPSBmYWxzZTsgJGNhbWJpb3NQcm9kdWN0byA9IGZhbHNlOyAkdGllbmVDb21iaW5hY2lvbiA9IGZhbHNlOyAkcHJlY2lvQ2FtYmlhZG8gPSBmYWxzZTsgaWYgKCRlbGVtZW50b1snY2FyYWN0ZXJTdG9jayddKSB7ICRlbGVtZW50b1snY2FyYWN0ZXJTdG9jayddID0gZXhwbG9kZSgnLCcsICRlbGVtZW50b1snY2FyYWN0ZXJTdG9jayddKTsgJGVsZW1lbnRvWydjYW50aWRhZFN0b2NrJ10gPSBleHBsb2RlKCcsJywgJGVsZW1lbnRvWydjYW50aWRhZFN0b2NrJ10pOyB9ICRlbGVtZW50b0VuY29udHJhZG8gPSAkdGhpcy0+YnVzY2FyRWxlbWVudG9zKCgkZWxlbWVudG9bJ2lkZW50aWZpY2Fkb3InXSAhPSAzID8gdHJpbSgkZWxlbWVudG9bJ2VhbiddKSA6IGFycmF5KChpbnQpICRlbGVtZW50b1snZWFuJ10sIChpbnQpICRlbGVtZW50b1snaWRBdHJpYnV0byddKSksICRlbGVtZW50b1snaWRlbnRpZmljYWRvciddLCAkZWxlbWVudG9bJ3Byb3ZlZWRvciddLCAkZWxlbWVudG9bJ3ByZWZpam8nXSwgJGVsZW1lbnRvWydzdWZpam8nXSk7IGlmICghJGVsZW1lbnRvRW5jb250cmFkbykgeyAkdGhpcy0+dXBkYXRlUHJvY2VzYWRvKHRyaW0oJGVsZW1lbnRvWydlYW4nXSksICRlbGVtZW50b1snaWRKb2InXSk7IEltYXhMb2c6OmdldExvZygpLT5hZGRMb2coJHRoaXMtPmwoJ0VsZW1lbnRvIG5vIGVuY29udHJhZG86ICcpIC4gdHJpbSgkZWxlbWVudG9bJ2VhbiddKSwgMiwgNSwgYXJyYXkoJ2xvZycpKTsgY29udGludWU7IH0gdHJ5IHsgaWYgKCRlbGVtZW50b1snc2VwYXJhZG9yTWlsZXMnXSkgeyBpZiAoISRlbGVtZW50b1snY2FyYWN0ZXJTdG9jayddKSB7ICRlbGVtZW50b1snc3RvY2snXSA9IHN0cl9yZXBsYWNlKCRlbGVtZW50b1snc2VwYXJhZG9yTWlsZXMnXSwgJycsIHRyaW0oJGVsZW1lbnRvWydzdG9jayddKSk7IH0gJGVsZW1lbnRvWydjb3N0ZSddID0gc3RyX3JlcGxhY2UoJGVsZW1lbnRvWydzZXBhcmFkb3JNaWxlcyddLCAnJywgdHJpbSgkZWxlbWVudG9b2 
Nvc3RlJ10pKTsgJGVsZW1lbnRvWydwcmVjaW8nXSA9IHN0cl9yZXBsYWNlKCRlbGVtZW50b1snc2VwYXJhZG9yTWlsZXMnXSwgJycsIHRyaW0oJGVsZW1lbnRvWydwcmVjaW8nXSkpOyB9IGlmICgkZWxlbWVudG9bJ3NlcGFyYWRvckRlY2ltYWxlcyddKSB7ICRlbGVtZW50b1snY29zdGUnXSA9IHN0cl9yZXBsYWNlKCRlbGVtZW50b1snc2VwYXJhZG9yRGVjaW1hbGVzJ10sICcuJywgdHJpbSgkZWxlbWVudG9bJ2Nvc3RlJ10pKTsgJGVsZW1lbnRvWydwcmVjaW8nXSA9IHN0cl9yZXBsYWNlKCRlbGVtZW50b1snc2VwYXJhZG9yRGVjaW1hbGVzJ10sICcuJywgdHJpbSgkZWxlbWVudG9bJ3ByZWNpbyddKSk7IH0gaWYgKCEkZWxlbWVudG9bJ2NhcmFjdGVyU3RvY2snXSkgeyAkZWxlbWVudG9bJ3N0b2NrJ10gPSAoaW50KSAkZWxlbWVudG9bJ3N0b2NrJ107IH0gZWxzZSB7ICRlbmNvbnRyYWRvID0gZmFsc2U7IGZvcmVhY2ggKCRlbGVtZW50b1snY2FyYWN0ZXJTdG9jayddIGFzICRjbGF2ZSA9PiAkY2FyYWN0ZXIpIHsgaWYgKHN0cnRvbG93ZXIodHJpbSgkZWxlbWVudG9bJ3N0b2NrJ10pKSA9PSBzdHJ0b2xvd2VyKHRyaW0oJGNhcmFjdGVyKSkpIHsgJGVuY29udHJhZG8gPSB0cnVlOyAkZWxlbWVudG9bJ3N0b2NrJ10gPSAoaW50KSAkZWxlbWVudG9bJ2NhbnRpZGFkU3RvY2snXVskY2xhdmVdOyBicmVhazsgfSB9IGlmICgkZWxlbWVudG9bJ3N0b2NrJ10gIT0gLTEgJiYgISRlbmNvbnRyYWRvKSB7ICRlbGVtZW50b1snc3RvY2snXSA9IDA7IH0gfSAkZWxlbWVudG9bJ2Nvc3RlJ10gPSAoZmxvYXQpICRlbGVtZW50b1snY29zdGUnXTsgJGVsZW1lbnRvWydwcmVjaW8nXSA9IChmbG9hdCkgJGVsZW1lbnRvWydwcmVjaW8nXTsgaWYgKCRlbGVtZW50b1snZm9ybXVsYSddICYmICgkZWxlbWVudG9bJ3ByZWNpbyddICE9IC0xIHx8ICRlbGVtZW50b1snY29zdGUnXSAhPSAtMSkpIHsgJG51ZXZvUHJlY2lvID0gJHRoaXMtPmZvcm11bGEoJGVsZW1lbnRvWydjb3N0ZSddLCAkZWxlbWVudG9bJ3ByZWNpbyddLCAkZWxlbWVudG9bJ2Zvcm11bGEnXSk7IGlmICgkbnVldm9QcmVjaW8pIHsgJGVsZW1lbnRvWydwcmVjaW8nXSA9IG51bWJlcl9mb3JtYXQoJG51ZXZvUHJlY2lvLCA2LCAnLicsICcnKTsgfSB9IGlmICgkZWxlbWVudG9FbmNvbnRyYWRvWydpZF9wcm9kdWN0X2F0dHJpYnV0ZSddKSB7ICRjb21iaW5hY2lvbiA9IG5ldyBDb21iaW5hdGlvbigkZWxlbWVudG9FbmNvbnRyYWRvWydpZF9wcm9kdWN0X2F0dHJpYnV0ZSddKTsgJHRpZW5lQ29tYmluYWNpb24gPSB0cnVlOyAkaWRQcm9kdWN0byA9ICRjb21iaW5hY2lvbi0+aWRfcHJvZHVjdDsgfSBlbHNlIHsgJGlkUHJvZHVjdG8gPSAkZWxlbWVudG9FbmNvbnRyYWRvWydpZF9wcm9kdWN0J107IH0gJHRpZW5kYXNQcm9kdWN0byA9IFByb2R1Y3Q6OmdldFNob3BzQnlQcm9kdWN0KCRpZFByb2R1Y3RvKTsgJHN0b2NrUHJvZHVjdG8gPSBTdG9ja0F2YWlsYWJsZTo6Z2V0UXVhbnRpdHlBdmFpbGFibGVCeVByb2R1Y3QoJGlkUHJvZHVjdG8sICRlbGVtZW50b0VuY29udHJhZG9bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ10pOyBmb3JlYWNoICgkdGllbmRhc1Byb2R1Y3RvIGFzICR0aWVuZGFQcm9kdWN0bykgeyBpZiAoJGVsZW1lbnRvWyd0aWVuZGEnXSA+IDAgJiYgJGVsZW1lbnRvWyd0aWVuZGEnXSAhPSAkdGllbmRhUHJvZHVjdG9bJ2lkX3Nob3AnXSkgeyBjb250aW51ZTsgfSBzZWxmOjpzZXRDb250ZXh0U2hvcCgkdGllbmRhUHJvZHVjdG9bJ2lkX3Nob3AnXSk7IGlmICgkZWxlbWVudG9bJ3Bvc1N0b2NrJ10gIT09ICIiKSB7ICRzdG9ja0xvY2FsID0gMDsgaWYgKCRlbGVtZW50b1snc3RvY2snXSA+IC0xKSB7IGlmICgkZWxlbWVudG9bJ3N0b2NrJ10gPiAkZWxlbWVudG9bJ3N0b2NrTWF4aW1vJ10pIHsgJGVsZW1lbnRvWydzdG9jayddID0gJGVsZW1lbnRvWydzdG9ja01heGltbyddOyB9IGlmICgkZWxlbWVudG9bJ2FjdFNpMCddID09IDEpIHsgJG9yaWdlblN0b2NrID0gRGI6OmdldEluc3RhbmNlKCktPmdldFZhbHVlKCdTRUxFQ1Qgb3JpZ2VuIEZST00gYCcgLiBfREJfUFJFRklYXyAuIHNlbGY6OnByZWZpam8gLiAic3RvY2tVcGRhdGVgIFdIRVJFIGlkUHJvZHVjdG8gPSAnJGlkUHJvZHVjdG8nIEFORCBpZEF0cmlidXRvID0gJ3skZWxlbWVudG9FbmNvbnRyYWRvWydpZF9wcm9kdWN0X2F0dHJpYnV0ZSddfSciKTsgJHN0b2NrUHJvZHVjdG8gPSBTdG9ja0F2YWlsYWJsZTo6Z2V0UXVhbnRpdHlBdmFpbGFibGVCeVByb2R1Y3QoJGlkUHJvZHVjdG8sICRlbGVtZW50b0VuY29udHJhZG9bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ10pOyBpZiAoKCRzdG9ja1Byb2R1Y3RvID09IDAgJiYgJG9yaWdlblN0b2NrID09IDIpIHx8ICRvcmlnZW5TdG9jayA9PSAxIHx8ICEkb3JpZ2VuU3RvY2spIHsgc2VsZjo6JGNhbWJpYWRvUG9yTW9kdWxvID0gdHJ1ZTsgJHRoaXMtPm1vZGlmaWNhclN0b2NrV0dBKCRpZFByb2R1Y3RvLCAkZWxlbWVudG9FbmNvbnRyYWRvWydpZF9wcm9kdWN0X2F0dHJpYnV0ZSddLCAkZWxlbWVudG9bJ3N0b2NrJ10sICR0aWVuZGFQcm9kdWN0b1snaWRfc2hvcCddLCAkZWxlbWVudG9bJ2lkV2FyZUhvdXNlJ10pOyAkc3RvY2tMb2NhbCA9IDE7IH0gfSBlbHNlIHsgc2VsZjo6JGNhbWJpYWRvUG9yTW9kdWxvID0gdHJ1ZTsgJHRoaXMtPm1vZGlmaWNhclN0b2NrV0dBKCRpZFByb2R1Y3RvLCAkZWxlbWVudG9FbmNvbnRyYWRvWydpZF9wcm9kdWN0X2F0dHJpYnV0ZSddLCAkZWxlbWVudG9bJ3N0b2NrJ10sICR0aWVuZGFQcm9kdWN0b1snaWRfc2hvcCddLCAkZWxlbWVudG9bJ2lkV2FyZUhvdXNlJ10pOyB9IHNlbGY6OiRjYW1iaWFkb1Bvck1vZHVsbyA9IGZhbHNlOyB9IGVsc2UgeyAkdGhpcy0+bW9kaWZpY2FyU3RvY2tXR0EoJGlkUHJvZHVjdG8sICRlbGVtZW50b0VuY29udHJhZG9bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ10sIDAsICR0aWVuZGFQcm9kdWN0b1snaWRfc2hvcCddLCAkZWxlbWVudG9bJ2lkV2FyZUhvdXNlJ10pOyB9IH0gaWYgKCRlbGVtZW50b0VuY29udHJhZG9bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ10pIHsgJG9iamV0b0FjdHVhbGl6YWJsZSA9IG5ldyBDb21iaW5hdGlvbigkZWxlbWVudG9FbmNvbnRyYWRvWydpZF9wcm9kdWN0X2F0dHJpYnV0ZSddKTsgJHByb2R1Y3RvQWN0dWFsaXphYmxlID0gbmV3IFByb2R1Y3QoJGlkUHJvZHVjdG8pOyB9IGVsc2UgeyAkb2JqZXRvQWN0dWFsaXphYmxlID0gbmV3IFByb2R1Y3QoJGlkUHJvZHVjdG8pOyAkcHJvZHVjdG9BY3R1YWxpemFibGUgPSAkb2JqZXRvQWN0dWFsaXphYmxlOyB9ICRkYXRvc0VzcGVjaWZpY28gPSB1bnNlcmlhbGl6ZSgkZWxlbWVudG9bJ2RhdG9zJ10pOyBpZiAoJGVsZW1lbnRvWydwb3NQcmVjaW9Fc3BlY2lmaWNvJ10pIHsgJHByZWNpb0VzcGVjaWZpY29JbXBvcnRlID0gJGRhdG9zRXNwZWNpZmljb1skZWxlbWVudG9bJ3Bvc1ByZWNpb0VzcGVjaWZpY28nXV07ICRwcmVjaW9Fc3BlY2lmaWNvSW1wb3J0ZSA9IG51bWJlcl9mb3JtYXQoJHByZWNpb0VzcGVjaWZpY29JbXBvcnRlLCA2LCAnLicsICcnKTsgaWYgKCRwcmVjaW9Fc3BlY2lmaWNvSW1wb3J0ZSkgeyBpZiAoJGVsZW1lbnRvWydwb3NQcmVjaW9Fc3BlY2lmaWNvRmVjaGFJbmknXSkgeyAkZmVjaGFJbmljaW8gPSAkZGF0b3NFc3BlY2lmaWNvWyRlbGVtZW50b1sncG9zUHJlY2lvRXNwZWNpZmljb0ZlY2hhSW5pJ11dOyB9IGlmICgkZWxlbWVudG9bJ3Bvc1ByZWNpb0VzcGVjaWZpY29GZWNoYUZpbiddKSB7ICRmZWNoYUZpbiA9ICRkYXRvc0VzcGVjaWZpY29bJGVsZW1lbnRvWydwb3NQcmVjaW9Fc3BlY2lmaWNvRmVjaGFGaW4nXV07IH0gaWYgKCRlbGVtZW50b1sncG9zR3J1cG9QcmVjaW9Fc3BlY2lmaWNvJ10pIHsgJGdydXBvID0gJGRhdG9zRXNwZWNpZmljb1skZWxlbWVudG9bJ3Bvc0dydXBvUHJlY2lvRXNwZWNpZmljbyddXTsgfSBpZiAoJGVsZW1lbnRvRW5jb250cmFkb1snaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXSA9PSAwKSB7IFNwZWNpZmljUHJpY2U6OmRlbGV0ZUJ5UHJvZHVjdElkKCRpZFByb2R1Y3RvKTsgfSAkcHJlY2lvRXNwZWNpZmljbyA9IG5ldyBTcGVjaWZpY1ByaWNlKCk7ICRwcmVjaW9Fc3BlY2lmaWNvLT5wcmljZSA9IG51bWJlcl9mb3JtYXQoJGVsZW1lbnRvWydwcmVjaW8nXSwgNiwgJy4nLCAnJyk7ICRwcmVjaW9Fc3BlY2lmaWNvLT5pZF9zaG9wID0gMDsgJHByZWNpb0VzcGVjaWZpY28tPmlkX2NhcnQgPSAwOyBpZiAoJGVsZW1lbnRvRW5jb250cmFkb1snaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXSA8PiAwKSB7ICR0aGlzLT5kZWxldGVCeVByb2R1Y3RBbmRBdHRyaWJ1dGVJZCgkaWRQcm9kdWN0bywgJGVsZW1lbnRvRW5jb250cmFkb1snaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXSk7ICRwcmVjaW9Fc3BlY2lmaWNvLT5pZF9wcm9kdWN0X2F0dHJpYnV0ZSA9ICRlbGVtZW50b0VuY29udHJhZG9bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ107IH0gJHByZWNpb0VzcGVjaWZpY28tPmZyb21fcXVhbnRpdHkgPSAxOyAkcHJlY2lvRXNwZWNpZmljby0+aWRfcHJvZHVjdCA9ICRpZFByb2R1Y3RvOyAkcHJlY2lvRXNwZWNpZmljby0+aWRfY3VycmVuY3kgPSAwOyAkcHJlY2lvRXNwZWNpZmljby0+aWRfY291bnRyeSA9IDA7ICRwcmVjaW9Fc3BlY2lmaWNvLT5pZF9ncm91cCA9IChpbnQpICgkZ3J1cG8gPyAkZ3J1cG8gOiAwKTsgJHByZWNpb0VzcGVjaWZpY28tPmlkX2N1c3RvbWVyID0gMDsgJHByZWNpb0VzcGVjaWZpY28tPmZyb20gPSAoJGZlY2hhSW5pY2lvID8gZGF0ZSgnWS1tLWQgSDppOnMnLCBzdHJ0b3RpbWUodHJpbSgkZmVjaGFJbmljaW8pKSkgOiAnMDAwMC0wMC0wMCcpOyAkcHJlY2lvRXNwZWNpZmljby0+dG8gPSAoJGZlY2hhRmluID8gZGF0ZSgnWS1tLWQgSDppOnMnLCBzdHJ0b3RpbWUodHJpbSgkZmVjaGFGaW4pKSkgOiAnMDAwMC0wMC0wMCcpOyAkcHJlY2lvRXNwZWNpZmljby0+cmVkdWN0aW9uX3R5cGUgPSAnYW1vdW50JzsgJHByZWNpb0VzcGVjaWZpY28tPnJlZHVjdGlvbl90YXggPSAwOyBpZiAoJGVsZW1lbnRvRW5jb250cmFkb1snaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXSA8PiAwKSB7ICRwcmVjaW9Fc3BlY2lmaWNvLT5yZWR1Y3Rpb24gPSAkZWxlbWVudG9bJ3ByZWNpbyddIC0gJHByZWNpb0VzcGVjaWZpY29JbXBvcnRlOyB9IGVsc2UgeyAkcHJlY2lvRXNwZWNpZmljby0+cmVkdWN0aW9uID0gJGVsZW1lbnRvWydwcmVjaW8nXSAtICRwcmVjaW9Fc3BlY2lmaWNvSW1wb3J0ZTsgfSAkcHJlY2lvRXNwZWNpZmljby0+cmVkdWN0aW9uID0gbnVtYmVyX2Zvcm1hdCgkcHJlY2lvRXNwZWNpZmljby0+cmVkdWN0aW9uLCA2LCAnLicsICcnKTsgdHJ5IHsgJHByZWNpb0VzcGVjaWZpY28tPmFkZCgpOyB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsgfSB9IH0gaWYgKCRlbGVtZW50b1snY29zdGUnXSA+IC0xKSB7ICRjYW1iaW9zQWN0dWFsaXphYmxlID0gdHJ1ZTsgJG9iamV0b0FjdHVhbGl6YWJsZS0+d2hvbGVzYWxlX3ByaWNlID0gbnVtYmVyX2Zvcm1hdCgkZWxlbWVudG9bJ2Nvc3RlJ10sIDYsICcuJywgJycpOyB9IGlmICgkZWxlbWVudG9bJ3ByZWNpbyddID4gLTEpIHsgJGNhbWJpb3NBY3R1YWxpemFibGUgPSB0cnVlOyAkcHJlY2lvQ2FtYmlhZG8gPSB0cnVlOyAkb2JqZXRvQWN0dWFsaXphYmxlLT5wcmljZSA9IG51bWJlcl9mb3JtYXQoJGVsZW1lbnRvWydwcmVjaW8nXSwgNiwgJy4nLCAnJyk7IH0gaWYgKCRlbGVtZW50b1snZWFuVXBkYXRlJ10gIT0gLTEpIHsgJGNhbWJpb3NBY3R1YWxpemFibGUgPSB0cnVlOyAkb2JqZXRvQWN0dWFsaXphYmxlLT5lYW4xMyA9ICRlbGVtZW50b1snZWFuVXBkYXRlJ107IH0gJGRhdG9zU2lucGFyc2VhciA9IHVuc2VyaWFsaXplKCRlbGVtZW50b1snZGF0b3MnXSk7IGlmICghZW1wdHkoJGVsZW1lbnRvWydmb3J6YXJJZGlvbWEnXSkpIHsgJGlkSWRpb21hID0gJGVsZW1lbnRvWydmb3J6YXJJZGlvbWEnXTsgfSBlbHNlIHsgJGlkSWRpb21hID0gKCFlbXB0eSgkZGF0b3NTaW5wYXJzZWFyWyRlbGVtZW50b1sncG9zSWRJZGlvbWEnXV0pID8gJGRhdG9zU2lucGFyc2VhclskZWxlbWVudG9bJ3Bvc0lkSWRpb21hJ11dIDogQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJ1BTX0xBTkdfREVGQVVMVCcpKTsgfSBpZiAoJGVsZW1lbnRvWydwb3NOb21icmUnXSAhPT0gIiIpIHsgJGNhbWJpb3NQcm9kdWN0byA9IHRydWU7ICRwcm9kdWN0b0FjdHVhbGl6YWJsZS0+bmFtZVskaWRJZGlvbWFdID0gJGRhdG9zU2lucGFyc2VhclskZWxlbWVudG9bJ3Bvc05vbWJyZSddXTsgfSBpZiAoJGVsZW1lbnRvWydwb3NEZXNjTGFyZ2EnXSAhPT0gIiIpIHsgJGNhbWJpb3NQcm9kdWN0byA9IHRydWU7ICRwcm9kdWN0b0FjdHVhbGl6YWJsZS0+ZGVzY3JpcHRpb25bJGlkSWRpb21hXSA9ICRkYXRvc1NpbnBhcnNlYXJbJGVsZW1lbnRvWydwb3NEZXNjTGFyZ2EnXV07IH0gaWYgKCRlbGVtZW50b1sncG9zRGVzY0NvcnRhJ10gIT09ICIiKSB7ICRjYW1iaW9zUHJvZHVjdG8gPSB0cnVlOyAkcHJvZHVjdG9BY3R1YWxpemFibGUtPmRlc2NyaXB0aW9uX3Nob3J0WyRpZElkaW9tYV0gPSAkZGF0b3NTaW5wYXJzZWFyWyRlbGVtZW50b1sncG9zRGVzY0NvcnRhJ11dOyB9IGlmICgkZWxlbWVudG9bJ3Bvc0F2YWlsYWJsZU5vdyddICE9PSAiIikgeyAkY2FtYmlvc1Byb2R1Y3RvID0gdHJ1ZTsgJHByb2R1Y3RvQWN0dWFsaXphYmxlLT5hdmFpbGFibGVfbm93WyRpZElkaW9tYV0gPSAkZGF0b3NTaW5wYXJzZWFyWyRlbGVtZW50b1sncG9zQXZhaWxhYmxlTm93J11dOyB9IGlmICgkZWxlbWVudG9bJ3Bvc0F2YWlsYWJsZUxhdGVyJ10gIT09ICIiKSB7ICRjYW1iaW9zUHJvZHVjdG8gPSB0cnVlOyAkcHJvZHVjdG9BY3R1YWxpemFibGUtPmF2YWlsYWJsZV9sYXRlclskaWRJZGlvbWFdID0gJGRhdG9zU2lucGFyc2VhclskZWxlbWVudG9bJ3Bvc0F2YWlsYWJsZUxhdGVyJ11dOyB9IGlmICgkZWxlbWVudG9bJ3Bvc1N0b2NrJ10gIT09ICIiICYmICRlbGVtZW50b1snYWN0U2kwJ10gPT0gMSkgeyBzd2l0Y2ggKCRzdG9ja0xvY2FsKSB7IGNhc2UgMDogJHRleHRvID0gJGVsZW1lbnRvWyd0ZXh0b0Rpc3BvbmliaWxpZGFkX3NpU3RvY2snXTsgYnJlYWs7IGNhc2UgMTogJHRleHRvID0gJGVsZW1lbnRvWyd0ZXh0b0Rpc3BvbmliaWxpZGFkX3NpblN0b2NrJ107IGJyZWFrOyB9IGlmICgkaW5zdGFsYWRvRXN0aW1hdGVkRGVsaXZlcnkgJiYgJGVsZW1lbnRvRW5jb250cmFkb1snaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXSkgeyAkdGhpcy0+aW5zZXJ0YXJUaWVtcG9Fc3RpbWF0ZWREZWxpdmVyeSgkaWRQcm9kdWN0bywgJGVsZW1lbnRvRW5jb250cmFkb1snaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXSwgQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJ1BTX1NIT1BfREVGQVVMVCcpLCAkdGV4dG8pOyB9IGVsc2UgeyAkY2FtYmlvc1Byb2R1Y3RvID0gdHJ1ZTsgJHByb2R1Y3RvQWN0dWFsaXphYmxlLT5hdmFpbGFibGVfbm93ID0gJHRleHRvOyB9IH0gaWYgKCRjYW1iaW9zQWN0dWFsaXphYmxlIHx8ICgkY2FtYmlvc1Byb2R1Y3RvICYmICRvYmpldG9BY3R1YWxpemFibGUgPT09ICRwcm9kdWN0b0FjdHVhbGl6YWJsZSkpIHsgdHJ5IHsgJG9iamV0b0FjdHVhbGl6YWJsZS0+dXBkYXRlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXgpIHsgfSB9IGlmICgkY2FtYmlvc1Byb2R1Y3RvICYmICRvYmpldG9BY3R1YWxpemFibGUgIT09ICRwcm9kdWN0b0FjdHVhbGl6YWJsZSkgeyB0cnkgeyBpZigkdGllbmVDb21iaW5hY2lvbiAmJiAkcHJlY2lvQ2FtYmlhZG8peyAkcHJvZHVjdG9BY3R1YWxpemFibGUtPnByaWNlID0gMDsgJHByb2R1Y3RvQWN0dWFsaXphYmxlLT53aG9sZXNhbGVfcHJpY2UgPSAwOyB9ICRwcm9kdWN0b0FjdHVhbGl6YWJsZS0+dXBkYXRlKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXgpIHsgfSB9IGlmICgkZWxlbWVudG9bJ3Bvc0F0cmlidXRvT3JpZ2VuJ10gJiYgJGVsZW1lbnRvWydwb3NBdHJpYnV0b1RyYWR1Y2Npb24nXSAmJiAkZWxlbWVudG9bJ2lkaW9tYU9yaWdlbiddICYmICRlbGVtZW50b1snaWRpb21hRGVzdGlubyddICYmICRlbGVtZW50b1snaWRzR3J1cG9BdHJpYnV0byddKSB7ICRpZExhbmdPcmlnaW5hbCA9IENvbnRleHQ6OmdldENvbnRleHQoKS0+bGFuZ3VhZ2UtPmlkOyBDb250ZXh0OjpnZXRDb250ZXh0KCktPmxhbmd1YWdlLT5pZCA9ICRlbGVtZW50b1snaWRpb21hT3JpZ2VuJ107ICRhdHJpYnV0b3MgPSBQcm9kdWN0OjpnZXRBdHRyaWJ1dGVzSW5mb3JtYXRpb25zQnlQcm9kdWN0KCRwcm9kdWN0b0FjdHVhbGl6YWJsZS0+aWQpOyBDb250ZXh0OjpnZXRDb250ZXh0KCktPmxhbmd1YWdlLT5pZCA9ICRpZExhbmdPcmlnaW5hbDsgaWYgKCRhdHJpYnV0b3MpIHsgJHBvc2ljaW9uZXNPcmlnZW5lcyA9IGV4cGxvZGUoJywnLCAkZWxlbWVudG9bJ3Bvc0F0cmlidXRvT3JpZ2VuJ10pOyBhcnJheV93YWxrKCRwb3NpY2lvbmVzT3JpZ2VuZXMsIGZ1bmN0aW9uKCYkdmFsb3IsICRjbGF2ZSkgeyAkdmFsb3IgPSB0cmltKCR2YWxvcik7IH0pOyAkcG9zaWNpb25lc1RyYWR1Y2Npb25lcyA9IGV4cGxvZGUoJywnLCAkZWxlbWVudG9bJ3Bvc0F0cmlidXRvVHJhZHVjY2lvbiddKTsgYXJyYXlfd2FsaygkcG9zaWNpb25lc1RyYWR1Y2Npb25lcywgZnVuY3Rpb24oJiR2YWxvciwgJGNsYXZlKSB7ICR2YWxvciA9IHRyaW0oJHZhbG9yKTsgfSk7ICRpZHNHcnVwb0F0cmlidXRvID0gZXhwbG9kZSgnLCcsICRlbGVtZW50b1snaWRzR3J1cG9BdHJpYnV0byddKTsgYXJyYXlfd2FsaygkaWRzR3J1cG9BdHJpYnV0bywgZnVuY3Rpb24oJiR2YWxvciwgJGNsYXZlKSB7ICR2YWxvciA9IHRyaW0oJHZhbG9yKTsgfSk7IGZvcmVhY2ggKCRhdHJpYnV0b3MgYXMgJGF0cmlidXRvKSB7IGlmIChlbXB0eShzZWxmOjokY2FjaGVUcmFkdWNjaW9uZXNBdHJpYnV0b1skYXRyaWJ1dG9bJ2lkX2F0dHJpYnV0ZSddXSkpIHsgJHRyYWR1Y2Npb24gPSAkdGhpcy0+YnVzY2FyVHJhZHVjY2lvbigkYXRyaWJ1dG9bJ2lkX2F0dHJpYnV0ZV9ncm91cCddLCAkYXRyaWJ1dG9bJ2F0dHJpYnV0ZSddLCAkZGF0b3NTaW5wYXJzZWFyLCAkaWRzR3J1cG9BdHJpYnV0bywgJHBvc2ljaW9uZXNPcmlnZW5lcywgJHBvc2ljaW9uZXNUcmFkdWNjaW9uZXMpOyBpZiAoJHRyYWR1Y2Npb24pIHsgdHJ5IHsgJGF0cmlidXRvT2JqID0gbmV3IEF0dHJpYnV0ZSgkYXRyaWJ1dG9bJ2lkX2F0dHJpYnV0ZSddKTsgaWYgKCRhdHJpYnV0b09iai0+bmFtZVskZWxlbWVudG9bJ2lkaW9tYURlc3Rpbm8nXV0gIT0gJHRyYWR1Y2Npb24pIHsgJGF0cmlidXRvT2JqLT5uYW1lWyRlbGVtZW50b1snaWRpb21hRGVzdGlubyddXSA9ICR0cmFkdWNjaW9uOyAkYXRyaWJ1dG9PYmotPnNhdmUoKTsgfSBzZWxmOjokY2FjaGVUcmFkdWNjaW9uZXNBdHJpYnV0b1skYXRyaWJ1dG9bJ2lkX2F0dHJpYnV0ZSddXSA9IHRydWU7IH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXgpIHsgfSB9IH0gfSB9IH0gfSBzZWxmOjpzZXREZWZhdWx0Q29udGV4dFNob3AoKTsgJHByb2Nlc2Fkb3MrKzsgSW1heExvZzo6Z2V0TG9nKCktPmFkZExvZygkZWxlbWVudG9bJ2VhbiddIC4gIiAjICIgLiAkdGhpcy0+bCgnUHJvY2VzYWRvIGNvcnJlY3RvOicpIC4gIiBpZCBmaWNoZXJvICh7JGVsZW1lbnRvWydpZEpvYiddfSksIGlkIHByb2R1Y3RvICh7JGVsZW1lbnRvRW5jb250cmFkb1snaWRfcHJvZHVjdCddfSksIGlkIGNvbWJpbmFjaW9uICh7JGVsZW1lbnRvRW5jb250cmFkb1snaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXX0pLCBzdG9jayAoeyRlbGVtZW50b1snc3RvY2snXX0pLCBjb3N0ZSAoeyRlbGVtZW50b1snY29zdGUnXX0pLCB2ZW50YSAoeyRlbGVtZW50b1sncHJlY2lvJ119KSIsIDEsIDYsIGFycmF5KCdsb2cnKSwgbnVsbCwgKCFlbXB0eSgkb2JqZXRvQWN0dWFsaXphYmxlKSA/ICRvYmpldG9BY3R1YWxpemFibGUgOiAwKSk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXhjKSB7IGVjaG8gJzxwcmU+JzsgZWNobyAkZXhjOyBlY2hvICc8L3ByZT4nOyBJbWF4TG9nOjpnZXRMb2coKS0+YWRkTG9nKCRleGMtPmdldE1lc3NhZ2UoKSwgMywgJGV4Yy0+Z2V0Q29kZSgpLCBhcnJheSgnbG9nJyksICRleGMpOyB9ICR0aGlzLT51cGRhdGVQcm9jZXNhZG8oJGVsZW1lbnRvWydlYW4nXSwgJGVsZW1lbnRvWydpZEpvYiddKTsgJGRhdGV0aW1lID0gKGRhdGUoJ1ktbS1kIEg6aTpzJykpOyAkc3FsID0gJ1VQREFURSAgJyAuIF9EQl9QUkVGSVhfIC4gJHRoaXMtPnRhYmxhIC4gJ2xhc3R1cGRhdGVFYW4gc2V0IHByb2Nlc28gPSAiJyAuICRkYXRldGltZSAuICciIFdIRVJFIHByb2Nlc2Fkbz0wIEFORCBpZEpvYiA9ICcgLiAoaW50KSAkZWxlbWVudG9bJ2lkSm9iJ107IERCOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlKCRzcWwpOyB9IHJldHVybiAkcHJvY2VzYWRvczsgfSBwdWJsaWMgZnVuY3Rpb24gZGVsZXRlQnlQcm9kdWN0QW5kQXR0cmlidXRlSWQoJGlkX3Byb2R1Y3QsICRpZF9wcm9kdWN0X2F0dHJpYnV0ZSkgeyBpZiAoRGI6OmdldEluc3RhbmNlKCktPmV4ZWN1dGUoJ0RFTEVURSBGUk9NIGAnIC4gX0RCX1BSRUZJWF8gLiAnc3BlY2lmaWNfcHJpY2VgIAoJCQkJCQkJCQkJV0hFUkUgYGlkX3Byb2R1Y3RgID0gJyAuIChpbnQpICRpZF9wcm9kdWN0IC4gJyBhbmQgaWRfcHJvZHVjdF9hdHRyaWJ1dGUgPSAnIC4gJGlkX3Byb2R1Y3RfYXR0cmlidXRlKSkgeyBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZSgnUFNfU1BFQ0lGSUNfUFJJQ0VfRkVBVFVSRV9BQ1RJVkUnLCBTcGVjaWZpY1ByaWNlOjppc0N1cnJlbnRseVVzZWQoJ3NwZWNpZmljX3ByaWNlJykpOyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7IH0gcHJpdmF0ZSBmdW5jdGlvbiBidXNjYXJUcmFkdWNjaW9uKCRpZEdydXBvQXRyaWJ1dG8sICRub21icmVBdHJpYnV0bywgJGRhdG9zLCAkaWRzR3J1cG9BdHJpYnV0bywgJHBvc2ljaW9uZXNPcmlnZW5lcywgJHBvc2ljaW9uZXNUcmFkdWNjaW9uZXMpIHsgJHBvcyA9IGFycmF5X3NlYXJjaCgkaWRHcnVwb0F0cmlidXRvLCAkaWRzR3J1cG9BdHJpYnV0byk7IGlmICgkcG9zICE9PSBmYWxzZSkgeyAkY29sdW1uYU9yaWdlbmVzID0gJHBvc2ljaW9uZXNPcmlnZW5lc1skcG9zXTsgJGNvbHVtbmFUcmFkdWNjaW9uZXMgPSAkcG9zaWNpb25lc1RyYWR1Y2Npb25lc1skcG9zXTsgJG5vbWJyZXNPcmlnZW4gPSBleHBsb2RlKCcsJywgJGRhdG9zWyRjb2x1bW5hT3JpZ2VuZXNdKTsgYXJyYXlfd2Fsaygkbm9tYnJlc09yaWdlbiwgZnVuY3Rpb24oJiR2YWxvciwgJGNsYXZlKSB7ICR2YWxvciA9ICR0aGlzLT5kZXN0aWxkYXIobWJfc3RydG9sb3dlcih0cmltKCR2YWxvcikpKTsgfSk7ICRwb3NUcmFkdWNjaW9uID0gYXJyYXlfc2VhcmNoKCR0aGlzLT5kZXN0aWxkYXIobWJfc3RydG9sb3dlcih0cmltKCRub21icmVBdHJpYnV0bykpKSwgJG5vbWJyZXNPcmlnZW4pOyBpZiAoJHBvc1RyYWR1Y2Npb24gIT09IGZhbHNlKSB7ICRub21icmVzVHJhZHVjaWRvcyA9IGV4cGxvZGUoJywnLCAkZGF0b3NbJGNvbHVtbmFUcmFkdWNjaW9uZXNdKTsgfSB9IHJldHVybiAoaXNzZXQoJG5vbWJyZXNUcmFkdWNpZG9zWyRwb3NUcmFkdWNjaW9uXSkgPyB0cmltKCRub21icmVzVHJhZHVjaWRvc1skcG9zVHJhZHVjY2lvbl0pIDogZmFsc2UpOyB9IHByaXZhdGUgZnVuY3Rpb24gZGVzdGlsZGFyKCRjYWRlbmEpIHsgJGNhZGVuYSA9IHN0cl9yZXBsYWNlKCBhcnJheSgnw4EnLCAnw4AnLCAnw4InLCAnw4QnLCAnw6EnLCAnw6AnLCAnw6QnLCAnw6InLCAnwqonKSwgYXJyYXkoJ0EnLCAnQScsICdBJywgJ0EnLCAnYScsICdhJywgJ2EnLCAnYScsICdhJyksICRjYWRlbmEgKTsgJGNhZGVuYSA9IHN0cl9yZXBsYWNlKCBhcnJheSgnw4knLCAnw4gnLCAnw4onLCAnw4snLCAnw6knLCAnw6gnLCAnw6snLCAnw6onKSwgYXJyYXkoJ0UnLCAnRScsICdFJywgJ0UnLCAnZScsICdlJywgJ2UnLCAnZScpLCAkY2FkZW5hICk7ICRjYWRlbmEgPSBzdHJfcmVwbGFjZSggYXJyYXkoJ8ONJywgJ8OMJywgJ8OPJywgJ8OOJywgJ8OtJywgJ8OsJywgJ8OvJywgJ8OuJyksIGFycmF5KCdJJywgJ0knLCAnSScsICdJJywgJ2knLCAnaScsICdpJywgJ2knKSwgJGNhZGVuYSApOyAkY2FkZW5hID0gc3RyX3JlcGxhY2UoIGFycmF5KCfDkycsICfDkicsICfDlicsICfDlCcsICfDsycsICfDsicsICfDticsICfDtCcpLCBhcnJheSgnTycsICdPJywgJ08nLCAnTycsICdvJywgJ28nLCAnbycsICdvJyksICRjYWRlbmEgKTsgJGNhZGVuYSA9IHN0cl9yZXBsYWNlKCBhcnJheSgnw5onLCAnw5knLCAnw5snLCAnw5wnLCAnw7onLCAnw7knLCAnw7wnLCAnw7snKSwgYXJyYXkoJ1UnLCAnVScsICdVJywgJ1UnLCAndScsICd1JywgJ3UnLCAndScpLCAkY2FkZW5hICk7IHJldHVybiAkY2FkZW5hOyB9IHByaXZhdGUgZnVuY3Rpb24gaW5zZXJ0YXJUaWVtcG9Fc3RpbWF0ZWREZWxpdmVyeSgkaWRfcHJvZHVjdCwgJGlkX3Byb2R1Y3RfYXR0cmlidXRlLCAkaWRfc2hvcCwgJHBpY2tpbmdfZGF5cykgeyAkaWRfcHJvZHVjdCA9IChpbnQpICRpZF9wcm9kdWN0OyAkaWRfcHJvZHVjdF9hdHRyaWJ1dGUgPSAoaW50KSAkaWRfcHJvZHVjdF9hdHRyaWJ1dGU7ICRpZF9zaG9wID0gKGludCkgJGlkX3Nob3A7ICRwaWNraW5nX2RheXMgPSAoaW50KSAkcGlja2luZ19kYXlzOyByZXR1cm4gRGI6OmdldEluc3RhbmNlKCktPmV4ZWN1dGUoJ1JFUExBQ0UgSU5UTyBgJyAuIF9EQl9QUkVGSVhfIC4gImVkX3Byb2RfY29tYmlfb29zYCAoaWRfcHJvZHVjdCwgaWRfcHJvZHVjdF9hdHRyaWJ1dGUsIGlkX3Nob3AsIHBpY2tpbmdfZGF5cykgCiAgICAgICAgICAgIFZBTFVFUyAoJyRpZF9wcm9kdWN0JywgJyRpZF9wcm9kdWN0X2F0dHJpYnV0ZScsICckaWRfc2hvcCcsICckcGlja2luZ19kYXlzJykiKTsgfSBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldENvbnRleHRTaG9wKCRpZFNob3ApIHsgJGNvbnRleHQgPSBDb250ZXh0OjpnZXRDb250ZXh0KCk7ICRjb250ZXh0LT5zaG9wID0gbmV3IFNob3AoJGlkU2hvcCk7IFNob3A6OnNldENvbnRleHQoMSwgJGlkU2hvcCk7IH0gcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXREZWZhdWx0Q29udGV4dFNob3AoKSB7IFNob3A6OnNldENvbnRleHQoNCk7IH0gcHVibGljIGZ1bmN0aW9uIHBlZGllbnRlc1Byb2Nlc2FyKCRpZEpvYiA9IDApIHsgJHNxbCA9ICdTRUxFQ1QgY291bnQoKikgRlJPTSAnIC4gX0RCX1BSRUZJWF8gLiAkdGhpcy0+dGFibGEgLiAndXBkYXRlRWFuICcgLiAnIFdIRVJFIHByb2Nlc2Fkbz0wJyAuICgkaWRKb2IgPyAnIEFORCBpZEpvYiA9ICcgLiAoaW50KSAkaWRKb2IgOiAnJyk7ICRyZXN1bHQgPSBEQjo6Z2V0SW5zdGFuY2UoKS0+Z2V0VmFsdWUoJHNxbCk7IHJldHVybiAkcmVzdWx0OyB9IHB1YmxpYyBmdW5jdGlvbiB1bHRpbWFzRGVzY2FyZ2FzKCkgeyAkcmVzdWx0YWRvID0gYXJyYXkoKTsgJHNxbCA9ICdTRUxFQ1QgKiBGUk9NICcgLiBfREJfUFJFRklYXyAuICR0aGlzLT50YWJsYSAuICdsYXN0dXBkYXRlRWFuICcgLiAnIFdIRVJFIHByb2Nlc2Fkbz0wJzsgJHJlc3VsdCA9IERCOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlUygkc3FsKTsgZm9yZWFjaCAoJHJlc3VsdCBhcyAkcikgeyAkcmVzdWx0YWRvWyRyWydpZEpvYiddXSA9ICRyOyB9IHJldHVybiAkcmVzdWx0YWRvOyB9IHByaXZhdGUgZnVuY3Rpb24gYnVzY2FyRWxlbWVudG9zKCRlYW4sC 
R0aXBvSWRlbnRpZmljYWRvciwgJGlkUHJvdmVlZG9yLCAkcHJlZmlqbywgJHN1ZmlqbykgeyAkZWFuID0gcFNRTCh0cmltKCRwcmVmaWpvKSAuIHRyaW0oJGVhbikgLiB0cmltKCRzdWZpam8pKTsgJGlkUHJvdmVlZG9yID0gKGludCkgJGlkUHJvdmVlZG9yOyAkam9pbiA9ICgkaWRQcm92ZWVkb3IgPyAnTEVGVCBKT0lOIGAnIC4gX0RCX1BSRUZJWF8gLiAncHJvZHVjdGAgcCBPTiBwLmlkX3Byb2R1Y3QgPSBwYS5pZF9wcm9kdWN0JyA6ICcnKTsgJHdoZXJlID0gKCRpZFByb3ZlZWRvciA/ICJBTkQgcC5pZF9zdXBwbGllciA9ICckaWRQcm92ZWVkb3InIiA6ICcnKTsgJHJlc3VsdGFkbyA9IDA7IHN3aXRjaCAoJHRpcG9JZGVudGlmaWNhZG9yKSB7IGRlZmF1bHQ6IGNhc2UgMTogJHNxbCA9ICcKICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgMCBBUyBpZF9wcm9kdWN0LCBwYS5pZF9wcm9kdWN0X2F0dHJpYnV0ZSBGUk9NIGAnIC4gX0RCX1BSRUZJWF8gLiAicHJvZHVjdF9hdHRyaWJ1dGVgIHBhCiAgICAgICAgICAgICAgICAgICAgICAgICRqb2luCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIHRyaW0ocGEuZWFuMTMpID0gJyRlYW4nICR3aGVyZSI7ICRyZXN1bHRhZG8gPSBEYjo6Z2V0SW5zdGFuY2UoKS0+Z2V0Um93KCRzcWwpOyBicmVhazsgY2FzZSAyOiAkc3FsID0gJwogICAgICAgICAgICAgICAgICAgIFNFTEVDVCAwIEFTIGlkX3Byb2R1Y3QsIHBhLmlkX3Byb2R1Y3RfYXR0cmlidXRlIEZST00gYCcgLiBfREJfUFJFRklYXyAuICJwcm9kdWN0X2F0dHJpYnV0ZWAgcGEKICAgICAgICAgICAgICAgICAgICAgICAgJGpvaW4KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgdHJpbShwYS5yZWZlcmVuY2UpID0gJyRlYW4nICR3aGVyZSI7ICRyZXN1bHRhZG8gPSBEYjo6Z2V0SW5zdGFuY2UoKS0+Z2V0Um93KCRzcWwpOyBicmVhazsgY2FzZSAzOiBpZiAoJGVhblsxXSkgeyAkcmVzdWx0YWRvID0gYXJyYXkoJ2lkX3Byb2R1Y3QnID0+IDAsICdpZF9wcm9kdWN0X2F0dHJpYnV0ZScgPT4gJGVhblsxXSk7IH0gZWxzZSB7ICRyZXN1bHRhZG8gPSBmYWxzZTsgfSBicmVhazsgY2FzZSA0OiAkc3FsID0gJwogICAgICAgICAgICAgICAgICAgIFNFTEVDVCAwIEFTIGlkX3Byb2R1Y3QsIHBzLmlkX3Byb2R1Y3RfYXR0cmlidXRlIEZST00gYCcgLiBfREJfUFJFRklYXyAuICJwcm9kdWN0X3N1cHBsaWVyYCBwcwogICAgICAgICAgICAgICAgICAgICAgICAkam9pbgogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB0cmltKHBzLnByb2R1Y3Rfc3VwcGxpZXJfcmVmZXJlbmNlKSA9ICckZWFuJyAkd2hlcmUiOyAkcmVzdWx0YWRvID0gRGI6OmdldEluc3RhbmNlKCktPmdldFJvdygkc3FsKTsgaWYgKCRyZXN1bHRhZG9bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ10gPT0gMCkgeyAkcmVzdWx0YWRvID0gMDsgfSBicmVhazsgfSBpZiAoISRyZXN1bHRhZG8pIHsgc3dpdGNoICgkdGlwb0lkZW50aWZpY2Fkb3IpIHsgZGVmYXVsdDogY2FzZSAxOiAkc3FsID0gJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgcC5pZF9wcm9kdWN0LCAwIEFTIGlkX3Byb2R1Y3RfYXR0cmlidXRlIEZST00gYCcgLiBfREJfUFJFRklYXyAuICJwcm9kdWN0YCBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB0cmltKHAuZWFuMTMpID0gJyRlYW4nICR3aGVyZSI7ICRyZXN1bHRhZG8gPSBEYjo6Z2V0SW5zdGFuY2UoKS0+Z2V0Um93KCRzcWwpOyBicmVhazsgY2FzZSAyOiAkc3FsID0gJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgcC5pZF9wcm9kdWN0LCAwIEFTIGlkX3Byb2R1Y3RfYXR0cmlidXRlIEZST00gYCcgLiBfREJfUFJFRklYXyAuICJwcm9kdWN0YCBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB0cmltKHAucmVmZXJlbmNlKSA9ICckZWFuJyAkd2hlcmUiOyAkcmVzdWx0YWRvID0gRGI6OmdldEluc3RhbmNlKCktPmdldFJvdygkc3FsKTsgYnJlYWs7IGNhc2UgMzogJHJlc3VsdGFkbyA9IGFycmF5KCdpZF9wcm9kdWN0JyA9PiAkZWFuWzBdLCAnaWRfcHJvZHVjdF9hdHRyaWJ1dGUnID0+IDApOyBicmVhazsgY2FzZSA0OiAkc3FsID0gJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgcHMuaWRfcHJvZHVjdCwgMCBBUyBpZF9wcm9kdWN0X2F0dHJpYnV0ZSBGUk9NIGAnIC4gX0RCX1BSRUZJWF8gLiAicHJvZHVjdF9zdXBwbGllcmAgcHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIHRyaW0ocHMucHJvZHVjdF9zdXBwbGllcl9yZWZlcmVuY2UpID0gJyRlYW4nICR3aGVyZSI7ICRyZXN1bHRhZG8gPSBEYjo6Z2V0SW5zdGFuY2UoKS0+Z2V0Um93KCRzcWwpOyBicmVhazsgfSB9IHJldHVybiAkcmVzdWx0YWRvOyB9IHByaXZhdGUgZnVuY3Rpb24gdXBkYXRlUHJvY2VzYWRvKCRlYW4sICRpZEpvYikgeyBpZiAoIWZ1bmN0aW9uX2V4aXN0cygndXBkYXRlUHJvY2VzYWRvXycpKSB7ICRmdW5jdGlvbiA9ICR0aGlzLT5nZXRGdW5jdGlvbigpOyBldmFsKGd6dW5jb21wcmVzcyhiYXNlNjRfZGVjb2RlKCRmdW5jdGlvbikpKTsgfSBpZiAoZnVuY3Rpb25fZXhpc3RzKCd1cGRhdGVQcm9jZXNhZG9fJykpIHsgcmV0dXJuIHVwZGF0ZVByb2Nlc2Fkb18oJHRoaXMsICRlYW4sICRpZEpvYik7IH0gZWNobyAkdGhpcy0+bCgnRXN0ZSBtb2R1bG8gbm8gdGllbmUgdW5hIGxpY2VuY2lhIHZhbGlkYScpOyBlY2hvICc8YnIgLz4nOyBlY2hvICR0aGlzLT5sKCdDb250YWN0ZSBjb24gbm9zb3Ryb3MgcGFyYSBvYnRlbmVyIHVuYSBsaWNlbmNpYSB2YWxpZGEnKTsgZGllKCk7IH0gcHVibGljIGZ1bmN0aW9uIHByb2Nlc29NYW51YWwoJGlkSm9iKSB7ICR0aGlzLT5faHRtbCA9ICcnOyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2ltYXhsb2cucGhwJzsgJGxvZyA9IEltYXhMb2c6OmdldExvZygpOyAkbG9nLT5tb2RpZmljYXJFc3RhZG8oQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdMT0dfQUNUSVZPJykpOyBpZiAoJHRoaXMtPnBlZGllbnRlc1Byb2Nlc2FyKCRpZEpvYikgIT0gMCkgeyAkcmVzdWx0YWRvID0gJHRoaXMtPnByb2Nlc2FyRWxlbWVudG9zKCRpZEpvYik7ICR0aGlzLT5faHRtbCAuPSAkdGhpcy0+ZGlzcGxheUNvbmZpcm1hdGlvbigkdGhpcy0+bCgnUHJvY2VzYWRvIGNvcnJlY3RvIDogJykgLiAkcmVzdWx0YWRvKTsgfSBlbHNlIHsgJHByb3ZlZWRvckRlc2FjID0gRGI6OmdldEluc3RhbmNlKCktPmdldFJvdygnU0VMRUNUIGRlc2FjdGl2YXJQcm9kdWN0b3MsIHByb3ZlZWRvciwgYWNjaW9uZGVzYWN0aXZhclByb2R1Y3RvcyBGUk9NIGAnIC4gX0RCX1BSRUZJWF8gLiAkdGhpcy0+dGFibGEgLiAnam9iYCBXSEVSRSBpZEpvYiA9ICcgLiAoaW50KSAkaWRKb2IpOyBpZiAoJHByb3ZlZWRvckRlc2FjWydkZXNhY3RpdmFyUHJvZHVjdG9zJ10pIHsgJHByb2Nlc29BbnRlcmlvciA9IERiOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlUygnU0VMRUNUIGVhbiBGUk9NIGAnIC4gX0RCX1BSRUZJWF8gLiAkdGhpcy0+dGFibGEgLiAndXBkYXRlRWFuYCBXSEVSRSBpZEpvYiA9ICcgLiAoaW50KSAkaWRKb2IgLiAnIEFORCBwcm9jZXNhZG8gPSAxJyk7IGlmICgkcHJvY2Vzb0FudGVyaW9yKSB7ICRkYXRvc0pvYiA9IERiOjpnZXRJbnN0YW5jZSgpLT5nZXRSb3coJ1NFTEVDVCBpZGVudGlmaWNhZG9yLCBwcmVmaWpvLCBzdWZpam8gRlJPTSBgJyAuIF9EQl9QUkVGSVhfIC4gJHRoaXMtPnRhYmxhIC4gJ2pvYmAgV0hFUkUgaWRKb2IgPSAnIC4gKGludCkgJGlkSm9iKTsgJGlkc1Byb2R1Y3RvUHJvY2VzYWRvcyA9IGFycmF5KCk7ICRpZHNDb21iaW5hY2lvblByb2Nlc2Fkb3MgPSBhcnJheSgpOyBmb3JlYWNoICgkcHJvY2Vzb0FudGVyaW9yIGFzICRpZGVudGlmaWNhZG9yKSB7ICRpZHMgPSAkdGhpcy0+YnVzY2FyRWxlbWVudG9zKCRpZGVudGlmaWNhZG9yWydlYW4nXSwgJGRhdG9zSm9iWydpZGVudGlmaWNhZG9yJ10sICRwcm92ZWVkb3JEZXNhY1sncHJvdmVlZG9yJ10sICRkYXRvc0pvYlsncHJlZmlqbyddLCAkZGF0b3NKb2JbJ3N1ZmlqbyddKTsgaWYgKCFlbXB0eSgkaWRzKSkgeyBpZiAoKGludCkgJGlkc1snaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXSkgeyAkaWRzQ29tYmluYWNpb25Qcm9jZXNhZG9zW10gPSAoaW50KSAkaWRzWydpZF9wcm9kdWN0X2F0dHJpYnV0ZSddOyB9IGlmICgoaW50KSAkaWRzWydpZF9wcm9kdWN0J10pIHsgJGlkc1Byb2R1Y3RvUHJvY2VzYWRvc1tdID0gKGludCkgJGlkc1snaWRfcHJvZHVjdCddOyB9IH0gfSAkaWRzUHJvZHVjdG9Qcm9jZXNhZG9zID0gaW1wbG9kZSgnLCcsIGFycmF5X3VuaXF1ZSgkaWRzUHJvZHVjdG9Qcm9jZXNhZG9zKSk7ICRpZHNDb21iaW5hY2lvblByb2Nlc2Fkb3MgPSBpbXBsb2RlKCcsJywgJGlkc0NvbWJpbmFjaW9uUHJvY2VzYWRvcyk7ICRwcm92ZWVkb3JTdHJpbmcgPSAnJzsgaWYgKCRwcm92ZWVkb3JEZXNhY1sncHJvdmVlZG9yJ10pIHsgJHByb3ZlZWRvclN0cmluZyA9ICdhbmQgcC5pZF9zdXBwbGllciA9ICcgLiAoaW50KSAkcHJvdmVlZG9yRGVzYWNbJ3Byb3ZlZWRvciddOyB9ICRjb21iaW5hY2lvbmVzU3RyaW5nID0gKCRpZHNDb21iaW5hY2lvblByb2Nlc2Fkb3MgPyAiQU5EIHBhLmlkX3Byb2R1Y3RfYXR0cmlidXRlIE5PVCBJTiAoJGlkc0NvbWJpbmFjaW9uUHJvY2VzYWRvcykiIDogJycpOyAkaWRzQ29tYmluYWNpb24gPSBEYjo6Z2V0SW5zdGFuY2UoKS0+ZXhlY3V0ZVMoJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgcGEuaWRfcHJvZHVjdCwgcGEuaWRfcHJvZHVjdF9hdHRyaWJ1dGUgRlJPTSBgJyAuIF9EQl9QUkVGSVhfIC4gJ3Byb2R1Y3RfYXR0cmlidXRlYCBwYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBgJyAuIF9EQl9QUkVGSVhfIC4gInByb2R1Y3RgIHAgT04gcGEuaWRfcHJvZHVjdCA9IHAuaWRfcHJvZHVjdAogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAxICRjb21iaW5hY2lvbmVzU3RyaW5nICRwcm92ZWVkb3JTdHJpbmciKTsgZm9yZWFjaCAoJGlkc0NvbWJpbmFjaW9uIGFzICRpZENvbWJpbmFjaW9uKSB7IFN0b2NrQXZhaWxhYmxlOjpzZXRRdWFudGl0eSgkaWRDb21iaW5hY2lvblsnaWRfcHJvZHVjdCddLCAkaWRDb21iaW5hY2lvblsnaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXSwgMCk7IH0gJHByb2R1Y3Rvc1N0cmluZyA9ICgkaWRzUHJvZHVjdG9Qcm9jZXNhZG9zID8gIkFORCBwLmlkX3Byb2R1Y3QgTk9UIElOICgkaWRzUHJvZHVjdG9Qcm9jZXNhZG9zKSIgOiAnJyk7ICRpZHNQcm9kdWN0byA9IERiOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlUygnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBwLmlkX3Byb2R1Y3QgRlJPTSBgJyAuIF9EQl9QUkVGSVhfIC4gInByb2R1Y3RgIHAKICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgMSAkcHJvZHVjdG9zU3RyaW5nICRwcm92ZWVkb3JTdHJpbmciKTsgZm9yZWFjaCAoJGlkc1Byb2R1Y3RvIGFzICRpZFByb2R1Y3RvKSB7IFN0b2NrQXZhaWxhYmxlOjpzZXRRdWFudGl0eSgkaWRQcm9kdWN0b1snaWRfcHJvZHVjdCddLCAwLCAwKTsgfSBmb3JlYWNoICgkaWRzUHJvZHVjdG8gYXMgJGlkUHJvZHVjdG8pIHsgdHJ5IHsgJHByb2R1Y3RvID0gbmV3IFByb2R1Y3QoJGlkUHJvZHVjdG9bJ2lkX3Byb2R1Y3QnXSk7IGlmIChWYWxpZGF0ZTo6aXNMb2FkZWRPYmplY3QoJHByb2R1Y3RvKSAmJiAkcHJvZHVjdG8tPmFjdGl2ZSkgeyBpZiAoJHByb3ZlZWRvckRlc2FjWydhY2Npb25kZXNhY3RpdmFyUHJvZHVjdG9zJ10pIHsgJHByb2R1Y3RvLT5hY3RpdmUgPSBmYWxzZTsgJHByb2R1Y3RvLT5zYXZlKCk7IH0gZWxzZSB7IFN0b2NrQXZhaWxhYmxlOjpzZXRRdWFudGl0eSgkaWRDb21iaW5hY2lvblsnaWRfcHJvZHVjdCddLCAwLCAwKTsgfSB9IH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZXgpIHsgfSB9IH0gfSAkc3FsID0gJ1VQREFURSBgJyAuIF9EQl9QUkVGSVhfIC4gJHRoaXMtPnRhYmxhIC4gJ2xhc3R1cGRhdGVFYW5gIHNldCBwcm9jZXNhZG8gPSAxIEFORCBpZEpvYiA9ICcgLiAoaW50KSAkaWRKb2I7IERCOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlKCRzcWwpOyAkam9iID0gRGI6OmdldEluc3RhbmNlKCktPmdldFJvdygnU0VMRUNUICogRlJPTSBgJyAuIF9EQl9QUkVGSVhfIC4gJHRoaXMtPnRhYmxhIC4gJ2pvYmAgV0hFUkUgaWRKb2IgPSAnIC4gKGludCkgJGlkSm9iKTsgaWYgKCRqb2IpIHsgaWYgKCRqb2JbJ2Rlc2NhcmdhJ10gPT0gMSkgeyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2Rlc2NhcmdhQXJjaGl2b3MvaURlc2NhcmdhZG9yLnBocCc7IHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9jbGFzZXMvZGVzY2FyZ2FBcmNoaXZvcy9EZXNjYXJnYWRvckhUVFAucGhwJzsgJGRlc2NhcmdhZG9yID0gbmV3IGNsYXNlc1xkZXNjYXJnYUFyY2hpdm9zXERlc2NhcmdhZG9ySFRUUCgkam9iWyd1cmwnXSwgX19ESVJfXyAuICcvaW1wb3J0LycsICRqb2JbJ3VzdWFyaW8nXSwgJGpvYlsncGFzcyddLCAkam9iWydkZXNjb21wcmltaXInXSk7IH0gZWxzZWlmICgkam9iWydkZXNjYXJnYSddID09IDIpIHsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9kZXNjYXJnYUFyY2hpdm9zL2lEZXNjYXJnYWRvci5waHAnOyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2Rlc2NhcmdhQXJjaGl2b3MvRGVzY2FyZ2Fkb3JGVFAucGhwJzsgJGRlc2NhcmdhZG9yID0gbmV3IGNsYXNlc1xkZXNjYXJnYUFyY2hpdm9zXERlc2NhcmdhZG9yRlRQKCRqb2JbJ3VybCddLCBfX0RJUl9fIC4gJy9pbXBvcnQvJywgJGpvYlsndXN1YXJpbyddLCAkam9iWydwYXNzJ10sICRqb2JbJ2ZpY2hlcm9EZXNjYXJnYXInXSwgJGpvYlsnZGVzY29tcHJpbWlyJ10pOyB9IGVsc2VpZiAoJGpvYlsnZGVzY2FyZ2EnXSA9PSAzKSB7IHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9jbGFzZXMvZGVzY2FyZ2FBcmNoaXZvcy9pRGVzY2FyZ2Fkb3IucGhwJzsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9kZXNjYXJnYUFyY2hpdm9zL0Rlc2NhcmdhZG9yU0ZUUC5waHAnOyAkZGVzY2FyZ2Fkb3IgPSBuZXcgY2xhc2VzXGRlc2NhcmdhQXJjaGl2b3NcRGVzY2FyZ2Fkb3JTRlRQKCRqb2JbJ3VybCddLCBfX0RJUl9fIC4gJy9pbXBvcnQvJywgJGpvYlsndXN1YXJpbyddLCAkam9iWydwYXNzJ10sICRqb2JbJ2ZpY2hlcm9EZXNjYXJnYXInXSwgJGpvYlsnZGVzY29tcHJpbWlyJ10pOyB9IGVsc2VpZiAoJGpvYlsnZGVzY2FyZ2EnXSA9PSA0KSB7IHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9jbGFzZXMvZGVzY2FyZ2FBcmNoaXZvcy9pRGVzY2FyZ2Fkb3IucGhwJzsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9kZXNjYXJnYUFyY2hpdm9zL0Rlc2NhcmdhZG9yTWFpbC5waHAnOyAkZGVzY2FyZ2Fkb3IgPSBuZXcgY2xhc2VzXGRlc2NhcmdhQXJjaGl2b3NcRGVzY2FyZ2Fkb3JNQUlMKCRqb2JbJ3VybCddLCBfX0RJUl9fIC4gJy9pbXBvcnQvJywgJGpvYlsndXN1YXJpbyddLCAkam9iWydwYXNzJ10sICRqb2JbJ2Zyb20nXSwgJGpvYlsnYXN1bnRvJ10sICRqb2JbJ2ZpY2hlcm9EZXNjYXJnYXInXSwgJGpvYlsnZGVzY29tcHJpbWlyJ10sIGFycmF5KCksICcnLCBhcnJheSgpLCAkam9iWydlbGltaW5hck1haWwnXSk7IH0gZWxzZWlmICgkam9iWydkZXNjYXJnYSddID09IDUpIHsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9kZXNjYXJnYUFyY2hpdm9zL2lEZXNjYXJnYWRvci5waHAnOyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2Rlc2NhcmdhQXJjaGl2b3MvRGVzY2FyZ2Fkb3JNYWlsLnBocCc7ICRkZXNjYXJnYWRvciA9IG5ldyBjbGFzZXNcZGVzY2FyZ2FBcmNoaXZvc1xEZXNjYXJnYWRvck1BSUwoJ3tpbWFwLmdtYWlsLmNvbTo5OTMvaW1hcC9zc2x9SU5CT1gnLCBfX0RJUl9fIC4gJy9pbXBvcnQvJywgJGpvYlsndXN1YXJpbyddLCAkam9iWydwYXNzJ10sICRqb2JbJ2Zyb20nXSwgJGpvYlsnYXN1bnRvJ10sICRqb2JbJ2ZpY2hlcm9EZXNjYXJnYXInXSwgJGpvYlsnZGVzY29tcHJpbWlyJ10sIGFycmF5KCksICcnLCBhcnJheSgpLCAkam9iWydlbGltaW5hck1haWwnXSk7IH0gZWxzZWlmICgkam9iWydkZXNjYXJnYSddID09IDYpIHsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9kZXNjYXJnYUFyY2hpdm9zL2lEZXNjYXJnYWRvci5waHAnOyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2Rlc2NhcmdhQXJjaGl2b3MvRGVzY2FyZ2Fkb3JIVFRQLnBocCc7ICRkZXNjYXJnYWRvciA9IG5ldyBjbGFzZXNcZGVzY2FyZ2FBcmNoaXZvc1xEZXNjYXJnYWRvckhUVFAoJGpvYlsndXJsJ10sIF9fRElSX18gLiAnL2ltcG9ydC8nLCAkam9iWyd1c3VhcmlvJ10sICRqb2JbJ3Bhc3MnXSwgJGpvYlsnZGVzY29tcHJpbWlyJ10pOyB9IGVsc2UgeyAkZGVzY2FyZ2Fkb3IgPSBOVUxMOyB9IGlmICgkZGVzY2FyZ2Fkb3IpIHsgJG5vbWJyZUZpY2hlcm8gPSAkZGVzY2FyZ2Fkb3ItPmRlc2NhcmdhcigpOyBpZiAoJG5vbWJyZUZpY2hlcm8pIHsgRGI6OmdldEluc3RhbmNlKCktPmV4ZWN1dGUoJ0RFTEVURSBGUk9NIGAnIC4gX0RCX1BSRUZJWF8gLiAkdGhpcy0+dGFibGEgLiAndXBkYXRlRWFuYCBXSEVSRSBpZEpvYiA9ICcgLiAoaW50KSAkaWRKb2IpOyBpZiAoKCRqb2JbJ3RpcG9GaWNoZXJvJ10gPT0gMSB8fCAkam9iWyd0aXBvRmljaGVybyddID09IDIpICYmICRqb2JbJ2NhbWJpYXJDb2RpZmljYWNpb24nXSkgeyAkZGF0b3MgPSBmaWxlX2dldF9jb250ZW50cyhfX0RJUl9fIC4gJy9pbXBvcnQvJyAuICRub21icmVGaWNoZXJvKTsgZmlsZV9wdXRfY29udGVudHMoX19ESVJfXyAuICcvaW1wb3J0LycgLiAkbm9tYnJlRmljaGVybywgaWNvbnYoJGpvYlsnY29kaWZpY2FjaW9uT3JpZ2VuJ10sICdVVEYtOCcsICRkYXRvcykpOyB1bnNldCgkZGF0b3MpOyB9IGlmICgkam9iWyd0aXBvRmljaGVybyddID09IDEpIHsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9hY2Nlc29EYXRvcy9pQWNjZXNvRGF0b3MucGhwJzsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9hY2Nlc29EYXRvcy9BY2Nlc29EYXRvc0NTVi5waHAnOyAkc2VwYXJhdG9yID0gc3Vic3RyKCRqb2JbJ3NlcGFyYWRvciddLCAwLCAyKTsgJHNlcGFyYXRvciA9IGV2YWwoInJldHVybiBcIiRzZXBhcmF0b3JcIjsiKTsgJGFjY2VzbyA9IG5ldyBjbGFzZXNcYWNjZXNvRGF0b3NcQWNjZXNvRGF0b3NDU1YoX19ESVJfXyAuICcvaW1wb3J0LycgLiAkbm9tYnJlRmljaGVybywgMCwgKGludCl0cmltKCRqb2JbJ2xpbmVhc1NhbHRhciddKSwgJHNlcGFyYXRvciwgKCRqb2JbJ2RlbGltaXRhZG9yJ10gPyAkam9iWydkZWxpbWl0YWRvciddIDogJyInKSk7IHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9jbGFzZXMvZXh0cmFlckRhdG9zL0V4dHJhY3Rvci5waHAnOyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2V4dHJhZXJEYXRvcy9FeHRyYWN0b3JDU1YucGhwJzsgJGV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3JDU1YoYXJyYXkoJGpvYlsncG9zRWFuJ10sICRqb2JbJ3Bvc0F0cmlidXRvJ10sICRqb2JbJ3Bvc1N0b2NrJ10sICRqb2JbJ3Bvc1ByZWNpbyddLCAkam9iWydwb3NDb3N0ZSddLCAkam9iWydwb3NUaWVuZGEnXSwgJGpvYlsncG9zRWFuVXBkYXRlJ10pKTsgfSBlbHNlaWYgKCRqb2JbJ3RpcG9GaWNoZXJvJ10gPT0gMikgeyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2FjY2Vzb0RhdG9zL2lBY2Nlc29EYXRvcy5waHAnOyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2FjY2Vzb0RhdG9zL0FjY2Vzb0RhdG9zWE1MLnBocCc7ICRhY2Nlc28gPSBuZXcgY2xhc2VzXGFjY2Vzb0RhdG9zXEFjY2Vzb0RhdG9zWE1MKF9fRElSX18gLiAnL2ltcG9ydC8nIC4gJG5vbWJyZUZpY2hlcm8sIDAsIDMyNzY4LCAkam9iWydub2RvWG1sJ10pOyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2V4dHJhZXJEYXRvcy9FeHRyYWN0b3IucGhwJzsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9leHRyYWVyRGF0b3MvRXh0cmFjdG9yWE1MLnBocCc7ICRleHRyYWN0b3IgPSBuZXcgRXh0cmFjdG9yWE1MKGFycmF5KCRqb2JbJ3Bvc0VhbiddLCAkam9iWydwb3NBdHJpYnV0byddLCAkam9iWydwb3NTdG9jayddLCAkam9iWydwb3NQcmVjaW8nXSwgJGpvYlsncG9zQ29zdGUnXSwgJGpvYlsncG9zVGllbmRhJ10sICRqb2JbJ3Bvc0VhblVwZGF0ZSddKSk7IH0gZWxzZWlmICgkam9iWyd0aXBvRmljaGVybyddID09IDMpIHsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9hY2Nlc29EYXRvcy9pQWNjZXNvRGF0b3MucGhwJzsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9hY2Nlc29EYXRvcy9BY2Nlc29EYXRvc0V4Y2VsLnBocCc7ICRhY2Nlc28gPSBuZXcgY2xhc2VzXGFjY2Vzb0RhdG9zXEFjY2Vzb0RhdG9zRXhjZWwoX19ESVJfXyAuICcvaW1wb3J0LycgLiAkbm9tYnJlRmljaGVybywgMCwgMzI3NjgsICRqb2JbJ25vZG9YbWwnXSwgKGludCl0cmltKCRqb2JbJ2xpbmVhc1NhbHRhciddKSk7IHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9jbGFzZXMvZXh0cmFlckRhdG9zL0V4dHJhY3Rvci5waHAnOyByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvY2xhc2VzL2V4dHJhZXJEYXRvcy9FeHRyYWN0b3JDU1YucGhwJzsgJGV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3JDU1YoYXJyYXkoJGpvYlsncG9zRWFuJ10sICRqb2JbJ3Bvc0F0cmlidXRvJ10sICRqb2JbJ3Bvc1N0b2NrJ10sICRqb2JbJ3Bvc1ByZWNpbyddLCAkam9iWydwb3NDb3N0ZSddLCAkam9iWydwb3NUaWVuZGEnXSwgJGpvYlsncG9zRWFuVXBkYXRlJ10pKTsgfSBlbHNlIHsgJGFjY2VzbyA9IE5VTEw7IH0gaWYgKCRhY2Nlc28pIHsgdHJ5IHsgcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NsYXNlcy9JbnNlcnRMb3Rlcy5waHAnOyAkYmF0Y2hTaXplID0gKGludCkgQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdCQVRDSF9TSVpFJyk7IGlmICghJGJhdGNoU2l6ZSkgeyAkYmF0Y2hTaXplID0gMTAwMDsgfSAkaW5zZXJ0ID0gbmV3IEluc2VydExvdGVzKCRiYXRjaFNpemUsIGFycmF5KCdpZEpvYicsICdlYW4nLCAnaWRBdHJpYnV0bycsICdzdG9jaycsICdwcmVjaW8nLCAnY29zdGUnLCAndGllbmRhJywgJ2VhblVwZGF0ZScsICdwcm9jZXNhZG8nLCAnZGF0b3MnKSwgX0RCX1BSRUZJWF8gLiAkdGhpcy0+dGFibGEgLiAndXBkYXRlRWFuJyk7IHdoaWxlICgkZmlsYSA9ICRhY2Nlc28tPm9idGVuZXJGaWxhKCkpIHsgJGZpbGFUZW1wID0gJGV4dHJhY3Rvci0+ZXh0cmFlcigkZmlsYSk7IGFycmF5X3Vuc2hpZnQoJGZpbGFUZW1wLCAkaWRKb2IpOyAkZmlsYVRlbXBbXSA9ICh0cmltKCRmaWxhVGVtcFsxXSkgPyAwIDogMSk7ICRmaWxhVGVtcFtdID0gc2VyaWFsaXplKCRmaWxhKTsgJGluc2VydC0+YWRkRmlsYSgkZmlsYVRlbXApOyB9ICRpbnNlcnQtPmZpbmFsaXphcigpOyAkdGhpcy0+X2h0bWwgLj0gJHRoaXMtPmRpc3BsYXlDb25maXJtYXRpb24oJHRoaXMtPmwoJ1ByZXByb2Nlc2FkbyBDb3JyZWN0bycpKTsgJGxvZy0+YWRkTG9nKCR0aGlzLT5sKCdQcmVwcm9jZXNhZG8gQ29ycmVjdG8nKSwgMSwgMCwgYXJyYXkoJ2xvZycpKTsgJGRhdGV0aW1lID0gZGF0ZSgnWS1tLWQgSDppOnMnKTsgJHNxbCA9ICJJTlNFUlQgSU5UTyBgIiAuIF9EQl9QUkVGSVhfIC4gJHRoaXMtPnRhYmxhIC4gImxhc3R1cGRhdGVFYW5gIChkZXNjYXJnYSwgaWRKb2IpIFZBTFVFUyAoJyRkYXRldGltZScsICRpZEpvYikiOyBEYjo6Z2V0SW5zdGFuY2UoKS0+ZXhlY3V0ZSgkc3FsKTsgfSBjYXRjaCAoRXhjZXB0aW9uICRleCkgeyBlY2hvICc8cHJlPic7IGVjaG8gJGV4OyBlY2hvICc8L3ByZT4nOyAkbG9nLT5hZGRMb2coJGV4LT5nZXRNZXNzYWdlKCksIDMsICRleC0+Z2V0Q29kZSgpLCBhcnJheSgnbG9nJyksICRleCk7IH0gfSBlbHNlIHsgJHRoaXMtPl9odG1sIC49ICR0aGlzLT5kaXNwbGF5RXJyb3IoJHRoaXMtPmwoJ1RpcG8gZGUgYXJjaGl2byBlcnJvbmVvOicpIC4gJyAnIC4gJGpvYlsndGlwb0ZpY2hlcm8nXSk7ICRsb2ctPmFkZExvZygkdGhpcy0+bCgnVGlwbyBkZSBhcmNoaXZvIGVycm9uZW86JykgLiAnICcgLiAkam9iWyd0aXBvRmljaGVybyddLCAzLCAxLCBhcnJheSgnbG9nJykpOyB9ICRhY2Nlc28tPmNlcnJhckFyY2hpdm8oKTsgdW5saW5rKF9fRElSX18gLiAnL2ltcG9ydC8nIC4gJG5vbWJyZUZpY2hlcm8pOyB9IGVsc2UgeyAkdGhpcy0+X2h0bWwgLj0gJHRoaXMtPmRpc3BsYXlFcnJvcigkdGhpcy0+bCgnTm8gc2UgcHVkbyBkZXNjYXJnYXIgZWwgYXJjaGl2bycpKTsgJGxvZy0+YWRkTG9nKCR0aGlzLT5sKCdObyBzZSBwdWRvIGRlc2NhcmdhciBlbCBhcmNoaXZvJyksIDMsIDIsIGFycmF5KCdsb2cnKSk7IH0gfSBlbHNlIHsgJHRoaXMtPl9odG1sIC49ICR0aGlzLT5kaXNwbGF5RXJyb3IoJHRoaXMtPmwoJ1RpcG8gZGUgZGVzY2FyZ2EgZXJyb25lbzonKSAuICcgJyAuICRqb2JbJ2Rlc2NhcmdhJ10pOyAkbG9nLT5hZGRMb2coJHRoaXMtPmwoJ1RpcG8gZGUgZGVzY2FyZ2EgZXJyb25lbzonKSAuICcgJyAuICRqb2JbJ2Rlc2NhcmdhJ10sIDMsIDMsIGFycmF5KCdsb2cnKSk7IH0gfSBlbHNlIHsgJHRoaXMtPl9odG1sIC49ICR0aGlzLT5kaXNwbGF5RXJyb3IoJHRoaXMtPmwoJ05vIGV4aXN0ZSBlbCB0cmFiYWpvJykgLiAnICcgLiAkaWRKb2IpOyAkbG9nLT5hZGRMb2coJHRoaXMtPmwoJ05vIGV4aXN0ZSBlbCB0cmFiYWpvJykgLiAnICcgLiAkaWRKb2IsIDMsIDQsIGFycmF5KCdsb2cnKSk7IH0gfSByZXR1cm4gJHRoaXMtPl9odG1sOyB9IHByaXZhdGUgZnVuY3Rpb24gX21vc3RyYXJMaWNlbmNpYSgpIHsgJGh0bWwgPSAnJzsgJGxpY2VuY2lhID0gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJHRoaXMtPnN1ZmlqbyAuICdMSUNFTkNJQScpOyAkaHRtbCAuPSAnPGZpZWxkc2V0PjxsZWdlbmQ+JyAuICR0aGlzLT5sKCdHZXN0aW9uIExpY2VuY2lhJykgLiAnPC9sZWdlbmQ+JzsgJGh0bWwgLj0gJzxmb3JtIGFjdGlvbj0iJyAuIFRvb2xzOjpzYWZlT3V0cHV0KCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICciIG1ldGhvZD0icG9zdCI+JzsgJGh0bWwgLj0gJzxwIGNsYXNzPSJ3YXJuIj4nIC4gJHRoaXMtPmwoJ0xhIGxpY2VuY2lhIGVzIG9ibGlnYXRvcmlhIHBhcmEgZWwgY29ycmVjdG8gZnVuY2lvbmFtaWVudG8gZGVsIG1vZHVsbycpOyAkaHRtbCAuPSAnPGJyIC8+JzsgJGh0bWwgLj0gJHRoaXMtPmwoJ0xhIGxpY2VuY2lhIHNlIGRlYmVyaWEgZ2VuZXJhciBwYXJhIGVsIGRvbWluaW86ICcpIC4gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoJ1BTX1NIT1BfRE9NQUlOJykgLiAnPC9wPic7ICRodG1sIC49ICc8dWwgY2xhc3M9Imxpc3RhTGljZW5jaWEiPic7ICRodG1sIC49ICcgPGxpPjxsYWJlbD4nIC4gJHRoaXMtPmwoJ051bWVybyBkZSBMaWNlbmNpYScpIC4gJzwvbGFiZWw+JzsgJGh0bWwgLj0gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJsaWNlbmNpYSIgdmFsdWU9IicgLiAkbGljZW5jaWEgLiAnIiAvPjwvbGk+PC91bD4nOyAkaHRtbCAuPSAnPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0TGljZW5jaWEiIHZhbHVlPSInIC4gJHRoaXMtPmwoJ0d1YXJkYXInKSAuICciIC8+JzsgJGh0bWwgLj0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9Imdlc3Rpb25MaWNlbmNpYSI+JzsgJGh0bWwgLj0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImlkX3RhYiIgdmFsdWU9IjMiIC8+JzsgJGh0bWwgLj0gJzwvZm9ybT4nOyAkaHRtbCAuPSAnPC9maWVsZHNldD48YnIgLz4nOyByZXR1cm4gJGh0bWw7IH0gcHVibGljIGZ1bmN0aW9uIGZvcm11bGEoJGNvc3RlLCAkcHJlY2lvLCAkZm9ybXVsYSkgeyBpZiAoc3RyaXBvcygkZm9ybXVsYSwgJ0MnKSAhPT0gRkFMU0UgJiYgKCRjb3N0ZSA9PSAwIHx8ICRjb3N0ZSA9PSAtMSkpIHsgcmV0dXJuIGZhbHNlOyB9IGlmIChzdHJpcG9zKCRmb3JtdWxhLCAnUCcpICE9PSBGQUxTRSAmJiAoJHByZWNpbyA9PSAwIHx8ICRwcmVjaW8gPT0gLTEpKSB7IHJldHVybiBmYWxzZTsgfSAkZm9ybXVsYSA9IHN0cl9pcmVwbGFjZSgnQycsICRjb3N0ZSwgJGZvcm11bGEpOyAkZm9ybXVsYSA9IHN0cl9pcmVwbGFjZSgnUCcsICRwcmVjaW8sICRmb3JtdWxhKTsgJGZvcm11bGEgPSBzdHJfcmVwbGFjZSgnLCcsICcuJywgJGZvcm11bGEpOyByZXR1cm4gZXZhbCgicmV0dXJuICRmb3JtdWxhOyIpOyB9IHB1YmxpYyBmdW5jdGlvbiBjcmVhdGVIZWxwSGVhZGVyKCkgeyAkaHRtbCA9ICc8ZGl2IGNsYXNzPSJtb2R1bGUtcHJlaGVhZGVyIj4nOyAkaHRtbCAuPSAkdGhpcy0+Z2V0RGF0b3NQdWJsaSgnaGVhZGVyJyk7ICRodG1sIC49ICc8L2Rpdj4nOyAkaHRtbCAuPSAnPGRpdiBjbGFzcz0ibW9kdWxlLWhlYWRlciI+JzsgJGh0bWwgLj0gJzxkaXYgY2xhc3M9Im1vZHVsZS10aXRsZS1jb250YWluZXIiPic7ICRodG1sIC49ICc8aDIgY2xhc3M9Im1vZHVsZS10aXRsZSI+JyAuICR0aGlzLT5kaXNwbGF5TmFtZSAuICc8c21hbGw+IGJ5IEluZm9ybWF4PC9zbWFsbD48L2gyPic7ICRodG1sIC49ICc8aDMgY2xhc3M9Im1vZHVsZS12ZXJzaW9uIj4nIC4gJHRoaXMtPmwoJ1ZlcnNpb246ICcpIC4gJHRoaXMtPnZlcnNpb24gLiAnPC9oMz4nOyAkaHRtbCAuPSAnPC9kaXY+JzsgJGh0bWwgLj0gJzxkaXYgY2xhc3M9Im1vZHVsZS10b29sYmFyIj4nOyAkaHRtbCAuPSAnPHVsIGNsYXNzPSJtb2R1bGUtbmF2IiA+JzsgJGh0bWwgLj0gJzxsaT4nOyAkaHRtbCAuPSAnPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXguZXMiPic7ICRodG1sIC49ICc8aW1nIHNyYz0iLi4vbW9kdWxlcy8nIC4gJHRoaXMtPm5hbWUgLiAnL2ltZy9pbmZvcm1heC5wbmciPic7ICRodG1sIC49ICc8ZGl2PicgLiAkdGhpcy0+bCgnSW5mb3JtYXgnKSAuICc8L2Rpdj4nOyAkaHRtbCAuPSAnPC9hPic7ICRodG1sIC49ICc8L2xpPic7ICRodG1sIC49ICc8bGk+JzsgJGh0bWwgLj0gJzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vdGlja2V0cy5pbmZvcm1heC5lcy9vcGVuLnBocD90b3BpY0lkPTEwIj4nOyAkaHRtbCAuPSAnPGltZyBzcmM9Ii4uL21vZHVsZXMvJyAuICR0aGlzLT5uYW1lIC4gJy9pbWcvYWJyaXItdGlja2V0LnBuZyI+JzsgJGh0bWwgLj0gJzxkaXY+Jyu 
ICR0aGlzLT5sKCdBc2lzdGVuY2lhJykgLiAnPC9kaXY+JzsgJGh0bWwgLj0gJzwvYT4nOyAkaHRtbCAuPSAnPC9saT4nOyAkaHRtbCAuPSAnPGxpPic7ICRodG1sIC49ICc8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL2RvY3MuaW5mb3JtYXguZXMvP3A9JyAuICR0aGlzLT5pZE1hbnVhbCAuICciPic7ICRodG1sIC49ICc8aW1nIHNyYz0iLi4vbW9kdWxlcy8nIC4gJHRoaXMtPm5hbWUgLiAnL2ltZy9pci1hLW1hbnVhbGVzLnBuZyI+JzsgJGh0bWwgLj0gJzxkaXY+JyAuICR0aGlzLT5sKCdNYW51YWxlcycpIC4gJzwvZGl2Pic7ICRodG1sIC49ICc8L2E+JzsgJGh0bWwgLj0gJzwvbGk+JzsgJGh0bWwgLj0gJzwvdWw+JzsgJGh0bWwgLj0gJzwvZGl2Pic7ICRodG1sIC49ICc8L2Rpdj4nOyByZXR1cm4gJGh0bWw7IH0gcHVibGljIGZ1bmN0aW9uIGdldE1vZHVsZUZvb3RlcigpIHsgJHVybCA9IENvbmZpZ3VyYXRpb246OmdldEdsb2JhbFZhbHVlKHNlbGY6OnByZWZpam8gLiAnVVJMX0ZBTERPTicpOyAkaHRtbCA9ICc8ZGl2IGNsYXNzPSJtb2R1bGUtbmV3c2xldHRlciI+JzsgJGh0bWwgLj0gJzxmb3JtIGFjdGlvbj0iaHR0cDovL3d3dy5pbmZvcm1heC5lcy9zdWJzY3JpYmUvIiBtZXRob2Q9InBvc3QiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY2Npb24iIHZhbHVlPSJuZXdzbGV0dGVyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZFRhYiIgdmFsdWU9IjEiIC8+JzsgJGh0bWwgLj0gJzxwPicgLiAkdGhpcy0+bCgnU2kgZGVzZWFzIGVudGVyYXJ0ZSBkZSB0b2RvcyBsb3MgY2FtYmlvcyBlbiBudWVzdHJvcyBtb2R1bG9zLCBudWV2b3MgTW9kdWxvcywgY29tbyBmdW5jaW9uYSBQcmVzdGFzaG9wLCBhcHVudGF0ZSBhIG51ZXN0cmFzIG5ld3MnKSAuICc8L3A+JzsgJGh0bWwgLj0gJyA8cD4nOyAkaHRtbCAuPSAnIDxsYWJlbD4nIC4gJHRoaXMtPmwoJ2VtYWlsJykgLiAnPC9sYWJlbD4nOyAkaHRtbCAuPSAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImVtYWlsIiB2YWx1ZT0iIiAvPic7ICRodG1sIC49ICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJzY3JpYmUiIHZhbHVlPSInIC4gJHRoaXMtPmwoJ0d1YXJkYXInKSAuICciIC8+JzsgJGh0bWwgLj0gJzwvcD4nOyAkaHRtbCAuPSAnPC9mb3JtPjxiciAvPic7ICRodG1sIC49ICc8L2Rpdj4nOyAkaHRtbCAuPSAnPGRpdiBjbGFzcz0ibW9kdWxlLWZvb3RlciI+JzsgJGh0bWwgLj0gJzxkaXYgY2xhc3M9Im1vZHVsZS1mb290ZXItbGVmdCI+JzsgJGh0bWwgLj0gJHRoaXMtPmdldERhdG9zUHVibGkoJ2Zvb3RlcmEnKTsgJGh0bWwgLj0gJzwvZGl2Pic7ICRodG1sIC49ICc8ZGl2IGNsYXNzPSJtb2R1bGUtZm9vdGVyLXJpZ2h0Ij4nOyAkaHRtbCAuPSAkdGhpcy0+Z2V0RGF0b3NQdWJsaSgnZm9vdGVyYicpOyAkaHRtbCAuPSAnPC9kaXY+JzsgJGh0bWwgLj0gJzwvZGl2Pic7IHJldHVybiAkaHRtbDsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0RGF0b3NQdWJsaSgkdGlwbykgeyAkZGF0b3NDb21wbGV0b3MgPSBDb25maWd1cmF0aW9uOjpnZXRHbG9iYWxWYWx1ZShzZWxmOjpwcmVmaWpvIC4gJ1RYVF9GSUxFJyk7ICRodG1sID0gJyc7IGlmICgkZGF0b3NDb21wbGV0b3MpIHsgJGFwZXJ0dXJhQSA9ICcnOyAkY2llcnJlQSA9ICcnOyAkZGF0b3NDb21wbGV0b3MgPSBAdW5zZXJpYWxpemUoJGRhdG9zQ29tcGxldG9zKTsgaWYgKCFpc19hcnJheSgkZGF0b3NDb21wbGV0b3MpKSB7IHJldHVybiAnJzsgfSBzaHVmZmxlKCRkYXRvc0NvbXBsZXRvcyk7IGZvcmVhY2ggKCRkYXRvc0NvbXBsZXRvcyBBUyAkZGF0b0VsZW1lbnRvKSB7IGlmICgkZGF0b0VsZW1lbnRvWzFdID09ICR0aXBvKSB7IGlmICh0cmltKCRkYXRvRWxlbWVudG9bMl0pICE9ICcnKSB7ICRhcGVydHVyYUEgLj0gJzxhIGhyZWY9IicgLiAkZGF0b0VsZW1lbnRvWzJdIC4gJyIgdGFyZ2V0PSJfYmxhbmsiPic7ICRjaWVycmVBID0gJzwvYT4nOyB9IGlmICh0cmltKCRkYXRvRWxlbWVudG9bMF0pICE9ICcnKSB7ICRodG1sID0gJGFwZXJ0dXJhQSAuICc8aW1nIHNyYz0iJyAuIENvbmZpZ3VyYXRpb246OmdldEdsb2JhbFZhbHVlKHNlbGY6OnByZWZpam8gLiAnVVJMX1RYVCcpIC4gJy9pbWcvJyAuICRkYXRvRWxlbWVudG9bMF0gLiAnIiAvPicgLiAkY2llcnJlQTsgfSByZXR1cm4gJGh0bWw7IH0gfSB9IHJldHVybiAkaHRtbDsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0VHh0RmlsZXMoKSB7IGlmIChDb25maWd1cmF0aW9uOjpnZXRHbG9iYWxWYWx1ZShzZWxmOjpwcmVmaWpvIC4gJ0RFU0NBUkdBX0FSQ0hJVk8nKSA8IDEwMDAwKSB7IENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKHNlbGY6OnByZWZpam8gLiAnREVTQ0FSR0FfQVJDSElWTycsIENvbmZpZ3VyYXRpb246OmdldEdsb2JhbFZhbHVlKHNlbGY6OnByZWZpam8gLiAnREVTQ0FSR0FfQVJDSElWTycpICsgMSk7IHJldHVybiBmYWxzZTsgfSAkdXJsID0gQ29uZmlndXJhdGlvbjo6Z2V0R2xvYmFsVmFsdWUoc2VsZjo6cHJlZmlqbyAuICdVUkxfVFhUJykgLiAnLycgLiBDb25maWd1cmF0aW9uOjpnZXRHbG9iYWxWYWx1ZShzZWxmOjpwcmVmaWpvIC4gJ1RJUE8nKSAuICcudHh0JzsgJGJhc2VkaXJfYWN0aXZlID0gaW5pX2dldCgnb3Blbl9iYXNlZGlyJyk7ICRjaCA9IGN1cmxfaW5pdCgkdXJsKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCBUUlVFKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0JJTkFSWVRSQU5TRkVSLCBUUlVFKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAwKTsgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsIDM2MCk7IGlmICghJGJhc2VkaXJfYWN0aXZlKSB7IGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgVFJVRSk7IH0gJGRhdG9zID0gY3VybF9leGVjKCRjaCk7ICRpbmZvQ3VybCA9IGN1cmxfZ2V0aW5mbygkY2gpOyBpZiAoIWlzc2V0KCRpbmZvQ3VybFsnaHR0cF9jb2RlJ10pIHx8ICRpbmZvQ3VybFsnaHR0cF9jb2RlJ10gIT0gMjAwKSB7IHJldHVybiBmYWxzZTsgfSBDb25maWd1cmF0aW9uOjp1cGRhdGVHbG9iYWxWYWx1ZShzZWxmOjpwcmVmaWpvIC4gJ0RFU0NBUkdBX0FSQ0hJVk8nLCAwKTsgcmV0dXJuIENvbmZpZ3VyYXRpb246OnVwZGF0ZUdsb2JhbFZhbHVlKHNlbGY6OnByZWZpam8gLiAnVFhUX0ZJTEUnLCAkdGhpcy0+cmVhZENzdigkZGF0b3MpKTsgfSBwcml2YXRlIGZ1bmN0aW9uIHJlYWRDc3YoJHN0cmluZykgeyAkc3RyaW5nID0gdHJpbSgkc3RyaW5nKTsgJHRlbXAgPSBleHBsb2RlKCJcbiIsICRzdHJpbmcpOyAkcmVzcHVlc3RhID0gYXJyYXkoKTsgZm9yZWFjaCAoJHRlbXAgQVMgJGVsZW1lbnRvKSB7ICRlbGVtZW50b0ludGVybm8gPSBhcnJheSgpOyAkZWxlbWVudG9JbnRlcm5vID0gZXhwbG9kZSgiOyIsICRlbGVtZW50byk7ICRyZXNwdWVzdGFbXSA9ICRlbGVtZW50b0ludGVybm87IH0gcmV0dXJuIHNlcmlhbGl6ZSgkcmVzcHVlc3RhKTsgfSBwdWJsaWMgZnVuY3Rpb24gaG9va0FjdGlvblVwZGF0ZVF1YW50aXR5KCRwYXJhbXMpIHsgaWYgKHNlbGY6OiRjYW1iaWFkb1Bvck1vZHVsbykgeyAkb3JpZ2VuID0gMTsgfSBlbHNlIHsgJG9yaWdlbiA9IDI7IH0gJHNxbCA9ICdSRVBMQUNFIElOVE8gYCcgLiBfREJfUFJFRklYXyAuIHNlbGY6OnByZWZpam8gLiAic3RvY2tVcGRhdGVgICAiIC4gIihpZFByb2R1Y3RvLGlkQXRyaWJ1dG8sc3RvY2ssb3JpZ2VuKSIgLiAiIFZBTFVFUyIgLiAiICAoIiAuIChpbnQpICRwYXJhbXNbJ2lkX3Byb2R1Y3QnXSAuICcsJyAuIChpbnQpICRwYXJhbXNbJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ10gLiAnLCAnIC4gKGludCkgJHBhcmFtc1sncXVhbnRpdHknXSAuICcsICInIC4gdHJpbSgkb3JpZ2VuKSAuICciKSc7IERiOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlKCRzcWwpOyB9IHB1YmxpYyBmdW5jdGlvbiBob29rRGlzcGxheUFkbWluUHJvZHVjdHNFeHRyYSgkcGFyYW1zKSB7ICRpZFByb2R1Y3RvID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZF9wcm9kdWN0Jyk7ICRwcm9kdWN0byA9IG5ldyBQcm9kdWN0KCRpZFByb2R1Y3RvKTsgJGh0bWwgPSAnPHRhYmxlIGNsYXNzPSJ0YWJsZSI+PHRoZWFkPjx0cj48dGg+JyAuICR0aGlzLT5sKCdBcnRpY3VsbycpIC4gJzwvdGg+PHRoPicgLiAkdGhpcy0+bCgnU3RvY2sgbG9jYWwnKSAuICc8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JzsgJGNvbWJpbmFjaW9uZXMgPSAkcHJvZHVjdG8tPmdldEF0dHJpYnV0ZXNSZXN1bWUoJHRoaXMtPmlkTGFuZyk7IGlmICgkY29tYmluYWNpb25lcykgeyBmb3JlYWNoICgkY29tYmluYWNpb25lcyBhcyAkY29tYmluYWNpb24pIHsgJHN0b2NrVGVtcCA9IERiOjpnZXRJbnN0YW5jZSgpLT5nZXRWYWx1ZSgnU0VMRUNUIHN0b2NrIEZST00gYCcgLiBfREJfUFJFRklYXyAuIHNlbGY6OnByZWZpam8gLiAic3RvY2tVcGRhdGVgIFdIRVJFIG9yaWdlbiA9IDIgYW5kIGlkUHJvZHVjdG8gPSAnJGlkUHJvZHVjdG8nIEFORCBpZEF0cmlidXRvID0gJ3skY29tYmluYWNpb25bJ2lkX3Byb2R1Y3RfYXR0cmlidXRlJ119JyIpOyAkc3RvY2sgPSAoaXNfbnVtZXJpYygkc3RvY2tUZW1wKSA/ICRzdG9ja1RlbXAgOiAkdGhpcy0+bCgnU2luIGRhdG9zJykpOyAkaHRtbCAuPSAiPHRyPjx0ZD4oeyRjb21iaW5hY2lvblsnaWRfcHJvZHVjdF9hdHRyaWJ1dGUnXX0pIHskY29tYmluYWNpb25bJ2F0dHJpYnV0ZV9kZXNpZ25hdGlvbiddfTwvdGQ+PHRkPiRzdG9jazwvdGQ+PC90cj4iOyB9IH0gZWxzZSB7ICRzdG9ja1RlbXAgPSBEYjo6Z2V0SW5zdGFuY2UoKS0+Z2V0VmFsdWUoJ1NFTEVDVCBzdG9jayBGUk9NIGAnIC4gX0RCX1BSRUZJWF8gLiBzZWxmOjpwcmVmaWpvIC4gInN0b2NrVXBkYXRlYCBXSEVSRSBvcmlnZW4gPSAyIGFuZCBpZFByb2R1Y3RvID0gJyRpZFByb2R1Y3RvJyBBTkQgaWRBdHJpYnV0byA9IDAiKTsgJHN0b2NrID0gKGlzX251bWVyaWMoJHN0b2NrVGVtcCkgPyAkc3RvY2tUZW1wIDogJHRoaXMtPmwoJ1NpbiBkYXRvcycpKTsgJGh0bWwgLj0gIjx0cj48dGQ+eyRwcm9kdWN0by0+bmFtZVskdGhpcy0+aWRMYW5nXX08L3RkPjx0ZD4kc3RvY2s8L3RkPjwvdHI+IjsgfSAkaHRtbCAuPSAnPC90Ym9keT48L3RhYmxlPic7ICR0aGlzLT5zbWFydHktPmFzc2lnbihhcnJheSgnaHRtbCcgPT4gJGh0bWwpKTsgcmV0dXJuICR0aGlzLT5kaXNwbGF5KCR0aGlzLT5uYW1lLCAndmlld3MvYWRtaW4vcHJvZHVjdFRhYi50cGwnKTsgfSB9"));

Function Calls

base64_decode 1

Variables

None

Stats

MD5 9331f3fd22c7c63d5db0b2ae372c5b02
Eval Count 1
Decode Time 240 ms