"use strict";(globalThis.blocksyJsonP=globalThis.blocksyJsonP||[]).push([[400],{400:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "mount": () => (/* binding */ mount)\n});\n\n// EXTERNAL MODULE: external "jQuery"\nvar external_jQuery_ = __webpack_require__(194);\nvar external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_);\n;// CONCATENATED MODULE: ./node_modules/flexy/dist/flexy.es.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) { _defineProperty2(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 _defineProperty2(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\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nconst getRightOrBottom = (rect, flexyInstance) => {\n if (flexyInstance.options.orientation === "vertical") {\n return rect.top + rect.height;\n }\n\n return rect.right;\n};\n\nconst getLeftOrTop = (rect, flexyInstance) => {\n if (flexyInstance.options.orientation === "vertical") {\n return rect.top;\n }\n\n return rect.left;\n};\n\nconst getDimensionFor = (rect, flexyInstance) => {\n if (flexyInstance.options.orientation === "vertical") {\n return rect.height;\n }\n\n return rect.width;\n};\n/**\n * Develop a suggestion-based mechanism.\n * That is, ignore a checking for a specific side when we do not have a need\n * for it. Also, when we don\'t care about that particular side.\n *\n * TODO: implement _both_ strategy for wrapAround\n */\n\n\nconst fetchWrapAroundStatusFor = function (flexyInstance, elementsOnBehind) {\n let theSideWeAreMovingOnto = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "left";\n let wrapAroundMode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "container";\n const sliderContainer = flexyInstance.sliderContainer;\n let relativeDelta = 0;\n\n if (theSideWeAreMovingOnto === "left") {\n let leftmostOffset = [...sliderContainer.children].reduce((leftmostEl, currentEl) => {\n let left = getLeftOrTop(nullifyTransforms(leftmostEl, flexyInstance.options.nullifyTransformEl), flexyInstance);\n let currentLeft = getLeftOrTop(nullifyTransforms(currentEl, flexyInstance.options.nullifyTransformEl), flexyInstance);\n return currentLeft < left ? currentEl : leftmostEl;\n }, {\n getBoundingClientRect: () => ({\n left: 100000000000,\n bottom: 100000000000,\n top: 100000000000,\n right: 100000000000\n })\n });\n\n if (getLeftOrTop(nullifyTransforms(leftmostOffset, flexyInstance.options.nullifyTransformEl), flexyInstance) > (wrapAroundMode === "container" ? getLeftOrTop(nullifyTransforms(sliderContainer, flexyInstance.options.nullifyTransformEl), flexyInstance) : 0)) {\n relativeDelta = -1 * getDimensionFor(nullifyTransforms(sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl), flexyInstance);\n elementsOnBehind = elementsOnBehind === sliderContainer.children.length ? 1 : elementsOnBehind + 1;\n }\n }\n\n if (theSideWeAreMovingOnto === "right") {\n let rightmostOffset = [...sliderContainer.children].reduce((rightmostEl, currentEl) => {\n let right = getRightOrBottom(nullifyTransforms(rightmostEl, flexyInstance.options.nullifyTransformEl), flexyInstance);\n let currentRight = getRightOrBottom(nullifyTransforms(currentEl, flexyInstance.options.nullifyTransformEl), flexyInstance);\n return right > currentRight ? rightmostEl : currentEl;\n }, {\n getBoundingClientRect: () => ({\n left: -1,\n bottom: -9999999999999,\n top: -1,\n right: -1\n })\n });\n\n if (getRightOrBottom(nullifyTransforms(rightmostOffset, flexyInstance.options.nullifyTransformEl), flexyInstance) < (wrapAroundMode === "container" ? getRightOrBottom(nullifyTransforms(sliderContainer, flexyInstance.options.nullifyTransformEl), flexyInstance) : window.innerWidth)) {\n relativeDelta = getDimensionFor(nullifyTransforms(sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl), flexyInstance);\n elementsOnBehind = elementsOnBehind === 1 ? sliderContainer.children.length : elementsOnBehind - 1;\n }\n }\n\n return {\n relativeDelta,\n elementsOnBehind\n };\n};\n\nfunction nullifyTransforms(el) {\n let elementToLookAt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!el) return null;\n\n if (el.getBoundingClientRect && !el.firstElementChild) {\n return el.getBoundingClientRect();\n }\n\n if (!elementToLookAt) {\n elementToLookAt = el;\n } //add sanity checks and default values\n\n\n let {\n top,\n left,\n right,\n width,\n height\n } = el.getBoundingClientRect();\n let transformArr = window.getComputedStyle(elementToLookAt).transform.split(/\\(|,|\\)/).slice(1, -1).map(v => parseFloat(v));\n\n if (transformArr.length != 6) {\n return el.getBoundingClientRect();\n } // 2D matrix\n // need some math to apply inverse of matrix\n // That is the matrix of the transformation of the element\n\n\n var t = transformArr;\n let det = t[0] * t[3] - t[1] * t[2];\n /*if (transformArr.length > 6)*/\n //3D matrix\n //haven\'t done the calculation to apply inverse of 4x4 matrix\n\n return {\n width: width / t[0],\n height: height / t[3],\n left: (left * t[3] - top * t[2] + t[2] * t[5] - t[4] * t[3]) / det,\n right: (right * t[3] - top * t[2] + t[2] * t[5] - t[4] * t[3]) / det,\n top: (-left * t[1] + top * t[0] + t[4] * t[1] - t[0] * t[5]) / det\n };\n}\n\nconst renderPillsFor = flexyInstance => {\n if (!flexyInstance.options.pillsContainerSelector) return;\n flexyInstance.options.pillsContainerSelector.querySelector(".active") && flexyInstance.options.pillsContainerSelector.querySelector(".active").classList.remove("active");\n flexyInstance.options.pillsContainerSelector.children[flexyInstance.state.previousCurrentIndex].classList.add("active");\n\n if (flexyInstance.options.pillsFlexyInstance) {\n let localFlexyInstance = flexyInstance.options.pillsFlexyInstance.flexy;\n let allPills = [...flexyInstance.options.pillsContainerSelector.children];\n let fromIndex = [...localFlexyInstance.sliderContainer.children].indexOf([...localFlexyInstance.sliderContainer.children].reduce((leftmostEl, currentEl) => {\n let left = getLeftOrTop(nullifyTransforms(leftmostEl, localFlexyInstance.options.nullifyTransformEl), localFlexyInstance);\n let currentLeft = getLeftOrTop(nullifyTransforms(currentEl, localFlexyInstance.options.nullifyTransformEl), localFlexyInstance);\n return Math.abs(currentLeft - getLeftOrTop(nullifyTransforms(localFlexyInstance.sliderContainer, localFlexyInstance.options.nullifyTransformEl), localFlexyInstance)) < Math.abs(left - getLeftOrTop(nullifyTransforms(localFlexyInstance.sliderContainer, localFlexyInstance.options.nullifyTransformEl), localFlexyInstance)) ? currentEl : leftmostEl;\n }, {\n getBoundingClientRect: () => ({\n left: 100000000000,\n top: 100000000000\n })\n }));\n let toIndex = 0;\n\n if (localFlexyInstance.options.orientation === "horizontal") {\n let perPage = Math.round(nullifyTransforms(localFlexyInstance.sliderContainer).width / nullifyTransforms(localFlexyInstance.sliderContainer.firstElementChild).width);\n toIndex = flexyInstance.state.previousCurrentIndex;\n\n if (perPage === 5) {\n if (flexyInstance.state.previousCurrentIndex > 2) {\n toIndex = flexyInstance.state.previousCurrentIndex - 2;\n }\n\n if (allPills.length - 1 - flexyInstance.state.previousCurrentIndex < 3) {\n toIndex = allPills.length - 5;\n }\n }\n\n if (perPage === 3) {\n if (flexyInstance.state.previousCurrentIndex >= 1) {\n toIndex = flexyInstance.state.previousCurrentIndex - 1;\n }\n\n if (allPills.length - 1 - flexyInstance.state.previousCurrentIndex < 1) {\n toIndex = allPills.length - 3;\n }\n }\n } else {\n toIndex = flexyInstance.state.previousCurrentIndex;\n }\n\n let amountToTheLeft = Math.abs(toIndex - fromIndex);\n let amountToTheRight = Math.min(fromIndex, toIndex) + (allPills.length - Math.max(fromIndex, toIndex));\n let p = Math.min(amountToTheLeft, amountToTheRight) * (amountToTheRight >= amountToTheLeft ? fromIndex > toIndex ? 1 : -1 : fromIndex > toIndex ? -1 : 1);\n let resultTarget = Math.round(localFlexyInstance.state.positionX * 100 / getDimensionFor(nullifyTransforms(localFlexyInstance.sliderContainer.firstElementChild, localFlexyInstance.options.nullifyTransformEl), localFlexyInstance) / 100) * 100 * getDimensionFor(nullifyTransforms(localFlexyInstance.sliderContainer.firstElementChild, localFlexyInstance.options.nullifyTransformEl), localFlexyInstance) / 100 + getDimensionFor(nullifyTransforms(localFlexyInstance.sliderContainer.firstElementChild, localFlexyInstance.options.nullifyTransformEl), localFlexyInstance) * p;\n localFlexyInstance.state = _objectSpread(_objectSpread({}, localFlexyInstance.state), {}, {\n positionTarget: resultTarget\n });\n }\n};\n\nconst mountPillsListeners = flexyInstance => {\n if (!flexyInstance.options.pillsContainerSelector) return;\n let allPills = [...flexyInstance.options.pillsContainerSelector.children];\n\n const handlePillEvent = singlePill => {\n let fromIndex = [...flexyInstance.sliderContainer.children].indexOf([...flexyInstance.sliderContainer.children].reduce((leftmostEl, currentEl) => {\n let left = getLeftOrTop(nullifyTransforms(leftmostEl, flexyInstance.options.nullifyTransformEl), flexyInstance);\n let currentLeft = getLeftOrTop(nullifyTransforms(currentEl, flexyInstance.options.nullifyTransformEl), flexyInstance);\n return Math.abs(currentLeft - getLeftOrTop(nullifyTransforms(flexyInstance.sliderContainer, flexyInstance.options.nullifyTransformEl), flexyInstance)) < Math.abs(left - getLeftOrTop(nullifyTransforms(flexyInstance.sliderContainer, flexyInstance.options.nullifyTransformEl), flexyInstance)) ? currentEl : leftmostEl;\n }, {\n getBoundingClientRect: () => ({\n left: 100000000000\n })\n }));\n let toIndex = allPills.indexOf(singlePill);\n flexyInstance.options.pillsContainerSelector.querySelector(".active") && flexyInstance.options.pillsContainerSelector.querySelector(".active").classList.remove("active");\n singlePill.classList.add("active");\n let amountToTheLeft = Math.abs(toIndex - fromIndex);\n let amountToTheRight = Math.min(fromIndex, toIndex) + (allPills.length - Math.max(fromIndex, toIndex));\n let p = Math.min(amountToTheLeft, amountToTheRight) * (amountToTheRight >= amountToTheLeft ? fromIndex > toIndex ? 1 : -1 : fromIndex > toIndex ? -1 : 1);\n let resultTarget = Math.round(flexyInstance.state.positionX * 100 / getDimensionFor(nullifyTransforms(flexyInstance.sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl), flexyInstance) / 100) * 100 * getDimensionFor(nullifyTransforms(flexyInstance.sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl), flexyInstance) / 100 + getDimensionFor(nullifyTransforms(flexyInstance.sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl), flexyInstance) * p;\n flexyInstance.state = _objectSpread(_objectSpread({}, flexyInstance.state), {}, {\n positionTarget: resultTarget\n });\n };\n\n if (flexyInstance.options.initialDragEvent && flexyInstance.options.initialDragEvent.target.closest(".flexy-pills > * > *")) {\n setTimeout(() => {\n handlePillEvent(flexyInstance.options.initialDragEvent.target.closest(".flexy-pills > * > *"));\n });\n }\n\n allPills.map(singlePill => singlePill.addEventListener("click", e => {\n handlePillEvent(singlePill);\n e.preventDefault();\n }));\n};\n\nconst moveToIndexFor = (flexyInstance, cb) => {\n let fromIndex = [...flexyInstance.sliderContainer.children].indexOf([...flexyInstance.sliderContainer.children].reduce((leftmostEl, currentEl) => {\n let left = getLeftOrTop(nullifyTransforms(leftmostEl, flexyInstance.options.nullifyTransformEl), flexyInstance);\n let currentLeft = getLeftOrTop(nullifyTransforms(currentEl, flexyInstance.options.nullifyTransformEl), flexyInstance);\n return Math.abs(currentLeft - getLeftOrTop(nullifyTransforms(flexyInstance.sliderContainer, flexyInstance.options.nullifyTransformEl), flexyInstance)) < Math.abs(left - getLeftOrTop(nullifyTransforms(flexyInstance.sliderContainer, flexyInstance.options.nullifyTransformEl), flexyInstance)) ? currentEl : leftmostEl;\n }, {\n getBoundingClientRect: () => ({\n left: 100000000000,\n top: 100000000000\n })\n }));\n let toIndex = cb(fromIndex);\n\n if (toIndex < 0) {\n toIndex = flexyInstance.sliderContainer.children.length - 1;\n }\n\n if (toIndex > flexyInstance.sliderContainer.children.length - 1) {\n toIndex = 0;\n }\n\n let amountToTheLeft = Math.abs(toIndex - fromIndex);\n let amountToTheRight = Math.min(fromIndex, toIndex) + (flexyInstance.sliderContainer.children.length - Math.max(fromIndex, toIndex));\n let p = Math.min(amountToTheLeft, amountToTheRight) * (amountToTheRight > amountToTheLeft ? fromIndex > toIndex ? 1 : -1 : fromIndex > toIndex ? -1 : 1);\n let resultTarget = Math.round(flexyInstance.state.positionX * 100 / getDimensionFor(nullifyTransforms(flexyInstance.sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl), flexyInstance) / 100) * 100 * getDimensionFor(nullifyTransforms(flexyInstance.sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl), flexyInstance) / 100 + getDimensionFor(nullifyTransforms(flexyInstance.sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl), flexyInstance) * p;\n flexyInstance.state = _objectSpread(_objectSpread({}, flexyInstance.state), {}, {\n positionTarget: resultTarget\n });\n};\n\nconst mountArrowsListeners = flexyInstance => {\n flexyInstance.options.leftArrow && flexyInstance.options.leftArrow.addEventListener("click", e => {\n e.preventDefault();\n moveToIndexFor(flexyInstance, fromIndex => fromIndex - 1);\n });\n flexyInstance.options.rightArrow && flexyInstance.options.rightArrow.addEventListener("click", e => {\n e.preventDefault();\n moveToIndexFor(flexyInstance, fromIndex => fromIndex + 1);\n });\n};\n\nconst handleHoverStateFor = flexyInstance => {\n const sliderContainer = flexyInstance.sliderContainer;\n if (!flexyInstance.options.autoplay) return;\n sliderContainer.addEventListener("mouseenter", () => flexyInstance.options = _objectSpread(_objectSpread({}, flexyInstance.options), {}, {\n autoplay: false,\n _autoplay: flexyInstance.options.autoplay\n }));\n sliderContainer.addEventListener("mouseleave", () => {\n flexyInstance.options = _objectSpread(_objectSpread({}, flexyInstance.options), {}, {\n autoplay: flexyInstance.options._autoplay,\n _autoplay: false\n });\n flexyInstance.state = _objectSpread(_objectSpread({}, flexyInstance.state), {}, {\n lastTimeAnimated: new Date().getTime()\n });\n });\n};\n\nconst adjustContainerHeightFor = flexyInstance => {\n if (!flexyInstance.options.adjustHeight) return;\n let currentChild = flexyInstance.sliderContainer.children[flexyInstance.state.previousCurrentIndex];\n flexyInstance.sliderContainer.style.setProperty("--sliderHeight", `${(currentChild.firstElementChild || currentChild).getBoundingClientRect().height}px`);\n};\n\nconst handleDragFor = (flexyInstance, getState, setState) => {\n if (!flexyInstance.options.hasDragAndDrop) {\n return;\n }\n\n const sliderContainer = flexyInstance.sliderContainer;\n\n const handleDown = e => {\n if (!getState().sliderActivated) return;\n\n if (flexyInstance.options.elementsThatDoNotStartDrag.reduce((shouldSkipDrag, selector) => shouldSkipDrag ? true : e.target.matches(selector) || e.target.closest(selector), false)) {\n return;\n } // e.preventDefault()\n\n\n e.stopPropagation();\n\n if (e.type !== "touchstart") {\n e.preventDefault();\n }\n\n flexyInstance.options.onDragStart(e);\n setState(_objectSpread(_objectSpread({}, getState()), {}, {\n startX: e.pageX || e.touches[0].pageX,\n endX: e.pageX || e.touches[0].pageX,\n mouseDown: true,\n downScrollPosition: {\n x: window.pageXOffset,\n y: window.pageYOffset\n },\n positionSnapshot: getState().positionX\n }));\n\n const handleMouseUp = e => {\n if (!getState().mouseDown) return;\n e.stopPropagation();\n setState(_objectSpread(_objectSpread({}, getState()), {}, {\n mouseDown: false\n }));\n document.removeEventListener("mousemove", handleMouseMove);\n document.removeEventListener("mouseup", handleMouseUp);\n document.removeEventListener("touchmove", handleMouseMove);\n document.removeEventListener("touchend", handleMouseUp);\n let state = getState();\n let fromPercentage = state.positionX * 100 / nullifyTransforms(sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl).width;\n setState(_objectSpread(_objectSpread({}, getState()), {}, {\n positionTarget: nullifyTransforms(sliderContainer.firstElementChild, flexyInstance.options.nullifyTransformEl).width * (Math.abs(state.endX - state.startX) > 50 ? state.endX - state.startX < 0 ? Math.floor(fromPercentage / 100) * 100 : Math.ceil(fromPercentage / 100) * 100 : Math.round(fromPercentage / 100) * 100) / 100\n }));\n };\n\n const handleMouseMove = e => {\n let {\n pageX: endX\n } = e;\n\n if (!endX) {\n endX = e.touches[0].pageX;\n }\n\n if (!getState().mouseDown) return;\n let state = getState();\n setState(_objectSpread(_objectSpread({}, state), {}, {\n endX\n }));\n\n if (Math.abs(state.downScrollPosition.x - state.scrollPosition.x) > 3 || Math.abs(state.downScrollPosition.y - state.scrollPosition.y) > 5) {\n handleMouseUp(e);\n }\n };\n\n document.addEventListener("mousemove", handleMouseMove);\n document.addEventListener("mouseup", handleMouseUp);\n document.addEventListener("touchmove", handleMouseMove);\n document.addEventListener("touchend", handleMouseUp);\n };\n\n sliderContainer.addEventListener("mousedown", handleDown);\n sliderContainer.addEventListener("touchstart", handleDown);\n\n if (flexyInstance.options.initialDragEvent && !flexyInstance.options.initialDragEvent.target.closest(".flexy-pills > * > *")) {\n requestAnimationFrame(() => {\n handleDown(flexyInstance.options.initialDragEvent);\n });\n }\n};\n\nconst clamp = (n, min, max) => Math.min(Math.max(n, min), max);\n\nconst DESTROYED = "__DESTROYED__";\n\nclass Flexy {\n constructor(sliderContainer) {\n var _this = this;\n\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _defineProperty(this, "getDefaultState", () => ({\n elementsOnBehind: 1,\n positionSnapshot: 0,\n positionX: 0,\n\n /**\n * The thing the algorithm tends to move the slides to\n */\n positionTarget: 0,\n velocity: 0,\n containerInnerWidth: this.sliderContainer ? getDimensionFor(nullifyTransforms(this.sliderContainer, this.nullifyTransformEl), this) : 0,\n slideWidth: this.sliderContainer ? getDimensionFor(nullifyTransforms(this.sliderContainer.firstElementChild, this.sliderContainer), this) : 0,\n previousCurrentIndex: 0,\n startX: 0,\n endX: 0,\n mouseDown: false,\n lastTimeAnimated: Infinity\n }));\n\n _defineProperty(this, "state", this.getDefaultState());\n\n _defineProperty(this, "options", {\n onDragStart: () => {},\n autoplay: false,\n scaleRotateEffect: false,\n pillsContainerSelector: null,\n pillsFlexyInstance: null,\n flexyAttributeEl: null,\n initialDragEvent: null,\n adjustHeight: false,\n // container | viewport\n wrapAroundMode: "container",\n // horizontal | vertical\n orientation: "horizontal",\n nullifyTransformEl: null,\n elementsThatDoNotStartDrag: [],\n hasDragAndDrop: true\n });\n\n _defineProperty(this, "sliderContainer", null);\n\n _defineProperty(this, "drawLoop", function () {\n let fallThroughTheFirstDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n let oldPositionX = fallThroughTheFirstDraw ? Infinity : _this.state.positionX; // TODO: maybe do a smarter destroy\n\n if (_this.state.sliderActivated === DESTROYED) {\n return;\n }\n\n if (_this.state.containerInnerWidth !== nullifyTransforms(_this.sliderContainer, _this.nullifyTransformEl).width) {\n _this.refreshActivation();\n }\n\n _this.state = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, _this.state), _this.state.sliderActivated ? ((t, c) => c(t))(_this.state.velocity + (\n /**\n * Apply different forces based on the conditions\n */\n _this.state.mouseDown ? _this.state.positionSnapshot + (_this.state.endX - _this.state.startX) - _this.state.positionX - _this.state.velocity : (_this.state.positionTarget - _this.state.positionX) * 0.02), velocity => ({\n velocity: velocity * 0.72,\n positionX: _this.state.positionX + velocity\n })) : {}), _this.state.sliderActivated && Math.abs(_this.state.containerInnerWidth - getDimensionFor(nullifyTransforms(_this.sliderContainer, _this.nullifyTransformEl), _this)) > 1 ? {\n positionX: Math.round(getDimensionFor(nullifyTransforms(_this.sliderContainer.firstElementChild, _this.options.nullifyTransformEl), _this) * (Math.round(_this.state.positionX / _this.state.slideWidth) * 100) / 100),\n positionTarget: Math.round(getDimensionFor(nullifyTransforms(_this.sliderContainer.firstElementChild, _this.options.nullifyTransformEl), _this) * (Math.round(_this.state.positionX / _this.state.slideWidth) * 100) / 100)\n } : {}), {}, {\n scrollPosition: {\n x: window.pageXOffset,\n y: window.pageYOffset\n },\n containerInnerWidth: getDimensionFor(nullifyTransforms(_this.sliderContainer, _this.nullifyTransformEl), _this),\n slideWidth: getDimensionFor(nullifyTransforms(_this.sliderContainer.firstElementChild, _this.options.nullifyTransformEl), _this)\n });\n\n if ((oldPositionX !== _this.state.positionX || Math.abs(_this.state.positionX - _this.state.positionTarget) > 0.1) && !fallThroughTheFirstDraw) {\n if (_this.state.sliderActivated) {\n let {\n relativeDelta,\n elementsOnBehind\n } = fetchWrapAroundStatusFor(_this, _this.state.elementsOnBehind, _this.state.mouseDown ? _this.state.endX <= _this.state.startX ? "right" : "left" : _this.state.positionX >= _this.state.positionTarget ? "right" : "left", _this.options.wrapAroundMode);\n _this.state = _objectSpread(_objectSpread({}, _this.state), {}, {\n elementsOnBehind,\n positionTarget: _this.state.positionTarget + relativeDelta,\n positionX: _this.state.positionX + relativeDelta,\n positionSnapshot: _this.state.positionSnapshot + relativeDelta\n });\n }\n }\n\n if (_this.options.autoplay && _this.state.sliderActivated) {\n if (Math.abs(_this.state.positionX - _this.state.positionTarget) < 0.5) {\n if (new Date().getTime() / 1000 - _this.state.lastTimeAnimated / 1000 > (parseFloat(_this.options.autoplay, 10) ? parseFloat(_this.options.autoplay, 10) : 3)) {\n _this.state = _objectSpread(_objectSpread({}, _this.state), {}, {\n positionTarget: _this.state.positionX - getDimensionFor(nullifyTransforms(_this.sliderContainer.firstElementChild, _this.options.nullifyTransformEl), _this)\n });\n }\n }\n }\n\n if (!_this.state.mouseDown && _this.state.sliderActivated) {\n if (Math.abs(_this.state.positionX - _this.state.positionTarget) < 0.2) {\n _this.state = _objectSpread(_objectSpread({}, _this.state), {}, {\n positionX: _this.state.positionTarget,\n velocity: 0\n });\n }\n\n let oldIndex = _this.state.previousCurrentIndex;\n _this.state = _objectSpread(_objectSpread({}, _this.state), {}, {\n previousCurrentIndex: clamp(_this.state.elementsOnBehind > Math.round(Math.abs(_this.state.positionTarget) / getDimensionFor(nullifyTransforms(_this.sliderContainer.firstElementChild, _this.options.nullifyTransformEl), _this)) ? Math.round(Math.abs(_this.state.positionTarget) / getDimensionFor(nullifyTransforms(_this.sliderContainer.firstElementChild, _this.options.nullifyTransformEl), _this)) + (_this.sliderContainer.children.length - _this.state.elementsOnBehind) : Math.abs(Math.round(Math.abs(_this.state.positionTarget) / getDimensionFor(nullifyTransforms(_this.sliderContainer.firstElementChild, _this.options.nullifyTransformEl), _this)) - _this.state.elementsOnBehind), 0, _this.sliderContainer.children.length - 1)\n });\n\n if (oldIndex !== _this.state.previousCurrentIndex) {\n renderPillsFor(_this);\n adjustContainerHeightFor(_this);\n [..._this.sliderContainer.querySelectorAll("video")].map(video => {\n video.pause();\n });\n [..._this.sliderContainer.querySelectorAll(\'iframe[src*="youtu"]\')].map(i => {\n i.contentWindow.postMessage(\'{"event":"command","func":"stopVideo","args":""}\', "*");\n });\n [..._this.sliderContainer.querySelectorAll(\'iframe:not([src*="youtu"])\')].map(i => {\n const source = i.src;\n i.src = "";\n i.src = source;\n });\n }\n }\n\n if (_this.state.positionX !== oldPositionX && _this.state.sliderActivated) {\n _this.render(); // handleScaleRotateEffectFor(this)\n\n\n _this.state = _objectSpread(_objectSpread({}, _this.state), {}, {\n lastTimeAnimated: new Date().getTime()\n });\n }\n\n requestAnimationFrame(() => _this.drawLoop());\n });\n\n this.options = _objectSpread(_objectSpread({}, this.options), {}, {\n flexyAttributeEl: sliderContainer,\n nullifyTransformEl: sliderContainer\n }, options);\n this.sliderContainer = sliderContainer;\n mountPillsListeners(this);\n mountArrowsListeners(this);\n handleHoverStateFor(this);\n handleDragFor(this, () => this.state, newState => this.state = newState);\n [...this.sliderContainer.children].map(singleSlide => singleSlide.addEventListener("click", e => Math.abs(this.state.startX - this.state.endX) > 3 && e.preventDefault()));\n let _elementsOnBehind = 1;\n let firstItem = 1;\n let flexyAttributeElStyle = getComputedStyle(this.options.flexyAttributeEl);\n\n if (flexyAttributeElStyle.getPropertyValue("--current-item")) {\n firstItem = parseInt(flexyAttributeElStyle.getPropertyValue("--current-item"));\n _elementsOnBehind = this.sliderContainer.children.length;\n }\n\n this.state = _objectSpread(_objectSpread({}, this.state), {}, {\n elementsOnBehind: _elementsOnBehind,\n positionX: getDimensionFor(nullifyTransforms(this.sliderContainer.firstElementChild, this.options.nullifyTransformEl), this) * firstItem * -1,\n positionTarget: getDimensionFor(nullifyTransforms(this.sliderContainer.firstElementChild, this.options.nullifyTransformEl), this) * firstItem * -1,\n containerInnerWidth: getDimensionFor(nullifyTransforms(this.sliderContainer, this.nullifyTransformEl), this),\n slideWidth: getDimensionFor(nullifyTransforms(this.sliderContainer.firstElementChild, this.options.nullifyTransformEl), this)\n });\n this.refreshActivation();\n requestAnimationFrame(() => this.drawLoop(true));\n adjustContainerHeightFor(this);\n }\n\n destroy() {\n this.state = _objectSpread(_objectSpread({}, this.state), {}, {\n sliderActivated: DESTROYED\n });\n }\n\n refreshActivation() {\n let totalSlidesWidth = getDimensionFor(nullifyTransforms(this.sliderContainer.children[0], this.options.nullifyTransformEl) || {\n width: 0,\n height: 0\n }, this) * this.sliderContainer.children.length;\n this.state = _objectSpread(_objectSpread({}, this.state), {}, {\n sliderActivated: this.sliderContainer ? getComputedStyle(this.sliderContainer, ":after").content.indexOf("no-flexy") === -1 && totalSlidesWidth > getDimensionFor(nullifyTransforms(this.sliderContainer, this.options.nullifyTransformEl), this) + 10 : false\n /*\n &&\n totalSlidesWidth > window.innerWidth\n */\n\n });\n\n if (this.state.sliderActivated) {\n this.options.flexyAttributeEl.dataset.flexy = "";\n } else {\n this.options.flexyAttributeEl.removeAttribute("data-flexy");\n [...this.sliderContainer.children].map(el => el.removeAttribute("style"));\n }\n }\n\n render() {\n [...this.sliderContainer.children].map(el => {\n if (this.options.orientation === "vertical") {\n el.style.transform = `translate3d(0, ${this.state.positionX}px, 0)`;\n } else {\n el.style.transform = `translate3d(${this.state.positionX}px, 0, 0)`;\n }\n });\n\n if (this.state.mouseDown) {\n this.options.flexyAttributeEl.dataset.flexyDragging = "";\n } else {\n this.options.flexyAttributeEl.removeAttribute("data-flexy-dragging");\n }\n\n if (this.state.elementsOnBehind > 0) {\n [...this.sliderContainer.children].slice(0, this.state.elementsOnBehind * -1).map(el => el.style.order = 2);\n [...this.sliderContainer.children].slice(this.state.elementsOnBehind * -1).map(el => el.style.order = 1);\n } else {\n [...this.sliderContainer.children].map(el => el.style.order = 1);\n }\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// EXTERNAL MODULE: ./static/js/frontend/helpers/current-screen.js\nvar current_screen = __webpack_require__(410);\n;// CONCATENATED MODULE: ./static/js/frontend/flexy.js\nfunction flexy_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 flexy_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? flexy_ownKeys(Object(source), !0).forEach(function (key) { flexy_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : flexy_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction flexy_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\nconst mount = (sliderEl, args) => {\n // sliderEl = sliderEl.parentNode\n if (sliderEl.flexy) {\n return;\n }\n\n let maybePillsSlider = sliderEl.querySelector(\'.flexy-pills [data-flexy]\');\n const inst = new Flexy(sliderEl.querySelector(\'.flexy-items\'), flexy_objectSpread(flexy_objectSpread(flexy_objectSpread({\n flexyAttributeEl: sliderEl,\n elementsThatDoNotStartDrag: [\'.twentytwenty-handle\'],\n adjustHeight: !!sliderEl.querySelector(\'.flexy-items\').dataset.height\n }, args.event ? {\n initialDragEvent: args.event\n } : {}), {}, {\n autoplay: Object.keys(sliderEl.dataset).indexOf(\'autoplay\') > -1 && parseInt(sliderEl.dataset.autoplay, 10) ? sliderEl.dataset.autoplay : false\n }, sliderEl.querySelector(\'.flexy-pills\') ? {\n pillsContainerSelector: sliderEl.querySelector(\'.flexy-pills\').firstElementChild\n } : {}), {}, {\n leftArrow: sliderEl.querySelector(\'.flexy .flexy-arrow-prev\'),\n rightArrow: sliderEl.querySelector(\'.flexy .flexy-arrow-next\'),\n scaleRotateEffect: false,\n onDragStart: e => {\n if (!e.target.closest(\'.flexy-items\')) {\n return;\n }\n\n Array.from(e.target.closest(\'.flexy-items\').querySelectorAll(\'.zoomImg\')).map(img => {\n external_jQuery_default()(img).stop().fadeTo(120, 0);\n });\n },\n // viewport | container\n wrapAroundMode: sliderEl.dataset.wrap === \'viewport\' ? \'viewport\' : \'container\'\n }, maybePillsSlider ? {\n pillsFlexyInstance: maybePillsSlider\n } : {}));\n\n if (maybePillsSlider) {\n const inst = new Flexy(maybePillsSlider, flexy_objectSpread({\n elementsThatDoNotStartDrag: [\'.twentytwenty-handle\'],\n // viewport | container\n wrapAroundMode: maybePillsSlider.dataset.wrap === \'viewport\' ? \'viewport\' : \'container\',\n leftArrow: maybePillsSlider.parentNode.querySelector(\'.flexy-arrow-prev\'),\n rightArrow: maybePillsSlider.parentNode.querySelector(\'.flexy-arrow-next\'),\n hasDragAndDrop: false\n }, maybePillsSlider.closest(\'.thumbs-left\') && (0,current_screen/* getCurrentScreen */.C)({\n withTablet: true\n }) !== \'mobile\' ? {\n orientation: \'vertical\'\n } : {}));\n maybePillsSlider.flexy = inst;\n }\n\n sliderEl.flexy = inst;\n};\nexternal_ctEvents_default().on(\'ct:flexy:update-height\', () => {\n ;\n [...document.querySelectorAll(\'.flexy-container\')].map(el => {\n if (!el.flexy) {\n return;\n }\n\n adjustContainerHeightFor(el.flexy);\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAwLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQ25uQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2N0RnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvZmxleHkvZGlzdC9mbGV4eS5lcy5qcz82MzIxIiwid2VicGFjazovL2N0RnJvbnRlbmQvLi9zdGF0aWMvanMvZnJvbnRlbmQvZmxleHkuanM/MDU3YyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eTIodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5MihvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5jb25zdCBnZXRSaWdodE9yQm90dG9tID0gKHJlY3QsIGZsZXh5SW5zdGFuY2UpID0+IHtcbiAgaWYgKGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiKSB7XG4gICAgcmV0dXJuIHJlY3QudG9wICsgcmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4gcmVjdC5yaWdodDtcbn07XG5cbmNvbnN0IGdldExlZnRPclRvcCA9IChyZWN0LCBmbGV4eUluc3RhbmNlKSA9PiB7XG4gIGlmIChmbGV4eUluc3RhbmNlLm9wdGlvbnMub3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIikge1xuICAgIHJldHVybiByZWN0LnRvcDtcbiAgfVxuXG4gIHJldHVybiByZWN0LmxlZnQ7XG59O1xuXG5jb25zdCBnZXREaW1lbnNpb25Gb3IgPSAocmVjdCwgZmxleHlJbnN0YW5jZSkgPT4ge1xuICBpZiAoZmxleHlJbnN0YW5jZS5vcHRpb25zLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcbiAgICByZXR1cm4gcmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4gcmVjdC53aWR0aDtcbn07XG4vKipcbiAqIERldmVsb3AgYSBzdWdnZXN0aW9uLWJhc2VkIG1lY2hhbmlzbS5cbiAqIFRoYXQgaXMsIGlnbm9yZSBhIGNoZWNraW5nIGZvciBhIHNwZWNpZmljIHNpZGUgd2hlbiB3ZSBkbyBub3QgaGF2ZSBhIG5lZWRcbiAqIGZvciBpdC4gQWxzbywgd2hlbiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoYXQgcGFydGljdWxhciBzaWRlLlxuICpcbiAqIFRPRE86IGltcGxlbWVudCBfYm90aF8gc3RyYXRlZ3kgZm9yIHdyYXBBcm91bmRcbiAqL1xuXG5cbmNvbnN0IGZldGNoV3JhcEFyb3VuZFN0YXR1c0ZvciA9IGZ1bmN0aW9uIChmbGV4eUluc3RhbmNlLCBlbGVtZW50c09uQmVoaW5kKSB7XG4gIGxldCB0aGVTaWRlV2VBcmVNb3ZpbmdPbnRvID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBcImxlZnRcIjtcbiAgbGV0IHdyYXBBcm91bmRNb2RlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBcImNvbnRhaW5lclwiO1xuICBjb25zdCBzbGlkZXJDb250YWluZXIgPSBmbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lcjtcbiAgbGV0IHJlbGF0aXZlRGVsdGEgPSAwO1xuXG4gIGlmICh0aGVTaWRlV2VBcmVNb3ZpbmdPbnRvID09PSBcImxlZnRcIikge1xuICAgIGxldCBsZWZ0bW9zdE9mZnNldCA9IFsuLi5zbGlkZXJDb250YWluZXIuY2hpbGRyZW5dLnJlZHVjZSgobGVmdG1vc3RFbCwgY3VycmVudEVsKSA9PiB7XG4gICAgICBsZXQgbGVmdCA9IGdldExlZnRPclRvcChudWxsaWZ5VHJhbnNmb3JtcyhsZWZ0bW9zdEVsLCBmbGV4eUluc3RhbmNlLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgZmxleHlJbnN0YW5jZSk7XG4gICAgICBsZXQgY3VycmVudExlZnQgPSBnZXRMZWZ0T3JUb3AobnVsbGlmeVRyYW5zZm9ybXMoY3VycmVudEVsLCBmbGV4eUluc3RhbmNlLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgZmxleHlJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gY3VycmVudExlZnQgPCBsZWZ0ID8gY3VycmVudEVsIDogbGVmdG1vc3RFbDtcbiAgICB9LCB7XG4gICAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3Q6ICgpID0+ICh7XG4gICAgICAgIGxlZnQ6IDEwMDAwMDAwMDAwMCxcbiAgICAgICAgYm90dG9tOiAxMDAwMDAwMDAwMDAsXG4gICAgICAgIHRvcDogMTAwMDAwMDAwMDAwLFxuICAgICAgICByaWdodDogMTAwMDAwMDAwMDAwXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgaWYgKGdldExlZnRPclRvcChudWxsaWZ5VHJhbnNmb3JtcyhsZWZ0bW9zdE9mZnNldCwgZmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGZsZXh5SW5zdGFuY2UpID4gKHdyYXBBcm91bmRNb2RlID09PSBcImNvbnRhaW5lclwiID8gZ2V0TGVmdE9yVG9wKG51bGxpZnlUcmFuc2Zvcm1zKHNsaWRlckNvbnRhaW5lciwgZmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGZsZXh5SW5zdGFuY2UpIDogMCkpIHtcbiAgICAgIHJlbGF0aXZlRGVsdGEgPSAtMSAqIGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3JtcyhzbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKTtcbiAgICAgIGVsZW1lbnRzT25CZWhpbmQgPSBlbGVtZW50c09uQmVoaW5kID09PSBzbGlkZXJDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoID8gMSA6IGVsZW1lbnRzT25CZWhpbmQgKyAxO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGVTaWRlV2VBcmVNb3ZpbmdPbnRvID09PSBcInJpZ2h0XCIpIHtcbiAgICBsZXQgcmlnaHRtb3N0T2Zmc2V0ID0gWy4uLnNsaWRlckNvbnRhaW5lci5jaGlsZHJlbl0ucmVkdWNlKChyaWdodG1vc3RFbCwgY3VycmVudEVsKSA9PiB7XG4gICAgICBsZXQgcmlnaHQgPSBnZXRSaWdodE9yQm90dG9tKG51bGxpZnlUcmFuc2Zvcm1zKHJpZ2h0bW9zdEVsLCBmbGV4eUluc3RhbmNlLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgZmxleHlJbnN0YW5jZSk7XG4gICAgICBsZXQgY3VycmVudFJpZ2h0ID0gZ2V0UmlnaHRPckJvdHRvbShudWxsaWZ5VHJhbnNmb3JtcyhjdXJyZW50RWwsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKTtcbiAgICAgIHJldHVybiByaWdodCA+IGN1cnJlbnRSaWdodCA/IHJpZ2h0bW9zdEVsIDogY3VycmVudEVsO1xuICAgIH0sIHtcbiAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdDogKCkgPT4gKHtcbiAgICAgICAgbGVmdDogLTEsXG4gICAgICAgIGJvdHRvbTogLTk5OTk5OTk5OTk5OTksXG4gICAgICAgIHRvcDogLTEsXG4gICAgICAgIHJpZ2h0OiAtMVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmIChnZXRSaWdodE9yQm90dG9tKG51bGxpZnlUcmFuc2Zvcm1zKHJpZ2h0bW9zdE9mZnNldCwgZmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGZsZXh5SW5zdGFuY2UpIDwgKHdyYXBBcm91bmRNb2RlID09PSBcImNvbnRhaW5lclwiID8gZ2V0UmlnaHRPckJvdHRvbShudWxsaWZ5VHJhbnNmb3JtcyhzbGlkZXJDb250YWluZXIsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKSA6IHdpbmRvdy5pbm5lcldpZHRoKSkge1xuICAgICAgcmVsYXRpdmVEZWx0YSA9IGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3JtcyhzbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKTtcbiAgICAgIGVsZW1lbnRzT25CZWhpbmQgPSBlbGVtZW50c09uQmVoaW5kID09PSAxID8gc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA6IGVsZW1lbnRzT25CZWhpbmQgLSAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVsYXRpdmVEZWx0YSxcbiAgICBlbGVtZW50c09uQmVoaW5kXG4gIH07XG59O1xuXG5mdW5jdGlvbiBudWxsaWZ5VHJhbnNmb3JtcyhlbCkge1xuICBsZXQgZWxlbWVudFRvTG9va0F0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICBpZiAoIWVsKSByZXR1cm4gbnVsbDtcblxuICBpZiAoZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmICFlbC5maXJzdEVsZW1lbnRDaGlsZCkge1xuICAgIHJldHVybiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfVxuXG4gIGlmICghZWxlbWVudFRvTG9va0F0KSB7XG4gICAgZWxlbWVudFRvTG9va0F0ID0gZWw7XG4gIH0gLy9hZGQgc2FuaXR5IGNoZWNrcyBhbmQgZGVmYXVsdCB2YWx1ZXNcblxuXG4gIGxldCB7XG4gICAgdG9wLFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgbGV0IHRyYW5zZm9ybUFyciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnRUb0xvb2tBdCkudHJhbnNmb3JtLnNwbGl0KC9cXCh8LHxcXCkvKS5zbGljZSgxLCAtMSkubWFwKHYgPT4gcGFyc2VGbG9hdCh2KSk7XG5cbiAgaWYgKHRyYW5zZm9ybUFyci5sZW5ndGggIT0gNikge1xuICAgIHJldHVybiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfSAvLyAyRCBtYXRyaXhcbiAgLy8gbmVlZCBzb21lIG1hdGggdG8gYXBwbHkgaW52ZXJzZSBvZiBtYXRyaXhcbiAgLy8gVGhhdCBpcyB0aGUgbWF0cml4IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZWxlbWVudFxuXG5cbiAgdmFyIHQgPSB0cmFuc2Zvcm1BcnI7XG4gIGxldCBkZXQgPSB0WzBdICogdFszXSAtIHRbMV0gKiB0WzJdO1xuICAvKmlmICh0cmFuc2Zvcm1BcnIubGVuZ3RoID4gNikqL1xuICAvLzNEIG1hdHJpeFxuICAvL2hhdmVuJ3QgZG9uZSB0aGUgY2FsY3VsYXRpb24gdG8gYXBwbHkgaW52ZXJzZSBvZiA0eDQgbWF0cml4XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGggLyB0WzBdLFxuICAgIGhlaWdodDogaGVpZ2h0IC8gdFszXSxcbiAgICBsZWZ0OiAobGVmdCAqIHRbM10gLSB0b3AgKiB0WzJdICsgdFsyXSAqIHRbNV0gLSB0WzRdICogdFszXSkgLyBkZXQsXG4gICAgcmlnaHQ6IChyaWdodCAqIHRbM10gLSB0b3AgKiB0WzJdICsgdFsyXSAqIHRbNV0gLSB0WzRdICogdFszXSkgLyBkZXQsXG4gICAgdG9wOiAoLWxlZnQgKiB0WzFdICsgdG9wICogdFswXSArIHRbNF0gKiB0WzFdIC0gdFswXSAqIHRbNV0pIC8gZGV0XG4gIH07XG59XG5cbmNvbnN0IHJlbmRlclBpbGxzRm9yID0gZmxleHlJbnN0YW5jZSA9PiB7XG4gIGlmICghZmxleHlJbnN0YW5jZS5vcHRpb25zLnBpbGxzQ29udGFpbmVyU2VsZWN0b3IpIHJldHVybjtcbiAgZmxleHlJbnN0YW5jZS5vcHRpb25zLnBpbGxzQ29udGFpbmVyU2VsZWN0b3IucXVlcnlTZWxlY3RvcihcIi5hY3RpdmVcIikgJiYgZmxleHlJbnN0YW5jZS5vcHRpb25zLnBpbGxzQ29udGFpbmVyU2VsZWN0b3IucXVlcnlTZWxlY3RvcihcIi5hY3RpdmVcIikuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgZmxleHlJbnN0YW5jZS5vcHRpb25zLnBpbGxzQ29udGFpbmVyU2VsZWN0b3IuY2hpbGRyZW5bZmxleHlJbnN0YW5jZS5zdGF0ZS5wcmV2aW91c0N1cnJlbnRJbmRleF0uY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcblxuICBpZiAoZmxleHlJbnN0YW5jZS5vcHRpb25zLnBpbGxzRmxleHlJbnN0YW5jZSkge1xuICAgIGxldCBsb2NhbEZsZXh5SW5zdGFuY2UgPSBmbGV4eUluc3RhbmNlLm9wdGlvbnMucGlsbHNGbGV4eUluc3RhbmNlLmZsZXh5O1xuICAgIGxldCBhbGxQaWxscyA9IFsuLi5mbGV4eUluc3RhbmNlLm9wdGlvbnMucGlsbHNDb250YWluZXJTZWxlY3Rvci5jaGlsZHJlbl07XG4gICAgbGV0IGZyb21JbmRleCA9IFsuLi5sb2NhbEZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuXS5pbmRleE9mKFsuLi5sb2NhbEZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuXS5yZWR1Y2UoKGxlZnRtb3N0RWwsIGN1cnJlbnRFbCkgPT4ge1xuICAgICAgbGV0IGxlZnQgPSBnZXRMZWZ0T3JUb3AobnVsbGlmeVRyYW5zZm9ybXMobGVmdG1vc3RFbCwgbG9jYWxGbGV4eUluc3RhbmNlLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgbG9jYWxGbGV4eUluc3RhbmNlKTtcbiAgICAgIGxldCBjdXJyZW50TGVmdCA9IGdldExlZnRPclRvcChudWxsaWZ5VHJhbnNmb3JtcyhjdXJyZW50RWwsIGxvY2FsRmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGxvY2FsRmxleHlJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gTWF0aC5hYnMoY3VycmVudExlZnQgLSBnZXRMZWZ0T3JUb3AobnVsbGlmeVRyYW5zZm9ybXMobG9jYWxGbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lciwgbG9jYWxGbGV4eUluc3RhbmNlLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgbG9jYWxGbGV4eUluc3RhbmNlKSkgPCBNYXRoLmFicyhsZWZ0IC0gZ2V0TGVmdE9yVG9wKG51bGxpZnlUcmFuc2Zvcm1zKGxvY2FsRmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIsIGxvY2FsRmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGxvY2FsRmxleHlJbnN0YW5jZSkpID8gY3VycmVudEVsIDogbGVmdG1vc3RFbDtcbiAgICB9LCB7XG4gICAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3Q6ICgpID0+ICh7XG4gICAgICAgIGxlZnQ6IDEwMDAwMDAwMDAwMCxcbiAgICAgICAgdG9wOiAxMDAwMDAwMDAwMDBcbiAgICAgIH0pXG4gICAgfSkpO1xuICAgIGxldCB0b0luZGV4ID0gMDtcblxuICAgIGlmIChsb2NhbEZsZXh5SW5zdGFuY2Uub3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgIGxldCBwZXJQYWdlID0gTWF0aC5yb3VuZChudWxsaWZ5VHJhbnNmb3Jtcyhsb2NhbEZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyKS53aWR0aCAvIG51bGxpZnlUcmFuc2Zvcm1zKGxvY2FsRmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQpLndpZHRoKTtcbiAgICAgIHRvSW5kZXggPSBmbGV4eUluc3RhbmNlLnN0YXRlLnByZXZpb3VzQ3VycmVudEluZGV4O1xuXG4gICAgICBpZiAocGVyUGFnZSA9PT0gNSkge1xuICAgICAgICBpZiAoZmxleHlJbnN0YW5jZS5zdGF0ZS5wcmV2aW91c0N1cnJlbnRJbmRleCA+IDIpIHtcbiAgICAgICAgICB0b0luZGV4ID0gZmxleHlJbnN0YW5jZS5zdGF0ZS5wcmV2aW91c0N1cnJlbnRJbmRleCAtIDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsUGlsbHMubGVuZ3RoIC0gMSAtIGZsZXh5SW5zdGFuY2Uuc3RhdGUucHJldmlvdXNDdXJyZW50SW5kZXggPCAzKSB7XG4gICAgICAgICAgdG9JbmRleCA9IGFsbFBpbGxzLmxlbmd0aCAtIDU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBlclBhZ2UgPT09IDMpIHtcbiAgICAgICAgaWYgKGZsZXh5SW5zdGFuY2Uuc3RhdGUucHJldmlvdXNDdXJyZW50SW5kZXggPj0gMSkge1xuICAgICAgICAgIHRvSW5kZXggPSBmbGV4eUluc3RhbmNlLnN0YXRlLnByZXZpb3VzQ3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbGxQaWxscy5sZW5ndGggLSAxIC0gZmxleHlJbnN0YW5jZS5zdGF0ZS5wcmV2aW91c0N1cnJlbnRJbmRleCA8IDEpIHtcbiAgICAgICAgICB0b0luZGV4ID0gYWxsUGlsbHMubGVuZ3RoIC0gMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0b0luZGV4ID0gZmxleHlJbnN0YW5jZS5zdGF0ZS5wcmV2aW91c0N1cnJlbnRJbmRleDtcbiAgICB9XG5cbiAgICBsZXQgYW1vdW50VG9UaGVMZWZ0ID0gTWF0aC5hYnModG9JbmRleCAtIGZyb21JbmRleCk7XG4gICAgbGV0IGFtb3VudFRvVGhlUmlnaHQgPSBNYXRoLm1pbihmcm9tSW5kZXgsIHRvSW5kZXgpICsgKGFsbFBpbGxzLmxlbmd0aCAtIE1hdGgubWF4KGZyb21JbmRleCwgdG9JbmRleCkpO1xuICAgIGxldCBwID0gTWF0aC5taW4oYW1vdW50VG9UaGVMZWZ0LCBhbW91bnRUb1RoZVJpZ2h0KSAqIChhbW91bnRUb1RoZVJpZ2h0ID49IGFtb3VudFRvVGhlTGVmdCA/IGZyb21JbmRleCA+IHRvSW5kZXggPyAxIDogLTEgOiBmcm9tSW5kZXggPiB0b0luZGV4ID8gLTEgOiAxKTtcbiAgICBsZXQgcmVzdWx0VGFyZ2V0ID0gTWF0aC5yb3VuZChsb2NhbEZsZXh5SW5zdGFuY2Uuc3RhdGUucG9zaXRpb25YICogMTAwIC8gZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKGxvY2FsRmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGxvY2FsRmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGxvY2FsRmxleHlJbnN0YW5jZSkgLyAxMDApICogMTAwICogZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKGxvY2FsRmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGxvY2FsRmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGxvY2FsRmxleHlJbnN0YW5jZSkgLyAxMDAgKyBnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMobG9jYWxGbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCwgbG9jYWxGbGV4eUluc3RhbmNlLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgbG9jYWxGbGV4eUluc3RhbmNlKSAqIHA7XG4gICAgbG9jYWxGbGV4eUluc3RhbmNlLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBsb2NhbEZsZXh5SW5zdGFuY2Uuc3RhdGUpLCB7fSwge1xuICAgICAgcG9zaXRpb25UYXJnZXQ6IHJlc3VsdFRhcmdldFxuICAgIH0pO1xuICB9XG59O1xuXG5jb25zdCBtb3VudFBpbGxzTGlzdGVuZXJzID0gZmxleHlJbnN0YW5jZSA9PiB7XG4gIGlmICghZmxleHlJbnN0YW5jZS5vcHRpb25zLnBpbGxzQ29udGFpbmVyU2VsZWN0b3IpIHJldHVybjtcbiAgbGV0IGFsbFBpbGxzID0gWy4uLmZsZXh5SW5zdGFuY2Uub3B0aW9ucy5waWxsc0NvbnRhaW5lclNlbGVjdG9yLmNoaWxkcmVuXTtcblxuICBjb25zdCBoYW5kbGVQaWxsRXZlbnQgPSBzaW5nbGVQaWxsID0+IHtcbiAgICBsZXQgZnJvbUluZGV4ID0gWy4uLmZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuXS5pbmRleE9mKFsuLi5mbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lci5jaGlsZHJlbl0ucmVkdWNlKChsZWZ0bW9zdEVsLCBjdXJyZW50RWwpID0+IHtcbiAgICAgIGxldCBsZWZ0ID0gZ2V0TGVmdE9yVG9wKG51bGxpZnlUcmFuc2Zvcm1zKGxlZnRtb3N0RWwsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKTtcbiAgICAgIGxldCBjdXJyZW50TGVmdCA9IGdldExlZnRPclRvcChudWxsaWZ5VHJhbnNmb3JtcyhjdXJyZW50RWwsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKTtcbiAgICAgIHJldHVybiBNYXRoLmFicyhjdXJyZW50TGVmdCAtIGdldExlZnRPclRvcChudWxsaWZ5VHJhbnNmb3JtcyhmbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lciwgZmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGZsZXh5SW5zdGFuY2UpKSA8IE1hdGguYWJzKGxlZnQgLSBnZXRMZWZ0T3JUb3AobnVsbGlmeVRyYW5zZm9ybXMoZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKSkgPyBjdXJyZW50RWwgOiBsZWZ0bW9zdEVsO1xuICAgIH0sIHtcbiAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdDogKCkgPT4gKHtcbiAgICAgICAgbGVmdDogMTAwMDAwMDAwMDAwXG4gICAgICB9KVxuICAgIH0pKTtcbiAgICBsZXQgdG9JbmRleCA9IGFsbFBpbGxzLmluZGV4T2Yoc2luZ2xlUGlsbCk7XG4gICAgZmxleHlJbnN0YW5jZS5vcHRpb25zLnBpbGxzQ29udGFpbmVyU2VsZWN0b3IucXVlcnlTZWxlY3RvcihcIi5hY3RpdmVcIikgJiYgZmxleHlJbnN0YW5jZS5vcHRpb25zLnBpbGxzQ29udGFpbmVyU2VsZWN0b3IucXVlcnlTZWxlY3RvcihcIi5hY3RpdmVcIikuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICBzaW5nbGVQaWxsLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgbGV0IGFtb3VudFRvVGhlTGVmdCA9IE1hdGguYWJzKHRvSW5kZXggLSBmcm9tSW5kZXgpO1xuICAgIGxldCBhbW91bnRUb1RoZVJpZ2h0ID0gTWF0aC5taW4oZnJvbUluZGV4LCB0b0luZGV4KSArIChhbGxQaWxscy5sZW5ndGggLSBNYXRoLm1heChmcm9tSW5kZXgsIHRvSW5kZXgpKTtcbiAgICBsZXQgcCA9IE1hdGgubWluKGFtb3VudFRvVGhlTGVmdCwgYW1vdW50VG9UaGVSaWdodCkgKiAoYW1vdW50VG9UaGVSaWdodCA+PSBhbW91bnRUb1RoZUxlZnQgPyBmcm9tSW5kZXggPiB0b0luZGV4ID8gMSA6IC0xIDogZnJvbUluZGV4ID4gdG9JbmRleCA/IC0xIDogMSk7XG4gICAgbGV0IHJlc3VsdFRhcmdldCA9IE1hdGgucm91bmQoZmxleHlJbnN0YW5jZS5zdGF0ZS5wb3NpdGlvblggKiAxMDAgLyBnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMoZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKSAvIDEwMCkgKiAxMDAgKiBnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMoZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKSAvIDEwMCArIGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3JtcyhmbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCwgZmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGZsZXh5SW5zdGFuY2UpICogcDtcbiAgICBmbGV4eUluc3RhbmNlLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmbGV4eUluc3RhbmNlLnN0YXRlKSwge30sIHtcbiAgICAgIHBvc2l0aW9uVGFyZ2V0OiByZXN1bHRUYXJnZXRcbiAgICB9KTtcbiAgfTtcblxuICBpZiAoZmxleHlJbnN0YW5jZS5vcHRpb25zLmluaXRpYWxEcmFnRXZlbnQgJiYgZmxleHlJbnN0YW5jZS5vcHRpb25zLmluaXRpYWxEcmFnRXZlbnQudGFyZ2V0LmNsb3Nlc3QoXCIuZmxleHktcGlsbHMgPiAqID4gKlwiKSkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaGFuZGxlUGlsbEV2ZW50KGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5pbml0aWFsRHJhZ0V2ZW50LnRhcmdldC5jbG9zZXN0KFwiLmZsZXh5LXBpbGxzID4gKiA+ICpcIikpO1xuICAgIH0pO1xuICB9XG5cbiAgYWxsUGlsbHMubWFwKHNpbmdsZVBpbGwgPT4gc2luZ2xlUGlsbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSA9PiB7XG4gICAgaGFuZGxlUGlsbEV2ZW50KHNpbmdsZVBpbGwpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSkpO1xufTtcblxuY29uc3QgbW92ZVRvSW5kZXhGb3IgPSAoZmxleHlJbnN0YW5jZSwgY2IpID0+IHtcbiAgbGV0IGZyb21JbmRleCA9IFsuLi5mbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lci5jaGlsZHJlbl0uaW5kZXhPZihbLi4uZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuY2hpbGRyZW5dLnJlZHVjZSgobGVmdG1vc3RFbCwgY3VycmVudEVsKSA9PiB7XG4gICAgbGV0IGxlZnQgPSBnZXRMZWZ0T3JUb3AobnVsbGlmeVRyYW5zZm9ybXMobGVmdG1vc3RFbCwgZmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGZsZXh5SW5zdGFuY2UpO1xuICAgIGxldCBjdXJyZW50TGVmdCA9IGdldExlZnRPclRvcChudWxsaWZ5VHJhbnNmb3JtcyhjdXJyZW50RWwsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKTtcbiAgICByZXR1cm4gTWF0aC5hYnMoY3VycmVudExlZnQgLSBnZXRMZWZ0T3JUb3AobnVsbGlmeVRyYW5zZm9ybXMoZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKSkgPCBNYXRoLmFicyhsZWZ0IC0gZ2V0TGVmdE9yVG9wKG51bGxpZnlUcmFuc2Zvcm1zKGZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyLCBmbGV4eUluc3RhbmNlLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgZmxleHlJbnN0YW5jZSkpID8gY3VycmVudEVsIDogbGVmdG1vc3RFbDtcbiAgfSwge1xuICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdDogKCkgPT4gKHtcbiAgICAgIGxlZnQ6IDEwMDAwMDAwMDAwMCxcbiAgICAgIHRvcDogMTAwMDAwMDAwMDAwXG4gICAgfSlcbiAgfSkpO1xuICBsZXQgdG9JbmRleCA9IGNiKGZyb21JbmRleCk7XG5cbiAgaWYgKHRvSW5kZXggPCAwKSB7XG4gICAgdG9JbmRleCA9IGZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gIH1cblxuICBpZiAodG9JbmRleCA+IGZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcbiAgICB0b0luZGV4ID0gMDtcbiAgfVxuXG4gIGxldCBhbW91bnRUb1RoZUxlZnQgPSBNYXRoLmFicyh0b0luZGV4IC0gZnJvbUluZGV4KTtcbiAgbGV0IGFtb3VudFRvVGhlUmlnaHQgPSBNYXRoLm1pbihmcm9tSW5kZXgsIHRvSW5kZXgpICsgKGZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCAtIE1hdGgubWF4KGZyb21JbmRleCwgdG9JbmRleCkpO1xuICBsZXQgcCA9IE1hdGgubWluKGFtb3VudFRvVGhlTGVmdCwgYW1vdW50VG9UaGVSaWdodCkgKiAoYW1vdW50VG9UaGVSaWdodCA+IGFtb3VudFRvVGhlTGVmdCA/IGZyb21JbmRleCA+IHRvSW5kZXggPyAxIDogLTEgOiBmcm9tSW5kZXggPiB0b0luZGV4ID8gLTEgOiAxKTtcbiAgbGV0IHJlc3VsdFRhcmdldCA9IE1hdGgucm91bmQoZmxleHlJbnN0YW5jZS5zdGF0ZS5wb3NpdGlvblggKiAxMDAgLyBnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMoZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKSAvIDEwMCkgKiAxMDAgKiBnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMoZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBmbGV4eUluc3RhbmNlKSAvIDEwMCArIGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3JtcyhmbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCwgZmxleHlJbnN0YW5jZS5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIGZsZXh5SW5zdGFuY2UpICogcDtcbiAgZmxleHlJbnN0YW5jZS5zdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZmxleHlJbnN0YW5jZS5zdGF0ZSksIHt9LCB7XG4gICAgcG9zaXRpb25UYXJnZXQ6IHJlc3VsdFRhcmdldFxuICB9KTtcbn07XG5cbmNvbnN0IG1vdW50QXJyb3dzTGlzdGVuZXJzID0gZmxleHlJbnN0YW5jZSA9PiB7XG4gIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5sZWZ0QXJyb3cgJiYgZmxleHlJbnN0YW5jZS5vcHRpb25zLmxlZnRBcnJvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIG1vdmVUb0luZGV4Rm9yKGZsZXh5SW5zdGFuY2UsIGZyb21JbmRleCA9PiBmcm9tSW5kZXggLSAxKTtcbiAgfSk7XG4gIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5yaWdodEFycm93ICYmIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5yaWdodEFycm93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgbW92ZVRvSW5kZXhGb3IoZmxleHlJbnN0YW5jZSwgZnJvbUluZGV4ID0+IGZyb21JbmRleCArIDEpO1xuICB9KTtcbn07XG5cbmNvbnN0IGhhbmRsZUhvdmVyU3RhdGVGb3IgPSBmbGV4eUluc3RhbmNlID0+IHtcbiAgY29uc3Qgc2xpZGVyQ29udGFpbmVyID0gZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXI7XG4gIGlmICghZmxleHlJbnN0YW5jZS5vcHRpb25zLmF1dG9wbGF5KSByZXR1cm47XG4gIHNsaWRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoKSA9PiBmbGV4eUluc3RhbmNlLm9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZsZXh5SW5zdGFuY2Uub3B0aW9ucyksIHt9LCB7XG4gICAgYXV0b3BsYXk6IGZhbHNlLFxuICAgIF9hdXRvcGxheTogZmxleHlJbnN0YW5jZS5vcHRpb25zLmF1dG9wbGF5XG4gIH0pKTtcbiAgc2xpZGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcbiAgICBmbGV4eUluc3RhbmNlLm9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZsZXh5SW5zdGFuY2Uub3B0aW9ucyksIHt9LCB7XG4gICAgICBhdXRvcGxheTogZmxleHlJbnN0YW5jZS5vcHRpb25zLl9hdXRvcGxheSxcbiAgICAgIF9hdXRvcGxheTogZmFsc2VcbiAgICB9KTtcbiAgICBmbGV4eUluc3RhbmNlLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmbGV4eUluc3RhbmNlLnN0YXRlKSwge30sIHtcbiAgICAgIGxhc3RUaW1lQW5pbWF0ZWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgYWRqdXN0Q29udGFpbmVySGVpZ2h0Rm9yID0gZmxleHlJbnN0YW5jZSA9PiB7XG4gIGlmICghZmxleHlJbnN0YW5jZS5vcHRpb25zLmFkanVzdEhlaWdodCkgcmV0dXJuO1xuICBsZXQgY3VycmVudENoaWxkID0gZmxleHlJbnN0YW5jZS5zbGlkZXJDb250YWluZXIuY2hpbGRyZW5bZmxleHlJbnN0YW5jZS5zdGF0ZS5wcmV2aW91c0N1cnJlbnRJbmRleF07XG4gIGZsZXh5SW5zdGFuY2Uuc2xpZGVyQ29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1zbGlkZXJIZWlnaHRcIiwgYCR7KGN1cnJlbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCB8fCBjdXJyZW50Q2hpbGQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodH1weGApO1xufTtcblxuY29uc3QgaGFuZGxlRHJhZ0ZvciA9IChmbGV4eUluc3RhbmNlLCBnZXRTdGF0ZSwgc2V0U3RhdGUpID0+IHtcbiAgaWYgKCFmbGV4eUluc3RhbmNlLm9wdGlvbnMuaGFzRHJhZ0FuZERyb3ApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzbGlkZXJDb250YWluZXIgPSBmbGV4eUluc3RhbmNlLnNsaWRlckNvbnRhaW5lcjtcblxuICBjb25zdCBoYW5kbGVEb3duID0gZSA9PiB7XG4gICAgaWYgKCFnZXRTdGF0ZSgpLnNsaWRlckFjdGl2YXRlZCkgcmV0dXJuO1xuXG4gICAgaWYgKGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5lbGVtZW50c1RoYXREb05vdFN0YXJ0RHJhZy5yZWR1Y2UoKHNob3VsZFNraXBEcmFnLCBzZWxlY3RvcikgPT4gc2hvdWxkU2tpcERyYWcgPyB0cnVlIDogZS50YXJnZXQubWF0Y2hlcyhzZWxlY3RvcikgfHwgZS50YXJnZXQuY2xvc2VzdChzZWxlY3RvciksIGZhbHNlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZS5wcmV2ZW50RGVmYXVsdCgpXG5cblxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoZS50eXBlICE9PSBcInRvdWNoc3RhcnRcIikge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5vbkRyYWdTdGFydChlKTtcbiAgICBzZXRTdGF0ZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldFN0YXRlKCkpLCB7fSwge1xuICAgICAgc3RhcnRYOiBlLnBhZ2VYIHx8IGUudG91Y2hlc1swXS5wYWdlWCxcbiAgICAgIGVuZFg6IGUucGFnZVggfHwgZS50b3VjaGVzWzBdLnBhZ2VYLFxuICAgICAgbW91c2VEb3duOiB0cnVlLFxuICAgICAgZG93blNjcm9sbFBvc2l0aW9uOiB7XG4gICAgICAgIHg6IHdpbmRvdy5wYWdlWE9mZnNldCxcbiAgICAgICAgeTogd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgICB9LFxuICAgICAgcG9zaXRpb25TbmFwc2hvdDogZ2V0U3RhdGUoKS5wb3NpdGlvblhcbiAgICB9KSk7XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gZSA9PiB7XG4gICAgICBpZiAoIWdldFN0YXRlKCkubW91c2VEb3duKSByZXR1cm47XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgc2V0U3RhdGUoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRTdGF0ZSgpKSwge30sIHtcbiAgICAgICAgbW91c2VEb3duOiBmYWxzZVxuICAgICAgfSkpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgICBsZXQgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgbGV0IGZyb21QZXJjZW50YWdlID0gc3RhdGUucG9zaXRpb25YICogMTAwIC8gbnVsbGlmeVRyYW5zZm9ybXMoc2xpZGVyQ29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkLCBmbGV4eUluc3RhbmNlLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKS53aWR0aDtcbiAgICAgIHNldFN0YXRlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0U3RhdGUoKSksIHt9LCB7XG4gICAgICAgIHBvc2l0aW9uVGFyZ2V0OiBudWxsaWZ5VHJhbnNmb3JtcyhzbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIGZsZXh5SW5zdGFuY2Uub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLndpZHRoICogKE1hdGguYWJzKHN0YXRlLmVuZFggLSBzdGF0ZS5zdGFydFgpID4gNTAgPyBzdGF0ZS5lbmRYIC0gc3RhdGUuc3RhcnRYIDwgMCA/IE1hdGguZmxvb3IoZnJvbVBlcmNlbnRhZ2UgLyAxMDApICogMTAwIDogTWF0aC5jZWlsKGZyb21QZXJjZW50YWdlIC8gMTAwKSAqIDEwMCA6IE1hdGgucm91bmQoZnJvbVBlcmNlbnRhZ2UgLyAxMDApICogMTAwKSAvIDEwMFxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSBlID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIHBhZ2VYOiBlbmRYXG4gICAgICB9ID0gZTtcblxuICAgICAgaWYgKCFlbmRYKSB7XG4gICAgICAgIGVuZFggPSBlLnRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0U3RhdGUoKS5tb3VzZURvd24pIHJldHVybjtcbiAgICAgIGxldCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICBzZXRTdGF0ZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgICAgZW5kWFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoTWF0aC5hYnMoc3RhdGUuZG93blNjcm9sbFBvc2l0aW9uLnggLSBzdGF0ZS5zY3JvbGxQb3NpdGlvbi54KSA+IDMgfHwgTWF0aC5hYnMoc3RhdGUuZG93blNjcm9sbFBvc2l0aW9uLnkgLSBzdGF0ZS5zY3JvbGxQb3NpdGlvbi55KSA+IDUpIHtcbiAgICAgICAgaGFuZGxlTW91c2VVcChlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlTW91c2VVcCk7XG4gIH07XG5cbiAgc2xpZGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlRG93bik7XG4gIHNsaWRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBoYW5kbGVEb3duKTtcblxuICBpZiAoZmxleHlJbnN0YW5jZS5vcHRpb25zLmluaXRpYWxEcmFnRXZlbnQgJiYgIWZsZXh5SW5zdGFuY2Uub3B0aW9ucy5pbml0aWFsRHJhZ0V2ZW50LnRhcmdldC5jbG9zZXN0KFwiLmZsZXh5LXBpbGxzID4gKiA+ICpcIikpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaGFuZGxlRG93bihmbGV4eUluc3RhbmNlLm9wdGlvbnMuaW5pdGlhbERyYWdFdmVudCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGNsYW1wID0gKG4sIG1pbiwgbWF4KSA9PiBNYXRoLm1pbihNYXRoLm1heChuLCBtaW4pLCBtYXgpO1xuXG5jb25zdCBERVNUUk9ZRUQgPSBcIl9fREVTVFJPWUVEX19cIjtcblxuY2xhc3MgRmxleHkge1xuICBjb25zdHJ1Y3RvcihzbGlkZXJDb250YWluZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZ2V0RGVmYXVsdFN0YXRlXCIsICgpID0+ICh7XG4gICAgICBlbGVtZW50c09uQmVoaW5kOiAxLFxuICAgICAgcG9zaXRpb25TbmFwc2hvdDogMCxcbiAgICAgIHBvc2l0aW9uWDogMCxcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdGhpbmcgdGhlIGFsZ29yaXRobSB0ZW5kcyB0byBtb3ZlIHRoZSBzbGlkZXMgdG9cbiAgICAgICAqL1xuICAgICAgcG9zaXRpb25UYXJnZXQ6IDAsXG4gICAgICB2ZWxvY2l0eTogMCxcbiAgICAgIGNvbnRhaW5lcklubmVyV2lkdGg6IHRoaXMuc2xpZGVyQ29udGFpbmVyID8gZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKHRoaXMuc2xpZGVyQ29udGFpbmVyLCB0aGlzLm51bGxpZnlUcmFuc2Zvcm1FbCksIHRoaXMpIDogMCxcbiAgICAgIHNsaWRlV2lkdGg6IHRoaXMuc2xpZGVyQ29udGFpbmVyID8gZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKHRoaXMuc2xpZGVyQ29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkLCB0aGlzLnNsaWRlckNvbnRhaW5lciksIHRoaXMpIDogMCxcbiAgICAgIHByZXZpb3VzQ3VycmVudEluZGV4OiAwLFxuICAgICAgc3RhcnRYOiAwLFxuICAgICAgZW5kWDogMCxcbiAgICAgIG1vdXNlRG93bjogZmFsc2UsXG4gICAgICBsYXN0VGltZUFuaW1hdGVkOiBJbmZpbml0eVxuICAgIH0pKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN0YXRlXCIsIHRoaXMuZ2V0RGVmYXVsdFN0YXRlKCkpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib3B0aW9uc1wiLCB7XG4gICAgICBvbkRyYWdTdGFydDogKCkgPT4ge30sXG4gICAgICBhdXRvcGxheTogZmFsc2UsXG4gICAgICBzY2FsZVJvdGF0ZUVmZmVjdDogZmFsc2UsXG4gICAgICBwaWxsc0NvbnRhaW5lclNlbGVjdG9yOiBudWxsLFxuICAgICAgcGlsbHNGbGV4eUluc3RhbmNlOiBudWxsLFxuICAgICAgZmxleHlBdHRyaWJ1dGVFbDogbnVsbCxcbiAgICAgIGluaXRpYWxEcmFnRXZlbnQ6IG51bGwsXG4gICAgICBhZGp1c3RIZWlnaHQ6IGZhbHNlLFxuICAgICAgLy8gY29udGFpbmVyIHwgdmlld3BvcnRcbiAgICAgIHdyYXBBcm91bmRNb2RlOiBcImNvbnRhaW5lclwiLFxuICAgICAgLy8gaG9yaXpvbnRhbCB8IHZlcnRpY2FsXG4gICAgICBvcmllbnRhdGlvbjogXCJob3Jpem9udGFsXCIsXG4gICAgICBudWxsaWZ5VHJhbnNmb3JtRWw6IG51bGwsXG4gICAgICBlbGVtZW50c1RoYXREb05vdFN0YXJ0RHJhZzogW10sXG4gICAgICBoYXNEcmFnQW5kRHJvcDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwic2xpZGVyQ29udGFpbmVyXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZHJhd0xvb3BcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGZhbGxUaHJvdWdoVGhlRmlyc3REcmF3ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICAgIGxldCBvbGRQb3NpdGlvblggPSBmYWxsVGhyb3VnaFRoZUZpcnN0RHJhdyA/IEluZmluaXR5IDogX3RoaXMuc3RhdGUucG9zaXRpb25YOyAvLyBUT0RPOiBtYXliZSBkbyBhIHNtYXJ0ZXIgZGVzdHJveVxuXG4gICAgICBpZiAoX3RoaXMuc3RhdGUuc2xpZGVyQWN0aXZhdGVkID09PSBERVNUUk9ZRUQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuc3RhdGUuY29udGFpbmVySW5uZXJXaWR0aCAhPT0gbnVsbGlmeVRyYW5zZm9ybXMoX3RoaXMuc2xpZGVyQ29udGFpbmVyLCBfdGhpcy5udWxsaWZ5VHJhbnNmb3JtRWwpLndpZHRoKSB7XG4gICAgICAgIF90aGlzLnJlZnJlc2hBY3RpdmF0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMuc3RhdGUpLCBfdGhpcy5zdGF0ZS5zbGlkZXJBY3RpdmF0ZWQgPyAoKHQsIGMpID0+IGModCkpKF90aGlzLnN0YXRlLnZlbG9jaXR5ICsgKFxuICAgICAgLyoqXG4gICAgICAgKiBBcHBseSBkaWZmZXJlbnQgZm9yY2VzIGJhc2VkIG9uIHRoZSBjb25kaXRpb25zXG4gICAgICAgKi9cbiAgICAgIF90aGlzLnN0YXRlLm1vdXNlRG93biA/IF90aGlzLnN0YXRlLnBvc2l0aW9uU25hcHNob3QgKyAoX3RoaXMuc3RhdGUuZW5kWCAtIF90aGlzLnN0YXRlLnN0YXJ0WCkgLSBfdGhpcy5zdGF0ZS5wb3NpdGlvblggLSBfdGhpcy5zdGF0ZS52ZWxvY2l0eSA6IChfdGhpcy5zdGF0ZS5wb3NpdGlvblRhcmdldCAtIF90aGlzLnN0YXRlLnBvc2l0aW9uWCkgKiAwLjAyKSwgdmVsb2NpdHkgPT4gKHtcbiAgICAgICAgdmVsb2NpdHk6IHZlbG9jaXR5ICogMC43MixcbiAgICAgICAgcG9zaXRpb25YOiBfdGhpcy5zdGF0ZS5wb3NpdGlvblggKyB2ZWxvY2l0eVxuICAgICAgfSkpIDoge30pLCBfdGhpcy5zdGF0ZS5zbGlkZXJBY3RpdmF0ZWQgJiYgTWF0aC5hYnMoX3RoaXMuc3RhdGUuY29udGFpbmVySW5uZXJXaWR0aCAtIGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3JtcyhfdGhpcy5zbGlkZXJDb250YWluZXIsIF90aGlzLm51bGxpZnlUcmFuc2Zvcm1FbCksIF90aGlzKSkgPiAxID8ge1xuICAgICAgICBwb3NpdGlvblg6IE1hdGgucm91bmQoZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKF90aGlzLnNsaWRlckNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCwgX3RoaXMub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBfdGhpcykgKiAoTWF0aC5yb3VuZChfdGhpcy5zdGF0ZS5wb3NpdGlvblggLyBfdGhpcy5zdGF0ZS5zbGlkZVdpZHRoKSAqIDEwMCkgLyAxMDApLFxuICAgICAgICBwb3NpdGlvblRhcmdldDogTWF0aC5yb3VuZChnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMoX3RoaXMuc2xpZGVyQ29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkLCBfdGhpcy5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIF90aGlzKSAqIChNYXRoLnJvdW5kKF90aGlzLnN0YXRlLnBvc2l0aW9uWCAvIF90aGlzLnN0YXRlLnNsaWRlV2lkdGgpICogMTAwKSAvIDEwMClcbiAgICAgIH0gOiB7fSksIHt9LCB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgICAgICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldFxuICAgICAgICB9LFxuICAgICAgICBjb250YWluZXJJbm5lcldpZHRoOiBnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMoX3RoaXMuc2xpZGVyQ29udGFpbmVyLCBfdGhpcy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBfdGhpcyksXG4gICAgICAgIHNsaWRlV2lkdGg6IGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3JtcyhfdGhpcy5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIF90aGlzLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgX3RoaXMpXG4gICAgICB9KTtcblxuICAgICAgaWYgKChvbGRQb3NpdGlvblggIT09IF90aGlzLnN0YXRlLnBvc2l0aW9uWCB8fCBNYXRoLmFicyhfdGhpcy5zdGF0ZS5wb3NpdGlvblggLSBfdGhpcy5zdGF0ZS5wb3NpdGlvblRhcmdldCkgPiAwLjEpICYmICFmYWxsVGhyb3VnaFRoZUZpcnN0RHJhdykge1xuICAgICAgICBpZiAoX3RoaXMuc3RhdGUuc2xpZGVyQWN0aXZhdGVkKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHJlbGF0aXZlRGVsdGEsXG4gICAgICAgICAgICBlbGVtZW50c09uQmVoaW5kXG4gICAgICAgICAgfSA9IGZldGNoV3JhcEFyb3VuZFN0YXR1c0ZvcihfdGhpcywgX3RoaXMuc3RhdGUuZWxlbWVudHNPbkJlaGluZCwgX3RoaXMuc3RhdGUubW91c2VEb3duID8gX3RoaXMuc3RhdGUuZW5kWCA8PSBfdGhpcy5zdGF0ZS5zdGFydFggPyBcInJpZ2h0XCIgOiBcImxlZnRcIiA6IF90aGlzLnN0YXRlLnBvc2l0aW9uWCA+PSBfdGhpcy5zdGF0ZS5wb3NpdGlvblRhcmdldCA/IFwicmlnaHRcIiA6IFwibGVmdFwiLCBfdGhpcy5vcHRpb25zLndyYXBBcm91bmRNb2RlKTtcbiAgICAgICAgICBfdGhpcy5zdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMuc3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgZWxlbWVudHNPbkJlaGluZCxcbiAgICAgICAgICAgIHBvc2l0aW9uVGFyZ2V0OiBfdGhpcy5zdGF0ZS5wb3NpdGlvblRhcmdldCArIHJlbGF0aXZlRGVsdGEsXG4gICAgICAgICAgICBwb3NpdGlvblg6IF90aGlzLnN0YXRlLnBvc2l0aW9uWCArIHJlbGF0aXZlRGVsdGEsXG4gICAgICAgICAgICBwb3NpdGlvblNuYXBzaG90OiBfdGhpcy5zdGF0ZS5wb3NpdGlvblNuYXBzaG90ICsgcmVsYXRpdmVEZWx0YVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5vcHRpb25zLmF1dG9wbGF5ICYmIF90aGlzLnN0YXRlLnNsaWRlckFjdGl2YXRlZCkge1xuICAgICAgICBpZiAoTWF0aC5hYnMoX3RoaXMuc3RhdGUucG9zaXRpb25YIC0gX3RoaXMuc3RhdGUucG9zaXRpb25UYXJnZXQpIDwgMC41KSB7XG4gICAgICAgICAgaWYgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCAtIF90aGlzLnN0YXRlLmxhc3RUaW1lQW5pbWF0ZWQgLyAxMDAwID4gKHBhcnNlRmxvYXQoX3RoaXMub3B0aW9ucy5hdXRvcGxheSwgMTApID8gcGFyc2VGbG9hdChfdGhpcy5vcHRpb25zLmF1dG9wbGF5LCAxMCkgOiAzKSkge1xuICAgICAgICAgICAgX3RoaXMuc3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzLnN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgcG9zaXRpb25UYXJnZXQ6IF90aGlzLnN0YXRlLnBvc2l0aW9uWCAtIGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3JtcyhfdGhpcy5zbGlkZXJDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsIF90aGlzLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgX3RoaXMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpcy5zdGF0ZS5tb3VzZURvd24gJiYgX3RoaXMuc3RhdGUuc2xpZGVyQWN0aXZhdGVkKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhfdGhpcy5zdGF0ZS5wb3NpdGlvblggLSBfdGhpcy5zdGF0ZS5wb3NpdGlvblRhcmdldCkgPCAwLjIpIHtcbiAgICAgICAgICBfdGhpcy5zdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMuc3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgcG9zaXRpb25YOiBfdGhpcy5zdGF0ZS5wb3NpdGlvblRhcmdldCxcbiAgICAgICAgICAgIHZlbG9jaXR5OiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb2xkSW5kZXggPSBfdGhpcy5zdGF0ZS5wcmV2aW91c0N1cnJlbnRJbmRleDtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzLnN0YXRlKSwge30sIHtcbiAgICAgICAgICBwcmV2aW91c0N1cnJlbnRJbmRleDogY2xhbXAoX3RoaXMuc3RhdGUuZWxlbWVudHNPbkJlaGluZCA+IE1hdGgucm91bmQoTWF0aC5hYnMoX3RoaXMuc3RhdGUucG9zaXRpb25UYXJnZXQpIC8gZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKF90aGlzLnNsaWRlckNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCwgX3RoaXMub3B0aW9ucy5udWxsaWZ5VHJhbnNmb3JtRWwpLCBfdGhpcykpID8gTWF0aC5yb3VuZChNYXRoLmFicyhfdGhpcy5zdGF0ZS5wb3NpdGlvblRhcmdldCkgLyBnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMoX3RoaXMuc2xpZGVyQ29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkLCBfdGhpcy5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIF90aGlzKSkgKyAoX3RoaXMuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCAtIF90aGlzLnN0YXRlLmVsZW1lbnRzT25CZWhpbmQpIDogTWF0aC5hYnMoTWF0aC5yb3VuZChNYXRoLmFicyhfdGhpcy5zdGF0ZS5wb3NpdGlvblRhcmdldCkgLyBnZXREaW1lbnNpb25Gb3IobnVsbGlmeVRyYW5zZm9ybXMoX3RoaXMuc2xpZGVyQ29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkLCBfdGhpcy5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIF90aGlzKSkgLSBfdGhpcy5zdGF0ZS5lbGVtZW50c09uQmVoaW5kKSwgMCwgX3RoaXMuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCAtIDEpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvbGRJbmRleCAhPT0gX3RoaXMuc3RhdGUucHJldmlvdXNDdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICByZW5kZXJQaWxsc0ZvcihfdGhpcyk7XG4gICAgICAgICAgYWRqdXN0Q29udGFpbmVySGVpZ2h0Rm9yKF90aGlzKTtcbiAgICAgICAgICBbLi4uX3RoaXMuc2xpZGVyQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ2aWRlb1wiKV0ubWFwKHZpZGVvID0+IHtcbiAgICAgICAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgWy4uLl90aGlzLnNsaWRlckNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWVbc3JjKj1cInlvdXR1XCJdJyldLm1hcChpID0+IHtcbiAgICAgICAgICAgIGkuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgne1wiZXZlbnRcIjpcImNvbW1hbmRcIixcImZ1bmNcIjpcInN0b3BWaWRlb1wiLFwiYXJnc1wiOlwiXCJ9JywgXCIqXCIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFsuLi5fdGhpcy5zbGlkZXJDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lOm5vdChbc3JjKj1cInlvdXR1XCJdKScpXS5tYXAoaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBpLnNyYztcbiAgICAgICAgICAgIGkuc3JjID0gXCJcIjtcbiAgICAgICAgICAgIGkuc3JjID0gc291cmNlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5zdGF0ZS5wb3NpdGlvblggIT09IG9sZFBvc2l0aW9uWCAmJiBfdGhpcy5zdGF0ZS5zbGlkZXJBY3RpdmF0ZWQpIHtcbiAgICAgICAgX3RoaXMucmVuZGVyKCk7IC8vIGhhbmRsZVNjYWxlUm90YXRlRWZmZWN0Rm9yKHRoaXMpXG5cblxuICAgICAgICBfdGhpcy5zdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMuc3RhdGUpLCB7fSwge1xuICAgICAgICAgIGxhc3RUaW1lQW5pbWF0ZWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gX3RoaXMuZHJhd0xvb3AoKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMub3B0aW9ucyksIHt9LCB7XG4gICAgICBmbGV4eUF0dHJpYnV0ZUVsOiBzbGlkZXJDb250YWluZXIsXG4gICAgICBudWxsaWZ5VHJhbnNmb3JtRWw6IHNsaWRlckNvbnRhaW5lclxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHRoaXMuc2xpZGVyQ29udGFpbmVyID0gc2xpZGVyQ29udGFpbmVyO1xuICAgIG1vdW50UGlsbHNMaXN0ZW5lcnModGhpcyk7XG4gICAgbW91bnRBcnJvd3NMaXN0ZW5lcnModGhpcyk7XG4gICAgaGFuZGxlSG92ZXJTdGF0ZUZvcih0aGlzKTtcbiAgICBoYW5kbGVEcmFnRm9yKHRoaXMsICgpID0+IHRoaXMuc3RhdGUsIG5ld1N0YXRlID0+IHRoaXMuc3RhdGUgPSBuZXdTdGF0ZSk7XG4gICAgWy4uLnRoaXMuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuXS5tYXAoc2luZ2xlU2xpZGUgPT4gc2luZ2xlU2xpZGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGUgPT4gTWF0aC5hYnModGhpcy5zdGF0ZS5zdGFydFggLSB0aGlzLnN0YXRlLmVuZFgpID4gMyAmJiBlLnByZXZlbnREZWZhdWx0KCkpKTtcbiAgICBsZXQgX2VsZW1lbnRzT25CZWhpbmQgPSAxO1xuICAgIGxldCBmaXJzdEl0ZW0gPSAxO1xuICAgIGxldCBmbGV4eUF0dHJpYnV0ZUVsU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMub3B0aW9ucy5mbGV4eUF0dHJpYnV0ZUVsKTtcblxuICAgIGlmIChmbGV4eUF0dHJpYnV0ZUVsU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VycmVudC1pdGVtXCIpKSB7XG4gICAgICBmaXJzdEl0ZW0gPSBwYXJzZUludChmbGV4eUF0dHJpYnV0ZUVsU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VycmVudC1pdGVtXCIpKTtcbiAgICAgIF9lbGVtZW50c09uQmVoaW5kID0gdGhpcy5zbGlkZXJDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMuc3RhdGUpLCB7fSwge1xuICAgICAgZWxlbWVudHNPbkJlaGluZDogX2VsZW1lbnRzT25CZWhpbmQsXG4gICAgICBwb3NpdGlvblg6IGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3Jtcyh0aGlzLnNsaWRlckNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCwgdGhpcy5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIHRoaXMpICogZmlyc3RJdGVtICogLTEsXG4gICAgICBwb3NpdGlvblRhcmdldDogZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKHRoaXMuc2xpZGVyQ29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkLCB0aGlzLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgdGhpcykgKiBmaXJzdEl0ZW0gKiAtMSxcbiAgICAgIGNvbnRhaW5lcklubmVyV2lkdGg6IGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3Jtcyh0aGlzLnNsaWRlckNvbnRhaW5lciwgdGhpcy5udWxsaWZ5VHJhbnNmb3JtRWwpLCB0aGlzKSxcbiAgICAgIHNsaWRlV2lkdGg6IGdldERpbWVuc2lvbkZvcihudWxsaWZ5VHJhbnNmb3Jtcyh0aGlzLnNsaWRlckNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCwgdGhpcy5vcHRpb25zLm51bGxpZnlUcmFuc2Zvcm1FbCksIHRoaXMpXG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoQWN0aXZhdGlvbigpO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmRyYXdMb29wKHRydWUpKTtcbiAgICBhZGp1c3RDb250YWluZXJIZWlnaHRGb3IodGhpcyk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuc3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMuc3RhdGUpLCB7fSwge1xuICAgICAgc2xpZGVyQWN0aXZhdGVkOiBERVNUUk9ZRURcbiAgICB9KTtcbiAgfVxuXG4gIHJlZnJlc2hBY3RpdmF0aW9uKCkge1xuICAgIGxldCB0b3RhbFNsaWRlc1dpZHRoID0gZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKHRoaXMuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuWzBdLCB0aGlzLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSB8fCB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH0sIHRoaXMpICogdGhpcy5zbGlkZXJDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHRoaXMuc3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMuc3RhdGUpLCB7fSwge1xuICAgICAgc2xpZGVyQWN0aXZhdGVkOiB0aGlzLnNsaWRlckNvbnRhaW5lciA/IGdldENvbXB1dGVkU3R5bGUodGhpcy5zbGlkZXJDb250YWluZXIsIFwiOmFmdGVyXCIpLmNvbnRlbnQuaW5kZXhPZihcIm5vLWZsZXh5XCIpID09PSAtMSAmJiB0b3RhbFNsaWRlc1dpZHRoID4gZ2V0RGltZW5zaW9uRm9yKG51bGxpZnlUcmFuc2Zvcm1zKHRoaXMuc2xpZGVyQ29udGFpbmVyLCB0aGlzLm9wdGlvbnMubnVsbGlmeVRyYW5zZm9ybUVsKSwgdGhpcykgKyAxMCA6IGZhbHNlXG4gICAgICAvKlxuICAgICAgJiZcbiAgICAgICAgICB0b3RhbFNsaWRlc1dpZHRoID4gd2luZG93LmlubmVyV2lkdGhcbiAgICAgICAgICAqL1xuXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5zbGlkZXJBY3RpdmF0ZWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5mbGV4eUF0dHJpYnV0ZUVsLmRhdGFzZXQuZmxleHkgPSBcIlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZmxleHlBdHRyaWJ1dGVFbC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWZsZXh5XCIpO1xuICAgICAgWy4uLnRoaXMuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuXS5tYXAoZWwgPT4gZWwucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIikpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBbLi4udGhpcy5zbGlkZXJDb250YWluZXIuY2hpbGRyZW5dLm1hcChlbCA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcbiAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5zdGF0ZS5wb3NpdGlvblh9cHgsIDApYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3RoaXMuc3RhdGUucG9zaXRpb25YfXB4LCAwLCAwKWA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5tb3VzZURvd24pIHtcbiAgICAgIHRoaXMub3B0aW9ucy5mbGV4eUF0dHJpYnV0ZUVsLmRhdGFzZXQuZmxleHlEcmFnZ2luZyA9IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9ucy5mbGV4eUF0dHJpYnV0ZUVsLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtZmxleHktZHJhZ2dpbmdcIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudHNPbkJlaGluZCA+IDApIHtcbiAgICAgIFsuLi50aGlzLnNsaWRlckNvbnRhaW5lci5jaGlsZHJlbl0uc2xpY2UoMCwgdGhpcy5zdGF0ZS5lbGVtZW50c09uQmVoaW5kICogLTEpLm1hcChlbCA9PiBlbC5zdHlsZS5vcmRlciA9IDIpO1xuICAgICAgWy4uLnRoaXMuc2xpZGVyQ29udGFpbmVyLmNoaWxkcmVuXS5zbGljZSh0aGlzLnN0YXRlLmVsZW1lbnRzT25CZWhpbmQgKiAtMSkubWFwKGVsID0+IGVsLnN0eWxlLm9yZGVyID0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFsuLi50aGlzLnNsaWRlckNvbnRhaW5lci5jaGlsZHJlbl0ubWFwKGVsID0+IGVsLnN0eWxlLm9yZGVyID0gMSk7XG4gICAgfVxuICB9XG5cbn1cblxuZXhwb3J0IHsgRmxleHksIGFkanVzdENvbnRhaW5lckhlaWdodEZvciB9OyIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBGbGV4eSwgYWRqdXN0Q29udGFpbmVySGVpZ2h0Rm9yIH0gZnJvbSAnZmxleHknO1xuaW1wb3J0IGN0RXZlbnRzIGZyb20gJ2N0LWV2ZW50cyc7XG5pbXBvcnQgeyBnZXRDdXJyZW50U2NyZWVuIH0gZnJvbSAnLi4vZnJvbnRlbmQvaGVscGVycy9jdXJyZW50LXNjcmVlbic7XG5leHBvcnQgY29uc3QgbW91bnQgPSAoc2xpZGVyRWwsIGFyZ3MpID0+IHtcbiAgLy8gc2xpZGVyRWwgPSBzbGlkZXJFbC5wYXJlbnROb2RlXG4gIGlmIChzbGlkZXJFbC5mbGV4eSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBtYXliZVBpbGxzU2xpZGVyID0gc2xpZGVyRWwucXVlcnlTZWxlY3RvcignLmZsZXh5LXBpbGxzIFtkYXRhLWZsZXh5XScpO1xuICBjb25zdCBpbnN0ID0gbmV3IEZsZXh5KHNsaWRlckVsLnF1ZXJ5U2VsZWN0b3IoJy5mbGV4eS1pdGVtcycpLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgZmxleHlBdHRyaWJ1dGVFbDogc2xpZGVyRWwsXG4gICAgZWxlbWVudHNUaGF0RG9Ob3RTdGFydERyYWc6IFsnLnR3ZW50eXR3ZW50eS1oYW5kbGUnXSxcbiAgICBhZGp1c3RIZWlnaHQ6ICEhc2xpZGVyRWwucXVlcnlTZWxlY3RvcignLmZsZXh5LWl0ZW1zJykuZGF0YXNldC5oZWlnaHRcbiAgfSwgYXJncy5ldmVudCA/IHtcbiAgICBpbml0aWFsRHJhZ0V2ZW50OiBhcmdzLmV2ZW50XG4gIH0gOiB7fSksIHt9LCB7XG4gICAgYXV0b3BsYXk6IE9iamVjdC5rZXlzKHNsaWRlckVsLmRhdGFzZXQpLmluZGV4T2YoJ2F1dG9wbGF5JykgPiAtMSAmJiBwYXJzZUludChzbGlkZXJFbC5kYXRhc2V0LmF1dG9wbGF5LCAxMCkgPyBzbGlkZXJFbC5kYXRhc2V0LmF1dG9wbGF5IDogZmFsc2VcbiAgfSwgc2xpZGVyRWwucXVlcnlTZWxlY3RvcignLmZsZXh5LXBpbGxzJykgPyB7XG4gICAgcGlsbHNDb250YWluZXJTZWxlY3Rvcjogc2xpZGVyRWwucXVlcnlTZWxlY3RvcignLmZsZXh5LXBpbGxzJykuZmlyc3RFbGVtZW50Q2hpbGRcbiAgfSA6IHt9KSwge30sIHtcbiAgICBsZWZ0QXJyb3c6IHNsaWRlckVsLnF1ZXJ5U2VsZWN0b3IoJy5mbGV4eSAuZmxleHktYXJyb3ctcHJldicpLFxuICAgIHJpZ2h0QXJyb3c6IHNsaWRlckVsLnF1ZXJ5U2VsZWN0b3IoJy5mbGV4eSAuZmxleHktYXJyb3ctbmV4dCcpLFxuICAgIHNjYWxlUm90YXRlRWZmZWN0OiBmYWxzZSxcbiAgICBvbkRyYWdTdGFydDogZSA9PiB7XG4gICAgICBpZiAoIWUudGFyZ2V0LmNsb3Nlc3QoJy5mbGV4eS1pdGVtcycpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgQXJyYXkuZnJvbShlLnRhcmdldC5jbG9zZXN0KCcuZmxleHktaXRlbXMnKS5xdWVyeVNlbGVjdG9yQWxsKCcuem9vbUltZycpKS5tYXAoaW1nID0+IHtcbiAgICAgICAgJChpbWcpLnN0b3AoKS5mYWRlVG8oMTIwLCAwKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gdmlld3BvcnQgfCBjb250YWluZXJcbiAgICB3cmFwQXJvdW5kTW9kZTogc2xpZGVyRWwuZGF0YXNldC53cmFwID09PSAndmlld3BvcnQnID8gJ3ZpZXdwb3J0JyA6ICdjb250YWluZXInXG4gIH0sIG1heWJlUGlsbHNTbGlkZXIgPyB7XG4gICAgcGlsbHNGbGV4eUluc3RhbmNlOiBtYXliZVBpbGxzU2xpZGVyXG4gIH0gOiB7fSkpO1xuXG4gIGlmIChtYXliZVBpbGxzU2xpZGVyKSB7XG4gICAgY29uc3QgaW5zdCA9IG5ldyBGbGV4eShtYXliZVBpbGxzU2xpZGVyLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGVsZW1lbnRzVGhhdERvTm90U3RhcnREcmFnOiBbJy50d2VudHl0d2VudHktaGFuZGxlJ10sXG4gICAgICAvLyB2aWV3cG9ydCB8IGNvbnRhaW5lclxuICAgICAgd3JhcEFyb3VuZE1vZGU6IG1heWJlUGlsbHNTbGlkZXIuZGF0YXNldC53cmFwID09PSAndmlld3BvcnQnID8gJ3ZpZXdwb3J0JyA6ICdjb250YWluZXInLFxuICAgICAgbGVmdEFycm93OiBtYXliZVBpbGxzU2xpZGVyLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignLmZsZXh5LWFycm93LXByZXYnKSxcbiAgICAgIHJpZ2h0QXJyb3c6IG1heWJlUGlsbHNTbGlkZXIucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCcuZmxleHktYXJyb3ctbmV4dCcpLFxuICAgICAgaGFzRHJhZ0FuZERyb3A6IGZhbHNlXG4gICAgfSwgbWF5YmVQaWxsc1NsaWRlci5jbG9zZXN0KCcudGh1bWJzLWxlZnQnKSAmJiBnZXRDdXJyZW50U2NyZWVuKHtcbiAgICAgIHdpdGhUYWJsZXQ6IHRydWVcbiAgICB9KSAhPT0gJ21vYmlsZScgPyB7XG4gICAgICBvcmllbnRhdGlvbjogJ3ZlcnRpY2FsJ1xuICAgIH0gOiB7fSkpO1xuICAgIG1heWJlUGlsbHNTbGlkZXIuZmxleHkgPSBpbnN0O1xuICB9XG5cbiAgc2xpZGVyRWwuZmxleHkgPSBpbnN0O1xufTtcbmN0RXZlbnRzLm9uKCdjdDpmbGV4eTp1cGRhdGUtaGVpZ2h0JywgKCkgPT4ge1xuICA7XG4gIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmxleHktY29udGFpbmVyJyldLm1hcChlbCA9PiB7XG4gICAgaWYgKCFlbC5mbGV4eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFkanVzdENvbnRhaW5lckhlaWdodEZvcihlbC5mbGV4eSk7XG4gIH0pO1xufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///400\n')}}]);