PageSourceSearch

https://yokohama-aihara.jp/assets/js/module.min.js

js yokohama-aihara.jp collected 2026-10-04 12:26:38 UTC 142,623 bytes, 1 lines download raw bytes

1(()=>{var __webpack_modules__={767:()=>{eval('function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }\n(function () {\n  \'use strict\';\n\n  var UNSUPPORTED_ENVIRONMENT = typeof window === "undefined";\n\n  /**\n   * Is true if the browser natively supports the \'scroll-behavior\' CSS-property.\n   * @type {boolean}\n   */\n  var SUPPORTS_SCROLL_BEHAVIOR = UNSUPPORTED_ENVIRONMENT ? false : "scrollBehavior" in document.documentElement.style;\n\n  /*! *****************************************************************************\r\n  Copyright (c) Microsoft Corporation. All rights reserved.\r\n  Licensed under the Apache License, Version 2.0 (the "License"); you may not use\r\n  this file except in compliance with the License. You may obtain a copy of the\r\n  License at http://www.apache.org/licenses/LICENSE-2.0\r\n    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n  KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n  WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n  MERCHANTABLITY OR NON-INFRINGEMENT.\r\n    See the Apache Version 2.0 License for specific language governing permissions\r\n  and limitations under the License.\r\n  ***************************************************************************** */\n\n  var _assign = function __assign() {\n    _assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n        s = arguments[i];\n        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n    };\n    return _assign.apply(this, arguments);\n  };\n  function __read(o, n) {\n    var m = typeof Symbol === "function" && o[Symbol.iterator];\n    if (!m) return o;\n    var i = m.call(o),\n      r,\n      ar = [],\n      e;\n    try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n    } catch (error) {\n      e = {\n        error: error\n      };\n    } finally {\n      try {\n        if (r && !r.done && (m = i["return"])) m.call(i);\n      } finally {\n        if (e) throw e.error;\n      }\n    }\n    return ar;\n  }\n  function getScrollingElement() {\n    if (document.scrollingElement != null) {\n      return document.scrollingElement;\n    } else {\n      return document.documentElement;\n    }\n  }\n  var STYLE_ATTRIBUTE_PROPERTY_NAME = "scroll-behavior";\n  var STYLE_ATTRIBUTE_PROPERTY_REGEXP = new RegExp(STYLE_ATTRIBUTE_PROPERTY_NAME + ":\\\\s*([^;]*)");\n  /**\n   * Given an Element, this function appends the given ScrollBehavior CSS property value to the elements\' \'style\' attribute.\n   * If it doesnt already have one, it will add it.\n   * @param {Element} element\n   * @param {ScrollBehavior} behavior\n   */\n  function appendScrollBehaviorToStyleAttribute(element, behavior) {\n    var addition = STYLE_ATTRIBUTE_PROPERTY_NAME + ":" + behavior;\n    var attributeValue = element.getAttribute("style");\n    if (attributeValue == null || attributeValue === "") {\n      element.setAttribute("style", addition);\n      return;\n    }\n    // The style attribute may already include a \'scroll-behavior:<something>\' in which case that should be replaced\n    var existingValueForProperty = parseScrollBehaviorFromStyleAttribute(element);\n    if (existingValueForProperty != null) {\n      var replacementProperty = STYLE_ATTRIBUTE_PROPERTY_NAME + ":" + existingValueForProperty;\n      // Replace the variant that ends with a semi-colon which it may\n      attributeValue = attributeValue.replace(replacementProperty + ";", "");\n      // Replace the variant that *doesn\'t* end with a semi-colon\n      attributeValue = attributeValue.replace(replacementProperty, "");\n    }\n    // Now, append the behavior to the string.\n    element.setAttribute("style", attributeValue.endsWith(";") ? "" + attributeValue + addition : ";" + attributeValue + addition);\n  }\n  /**\n   * Given an Element, this function attempts to parse its \'style\' attribute (if it has one)\' to extract\n   * a value for the \'scroll-behavior\' CSS property (if it is given within that style attribute)\n   * @param {Element} element\n   * @returns {ScrollBehavior?}\n   */\n  function parseScrollBehaviorFromStyleAttribute(element) {\n    var styleAttributeValue = element.getAttribute("style");\n    if (styleAttributeValue != null && styleAttributeValue.includes(STYLE_ATTRIBUTE_PROPERTY_NAME)) {\n      var match = styleAttributeValue.match(STYLE_ATTRIBUTE_PROPERTY_REGEXP);\n      if (match != null) {\n        var _a = __read(match, 2),\n          behavior = _a[1];\n        if (behavior != null && behavior !== "") {\n          return behavior;\n        }\n      }\n    }\n    return undefined;\n  }\n  var styleDeclarationPropertyName = "scrollBehavior";\n  /**\n   * Determines the scroll behavior to use, depending on the given ScrollOptions and the position of the Element\n   * within the DOM\n   * @param {Element|HTMLElement|Window} inputTarget\n   * @param {ScrollOptions} [options]\n   * @returns {ScrollBehavior}\n   */\n  function getScrollBehavior(inputTarget, options) {\n    // If the given \'behavior\' is \'smooth\', apply smooth scrolling no matter what\n    if (options != null && options.behavior === "smooth") return "smooth";
1\n    var target = "style" in inputTarget ? inputTarget : getScrollingElement();\n    var value;\n    if ("style" in target) {\n      // Check if scroll-behavior is set as a property on the CSSStyleDeclaration\n      var scrollBehaviorPropertyValue = target.style[styleDeclarationPropertyName];\n      // Return it if it is given and has a proper value\n      if (scrollBehaviorPropertyValue != null && scrollBehaviorPropertyValue !== "") {\n        value = scrollBehaviorPropertyValue;\n      }\n    }\n    if (value == null) {\n      var attributeValue = target.getAttribute("scroll-behavior");\n      if (attributeValue != null && attributeValue !== "") {\n        value = attributeValue;\n      }\n    }\n    if (value == null) {\n      // Otherwise, check if it is set as an inline style\n      value = parseScrollBehaviorFromStyleAttribute(target);\n    }\n    if (value == null) {\n      // Take the computed style for the element and see if it contains a specific \'scroll-behavior\' value\n      var computedStyle = getComputedStyle(target);\n      var computedStyleValue = computedStyle.getPropertyValue("scrollBehavior");\n      if (computedStyleValue != null && computedStyleValue !== "") {\n        value = computedStyleValue;\n      }\n    }\n    // In all other cases, use the value from the CSSOM\n    return value;\n  }\n  var HALF = 0.5;\n  /**\n   * The easing function to use when applying the smooth scrolling\n   * @param {number} k\n   * @returns {number}\n   */\n  function ease(k) {\n    return HALF * (1 - Math.cos(Math.PI * k));\n  }\n  var NOOP = {\n    reset: function reset() {}\n  };\n  var map = typeof WeakMap === "undefined" ? undefined : new WeakMap();\n  function disableScrollSnap(scroller) {\n    // If scroll-behavior is natively supported, or if there is no native WeakMap support, there\'s no need for this fix\n    if (SUPPORTS_SCROLL_BEHAVIOR || map == null) {\n      return NOOP;\n    }\n    var scrollingElement = getScrollingElement();\n    var cachedScrollSnapValue;\n    var cachedScrollBehaviorStyleAttributeValue;\n    var secondaryScroller;\n    var secondaryScrollerCachedScrollSnapValue;\n    var secondaryScrollerCachedScrollBehaviorStyleAttributeValue;\n    var existingResult = map.get(scroller);\n    if (existingResult != null) {\n      cachedScrollSnapValue = existingResult.cachedScrollSnapValue;\n      cachedScrollBehaviorStyleAttributeValue = existingResult.cachedScrollBehaviorStyleAttributeValue;\n      secondaryScroller = existingResult.secondaryScroller;\n      secondaryScrollerCachedScrollSnapValue = existingResult.secondaryScrollerCachedScrollSnapValue;\n      secondaryScrollerCachedScrollBehaviorStyleAttributeValue = existingResult.secondaryScrollerCachedScrollBehaviorStyleAttributeValue;\n      existingResult.release();\n    } else {\n      cachedScrollSnapValue = scroller.style.scrollSnapType === "" ? null : scroller.style.scrollSnapType;\n      cachedScrollBehaviorStyleAttributeValue = parseScrollBehaviorFromStyleAttribute(scroller);\n      secondaryScroller = scroller === scrollingElement && scrollingElement !== document.body ? document.body : undefined;\n      secondaryScrollerCachedScrollSnapValue = secondaryScroller == null ? undefined : secondaryScroller.style.scrollSnapType === "" ? null : secondaryScroller.style.scrollSnapType;\n      secondaryScrollerCachedScrollBehaviorStyleAttributeValue = secondaryScroller == null ? undefined : parseScrollBehaviorFromStyleAttribute(secondaryScroller);\n      var cachedComputedScrollSnapValue = getComputedStyle(scroller).getPropertyValue("scroll-snap-type");\n      var secondaryScrollerCachedComputedScrollSnapValue = secondaryScroller == null ? undefined : getComputedStyle(secondaryScroller).getPropertyValue("scroll-snap-type");\n      // If it just so happens that there actually isn\'t any scroll snapping going on, there\'s no point in performing any additional work here.\n      if (cachedComputedScrollSnapValue === "none" && secondaryScrollerCachedComputedScrollSnapValue === "none") {\n        return NOOP;\n      }\n    }\n    scroller.style.scrollSnapType = "none";\n    if (secondaryScroller !== undefined) {\n      secondaryScroller.style.scrollSnapType = "none";\n    }\n    if (cachedScrollBehaviorStyleAttributeValue !== undefined) {\n      appendScrollBehaviorToStyleAttribute(scroller, cachedScrollBehaviorStyleAttributeValue);\n    }\n    if (secondaryScroller !== undefined && secondaryScrollerCachedScrollBehaviorStyleAttributeValue !== undefined) {\n      appendScrollBehaviorToStyleAttribute(secondaryScroller, secondaryScrollerCachedScrollBehaviorStyleAttributeValue);\n    }\n    var hasReleased = false;\n    var eventTarget = scroller === scrollingElement ? window : scroller;\n    function release() {\n      eventTarget.removeEventListener("scroll", resetHandler);\n      if (map != null) {\n        map["delete"](scroller);\n      }\n      hasReleased = true;\n    }\n    function resetHandler() {\n      scroller.style.scrollSnapType = cachedScrollSnapValue;\n      if (secondaryScroller != null && secondaryScrollerCachedScrollSnapValue !== undefined) {\n        secondaryScroller.style.scrollSnapType = secondaryScrollerCachedScrollSnapValue;\n      }\n      if (cachedScrollBehaviorStyleAttributeValue !== undefined) {\n        appendScrollBehaviorToStyleAttribute(scroller, cachedScrollBehaviorStyleAttributeValue);\n      }\n      if (secondaryScroller !== undefined && secondaryScrollerCachedScrollBehaviorStyleAttributeValue !== undefined) {\n        appendScrollBehaviorToStyleAttribute(secondaryScroller, secondaryScrollerCachedScrollBehaviorStyleAttributeValue);\n      }\n      release();\n    }\n    function reset() {\n      setTimeout(function () {\n        if (hasReleased) return;\n        eventTarget.addEventListener("scroll", resetHandler);\n      });\n    }\n    map.set(scroller, {\n      release: release,\n      cachedScrollSnapValue: cachedScrollSnapValue,\n      cachedScrollBehaviorStyleAttributeValue: cachedScrollBehaviorStyleAttributeValue,\n      secondaryScroller: secondaryScroller,\n      secondaryScrollerCachedScrollSnapValue: secondaryScrollerCachedScrollSnapValue,\n      secondaryScrollerCachedScrollBehaviorStyleAttributeValue: secondaryScrollerCachedScrollBehaviorStyleAttributeValue\n    });\n    return {\n      reset: reset\n    };\n  }\n\n  /**\n   * The duration of a smooth scroll\n   * @type {number}\n   */\n  var SCROLL_TIME = 15000;\n  /**\n   * Performs a smooth repositioning of the scroll\n   * @param {ISmoothScrollOptions} options\n   */\n  function smoothScroll(options) {\n    var startTime = options.startTime,\n      startX = options.startX,\n      startY = options.startY,\n      endX = options.endX,\n      endY = options.endY,\n      method = options.method,\n      scroller = options.scroller;\n    var timeLapsed = 0;\n    var distanceX = endX - startX;\n    var distanceY = endY - startY;\n    var speed = Math.max(Math.abs(distanceX / 1000 * SCROLL_TIME), Math.abs(distanceY / 1000 * SCROLL_TIME));\n    // Temporarily disables any scroll snapping that may be active since it fights for control over the scroller with this polyfill\n    var scrollSnapFix = disableScrollSnap(scroller);
1\n    requestAnimationFrame(function animate(timestamp) {\n      timeLapsed += timestamp - startTime;\n      var percentage = Math.max(0, Math.min(1, speed === 0 ? 0 : timeLapsed / speed));\n      var positionX = Math.floor(startX + distanceX * ease(percentage));\n      var positionY = Math.floor(startY + distanceY * ease(percentage));\n      method(positionX, positionY);\n      if (positionX !== endX || positionY !== endY) {\n        requestAnimationFrame(animate);\n      } else {\n        if (scrollSnapFix != null) {\n          scrollSnapFix.reset();\n          scrollSnapFix = undefined;\n        }\n      }\n    });\n  }\n\n  /**\n   * Returns a High Resolution timestamp if possible, otherwise fallbacks to Date.now()\n   * @returns {number}\n   */\n  function now() {\n    if ("performance" in window) return performance.now();\n    return Date.now();\n  }\n  var ELEMENT_ORIGINAL_SCROLL = UNSUPPORTED_ENVIRONMENT ? undefined : Element.prototype.scroll;\n  var WINDOW_ORIGINAL_SCROLL = UNSUPPORTED_ENVIRONMENT ? undefined : window.scroll;\n  var ELEMENT_ORIGINAL_SCROLL_BY = UNSUPPORTED_ENVIRONMENT ? undefined : Element.prototype.scrollBy;\n  var WINDOW_ORIGINAL_SCROLL_BY = UNSUPPORTED_ENVIRONMENT ? undefined : window.scrollBy;\n  var ELEMENT_ORIGINAL_SCROLL_TO = UNSUPPORTED_ENVIRONMENT ? undefined : Element.prototype.scrollTo;\n  var WINDOW_ORIGINAL_SCROLL_TO = UNSUPPORTED_ENVIRONMENT ? undefined : window.scrollTo;\n\n  /**\n   * A fallback if Element.prototype.scroll is not defined\n   * @param {number} x\n   * @param {number} y\n   */\n  function elementPrototypeScrollFallback(x, y) {\n    this.__adjustingScrollPosition = true;\n    this.scrollLeft = x;\n    this.scrollTop = y;\n    delete this.__adjustingScrollPosition;\n  }\n  /**\n   * A fallback if Element.prototype.scrollTo is not defined\n   * @param {number} x\n   * @param {number} y\n   */\n  function elementPrototypeScrollToFallback(x, y) {\n    return elementPrototypeScrollFallback.call(this, x, y);\n  }\n  /**\n   * A fallback if Element.prototype.scrollBy is not defined\n   * @param {number} x\n   * @param {number} y\n   */\n  function elementPrototypeScrollByFallback(x, y) {\n    this.__adjustingScrollPosition = true;\n    this.scrollLeft += x;\n    this.scrollTop += y;\n    delete this.__adjustingScrollPosition;\n  }\n  /**\n   * Gets the original non-patched prototype method for the given kind\n   * @param {ScrollMethodName} kind\n   * @param {Element|Window} element\n   * @return {Function}\n   */\n  function getOriginalScrollMethodForKind(kind, element) {\n    switch (kind) {\n      case "scroll":\n        if (element instanceof Element) {\n          if (ELEMENT_ORIGINAL_SCROLL != null) {\n            return ELEMENT_ORIGINAL_SCROLL;\n          } else {\n            return elementPrototypeScrollFallback;\n          }\n        } else {\n          return WINDOW_ORIGINAL_SCROLL;\n        }\n      case "scrollBy":\n        if (element instanceof Element) {\n          if (ELEMENT_ORIGINAL_SCROLL_BY != null) {\n            return ELEMENT_ORIGINAL_SCROLL_BY;\n          } else {\n            return elementPrototypeScrollByFallback;\n          }\n        } else {\n          return WINDOW_ORIGINAL_SCROLL_BY;\n        }\n      case "scrollTo":\n        if (element instanceof Element) {\n          if (ELEMENT_ORIGINAL_SCROLL_TO != null) {\n            return ELEMENT_ORIGINAL_SCROLL_TO;\n          } else {\n            return elementPrototypeScrollToFallback;\n          }\n        } else {\n          return WINDOW_ORIGINAL_SCROLL_TO;\n        }\n    }\n  }\n\n  /**\n   * Gets the Smooth Scroll Options to use for the step function\n   * @param {Element|Window} element\n   * @param {number} x\n   * @param {number} y\n   * @param {ScrollMethodName} kind\n   * @returns {ISmoothScrollOptions}\n   */\n  function getSmoothScrollOptions(element, x, y, kind) {\n    var startTime = now();\n    if (!(element instanceof Element)) {\n      // Use window as the scroll container\n      var scrollX_1 = window.scrollX,\n        pageXOffset_1 = window.pageXOffset,\n        scrollY_1 = window.scrollY,\n        pageYOffset_1 = window.pageYOffset;\n      var startX = scrollX_1 == null || scrollX_1 === 0 ? pageXOffset_1 : scrollX_1;\n      var startY = scrollY_1 == null || scrollY_1 === 0 ? pageYOffset_1 : scrollY_1;\n      return {\n        startTime: startTime,\n        startX: startX,\n        startY: startY,\n        endX: Math.floor(kind === "scrollBy" ? startX + x : x),\n        endY: Math.floor(kind === "scrollBy" ? startY + y : y),\n        method: getOriginalScrollMethodForKind("scrollTo", window).bind(window),\n        scroller: getScrollingElement()\n      };\n    } else {\n      var scrollLeft = element.scrollLeft,\n        scrollTop = element.scrollTop;\n      var startX = scrollLeft;\n      var startY = scrollTop;\n      return {\n        startTime: startTime,\n        startX: startX,\n        startY: startY,\n        endX: Math.floor(kind === "scrollBy" ? startX + x : x),\n        endY: Math.floor(kind === "scrollBy" ? startY + y : y),\n        method: getOriginalScrollMethodForKind("scrollTo", element).bind(element),\n        scroller: element\n      };\n    }\n  }\n\n  /**\n   * Ensures that the given value is numeric\n   * @param {number}
1 value\n   * @return {number}\n   */\n  function ensureNumeric(value) {\n    if (value == null) return 0;else if (typeof value === "number") {\n      return value;\n    } else if (typeof value === "string") {\n      return parseFloat(value);\n    } else {\n      return 0;\n    }\n  }\n\n  /**\n   * Returns true if the given value is some ScrollToOptions\n   * @param {number | ScrollToOptions} value\n   * @return {value is ScrollToOptions}\n   */\n  function isScrollToOptions(value) {\n    return value != null && _typeof(value) === "object";\n  }\n\n  /**\n   * Handles a scroll method\n   * @param {Element|Window} element\n   * @param {ScrollMethodName} kind\n   * @param {number | ScrollToOptions} optionsOrX\n   * @param {number} y\n   */\n  function handleScrollMethod(element, kind, optionsOrX, y) {\n    onScrollWithOptions(getScrollToOptionsWithValidation(optionsOrX, y), element, kind);\n  }\n  /**\n   * Invoked when a \'ScrollToOptions\' dict is provided to \'scroll()\' as the first argument\n   * @param {ScrollToOptions} options\n   * @param {Element|Window} element\n   * @param {ScrollMethodName} kind\n   */\n  function onScrollWithOptions(options, element, kind) {\n    var behavior = getScrollBehavior(element, options);\n    // If the behavior is \'auto\' apply instantaneous scrolling\n    if (behavior == null || behavior === "auto") {\n      getOriginalScrollMethodForKind(kind, element).call(element, options.left, options.top);\n    } else {\n      smoothScroll(getSmoothScrollOptions(element, options.left, options.top, kind));\n    }\n  }\n  /**\n   * Normalizes the given scroll coordinates\n   * @param {number?} x\n   * @param {number?} y\n   * @return {Required<Pick<ScrollToOptions, "top" | "left">>}\n   */\n  function normalizeScrollCoordinates(x, y) {\n    return {\n      left: ensureNumeric(x),\n      top: ensureNumeric(y)\n    };\n  }\n  /**\n   * Gets ScrollToOptions based on the given arguments. Will throw if validation fails\n   * @param {number | ScrollToOptions} optionsOrX\n   * @param {number} y\n   * @return {Required<ScrollToOptions>}\n   */\n  function getScrollToOptionsWithValidation(optionsOrX, y) {\n    // If only one argument is given, and it isn\'t an options object, throw a TypeError\n    if (y === undefined && !isScrollToOptions(optionsOrX)) {\n      throw new TypeError("Failed to execute \'scroll\' on \'Element\': parameter 1 (\'options\') is not an object.");\n    }\n    // Scroll based on the primitive values given as arguments\n    if (!isScrollToOptions(optionsOrX)) {\n      return _assign(_assign({}, normalizeScrollCoordinates(optionsOrX, y)), {\n        behavior: "auto"\n      });\n    }\n    // Scroll based on the received options object\n    else {\n      return _assign(_assign({}, normalizeScrollCoordinates(optionsOrX.left, optionsOrX.top)), {\n        behavior: optionsOrX.behavior == null ? "auto" : optionsOrX.behavior\n      });\n    }\n  }\n\n  /**\n   * Patches the \'scroll\' method on the Element prototype\n   */\n  function patchElementScroll() {\n    Element.prototype.scroll = function (optionsOrX, y) {\n      handleScrollMethod(this, "scroll", optionsOrX, y);\n    };\n  }\n\n  /**\n   * Patches the \'scrollBy\' method on the Element prototype\n   */\n  function patchElementScrollBy() {\n    Element.prototype.scrollBy = function (optionsOrX, y) {\n      handleScrollMethod(this, "scrollBy", optionsOrX, y);\n    };\n  }\n\n  /**\n   * Patches the \'scrollTo\' method on the Element prototype\n   */\n  function patchElementScrollTo() {\n    Element.prototype.scrollTo = function (optionsOrX, y) {\n      handleScrollMethod(this, "scrollTo", optionsOrX, y);\n    };\n  }\n\n  /**\n   * Patches the \'scroll\' method on the Window prototype\n   */\n  function patchWindowScroll() {\n    window.scroll = function (optionsOrX, y) {\n      handleScrollMethod(this, "scroll", optionsOrX, y);\n    };\n  }\n\n  /**\n   * Patches the \'scrollBy\' method on the Window prototype\n   */\n  function patchWindowScrollBy() {\n    window.scrollBy = function (optionsOrX, y) {\n      handleScrollMethod(this, "scrollBy", optionsOrX, y);\n    };\n  }\n\n  /**\n   * Patches the \'scrollTo\' method on the Window prototype\n   */\n  function patchWindowScrollTo() {\n    window.scrollTo = function (optionsOrX, y) {\n      handleScrollMethod(this, "scrollTo", optionsOrX, y);\n    };\n  }\n\n  // tslint:disable:no-any\n  /**\n   * Gets the parent of an element, taking into account DocumentFragments, ShadowRoots, as well as the root context (window)\n   * @param {EventTarget} currentElement\n   * @returns {EventTarget | null}\n   */\n  function getParent(currentElement) {\n    if ("nodeType" in currentElement && currentElement.nodeType === 1) {\n      return currentElement.parentNode;\n    }\n    if ("ShadowRoot" in window && currentElement instanceof window.ShadowRoot) {\n      return currentElement.host;\n    } else if (currentElement === document) {\n      return window;\n    } else if (currentElement instanceof Node) return currentElement.parentNode;\n    return null;\n  }\n\n  /**\n   * Returns true if the given overflow property represents a scrollable overflow value\
1n   * @param {string | null} overflow\n   * @return {boolean}\n   */\n  function canOverflow(overflow) {\n    return overflow !== "visible" && overflow !== "clip";\n  }\n  /**\n   * Returns true if the given element is scrollable\n   * @param {Element} element\n   * @return {boolean}\n   */\n  function isScrollable(element) {\n    if (element.clientHeight < element.scrollHeight || element.clientWidth < element.scrollWidth) {\n      var style = getComputedStyle(element, null);\n      return canOverflow(style.overflowY) || canOverflow(style.overflowX);\n    }\n    return false;\n  }\n  /**\n   * Finds the nearest ancestor of an element that can scroll\n   * @param {Element} target\n   * @returns {Element|Window?}\n   */\n  function findNearestAncestorsWithScrollBehavior(target) {\n    var currentElement = target;\n    var scrollingElement = getScrollingElement();\n    while (currentElement != null) {\n      var behavior = getScrollBehavior(currentElement);\n      if (behavior != null && (currentElement === scrollingElement || isScrollable(currentElement))) {\n        return [currentElement, behavior];\n      }\n      var parent_1 = getParent(currentElement);\n      currentElement = parent_1;\n    }\n    // No such element could be found. Start over, but this time find the nearest ancestor that can simply scroll\n    currentElement = target;\n    while (currentElement != null) {\n      if (currentElement === scrollingElement || isScrollable(currentElement)) {\n        return [currentElement, "auto"];\n      }\n      var parent_2 = getParent(currentElement);\n      currentElement = parent_2;\n    }\n    // Default to the scrolling element\n    return [scrollingElement, "auto"];\n  }\n\n  // tslint:disable:no-any\n  /**\n   * Finds the nearest root from an element\n   * @param {Element} target\n   * @returns {Document|ShadowRoot}\n   */\n  function findNearestRoot(target) {\n    var currentElement = target;\n    while (currentElement != null) {\n      if ("ShadowRoot" in window && currentElement instanceof window.ShadowRoot) {\n        // Assume this is a ShadowRoot\n        return currentElement;\n      }\n      var parent_1 = getParent(currentElement);\n      if (parent_1 === currentElement) {\n        return document;\n      }\n      currentElement = parent_1;\n    }\n    return document;\n  }\n\n  /**\n   * Gets the origin of the given Location or HTMLAnchorElement if available in the runtime, and otherwise shims it. (it\'s a one-liner)\n   * @returns {string}\n   */\n  function getLocationOrigin(locationLike) {\n    if (locationLike === void 0) {\n      locationLike = location;\n    }\n    if ("origin" in locationLike && locationLike.origin != null) {\n      return locationLike.origin;\n    }\n    var port = locationLike.port != null && locationLike.port.length > 0 ? ":" + locationLike.port : "";\n    if (locationLike.protocol === "http:" && port === ":80") {\n      port = "";\n    } else if (locationLike.protocol === "https:" && port === ":443") {\n      port = "";\n    }\n    return locationLike.protocol + "//" + locationLike.hostname + port;\n  }\n\n  /**\n   * A Regular expression that matches id\'s of the form "#[digit]"\n   * @type {RegExp}\n   */\n  var ID_WITH_LEADING_DIGIT_REGEXP = /^#\\d/;\n  /**\n   * Catches anchor navigation to IDs within the same root and ensures that they can be smooth-scrolled\n   * if the scroll behavior is smooth in the first rooter within that context\n   */\n  function catchNavigation() {\n    // Listen for \'click\' events globally\n    window.addEventListener("click", function (e) {\n      // Only work with trusted events on HTMLAnchorElements\n      if (!e.isTrusted || !(e.target instanceof HTMLAnchorElement)) return;\n      var _a = e.target,\n        pathname = _a.pathname,\n        search = _a.search,\n        hash = _a.hash;\n      var pointsToCurrentPage = getLocationOrigin(e.target) === getLocationOrigin(location) && pathname === location.pathname && search === location.search;\n      // Only work with HTMLAnchorElements that navigates to a specific ID on the current page\n      if (!pointsToCurrentPage || hash == null || hash.length < 1) {\n        return;\n      }\n      // Find the nearest root, whether it be a ShadowRoot or the document itself\n      var root = findNearestRoot(e.target);\n      // Attempt to match the selector from that root. querySelector\' doesn\'t support IDs that start with a digit, so work around that limitation\n      var elementMatch = hash.match(ID_WITH_LEADING_DIGIT_REGEXP) != null ? root.getElementById(hash.slice(1)) : root.querySelector(hash);\n      // If no selector could be found, don\'t proceed\n      if (elementMatch == null) return;\n      // Find the nearest ancestor that can be scrolled\n      var _b = __read(findNearestAncestorsWithScrollBehavior(elementMatch), 2),\n        behavior = _b[1];\n      // If the behavior isn\'t smooth, don\'t proceed\n      if (behavior !== "smooth") return;\n      // Otherwise, first prevent the default action.\n      e.preventDefault();\n      // Now, scroll to the element with that ID\n      elementMatch.scrollIntoView({\n        behavior: behavior\n      });\n    });\n  }\n  var ELEMENT_ORIGINAL_SCROLL_INTO_VIEW = UNSUPPORTED_ENVIRONMENT ? undefined : Element.prototype.scrollIntoView;\n\n  /**\n   * The majority of this file is based on https://github.com/stipsan/compute-scroll-into-view (MIT license),\n   * but has been rewritten to accept a scroller as an argument.\n   */\n  /**\n   * Find out which edge to align against when logical scroll position is "nearest"\n   * Interesting fact: "nearest" works similarly to "if-needed", if the element is fully visible it will not scroll it\n   *\n   * Legends:\n   * ┌────────┐ ┏ ━ ━ ━ ┓\n   * │ target │   frame\n   * └────────┘ ┗ ━ ━ ━ ┛\n   */\n  function alignNearest(scrollingEdgeStart, scrollingEdgeEnd, scrollingSize, scrollingBorderStart, scrollingBorderEnd, elementEdgeStart, elementEdgeEnd, elementSize) {\n    /**\n     * If element edge A and element edge B are both outside scrolling box edge A and scrolling box edge B\n     *\n     *          ┌──┐\n     *        ┏━│━━│━┓\n     *          │  │\n     *        ┃ │  │ ┃        do nothing\n     *          │  │\n     *        ┗━│━━│━┛\n     *          └──┘\n     *\n     *  If element edge C and element edge D are both outside scrolling box edge C and scrolling box edge D\n     *\n     *    ┏ ━ ━ ━ ━ ┓\n     *   ┌───────────┐\n     *   │┃         ┃│        do nothing\n     *   └───────────┘\n     *    ┗ ━ ━ ━ ━ ┛\n     */\n    if (elementEdgeStart < scrollingEdgeStart && elementEdgeEnd > scrollingEdgeEnd || elementEdgeStart > scrollingEdgeStart && elementEdgeEnd < scrollingEdgeEnd) {\n      return 0;\n    }\n    /**\n     * If element edge A is outside scrolling box edge A and element height is less than scrolling box he
1ight\n     *\n     *          ┌──┐\n     *        ┏━│━━│━┓         ┏━┌━━┐━┓\n     *          └──┘             │  │\n     *  from  ┃      ┃     to  ┃ └──┘ ┃\n     *\n     *        ┗━ ━━ ━┛         ┗━ ━━ ━┛\n     *\n     * If element edge B is outside scrolling box edge B and element height is greater than scrolling box height\n     *\n     *        ┏━ ━━ ━┓         ┏━┌━━┐━┓\n     *                           │  │\n     *  from  ┃ ┌──┐ ┃     to  ┃ │  │ ┃\n     *          │  │             │  │\n     *        ┗━│━━│━┛         ┗━│━━│━┛\n     *          │  │             └──┘\n     *          │  │\n     *          └──┘\n     *\n     * If element edge C is outside scrolling box edge C and element width is less than scrolling box width\n     *\n     *       from                 to\n     *    ┏ ━ ━ ━ ━ ┓         ┏ ━ ━ ━ ━ ┓\n     *  ┌───┐                 ┌───┐\n     *  │ ┃ │       ┃         ┃   │     ┃\n     *  └───┘                 └───┘\n     *    ┗ ━ ━ ━ ━ ┛         ┗ ━ ━ ━ ━ ┛\n     *\n     * If element edge D is outside scrolling box edge D and element width is greater than scrolling box width\n     *\n     *       from                 to\n     *    ┏ ━ ━ ━ ━ ┓         ┏ ━ ━ ━ ━ ┓\n     *        ┌───────────┐   ┌───────────┐\n     *    ┃   │     ┃     │   ┃         ┃ │\n     *        └───────────┘   └───────────┘\n     *    ┗ ━ ━ ━ ━ ┛         ┗ ━ ━ ━ ━ ┛\n     */\n    if (elementEdgeStart <= scrollingEdgeStart && elementSize <= scrollingSize || elementEdgeEnd >= scrollingEdgeEnd && elementSize >= scrollingSize) {\n      return elementEdgeStart - scrollingEdgeStart - scrollingBorderStart;\n    }\n    /**\n     * If element edge B is outside scrolling box edge B and element height is less than scrolling box height\n     *\n     *        ┏━ ━━ ━┓         ┏━ ━━ ━┓\n     *\n     *  from  ┃      ┃     to  ┃ ┌──┐ ┃\n     *          ┌──┐             │  │\n     *        ┗━│━━│━┛         ┗━└━━┘━┛\n     *          └──┘\n     *\n     * If element edge A is outside scrolling box edge A and element height is greater than scrolling box height\n     *\n     *          ┌──┐\n     *          │  │\n     *          │  │             ┌──┐\n     *        ┏━│━━│━┓         ┏━│━━│━┓\n     *          │  │             │  │\n     *  from  ┃ └──┘ ┃     to  ┃ │  │ ┃\n     *                           │  │\n     *        ┗━ ━━ ━┛         ┗━└━━┘━┛\n     *\n     * If element edge C is outside scrolling box edge C and element width is greater than scrolling box width\n     *\n     *           from                 to\n     *        ┏ ━ ━ ━ ━ ┓         ┏ ━ ━ ━ ━ ┓\n     *  ┌───────────┐           ┌───────────┐\n     *  │     ┃     │   ┃       │ ┃         ┃\n     *  └───────────┘           └───────────┘\n     *        ┗ ━ ━ ━ ━ ┛         ┗ ━ ━ ━ ━ ┛\n     *\n     * If element edge D is outside scrolling box edge D and element width is less than scrolling box width\n     *\n     *           from                 to\n     *        ┏ ━ ━ ━ ━ ┓         ┏ ━ ━ ━ ━ ┓\n     *                ┌───┐             ┌───┐\n     *        ┃       │ ┃ │       ┃     │   ┃\n     *                └───┘             └───┘\n     *        ┗ ━ ━ ━ ━ ┛         ┗ ━ ━ ━ ━ ┛\n     *\n     */\n    if (elementEdgeEnd > scrollingEdgeEnd && elementSize < scrollingSize || elementEdgeStart < scrollingEdgeStart && elementSize > scrollingSize) {\n      return elementEdgeEnd - scrollingEdgeEnd + scrollingBorderEnd;\n    }\n    return 0;\n  }\n  function computeScrollIntoView(target, scroller, options) {\n    var block = options.block,\n      inline = options.inline;\n    // Used to handle the top most element that can be scrolled\n    var scrollingElement = getScrollingElement();
1\n    // Support pinch-zooming properly, making sure elements scroll into the visual viewport\n    // Browsers that don\'t support visualViewport will report the layout viewport dimensions on document.documentElement.clientWidth/Height\n    // and viewport dimensions on window.innerWidth/Height\n    // https://www.quirksmode.org/mobile/viewports2.html\n    // https://bokand.github.io/viewport/index.html\n    var viewportWidth = window.visualViewport != null ? visualViewport.width : innerWidth;\n    var viewportHeight = window.visualViewport != null ? visualViewport.height : innerHeight;\n    var viewportX = window.scrollX != null ? window.scrollX : window.pageXOffset;\n    var viewportY = window.scrollY != null ? window.scrollY : window.pageYOffset;\n    var _a = target.getBoundingClientRect(),\n      targetHeight = _a.height,\n      targetWidth = _a.width,\n      targetTop = _a.top,\n      targetRight = _a.right,\n      targetBottom = _a.bottom,\n      targetLeft = _a.left;\n    // These values mutate as we loop through and generate scroll coordinates\n    var targetBlock = block === "start" || block === "nearest" ? targetTop : block === "end" ? targetBottom : targetTop + targetHeight / 2; // block === \'center\n    var targetInline = inline === "center" ? targetLeft + targetWidth / 2 : inline === "end" ? targetRight : targetLeft; // inline === \'start || inline === \'nearest\n    var _b = scroller.getBoundingClientRect(),\n      height = _b.height,\n      width = _b.width,\n      top = _b.top,\n      right = _b.right,\n      bottom = _b.bottom,\n      left = _b.left;\n    var frameStyle = getComputedStyle(scroller);\n    var borderLeft = parseInt(frameStyle.borderLeftWidth, 10);\n    var borderTop = parseInt(frameStyle.borderTopWidth, 10);\n    var borderRight = parseInt(frameStyle.borderRightWidth, 10);\n    var borderBottom = parseInt(frameStyle.borderBottomWidth, 10);\n    var blockScroll = 0;\n    var inlineScroll = 0;\n    // The property existance checks for offset[Width|Height] is because only HTMLElement objects have them, but any Element might pass by here\n    // @TODO find out if the "as HTMLElement" overrides can be dropped\n    var scrollbarWidth = "offsetWidth" in scroller ? scroller.offsetWidth - scroller.clientWidth - borderLeft - borderRight : 0;\n    var scrollbarHeight = "offsetHeight" in scroller ? scroller.offsetHeight - scroller.clientHeight - borderTop - borderBottom : 0;\n    if (scrollingElement === scroller) {\n      // Handle viewport logic (document.documentElement or document.body)\n      if (block === "start") {\n        blockScroll = targetBlock;\n      } else if (block === "end") {\n        blockScroll = targetBlock - viewportHeight;\n      } else if (block === "nearest") {\n        blockScroll = alignNearest(viewportY, viewportY + viewportHeight, viewportHeight, borderTop, borderBottom, viewportY + targetBlock, viewportY + targetBlock + targetHeight, targetHeight);\n      } else {\n        // block === \'center\' is the default\n        blockScroll = targetBlock - viewportHeight / 2;\n      }\n      if (inline === "start") {\n        inlineScroll = targetInline;\n      } else if (inline === "center") {\n        inlineScroll = targetInline - viewportWidth / 2;\n      } else if (inline === "end") {\n        inlineScroll = targetInline - viewportWidth;\n      } else {\n        // inline === \'nearest\' is the default\n        inlineScroll = alignNearest(viewportX, viewportX + viewportWidth, viewportWidth, borderLeft, borderRight, viewportX + targetInline, viewportX + targetInline + targetWidth, targetWidth);\n      }\n      // Apply scroll position offsets and ensure they are within bounds\n      // @TODO add more test cases to cover this 100%\n      blockScroll = Math.max(0, blockScroll + viewportY);\n      inlineScroll = Math.max(0, inlineScroll + viewportX);\n    } else {\n      // Handle each scrolling frame that might exist between the target and the viewport\n      if (block === "start") {\n        blockScroll = targetBlock - top - borderTop;\n      } else if (block === "end") {\n        blockScroll = targetBlock - bottom + borderBottom + scrollbarHeight;\n      } else if (block === "nearest") {\n        blockScroll = alignNearest(top, bottom, height, borderTop, borderBottom + scrollbarHeight, targetBlock, targetBlock + targetHeight, targetHeight);\n      } else {\n        // block === \'center\' is the default\n        blockScroll = targetBlock - (top + height / 2) + scrollbarHeight / 2;\n      }\n      if (inline === "start") {\n        inlineScroll = targetInline - left - borderLeft;\n      } else if (inline === "center") {\n        inlineScroll = targetInline - (left + width / 2) + scrollbarWidth / 2;\n      } else if (inline === "end") {\n        inlineScroll = targetInline - right + borderRight + scrollbarWidth;\n      } else {\n        // inline === \'nearest\' is the default\n        inlineScroll = alignNearest(left, right, width, borderLeft, borderRight + scrollbarWidth, targetInline, targetInline + targetWidth, targetWidth);\n      }\n      var scrollLeft = scroller.scrollLeft,\n        scrollTop = scroller.scrollTop;\n      // Ensure scroll coordinates are not out of bounds while applying scroll offsets\n      blockScroll = Math.max(0, Math.min(scrollTop + blockScroll, scroller.scrollHeight - height + scrollbarHeight));\n      inlineScroll = Math.max(0, Math.min(scrollLeft + inlineScroll, scroller.scrollWidth - width + scrollbarWidth));\n    }\n    return {\n      top: blockScroll,\n      left: inlineScroll\n    };\n  }\n\n  /**\n   * Patches the \'scrollIntoView\' method on the Element prototype\n   */\n  function patchElementScrollIntoView() {\n    Element.prototype.scrollIntoView = function (arg) {\n      var normalizedOptions = arg == null || arg === true ? {\n        block: "start",\n        inline: "nearest"\n      } : arg === false ? {\n        block: "end",\n        inline: "nearest"\n      } : arg;\n      // Find the nearest ancestor that can be scrolled\n      var _a = __read(findNearestAncestorsWithScrollBehavior(this), 2),\n        ancestorWithScroll = _a[0],\n        ancestorWithScrollBehavior = _a[1];\n      var behavior = normalizedOptions.behavior != null ? normalizedOptions.behavior : ancestorWithScrollBehavior;\n      // If the behavior isn\'t smooth, simply invoke the original implementation and do no more\n      if (behavior !== "smooth") {\n        // Assert that \'scrollIntoView\' is actually defined\n        if (ELEMENT_ORIGINAL_SCROLL_INTO_VIEW != null) {\n          ELEMENT_ORIGINAL_SCROLL_INTO_VIEW.call(this, normalizedOptions);\n        }\n        // Otherwise, invoke \'scrollTo\' instead and provide the scroll coordinates\n        else {\n          var _b = computeScrollIntoView(this, ancestorWithScroll, normalizedOptions),\n            top_1 = _b.top,\n            left = _b.left;\n          getOriginalScrollMethodForKind("scrollTo", this).call(this, left, top_1);\n        }\n        return;\n      }\n      ancestorWithScroll.scrollTo(_assign({\n        behavior: behavior\n      }, computeScrollIntoView(this, ancestorWithScroll, normalizedOptions)));\n    };\n    // On IE11, HTMLElement has its own declaration of scrollIntoView and does not inherit this from the prototype chain, so we\'ll need to patch that one too.\n    if (HTMLElement.prototype.scrollIntoView != null && HTMLElement.prototype.scrollIntoView !== Element.prototype.scrollIntoView) {\n      HTMLElement.prototype.scrollIntoView = Element.prototype.scrollIntoView;\n    }\n  }\n  var ELEMENT_ORIGINAL_SCROLL_TOP_SET_DESCRIPTOR = UNSUPPORTED_ENVIRONMENT ? undefined : Object.getOwnPropertyDescriptor(Element.prototype, "scrollTop").set;\n\n  /**\n   * Patches the \'scrollTop\' property descriptor on the Element prototype\n   */\n  function patchElementScrollTop() {\n    Object.defineProperty(Element.prototype, "scrollTop", {\n      set: function set(scrollTop) {\n        if (this.__adjustingScrollPosition) {\n          return ELEMENT_ORIGINAL_SCROLL_TOP_SET_DESCRIPTOR.call(this, scrollTop);\n        }\n        handleScrollMethod(this, "scrollTo", this.scrollLeft, scrollTop);\n        return scrollTop;\n      }\n    });\n  }\n  var ELEMENT_ORIGINAL_SCROLL_LEFT_SET_DESCRIPTOR = UNSUPPORTED_ENVIRONMENT ? undefined : Object.getOwnPropertyDescriptor(Element.prototype, "scrollLeft").set;\n\n  /**\n   * Patches the \'scrollLeft\' property descriptor on the Element prototype\n   */\n  function patchElementScrollLeft() {\n    Object.defineProperty(Element.prototype, "scrollLeft", {\n      set: function set(scrollLeft) {\n        if (this.__adjustingScrollPosition) {\n          return ELEMENT_ORIGINAL_SCROLL_LEFT_SET_DESCRIPTOR.call(this, scrollLeft);\n        }\n        handleScrollMethod(this, "scrollTo", scrollLeft, this.scrollTop);\n        return scrollLeft;\n      }\n    });\n  }\n\n  /**\n   * Applies the polyfill\n   */\n  function patch() {\n    // Element.prototype methods\n    patchElementScroll();\n    patchElementScrollBy();\n    patchElementScrollTo();\n    patchElementScrollIntoView();\n    // Element.prototype descriptors\n    patchElementScrollLeft();\n    patchElementScrollTop();\n    // window methods\n    patchWindowScroll();\n    patchWindowScrollBy();\n    patchWindowScrollTo();\n    // Navigation\n    catchNavigation();\n  }\n\n  /**\n   * Is true if the browser natively supports the Element.prototype.[scroll|scrollTo|scrollBy|scrollIntoView] methods\n   * @type {boolean}\n   */\n  var SUPPORTS_ELEMENT_PROTOTYPE_SCROLL_METHODS = UNSUPPORTED_ENVIRONMENT ? false : "scroll" in Element.prototype && "scrollTo" in Element.prototype && "scrollBy" in Element.prototype && "scrollIntoView" in Element.prototype;\n  if (!UNSUPPORTED_ENVIRONMENT && (!SUPPORTS_SCROLL_BEHAVIOR || !SUPPORTS_ELEMENT_PROTOTYPE_SCROLL_METHODS)) {\n    patch();\n  }\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY3LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E
17QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wb3Rhc2xpbS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtYmVoYXZpb3ItcG9seWZpbGwvZGlzdC9pbmRleC5qcz8yM2MwIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cbihmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgVU5TVVBQT1JURURfRU5WSVJPTk1FTlQgPSB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiO1xuXG4gIC8qKlxuICAgKiBJcyB0cnVlIGlmIHRoZSBicm93c2VyIG5hdGl2ZWx5IHN1cHBvcnRzIHRoZSAnc2Nyb2xsLWJlaGF2aW9yJyBDU1MtcHJvcGVydHkuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgdmFyIFNVUFBPUlRTX1NDUk9MTF9CRUhBVklPUiA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gZmFsc2UgOiBcInNjcm9sbEJlaGF2aW9yXCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG4gIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG4gIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbiAgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICAgIFRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbiAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuICBNRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG4gICAgU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbiAgdmFyIF9hc3NpZ24gPSBmdW5jdGlvbiBfX2Fzc2lnbigpIHtcbiAgICBfYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSxcbiAgICAgIHIsXG4gICAgICBhciA9IFtdLFxuICAgICAgZTtcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGUgPSB7XG4gICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xuICB9XG4gIGZ1bmN0aW9uIGdldFNjcm9sbGluZ0VsZW1lbnQoKSB7XG4gICAgaWYgKGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybi
1Bkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfVxuICB9XG4gIHZhciBTVFlMRV9BVFRSSUJVVEVfUFJPUEVSVFlfTkFNRSA9IFwic2Nyb2xsLWJlaGF2aW9yXCI7XG4gIHZhciBTVFlMRV9BVFRSSUJVVEVfUFJPUEVSVFlfUkVHRVhQID0gbmV3IFJlZ0V4cChTVFlMRV9BVFRSSUJVVEVfUFJPUEVSVFlfTkFNRSArIFwiOlxcXFxzKihbXjtdKilcIik7XG4gIC8qKlxuICAgKiBHaXZlbiBhbiBFbGVtZW50LCB0aGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIGdpdmVuIFNjcm9sbEJlaGF2aW9yIENTUyBwcm9wZXJ0eSB2YWx1ZSB0byB0aGUgZWxlbWVudHMnICdzdHlsZScgYXR0cmlidXRlLlxuICAgKiBJZiBpdCBkb2VzbnQgYWxyZWFkeSBoYXZlIG9uZSwgaXQgd2lsbCBhZGQgaXQuXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1Njcm9sbEJlaGF2aW9yfSBiZWhhdmlvclxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kU2Nyb2xsQmVoYXZpb3JUb1N0eWxlQXR0cmlidXRlKGVsZW1lbnQsIGJlaGF2aW9yKSB7XG4gICAgdmFyIGFkZGl0aW9uID0gU1RZTEVfQVRUUklCVVRFX1BST1BFUlRZX05BTUUgKyBcIjpcIiArIGJlaGF2aW9yO1xuICAgIHZhciBhdHRyaWJ1dGVWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlID09IG51bGwgfHwgYXR0cmlidXRlVmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgYWRkaXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgc3R5bGUgYXR0cmlidXRlIG1heSBhbHJlYWR5IGluY2x1ZGUgYSAnc2Nyb2xsLWJlaGF2aW9yOjxzb21ldGhpbmc+JyBpbiB3aGljaCBjYXNlIHRoYXQgc2hvdWxkIGJlIHJlcGxhY2VkXG4gICAgdmFyIGV4aXN0aW5nVmFsdWVGb3JQcm9wZXJ0eSA9IHBhcnNlU2Nyb2xsQmVoYXZpb3JGcm9tU3R5bGVBdHRyaWJ1dGUoZWxlbWVudCk7XG4gICAgaWYgKGV4aXN0aW5nVmFsdWVGb3JQcm9wZXJ0eSAhPSBudWxsKSB7XG4gICAgICB2Y
1XIgcmVwbGFjZW1lbnRQcm9wZXJ0eSA9IFNUWUxFX0FUVFJJQlVURV9QUk9QRVJUWV9OQU1FICsgXCI6XCIgKyBleGlzdGluZ1ZhbHVlRm9yUHJvcGVydHk7XG4gICAgICAvLyBSZXBsYWNlIHRoZSB2YXJpYW50IHRoYXQgZW5kcyB3aXRoIGEgc2VtaS1jb2xvbiB3aGljaCBpdCBtYXlcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWUucmVwbGFjZShyZXBsYWNlbWVudFByb3BlcnR5ICsgXCI7XCIsIFwiXCIpO1xuICAgICAgLy8gUmVwbGFjZSB0aGUgdmFyaWFudCB0aGF0ICpkb2Vzbid0KiBlbmQgd2l0aCBhIHNlbWktY29sb25cbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWUucmVwbGFjZShyZXBsYWNlbWVudFByb3BlcnR5LCBcIlwiKTtcbiAgICB9XG4gICAgLy8gTm93LCBhcHBlbmQgdGhlIGJlaGF2aW9yIHRvIHRoZSBzdHJpbmcuXG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBhdHRyaWJ1dGVWYWx1ZS5lbmRzV2l0aChcIjtcIikgPyBcIlwiICsgYXR0cmlidXRlVmFsdWUgKyBhZGRpdGlvbiA6IFwiO1wiICsgYXR0cmlidXRlVmFsdWUgKyBhZGRpdGlvbik7XG4gIH1cbiAgLyoqXG4gICAqIEdpdmVuIGFuIEVsZW1lbnQsIHRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcGFyc2UgaXRzICdzdHlsZScgYXR0cmlidXRlIChpZiBpdCBoYXMgb25lKScgdG8gZXh0cmFjdFxuICAgKiBhIHZhbHVlIGZvciB0aGUgJ3Njcm9sbC1iZWhhdmlvcicgQ1NTIHByb3BlcnR5IChpZiBpdCBpcyBnaXZlbiB3aXRoaW4gdGhhdCBzdHlsZSBhdHRyaWJ1dGUpXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7U2Nyb2xsQmVoYXZpb3I/fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VTY3JvbGxCZWhhdmlvckZyb21TdHlsZUF0dHJpYnV0ZShlbGVtZW50KSB7XG4gICAgdmFyIHN0eWxlQXR0cmlidXRlVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgIGlmIChzdHlsZUF0dHJpYnV0ZVZhbHVlICE9IG51bGwgJiYgc3R5bGVBdHRyaWJ1dGVWYWx1ZS5pbmNsdWRlcyhTVFlMRV9BVFRSSUJVVEVfUFJPUEVSVFlfTkFNRSkpIHtcbiAgICAgIHZhciBtYXRjaCA9IHN0eWxlQXR0cmlidXRlVmFsdWUubWF0Y2goU1RZTEVfQVRUUklCVVRFX1BST1BFUlRZX1JFR0VYUCk7XG4gICAgICBpZiAobWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICB2Y
1XIgX2EgPSBfX3JlYWQobWF0Y2gsIDIpLFxuICAgICAgICAgIGJlaGF2aW9yID0gX2FbMV07XG4gICAgICAgIGlmIChiZWhhdmlvciAhPSBudWxsICYmIGJlaGF2aW9yICE9PSBcIlwiKSB7XG4gICAgICAgICAgcmV0dXJuIGJlaGF2aW9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdmFyIHN0eWxlRGVjbGFyYXRpb25Qcm9wZXJ0eU5hbWUgPSBcInNjcm9sbEJlaGF2aW9yXCI7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBzY3JvbGwgYmVoYXZpb3IgdG8gdXNlLCBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIFNjcm9sbE9wdGlvbnMgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgRWxlbWVudFxuICAgKiB3aXRoaW4gdGhlIERPTVxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEVsZW1lbnR8V2luZG93fSBpbnB1dFRhcmdldFxuICAgKiBAcGFyYW0ge1Njcm9sbE9wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7U2Nyb2xsQmVoYXZpb3J9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTY3JvbGxCZWhhdmlvcihpbnB1dFRhcmdldCwgb3B0aW9ucykge1xuICAgIC8vIElmIHRoZSBnaXZlbiAnYmVoYXZpb3InIGlzICdzbW9vdGgnLCBhcHBseSBzbW9vdGggc2Nyb2xsaW5nIG5vIG1hdHRlciB3aGF0XG4gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmJlaGF2aW9yID09PSBcInNtb290aFwiKSByZXR1cm4gXCJzbW9vdGhcIjtcbiAgICB2YXIgdGFyZ2V0ID0gXCJzdHlsZVwiIGluIGlucHV0VGFyZ2V0ID8gaW5wdXRUYXJnZXQgOiBnZXRTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIGlmIChcInN0eWxlXCIgaW4gdGFyZ2V0KSB7XG4gICAgICAvLyBDaGVjayBpZiBzY3JvbGwtYmVoYXZpb3IgaXMgc2V0IGFzIGEgcHJvcGVydHkgb24gdGhlIENTU1N0eWxlRGVjbGFyYXRpb25cbiAgICAgIHZhciBzY3JvbGxCZWhhdmlvclByb3BlcnR5VmFsdWUgPSB0YXJnZXQuc3R5bGVbc3R5bGVEZWNsYXJhdGlvblByb3BlcnR5TmFtZV07XG4gICAgICAvLyBSZXR1cm4gaXQgaWYgaXQgaXMgZ2l2ZW4gYW5kIGhhcyBhIHByb3BlciB2YWx1ZVxuICAgICAgaWYgKHNjcm9sbEJlaGF2aW9yUHJvcGVydHlWYWx1ZSAhPSBudWxsICYmIHNjcm9sbEJlaGF2aW9yUHJvcGVydHlWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICB2YWx1ZSA9IHNjcm9sbEJlaGF2aW9yUHJvcGVydHlWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHZhciBhdHRyaWJ1dGVWYWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJzY3JvbGwtYmVoYXZpb3JcIik7XG4gICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCAmJiBhdHRyaWJ1dGVWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpZiBpdCBpcyBzZXQgYXMgYW4gaW5saW5lIHN0eWxlXG4gICAgICB2YWx1ZSA9IHBhcnNlU2Nyb2xsQmVoYXZpb3JGcm9tU3R5bGVBdHRyaWJ1dGUodGFyZ2V0KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIC8vIFRha2UgdGhlIGNvbXB1dGVkIHN0eWxlIGZvciB0aGUgZWxlbWVudCBhbmQgc2VlIGlmIGl0IGNvbnRhaW5zIGEgc3BlY2lmaWMgJ3Njcm9sbC1iZWhhdmlvcicgdmFsdWVcbiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgICAgdmFyIGNvbXB1dGVkU3R5bGVWYWx1ZSA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcInNjcm9sbEJlaGF2aW9yXCIpO1xuICAgICAgaWYgKGNvbXB1dGVkU3R5bGVWYWx1ZSAhPSBudWxsICYmIGNvbXB1dGVkU3R5bGVWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICB2YWx1ZSA9IGNvbXB1dGVkU3R5bGVWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gYWxsIG90aGVyIGNhc2VzLCB1c2UgdGhlIHZhbHVlIGZyb20gdGhlIENTU09NXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBIQUxGID0gMC41O1xuICAvKipcbiAgICogVGhlIGVhc2luZyBmdW5jdGlvbiB0byB1c2Ugd2hlbiBhcHBseWluZyB0aGUgc21vb3RoIHNjcm9sbGluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gZWFzZShrKSB7XG4gICAgcmV0dXJuIEhBTEYgKiAoMSAtIE1hdGguY29zKE1hdGguUEkgKiBrKSk7XG4gIH1cbiAgdmFyIE5PT1AgPSB7XG4gICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge31cbiAgfTtcbiAgdmFyIG1hcCA9IHR5cGVvZiBXZWFrTWFwID09PSBcInVuZGVmaW5lZFwiID8gdW5kZWZpbmVkIDogbmV3IFdlYWtNYXAoKTtcbiAgZnVuY3Rpb24gZGlzYWJsZVNjcm9sbFNuYXAoc2Nyb2xsZXIpIHtcbiAgICAvLyBJZiBzY3JvbGwtYmVoYXZpb3IgaXMgbmF0aXZlbHkgc3VwcG9ydGVkLCBvciBpZiB0aGVyZSBpcyBubyBuYXRpdmUgV2Vha01hcCBzdXBwb3J0LCB0aGVyZSdzIG5vIG5lZWQgZm9yIHRoaXMgZml4XG4gICAgaWYgKFNVUFBPUlRTX1NDUk9MTF9CRUhBVklPUiB8fCBtYXAgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5PT1A7XG4gICAgfVxuICAgIHZhciBzY3JvbGxpbmdFbGVtZW50ID0gZ2V0U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgIHZhciBjYWNoZWRTY3JvbGxTbmFwVmFsdWU7XG4gICAgdmFyIGNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZTtcbiAgICB2YXIgc2Vjb25kYXJ5U2Nyb2xsZXI7XG4gICAgdmFyIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsU25hcFZhbHVlO1xuICAgIHZhciBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZTtcbiAgICB2YXIgZXhpc3RpbmdSZXN1bHQgPSBtYXAuZ2V0KHNjcm9sbGVyKTtcbiAgICBpZiAoZXhpc3RpbmdSZXN1bHQgIT0gbnVsbCkge1xuICAgICAgY2FjaGVkU2Nyb2xsU25hcFZhbHVlID0gZXhpc3RpbmdSZXN1bHQuY2FjaGVkU2Nyb2xsU25hcFZhbHVlO1xuICAgICAgY2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlID0gZXhpc3RpbmdSZXN1bHQuY2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlO1xuICAgICAgc2Vjb25kYXJ5U2Nyb2xsZXIgPSBleGlzdGluZ1Jlc3VsdC5zZWNvbmRhcnlTY3JvbGxlcjtcbiAgICAgIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsU25hcFZhbHVlID0gZXhpc3RpbmdSZXN1bHQuc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxTbmFwVmFsdWU7XG4gICAgICBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSA9IGV4aXN0aW5nUmVzdWx0LnNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlO1xuICAgICAgZXhpc3RpbmdSZXN1bHQucmVsZWFzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZWRTY3JvbGxTbmFwVmFsdWUgPSBzY3JvbGxlci5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9PT0gXCJcIiA/IG51bGwgOiBzY3JvbGxlci5zdHlsZS5zY3JvbGxTbmFwVHlwZTtcbiAgICAgIGNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSA9IHBhcnNlU2Nyb2xsQmVoYXZpb3JGcm9tU3R5bGVBdHRyaWJ1dGUoc2Nyb2xsZXIpO1xuICAgICAgc2Vjb25kYXJ5U2Nyb2xsZXIgPSBzY3JvbGxlciA9PT0gc2Nyb2xsaW5nRWxlbWVudCAmJiBzY3JvbGxpbmdFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5ID8gZG9jdW1lbnQuYm9keSA6IHVuZGVmaW5lZDtcbiAgICAgIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsU25hcFZhbHVlID0gc2Vjb25kYXJ5U2Nyb2xsZXIgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHNlY29uZGFyeVNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlID09PSBcIlwiID8gbnVsbCA6IHNlY29uZGFyeVNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlO1xuICAgICAgc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWUgPSBzZWNvbmRhcnlTY3JvbGxlciA9PSBudWxsID8gdW5kZWZpbmVkIDogcGFyc2VTY3JvbGxCZWhhdmlvckZyb21TdHlsZUF0dHJpYnV0ZShzZWNvbmRhcnlTY3JvbGxlcik7XG4gICAgICB2Y
1XIgY2FjaGVkQ29tcHV0ZWRTY3JvbGxTbmFwVmFsdWUgPSBnZXRDb21wdXRlZFN0eWxlKHNjcm9sbGVyKS5nZXRQcm9wZXJ0eVZhbHVlKFwic2Nyb2xsLXNuYXAtdHlwZVwiKTtcbiAgICAgIHZhciBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZENvbXB1dGVkU2Nyb2xsU25hcFZhbHVlID0gc2Vjb25kYXJ5U2Nyb2xsZXIgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGdldENvbXB1dGVkU3R5bGUoc2Vjb25kYXJ5U2Nyb2xsZXIpLmdldFByb3BlcnR5VmFsdWUoXCJzY3JvbGwtc25hcC10eXBlXCIpO1xuICAgICAgLy8gSWYgaXQganVzdCBzbyBoYXBwZW5zIHRoYXQgdGhlcmUgYWN0dWFsbHkgaXNuJ3QgYW55IHNjcm9sbCBzbmFwcGluZyBnb2luZyBvbiwgdGhlcmUncyBubyBwb2ludCBpbiBwZXJmb3JtaW5nIGFueSBhZGRpdGlvbmFsIHdvcmsgaGVyZS5cbiAgICAgIGlmIChjYWNoZWRDb21wdXRlZFNjcm9sbFNuYXBWYWx1ZSA9PT0gXCJub25lXCIgJiYgc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRDb21wdXRlZFNjcm9sbFNuYXBWYWx1ZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgcmV0dXJuIE5PT1A7XG4gICAgICB9XG4gICAgfVxuICAgIHNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlID0gXCJub25lXCI7XG4gICAgaWYgKHNlY29uZGFyeVNjcm9sbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlY29uZGFyeVNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlID0gXCJub25lXCI7XG4gICAgfVxuICAgIGlmIChjYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXBwZW5kU2Nyb2xsQmVoYXZpb3JUb1N0eWxlQXR0cmlidXRlKHNjcm9sbGVyLCBjYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoc2Vjb25kYXJ5U2Nyb2xsZXIgIT09IHVuZGVmaW5lZCAmJiBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcHBlbmRTY3JvbGxCZWhhdmlvclRvU3R5bGVBdHRyaWJ1dGUoc2Vjb25kYXJ5U2Nyb2xsZXIsIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9XG4gICAgdmFyIGhhc1JlbGVhc2VkID0gZmFsc2U7XG4gICAgdmFyIGV2ZW50VGFyZ2V0ID0gc2Nyb2xsZXIgPT09IHNjcm9sbGluZ0VsZW1lbnQgPyB3aW5kb3cgOiBzY3JvbGxlcjtcbiAgICBmdW5jdGlvbiByZWxlYXNlKCkge1xuICAgICAgZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCByZXNldEhhbmRsZXIpO1xuICAgICAgaWYgKG1hcCAhPSBudWxsKSB7XG4gICAgICAgIG1hcFtcImRlbGV0ZVwiXShzY3JvbGxlcik7XG4gICAgICB9XG4gICAgICBoYXNSZWxlYXNlZCA9IHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2V0SGFuZGxlcigpIHtcbiAgICAgIHNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlID0gY2FjaGVkU2Nyb2xsU25hcFZhbHVlO1xuICAgICAgaWYgKHNlY29uZGFyeVNjcm9sbGVyICE9IG51bGwgJiYgc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxTbmFwVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZWNvbmRhcnlTY3JvbGxlci5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9IHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsU25hcFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFwcGVuZFNjcm9sbEJlaGF2aW9yVG9TdHlsZUF0dHJpYnV0ZShzY3JvbGxlciwgY2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWNvbmRhcnlTY3JvbGxlciAhPT0gdW5kZWZpbmVkICYmIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXBwZW5kU2Nyb2xsQmVoYXZpb3JUb1N0eWxlQXR0cmlidXRlKHNlY29uZGFyeVNjcm9sbGVyLCBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZWxlYXNlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChoYXNSZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgICBldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHJlc2V0SGFuZGxlcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgbWFwLnNldChzY3JvbGxlciwge1xuICAgICAgcmVsZWFzZTogcmVsZWFzZSxcbiAgICAgIGNhY2hlZFNjcm9sbFNuYXBWYWx1ZTogY2FjaGVkU2Nyb2xsU25hcFZhbHVlLFxuICAgICAgY2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlOiBjYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWUsXG4gICAgICBzZWNvbmRhcnlTY3JvbGxlcjogc2Vjb25kYXJ5U2Nyb2xsZXIsXG4gICAgICBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbFNuYXBWYWx1ZTogc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxTbmFwVmFsdWUsXG4gICAgICBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZTogc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWVcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzZXQ6IHJlc2V0XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgYSBzbW9vdGggc2Nyb2xsXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB2YXIgU0NST0xMX1RJTUUgPSAxNTAwMDtcbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgc21vb3RoIHJlcG9zaXRpb25pbmcgb2YgdGhlIHNjcm9sbFxuICAgKiBAcGFyYW0ge0lTbW9vdGhTY3JvbGxPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBzbW9vdGhTY3JvbGwob3B0aW9ucykge1xuICAgIHZhciBzdGFydFRpbWUgPSBvcHRpb25zLnN0YXJ0VGltZSxcbiAgICAgIHN0YXJ0WCA9IG9wdGlvbnMuc3RhcnRYLF
1xuICAgICAgc3RhcnRZID0gb3B0aW9ucy5zdGFydFksXG4gICAgICBlbmRYID0gb3B0aW9ucy5lbmRYLFxuICAgICAgZW5kWSA9IG9wdGlvbnMuZW5kWSxcbiAgICAgIG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kLFxuICAgICAgc2Nyb2xsZXIgPSBvcHRpb25zLnNjcm9sbGVyO1xuICAgIHZhciB0aW1lTGFwc2VkID0gMDtcbiAgICB2YXIgZGlzdGFuY2VYID0gZW5kWCAtIHN0YXJ0WDtcbiAgICB2YXIgZGlzdGFuY2VZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICB2YXIgc3BlZWQgPSBNYXRoLm1heChNYXRoLmFicyhkaXN0YW5jZVggLyAxMDAwICogU0NST0xMX1RJTUUpLCBNYXRoLmFicyhkaXN0YW5jZVkgLyAxMDAwICogU0NST0xMX1RJTUUpKTtcbiAgICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyBhbnkgc2Nyb2xsIHNuYXBwaW5nIHRoYXQgbWF5IGJlIGFjdGl2ZSBzaW5jZSBpdCBmaWdodHMgZm9yIGNvbnRyb2wgb3ZlciB0aGUgc2Nyb2xsZXIgd2l0aCB0aGlzIHBvbHlmaWxsXG4gICAgdmFyIHNjcm9sbFNuYXBGaXggPSBkaXNhYmxlU2Nyb2xsU25hcChzY3JvbGxlcik7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGUodGltZXN0YW1wKSB7XG4gICAgICB0aW1lTGFwc2VkICs9IHRpbWVzdGFtcCAtIHN0YXJ0VGltZTtcbiAgICAgIHZhciBwZXJjZW50YWdlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgc3BlZWQgPT09IDAgPyAwIDogdGltZUxhcHNlZCAvIHNwZWVkKSk7XG4gICAgICB2YXIgcG9zaXRpb25YID0gTWF0aC5mbG9vcihzdGFydFggKyBkaXN0YW5jZVggKiBlYXNlKHBlcmNlbnRhZ2UpKTtcbiAgICAgIHZhciBwb3NpdGlvblkgPSBNYXRoLmZsb29yKHN0YXJ0WSArIGRpc3RhbmNlWSAqIGVhc2UocGVyY2VudGFnZSkpO1xuICAgICAgbWV0aG9kKHBvc2l0aW9uWCwgcG9zaXRpb25ZKTtcbiAgICAgIGlmIChwb3NpdGlvblggIT09IGVuZFggfHwgcG9zaXRpb25ZICE9PSBlbmRZKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY3JvbGxTbmFwRml4ICE9IG51bGwpIHtcbiAgICAgICAgICBzY3JvbGxTbmFwRml4LnJlc2V0KCk7XG4gICAgICAgICAgc2Nyb2xsU25hcEZpeCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBIaWdoIFJlc29sdXRpb24gdGltZXN0YW1wIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgZmFsbGJhY2tzIHRvIERhdGUubm93KClcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG5vdygpIHtcbiAgICBpZiAoXCJwZXJmb3JtYW5jZVwiIGluIHdpbmRvdykgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIHJldHVybiBEYXRlLm5vdygpO1xuICB9XG4gIHZhciBFTEVNRU5UX09SSUdJTkFMX1NDUk9MTCA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gdW5kZWZpbmVkIDogRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsO1xuICB2YXIgV0lORE9XX09SSUdJTkFMX1NDUk9MTCA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gdW5kZWZpbmVkIDogd2luZG93LnNjcm9sbDtcbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0JZID0gVU5TVVBQT1JURURfRU5WSVJPTk1FTlQgPyB1bmRlZmluZWQgOiBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxCeTtcbiAgdmFyIFdJTkRPV19PUklHSU5BTF9TQ1JPTExfQlkgPSBVTlNVUFBPUlRFRF9FTlZJUk9OTUVOVCA/IHVuZGVmaW5lZCA6IHdpbmRvdy5zY3JvbGxCeTtcbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX1RPID0gVU5TVVBQT1JURURfRU5WSVJPTk1FTlQgPyB1bmRlZmluZWQgOiBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxUbztcbiAgdmFyIFdJTkRPV19PUklHSU5BTF9TQ1JPTExfVE8gPSBVTlNVUFBPUlRFRF9FTlZJUk9OTUVOVCA/IHVuZGVmaW5lZCA6IHdpbmRvdy5zY3JvbGxUbztcblxuICAvKipcbiAgICogQSBmYWxsYmFjayBpZiBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGwgaXMgbm90IGRlZmluZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICovXG4gIGZ1bmN0aW9uIGVsZW1lbnRQcm90b3R5cGVTY3JvbGxGYWxsYmFjayh4LCB5KSB7XG4gICAgdGhpcy5fX2FkanVzdGluZ1Njcm9sbFBvc2l0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnNjcm9sbExlZnQgPSB4O1xuICAgIHRoaXMuc2Nyb2xsVG9wID0geTtcbiAgICBkZWxldGUgdGhpcy5fX2FkanVzdGluZ1Njcm9sbFBvc2l0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBBIGZhbGxiYWNrIGlmIEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbFRvIGlzIG5vdCBkZWZpbmVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAqL1xuICBmdW5jdGlvbiBlbGVtZW50UHJvdG90eXBlU2Nyb2xsVG9GYWxsYmFjayh4LCB5KSB7XG4gICAgcmV0dXJuIGVsZW1lbnRQcm90b3R5cGVTY3JvbGxGYWxsYmFjay5jYWxsKHRoaXMsIHgsIHkpO1xuICB9XG4gIC8qKlxuICAgKiBBIGZhbGxiYWNrIGlmIEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbEJ5IGlzIG5vdCBkZWZpbmVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAqL1xuICBmdW5jdGlvbiBlbGVtZW50UHJvdG90eXBlU2Nyb2xsQnlGYWxsYmFjayh4LCB5KSB7XG4gICAgdGhpcy5fX2FkanVzdGluZ1Njcm9sbFBvc2l0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnNjcm9sbExlZnQgKz0geDtcbiAgICB0aGlzLnNjcm9sbFRvcCArPSB5O1xuICAgIGRlbGV0ZSB0aGlzLl9fYWRqdXN0aW5nU2Nyb2xsUG9zaXRpb247XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIG9yaWdpbmFsIG5vbi1wYXRjaGVkIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBnaXZlbiBraW5kXG4gICAqIEBwYXJhbSB7U2Nyb2xsTWV0aG9kTmFtZX0ga2luZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8V2luZG93fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0T3JpZ2luYWxTY3JvbGxNZXRob2RGb3JLaW5kKGtpbmQsIGVsZW1lbnQpIHtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgXCJzY3JvbGxcIjpcbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMICE9IG51bGwpIHtcbiAgICAgICAgICAgI
1HJldHVybiBFTEVNRU5UX09SSUdJTkFMX1NDUk9MTDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRQcm90b3R5cGVTY3JvbGxGYWxsYmFjaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFdJTkRPV19PUklHSU5BTF9TQ1JPTEw7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJzY3JvbGxCeVwiOlxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoRUxFTUVOVF9PUklHSU5BTF9TQ1JPTExfQlkgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0JZO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudFByb3RvdHlwZVNjcm9sbEJ5RmFsbGJhY2s7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBXSU5ET1dfT1JJR0lOQUxfU0NST0xMX0JZO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwic2Nyb2xsVG9cIjpcbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX1RPICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBFTEVNRU5UX09SSUdJTkFMX1NDUk9MTF9UTztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRQcm90b3R5cGVTY3JvbGxUb0ZhbGxiYWNrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gV0lORE9XX09SSUdJTkFMX1NDUk9MTF9UTztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBTbW9vdGggU2Nyb2xsIE9wdGlvbnMgdG8gdXNlIGZvciB0aGUgc3RlcCBmdW5jdGlvblxuICAgKiBAcGFyYW0ge0VsZW1lbnR8V2luZG93fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAqIEBwYXJhbSB7U2Nyb2xsTWV0aG9kTmFtZX0ga2luZFxuICAgKiBAcmV0dXJucyB7SVNtb290aFNjcm9sbE9wdGlvbnN9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTbW9vdGhTY3JvbGxPcHRpb25zKGVsZW1lbnQsIHgsIHksIGtpbmQpIHtcbiAgICB2YXIgc3RhcnRUaW1lID0gbm93KCk7XG4gICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAvLyBVc2Ugd2luZG93IGFzIHRoZSBzY3JvbGwgY29udGFpbmVyXG4gICAgICB2Y
1XIgc2Nyb2xsWF8xID0gd2luZG93LnNjcm9sbFgsXG4gICAgICAgIHBhZ2VYT2Zmc2V0XzEgPSB3aW5kb3cucGFnZVhPZmZzZXQsXG4gICAgICAgIHNjcm9sbFlfMSA9IHdpbmRvdy5zY3JvbGxZLFxuICAgICAgICBwYWdlWU9mZnNldF8xID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgdmFyIHN0YXJ0WCA9IHNjcm9sbFhfMSA9PSBudWxsIHx8IHNjcm9sbFhfMSA9PT0gMCA/IHBhZ2VYT2Zmc2V0XzEgOiBzY3JvbGxYXzE7XG4gICAgICB2YXIgc3RhcnRZID0gc2Nyb2xsWV8xID09IG51bGwgfHwgc2Nyb2xsWV8xID09PSAwID8gcGFnZVlPZmZzZXRfMSA6IHNjcm9sbFlfMTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLFxuICAgICAgICBzdGFydFg6IHN0YXJ0WCxcbiAgICAgICAgc3RhcnRZOiBzdGFydFksXG4gICAgICAgIGVuZFg6IE1hdGguZmxvb3Ioa2luZCA9PT0gXCJzY3JvbGxCeVwiID8gc3RhcnRYICsgeCA6IHgpLFxuICAgICAgICBlbmRZOiBNYXRoLmZsb29yKGtpbmQgPT09IFwic2Nyb2xsQnlcIiA/IHN0YXJ0WSArIHkgOiB5KSxcbiAgICAgICAgbWV0aG9kOiBnZXRPcmlnaW5hbFNjcm9sbE1ldGhvZEZvcktpbmQoXCJzY3JvbGxUb1wiLCB3aW5kb3cpLmJpbmQod2luZG93KSxcbiAgICAgICAgc2Nyb2xsZXI6IGdldFNjcm9sbGluZ0VsZW1lbnQoKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNjcm9sbExlZnQgPSBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgdmFyIHN0YXJ0WCA9IHNjcm9sbExlZnQ7XG4gICAgICB2Y
1XIgc3RhcnRZID0gc2Nyb2xsVG9wO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgICAgIHN0YXJ0WDogc3RhcnRYLFxuICAgICAgICBzdGFydFk6IHN0YXJ0WSxcbiAgICAgICAgZW5kWDogTWF0aC5mbG9vcihraW5kID09PSBcInNjcm9sbEJ5XCIgPyBzdGFydFggKyB4IDogeCksXG4gICAgICAgIGVuZFk6IE1hdGguZmxvb3Ioa2luZCA9PT0gXCJzY3JvbGxCeVwiID8gc3RhcnRZICsgeSA6IHkpLFxuICAgICAgICBtZXRob2Q6IGdldE9yaWdpbmFsU2Nyb2xsTWV0aG9kRm9yS2luZChcInNjcm9sbFRvXCIsIGVsZW1lbnQpLmJpbmQoZWxlbWVudCksXG4gICAgICAgIHNjcm9sbGVyOiBlbGVtZW50XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIG51bWVyaWNcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuc3VyZU51bWVyaWModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIDA7ZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgc29tZSBTY3JvbGxUb09wdGlvbnNcbiAgICogQHBhcmFtIHtudW1iZXIgfCBTY3JvbGxUb09wdGlvbnN9IHZhbHVlXG4gICAqIEByZXR1cm4ge3ZhbHVlIGlzIFNjcm9sbFRvT3B0aW9uc31cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsVG9PcHRpb25zKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgX3R5cGVvZih2YWx1ZSkgPT09IFwib2JqZWN0XCI7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIHNjcm9sbCBtZXRob2RcbiAgICogQHBhcmFtIHtFbGVtZW50fFdpbmRvd30gZWxlbWVudFxuICAgKiBAcGFyYW0ge1Njcm9sbE1ldGhvZE5hbWV9IGtpbmRcbiAgICogQHBhcmFtIHtudW1iZXIgfCBTY3JvbGxUb09wdGlvbnN9IG9wdGlvbnNPclhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVNjcm9sbE1ldGhvZChlbGVtZW50LCBraW5kLCBvcHRpb25zT3JYLCB5KSB7XG4gICAgb25TY3JvbGxXaXRoT3B0aW9ucyhnZXRTY3JvbGxUb09wdGlvbnNXaXRoVmFsaWRhdGlvbihvcHRpb25zT3JYLCB5KSwgZWxlbWVudCwga2luZCk7XG4gIH1cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiBhICdTY3JvbGxUb09wdGlvbnMnIGRpY3QgaXMgcHJvdmlkZWQgdG8gJ3Njcm9sbCgpJyBhcyB0aGUgZmlyc3QgYXJndW1lbnRcbiAgICogQHBhcmFtIHtTY3JvbGxUb09wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtFbGVtZW50fFdpbmRvd30gZWxlbWVudFxuICAgKiBAcGFyYW0ge1Njcm9sbE1ldGhvZE5hbWV9IGtpbmRcbiAgICovXG4gIGZ1bmN0aW9uIG9uU2Nyb2xsV2l0aE9wdGlvbnMob3B0aW9ucywgZWxlbWVudCwga2luZCkge1xuICAgIHZhciBiZWhhdmlvciA9IGdldFNjcm9sbEJlaGF2aW9yKGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIC8vIElmIHRoZSBiZWhhdmlvciBpcyAnYXV0bycgYXBwbHkgaW5zdGFudGFuZW91cyBzY3JvbGxpbmdcbiAgICBpZiAoYmVoYXZpb3IgPT0gbnVsbCB8fCBiZWhhdmlvciA9PT0gXCJhdXRvXCIpIHtcbiAgICAgIGdldE9yaWdpbmFsU2Nyb2xsTWV0aG9kRm9yS2luZChraW5kLCBlbGVtZW50KS5jYWxsKGVsZW1lbnQsIG9wdGlvbnMubGVmdCwgb3B0aW9ucy50b3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbW9vdGhTY3JvbGwoZ2V0U21vb3RoU2Nyb2xsT3B0aW9ucyhlbGVtZW50LCBvcHRpb25zLmxlZnQsIG9wdGlvbnMudG9wLCBraW5kKSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRoZSBnaXZlbiBzY3JvbGwgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtudW1iZXI/fSB4XG4gICAqIEBwYXJhbSB7bnVtYmVyP30geVxuICAgKiBAcmV0dXJuIHtSZXF1aXJlZDxQaWNrPFNjcm9sbFRvT3B0aW9ucywgXCJ0b3BcIiB8IFwibGVmdFwiPj59XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JvbGxDb29yZGluYXRlcyh4LCB5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGVuc3VyZU51bWVyaWMoeCksXG4gICAgICB0b3A6IGVuc3VyZU51bWVyaWMoeSlcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIFNjcm9sbFRvT3B0aW9ucyBiYXNlZCBvbiB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBXaWxsIHRocm93IGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICogQHBhcmFtIHtudW1iZXIgfCBTY3JvbGxUb09wdGlvbnN9IG9wdGlvbnNPclhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICogQHJldHVybiB7UmVxdWlyZWQ8U2Nyb2xsVG9PcHRpb25zPn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFNjcm9sbFRvT3B0aW9uc1dpdGhWYWxpZGF0aW9uKG9wdGlvbnNPclgsIHkpIHtcbiAgICAvLyBJZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBnaXZlbiwgYW5kIGl0IGlzbid0IGFuIG9wdGlvbnMgb2JqZWN0LCB0aHJvdyBhIFR5cGVFcnJvclxuICAgIGlmICh5ID09PSB1bmRlZmluZWQgJiYgIWlzU2Nyb2xsVG9PcHRpb25zKG9wdGlvbnNPclgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ3Njcm9sbCcgb24gJ0VsZW1lbnQnOiBwYXJhbWV0ZXIgMSAoJ29wdGlvbnMnKSBpcyBub3QgYW4gb2JqZWN0LlwiKTtcbiAgICB9XG4gICAgLy8gU2Nyb2xsIGJhc2VkIG9uIHRoZSBwcmltaXRpdmUgdmFsdWVzIGdpdmVuIGFzIGFyZ3VtZW50c1xuICAgIGlmICghaXNTY3JvbGxUb09wdGlvbnMob3B0aW9uc09yWCkpIHtcbiAgICAgIHJldHVybiBfYXNzaWduKF9hc3NpZ24oe30sIG5vcm1hbGl6ZVNjcm9sbENvb3JkaW5hdGVzKG9wdGlvbnNPclgsIHkpKSwge1xuICAgICAgICBiZWhhdmlvcjogXCJhdXRvXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTY3JvbGwgYmFzZWQgb24gdGhlIHJlY2VpdmVkIG9wdGlvbnMgb2JqZWN0XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gX2Fzc2lnbihfYXNzaWduKHt9LCBub3JtYWxpem
1VTY3JvbGxDb29yZGluYXRlcyhvcHRpb25zT3JYLmxlZnQsIG9wdGlvbnNPclgudG9wKSksIHtcbiAgICAgICAgYmVoYXZpb3I6IG9wdGlvbnNPclguYmVoYXZpb3IgPT0gbnVsbCA/IFwiYXV0b1wiIDogb3B0aW9uc09yWC5iZWhhdmlvclxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgdGhlICdzY3JvbGwnIG1ldGhvZCBvbiB0aGUgRWxlbWVudCBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoRWxlbWVudFNjcm9sbCgpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGwgPSBmdW5jdGlvbiAob3B0aW9uc09yWCwgeSkge1xuICAgICAgaGFuZGxlU2Nyb2xsTWV0aG9kKHRoaXMsIFwic2Nyb2xsXCIsIG9wdGlvbnNPclgsIHkpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgJ3Njcm9sbEJ5JyBtZXRob2Qgb24gdGhlIEVsZW1lbnQgcHJvdG90eXBlXG4gICAqL1xuICBmdW5jdGlvbiBwYXRjaEVsZW1lbnRTY3JvbGxCeSgpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxCeSA9IGZ1bmN0aW9uIChvcHRpb25zT3JYLCB5KSB7XG4gICAgICBoYW5kbGVTY3JvbGxNZXRob2QodGhpcywgXCJzY3JvbGxCeVwiLCBvcHRpb25zT3JYLCB5KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgdGhlICdzY3JvbGxUbycgbWV0aG9kIG9uIHRoZSBFbGVtZW50IHByb3RvdHlwZVxuICAgKi9cbiAgZnVuY3Rpb24gcGF0Y2hFbGVtZW50U2Nyb2xsVG8oKSB7XG4gICAgRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsVG8gPSBmdW5jdGlvbiAob3B0aW9uc09yWCwgeSkge1xuICAgICAgaGFuZGxlU2Nyb2xsTWV0aG9kKHRoaXMsIFwic2Nyb2xsVG9cIiwgb3B0aW9uc09yWCwgeSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSAnc2Nyb2xsJyBtZXRob2Qgb24gdGhlIFdpbmRvdyBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoV2luZG93U2Nyb2xsKCkge1xuICAgIHdpbmRvdy5zY3JvbGwgPSBmdW5jdGlvbiAob3B0aW9uc09yWCwgeSkge1xuICAgICAgaGFuZGxlU2Nyb2xsTWV0aG9kKHRoaXMsIFwic2Nyb2xsXCIsIG9wdGlvbnNPclgsIHkpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgJ3Njcm9sbEJ5JyBtZXRob2Qgb24gdGhlIFdpbmRvdyBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoV2luZG93U2Nyb2xsQnkoKSB7XG4gICAgd2luZG93LnNjcm9sbEJ5ID0gZnVuY3Rpb24gKG9wdGlvbnNPclgsIHkpIHtcbiAgICAgIGhhbmRsZVNjcm9sbE1ldGhvZCh0aGlzLCBcInNjcm9sbEJ5XCIsIG9wdGlvbnNPclgsIHkpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgJ3Njcm9sbFRvJyBtZXRob2Qgb24gdGhlIFdpbmRvdyBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoV2luZG93U2Nyb2xsVG8oKSB7XG4gICAgd2luZG93LnNjcm9sbFRvID0gZnVuY3Rpb24gKG9wdGlvbnNPclgsIHkpIHtcbiAgICAgIGhhbmRsZVNjcm9sbE1ldGhvZCh0aGlzLCBcInNjcm9sbFRvXCIsIG9wdGlvbnNPclgsIHkpO1xuICAgIH07XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbiAgLyoqXG4gICAqIEdldHMgdGhlIHBhcmVudCBvZiBhbiBlbGVtZW50LCB0YWtpbmcgaW50byBhY2NvdW50IERvY3VtZW50RnJhZ21lbnRzLCBTaGFkb3dSb290cywgYXMgd2VsbCBhcyB0aGUgcm9vdCBjb250ZXh0ICh3aW5kb3cpXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGN1cnJlbnRFbGVtZW50XG4gICAqIEByZXR1cm5zIHtFdmVudFRhcmdldCB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXJlbnQoY3VycmVudEVsZW1lbnQpIHtcbiAgICBpZiAoXCJub2RlVHlwZVwiIGluIGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgaWYgKFwiU2hhZG93Um9vdFwiIGluIHdpbmRvdyAmJiBjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQuaG9zdDtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRFbGVtZW50ID09PSBkb2N1bWVudCkge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgTm9kZSkgcmV0dXJuIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvdmVyZmxvdyBwcm9wZXJ0eSByZXByZXNlbnRzIGEgc2Nyb2xsYWJsZSBvdmVyZmxvdyB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IG92ZXJmbG93XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5PdmVyZmxvdyhvdmVyZmxvdykge1xuICAgIHJldHVybiBvdmVyZmxvdyAhPT0gXCJ2aXNpYmxlXCIgJiYgb3ZlcmZsb3cgIT09IFwiY2xpcFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsYWJsZShlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuY2xpZW50SGVpZ2h0IDwgZWxlbWVudC5zY3JvbGxIZWlnaHQgfHwgZWxlbWVudC5jbGllbnRXaWR0aCA8IGVsZW1lbnQuc2Nyb2xsV2lkdGgpIHtcbiAgICAgIHZhciBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gICAgICByZXR1cm4gY2FuT3ZlcmZsb3coc3R5bGUub3ZlcmZsb3dZKSB8fCBjYW5PdmVyZmxvdyhzdHlsZS5vdmVyZmxvd1gpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBuZWFyZXN0IGFuY2VzdG9yIG9mIGFuIGVsZW1lbnQgdGhhdCBjYW4gc2Nyb2xsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFdpbmRvdz99XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kTmVhcmVzdEFuY2VzdG9yc1dpdGhTY3JvbGxCZWhhdmlvcih0YXJnZXQpIHtcbiAgICB2YXIgY3VycmVudEVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBnZXRTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIHZhciBiZWhhdmlvciA9IGdldFNjcm9sbEJlaGF2aW9yKGN1cnJlbnRFbGVtZW50KTtcbiAgICAgIGlmIChiZWhhdmlvciAhPSBudWxsICYmIChjdXJyZW50RWxlbWVudCA9PT0gc2Nyb2xsaW5nRWxlbWVudCB8fCBpc1Njcm9sbGFibGUoY3VycmVudEVsZW1lbnQpKSkge1xuICAgICAgICByZXR1cm4gW2N1cnJlbnRFbGVtZW50LCBiZWhhdmlvcl07XG4gICAgICB9XG4gICAgICB2Y
1XIgcGFyZW50XzEgPSBnZXRQYXJlbnQoY3VycmVudEVsZW1lbnQpO1xuICAgICAgY3VycmVudEVsZW1lbnQgPSBwYXJlbnRfMTtcbiAgICB9XG4gICAgLy8gTm8gc3VjaCBlbGVtZW50IGNvdWxkIGJlIGZvdW5kLiBTdGFydCBvdmVyLCBidXQgdGhpcyB0aW1lIGZpbmQgdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBjYW4gc2ltcGx5IHNjcm9sbFxuICAgIGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAhPSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQgPT09IHNjcm9sbGluZ0VsZW1lbnQgfHwgaXNTY3JvbGxhYmxlKGN1cnJlbnRFbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gW2N1cnJlbnRFbGVtZW50LCBcImF1dG9cIl07XG4gICAgICB9XG4gICAgICB2YXIgcGFyZW50XzIgPSBnZXRQYXJlbnQoY3VycmVudEVsZW1lbnQpO1xuICAgICAgY3VycmVudEVsZW1lbnQgPSBwYXJlbnRfMjtcbiAgICB9XG4gICAgLy8gRGVmYXVsdCB0byB0aGUgc2Nyb2xsaW5nIGVsZW1lbnRcbiAgICByZXR1cm4gW3Njcm9sbGluZ0VsZW1lbnQsIFwiYXV0b1wiXTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuICAvKipcbiAgICogRmluZHMgdGhlIG5lYXJlc3Qgcm9vdCBmcm9tIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge0RvY3VtZW50fFNoYWRvd1Jvb3R9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kTmVhcmVzdFJvb3QodGFyZ2V0KSB7XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAhPSBudWxsKSB7XG4gICAgICBpZiAoXCJTaGFkb3dSb290XCIgaW4gd2luZG93ICYmIGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gQXNzdW1lIHRoaXMgaXMgYSBTaGFkb3dSb290XG4gICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJlbnRfMSA9IGdldFBhcmVudChjdXJyZW50RWxlbWVudCk7XG4gICAgICBpZiAocGFyZW50XzEgPT09IGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRFbGVtZW50ID0gcGFyZW50XzE7XG4gICAgfVxuICAgIHJldHVybiBkb2N1bWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBvcmlnaW4gb2YgdGhlIGdpdmVuIExvY2F0aW9uIG9yIEhUTUxBbmNob3JFbGVtZW50IGlmIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZSwgYW5kIG90aGVyd2lzZSBzaGltcyBpdC4gKGl0J3MgYSBvbmUtbGluZXIpXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRMb2NhdGlvbk9yaWdpbihsb2NhdGlvbkxpa2UpIHtcbiAgICBpZiAobG9jYXRpb25MaWtlID09PSB2b2lkIDApIHtcbiAgICAgIGxvY2F0aW9uTGlrZSA9IGxvY2F0aW9uO1xuICAgIH1cbiAgICBpZiAoXCJvcmlnaW5cIiBpbiBsb2NhdGlvbkxpa2UgJiYgbG9jYXRpb25MaWtlLm9yaWdpbiAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gbG9jYXRpb25MaWtlLm9yaWdpbjtcbiAgICB9XG4gICAgdmFyIHBvcnQgPSBsb2NhdGlvbkxpa2UucG9ydCAhPSBudWxsICYmIGxvY2F0aW9uTGlrZS5wb3J0Lmxlbmd0aCA+IDAgPyBcIjpcIiArIGxvY2F0aW9uTGlrZS5wb3J0IDogXCJcIjtcbiAgICBpZiAobG9jYXRpb25MaWtlLnByb3RvY29sID09PSBcImh0dHA6XCIgJiYgcG9ydCA9PT0gXCI6ODBcIikge1xuICAgICAgcG9ydCA9IFwiXCI7XG4gICAgfSBlbHNlIGlmIChsb2NhdGlvbkxpa2UucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIgJiYgcG9ydCA9PT0gXCI6NDQzXCIpIHtcbiAgICAgIHBvcnQgPSBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYXRpb25MaWtlLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb25MaWtlLmhvc3RuYW1lICsgcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIFJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgaWQncyBvZiB0aGUgZm9ybSBcIiNbZGlnaXRdXCJcbiAgICogQHR5cGUge1JlZ0V4cH1cbiAgICovXG4gIHZhciBJRF9XSVRIX0xFQURJTkdfRElHSVRfUkVHRVhQID0gL14jXFxkLztcbiAgLyoqXG4gICAqIENhdGNoZXMgYW5jaG9yIG5hdmlnYXRpb24gdG8gSURzIHdpdGhpbiB0aGUgc2FtZSByb290IGFuZCBlbnN1cmVzIHRoYXQgdGhleSBjYW4gYmUgc21vb3RoLXNjcm9sbGVkXG4gICAqIGlmIHRoZSBzY3JvbGwgYmVoYXZpb3IgaXMgc21vb3RoIGluIHRoZSBmaXJzdCByb290ZXIgd2l0aGluIHRoYXQgY29udGV4dFxuICAgKi9cbiAgZnVuY3Rpb24gY2F0Y2hOYXZpZ2F0aW9uKCkge1xuICAgIC8vIExpc3RlbiBmb3IgJ2NsaWNrJyBldmVudHMgZ2xvYmFsbHlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAvLyBPbmx5IHdvcmsgd2l0aCB0cnVzdGVkIGV2ZW50cyBvbiBIVE1MQW5jaG9yRWxlbWVudHNcbiAgICAgIGlmICghZS5pc1RydXN0ZWQgfHwgIShlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgdmFyIF9hID0gZS50YXJnZXQsXG4gICAgICAgIHBhdGhuYW1lID0gX2EucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaCA9IF9hLnNlYXJjaCxcbiAgICAgICAgaGFzaCA9IF9hLmhhc2g7XG4gICAgICB2Y
1XIgcG9pbnRzVG9DdXJyZW50UGFnZSA9IGdldExvY2F0aW9uT3JpZ2luKGUudGFyZ2V0KSA9PT0gZ2V0TG9jYXRpb25PcmlnaW4obG9jYXRpb24pICYmIHBhdGhuYW1lID09PSBsb2NhdGlvbi5wYXRobmFtZSAmJiBzZWFyY2ggPT09IGxvY2F0aW9uLnNlYXJjaDtcbiAgICAgIC8vIE9ubHkgd29yayB3aXRoIEhUTUxBbmNob3JFbGVtZW50cyB0aGF0IG5hdmlnYXRlcyB0byBhIHNwZWNpZmljIElEIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIGlmICghcG9pbnRzVG9DdXJyZW50UGFnZSB8fCBoYXNoID09IG51bGwgfHwgaGFzaC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmQgdGhlIG5lYXJlc3Qgcm9vdCwgd2hldGhlciBpdCBiZSBhIFNoYWRvd1Jvb3Qgb3IgdGhlIGRvY3VtZW50IGl0c2VsZlxuICAgICAgdmFyIHJvb3QgPSBmaW5kTmVhcmVzdFJvb3QoZS50YXJnZXQpO1xuICAgICAgLy8gQXR0ZW1wdCB0byBtYXRjaCB0aGUgc2VsZWN0b3IgZnJvbSB0aGF0IHJvb3QuIHF1ZXJ5U2VsZWN0b3InIGRvZXNuJ3Qgc3VwcG9ydCBJRHMgdGhhdCBzdGFydCB3aXRoIGEgZGlnaXQsIHNvIHdvcmsgYXJvdW5kIHRoYXQgbGltaXRhdGlvblxuICAgICAgdmFyIGVsZW1lbnRNYXRjaCA9IGhhc2gubWF0Y2goSURfV0lUSF9MRUFESU5HX0RJR0lUX1JFR0VYUCkgIT0gbnVsbCA/IHJvb3QuZ2V0RWxlbWVudEJ5SWQoaGFzaC5zbGljZSgxKSkgOiByb290LnF1ZXJ5U2VsZWN0b3IoaGFzaCk7XG4gICAgICAvLyBJZiBubyBzZWxlY3RvciBjb3VsZCBiZSBmb3VuZCwgZG9uJ3QgcHJvY2VlZFxuICAgICAgaWYgKGVsZW1lbnRNYXRjaCA9PSBudWxsKSByZXR1cm47XG4gICAgICAvLyBGaW5kIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgY2FuIGJlIHNjcm9sbGVkXG4gICAgICB2Y
1XIgX2IgPSBfX3JlYWQoZmluZE5lYXJlc3RBbmNlc3RvcnNXaXRoU2Nyb2xsQmVoYXZpb3IoZWxlbWVudE1hdGNoKSwgMiksXG4gICAgICAgIGJlaGF2aW9yID0gX2JbMV07XG4gICAgICAvLyBJZiB0aGUgYmVoYXZpb3IgaXNuJ3Qgc21vb3RoLCBkb24ndCBwcm9jZWVkXG4gICAgICBpZiAoYmVoYXZpb3IgIT09IFwic21vb3RoXCIpIHJldHVybjtcbiAgICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBOb3csIHNjcm9sbCB0byB0aGUgZWxlbWVudCB3aXRoIHRoYXQgSURcbiAgICAgIGVsZW1lbnRNYXRjaC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgIGJlaGF2aW9yOiBiZWhhdmlvclxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0lOVE9fVklFVyA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gdW5kZWZpbmVkIDogRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsSW50b1ZpZXc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWpvcml0eSBvZiB0aGlzIGZpbGUgaXMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3N0aXBzYW4vY29tcHV0ZS1zY3JvbGwtaW50by12aWV3IChNSVQgbGljZW5zZSksXG4gICAqIGJ1dCBoYXMgYmVlbiByZXdyaXR0ZW4gdG8gYWNjZXB0IGEgc2Nyb2xsZXIgYXMgYW4gYXJndW1lbnQuXG4gICAqL1xuICAvKipcbiAgICogRmluZCBvdXQgd2hpY2ggZWRnZSB0byBhbGlnbiBhZ2FpbnN0IHdoZW4gbG9naWNhbCBzY3JvbGwgcG9zaXRpb24gaXMgXCJuZWFyZXN0XCJcbiAgICogSW50ZXJlc3RpbmcgZmFjdDogXCJuZWFyZXN0XCIgd29ya3Mgc2ltaWxhcmx5IHRvIFwiaWYtbmVlZGVkXCIsIGlmIHRoZSBlbGVtZW50IGlzIGZ1bGx5IHZpc2libGUgaXQgd2lsbCBub3Qgc2Nyb2xsIGl0XG4gICAqXG4gICAqIExlZ2VuZHM6XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilI8g4pSBIOKUgSDilIEg4pSTXG4gICAqIOKUgiB0YXJnZXQg4pSCICAgZnJhbWVcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUlyDilIEg4pSBIOKUgSDilJtcbiAgICovXG4gIGZ1bmN0aW9uIGFsaWduTmVhcmVzdChzY3JvbGxpbmdFZGdlU3RhcnQsIHNjcm9sbGluZ0VkZ2VFbmQsIHNjcm9sbGluZ1NpemUsIHNjcm9sbGluZ0JvcmRlclN0YXJ0LCBzY3JvbGxpbmdCb3JkZXJFbmQsIGVsZW1lbnRFZGdlU3RhcnQsIGVsZW1lbnRFZGdlRW5kLCBlbGVtZW50U2l6ZSkge1xuICAgIC8qKlxuICAgICAqIElmIGVsZW1lbnQgZWRnZSBBIGFuZCBlbGVtZW50IGVkZ2UgQiBhcmUgYm90aCBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBBIGFuZCBzY3JvbGxpbmcgYm94IGVkZ2UgQlxuICAgICAqXG4gICAgICogICAgICAgICAg4pSM4pSA4pSA4pSQXG4gICAgICogICAgICAgIOKUj+KUgeKUguKUgeKUgeKUguKUgeKUk1xuICAgICAqICAgICAgICAgIOKUgiAg4pSCXG4gICAgICogICAgICAgIOKUgyDilIIgIOKUgiDilIMgICAgICAgIGRvIG5vdGhpbmdcbiAgICAgKiAgICAgICAgICDilIIgIOKUglxuICAgICAqICAgICAgICDilJfilIHilILilIHilIHilILilIHilJtcbiAgICAgKiAgICAgICAgICDilJTilIDilIDilJhcbiAgICAgKlxuICAgICAqICBJZiBlbGVtZW50IGVkZ2UgQyBhbmQgZWxlbWVudCBlZGdlIEQgYXJlIGJvdGggb3V0c2lkZSBzY3JvbGxpbmcgYm94IGVkZ2UgQyBhbmQgc2Nyb2xsaW5nIGJveCBlZGdlIERcbiAgICAgKlxuICAgICAqICAgIOKUjyDilIEg4pSBIOKUgSDilIEg4pSTXG4gICAgICogICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICAgKiAgIOKUguKUgyAgICAgICAgIOKUg+KUgiAgICAgICAgZG8gbm90aGluZ1xuICAgICAqICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAgICogICAg4pSXIOKUgSDilIEg4pSBIOKUgSDilJtcbiAgICAgKi9cbiAgICBpZiAoZWxlbWVudEVkZ2VTdGFydCA8IHNjcm9sbGluZ0VkZ2VTdGFydCAmJiBlbGVtZW50RWRnZUVuZCA+IHNjcm9sbGluZ0VkZ2VFbmQgfHwgZWxlbWVudEVkZ2VTdGFydCA+IHNjcm9sbGluZ0VkZ2VTdGFydCAmJiBlbGVtZW50RWRnZUVuZCA8IHNjcm9sbGluZ0VkZ2VFbmQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgQSBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBBIGFuZCBlbGVtZW50IGhlaWdodCBpcyBsZXNzIHRoYW4gc2Nyb2xsaW5nIGJveCBoZWlnaHRcbiAgICAgKlxuICAgICAqICAgICAgICAgIOKUjOKUgOKUgOKUkFxuICAgICAqICAgICAgICDilI/ilIHilILilIHilIHilILilIHilJMgICAgICAgICDilI/ilIHilIzilIHilIHilJDilIHilJNcbiAgICAgKiAgICAgICAgICDilJTilIDilIDilJggICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgZnJvbSAg4pSDICAgICAg4pSDICAgICB0byAg4pSDIOKUlOKUgOKUgOKUmCDilINcbiAgICAgKlxuICAgICAqICAgICAgICDilJfilIEg4pSB4pSBIOKUgeKUmyAgICAgICAgIOKUl+KUgSDilIHilIEg4pSB4pSbXG4gICAgICpcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgQiBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBCIGFuZCBlbGVtZW50IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gc2Nyb2xsaW5nIGJveCBoZWlnaHRcbiAgICAgKlxuICAgICAqICAgICAgICDilI/ilIEg4pSB4pSBIOKUgeKUkyAgICAgICAgIOKUj+KUgeKUjOKUgeKUgeKUkOKUgeKUk1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgZnJvbSAg4pSDIOKUjOKUgOKUgOKUkCDilIMgICAgIHRvICDilIMg4pSCICDilIIg4pSDXG4gICAgICogICAgICAgICAg4pSCICDilIIgICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgICAgICAg4pSX4pSB4pSC4pSB4pSB4pSC4pSB4pSbICAgICAgICAg4pSX4pSB4pSC4pSB4pSB4pSC4pSB4pSbXG4gICAgICogICAgICAgICAg4pSCICDilIIgICAgICAgICAgICAg4pSU4pSA4pSA4pSYXG4gICAgICogICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgICAgICAgICDilJTilIDilIDilJhcbiAgICAgKlxuICAgICAqIElmIGVsZW1lbnQgZWRnZSBDIGlzIG91dHNpZGUgc2Nyb2xsaW5nIGJveCBlZGdlIEMgYW5kIGVsZW1lbnQgd2lkdGggaXMgbGVzcyB0aGFuIHNjcm9sbGluZyBib3ggd2lkdGhcbiAgICAgKlxuICAgICAqICAgICAgIGZyb20gICAgICAgICAgICAgICAgI
1HRvXG4gICAgICogICAg4pSPIOKUgSDilIEg4pSBIOKUgSDilJMgICAgICAgICDilI8g4pSBIOKUgSDilIEg4pSBIOKUk1xuICAgICAqICDilIzilIDilIDilIDilJAgICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkFxuICAgICAqICDilIIg4pSDIOKUgiAgICAgICDilIMgICAgICAgICDilIMgICDilIIgICAgIOKUg1xuICAgICAqICDilJTilIDilIDilIDilJggICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUmFxuICAgICAqICAgIOKUlyDilIEg4pSBIOKUgSDilIEg4pSbICAgICAgICAg4pSXIOKUgSDilIEg4pSBIOKUgSDilJtcbiAgICAgKlxuICAgICAqIElmIGVsZW1lbnQgZWRnZSBEIGlzIG91dHNpZGUgc2Nyb2xsaW5nIGJveCBlZGdlIEQgYW5kIGVsZW1lbnQgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHNjcm9sbGluZyBib3ggd2lkdGhcbiAgICAgKlxuICAgICAqICAgICAgIGZyb20gICAgICAgICAgICAgICAgIHRvXG4gICAgICogICAg4pSPIOKUgSDilIEg4pSBIOKUgSDilJMgICAgICAgICDilI8g4pSBIOKUgSDilIEg4pSBIOKUk1xuICAgICAqICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICAgKiAgICDilIMgICDilIIgICAgIOKUgyAgICAg4pSCICAg4pSDICAgICAgICAg4pSDIOKUglxuICAgICAqICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICAgKiAgICDilJcg4pSBIOKUgSDilIEg4pSBIOKUmyAgICAgICAgIOKUlyDilIEg4pSBIOKUgSDilIEg4pSbXG4gICAgICovXG4gICAgaWYgKGVsZW1lbnRFZGdlU3RhcnQgPD0gc2Nyb2xsaW5nRWRnZVN0YXJ0ICYmIGVsZW1lbnRTaXplIDw9IHNjcm9sbGluZ1NpemUgfHwgZWxlbWVudEVkZ2VFbmQgPj0gc2Nyb2xsaW5nRWRnZUVuZCAmJiBlbGVtZW50U2l6ZSA+PSBzY3JvbGxpbmdTaXplKSB7XG4gICAgICByZXR1cm4gZWxlbWVudEVkZ2VTdGFydCAtIHNjcm9sbGluZ0VkZ2VTdGFydCAtIHNjcm9sbGluZ0JvcmRlclN0YXJ0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgQiBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBCIGFuZCBlbGVtZW50IGhlaWdodCBpcyBsZXNzIHRoYW4gc2Nyb2xsaW5nIGJveCBoZWlnaHRcbiAgICAgKlxuICAgICAqICAgICAgICDilI/ilIEg4pSB4pSBIOKUgeKUkyAgICAgICAgIOKUj+KUgSDilIHilIEg4pSB4pSTXG4gICAgICpcbiAgICAgKiAgZnJvbSAg4pSDICAgICAg4pSDICAgICB0byAg4pSDIOKUjOKUgOKUgOKUkCDilINcbiAgICAgKiAgICAgICAgICDilIzilIDilIDilJAgICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgICAgICAg4pSX4pSB4pSC4pSB4pSB4pSC4pSB4pSbICAgICAgICAg4pSX4pSB4pSU4pSB4pSB4pSY4pSB4pSbXG4gICAgICogICAgICAgICAg4pSU4pSA4pSA4pSYXG4gICAgICpcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgQSBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBBIGFuZCBlbGVtZW50IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gc2Nyb2xsaW5nIGJveCBoZWlnaHRcbiAgICAgKlxuICAgICAqICAgICAgICAgIOKUjOKUgOKUgOKUkFxuICAgICAqICAgICAgICAgIOKUgiAg4pSCXG4gICAgICogICAgICAgICAg4pSCICDilIIgICAgICAgICAgICAg4pSM4pSA4pSA4pSQXG4gICAgICogICAgICAgIOKUj+KUgeKUguKUgeKUgeKUguKUgeKUkyAgICAgICAgIOKUj+KUgeKUguKUgeKUgeKUguKUgeKUk1xuICAgICAqICAgICAgICAgIOKUgiAg4pSCICAgICAgICAgICAgIOKUgiAg4pSCXG4gICAgICogIGZyb20gIOKUgyDilJTilIDilIDilJgg4pSDICAgICB0byAg4pSDIOKUgiAg4pSCIOKUg1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgICAgICAg4pSX4pSBIOKUgeKUgSDilIHilJsgICAgICAgICDilJfilIHilJTilIHilIHilJjilIHilJtcbiAgICAgKlxuICAgICAqIElmIGVsZW1lbnQgZWRnZSBDIGlzIG91dHNpZGUgc2Nyb2xsaW5nIGJveCBlZGdlIEMgYW5kIGVsZW1lbnQgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHNjcm9sbGluZyBib3ggd2lkdGhcbiAgICAgKlxuICAgICAqICAgICAgICAgICBmcm9tICAgICAgICAgICAgICAgICB0b1xuICAgICAqICAgICAgICDilI8g4pSBIOKUgSDilIEg4pSBIOKUkyAgICAgICAgIOKUjyDilIEg4pSBIOKUgSDilIEg4pSTXG4gICAgICogIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAgICogIOKUgiAgICAg4pSDICAgICDilIIgICDilIMgICAgICAg4pSCIOKUgyAgICAgICAgIOKUg1xuICAgICAqICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgICAqICAgICAgICDilJcg4pSBIOKUgSDilIEg4pSBIOKUmyAgICAgICAgIOKUlyDilIEg4pSBIOKUgSDilIEg4pSbXG4gICAgICpcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgRCBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBEIGFuZCBlbGVtZW50IHdpZHRoIGlzIGxlc3MgdGhhbiBzY3JvbGxpbmcgYm94IHdpZHRoXG4gICAgICpcbiAgICAgKiAgICAgICAgICAgZnJvbSAgICAgICAgICAgICAgICAgdG9cbiAgICAgKiAgICAgICAg4pSPIOKUgSDilIEg4pSBIOKUgSDilJMgICAgICAgICDilI8g4pSBIOKUgSDilIEg4pSBIOKUk1xuICAgICAqICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkCAgICAgICAgICAgICDilIzilIDilIDilIDilJBcbiAgICAgKiAgICAgICAg4pSDICAgICAgIOKUgiDilIMg4pSCICAgICAgIOKUgyAgICAg4pSCICAg4pSDXG4gICAgICogICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSYICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUmFxuICAgICAqICAgICAgICDilJcg4pSBIOKUgS
1DilIEg4pSBIOKUmyAgICAgICAgIOKUlyDilIEg4pSBIOKUgSDilIEg4pSbXG4gICAgICpcbiAgICAgKi9cbiAgICBpZiAoZWxlbWVudEVkZ2VFbmQgPiBzY3JvbGxpbmdFZGdlRW5kICYmIGVsZW1lbnRTaXplIDwgc2Nyb2xsaW5nU2l6ZSB8fCBlbGVtZW50RWRnZVN0YXJ0IDwgc2Nyb2xsaW5nRWRnZVN0YXJ0ICYmIGVsZW1lbnRTaXplID4gc2Nyb2xsaW5nU2l6ZSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRFZGdlRW5kIC0gc2Nyb2xsaW5nRWRnZUVuZCArIHNjcm9sbGluZ0JvcmRlckVuZDtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZnVuY3Rpb24gY29tcHV0ZVNjcm9sbEludG9WaWV3KHRhcmdldCwgc2Nyb2xsZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgYmxvY2sgPSBvcHRpb25zLmJsb2NrLFxuICAgICAgaW5saW5lID0gb3B0aW9ucy5pbmxpbmU7XG4gICAgLy8gVXNlZCB0byBoYW5kbGUgdGhlIHRvcCBtb3N0IGVsZW1lbnQgdGhhdCBjYW4gYmUgc2Nyb2xsZWRcbiAgICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGdldFNjcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAvLyBTdXBwb3J0IHBpbmNoLXpvb21pbmcgcHJvcGVybHksIG1ha2luZyBzdXJlIGVsZW1lbnRzIHNjcm9sbCBpbnRvIHRoZSB2aXN1YWwgdmlld3BvcnRcbiAgICAvLyBCcm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgdmlzdWFsVmlld3BvcnQgd2lsbCByZXBvcnQgdGhlIGxheW91dCB2aWV3cG9ydCBkaW1lbnNpb25zIG9uIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aC9IZWlnaHRcbiAgICAvLyBhbmQgdmlld3BvcnQgZGltZW5zaW9ucyBvbiB3aW5kb3cuaW5uZXJXaWR0aC9IZWlnaHRcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9tb2JpbGUvdmlld3BvcnRzMi5odG1sXG4gICAgLy8gaHR0cHM6Ly9ib2thbmQuZ2l0aHViLmlvL3ZpZXdwb3J0L2luZGV4Lmh0bWxcbiAgICB2YXIgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCAhPSBudWxsID8gdmlzdWFsVmlld3BvcnQud2lkdGggOiBpbm5lcldpZHRoO1xuICAgIHZhciB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCAhPSBudWxsID8gdmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogaW5uZXJIZWlnaHQ7XG4gICAgdmFyIHZpZXdwb3J0WCA9IHdpbmRvdy5zY3JvbGxYICE9IG51bGwgPyB3aW5kb3cuc2Nyb2xsWCA6IHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgICB2YXIgdmlld3BvcnRZID0gd2luZG93LnNjcm9sbFkgIT0gbnVsbCA/IHdpbmRvdy5zY3JvbGxZIDogd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgIHZhciBfYSA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHRhcmdldEhlaWdodCA9IF9hLmhlaWdodCxcbiAgICAgIHRhcmdldFdpZHRoID0gX2Eud2lkdGgsXG4gICAgICB0YXJnZXRUb3AgPSBfYS50b3AsXG4gICAgICB0YXJnZXRSaWdodCA9IF9hLnJpZ2h0LFxuICAgICAgdGFyZ2V0Qm90dG9tID0gX2EuYm90dG9tLFxuICAgICAgdGFyZ2V0TGVmdCA9IF9hLmxlZnQ7XG4gICAgLy8gVGhlc2UgdmFsdWVzIG11dGF0ZSBhcyB3ZSBsb29wIHRocm91Z2ggYW5kIGdlbmVyYXRlIHNjcm9sbCBjb29yZGluYXRlc1xuICAgIHZhciB0YXJnZXRCbG9jayA9IGJsb2NrID09PSBcInN0YXJ0XCIgfHwgYmxvY2sgPT09IFwibmVhcmVzdFwiID8gdGFyZ2V0VG9wIDogYmxvY2sgPT09IFwiZW5kXCIgPyB0YXJnZXRCb3R0b20gOiB0YXJnZXRUb3AgKyB0YXJnZXRIZWlnaHQgLyAyOyAvLyBibG9jayA9PT0gJ2NlbnRlclxuICAgIHZhciB0YXJnZXRJbmxpbmUgPSBpbmxpbmUgPT09IFwiY2VudGVyXCIgPyB0YXJnZXRMZWZ0ICsgdGFyZ2V0V2lkdGggLyAyIDogaW5saW5lID09PSBcImVuZFwiID8gdGFyZ2V0UmlnaHQgOiB0YXJnZXRMZWZ0OyAvLyBpbmxpbmUgPT09ICdzdGFydCB8fCBpbmxpbmUgPT09ICduZWFyZXN0XG4gICAgdmFyIF9iID0gc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBoZWlnaHQgPSBfYi5oZWlnaHQsXG4gICAgICB3aWR0aCA9IF9iLndpZHRoLFxuICAgICAgdG9wID0gX2IudG9wLFxuICAgICAgcmlnaHQgPSBfYi5yaWdodCxcbiAgICAgIGJvdHRvbSA9IF9iLmJvdHRvbSxcbiAgICAgIGxlZnQgPSBfYi5sZWZ0O1xuICAgIHZhciBmcmFtZVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShzY3JvbGxlcik7XG4gICAgdmFyIGJvcmRlckxlZnQgPSBwYXJzZUludChmcmFtZVN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApO1xuICAgIHZhciBib3JkZXJUb3AgPSBwYXJzZUludChmcmFtZVN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCk7XG4gICAgdmFyIGJvcmRlclJpZ2h0ID0gcGFyc2VJbnQoZnJhbWVTdHlsZS5ib3JkZXJSaWdodFdpZHRoLCAxMCk7XG4gICAgdmFyIGJvcmRlckJvdHRvbSA9IHBhcnNlSW50KGZyYW1lU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgsIDEwKTtcbiAgICB2YXIgYmxvY2tTY3JvbGwgPSAwO1xuICAgIHZhciBpbmxpbmVTY3JvbGwgP
1SAwO1xuICAgIC8vIFRoZSBwcm9wZXJ0eSBleGlzdGFuY2UgY2hlY2tzIGZvciBvZmZzZXRbV2lkdGh8SGVpZ2h0XSBpcyBiZWNhdXNlIG9ubHkgSFRNTEVsZW1lbnQgb2JqZWN0cyBoYXZlIHRoZW0sIGJ1dCBhbnkgRWxlbWVudCBtaWdodCBwYXNzIGJ5IGhlcmVcbiAgICAvLyBAVE9ETyBmaW5kIG91dCBpZiB0aGUgXCJhcyBIVE1MRWxlbWVudFwiIG92ZXJyaWRlcyBjYW4gYmUgZHJvcHBlZFxuICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IFwib2Zmc2V0V2lkdGhcIiBpbiBzY3JvbGxlciA/IHNjcm9sbGVyLm9mZnNldFdpZHRoIC0gc2Nyb2xsZXIuY2xpZW50V2lkdGggLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHQgOiAwO1xuICAgIHZhciBzY3JvbGxiYXJIZWlnaHQgPSBcIm9mZnNldEhlaWdodFwiIGluIHNjcm9sbGVyID8gc2Nyb2xsZXIub2Zmc2V0SGVpZ2h0IC0gc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gYm9yZGVyVG9wIC0gYm9yZGVyQm90dG9tIDogMDtcbiAgICBpZiAoc2Nyb2xsaW5nRWxlbWVudCA9PT0gc2Nyb2xsZXIpIHtcbiAgICAgIC8vIEhhbmRsZSB2aWV3cG9ydCBsb2dpYyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LmJvZHkpXG4gICAgICBpZiAoYmxvY2sgPT09IFwic3RhcnRcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrO1xuICAgICAgfSBlbHNlIGlmIChibG9jayA9PT0gXCJlbmRcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gdmlld3BvcnRIZWlnaHQ7XG4gICAgICB9IGVsc2UgaWYgKGJsb2NrID09PSBcIm5lYXJlc3RcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IGFsaWduTmVhcmVzdCh2aWV3cG9ydFksIHZpZXdwb3J0WSArIHZpZXdwb3J0SGVpZ2h0LCB2aWV3cG9ydEhlaWdodCwgYm9yZGVyVG9wLCBib3JkZXJCb3R0b20sIHZpZXdwb3J0WSArIHRhcmdldEJsb2NrLCB2aWV3cG9ydFkgKyB0YXJnZXRCbG9jayArIHRhcmdldEhlaWdodCwgdGFyZ2V0SGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGJsb2NrID09PSAnY2VudGVyJyBpcyB0aGUgZGVmYXVsdFxuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gdmlld3BvcnRIZWlnaHQgLyAyO1xuICAgICAgfVxuICAgICAgaWYgKGlubGluZSA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgIGlubGluZVNjcm9sbCA9IHRhcmdldElubGluZTtcbiAgICAgIH0gZWxzZSBpZiAoaW5saW5lID09PSBcImNlbnRlclwiKSB7XG4gICAgICAgIGlubGluZVNjcm9sbCA9IHRhcmdldElubGluZSAtIHZpZXdwb3J0V2lkdGggLyAyO1xuICAgICAgfSBlbHNlIGlmIChpbmxpbmUgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgaW5saW5lU2Nyb2xsID0gdGFyZ2V0SW5saW5lIC0gdmlld3BvcnRXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlubGluZSA9PT0gJ25lYXJlc3QnIGlzIHRoZSBkZWZhdWx0XG4gICAgICAgIGlubGluZVNjcm9sbCA9IGFsaWduTmVhcmVzdCh2aWV3cG9ydFgsIHZpZXdwb3J0WCArIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0V2lkdGgsIGJvcmRlckxlZnQsIGJvcmRlclJpZ2h0LCB2aWV3cG9ydFggKyB0YXJnZXRJbmxpbmUsIHZpZXdwb3J0WCArIHRhcmdldElubGluZSArIHRhcmdldFdpZHRoLCB0YXJnZXRXaWR0aCk7XG4gICAgICB9XG4gICAgICAvLyBBcHBseSBzY3JvbGwgcG9zaXRpb24gb2Zmc2V0cyBhbmQgZW5zdXJlIHRoZXkgYXJlIHdpdGhpbiBib3VuZHNcbiAgICAgIC8vIEBUT0RPIGFkZCBtb3JlIHRlc3QgY2FzZXMgdG8gY292ZXIgdGhpcyAxMDAlXG4gICAgICBibG9ja1Njcm9sbCA9IE1hdGgubWF4KDAsIGJsb2NrU2Nyb2xsICsgdmlld3BvcnRZKTtcbiAgICAgIGlubGluZVNjcm9sbCA9IE1hdGgubWF4KDAsIGlubGluZVNjcm9sbCArIHZpZXdwb3J0WCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBlYWNoIHNjcm9sbGluZyBmcmFtZSB0aGF0IG1pZ2h0IGV4aXN0IGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIHZpZXdwb3J0XG4gICAgICBpZiAoYmxvY2sgPT09IFwic3RhcnRcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gdG9wIC0gYm9yZGVyVG9wO1xuICAgICAgfSBlbHNlIGlmIChibG9jayA9PT0gXCJlbmRcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gYm90dG9tICsgYm9yZGVyQm90dG9tICsgc2Nyb2xsYmFySGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmIChibG9jayA9PT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgYmxvY2tTY3JvbGwgPSBhbGlnbk5lYXJlc3QodG9wLCBib3R0b20sIGhlaWdodCwgYm9yZGVyVG9wLCBib3JkZXJCb3R0b20gKyBzY3JvbGxiYXJIZWlnaHQsIHRhcmdldEJsb2NrLCB0YXJnZXRCbG9jayArIHRhcmdldEhlaWdodCwgdGFyZ2V0SGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGJsb2NrID09PSAnY2VudGVyJyBpcyB0aGUgZGVmYXVsdFxuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gKHRvcCArIGhlaWdodCAvIDIpICsgc2Nyb2xsYmFySGVpZ2h0IC8gMjtcbiAgICAgIH1cbiAgICAgIGlmIChpbmxpbmUgPT09IFwic3RhcnRcIikge1xuICAgICAgICBpbmxpbmVTY3JvbGwgP
1SB0YXJnZXRJbmxpbmUgLSBsZWZ0IC0gYm9yZGVyTGVmdDtcbiAgICAgIH0gZWxzZSBpZiAoaW5saW5lID09PSBcImNlbnRlclwiKSB7XG4gICAgICAgIGlubGluZVNjcm9sbCA9IHRhcmdldElubGluZSAtIChsZWZ0ICsgd2lkdGggLyAyKSArIHNjcm9sbGJhcldpZHRoIC8gMjtcbiAgICAgIH0gZWxzZSBpZiAoaW5saW5lID09PSBcImVuZFwiKSB7XG4gICAgICAgIGlubGluZVNjcm9sbCA9IHRhcmdldElubGluZSAtIHJpZ2h0ICsgYm9yZGVyUmlnaHQgKyBzY3JvbGxiYXJXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlubGluZSA9PT0gJ25lYXJlc3QnIGlzIHRoZSBkZWZhdWx0XG4gICAgICAgIGlubGluZVNjcm9sbCA9IGFsaWduTmVhcmVzdChsZWZ0LCByaWdodCwgd2lkdGgsIGJvcmRlckxlZnQsIGJvcmRlclJpZ2h0ICsgc2Nyb2xsYmFyV2lkdGgsIHRhcmdldElubGluZSwgdGFyZ2V0SW5saW5lICsgdGFyZ2V0V2lkdGgsIHRhcmdldFdpZHRoKTtcbiAgICAgIH1cbiAgICAgIHZhciBzY3JvbGxMZWZ0ID0gc2Nyb2xsZXIuc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsVG9wID0gc2Nyb2xsZXIuc2Nyb2xsVG9wO1xuICAgICAgLy8gRW5zdXJlIHNjcm9sbCBjb29yZGluYXRlcyBhcmUgbm90IG91dCBvZiBib3VuZHMgd2hpbGUgYXBwbHlpbmcgc2Nyb2xsIG9mZnNldHNcbiAgICAgIGJsb2NrU2Nyb2xsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsVG9wICsgYmxvY2tTY3JvbGwsIHNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIGhlaWdodCArIHNjcm9sbGJhckhlaWdodCkpO1xuICAgICAgaW5saW5lU2Nyb2xsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsTGVmdCArIGlubGluZVNjcm9sbCwgc2Nyb2xsZXIuc2Nyb2xsV2lkdGggLSB3aWR0aCArIHNjcm9sbGJhcldpZHRoKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0b3A6IGJsb2NrU2Nyb2xsLFxuICAgICAgbGVmdDogaW5saW5lU2Nyb2xsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSAnc2Nyb2xsSW50b1ZpZXcnIG1ldGhvZCBvbiB0aGUgRWxlbWVudCBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoRWxlbWVudFNjcm9sbEludG9WaWV3KCkge1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbEludG9WaWV3ID0gZnVuY3Rpb24gKGFyZykge1xuICAgICAgdmFyIG5vcm1hbGl6ZWRPcHRpb25zID0gYXJnID09IG51bGwgfHwgYXJnID09PSB0cnVlID8ge1xuICAgICAgICBibG9jazogXCJzdGFydFwiLFxuICAgICAgICBpbmxpbmU6IFwibmVhcmVzdFwiXG4gICAgICB9IDogYXJnID09PSBmYWxzZSA/IHtcbiAgICAgICAgYmxvY2s6IFwiZW5kXCIsXG4gICAgICAgIGlubGluZTogXCJuZWFyZXN0XCJcbiAgICAgIH0gOiBhcmc7XG4gICAgICAvLyBGaW5kIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgY2FuIGJlIHNjcm9sbGVkXG4gICAgICB2Y
1XIgX2EgPSBfX3JlYWQoZmluZE5lYXJlc3RBbmNlc3RvcnNXaXRoU2Nyb2xsQmVoYXZpb3IodGhpcyksIDIpLFxuICAgICAgICBhbmNlc3RvcldpdGhTY3JvbGwgPSBfYVswXSxcbiAgICAgICAgYW5jZXN0b3JXaXRoU2Nyb2xsQmVoYXZpb3IgPSBfYVsxXTtcbiAgICAgIHZhciBiZWhhdmlvciA9IG5vcm1hbGl6ZWRPcHRpb25zLmJlaGF2aW9yICE9IG51bGwgPyBub3JtYWxpemVkT3B0aW9ucy5iZWhhdmlvciA6IGFuY2VzdG9yV2l0aFNjcm9sbEJlaGF2aW9yO1xuICAgICAgLy8gSWYgdGhlIGJlaGF2aW9yIGlzbid0IHNtb290aCwgc2ltcGx5IGludm9rZSB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gYW5kIGRvIG5vIG1vcmVcbiAgICAgIGlmIChiZWhhdmlvciAhPT0gXCJzbW9vdGhcIikge1xuICAgICAgICAvLyBBc3NlcnQgdGhhdCAnc2Nyb2xsSW50b1ZpZXcnIGlzIGFjdHVhbGx5IGRlZmluZWRcbiAgICAgICAgaWYgKEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0lOVE9fVklFVyAhPSBudWxsKSB7XG4gICAgICAgICAgRUxFTUVOVF9PUklHSU5BTF9TQ1JPTExfSU5UT19WSUVXLmNhbGwodGhpcywgbm9ybWFsaXplZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaW52b2tlICdzY3JvbGxUbycgaW5zdGVhZCBhbmQgcHJvdmlkZSB0aGUgc2Nyb2xsIGNvb3JkaW5hdGVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBfYiA9IGNvbXB1dGVTY3JvbGxJbnRvVmlldyh0aGlzLCBhbmNlc3RvcldpdGhTY3JvbGwsIG5vcm1hbGl6ZWRPcHRpb25zKSxcbiAgICAgICAgICAgIHRvcF8xID0gX2IudG9wLFxuICAgICAgICAgICAgbGVmdCA9IF9iLmxlZnQ7XG4gICAgICAgICAgZ2V0T3JpZ2luYWxTY3JvbGxNZXRob2RGb3JLaW5kKFwic2Nyb2xsVG9cIiwgdGhpcykuY2FsbCh0aGlzLCBsZWZ0LCB0b3BfMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYW5jZXN0b3JXaXRoU2Nyb2xsLnNjcm9sbFRvKF9hc3NpZ24oe1xuICAgICAgICBiZWhhdmlvcjogYmVoYXZpb3JcbiAgICAgIH0sIGNvbXB1dGVTY3JvbGxJbnRvVmlldyh0aGlzLCBhbmNlc3RvcldpdGhTY3JvbGwsIG5vcm1hbGl6ZWRPcHRpb25zKSkpO1xuICAgIH07XG4gICAgLy8gT24gSUUxMSwgSFRNTEVsZW1lbnQgaGFzIGl0cyBvd24gZGVjbGFyYXRpb24gb2Ygc2Nyb2xsSW50b1ZpZXcgYW5kIGRvZXMgbm90IGluaGVyaXQgdGhpcyBmcm9tIHRoZSBwcm90b3R5cGUgY2hhaW4sIHNvIHdlJ2xsIG5lZWQgdG8gcGF0Y2ggdGhhdCBvbmUgdG9vLlxuICAgIGlmIChIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsSW50b1ZpZXcgIT0gbnVsbCAmJiBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsSW50b1ZpZXcgIT09IEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbEludG9WaWV3KSB7XG4gICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsSW50b1ZpZXcgPSBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxJbnRvVmlldztcbiAgICB9XG4gIH1cbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX1RPUF9TRVRfREVTQ1JJUFRPUiA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gdW5kZWZpbmVkIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgXCJzY3JvbGxUb3BcIikuc2V0O1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSAnc2Nyb2xsVG9wJyBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9uIHRoZSBFbGVtZW50IHByb3RvdHlwZVxuICAgKi9cbiAgZnVuY3Rpb24gcGF0Y2hFbGVtZW50U2Nyb2xsVG9wKCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgXCJzY3JvbGxUb3BcIiwge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoc2Nyb2xsVG9wKSB7XG4gICAgICAgIGlmICh0aGlzLl9fYWRqdXN0aW5nU2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gRUxFTUVOVF9PUklHSU5BTF9TQ1JPTExfVE9QX1NFVF9ERVNDUklQVE9SLmNhbGwodGhpcywgc2Nyb2xsVG9wKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVTY3JvbGxNZXRob2QodGhpcywgXCJzY3JvbGxUb1wiLCB0aGlzLnNjcm9sbExlZnQsIHNjcm9sbFRvcCk7XG4gICAgICAgIHJldHVybiBzY3JvbGxUb3A7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0xFRlRfU0VUX0RFU0NSSVBUT1IgPSBVTlNVUFBPUlRFRF9FTlZJUk9OTUVOVCA/IHVuZGVmaW5lZCA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsIFwic2Nyb2xsTGVmdFwiKS5zZXQ7XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgdGhlICdzY3JvbGxMZWZ0JyBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9uIHRoZSBFbGVtZW50IHByb3RvdHlwZVxuICAgKi9cbiAgZnVuY3Rpb24gcGF0Y2hFbGVtZW50U2Nyb2xsTGVmdCgpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsIFwic2Nyb2xsTGVmdFwiLCB7XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChzY3JvbGxMZWZ0KSB7XG4gICAgICAgIGlmICh0aGlzLl9fYWRqdXN0aW5nU2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gRUxFTUVOVF9PUklHSU5BTF9TQ1JPTExfTEVGVF9TRVRfREVTQ1JJUFRPUi5jYWxsKHRoaXMsIHNjcm9sbExlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZVNjcm9sbE1ldGhvZCh0aGlzLCBcInNjcm9sbFRvXCIsIHNjcm9sbExlZnQsIHRoaXMuc2Nyb2xsVG9wKTtcbiAgICAgICAgcmV0dXJuIHNjcm9sbExlZnQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgcG9seWZpbGxcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoKCkge1xuICAgIC8vIEVsZW1lbnQucHJvdG90eXBlIG1ldGhvZHNcbiAgICBwYXRjaEVsZW1lbnRTY3JvbGwoKTtcbiAgICBwYXRjaEVsZW1lbnRTY3JvbGxCeSgpO1xuICAgIHBhdGNoRWxlbWVudFNjcm9sbFRvKCk7XG4gICAgcGF0Y2hFbGVtZW50U2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAvLyBFbGVtZW50LnByb3RvdHlwZSBkZXNjcmlwdG9yc1xuICAgIHBhdGNoRWxlbWVudFNjcm9sbExlZnQoKTtcbiAgICBwYXRjaEVsZW1lbnRTY3JvbGxUb3AoKTtcbiAgICAvLyB3aW5kb3cgbWV0aG9kc1xuICAgIHBhdGNoV2luZG93U2Nyb2xsKCk7XG4gICAgcGF0Y2hXaW5kb3dTY3JvbGxCeSgpO1xuICAgIHBhdGNoV2luZG93U2Nyb2xsVG8oKTtcbiAgICAvLyBOYXZpZ2F0aW9uXG4gICAgY2F0Y2hOYXZpZ2F0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogSXMgdHJ1ZSBpZiB0aGUgYnJvd3NlciBuYXRpdmVseSBzdXBwb3J0cyB0aGUgRWxlbWVudC5wcm90b3R5cGUuW3Njcm9sbHxzY3JvbGxUb3xzY3JvbGxCeXxzY3JvbGxJbnRvVmlld10gbWV0aG9kc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHZhciBTVVBQT1JUU19FTEVNRU5UX1BST1RPVFlQRV9TQ1JPTExfTUVUSE9EUyA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gZmFsc2UgOiBcInNjcm9sbFwiIGluIEVsZW1lbnQucHJvdG90eXBlICYmIFwic2Nyb2xsVG9cIiBpbiBFbGVtZW50LnByb3RvdHlwZSAmJiBcInNjcm9sbEJ5XCIgaW4gRWxlbWVudC5wcm90b3R5cGUgJiYgXCJzY3JvbGxJbnRvVmlld1wiIGluIEVsZW1lbnQucHJvdG90eXBlO1xuICBpZiAoIVVOU1VQUE9SVEVEX0VOVklST05NRU5UICYmICghU1VQUE9SVFNfU0NST0xMX0JFSEFWSU9SIHx8ICFTVVBQT1JUU19FTEVNRU5UX1BST1RPVFlQRV9TQ1JPTExfTUVUSE9EUykpIHtcbiAgICBwYXRjaCgpO1xuICB9XG59KSgpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///767\n')},701:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony import */ var scroll_behavior_polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(767);\n/* harmony import */ var scroll_behavior_polyfill__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scroll_behavior_polyfill__WEBPACK_IMPORTED_MODULE_0__);\n\n\n/**\n ***  Page loading  */\nvar loadingWrapper = document.getElementById('loadingWrapper');\nwindow.onload = function () {\n  setTimeout(function () {\n    loadingWrapper.classList.add('disabled');\n  }, 100);\n}(function () {\n  /**\n   ***  burger  */\n  var burger = document.getElementById('jsBurger');\n  // ない場合はなにもしない\n  if (!burger) {\n    return;\n  }\n  burger.addEventListener('click', function () {\n    document.body.classList.toggle('visible-mobile-menu');\n  });
1\n\n  /**\n   ***  overlay  */\n  var overlay = document.getElementById('jsOverlay');\n  // ない場合はなにもしない\n  if (!overlay) {\n    return;\n  }\n  overlay.addEventListener('click', function () {\n    document.body.classList.remove('visible-mobile-menu');\n  });\n}());\n\n/**\n ***  pagetop  */\n(function () {\n  var pagetop = document.getElementById('jsPagetop');\n  // ない場合はなにもしない\n  if (!pagetop) {\n    return;\n  }\n  var pagetopActiveClass = 'pagetop-active';\n  // Scroll event\n  window.addEventListener('scroll', function (e) {\n    if (window.scrollY > 100) {\n      pagetop.classList.add(pagetopActiveClass);\n    } else {\n      pagetop.classList.remove(pagetopActiveClass);\n    }\n  });\n  // Click event\n  pagetop.addEventListener('click', function () {\n    window.scrollTo({\n      top: 0,\n      left: 0,\n      behavior: 'smooth'\n    });\n  });\n})();\n\n/**\n ***  accordion  */\n(function () {\n  // アコーディオンの親要素のクラス名\n  var accordionParentClassName = '.accordion';\n  // アコーディオンのクリックイベントを行うクラス名\n  var triggerClassName = '.js-accordion-trigger';\n  // アコーディオンを開くためのクラス名\n  var activeClassName = 'active';\n\n  // アコーディオンのトリガーをすべて取得する\n  var acc = document.querySelectorAll(triggerClassName);\n\n  // クリックイベント\n  for (var i = 0; i < acc.length; i++) {\n    acc[i].addEventListener('click', function (e) {\n      // アクティブクラスが付いているかチェックする\n      var isActive = this.classList.contains(activeClassName);\n      // クリックした要素のアコーディオンの親要素を取得する\n      var parentAccordion = this.closest(accordionParentClassName);\n\n      // すべてのアコーディオンを閉じる\n      var allAccordions = parentAccordion.querySelectorAll(triggerClassName);\n      for (var j = 0; j < allAccordions.length; j++) {\n        // Remove active class from section header\n        allAccordions[j].classList.remove(activeClassName);\n        // Remove the max-height class from the panel to close it\n        var _panel = allAccordions[j].nextElementSibling;\n        var _maxHeightValue = getStyle(_panel, 'maxHeight');\n        if (_maxHeightValue !== '0px') {\n          _panel.style.maxHeight = null;\n        }\n      }\n\n      // アクティブクラスの付け替え\n      isActive ? this.classList.remove(activeClassName) : this.classList.add(activeClassName);\n\n      // アコーディオンの開閉処理\n      var panel = this.nextElementSibling;\n      var maxHeightValue = getStyle(panel, 'maxHeight');\n      if (maxHeightValue !== '0px') {\n        panel.style.maxHeight = null;\n      } else {\n        panel.style.maxHeight = panel.scrollHeight + 'px';\n      }\n    });\n  }\n})();\n\n/**\n ***  tab  */\n(function () {\n  // タブ処理を行う要素のクラス名\n  var tabsClass = 'js-tab';\n  var currentClassName = 'js-tab-current';\n  var currentViewClassName = 'js-tab-current-view';\n  // タブ処理を行う要素の取得\n  var tabs = document.getElementsByClassName(tabsClass);\n  // ない場合はなにもしない\n  if (!tabs) {\n    return;\n  }\n\n  // Click event\n  for (var i = 0; i < tabs.length; i++) {\n    tabs[i].addEventListener('click', function () {\n      // データ属性を取得する\n      var view = this.dataset.view;\n      // .current が付与しているかチェック\n      var isCurrent = this.classList.contains(currentClassName);\n      // クリックしたタブの親要素を取得する\n      var tabsParent = this.closest('.tab-wrapper');\n      // 他のタブ要素に影響しないようにクリックしたタブ要素だけに絞る\n      var tabsChild = tabsParent.getElementsByClassName(tabsClass);\n      // コンテンツの要素を取得する\n      var allContents = tabsParent.getElementsByClassName('js-tab-contents');\n      if (!isCurrent) {\n        // remove .current\n        for (var j = 0; j < tabsChild.length;
1 j++) {\n          tabsChild[j].classList.remove(currentClassName);\n        }\n        this.classList.add(currentClassName);\n      }\n      // remove .current-view\n      for (var k = 0; k < allContents.length; k++) {\n        allContents[k].classList.remove(currentViewClassName);\n      }\n      //\n      document.getElementById(view).classList.add(currentViewClassName);\n    });\n  }\n})();\n\n/**\n ***  ページ内リンク  */\n(function () {\n  var elm = document.querySelectorAll('.js-page-anchor');\n  // ない場合はなにもしない\n  if (!elm.length) {\n    return;\n  }\n  // イベント\n  for (var i = 0; i < elm.length; i++) {\n    elm[i].addEventListener('click', function (e) {\n      e.preventDefault();\n      var href = this.getAttribute('href');\n      // ページ内リンクでない場合は何もしない\n      if (href.slice(0, 1) != '#') {\n        return;\n      }\n      // リンク先の要素を取得\n      var pageID = document.getElementById(href.slice(1));\n      // ない場合はなにもしない\n      if (!pageID) {\n        return;\n      }\n      var rect = pageID.getBoundingClientRect();\n      var scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n      var position = rect.top + scrollTop;\n      // スクロール処理\n      window.scrollTo({\n        top: position - 120,\n        left: 0,\n        behavior: 'smooth'\n      });\n    });\n  }\n})();\n\n/**\n ***  指定したプロパティを要素から取得する  */\nvar getStyle = function getStyle(el, styleProp) {\n  var defaultView = (el.ownerDocument || document).defaultView;\n  styleProp = styleProp.replace(/([A-Z])/g, '-$1').toLowerCase();\n  return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);\n};\n\n/**\n ***  Grobal Menu Event  */\n(function () {\n  // グローバルナビゲーションの要素\n  var globalNav = document.getElementById('globalNav');\n\n  // すべてのトリガーを取得する\n  var allTrigger = globalNav.querySelectorAll('.js-trigger');\n\n  // 幅が lg 以上のビューポートをターゲットとするメディアクエリを作成\n  var mediaQuery = window.matchMedia('(min-width: 992px)');\n\n  // アクティブクラスが付いているかチェックする\n  var activeClassName = 'active';\n\n  // ホバー時に付与するクラス名\n  var hoverClassName = 'hover';\n\n  // Window width\n  var memoryWindowWidth = window.innerWidth;\n\n  // イベント\n  allTrigger.forEach(function (elm) {\n    // クリックイベント\n    elm.addEventListener('click', function (t) {\n      var _this = this;\n      // PCでの処理\n      if (mediaQuery.matches) {\n        return;\n      } else {\n        // モバイルでの処理\n        t.preventDefault();\n        // アクティブ判定\n        var isActive = this.parentNode.classList.contains(activeClassName);\n\n        // 一度、すべてのメニューを閉じる\n        allTrigger.forEach(function (child) {\n          // 高さを取得する要素(クリックした要素の子メニュー)\n          var panel = child.nextElementSibling;\n          //const maxHeightValue = getStyle(panel, 'maxHeight');\n          if (child !== _this) {\n            child.parentNode.classList.remove(activeClassName);\n            panel.style.maxHeight = null;\n          }\n        });\n        // アクティブクラスの処理\n        isActive ? this.parentNode.classList.remove(activeClassName) : this.parentNode.classList.add(activeClassName);\n        // 子メニューの開閉処理\n        // Toggle the panel element\n        var panel = this.nextElementSibling;\n        var maxHeightValue = getStyle(panel, 'maxHeight');\n        if (maxHeightValue !== '0px') {\n          panel.style.maxHeight = null;\n          return;\n        }\n        panel.style.maxHeight = panel.scrollHeight + 'px';\n      }\n    });\n\n    // PC時のホバー処理\n    // elm.parentNode.addEventListener('mouseenter', () => {\n    //   if (mediaQuery.matches) {\n    //     elm.parentNode.classList.add(hoverClassName);\n    //     elm.nextElementSibling.style.maxHeight = elm.nextElementSibling.scrollHeight + 'px';\n    //   }\n    // });\n    // elm.parentNode.addEventListener('mouseleave', () => {\n    //   if (mediaQuery.matches) {\n    //     elm.parentNode.classList.remove(hoverClassName);\n    //     elm.nextElementSibling.style.maxHeight = null;\n    //   }\n    // });\n  });\n  // window リサイズでメニューをクリアにする処理\n  window.addEventListener('resize', function () {\n    if (memoryWindowWidth !== window.innerWidth) {\n      // window の width を取得し直す\n      memoryWindowWidth = window.innerWidth;\n      allTrigger.forEach(function (el) {\n        // 子メニューを閉じる\n        el.parentNode.classList.remove(activeClassName);\n        var panel = el.nextElementSibling;\n        panel.style.maxHeight = null;\n      });\n      // バーガーを閉じる\n      this.document.body.classList.remove('visible-mobile-menu');\n    }\n  });\n})();\n\n/**\n ***  Maker Animation  */\n(function () {\n  var markers = document.querySelectorAll('.marker-animation');\n  var root = null;\n  var observerAction = function observerAction(entries) {\n    entries.forEac
1h(function (entry) {\n      if (entry.isIntersecting) {\n        entry.target.classList.add('is-visible');\n      } else {\n        entry.target.classList.remove('is-visible');\n      }\n    });\n  };\n  var optionsMarkers = {\n    root: root,\n    rootMargin: '0px 0px -30%' // ビューポートの中心を判定基準にする\n  };\n\n  var startObserve = function startObserve(targets, options) {\n    var observer = new IntersectionObserver(observerAction, options);\n    targets.forEach(function (target) {\n      observer.observe(target);\n    });\n  };\n  startObserve(markers, optionsMarkers);\n\n  /**\n   ***  Modal  */\n  var openButtons = document.querySelectorAll('.js-modal-open');\n  openButtons.forEach(function (btn) {\n    btn.addEventListener('click', function () {\n      var modalAttribute = btn.getAttribute('data-modal');\n      var modalShow = document.getElementById(modalAttribute);\n      modalShow.classList.add('active');\n    });\n  });\n  var closeButtons = document.querySelectorAll('.js-modal-close');\n  closeButtons.forEach(function (btn) {\n    btn.addEventListener('click', function () {\n      var modal = btn.closest('.modal-outer');\n      modal.classList.remove('active');\n    });\n  });\n  var modalOuter = document.querySelectorAll('.modal-outer');\n  modalOuter.forEach(function (outer) {\n    outer.addEventListener('click', function (event) {\n      if (event.target.closest('.modal-inner') === null) {\n        event.target.classList.remove('active');\n      }\n    });\n  });\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAxLmpzIiwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wb3Rhc2xpbS8uL3NyYy93ZWJwYWNrL21vZHVsZS5qcz8wZWFlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2Nyb2xsLWJlaGF2aW9yLXBvbHlmaWxsJztcblxuLyoqXG4gKioqICBQYWdlIGxvYWRpbmcgICovXG52YXIgbG9hZGluZ1dyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZ1dyYXBwZXInKTtcbndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGxvYWRpbmdXcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gIH0sIDEwMCk7XG59KGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqKiogIGJ1cmdlciAgKi9cbiAgdmFyIGJ1cmdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqc0J1cmdlcicpO1xuICAvLyDjgarjgYTloLTlkIjjga/jgarjgavjgoLjgZfjgarjgYRcbiAgaWYgKCFidXJnZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYnVyZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZS1tb2JpbGUtbWVudScpO1xuICB9KTtcblxuICAvKipcbiAgICoqKiAgb3ZlcmxheSAgKi9cbiAgdmFyIG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnanNPdmVybGF5Jyk7XG4gIC8vIOOBquOBhOWgtOWQiOOBr+OBquOBq+OCguOBl+OBquOBhFxuICBpZiAoIW92ZXJsYXkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBkb2
1N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUtbW9iaWxlLW1lbnUnKTtcbiAgfSk7XG59KCkpO1xuXG4vKipcbiAqKiogIHBhZ2V0b3AgICovXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgcGFnZXRvcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqc1BhZ2V0b3AnKTtcbiAgLy8g44Gq44GE5aC05ZCI44Gv44Gq44Gr44KC44GX44Gq44GEXG4gIGlmICghcGFnZXRvcCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcGFnZXRvcEFjdGl2ZUNsYXNzID0gJ3BhZ2V0b3AtYWN0aXZlJztcbiAgLy8gU2Nyb2xsIGV2ZW50XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICh3aW5kb3cuc2Nyb2xsWSA+IDEwMCkge1xuICAgICAgcGFnZXRvcC5jbGFzc0xpc3QuYWRkKHBhZ2V0b3BBY3RpdmVDbGFzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhZ2V0b3AuY2xhc3NMaXN0LnJlbW92ZShwYWdldG9wQWN0aXZlQ2xhc3MpO1xuICAgIH1cbiAgfSk7XG4gIC8vIENsaWNrIGV2ZW50XG4gIHBhZ2V0b3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgd2luZG93LnNjcm9sbFRvKHtcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuXG4vKipcbiAqKiogIGFjY29yZGlvbiAgKi9cbihmdW5jdGlvbiAoKSB7XG4gIC8vIOOCouOCs+ODvOODh+OCo+OCquODs+OBruimquimgee0oOOBruOCr+ODqeOCueWQjVxuICB2YXIgYWNjb3JkaW9uUGFyZW50Q2xhc3NOYW1lID0gJy5hY2NvcmRpb24nO1xuICAvLyDjgqLjgrPjg7zjg4fjgqPjgqrjg7Pjga7jgq/jg6rjg4Pjgq/jgqTjg5njg7Pjg4jjgpLooYzjgYbjgq/jg6njgrnlkI1cbiAgdmFyIHRyaWdnZXJDbGFzc05hbWUgPSAnLmpzLWFjY29yZGlvbi10cmlnZ2VyJztcbiAgLy8g44Ki44Kz44O844OH44Kj44Kq44Oz44KS6ZaL44GP44Gf44KB44Gu44Kv44Op44K55ZCNXG4gIHZhciBhY3RpdmVDbGFzc05hbWUgPSAnYWN0aXZlJztcblxuICAvLyDjgqLjgrPjg7zjg4fjgqPjgqrjg7Pjga7jg4jjg6rjgqzjg7zjgpLjgZnjgbnjgablj5blvpfjgZnjgotcbiAgdmFyIGFjYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlckNsYXNzTmFtZSk7XG5cbiAgLy8g44Kv44Oq44OD44Kv44Kk44OZ44Oz44OIXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjLmxlbmd0aDsgaSsrKSB7XG4gICAgYWNjW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIOOCouOCr+ODhuOCo+ODluOCr+ODqeOCueOBjOS7mOOBhOOBpuOBhOOCi+OBi+ODgeOCp+ODg+OCr+OBmeOCi1xuICAgICAgdmFyIGlzQWN0aXZlID0gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoYWN0aXZlQ2xhc3NOYW1lKTtcbiAgICAgIC8vIOOCr+ODquODg+OCr+OBl+OBn+imgee0oOOBruOCouOCs+ODvOODh+OCo+OCquODs+OBruimquimgee0oOOCkuWPluW+l+OBmeOCi1xuICAgICAgdmFyIHBhcmVudEFjY29yZGlvbiA9IHRoaXMuY2xvc2VzdChhY2NvcmRpb25QYXJlbnRDbGFzc05hbWUpO1xuXG4gICAgICAvLyDjgZnjgbnjgabjga7jgqLjgrPjg7zjg4fjgqPjgqrjg7PjgpLplonjgZjjgotcbiAgICAgIHZhciBhbGxBY2NvcmRpb25zID0gcGFyZW50QWNjb3JkaW9uLnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlckNsYXNzTmFtZSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbEFjY29yZGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzcyBmcm9tIHNlY3Rpb24gaGVhZGVyXG4gICAgICAgIGFsbEFjY29yZGlvbnNbal0uY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc05hbWUpO1xuICAgICAgICAvLyBSZW1vdmUgdGhlIG1heC1oZWlnaHQgY2xhc3MgZnJvbSB0aGUgcGFuZWwgdG8gY2xvc2UgaXRcbiAgICAgICAgdmFyIF9wYW5lbCA9IGFsbEFjY29yZGlvbnNbal0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB2Y
1XIgX21heEhlaWdodFZhbHVlID0gZ2V0U3R5bGUoX3BhbmVsLCAnbWF4SGVpZ2h0Jyk7XG4gICAgICAgIGlmIChfbWF4SGVpZ2h0VmFsdWUgIT09ICcwcHgnKSB7XG4gICAgICAgICAgX3BhbmVsLnN0eWxlLm1heEhlaWdodCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g44Ki44Kv44OG44Kj44OW44Kv44Op44K544Gu5LuY44GR5pu/44GIXG4gICAgICBpc0FjdGl2ZSA/IHRoaXMuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc05hbWUpIDogdGhpcy5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzTmFtZSk7XG5cbiAgICAgIC8vIOOCouOCs+ODvOODh+OCo+OCquODs+OBrumWi+mWieWHpueQhlxuICAgICAgdmFyIHBhbmVsID0gdGhpcy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICB2YXIgbWF4SGVpZ2h0VmFsdWUgPSBnZXRTdHlsZShwYW5lbCwgJ21heEhlaWdodCcpO1xuICAgICAgaWYgKG1heEhlaWdodFZhbHVlICE9PSAnMHB4Jykge1xuICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gcGFuZWwuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSkoKTtcblxuLyoqXG4gKioqICB0YWIgICovXG4oZnVuY3Rpb24gKCkge1xuICAvLyDjgr/jg5blh6bnkIbjgpLooYzjgYbopoHntKDjga7jgq/jg6njgrnlkI1cbiAgdmFyIHRhYnNDbGFzcyA9ICdqcy10YWInO1xuICB2YXIgY3VycmVudENsYXNzTmFtZSA9ICdqcy10YWItY3VycmVudCc7XG4gIHZhciBjdXJyZW50Vmlld0NsYXNzTmFtZSA9ICdqcy10YWItY3VycmVudC12aWV3JztcbiAgLy8g44K/44OW5Yem55CG44KS6KGM44GG6KaB57Sg44Gu5Y+W5b6XXG4gIHZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0YWJzQ2xhc3MpO1xuICAvLyDjgarjgYTloLTlkIjjga/jgarjgavjgoLjgZfjgarjgYRcbiAgaWYgKCF0YWJzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2xpY2sgZXZlbnRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGFic1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIOODh+ODvOOCv+WxnuaAp+OCkuWPluW+l+OBmeOCi1xuICAgICAgdmFyIHZpZXcgPSB0aGlzLmRhdGFzZXQudmlldztcbiAgICAgIC8vIC5jdXJyZW50IOOBjOS7mOS4juOBl+OBpuOBhOOCi+OBi+ODgeOCp+ODg+OCr1xuICAgICAgdmFyIGlzQ3VycmVudCA9IHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKGN1cnJlbnRDbGFzc05hbWUpO1xuICAgICAgLy8g44Kv44Oq44OD44Kv44GX44Gf44K/44OW44Gu6Kaq6KaB57Sg44KS5Y+W5b6X44GZ44KLXG4gICAgICB2Y
1XIgdGFic1BhcmVudCA9IHRoaXMuY2xvc2VzdCgnLnRhYi13cmFwcGVyJyk7XG4gICAgICAvLyDku5bjga7jgr/jg5bopoHntKDjgavlvbHpn7/jgZfjgarjgYTjgojjgYbjgavjgq/jg6rjg4Pjgq/jgZfjgZ/jgr/jg5bopoHntKDjgaDjgZHjgavntZ7jgotcbiAgICAgIHZhciB0YWJzQ2hpbGQgPSB0YWJzUGFyZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGFic0NsYXNzKTtcbiAgICAgIC8vIOOCs+ODs+ODhuODs+ODhOOBruimgee0oOOCkuWPluW+l+OBmeOCi1xuICAgICAgdmFyIGFsbENvbnRlbnRzID0gdGFic1BhcmVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdqcy10YWItY29udGVudHMnKTtcbiAgICAgIGlmICghaXNDdXJyZW50KSB7XG4gICAgICAgIC8vIHJlbW92ZSAuY3VycmVudFxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRhYnNDaGlsZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHRhYnNDaGlsZFtqXS5jbGFzc0xpc3QucmVtb3ZlKGN1cnJlbnRDbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChjdXJyZW50Q2xhc3NOYW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSAuY3VycmVudC12aWV3XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGFsbENvbnRlbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGFsbENvbnRlbnRzW2tdLmNsYXNzTGlzdC5yZW1vdmUoY3VycmVudFZpZXdDbGFzc05hbWUpO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXcpLmNsYXNzTGlzdC5hZGQoY3VycmVudFZpZXdDbGFzc05hbWUpO1xuICAgIH0pO1xuICB9XG59KSgpO1xuXG4vKipcbiAqKiogIOODmuODvOOCuOWGheODquODs+OCryAgKi9cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBlbG0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtcGFnZS1hbmNob3InKTtcbiAgLy8g44Gq44GE5aC05ZCI44Gv44Gq44Gr44KC44GX44Gq44GEXG4gIGlmICghZWxtLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyDjgqTjg5njg7Pjg4hcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbG0ubGVuZ3RoOyBpKyspIHtcbiAgICBlbG1baV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyIGhyZWYgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgLy8g44Oa44O844K45YaF44Oq44Oz44Kv44Gn44Gq44GE5aC05ZCI44Gv5L2V44KC44GX44Gq44GEXG4gICAgICBpZiAoaHJlZi5zbGljZSgwLCAxKSAhPSAnIycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8g44Oq44Oz44Kv5YWI44Gu6KaB57Sg44KS5Y+W5b6XXG4gICAgICB2Y
1XIgcGFnZUlEID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaHJlZi5zbGljZSgxKSk7XG4gICAgICAvLyDjgarjgYTloLTlkIjjga/jgarjgavjgoLjgZfjgarjgYRcbiAgICAgIGlmICghcGFnZUlEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciByZWN0ID0gcGFnZUlELmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgdmFyIHBvc2l0aW9uID0gcmVjdC50b3AgKyBzY3JvbGxUb3A7XG4gICAgICAvLyDjgrnjgq/jg63jg7zjg6vlh6bnkIZcbiAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgIHRvcDogcG9zaXRpb24gLSAxMjAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn0pKCk7XG5cbi8qKlxuICoqKiAg5oyH5a6a44GX44Gf44OX44Ot44OR44OG44Kj44KS6KaB57Sg44GL44KJ5Y+W5b6X44GZ44KLICAqL1xudmFyIGdldFN0eWxlID0gZnVuY3Rpb24gZ2V0U3R5bGUoZWwsIHN0eWxlUHJvcCkge1xuICB2YXIgZGVmYXVsdFZpZXcgPSAoZWwub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuZGVmYXVsdFZpZXc7XG4gIHN0eWxlUHJvcCA9IHN0eWxlUHJvcC5yZXBsYWNlKC8oW0EtWl0pL2csICctJDEnKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3ApO1xufTtcblxuLyoqXG4gKioqICBHcm9iYWwgTWVudSBFdmVudCAgKi9cbihmdW5jdGlvbiAoKSB7XG4gIC8vIOOCsOODreODvOODkOODq+ODiuODk+OCsuODvOOCt+ODp+ODs+OBruimgee0oFxuICB2YXIgZ2xvYmFsTmF2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dsb2JhbE5hdicpO1xuXG4gIC8vIOOBmeOBueOBpuOBruODiOODquOCrOODvOOCkuWPluW+l+OBmeOCi1xuICB2YXIgYWxsVHJpZ2dlciA9IGdsb2JhbE5hdi5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdHJpZ2dlcicpO1xuXG4gIC8vIOW5heOBjCBsZyDku6XkuIrjga7jg5Pjg6Xjg7zjg53jg7zjg4jjgpLjgr/jg7zjgrLjg4Pjg4jjgajjgZnjgovjg6Hjg4fjgqPjgqLjgq/jgqjjg6rjgpLkvZzmiJBcbiAgdmFyIG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogOTkycHgpJyk7XG5cbiAgLy8g44Ki44Kv44OG44Kj44OW44Kv44Op44K544GM5LuY44GE44Gm44GE44KL44GL44OB44Kn44OD44Kv44GZ44KLXG4gIHZhciBhY3RpdmVDbGFzc05hbWUgPSAnYWN0aXZlJztcblxuICAvLyDjg5vjg5Djg7zmmYLjgavku5jkuI7jgZnjgovjgq/jg6njgrnlkI1cbiAgdmFyIGhvdmVyQ2xhc3NOYW1lID0gJ2hvdmVyJztcblxuICAvLyBXaW5kb3cgd2lkdGhcbiAgdmFyIG1lbW9yeVdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG5cbiAgLy8g44Kk44OZ44Oz44OIXG4gIGFsbFRyaWdnZXIuZm9yRWFjaChmdW5jdGlvbiAoZWxtKSB7XG4gICAgLy8g44Kv44Oq44OD44Kv44Kk44OZ44Oz44OIXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAvLyBQQ+OBp+OBruWHpueQhlxuICAgICAgaWYgKG1lZGlhUXVlcnkubWF0Y2hlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDjg6Ljg5DjgqTjg6vjgafjga7lh6bnkIZcbiAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyDjgqLjgq/jg4bjgqPjg5bliKTlrppcbiAgICAgICAgdmFyIGlzQWN0aXZlID0gdGhpcy5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucyhhY3RpdmVDbGFzc05hbWUpO1xuXG4gICAgICAgIC8vIOS4gOW6puOAgeOBmeOBueOBpuOBruODoeODi+ODpeODvOOCkumWieOBmOOCi1xuICAgICAgICBhbGxUcmlnZ2VyLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgLy8g6auY44GV44KS5Y+W5b6X44GZ44KL6KaB57Sg77yI44Kv44Oq44OD44Kv44GX44Gf6KaB57Sg44Gu5a2Q44Oh44OL44Ol44O877yJXG4gICAgICAgICAgdmFyIHBhbmVsID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIC8vY29uc3QgbWF4SGVpZ2h0VmFsdWUgPSBnZXRTdHlsZShwYW5lbCwgJ21heEhlaWdodCcpO1xuICAgICAgICAgIGlmIChjaGlsZCAhPT0gX3RoaXMpIHtcbiAgICAgICAgICAgIGNoaWxkLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc05hbWUpO1xuICAgICAgICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyDjgqLjgq/jg4bjgqPjg5bjgq/jg6njgrnjga7lh6bnkIZcbiAgICAgICAgaXNBY3RpdmUgPyB0aGlzLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc05hbWUpIDogdGhpcy5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3NOYW1lKTtcbiAgICAgICAgLy8g5a2Q44Oh44OL44Ol44O844Gu6ZaL6ZaJ5Yem55CGXG4gICAgICAgIC8vIFRvZ2dsZSB0aGUgcGFuZWwgZWxlbWVudFxuICAgICAgICB2Y
1XIgcGFuZWwgPSB0aGlzLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgdmFyIG1heEhlaWdodFZhbHVlID0gZ2V0U3R5bGUocGFuZWwsICdtYXhIZWlnaHQnKTtcbiAgICAgICAgaWYgKG1heEhlaWdodFZhbHVlICE9PSAnMHB4Jykge1xuICAgICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IHBhbmVsLnNjcm9sbEhlaWdodCArICdweCc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBQQ+aZguOBruODm+ODkOODvOWHpueQhlxuICAgIC8vIGVsbS5wYXJlbnROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgLy8gICBpZiAobWVkaWFRdWVyeS5tYXRjaGVzKSB7XG4gICAgLy8gICAgIGVsbS5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoaG92ZXJDbGFzc05hbWUpO1xuICAgIC8vICAgICBlbG0ubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLm1heEhlaWdodCA9IGVsbS5uZXh0RWxlbWVudFNpYmxpbmcuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgICAvLyAgIH1cbiAgICAvLyB9KTtcbiAgICAvLyBlbG0ucGFyZW50Tm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgIC8vICAgaWYgKG1lZGlhUXVlcnkubWF0Y2hlcykge1xuICAgIC8vICAgICBlbG0ucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKGhvdmVyQ2xhc3NOYW1lKTtcbiAgICAvLyAgICAgZWxtLm5leHRFbGVtZW50U2libGluZy5zdHlsZS5tYXhIZWlnaHQgPSBudWxsO1xuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICB9KTtcbiAgLy8gd2luZG93IOODquOCteOCpOOCuuOBp+ODoeODi+ODpeODvOOCkuOCr+ODquOCouOBq+OBmeOCi+WHpueQhlxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgIGlmIChtZW1vcnlXaW5kb3dXaWR0aCAhPT0gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgIC8vIHdpbmRvdyDjga4gd2lkdGgg44KS5Y+W5b6X44GX55u044GZXG4gICAgICBtZW1vcnlXaW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgYWxsVHJpZ2dlci5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAvLyDlrZDjg6Hjg4vjg6Xjg7zjgpLplonjgZjjgotcbiAgICAgICAgZWwucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzTmFtZSk7XG4gICAgICAgIHZhciBwYW5lbCA9IGVsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgLy8g44OQ44O844Ks44O844KS6ZaJ44GY44KLXG4gICAgICB0aGlzLmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZS1tb2JpbGUtbWVudScpO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuXG4vKipcbiAqKiogIE1ha2VyIEFuaW1hdGlvbiAgKi9cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBtYXJrZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hcmtlci1hbmltYXRpb24nKTtcbiAgdmFyIHJvb3QgPSBudWxsO1xuICB2YXIgb2JzZXJ2ZXJBY3Rpb24gPSBmdW5jdGlvbiBvYnNlcnZlckFjdGlvbihlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIGVudHJ5LnRhcmdldC5jbGFzc0xpc3QuYWRkKCdpcy12aXNpYmxlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeS50YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtdmlzaWJsZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICB2YXIgb3B0aW9uc01hcmtlcnMgPSB7XG4gICAgcm9vdDogcm9vdCxcbiAgICByb290TWFyZ2luOiAnMHB4IDBweCAtMzAlJyAvLyDjg5Pjg6Xjg7zjg53jg7zjg4jjga7kuK3lv4PjgpLliKTlrprln7rmupbjgavjgZnjgotcbiAgfTtcblxuICB2YXIgc3RhcnRPYnNlcnZlID0gZnVuY3Rpb24gc3RhcnRPYnNlcnZlKHRhcmdldHMsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIob2JzZXJ2ZXJBY3Rpb24sIG9wdGlvbnMpO1xuICAgIHRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldCk7XG4gICAgfSk7XG4gIH07XG4gIHN0YXJ0T2JzZXJ2ZShtYXJrZXJzLCBvcHRpb25zTWFya2Vycyk7XG5cbiAgLyoqXG4gICAqKiogIE1vZGFsICAqL1xuICB2YXIgb3BlbkJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtbW9kYWwtb3BlbicpO1xuICBvcGVuQnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChidG4pIHtcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
1XIgbW9kYWxBdHRyaWJ1dGUgPSBidG4uZ2V0QXR0cmlidXRlKCdkYXRhLW1vZGFsJyk7XG4gICAgICB2YXIgbW9kYWxTaG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxBdHRyaWJ1dGUpO1xuICAgICAgbW9kYWxTaG93LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH0pO1xuICB9KTtcbiAgdmFyIGNsb3NlQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1tb2RhbC1jbG9zZScpO1xuICBjbG9zZUJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbiAoYnRuKSB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG1vZGFsID0gYnRuLmNsb3Nlc3QoJy5tb2RhbC1vdXRlcicpO1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgbW9kYWxPdXRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbC1vdXRlcicpO1xuICBtb2RhbE91dGVyLmZvckVhY2goZnVuY3Rpb24gKG91dGVyKSB7XG4gICAgb3V0ZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQuY2xvc2VzdCgnLm1vZGFsLWlubmVyJykgPT09IG51bGwpIHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pKCk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///701\n")}},__webpack_module_cache__={};function __webpack_require__(g){var l=__webpack_module_cache__[g];if(void 0!==l)return l.exports;var I=__webpack_module_cache__[g]={exports:{}};return __webpack_modules__[g](I,I.exports,__webpack_require__),I.exports}__webpack_require__.n=g=>{var l=g&&g.__esModule?()=>g.default:()=>g;return __webpack_require__.d(l,{a:l}),l},__webpack_require__.d=(g,l)=>{for(var I in l)__webpack_require__.o(l,I)&&!__webpack_require__.o(g,I)&&Object.defineProperty(g,I,{enumerable:!0,get:l[I]})},__webpack_require__.o=(g,l)=>Object.prototype.hasOwnProperty.call(g,l);var __webpack_exports__=__webpack_require__(701)})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.