(globalThis.blocksyJsonP=globalThis.blocksyJsonP||[]).push([[627],{627:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"handleClick\": () => (/* binding */ handleClick),\n \"mount\": () => (/* binding */ overlay_mount)\n});\n\n// EXTERNAL MODULE: ./node_modules/body-scroll-lock/lib/bodyScrollLock.min.js\nvar bodyScrollLock_min = __webpack_require__(891);\n;// CONCATENATED MODULE: ./static/js/frontend/lazy/overlay/no-bounce.js\n\nconst isIosDevice = typeof window !== 'undefined' && window.navigator && window.navigator.platform && (/iP(ad|hone|od)/.test(window.navigator.platform) || window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1);\nvar enable = function (el) {\n if (!isIosDevice) {\n document.body.style.overflow = '';\n document.body.style.removeProperty('--scrollbar-width');\n } else {\n (0,bodyScrollLock_min.clearAllBodyScrollLocks)();\n }\n};\nvar disable = function (el) {\n if (!isIosDevice) {\n let scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n if (scrollbarWidth > 0) {\n document.body.style.setProperty('--scrollbar-width', `${scrollbarWidth}px`);\n }\n\n document.body.style.overflow = 'hidden';\n } else {\n if (el) {\n (0,bodyScrollLock_min.disableBodyScroll)(el, {\n // reserveScrollBarGap: true,\n allowTouchMove: el => {\n if (el.closest('.select2-container')) {\n return true;\n }\n\n return false;\n }\n });\n }\n }\n};\n// EXTERNAL MODULE: external \"ctEvents\"\nvar external_ctEvents_ = __webpack_require__(601);\nvar external_ctEvents_default = /*#__PURE__*/__webpack_require__.n(external_ctEvents_);\n;// CONCATENATED MODULE: ./static/js/frontend/lazy/overlay/mobile-menu.js\nconst activateSubMenu = container => {\n const subMenu = container.querySelector('ul');\n requestAnimationFrame(() => {\n const actualHeight = subMenu.getBoundingClientRect().height;\n subMenu.style.height = '0px';\n subMenu.classList.add('is-animating');\n requestAnimationFrame(() => {\n subMenu.style.height = `${actualHeight}px`;\n whenTransitionEnds(subMenu, () => {\n subMenu.classList.remove('is-animating');\n subMenu.removeAttribute('style');\n });\n });\n });\n};\n\nconst deactivateSubMenu = (container, cb) => {\n const subMenu = container.querySelector('ul');\n requestAnimationFrame(() => {\n const actualHeight = subMenu.getBoundingClientRect().height;\n subMenu.style.height = `${actualHeight}px`;\n subMenu.classList.add('is-animating');\n requestAnimationFrame(() => {\n subMenu.style.height = '0px';\n whenTransitionEnds(subMenu, () => {\n subMenu.classList.remove('is-animating');\n subMenu.removeAttribute('style');\n cb();\n });\n });\n });\n};\n\nconst handleContainer = container => {\n if (!container) {\n return;\n }\n\n const arrow = container.querySelector('.ct-toggle-dropdown-mobile');\n\n if (container.classList.contains('dropdown-active')) {\n arrow.setAttribute('aria-expanded', 'false');\n arrow.setAttribute('aria-label', ct_localizations.expand_submenu);\n deactivateSubMenu(container, () => {\n container.classList.toggle('dropdown-active');\n [...container.querySelectorAll('.menu-item-has-children.dropdown-active, .page_item_has_children.dropdown-active')].map(el => el.classList.remove('dropdown-active'));\n });\n } else {\n arrow.setAttribute('aria-expanded', 'true');\n arrow.setAttribute('aria-label', ct_localizations.collapse_submenu);\n [...container.parentNode.children].map(el => el.classList.contains('dropdown-active') && handleContainer(el));\n container.classList.toggle('dropdown-active');\n activateSubMenu(container);\n }\n};\n\nconst mount = arrow => {\n if (arrow.hasListener) {\n return;\n }\n\n arrow.hasListener = true;\n let parentHref = arrow.previousElementSibling.getAttribute('href');\n\n if (!parentHref || parentHref === '#') {\n arrow.previousElementSibling.addEventListener('click', e => {\n e.preventDefault();\n e.stopPropagation();\n handleContainer(arrow.closest('.menu-item-has-children, .page_item_has_children'));\n });\n }\n\n arrow.addEventListener('click', e => {\n e.preventDefault();\n e.stopPropagation();\n handleContainer(arrow.closest('.menu-item-has-children, .page_item_has_children'));\n });\n};\n\nfunction whenTransitionEnds(el, cb) {\n const end = () => {\n el.removeEventListener('transitionend', onEnd);\n cb();\n };\n\n const onEnd = e => {\n if (e.target === el) {\n end();\n }\n };\n\n el.addEventListener('transitionend', onEnd);\n}\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/utils/array.js\nvar toArray = function toArray(a) {\n var ret = Array(a.length);\n for (var i = 0; i < a.length; ++i) {\n ret[i] = a[i];\n }\n return ret;\n};\n\nvar arrayFind = function arrayFind(array, search) {\n return array.filter(function (a) {\n return a === search;\n })[0];\n};\n\nvar asArray = function asArray(a) {\n return Array.isArray(a) ? a : [a];\n};\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/utils/tabOrder.js\n\n\nvar tabSort = function tabSort(a, b) {\n var tabDiff = a.tabIndex - b.tabIndex;\n var indexDiff = a.index - b.index;\n\n if (tabDiff) {\n if (!a.tabIndex) return 1;\n if (!b.tabIndex) return -1;\n }\n\n return tabDiff || indexDiff;\n};\n\nvar orderByTabIndex = function orderByTabIndex(nodes, filterNegative, keepGuards) {\n return toArray(nodes).map(function (node, index) {\n return {\n node: node,\n index: index,\n tabIndex: keepGuards && node.tabIndex === -1 ? (node.dataset || {}).focusGuard ? 0 : -1 : node.tabIndex\n };\n }).filter(function (data) {\n return !filterNegative || data.tabIndex >= 0;\n }).sort(tabSort);\n};\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/utils/tabbables.js\n/* harmony default export */ const tabbables = (['button:enabled:not([readonly])', 'select:enabled:not([readonly])', 'textarea:enabled:not([readonly])', 'input:enabled:not([readonly])', 'a[href]', 'area[href]', 'iframe', 'object', 'embed', '[tabindex]', '[contenteditable]', '[autofocus]']);\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/constants.js\nvar FOCUS_GROUP = 'data-focus-lock';\nvar FOCUS_DISABLED = 'data-focus-lock-disabled';\nvar FOCUS_ALLOW = 'data-no-focus-lock';\nvar FOCUS_AUTO = 'data-autofocus-inside';\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/utils/tabUtils.js\n\n\n\n\nvar queryTabbables = tabbables.join(',');\nvar queryGuardTabbables = queryTabbables + ', [data-focus-guard]';\n\nvar getFocusables = function getFocusables(parents, withGuards) {\n return parents.reduce(function (acc, parent) {\n return acc.concat(\n // add all tabbables inside\n toArray(parent.querySelectorAll(withGuards ? queryGuardTabbables : queryTabbables)),\n // add if node is tabble itself\n parent.parentNode ? toArray(parent.parentNode.querySelectorAll(tabbables.join(','))).filter(function (node) {\n return node === parent;\n }) : []);\n }, []);\n};\n\nvar getParentAutofocusables = function getParentAutofocusables(parent) {\n var parentFocus = parent.querySelectorAll('[' + FOCUS_AUTO + ']');\n return toArray(parentFocus).map(function (node) {\n return getFocusables([node]);\n }).reduce(function (acc, nodes) {\n return acc.concat(nodes);\n }, []);\n};\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/utils/DOMutils.js\n\n\n\n\nvar isElementHidden = function isElementHidden(computedStyle) {\n if (!computedStyle || !computedStyle.getPropertyValue) {\n return false;\n }\n return computedStyle.getPropertyValue('display') === 'none' || computedStyle.getPropertyValue('visibility') === 'hidden';\n};\n\nvar isVisible = function isVisible(node) {\n return !node || node === document || node.nodeType === Node.DOCUMENT_NODE || !isElementHidden(window.getComputedStyle(node, null)) && isVisible(node.parentNode);\n};\n\nvar notHiddenInput = function notHiddenInput(node) {\n return !((node.tagName === 'INPUT' || node.tagName === 'BUTTON') && (node.type === 'hidden' || node.disabled));\n};\n\nvar getParents = function getParents(node) {\n var parents = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n parents.push(node);\n if (node.parentNode) {\n getParents(node.parentNode, parents);\n }\n return parents;\n};\n\nvar getCommonParent = function getCommonParent(nodea, nodeb) {\n var parentsA = getParents(nodea);\n var parentsB = getParents(nodeb);\n\n for (var i = 0; i < parentsA.length; i += 1) {\n var currentParent = parentsA[i];\n if (parentsB.indexOf(currentParent) >= 0) {\n return currentParent;\n }\n }\n return false;\n};\n\nvar filterFocusable = function filterFocusable(nodes) {\n return toArray(nodes).filter(function (node) {\n return isVisible(node);\n }).filter(function (node) {\n return notHiddenInput(node);\n });\n};\n\nvar DOMutils_getTabbableNodes = function getTabbableNodes(topNodes, withGuards) {\n return orderByTabIndex(filterFocusable(getFocusables(topNodes, withGuards)), true, withGuards);\n};\n\nvar getAllTabbableNodes = function getAllTabbableNodes(topNodes) {\n return orderByTabIndex(filterFocusable(getFocusables(topNodes)), false);\n};\n\nvar parentAutofocusables = function parentAutofocusables(topNode) {\n return filterFocusable(getParentAutofocusables(topNode));\n};\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/utils/firstFocus.js\nvar isRadio = function isRadio(node) {\n return node.tagName === 'INPUT' && node.type === 'radio';\n};\n\nvar findSelectedRadio = function findSelectedRadio(node, nodes) {\n return nodes.filter(isRadio).filter(function (el) {\n return el.name === node.name;\n }).filter(function (el) {\n return el.checked;\n })[0] || node;\n};\n\nvar pickFirstFocus = function pickFirstFocus(nodes) {\n if (nodes[0] && nodes.length > 1) {\n if (isRadio(nodes[0]) && nodes[0].name) {\n return findSelectedRadio(nodes[0], nodes);\n }\n }\n return nodes[0];\n};\n\nvar pickFocusable = function pickFocusable(nodes, index) {\n if (nodes.length > 1) {\n if (isRadio(nodes[index]) && nodes[index].name) {\n return nodes.indexOf(findSelectedRadio(nodes[index], nodes));\n }\n }\n return index;\n};\n\n/* harmony default export */ const utils_firstFocus = (pickFirstFocus);\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/utils/all-affected.js\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\n\n\nvar filterNested = function filterNested(nodes) {\n var l = nodes.length;\n for (var i = 0; i < l; i += 1) {\n var _loop = function _loop(j) {\n if (i !== j) {\n if (nodes[i].contains(nodes[j])) {\n return {\n v: filterNested(nodes.filter(function (x) {\n return x !== nodes[j];\n }))\n };\n }\n }\n };\n\n for (var j = 0; j < l; j += 1) {\n var _ret = _loop(j);\n\n if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n }\n }\n return nodes;\n};\n\nvar getTopParent = function getTopParent(node) {\n return node.parentNode ? getTopParent(node.parentNode) : node;\n};\n\nvar all_affected_getAllAffectedNodes = function getAllAffectedNodes(node) {\n var nodes = asArray(node);\n return nodes.filter(Boolean).reduce(function (acc, currentNode) {\n var group = currentNode.getAttribute(FOCUS_GROUP);\n acc.push.apply(acc, group ? filterNested(toArray(getTopParent(currentNode).querySelectorAll('[' + FOCUS_GROUP + '=\"' + group + '\"]:not([' + FOCUS_DISABLED + '=\"disabled\"])'))) : [currentNode]);\n return acc;\n }, []);\n};\n\n/* harmony default export */ const all_affected = (all_affected_getAllAffectedNodes);\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/focusMerge.js\n\n\n\n\n\nvar findAutoFocused = function findAutoFocused(autoFocusables) {\n return function (node) {\n return !!node.autofocus || node.dataset && !!node.dataset.autofocus || autoFocusables.indexOf(node) >= 0;\n };\n};\n\nvar isGuard = function isGuard(node) {\n return node && node.dataset && node.dataset.focusGuard;\n};\nvar notAGuard = function notAGuard(node) {\n return !isGuard(node);\n};\n\nvar newFocus = function newFocus(innerNodes, outerNodes, activeElement, lastNode, autoFocused) {\n var cnt = innerNodes.length;\n var firstFocus = innerNodes[0];\n var lastFocus = innerNodes[cnt - 1];\n var isOnGuard = isGuard(activeElement);\n\n // focus is inside\n if (innerNodes.indexOf(activeElement) >= 0) {\n return undefined;\n }\n\n var activeIndex = outerNodes.indexOf(activeElement);\n var lastIndex = outerNodes.indexOf(lastNode || activeIndex);\n var lastNodeInside = innerNodes.indexOf(lastNode);\n var indexDiff = activeIndex - lastIndex;\n var firstNodeIndex = outerNodes.indexOf(firstFocus);\n var lastNodeIndex = outerNodes.indexOf(lastFocus);\n\n var returnFirstNode = pickFocusable(innerNodes, 0);\n var returnLastNode = pickFocusable(innerNodes, cnt - 1);\n\n // new focus\n if (activeIndex === -1 || lastNodeInside === -1) {\n return innerNodes.indexOf(autoFocused && autoFocused.length ? utils_firstFocus(autoFocused) : utils_firstFocus(innerNodes));\n }\n // old focus\n if (!indexDiff && lastNodeInside >= 0) {\n return lastNodeInside;\n }\n // first element\n if (activeIndex <= firstNodeIndex && isOnGuard && Math.abs(indexDiff) > 1) {\n return returnLastNode;\n }\n // last element\n if (activeIndex >= firstNodeIndex && isOnGuard && Math.abs(indexDiff) > 1) {\n return returnFirstNode;\n }\n // jump out, but not on the guard\n if (indexDiff && Math.abs(indexDiff) > 1) {\n return lastNodeInside;\n }\n // focus above lock\n if (activeIndex <= firstNodeIndex) {\n return returnLastNode;\n }\n // focus below lock\n if (activeIndex > lastNodeIndex) {\n return returnFirstNode;\n }\n // index is inside tab order, but outside Lock\n if (indexDiff) {\n if (Math.abs(indexDiff) > 1) {\n return lastNodeInside;\n }\n return (cnt + lastNodeInside + indexDiff) % cnt;\n }\n // do nothing\n return undefined;\n};\n\nvar getTopCommonParent = function getTopCommonParent(baseActiveElement, leftEntry, rightEntries) {\n var activeElements = asArray(baseActiveElement);\n var leftEntries = asArray(leftEntry);\n var activeElement = activeElements[0];\n var topCommon = null;\n leftEntries.filter(Boolean).forEach(function (entry) {\n topCommon = getCommonParent(topCommon || entry, entry) || topCommon;\n rightEntries.filter(Boolean).forEach(function (subEntry) {\n var common = getCommonParent(activeElement, subEntry);\n if (common) {\n if (!topCommon || common.contains(topCommon)) {\n topCommon = common;\n } else {\n topCommon = getCommonParent(common, topCommon);\n }\n }\n });\n });\n return topCommon;\n};\n\nvar allParentAutofocusables = function allParentAutofocusables(entries) {\n return entries.reduce(function (acc, node) {\n return acc.concat(parentAutofocusables(node));\n }, []);\n};\n\nvar reorderNodes = function reorderNodes(srcNodes, dstNodes) {\n var remap = new Map();\n // no Set(dstNodes) for IE11 :(\n dstNodes.forEach(function (entity) {\n return remap.set(entity.node, entity);\n });\n // remap to dstNodes\n return srcNodes.map(function (node) {\n return remap.get(node);\n }).filter(Boolean);\n};\n\nvar getFocusabledIn = function getFocusabledIn(topNode) {\n var entries = getAllAffectedNodes(topNode).filter(notAGuard);\n var commonParent = getTopCommonParent(topNode, topNode, entries);\n var outerNodes = getTabbableNodes([commonParent], true);\n var innerElements = getTabbableNodes(entries).filter(function (_ref) {\n var node = _ref.node;\n return notAGuard(node);\n }).map(function (_ref2) {\n var node = _ref2.node;\n return node;\n });\n\n return outerNodes.map(function (_ref3) {\n var node = _ref3.node,\n index = _ref3.index;\n return {\n node: node,\n index: index,\n lockItem: innerElements.indexOf(node) >= 0,\n guard: isGuard(node)\n };\n });\n};\n\nvar getFocusMerge = function getFocusMerge(topNode, lastNode) {\n var activeElement = document && document.activeElement;\n var entries = all_affected(topNode).filter(notAGuard);\n\n var commonParent = getTopCommonParent(activeElement || topNode, topNode, entries);\n\n var innerElements = DOMutils_getTabbableNodes(entries).filter(function (_ref4) {\n var node = _ref4.node;\n return notAGuard(node);\n });\n\n if (!innerElements[0]) {\n innerElements = getAllTabbableNodes(entries).filter(function (_ref5) {\n var node = _ref5.node;\n return notAGuard(node);\n });\n if (!innerElements[0]) {\n return undefined;\n }\n }\n\n var outerNodes = DOMutils_getTabbableNodes([commonParent]).map(function (_ref6) {\n var node = _ref6.node;\n return node;\n });\n var orderedInnerElements = reorderNodes(outerNodes, innerElements);\n var innerNodes = orderedInnerElements.map(function (_ref7) {\n var node = _ref7.node;\n return node;\n });\n\n var newId = newFocus(innerNodes, outerNodes, activeElement, lastNode, innerNodes.filter(findAutoFocused(allParentAutofocusables(entries))));\n\n if (newId === undefined) {\n return newId;\n }\n return orderedInnerElements[newId];\n};\n\n/* harmony default export */ const focusMerge = (getFocusMerge);\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/setFocus.js\n\n\nvar focusOn = function focusOn(target) {\n target.focus();\n if (target.contentWindow) {\n target.contentWindow.focus();\n }\n};\n\nvar guardCount = 0;\nvar lockDisabled = false;\n\n/* harmony default export */ const setFocus = (function (topNode, lastNode) {\n var focusable = focusMerge(topNode, lastNode);\n\n if (lockDisabled) {\n return;\n }\n\n if (focusable) {\n if (guardCount > 2) {\n // eslint-disable-next-line no-console\n console.error('FocusLock: focus-fighting detected. Only one focus management system could be active. ' + 'See https://github.com/theKashey/focus-lock/#focus-fighting');\n lockDisabled = true;\n setTimeout(function () {\n lockDisabled = false;\n }, 1);\n return;\n }\n guardCount++;\n focusOn(focusable.node);\n guardCount--;\n }\n});\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/index.js\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const es2015 = (setFocus);\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/focusIsHidden.js\n\n\n\nvar focusIsHidden = function focusIsHidden() {\n return document && toArray(document.querySelectorAll('[' + FOCUS_ALLOW + ']')).some(function (node) {\n return node.contains(document.activeElement);\n });\n};\n\n/* harmony default export */ const es2015_focusIsHidden = (focusIsHidden);\n;// CONCATENATED MODULE: ./node_modules/focus-lock/dist/es2015/focusInside.js\n\n\n\nvar focusInFrame = function focusInFrame(frame) {\n return frame === document.activeElement;\n};\n\nvar focusInsideIframe = function focusInsideIframe(topNode) {\n return !!arrayFind(toArray(topNode.querySelectorAll('iframe')), focusInFrame);\n};\n\nvar focusInside = function focusInside(topNode) {\n var activeElement = document && document.activeElement;\n\n if (!activeElement || activeElement.dataset && activeElement.dataset.focusGuard) {\n return false;\n }\n return all_affected(topNode).reduce(function (result, node) {\n return result || node.contains(activeElement) || focusInsideIframe(node);\n }, false);\n};\n\n/* harmony default export */ const es2015_focusInside = (focusInside);\n;// CONCATENATED MODULE: ./node_modules/dom-focus-lock/dist/index.esm.js\n\n\nvar lastActiveTrap = 0;\nvar lastActiveFocus = null;\n\nvar focusOnBody = function focusOnBody() {\n return document && document.activeElement === document.body;\n};\n\nvar isFreeFocus = function isFreeFocus() {\n return focusOnBody() || es2015_focusIsHidden();\n};\n\nvar activateTrap = function activateTrap() {\n var result = false;\n\n if (lastActiveTrap) {\n var observed = lastActiveTrap;\n\n if (!isFreeFocus()) {\n if (observed && !es2015_focusInside(observed)) {\n result = es2015(observed, lastActiveFocus);\n }\n\n lastActiveFocus = document.activeElement;\n }\n }\n\n return result;\n};\n\nvar reducePropsToState = function reducePropsToState(propsList) {\n return propsList.filter(function (node) {\n return node;\n }).slice(-1)[0];\n};\n\nvar handleStateChangeOnClient = function handleStateChangeOnClient(trap) {\n lastActiveTrap = trap;\n\n if (trap) {\n activateTrap();\n }\n};\n\nvar instances = [];\n\nvar emitChange = function emitChange(event) {\n if (handleStateChangeOnClient(reducePropsToState(instances))) {\n event && event.preventDefault();\n return true;\n }\n\n return false;\n};\n\nvar attachHandler = function attachHandler() {\n document.addEventListener('focusin', emitChange);\n};\n\nvar detachHandler = function detachHandler() {\n document.removeEventListener('focusin', emitChange);\n};\n\nvar focusLock = {\n on: function on(domNode) {\n if (instances.length === 0) {\n attachHandler();\n }\n\n if (instances.indexOf(domNode) < 0) {\n instances.push(domNode);\n emitChange();\n }\n },\n off: function off(domNode) {\n instances = instances.filter(function (node) {\n return node !== domNode;\n });\n emitChange();\n\n if (instances.length === 0) {\n detachHandler();\n }\n }\n};\n\n/* harmony default export */ const index_esm = (focusLock);\n\n;// CONCATENATED MODULE: ./static/js/frontend/helpers/focus-lock.js\n\n\nconst focusLockOn = container => {\n let focusLockToUse = index_esm;\n\n if (window.ctFrontend && window.ctFrontend.focusLock) {\n focusLockToUse = ctFrontend.focusLock;\n } else {\n window.ctFrontend = window.ctFrontend || {};\n window.ctFrontend.focusLock = focusLockToUse;\n }\n\n focusLockToUse.on(container);\n};\nconst focusLockOff = container => {\n let focusLockToUse = index_esm;\n\n if (window.ctFrontend && window.ctFrontend.focusLock) {\n focusLockToUse = ctFrontend.focusLock;\n } else {\n window.ctFrontend = window.ctFrontend || {};\n window.ctFrontend.focusLock = focusLockToUse;\n }\n\n focusLockToUse.off(container);\n};\n;// CONCATENATED MODULE: ./static/js/frontend/lazy/overlay.js\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nconst showOffcanvas = settings => {\n settings = _objectSpread({\n onClose: () => {},\n container: null,\n focus: true\n }, settings);\n [...document.querySelectorAll(`[data-toggle-panel*=\"${settings.container.id}\"]`), ...document.querySelectorAll(`[href*=\"${settings.container.id}\"]`)].map(trigger => {\n trigger.setAttribute('aria-expanded', 'true');\n });\n\n if (settings.focus) {\n setTimeout(() => {\n settings.container.querySelector('input') && settings.container.querySelector('input').focus();\n }, 200);\n }\n\n if (settings.container.querySelector('.ct-panel-content')) {\n settings.container.querySelector('.ct-panel-content').addEventListener('click', event => {\n Array.from(settings.container.querySelectorAll('select')).map(select => select.selectr && select.selectr.events.dismiss(event));\n });\n }\n\n if (settings.clickOutside && settings.container.querySelector('.ct-panel-content')) {\n settings.container.addEventListener('click', settings.handleContainerClick);\n }\n\n const onKeyUp = event => {\n const {\n keyCode,\n target\n } = event;\n if (keyCode !== 27) return;\n event.preventDefault();\n document.body.hasAttribute('data-panel') && hideOffcanvas(settings);\n document.removeEventListener('keyup', onKeyUp);\n };\n\n document.addEventListener('keyup', onKeyUp);\n let maybeCloseButton = settings.container && settings.container.querySelector('.ct-toggle-close');\n\n if (maybeCloseButton) {\n maybeCloseButton.addEventListener('click', event => {\n event.preventDefault();\n hideOffcanvas(settings);\n }, {\n once: true\n });\n\n if (!maybeCloseButton.hasEnterListener) {\n maybeCloseButton.hasEnterListener = true;\n maybeCloseButton.addEventListener('keyup', e => {\n if (13 == e.keyCode) {\n e.preventDefault();\n hideOffcanvas(settings);\n }\n });\n }\n }\n\n if (settings.computeScrollContainer || settings.container.querySelector('.ct-panel-content')) {\n disable(settings.computeScrollContainer ? settings.computeScrollContainer() : settings.container.querySelector('.ct-panel-content'));\n setTimeout(() => {\n focusLockOn(settings.container.querySelector('.ct-panel-content').parentNode);\n });\n }\n /**\n * Add window event listener in the next frame. This allows us to freely\n * propagate the current clck event up the chain -- without the modal\n * getting closed.\n */\n\n\n window.addEventListener('click', settings.handleWindowClick, {\n capture: true\n });\n external_ctEvents_default().trigger('ct:modal:opened', settings.container);\n [...settings.container.querySelectorAll('.ct-toggle-dropdown-mobile')].map(arrow => {\n mount(arrow);\n });\n};\n\nconst hideOffcanvas = function (settings) {\n let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n settings = _objectSpread({\n onClose: () => {},\n container: null\n }, settings);\n args = _objectSpread({\n closeInstant: false\n }, args);\n\n if (!document.body.hasAttribute('data-panel')) {\n settings.container.classList.remove('active');\n settings.onClose();\n return;\n }\n\n ;\n [...document.querySelectorAll(`[data-toggle-panel*=\"${settings.container.id}\"]`), ...document.querySelectorAll(`[href*=\"${settings.container.id}\"]`)].map(trigger => {\n trigger.setAttribute('aria-expanded', 'false');\n });\n settings.container.classList.remove('active');\n\n if (args.closeInstant) {\n document.body.removeAttribute('data-panel');\n external_ctEvents_default().trigger('ct:modal:closed', settings.container);\n enable(settings.computeScrollContainer ? settings.computeScrollContainer() : settings.container.querySelector('.ct-panel-content'));\n } else {\n document.body.dataset.panel = `out`;\n settings.container.addEventListener('transitionend', () => {\n setTimeout(() => {\n document.body.removeAttribute('data-panel');\n external_ctEvents_default().trigger('ct:modal:closed', settings.container);\n enable(settings.computeScrollContainer ? settings.computeScrollContainer() : settings.container.querySelector('.ct-panel-content'));\n focusLockOff(settings.container.querySelector('.ct-panel-content').parentNode);\n }, 300);\n }, {\n once: true\n });\n }\n\n window.removeEventListener('click', settings.handleWindowClick, {\n capture: true\n });\n settings.container.removeEventListener('click', settings.handleContainerClick);\n settings.onClose();\n};\n\nconst handleClick = (e, settings) => {\n if (e && e.preventDefault) {\n e.preventDefault();\n }\n\n settings = _objectSpread({\n onClose: () => {},\n container: null,\n focus: false,\n clickOutside: true,\n isModal: false,\n computeScrollContainer: null,\n closeWhenLinkInside: false,\n handleContainerClick: event => {\n let isInsidePanelContent = event.target.closest('.ct-panel-content');\n let isPanelContentItself = [...settings.container.querySelectorAll('.ct-panel-content')].indexOf(event.target) > -1;\n\n if (settings.isModal && !isPanelContentItself && isInsidePanelContent || !settings.isModal && (isPanelContentItself || isInsidePanelContent) || event.target.closest('[class*=\"select2-container\"]')) {\n return;\n }\n\n if (window.getSelection().toString().length > 0) {\n return;\n }\n\n document.body.hasAttribute('data-panel') && hideOffcanvas(settings);\n },\n handleWindowClick: e => {\n if (settings.container.contains(e.target) || e.target === document.body || event.target.closest('[class*=\"select2-container\"]')) {\n return;\n }\n\n if (!document.body.hasAttribute('data-panel')) {\n return;\n }\n\n hideOffcanvas(settings);\n }\n }, settings);\n showOffcanvas(settings);\n /*\n if (document.body.hasAttribute('data-panel')) {\n \tif (\n \t\tsettings.isModal &&\n \t\t!settings.container.classList.contains('active')\n \t) {\n \t\tconst menuToggle = document.querySelector('.ct-header-trigger')\n \t\t\tif (menuToggle) {\n \t\t\tmenuToggle.click()\n \t\t}\n \t\t\tsetTimeout(() => {\n \t\t\tshowOffcanvas(settings)\n \t\t}, 600)\n \t} else {\n \t\thideOffcanvas(settings)\n \t}\n } else {\n \tshowOffcanvas(settings)\n }\n */\n\n if (settings.closeWhenLinkInside) {\n if (!settings.container.hasListener) {\n settings.container.hasListener = true;\n settings.container.addEventListener('click', event => {\n if (!event.target) {\n return;\n }\n\n let maybeA = event.target;\n\n if (event.target.closest('a')) {\n maybeA = event.target.closest('a');\n }\n\n if (!maybeA.closest('.ct-panel').classList.contains('active')) {\n return;\n }\n\n if (!maybeA.matches('a')) {\n return;\n }\n\n if (!maybeA.closest('nav[data-id*=\"menu\"]') && !maybeA.closest('[data-id*=\"text\"]') && !maybeA.closest('[data-id*=\"button\"]') && !maybeA.matches('.ct-offcanvas-trigger') && !maybeA.matches('.ct-header-account') && !maybeA.closest('.widget_nav_menu')) {\n return;\n }\n\n hideOffcanvas(settings, {\n closeInstant: maybeA.getAttribute('href')[0] !== '#'\n });\n setTimeout(() => {\n if (maybeA.matches('.ct-offcanvas-trigger') || maybeA.matches('.ct-header-account')) {\n maybeA.click();\n }\n }, 500);\n });\n }\n }\n};\nexternal_ctEvents_default().on('ct:offcanvas:force-close', settings => hideOffcanvas(settings));\nconst overlay_mount = (el, _ref) => {\n let {\n event,\n focus = false\n } = _ref;\n handleClick(event, {\n isModal: true,\n container: document.querySelector(el.dataset.togglePanel || el.hash),\n clickOutside: true,\n focus\n });\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI3LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jdEZyb250ZW5kLy4vc3RhdGljL2pzL2Zyb250ZW5kL2xhenkvb3ZlcmxheS9uby1ib3VuY2UuanM/MDg3MCIsIndlYnBhY2s6Ly9jdEZyb250ZW5kLy4vc3RhdGljL2pzL2Zyb250ZW5kL2xhenkvb3ZlcmxheS9tb2JpbGUtbWVudS5qcz9lMDQzIiwid2VicGFjazovL2N0RnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9hcnJheS5qcz85YTdjIiwid2VicGFjazovL2N0RnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy90YWJPcmRlci5qcz9jMWZiIiwid2VicGFjazovL2N0RnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy90YWJiYWJsZXMuanM/ODJjZSIsIndlYnBhY2s6Ly9jdEZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvY29uc3RhbnRzLmpzP2M0MjkiLCJ3ZWJwYWNrOi8vY3RGcm9udGVuZC8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL3RhYlV0aWxzLmpzP2YwOWQiLCJ3ZWJwYWNrOi8vY3RGcm9udGVuZC8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL0RPTXV0aWxzLmpzPzdjYjMiLCJ3ZWJwYWNrOi8vY3RGcm9udGVuZC8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2ZpcnN0Rm9jdXMuanM/MGRhMSIsIndlYnBhY2s6Ly9jdEZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvYWxsLWFmZmVjdGVkLmpzPzQ5NzgiLCJ3ZWJwYWNrOi8vY3RGcm9udGVuZC8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzTWVyZ2UuanM/ZTU1YSIsIndlYnBhY2s6Ly9jdEZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvc2V0Rm9jdXMuanM/MjExNiIsIndlYnBhY2s6Ly9jdEZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvaW5kZXguanM/Y2E1YiIsIndlYnBhY2s6Ly9jdEZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvZm9jdXNJc0hpZGRlbi5qcz9hMTA4Iiwid2VicGFjazovL2N0RnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9mb2N1c0luc2lkZS5qcz8zMDY0Iiwid2VicGFjazovL2N0RnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvZG9tLWZvY3VzLWxvY2svZGlzdC9pbmRleC5lc20uanM/NzVjZSIsIndlYnBhY2s6Ly9jdEZyb250ZW5kLy4vc3RhdGljL2pzL2Zyb250ZW5kL2hlbHBlcnMvZm9jdXMtbG9jay5qcz8xMDA4Iiwid2VicGFjazovL2N0RnJvbnRlbmQvLi9zdGF0aWMvanMvZnJvbnRlbmQvbGF6eS9vdmVybGF5LmpzPzYzNWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xlYXJBbGxCb2R5U2Nyb2xsTG9ja3MsIGVuYWJsZUJvZHlTY3JvbGwsIGRpc2FibGVCb2R5U2Nyb2xsIH0gZnJvbSAnYm9keS1zY3JvbGwtbG9jayc7XG5jb25zdCBpc0lvc0RldmljZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSAmJiAoL2lQKGFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pIHx8IHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgd2luZG93Lm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEpO1xuZXhwb3J0IHZhciBlbmFibGUgPSBmdW5jdGlvbiAoZWwpIHtcbiAgaWYgKCFpc0lvc0RldmljZSkge1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLXNjcm9sbGJhci13aWR0aCcpO1xuICB9IGVsc2Uge1xuICAgIGNsZWFyQWxsQm9keVNjcm9sbExvY2tzKCk7XG4gIH1cbn07XG5leHBvcnQgdmFyIGRpc2FibGUgPSBmdW5jdGlvbiAoZWwpIHtcbiAgaWYgKCFpc0lvc0RldmljZSkge1xuICAgIGxldCBzY3JvbGxiYXJXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuXG4gICAgaWYgKHNjcm9sbGJhcldpZHRoID4gMCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zY3JvbGxiYXItd2lkdGgnLCBgJHtzY3JvbGxiYXJXaWR0aH1weGApO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGRpc2FibGVCb2R5U2Nyb2xsKGVsLCB7XG4gICAgICAgIC8vIHJlc2VydmVTY3JvbGxCYXJHYXA6IHRydWUsXG4gICAgICAgIGFsbG93VG91Y2hNb3ZlOiBlbCA9PiB7XG4gICAgICAgICAgaWYgKGVsLmNsb3Nlc3QoJy5zZWxlY3QyLWNvbnRhaW5lcicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTsiLCJjb25zdCBhY3RpdmF0ZVN1Yk1lbnUgPSBjb250YWluZXIgPT4ge1xuICBjb25zdCBzdWJNZW51ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0gc3ViTWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgc3ViTWVudS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICBzdWJNZW51LmNsYXNzTGlzdC5hZGQoJ2lzLWFuaW1hdGluZycpO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBzdWJNZW51LnN0eWxlLmhlaWdodCA9IGAke2FjdHVhbEhlaWdodH1weGA7XG4gICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoc3ViTWVudSwgKCkgPT4ge1xuICAgICAgICBzdWJNZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFuaW1hdGluZycpO1xuICAgICAgICBzdWJNZW51LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmNvbnN0IGRlYWN0aXZhdGVTdWJNZW51ID0gKGNvbnRhaW5lciwgY2IpID0+IHtcbiAgY29uc3Qgc3ViTWVudSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCd1bCcpO1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgIGNvbnN0IGFjdHVhbEhlaWdodCA9IHN1Yk1lbnUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIHN1Yk1lbnUuc3R5bGUuaGVpZ2h0ID0gYCR7YWN0dWFsSGVpZ2h0fXB4YDtcbiAgICBzdWJNZW51LmNsYXNzTGlzdC5hZGQoJ2lzLWFuaW1hdGluZycpO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBzdWJNZW51LnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuICAgICAgd2hlblRyYW5zaXRpb25FbmRzKHN1Yk1lbnUsICgpID0+IHtcbiAgICAgICAgc3ViTWVudS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hbmltYXRpbmcnKTtcbiAgICAgICAgc3ViTWVudS5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgIGNiKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5jb25zdCBoYW5kbGVDb250YWluZXIgPSBjb250YWluZXIgPT4ge1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFycm93ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5jdC10b2dnbGUtZHJvcGRvd24tbW9iaWxlJyk7XG5cbiAgaWYgKGNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLWFjdGl2ZScpKSB7XG4gICAgYXJyb3cuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgYXJyb3cuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgY3RfbG9jYWxpemF0aW9ucy5leHBhbmRfc3VibWVudSk7XG4gICAgZGVhY3RpdmF0ZVN1Yk1lbnUoY29udGFpbmVyLCAoKSA9PiB7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZHJvcGRvd24tYWN0aXZlJyk7XG4gICAgICBbLi4uY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZW51LWl0ZW0taGFzLWNoaWxkcmVuLmRyb3Bkb3duLWFjdGl2ZSwgLnBhZ2VfaXRlbV9oYXNfY2hpbGRyZW4uZHJvcGRvd24tYWN0aXZlJyldLm1hcChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdkcm9wZG93bi1hY3RpdmUnKSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgYXJyb3cuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICBhcnJvdy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBjdF9sb2NhbGl6YXRpb25zLmNvbGxhcHNlX3N1Ym1lbnUpO1xuICAgIFsuLi5jb250YWluZXIucGFyZW50Tm9kZS5jaGlsZHJlbl0ubWFwKGVsID0+IGVsLmNsYXNzTGlzdC5jb250YWlucygnZHJvcGRvd24tYWN0aXZlJykgJiYgaGFuZGxlQ29udGFpbmVyKGVsKSk7XG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoJ2Ryb3Bkb3duLWFjdGl2ZScpO1xuICAgIGFjdGl2YXRlU3ViTWVudShjb250YWluZXIpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbW91bnQgPSBhcnJvdyA9PiB7XG4gIGlmIChhcnJvdy5oYXNMaXN0ZW5lcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFycm93Lmhhc0xpc3RlbmVyID0gdHJ1ZTtcbiAgbGV0IHBhcmVudEhyZWYgPSBhcnJvdy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gIGlmICghcGFyZW50SHJlZiB8fCBwYXJlbnRIcmVmID09PSAnIycpIHtcbiAgICBhcnJvdy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaGFuZGxlQ29udGFpbmVyKGFycm93LmNsb3Nlc3QoJy5tZW51LWl0ZW0taGFzLWNoaWxkcmVuLCAucGFnZV9pdGVtX2hhc19jaGlsZHJlbicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFycm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaGFuZGxlQ29udGFpbmVyKGFycm93LmNsb3Nlc3QoJy5tZW51LWl0ZW0taGFzLWNoaWxkcmVuLCAucGFnZV9pdGVtX2hhc19jaGlsZHJlbicpKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIGNiKSB7XG4gIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgb25FbmQpO1xuICAgIGNiKCk7XG4gIH07XG5cbiAgY29uc3Qgb25FbmQgPSBlID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IGVsKSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH07XG5cbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIG9uRW5kKTtcbn0iLCJleHBvcnQgdmFyIHRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5KGEpIHtcbiAgdmFyIHJldCA9IEFycmF5KGEubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYVtpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuZXhwb3J0IHZhciBhcnJheUZpbmQgPSBmdW5jdGlvbiBhcnJheUZpbmQoYXJyYXksIHNlYXJjaCkge1xuICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIGEgPT09IHNlYXJjaDtcbiAgfSlbMF07XG59O1xuXG5leHBvcnQgdmFyIGFzQXJyYXkgPSBmdW5jdGlvbiBhc0FycmF5KGEpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYSkgPyBhIDogW2FdO1xufTsiLCJpbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5cbmV4cG9ydCB2YXIgdGFiU29ydCA9IGZ1bmN0aW9uIHRhYlNvcnQoYSwgYikge1xuICB2YXIgdGFiRGlmZiA9IGEudGFiSW5kZXggLSBiLnRhYkluZGV4O1xuICB2YXIgaW5kZXhEaWZmID0gYS5pbmRleCAtIGIuaW5kZXg7XG5cbiAgaWYgKHRhYkRpZmYpIHtcbiAgICBpZiAoIWEudGFiSW5kZXgpIHJldHVybiAxO1xuICAgIGlmICghYi50YWJJbmRleCkgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIHRhYkRpZmYgfHwgaW5kZXhEaWZmO1xufTtcblxuZXhwb3J0IHZhciBvcmRlckJ5VGFiSW5kZXggPSBmdW5jdGlvbiBvcmRlckJ5VGFiSW5kZXgobm9kZXMsIGZpbHRlck5lZ2F0aXZlLCBrZWVwR3VhcmRzKSB7XG4gIHJldHVybiB0b0FycmF5KG5vZGVzKS5tYXAoZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IG5vZGUsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICB0YWJJbmRleDoga2VlcEd1YXJkcyAmJiBub2RlLnRhYkluZGV4ID09PSAtMSA/IChub2RlLmRhdGFzZXQgfHwge30pLmZvY3VzR3VhcmQgPyAwIDogLTEgOiBub2RlLnRhYkluZGV4XG4gICAgfTtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuICFmaWx0ZXJOZWdhdGl2ZSB8fCBkYXRhLnRhYkluZGV4ID49IDA7XG4gIH0pLnNvcnQodGFiU29ydCk7XG59OyIsImV4cG9ydCBkZWZhdWx0IFsnYnV0dG9uOmVuYWJsZWQ6bm90KFtyZWFkb25seV0pJywgJ3NlbGVjdDplbmFibGVkOm5vdChbcmVhZG9ubHldKScsICd0ZXh0YXJlYTplbmFibGVkOm5vdChbcmVhZG9ubHldKScsICdpbnB1dDplbmFibGVkOm5vdChbcmVhZG9ubHldKScsICdhW2hyZWZdJywgJ2FyZWFbaHJlZl0nLCAnaWZyYW1lJywgJ29iamVjdCcsICdlbWJlZCcsICdbdGFiaW5kZXhdJywgJ1tjb250ZW50ZWRpdGFibGVdJywgJ1thdXRvZm9jdXNdJ107IiwiZXhwb3J0IHZhciBGT0NVU19HUk9VUCA9ICdkYXRhLWZvY3VzLWxvY2snO1xuZXhwb3J0IHZhciBGT0NVU19ESVNBQkxFRCA9ICdkYXRhLWZvY3VzLWxvY2stZGlzYWJsZWQnO1xuZXhwb3J0IHZhciBGT0NVU19BTExPVyA9ICdkYXRhLW5vLWZvY3VzLWxvY2snO1xuZXhwb3J0IHZhciBGT0NVU19BVVRPID0gJ2RhdGEtYXV0b2ZvY3VzLWluc2lkZSc7IiwiaW1wb3J0IHRhYmJhYmxlcyBmcm9tICcuL3RhYmJhYmxlcyc7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyBGT0NVU19BVVRPIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxudmFyIHF1ZXJ5VGFiYmFibGVzID0gdGFiYmFibGVzLmpvaW4oJywnKTtcbnZhciBxdWVyeUd1YXJkVGFiYmFibGVzID0gcXVlcnlUYWJiYWJsZXMgKyAnLCBbZGF0YS1mb2N1cy1ndWFyZF0nO1xuXG5leHBvcnQgdmFyIGdldEZvY3VzYWJsZXMgPSBmdW5jdGlvbiBnZXRGb2N1c2FibGVzKHBhcmVudHMsIHdpdGhHdWFyZHMpIHtcbiAgcmV0dXJuIHBhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBhcmVudCkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KFxuICAgIC8vIGFkZCBhbGwgdGFiYmFibGVzIGluc2lkZVxuICAgIHRvQXJyYXkocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwod2l0aEd1YXJkcyA/IHF1ZXJ5R3VhcmRUYWJiYWJsZXMgOiBxdWVyeVRhYmJhYmxlcykpLFxuICAgIC8vIGFkZCBpZiBub2RlIGlzIHRhYmJsZSBpdHNlbGZcbiAgICBwYXJlbnQucGFyZW50Tm9kZSA/IHRvQXJyYXkocGFyZW50LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCh0YWJiYWJsZXMuam9pbignLCcpKSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZSA9PT0gcGFyZW50O1xuICAgIH0pIDogW10pO1xuICB9LCBbXSk7XG59O1xuXG5leHBvcnQgdmFyIGdldFBhcmVudEF1dG9mb2N1c2FibGVzID0gZnVuY3Rpb24gZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXMocGFyZW50KSB7XG4gIHZhciBwYXJlbnRGb2N1cyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIEZPQ1VTX0FVVE8gKyAnXScpO1xuICByZXR1cm4gdG9BcnJheShwYXJlbnRGb2N1cykubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIGdldEZvY3VzYWJsZXMoW25vZGVdKTtcbiAgfSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIG5vZGVzKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQobm9kZXMpO1xuICB9LCBbXSk7XG59OyIsImltcG9ydCB7IG9yZGVyQnlUYWJJbmRleCB9IGZyb20gJy4vdGFiT3JkZXInO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlcywgZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXMgfSBmcm9tICcuL3RhYlV0aWxzJztcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL2FycmF5JztcblxudmFyIGlzRWxlbWVudEhpZGRlbiA9IGZ1bmN0aW9uIGlzRWxlbWVudEhpZGRlbihjb21wdXRlZFN0eWxlKSB7XG4gIGlmICghY29tcHV0ZWRTdHlsZSB8fCAhY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJztcbn07XG5cbmV4cG9ydCB2YXIgaXNWaXNpYmxlID0gZnVuY3Rpb24gaXNWaXNpYmxlKG5vZGUpIHtcbiAgcmV0dXJuICFub2RlIHx8IG5vZGUgPT09IGRvY3VtZW50IHx8IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSB8fCAhaXNFbGVtZW50SGlkZGVuKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpKSAmJiBpc1Zpc2libGUobm9kZS5wYXJlbnROb2RlKTtcbn07XG5cbmV4cG9ydCB2YXIgbm90SGlkZGVuSW5wdXQgPSBmdW5jdGlvbiBub3RIaWRkZW5JbnB1dChub2RlKSB7XG4gIHJldHVybiAhKChub2RlLnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgbm9kZS50YWdOYW1lID09PSAnQlVUVE9OJykgJiYgKG5vZGUudHlwZSA9PT0gJ2hpZGRlbicgfHwgbm9kZS5kaXNhYmxlZCkpO1xufTtcblxudmFyIGdldFBhcmVudHMgPSBmdW5jdGlvbiBnZXRQYXJlbnRzKG5vZGUpIHtcbiAgdmFyIHBhcmVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuXG4gIHBhcmVudHMucHVzaChub2RlKTtcbiAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgIGdldFBhcmVudHMobm9kZS5wYXJlbnROb2RlLCBwYXJlbnRzKTtcbiAgfVxuICByZXR1cm4gcGFyZW50cztcbn07XG5cbmV4cG9ydCB2YXIgZ2V0Q29tbW9uUGFyZW50ID0gZnVuY3Rpb24gZ2V0Q29tbW9uUGFyZW50KG5vZGVhLCBub2RlYikge1xuICB2YXIgcGFyZW50c0EgPSBnZXRQYXJlbnRzKG5vZGVhKTtcbiAgdmFyIHBhcmVudHNCID0gZ2V0UGFyZW50cyhub2RlYik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzQS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBjdXJyZW50UGFyZW50ID0gcGFyZW50c0FbaV07XG4gICAgaWYgKHBhcmVudHNCLmluZGV4T2YoY3VycmVudFBhcmVudCkgPj0gMCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRQYXJlbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCB2YXIgZmlsdGVyRm9jdXNhYmxlID0gZnVuY3Rpb24gZmlsdGVyRm9jdXNhYmxlKG5vZGVzKSB7XG4gIHJldHVybiB0b0FycmF5KG5vZGVzKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gaXNWaXNpYmxlKG5vZGUpO1xuICB9KS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm90SGlkZGVuSW5wdXQobm9kZSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IHZhciBnZXRUYWJiYWJsZU5vZGVzID0gZnVuY3Rpb24gZ2V0VGFiYmFibGVOb2Rlcyh0b3BOb2Rlcywgd2l0aEd1YXJkcykge1xuICByZXR1cm4gb3JkZXJCeVRhYkluZGV4KGZpbHRlckZvY3VzYWJsZShnZXRGb2N1c2FibGVzKHRvcE5vZGVzLCB3aXRoR3VhcmRzKSksIHRydWUsIHdpdGhHdWFyZHMpO1xufTtcblxuZXhwb3J0IHZhciBnZXRBbGxUYWJiYWJsZU5vZGVzID0gZnVuY3Rpb24gZ2V0QWxsVGFiYmFibGVOb2Rlcyh0b3BOb2Rlcykge1xuICByZXR1cm4gb3JkZXJCeVRhYkluZGV4KGZpbHRlckZvY3VzYWJsZShnZXRGb2N1c2FibGVzKHRvcE5vZGVzKSksIGZhbHNlKTtcbn07XG5cbmV4cG9ydCB2YXIgcGFyZW50QXV0b2ZvY3VzYWJsZXMgPSBmdW5jdGlvbiBwYXJlbnRBdXRvZm9jdXNhYmxlcyh0b3BOb2RlKSB7XG4gIHJldHVybiBmaWx0ZXJGb2N1c2FibGUoZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXModG9wTm9kZSkpO1xufTsiLCJ2YXIgaXNSYWRpbyA9IGZ1bmN0aW9uIGlzUmFkaW8obm9kZSkge1xuICByZXR1cm4gbm9kZS50YWdOYW1lID09PSAnSU5QVVQnICYmIG5vZGUudHlwZSA9PT0gJ3JhZGlvJztcbn07XG5cbnZhciBmaW5kU2VsZWN0ZWRSYWRpbyA9IGZ1bmN0aW9uIGZpbmRTZWxlY3RlZFJhZGlvKG5vZGUsIG5vZGVzKSB7XG4gIHJldHVybiBub2Rlcy5maWx0ZXIoaXNSYWRpbykuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgIHJldHVybiBlbC5uYW1lID09PSBub2RlLm5hbWU7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICByZXR1cm4gZWwuY2hlY2tlZDtcbiAgfSlbMF0gfHwgbm9kZTtcbn07XG5cbnZhciBwaWNrRmlyc3RGb2N1cyA9IGZ1bmN0aW9uIHBpY2tGaXJzdEZvY3VzKG5vZGVzKSB7XG4gIGlmIChub2Rlc1swXSAmJiBub2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgaWYgKGlzUmFkaW8obm9kZXNbMF0pICYmIG5vZGVzWzBdLm5hbWUpIHtcbiAgICAgIHJldHVybiBmaW5kU2VsZWN0ZWRSYWRpbyhub2Rlc1swXSwgbm9kZXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9kZXNbMF07XG59O1xuXG5leHBvcnQgdmFyIHBpY2tGb2N1c2FibGUgPSBmdW5jdGlvbiBwaWNrRm9jdXNhYmxlKG5vZGVzLCBpbmRleCkge1xuICBpZiAobm9kZXMubGVuZ3RoID4gMSkge1xuICAgIGlmIChpc1JhZGlvKG5vZGVzW2luZGV4XSkgJiYgbm9kZXNbaW5kZXhdLm5hbWUpIHtcbiAgICAgIHJldHVybiBub2Rlcy5pbmRleE9mKGZpbmRTZWxlY3RlZFJhZGlvKG5vZGVzW2luZGV4XSwgbm9kZXMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcGlja0ZpcnN0Rm9jdXM7IiwidmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5pbXBvcnQgeyBGT0NVU19ESVNBQkxFRCwgRk9DVVNfR1JPVVAgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYXNBcnJheSwgdG9BcnJheSB9IGZyb20gJy4vYXJyYXknO1xuXG52YXIgZmlsdGVyTmVzdGVkID0gZnVuY3Rpb24gZmlsdGVyTmVzdGVkKG5vZGVzKSB7XG4gIHZhciBsID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkgKz0gMSkge1xuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGopIHtcbiAgICAgIGlmIChpICE9PSBqKSB7XG4gICAgICAgIGlmIChub2Rlc1tpXS5jb250YWlucyhub2Rlc1tqXSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZmlsdGVyTmVzdGVkKG5vZGVzLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICByZXR1cm4geCAhPT0gbm9kZXNbal07XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbDsgaiArPSAxKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKGopO1xuXG4gICAgICBpZiAoKHR5cGVvZiBfcmV0ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihfcmV0KSkgPT09IFwib2JqZWN0XCIpIHJldHVybiBfcmV0LnY7XG4gICAgfVxuICB9XG4gIHJldHVybiBub2Rlcztcbn07XG5cbnZhciBnZXRUb3BQYXJlbnQgPSBmdW5jdGlvbiBnZXRUb3BQYXJlbnQobm9kZSkge1xuICByZXR1cm4gbm9kZS5wYXJlbnROb2RlID8gZ2V0VG9wUGFyZW50KG5vZGUucGFyZW50Tm9kZSkgOiBub2RlO1xufTtcblxudmFyIGdldEFsbEFmZmVjdGVkTm9kZXMgPSBmdW5jdGlvbiBnZXRBbGxBZmZlY3RlZE5vZGVzKG5vZGUpIHtcbiAgdmFyIG5vZGVzID0gYXNBcnJheShub2RlKTtcbiAgcmV0dXJuIG5vZGVzLmZpbHRlcihCb29sZWFuKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY3VycmVudE5vZGUpIHtcbiAgICB2YXIgZ3JvdXAgPSBjdXJyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoRk9DVVNfR1JPVVApO1xuICAgIGFjYy5wdXNoLmFwcGx5KGFjYywgZ3JvdXAgPyBmaWx0ZXJOZXN0ZWQodG9BcnJheShnZXRUb3BQYXJlbnQoY3VycmVudE5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgRk9DVVNfR1JPVVAgKyAnPVwiJyArIGdyb3VwICsgJ1wiXTpub3QoWycgKyBGT0NVU19ESVNBQkxFRCArICc9XCJkaXNhYmxlZFwiXSknKSkpIDogW2N1cnJlbnROb2RlXSk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0QWxsQWZmZWN0ZWROb2RlczsiLCJpbXBvcnQgeyBnZXRDb21tb25QYXJlbnQsIGdldFRhYmJhYmxlTm9kZXMsIGdldEFsbFRhYmJhYmxlTm9kZXMsIHBhcmVudEF1dG9mb2N1c2FibGVzIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgcGlja0ZpcnN0Rm9jdXMsIHsgcGlja0ZvY3VzYWJsZSB9IGZyb20gJy4vdXRpbHMvZmlyc3RGb2N1cyc7XG5pbXBvcnQgZ2V0QWxsQWZmZWN0ZWROb2RlcyBmcm9tICcuL3V0aWxzL2FsbC1hZmZlY3RlZCc7XG5pbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnLi91dGlscy9hcnJheSc7XG5cbnZhciBmaW5kQXV0b0ZvY3VzZWQgPSBmdW5jdGlvbiBmaW5kQXV0b0ZvY3VzZWQoYXV0b0ZvY3VzYWJsZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuICEhbm9kZS5hdXRvZm9jdXMgfHwgbm9kZS5kYXRhc2V0ICYmICEhbm9kZS5kYXRhc2V0LmF1dG9mb2N1cyB8fCBhdXRvRm9jdXNhYmxlcy5pbmRleE9mKG5vZGUpID49IDA7XG4gIH07XG59O1xuXG52YXIgaXNHdWFyZCA9IGZ1bmN0aW9uIGlzR3VhcmQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLmRhdGFzZXQgJiYgbm9kZS5kYXRhc2V0LmZvY3VzR3VhcmQ7XG59O1xudmFyIG5vdEFHdWFyZCA9IGZ1bmN0aW9uIG5vdEFHdWFyZChub2RlKSB7XG4gIHJldHVybiAhaXNHdWFyZChub2RlKTtcbn07XG5cbmV4cG9ydCB2YXIgbmV3Rm9jdXMgPSBmdW5jdGlvbiBuZXdGb2N1cyhpbm5lck5vZGVzLCBvdXRlck5vZGVzLCBhY3RpdmVFbGVtZW50LCBsYXN0Tm9kZSwgYXV0b0ZvY3VzZWQpIHtcbiAgdmFyIGNudCA9IGlubmVyTm9kZXMubGVuZ3RoO1xuICB2YXIgZmlyc3RGb2N1cyA9IGlubmVyTm9kZXNbMF07XG4gIHZhciBsYXN0Rm9jdXMgPSBpbm5lck5vZGVzW2NudCAtIDFdO1xuICB2YXIgaXNPbkd1YXJkID0gaXNHdWFyZChhY3RpdmVFbGVtZW50KTtcblxuICAvLyBmb2N1cyBpcyBpbnNpZGVcbiAgaWYgKGlubmVyTm9kZXMuaW5kZXhPZihhY3RpdmVFbGVtZW50KSA+PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBhY3RpdmVJbmRleCA9IG91dGVyTm9kZXMuaW5kZXhPZihhY3RpdmVFbGVtZW50KTtcbiAgdmFyIGxhc3RJbmRleCA9IG91dGVyTm9kZXMuaW5kZXhPZihsYXN0Tm9kZSB8fCBhY3RpdmVJbmRleCk7XG4gIHZhciBsYXN0Tm9kZUluc2lkZSA9IGlubmVyTm9kZXMuaW5kZXhPZihsYXN0Tm9kZSk7XG4gIHZhciBpbmRleERpZmYgPSBhY3RpdmVJbmRleCAtIGxhc3RJbmRleDtcbiAgdmFyIGZpcnN0Tm9kZUluZGV4ID0gb3V0ZXJOb2Rlcy5pbmRleE9mKGZpcnN0Rm9jdXMpO1xuICB2YXIgbGFzdE5vZGVJbmRleCA9IG91dGVyTm9kZXMuaW5kZXhPZihsYXN0Rm9jdXMpO1xuXG4gIHZhciByZXR1cm5GaXJzdE5vZGUgPSBwaWNrRm9jdXNhYmxlKGlubmVyTm9kZXMsIDApO1xuICB2YXIgcmV0dXJuTGFzdE5vZGUgPSBwaWNrRm9jdXNhYmxlKGlubmVyTm9kZXMsIGNudCAtIDEpO1xuXG4gIC8vIG5ldyBmb2N1c1xuICBpZiAoYWN0aXZlSW5kZXggPT09IC0xIHx8IGxhc3ROb2RlSW5zaWRlID09PSAtMSkge1xuICAgIHJldHVybiBpbm5lck5vZGVzLmluZGV4T2YoYXV0b0ZvY3VzZWQgJiYgYXV0b0ZvY3VzZWQubGVuZ3RoID8gcGlja0ZpcnN0Rm9jdXMoYXV0b0ZvY3VzZWQpIDogcGlja0ZpcnN0Rm9jdXMoaW5uZXJOb2RlcykpO1xuICB9XG4gIC8vIG9sZCBmb2N1c1xuICBpZiAoIWluZGV4RGlmZiAmJiBsYXN0Tm9kZUluc2lkZSA+PSAwKSB7XG4gICAgcmV0dXJuIGxhc3ROb2RlSW5zaWRlO1xuICB9XG4gIC8vIGZpcnN0IGVsZW1lbnRcbiAgaWYgKGFjdGl2ZUluZGV4IDw9IGZpcnN0Tm9kZUluZGV4ICYmIGlzT25HdWFyZCAmJiBNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgIHJldHVybiByZXR1cm5MYXN0Tm9kZTtcbiAgfVxuICAvLyBsYXN0IGVsZW1lbnRcbiAgaWYgKGFjdGl2ZUluZGV4ID49IGZpcnN0Tm9kZUluZGV4ICYmIGlzT25HdWFyZCAmJiBNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgIHJldHVybiByZXR1cm5GaXJzdE5vZGU7XG4gIH1cbiAgLy8ganVtcCBvdXQsIGJ1dCBub3Qgb24gdGhlIGd1YXJkXG4gIGlmIChpbmRleERpZmYgJiYgTWF0aC5hYnMoaW5kZXhEaWZmKSA+IDEpIHtcbiAgICByZXR1cm4gbGFzdE5vZGVJbnNpZGU7XG4gIH1cbiAgLy8gZm9jdXMgYWJvdmUgbG9ja1xuICBpZiAoYWN0aXZlSW5kZXggPD0gZmlyc3ROb2RlSW5kZXgpIHtcbiAgICByZXR1cm4gcmV0dXJuTGFzdE5vZGU7XG4gIH1cbiAgLy8gZm9jdXMgYmVsb3cgbG9ja1xuICBpZiAoYWN0aXZlSW5kZXggPiBsYXN0Tm9kZUluZGV4KSB7XG4gICAgcmV0dXJuIHJldHVybkZpcnN0Tm9kZTtcbiAgfVxuICAvLyBpbmRleCBpcyBpbnNpZGUgdGFiIG9yZGVyLCBidXQgb3V0c2lkZSBMb2NrXG4gIGlmIChpbmRleERpZmYpIHtcbiAgICBpZiAoTWF0aC5hYnMoaW5kZXhEaWZmKSA+IDEpIHtcbiAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICB9XG4gICAgcmV0dXJuIChjbnQgKyBsYXN0Tm9kZUluc2lkZSArIGluZGV4RGlmZikgJSBjbnQ7XG4gIH1cbiAgLy8gZG8gbm90aGluZ1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxudmFyIGdldFRvcENvbW1vblBhcmVudCA9IGZ1bmN0aW9uIGdldFRvcENvbW1vblBhcmVudChiYXNlQWN0aXZlRWxlbWVudCwgbGVmdEVudHJ5LCByaWdodEVudHJpZXMpIHtcbiAgdmFyIGFjdGl2ZUVsZW1lbnRzID0gYXNBcnJheShiYXNlQWN0aXZlRWxlbWVudCk7XG4gIHZhciBsZWZ0RW50cmllcyA9IGFzQXJyYXkobGVmdEVudHJ5KTtcbiAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBhY3RpdmVFbGVtZW50c1swXTtcbiAgdmFyIHRvcENvbW1vbiA9IG51bGw7XG4gIGxlZnRFbnRyaWVzLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIHRvcENvbW1vbiA9IGdldENvbW1vblBhcmVudCh0b3BDb21tb24gfHwgZW50cnksIGVudHJ5KSB8fCB0b3BDb21tb247XG4gICAgcmlnaHRFbnRyaWVzLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChzdWJFbnRyeSkge1xuICAgICAgdmFyIGNvbW1vbiA9IGdldENvbW1vblBhcmVudChhY3RpdmVFbGVtZW50LCBzdWJFbnRyeSk7XG4gICAgICBpZiAoY29tbW9uKSB7XG4gICAgICAgIGlmICghdG9wQ29tbW9uIHx8IGNvbW1vbi5jb250YWlucyh0b3BDb21tb24pKSB7XG4gICAgICAgICAgdG9wQ29tbW9uID0gY29tbW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvcENvbW1vbiA9IGdldENvbW1vblBhcmVudChjb21tb24sIHRvcENvbW1vbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0b3BDb21tb247XG59O1xuXG52YXIgYWxsUGFyZW50QXV0b2ZvY3VzYWJsZXMgPSBmdW5jdGlvbiBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyhlbnRyaWVzKSB7XG4gIHJldHVybiBlbnRyaWVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBub2RlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQocGFyZW50QXV0b2ZvY3VzYWJsZXMobm9kZSkpO1xuICB9LCBbXSk7XG59O1xuXG52YXIgcmVvcmRlck5vZGVzID0gZnVuY3Rpb24gcmVvcmRlck5vZGVzKHNyY05vZGVzLCBkc3ROb2Rlcykge1xuICB2YXIgcmVtYXAgPSBuZXcgTWFwKCk7XG4gIC8vIG5vIFNldChkc3ROb2RlcykgZm9yIElFMTEgOihcbiAgZHN0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgcmV0dXJuIHJlbWFwLnNldChlbnRpdHkubm9kZSwgZW50aXR5KTtcbiAgfSk7XG4gIC8vIHJlbWFwIHRvIGRzdE5vZGVzXG4gIHJldHVybiBzcmNOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gcmVtYXAuZ2V0KG5vZGUpO1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG5leHBvcnQgdmFyIGdldEZvY3VzYWJsZWRJbiA9IGZ1bmN0aW9uIGdldEZvY3VzYWJsZWRJbih0b3BOb2RlKSB7XG4gIHZhciBlbnRyaWVzID0gZ2V0QWxsQWZmZWN0ZWROb2Rlcyh0b3BOb2RlKS5maWx0ZXIobm90QUd1YXJkKTtcbiAgdmFyIGNvbW1vblBhcmVudCA9IGdldFRvcENvbW1vblBhcmVudCh0b3BOb2RlLCB0b3BOb2RlLCBlbnRyaWVzKTtcbiAgdmFyIG91dGVyTm9kZXMgPSBnZXRUYWJiYWJsZU5vZGVzKFtjb21tb25QYXJlbnRdLCB0cnVlKTtcbiAgdmFyIGlubmVyRWxlbWVudHMgPSBnZXRUYWJiYWJsZU5vZGVzKGVudHJpZXMpLmZpbHRlcihmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBub2RlID0gX3JlZi5ub2RlO1xuICAgIHJldHVybiBub3RBR3VhcmQobm9kZSk7XG4gIH0pLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgbm9kZSA9IF9yZWYyLm5vZGU7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pO1xuXG4gIHJldHVybiBvdXRlck5vZGVzLm1hcChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICB2YXIgbm9kZSA9IF9yZWYzLm5vZGUsXG4gICAgICAgIGluZGV4ID0gX3JlZjMuaW5kZXg7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IG5vZGUsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBsb2NrSXRlbTogaW5uZXJFbGVtZW50cy5pbmRleE9mKG5vZGUpID49IDAsXG4gICAgICBndWFyZDogaXNHdWFyZChub2RlKVxuICAgIH07XG4gIH0pO1xufTtcblxudmFyIGdldEZvY3VzTWVyZ2UgPSBmdW5jdGlvbiBnZXRGb2N1c01lcmdlKHRvcE5vZGUsIGxhc3ROb2RlKSB7XG4gIHZhciBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgdmFyIGVudHJpZXMgPSBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLmZpbHRlcihub3RBR3VhcmQpO1xuXG4gIHZhciBjb21tb25QYXJlbnQgPSBnZXRUb3BDb21tb25QYXJlbnQoYWN0aXZlRWxlbWVudCB8fCB0b3BOb2RlLCB0b3BOb2RlLCBlbnRyaWVzKTtcblxuICB2YXIgaW5uZXJFbGVtZW50cyA9IGdldFRhYmJhYmxlTm9kZXMoZW50cmllcykuZmlsdGVyKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgIHZhciBub2RlID0gX3JlZjQubm9kZTtcbiAgICByZXR1cm4gbm90QUd1YXJkKG5vZGUpO1xuICB9KTtcblxuICBpZiAoIWlubmVyRWxlbWVudHNbMF0pIHtcbiAgICBpbm5lckVsZW1lbnRzID0gZ2V0QWxsVGFiYmFibGVOb2RlcyhlbnRyaWVzKS5maWx0ZXIoZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgICB2YXIgbm9kZSA9IF9yZWY1Lm5vZGU7XG4gICAgICByZXR1cm4gbm90QUd1YXJkKG5vZGUpO1xuICAgIH0pO1xuICAgIGlmICghaW5uZXJFbGVtZW50c1swXSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0ZXJOb2RlcyA9IGdldFRhYmJhYmxlTm9kZXMoW2NvbW1vblBhcmVudF0pLm1hcChmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICB2YXIgbm9kZSA9IF9yZWY2Lm5vZGU7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pO1xuICB2YXIgb3JkZXJlZElubmVyRWxlbWVudHMgPSByZW9yZGVyTm9kZXMob3V0ZXJOb2RlcywgaW5uZXJFbGVtZW50cyk7XG4gIHZhciBpbm5lck5vZGVzID0gb3JkZXJlZElubmVyRWxlbWVudHMubWFwKGZ1bmN0aW9uIChfcmVmNykge1xuICAgIHZhciBub2RlID0gX3JlZjcubm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfSk7XG5cbiAgdmFyIG5ld0lkID0gbmV3Rm9jdXMoaW5uZXJOb2Rlcywgb3V0ZXJOb2RlcywgYWN0aXZlRWxlbWVudCwgbGFzdE5vZGUsIGlubmVyTm9kZXMuZmlsdGVyKGZpbmRBdXRvRm9jdXNlZChhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyhlbnRyaWVzKSkpKTtcblxuICBpZiAobmV3SWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXdJZDtcbiAgfVxuICByZXR1cm4gb3JkZXJlZElubmVyRWxlbWVudHNbbmV3SWRdO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0Rm9jdXNNZXJnZTsiLCJpbXBvcnQgZ2V0Rm9jdXNNZXJnZSBmcm9tICcuL2ZvY3VzTWVyZ2UnO1xuXG5leHBvcnQgdmFyIGZvY3VzT24gPSBmdW5jdGlvbiBmb2N1c09uKHRhcmdldCkge1xuICB0YXJnZXQuZm9jdXMoKTtcbiAgaWYgKHRhcmdldC5jb250ZW50V2luZG93KSB7XG4gICAgdGFyZ2V0LmNvbnRlbnRXaW5kb3cuZm9jdXMoKTtcbiAgfVxufTtcblxudmFyIGd1YXJkQ291bnQgPSAwO1xudmFyIGxvY2tEaXNhYmxlZCA9IGZhbHNlO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHRvcE5vZGUsIGxhc3ROb2RlKSB7XG4gIHZhciBmb2N1c2FibGUgPSBnZXRGb2N1c01lcmdlKHRvcE5vZGUsIGxhc3ROb2RlKTtcblxuICBpZiAobG9ja0Rpc2FibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZvY3VzYWJsZSkge1xuICAgIGlmIChndWFyZENvdW50ID4gMikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZvY3VzTG9jazogZm9jdXMtZmlnaHRpbmcgZGV0ZWN0ZWQuIE9ubHkgb25lIGZvY3VzIG1hbmFnZW1lbnQgc3lzdGVtIGNvdWxkIGJlIGFjdGl2ZS4gJyArICdTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9mb2N1cy1sb2NrLyNmb2N1cy1maWdodGluZycpO1xuICAgICAgbG9ja0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBsb2NrRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH0sIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBndWFyZENvdW50Kys7XG4gICAgZm9jdXNPbihmb2N1c2FibGUubm9kZSk7XG4gICAgZ3VhcmRDb3VudC0tO1xuICB9XG59KTsiLCJpbXBvcnQgdGFiSG9vayBmcm9tICcuL3RhYkhvb2snO1xuaW1wb3J0IGZvY3VzTWVyZ2UsIHsgZ2V0Rm9jdXNhYmxlZEluIH0gZnJvbSAnLi9mb2N1c01lcmdlJztcbmltcG9ydCBmb2N1c0luc2lkZSBmcm9tICcuL2ZvY3VzSW5zaWRlJztcbmltcG9ydCBmb2N1c0lzSGlkZGVuIGZyb20gJy4vZm9jdXNJc0hpZGRlbic7XG5pbXBvcnQgc2V0Rm9jdXMgZnJvbSAnLi9zZXRGb2N1cyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IGdldEFsbEFmZmVjdGVkTm9kZXMgZnJvbSAnLi91dGlscy9hbGwtYWZmZWN0ZWQnO1xuXG5leHBvcnQgeyB0YWJIb29rLCBmb2N1c0luc2lkZSwgZm9jdXNJc0hpZGRlbiwgZm9jdXNNZXJnZSwgZ2V0Rm9jdXNhYmxlZEluLCBjb25zdGFudHMsIGdldEFsbEFmZmVjdGVkTm9kZXMgfTtcblxuZXhwb3J0IGRlZmF1bHQgc2V0Rm9jdXM7IiwiaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJy4vdXRpbHMvYXJyYXknO1xuaW1wb3J0IHsgRk9DVVNfQUxMT1cgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbnZhciBmb2N1c0lzSGlkZGVuID0gZnVuY3Rpb24gZm9jdXNJc0hpZGRlbigpIHtcbiAgcmV0dXJuIGRvY3VtZW50ICYmIHRvQXJyYXkoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnWycgKyBGT0NVU19BTExPVyArICddJykpLnNvbWUoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmb2N1c0lzSGlkZGVuOyIsImltcG9ydCBnZXRBbGxBZmZlY3RlZE5vZGVzIGZyb20gJy4vdXRpbHMvYWxsLWFmZmVjdGVkJztcbmltcG9ydCB7IGFycmF5RmluZCwgdG9BcnJheSB9IGZyb20gJy4vdXRpbHMvYXJyYXknO1xuXG52YXIgZm9jdXNJbkZyYW1lID0gZnVuY3Rpb24gZm9jdXNJbkZyYW1lKGZyYW1lKSB7XG4gIHJldHVybiBmcmFtZSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbn07XG5cbnZhciBmb2N1c0luc2lkZUlmcmFtZSA9IGZ1bmN0aW9uIGZvY3VzSW5zaWRlSWZyYW1lKHRvcE5vZGUpIHtcbiAgcmV0dXJuICEhYXJyYXlGaW5kKHRvQXJyYXkodG9wTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSksIGZvY3VzSW5GcmFtZSk7XG59O1xuXG52YXIgZm9jdXNJbnNpZGUgPSBmdW5jdGlvbiBmb2N1c0luc2lkZSh0b3BOb2RlKSB7XG4gIHZhciBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgYWN0aXZlRWxlbWVudC5kYXRhc2V0ICYmIGFjdGl2ZUVsZW1lbnQuZGF0YXNldC5mb2N1c0d1YXJkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBub2RlKSB7XG4gICAgcmV0dXJuIHJlc3VsdCB8fCBub2RlLmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpIHx8IGZvY3VzSW5zaWRlSWZyYW1lKG5vZGUpO1xuICB9LCBmYWxzZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmb2N1c0luc2lkZTsiLCJpbXBvcnQgbW92ZUZvY3VzSW5zaWRlLCB7IGZvY3VzSXNIaWRkZW4sIGZvY3VzSW5zaWRlIH0gZnJvbSAnZm9jdXMtbG9jayc7XG5cbnZhciBsYXN0QWN0aXZlVHJhcCA9IDA7XG52YXIgbGFzdEFjdGl2ZUZvY3VzID0gbnVsbDtcblxudmFyIGZvY3VzT25Cb2R5ID0gZnVuY3Rpb24gZm9jdXNPbkJvZHkoKSB7XG4gIHJldHVybiBkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5O1xufTtcblxudmFyIGlzRnJlZUZvY3VzID0gZnVuY3Rpb24gaXNGcmVlRm9jdXMoKSB7XG4gIHJldHVybiBmb2N1c09uQm9keSgpIHx8IGZvY3VzSXNIaWRkZW4oKTtcbn07XG5cbnZhciBhY3RpdmF0ZVRyYXAgPSBmdW5jdGlvbiBhY3RpdmF0ZVRyYXAoKSB7XG4gIHZhciByZXN1bHQgPSBmYWxzZTtcblxuICBpZiAobGFzdEFjdGl2ZVRyYXApIHtcbiAgICB2YXIgb2JzZXJ2ZWQgPSBsYXN0QWN0aXZlVHJhcDtcblxuICAgIGlmICghaXNGcmVlRm9jdXMoKSkge1xuICAgICAgaWYgKG9ic2VydmVkICYmICFmb2N1c0luc2lkZShvYnNlcnZlZCkpIHtcbiAgICAgICAgcmVzdWx0ID0gbW92ZUZvY3VzSW5zaWRlKG9ic2VydmVkLCBsYXN0QWN0aXZlRm9jdXMpO1xuICAgICAgfVxuXG4gICAgICBsYXN0QWN0aXZlRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgcmVkdWNlUHJvcHNUb1N0YXRlID0gZnVuY3Rpb24gcmVkdWNlUHJvcHNUb1N0YXRlKHByb3BzTGlzdCkge1xuICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlO1xuICB9KS5zbGljZSgtMSlbMF07XG59O1xuXG52YXIgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCA9IGZ1bmN0aW9uIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQodHJhcCkge1xuICBsYXN0QWN0aXZlVHJhcCA9IHRyYXA7XG5cbiAgaWYgKHRyYXApIHtcbiAgICBhY3RpdmF0ZVRyYXAoKTtcbiAgfVxufTtcblxudmFyIGluc3RhbmNlcyA9IFtdO1xuXG52YXIgZW1pdENoYW5nZSA9IGZ1bmN0aW9uIGVtaXRDaGFuZ2UoZXZlbnQpIHtcbiAgaWYgKGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQocmVkdWNlUHJvcHNUb1N0YXRlKGluc3RhbmNlcykpKSB7XG4gICAgZXZlbnQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbnZhciBhdHRhY2hIYW5kbGVyID0gZnVuY3Rpb24gYXR0YWNoSGFuZGxlcigpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGVtaXRDaGFuZ2UpO1xufTtcblxudmFyIGRldGFjaEhhbmRsZXIgPSBmdW5jdGlvbiBkZXRhY2hIYW5kbGVyKCkge1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgZW1pdENoYW5nZSk7XG59O1xuXG52YXIgZm9jdXNMb2NrID0ge1xuICBvbjogZnVuY3Rpb24gb24oZG9tTm9kZSkge1xuICAgIGlmIChpbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhdHRhY2hIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlcy5pbmRleE9mKGRvbU5vZGUpIDwgMCkge1xuICAgICAgaW5zdGFuY2VzLnB1c2goZG9tTm9kZSk7XG4gICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9LFxuICBvZmY6IGZ1bmN0aW9uIG9mZihkb21Ob2RlKSB7XG4gICAgaW5zdGFuY2VzID0gaW5zdGFuY2VzLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUgIT09IGRvbU5vZGU7XG4gICAgfSk7XG4gICAgZW1pdENoYW5nZSgpO1xuXG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRldGFjaEhhbmRsZXIoKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZvY3VzTG9jaztcbiIsImltcG9ydCBmb2N1c0xvY2sgZnJvbSAnZG9tLWZvY3VzLWxvY2snO1xuaW1wb3J0IHsgaXNUb3VjaERldmljZSB9IGZyb20gJy4vaXMtdG91Y2gtZGV2aWNlJztcbmV4cG9ydCBjb25zdCBmb2N1c0xvY2tPbiA9IGNvbnRhaW5lciA9PiB7XG4gIGxldCBmb2N1c0xvY2tUb1VzZSA9IGZvY3VzTG9jaztcblxuICBpZiAod2luZG93LmN0RnJvbnRlbmQgJiYgd2luZG93LmN0RnJvbnRlbmQuZm9jdXNMb2NrKSB7XG4gICAgZm9jdXNMb2NrVG9Vc2UgPSBjdEZyb250ZW5kLmZvY3VzTG9jaztcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuY3RGcm9udGVuZCA9IHdpbmRvdy5jdEZyb250ZW5kIHx8IHt9O1xuICAgIHdpbmRvdy5jdEZyb250ZW5kLmZvY3VzTG9jayA9IGZvY3VzTG9ja1RvVXNlO1xuICB9XG5cbiAgZm9jdXNMb2NrVG9Vc2Uub24oY29udGFpbmVyKTtcbn07XG5leHBvcnQgY29uc3QgZm9jdXNMb2NrT2ZmID0gY29udGFpbmVyID0+IHtcbiAgbGV0IGZvY3VzTG9ja1RvVXNlID0gZm9jdXNMb2NrO1xuXG4gIGlmICh3aW5kb3cuY3RGcm9udGVuZCAmJiB3aW5kb3cuY3RGcm9udGVuZC5mb2N1c0xvY2spIHtcbiAgICBmb2N1c0xvY2tUb1VzZSA9IGN0RnJvbnRlbmQuZm9jdXNMb2NrO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5jdEZyb250ZW5kID0gd2luZG93LmN0RnJvbnRlbmQgfHwge307XG4gICAgd2luZG93LmN0RnJvbnRlbmQuZm9jdXNMb2NrID0gZm9jdXNMb2NrVG9Vc2U7XG4gIH1cblxuICBmb2N1c0xvY2tUb1VzZS5vZmYoY29udGFpbmVyKTtcbn07IiwiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgZW5hYmxlLCBkaXNhYmxlIH0gZnJvbSAnLi9vdmVybGF5L25vLWJvdW5jZSc7XG5pbXBvcnQgY3RFdmVudHMgZnJvbSAnY3QtZXZlbnRzJztcbmltcG9ydCB7IG1vdW50IGFzIG1vdW50TW9iaWxlTWVudSB9IGZyb20gJy4vb3ZlcmxheS9tb2JpbGUtbWVudSc7XG5pbXBvcnQgeyBmb2N1c0xvY2tPbiwgZm9jdXNMb2NrT2ZmIH0gZnJvbSAnLi4vaGVscGVycy9mb2N1cy1sb2NrJztcblxuY29uc3Qgc2hvd09mZmNhbnZhcyA9IHNldHRpbmdzID0+IHtcbiAgc2V0dGluZ3MgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICBvbkNsb3NlOiAoKSA9PiB7fSxcbiAgICBjb250YWluZXI6IG51bGwsXG4gICAgZm9jdXM6IHRydWVcbiAgfSwgc2V0dGluZ3MpO1xuICBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtdG9nZ2xlLXBhbmVsKj1cIiR7c2V0dGluZ3MuY29udGFpbmVyLmlkfVwiXWApLCAuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbaHJlZio9XCIke3NldHRpbmdzLmNvbnRhaW5lci5pZH1cIl1gKV0ubWFwKHRyaWdnZXIgPT4ge1xuICAgIHRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgfSk7XG5cbiAgaWYgKHNldHRpbmdzLmZvY3VzKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzZXR0aW5ncy5jb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXQnKSAmJiBzZXR0aW5ncy5jb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xuICAgIH0sIDIwMCk7XG4gIH1cblxuICBpZiAoc2V0dGluZ3MuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5jdC1wYW5lbC1jb250ZW50JykpIHtcbiAgICBzZXR0aW5ncy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLmN0LXBhbmVsLWNvbnRlbnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgIEFycmF5LmZyb20oc2V0dGluZ3MuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpKS5tYXAoc2VsZWN0ID0+IHNlbGVjdC5zZWxlY3RyICYmIHNlbGVjdC5zZWxlY3RyLmV2ZW50cy5kaXNtaXNzKGV2ZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoc2V0dGluZ3MuY2xpY2tPdXRzaWRlICYmIHNldHRpbmdzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuY3QtcGFuZWwtY29udGVudCcpKSB7XG4gICAgc2V0dGluZ3MuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2V0dGluZ3MuaGFuZGxlQ29udGFpbmVyQ2xpY2spO1xuICB9XG5cbiAgY29uc3Qgb25LZXlVcCA9IGV2ZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBrZXlDb2RlLFxuICAgICAgdGFyZ2V0XG4gICAgfSA9IGV2ZW50O1xuICAgIGlmIChrZXlDb2RlICE9PSAyNykgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGFuZWwnKSAmJiBoaWRlT2ZmY2FudmFzKHNldHRpbmdzKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIG9uS2V5VXApO1xuICB9O1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25LZXlVcCk7XG4gIGxldCBtYXliZUNsb3NlQnV0dG9uID0gc2V0dGluZ3MuY29udGFpbmVyICYmIHNldHRpbmdzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuY3QtdG9nZ2xlLWNsb3NlJyk7XG5cbiAgaWYgKG1heWJlQ2xvc2VCdXR0b24pIHtcbiAgICBtYXliZUNsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGhpZGVPZmZjYW52YXMoc2V0dGluZ3MpO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWVcbiAgICB9KTtcblxuICAgIGlmICghbWF5YmVDbG9zZUJ1dHRvbi5oYXNFbnRlckxpc3RlbmVyKSB7XG4gICAgICBtYXliZUNsb3NlQnV0dG9uLmhhc0VudGVyTGlzdGVuZXIgPSB0cnVlO1xuICAgICAgbWF5YmVDbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGUgPT4ge1xuICAgICAgICBpZiAoMTMgPT0gZS5rZXlDb2RlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGhpZGVPZmZjYW52YXMoc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2V0dGluZ3MuY29tcHV0ZVNjcm9sbENvbnRhaW5lciB8fCBzZXR0aW5ncy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLmN0LXBhbmVsLWNvbnRlbnQnKSkge1xuICAgIGRpc2FibGUoc2V0dGluZ3MuY29tcHV0ZVNjcm9sbENvbnRhaW5lciA/IHNldHRpbmdzLmNvbXB1dGVTY3JvbGxDb250YWluZXIoKSA6IHNldHRpbmdzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuY3QtcGFuZWwtY29udGVudCcpKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGZvY3VzTG9ja09uKHNldHRpbmdzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuY3QtcGFuZWwtY29udGVudCcpLnBhcmVudE5vZGUpO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgd2luZG93IGV2ZW50IGxpc3RlbmVyIGluIHRoZSBuZXh0IGZyYW1lLiBUaGlzIGFsbG93cyB1cyB0byBmcmVlbHlcbiAgICogcHJvcGFnYXRlIHRoZSBjdXJyZW50IGNsY2sgZXZlbnQgdXAgdGhlIGNoYWluIC0tIHdpdGhvdXQgdGhlIG1vZGFsXG4gICAqIGdldHRpbmcgY2xvc2VkLlxuICAgKi9cblxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNldHRpbmdzLmhhbmRsZVdpbmRvd0NsaWNrLCB7XG4gICAgY2FwdHVyZTogdHJ1ZVxuICB9KTtcbiAgY3RFdmVudHMudHJpZ2dlcignY3Q6bW9kYWw6b3BlbmVkJywgc2V0dGluZ3MuY29udGFpbmVyKTtcbiAgWy4uLnNldHRpbmdzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuY3QtdG9nZ2xlLWRyb3Bkb3duLW1vYmlsZScpXS5tYXAoYXJyb3cgPT4ge1xuICAgIG1vdW50TW9iaWxlTWVudShhcnJvdyk7XG4gIH0pO1xufTtcblxuY29uc3QgaGlkZU9mZmNhbnZhcyA9IGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICBsZXQgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHNldHRpbmdzID0gX29iamVjdFNwcmVhZCh7XG4gICAgb25DbG9zZTogKCkgPT4ge30sXG4gICAgY29udGFpbmVyOiBudWxsXG4gIH0sIHNldHRpbmdzKTtcbiAgYXJncyA9IF9vYmplY3RTcHJlYWQoe1xuICAgIGNsb3NlSW5zdGFudDogZmFsc2VcbiAgfSwgYXJncyk7XG5cbiAgaWYgKCFkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgnZGF0YS1wYW5lbCcpKSB7XG4gICAgc2V0dGluZ3MuY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIHNldHRpbmdzLm9uQ2xvc2UoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICA7XG4gIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS10b2dnbGUtcGFuZWwqPVwiJHtzZXR0aW5ncy5jb250YWluZXIuaWR9XCJdYCksIC4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtocmVmKj1cIiR7c2V0dGluZ3MuY29udGFpbmVyLmlkfVwiXWApXS5tYXAodHJpZ2dlciA9PiB7XG4gICAgdHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgfSk7XG4gIHNldHRpbmdzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICBpZiAoYXJncy5jbG9zZUluc3RhbnQpIHtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1wYW5lbCcpO1xuICAgIGN0RXZlbnRzLnRyaWdnZXIoJ2N0Om1vZGFsOmNsb3NlZCcsIHNldHRpbmdzLmNvbnRhaW5lcik7XG4gICAgZW5hYmxlKHNldHRpbmdzLmNvbXB1dGVTY3JvbGxDb250YWluZXIgPyBzZXR0aW5ncy5jb21wdXRlU2Nyb2xsQ29udGFpbmVyKCkgOiBzZXR0aW5ncy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLmN0LXBhbmVsLWNvbnRlbnQnKSk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYm9keS5kYXRhc2V0LnBhbmVsID0gYG91dGA7XG4gICAgc2V0dGluZ3MuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGFuZWwnKTtcbiAgICAgICAgY3RFdmVudHMudHJpZ2dlcignY3Q6bW9kYWw6Y2xvc2VkJywgc2V0dGluZ3MuY29udGFpbmVyKTtcbiAgICAgICAgZW5hYmxlKHNldHRpbmdzLmNvbXB1dGVTY3JvbGxDb250YWluZXIgPyBzZXR0aW5ncy5jb21wdXRlU2Nyb2xsQ29udGFpbmVyKCkgOiBzZXR0aW5ncy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLmN0LXBhbmVsLWNvbnRlbnQnKSk7XG4gICAgICAgIGZvY3VzTG9ja09mZihzZXR0aW5ncy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLmN0LXBhbmVsLWNvbnRlbnQnKS5wYXJlbnROb2RlKTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfSwge1xuICAgICAgb25jZTogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2V0dGluZ3MuaGFuZGxlV2luZG93Q2xpY2ssIHtcbiAgICBjYXB0dXJlOiB0cnVlXG4gIH0pO1xuICBzZXR0aW5ncy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZXR0aW5ncy5oYW5kbGVDb250YWluZXJDbGljayk7XG4gIHNldHRpbmdzLm9uQ2xvc2UoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVDbGljayA9IChlLCBzZXR0aW5ncykgPT4ge1xuICBpZiAoZSAmJiBlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgc2V0dGluZ3MgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICBvbkNsb3NlOiAoKSA9PiB7fSxcbiAgICBjb250YWluZXI6IG51bGwsXG4gICAgZm9jdXM6IGZhbHNlLFxuICAgIGNsaWNrT3V0c2lkZTogdHJ1ZSxcbiAgICBpc01vZGFsOiBmYWxzZSxcbiAgICBjb21wdXRlU2Nyb2xsQ29udGFpbmVyOiBudWxsLFxuICAgIGNsb3NlV2hlbkxpbmtJbnNpZGU6IGZhbHNlLFxuICAgIGhhbmRsZUNvbnRhaW5lckNsaWNrOiBldmVudCA9PiB7XG4gICAgICBsZXQgaXNJbnNpZGVQYW5lbENvbnRlbnQgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLmN0LXBhbmVsLWNvbnRlbnQnKTtcbiAgICAgIGxldCBpc1BhbmVsQ29udGVudEl0c2VsZiA9IFsuLi5zZXR0aW5ncy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmN0LXBhbmVsLWNvbnRlbnQnKV0uaW5kZXhPZihldmVudC50YXJnZXQpID4gLTE7XG5cbiAgICAgIGlmIChzZXR0aW5ncy5pc01vZGFsICYmICFpc1BhbmVsQ29udGVudEl0c2VsZiAmJiBpc0luc2lkZVBhbmVsQ29udGVudCB8fCAhc2V0dGluZ3MuaXNNb2RhbCAmJiAoaXNQYW5lbENvbnRlbnRJdHNlbGYgfHwgaXNJbnNpZGVQYW5lbENvbnRlbnQpIHx8IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdbY2xhc3MqPVwic2VsZWN0Mi1jb250YWluZXJcIl0nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGFuZWwnKSAmJiBoaWRlT2ZmY2FudmFzKHNldHRpbmdzKTtcbiAgICB9LFxuICAgIGhhbmRsZVdpbmRvd0NsaWNrOiBlID0+IHtcbiAgICAgIGlmIChzZXR0aW5ncy5jb250YWluZXIuY29udGFpbnMoZS50YXJnZXQpIHx8IGUudGFyZ2V0ID09PSBkb2N1bWVudC5ib2R5IHx8IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdbY2xhc3MqPVwic2VsZWN0Mi1jb250YWluZXJcIl0nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGFuZWwnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGhpZGVPZmZjYW52YXMoc2V0dGluZ3MpO1xuICAgIH1cbiAgfSwgc2V0dGluZ3MpO1xuICBzaG93T2ZmY2FudmFzKHNldHRpbmdzKTtcbiAgLypcbiAgaWYgKGRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLXBhbmVsJykpIHtcbiAgXHRpZiAoXG4gIFx0XHRzZXR0aW5ncy5pc01vZGFsICYmXG4gIFx0XHQhc2V0dGluZ3MuY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJylcbiAgXHQpIHtcbiAgXHRcdGNvbnN0IG1lbnVUb2dnbGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY3QtaGVhZGVyLXRyaWdnZXInKVxuICBcdFx0XHRpZiAobWVudVRvZ2dsZSkge1xuICBcdFx0XHRtZW51VG9nZ2xlLmNsaWNrKClcbiAgXHRcdH1cbiAgXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG4gIFx0XHRcdHNob3dPZmZjYW52YXMoc2V0dGluZ3MpXG4gIFx0XHR9LCA2MDApXG4gIFx0fSBlbHNlIHtcbiAgXHRcdGhpZGVPZmZjYW52YXMoc2V0dGluZ3MpXG4gIFx0fVxuICB9IGVsc2Uge1xuICBcdHNob3dPZmZjYW52YXMoc2V0dGluZ3MpXG4gIH1cbiAgKi9cblxuICBpZiAoc2V0dGluZ3MuY2xvc2VXaGVuTGlua0luc2lkZSkge1xuICAgIGlmICghc2V0dGluZ3MuY29udGFpbmVyLmhhc0xpc3RlbmVyKSB7XG4gICAgICBzZXR0aW5ncy5jb250YWluZXIuaGFzTGlzdGVuZXIgPSB0cnVlO1xuICAgICAgc2V0dGluZ3MuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXliZUEgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbG9zZXN0KCdhJykpIHtcbiAgICAgICAgICBtYXliZUEgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnYScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtYXliZUEuY2xvc2VzdCgnLmN0LXBhbmVsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWF5YmVBLm1hdGNoZXMoJ2EnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWF5YmVBLmNsb3Nlc3QoJ25hdltkYXRhLWlkKj1cIm1lbnVcIl0nKSAmJiAhbWF5YmVBLmNsb3Nlc3QoJ1tkYXRhLWlkKj1cInRleHRcIl0nKSAmJiAhbWF5YmVBLmNsb3Nlc3QoJ1tkYXRhLWlkKj1cImJ1dHRvblwiXScpICYmICFtYXliZUEubWF0Y2hlcygnLmN0LW9mZmNhbnZhcy10cmlnZ2VyJykgJiYgIW1heWJlQS5tYXRjaGVzKCcuY3QtaGVhZGVyLWFjY291bnQnKSAmJiAhbWF5YmVBLmNsb3Nlc3QoJy53aWRnZXRfbmF2X21lbnUnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGhpZGVPZmZjYW52YXMoc2V0dGluZ3MsIHtcbiAgICAgICAgICBjbG9zZUluc3RhbnQ6IG1heWJlQS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKVswXSAhPT0gJyMnXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAobWF5YmVBLm1hdGNoZXMoJy5jdC1vZmZjYW52YXMtdHJpZ2dlcicpIHx8IG1heWJlQS5tYXRjaGVzKCcuY3QtaGVhZGVyLWFjY291bnQnKSkge1xuICAgICAgICAgICAgbWF5YmVBLmNsaWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MDApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuY3RFdmVudHMub24oJ2N0Om9mZmNhbnZhczpmb3JjZS1jbG9zZScsIHNldHRpbmdzID0+IGhpZGVPZmZjYW52YXMoc2V0dGluZ3MpKTtcbmV4cG9ydCBjb25zdCBtb3VudCA9IChlbCwgX3JlZikgPT4ge1xuICBsZXQge1xuICAgIGV2ZW50LFxuICAgIGZvY3VzID0gZmFsc2VcbiAgfSA9IF9yZWY7XG4gIGhhbmRsZUNsaWNrKGV2ZW50LCB7XG4gICAgaXNNb2RhbDogdHJ1ZSxcbiAgICBjb250YWluZXI6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwuZGF0YXNldC50b2dnbGVQYW5lbCB8fCBlbC5oYXNoKSxcbiAgICBjbGlja091dHNpZGU6IHRydWUsXG4gICAgZm9jdXNcbiAgfSk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///627\n")},891:function(module,exports){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(e,t){if(true)!(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (t),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else { var o; }}(this,function(exports){"use strict";function i(e){if(Array.isArray(e)){for(var t=0,o=Array(e.length);t