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 /* MD5: e622d1e99f543321668714e109a5c882 */ eval(base64_decode('CiBuYW1lc3BhY2UgVG..

Decoded Output download


 namespace Template\easyTemplate360; use Illuminate\Support\Collection; use JTL\Cache\JTLCacheInterface; use JTL\Catalog\Category\Kategorie; use JTL\Catalog\Category\KategorieListe; use JTL\Catalog\Product\Artikel; use JTL\Catalog\Product\Preise; use JTL\CheckBox; use JTL\DB\DbInterface; use JTL\Filter\Config; use JTL\Filter\ProductFilter; use JTL\Helpers\Category; use JTL\Helpers\Manufacturer; use JTL\Helpers\Seo; use JTL\Helpers\Tax; use JTL\Link\Link; use JTL\Link\LinkGroupInterface; use JTL\Media\Image; use JTL\Media\Image\Product; use JTL\Session\Frontend; use JTL\Shop; use JTL\Staat; class NovaPlugins { private $db; private $cache; private $shopIsAtLeast52; public function __construct(DbInterface $db, JTLCacheInterface $cache) { $this->db = $db; $this->cache = $cache; $this->shopIsAtLeast52 = version_compare(\APPLICATION_VERSION, '5.2.0-beta', '>='); } public function getProductList($params, $smarty) { $limit = (int)($params['nLimit'] ?? 10); $sort = (int)($params['nSortierung'] ?? 0); $assignTo = (isset($params['cAssign']) && \strlen($params['cAssign']) > 0) ? $params['cAssign'] : 'oCustomArtikel_arr'; $characteristicFilters = isset($params['cMerkmalFilter']) ? ProductFilter::initCharacteristicFilter(\explode(';', $params['cMerkmalFilter'])) : []; $searchFilters = isset($params['cSuchFilter']) ? ProductFilter::initSearchFilter(\explode(';', $params['cSuchFilter'])) : []; $bReturn = isset($params['bReturn']) && $params['bReturn']; $params = [ 'kKategorie' => $params['kKategorie'] ?? null, 'kHersteller' => $params['kHersteller'] ?? null, 'kArtikel' => $params['kArtikel'] ?? null, 'kVariKindArtikel' => $params['kVariKindArtikel'] ?? null, 'kSeite' => $params['kSeite'] ?? null, 'kSuchanfrage' => $params['kSuchanfrage'] ?? null, 'kMerkmalWert' => $params['kMerkmalWert'] ?? null, 'kSuchspecial' => $params['kSuchspecial'] ?? null, 'kKategorieFilter' => $params['kKategorieFilter'] ?? null, 'kHerstellerFilter' => $params['kHerstellerFilter'] ?? null, 'nBewertungSterneFilter' => $params['nBewertungSterneFilter'] ?? null, 'cPreisspannenFilter' => $params['cPreisspannenFilter'] ?? '', 'kSuchspecialFilter' => $params['kSuchspecialFilter'] ?? null, 'nSortierung' => $sort, 'MerkmalFilter_arr' => $characteristicFilters, 'SuchFilter_arr' => $searchFilters, 'nArtikelProSeite' => $params['nArtikelProSeite'] ?? null, 'cSuche' => $params['cSuche'] ?? null, 'seite' => $params['seite'] ?? null ]; if ($params['kArtikel'] !== null) { $products = []; if (!\is_array($params['kArtikel'])) { $params['kArtikel'] = [$params['kArtikel']]; } foreach ($params['kArtikel'] as $productID) { $product = new Artikel(); $products[] = $product->fuelleArtikel($productID, Artikel::getDefaultOptions()); } } else { $products = (new ProductFilter( Config::getDefault(), $this->db, $this->cache )) ->initStates($params) ->generateSearchResults(null, true, $limit) ->getProducts() ->all(); } $smarty->assign($assignTo, $products); if ($bReturn) { return $products; } } public function getStaticRoute($params, $smarty) { if (isset($params['id'])) { $full = !isset($params['full']) || $params['full'] === true; $secure = isset($params['secure']) && $params['secure'] === true; $url = Shop::Container()->getLinkService()->getStaticRoute($params['id'], $full, $secure); $qp = isset($params['params']) ? (array)$params['params'] : []; if (\count($qp) > 0) { $url .= (\parse_url($url, \PHP_URL_QUERY) ? '&' : '?') . \http_build_query($qp, '', '&'); } if (isset($params['assign'])) { $smarty->assign($params['assign'], $url); } else { return $url; } } return false; } public function getManufacturers($params, $smarty) { $manufacturers = Manufacturer::getInstance()->getManufacturers(); if (isset($params['assign'])) { $smarty->assign($params['assign'], $manufacturers); return; } return $manufacturers; } public function getBoxesByPosition($params, $smarty) { if (isset($params['position'])) { $data = Shop::Container()->getBoxService()->boxes; $boxes = $data[$params['position']] ?? []; if (isset($params['assign'])) { $smarty->assign($params['assign'], $boxes); } else { return $boxes; } } } public function getCategoryArray($params, $smarty) { $id = isset($params['categoryId']) ? (int)$params['categoryId'] : 0; if ($id === 0) { $categories = Category::getInstance(); $list = $categories->combinedGetAll(); } else { $categories = new KategorieListe(); $list = $categories->getAllCategoriesOnLevel($id); } if (isset($params['categoryBoxNumber']) && (int)$params['categoryBoxNumber'] > 0) { $list2 = []; foreach ($list as $key => $item) { if ((!$this->shopIsAtLeast52 && isset($item->categoryFunctionAttributes[\KAT_ATTRIBUT_KATEGORIEBOX]) && $item->categoryFunctionAttributes[\KAT_ATTRIBUT_KATEGORIEBOX] == $params['categoryBoxNumber']) || ($this->shopIsAtLeast52 && $item->getCategoryFunctionAttribute(\KAT_ATTRIBUT_KATEGORIEBOX) == $params['categoryBoxNumber'])) { $list2[$key] = $item; } } $list = $list2; } if (isset($params['assign'])) { $smarty->assign($params['assign'], $list); return; } return $list; } public function getCategoryParents($params, $smarty) { $id = isset($params['categoryId']) ? (int)$params['categoryId'] : 0; $categories = new KategorieListe(); $list = $categories->getOpenCategories(new Kategorie($id)); rray_shift($list); $list = rray_reverse($list); if (isset($params['assign'])) { $smarty->assign($params['assign'], $list); return; } return $list; } public function getImgTag($params, $smarty): string { if (empty($params['src'])) { return ''; } $size = $this->getImageSize($params['src']); $url = $params['src']; $id = isset($params['id']) ? ' id="' . $params['id'] . '"' : ''; $alt = isset($params['alt']) ? ' alt="' . $this->truncate($params['alt'], 75) . '"' : ''; $title = isset($params['title']) ? ' title="' . $this->truncate($params['title'], 75) . '"' : ''; $class = isset($params['class']) ? ' class="' . $this->truncate($params['class'], 75) . '"' : ''; if (\strpos($url, 'http') !== 0) { $url = Shop::getImageBaseURL() . \ltrim($url, '/'); } if ($size !== null && $size->size->width > 0 && $size->size->height > 0) { return '<img src="' . $url . '" width="' . $size->size->width . '" height="' . $size->size->height . '"' . $id . $alt . $title . $class . ' />'; } return '<img src="' . $url . '"' . $id . $alt . $title . $class . ' />'; } public function hasBoxes($params, $smarty): void { $boxData = $smarty->getTemplateVars('boxes'); $smarty->assign($params['assign'], !empty($boxData[$params['position']])); } public function truncate($text, $length) { if (\mb_strlen($text) > $length) { $text = \mb_substr($text, 0, $length); $text = \mb_substr($text, 0, \mb_strrpos($text, ' ')); $text .= '...'; } return $text; } private function getLocalizedPriceLegacy($params, $smarty) { $surcharge = new \stdClass(); $surcharge->cAufpreisLocalized = ''; $surcharge->cPreisInklAufpreis = ''; if ((float)$params['fAufpreisNetto'] != 0) { $fAufpreisNetto = (float)$params['fAufpreisNetto']; $fVKNetto = (float)$params['fVKNetto']; $kSteuerklasse = (int)$params['kSteuerklasse']; $fVPEWert = (float)$params['fVPEWert']; $cVPEEinheit = $params['cVPEEinheit']; $funcAttributes = $params['FunktionsAttribute']; $precision = (isset($funcAttributes[\FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT]) && (int)$funcAttributes[\FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT] > 0) ? (int)$funcAttributes[\FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT] : 2; if ((int)$params['nNettoPreise'] === 1) { $surcharge->cAufpreisLocalized = Preise::getLocalizedPriceString($fAufpreisNetto); $surcharge->cPreisInklAufpreis = Preise::getLocalizedPriceString($fAufpreisNetto + $fVKNetto); $surcharge->cAufpreisLocalized = ($fAufpreisNetto > 0) ? ('+ ' . $surcharge->cAufpreisLocalized) : \str_replace('-', '- ', $surcharge->cAufpreisLocalized); if ($fVPEWert > 0) { $surcharge->cPreisVPEWertAufpreis = Preise::getLocalizedPriceString( $fAufpreisNetto / $fVPEWert, Frontend::getCurrency()->getCode(), true, $precision ) . ' ' . Shop::Lang()->get('vpePer') . ' ' . $cVPEEinheit; $surcharge->cPreisVPEWertInklAufpreis = Preise::getLocalizedPriceString( ($fAufpreisNetto + $fVKNetto) / $fVPEWert, Frontend::getCurrency()->getCode(), true, $precision ) . ' ' . Shop::Lang()->get('vpePer') . ' ' . $cVPEEinheit; $surcharge->cAufpreisLocalized .= ', ' . $surcharge->cPreisVPEWertAufpreis; $surcharge->cPreisInklAufpreis .= ', ' . $surcharge->cPreisVPEWertInklAufpreis; } } else { $surcharge->cAufpreisLocalized = Preise::getLocalizedPriceString( Tax::getGross($fAufpreisNetto, $_SESSION['Steuersatz'][$kSteuerklasse], 4) ); $surcharge->cPreisInklAufpreis = Preise::getLocalizedPriceString( Tax::getGross($fAufpreisNetto + $fVKNetto, $_SESSION['Steuersatz'][$kSteuerklasse], 4) ); $surcharge->cAufpreisLocalized = ($fAufpreisNetto > 0) ? ('+ ' . $surcharge->cAufpreisLocalized) : \str_replace('-', '- ', $surcharge->cAufpreisLocalized); if ($fVPEWert > 0) { $surcharge->cPreisVPEWertAufpreis = Preise::getLocalizedPriceString( Tax::getGross($fAufpreisNetto / $fVPEWert, $_SESSION['Steuersatz'][$kSteuerklasse]), Frontend::getCurrency()->getCode(), true, $precision ) . ' ' . Shop::Lang()->get('vpePer') . ' ' . $cVPEEinheit; $surcharge->cPreisVPEWertInklAufpreis = Preise::getLocalizedPriceString( Tax::getGross( ($fAufpreisNetto + $fVKNetto) / $fVPEWert, $_SESSION['Steuersatz'][$kSteuerklasse] ), Frontend::getCurrency()->getCode(), true, $precision ) . ' ' . Shop::Lang()->get('vpePer') . ' ' . $cVPEEinheit; $surcharge->cAufpreisLocalized .= ', ' . $surcharge->cPreisVPEWertAufpreis; $surcharge->cPreisInklAufpreis .= ', ' . $surcharge->cPreisVPEWertInklAufpreis; } } } return (isset($params['bAufpreise']) && (int)$params['bAufpreise'] > 0) ? $surcharge->cAufpreisLocalized : $surcharge->cPreisInklAufpreis; } public function getLocalizedPrice($params, $smarty) { if(!$this->shopIsAtLeast52) { return $this->getLocalizedPriceLegacy($params, $smarty); } $surcharge = new \stdClass(); $surcharge->cAufpreisLocalized = ''; $surcharge->cPreisInklAufpreis = ''; if ((float)$params['fAufpreisNetto'] != 0) { $currency = Frontend::getCurrency(); $netSurcharge = (float)$params['fAufpreisNetto']; $fVKNetto = (float)$params['fVKNetto']; $kSteuerklasse = (int)$params['kSteuerklasse']; $fVPEWert = (float)$params['fVPEWert']; $cVPEEinheit = $params['cVPEEinheit']; $funcAttributes = $params['FunktionsAttribute']; $precision = (isset($funcAttributes[\FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT]) && (int)$funcAttributes[\FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT] > 0) ? (int)$funcAttributes[\FKT_ATTRIBUT_GRUNDPREISGENAUIGKEIT] : 2; if ((int)$params['nNettoPreise'] === 1) { $surcharge->cAufpreisLocalized = Preise::getLocalizedPriceString($netSurcharge, $currency); $surcharge->cPreisInklAufpreis = Preise::getLocalizedPriceString($netSurcharge + $fVKNetto, $currency); $surcharge->cAufpreisLocalized = ($netSurcharge > 0) ? ('+ ' . $surcharge->cAufpreisLocalized) : \str_replace('-', '- ', $surcharge->cAufpreisLocalized); if ($fVPEWert > 0) { $surcharge->cPreisVPEWertAufpreis = Preise::getLocalizedPriceString( $netSurcharge / $fVPEWert, $currency, true, $precision ) . ' ' . Shop::Lang()->get('vpePer') . ' ' . $cVPEEinheit; $surcharge->cPreisVPEWertInklAufpreis = Preise::getLocalizedPriceString( ($netSurcharge + $fVKNetto) / $fVPEWert, $currency, true, $precision ) . ' ' . Shop::Lang()->get('vpePer') . ' ' . $cVPEEinheit; $surcharge->cAufpreisLocalized .= ', ' . $surcharge->cPreisVPEWertAufpreis; $surcharge->cPreisInklAufpreis .= ', ' . $surcharge->cPreisVPEWertInklAufpreis; } } else { $surcharge->cAufpreisLocalized = Preise::getLocalizedPriceString( Tax::getGross($netSurcharge, $_SESSION['Steuersatz'][$kSteuerklasse], 4), $currency ); $surcharge->cPreisInklAufpreis = Preise::getLocalizedPriceString( Tax::getGross($netSurcharge + $fVKNetto, $_SESSION['Steuersatz'][$kSteuerklasse], 4), $currency ); $surcharge->cAufpreisLocalized = ($netSurcharge > 0) ? ('+ ' . $surcharge->cAufpreisLocalized) : \str_replace('-', '- ', $surcharge->cAufpreisLocalized); if ($fVPEWert > 0) { $surcharge->cPreisVPEWertAufpreis = Preise::getLocalizedPriceString( Tax::getGross($netSurcharge / $fVPEWert, $_SESSION['Steuersatz'][$kSteuerklasse]), $currency, true, $precision ) . ' ' . Shop::Lang()->get('vpePer') . ' ' . $cVPEEinheit; $surcharge->cPreisVPEWertInklAufpreis = Preise::getLocalizedPriceString( Tax::getGross( ($netSurcharge + $fVKNetto) / $fVPEWert, $_SESSION['Steuersatz'][$kSteuerklasse] ), $currency, true, $precision ) . ' ' . Shop::Lang()->get('vpePer') . ' ' . $cVPEEinheit; $surcharge->cAufpreisLocalized .= ', ' . $surcharge->cPreisVPEWertAufpreis; $surcharge->cPreisInklAufpreis .= ', ' . $surcharge->cPreisVPEWertInklAufpreis; } } } return (isset($params['bAufpreise']) && (int)$params['bAufpreise'] > 0) ? $surcharge->cAufpreisLocalized : $surcharge->cPreisInklAufpreis; } private function getCheckboxes(int $location, int $languageID): array { $cid = 'cb_' . $location . '_' . $languageID; $checkBoxes = Shop::has($cid) ? Shop::get($cid) : (new CheckBox(0, $this->db))->getCheckBoxFrontend($location, 0, true, true); Shop::set($cid, $checkBoxes); return $checkBoxes; } public function hasCheckBoxForLocation($params, $smarty): void { if($this->shopIsAtLeast52) { $smarty->assign( $params['bReturn'], \count($this->getCheckboxes((int)$params['nAnzeigeOrt'], Shop::getLanguageID())) > 0 ); } else { $smarty->assign( $params['bReturn'], \count((new CheckBox())->getCheckBoxFrontend((int)$params['nAnzeigeOrt'], 0, true, true)) > 0 ); } } public function getCheckBoxForLocation($params, $smarty): void { if($this->shopIsAtLeast52) { $langID = Shop::getLanguageID(); $checkboxes = $this->getCheckboxes((int)$params['nAnzeigeOrt'], $langID); foreach ($checkboxes as $checkbox) { $url = $checkbox->kLink > 0 ? $checkbox->getLink()->getURL() : ''; $error = isset($params['cPlausi_arr'][$checkbox->cID]); $checkbox->isActive = isset($params['cPost_arr'][$checkbox->cID]); $checkbox->cName = $checkbox->oCheckBoxSprache_arr[$langID]->cText ?? ''; $checkbox->cLinkURL = $url; $checkbox->cLinkURLFull = $url; $checkbox->cBeschreibung = !empty($checkbox->oCheckBoxSprache_arr[$langID]->cBeschreibung) ? $checkbox->oCheckBoxSprache_arr[$langID]->cBeschreibung : ''; $checkbox->cErrormsg = $error ? Shop::Lang()->get('pleasyAccept', 'account data') : ''; } if (isset($params['assign'])) { $smarty->assign($params['assign'], $checkboxes); } } else { $langID = Shop::getLanguageID(); $cid = 'cb_' . (int)$params['nAnzeigeOrt'] . '_' . $langID; $checkBoxes = Shop::has($cid) ? Shop::get($cid) : (new CheckBox())->getCheckBoxFrontend((int)$params['nAnzeigeOrt'], 0, true, true); if (\count($checkBoxes) > 0) { foreach ($checkBoxes as $checkBox) { $url = $checkBox->kLink > 0 ? $checkBox->getLink()->getURL() : ''; $error = isset($params['cPlausi_arr'][$checkBox->cID]); $checkBox->isActive = isset($params['cPost_arr'][$checkBox->cID]); $checkBox->cName = $checkBox->oCheckBoxSprache_arr[$langID]->cText ?? ''; $checkBox->cLinkURL = $url; $checkBox->cLinkURLFull = $url; $checkBox->cBeschreibung = !empty($checkBox->oCheckBoxSprache_arr[$langID]->cBeschreibung) ? $checkBox->oCheckBoxSprache_arr[$langID]->cBeschreibung : ''; $checkBox->cErrormsg = $error ? Shop::Lang()->get('pleasyAccept', 'account data') : ''; } Shop::set($cid, $checkBoxes); if (isset($params['assign'])) { $smarty->assign($params['assign'], $checkBoxes); } } } } public function aaURLEncode($params): string { $reset = (isset($params['nReset']) && (int)$params['nReset'] === 1); $url = $_SERVER['REQUEST_URI']; $params = ['&aaParams', '?aaParams', '&aaReset', '?aaReset']; $exists = false; foreach ($params as $param) { $exists = \strpos($url, $param); if ($exists !== false) { $url = \substr($url, 0, $exists); break; } $exists = false; } if ($exists !== false) { $url = \substr($url, 0, $exists); } if (isset($params['bUrlOnly']) && (int)$params['bUrlOnly'] === 1) { return $url; } $paramString = ''; unset($params['nReset']); if (\is_array($params) && \count($params) > 0) { foreach ($params as $key => $param) { $paramString .= $key . '=' . $param . ';'; } } $sep = (\strpos($url, '?') === false) ? '?' : '&'; return $url . $sep . ($reset ? 'aaReset=' : 'aaParams=') . ase64_encode($paramString); } public function getNavigation($params, $smarty): void { if (!isset($params['assign'])) { return; } $identifier = $params['linkgroupIdentifier']; $linkGroup = null; if (\strlen($identifier) > 0) { $linkGroups = Shop::Container()->getLinkService()->getVisibleLinkGroups(); $linkGroup = $linkGroups->getLinkgroupByTemplate($identifier); } if ($linkGroup !== null && $linkGroup->isAvailableInLanguage(Shop::getLanguageID())) { $smarty->assign($params['assign'], $this->buildNavigationSubs($linkGroup)); } } public function buildNavigationSubs(LinkGroupInterface $linkGroup, $parentID = 0): Collection { $parentID = (int)$parentID; $links = new Collection(); if ($linkGroup->getTemplate() === 'hidden' || $linkGroup->getName() === 'hidden') { return $links; } foreach ($linkGroup->getLinks() as $link) { if ($link->getParent() !== $parentID) { continue; } $link->setChildLinks($this->buildNavigationSubs($linkGroup, $link->getID())); $link->setIsActive($link->getIsActive() || (Shop::$kLink > 0 && Shop::$kLink === $link->getID())); $links->push($link); } return $links; } public function prepareImageDetails($params) { if (!isset($params['item'])) { return null; } $result = [ 'xs' => $this->getImageSize($params['item']->cPfadMini), 'sm' => $this->getImageSize($params['item']->cPfadKlein), 'md' => $this->getImageSize($params['item']->cPfadNormal), 'lg' => $this->getImageSize($params['item']->cPfadGross) ]; if (isset($params['type'])) { $type = $params['type']; if (isset($result[$type])) { $result = $result[$type]; } } $imageBaseURL = Shop::getImageBaseURL(); foreach ($result as $size => $data) { if (isset($data->src) && \strpos($data->src, 'http') !== 0) { $data->src = $imageBaseURL . $data->src; } } $result = (object)$result; return (isset($params['json']) && $params['json']) ? \json_encode($result, \JSON_FORCE_OBJECT) : $result; } public function getImageSize($image) { $path = ($image !== null && \strpos($image, \PFAD_BILDER) === 0) ? PFAD_ROOT . $image : $image; if ($path !== null && ile_exists($path)) { [$width, $height, $type] = \getimagesize($path); } else { if($path === null) { return null; } $req = Product::toRequest($path); if (!\is_object($req)) { return null; } $settings = Image::getSettings(); $refImage = $req->getRaw(); if ($refImage === null) { return null; } [$width, $height, $type] = \getimagesize($refImage); $size = $settings['size'][$req->getSizeType()]; $max_width = $size['width']; $max_height = $size['height']; $old_width = $width; $old_height = $height; $scale = \min($max_width / $old_width, $max_height / $old_height); $width = \ceil($scale * $old_width); $height = \ceil($scale * $old_height); } return (object)[ 'src' => $image, 'size' => (object)[ 'width' => $width, 'height' => $height ], 'type' => $type ]; } public function getCMSContent($params, $smarty) { if (isset($params['kLink']) && (int)$params['kLink'] > 0) { $linkID = (int)$params['kLink']; $link = Shop::Container()->getLinkService()->getLinkByID($linkID); $content = $link !== null ? $link->getContent() : null; if (isset($params['assign'])) { $smarty->assign($params['assign'], $content); } else { return $content; } } return null; } public function hasOnlyListableVariations($params, $smarty) { if (!isset($params['artikel']->Variationen)) { if (isset($params['assign'])) { $smarty->assign($params['assign'], 0); return null; } return 0; } $maxVariationCount = isset($params['maxVariationCount']) ? (int)$params['maxVariationCount'] : 1; $maxWerteCount = isset($params['maxWerteCount']) ? (int)$params['maxWerteCount'] : 3; $variationCheck = static function ($variations, $maxVariationCount, $maxValueCount) { $result = true; $varCount = \is_array($variations) ? \count($variations) : 0; if ($varCount > 0 && $varCount <= $maxVariationCount) { foreach ($variations as $oVariation) { if ($oVariation->cTyp !== 'SELECTBOX' && (!\in_array($oVariation->cTyp, ['TEXTSWATCHES', 'IMGSWATCHES', 'RADIO'], true) || \count($oVariation->Werte) > $maxValueCount)) { $result = false; break; } } } else { $result = false; } return $result; }; $result = $variationCheck($params['artikel']->Variationen, $maxVariationCount, $maxWerteCount) ? 1 : 0; if ($result === 0 && $params['artikel']->kVaterArtikel > 0) { $result = $variationCheck($params['artikel']->oVariationenNurKind_arr, $maxVariationCount, $maxWerteCount) ? 2 : 0; } if (isset($params['assign'])) { $smarty->assign($params['assign'], $result); return null; } return $result; } public function getTranslation($mixed, $to = null): ?string { $to = $to ?: Shop::getLanguageCode(); if ($this->hasTranslation($mixed, $to)) { return \is_string($mixed) ? $mixed : $mixed[$to]; } return null; } public function hasTranslation($mixed, $to = null): bool { $to = $to ?: Shop::getLanguageCode(); return \is_string($mixed) || isset($mixed[$to]); } public function captchaMarkup($params, $smarty): string { if (isset($params['getBody']) && $params['getBody']) { return Shop::Container()->getCaptchaService()->getBodyMarkup($smarty); } return Shop::Container()->getCaptchaService()->getHeadMarkup($smarty); } public function getStates($params, $smarty) { $regions = Staat::getRegions($params['cIso']); if (!isset($params['assign'])) { return $regions; } $smarty->assign($params['assign'], $regions); } public function getDecimalLength($params): int { return \max(\strlen(\strrchr(\str_replace(',', '.', $params['quantity']), '.')) - 1, 0); } public function seofy($optStr = ''): string { return \str_replace('/', '-', Seo::sanitizeSeoSlug($optStr)); } public function getUploaderLang($params, $smarty): void { $availableLocales = [ 'ar', 'az', 'bg', 'ca', 'cr', 'cs', 'da', 'de', 'el', 'es', 'et', 'fa', 'fi', 'fr', 'gl', 'he', 'hu', 'id', 'it', 'ja', 'ka', 'kr', 'kz', 'lt', 'nl', 'no', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'th', 'tr', 'uk', 'uz', 'vi', 'zh' ]; $smarty->assign($params['assign'], \in_array($params['iso'], $availableLocales, true) ? $params['iso'] : 'LANG'); } public function getCountry($params, $smarty): void { $smarty->assign($params['assign'], Shop::Container()->getCountryService()->getCountry($params['iso'])); } public function sanitizeTitle($params): string { return \htmlspecialchars($params['title'], ENT_COMPAT, JTL_CHARSET, false); } public function formatForMicrodata(string $price = ''): string { $currSep = Frontend::getCurrency()->getDecimalSeparator(); $currTho = Frontend::getCurrency()->getThousandsSeparator(); return \sprintf("%.2f", \str_replace($currSep, '.', \str_replace($currTho, '', ($price)))); } } 

Did this file decode correctly?

Original Code

<?php
/* MD5: e622d1e99f543321668714e109a5c882 */
eval(base64_decode('CiBuYW1lc3BhY2UgVGVtcGxhdGVcZWFzeVRlbXBsYXRlMzYwOyB1c2UgSWxsdW1pbmF0ZVxTdXBwb3J0XENvbGxlY3Rpb247IHVzZSBKVExcQ2FjaGVcSlRMQ2FjaGVJbnRlcmZhY2U7IHVzZSBKVExcQ2F0YWxvZ1xDYXRlZ29yeVxLYXRlZ29yaWU7IHVzZSBKVExcQ2F0YWxvZ1xDYXRlZ29yeVxLYXRlZ29yaWVMaXN0ZTsgdXNlIEpUTFxDYXRhbG9nXFByb2R1Y3RcQXJ0aWtlbDsgdXNlIEpUTFxDYXRhbG9nXFByb2R1Y3RcUHJlaXNlOyB1c2UgSlRMXENoZWNrQm94OyB1c2UgSlRMXERCXERiSW50ZXJmYWNlOyB1c2UgSlRMXEZpbHRlclxDb25maWc7IHVzZSBKVExcRmlsdGVyXFByb2R1Y3RGaWx0ZXI7IHVzZSBKVExcSGVscGVyc1xDYXRlZ29yeTsgdXNlIEpUTFxIZWxwZXJzXE1hbnVmYWN0dXJlcjsgdXNlIEpUTFxIZWxwZXJzXFNlbzsgdXNlIEpUTFxIZWxwZXJzXFRheDsgdXNlIEpUTFxMaW5rXExpbms7IHVzZSBKVExcTGlua1xMaW5rR3JvdXBJbnRlcmZhY2U7IHVzZSBKVExcTWVkaWFcSW1hZ2U7IHVzZSBKVExcTWVkaWFcSW1hZ2VcUHJvZHVjdDsgdXNlIEpUTFxTZXNzaW9uXEZyb250ZW5kOyB1c2UgSlRMXFNob3A7IHVzZSBKVExcU3RhYXQ7IGNsYXNzIE5vdmFQbHVnaW5zIHsgcHJpdmF0ZSAkZGI7IHByaXZhdGUgJGNhY2hlOyBwcml2YXRlICRzaG9wSXNBdExlYXN0NTI7IHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChEYkludGVyZmFjZSAkZGIsIEpUTENhY2hlSW50ZXJmYWNlICRjYWNoZSkgeyAkdGhpcy0+ZGIgPSAkZGI7ICR0aGlzLT5jYWNoZSA9ICRjYWNoZTsgJHRoaXMtPnNob3BJc0F0TGVhc3Q1MiA9IHZlcnNpb25fY29tcGFyZShcQVBQTElDQVRJT05fVkVSU0lPTiwgJzUuMi4wLWJldGEnLCAnPj0nKTsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZHVjdExpc3QoJHBhcmFtcywgJHNtYXJ0eSkgeyAkbGltaXQgPSAoaW50KSgkcGFyYW1zWyduTGltaXQnXSA/PyAxMCk7ICRzb3J0ID0gKGludCkoJHBhcmFtc1snblNvcnRpZXJ1bmcnXSA/PyAwKTsgJGFzc2lnblRvID0gKGlzc2V0KCRwYXJhbXNbJ2NBc3NpZ24nXSkgJiYgXHN0cmxlbigkcGFyYW1zWydjQXNzaWduJ10pID4gMCkgPyAkcGFyYW1zWydjQXNzaWduJ10gOiAnb0N1c3RvbUFydGlrZWxfYXJyJzsgJGNoYXJhY3RlcmlzdGljRmlsdGVycyA9IGlzc2V0KCRwYXJhbXNbJ2NNZXJrbWFsRmlsdGVyJ10pID8gUHJvZHVjdEZpbHRlcjo6aW5pdENoYXJhY3RlcmlzdGljRmlsdGVyKFxleHBsb2RlKCc7JywgJHBhcmFtc1snY01lcmttYWxGaWx0ZXInXSkpIDogW107ICRzZWFyY2hGaWx0ZXJzID0gaXNzZXQoJHBhcmFtc1snY1N1Y2hGaWx0ZXInXSkgPyBQcm9kdWN0RmlsdGVyOjppbml0U2VhcmNoRmlsdGVyKFxleHBsb2RlKCc7JywgJHBhcmFtc1snY1N1Y2hGaWx0ZXInXSkpIDogW107ICRiUmV0dXJuID0gaXNzZXQoJHBhcmFtc1snYlJldHVybiddKSAmJiAkcGFyYW1zWydiUmV0dXJuJ107ICRwYXJhbXMgPSBbICdrS2F0ZWdvcmllJyA9PiAkcGFyYW1zWydrS2F0ZWdvcmllJ10gPz8gbnVsbCwgJ2tIZXJzdGVsbGVyJyA9PiAkcGFyYW1zWydrSGVyc3RlbGxlciddID8/IG51bGwsICdrQXJ0aWtlbCcgPT4gJHBhcmFtc1sna0FydGlrZWwnXSA/PyBudWxsLCAna1ZhcmlLaW5kQXJ0aWtlbCcgPT4gJHBhcmFtc1sna1ZhcmlLaW5kQXJ0aWtlbCddID8/IG51bGwsICdrU2VpdGUnID0+ICRwYXJhbXNbJ2tTZWl0ZSddID8/IG51bGwsICdrU3VjaGFuZnJhZ2UnID0+ICRwYXJhbXNbJ2tTdWNoYW5mcmFnZSddID8/IG51bGwsICdrTWVya21hbFdlcnQnID0+ICRwYXJhbXNbJ2tNZXJrbWFsV2VydCddID8/IG51bGwsICdrU3VjaHNwZWNpYWwnID0+ICRwYXJhbXNbJ2tTdWNoc3BlY2lhbCddID8/IG51bGwsICdrS2F0ZWdvcmllRmlsdGVyJyA9PiAkcGFyYW1zWydrS2F0ZWdvcmllRmlsdGVyJ10gPz8gbnVsbCwgJ2tIZXJzdGVsbGVyRmlsdGVyJyA9PiAkcGFyYW1zWydrSGVyc3RlbGxlckZpbHRlciddID8/IG51bGwsICduQmV3ZXJ0dW5nU3Rlcm5lRmlsdGVyJyA9PiAkcGFyYW1zWyduQmV3ZXJ0dW5nU3Rlcm5lRmlsdGVyJ10gPz8gbnVsbCwgJ2NQcmVpc3NwYW5uZW5GaWx0ZXInID0+ICRwYXJhbXNbJ2NQcmVpc3NwYW5uZW5GaWx0ZXInXSA/PyAnJywgJ2tTdWNoc3BlY2lhbEZpbHRlcicgPT4gJHBhcmFtc1sna1N1Y2hzcGVjaWFsRmlsdGVyJ10gPz8gbnVsbCwgJ25Tb3J0aWVydW5nJyA9PiAkc29ydCwgJ01lcmttYWxGaWx0ZXJfYXJyJyA9PiAkY2hhcmFjdGVyaXN0aWNGaWx0ZXJzLCAnU3VjaEZpbHRlcl9hcnInID0+ICRzZWFyY2hGaWx0ZXJzLCAnbkFydGlrZWxQcm9TZWl0ZScgPT4gJHBhcmFtc1snbkFydGlrZWxQcm9TZWl0ZSddID8/IG51bGwsICdjU3VjaGUnID0+ICRwYXJhbXNbJ2NTdWNoZSddID8/IG51bGwsICdzZWl0ZScgPT4gJHBhcmFtc1snc2VpdGUnXSA/PyBudWxsIF07IGlmICgkcGFyYW1zWydrQXJ0aWtlbCddICE9PSBudWxsKSB7ICRwcm9kdWN0cyA9IFtdOyBpZiAoIVxpc19hcnJheSgkcGFyYW1zWydrQXJ0aWtlbCddKSkgeyAkcGFyYW1zWydrQXJ0aWtlbCddID0gWyRwYXJhbXNbJ2tBcnRpa2VsJ11dOyB9IGZvcmVhY2ggKCRwYXJhbXNbJ2tBcnRpa2VsJ10gYXMgJHByb2R1Y3RJRCkgeyAkcHJvZHVjdCA9IG5ldyBBcnRpa2VsKCk7ICRwcm9kdWN0c1tdID0gJHByb2R1Y3QtPmZ1ZWxsZUFydGlrZWwoJHByb2R1Y3RJRCwgQXJ0aWtlbDo6Z2V0RGVmYXVsdE9wdGlvbnMoKSk7IH0gfSBlbHNlIHsgJHByb2R1Y3RzID0gKG5ldyBQcm9kdWN0RmlsdGVyKCBDb25maWc6OmdldERlZmF1bHQoKSwgJHRoaXMtPmRiLCAkdGhpcy0+Y2FjaGUgKSkgLT5pbml0U3RhdGVzKCRwYXJhbXMpIC0+Z2VuZXJhdGVTZWFyY2hSZXN1bHRzKG51bGwsIHRydWUsICRsaW1pdCkgLT5nZXRQcm9kdWN0cygpIC0+YWxsKCk7IH0gJHNtYXJ0eS0+YXNzaWduKCRhc3NpZ25UbywgJHByb2R1Y3RzKTsgaWYgKCRiUmV0dXJuKSB7IHJldHVybiAkcHJvZHVjdHM7IH0gfSBwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdGljUm91dGUoJHBhcmFtcywgJHNtYXJ0eSkgeyBpZiAoaXNzZXQoJHBhcmFtc1snaWQnXSkpIHsgJGZ1bGwgPSAhaXNzZXQoJHBhcmFtc1snZnVsbCddKSB8fCAkcGFyYW1zWydmdWxsJ10gPT09IHRydWU7ICRzZWN1cmUgPSBpc3NldCgkcGFyYW1zWydzZWN1cmUnXSkgJiYgJHBhcmFtc1snc2VjdXJlJ10gPT09IHRydWU7ICR1cmwgPSBTaG9wOjpDb250YWluZXIoKS0+Z2V0TGlua1NlcnZpY2UoKS0+Z2V0U3RhdGljUm91dGUoJHBhcmFtc1snaWQnXSwgJGZ1bGwsICRzZWN1cmUpOyAkcXAgPSBpc3NldCgkcGFyYW1zWydwYXJhbXMnXSkgPyAoYXJyYXkpJHBhcmFtc1sncGFyYW1zJ10gOiBbXTsgaWYgKFxjb3VudCgkcXApID4gMCkgeyAkdXJsIC49IChccGFyc2VfdXJsKCR1cmwsIFxQSFBfVVJMX1FVRVJZKSA/ICcmJyA6ICc/JykgLiBcaHR0cF9idWlsZF9xdWVyeSgkcXAsICcnLCAnJicpOyB9IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAkdXJsKTsgfSBlbHNlIHsgcmV0dXJuICR1cmw7IH0gfSByZXR1cm4gZmFsc2U7IH0gcHVibGljIGZ1bmN0aW9uIGdldE1hbnVmYWN0dXJlcnMoJHBhcmFtcywgJHNtYXJ0eSkgeyAkbWFudWZhY3R1cmVycyA9IE1hbnVmYWN0dXJlcjo6Z2V0SW5zdGFuY2UoKS0+Z2V0TWFudWZhY3R1cmVycygpOyBpZiAoaXNzZXQoJHBhcmFtc1snYXNzaWduJ10pKSB7ICRzbWFydHktPmFzc2lnbigkcGFyYW1zWydhc3NpZ24nXSwgJG1hbnVmYWN0dXJlcnMpOyByZXR1cm47IH0gcmV0dXJuICRtYW51ZmFjdHVyZXJzOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXRCb3hlc0J5UG9zaXRpb24oJHBhcmFtcywgJHNtYXJ0eSkgeyBpZiAoaXNzZXQoJHBhcmFtc1sncG9zaXRpb24nXSkpIHsgJGRhdGEgPSBTaG9wOjpDb250YWluZXIoKS0+Z2V0Qm94U2VydmljZSgpLT5ib3hlczsgJGJveGVzID0gJGRhdGFbJHBhcmFtc1sncG9zaXRpb24nXV0gPz8gW107IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAkYm94ZXMpOyB9IGVsc2UgeyByZXR1cm4gJGJveGVzOyB9IH0gfSBwdWJsaWMgZnVuY3Rpb24gZ2V0Q2F0ZWdvcnlBcnJheSgkcGFyYW1zLCAkc21hcnR5KSB7ICRpZCA9IGlzc2V0KCRwYXJhbXNbJ2NhdGVnb3J5SWQnXSkgPyAoaW50KSRwYXJhbXNbJ2NhdGVnb3J5SWQnXSA6IDA7IGlmICgkaWQgPT09IDApIHsgJGNhdGVnb3JpZXMgPSBDYXRlZ29yeTo6Z2V0SW5zdGFuY2UoKTsgJGxpc3QgPSAkY2F0ZWdvcmllcy0+Y29tYmluZWRHZXRBbGwoKTsgfSBlbHNlIHsgJGNhdGVnb3JpZXMgPSBuZXcgS2F0ZWdvcmllTGlzdGUoKTsgJGxpc3QgPSAkY2F0ZWdvcmllcy0+Z2V0QWxsQ2F0ZWdvcmllc09uTGV2ZWwoJGlkKTsgfSBpZiAoaXNzZXQoJHBhcmFtc1snY2F0ZWdvcnlCb3hOdW1iZXInXSkgJiYgKGludCkkcGFyYW1zWydjYXRlZ29yeUJveE51bWJlciddID4gMCkgeyAkbGlzdDIgPSBbXTsgZm9yZWFjaCAoJGxpc3QgYXMgJGtleSA9PiAkaXRlbSkgeyBpZiAoKCEkdGhpcy0+c2hvcElzQXRMZWFzdDUyICYmIGlzc2V0KCRpdGVtLT5jYXRlZ29yeUZ1bmN0aW9uQXR0cmlidXRlc1tcS0FUX0FUVFJJQlVUX0tBVEVHT1JJRUJPWF0pICYmICRpdGVtLT5jYXRlZ29yeUZ1bmN0aW9uQXR0cmlidXRlc1tcS0FUX0FUVFJJQlVUX0tBVEVHT1JJRUJPWF0gPT0gJHBhcmFtc1snY2F0ZWdvcnlCb3hOdW1iZXInXSkgfHwgKCR0aGlzLT5zaG9wSXNBdExlYXN0NTIgJiYgJGl0ZW0tPmdldENhdGVnb3J5RnVuY3Rpb25BdHRyaWJ1dGUoXEtBVF9BVFRSSUJVVF9LQVRFR09SSUVCT1gpID09ICRwYXJhbXNbJ2NhdGVnb3J5Qm94TnVtYmVyJ10pKSB7ICRsaXN0Mlska2V5XSA9ICRpdGVtOyB9IH0gJGxpc3QgPSAkbGlzdDI7IH0gaWYgKGlzc2V0KCRwYXJhbXNbJ2Fzc2lnbiddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICRsaXN0KTsgcmV0dXJuOyB9IHJldHVybiAkbGlzdDsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0Q2F0ZWdvcnlQYXJlbnRzKCRwYXJhbXMsICRzbWFydHkpIHsgJGlkID0gaXNzZXQoJHBhcmFtc1snY2F0ZWdvcnlJZCddKSA/IChpbnQpJHBhcmFtc1snY2F0ZWdvcnlJZCddIDogMDsgJGNhdGVnb3JpZXMgPSBuZXcgS2F0ZWdvcmllTGlzdGUoKTsgJGxpc3QgPSAkY2F0ZWdvcmllcy0+Z2V0T3BlbkNhdGVnb3JpZXMobmV3IEthdGVnb3JpZSgkaWQpKTsgXGFycmF5X3NoaWZ0KCRsaXN0KTsgJGxpc3QgPSBcYXJyYXlfcmV2ZXJzZSgkbGlzdCk7IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAkbGlzdCk7IHJldHVybjsgfSByZXR1cm4gJGxpc3Q7IH0gcHVibGljIGZ1bmN0aW9uIGdldEltZ1RhZygkcGFyYW1zLCAkc21hcnR5KTogc3RyaW5nIHsgaWYgKGVtcHR5KCRwYXJhbXNbJ3NyYyddKSkgeyByZXR1cm4gJyc7IH0gJHNpemUgPSAkdGhpcy0+Z2V0SW1hZ2VTaXplKCRwYXJhbXNbJ3NyYyddKTsgJHVybCA9ICRwYXJhbXNbJ3NyYyddOyAkaWQgPSBpc3NldCgkcGFyYW1zWydpZCddKSA/ICcgaWQ9IicgLiAkcGFyYW1zWydpZCddIC4gJyInIDogJyc7ICRhbHQgPSBpc3NldCgkcGFyYW1zWydhbHQnXSkgPyAnIGFsdD0iJyAuICR0aGlzLT50cnVuY2F0ZSgkcGFyYW1zWydhbHQnXSwgNzUpIC4gJyInIDogJyc7ICR0aXRsZSA9IGlzc2V0KCRwYXJhbXNbJ3RpdGxlJ10pID8gJyB0aXRsZT0iJyAuICR0aGlzLT50cnVuY2F0ZSgkcGFyYW1zWyd0aXRsZSddLCA3NSkgLiAnIicgOiAnJzsgJGNsYXNzID0gaXNzZXQoJHBhcmFtc1snY2xhc3MnXSkgPyAnIGNsYXNzPSInIC4gJHRoaXMtPnRydW5jYXRlKCRwYXJhbXNbJ2NsYXNzJ10sIDc1KSAuICciJyA6ICcnOyBpZiAoXHN0cnBvcygkdXJsLCAnaHR0cCcpICE9PSAwKSB7ICR1cmwgPSBTaG9wOjpnZXRJbWFnZUJhc2VVUkwoKSAuIFxsdHJpbSgkdXJsLCAnLycpOyB9IGlmICgkc2l6ZSAhPT0gbnVsbCAmJiAkc2l6ZS0+c2l6ZS0+d2lkdGggPiAwICYmICRzaXplLT5zaXplLT5oZWlnaHQgPiAwKSB7IHJldHVybiAnPGltZyBzcmM9IicgLiAkdXJsIC4gJyIgd2lkdGg9IicgLiAkc2l6ZS0+c2l6ZS0+d2lkdGggLiAnIiBoZWlnaHQ9IicgLiAkc2l6ZS0+c2l6ZS0+aGVpZ2h0IC4gJyInIC4gJGlkIC4gJGFsdCAuICR0aXRsZSAuICRjbGFzcyAuICcgLz4nOyB9IHJldHVybiAnPGltZyBzcmM9IicgLiAkdXJsIC4gJyInIC4gJGlkIC4gJGFsdCAuICR0aXRsZSAuICRjbGFzcyAuICcgLz4nOyB9IHB1YmxpYyBmdW5jdGlvbiBoYXNCb3hlcygkcGFyYW1zLCAkc21hcnR5KTogdm9pZCB7ICRib3hEYXRhID0gJHNtYXJ0eS0+Z2V0VGVtcGxhdGVWYXJzKCdib3hlcycpOyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICFlbXB0eSgkYm94RGF0YVskcGFyYW1zWydwb3NpdGlvbiddXSkpOyB9IHB1YmxpYyBmdW5jdGlvbiB0cnVuY2F0ZSgkdGV4dCwgJGxlbmd0aCkgeyBpZiAoXG1iX3N0cmxlbigkdGV4dCkgPiAkbGVuZ3RoKSB7ICR0ZXh0ID0gXG1iX3N1YnN0cigkdGV4dCwgMCwgJGxlbmd0aCk7ICR0ZXh0ID0gXG1iX3N1YnN0cigkdGV4dCwgMCwgXG1iX3N0cnJwb3MoJHRleHQsICcgJykpOyAkdGV4dCAuPSAnLi4uJzsgfSByZXR1cm4gJHRleHQ7IH0gcHJpdmF0ZSBmdW5jdGlvbiBnZXRMb2NhbGl6ZWRQcmljZUxlZ2FjeSgkcGFyYW1zLCAkc21hcnR5KSB7ICRzdXJjaGFyZ2UgPSBuZXcgXHN0ZENsYXNzKCk7ICRzdXJjaGFyZ2UtPmNBdWZwcmVpc0xvY2FsaXplZCA9ICcnOyAkc3VyY2hhcmdlLT5jUHJlaXNJbmtsQXVmcHJlaXMgPSAnJzsgaWYgKChmbG9hdCkkcGFyYW1zWydmQXVmcHJlaXNOZXR0byddICE9IDApIHsgJGZBdWZwcmVpc05ldHRvID0gKGZsb2F0KSRwYXJhbXNbJ2ZBdWZwcmVpc05ldHRvJ107ICRmVktOZXR0byA9IChmbG9hdCkkcGFyYW1zWydmVktOZXR0byddOyAka1N0ZXVlcmtsYXNzZSA9IChpbnQpJHBhcmFtc1sna1N0ZXVlcmtsYXNzZSddOyAkZlZQRVdlcnQgPSAoZmxvYXQpJHBhcmFtc1snZlZQRVdlcnQnXTsgJGNWUEVFaW5oZWl0ID0gJHBhcmFtc1snY1ZQRUVpbmhlaXQnXTsgJGZ1bmNBdHRyaWJ1dGVzID0gJHBhcmFtc1snRnVua3Rpb25zQXR0cmlidXRlJ107ICRwcmVjaXNpb24gPSAoaXNzZXQoJGZ1bmNBdHRyaWJ1dGVzW1xGS1RfQVRUUklCVVRfR1JVTkRQUkVJU0dFTkFVSUdLRUlUXSkgJiYgKGludCkkZnVuY0F0dHJpYnV0ZXNbXEZLVF9BVFRSSUJVVF9HUlVORFBSRUlTR0VOQVVJR0tFSVRdID4gMCkgPyAoaW50KSRmdW5jQXR0cmlidXRlc1tcRktUX0FUVFJJQlVUX0dSVU5EUFJFSVNHRU5BVUlHS0VJVF0gOiAyOyBpZiAoKGludCkkcGFyYW1zWyduTmV0dG9QcmVpc2UnXSA9PT0gMSkgeyAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQgPSBQcmVpc2U6OmdldExvY2FsaXplZFByaWNlU3RyaW5nKCRmQXVmcHJlaXNOZXR0byk7ICRzdXJjaGFyZ2UtPmNQcmVpc0lua2xBdWZwcmVpcyA9IFByZWlzZTo6Z2V0TG9jYWxpemVkUHJpY2VTdHJpbmcoJGZBdWZwcmVpc05ldHRvICsgJGZWS05ldHRvKTsgJHN1cmNoYXJnZS0+Y0F1ZnByZWlzTG9jYWxpemVkID0gKCRmQXVmcHJlaXNOZXR0byA+IDApID8gKCcrICcgLiAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQpIDogXHN0cl9yZXBsYWNlKCctJywgJy0gJywgJHN1cmNoYXJnZS0+Y0F1ZnByZWlzTG9jYWxpemVkKTsgaWYgKCRmVlBFV2VydCA+IDApIHsgJHN1cmNoYXJnZS0+Y1ByZWlzVlBFV2VydEF1ZnByZWlzID0gUHJlaXNlOjpnZXRMb2NhbGl6ZWRQcmljZVN0cmluZyggJGZBdWZwcmVpc05ldHRvIC8gJGZWUEVXZXJ0LCBGcm9udGVuZDo6Z2V0Q3VycmVuY3koKS0+Z2V0Q29kZSgpLCB0cnVlLCAkcHJlY2lzaW9uICkgLiAnICcgLiBTaG9wOjpMYW5nKCktPmdldCgndnBlUGVyJykgLiAnICcgLiAkY1ZQRUVpbmhlaXQ7ICRzdXJjaGFyZ2UtPmNQcmVpc1ZQRVdlcnRJbmtsQXVmcHJlaXMgPSBQcmVpc2U6OmdldExvY2FsaXplZFByaWNlU3RyaW5nKCAoJGZBdWZwcmVpc05ldHRvICsgJGZWS05ldHRvKSAvICRmVlBFV2VydCwgRnJvbnRlbmQ6OmdldEN1cnJlbmN5KCktPmdldENvZGUoKSwgdHJ1ZSwgJHByZWNpc2lvbiApIC4gJyAnIC4gU2hvcDo6TGFuZygpLT5nZXQoJ3ZwZVBlcicpIC4gJyAnIC4gJGNWUEVFaW5oZWl0OyAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQgLj0gJywgJyAuICRzdXJjaGFyZ2UtPmNQcmVpc1ZQRVdlcnRBdWZwcmVpczsgJHN1cmNoYXJnZS0+Y1ByZWlzSW5rbEF1ZnByZWlzIC49ICcsICcgLiAkc3VyY2hhcmdlLT5jUHJlaXNWUEVXZXJ0SW5rbEF1ZnByZWlzOyB9IH0gZWxzZSB7ICRzdXJjaGFyZ2UtPmNBdWZwcmVpc0xvY2FsaXplZCA9IFByZWlzZTo6Z2V0TG9jYWxpemVkUHJpY2VTdHJpbmcoIFRheDo6Z2V0R3Jvc3MoJGZBdWZwcmVpc05ldHRvLCAkX1NFU1NJT05bJ1N0ZXVlcnNhdHonXVska1N0ZXVlcmtsYXNzZV0sIDQpICk7ICRzdXJjaGFyZ2UtPmNQcmVpc0lua2xBdWZwcmVpcyA9IFByZWlzZTo6Z2V0TG9jYWxpemVkUHJpY2VTdHJpbmcoIFRheDo6Z2V0R3Jvc3MoJGZBdWZwcmVpc05ldHRvICsgJGZWS05ldHRvLCAkX1NFU1NJT05bJ1N0ZXVlcnNhdHonXVska1N0ZXVlcmtsYXNzZV0sIDQpICk7ICRzdXJjaGFyZ2UtPmNBdWZwcmVpc0xvY2FsaXplZCA9ICgkZkF1ZnByZWlzTmV0dG8gPiAwKSA/ICgnKyAnIC4gJHN1cmNoYXJnZS0+Y0F1ZnByZWlzTG9jYWxpemVkKSA6IFxzdHJfcmVwbGFjZSgnLScsICctICcsICRzdXJjaGFyZ2UtPmNBdWZwcmVpc0xvY2FsaXplZCk7IGlmICgkZlZQRVdlcnQgPiAwKSB7ICRzdXJjaGFyZ2UtPmNQcmVpc1ZQRVdlcnRBdWZwcmVpcyA9IFByZWlzZTo6Z2V0TG9jYWxpemVkUHJpY2VTdHJpbmcoIFRheDo6Z2V0R3Jvc3MoJGZBdWZwcmVpc05ldHRvIC8gJGZWUEVXZXJ0LCAkX1NFU1NJT05bJ1N0ZXVlcnNhdHonXVska1N0ZXVlcmtsYXNzZV0pLCBGcm9udGVuZDo6Z2V0Q3VycmVuY3koKS0+Z2V0Q29kZSgpLCB0cnVlLCAkcHJlY2lzaW9uICkgLiAnICcgLiBTaG9wOjpMYW5nKCktPmdldCgndnBlUGVyJykgLiAnICcgLiAkY1ZQRUVpbmhlaXQ7ICRzdXJjaGFyZ2UtPmNQcmVpc1ZQRVdlcnRJbmtsQXVmcHJlaXMgPSBQcmVpc2U6OmdldExvY2FsaXplZFByaWNlU3RyaW5nKCBUYXg6OmdldEdyb3NzKCAoJGZBdWZwcmVpc05ldHRvICsgJGZWS05ldHRvKSAvICRmVlBFV2VydCwgJF9TRVNTSU9OWydTdGV1ZXJzYXR6J11bJGtTdGV1ZXJrbGFzc2VdICksIEZyb250ZW5kOjpnZXRDdXJyZW5jeSgpLT5nZXRDb2RlKCksIHRydWUsICRwcmVjaXNpb24gKSAuICcgJyAuIFNob3A6OkxhbmcoKS0+Z2V0KCd2cGVQZXInKSAuICcgJyAuICRjVlBFRWluaGVpdDsgJHN1cmNoYXJnZS0+Y0F1ZnByZWlzTG9jYWxpemVkIC49ICcsICcgLiAkc3VyY2hhcmdlLT5jUHJlaXNWUEVXZXJ0QXVmcHJlaXM7ICRzdXJjaGFyZ2UtPmNQcmVpc0lua2xBdWZwcmVpcyAuPSAnLCAnIC4gJHN1cmNoYXJnZS0+Y1ByZWlzVlBFV2VydElua2xBdWZwcmVpczsgfSB9IH0gcmV0dXJuIChpc3NldCgkcGFyYW1zWydiQXVmcHJlaXNlJ10pICYmIChpbnQpJHBhcmFtc1snYkF1ZnByZWlzZSddID4gMCkgPyAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQgOiAkc3VyY2hhcmdlLT5jUHJlaXNJbmtsQXVmcHJlaXM7IH0gcHVibGljIGZ1bmN0aW9uIGdldExvY2FsaXplZFByaWNlKCRwYXJhbXMsICRzbWFydHkpIHsgaWYoISR0aGlzLT5zaG9wSXNBdExlYXN0NTIpIHsgcmV0dXJuICR0aGlzLT5nZXRMb2NhbGl6ZWRQcmljZUxlZ2FjeSgkcGFyYW1zLCAkc21hcnR5KTsgfSAkc3VyY2hhcmdlID0gbmV3IFxzdGRDbGFzcygpOyAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQgPSAnJzsgJHN1cmNoYXJnZS0+Y1ByZWlzSW5rbEF1ZnByZWlzID0gJyc7IGlmICgoZmxvYXQpJHBhcmFtc1snZkF1ZnByZWlzTmV0dG8nXSAhPSAwKSB7ICRjdXJyZW5jeSA9IEZyb250ZW5kOjpnZXRDdXJyZW5jeSgpOyAkbmV0U3VyY2hhcmdlID0gKGZsb2F0KSRwYXJhbXNbJ2ZBdWZwcmVpc05ldHRvJ107ICRmVktOZXR0byA9IChmbG9hdCkkcGFyYW1zWydmVktOZXR0byddOyAka1N0ZXVlcmtsYXNzZSA9IChpbnQpJHBhcmFtc1sna1N0ZXVlcmtsYXNzZSddOyAkZlZQRVdlcnQgPSAoZmxvYXQpJHBhcmFtc1snZlZQRVdlcnQnXTsgJGNWUEVFaW5oZWl0ID0gJHBhcmFtc1snY1ZQRUVpbmhlaXQnXTsgJGZ1bmNBdHRyaWJ1dGVzID0gJHBhcmFtc1snRnVua3Rpb25zQXR0cmlidXRlJ107ICRwcmVjaXNpb24gPSAoaXNzZXQoJGZ1bmNBdHRyaWJ1dGVzW1xGS1RfQVRUUklCVVRfR1JVTkRQUkVJU0dFTkFVSUdLRUlUXSkgJiYgKGludCkkZnVuY0F0dHJpYnV0ZXNbXEZLVF9BVFRSSUJVVF9HUlVORFBSRUlTR0VOQVVJR0tFSVRdID4gMCkgPyAoaW50KSRmdW5jQXR0cmlidXRlc1tcRktUX0FUVFJJQlVUX0dSVU5EUFJFSVNHRU5BVUlHS0VJVF0gOiAyOyBpZiAoKGludCkkcGFyYW1zWyduTmV0dG9QcmVpc2UnXSA9PT0gMSkgeyAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQgPSBQcmVpc2U6OmdldExvY2FsaXplZFByaWNlU3RyaW5nKCRuZXRTdXJjaGFyZ2UsICRjdXJyZW5jeSk7ICRzdXJjaGFyZ2UtPmNQcmVpc0lua2xBdWZwcmVpcyA9IFByZWlzZTo6Z2V0TG9jYWxpemVkUHJpY2VTdHJpbmcoJG5ldFN1cmNoYXJnZSArICRmVktOZXR0bywgJGN1cnJlbmN5KTsgJHN1cmNoYXJnZS0+Y0F1ZnByZWlzTG9jYWxpemVkID0gKCRuZXRTdXJjaGFyZ2UgPiAwKSA/ICgnKyAnIC4gJHN1cmNoYXJnZS0+Y0F1ZnByZWlzTG9jYWxpemVkKSA6IFxzdHJfcmVwbGFjZSgnLScsICctICcsICRzdXJjaGFyZ2UtPmNBdWZwcmVpc0xvY2FsaXplZCk7IGlmICgkZlZQRVdlcnQgPiAwKSB7ICRzdXJjaGFyZ2UtPmNQcmVpc1ZQRVdlcnRBdWZwcmVpcyA9IFByZWlzZTo6Z2V0TG9jYWxpemVkUHJpY2VTdHJpbmcoICRuZXRTdXJjaGFyZ2UgLyAkZlZQRVdlcnQsICRjdXJyZW5jeSwgdHJ1ZSwgJHByZWNpc2lvbiApIC4gJyAnIC4gU2hvcDo6TGFuZygpLT5nZXQoJ3ZwZVBlcicpIC4gJyAnIC4gJGNWUEVFaW5oZWl0OyAkc3VyY2hhcmdlLT5jUHJlaXNWUEVXZXJ0SW5rbEF1ZnByZWlzID0gUHJlaXNlOjpnZXRMb2NhbGl6ZWRQcmljZVN0cmluZyggKCRuZXRTdXJjaGFyZ2UgKyAkZlZLTmV0dG8pIC8gJGZWUEVXZXJ0LCAkY3VycmVuY3ksIHRydWUsICRwcmVjaXNpb24gKSAuICcgJyAuIFNob3A6OkxhbmcoKS0+Z2V0KCd2cGVQZXInKSAuICcgJyAuICRjVlBFRWluaGVpdDsgJHN1cmNoYXJnZS0+Y0F1ZnByZWlzTG9jYWxpemVkIC49ICcsICcgLiAkc3VyY2hhcmdlLT5jUHJlaXNWUEVXZXJ0QXVmcHJlaXM7ICRzdXJjaGFyZ2UtPmNQcmVpc0lua2xBdWZwcmVpcyAuPSAnLCAnIC4gJHN1cmNoYXJnZS0+Y1ByZWlzVlBFV2VydElua2xBdWZwcmVpczsgfSB9IGVsc2UgeyAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQgPSBQcmVpc2U6OmdldExvY2FsaXplZFByaWNlU3RyaW5nKCBUYXg6OmdldEdyb3NzKCRuZXRTdXJjaGFyZ2UsICRfU0VTU0lPTlsnU3RldWVyc2F0eiddWyRrU3RldWVya2xhc3NlXSwgNCksICRjdXJyZW5jeSApOyAkc3VyY2hhcmdlLT5jUHJlaXNJbmtsQXVmcHJlaXMgPSBQcmVpc2U6OmdldExvY2FsaXplZFByaWNlU3RyaW5nKCBUYXg6OmdldEdyb3NzKCRuZXRTdXJjaGFyZ2UgKyAkZlZLTmV0dG8sICRfU0VTU0lPTlsnU3RldWVyc2F0eiddWyRrU3RldWVya2xhc3NlXSwgNCksICRjdXJyZW5jeSApOyAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQgPSAoJG5ldFN1cmNoYXJnZSA+IDApID8gKCcrICcgLiAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQpIDogXHN0cl9yZXBsYWNlKCctJywgJy0gJywgJHN1cmNoYXJnZS0+Y0F1ZnByZWlzTG9jYWxpemVkKTsgaWYgKCRmVlBFV2VydCA+IDApIHsgJHN1cmNoYXJnZS0+Y1ByZWlzVlBFV2VydEF1ZnByZWlzID0gUHJlaXNlOjpnZXRMb2NhbGl6ZWRQcmljZVN0cmluZyggVGF4OjpnZXRHcm9zcygkbmV0U3VyY2hhcmdlIC8gJGZWUEVXZXJ0LCAkX1NFU1NJT05bJ1N0ZXVlcnNhdHonXVska1N0ZXVlcmtsYXNzZV0pLCAkY3VycmVuY3ksIHRydWUsICRwcmVjaXNpb24gKSAuICcgJyAuIFNob3A6OkxhbmcoKS0+Z2V0KCd2cGVQZXInKSAuICcgJyAuICRjVlBFRWluaGVpdDsgJHN1cmNoYXJnZS0+Y1ByZWlzVlBFV2VydElua2xBdWZwcmVpcyA9IFByZWlzZTo6Z2V0TG9jYWxpemVkUHJpY2VTdHJpbmcoIFRheDo6Z2V0R3Jvc3MoICgkbmV0U3VyY2hhcmdlICsgJGZWS05ldHRvKSAvICRmVlBFV2VydCwgJF9TRVNTSU9OWydTdGV1ZXJzYXR6J11bJGtTdGV1ZXJrbGFzc2VdICksICRjdXJyZW5jeSwgdHJ1ZSwgJHByZWNpc2lvbiApIC4gJyAnIC4gU2hvcDo6TGFuZygpLT5nZXQoJ3ZwZVBlcicpIC4gJyAnIC4gJGNWUEVFaW5oZWl0OyAkc3VyY2hhcmdlLT5jQXVmcHJlaXNMb2NhbGl6ZWQgLj0gJywgJyAuICRzdXJjaGFyZ2UtPmNQcmVpc1ZQRVdlcnRBdWZwcmVpczsgJHN1cmNoYXJnZS0+Y1ByZWlzSW5rbEF1ZnByZWlzIC49ICcsICcgLiAkc3VyY2hhcmdlLT5jUHJlaXNWUEVXZXJ0SW5rbEF1ZnByZWlzOyB9IH0gfSByZXR1cm4gKGlzc2V0KCRwYXJhbXNbJ2JBdWZwcmVpc2UnXSkgJiYgKGludCkkcGFyYW1zWydiQXVmcHJlaXNlJ10gPiAwKSA/ICRzdXJjaGFyZ2UtPmNBdWZwcmVpc0xvY2FsaXplZCA6ICRzdXJjaGFyZ2UtPmNQcmVpc0lua2xBdWZwcmVpczsgfSBwcml2YXRlIGZ1bmN0aW9uIGdldENoZWNrYm94ZXMoaW50ICRsb2NhdGlvbiwgaW50ICRsYW5ndWFnZUlEKTogYXJyYXkgeyAkY2lkID0gJ2NiXycgLiAkbG9jYXRpb24gLiAnXycgLiAkbGFuZ3VhZ2VJRDsgJGNoZWNrQm94ZXMgPSBTaG9wOjpoYXMoJGNpZCkgPyBTaG9wOjpnZXQoJGNpZCkgOiAobmV3IENoZWNrQm94KDAsICR0aGlzLT5kYikpLT5nZXRDaGVja0JveEZyb250ZW5kKCRsb2NhdGlvbiwgMCwgdHJ1ZSwgdHJ1ZSk7IFNob3A6OnNldCgkY2lkLCAkY2hlY2tCb3hlcyk7IHJldHVybiAkY2hlY2tCb3hlczsgfSBwdWJsaWMgZnVuY3Rpb24gaGFzQ2hlY2tCb3hGb3JMb2NhdGlvbigkcGFyYW1zLCAkc21hcnR5KTogdm9pZCB7IGlmKCR0aGlzLT5zaG9wSXNBdExlYXN0NTIpIHsgJHNtYXJ0eS0+YXNzaWduKCAkcGFyYW1zWydiUmV0dXJuJ10sIFxjb3VudCgkdGhpcy0+Z2V0Q2hlY2tib3hlcygoaW50KSRwYXJhbXNbJ25BbnplaWdlT3J0J10sIFNob3A6OmdldExhbmd1YWdlSUQoKSkpID4gMCApOyB9IGVsc2UgeyAkc21hcnR5LT5hc3NpZ24oICRwYXJhbXNbJ2JSZXR1cm4nXSwgXGNvdW50KChuZXcgQ2hlY2tCb3goKSktPmdldENoZWNrQm94RnJvbnRlbmQoKGludCkkcGFyYW1zWyduQW56ZWlnZU9ydCddLCAwLCB0cnVlLCB0cnVlKSkgPiAwICk7IH0gfSBwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hlY2tCb3hGb3JMb2NhdGlvbigkcGFyYW1zLCAkc21hcnR5KTogdm9pZCB7IGlmKCR0aGlzLT5zaG9wSXNBdExlYXN0NTIpIHsgJGxhbmdJRCA9IFNob3A6OmdldExhbmd1YWdlSUQoKTsgJGNoZWNrYm94ZXMgPSAkdGhpcy0+Z2V0Q2hlY2tib3hlcygoaW50KSRwYXJhbXNbJ25BbnplaWdlT3J0J10sICRsYW5nSUQpOyBmb3JlYWNoICgkY2hlY2tib3hlcyBhcyAkY2hlY2tib3gpIHsgJHVybCA9ICRjaGVja2JveC0+a0xpbmsgPiAwID8gJGNoZWNrYm94LT5nZXRMaW5rKCktPmdldFVSTCgpIDogJyc7ICRlcnJvciA9IGlzc2V0KCRwYXJhbXNbJ2NQbGF1c2lfYXJyJ11bJGNoZWNrYm94LT5jSURdKTsgJGNoZWNrYm94LT5pc0FjdGl2ZSA9IGlzc2V0KCRwYXJhbXNbJ2NQb3N0X2FyciddWyRjaGVja2JveC0+Y0lEXSk7ICRjaGVja2JveC0+Y05hbWUgPSAkY2hlY2tib3gtPm9DaGVja0JveFNwcmFjaGVfYXJyWyRsYW5nSURdLT5jVGV4dCA/PyAnJzsgJGNoZWNrYm94LT5jTGlua1VSTCA9ICR1cmw7ICRjaGVja2JveC0+Y0xpbmtVUkxGdWxsID0gJHVybDsgJGNoZWNrYm94LT5jQmVzY2hyZWlidW5nID0gIWVtcHR5KCRjaGVja2JveC0+b0NoZWNrQm94U3ByYWNoZV9hcnJbJGxhbmdJRF0tPmNCZXNjaHJlaWJ1bmcpID8gJGNoZWNrYm94LT5vQ2hlY2tCb3hTcHJhY2hlX2FyclskbGFuZ0lEXS0+Y0Jlc2NocmVpYnVuZyA6ICcnOyAkY2hlY2tib3gtPmNFcnJvcm1zZyA9ICRlcnJvciA/IFNob3A6OkxhbmcoKS0+Z2V0KCdwbGVhc3lBY2NlcHQnLCAnYWNjb3VudCBkYXRhJykgOiAnJzsgfSBpZiAoaXNzZXQoJHBhcmFtc1snYXNzaWduJ10pKSB7ICRzbWFydHktPmFzc2lnbigkcGFyYW1zWydhc3NpZ24nXSwgJGNoZWNrYm94ZXMpOyB9IH0gZWxzZSB7ICRsYW5nSUQgPSBTaG9wOjpnZXRMYW5ndWFnZUlEKCk7ICRjaWQgPSAnY2JfJyAuIChpbnQpJHBhcmFtc1snbkFuemVpZ2VPcnQnXSAuICdfJyAuICRsYW5nSUQ7ICRjaGVja0JveGVzID0gU2hvcDo6aGFzKCRjaWQpID8gU2hvcDo6Z2V0KCRjaWQpIDogKG5ldyBDaGVja0JveCgpKS0+Z2V0Q2hlY2tCb3hGcm9udGVuZCgoaW50KSRwYXJhbXNbJ25BbnplaWdlT3J0J10sIDAsIHRydWUsIHRydWUpOyBpZiAoXGNvdW50KCRjaGVja0JveGVzKSA+IDApIHsgZm9yZWFjaCAoJGNoZWNrQm94ZXMgYXMgJGNoZWNrQm94KSB7ICR1cmwgPSAkY2hlY2tCb3gtPmtMaW5rID4gMCA/ICRjaGVja0JveC0+Z2V0TGluaygpLT5nZXRVUkwoKSA6ICcnOyAkZXJyb3IgPSBpc3NldCgkcGFyYW1zWydjUGxhdXNpX2FyciddWyRjaGVja0JveC0+Y0lEXSk7ICRjaGVja0JveC0+aXNBY3RpdmUgPSBpc3NldCgkcGFyYW1zWydjUG9zdF9hcnInXVskY2hlY2tCb3gtPmNJRF0pOyAkY2hlY2tCb3gtPmNOYW1lID0gJGNoZWNrQm94LT5vQ2hlY2tCb3hTcHJhY2hlX2FyclskbGFuZ0lEXS0+Y1RleHQgPz8gJyc7ICRjaGVja0JveC0+Y0xpbmtVUkwgPSAkdXJsOyAkY2hlY2tCb3gtPmNMaW5rVVJMRnVsbCA9ICR1cmw7ICRjaGVja0JveC0+Y0Jlc2NocmVpYnVuZyA9ICFlbXB0eSgkY2hlY2tCb3gtPm9DaGVja0JveFNwcmFjaGVfYXJyWyRsYW5nSURdLT5jQmVzY2hyZWlidW5nKSA/ICRjaGVja0JveC0+b0NoZWNrQm94U3ByYWNoZV9hcnJbJGxhbmdJRF0tPmNCZXNjaHJlaWJ1bmcgOiAnJzsgJGNoZWNrQm94LT5jRXJyb3Jtc2cgPSAkZXJyb3IgPyBTaG9wOjpMYW5nKCktPmdldCgncGxlYXN5QWNjZXB0JywgJ2FjY291bnQgZGF0YScpIDogJyc7IH0gU2hvcDo6c2V0KCRjaWQsICRjaGVja0JveGVzKTsgaWYgKGlzc2V0KCRwYXJhbXNbJ2Fzc2lnbiddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICRjaGVja0JveGVzKTsgfSB9IH0gfSBwdWJsaWMgZnVuY3Rpb24gYWFVUkxFbmNvZGUoJHBhcmFtcyk6IHN0cmluZyB7ICRyZXNldCA9IChpc3NldCgkcGFyYW1zWyduUmVzZXQnXSkgJiYgKGludCkkcGFyYW1zWyduUmVzZXQnXSA9PT0gMSk7ICR1cmwgPSAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsgJHBhcmFtcyA9IFsnJmFhUGFyYW1zJywgJz9hYVBhcmFtcycsICcmYWFSZXNldCcsICc/YWFSZXNldCddOyAkZXhpc3RzID0gZmFsc2U7IGZvcmVhY2ggKCRwYXJhbXMgYXMgJHBhcmFtKSB7ICRleGlzdHMgPSBcc3RycG9zKCR1cmwsICRwYXJhbSk7IGlmICgkZXhpc3RzICE9PSBmYWxzZSkgeyAkdXJsID0gXHN1YnN0cigkdXJsLCAwLCAkZXhpc3RzKTsgYnJlYWs7IH0gJGV4aXN0cyA9IGZhbHNlOyB9IGlmICgkZXhpc3RzICE9PSBmYWxzZSkgeyAkdXJsID0gXHN1YnN0cigkdXJsLCAwLCAkZXhpc3RzKTsgfSBpZiAoaXNzZXQoJHBhcmFtc1snYlVybE9ubHknXSkgJiYgKGludCkkcGFyYW1zWydiVXJsT25seSddID09PSAxKSB7IHJldHVybiAkdXJsOyB9ICRwYXJhbVN0cmluZyA9ICcnOyB1bnNldCgkcGFyYW1zWyduUmVzZXQnXSk7IGlmIChcaXNfYXJyYXkoJHBhcmFtcykgJiYgXGNvdW50KCRwYXJhbXMpID4gMCkgeyBmb3JlYWNoICgkcGFyYW1zIGFzICRrZXkgPT4gJHBhcmFtKSB7ICRwYXJhbVN0cmluZyAuPSAka2V5IC4gJz0nIC4gJHBhcmFtIC4gJzsnOyB9IH0gJHNlcCA9IChcc3RycG9zKCR1cmwsICc/JykgPT09IGZhbHNlKSA/ICc/JyA6ICcmJzsgcmV0dXJuICR1cmwgLiAkc2VwIC4gKCRyZXNldCA/ICdhYVJlc2V0PScgOiAnYWFQYXJhbXM9JykgLiBcYmFzZTY0X2VuY29kZSgkcGFyYW1TdHJpbmcpOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXROYXZpZ2F0aW9uKCRwYXJhbXMsICRzbWFydHkpOiB2b2lkIHsgaWYgKCFpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgcmV0dXJuOyB9ICRpZGVudGlmaWVyID0gJHBhcmFtc1snbGlua2dyb3VwSWRlbnRpZmllciddOyAkbGlua0dyb3VwID0gbnVsbDsgaWYgKFxzdHJsZW4oJGlkZW50aWZpZXIpID4gMCkgeyAkbGlua0dyb3VwcyA9IFNob3A6OkNvbnRhaW5lcigpLT5nZXRMaW5rU2VydmljZSgpLT5nZXRWaXNpYmxlTGlua0dyb3VwcygpOyAkbGlua0dyb3VwID0gJGxpbmtHcm91cHMtPmdldExpbmtncm91cEJ5VGVtcGxhdGUoJGlkZW50aWZpZXIpOyB9IGlmICgkbGlua0dyb3VwICE9PSBudWxsICYmICRsaW5rR3JvdXAtPmlzQXZhaWxhYmxlSW5MYW5ndWFnZShTaG9wOjpnZXRMYW5ndWFnZUlEKCkpKSB7ICRzbWFydHktPmFzc2lnbigkcGFyYW1zWydhc3NpZ24nXSwgJHRoaXMtPmJ1aWxkTmF2aWdhdGlvblN1YnMoJGxpbmtHcm91cCkpOyB9IH0gcHVibGljIGZ1bmN0aW9uIGJ1aWxkTmF2aWdhdGlvblN1YnMoTGlua0dyb3VwSW50ZXJmYWNlICRsaW5rR3JvdXAsICRwYXJlbnRJRCA9IDApOiBDb2xsZWN0aW9uIHsgJHBhcmVudElEID0gKGludCkkcGFyZW50SUQ7ICRsaW5rcyA9IG5ldyBDb2xsZWN0aW9uKCk7IGlmICgkbGlua0dyb3VwLT5nZXRUZW1wbGF0ZSgpID09PSAnaGlkZGVuJyB8fCAkbGlua0dyb3VwLT5nZXROYW1lKCkgPT09ICdoaWRkZW4nKSB7IHJldHVybiAkbGlua3M7IH0gZm9yZWFjaCAoJGxpbmtHcm91cC0+Z2V0TGlua3MoKSBhcyAkbGluaykgeyBpZiAoJGxpbmstPmdldFBhcmVudCgpICE9PSAkcGFyZW50SUQpIHsgY29udGludWU7IH0gJGxpbmstPnNldENoaWxkTGlua3MoJHRoaXMtPmJ1aWxkTmF2aWdhdGlvblN1YnMoJGxpbmtHcm91cCwgJGxpbmstPmdldElEKCkpKTsgJGxpbmstPnNldElzQWN0aXZlKCRsaW5rLT5nZXRJc0FjdGl2ZSgpIHx8IChTaG9wOjoka0xpbmsgPiAwICYmIFNob3A6OiRrTGluayA9PT0gJGxpbmstPmdldElEKCkpKTsgJGxpbmtzLT5wdXNoKCRsaW5rKTsgfSByZXR1cm4gJGxpbmtzOyB9IHB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlSW1hZ2VEZXRhaWxzKCRwYXJhbXMpIHsgaWYgKCFpc3NldCgkcGFyYW1zWydpdGVtJ10pKSB7IHJldHVybiBudWxsOyB9ICRyZXN1bHQgPSBbICd4cycgPT4gJHRoaXMtPmdldEltYWdlU2l6ZSgkcGFyYW1zWydpdGVtJ10tPmNQZmFkTWluaSksICdzbScgPT4gJHRoaXMtPmdldEltYWdlU2l6ZSgkcGFyYW1zWydpdGVtJ10tPmNQZmFkS2xlaW4pLCAnbWQnID0+ICR0aGlzLT5nZXRJbWFnZVNpemUoJHBhcmFtc1snaXRlbSddLT5jUGZhZE5vcm1hbCksICdsZycgPT4gJHRoaXMtPmdldEltYWdlU2l6ZSgkcGFyYW1zWydpdGVtJ10tPmNQZmFkR3Jvc3MpIF07IGlmIChpc3NldCgkcGFyYW1zWyd0eXBlJ10pKSB7ICR0eXBlID0gJHBhcmFtc1sndHlwZSddOyBpZiAoaXNzZXQoJHJlc3VsdFskdHlwZV0pKSB7ICRyZXN1bHQgPSAkcmVzdWx0WyR0eXBlXTsgfSB9ICRpbWFnZUJhc2VVUkwgPSBTaG9wOjpnZXRJbWFnZUJhc2VVUkwoKTsgZm9yZWFjaCAoJHJlc3VsdCBhcyAkc2l6ZSA9PiAkZGF0YSkgeyBpZiAoaXNzZXQoJGRhdGEtPnNyYykgJiYgXHN0cnBvcygkZGF0YS0+c3JjLCAnaHR0cCcpICE9PSAwKSB7ICRkYXRhLT5zcmMgPSAkaW1hZ2VCYXNlVVJMIC4gJGRhdGEtPnNyYzsgfSB9ICRyZXN1bHQgPSAob2JqZWN0KSRyZXN1bHQ7IHJldHVybiAoaXNzZXQoJHBhcmFtc1snanNvbiddKSAmJiAkcGFyYW1zWydqc29uJ10pID8gXGpzb25fZW5jb2RlKCRyZXN1bHQsIFxKU09OX0ZPUkNFX09CSkVDVCkgOiAkcmVzdWx0OyB9IHB1YmxpYyBmdW5jdGlvbiBnZXRJbWFnZVNpemUoJGltYWdlKSB7ICRwYXRoID0gKCRpbWFnZSAhPT0gbnVsbCAmJiBcc3RycG9zKCRpbWFnZSwgXFBGQURfQklMREVSKSA9PT0gMCkgPyBQRkFEX1JPT1QgLiAkaW1hZ2UgOiAkaW1hZ2U7IGlmICgkcGF0aCAhPT0gbnVsbCAmJiBcZmlsZV9leGlzdHMoJHBhdGgpKSB7IFskd2lkdGgsICRoZWlnaHQsICR0eXBlXSA9IFxnZXRpbWFnZXNpemUoJHBhdGgpOyB9IGVsc2UgeyBpZigkcGF0aCA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfSAkcmVxID0gUHJvZHVjdDo6dG9SZXF1ZXN0KCRwYXRoKTsgaWYgKCFcaXNfb2JqZWN0KCRyZXEpKSB7IHJldHVybiBudWxsOyB9ICRzZXR0aW5ncyA9IEltYWdlOjpnZXRTZXR0aW5ncygpOyAkcmVmSW1hZ2UgPSAkcmVxLT5nZXRSYXcoKTsgaWYgKCRyZWZJbWFnZSA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfSBbJHdpZHRoLCAkaGVpZ2h0LCAkdHlwZV0gPSBcZ2V0aW1hZ2VzaXplKCRyZWZJbWFnZSk7ICRzaXplID0gJHNldHRpbmdzWydzaXplJ11bJHJlcS0+Z2V0U2l6ZVR5cGUoKV07ICRtYXhfd2lkdGggPSAkc2l6ZVsnd2lkdGgnXTsgJG1heF9oZWlnaHQgPSAkc2l6ZVsnaGVpZ2h0J107ICRvbGRfd2lkdGggPSAkd2lkdGg7ICRvbGRfaGVpZ2h0ID0gJGhlaWdodDsgJHNjYWxlID0gXG1pbigkbWF4X3dpZHRoIC8gJG9sZF93aWR0aCwgJG1heF9oZWlnaHQgLyAkb2xkX2hlaWdodCk7ICR3aWR0aCA9IFxjZWlsKCRzY2FsZSAqICRvbGRfd2lkdGgpOyAkaGVpZ2h0ID0gXGNlaWwoJHNjYWxlICogJG9sZF9oZWlnaHQpOyB9IHJldHVybiAob2JqZWN0KVsgJ3NyYycgPT4gJGltYWdlLCAnc2l6ZScgPT4gKG9iamVjdClbICd3aWR0aCcgPT4gJHdpZHRoLCAnaGVpZ2h0JyA9PiAkaGVpZ2h0IF0sICd0eXBlJyA9PiAkdHlwZSBdOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXRDTVNDb250ZW50KCRwYXJhbXMsICRzbWFydHkpIHsgaWYgKGlzc2V0KCRwYXJhbXNbJ2tMaW5rJ10pICYmIChpbnQpJHBhcmFtc1sna0xpbmsnXSA+IDApIHsgJGxpbmtJRCA9IChpbnQpJHBhcmFtc1sna0xpbmsnXTsgJGxpbmsgPSBTaG9wOjpDb250YWluZXIoKS0+Z2V0TGlua1NlcnZpY2UoKS0+Z2V0TGlua0J5SUQoJGxpbmtJRCk7ICRjb250ZW50ID0gJGxpbmsgIT09IG51bGwgPyAkbGluay0+Z2V0Q29udGVudCgpIDogbnVsbDsgaWYgKGlzc2V0KCRwYXJhbXNbJ2Fzc2lnbiddKSkgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICRjb250ZW50KTsgfSBlbHNlIHsgcmV0dXJuICRjb250ZW50OyB9IH0gcmV0dXJuIG51bGw7IH0gcHVibGljIGZ1bmN0aW9uIGhhc09ubHlMaXN0YWJsZVZhcmlhdGlvbnMoJHBhcmFtcywgJHNtYXJ0eSkgeyBpZiAoIWlzc2V0KCRwYXJhbXNbJ2FydGlrZWwnXS0+VmFyaWF0aW9uZW4pKSB7IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAwKTsgcmV0dXJuIG51bGw7IH0gcmV0dXJuIDA7IH0gJG1heFZhcmlhdGlvbkNvdW50ID0gaXNzZXQoJHBhcmFtc1snbWF4VmFyaWF0aW9uQ291bnQnXSkgPyAoaW50KSRwYXJhbXNbJ21heFZhcmlhdGlvbkNvdW50J10gOiAxOyAkbWF4V2VydGVDb3VudCA9IGlzc2V0KCRwYXJhbXNbJ21heFdlcnRlQ291bnQnXSkgPyAoaW50KSRwYXJhbXNbJ21heFdlcnRlQ291bnQnXSA6IDM7ICR2YXJpYXRpb25DaGVjayA9IHN0YXRpYyBmdW5jdGlvbiAoJHZhcmlhdGlvbnMsICRtYXhWYXJpYXRpb25Db3VudCwgJG1heFZhbHVlQ291bnQpIHsgJHJlc3VsdCA9IHRydWU7ICR2YXJDb3VudCA9IFxpc19hcnJheSgkdmFyaWF0aW9ucykgPyBcY291bnQoJHZhcmlhdGlvbnMpIDogMDsgaWYgKCR2YXJDb3VudCA+IDAgJiYgJHZhckNvdW50IDw9ICRtYXhWYXJpYXRpb25Db3VudCkgeyBmb3JlYWNoICgkdmFyaWF0aW9ucyBhcyAkb1ZhcmlhdGlvbikgeyBpZiAoJG9WYXJpYXRpb24tPmNUeXAgIT09ICdTRUxFQ1RCT1gnICYmICghXGluX2FycmF5KCRvVmFyaWF0aW9uLT5jVHlwLCBbJ1RFWFRTV0FUQ0hFUycsICdJTUdTV0FUQ0hFUycsICdSQURJTyddLCB0cnVlKSB8fCBcY291bnQoJG9WYXJpYXRpb24tPldlcnRlKSA+ICRtYXhWYWx1ZUNvdW50KSkgeyAkcmVzdWx0ID0gZmFsc2U7IGJyZWFrOyB9IH0gfSBlbHNlIHsgJHJlc3VsdCA9IGZhbHNlOyB9IHJldHVybiAkcmVzdWx0OyB9OyAkcmVzdWx0ID0gJHZhcmlhdGlvbkNoZWNrKCRwYXJhbXNbJ2FydGlrZWwnXS0+VmFyaWF0aW9uZW4sICRtYXhWYXJpYXRpb25Db3VudCwgJG1heFdlcnRlQ291bnQpID8gMSA6IDA7IGlmICgkcmVzdWx0ID09PSAwICYmICRwYXJhbXNbJ2FydGlrZWwnXS0+a1ZhdGVyQXJ0aWtlbCA+IDApIHsgJHJlc3VsdCA9ICR2YXJpYXRpb25DaGVjaygkcGFyYW1zWydhcnRpa2VsJ10tPm9WYXJpYXRpb25lbk51cktpbmRfYXJyLCAkbWF4VmFyaWF0aW9uQ291bnQsICRtYXhXZXJ0ZUNvdW50KSA/IDIgOiAwOyB9IGlmIChpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkpIHsgJHNtYXJ0eS0+YXNzaWduKCRwYXJhbXNbJ2Fzc2lnbiddLCAkcmVzdWx0KTsgcmV0dXJuIG51bGw7IH0gcmV0dXJuICRyZXN1bHQ7IH0gcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKCRtaXhlZCwgJHRvID0gbnVsbCk6ID9zdHJpbmcgeyAkdG8gPSAkdG8gPzogU2hvcDo6Z2V0TGFuZ3VhZ2VDb2RlKCk7IGlmICgkdGhpcy0+aGFzVHJhbnNsYXRpb24oJG1peGVkLCAkdG8pKSB7IHJldHVybiBcaXNfc3RyaW5nKCRtaXhlZCkgPyAkbWl4ZWQgOiAkbWl4ZWRbJHRvXTsgfSByZXR1cm4gbnVsbDsgfSBwdWJsaWMgZnVuY3Rpb24gaGFzVHJhbnNsYXRpb24oJG1peGVkLCAkdG8gPSBudWxsKTogYm9vbCB7ICR0byA9ICR0byA/OiBTaG9wOjpnZXRMYW5ndWFnZUNvZGUoKTsgcmV0dXJuIFxpc19zdHJpbmcoJG1peGVkKSB8fCBpc3NldCgkbWl4ZWRbJHRvXSk7IH0gcHVibGljIGZ1bmN0aW9uIGNhcHRjaGFNYXJrdXAoJHBhcmFtcywgJHNtYXJ0eSk6IHN0cmluZyB7IGlmIChpc3NldCgkcGFyYW1zWydnZXRCb2R5J10pICYmICRwYXJhbXNbJ2dldEJvZHknXSkgeyByZXR1cm4gU2hvcDo6Q29udGFpbmVyKCktPmdldENhcHRjaGFTZXJ2aWNlKCktPmdldEJvZHlNYXJrdXAoJHNtYXJ0eSk7IH0gcmV0dXJuIFNob3A6OkNvbnRhaW5lcigpLT5nZXRDYXB0Y2hhU2VydmljZSgpLT5nZXRIZWFkTWFya3VwKCRzbWFydHkpOyB9IHB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0ZXMoJHBhcmFtcywgJHNtYXJ0eSkgeyAkcmVnaW9ucyA9IFN0YWF0OjpnZXRSZWdpb25zKCRwYXJhbXNbJ2NJc28nXSk7IGlmICghaXNzZXQoJHBhcmFtc1snYXNzaWduJ10pKSB7IHJldHVybiAkcmVnaW9uczsgfSAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sICRyZWdpb25zKTsgfSBwdWJsaWMgZnVuY3Rpb24gZ2V0RGVjaW1hbExlbmd0aCgkcGFyYW1zKTogaW50IHsgcmV0dXJuIFxtYXgoXHN0cmxlbihcc3RycmNocihcc3RyX3JlcGxhY2UoJywnLCAnLicsICRwYXJhbXNbJ3F1YW50aXR5J10pLCAnLicpKSAtIDEsIDApOyB9IHB1YmxpYyBmdW5jdGlvbiBzZW9meSgkb3B0U3RyID0gJycpOiBzdHJpbmcgeyByZXR1cm4gXHN0cl9yZXBsYWNlKCcvJywgJy0nLCBTZW86OnNhbml0aXplU2VvU2x1Zygkb3B0U3RyKSk7IH0gcHVibGljIGZ1bmN0aW9uIGdldFVwbG9hZGVyTGFuZygkcGFyYW1zLCAkc21hcnR5KTogdm9pZCB7ICRhdmFpbGFibGVMb2NhbGVzID0gWyAnYXInLCAnYXonLCAnYmcnLCAnY2EnLCAnY3InLCAnY3MnLCAnZGEnLCAnZGUnLCAnZWwnLCAnZXMnLCAnZXQnLCAnZmEnLCAnZmknLCAnZnInLCAnZ2wnLCAnaGUnLCAnaHUnLCAnaWQnLCAnaXQnLCAnamEnLCAna2EnLCAna3InLCAna3onLCAnbHQnLCAnbmwnLCAnbm8nLCAncGwnLCAncHQnLCAncm8nLCAncnUnLCAnc2snLCAnc2wnLCAnc3YnLCAndGgnLCAndHInLCAndWsnLCAndXonLCAndmknLCAnemgnIF07ICRzbWFydHktPmFzc2lnbigkcGFyYW1zWydhc3NpZ24nXSwgXGluX2FycmF5KCRwYXJhbXNbJ2lzbyddLCAkYXZhaWxhYmxlTG9jYWxlcywgdHJ1ZSkgPyAkcGFyYW1zWydpc28nXSA6ICdMQU5HJyk7IH0gcHVibGljIGZ1bmN0aW9uIGdldENvdW50cnkoJHBhcmFtcywgJHNtYXJ0eSk6IHZvaWQgeyAkc21hcnR5LT5hc3NpZ24oJHBhcmFtc1snYXNzaWduJ10sIFNob3A6OkNvbnRhaW5lcigpLT5nZXRDb3VudHJ5U2VydmljZSgpLT5nZXRDb3VudHJ5KCRwYXJhbXNbJ2lzbyddKSk7IH0gcHVibGljIGZ1bmN0aW9uIHNhbml0aXplVGl0bGUoJHBhcmFtcyk6IHN0cmluZyB7IHJldHVybiBcaHRtbHNwZWNpYWxjaGFycygkcGFyYW1zWyd0aXRsZSddLCBFTlRfQ09NUEFULCBKVExfQ0hBUlNFVCwgZmFsc2UpOyB9IHB1YmxpYyBmdW5jdGlvbiBmb3JtYXRGb3JNaWNyb2RhdGEoc3RyaW5nICRwcmljZSA9ICcnKTogc3RyaW5nIHsgJGN1cnJTZXAgPSBGcm9udGVuZDo6Z2V0Q3VycmVuY3koKS0+Z2V0RGVjaW1hbFNlcGFyYXRvcigpOyAkY3VyclRobyA9IEZyb250ZW5kOjpnZXRDdXJyZW5jeSgpLT5nZXRUaG91c2FuZHNTZXBhcmF0b3IoKTsgcmV0dXJuIFxzcHJpbnRmKCIlLjJmIiwgXHN0cl9yZXBsYWNlKCRjdXJyU2VwLCAnLicsIFxzdHJfcmVwbGFjZSgkY3VyclRobywgJycsICgkcHJpY2UpKSkpOyB9IH0g'));

Function Calls

base64_decode 1

Variables

None

Stats

MD5 38e50bb87b8b913cee9586fbf592d866
Eval Count 1
Decode Time 103 ms