PageSourceSearch

https://www.neuehouse.com/wp-content/themes/neuehouse/dist/neuehouse.min.js?ver=1764896743

js neuehouse.com collected 2026-10-02 03:58:47 UTC 248,363 bytes, 124 lines download raw bytes

vendor: 3,614 bytes, lines 1-88
1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// The module cache
3/******/ 	var installedModules = {};
4/******/
5/******/ 	// The require function
6/******/ 	function __webpack_require__(moduleId) {
7/******/
8/******/ 		// Check if module is in cache
9/******/ 		if(installedModules[moduleId]) {
10/******/ 			return installedModules[moduleId].exports;
11/******/ 		}
12/******/ 		// Create a new module (and put it into the cache)
13/******/ 		var module = installedModules[moduleId] = {
14/******/ 			i: moduleId,
15/******/ 			l: false,
16/******/ 			exports: {}
17/******/ 		};
18/******/
19/******/ 		// Execute the module function
20/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21/******/
22/******/ 		// Flag the module as loaded
23/******/ 		module.l = true;
24/******/
25/******/ 		// Return the exports of the module
26/******/ 		return module.exports;
27/******/ 	}
28/******/
29/******/
30/******/ 	// expose the modules object (__webpack_modules__)
31/******/ 	__webpack_require__.m = modules;
32/******/
33/******/ 	// expose the module cache
34/******/ 	__webpack_require__.c = installedModules;
35/******/
36/******/ 	// define getter function for harmony exports
37/******/ 	__webpack_require__.d = function(exports, name, getter) {
38/******/ 		if(!__webpack_require__.o(exports, name)) {
39/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
40/******/ 		}
41/******/ 	};
42/******/
43/******/ 	// define __esModule on exports
44/******/ 	__webpack_require__.r = function(exports) {
45/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
47/******/ 		}
48/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
49/******/ 	};
50/******/
51/******/ 	// create a fake namespace object
52/******/ 	// mode & 1: value is a module id, require it
53/******/ 	// mode & 2: merge all properties of value into the ns
54/******/ 	// mode & 4: return value when already ns object
55/******/ 	// mode & 8|1: behave like require
56/******/ 	__webpack_require__.t = function(value, mode) {
57/******/ 		if(mode & 1) value = __webpack_require__(value);
58/******/ 		if(mode & 8) return value;
59/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60/******/ 		var ns = Object.create(null);
61/******/ 		__webpack_require__.r(ns);
62/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
64/******/ 		return ns;
65/******/ 	};
66/******/
67/******/ 	// getDefaultExport function for compatibility with non-harmony modules
68/******/ 	__webpack_require__.n = function(module) {
69/******/ 		var getter = module && module.__esModule ?
70/******/ 			function getDefault() { return module['default']; } :
71/******/ 			function getModuleExports() { return module; };
72/******/ 		__webpack_require__.d(getter, 'a', getter);
73/******/ 		return getter;
74/******/ 	};
75/******/
76/******/ 	// Object.prototype.hasOwnProperty.call
77/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
78/******/
79/******/ 	// __webpack_public_path__
80/******/ 	__webpack_require__.p = "";
81/******/
82/******/
83/******/ 	// Load entry module and return exports
84/******/ 	return __webpack_require__(__webpack_require__.s = "./src/js/scripts.js");
85/******/ })
86/************************************************************************/
87/******/ ({
88
89/***/ "./src/js/lazyload.js":
90/*!****************************!*\
91  !*** ./src/js/lazyload.js ***!
92  \****************************/
93/*! no static exports found */
94/***/ (function(module, exports, __webpack_require__) {
95
96eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n// vanilla lazy load js version 17.8\n// https://github.com/verlok/vanilla-lazyload\n(function (global, factory) {\n  ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() :  true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : (undefined);\n})(this, function () {\n  'use strict';\n\n  function _extends() {\n    _extends = Object.assign || function (target) {\n      for (var i = 1; i < arguments.length; i++) {\n        var source = arguments[i];\n        for (var key in source) {\n          if (Object.prototype.hasOwnProperty.call(source, key)) {\n            target[key] = source[key];\n          }\n        }\n      }\n      return target;\n    };\n    return _extends.apply(this, arguments);\n  }\n  var runningOnBrowser = typeof window !== \"undefined\";\n  var isBot = runningOnBrowser && !(\"onscroll\" in window) || typeof navigator !== \"undefined\" && /(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent);\n  var supportsIntersectionObserver = runningOnBrowser && \"IntersectionObserver\" in window;\n  var supportsClassList = runningOnBrowser && \"classList\" in document.createElement(\"p\");\n  var isHiDpi = runningOnBrowser && window.devicePixelRatio > 1;\n  var defaultSettings = {\n    elements_selector: \".lazy\",\n    container: isBot || runningOnBrowser ? document : null,\n    threshold: 300,\n    thresholds: null,\n    data_src: \"src\",\n    data_srcset: \"srcset\",\n    data_sizes: \"sizes\",\n    data_bg: \"bg\",\n    data_bg_hidpi: \"bg-hidpi\",\n    data_bg_multi: \"bg-multi\",\n    data_bg_multi_hidpi: \"bg-multi-hidpi\",\n    data_bg_set: \"bg-set\",\n    data_poster: \"poster\",\n    class_applied: \"applied\",\n    class_loading: \"loading\",\n    class_loaded: \"loaded\",\n    class_error: \"error\",\n    class_entered: \"entered\",\n    class_exited: \"exited\",\n    unobserve_completed: true,\n    unobserve_entered: false,\n    cancel_on_exit: true,\n    callback_enter: null,\n    callback_exit: null,\n    callback_applied: null,\n    callback_loading: null,\n    callback_loaded: null,\n    callback_error: null,\n    callback_finish: null,\n    callback_cancel: null,\n    use_native: false,\n    restore_on_error: false\n  };\n  var getExtendedSettings = function getExtendedSettings(customSettings) {\n    return _extends({}, defaultSettings, customSettings);\n  };\n\n  /* Creates instance and notifies it through the window element */\n  var createInstance = function createInstance(classObj, options) {\n    var event;\n    var eventString = \"LazyLoad::Initialized\";\n    var instance = new classObj(options);\n    try {\n      // Works in modern browsers\n      event = new CustomEvent(eventString, {\n        detail: {\n          instance: instance\n        }\n      });\n    } catch (err) {\n      // Works in Internet Explorer (all versions)\n      event = document.createEvent(\"CustomEvent\");\n      event.initCustomEvent(eventString, false, false, {\n        instance: instance\n      });\n    }\n    window.dispatchEvent(event);\n  };\n  /* Auto initialization of one or more instances of LazyLoad, depending on the\n      options passed in (plain object or an array) */\n\n  var autoInitialize = function autoInitialize(classObj, options) {\n    if (!options) {\n      return;\n    }\n    if (!options.length) {\n      // Plain object\n      createInstance(classObj, options);\n    } else {\n      // Array of objects\n      for (var i = 0, optionsItem; optionsItem = options[i]; i += 1) {\n        createInstance(classObj, optionsItem);\n      }\n    }\n  };\n  var SRC = \"src\";\n  var SRCSET = \"srcset\";\n  var SIZES = \"sizes\";\n  var POSTER = \"poster\";\n  var ORIGINALS = \"llOriginalAttrs\";\n  var DATA = \"data\";\n  var statusLoading = \"loading\";\n  var statusLoaded = \"loaded\";\n  var statusApplied = \"applied\";\n  var statusEntered = \"entered\";\n  var statusError = \"error\";\n  var statusNative = \"native\";\n  var dataPrefix = \"data-\";\n  var statusDataName = \"ll-status\";\n  var getData = function getData(element, attribute) {\n    return element.getAttribute(dataPrefix + attribute);\n  };\n  var setData = function setData(element, attribute, value) {\n    var attrName = dataPrefix + attribute;\n    if (value === null) {\n      element.removeAttribute(attrName);\n      return;\n    }\n    element.setAttribute(attrName, value);\n  };\n  var getStatus = function getStatus(element) {\n    return getData(element, statusDataName);\n  };\n  var setStatus = function setStatus(element, status) {\n    return setData(element, statusDataName, status);\n  };\n  var resetStatus = function resetStatus(element) {\n    return setStatus(element, null);\n  };\n  var hasEmptyStatus = function hasEmptyStatus(element) {\n    return getStatus(element) === null;\n  };\n  var hasStatusLoading = function hasStatusLoading(element) {\n    return getStatus(element) === statusLoading;\n  };\n  var hasStatusError = function hasStatusError(element) {\n    return getStatus(element) === statusError;\n  };\n  var hasStatusNative = function hasStatusNative(element) {\n    return getStatus(element) === statusNative;\n  };\n  var statusesAfterLoading = [statusLoading, statusLoaded, statusApplied, statusError];\n  var hadStartedLoading = function hadStartedLoading(element) {\n    return statusesAfterLoading.
96indexOf(getStatus(element)) >= 0;\n  };\n  var safeCallback = function safeCallback(callback, arg1, arg2, arg3) {\n    if (!callback || typeof callback !== 'function') {\n      return;\n    }\n    if (arg3 !== undefined) {\n      callback(arg1, arg2, arg3);\n      return;\n    }\n    if (arg2 !== undefined) {\n      callback(arg1, arg2);\n      return;\n    }\n    callback(arg1);\n  };\n  var addClass = function addClass(element, className) {\n    if (supportsClassList) {\n      element.classList.add(className);\n      return;\n    }\n    element.className += (element.className ? \" \" : \"\") + className;\n  };\n  var removeClass = function removeClass(element, className) {\n    if (supportsClassList) {\n      element.classList.remove(className);\n      return;\n    }\n    element.className = element.className.replace(new RegExp(\"(^|\\\\s+)\" + className + \"(\\\\s+|$)\"), \" \").replace(/^\\s+/, \"\").replace(/\\s+$/, \"\");\n  };\n  var addTempImage = function addTempImage(element) {\n    element.llTempImage = document.createElement(\"IMG\");\n  };\n  var deleteTempImage = function deleteTempImage(element) {\n    delete element.llTempImage;\n  };\n  var getTempImage = function getTempImage(element) {\n    return element.llTempImage;\n  };\n  var unobserve = function unobserve(element, instance) {\n    if (!instance) return;\n    var observer = instance._observer;\n    if (!observer) return;\n    observer.unobserve(element);\n  };\n  var resetObserver = function resetObserver(observer) {\n    observer.disconnect();\n  };\n  var unobserveEntered = function unobserveEntered(element, settings, instance) {\n    if (settings.unobserve_entered) unobserve(element, instance);\n  };\n  var updateLoadingCount = function updateLoadingCount(instance, delta) {\n    if (!instance) return;\n    instance.loadingCount += delta;\n  };\n  var decreaseToLoadCount = function decreaseToLoadCount(instance) {\n    if (!instance) return;\n    instance.toLoadCount -= 1;\n  };\n  var setToLoadCount = function setToLoadCount(instance, value) {\n    if (!instance) return;\n    instance.toLoadCount = value;\n  };\n  var isSomethingLoading = function isSomethingLoading(instance) {\n    return instance.loadingCount > 0;\n  };\n  var haveElementsToLoad = function haveElementsToLoad(instance) {\n    return instance.toLoadCount > 0;\n  };\n  var getSourceTags = function getSourceTags(parentTag) {\n    var sourceTags = [];\n    for (var i = 0, childTag; childTag = parentTag.children[i]; i += 1) {\n      if (childTag.tagName === \"SOURCE\") {\n        sourceTags.push(childTag);\n      }\n    }\n    return sourceTags;\n  };\n  var forEachPictureSource = function forEachPictureSource(element, fn) {\n    var parent = element.parentNode;\n    if (!parent || parent.tagName !== \"PICTURE\") {\n      return;\n    }\n    var sourceTags = getSourceTags(parent);\n    sourceTags.forEach(fn);\n  };\n  var forEachVideoSource = function forEachVideoSource(element, fn) {\n    var sourceTags = getSourceTags(element);\n    sourceTags.forEach(fn);\n  };\n  var attrsSrc = [SRC];\n  var attrsSrcPoster = [SRC, POSTER];\n  var attrsSrcSrcsetSizes = [SRC, SRCSET, SIZES];\n  var attrsData = [DATA];\n  var hasOriginalAttrs = function hasOriginalAttrs(element) {\n    return !!element[ORIGINALS];\n  };\n  var getOriginalAttrs = function getOriginalAttrs(element) {\n    return element[ORIGINALS];\n  };\n  var deleteOriginalAttrs = function deleteOriginalAttrs(element) {\n    return delete element[ORIGINALS];\n  }; // ## SAVE ##\n\n  var setOriginalsObject = function setOriginalsObject(element, attributes) {\n    if (hasOriginalAttrs(element)) {\n      return;\n    }\n    var originals = {};\n    attributes.forEach(function (attribute) {\n      originals[attribute] = element.getAttribute(attribute);\n    });\n    element[ORIGINALS] = originals;\n  };\n  var saveOriginalBackgroundStyle = function saveOriginalBackgroundStyle(element) {\n    if (hasOriginalAttrs(element)) {\n      return;\n    }\n    element[ORIGINALS] = {\n      backgroundImage: element.style.backgroundImage\n    };\n  }; // ## RESTORE ##\n\n  var setOrResetAttribute = function setOrResetAttribute(element, attrName, value) {\n    if (!value) {\n      element.removeAttribute(attrName);\n      return;\n    }\n    element.setAttribute(attrName, value);\n  };\n  var restoreOriginalAttrs = function restoreOriginalAttrs(element, attributes) {\n    if (!hasOriginalAttrs(element)) {\n      return;\n    }\n    var originals = getOriginalAttrs(element);
96\n    attributes.forEach(function (attribute) {\n      setOrResetAttribute(element, attribute, originals[attribute]);\n    });\n  };\n  var restoreOriginalBgImage = function restoreOriginalBgImage(element) {\n    if (!hasOriginalAttrs(element)) {\n      return;\n    }\n    var originals = getOriginalAttrs(element);\n    element.style.backgroundImage = originals.backgroundImage;\n  };\n  var manageApplied = function manageApplied(element, settings, instance) {\n    addClass(element, settings.class_applied);\n    setStatus(element, statusApplied); // Instance is not provided when loading is called from static class\n\n    if (!instance) return;\n    if (settings.unobserve_completed) {\n      // Unobserve now because we can't do it on load\n      unobserve(element, settings);\n    }\n    safeCallback(settings.callback_applied, element, instance);\n  };\n  var manageLoading = function manageLoading(element, settings, instance) {\n    addClass(element, settings.class_loading);\n    setStatus(element, statusLoading); // Instance is not provided when loading is called from static class\n\n    if (!instance) return;\n    updateLoadingCount(instance, +1);\n    safeCallback(settings.callback_loading, element, instance);\n  };\n  var setAttributeIfValue = function setAttributeIfValue(element, attrName, value) {\n    if (!value) {\n      return;\n    }\n    element.setAttribute(attrName, value);\n  };\n  var setImageAttributes = function setImageAttributes(element, settings) {\n    setAttributeIfValue(element, SIZES, getData(element, settings.data_sizes));\n    setAttributeIfValue(element, SRCSET, getData(element, settings.data_srcset));\n    setAttributeIfValue(element, SRC, getData(element, settings.data_src));\n  };\n  var setSourcesImg = function setSourcesImg(imgEl, settings) {\n    forEachPictureSource(imgEl, function (sourceTag) {\n      setOriginalsObject(sourceTag, attrsSrcSrcsetSizes);\n      setImageAttributes(sourceTag, settings);\n    });\n    setOriginalsObject(imgEl, attrsSrcSrcsetSizes);\n    setImageAttributes(imgEl, settings);\n  };\n  var setSourcesIframe = function setSourcesIframe(iframe, settings) {\n    setOriginalsObject(iframe, attrsSrc);\n    setAttributeIfValue(iframe, SRC, getData(iframe, settings.data_src));\n  };\n  var setSourcesVideo = function setSourcesVideo(videoEl, settings) {\n    forEachVideoSource(videoEl, function (sourceEl) {\n      setOriginalsObject(sourceEl, attrsSrc);\n      setAttributeIfValue(sourceEl, SRC, getData(sourceEl, settings.data_src));\n    });\n    setOriginalsObject(videoEl, attrsSrcPoster);\n    setAttributeIfValue(videoEl, POSTER, getData(videoEl, settings.data_poster));\n    setAttributeIfValue(videoEl, SRC, getData(videoEl, settings.data_src));\n    videoEl.load();\n  };\n  var setSourcesObject = function setSourcesObject(object, settings) {\n    setOriginalsObject(object, attrsData);\n    setAttributeIfValue(object, DATA, getData(object, settings.data_src));\n  };\n  var setBackground = function setBackground(element, settings, instance) {\n    var bg1xValue = getData(element, settings.data_bg);\n    var bgHiDpiValue = getData(element, settings.data_bg_hidpi);\n    var bgDataValue = isHiDpi && bgHiDpiValue ? bgHiDpiValue : bg1xValue;\n    if (!bgDataValue) return;\n    element.style.backgroundImage = \"url(\\\"\".concat(bgDataValue, \"\\\")\");\n    getTempImage(element).setAttribute(SRC, bgDataValue);\n    manageLoading(element, settings, instance);\n  }; // NOTE: THE TEMP IMAGE TRICK CANNOT BE DONE WITH data-multi-bg\n  // BECAUSE INSIDE ITS VALUES MUST BE WRAPPED WITH URL() AND ONE OF THEM\n  // COULD BE A GRADIENT BACKGROUND IMAGE\n\n  var setMultiBackground = function setMultiBackground(element, settings, instance) {\n    var bg1xValue = getData(element, settings.data_bg_multi);\n    var bgHiDpiValue = getData(element, settings.data_bg_multi_hidpi);\n    var bgDataValue = isHiDpi && bgHiDpiValue ? bgHiDpiValue : bg1xValue;\n    if (!bgDataValue) {\n      return;\n    }\n    element.style.backgroundImage = bgDataValue;\n    manageApplied(element, settings, instance);\n  };
96\n  var setImgsetBackground = function setImgsetBackground(element, settings, instance) {\n    var bgImgSetDataValue = getData(element, settings.data_bg_set);\n    if (!bgImgSetDataValue) {\n      return;\n    }\n    var imgSetValues = bgImgSetDataValue.split(\"|\");\n    var bgImageValues = imgSetValues.map(function (value) {\n      return \"image-set(\".concat(value, \")\");\n    });\n    element.style.backgroundImage = bgImageValues.join(); // Temporary fix for Chromeium with the -webkit- prefix\n\n    if (element.style.backgroundImage === \"\") {\n      bgImageValues = imgSetValues.map(function (value) {\n        return \"-webkit-image-set(\".concat(value, \")\");\n      });\n      element.style.backgroundImage = bgImageValues.join();\n    }\n    manageApplied(element, settings, instance);\n  };\n  var setSourcesFunctions = {\n    IMG: setSourcesImg,\n    IFRAME: setSourcesIframe,\n    VIDEO: setSourcesVideo,\n    OBJECT: setSourcesObject\n  };\n  var setSourcesNative = function setSourcesNative(element, settings) {\n    var setSourcesFunction = setSourcesFunctions[element.tagName];\n    if (!setSourcesFunction) {\n      return;\n    }\n    setSourcesFunction(element, settings);\n  };\n  var setSources = function setSources(element, settings, instance) {\n    var setSourcesFunction = setSourcesFunctions[element.tagName];\n    if (!setSourcesFunction) {\n      return;\n    }\n    setSourcesFunction(element, settings);\n    manageLoading(element, settings, instance);\n  };\n  var elementsWithLoadEvent = [\"IMG\", \"IFRAME\", \"VIDEO\", \"OBJECT\"];\n  var hasLoadEvent = function hasLoadEvent(element) {\n    return elementsWithLoadEvent.indexOf(element.tagName) > -1;\n  };\n  var checkFinish = function checkFinish(settings, instance) {\n    if (instance && !isSomethingLoading(instance) && !haveElementsToLoad(instance)) {\n      safeCallback(settings.callback_finish, instance);\n    }\n  };\n  var addEventListener = function addEventListener(element, eventName, handler) {\n    element.addEventListener(eventName, handler);\n    element.llEvLisnrs[eventName] = handler;\n  };\n  var removeEventListener = function removeEventListener(element, eventName, handler) {\n    element.removeEventListener(eventName, handler);\n  };\n  var hasEventListeners = function hasEventListeners(element) {\n    return !!element.llEvLisnrs;\n  };\n  var addEventListeners = function addEventListeners(element, loadHandler, errorHandler) {\n    if (!hasEventListeners(element)) element.llEvLisnrs = {};\n    var loadEventName = element.tagName === \"VIDEO\" ? \"loadeddata\" : \"load\";\n    addEventListener(element, loadEventName, loadHandler);\n    addEventListener(element, \"error\", errorHandler);\n  };\n  var removeEventListeners = function removeEventListeners(element) {\n    if (!hasEventListeners(element)) {\n      return;\n    }\n    var eventListeners = element.llEvLisnrs;\n    for (var eventName in eventListeners) {\n      var handler = eventListeners[eventName];\n      removeEventListener(element, eventName, handler);\n    }\n    delete element.llEvLisnrs;\n  };\n  var doneHandler = function doneHandler(element, settings, instance) {\n    deleteTempImage(element);\n    updateLoadingCount(instance, -1);\n    decreaseToLoadCount(instance);\n    removeClass(element, settings.class_loading);\n    if (settings.unobserve_completed) {\n      unobserve(element, instance);\n    }\n  };\n  var loadHandler = function loadHandler(event, element, settings, instance) {\n    var goingNative = hasStatusNative(element);\n    doneHandler(element, settings, instance);\n    addClass(element, settings.class_loaded);\n    setStatus(element, statusLoaded);\n    safeCallback(settings.callback_loaded, element, instance);\n    if (!goingNative) checkFinish(settings, instance);\n  };\n  var errorHandler = function errorHandler(event, element, settings, instance) {\n    var goingNative = hasStatusNative(element);\n    doneHandler(element, settings, instance);\n    addClass(element, settings.class_error);\n    setStatus(element, statusError);\n    safeCallback(settings.callback_error, element, instance);\n    if (settings.restore_on_error) restoreOriginalAttrs(element, attrsSrcSrcsetSizes);\n    if (!goingNative) checkFinish(settings, instance);\n  };\n  var addOneShotEventListeners = function addOneShotEventListeners(element, settings, instance) {\n    var elementToListenTo = getTempImage(element) || element;\n    if (hasEventListeners(elementToListenTo)) {\n      // This happens when loading is retried twice\n      return;\n    }\n    var _loadHandler = function _loadHandler(event) {\n      loadHandler(event, element, settings, instance);\n      removeEventListeners(elementToListenTo);\n    };\n    var _errorHandler = function _errorHandler(event) {\n      errorHandler(event, element, settings, instance);\n      removeEventListeners(elementToListenTo);\n    };\n    addEventListeners(elementToListenTo, _loadHandler, _errorHandler);\n  };
96\n  var loadBackground = function loadBackground(element, settings, instance) {\n    addTempImage(element);\n    addOneShotEventListeners(element, settings, instance);\n    saveOriginalBackgroundStyle(element);\n    setBackground(element, settings, instance);\n    setMultiBackground(element, settings, instance);\n    setImgsetBackground(element, settings, instance);\n  };\n  var loadRegular = function loadRegular(element, settings, instance) {\n    addOneShotEventListeners(element, settings, instance);\n    setSources(element, settings, instance);\n  };\n  var load = function load(element, settings, instance) {\n    if (hasLoadEvent(element)) {\n      loadRegular(element, settings, instance);\n    } else {\n      loadBackground(element, settings, instance);\n    }\n  };\n  var loadNative = function loadNative(element, settings, instance) {\n    element.setAttribute(\"loading\", \"lazy\");\n    addOneShotEventListeners(element, settings, instance);\n    setSourcesNative(element, settings);\n    setStatus(element, statusNative);\n  };\n  var removeImageAttributes = function removeImageAttributes(element) {\n    element.removeAttribute(SRC);\n    element.removeAttribute(SRCSET);\n    element.removeAttribute(SIZES);\n  };\n  var resetSourcesImg = function resetSourcesImg(element) {\n    forEachPictureSource(element, function (sourceTag) {\n      removeImageAttributes(sourceTag);\n    });\n    removeImageAttributes(element);\n  };\n  var restoreImg = function restoreImg(imgEl) {\n    forEachPictureSource(imgEl, function (sourceEl) {\n      restoreOriginalAttrs(sourceEl, attrsSrcSrcsetSizes);\n    });\n    restoreOriginalAttrs(imgEl, attrsSrcSrcsetSizes);\n  };\n  var restoreVideo = function restoreVideo(videoEl) {\n    forEachVideoSource(videoEl, function (sourceEl) {\n      restoreOriginalAttrs(sourceEl, attrsSrc);\n    });\n    restoreOriginalAttrs(videoEl, attrsSrcPoster);\n    videoEl.load();\n  };\n  var restoreIframe = function restoreIframe(iframeEl) {\n    restoreOriginalAttrs(iframeEl, attrsSrc);\n  };\n  var restoreObject = function restoreObject(objectEl) {\n    restoreOriginalAttrs(objectEl, attrsData);\n  };\n  var restoreFunctions = {\n    IMG: restoreImg,\n    IFRAME: restoreIframe,\n    VIDEO: restoreVideo,\n    OBJECT: restoreObject\n  };\n  var restoreAttributes = function restoreAttributes(element) {\n    var restoreFunction = restoreFunctions[element.tagName];\n    if (!restoreFunction) {\n      restoreOriginalBgImage(element);\n      return;\n    }\n    restoreFunction(element);\n  };\n  var resetClasses = function resetClasses(element, settings) {\n    if (hasEmptyStatus(element) || hasStatusNative(element)) {\n      return;\n    }\n    removeClass(element, settings.class_entered);\n    removeClass(element, settings.class_exited);\n    removeClass(element, settings.class_applied);\n    removeClass(element, settings.class_loading);\n    removeClass(element, settings.class_loaded);\n    removeClass(element, settings.class_error);\n  };\n  var restore = function restore(element, settings) {\n    restoreAttributes(element);\n    resetClasses(element, settings);\n    resetStatus(element);\n    deleteOriginalAttrs(element);\n  };\n  var cancelLoading = function cancelLoading(element, entry, settings, instance) {\n    if (!settings.cancel_on_exit) return;\n    if (!hasStatusLoading(element)) return;\n    if (element.tagName !== \"IMG\") return; //Works only on images\n\n    removeEventListeners(element);\n    resetSourcesImg(element);\n    restoreImg(element);\n    removeClass(element, settings.class_loading);\n    updateLoadingCount(instance, -1);\n    resetStatus(element);\n    safeCallback(settings.callback_cancel, element, entry, instance);\n  };\n  var onEnter = function onEnter(element, entry, settings, instance) {\n    var dontLoad = hadStartedLoading(element);\n    /* Save status\n    before setting it, to prevent loading it again. Fixes #526. */\n\n    setStatus(element, statusEntered);\n    addClass(element, settings.class_entered);\n    removeClass(element, settings.class_exited);\n    unobserveEntered(element, settings, instance);\n    safeCallback(settings.callback_enter, element, entry, instance);\n    if (dontLoad) return;\n    load(element, settings, instance);\n  };\n  var onExit = function onExit(element, entry, settings, instance) {\n    if (hasEmptyStatus(element)) return; //Ignore the first pass, at landing\n\n    addClass(element, settings.class_exited);\n    cancelLoading(element, entry, settings, instance);\n    safeCallback(settings.callback_exit, element, entry, instance);\n  };\n  var tagsWithNativeLazy = [\"IMG\", \"IFRAME\", \"VIDEO\"];\n  var shouldUseNative = function shouldUseNative(settings) {\n    return settings.use_native && \"loading\" in HTMLImageElement.prototype;\n  };\n  var loadAllNative = function loadAllNative(elements, settings, instance) {\n    elements.forEac
96h(function (element) {\n      if (tagsWithNativeLazy.indexOf(element.tagName) === -1) {\n        return;\n      }\n      loadNative(element, settings, instance);\n    });\n    setToLoadCount(instance, 0);\n  };\n  var isIntersecting = function isIntersecting(entry) {\n    return entry.isIntersecting || entry.intersectionRatio > 0;\n  };\n  var getObserverSettings = function getObserverSettings(settings) {\n    return {\n      root: settings.container === document ? null : settings.container,\n      rootMargin: settings.thresholds || settings.threshold + \"px\"\n    };\n  };\n  var intersectionHandler = function intersectionHandler(entries, settings, instance) {\n    entries.forEach(function (entry) {\n      return isIntersecting(entry) ? onEnter(entry.target, entry, settings, instance) : onExit(entry.target, entry, settings, instance);\n    });\n  };\n  var observeElements = function observeElements(observer, elements) {\n    elements.forEach(function (element) {\n      observer.observe(element);\n    });\n  };\n  var updateObserver = function updateObserver(observer, elementsToObserve) {\n    resetObserver(observer);\n    observeElements(observer, elementsToObserve);\n  };\n  var setObserver = function setObserver(settings, instance) {\n    if (!supportsIntersectionObserver || shouldUseNative(settings)) {\n      return;\n    }\n    instance._observer = new IntersectionObserver(function (entries) {\n      intersectionHandler(entries, settings, instance);\n    }, getObserverSettings(settings));\n  };\n  var toArray = function toArray(nodeSet) {\n    return Array.prototype.slice.call(nodeSet);\n  };\n  var queryElements = function queryElements(settings) {\n    return settings.container.querySelectorAll(settings.elements_selector);\n  };\n  var excludeManagedElements = function excludeManagedElements(elements) {\n    return toArray(elements).filter(hasEmptyStatus);\n  };\n  var hasError = function hasError(element) {\n    return hasStatusError(element);\n  };\n  var filterErrorElements = function filterErrorElements(elements) {\n    return toArray(elements).filter(hasError);\n  };\n  var getElementsToLoad = function getElementsToLoad(elements, settings) {\n    return excludeManagedElements(elements || queryElements(settings));\n  };\n  var retryLazyLoad = function retryLazyLoad(settings, instance) {\n    var errorElements = filterErrorElements(queryElements(settings));\n    errorElements.forEach(function (element) {\n      removeClass(element, settings.class_error);\n      resetStatus(element);\n    });\n    instance.update();\n  };\n  var setOnlineCheck = function setOnlineCheck(settings, instance) {\n    if (!runningOnBrowser) {\n      return;\n    }\n    instance._onlineHandler = function () {\n      retryLazyLoad(settings, instance);\n    };\n    window.addEventListener(\"online\", instance._onlineHandler);\n  };\n  var resetOnlineCheck = function resetOnlineCheck(instance) {\n    if (!runningOnBrowser) {\n      return;\n    }\n    window.removeEventListener(\"online\", instance._onlineHandler);\n  };\n  var LazyLoad = function LazyLoad(customSettings, elements) {\n    var settings = getExtendedSettings(customSettings);\n    this._settings = settings;\n    this.loadingCount = 0;\n    setObserver(settings, this);\n    setOnlineCheck(settings, this);\n    this.update(elements);\n  };\n  LazyLoad.prototype = {\n    update: function update(givenNodeset) {\n      var settings = this._settings;\n      var elementsToLoad = getElementsToLoad(givenNodeset, settings);\n      setToLoadCount(this, elementsToLoad.length);\n      if (isBot || !supportsIntersectionObserver) {\n        this.loadAll(elementsToLoad);\n        return;\n      }\n      if (shouldUseNative(settings)) {\n        loadAllNative(elementsToLoad, settings, this);\n        return;\n      }\n      updateObserver(this._observer, elementsToLoad);\n    },\n    destroy: function destroy() {\n      // Observer\n      if (this._observer) {\n        this._observer.disconnect();\n      } // Clean handlers\n\n      resetOnlineCheck(this); // Clean custom attributes on elements\n\n      queryElements(this._settings).forEac
96h(function (element) {\n        deleteOriginalAttrs(element);\n      }); // Delete all internal props\n\n      delete this._observer;\n      delete this._settings;\n      delete this._onlineHandler;\n      delete this.loadingCount;\n      delete this.toLoadCount;\n    },\n    loadAll: function loadAll(elements) {\n      var _this = this;\n      var settings = this._settings;\n      var elementsToLoad = getElementsToLoad(elements, settings);\n      elementsToLoad.forEach(function (element) {\n        unobserve(element, _this);\n        load(element, settings, _this);\n      });\n    },\n    restoreAll: function restoreAll() {\n      var settings = this._settings;\n      queryElements(settings).forEach(function (element) {\n        restore(element, settings);\n      });\n    }\n  };\n  LazyLoad.load = function (element, customSettings) {\n    var settings = getExtendedSettings(customSettings);\n    load(element, settings);\n  };\n  LazyLoad.resetStatus = function (element) {\n    resetStatus(element);\n  }; // Automatic instances creation if required (useful for async script loading)\n\n  if (runningOnBrowser) {\n    autoInitialize(LazyLoad, window.lazyLoadOptions);\n  }\n  return LazyLoad;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvbGF6eWxvYWQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvanMvbGF6eWxvYWQuanM/NDQ4YSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG4vLyB2YW5pbGxhIGxhenkgbG9hZCBqcyB2ZXJzaW9uIDE3Ljhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJsb2svdmFuaWxsYS1sYXp5bG9hZFxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgKHR5cGVvZiBleHBvcnRzID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoZXhwb3J0cykpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDogdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDogKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkxhenlMb2FkID0gZmFjdG9yeSgpKTtcbn0pKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2Y
96XIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbiAgdmFyIHJ1bm5pbmdPbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuICB2YXIgaXNCb3QgPSBydW5uaW5nT25Ccm93c2VyICYmICEoXCJvbnNjcm9sbFwiIGluIHdpbmRvdykgfHwgdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiAvKGdsZXxpbmd8cm8pYm90fGNyYXdsfHNwaWRlci9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIHZhciBzdXBwb3J0c0ludGVyc2VjdGlvbk9ic2VydmVyID0gcnVubmluZ09uQnJvd3NlciAmJiBcIkludGVyc2VjdGlvbk9ic2VydmVyXCIgaW4gd2luZG93O1xuICB2YXIgc3VwcG9ydHNDbGFzc0xpc3QgPSBydW5uaW5nT25Ccm93c2VyICYmIFwiY2xhc3NMaXN0XCIgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gIHZhciBpc0hpRHBpID0gcnVubmluZ09uQnJvd3NlciAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA+IDE7XG4gIHZhciBkZWZhdWx0U2V0dGluZ3MgPSB7XG4gICAgZWxlbWVudHNfc2VsZWN0b3I6IFwiLmxhenlcIixcbiAgICBjb250YWluZXI6IGlzQm90IHx8IHJ1bm5pbmdPbkJyb3dzZXIgPyBkb2N1bWVudCA6IG51bGwsXG4gICAgdGhyZXNob2xkOiAzMDAsXG4gICAgdGhyZXNob2xkczogbnVsbCxcbiAgICBkYXRhX3NyYzogXCJzcmNcIixcbiAgICBkYXRhX3NyY3NldDogXCJzcmNzZXRcIixcbiAgICBkYXRhX3NpemVzOiBcInNpemVzXCIsXG4gICAgZGF0YV9iZzogXCJiZ1wiLFxuICAgIGRhdGFfYmdfaGlkcGk6IFwiYmctaGlkcGlcIixcbiAgICBkYXRhX2JnX211bHRpOiBcImJnLW11bHRpXCIsXG4gICAgZGF0YV9iZ19tdWx0aV9oaWRwaTogXCJiZy1tdWx0aS1oaWRwaVwiLFxuICAgIGRhdGFfYmdfc2V0OiBcImJnLXNldFwiLFxuICAgIGRhdGFfcG9zdGVyOiBcInBvc3RlclwiLFxuICAgIGNsYXNzX2FwcGxpZWQ6IFwiYXBwbGllZFwiLFxuICAgIGNsYXNzX2xvYWRpbmc6IFwibG9hZGluZ1wiLFxuICAgIGNsYXNzX2xvYWRlZDogXCJsb2FkZWRcIixcbiAgICBjbGFzc19lcnJvcjogXCJlcnJvclwiLFxuICAgIGNsYXNzX2VudGVyZWQ6IFwiZW50ZXJlZFwiLFxuICAgIGNsYXNzX2V4aXRlZDogXCJleGl0ZWRcIixcbiAgICB1bm9ic2VydmVfY29tcGxldGVkOiB0cnVlLFxuICAgIHVub2JzZXJ2ZV9lbnRlcmVkOiBmYWxzZSxcbiAgICBjYW5jZWxfb25fZXhpdDogdHJ1ZSxcbiAgICBjYWxsYmFja19lbnRlcjogbnVsbCxcbiAgICBjYWxsYmFja19leGl0OiBudWxsLFxuICAgIGNhbGxiYWNrX2FwcGxpZWQ6IG51bGwsXG4gICAgY2FsbGJhY2tfbG9hZGluZzogbnVsbCxcbiAgICBjYWxsYmFja19sb2FkZWQ6IG51bGwsXG4gICAgY2FsbGJhY2tfZXJyb3I6IG51bGwsXG4gICAgY2FsbGJhY2tfZmluaXNoOiBudWxsLFxuICAgIGNhbGxiYWNrX2NhbmNlbDogbnVsbCxcbiAgICB1c2VfbmF0aXZlOiBmYWxzZSxcbiAgICByZXN0b3JlX29uX2Vycm9yOiBmYWxzZVxuICB9O1xuICB2YXIgZ2V0RXh0ZW5kZWRTZXR0aW5ncyA9IGZ1bmN0aW9uIGdldEV4dGVuZGVkU2V0dGluZ3MoY3VzdG9tU2V0dGluZ3MpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIGRlZmF1bHRTZXR0aW5ncywgY3VzdG9tU2V0dGluZ3MpO1xuICB9O1xuXG4gIC8qIENyZWF0ZXMgaW5zdGFuY2UgYW5kIG5vdGlmaWVzIGl0IHRocm91Z2ggdGhlIHdpbmRvdyBlbGVtZW50ICovXG4gIHZhciBjcmVhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGNsYXNzT2JqLCBvcHRpb25zKSB7XG4gICAgdmFyIGV2ZW50O1xuICAgIHZhciBldmVudFN0cmluZyA9IFwiTGF6eUxvYWQ6OkluaXRpYWxpemVkXCI7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IGNsYXNzT2JqKG9wdGlvbnMpO1xuICAgIHRyeSB7XG4gICAgICAvLyBXb3JrcyBpbiBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgIGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50U3RyaW5nLCB7XG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFdvcmtzIGluIEludGVybmV0IEV4cGxvcmVyIChhbGwgdmVyc2lvbnMpXG4gICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gICAgICBldmVudC5pbml0Q3VzdG9tRXZlbnQoZXZlbnRTdHJpbmcsIGZhbHNlLCBmYWxzZSwge1xuICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH07XG4gIC8qIEF1dG8gaW5pdGlhbGl6YXRpb24gb2Ygb25lIG9y
96IG1vcmUgaW5zdGFuY2VzIG9mIExhenlMb2FkLCBkZXBlbmRpbmcgb24gdGhlXG4gICAgICBvcHRpb25zIHBhc3NlZCBpbiAocGxhaW4gb2JqZWN0IG9yIGFuIGFycmF5KSAqL1xuXG4gIHZhciBhdXRvSW5pdGlhbGl6ZSA9IGZ1bmN0aW9uIGF1dG9Jbml0aWFsaXplKGNsYXNzT2JqLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vIFBsYWluIG9iamVjdFxuICAgICAgY3JlYXRlSW5zdGFuY2UoY2xhc3NPYmosIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcnJheSBvZiBvYmplY3RzXG4gICAgICBmb3IgKHZhciBpID0gMCwgb3B0aW9uc0l0ZW07IG9wdGlvbnNJdGVtID0gb3B0aW9uc1tpXTsgaSArPSAxKSB7XG4gICAgICAgIGNyZWF0ZUluc3RhbmNlKGNsYXNzT2JqLCBvcHRpb25zSXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgU1JDID0gXCJzcmNcIjtcbiAgdmFyIFNSQ1NFVCA9IFwic3Jjc2V0XCI7XG4gIHZhciBTSVpFUyA9IFwic2l6ZXNcIjtcbiAgdmFyIFBPU1RFUiA9IFwicG9zdGVyXCI7XG4gIHZhciBPUklHSU5BTFMgPSBcImxsT3JpZ2luYWxBdHRyc1wiO1xuICB2YXIgREFUQSA9IFwiZGF0YVwiO1xuICB2YXIgc3RhdHVzTG9hZGluZyA9IFwibG9hZGluZ1wiO1xuICB2YXIgc3RhdHVzTG9hZGVkID0gXCJsb2FkZWRcIjtcbiAgdmFyIHN0YXR1c0FwcGxpZWQgPSBcImFwcGxpZWRcIjtcbiAgdmFyIHN0YXR1c0VudGVyZWQgPSBcImVudGVyZWRcIjtcbiAgdmFyIHN0YXR1c0Vycm9yID0gXCJlcnJvclwiO1xuICB2YXIgc3RhdHVzTmF0aXZlID0gXCJuYXRpdmVcIjtcbiAgdmFyIGRhdGFQcmVmaXggPSBcImRhdGEtXCI7XG4gIHZhciBzdGF0dXNEYXRhTmFtZSA9IFwibGwtc3RhdHVzXCI7XG4gIHZhciBnZXREYXRhID0gZnVuY3Rpb24gZ2V0RGF0YShlbGVtZW50LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoZGF0YVByZWZpeCArIGF0dHJpYnV0ZSk7XG4gIH07XG4gIHZhciBzZXREYXRhID0gZnVuY3Rpb24gc2V0RGF0YShlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgdmFyIGF0dHJOYW1lID0gZGF0YVByZWZpeCArIGF0dHJpYnV0ZTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbHVlKTtcbiAgfTtcbiAgdmFyIGdldFN0YXR1cyA9IGZ1bmN0aW9uIGdldFN0YXR1cyhlbGVtZW50KSB7XG4gICAgcmV0dXJuIGdldERhdGEoZWxlbWVudCwgc3RhdHVzRGF0YU5hbWUpO1xuICB9O1xuICB2YXIgc2V0U3RhdHVzID0gZnVuY3Rpb24gc2V0U3RhdHVzKGVsZW1lbnQsIHN0YXR1cykge1xuICAgIHJldHVybiBzZXREYXRhKGVsZW1lbnQsIHN0YXR1c0RhdGFOYW1lLCBzdGF0dXMpO1xuICB9O1xuICB2YXIgcmVzZXRTdGF0dXMgPSBmdW5jdGlvbiByZXNldFN0YXR1cyhlbGVtZW50KSB7XG4gICAgcmV0dXJuIHNldFN0YXR1cyhlbGVtZW50LCBudWxsKTtcbiAgfTtcbiAgdmFyIGhhc0VtcHR5U3RhdHVzID0gZnVuY3Rpb24gaGFzRW1wdHlTdGF0dXMoZWxlbWVudCkge1xuICAgIHJldHVybiBnZXRTdGF0dXMoZWxlbWVudCkgPT09IG51bGw7XG4gIH07XG4gIHZhciBoYXNTdGF0dXNMb2FkaW5nID0gZnVuY3Rpb24gaGFzU3RhdHVzTG9hZGluZyhlbGVtZW50KSB7XG4gICAgcmV0dXJuIGdldFN0YXR1cyhlbGVtZW50KSA9PT0gc3RhdHVzTG9hZGluZztcbiAgfTtcbiAgdmFyIGhhc1N0YXR1c0Vycm9yID0gZnVuY3Rpb24gaGFzU3RhdHVzRXJyb3IoZWxlbWVudCkge1xuICAgIHJldHVybiBnZXRTdGF0dXMoZWxlbWVudCkgPT09IHN0YXR1c0Vycm9yO1xuICB9O1xuICB2YXIgaGFzU3RhdHVzTmF0aXZlID0gZnVuY3Rpb24gaGFzU3RhdHVzTmF0aXZlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0U3RhdHVzKGVsZW1lbnQpID09PSBzdGF0dXNOYXRpdmU7XG4gIH07XG4gIHZhciBzdGF0dXNlc0FmdGVyTG9hZGluZyA9IFtzdGF0dXNMb2FkaW5nLCBzdGF0dXNMb2FkZWQsIHN0YXR1c0FwcGxpZWQsIHN0YXR1c0Vycm9yXTtcbiAgdmFyIGhhZFN0YXJ0ZWRMb2FkaW5nID0gZnVuY3Rpb24gaGFkU3RhcnRlZExvYWRpbmcoZWxlbWVudCkge1xuICAgIHJldHVybiBzdGF0dXNlc0FmdGVyTG9hZGluZy5pbmRleE9mKGdldFN0YXR1cyhlbGVtZW50KSkgPj0gMDtcbiAgfTtcbiAgdmFyIHNhZmVDYWxsYmFjayA9IGZ1bmN0aW9uIHNhZmVDYWxsYmFjayhjYWxsYmFjaywgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmICghY2FsbGJhY2sgfHwgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhcmczICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbGxiYWNrKGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYXJnMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYWxsYmFjayhhcmcxLCBhcmcyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGJhY2soYXJnMSk7XG4gIH07XG4gIHZhciBhZGRDbGFzcyA9IGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgIGlmIChzdXBwb3J0c0NsYXNzTGlzdCkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9IChlbGVtZW50LmNsYXNzTmFtZSA/IFwiIFwiIDogXCJcIikgKyBjbGFzc05hbWU7XG4gIH07XG4gIHZhciByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgIGlmIChzdXBwb3J0c0NsYXNzTGlzdCkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58XFxcXHMrKVwiICsgY2xhc3NOYW1lICsgXCIoXFxcXHMrfCQpXCIpLCBcIiBcIikucmVwbGFjZSgvXlxccysvLCBcIlwiKS5yZXBsYWNlKC9cXHMrJC8sIFwiXCIpO1xuICB9O1xuICB2YXIgYWRkVGVtcEltYWdlID0gZnVuY3Rpb24gYWRkVGVtcEltYWdlKGVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmxsVGVtcEltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklNR1wiKTtcbiAgfTtcbiAgdmFyIGRlbGV0ZVRlbXBJbWFnZSA9IGZ1bmN0aW9uIGRlbGV0ZVRlbXBJbWFnZShlbGVtZW50KSB7XG4gICAgZGVsZXRlIGVsZW1lbnQubGxUZW1wSW1hZ2U7XG4gIH07XG4gIHZhciBnZXRUZW1wSW1hZ2UgPSBmdW5jdGlvbiBnZXRUZW1wSW1hZ2UoZWxlbWVudCkge1xuICAgIHJldHVybi
96BlbGVtZW50LmxsVGVtcEltYWdlO1xuICB9O1xuICB2YXIgdW5vYnNlcnZlID0gZnVuY3Rpb24gdW5vYnNlcnZlKGVsZW1lbnQsIGluc3RhbmNlKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICAgIHZhciBvYnNlcnZlciA9IGluc3RhbmNlLl9vYnNlcnZlcjtcbiAgICBpZiAoIW9ic2VydmVyKSByZXR1cm47XG4gICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnQpO1xuICB9O1xuICB2YXIgcmVzZXRPYnNlcnZlciA9IGZ1bmN0aW9uIHJlc2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH07XG4gIHZhciB1bm9ic2VydmVFbnRlcmVkID0gZnVuY3Rpb24gdW5vYnNlcnZlRW50ZXJlZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoc2V0dGluZ3MudW5vYnNlcnZlX2VudGVyZWQpIHVub2JzZXJ2ZShlbGVtZW50LCBpbnN0YW5jZSk7XG4gIH07XG4gIHZhciB1cGRhdGVMb2FkaW5nQ291bnQgPSBmdW5jdGlvbiB1cGRhdGVMb2FkaW5nQ291bnQoaW5zdGFuY2UsIGRlbHRhKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICAgIGluc3RhbmNlLmxvYWRpbmdDb3VudCArPSBkZWx0YTtcbiAgfTtcbiAgdmFyIGRlY3JlYXNlVG9Mb2FkQ291bnQgPSBmdW5jdGlvbiBkZWNyZWFzZVRvTG9hZENvdW50KGluc3RhbmNlKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICAgIGluc3RhbmNlLnRvTG9hZENvdW50IC09IDE7XG4gIH07XG4gIHZhciBzZXRUb0xvYWRDb3VudCA9IGZ1bmN0aW9uIHNldFRvTG9hZENvdW50KGluc3RhbmNlLCB2YWx1ZSkge1xuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcbiAgICBpbnN0YW5jZS50b0xvYWRDb3VudCA9IHZhbHVlO1xuICB9O1xuICB2YXIgaXNTb21ldGhpbmdMb2FkaW5nID0gZnVuY3Rpb24gaXNTb21ldGhpbmdMb2FkaW5nKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmxvYWRpbmdDb3VudCA+IDA7XG4gIH07XG4gIHZhciBoYXZlRWxlbWVudHNUb0xvYWQgPSBmdW5jdGlvbiBoYXZlRWxlbWVudHNUb0xvYWQoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UudG9Mb2FkQ291bnQgPiAwO1xuICB9O1xuICB2YXIgZ2V0U291cmNlVGFncyA9IGZ1bmN0aW9uIGdldFNvdXJjZVRhZ3MocGFyZW50VGFnKSB7XG4gICAgdmFyIHNvdXJjZVRhZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgY2hpbGRUYWc7IGNoaWxkVGFnID0gcGFyZW50VGFnLmNoaWxkcmVuW2ldOyBpICs9IDEpIHtcbiAgICAgIGlmIChjaGlsZFRhZy50YWdOYW1lID09PSBcIlNPVVJDRVwiKSB7XG4gICAgICAgIHNvdXJjZVRhZ3MucHVzaChjaGlsZFRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VUYWdzO1xuICB9O1xuICB2YXIgZm9yRWFjaFBpY3R1cmVTb3VyY2UgPSBmdW5jdGlvbiBmb3JFYWNoUGljdHVyZVNvdXJjZShlbGVtZW50LCBmbikge1xuICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50LnRhZ05hbWUgIT09IFwiUElDVFVSRVwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzb3VyY2VUYWdzID0gZ2V0U291cmNlVGFncyhwYXJlbnQpO1xuICAgIHNvdXJjZVRhZ3MuZm9yRWFjaChmbik7XG4gIH07XG4gIHZhciBmb3JFYWNoVmlkZW9Tb3VyY2UgPSBmdW5jdGlvbiBmb3JFYWNoVmlkZW9Tb3VyY2UoZWxlbWVudCwgZm4pIHtcbiAgICB2YXIgc291cmNlVGFncyA9IGdldFNvdXJjZVRhZ3MoZWxlbWVudCk7XG4gICAgc291cmNlVGFncy5mb3JFYWNoKGZuKTtcbiAgfTtcbiAgdmFyIGF0dHJzU3JjID0gW1NSQ107XG4gIHZhciBhdHRyc1NyY1Bvc3RlciA9IFtTUkMsIFBPU1RFUl07XG4gIHZhciBhdHRyc1NyY1NyY3NldFNpemVzID0gW1NSQywgU1JDU0VULCBTSVpFU107XG4gIHZhciBhdHRyc0RhdGEgPSBbREFUQV07XG4gIHZhciBoYXNPcmlnaW5hbEF0dHJzID0gZnVuY3Rpb24gaGFzT3JpZ2luYWxBdHRycyhlbGVtZW50KSB7XG4gICAgcmV0dXJuICEhZWxlbWVudFtPUklHSU5BTFNdO1xuICB9O1xuICB2YXIgZ2V0T3JpZ2luYWxBdHRycyA9IGZ1bmN0aW9uIGdldE9yaWdpbmFsQXR0cnMoZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50W09SSUdJTkFMU107XG4gIH07XG4gIHZhciBkZWxldGVPcmlnaW5hbEF0dHJzID0gZnVuY3Rpb24gZGVsZXRlT3JpZ2luYWxBdHRycyhlbGVtZW50KSB7XG4gICAgcmV0dXJuIGRlbGV0ZSBlbGVtZW50W09SSUdJTkFMU107XG4gIH07IC8vICMjIFNBVkUgIyNcblxuICB2YXIgc2V0T3JpZ2luYWxzT2JqZWN0ID0gZnVuY3Rpb24gc2V0T3JpZ2luYWxzT2JqZWN0KGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAoaGFzT3JpZ2luYWxBdHRycyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3JpZ2luYWxzID0ge307XG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgIG9yaWdpbmFsc1thdHRyaWJ1dGVdID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICB9KTtcbiAgICBlbGVtZW50W09SSUdJTkFMU10gPSBvcmlnaW5hbHM7XG4gIH07XG4gIHZhciBzYXZlT3JpZ2luYWxCYWNrZ3JvdW5kU3R5bGUgPSBmdW5jdGlvbiBzYXZlT3JpZ2luYWxCYWNrZ3JvdW5kU3R5bGUoZWxlbWVudCkge1xuICAgIGlmIChoYXNPcmlnaW5hbEF0dHJzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnRbT1JJR0lOQUxTXSA9IHtcbiAgICAgIGJhY2tncm91bmRJbWFnZTogZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2VcbiAgICB9O1xuICB9OyAvLyAjIyBSRVNUT1JFICMjXG5cbiAgdmFyIHNldE9yUmVzZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBzZXRPclJlc2V0QXR0cmlidXRlKGVsZW1lbnQsIGF0dHJOYW1lLCB2YWx1ZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbHVlKTtcbiAgfTtcbiAgdmFyIHJlc3RvcmVPcmlnaW5hbEF0dHJzID0gZnVuY3Rpb24gcmVzdG9yZU9yaWdpbmFsQXR0cnMoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICAgIGlmICghaGFzT3JpZ2luYWxBdHRycyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3JpZ2luYWxzID0gZ2V0T3JpZ2luYWxBdHRycyhlbGVtZW50KTtcbiAgICBhdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgc2V0T3JSZXNldEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGUsIG9yaWdpbmFsc1thdHRyaWJ1dGVdKTtcbiAgICB9KTtcbiAgfTtcbiAgdmFyIHJlc3RvcmVPcmlnaW5hbEJnSW1hZ2UgPSBmdW5jdGlvbiByZXN0b3JlT3JpZ2luYWxCZ0ltYWdlKGVsZW1lbnQpIHtcbiAgICBpZiAoIWhhc09yaWdpbmFsQXR0cnMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9yaWdpbmFscyA9IGdldE9yaWdpbmFsQXR0cnMoZWxlbWVudCk7XG4gICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBvcmlnaW5hbHMuYmFja2dyb3VuZEltYWdlO1xuICB9O1xuICB2YXIgbWFuYWdlQXBwbGllZCA9IGZ1bmN0aW9uIG1hbmFnZUFwcGxpZWQoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfYXBwbGllZCk7XG4gICAgc2V0U3RhdHVzKGVsZW1lbnQsIHN0YXR1c0FwcGxpZWQpOyAvLyBJbnN0YW5jZSBpcyBub3QgcHJvdmlkZWQgd2hlbiBsb2FkaW5nIGlzIGNhbGxlZCBmcm9tIHN0YXRpYyBjbGFzc1xuXG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICAgIGlmIChzZXR0aW5ncy51bm9ic2VydmVfY29tcGxldGVkKSB7XG4gICAgICAvLyBVbm9ic2VydmUgbm93IGJlY2F1c2Ugd2UgY2FuJ3QgZG8gaXQgb24gbG9hZFxuICAgICAgdW5vYnNlcnZlKGVsZW1lbnQsIHNldHRpbmdzKTtcbiAgICB9XG4gICAgc2FmZUNhbGxiYWNrKHNldH
96RpbmdzLmNhbGxiYWNrX2FwcGxpZWQsIGVsZW1lbnQsIGluc3RhbmNlKTtcbiAgfTtcbiAgdmFyIG1hbmFnZUxvYWRpbmcgPSBmdW5jdGlvbiBtYW5hZ2VMb2FkaW5nKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLmNsYXNzX2xvYWRpbmcpO1xuICAgIHNldFN0YXR1cyhlbGVtZW50LCBzdGF0dXNMb2FkaW5nKTsgLy8gSW5zdGFuY2UgaXMgbm90IHByb3ZpZGVkIHdoZW4gbG9hZGluZyBpcyBjYWxsZWQgZnJvbSBzdGF0aWMgY2xhc3NcblxuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcbiAgICB1cGRhdGVMb2FkaW5nQ291bnQoaW5zdGFuY2UsICsxKTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfbG9hZGluZywgZWxlbWVudCwgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgc2V0QXR0cmlidXRlSWZWYWx1ZSA9IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZUlmVmFsdWUoZWxlbWVudCwgYXR0ck5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUpO1xuICB9O1xuICB2YXIgc2V0SW1hZ2VBdHRyaWJ1dGVzID0gZnVuY3Rpb24gc2V0SW1hZ2VBdHRyaWJ1dGVzKGVsZW1lbnQsIHNldHRpbmdzKSB7XG4gICAgc2V0QXR0cmlidXRlSWZWYWx1ZShlbGVtZW50LCBTSVpFUywgZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX3NpemVzKSk7XG4gICAgc2V0QXR0cmlidXRlSWZWYWx1ZShlbGVtZW50LCBTUkNTRVQsIGdldERhdGEoZWxlbWVudCwgc2V0dGluZ3MuZGF0YV9zcmNzZXQpKTtcbiAgICBzZXRBdHRyaWJ1dGVJZlZhbHVlKGVsZW1lbnQsIFNSQywgZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX3NyYykpO1xuICB9O1xuICB2YXIgc2V0U291cmNlc0ltZyA9IGZ1bmN0aW9uIHNldFNvdXJjZXNJbWcoaW1nRWwsIHNldHRpbmdzKSB7XG4gICAgZm9yRWFjaFBpY3R1cmVTb3VyY2UoaW1nRWwsIGZ1bmN0aW9uIChzb3VyY2VUYWcpIHtcbiAgICAgIHNldE9yaWdpbmFsc09iamVjdChzb3VyY2VUYWcsIGF0dHJzU3JjU3Jjc2V0U2l6ZXMpO1xuICAgICAgc2V0SW1hZ2VBdHRyaWJ1dGVzKHNvdXJjZVRhZywgc2V0dGluZ3MpO1xuICAgIH0pO1xuICAgIHNldE9yaWdpbmFsc09iamVjdChpbWdFbCwgYXR0cnNTcmNTcmNzZXRTaXplcyk7XG4gICAgc2V0SW1hZ2VBdHRyaWJ1dGVzKGltZ0VsLCBzZXR0aW5ncyk7XG4gIH07XG4gIHZhciBzZXRTb3VyY2VzSWZyYW1lID0gZnVuY3Rpb24gc2V0U291cmNlc0lmcmFtZShpZnJhbWUsIHNldHRpbmdzKSB7XG4gICAgc2V0T3JpZ2luYWxzT2JqZWN0KGlmcmFtZSwgYXR0cnNTcmMpO1xuICAgIHNldEF0dHJpYnV0ZUlmVmFsdWUoaWZyYW1lLCBTUkMsIGdldERhdGEoaWZyYW1lLCBzZXR0aW5ncy5kYXRhX3NyYykpO1xuICB9O1xuICB2YXIgc2V0U291cmNlc1ZpZGVvID0gZnVuY3Rpb24gc2V0U291cmNlc1ZpZGVvKHZpZGVvRWwsIHNldHRpbmdzKSB7XG4gICAgZm9yRWFjaFZpZGVvU291cmNlKHZpZGVvRWwsIGZ1bmN0aW9uIChzb3VyY2VFbCkge1xuICAgICAgc2V0T3JpZ2luYWxzT2JqZWN0KHNvdXJjZUVsLCBhdHRyc1NyYyk7XG4gICAgICBzZXRBdHRyaWJ1dGVJZlZhbHVlKHNvdXJjZUVsLCBTUkMsIGdldERhdGEoc291cmNlRWwsIHNldHRpbmdzLmRhdGFfc3JjKSk7XG4gICAgfSk7XG4gICAgc2V0T3JpZ2luYWxzT2JqZWN0KHZpZGVvRWwsIGF0dHJzU3JjUG9zdGVyKTtcbiAgICBzZXRBdHRyaWJ1dGVJZlZhbHVlKHZpZGVvRWwsIFBPU1RFUiwgZ2V0RGF0YSh2aWRlb0VsLCBzZXR0aW5ncy5kYXRhX3Bvc3RlcikpO1xuICAgIHNldEF0dHJpYnV0ZUlmVmFsdWUodmlkZW9FbCwgU1JDLCBnZXREYXRhKHZpZGVvRWwsIHNldHRpbmdzLmRhdGFfc3JjKSk7XG4gICAgdmlkZW9FbC5sb2FkKCk7XG4gIH07XG4gIHZhciBzZXRTb3VyY2VzT2JqZWN0ID0gZnVuY3Rpb24gc2V0U291cmNlc09iamVjdChvYmplY3QsIHNldHRpbmdzKSB7XG4gICAgc2V0T3JpZ2luYWxzT2JqZWN0KG9iamVjdCwgYXR0cnNEYXRhKTtcbiAgICBzZXRBdHRyaWJ1dGVJZlZhbHVlKG9iamVjdCwgREFUQSwgZ2V0RGF0YShvYmplY3QsIHNldHRpbmdzLmRhdGFfc3JjKSk7XG4gIH07XG4gIHZhciBzZXRCYWNrZ3JvdW5kID0gZnVuY3Rpb24gc2V0QmFja2dyb3VuZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICB2YXIgYmcxeFZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnKTtcbiAgICB2YXIgYmdIaURwaVZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnX2hpZHBpKTtcbiAgICB2YXIgYmdEYXRhVmFsdWUgPSBpc0hpRHBpICYmIGJnSGlEcGlWYWx1ZSA/IGJnSGlEcGlWYWx1ZSA6IGJnMXhWYWx1ZTtcbiAgICBpZiAoIWJnRGF0YVZhbHVlKSByZXR1cm47XG4gICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBcInVybChcXFwiXCIuY29uY2F0KGJnRGF0YVZhbHVlLCBcIlxcXCIpXCIpO1xuICAgIGdldFRlbXBJbWFnZShlbGVtZW50KS5zZXRBdHRyaWJ1dGUoU1JDLCBiZ0RhdGFWYWx1ZSk7XG4gICAgbWFuYWdlTG9hZGluZyhlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9OyAvLyBOT1RFOiBUSEUgVEVNUCBJTUFHRSBUUklDSyBDQU5OT1QgQkUgRE9ORSBXSVRIIGRhdGEtbXVsdGktYmdcbiAgLy8gQkVDQVVTRSBJTlNJREUgSVRTIFZBTFVFUyBNVVNUIEJFIFdSQVBQRUQgV0lUSCBVUkwoKSBBTkQgT05FIE9GIFRIRU1cbiAgLy8gQ09VTEQgQkUgQSBHUkFESUVOVCBCQUNLR1JPVU5EIElNQUdFXG5cbiAgdmFyIHNldE11bHRpQmFja2dyb3VuZCA9IGZ1bmN0aW9uIHNldE11bHRpQmFja2dyb3VuZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICB2YXIgYmcxeFZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnX211bHRpKTtcbiAgICB2YXIgYmdIaURwaVZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnX211bHRpX2hpZHBpKTtcbiAgICB2YXIgYmdEYXRhVmFsdWUgPSBpc0hpRHBpICYmIGJnSGlEcGlWYWx1ZSA/IGJnSGlEcGlWYWx1ZSA6IGJnMXhWYWx1ZTtcbiAgICBpZiAoIWJnRGF0YVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYmdEYXRhVmFsdWU7XG4gICAgbWFuYWdlQXBwbGllZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgc2V0SW1nc2V0QmFja2dyb3VuZCA9IGZ1bmN0aW9uIHNldEltZ3NldEJhY2tncm91bmQoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgdmFyIGJnSW1nU2V0RGF0YVZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnX3NldCk7XG4gICAgaWYgKCFiZ0ltZ1NldERhdGFWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW1nU2V0VmFsdWVzID0gYmdJbWdTZXREYXRhVmFsdWUuc3BsaXQoXCJ8XCIpO1xuICAgIHZhciBiZ0ltYWdlVmFsdWVzID0gaW1nU2V0VmFsdWVzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybi
96BcImltYWdlLXNldChcIi5jb25jYXQodmFsdWUsIFwiKVwiKTtcbiAgICB9KTtcbiAgICBlbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGJnSW1hZ2VWYWx1ZXMuam9pbigpOyAvLyBUZW1wb3JhcnkgZml4IGZvciBDaHJvbWVpdW0gd2l0aCB0aGUgLXdlYmtpdC0gcHJlZml4XG5cbiAgICBpZiAoZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPT09IFwiXCIpIHtcbiAgICAgIGJnSW1hZ2VWYWx1ZXMgPSBpbWdTZXRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gXCItd2Via2l0LWltYWdlLXNldChcIi5jb25jYXQodmFsdWUsIFwiKVwiKTtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBiZ0ltYWdlVmFsdWVzLmpvaW4oKTtcbiAgICB9XG4gICAgbWFuYWdlQXBwbGllZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgc2V0U291cmNlc0Z1bmN0aW9ucyA9IHtcbiAgICBJTUc6IHNldFNvdXJjZXNJbWcsXG4gICAgSUZSQU1FOiBzZXRTb3VyY2VzSWZyYW1lLFxuICAgIFZJREVPOiBzZXRTb3VyY2VzVmlkZW8sXG4gICAgT0JKRUNUOiBzZXRTb3VyY2VzT2JqZWN0XG4gIH07XG4gIHZhciBzZXRTb3VyY2VzTmF0aXZlID0gZnVuY3Rpb24gc2V0U291cmNlc05hdGl2ZShlbGVtZW50LCBzZXR0aW5ncykge1xuICAgIHZhciBzZXRTb3VyY2VzRnVuY3Rpb24gPSBzZXRTb3VyY2VzRnVuY3Rpb25zW2VsZW1lbnQudGFnTmFtZV07XG4gICAgaWYgKCFzZXRTb3VyY2VzRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U291cmNlc0Z1bmN0aW9uKGVsZW1lbnQsIHNldHRpbmdzKTtcbiAgfTtcbiAgdmFyIHNldFNvdXJjZXMgPSBmdW5jdGlvbiBzZXRTb3VyY2VzKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIHZhciBzZXRTb3VyY2VzRnVuY3Rpb24gPSBzZXRTb3VyY2VzRnVuY3Rpb25zW2VsZW1lbnQudGFnTmFtZV07XG4gICAgaWYgKCFzZXRTb3VyY2VzRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U291cmNlc0Z1bmN0aW9uKGVsZW1lbnQsIHNldHRpbmdzKTtcbiAgICBtYW5hZ2VMb2FkaW5nKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gIH07XG4gIHZhciBlbGVtZW50c1dpdGhMb2FkRXZlbnQgPSBbXCJJTUdcIiwgXCJJRlJBTUVcIiwgXCJWSURFT1wiLCBcIk9CSkVDVFwiXTtcbiAgdmFyIGhhc0xvYWRFdmVudCA9IGZ1bmN0aW9uIGhhc0xvYWRFdmVudChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnRzV2l0aExvYWRFdmVudC5pbmRleE9mKGVsZW1lbnQudGFnTmFtZSkgPiAtMTtcbiAgfTtcbiAgdmFyIGNoZWNrRmluaXNoID0gZnVuY3Rpb24gY2hlY2tGaW5pc2goc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgaWYgKGluc3RhbmNlICYmICFpc1NvbWV0aGluZ0xvYWRpbmcoaW5zdGFuY2UpICYmICFoYXZlRWxlbWVudHNUb0xvYWQoaW5zdGFuY2UpKSB7XG4gICAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfZmluaXNoLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICB2YXIgYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgZWxlbWVudC5sbEV2TGlzbnJzW2V2ZW50TmFtZV0gPSBoYW5kbGVyO1xuICB9O1xuICB2YXIgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gIH07XG4gIHZhciBoYXNFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIGhhc0V2ZW50TGlzdGVuZXJzKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gISFlbGVtZW50LmxsRXZMaXNucnM7XG4gIH07XG4gIHZhciBhZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIGxvYWRIYW5kbGVyLCBlcnJvckhhbmRsZXIpIHtcbiAgICBpZiAoIWhhc0V2ZW50TGlzdGVuZXJzKGVsZW1lbnQpKSBlbGVtZW50LmxsRXZMaXNucnMgPSB7fTtcbiAgICB2YXIgbG9hZEV2ZW50TmFtZSA9IGVsZW1lbnQudGFnTmFtZSA9PT0gXCJWSURFT1wiID8gXCJsb2FkZWRkYXRhXCIgOiBcImxvYWRcIjtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGxvYWRFdmVudE5hbWUsIGxvYWRIYW5kbGVyKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIFwiZXJyb3JcIiwgZXJyb3JIYW5kbGVyKTtcbiAgfTtcbiAgdmFyIHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZWxlbWVudCkge1xuICAgIGlmICghaGFzRXZlbnRMaXN0ZW5lcnMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGV2ZW50TGlzdGVuZXJzID0gZWxlbWVudC5sbEV2TGlzbnJzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBldmVudExpc3RlbmVycykge1xuICAgICAgdmFyIGhhbmRsZXIgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdO1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgIH1cbiAgICBkZWxldGUgZWxlbWVudC5sbEV2TGlzbnJzO1xuICB9O1xuICB2YXIgZG9uZUhhbmRsZXIgPSBmdW5jdGlvbiBkb25lSGFuZGxlcihlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBkZWxldGVUZW1wSW1hZ2UoZWxlbWVudCk7XG4gICAgdXBkYXRlTG9hZGluZ0NvdW50KGluc3RhbmNlLCAtMSk7XG4gICAgZGVjcmVhc2VUb0xvYWRDb3VudChpbnN0YW5jZSk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfbG9hZGluZyk7XG4gICAgaWYgKHNldHRpbmdzLnVub2JzZXJ2ZV9jb21wbGV0ZWQpIHtcbiAgICAgIHVub2JzZXJ2ZShlbGVtZW50LCBpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICB2YXIgbG9hZEhhbmRsZXIgPSBmdW5jdGlvbiBsb2FkSGFuZGxlcihldmVudCwgZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgdmFyIGdvaW5nTmF0aXZlID0gaGFzU3RhdHVzTmF0aXZlKGVsZW1lbnQpO1xuICAgIGRvbmVIYW5kbGVyKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfbG9hZGVkKTtcbiAgICBzZXRTdGF0dXMoZWxlbWVudCwgc3RhdHVzTG9hZGVkKTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfbG9hZGVkLCBlbGVtZW50LCBpbnN0YW5jZSk7XG4gICAgaWYgKCFnb2luZ05hdGl2ZSkgY2hlY2tGaW5pc2goc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgfTtcbiAgdmFyIGVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihldmVudCwgZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgdmFyIGdvaW5nTmF0aXZlID0gaGFzU3RhdHVzTmF0aXZlKGVsZW1lbnQpO1xuICAgIGRvbmVIYW5kbGVyKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfZXJyb3IpO1xuICAgIHNldFN0YXR1cy
96hlbGVtZW50LCBzdGF0dXNFcnJvcik7XG4gICAgc2FmZUNhbGxiYWNrKHNldHRpbmdzLmNhbGxiYWNrX2Vycm9yLCBlbGVtZW50LCBpbnN0YW5jZSk7XG4gICAgaWYgKHNldHRpbmdzLnJlc3RvcmVfb25fZXJyb3IpIHJlc3RvcmVPcmlnaW5hbEF0dHJzKGVsZW1lbnQsIGF0dHJzU3JjU3Jjc2V0U2l6ZXMpO1xuICAgIGlmICghZ29pbmdOYXRpdmUpIGNoZWNrRmluaXNoKHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gIH07XG4gIHZhciBhZGRPbmVTaG90RXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBhZGRPbmVTaG90RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgdmFyIGVsZW1lbnRUb0xpc3RlblRvID0gZ2V0VGVtcEltYWdlKGVsZW1lbnQpIHx8IGVsZW1lbnQ7XG4gICAgaWYgKGhhc0V2ZW50TGlzdGVuZXJzKGVsZW1lbnRUb0xpc3RlblRvKSkge1xuICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gbG9hZGluZyBpcyByZXRyaWVkIHR3aWNlXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBfbG9hZEhhbmRsZXIgPSBmdW5jdGlvbiBfbG9hZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgIGxvYWRIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZWxlbWVudFRvTGlzdGVuVG8pO1xuICAgIH07XG4gICAgdmFyIF9lcnJvckhhbmRsZXIgPSBmdW5jdGlvbiBfZXJyb3JIYW5kbGVyKGV2ZW50KSB7XG4gICAgICBlcnJvckhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycyhlbGVtZW50VG9MaXN0ZW5Ubyk7XG4gICAgfTtcbiAgICBhZGRFdmVudExpc3RlbmVycyhlbGVtZW50VG9MaXN0ZW5UbywgX2xvYWRIYW5kbGVyLCBfZXJyb3JIYW5kbGVyKTtcbiAgfTtcbiAgdmFyIGxvYWRCYWNrZ3JvdW5kID0gZnVuY3Rpb24gbG9hZEJhY2tncm91bmQoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgYWRkVGVtcEltYWdlKGVsZW1lbnQpO1xuICAgIGFkZE9uZVNob3RFdmVudExpc3RlbmVycyhlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIHNhdmVPcmlnaW5hbEJhY2tncm91bmRTdHlsZShlbGVtZW50KTtcbiAgICBzZXRCYWNrZ3JvdW5kKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgc2V0TXVsdGlCYWNrZ3JvdW5kKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgc2V0SW1nc2V0QmFja2dyb3VuZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgbG9hZFJlZ3VsYXIgPSBmdW5jdGlvbiBsb2FkUmVndWxhcihlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBhZGRPbmVTaG90RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICBzZXRTb3VyY2VzKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gIH07XG4gIHZhciBsb2FkID0gZnVuY3Rpb24gbG9hZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoaGFzTG9hZEV2ZW50KGVsZW1lbnQpKSB7XG4gICAgICBsb2FkUmVndWxhcihlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkQmFja2dyb3VuZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGxvYWROYXRpdmUgPSBmdW5jdGlvbiBsb2FkTmF0aXZlKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwibG9hZGluZ1wiLCBcImxhenlcIik7XG4gICAgYWRkT25lU2hvdEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgc2V0U291cmNlc05hdGl2ZShlbGVtZW50LCBzZXR0aW5ncyk7XG4gICAgc2V0U3RhdHVzKGVsZW1lbnQsIHN0YXR1c05hdGl2ZSk7XG4gIH07XG4gIHZhciByZW1vdmVJbWFnZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiByZW1vdmVJbWFnZUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFNSQyk7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoU1JDU0VUKTtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShTSVpFUyk7XG4gIH07XG4gIHZhciByZXNldFNvdXJjZXNJbWcgPSBmdW5jdGlvbiByZXNldFNvdXJjZXNJbWcoZWxlbWVudCkge1xuICAgIGZvckVhY2hQaWN0dXJlU291cmNlKGVsZW1lbnQsIGZ1bmN0aW9uIChzb3VyY2VUYWcpIHtcbiAgICAgIHJlbW92ZUltYWdlQXR0cmlidXRlcyhzb3VyY2VUYWcpO1xuICAgIH0pO1xuICAgIHJlbW92ZUltYWdlQXR0cmlidXRlcyhlbGVtZW50KTtcbiAgfTtcbiAgdmFyIHJlc3RvcmVJbWcgPSBmdW5jdGlvbiByZXN0b3JlSW1nKGltZ0VsKSB7XG4gICAgZm9yRWFjaFBpY3R1cmVTb3VyY2UoaW1nRWwsIGZ1bmN0aW9uIChzb3VyY2VFbCkge1xuICAgICAgcmVzdG9yZU9yaWdpbmFsQXR0cnMoc291cmNlRWwsIGF0dHJzU3JjU3Jjc2V0U2l6ZXMpO1xuICAgIH0pO1xuICAgIHJlc3RvcmVPcmlnaW5hbEF0dHJzKGltZ0VsLCBhdHRyc1NyY1NyY3NldFNpemVzKTtcbiAgfTtcbiAgdmFyIHJlc3RvcmVWaWRlbyA9IGZ1bmN0aW9uIHJlc3RvcmVWaWRlbyh2aWRlb0VsKSB7XG4gICAgZm9yRWFjaFZpZGVvU291cmNlKHZpZGVvRWwsIGZ1bmN0aW9uIChzb3VyY2VFbCkge1xuICAgICAgcmVzdG9yZU9yaWdpbmFsQXR0cnMoc291cmNlRWwsIGF0dHJzU3JjKTtcbiAgICB9KTtcbiAgICByZXN0b3JlT3JpZ2luYWxBdHRycyh2aWRlb0VsLCBhdHRyc1NyY1Bvc3Rlcik7XG4gICAgdmlkZW9FbC5sb2FkKCk7XG4gIH07XG4gIHZhciByZXN0b3JlSWZyYW1lID0gZnVuY3Rpb24gcmVzdG9yZUlmcmFtZShpZnJhbWVFbCkge1xuICAgIHJlc3RvcmVPcmlnaW5hbEF0dHJzKGlmcmFtZUVsLCBhdHRyc1NyYyk7XG4gIH07XG4gIHZhciByZXN0b3JlT2JqZWN0ID0gZnVuY3Rpb24gcmVzdG9yZU9iamVjdChvYmplY3RFbCkge1xuICAgIHJlc3RvcmVPcmlnaW5hbEF0dHJzKG9iamVjdEVsLCBhdHRyc0RhdGEpO1xuICB9O1xuICB2YXIgcmVzdG9yZUZ1bmN0aW9ucyA9IHtcbiAgICBJTUc6IHJlc3RvcmVJbWcsXG4gICAgSUZSQU1FOiByZXN0b3JlSWZyYW1lLFxuICAgIFZJREVPOiByZXN0b3JlVmlkZW8sXG4gICAgT0JKRUNUOiByZXN0b3JlT2JqZWN0XG4gIH07XG4gIHZhciByZXN0b3JlQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHJlc3RvcmVBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICB2YXIgcmVzdG9yZUZ1bmN0aW9uID0gcmVzdG9yZUZ1bmN0aW9uc1tlbGVtZW50LnRhZ05hbWVdO1xuICAgIGlmICghcmVzdG9yZUZ1bmN0aW9uKSB7XG4gICAgICByZXN0b3JlT3JpZ2luYWxCZ0ltYWdlKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXN0b3JlRnVuY3Rpb24oZWxlbWVudCk7XG4gIH07XG4gIHZhciByZXNldENsYXNzZXMgPSBmdW5jdGlvbiByZXNldENsYXNzZXMoZWxlbWVudCwgc2V0dGluZ3MpIHtcbiAgICBpZiAoaGFzRW1wdHlTdGF0dXMoZWxlbWVudCkgfHwgaGFzU3RhdHVzTmF0aXZlKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLmNsYXNzX2VudGVyZWQpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLmNsYXNzX2V4aXRlZCk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfYXBwbGllZCk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfbG9hZGluZyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfbG9hZGVkKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19lcnJvcik7XG4gIH07XG4gIHZhciByZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShlbGVtZW50LCBzZXR0aW5ncykge1xuICAgIHJlc3RvcmVBdHRyaWJ1dGVzKGVsZW1lbnQpO1xuICAgIHJlc2V0Q2xhc3NlcyhlbGVtZW50LCBzZXR0aW5ncyk7XG4gICAgcmVzZXRTdGF0dXMoZWxlbWVudCk7XG4gICAgZGVsZXRlT3JpZ2luYWxBdHRycyhlbGVtZW50KTtcbiAgfTtcbiAgdmFyIGNhbmNlbExvYWRpbmcgPSBmdW5jdGlvbiBjYW5jZWxMb2FkaW5nKGVsZW1lbnQsIGVudHJ5LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoIXNldHRpbmdzLmNhbmNlbF9vbl9leGl0KSByZXR1cm47XG4gICAgaWYgKCFoYXNTdGF0dXNMb2FkaW5nKGVsZW1lbnQpKSByZXR1cm47XG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSAhPT0gXCJJTUdcIikgcmV0dXJuOyAvL1dvcmtzIG9ubHkgb24gaW1hZ2VzXG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVycyhlbGVtZW50KTtcbiAgICByZXNldFNvdXJjZXNJbWcoZWxlbWVudCk7XG4gICAgcmVzdG9yZUltZyhlbGVtZW50KTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19sb2FkaW5nKTtcbiAgICB1cGRhdGVMb2FkaW5nQ291bnQoaW5zdGFuY2UsIC0xKTtcbiAgICByZXNldFN0YXR1cy
96hlbGVtZW50KTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfY2FuY2VsLCBlbGVtZW50LCBlbnRyeSwgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgb25FbnRlciA9IGZ1bmN0aW9uIG9uRW50ZXIoZWxlbWVudCwgZW50cnksIHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIHZhciBkb250TG9hZCA9IGhhZFN0YXJ0ZWRMb2FkaW5nKGVsZW1lbnQpO1xuICAgIC8qIFNhdmUgc3RhdHVzXG4gICAgYmVmb3JlIHNldHRpbmcgaXQsIHRvIHByZXZlbnQgbG9hZGluZyBpdCBhZ2Fpbi4gRml4ZXMgIzUyNi4gKi9cblxuICAgIHNldFN0YXR1cyhlbGVtZW50LCBzdGF0dXNFbnRlcmVkKTtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19lbnRlcmVkKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19leGl0ZWQpO1xuICAgIHVub2JzZXJ2ZUVudGVyZWQoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfZW50ZXIsIGVsZW1lbnQsIGVudHJ5LCBpbnN0YW5jZSk7XG4gICAgaWYgKGRvbnRMb2FkKSByZXR1cm47XG4gICAgbG9hZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgb25FeGl0ID0gZnVuY3Rpb24gb25FeGl0KGVsZW1lbnQsIGVudHJ5LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoaGFzRW1wdHlTdGF0dXMoZWxlbWVudCkpIHJldHVybjsgLy9JZ25vcmUgdGhlIGZpcnN0IHBhc3MsIGF0IGxhbmRpbmdcblxuICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLmNsYXNzX2V4aXRlZCk7XG4gICAgY2FuY2VsTG9hZGluZyhlbGVtZW50LCBlbnRyeSwgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfZXhpdCwgZWxlbWVudCwgZW50cnksIGluc3RhbmNlKTtcbiAgfTtcbiAgdmFyIHRhZ3NXaXRoTmF0aXZlTGF6eSA9IFtcIklNR1wiLCBcIklGUkFNRVwiLCBcIlZJREVPXCJdO1xuICB2YXIgc2hvdWxkVXNlTmF0aXZlID0gZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKHNldHRpbmdzKSB7XG4gICAgcmV0dXJuIHNldHRpbmdzLnVzZV9uYXRpdmUgJiYgXCJsb2FkaW5nXCIgaW4gSFRNTEltYWdlRWxlbWVudC5wcm90b3R5cGU7XG4gIH07XG4gIHZhciBsb2FkQWxsTmF0aXZlID0gZnVuY3Rpb24gbG9hZEFsbE5hdGl2ZShlbGVtZW50cywgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKHRhZ3NXaXRoTmF0aXZlTGF6eS5pbmRleE9mKGVsZW1lbnQudGFnTmFtZSkgPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvYWROYXRpdmUoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICB9KTtcbiAgICBzZXRUb0xvYWRDb3VudChpbnN0YW5jZSwgMCk7XG4gIH07XG4gIHZhciBpc0ludGVyc2VjdGluZyA9IGZ1bmN0aW9uIGlzSW50ZXJzZWN0aW5nKGVudHJ5KSB7XG4gICAgcmV0dXJuIGVudHJ5LmlzSW50ZXJzZWN0aW5nIHx8IGVudHJ5LmludGVyc2VjdGlvblJhdGlvID4gMDtcbiAgfTtcbiAgdmFyIGdldE9ic2VydmVyU2V0dGluZ3MgPSBmdW5jdGlvbiBnZXRPYnNlcnZlclNldHRpbmdzKHNldHRpbmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3Q6IHNldHRpbmdzLmNvbnRhaW5lciA9PT0gZG9jdW1lbnQgPyBudWxsIDogc2V0dGluZ3MuY29udGFpbmVyLFxuICAgICAgcm9vdE1hcmdpbjogc2V0dGluZ3MudGhyZXNob2xkcyB8fCBzZXR0aW5ncy50aHJlc2hvbGQgKyBcInB4XCJcbiAgICB9O1xuICB9O1xuICB2YXIgaW50ZXJzZWN0aW9uSGFuZGxlciA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbkhhbmRsZXIoZW50cmllcywgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgcmV0dXJuIGlzSW50ZXJzZWN0aW5nKGVudHJ5KSA/IG9uRW50ZXIoZW50cnkudGFyZ2V0LCBlbnRyeSwgc2V0dGluZ3MsIGluc3RhbmNlKSA6IG9uRXhpdChlbnRyeS50YXJnZXQsIGVudHJ5LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIH0pO1xuICB9O1xuICB2YXIgb2JzZXJ2ZUVsZW1lbnRzID0gZnVuY3Rpb24gb2JzZXJ2ZUVsZW1lbnRzKG9ic2VydmVyLCBlbGVtZW50cykge1xuICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gICAgfSk7XG4gIH07XG4gIHZhciB1cGRhdGVPYnNlcnZlciA9IGZ1bmN0aW9uIHVwZGF0ZU9ic2VydmVyKG9ic2VydmVyLCBlbGVtZW50c1RvT2JzZXJ2ZSkge1xuICAgIHJlc2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuICAgIG9ic2VydmVFbGVtZW50cyhvYnNlcnZlciwgZWxlbWVudHNUb09ic2VydmUpO1xuICB9O1xuICB2YXIgc2V0T2JzZXJ2ZXIgPSBmdW5jdGlvbiBzZXRPYnNlcnZlcihzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoIXN1cHBvcnRzSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfHwgc2hvdWxkVXNlTmF0aXZlKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnN0YW5jZS5fb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgIGludGVyc2VjdGlvbkhhbmRsZXIoZW50cmllcywgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICB9LCBnZXRPYnNlcnZlclNldHRpbmdzKHNldHRpbmdzKSk7XG4gIH07XG4gIHZhciB0b0FycmF5ID0gZnVuY3Rpb24gdG9BcnJheShub2RlU2V0KSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGVTZXQpO1xuICB9O1xuICB2YXIgcXVlcnlFbGVtZW50cyA9IGZ1bmN0aW9uIHF1ZXJ5RWxlbWVudHMoc2V0dGluZ3MpIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoc2V0dGluZ3MuZWxlbWVudHNfc2VsZWN0b3IpO1xuICB9O1xuICB2YXIgZXhjbHVkZU1hbmFnZWRFbGVtZW50cyA9IGZ1bmN0aW9uIGV4Y2x1ZGVNYW5hZ2VkRWxlbWVudHMoZWxlbWVudHMpIHtcbiAgICByZXR1cm4gdG9BcnJheShlbGVtZW50cykuZmlsdGVyKGhhc0VtcHR5U3RhdHVzKTtcbiAgfTtcbiAgdmFyIGhhc0Vycm9yID0gZnVuY3Rpb24gaGFzRXJyb3IoZWxlbWVudCkge1xuICAgIHJldHVybi
96BoYXNTdGF0dXNFcnJvcihlbGVtZW50KTtcbiAgfTtcbiAgdmFyIGZpbHRlckVycm9yRWxlbWVudHMgPSBmdW5jdGlvbiBmaWx0ZXJFcnJvckVsZW1lbnRzKGVsZW1lbnRzKSB7XG4gICAgcmV0dXJuIHRvQXJyYXkoZWxlbWVudHMpLmZpbHRlcihoYXNFcnJvcik7XG4gIH07XG4gIHZhciBnZXRFbGVtZW50c1RvTG9hZCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRzVG9Mb2FkKGVsZW1lbnRzLCBzZXR0aW5ncykge1xuICAgIHJldHVybiBleGNsdWRlTWFuYWdlZEVsZW1lbnRzKGVsZW1lbnRzIHx8IHF1ZXJ5RWxlbWVudHMoc2V0dGluZ3MpKTtcbiAgfTtcbiAgdmFyIHJldHJ5TGF6eUxvYWQgPSBmdW5jdGlvbiByZXRyeUxhenlMb2FkKHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIHZhciBlcnJvckVsZW1lbnRzID0gZmlsdGVyRXJyb3JFbGVtZW50cyhxdWVyeUVsZW1lbnRzKHNldHRpbmdzKSk7XG4gICAgZXJyb3JFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19lcnJvcik7XG4gICAgICByZXNldFN0YXR1cyhlbGVtZW50KTtcbiAgICB9KTtcbiAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgfTtcbiAgdmFyIHNldE9ubGluZUNoZWNrID0gZnVuY3Rpb24gc2V0T25saW5lQ2hlY2soc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgaWYgKCFydW5uaW5nT25Ccm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlLl9vbmxpbmVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0cnlMYXp5TG9hZChzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgaW5zdGFuY2UuX29ubGluZUhhbmRsZXIpO1xuICB9O1xuICB2YXIgcmVzZXRPbmxpbmVDaGVjayA9IGZ1bmN0aW9uIHJlc2V0T25saW5lQ2hlY2soaW5zdGFuY2UpIHtcbiAgICBpZiAoIXJ1bm5pbmdPbkJyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgaW5zdGFuY2UuX29ubGluZUhhbmRsZXIpO1xuICB9O1xuICB2YXIgTGF6eUxvYWQgPSBmdW5jdGlvbiBMYXp5TG9hZChjdXN0b21TZXR0aW5ncywgZWxlbWVudHMpIHtcbiAgICB2YXIgc2V0dGluZ3MgPSBnZXRFeHRlbmRlZFNldHRpbmdzKGN1c3RvbVNldHRpbmdzKTtcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubG9hZGluZ0NvdW50ID0gMDtcbiAgICBzZXRPYnNlcnZlcihzZXR0aW5ncywgdGhpcyk7XG4gICAgc2V0T25saW5lQ2hlY2soc2V0dGluZ3MsIHRoaXMpO1xuICAgIHRoaXMudXBkYXRlKGVsZW1lbnRzKTtcbiAgfTtcbiAgTGF6eUxvYWQucHJvdG90eXBlID0ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGdpdmVuTm9kZXNldCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3M7XG4gICAgICB2Y
96XIgZWxlbWVudHNUb0xvYWQgPSBnZXRFbGVtZW50c1RvTG9hZChnaXZlbk5vZGVzZXQsIHNldHRpbmdzKTtcbiAgICAgIHNldFRvTG9hZENvdW50KHRoaXMsIGVsZW1lbnRzVG9Mb2FkLmxlbmd0aCk7XG4gICAgICBpZiAoaXNCb3QgfHwgIXN1cHBvcnRzSW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5sb2FkQWxsKGVsZW1lbnRzVG9Mb2FkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFVzZU5hdGl2ZShzZXR0aW5ncykpIHtcbiAgICAgICAgbG9hZEFsbE5hdGl2ZShlbGVtZW50c1RvTG9hZCwgc2V0dGluZ3MsIHRoaXMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1cGRhdGVPYnNlcnZlcih0aGlzLl9vYnNlcnZlciwgZWxlbWVudHNUb0xvYWQpO1xuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIC8vIE9ic2VydmVyXG4gICAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfSAvLyBDbGVhbiBoYW5kbGVyc1xuXG4gICAgICByZXNldE9ubGluZUNoZWNrKHRoaXMpOyAvLyBDbGVhbiBjdXN0b20gYXR0cmlidXRlcyBvbiBlbGVtZW50c1xuXG4gICAgICBxdWVyeUVsZW1lbnRzKHRoaXMuX3NldHRpbmdzKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGRlbGV0ZU9yaWdpbmFsQXR0cnMoZWxlbWVudCk7XG4gICAgICB9KTsgLy8gRGVsZXRlIGFsbCBpbnRlcm5hbCBwcm9wc1xuXG4gICAgICBkZWxldGUgdGhpcy5fb2JzZXJ2ZXI7XG4gICAgICBkZWxldGUgdGhpcy5fc2V0dGluZ3M7XG4gICAgICBkZWxldGUgdGhpcy5fb25saW5lSGFuZGxlcjtcbiAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdDb3VudDtcbiAgICAgIGRlbGV0ZSB0aGlzLnRvTG9hZENvdW50O1xuICAgIH0sXG4gICAgbG9hZEFsbDogZnVuY3Rpb24gbG9hZEFsbChlbGVtZW50cykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX3NldHRpbmdzO1xuICAgICAgdmFyIGVsZW1lbnRzVG9Mb2FkID0gZ2V0RWxlbWVudHNUb0xvYWQoZWxlbWVudHMsIHNldHRpbmdzKTtcbiAgICAgIGVsZW1lbnRzVG9Mb2FkLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdW5vYnNlcnZlKGVsZW1lbnQsIF90aGlzKTtcbiAgICAgICAgbG9hZChlbGVtZW50LCBzZXR0aW5ncywgX3RoaXMpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICByZXN0b3JlQWxsOiBmdW5jdGlvbiByZXN0b3JlQWxsKCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3M7XG4gICAgICBxdWVyeUVsZW1lbnRzKHNldHRpbmdzKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJlc3RvcmUoZWxlbWVudCwgc2V0dGluZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBMYXp5TG9hZC5sb2FkID0gZnVuY3Rpb24gKGVsZW1lbnQsIGN1c3RvbVNldHRpbmdzKSB7XG4gICAgdmFyIHNldHRpbmdzID0gZ2V0RXh0ZW5kZWRTZXR0aW5ncyhjdXN0b21TZXR0aW5ncyk7XG4gICAgbG9hZChlbGVtZW50LCBzZXR0aW5ncyk7XG4gIH07XG4gIExhenlMb2FkLnJlc2V0U3RhdHVzID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXNldFN0YXR1cyhlbGVtZW50KTtcbiAgfTsgLy8gQXV0b21hdGljIGluc3RhbmNlcyBjcmVhdGlvbiBpZiByZXF1aXJlZCAodXNlZnVsIGZvciBhc3luYyBzY3JpcHQgbG9hZGluZylcblxuICBpZiAocnVubmluZ09uQnJvd3Nlcikge1xuICAgIGF1dG9Jbml0aWFsaXplKExhenlMb2FkLCB3aW5kb3cubGF6eUxvYWRPcHRpb25zKTtcbiAgfVxuICByZXR1cm4gTGF6eUxvYWQ7XG59KTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/js/lazyload.js\n");
97
98/***/ }),
99
100/***/ "./src/js/scripts.js":
101/*!***************************!*\
102  !*** ./src/js/scripts.js ***!
103  \***************************/
104/*! no exports provided */
105/***/ (function(module, __webpack_exports__, __webpack_require__) {
106
107"use strict";
108eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/js/utils.js\");\n/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lazyload */ \"./src/js/lazyload.js\");\n/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lazyload__WEBPACK_IMPORTED_MODULE_1__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\nif (window.NodeList && !NodeList.prototype.forEach) {\n  NodeList.prototype.forEach = Array.prototype.forEach;\n}\nif (window.Element && !Element.prototype.closest) {\n  Element.prototype.closest = function (s) {\n    var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n      i,\n      el = this;\n    do {\n      i = matches.length;\n      while (--i >= 0 && matches.item(i) !== el) {}\n      ;\n    } while (i < 0 && (el = el.parentElement));\n    return el;\n  };\n}\n\n// Header Events\nvar body = document.body;\n$(document).on('ready', function () {\n  if (document.body.classList.contains('page-template-page-faq')) {\n    window.addEventListener('scroll', fixedHeader);\n  }\n\n  // If Subnav Exsists\n  if (document.body.contains(document.querySelector('.header--subnav'))) {\n    window.addEventListener('scroll', fixedHeader);\n    document.querySelector('.js-subnav-toggle').addEventListener('click', toggleSubNav);\n    Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.subnav a'), closeSubNav);\n    Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.subnav__item-link'), setActiveLink);\n  }\n  if (document.querySelector('.js-play')) {\n    document.querySelector('.js-play').addEventListener('click', toggleVideo);\n    document.querySelector('.btn--play').addEventListener('click', togglePlay);\n  }\n  if (document.body.contains(document.querySelector('.js-modal')) || document.body.classList.contains('search')) {\n    Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.js-modal'), toggleModal);\n    Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.js-close-modal'), closeModal);\n  }\n  if (document.body.classList.contains('single-neuejournal')) {\n    document.querySelector('.js-clipboard').addEventListener('click', copyToClipboard);\n  }\n  if (document.body.contains(document.querySelector('.newsletter-popup'))) {\n    toggleNewsletter();\n  }\n\n  // Check if Newsletter Modal has any responses after Submission -- Show Modal with\n  if (document.querySelector('.newsletter-popup .mc4wp-alert')) {\n    var modal = document.querySelector(\"[data-modal-window=\\\"newsletter\\\"]\");\n    modal.classList.add('active');\n    addModalCloseEvent(modal);\n  }\n});\nif (document.body.contains(document.querySelector('.hamburger'))) {\n  document.querySelector('.hamburger').addEventListener('click', openM
108obileNav);\n  document.querySelector('.header--mobile .btn--close').addEventListener('click', closeMobileNav);\n  document.querySelectorAll('.aria-expanded-toggle').forEach(function (item) {\n    item.addEventListener('click', toggleAriaExpanded);\n  });\n  var mobileMenuItems = document.querySelectorAll('.header--mobile .menu-item-has-children');\n  mobileMenuItems.forEach(function (item) {\n    item.addEventListener('click', toggleSubMenu);\n  });\n} else {\n  document.querySelectorAll('.aria-expanded-toggle').forEach(function (item) {\n    item.addEventListener('mouseover', toggleAriaExpanded);\n  });\n  document.querySelectorAll('.aria-expanded-toggle').forEach(function (item) {\n    item.addEventListener('mouseout', toggleAriaExpanded);\n  });\n}\n\n// Expand Module\nObject(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.js-expand'), expandModule);\nObject(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.js-toggle-list'), toggleList);\nfunction openMobileNav() {\n  document.querySelector('.header--mobile').classList.add('-is-open');\n  document.querySelector('.btn--close').focus();\n  document.querySelector('body').classList.add('-hide-page-overflow');\n}\nfunction closeMobileNav() {\n  document.querySelector('.header--mobile').classList.remove('-is-open');\n  document.querySelector('body').classList.remove('-hide-page-overflow');\n}\nfunction toggleSubMenu(event) {\n  this.classList.toggle('active');\n}\nfunction toggleAriaExpanded(event) {\n  var expanded = this.getAttribute('aria-expanded') == 'true' ? 'false' : 'true';\n  this.setAttribute('aria-expanded', expanded);\n}\nfunction toggleSubNav(event) {\n  event.preventDefault();\n  this.classList.toggle('active');\n  document.querySelector('.subnav').classList.toggle('active');\n  document.body.classList.toggle('-hide-page-overflow');\n}\nfunction closeSubNav(event) {\n  document.querySelector('.header__toggle').classList.remove('active');\n  document.querySelector('.subnav').classList.remove('active');\n  document.body.classList.remove('-hide-page-overflow');\n}\nfunction setActiveLink(event) {\n  if (document.body.contains(document.querySelector('.subnav__item-link.active'))) {\n    document.querySelector('.subnav__item-link.active').classList.remove('active');\n  }\n  event.currentTarget.classList.add('active');\n}\nfunction fixedHeader() {\n  if (window.pageYOffset >= 75) {\n    body.classList.add('-has-fixed-header');\n    document.querySelector('.header--subnav').classList.add('-is-fixed');\n  } else {\n    body.classList.remove('-has-fixed-header');\n    document.querySelector('.header--subnav').classList.remove('-is-fixed');\n  }\n}\nfunction toggleModal() {\n  var modalType = this.dataset.modal;\n  document.querySelector(\"[data-modal-window=\\\"\".concat(modalType, \"\\\"]\")).classList.add('active');\n  document.body.classList.add('-hide-page-overflow');\n}\nfunction closeModal() {\n  var modalType = this.dataset.modalClose;\n  document.querySelector(\"[data-modal-window=\\\"\".concat(modalType, \"\\\"]\")).classList.remove('active');\n  document.body.classList.remove('-hide-page-overflow');\n}\nfunction copyToClipboard() {\n  var copyText = document.querySelector('.copy-link');\n  copyText.select();\n  document.execCommand('copy');\n  document.querySelector('.btn--copy').classList.add('copied');\n}\nfunction toggleVideo(event) {\n  if (this.paused) {\n    this.play();\n    this.muted = false;\n    this.classList.add('playing');\n    $(this).siblings('.btn--play').addClass('d-none');\n  } else {\n    this.pause();\n    this.muted = true;\n    this.classList.remove('playing');\n    $(this).siblings('.btn--play').removeClass('d-none');\n  }\n}\nfunction togglePlay(event) {\n  var $video = $(event.currentTarget).siblings('.video-element');\n  if ($video[0].paused) {\n    $video[0].play();\n    $video[0].muted = false;\n    $video[0].classList.add('playing');\n    event.target.classList.add('d-none');\n  } else {\n    $video[0].pause();\n    $video[0].muted = false;\n    $video[0].classList.remove('playing');\n    event.target.classList.remove('d-none');\n  }\n}\nfunction toggleNewsletter() {\n  if (checkCookie('home-newsletter') != 'on') {\n    var modal = document.querySelector(\"[data-modal-window=\\\"newsletter\\\"]\");\n    if (checkCookie('home-newsletter') != 'on') {\n      modal.classList.add('active');\n      createCookie('home-newsletter', 'on', 7);\n    }\n    addModalCloseEvent(modal);\n  }\n}\nfunction addModalCloseEvent(modal) {\n  window.onclick = function (event) {\n    if (event.target == modal) {\n      modal.classList.remove('active');\n      document.body.classList.remove('-hide-page-overflow');\n    }\n  };\n}\nfunction createCookie(name, value, days) {\n  if (days) {\n    var date = new Date();\n    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n    var expires = \"; expires=\" + date.toGMTString();\n  } else var expires = \"\";\n  if (true) {\n    // Change true to false to disable the cookie for help in local dev\n    document.cookie = name + \"=\" + value + expires + \"; path=/\";\n  }\n}\nfunction checkCookie(name) {\n  var nameEQ = name + \"=\";\n  var ca = document.cookie.split(';');\n  for (var i = 0; i < ca.length;
108 i++) {\n    var c = ca[i];\n    while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n  }\n  return null;\n}\n\n// Slider\n$('.section-slider .section-slider__slides').each(function (idx, item) {\n  var slideCount = this.querySelectorAll('.slide').length;\n  var sliderId = \"slider\" + idx;\n  this.id = sliderId;\n  $(this).attr('id', sliderId);\n  $(this).addClass(sliderId);\n  if (slideCount > 1) {\n    $('#' + sliderId).slick({\n      dots: true,\n      arrows: false,\n      infinite: true,\n      slidesToScroll: 1,\n      fade: true\n    });\n  }\n});\n\n// Full Slider\n$('.section-full_slider .section-slider__slides').each(function (idx, item) {\n  var slideCount = this.querySelectorAll('.slide').length;\n  var sliderId = \"slider\" + idx;\n  this.id = sliderId;\n  if (slideCount > 1) {\n    $(this).slick({\n      dots: true,\n      arrows: false,\n      infinite: true,\n      fade: true,\n      autoplay: true,\n      autoplaySpeed: 3000,\n      slidesToScroll: 1,\n      adaptiveHeight: false,\n      pauseOnHover: false,\n      pauseOnFocus: false\n    });\n  }\n});\n\n// Quote Slider\n$('.section-quote').each(function (idx, item) {\n  var slideCount = this.querySelectorAll('.section-quote blockquote').length;\n  var sliderId = \"slider\" + idx;\n  this.id = sliderId;\n  if (slideCount > 1) {\n    $(this).slick({\n      slide: 'blockquote',\n      dots: false,\n      arrows: false,\n      infinite: true,\n      fade: true,\n      speed: 1000,\n      autoplay: false,\n      autoplaySpeed: 4000,\n      slidesToScroll: 1,\n      adaptiveHeight: false,\n      pauseOnHover: false,\n      pauseOnFocus: false,\n      responsive: [{\n        breakpoint: 1024,\n        settings: {\n          autoplay: false\n        }\n      }]\n    });\n  }\n});\n\n// Private Events Slider\n$('.section-slider_group .slider__slides').each(function (idx, item) {\n  var sliderId = \"slider\" + idx;\n  this.id = sliderId;\n  $(this).slick(_defineProperty(_defineProperty(_defineProperty({\n    dots: true,\n    infinite: true,\n    fade: true,\n    autoplay: false,\n    autoplaySpeed: 3000,\n    slidesToScroll: 1,\n    adaptiveHeight: false,\n    pauseOnHover: false,\n    pauseOnFocus: false\n  }, \"dots\", false), \"arrows\", true), \"responsive\", [{\n    breakpoint: 1024,\n    settings: {\n      dots: true,\n      arrows: false,\n      pauseOnHover: false,\n      pauseOnFocus: false\n    }\n  }]));\n});\n$('.section-slider_group .slider__slides').on('beforeChange', function (event, slick, currentSlide, nextSlide) {\n  if (this.querySelector('video')) {\n    this.querySelector('video').pause();\n  }\n});\n\n// Membership Slider\n$('.section-membership .slider__slides').each(function (idx, item) {\n  var sliderId = \"membership-slider-\" + idx;\n  this.id = sliderId;\n  $(this).slick({\n    dots: true,\n    appendDots: '.slider__slides .slick-list',\n    infinite: true,\n    autoplay: true,\n    autoplaySpeed: 3000,\n    fade: true,\n    slidesToScroll: 1,\n    adaptiveHeight: false,\n    pauseOnHover: false,\n    pauseOnFocus: false\n  });\n});\n\n// Grid Slider\n$('.section-grid .block').each(function (idx, item) {\n  var sliderWrap = this.querySelector('.grid__slider');\n  var slides = $(sliderWrap).children(); // Get all the children slides\n\n  // Check if there are more than one slide\n  if (slides.length > 1) {\n    var sliderNextButton = $(sliderWrap).siblings('.grid__slider__nav').find('.slider-next');\n    var sliderPrevButton = $(sliderWrap).siblings('.grid__slider__nav').find('.slider-prev');\n    var sliderId = \"slider\" + idx;\n    sliderWrap.id = sliderId;\n    sliderNextButton.attr('id', 'next-' + sliderId);\n    sliderPrevButton.attr('id', 'prev-' + sliderId);\n    $(sliderWrap).slick({\n      dots: false,\n      arrows: true,\n      prevArrow: '#' + sliderPrevButton.attr('id'),\n      // Custom previous button selector\n      nextArrow: '#' + sliderNextButton.attr('id'),\n      // Custom next button selector\n      infinite: true,\n      fade: true,\n      autoplay: false,\n      slidesToScroll: 1,\n      adaptiveHeight: false,\n      pauseOnHover: false,\n      pauseOnFocus: false\n    });\n  } else {\n    // Optionally handle cases with only one slide, e.g., disable navigation, no need for a slider, etc.\n    $(sliderWrap).slick({\n      dots: false,\n      arrows: fal
108se,\n      // Disable arrows when only one slide\n      infinite: false,\n      fade: true,\n      autoplay: false,\n      slidesToScroll: 1,\n      adaptiveHeight: true,\n      pauseOnHover: true,\n      pauseOnFocus: true\n    });\n  }\n});\n\n// Slider with Nav\n$('.section-slider_with_nav .slider__slides').on('beforeChange', function (event, slick, currentSlide, nextSlide) {\n  var navList = slick.options.asNavFor;\n  if (currentSlide === slick.slideCount - 1) {\n    $(navList).slick('slickGoTo', 0);\n  } else if (currentSlide === 0) {\n    $(navList).slick('slickGoTo', slick.slideCount);\n  }\n});\n$('.section-slider_with_nav .slider__slides').each(function (idx, item) {\n  var slideCount = this.querySelectorAll('.slider__slide').length;\n  var sliderId = \"slider-\" + idx;\n  this.id = sliderId;\n  if (slideCount > 1) {\n    $(this).slick({\n      dots: true,\n      infinite: true,\n      fade: true,\n      slidesToScroll: 1,\n      adaptiveHeight: true,\n      asNavFor: $(this).parents('.section-slider_with_nav').find('.slider-nav ul'),\n      mobileFirst: true,\n      responsive: [{\n        breakpoint: 1024,\n        settings: {\n          dots: false,\n          prevArrow: '<button class=\"slick-prev slick-arrow arrow--prev\" aria-label=\"Previous\" type=\"button\"></button>',\n          nextArrow: '<button class=\"slick-next slick-arrow arrow--next\" aria-label=\"Next\" type=\"button\"></button>'\n        }\n      }]\n    });\n  }\n});\n$('.section-slider_with_nav .slider-nav ul').each(function (idx, item) {\n  var sliderNavId = \"sliderNav-\" + idx;\n  this.id = sliderNavId;\n  $(this).slick({\n    asNavFor: $(this).parents('.section-slider_with_nav').find('.slider__slides'),\n    slidesToShow: 1,\n    focusOnSelect: true,\n    arrows: false,\n    centerMode: true,\n    variableWidth: true,\n    infinite: $('.slider-nav').width() > this.listWidth,\n    mobileFirst: true,\n    responsive: [{\n      breakpoint: 1024,\n      settings: {\n        infinite: false,\n        slidesToShow: this.slideCount,\n        centerMode: false,\n        vertical: true\n      }\n    }]\n  });\n});\n\n// Homepage Featured Posts Slider\n$('.featured-posts__images').each(function (idx, item) {\n  var sliderId = \"featured_posts-slider-\" + idx;\n  this.id = sliderId;\n  $(this).slick({\n    dots: false,\n    arrows: false,\n    infinite: true,\n    slidesToScroll: 1,\n    adaptiveHeight: false,\n    pauseOnHover: false,\n    pauseOnFocus: false,\n    mobileFirst: true,\n    asNavFor: '.featured-posts__details',\n    fade: true,\n    responsive: [{\n      breakpoint: 1024,\n      settings: {\n        dots: true,\n        appendDots: '.featured-posts__images .slick-list',\n        fade: true,\n        autoplay: true,\n        pauseOnHover: false,\n        pauseOnFocus: false\n      }\n    }]\n  });\n});\n$('.featured-posts__details').each(function (idx, item) {\n  var sliderId = \"featured_posts_detail-slider-\" + idx;\n  this.id = sliderId;\n  $(this).slick({\n    dots: false,\n    arrows: false,\n    infinite: true,\n    slidesToScroll: 1,\n    adaptiveHeight: false,\n    pauseOnHover: false,\n    pauseOnFocus: false,\n    mobileFirst: true,\n    asNavFor: '.featured-posts__images',\n    fade: true,\n    responsive: [{\n      breakpoint: 1024,\n      settings: {\n        fade: true,\n        autoplay: true,\n        pauseOnHover: false,\n        pauseOnFocus: false\n      }\n    }]\n  });\n});\n\n// Slider with Quote\n$('.section-slider_with_quote .slider__slides').on('beforeChange', function (event, slick, currentSlide, nextSlide) {\n  var navList = slick.options.asNavFor;\n  if (currentSlide === slick.slideCount - 1) {\n    $(navList).slick('slickGoTo', 0);\n  } else if (currentSlide === 0) {\n    $(navList).slick('slickGoTo', slick.slideCount);\n  }\n});\n$('.section-slider_with_quote .slider__slides').each(function (idx, item) {\n  var slideCount = this.querySelectorAll('.slider__slide').length;\n  var sliderId = \"slider-\" + idx;\n  this.id = sliderId;\n  if (slideCount > 1) {\n    $(this).slick({\n      dots: false,\n      infinite: true,\n      fade: true,\n      slidesToScroll: 1,\n      adaptiveHeight: false,\n      asNavFor: $(this).parents('.section-sli
108der_with_quote').find('.slider-aside__quotes'),\n      mobileFirst: true,\n      responsive: [{\n        breakpoint: 767,\n        settings: {\n          dots: true\n        }\n      }]\n    });\n  }\n});\n$('.section-slider_with_quote .slider-aside__quotes').each(function (idx, item) {\n  var sliderNavId = \"sliderNav-\" + idx;\n  this.id = sliderNavId;\n  $(this).slick({\n    asNavFor: $(this).parents('.section-slider_with_quote').find('.slider__slides'),\n    slidesToShow: 1,\n    focusOnSelect: true,\n    arrows: false,\n    fade: true,\n    infinite: true,\n    mobileFirst: true,\n    dots: true,\n    responsive: [{\n      breakpoint: 767,\n      settings: {\n        dots: false\n      }\n    }, {\n      breakpoint: 1024,\n      settings: {\n        dots: false,\n        slidesToShow: this.slideCount,\n        centerMode: false\n      }\n    }]\n  });\n});\n\n// Feature Group Slider\n$('.feature_group-slides').each(function (idx, item) {\n  var slideCount = this.querySelectorAll('.section-feature_group__image').length;\n  var sliderId = \"slider\" + idx;\n  this.id = sliderId;\n  if (slideCount > 1) {\n    $(this).slick({\n      dots: true,\n      arrows: false,\n      infinite: true,\n      fade: true,\n      autoplay: false,\n      autoplaySpeed: 3000,\n      slidesToScroll: 1,\n      adaptiveHeight: false,\n      pauseOnHover: false,\n      pauseOnFocus: false,\n      mobileFirst: true,\n      responsive: [{\n        breakpoint: 1024,\n        settings: 'unslick'\n      }]\n    });\n  }\n});\n\n// Quote Carousel Slider\n$('.quote-carousel-slider').each(function (idx, item) {\n  var slideCount = this.querySelectorAll('.quote-slide').length;\n  var sliderId = \"slider\" + idx;\n  this.id = sliderId;\n  if (slideCount > 1) {\n    $(this).slick({\n      dots: true,\n      arrows: false,\n      infinite: true,\n      fade: true,\n      autoplay: false,\n      autoplaySpeed: 3000,\n      slidesToScroll: 1,\n      adaptiveHeight: false,\n      pauseOnHover: false,\n      pauseOnFocus: false,\n      mobileFirst: true\n      // responsive: [\n      //   {\n      //     breakpoint: 1024,\n      //     settings: 'unslick'\n      //   }\n      // ]\n    });\n  }\n});\n\n// comparison chart slider\n$('.comparison-slider-inner').slick({\n  // Your Slick slider options here\n  dots: true,\n  arrows: true,\n  infinite: false,\n  speed: 300,\n  slidesToShow: 1,\n  adaptiveHeight: true,\n  prevArrow: fal
108se,\n  nextArrow: false\n});\n\n// Expandable Modules:\n// 1. Features Module\n\nfunction expandModule() {\n  var openToggle = document.querySelector('.-is-expanded');\n  if (openToggle && openToggle != this) openToggle.classList.remove('-is-expanded');\n  this.classList.toggle('-is-expanded');\n}\nif (document.body.classList.contains('page-template-page-event-listing')) {\n  document.addEventListener('click', function (event) {\n    if (event.target.closest('.js-expand')) return;\n    document.querySelector('.-is-expanded').classList.remove('-is-expanded');\n  }, false);\n}\n\n// Toggle List\nfunction toggleList() {\n  document.querySelector('.list-expand').classList.toggle('-is-expanded');\n}\n\n// Animations\nif (document.body.contains(document.querySelector('.copy__heading'))) {\n  var speed = 40;\n  var heading = document.querySelector('.copy__heading');\n  var delay = heading.innerHTML.length * speed + speed;\n}\nfunction typeEffect(element, speed) {\n  var text = element.innerHTML;\n  element.innerHTML = \"\";\n  var i = 0;\n  var timer = setInterval(function () {\n    if (i < text.length) {\n      element.append(text.charAt(i));\n      i++;\n    } else {\n      clearInterval(timer);\n    }\n  }, speed);\n}\n\n// Lazy Load in Viewport\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  var animateElements = [].slice.call(document.querySelectorAll('.animate'));\n  var options = {\n    threshold: .4\n  };\n  if (\"IntersectionObserver\" in window) {\n    var animateElObserver = new IntersectionObserver(function (entries, observer) {\n      entries.forEach(function (entry) {\n        if (entry.isIntersecting) {\n          var animateEl = entry.target;\n          animateEl.classList.add('-is-visible');\n          animateElObserver.unobserve(animateEl);\n        }\n      });\n    }, options);\n    animateElements.forEach(function (animateEl) {\n      animateElObserver.observe(animateEl);\n    });\n  } else {\n    // Fallback here\n    document.addEventListener(\"scroll\", lazyLoadFallback);\n  }\n});\n\n//Vision Full Section\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  var visionElement = [].slice.call(document.querySelectorAll('.animate--cover'));\n  if (\"IntersectionObserver\" in window) {\n    var visionElObserver = new IntersectionObserver(function (entries, observer) {\n      entries.forEach(function (entry) {\n        if (entry.isIntersecting) {\n          var visionEl = entry.target;\n          visionEl.classList.add('-is-visible');\n          visionElObserver.unobserve(visionEl);\n        }\n      });\n    });\n    visionElement.forEach(function (visionEl) {\n      visionElObserver.observe(visionEl);\n    });\n  } else {\n    document.addEventListener(\"scroll\", lazyLoadFallback);\n  }\n});\n\n// Parallax\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  var parallaxElements = [].slice.call(document.querySelectorAll('.section-collection__image'));\n  var options = {\n    // threshold: .5\n    trackVisibility: true,\n    delay: 100\n  };\n  if (\"IntersectionObserver\" in window) {\n    var parallaxElObserver = new IntersectionObserver(function (entries, observer) {\n      entries.forEach(function (entry) {\n        var parallaxEl = entry.target;\n        if (entry.intersectionRatio > 0) {\n          parallaxEl.classList.add('-is-visible');\n        } else {\n          parallaxEl.classList.remove('-is-visible');\n        }\n      });\n    }, options);\n    parallaxElements.forEach(function (parallaxEl) {\n      parallaxElObserver.observe(parallaxEl);\n    });\n  } else {\n    // Fallback here\n    lazyLoadFallback();\n    document.addEventListener(\"scroll\", lazyLoadFallback);\n  }\n});\nfunction lazyLoadFallback() {\n  var animateElements = [].slice.call(document.querySelectorAll('.animate, .animate--cover, .section-collection__image'));\n  animateElements.forEach(function (animateEl) {\n    if (animateEl.getBoundingClientRect().top <= window.innerHeight && animateEl.getBoundingClientRect().bottom >= 0) {\n      animateEl.classList.add('-is-visible');\n    }\n  });\n}\n$(document).on('click', '.opt-in__close', closeCookieBanner);\nfunction closeCookieBanner() {\n  $('#pi_tracking_opt_in_div').addClass('hide');\n  setTimeout(function () {\n    $('#pi_tracking_opt_in_no').click();\n  }, 500);\n}\n$('.wpcf7-form').removeAttr('novalidate');\n$('.wpcf7-validates-as-required').prop('required', true);
108\n\n// Adjust Contact Form 7 Default Behavior\n$('.wpcf7-form').on('submit', function (event) {\n  // var $successElement = $('.wpcf7-response-output');\n  // $successElement.text('Thank you for your submission');\n  // $successElement.show();\n\n  $('.wpcf7-form').addClass('-is-loading');\n  $('.loader').addClass('active');\n});\n\n// Map\nObject(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('mouseenter', document.querySelectorAll(\"[data-hotspot]\"), showLocations);\nObject(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('mouseleave', document.querySelectorAll(\"[data-hotspot]\"), hideLocations);\nfunction showLocations(event) {\n  var hotspot = event.target.dataset.hotspot;\n  var items = document.querySelectorAll(\"[data-location=\\\"\".concat(hotspot, \"\\\"]\"));\n  items.forEach(function (item) {\n    item.classList.add('active');\n  });\n}\nfunction hideLocations(event) {\n  var hotspot = event.target.dataset.hotspot;\n  var items = document.querySelectorAll(\"[data-location=\\\"\".concat(hotspot, \"\\\"]\"));\n  items.forEach(function (item) {\n    item.classList.remove('active');\n  });\n}\n\n// Custom Video controls\n$(window).load(function () {\n  $('.slide__control-overlay').each(function () {\n    $(this).on('click', function (event) {\n      event.preventDefault();\n      var slick = $(this).closest('.section-slider__slides');\n      var slide = $(this).closest('.slide');\n      var overlay = $(this);\n      if ($(overlay).hasClass('paused')) {\n        $(overlay).removeClass('paused');\n        $(overlay).addClass('playing');\n        playVideo(slide);\n      } else {\n        $(overlay).removeClass('playing');\n        $(overlay).addClass('paused');\n        pauseVideo(slide);\n      }\n    });\n  });\n});\nfunction playVideo(slide) {\n  if ($(slide).has('.slide__embed').length) {\n    var iframe = $(slide).find('iframe')[0];\n    var data = {\n      method: \"play\"\n    };\n    iframe.contentWindow.postMessage(JSON.stringify(data), \"*\");\n  } else {\n    var video = $(slide).find('video');\n    video[0].play();\n  }\n}\nfunction pauseVideo(slide) {\n  if ($(slide).has('.slide__embed').length) {\n    var iframe = $(slide).find('iframe')[0];\n    var data = {\n      method: \"pause\"\n    };\n    iframe.contentWindow.postMessage(JSON.stringify(data), \"*\");\n  } else {\n    var video = $(slide).find('video');\n    video[0].pause();\n  }\n}\n\n// Home Hero Carousel\nsessionStorage.setItem('isLoopingHeroCarousel', \"false\");\nif (window.location.pathname === \"/\") {\n  sessionStorage.setItem(\"isLoopingHeroCarousel\", \"true\");\n} else {\n  sessionStorage.setItem(\"isLoopingHeroCarousel\", \"false\");\n}\n\n// home draggable section\nvar mouseDown = false;\nvar startX, scrollLeft;\nvar slider = document.querySelector('#wrap-whats-on-grid');\nvar dragged = false;\nvar startDragging = function startDragging(e) {\n  e.preventDefault();
108\n  mouseDown = true;\n  startX = e.pageX - slider.offsetLeft;\n  scrollLeft = slider.scrollLeft;\n};\nvar stopDragging = function stopDragging(e) {\n  e.preventDefault();\n  e.stopImmediatePropagation();\n  mouseDown = false;\n};\nvar move = function move(e) {\n  e.preventDefault();\n  if (!mouseDown) {\n    dragged = false;\n    return;\n  } else {\n    dragged = true;\n    var x = e.pageX - slider.offsetLeft;\n    var scroll = x - startX;\n    slider.scrollLeft = scrollLeft - scroll;\n  }\n};\nvar noFollowLink = function noFollowLink(e) {\n  if (dragged) {\n    e.preventDefault();\n    e.stopImmediatePropagation();\n  }\n};\n\n// Feature Group Slider\n// $('.feature_group-slides').each(function(idx, item) {\n//   var slideCount = this.querySelectorAll('.section-feature_group__image').length\n//   var sliderId = \"slider\" + idx;\n//   this.id = sliderId;\n\n//   if (slideCount > 1) {\n//     $(this).slick({\n//       dots: true,\n//       arrows: false,\n//       infinite: true,\n//       fade: true,\n//       autoplay: false,\n//       autoplaySpeed: 3000,\n//       slidesToScroll: 1,\n//       adaptiveHeight: false,\n//       pauseOnHover: false,\n//       pauseOnFocus: false,\n//       mobileFirst: true,\n//       responsive: [\n//         {\n//           breakpoint: 1024,\n//           settings: 'unslick'\n//         }\n//       ]\n//     })\n//   }\n// });
108\n\nfunction initializePricingSlick() {\n  setTimeout(function () {\n    if ($(window).width() > 1000) {\n      if ($('.row-pricing').hasClass('slick-initialized')) {\n        $('.row-pricing').slick('unslick');\n      }\n    }\n    if ($(window).width() < 1000) {\n      if ($('.row-pricing').hasClass('slick-initialized')) {\n        $('.row-pricing').slick('unslick');\n      }\n      $('.row-pricing').slick({\n        dots: true\n      });\n    }\n  }, 0);\n}\n$(document).ready(function () {\n  initializePricingSlick();\n});\nvar previousWidth = window.innerWidth;\n$(window).on('resize', function () {\n  var currentWidth = window.innerWidth;\n  if (currentWidth !== previousWidth) {\n    initializePricingSlick();\n    // Update the previous width\n    previousWidth = currentWidth;\n  }\n});\n\n// Add the event listeners\nif (slider) {\n  slider.addEventListener('click', noFollowLink, false);\n  slider.addEventListener('mousemove', move, false);\n  slider.addEventListener('mousedown', startDragging, false);\n  slider.addEventListener('mouseup', stopDragging, false);\n  slider.addEventListener('mouseleave', stopDragging, false);\n}\nfunction writeParamsToInputs() {\n  // Function to get the value of a cookie by name\n  function getCookie(name) {\n    var cookieArr = document.cookie.split(\";\");\n    for (var i = 0; i < cookieArr.length; i++) {\n      var cookiePair = cookieArr[i].split(\"=\");\n      if (name == cookiePair[0].trim()) {\n        return decodeURIComponent(cookiePair[1]);\n      }\n    }\n    return null;\n  }\n\n  // Function to get the value of a URL parameter by name\n  function getUrlParameter(name) {\n    name = name.replace(/[\\[\\]]/g, '\\\\$&');\n    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n      results = regex.exec(window.location.href);\n    if (!results) return null;\n    if (!results[2]) return '';\n    return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n  }\n\n  // List of parameters to check\n  var params = ['gclid', 'utm_source', 'utm_campaign', 'utm_medium'];\n\n  // Find and set the value for each parameter\n  params.forEach(function (param) {\n    var value = getUrlParameter(param) || getCookie(param);\n    if (value) {\n      var labels = document.getElementsByTagName('label');\n      var _iterator = _createForOfIteratorHelper(labels),\n        _step;\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var label = _step.value;\n          if (label.textContent.trim() === param) {\n            var ginputContainer = label.nextElementSibling;\n            if (ginputContainer && ginputContainer.classList.contains('ginput_container')) {\n              var input = ginputContainer.getElementsByTagName('input')[0];\n              if (input) {\n                input.value = value;\n                break;\n              }\n            }\n          }\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n    }\n  });\n}\n\n// Call the function\nif (document.querySelector('.gform-body')) {\n  writeParamsToInputs();\n}\n$(document).ready(function () {\n  // function logElementEvent(eventName, element) {\n  //   console.log(Date.now(), eventName, element.getAttribute(\"data-src\"));\n  // }\n  // var callback_enter = function (element) {\n  //   logElementEvent(\"🔑 ENTERED\", element);\n  // };\n  // var callback_exit = function (element) {\n  //   logElementEvent(\"🚪 EXITED\", element);\n  // };\n  // var callback_loading = function (element) {\n  //   logElementEvent(\"⌚ LOADING\", element);\n  // };\n  // var callback_loaded = function (element) {\n  //   logElementEvent(\"👍 LOADED\", element);\n  // };\n  // var callback_error = function (element) {\n  //   logElementEvent(\"💀 ERROR\", element);\n  //   element.src = \"https://via.placeholder.com/440x560/?text=Error+Placeholder\";\n  // };\n  // var callback_finish = function () {\n  //   logElementEvent(\"✔️ FINISHED\", document.documentElement);\n  // };\n  // var callback_cancel = function (element) {\n  //   logElementEvent(\"🔥 CANCEL\", element);\n  // };\n\n  var windowWidth = window.innerWidth;\n  var threshold = -200;\n  if (windowWidth < 1024) {\n    threshold = 0;\n  }\n  var ll = new _lazyload__WEBPACK_IMPORTED_MODULE_1___default.a({\n    threshold: threshold,\n    // use_native: true, // use native lazy loading when browser compatible\n    elements_selector: \".lazy\",\n    use_native: true,\n    callback_loaded: function callback_loaded(el) {\n      // Optional: handle when images are loaded\n      el.classList.add('loaded');\n    }\n\n    // class_applied: \"lz-applied\",\n    // class_loading: \"lz-loading\",\n    // class_loaded: \"lz-loaded\",\n    // class_error: \"lz-error\",\n    // class_entered: \"lz-entered\",\n    // class_exited: \"lz-exited\",\n    // Assign the callbacks defined above\n    // callback_enter: callback_enter,\n    // callback_exit: callback_exit,\n    // callback_cancel: callback_cancel,\n    // callback_loading: callback_loading,\n    // callback_loaded: callback_loaded,\n    // callback_error: callback_error,\n    // callback_finish: callback_finish\n  });\n  $(document).on('click', function (e) {\n    // console.log(e.target)\n  });\n  $('#plan-compare-prev, #plan-compare-next').on('click', function (e) {\n    e.stopPropagation(); // Stop the event from bubbling up to parent elements\n\n    var targetAnimate = $('.plan-wrap');\n    var targetSection = $('.section-plan-comparison');\n    var clickedId = $(this).attr('id'); // Use $(this) to get the id of the clicked element\n\n    if (clickedId === 'plan-compare-prev' && targetSection.hasClass('active')) {\n      targetAnimate.animate({\n        scrollLeft: 0\n      }, 200, function () {\n        // Animation complete, remove the active class\n        targetSection.removeClass('active');\n      });\n    }
108\n    if (clickedId === 'plan-compare-next' && !targetSection.hasClass('active')) {\n      targetSection.addClass('active');\n      // Calculate the maximum scroll position\n      var maxScrollLeft = targetAnimate[0].scrollWidth - targetAnimate.outerWidth();\n      // Animate scroll to the maximum scroll position\n      targetAnimate.animate({\n        scrollLeft: maxScrollLeft\n      }, 200, function () {\n        // targetSection.removeClass('scrolling');\n      });\n    }\n  });\n\n  // Variable to hold the last horizontal scroll position\n  var lastScrollLeft = 0;\n\n  // Variable to hold the reference to the debounce timeout\n  var debounceTimeout = null;\n  var debounceDelay = 100; // Delay in milliseconds\n\n  $('.plan-wrap').on('scroll', function () {\n    // Clear the previous timeout to reset the debounce timer\n    clearTimeout(debounceTimeout);\n\n    // Set a new timeout\n    debounceTimeout = setTimeout(function () {\n      // Get the current horizontal scroll position\n      var currentScrollLeft = $('.plan-wrap').scrollLeft();\n      var targetAnimate = $('.plan-wrap');\n      var targetSection = $('.section-plan-comparison');\n\n      // Check if scrolling from right to left\n      if (currentScrollLeft < lastScrollLeft) {\n        if (targetSection.hasClass('active')) {\n          targetAnimate.animate({\n            scrollLeft: 0\n          }, 200, function () {\n            // Animation complete, remove the active class\n            targetSection.removeClass('active');\n          });\n        }\n      } else {\n        targetSection.addClass('active');\n        // Calculate the maximum scroll position\n        var maxScrollLeft = targetAnimate[0].scrollWidth - targetAnimate.outerWidth();\n        // Animate scroll to the maximum scroll position\n        targetAnimate.animate({\n          scrollLeft: maxScrollLeft\n        }, 200);\n      }\n\n      // Update the last scroll position to the current one for the next scroll event\n      lastScrollLeft = currentScrollLeft;\n    }, debounceDelay);\n  });\n\n  // make nav dark if first element is dark\n  var mainBodyTheme = $('#content >:first-child').attr('data-theme');\n  if (mainBodyTheme && mainBodyTheme == 'dark') {\n    $('#header').attr('data-theme', 'dark');\n  }\n\n  // form split trigger click\n  var location, usage, desks, seats;\n  var memParent, memChild;\n  // $('.form-split-section .nh-radio-button .gfield_radio > .gchoice').click(function(e) {\n  function nhMemberFormClicks() {\n    $('.form-split-section .nh-radio-button .gfield_radio > .gchoice').click(function (e) {\n      // check if click location button or membership type button\n      if ($(this).closest('.nh-radio-membership').length > 0) {\n        // remove active from parent nh radio buttons\n        $('.nh-radio-membership').removeClass('active');\n        $('.nh-radio-membership').removeClass('nh-radio-membership-default');\n\n        // Uncheck all radio buttons inside all divs with the class nh-radio-location\n        $(this).closest('.nh-radio-membership').addClass('active');\n        $('.nh-radio-membership').find('.gfield-choice-input').prop('checked', false);\n        $('.nh-radio-membership').find('.gfield-choice-input').change();\n        $('.nh-radio-membership .gchoice').removeClass('checked');\n\n        // Then, check the radio button within the clicked .gchoice\n        $(this).find('.gfield-choice-input').prop('checked', true);\n        $(this).find('.gfield-choice-input').change();\n        $(this).addClass('checked');\n      } else if ($(this).closest('.nh-radio-location').length > 0) {\n        // First, uncheck all radio buttons in the same group\n        $(this).siblings().find('.gfield-choice-input').prop('checked', false);\n        $(this).siblings().removeClass('checked');\n        // Then, check the radio button within the clicked .gchoice\n        $(this).closest('.nh-radio-location').addClass('active');\n        $(this).find('.gfield-choice-input').prop('checked', true);\n        $(this).addClass('checked');\n      } else {\n        // First, uncheck all radio buttons in the same group\n        $(this).siblings().find('.gfield-choice-input').prop('checked', false);\n        $(this).siblings().removeClass('checked');\n        // Then, check the radio button within the clicked .gchoice\n        $(this).closest('.nh-radio-button').addClass('active');\n        $(this).find('.gfield-choice-input').prop('checked', true);\n        $(this).addClass('checked');\n      }\n\n      // become member form\n      if ($(this).closest('.nh-becomemember-form').length > 0) {\n        // if fieldset with class nh-radio-salon has class of active\n        if ($(this).closest('.nh-radio-salon').hasClass('active')) {\n          // find closes submit button and change value to Apply\n          $('#gform_submit_button_34').val('Apply');\n        }\n        // if fieldset with class nh-radio-resident has class of active\n        if ($(this).closest('.nh-radio-resident').hasClass('active')) {\n          // find closes submit button and change value to Apply\n          $('#gform_submit_button_34').val('Submit');\n        }\n      }\n\n      // build membership form\n      if ($(this).closest('.nh-radio-buildmember').length > 0) {\n        if ($(this).closest('.nh-radio-buildmember').hasClass('location')) {\n          location = $(this).find('.gfield-choice-input').val();\n        } else if ($(this).closest('.nh-radio-buildmember').hasClass('usage')) {\n          usage = $(this).find('.gfield-choice-input').val();\n        } else if ($(this).closest('.nh-radio-buildmember').hasClass('desks')) {\n          desks = $(this).find('.gfield-choice-input').val();\n        } else if ($(this).closest('.nh-radio-buildmember').hasClass('seats')) {\n          seats = $(this).find('.gfield-choice-input').val();\n        }\n        if (location == 'madison-square') {\n          location = 'Madison Square';\n        } else if (location == 'hollywood') {\n          location = 'Hollywood';\n        } else if (location == 'venice-beach') {\n          location = 'Venice Beach';\n        }\n        if (desks == 'dedicated-desk') {\n          memParent = 'Resident';\n          memChild = 'Atelier';\n        }\n        if (desks == 'private-space') {\n          memParent = 'Resident';\n          memChild = 'Studio';\n        }\n        if (desks == 'flexible-seating') {\n          if (usage == 'unlimited') {\n            memParent = 'Resident';\n            memChild = 'Gallery';\n          } else {\n            memParent = 'Salon';\n            if (seats == '1' || seats == '2-4') {\n              memChild = 'Indiv
108idual';\n            } else {\n              memChild = 'Team';\n            }\n          }\n        }\n\n        // Set the cookies\n        var now = new Date();\n        now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); // 1 year from now\n        var expires = \"expires=\" + now.toUTCString();\n        document.cookie = \"location=\" + location + \";\" + expires + \";path=/\";\n        var membershipType = memParent + ' ' + memChild;\n        document.cookie = \"membershipType=\" + membershipType + \";\" + expires + \";path=/\";\n      }\n    }); // close click event handler\n  } // close nhMemberFormClicks function\n  nhMemberFormClicks();\n  function getCookie(name) {\n    var cookieArr = document.cookie.split(\";\");\n    for (var i = 0; i < cookieArr.length; i++) {\n      var cookiePair = cookieArr[i].split(\"=\");\n      if (name == cookiePair[0].trim()) {\n        // Decode the cookie value and return\n        return decodeURIComponent(cookiePair[1]);\n      }\n    }\n    // Return null if not found\n    return null;\n  }\n\n  // set cookies to use on next page of form\n  $(document).on('gform_page_loaded', function (event, formId, currentPage) {\n    $('.__buildmembership .form__img').each(function () {\n      $(this).removeClass('active');\n      if (!$(this).hasClass('hidden')) {\n        $(this).addClass('hidden');\n      }\n    });\n    $('.__buildmembership .selection_text').each(function () {\n      $(this).removeClass('active');\n    });\n    var viewportWidth = $(window).width();\n    if (viewportWidth < 1024) {\n      $('.__buildmembership').each(function () {\n        $(this).removeClass('active');\n        $(this).height(0);\n      });\n    }\n    if (currentPage == 2) {\n      // Retrieve cookie values\n      var locationCookie = getCookie(\"location\");\n      var membershipTypeCookie = getCookie(\"membershipType\");\n\n      // Check if the cookies exist and set the text of the fields accordingly\n      if (locationCookie) {\n        $('#nh-buildmemberform-membership-location').text(locationCookie);\n        $('.nh-location-calc').find('.ginput_container input').val(locationCookie);\n      }\n      if (membershipTypeCookie) {\n        $('#nh-buildmemberform-membership-type').text(membershipTypeCookie);\n        $('.nh-membership-calc').find('.ginput_container input').val(membershipTypeCookie);\n      }\n\n      // build member form submit button text\n      if ($('.nh-buildmemberform').length > 0) {\n        // if fieldset with class nh-radio-salon has class of active\n        if ($('#nh-buildmemberform-membership-type').text().toLowerCase().includes('salon')) {\n          // find closes submit button and change value to Apply\n          $('#gform_submit_button_35').val('Apply');\n        }\n        // if fieldset with class nh-radio-resident has class of active\n        if ($('#nh-buildmemberform-membership-type').text().toLowerCase().includes('resident')) {\n          // find closes submit button and change value to Apply\n          $('#gform_submit_button_35').val('Submit');\n        }\n\n        // show the right image\n        // remove the word 'salon' or 'resident' from the membership type\n        var membershipType = $('#nh-buildmemberform-membership-type').text().toLowerCase();\n        membershipType = membershipType.replace('salon', '');\n        membershipType = membershipType.replace('resident', '');\n        membershipType = membershipType.trim();\n\n        //slugify location, replaces spaces with dashes\n        var _location = $('#nh-buildmemberform-membership-location').text().toLowerCase();\n        _location = _location.replace(/\\s+/g, '-');\n\n        // console.log(location, membershipType);\n\n        $('.__buildmembership .form__img[data-location=\"' + _location + '\"][data-membership=\"' + membershipType + '\"]').addClass('active').removeClass('hidden');\n        $('.__buildmembership .selection_text[data-location=\"' + _location + '\"][data-membership=\"' + membershipType + '\"]').addClass('active');\n        if (viewportWidth < 1024) {\n          $('#gform_' + formId).closest('.dynamic-enabled').find('.__buildmembership').each(function () {\n            // console.log($(this))\n            // $(currentPage).closest('.dyanmic-enabled').find('.__buildmembership').each(function(){\n            var $this = $(this);\n            var currentHeight = $this.height();\n            var autoHeight = $this.css('height', 'auto').height();\n            $this.height(currentHeight); // Reset to original height\n\n            $this.animate({\n              height: autoHeight\n            }, 400); // Adjust the duration as needed\n            $this.addClass('active');\n          });\n        } else {\n          $('#gform_' + formId).closest('.dynamic-enabled').find('.__buildmembership').each(function () {\n            if ($(this).hasClass('active')) {\n              $(this).height('auto');\n            }\n          });\n        }\n      }\n    }\n    formDefaultChecked();\n    nhMemberFormClicks();\n  });\n\n  // set location cookie without click\n  setTimeout(function () {\n    if ($('.gform_page').hasClass('nh-buildmemberform')) {\n      if ($('.nh-radio-buildmember.location').hasClass('active')) {\n        location = $('.nh-radio-buildmember.location .gfield-choice-input:checked').val();\n        if (location == 'madison-square') {\n          location = 'Madison Square';\n        } else if (location == 'hollywood') {\n          location = 'Hollywood';\n        } else if (location == 'venice-beach') {\n          location = 'Venice Beach';\n        }\n        var now = new Date();\n        now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); // 1 year from now\n        var expires = \"expires=\" + now.toUTCString();\n        document.cookie = \"location=\" + location + \";\" + expires + \";path=/\";\n      }\n    }\n  }, 800);\n\n  // form split load default checked on membership pages\n  function formDefaultChecked() {\n    if ($('.nh-radio-button').length > 0) {\n      $('.nh-radio-button').each(function () {\n        var radioChecked = $(this).find('.gfield-choice-input:checked').closest('.gchoice');\n        radioChecked.addClass('checked');\n        radioChecked.closest('.nh-radio-button').addClass('active');\n      });\n    }
108\n    // if no gchoice items have class checked, add class nh-radio-membership-default to the element with class nh-radio-membership\n    if ($('.nh-radio-membership .gchoice.checked').length == 0) {\n      $('.nh-radio-membership').addClass('nh-radio-membership-default');\n    }\n\n    // become member form\n    if ($('.nh-becomemember-form').length > 0) {\n      // if fieldset with class nh-radio-salon has class of active\n      if ($('.nh-becomemember-form .nh-radio-salon').hasClass('active')) {\n        // find closes submit button and change value to Apply\n        $('.nh-becomemember-form input[type=\"submit\"]').val('Apply');\n      }\n      // if fieldset with class nh-radio-resident has class of active\n      if ($(this).closest('.nh-radio-resident').hasClass('active')) {\n        // find closes submit button and change value to Apply\n        $('.nh-becomemember-form input[type=\"submit\"]').val('Submit');\n      }\n    }\n  }\n  formDefaultChecked();\n  $('.nh-radio-button .gfield_radio .gchoice').hover(function () {\n    $(this).closest('.nh-radio-button').toggleClass('hover');\n  });\n\n  // save important form inputs to Dom to use in redirect\n  function nhGfCollectInputs(formIdNum) {\n    // console.log('collecting inputs');\n    var gformIds = ['34', '35'];\n    if ($('#gform_' + formIdNum + '_validation_container').hasClass('gform_validation_error') || !gformIds.includes(formIdNum)) {\n      return;\n    }\n    var $formId = $('#gform_' + formIdNum);\n\n    // if form id not found return\n    if ($formId.length == 0) {\n      return;\n    }\n    var salonCheck = false;\n    var locationTarget, membershipTarget;\n    if (formIdNum == 35) {\n      locationTarget = $('#nh-buildmemberform-membership-location').text().toLowerCase();\n      membershipTarget = $('#nh-buildmemberform-membership-type').text().toLowerCase();\n      salonCheck = membershipTarget.includes('salon');\n    }\n    if (formIdNum == 34) {\n      locationTarget = $formId.find('.nh-radio-location input:checked').val();\n      membershipTarget = $formId.find('.nh-radio-salon').hasClass('active') ? 'salon' : 'resident';\n      salonCheck = membershipTarget.toLowerCase().includes('salon');\n    }\n    $formId.closest('.form-split-section').attr('data-location-target', locationTarget);\n    $formId.closest('.form-split-section').attr('data-membership-target', membershipTarget.toLowerCase());\n    $formId.closest('.form-split-section').attr('data-salon-check', salonCheck);\n  }\n\n  // collection inputs on form submission\n  $('body').on('click', 'input[id^=\"gform_submit_button_\"]', function (e) {\n    // Get the button's ID\n    var buttonId = $(this).attr('id');\n    // Extract the number from the ID\n    var formNumber = buttonId.replace('gform_submit_button_', '');\n    nhGfCollectInputs(formNumber);\n  });\n\n  // still not sure show form\n  $('body').on('click', '#still-not-sure', function (e) {\n    e.preventDefault();\n    $(this).closest('.contact_form').find('.gfield_error').removeClass('gfield_error'); // Remove error class from fields\n    $(this).closest('.contact_form').find('.validation_message').hide(); // Hide validation messages\n    $(this).closest('.contact_form').find('.validation_error').hide(); // Hide the form-wide validation error message\n    $(this).closest('.contact_form').find('.gform_validation_errors').hide(); // Hide the form-wide validation error message\n\n    $(this).closest('.form-split-section').find('.contact_form-not-sure').show();\n    $(this).closest('.contact_form').hide();\n  });\n\n  // still not sure hide form\n  $('body').on('click', '#still-not-sure-off', function (e) {\n    e.preventDefault();\n    $(this).closest('.contact_form').find('.gfield_error').removeClass('gfield_error'); // Remove error class from fields\n    $(this).closest('.contact_form').find('.validation_message').hide(); // Hide validation messages\n    $(this).closest('.contact_form').find('.validation_error').hide(); // Hide the form-wide validation error message\n    $(this).closest('.contact_form').find('.gform_validation_errors').hide(); // Hide the form-wide validation error message\n\n    $(this).closest('.form-split-section').find('.contact_form').show();\n    $(this).closest('.form-split-section').find('.contact_form-not-sure').hide();\n    //closest contact_form without class .contact_form-not-sure\n  });\n\n  ///////////////////////////////////////\n  // dynamic form data\n  ///////////////////////////////////////\n  // Bind click event to .gfield-choice-input and .gchoice elements\n  $('.gfield-choice-input, .gchoice').on('click', function (e) {\n    // Find the closest form-split-section parent\n    var section = $(this).closest('.form-split-section');\n    nhFormActiveInputs(section);\n  });\n  function nhFormActiveInputs(section) {\n    // find the child input of nh-radio-membership and nh-radio-location that are checked within the section\n    var membershipChecked = section.find('.nh-radio-membership .gfield-choice-input:checked').val();\n    var locationChecked = section.find('.nh-radio-location .gfield-choice-input:checked').val();\n\n    // console.log(membershipChecked, locationChecked);\n\n    // Scope to the section with class 'form-split-section'\n    section.find('.form__img').each(function () {\n      if ($(this).data('membership') == membershipChecked && $(this).data('location') == locationChecked || $(this).data('membership') == 'any' && $(this).data('location') == locationChecked) {\n        $(this).removeClass('hidden').addClass('active');\n\n        // animate section height on mobile\n        var viewportWidth = $(window).width();\n        var $sectionText = section.find('.form-split-section__text');\n        if (viewportWidth < 768) {\n          section.find('.form-split-section__images').addClass('active').animate({\n            height: '170'\n          });\n        } else if (viewportWidth < 1024) {\n          section.find('.form-split-section__images').addClass('active').animate({\n            height: '220'\n          });\n          if (!$sectionText.hasClass('active')) {\n            section.find('.form-split-section__text').each(function () {\n              var $this = $(this);\n              var tallestHeight = 0;\n\n              // Find the tallest p.selection_text\n              $this.find('p.selection_text').each(function () {\n                var textHeight = $(this).height();\n                if (textHeight > tallestHeight) {\n                  tallestHeight = textHeight;\n                }\n              });\n              $this.css('height', '0'); // Reset to original height of 0\n\n              $this.animate({\n                height: tallestHeight\n              }, 400); // Adjust the duration as needed\n              $this.addClass('active');\n            });\n          }\n        }\n      }
108 else if (!$(this).hasClass('hidden')) {\n        $(this).addClass('hidden').removeClass('active');\n      }\n    });\n    section.find('.selection_text').each(function () {\n      if ($(this).data('membership') == membershipChecked && $(this).data('location') == locationChecked) {\n        $(this).addClass('active');\n      } else {\n        $(this).removeClass('active');\n      }\n    });\n  }\n\n  // Debounce function\n  function debounce(func, wait) {\n    var timeout;\n    return function () {\n      var _this = this;\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      var later = function later() {\n        clearTimeout(timeout);\n        func.apply(_this, args);\n      };\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n    };\n  }\n\n  // Function to update the tallest height and reapply the function on window resize\n  function updateTallestHeight() {\n    var viewportWidth = $(window).width();\n    if (viewportWidth < 1024) {\n      // become member\n      $('.dynamic-enabled').each(function () {\n        if ($(this).find('.__becomemember').length > 0) {\n          if ($(this).find('.form-split-section__images').hasClass('active')) {\n            $(this).find('.form-split-section__images.active').css('height', '170px');\n          } else {\n            $(this).find('.form-split-section__images').css('height', '0');\n          }\n          var tallestHeight = 0;\n          $(this).find('p.selection_text').each(function () {\n            var textHeight = $(this).height();\n            if (textHeight > tallestHeight) {\n              tallestHeight = textHeight;\n            }\n          });\n          var textContainer = $(this).find('.form-split-section__text');\n          if (textContainer.hasClass('active')) {\n            textContainer.animate({\n              height: tallestHeight\n            }, 400); // Animate to the tallest height\n          }\n        }\n        if ($(this).find('.__buildmembership').length > 0) {\n          if ($(this).find('.__buildmembership').hasClass('active')) {\n            $(this).find('.__buildmembership').css('height', 'auto');\n          } else {\n            $(this).find('.__buildmembership').css('height', '0');\n          }\n        }\n      });\n    }\n    if (viewportWidth > 1024) {\n      $('.dynamic-enabled').each(function () {\n        if ($(this).find('.__becomemember').length > 0) {\n          $(this).find('.form-split-section__images').css('height', 'auto');\n          $(this).find('.form-split-section__text').css('height', 'auto');\n        }\n        if ($(this).find('.__buildmembership').length > 0) {\n          $(this).find('.__buildmembership').css('height', 'auto');\n        }\n      });\n    }\n  }\n\n  // Bind the debounced function to window resize\n  $(window).resize(debounce(updateTallestHeight, 200));\n  function equalizeHeaderHeights() {\n    var $headers = $('.comparison-child-header');\n    var maxHeight = 0;\n    var tallestHeader = null;\n\n    // Reset heights and log initial state\n    $headers.each(function (index) {\n      $(this).css('height', 'auto');\n      var currentHeight = $(this).outerHeight();\n      if (currentHeight > maxHeight) {\n        maxHeight = currentHeight;\n        tallestHeader = $(this);\n      }\n    });\n\n    // Set all headers to the height of the tallest header\n    $headers.height(maxHeight);\n  }\n  // Run after a short delay to ensure content is loaded\n  setTimeout(equalizeHeaderHeights, 100);\n\n  // Run on window resize, but wait until resize is finished\n  var resizeTimer;\n  $(window).on('resize', function () {\n    clearTimeout(resizeTimer);\n    resizeTimer = setTimeout(equalizeHeaderHeights, 250);\n  });\n\n  // If you're using any image lazy-loading, run after images load\n  // $('img').on('load', equalizeHeaderHeights);\n});\n\n// Create iframes after page load\ndocument.addEventListener('DOMContentLoaded', function () {\n  var placeholders = document.querySelectorAll('.video-embed-placeholder');
108\n  placeholders.forEach(function (placeholder) {\n    var _iframe$classList;\n    var iframe = document.createElement('iframe');\n\n    // Initially set opacity to 0\n    // iframe.style.opacity = '0';\n    // iframe.style.transition = 'opacity 1s ease-in-out';\n\n    // Set the src attribute\n    iframe.src = placeholder.dataset.src;\n\n    // Set additional attributes\n    var attributes = placeholder.dataset.attributes.split(' ');\n    attributes.forEach(function (attr) {\n      var _attr$split = attr.split('='),\n        _attr$split2 = _slicedToArray(_attr$split, 2),\n        key = _attr$split2[0],\n        value = _attr$split2[1];\n      iframe.setAttribute(key, value || '');\n    });\n\n    // Add classes\n    var classes = placeholder.dataset.classes.split(' ');\n    (_iframe$classList = iframe.classList).add.apply(_iframe$classList, _toConsumableArray(classes));\n\n    // Add load event listener\n    iframe.addEventListener('load', function () {\n      // Fade in the iframe\n      // iframe.style.opacity = '1';\n      iframe.classList.add('loaded');\n    });\n\n    // Replace placeholder with iframe\n    placeholder.parentNode.replaceChild(iframe, placeholder);\n  });\n});\n\n// Email popup and tracking opt-in handling\ndocument.addEventListener('DOMContentLoaded', function () {\n  setTimeout(function () {\n    // Check if tracking opt-in div exists on page load and if cookie exists\n    var emailPopup = document.getElementById('email-popup');\n    if (emailPopup && !checkCookie('email-popup-closed')) {\n      if (!document.getElementById('pi_tracking_opt_in_div')) {\n        emailPopup.classList.add('pi-inactive');\n      }\n      emailPopup.classList.add('loaded');\n    } else {\n      emailPopup.classList.add('d-none');\n    }\n  }, 2000);\n});\nsetTimeout(function () {\n  var trackingDiv = document.getElementById('pi_tracking_opt_in_div');\n  if (trackingDiv) {\n    // Create a MutationObserver to watch for style changes\n    var observer = new MutationObserver(function (mutations) {\n      mutations.forEach(function (mutation) {\n        if (mutation.type === 'attributes' && mutation.attributeName === 'style') {\n          // Check if the div is now hidden\n          if (trackingDiv.style.display === 'none') {\n            var emailPopup = document.getElementById('email-popup');\n            if (emailPopup) {\n              emailPopup.classList.add('pi-inactive');\n            }\n            // Disconnect the observer since we no longer need to watch\n            observer.disconnect();\n          }\n        }\n      });\n    });\n\n    // Start observing the tracking div for style changes\n    observer.observe(trackingDiv, {\n      attributes: true,\n      attributeFilter: ['style']\n    });\n  }\n}, 1000);\n\n// Email popup close button\ndocument.addEventListener('DOMContentLoaded', function () {\n  var emailPopup = document.getElementById('email-popup');\n  if (emailPopup) {\n    var closeButton = emailPopup.querySelector('.email-popup__close');\n    closeButton.addEventListener('click', function () {\n      emailPopup.classList.remove('loaded');\n\n      // Create cookie that expires in 30 days\n      createCookie('email-popup-closed', 'true', 30);\n      setTimeout(function () {\n        emailPopup.classList.add('d-none');\n      }, 1000);\n    });\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvc2NyaXB0cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9qcy9zY3JpcHRzLmpzP2U1ZjEiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB8fCBfaXRlcmFibGVUb0FycmF5KHIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShyKSB7IGlmIChcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgb
108nVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByW1wiQEBpdGVyYXRvclwiXSkgcmV0dXJuIEFycmF5LmZyb20ocik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB7IGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocik7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHIsIGUpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQociwgZSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGUpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gdCkgeyB2YXIgZSwgbiwgaSwgdSwgYSA9IFtdLCBmID0gITAsIG8gPSAhMTsgdHJ5IHsgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkgeyBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47IGYgPSAhMTsgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApOyB9IGNhdGNoIChyKSB7IG8gPSAhMCwgbiA9IHI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghZiAmJiBudWxsICE9IHQucmV0dXJuICYmICh1ID0gdC5yZXR1cm4oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7IGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjsgfVxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIociwgZSkgeyB2YXIgdCA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07IGlmICghdCkgeyBpZiAoQXJyYXkuaXNBcnJheShyKSB8fCAodCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSkgfHwgZSAmJiByICYmIFwibnVtYmVyXCIgPT0gdHlwZW9mIHIubGVuZ3RoKSB7IHQgJiYgKHIgPSB0KTsgdmFyIF9uID0gMCwgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgcmV0dXJuIF9uID49IHIubGVuZ3RoID8geyBkb25lOiAhMCB9IDogeyBkb25lOiAhMSwgdmFsdWU6IHJbX24rK10gfTsgfSwgZTogZnVuY3Rpb24gZShyKSB7IHRocm93IHI7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG8sIGEgPSAhMCwgdSA9ICExOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyB0ID0gdC5jYWxsKHIpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgciA9IHQubmV4dCgpOyByZXR1cm4gYSA9IHIuZG9uZSwgcjsgfSwgZTogZnVuY3Rpb24gZShyKSB7IHUgPSAhMCwgbyA9IHI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGEgfHwgbnVsbCA9PSB0LnJldHVybiB8fCB0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAodSkgdGhyb3cgbzsgfSB9IH07IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7IGlmIChyKSB7IGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkociwgYSk7IHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7IHJldHVybiBcIk9iamVjdFwiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCBcIk1hcFwiID09PSB0IHx8IFwiU2V0XCIgPT09IHQgPyBBcnJheS5mcm9tKHIpIDogXCJBcmd1bWVudHNcIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwOyB9IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIHsgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpOyBmb3IgKHZhciBlID0gMCwgbiA9IEFycmF5KGEpOyBlIDwgYTsgZSsrKSBuW2VdID0gcltlXTsgcmV0dXJuIG47IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7IHJldHVybiAociA9IF90b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHsgdmFsdWU6IHQsIGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAgfSkgOiBlW3JdID0gdCwgZTsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmltcG9ydCB7
108IGdyb3VwRXZlbnRMaXN0ZW5lciB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IExhenlMb2FkIGZyb20gJy4vbGF6eWxvYWQnO1xuaWYgKHdpbmRvdy5Ob2RlTGlzdCAmJiAhTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2gpIHtcbiAgTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaDtcbn1cbmlmICh3aW5kb3cuRWxlbWVudCAmJiAhRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdCkge1xuICBFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0ID0gZnVuY3Rpb24gKHMpIHtcbiAgICB2YXIgbWF0Y2hlcyA9ICh0aGlzLmRvY3VtZW50IHx8IHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzKSxcbiAgICAgIGksXG4gICAgICBlbCA9IHRoaXM7XG4gICAgZG8ge1xuICAgICAgaSA9IG1hdGNoZXMubGVuZ3RoO1xuICAgICAgd2hpbGUgKC0taSA+PSAwICYmIG1hdGNoZXMuaXRlbShpKSAhPT0gZWwpIHt9XG4gICAgICA7XG4gICAgfSB3aGlsZSAoaSA8IDAgJiYgKGVsID0gZWwucGFyZW50RWxlbWVudCkpO1xuICAgIHJldHVybiBlbDtcbiAgfTtcbn1cblxuLy8gSGVhZGVyIEV2ZW50c1xudmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuJChkb2N1bWVudCkub24oJ3JlYWR5JywgZnVuY3Rpb24gKCkge1xuICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2UtdGVtcGxhdGUtcGFnZS1mYXEnKSkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmaXhlZEhlYWRlcik7XG4gIH1cblxuICAvLyBJZiBTdWJuYXYgRXhzaXN0c1xuICBpZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLS1zdWJuYXYnKSkpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZml4ZWRIZWFkZXIpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1zdWJuYXYtdG9nZ2xlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVTdWJOYXYpO1xuICAgIGdyb3VwRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3VibmF2IGEnKSwgY2xvc2VTdWJOYXYpO1xuICAgIGdyb3VwRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3VibmF2X19pdGVtLWxpbmsnKSwgc2V0QWN0aXZlTGluayk7XG4gIH1cbiAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbGF5JykpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtcGxheScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlVmlkZW8pO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idG4tLXBsYXknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZVBsYXkpO1xuICB9XG4gIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tb2RhbCcpKSB8fCBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnc2VhcmNoJykpIHtcbiAgICBncm91cEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLW1vZGFsJyksIHRvZ2dsZU1vZGFsKTtcbiAgICBncm91cEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLWNsb3NlLW1vZGFsJyksIGNsb3NlTW9kYWwpO1xuICB9XG4gIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnc2luZ2xlLW5ldWVqb3VybmFsJykpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY2xpcGJvYXJkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjb3B5VG9DbGlwYm9hcmQpO1xuICB9XG4gIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZXdzbGV0dGVyLXBvcHVwJykpKSB7XG4gICAgdG9nZ2xlTmV3c2xldHRlcigpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgTmV3c2xldHRlciBNb2RhbCBoYXMgYW55IHJlc3BvbnNlcyBhZnRlciBTdWJtaXNzaW9uIC0tIFNob3cgTW9kYWwgd2l0aFxuICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ld3NsZXR0ZXItcG9wdXAgLm1jNHdwLWFsZXJ0JykpIHtcbiAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtbW9kYWwtd2luZG93PVxcXCJuZXdzbGV0dGVyXFxcIl1cIik7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgYWRkTW9kYWxDbG9zZUV2ZW50KG1vZGFsKTtcbiAgfVxufSk7XG5pZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGFtYnVyZ2VyJykpKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oYW1idXJnZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2JpbGVOYXYpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLS1tb2JpbGUgLmJ0bi0tY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9iaWxlTmF2KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFyaWEtZXhwYW5kZWQtdG9nZ2xlJykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVBcmlhRXhwYW5kZWQpO1xuICB9KTtcbiAgdmFyIG1vYmlsZU1lbnVJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZWFkZXItLW1vYmlsZSAubWVudS1pdGVtLWhhcy1jaGlsZHJlbicpO1xuICBtb2JpbGVNZW51SXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVTdWJNZW51KTtcbiAgfSk7XG59IGVsc2Uge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXJpYS1leHBhbmRlZC10b2dnbGUnKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0b2dnbGVBcmlhRXhwYW5kZWQpO1xuICB9KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFyaWEtZXhwYW5kZWQtdG9nZ2xlJykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0b2dnbGVBcmlhRXhwYW5kZWQpO1xuICB9KTtcbn1cblxuLy8gRXhwYW5kIE1vZHVsZVxuZ3JvdXBFdmVudExpc3RlbmVyKCdjbGljaycsIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1leHBhbmQnKSwgZXhwYW5kTW9kdWxlKTtcbmdyb3VwRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb2
108N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdG9nZ2xlLWxpc3QnKSwgdG9nZ2xlTGlzdCk7XG5mdW5jdGlvbiBvcGVuTW9iaWxlTmF2KCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLS1tb2JpbGUnKS5jbGFzc0xpc3QuYWRkKCctaXMtb3BlbicpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRuLS1jbG9zZScpLmZvY3VzKCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jbGFzc0xpc3QuYWRkKCctaGlkZS1wYWdlLW92ZXJmbG93Jyk7XG59XG5mdW5jdGlvbiBjbG9zZU1vYmlsZU5hdigpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlci0tbW9iaWxlJykuY2xhc3NMaXN0LnJlbW92ZSgnLWlzLW9wZW4nKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmNsYXNzTGlzdC5yZW1vdmUoJy1oaWRlLXBhZ2Utb3ZlcmZsb3cnKTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVN1Yk1lbnUoZXZlbnQpIHtcbiAgdGhpcy5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZUFyaWFFeHBhbmRlZChldmVudCkge1xuICB2YXIgZXhwYW5kZWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09ICd0cnVlJyA/ICdmYWxzZScgOiAndHJ1ZSc7XG4gIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgZXhwYW5kZWQpO1xufVxuZnVuY3Rpb24gdG9nZ2xlU3ViTmF2KGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdWJuYXYnKS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTtcbiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCctaGlkZS1wYWdlLW92ZXJmbG93Jyk7XG59XG5mdW5jdGlvbiBjbG9zZVN1Yk5hdihldmVudCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyX190b2dnbGUnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1Ym5hdicpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJy1oaWRlLXBhZ2Utb3ZlcmZsb3cnKTtcbn1cbmZ1bmN0aW9uIHNldEFjdGl2ZUxpbmsoZXZlbnQpIHtcbiAgaWYgKGRvY3VtZW50LmJvZHkuY29udGFpbnMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1Ym5hdl9faXRlbS1saW5rLmFjdGl2ZScpKSkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdWJuYXZfX2l0ZW0tbGluay5hY3RpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgfVxuICBldmVudC5jdXJyZW50VGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xufVxuZnVuY3Rpb24gZml4ZWRIZWFkZXIoKSB7XG4gIGlmICh3aW5kb3cucGFnZVlPZmZzZXQgPj0gNzUpIHtcbiAgICBib2R5LmNsYXNzTGlzdC5hZGQoJy1oYXMtZml4ZWQtaGVhZGVyJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlci0tc3VibmF2JykuY2xhc3NMaXN0LmFkZCgnLWlzLWZpeGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgYm9keS5jbGFzc0xpc3QucmVtb3ZlKCctaGFzLWZpeGVkLWhlYWRlcicpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXItLXN1Ym5hdicpLmNsYXNzTGlzdC5yZW1vdmUoJy1pcy1maXhlZCcpO1xuICB9XG59XG5mdW5jdGlvbiB0b2dnbGVNb2RhbCgpIHtcbiAgdmFyIG1vZGFsVHlwZSA9IHRoaXMuZGF0YXNldC5tb2RhbDtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLW1vZGFsLXdpbmRvdz1cXFwiXCIuY29uY2F0KG1vZGFsVHlwZSwgXCJcXFwiXVwiKSkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnLWhpZGUtcGFnZS1vdmVyZmxvdycpO1xufVxuZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgdmFyIG1vZGFsVHlwZSA9IHRoaXMuZGF0YXNldC5tb2RhbENsb3NlO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtbW9kYWwtd2luZG93PVxcXCJcIi5jb25jYXQobW9kYWxUeXBlLCBcIlxcXCJdXCIpKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCctaGlkZS1wYWdlLW92ZXJmbG93Jyk7XG59XG5mdW5jdGlvbiBjb3B5VG9DbGlwYm9hcmQoKSB7XG4gIHZhciBjb3B5VGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb3B5LWxpbmsnKTtcbiAgY29weVRleHQuc2VsZWN0KCk7XG4gIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idG4tLWNvcHknKS5jbGFzc0xpc3QuYWRkKCdjb3BpZWQnKTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVZpZGVvKGV2ZW50KSB7XG4gIGlmICh0aGlzLnBhdXNlZCkge1xuICAgIHRoaXMucGxheSgpO1xuICAgIHRoaXMubXV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ3BsYXlpbmcnKTtcbiAgICAkKHRoaXMpLnNpYmxpbmdzKCcuYnRuLS1wbGF5JykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucGF1c2UoKTtcbiAgICB0aGlzLm11dGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ3BsYXlpbmcnKTtcbiAgICAkKHRoaXMpLnNpYmxpbmdzKCcuYnRuLS1wbGF5JykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG59XG5mdW5jdGlvbiB0b2dnbGVQbGF5KGV2ZW50KSB7XG4gIHZhciAkdmlkZW8gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNpYmxpbmdzKCcudmlkZW8tZWxlbWVudCcpO1xuICBpZiAoJHZpZGVvWzBdLnBhdXNlZCkge1xuICAgICR2aWRlb1swXS5wbGF5KCk7XG4gICAgJHZpZGVvWzBdLm11dGVkID0gZmFsc2U7XG4gICAgJHZpZGVvWzBdLmNsYXNzTGlzdC5hZGQoJ3BsYXlpbmcnKTtcbiAgICBldmVudC50YXJnZXQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gIH0gZWxzZSB7XG4gICAgJHZpZGVvWzBdLnBhdXNlKCk7XG4gICAgJHZpZGVvWzBdLm11dGVkID0gZmFsc2U7XG4gICAgJHZpZGVvWzBdLmNsYXNzTGlzdC5yZW1vdmUoJ3BsYXlpbmcnKTtcbiAgICBldmVudC50YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRvZ2dsZU5ld3NsZXR0ZXIoKSB7XG4gIGlmIChjaGVja0Nvb2tpZSgnaG9tZS1uZXdzbGV0dGVyJykgIT0gJ29uJykge1xuICAgIHZhciBtb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1tb2RhbC13aW5kb3c9XFxcIm5ld3NsZXR0ZXJcXFwiXVwiKTtcbiAgICBpZiAoY2hlY2tDb29raWUoJ2hvbWUtbmV3c2xldHRlcicpICE9ICdvbicpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgY3JlYXRlQ29va2llKCdob21lLW5ld3NsZXR0ZXInLCAnb24nLCA3KTtcbiAgICB9XG4gICAgYWRkTW9kYWxDbG9zZUV2ZW50KG1vZGFsKTtcbiAgfVxufVxuZnVuY3Rpb24gYWRkTW9kYWxDbG9zZUV2ZW50KG1vZGFsKSB7XG4gIHdpbmRvdy5vbmNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PSBtb2RhbCkge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICBkb2
108N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJy1oaWRlLXBhZ2Utb3ZlcmZsb3cnKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDb29raWUobmFtZSwgdmFsdWUsIGRheXMpIHtcbiAgaWYgKGRheXMpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgIHZhciBleHBpcmVzID0gXCI7IGV4cGlyZXM9XCIgKyBkYXRlLnRvR01UU3RyaW5nKCk7XG4gIH0gZWxzZSB2YXIgZXhwaXJlcyA9IFwiXCI7XG4gIGlmICh0cnVlKSB7XG4gICAgLy8gQ2hhbmdlIHRydWUgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGUgY29va2llIGZvciBoZWxwIGluIGxvY2FsIGRldlxuICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS9cIjtcbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tDb29raWUobmFtZSkge1xuICB2YXIgbmFtZUVRID0gbmFtZSArIFwiPVwiO1xuICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjID0gY2FbaV07XG4gICAgd2hpbGUgKGMuY2hhckF0KDApID09ICcgJykgYyA9IGMuc3Vic3RyaW5nKDEsIGMubGVuZ3RoKTtcbiAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gU2xpZGVyXG4kKCcuc2VjdGlvbi1zbGlkZXIgLnNlY3Rpb24tc2xpZGVyX19zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlQ291bnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbGlkZScpLmxlbmd0aDtcbiAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXJcIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICAkKHRoaXMpLmF0dHIoJ2lkJywgc2xpZGVySWQpO1xuICAkKHRoaXMpLmFkZENsYXNzKHNsaWRlcklkKTtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCgnIycgKyBzbGlkZXJJZCkuc2xpY2soe1xuICAgICAgZG90czogdHJ1ZSxcbiAgICAgIGFycm93czogZmFsc2UsXG4gICAgICBpbmZpbml0ZTogdHJ1ZSxcbiAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgZmFkZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59KTtcblxuLy8gRnVsbCBTbGlkZXJcbiQoJy5zZWN0aW9uLWZ1bGxfc2xpZGVyIC5zZWN0aW9uLXNsaWRlcl9fc2xpZGVzJykuZWFjaChmdW5jdGlvbiAoaWR4LCBpdGVtKSB7XG4gIHZhciBzbGlkZUNvdW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCcuc2xpZGUnKS5sZW5ndGg7XG4gIHZhciBzbGlkZXJJZCA9IFwic2xpZGVyXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBkb3RzOiB0cnVlLFxuICAgICAgYXJyb3dzOiBmYWxzZSxcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgIGF1dG9wbGF5OiB0cnVlLFxuICAgICAgYXV0b3BsYXlTcGVlZDogMzAwMCxcbiAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICAgICAgcGF1c2VPbkhvdmVyOiBmYWxzZSxcbiAgICAgIHBhdXNlT25Gb2N1czogZmFsc2VcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8vIFF1b3RlIFNsaWRlclxuJCgnLnNlY3Rpb24tcXVvdGUnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlQ291bnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWN0aW9uLXF1b3RlIGJsb2NrcXVvdGUnKS5sZW5ndGg7XG4gIHZhciBzbGlkZXJJZCA9IFwic2xpZGVyXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBzbGlkZTogJ2Jsb2NrcXVvdGUnLFxuICAgICAgZG90czogZmFsc2UsXG4gICAgICBhcnJvd3M6IGZhbHNlLFxuICAgICAgaW5maW5pdGU6IHRydWUsXG4gICAgICBmYWRlOiB0cnVlLFxuICAgICAgc3BlZWQ6IDEwMDAsXG4gICAgICBhdXRvcGxheTogZmFsc2UsXG4gICAgICBhdXRvcGxheVNwZWVkOiA0MDAwLFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gICAgICBwYXVzZU9uSG92ZXI6IGZhbHNlLFxuICAgICAgcGF1c2VPbkZvY3VzOiBmYWxzZSxcbiAgICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgYXV0b3BsYXk6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfSk7XG4gIH1cbn0pO1xuXG4vLyBQcml2YXRlIEV2ZW50cyBTbGlkZXJcbiQoJy5zZWN0aW9uLXNsaWRlcl9ncm91cCAuc2xpZGVyX19zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXJcIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICAkKHRoaXMpLnNsaWNrKF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHtcbiAgICBkb3RzOiB0cnVlLFxuICAgIGluZmluaXRlOiB0cnVlLFxuICAgIGZhZGU6IHRydWUsXG4gICAgYXV0b3BsYXk6IGZhbHNlLFxuICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgcGF1c2VPbkZvY3VzOiBmYWxzZVxuICB9LCBcImRvdHNcIiwgZmFsc2UpLCBcImFycm93c1wiLCB0cnVlKSwgXCJyZXNwb25zaXZlXCIsIFt7XG4gICAgYnJlYWtwb2ludDogMTAyNCxcbiAgICBzZXR0aW5nczoge1xuICAgICAgZG90czogdHJ1ZSxcbiAgICAgIGFycm93czogZmFsc2UsXG4gICAgICBwYXVzZU9uSG92ZXI6IGZhbHNlLFxuICAgICAgcGF1c2VPbkZvY3VzOiBmYWxzZVxuICAgIH1cbiAgfV0pKTtcbn0pO1xuJCgnLnNlY3Rpb24tc2xpZGVyX2dyb3VwIC5zbGlkZXJfX3NsaWRlcycpLm9uKCdiZWZvcmVDaGFuZ2UnLCBmdW5jdGlvbiAoZXZlbnQsIHNsaWNrLCBjdXJyZW50U2xpZGUsIG5leHRTbGlkZSkge1xuICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd2aWRlbycpKSB7XG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yKCd2aWRlbycpLnBhdXNlKCk7XG4gIH1cbn0pO1xuXG4vLyBNZW1iZXJzaGlwIFNsaWRlclxuJCgnLnNlY3Rpb24tbWVtYmVyc2hpcCAuc2xpZGVyX19zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlcklkID0gXCJtZW1iZXJzaGlwLXNsaWRlci1cIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICAkKHRoaXMpLnNsaWNrKHtcbiAgICBkb3RzOiB0cnVlLFxuICAgIGFwcGVuZERvdHM6ICcuc2xpZGVyX19zbGlkZXMgLnNsaWNrLWxpc3QnLFxuICAgIGluZmluaXRlOiB0cnVlLFxuICAgIGF1dG9wbGF5OiB0cnVlLFxuICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gICAgZmFkZTogdHJ1ZSxcbiAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gICAgcGF1c2VPbkhvdmVyOiBmYWxzZSxcbiAgICBwYXVzZU9uRm9jdXM6IGZhbHNlXG4gI
108H0pO1xufSk7XG5cbi8vIEdyaWQgU2xpZGVyXG4kKCcuc2VjdGlvbi1ncmlkIC5ibG9jaycpLmVhY2goZnVuY3Rpb24gKGlkeCwgaXRlbSkge1xuICB2YXIgc2xpZGVyV3JhcCA9IHRoaXMucXVlcnlTZWxlY3RvcignLmdyaWRfX3NsaWRlcicpO1xuICB2YXIgc2xpZGVzID0gJChzbGlkZXJXcmFwKS5jaGlsZHJlbigpOyAvLyBHZXQgYWxsIHRoZSBjaGlsZHJlbiBzbGlkZXNcblxuICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzbGlkZVxuICBpZiAoc2xpZGVzLmxlbmd0aCA+IDEpIHtcbiAgICB2YXIgc2xpZGVyTmV4dEJ1dHRvbiA9ICQoc2xpZGVyV3JhcCkuc2libGluZ3MoJy5ncmlkX19zbGlkZXJfX25hdicpLmZpbmQoJy5zbGlkZXItbmV4dCcpO1xuICAgIHZhciBzbGlkZXJQcmV2QnV0dG9uID0gJChzbGlkZXJXcmFwKS5zaWJsaW5ncygnLmdyaWRfX3NsaWRlcl9fbmF2JykuZmluZCgnLnNsaWRlci1wcmV2Jyk7XG4gICAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXJcIiArIGlkeDtcbiAgICBzbGlkZXJXcmFwLmlkID0gc2xpZGVySWQ7XG4gICAgc2xpZGVyTmV4dEJ1dHRvbi5hdHRyKCdpZCcsICduZXh0LScgKyBzbGlkZXJJZCk7XG4gICAgc2xpZGVyUHJldkJ1dHRvbi5hdHRyKCdpZCcsICdwcmV2LScgKyBzbGlkZXJJZCk7XG4gICAgJChzbGlkZXJXcmFwKS5zbGljayh7XG4gICAgICBkb3RzOiBmYWxzZSxcbiAgICAgIGFycm93czogdHJ1ZSxcbiAgICAgIHByZXZBcnJvdzogJyMnICsgc2xpZGVyUHJldkJ1dHRvbi5hdHRyKCdpZCcpLFxuICAgICAgLy8gQ3VzdG9tIHByZXZpb3VzIGJ1dHRvbiBzZWxlY3RvclxuICAgICAgbmV4dEFycm93OiAnIycgKyBzbGlkZXJOZXh0QnV0dG9uLmF0dHIoJ2lkJyksXG4gICAgICAvLyBDdXN0b20gbmV4dCBidXR0b24gc2VsZWN0b3JcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICAgICAgcGF1c2VPbkhvdmVyOiBmYWxzZSxcbiAgICAgIHBhdXNlT25Gb2N1czogZmFsc2VcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPcHRpb25hbGx5IGhhbmRsZSBjYXNlcyB3aXRoIG9ubHkgb25lIHNsaWRlLCBlLmcuLCBkaXNhYmxlIG5hdmlnYXRpb24sIG5vIG5lZWQgZm9yIGEgc2xpZGVyLCBldGMuXG4gICAgJChzbGlkZXJXcmFwKS5zbGljayh7XG4gICAgICBkb3RzOiBmYWxzZSxcbiAgICAgIGFycm93czogZmFsc2UsXG4gICAgICAvLyBEaXNhYmxlIGFycm93cyB3aGVuIG9ubHkgb25lIHNsaWRlXG4gICAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgICBmYWRlOiB0cnVlLFxuICAgICAgYXV0b3BsYXk6IGZhbHNlLFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICBhZGFwdGl2ZUhlaWdodDogdHJ1ZSxcbiAgICAgIHBhdXNlT25Ib3ZlcjogdHJ1ZSxcbiAgICAgIHBhdXNlT25Gb2N1czogdHJ1ZVxuICAgIH0pO1xuICB9XG59KTtcblxuLy8gU2xpZGVyIHdpdGggTmF2XG4kKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9uYXYgLnNsaWRlcl9fc2xpZGVzJykub24oJ2JlZm9yZUNoYW5nZScsIGZ1bmN0aW9uIChldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlKSB7XG4gIHZhciBuYXZMaXN0ID0gc2xpY2sub3B0aW9ucy5hc05hdkZvcjtcbiAgaWYgKGN1cnJlbnRTbGlkZSA9PT0gc2xpY2suc2xpZGVDb3VudCAtIDEpIHtcbiAgICAkKG5hdkxpc3QpLnNsaWNrKCdzbGlja0dvVG8nLCAwKTtcbiAgfSBlbHNlIGlmIChjdXJyZW50U2xpZGUgPT09IDApIHtcbiAgICAkKG5hdkxpc3QpLnNsaWNrKCdzbGlja0dvVG8nLCBzbGljay5zbGlkZUNvdW50KTtcbiAgfVxufSk7XG4kKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9uYXYgLnNsaWRlcl9fc2xpZGVzJykuZWFjaChmdW5jdGlvbiAoaWR4LCBpdGVtKSB7XG4gIHZhciBzbGlkZUNvdW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCcuc2xpZGVyX19zbGlkZScpLmxlbmd0aDtcbiAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXItXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBkb3RzOiB0cnVlLFxuICAgICAgaW5maW5pdGU6IHRydWUsXG4gICAgICBmYWRlOiB0cnVlLFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICBhZGFwdGl2ZUhlaWdodDogdHJ1ZSxcbiAgICAgIGFzTmF2Rm9yOiAkKHRoaXMpLnBhcmVudHMoJy5zZWN0aW9uLXNsaWRlcl93aXRoX25hdicpLmZpbmQoJy5zbGlkZXItbmF2IHVsJyksXG4gICAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgZG90czogZmFsc2UsXG4gICAgICAgICAgcHJldkFycm93OiAnPGJ1dHRvbiBjbGFzcz1cInNsaWNrLXByZXYgc2xpY2stYXJyb3cgYXJyb3ctLXByZXZcIiBhcmlhLWxhYmVsPVwiUHJldmlvdXNcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+JyxcbiAgICAgICAgICBuZXh0QXJyb3c6ICc8YnV0dG9uIGNsYXNzPVwic2xpY2stbmV4dCBzbGljay1hcnJvdyBhcnJvdy0tbmV4dFwiIGFyaWEtbGFiZWw9XCJOZXh0XCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPidcbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9KTtcbiAgfVxufSk7XG4kKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9uYXYgLnNsaWRlci1uYXYgdWwnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlck5hdklkID0gXCJzbGlkZXJOYXYtXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJOYXZJZDtcbiAgJCh0aGlzKS5zbGljayh7XG4gICAgYXNOYXZGb3I6ICQodGhpcykucGFyZW50cygnLnNlY3Rpb24tc2xpZGVyX3dpdGhfbmF2JykuZmluZCgnLnNsaWRlcl9fc2xpZGVzJyksXG4gICAgc2xpZGVzVG9TaG93OiAxLFxuICAgIGZvY3VzT25TZWxlY3Q6IHRydWUsXG4gICAgYXJyb3dzOiBmYWxzZSxcbiAgICBjZW50ZXJNb2RlOiB0cnVlLFxuICAgIHZhcmlhYmxlV2lkdGg6IHRydWUsXG4gICAgaW5maW5pdGU6ICQoJy5zbGlkZXItbmF2Jykud2lkdGgoKSA+IHRoaXMubGlzdFdpZHRoLFxuICAgIG1vYmlsZUZpcnN0OiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICBicmVha3BvaW50OiAxMDI0LFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgaW5maW5pdGU6IGZhbHNlLFxuICAgICAgICBzbGlkZXNUb1Nob3c6IHRoaXMuc2xpZGVDb3VudCxcbiAgICAgICAgY2VudGVyTW9kZTogZmFsc2UsXG4gICAgICAgI
108HZlcnRpY2FsOiB0cnVlXG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG59KTtcblxuLy8gSG9tZXBhZ2UgRmVhdHVyZWQgUG9zdHMgU2xpZGVyXG4kKCcuZmVhdHVyZWQtcG9zdHNfX2ltYWdlcycpLmVhY2goZnVuY3Rpb24gKGlkeCwgaXRlbSkge1xuICB2YXIgc2xpZGVySWQgPSBcImZlYXR1cmVkX3Bvc3RzLXNsaWRlci1cIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICAkKHRoaXMpLnNsaWNrKHtcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBhcnJvd3M6IGZhbHNlLFxuICAgIGluZmluaXRlOiB0cnVlLFxuICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICBwYXVzZU9uSG92ZXI6IGZhbHNlLFxuICAgIHBhdXNlT25Gb2N1czogZmFsc2UsXG4gICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgYXNOYXZGb3I6ICcuZmVhdHVyZWQtcG9zdHNfX2RldGFpbHMnLFxuICAgIGZhZGU6IHRydWUsXG4gICAgcmVzcG9uc2l2ZTogW3tcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBkb3RzOiB0cnVlLFxuICAgICAgICBhcHBlbmREb3RzOiAnLmZlYXR1cmVkLXBvc3RzX19pbWFnZXMgLnNsaWNrLWxpc3QnLFxuICAgICAgICBmYWRlOiB0cnVlLFxuICAgICAgICBhdXRvcGxheTogdHJ1ZSxcbiAgICAgICAgcGF1c2VPbkhvdmVyOiBmYWxzZSxcbiAgICAgICAgcGF1c2VPbkZvY3VzOiBmYWxzZVxuICAgICAgfVxuICAgIH1dXG4gIH0pO1xufSk7XG4kKCcuZmVhdHVyZWQtcG9zdHNfX2RldGFpbHMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlcklkID0gXCJmZWF0dXJlZF9wb3N0c19kZXRhaWwtc2xpZGVyLVwiICsgaWR4O1xuICB0aGlzLmlkID0gc2xpZGVySWQ7XG4gICQodGhpcykuc2xpY2soe1xuICAgIGRvdHM6IGZhbHNlLFxuICAgIGFycm93czogZmFsc2UsXG4gICAgaW5maW5pdGU6IHRydWUsXG4gICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgcGF1c2VPbkZvY3VzOiBmYWxzZSxcbiAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICBhc05hdkZvcjogJy5mZWF0dXJlZC1wb3N0c19faW1hZ2VzJyxcbiAgICBmYWRlOiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICBicmVha3BvaW50OiAxMDI0LFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgICAgYXV0b3BsYXk6IHRydWUsXG4gICAgICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICAgIHBhdXNlT25Gb2N1czogZmFsc2VcbiAgICAgIH1cbiAgICB9XVxuICB9KTtcbn0pO1xuXG4vLyBTbGlkZXIgd2l0aCBRdW90ZVxuJCgnLnNlY3Rpb24tc2xpZGVyX3dpdGhfcXVvdGUgLnNsaWRlcl9fc2xpZGVzJykub24oJ2JlZm9yZUNoYW5nZScsIGZ1bmN0aW9uIChldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlKSB7XG4gIHZhciBuYXZMaXN0ID0gc2xpY2sub3B0aW9ucy5hc05hdkZvcjtcbiAgaWYgKGN1cnJlbnRTbGlkZSA9PT0gc2xpY2suc2xpZGVDb3VudCAtIDEpIHtcbiAgICAkKG5hdkxpc3QpLnNsaWNrKCdzbGlja0dvVG8nLCAwKTtcbiAgfSBlbHNlIGlmIChjdXJyZW50U2xpZGUgPT09IDApIHtcbiAgICAkKG5hdkxpc3QpLnNsaWNrKCdzbGlja0dvVG8nLCBzbGljay5zbGlkZUNvdW50KTtcbiAgfVxufSk7XG4kKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9xdW90ZSAuc2xpZGVyX19zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlQ291bnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbGlkZXJfX3NsaWRlJykubGVuZ3RoO1xuICB2YXIgc2xpZGVySWQgPSBcInNsaWRlci1cIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICBpZiAoc2xpZGVDb3VudCA+IDEpIHtcbiAgICAkKHRoaXMpLnNsaWNrKHtcbiAgICAgIGRvdHM6IGZhbHNlLFxuICAgICAgaW5maW5pdGU6IHRydWUsXG4gICAgICBmYWRlOiB0cnVlLFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gICAgICBhc05hdkZvcjogJCh0aGlzKS5wYXJlbnRzKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9xdW90ZScpLmZpbmQoJy5zbGlkZXItYXNpZGVfX3F1b3RlcycpLFxuICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgICByZXNwb25zaXZlOiBbe1xuICAgICAgICBicmVha3BvaW50OiA3NjcsXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgZG90czogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XVxuICAgIH0pO1xuICB9XG59KTtcbiQoJy5zZWN0aW9uLXNsaWRlcl93aXRoX3F1b3RlIC5zbGlkZXItYXNpZGVfX3F1b3RlcycpLmVhY2goZnVuY3Rpb24gKGlkeCwgaXRlbSkge1xuICB2YXIgc2xpZGVyTmF2SWQgPSBcInNsaWRlck5hdi1cIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlck5hdklkO1xuICAkKHRoaXMpLnNsaWNrKHtcbiAgICBhc05hdkZvcjogJCh0aGlzKS5wYXJlbnRzKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9xdW90ZScpLmZpbmQoJy5zbGlkZXJfX3NsaWRlcycpLFxuICAgIHNsaWRlc1RvU2hvdzogMSxcbiAgICBmb2N1c09uU2VsZWN0OiB0cnVlLFxuICAgIGFycm93czogZmFsc2UsXG4gICAgZmFkZTogdHJ1ZSxcbiAgICBpbmZpbml0ZTogdHJ1ZSxcbiAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICBkb3RzOiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICBicmVha3BvaW50OiA3NjcsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBkb3RzOiBmYWxzZVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBkb3RzOiBmYWxzZSxcbiAgICAgICAgc2xpZGVzVG9TaG93OiB0aGlzLnNsaWRlQ291bnQsXG4gICAgICAgIGNlbnRlck1vZGU6IGZhbHNlXG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG59KTtcblxuLy8gRmVhdHVyZSBHcm91cCBTbGlkZXJcbiQoJy5mZWF0dXJlX2dyb3VwLXNsaWRlcycpLmVhY2goZnVuY3Rpb24gKGlkeCwgaXRlbSkge1xuICB2YXIgc2xpZGVDb3VudCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnLnNlY3Rpb24tZmVhdHVyZV9ncm91cF9faW1hZ2UnKS5sZW5ndGg7XG4gIHZhciBzbGlkZXJJZCA9IFwic2xpZGVyXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBkb3RzOiB0cnVlLFxuICAgICAgYXJyb3dzOiBmYWxzZSxcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gICAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICBwYXVzZU9uRm9jdXM6IGZhbHNlLFxuICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgICByZXNwb25zaXZlOiBbe1xuICAgICAgICBicmVha3BvaW50OiAxMDI0LFxuICAgICAgICBzZXR0aW5nczogJ3Vuc2xpY2snXG4gICAgICB9XVxuICAgIH0pO1xuICB9XG59KTtcblxuLy8gUXVvdGUgQ2Fyb3VzZWwgU2xpZGVyXG4kKCcucXVvdGUtY2Fyb3VzZWwtc2xpZGVyJykuZWFjaChmdW5jdGlvbiAoaWR4LCBpdGVtKSB7XG4gIHZhciBzbGlkZUNvdW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCcucXVvdGUtc2xpZGUnKS5sZW5ndGg7XG4gIHZhciBzbGlkZXJJZCA9IFwic2xpZGVyXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBkb3RzOiB0cnVlLFxuICAgICAgYXJyb3dzOiBmYWxzZSxcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gICAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICBwYXVzZU9uRm9jdXM6IGZhbHNlLFxuICAgICAgbW9iaWxlRmlyc3Q6IHRydWVcbiAgICAgIC8vIHJlc3BvbnNpdmU6IFtcbiAgICAgIC8vICAge1xuICAgICAgLy8gICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICAvLyAgICAgc2V0dGluZ3M6ICd1bnNsaWNrJ1xuICAgICAgLy8gICB9XG4gICAgICAvLyBdXG4gICAgfSk7XG4gIH1cbn0pO1xuXG4vLyBjb21wYXJpc29uIGNoYXJ0IHNsaWRlclxuJCgnLmNvbXBhcmlzb24tc2xpZGVyLWlubmVyJykuc2xpY2soe1xuICAvLyBZb3VyIFNsaWNrIHNsaWRlciBvcHRpb25zIGhlcmVcbiAgZG90czogdHJ1ZSxcbiAgYXJyb3dzOiB0cnVlLFxuICBpbmZpbml0ZTogZmFsc2UsXG4gIHNwZWVkOiAzMDAsXG4gIHNsaWRlc1RvU2hvdzogMSxcbiAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gIHByZXZBcnJvdzogZmFsc2UsXG4gIG5leHRBcnJvdzogZmFsc2Vcbn0pO1xuXG4vLyBFeHBhbmRhYmxlIE1vZHVsZXM6XG4vLyAxLiBGZWF0dXJlcyBNb2R1bGVcblxuZnVuY3Rpb24gZXhwYW5kTW9kdWxlKCkge1xuICB2YXIgb3BlblRvZ2dsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4taXMtZXhwYW5kZWQnKTtcbiAgaWYgKG9wZW5Ub2dnbGUgJiYgb3BlblRvZ2dsZSAhPSB0aGlzKSBvcGVuVG9nZ2xlLmNsYXNzTGlzdC5yZW1vdmUoJy1pcy1leHBhbmRlZCcpO1xuICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoJy1pcy1leHBhbmRlZCcpO1xufVxuaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdwYWdlLXRlbXBsYXRlLXBhZ2UtZXZlbnQtbGlzdGluZycpKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuanMtZXhwYW5kJykpIHJldHVybjtcbiAgICBkb2
108N1bWVudC5xdWVyeVNlbGVjdG9yKCcuLWlzLWV4cGFuZGVkJykuY2xhc3NMaXN0LnJlbW92ZSgnLWlzLWV4cGFuZGVkJyk7XG4gIH0sIGZhbHNlKTtcbn1cblxuLy8gVG9nZ2xlIExpc3RcbmZ1bmN0aW9uIHRvZ2dsZUxpc3QoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5saXN0LWV4cGFuZCcpLmNsYXNzTGlzdC50b2dnbGUoJy1pcy1leHBhbmRlZCcpO1xufVxuXG4vLyBBbmltYXRpb25zXG5pZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29weV9faGVhZGluZycpKSkge1xuICB2YXIgc3BlZWQgPSA0MDtcbiAgdmFyIGhlYWRpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29weV9faGVhZGluZycpO1xuICB2YXIgZGVsYXkgPSBoZWFkaW5nLmlubmVySFRNTC5sZW5ndGggKiBzcGVlZCArIHNwZWVkO1xufVxuZnVuY3Rpb24gdHlwZUVmZmVjdChlbGVtZW50LCBzcGVlZCkge1xuICB2YXIgdGV4dCA9IGVsZW1lbnQuaW5uZXJIVE1MO1xuICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG4gIHZhciBpID0gMDtcbiAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgIGVsZW1lbnQuYXBwZW5kKHRleHQuY2hhckF0KGkpKTtcbiAgICAgIGkrKztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7XG4gICAgfVxuICB9LCBzcGVlZCk7XG59XG5cbi8vIExhenkgTG9hZCBpbiBWaWV3cG9ydFxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgZnVuY3Rpb24gKCkge1xuICB2YXIgYW5pbWF0ZUVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5pbWF0ZScpKTtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgdGhyZXNob2xkOiAuNFxuICB9O1xuICBpZiAoXCJJbnRlcnNlY3Rpb25PYnNlcnZlclwiIGluIHdpbmRvdykge1xuICAgIHZhciBhbmltYXRlRWxPYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcywgb2JzZXJ2ZXIpIHtcbiAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgdmFyIGFuaW1hdGVFbCA9IGVudHJ5LnRhcmdldDtcbiAgICAgICAgICBhbmltYXRlRWwuY2xhc3NMaXN0LmFkZCgnLWlzLXZpc2libGUnKTtcbiAgICAgICAgICBhbmltYXRlRWxPYnNlcnZlci51bm9ic2VydmUoYW5pbWF0ZUVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgYW5pbWF0ZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGFuaW1hdGVFbCkge1xuICAgICAgYW5pbWF0ZUVsT2JzZXJ2ZXIub2JzZXJ2ZShhbmltYXRlRWwpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrIGhlcmVcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGxhenlMb2FkRmFsbGJhY2spO1xuICB9XG59KTtcblxuLy9WaXNpb24gRnVsbCBTZWN0aW9uXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbiAoKSB7XG4gIHZhciB2aXNpb25FbGVtZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5pbWF0ZS0tY292ZXInKSk7XG4gIGlmIChcIkludGVyc2VjdGlvbk9ic2VydmVyXCIgaW4gd2luZG93KSB7XG4gICAgdmFyIHZpc2lvbkVsT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMsIG9ic2VydmVyKSB7XG4gICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgIHZhciB2aXNpb25FbCA9IGVudHJ5LnRhcmdldDtcbiAgICAgICAgICB2aXNpb25FbC5jbGFzc0xpc3QuYWRkKCctaXMtdmlzaWJsZScpO1xuICAgICAgICAgIHZpc2lvbkVsT2JzZXJ2ZXIudW5vYnNlcnZlKHZpc2lvbkVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmlzaW9uRWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uICh2aXNpb25FbCkge1xuICAgICAgdmlzaW9uRWxPYnNlcnZlci5vYnNlcnZlKHZpc2lvbkVsKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGxhenlMb2FkRmFsbGJhY2spO1xuICB9XG59KTtcblxuLy8gUGFyYWxsYXhcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFsbGF4RWxlbWVudHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWN0aW9uLWNvbGxlY3Rpb25fX2ltYWdlJykpO1xuICB2YXIgb3B0aW9ucyA9IHtcbiAgICAvLyB0aHJlc2hvbGQ6IC41XG4gICAgdHJhY2tWaXNpYmlsaXR5OiB0cnVlLFxuICAgIGRlbGF5OiAxMDBcbiAgfTtcbiAgaWYgKFwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICB2YXIgcGFyYWxsYXhFbE9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzLCBvYnNlcnZlcikge1xuICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB2Y
108XIgcGFyYWxsYXhFbCA9IGVudHJ5LnRhcmdldDtcbiAgICAgICAgaWYgKGVudHJ5LmludGVyc2VjdGlvblJhdGlvID4gMCkge1xuICAgICAgICAgIHBhcmFsbGF4RWwuY2xhc3NMaXN0LmFkZCgnLWlzLXZpc2libGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJhbGxheEVsLmNsYXNzTGlzdC5yZW1vdmUoJy1pcy12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIG9wdGlvbnMpO1xuICAgIHBhcmFsbGF4RWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAocGFyYWxsYXhFbCkge1xuICAgICAgcGFyYWxsYXhFbE9ic2VydmVyLm9ic2VydmUocGFyYWxsYXhFbCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2sgaGVyZVxuICAgIGxhenlMb2FkRmFsbGJhY2soKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGxhenlMb2FkRmFsbGJhY2spO1xuICB9XG59KTtcbmZ1bmN0aW9uIGxhenlMb2FkRmFsbGJhY2soKSB7XG4gIHZhciBhbmltYXRlRWxlbWVudHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbmltYXRlLCAuYW5pbWF0ZS0tY292ZXIsIC5zZWN0aW9uLWNvbGxlY3Rpb25fX2ltYWdlJykpO1xuICBhbmltYXRlRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0ZUVsKSB7XG4gICAgaWYgKGFuaW1hdGVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPD0gd2luZG93LmlubmVySGVpZ2h0ICYmIGFuaW1hdGVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gPj0gMCkge1xuICAgICAgYW5pbWF0ZUVsLmNsYXNzTGlzdC5hZGQoJy1pcy12aXNpYmxlJyk7XG4gICAgfVxuICB9KTtcbn1cbiQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcub3B0LWluX19jbG9zZScsIGNsb3NlQ29va2llQmFubmVyKTtcbmZ1bmN0aW9uIGNsb3NlQ29va2llQmFubmVyKCkge1xuICAkKCcjcGlfdHJhY2tpbmdfb3B0X2luX2RpdicpLmFkZENsYXNzKCdoaWRlJyk7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICQoJyNwaV90cmFja2luZ19vcHRfaW5fbm8nKS5jbGljaygpO1xuICB9LCA1MDApO1xufVxuJCgnLndwY2Y3LWZvcm0nKS5yZW1vdmVBdHRyKCdub3ZhbGlkYXRlJyk7XG4kKCcud3BjZjctdmFsaWRhdGVzLWFzLXJlcXVpcmVkJykucHJvcCgncmVxdWlyZWQnLCB0cnVlKTtcblxuLy8gQWRqdXN0IENvbnRhY3QgRm9ybSA3IERlZmF1bHQgQmVoYXZpb3JcbiQoJy53cGNmNy1mb3JtJykub24oJ3N1Ym1pdCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAvLyB2YXIgJHN1Y2Nlc3NFbGVtZW50ID0gJCgnLndwY2Y3LXJlc3BvbnNlLW91dHB1dCcpO1xuICAvLyAkc3VjY2Vzc0VsZW1lbnQudGV4dCgnVGhhbmsgeW91IGZvciB5b3VyIHN1Ym1pc3Npb24nKTtcbiAgLy8gJHN1Y2Nlc3NFbGVtZW50LnNob3coKTtcblxuICAkKCcud3BjZjctZm9ybScpLmFkZENsYXNzKCctaXMtbG9hZGluZycpO1xuICAkKCcubG9hZGVyJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xufSk7XG5cbi8vIE1hcFxuZ3JvdXBFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWhvdHNwb3RdXCIpLCBzaG93TG9jYXRpb25zKTtcbmdyb3VwRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1ob3RzcG90XVwiKSwgaGlkZUxvY2F0aW9ucyk7XG5mdW5jdGlvbiBzaG93TG9jYXRpb25zKGV2ZW50KSB7XG4gIHZhciBob3RzcG90ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuaG90c3BvdDtcbiAgdmFyIGl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWxvY2F0aW9uPVxcXCJcIi5jb25jYXQoaG90c3BvdCwgXCJcXFwiXVwiKSk7XG4gIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGhpZGVMb2NhdGlvbnMoZXZlbnQpIHtcbiAgdmFyIGhvdHNwb3QgPSBldmVudC50YXJnZXQuZGF0YXNldC5ob3RzcG90O1xuICB2YXIgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtbG9jYXRpb249XFxcIlwiLmNvbmNhdChob3RzcG90LCBcIlxcXCJdXCIpKTtcbiAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH0pO1xufVxuXG4vLyBDdXN0b20gVmlkZW8gY29udHJvbHNcbiQod2luZG93KS5sb2FkKGZ1bmN0aW9uICgpIHtcbiAgJCgnLnNsaWRlX19jb250cm9sLW92ZXJsYXknKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAkKHRoaXMpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBzbGljayA9ICQodGhpcykuY2xvc2VzdCgnLnNlY3Rpb24tc2xpZGVyX19zbGlkZXMnKTtcbiAgICAgIHZhciBzbGlkZSA9ICQodGhpcykuY2xvc2VzdCgnLnNsaWRlJyk7XG4gICAgICB2Y
108XIgb3ZlcmxheSA9ICQodGhpcyk7XG4gICAgICBpZiAoJChvdmVybGF5KS5oYXNDbGFzcygncGF1c2VkJykpIHtcbiAgICAgICAgJChvdmVybGF5KS5yZW1vdmVDbGFzcygncGF1c2VkJyk7XG4gICAgICAgICQob3ZlcmxheSkuYWRkQ2xhc3MoJ3BsYXlpbmcnKTtcbiAgICAgICAgcGxheVZpZGVvKHNsaWRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQob3ZlcmxheSkucmVtb3ZlQ2xhc3MoJ3BsYXlpbmcnKTtcbiAgICAgICAgJChvdmVybGF5KS5hZGRDbGFzcygncGF1c2VkJyk7XG4gICAgICAgIHBhdXNlVmlkZW8oc2xpZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuZnVuY3Rpb24gcGxheVZpZGVvKHNsaWRlKSB7XG4gIGlmICgkKHNsaWRlKS5oYXMoJy5zbGlkZV9fZW1iZWQnKS5sZW5ndGgpIHtcbiAgICB2YXIgaWZyYW1lID0gJChzbGlkZSkuZmluZCgnaWZyYW1lJylbMF07XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBtZXRob2Q6IFwicGxheVwiXG4gICAgfTtcbiAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShkYXRhKSwgXCIqXCIpO1xuICB9IGVsc2Uge1xuICAgIHZhciB2aWRlbyA9ICQoc2xpZGUpLmZpbmQoJ3ZpZGVvJyk7XG4gICAgdmlkZW9bMF0ucGxheSgpO1xuICB9XG59XG5mdW5jdGlvbiBwYXVzZVZpZGVvKHNsaWRlKSB7XG4gIGlmICgkKHNsaWRlKS5oYXMoJy5zbGlkZV9fZW1iZWQnKS5sZW5ndGgpIHtcbiAgICB2YXIgaWZyYW1lID0gJChzbGlkZSkuZmluZCgnaWZyYW1lJylbMF07XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBtZXRob2Q6IFwicGF1c2VcIlxuICAgIH07XG4gICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZGF0YSksIFwiKlwiKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlkZW8gPSAkKHNsaWRlKS5maW5kKCd2aWRlbycpO1xuICAgIHZpZGVvWzBdLnBhdXNlKCk7XG4gIH1cbn1cblxuLy8gSG9tZSBIZXJvIENhcm91c2VsXG5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdpc0xvb3BpbmdIZXJvQ2Fyb3VzZWwnLCBcImZhbHNlXCIpO1xuaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcImlzTG9vcGluZ0hlcm9DYXJvdXNlbFwiLCBcInRydWVcIik7XG59IGVsc2Uge1xuICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiaXNMb29waW5nSGVyb0Nhcm91c2VsXCIsIFwiZmFsc2VcIik7XG59XG5cbi8vIGhvbWUgZHJhZ2dhYmxlIHNlY3Rpb25cbnZhciBtb3VzZURvd24gPSBmYWxzZTtcbnZhciBzdGFydFgsIHNjcm9sbExlZnQ7XG52YXIgc2xpZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3dyYXAtd2hhdHMtb24tZ3JpZCcpO1xudmFyIGRyYWdnZWQgPSBmYWxzZTtcbnZhciBzdGFydERyYWdnaW5nID0gZnVuY3Rpb24gc3RhcnREcmFnZ2luZyhlKSB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgbW91c2VEb3duID0gdHJ1ZTtcbiAgc3RhcnRYID0gZS5wYWdlWCAtIHNsaWRlci5vZmZzZXRMZWZ0O1xuICBzY3JvbGxMZWZ0ID0gc2xpZGVyLnNjcm9sbExlZnQ7XG59O1xudmFyIHN0b3BEcmFnZ2luZyA9IGZ1bmN0aW9uIHN0b3BEcmFnZ2luZyhlKSB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgbW91c2VEb3duID0gZmFsc2U7XG59O1xudmFyIG1vdmUgPSBmdW5jdGlvbiBtb3ZlKGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICBpZiAoIW1vdXNlRG93bikge1xuICAgIGRyYWdnZWQgPSBmYWxzZTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSB7XG4gICAgZHJhZ2dlZCA9IHRydWU7XG4gICAgdmFyIHggPSBlLnBhZ2VYIC0gc2xpZGVyLm9mZnNldExlZnQ7XG4gICAgdmFyIHNjcm9sbCA9IHggLSBzdGFydFg7XG4gICAgc2xpZGVyLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0IC0gc2Nyb2xsO1xuICB9XG59O1xudmFyIG5vRm9sbG93TGluayA9IGZ1bmN0aW9uIG5vRm9sbG93TGluayhlKSB7XG4gIGlmIChkcmFnZ2VkKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cbn07XG5cbi8vIEZlYXR1cmUgR3JvdXAgU2xpZGVyXG4vLyAkKCcuZmVhdHVyZV9ncm91cC1zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uKGlkeCwgaXRlbSkge1xuLy8gICB2Y
108XIgc2xpZGVDb3VudCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnLnNlY3Rpb24tZmVhdHVyZV9ncm91cF9faW1hZ2UnKS5sZW5ndGhcbi8vICAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXJcIiArIGlkeDtcbi8vICAgdGhpcy5pZCA9IHNsaWRlcklkO1xuXG4vLyAgIGlmIChzbGlkZUNvdW50ID4gMSkge1xuLy8gICAgICQodGhpcykuc2xpY2soe1xuLy8gICAgICAgZG90czogdHJ1ZSxcbi8vICAgICAgIGFycm93czogZmFsc2UsXG4vLyAgICAgICBpbmZpbml0ZTogdHJ1ZSxcbi8vICAgICAgIGZhZGU6IHRydWUsXG4vLyAgICAgICBhdXRvcGxheTogZmFsc2UsXG4vLyAgICAgICBhdXRvcGxheVNwZWVkOiAzMDAwLFxuLy8gICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4vLyAgICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4vLyAgICAgICBwYXVzZU9uSG92ZXI6IGZhbHNlLFxuLy8gICAgICAgcGF1c2VPbkZvY3VzOiBmYWxzZSxcbi8vICAgICAgIG1vYmlsZUZpcnN0OiB0cnVlLFxuLy8gICAgICAgcmVzcG9uc2l2ZTogW1xuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgYnJlYWtwb2ludDogMTAyNCxcbi8vICAgICAgICAgICBzZXR0aW5nczogJ3Vuc2xpY2snXG4vLyAgICAgICAgIH1cbi8vICAgICAgIF1cbi8vICAgICB9KVxuLy8gICB9XG4vLyB9KTtcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVByaWNpbmdTbGljaygpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCQod2luZG93KS53aWR0aCgpID4gMTAwMCkge1xuICAgICAgaWYgKCQoJy5yb3ctcHJpY2luZycpLmhhc0NsYXNzKCdzbGljay1pbml0aWFsaXplZCcpKSB7XG4gICAgICAgICQoJy5yb3ctcHJpY2luZycpLnNsaWNrKCd1bnNsaWNrJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDEwMDApIHtcbiAgICAgIGlmICgkKCcucm93LXByaWNpbmcnKS5oYXNDbGFzcygnc2xpY2staW5pdGlhbGl6ZWQnKSkge1xuICAgICAgICAkKCcucm93LXByaWNpbmcnKS5zbGljaygndW5zbGljaycpO1xuICAgICAgfVxuICAgICAgJCgnLnJvdy1wcmljaW5nJykuc2xpY2soe1xuICAgICAgICBkb3RzOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIDApO1xufVxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICBpbml0aWFsaXplUHJpY2luZ1NsaWNrKCk7XG59KTtcbnZhciBwcmV2aW91c1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4kKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN1cnJlbnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICBpZiAoY3VycmVudFdpZHRoICE9PSBwcmV2aW91c1dpZHRoKSB7XG4gICAgaW5pdGlhbGl6ZVByaWNpbmdTbGljaygpO1xuICAgIC8vIFVwZGF0ZSB0aGUgcHJldmlvdXMgd2lkdGhcbiAgICBwcmV2aW91c1dpZHRoID0gY3VycmVudFdpZHRoO1xuICB9XG59KTtcblxuLy8gQWRkIHRoZSBldmVudCBsaXN0ZW5lcnNcbmlmIChzbGlkZXIpIHtcbiAgc2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbm9Gb2xsb3dMaW5rLCBmYWxzZSk7XG4gIHNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3ZlLCBmYWxzZSk7XG4gIHNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBzdGFydERyYWdnaW5nLCBmYWxzZSk7XG4gIHNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RvcERyYWdnaW5nLCBmYWxzZSk7XG4gIHNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgc3RvcERyYWdnaW5nLCBmYWxzZSk7XG59XG5mdW5jdGlvbiB3cml0ZVBhcmFtc1RvSW5wdXRzKCkge1xuICAvLyBGdW5jdGlvbiB0byBnZXQgdGhlIHZhbHVlIG9mIGEgY29va2llIGJ5IG5hbWVcbiAgZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHtcbiAgICB2YXIgY29va2llQXJyID0gZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvb2tpZVBhaXIgPSBjb29raWVBcnJbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgaWYgKG5hbWUgPT0gY29va2llUGFpclswXS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChjb29raWVQYWlyWzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBGdW5jdGlvbiB0byBnZXQgdGhlIHZhbHVlIG9mIGEgVVJMIHBhcmFtZXRlciBieSBuYW1lXG4gIGZ1bmN0aW9uIGdldFVybFBhcmFtZXRlcihuYW1lKSB7XG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW1xcXV0vZywgJ1xcXFwkJicpO1xuICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ1s/Jl0nICsgbmFtZSArICcoPShbXiYjXSopfCZ8I3wkKScpLFxuICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGlmICghcmVzdWx0cykgcmV0dXJuIG51bGw7XG4gICAgaWYgKCFyZXN1bHRzWzJdKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzJdLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcbiAgfVxuXG4gIC8vIExpc3Qgb2YgcGFyYW1ldGVycyB0byBjaGVja1xuICB2YXIgcGFyYW1zID0gWydnY2xpZCcsICd1dG1fc291cmNlJywgJ3V0bV9jYW1wYWlnbicsICd1dG1fbWVkaXVtJ107XG5cbiAgLy8gRmluZCBhbmQgc2V0IHRoZSB2YWx1ZSBmb3IgZWFjaCBwYXJhbWV0ZXJcbiAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgdmFyIHZhbHVlID0gZ2V0VXJsUGFyYW1ldGVyKHBhcmFtKSB8fCBnZXRDb29raWUocGFyYW0pO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdmFyIGxhYmVscyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsYWJlbCcpO1xuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGxhYmVscyksXG4gICAgICAgIF9zdGVwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2Y
108XIgbGFiZWwgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAobGFiZWwudGV4dENvbnRlbnQudHJpbSgpID09PSBwYXJhbSkge1xuICAgICAgICAgICAgdmFyIGdpbnB1dENvbnRhaW5lciA9IGxhYmVsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgIGlmIChnaW5wdXRDb250YWluZXIgJiYgZ2lucHV0Q29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnZ2lucHV0X2NvbnRhaW5lcicpKSB7XG4gICAgICAgICAgICAgIHZhciBpbnB1dCA9IGdpbnB1dENvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXTtcbiAgICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIENhbGwgdGhlIGZ1bmN0aW9uXG5pZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmdmb3JtLWJvZHknKSkge1xuICB3cml0ZVBhcmFtc1RvSW5wdXRzKCk7XG59XG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gIC8vIGZ1bmN0aW9uIGxvZ0VsZW1lbnRFdmVudChldmVudE5hbWUsIGVsZW1lbnQpIHtcbiAgLy8gICBjb25zb2xlLmxvZyhEYXRlLm5vdygpLCBldmVudE5hbWUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zcmNcIikpO1xuICAvLyB9XG4gIC8vIHZhciBjYWxsYmFja19lbnRlciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+UkSBFTlRFUkVEXCIsIGVsZW1lbnQpO1xuICAvLyB9O1xuICAvLyB2YXIgY2FsbGJhY2tfZXhpdCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+aqiBFWElURURcIiwgZWxlbWVudCk7XG4gIC8vIH07XG4gIC8vIHZhciBjYWxsYmFja19sb2FkaW5nID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgLy8gICBsb2dFbGVtZW50RXZlbnQoXCLijJogTE9BRElOR1wiLCBlbGVtZW50KTtcbiAgLy8gfTtcbiAgLy8gdmFyIGNhbGxiYWNrX2xvYWRlZCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+RjSBMT0FERURcIiwgZWxlbWVudCk7XG4gIC8vIH07XG4gIC8vIHZhciBjYWxsYmFja19lcnJvciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+SgCBFUlJPUlwiLCBlbGVtZW50KTtcbiAgLy8gICBlbGVtZW50LnNyYyA9IFwiaHR0cHM6Ly92aWEucGxhY2Vob2xkZXIuY29tLzQ0MHg1NjAvP3RleHQ9RXJyb3IrUGxhY2Vob2xkZXJcIjtcbiAgLy8gfTtcbiAgLy8gdmFyIGNhbGxiYWNrX2ZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gICBsb2dFbGVtZW50RXZlbnQoXCLinJTvuI8gRklOSVNIRURcIiwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgLy8gfTtcbiAgLy8gdmFyIGNhbGxiYWNrX2NhbmNlbCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+UpSBDQU5DRUxcIiwgZWxlbWVudCk7XG4gIC8vIH07XG5cbiAgdmFyIHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIHZhciB0aHJlc2hvbGQgPSAtMjAwO1xuICBpZiAod2luZG93V2lkdGggPCAxMDI0KSB7XG4gICAgdGhyZXNob2xkID0gMDtcbiAgfVxuICB2YXIgbGwgPSBuZXcgTGF6eUxvYWQoe1xuICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgIC8vIHVzZV9uYXRpdmU6IHRydWUsIC8vIHVzZSBuYXRpdmUgbGF6eSBsb2FkaW5nIHdoZW4gYnJvd3NlciBjb21wYXRpYmxlXG4gICAgZWxlbWVudHNfc2VsZWN0b3I6IFwiLmxhenlcIixcbiAgICB1c2VfbmF0aXZlOiB0cnVlLFxuICAgIGNhbGxiYWNrX2xvYWRlZDogZnVuY3Rpb24gY2FsbGJhY2tfbG9hZGVkKGVsKSB7XG4gICAgICAvLyBPcHRpb25hbDogaGFuZGxlIHdoZW4gaW1hZ2VzIGFyZSBsb2FkZWRcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpO1xuICAgIH1cblxuICAgIC8vIGNsYXNzX2FwcGxpZWQ6IFwibHotYXBwbGllZFwiLFxuICAgIC8vIGNsYXNzX2xvYWRpbmc6IFwibHotbG9hZGluZ1wiLFxuICAgIC8vIGNsYXNzX2xvYWRlZDogXCJsei1sb2FkZWRcIixcbiAgICAvLyBjbGFzc19lcnJvcjogXCJsei1lcnJvclwiLFxuICAgIC8vIGNsYXNzX2VudGVyZWQ6IFwibHotZW50ZXJlZFwiLFxuICAgIC8vIGNsYXNzX2V4aXRlZDogXCJsei1leGl0ZWRcIixcbiAgICAvLyBBc3NpZ24gdGhlIGNhbGxiYWNrcyBkZWZpbmVkIGFib3ZlXG4gICAgLy8gY2FsbGJhY2tfZW50ZXI6IGNhbGxiYWNrX2VudGVyLFxuICAgIC8vIGNhbGxiYWNrX2V4aXQ6IGNhbGxiYWNrX2V4aXQsXG4gICAgLy8gY2FsbGJhY2tfY2FuY2VsOiBjYWxsYmFja19jYW5jZWwsXG4gICAgLy8gY2FsbGJhY2tfbG9hZGluZzogY2FsbGJhY2tfbG9hZGluZyxcbiAgICAvLyBjYWxsYmFja19sb2FkZWQ6IGNhbGxiYWNrX2xvYWRlZCxcbiAgICAvLyBjYWxsYmFja19lcnJvcjogY2FsbGJhY2tfZXJyb3IsXG4gICAgLy8gY2FsbGJhY2tfZmluaXNoOiBjYWxsYmFja19maW5pc2hcbiAgfSk7XG4gICQoZG9jdW1lbnQpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgLy8gY29uc29sZS5sb2coZS50YXJnZXQpXG4gIH0pO1xuICAkKCcjcGxhbi1jb21wYXJlLXByZXYsICNwbGFuLWNvbXBhcmUtbmV4dCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgLy8gU3RvcCB0aGUgZXZlbnQgZnJvbSBidWJibGluZyB1cCB0byBwYXJlbnQgZWxlbWVudHNcblxuICAgIHZhciB0YXJnZXRBbmltYXRlID0gJCgnLnBsYW4td3JhcCcpO1xuICAgIHZhciB0YXJnZXRTZWN0aW9uID0gJCgnLnNlY3Rpb24tcGxhbi1jb21wYXJpc29uJyk7XG4gICAgdmFyIGNsaWNrZWRJZCA9ICQodGhpcykuYXR0cignaWQnKTsgLy8gVXNlICQodGhpcykgdG8gZ2V0IHRoZSBpZCBvZiB0aGUgY2xpY2tlZCBlbGVtZW50XG5cbiAgICBpZiAoY2xpY2tlZElkID09PSAncGxhbi1jb21wYXJlLXByZXYnICYmIHRhcmdldFNlY3Rpb24uaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICB0YXJnZXRBbmltYXRlLmFuaW1hdGUoe1xuICAgICAgICBzY3JvbGxMZWZ0OiAwXG4gICAgICB9LCAyMDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQW5pbWF0aW9uIGNvbXBsZXRlLCByZW1vdmUgdGhlIGFjdGl2ZSBjbGFzc1xuICAgICAgICB0YXJnZXRTZWN0aW9uLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY2xpY2tlZElkID09PSAncGxhbi1jb21wYXJlLW5leHQnICYmICF0YXJnZXRTZWN0aW9uLmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuICAgICAgdGFyZ2V0U2VjdGlvbi5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIG1heGltdW0gc2Nyb2xsIHBvc2l0aW9uXG4gICAgICB2Y
108XIgbWF4U2Nyb2xsTGVmdCA9IHRhcmdldEFuaW1hdGVbMF0uc2Nyb2xsV2lkdGggLSB0YXJnZXRBbmltYXRlLm91dGVyV2lkdGgoKTtcbiAgICAgIC8vIEFuaW1hdGUgc2Nyb2xsIHRvIHRoZSBtYXhpbXVtIHNjcm9sbCBwb3NpdGlvblxuICAgICAgdGFyZ2V0QW5pbWF0ZS5hbmltYXRlKHtcbiAgICAgICAgc2Nyb2xsTGVmdDogbWF4U2Nyb2xsTGVmdFxuICAgICAgfSwgMjAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRhcmdldFNlY3Rpb24ucmVtb3ZlQ2xhc3MoJ3Njcm9sbGluZycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBWYXJpYWJsZSB0byBob2xkIHRoZSBsYXN0IGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uXG4gIHZhciBsYXN0U2Nyb2xsTGVmdCA9IDA7XG5cbiAgLy8gVmFyaWFibGUgdG8gaG9sZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkZWJvdW5jZSB0aW1lb3V0XG4gIHZhciBkZWJvdW5jZVRpbWVvdXQgPSBudWxsO1xuICB2YXIgZGVib3VuY2VEZWxheSA9IDEwMDsgLy8gRGVsYXkgaW4gbWlsbGlzZWNvbmRzXG5cbiAgJCgnLnBsYW4td3JhcCcpLm9uKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIHRpbWVvdXQgdG8gcmVzZXQgdGhlIGRlYm91bmNlIHRpbWVyXG4gICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZW91dCk7XG5cbiAgICAvLyBTZXQgYSBuZXcgdGltZW91dFxuICAgIGRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICB2Y
108XIgY3VycmVudFNjcm9sbExlZnQgPSAkKCcucGxhbi13cmFwJykuc2Nyb2xsTGVmdCgpO1xuICAgICAgdmFyIHRhcmdldEFuaW1hdGUgPSAkKCcucGxhbi13cmFwJyk7XG4gICAgICB2YXIgdGFyZ2V0U2VjdGlvbiA9ICQoJy5zZWN0aW9uLXBsYW4tY29tcGFyaXNvbicpO1xuXG4gICAgICAvLyBDaGVjayBpZiBzY3JvbGxpbmcgZnJvbSByaWdodCB0byBsZWZ0XG4gICAgICBpZiAoY3VycmVudFNjcm9sbExlZnQgPCBsYXN0U2Nyb2xsTGVmdCkge1xuICAgICAgICBpZiAodGFyZ2V0U2VjdGlvbi5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICB0YXJnZXRBbmltYXRlLmFuaW1hdGUoe1xuICAgICAgICAgICAgc2Nyb2xsTGVmdDogMFxuICAgICAgICAgIH0sIDIwMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gQW5pbWF0aW9uIGNvbXBsZXRlLCByZW1vdmUgdGhlIGFjdGl2ZSBjbGFzc1xuICAgICAgICAgICAgdGFyZ2V0U2VjdGlvbi5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFNlY3Rpb24uYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG1heGltdW0gc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIHZhciBtYXhTY3JvbGxMZWZ0ID0gdGFyZ2V0QW5pbWF0ZVswXS5zY3JvbGxXaWR0aCAtIHRhcmdldEFuaW1hdGUub3V0ZXJXaWR0aCgpO1xuICAgICAgICAvLyBBbmltYXRlIHNjcm9sbCB0byB0aGUgbWF4aW11bSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgdGFyZ2V0QW5pbWF0ZS5hbmltYXRlKHtcbiAgICAgICAgICBzY3JvbGxMZWZ0OiBtYXhTY3JvbGxMZWZ0XG4gICAgICAgIH0sIDIwMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgbGFzdCBzY3JvbGwgcG9zaXRpb24gdG8gdGhlIGN1cnJlbnQgb25lIGZvciB0aGUgbmV4dCBzY3JvbGwgZXZlbnRcbiAgICAgIGxhc3RTY3JvbGxMZWZ0ID0gY3VycmVudFNjcm9sbExlZnQ7XG4gICAgfSwgZGVib3VuY2VEZWxheSk7XG4gIH0pO1xuXG4gIC8vIG1ha2UgbmF2IGRhcmsgaWYgZmlyc3QgZWxlbWVudCBpcyBkYXJrXG4gIHZhciBtYWluQm9keVRoZW1lID0gJCgnI2NvbnRlbnQgPjpmaXJzdC1jaGlsZCcpLmF0dHIoJ2RhdGEtdGhlbWUnKTtcbiAgaWYgKG1haW5Cb2R5VGhlbWUgJiYgbWFpbkJvZHlUaGVtZSA9PSAnZGFyaycpIHtcbiAgICAkKCcjaGVhZGVyJykuYXR0cignZGF0YS10aGVtZScsICdkYXJrJyk
1087XG4gIH1cblxuICAvLyBmb3JtIHNwbGl0IHRyaWdnZXIgY2xpY2tcbiAgdmFyIGxvY2F0aW9uLCB1c2FnZSwgZGVza3MsIHNlYXRzO1xuICB2YXIgbWVtUGFyZW50LCBtZW1DaGlsZDtcbiAgLy8gJCgnLmZvcm0tc3BsaXQtc2VjdGlvbiAubmgtcmFkaW8tYnV0dG9uIC5nZmllbGRfcmFkaW8gPiAuZ2Nob2ljZScpLmNsaWNrKGZ1bmN0aW9uKGUpIHtcbiAgZnVuY3Rpb24gbmhNZW1iZXJGb3JtQ2xpY2tzKCkge1xuICAgICQoJy5mb3JtLXNwbGl0LXNlY3Rpb24gLm5oLXJhZGlvLWJ1dHRvbiAuZ2ZpZWxkX3JhZGlvID4gLmdjaG9pY2UnKS5jbGljayhmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gY2hlY2sgaWYgY2xpY2sgbG9jYXRpb24gYnV0dG9uIG9yIG1lbWJlcnNoaXAgdHlwZSBidXR0b25cbiAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1tZW1iZXJzaGlwJykubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyByZW1vdmUgYWN0aXZlIGZyb20gcGFyZW50IG5oIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgJCgnLm5oLXJhZGlvLW1lbWJlcnNoaXAnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICQoJy5uaC1yYWRpby1tZW1iZXJzaGlwJykucmVtb3ZlQ2xhc3MoJ25oLXJhZGlvLW1lbWJlcnNoaXAtZGVmYXVsdCcpO1xuXG4gICAgICAgIC8vIFVuY2hlY2sgYWxsIHJhZGlvIGJ1dHRvbnMgaW5zaWRlIGFsbCBkaXZzIHdpdGggdGhlIGNsYXNzIG5oLXJhZGlvLWxvY2F0aW9uXG4gICAgICAgICQodGhpcykuY2xvc2VzdCgnLm5oLXJhZGlvLW1lbWJlcnNoaXAnKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICQoJy5uaC1yYWRpby1tZW1iZXJzaGlwJykuZmluZCgnLmdmaWVsZC1jaG9pY2UtaW5wdXQnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICAkKCcubmgtcmFkaW8tbWVtYmVyc2hpcCcpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykuY2hhbmdlKCk7XG4gICAgICAgICQoJy5uaC1yYWRpby1tZW1iZXJzaGlwIC5nY2hvaWNlJykucmVtb3ZlQ2xhc3MoJ2NoZWNrZWQnKTtcblxuICAgICAgICAvLyBUaGVuLCBjaGVjayB0aGUgcmFkaW8gYnV0dG9uIHdpdGhpbiB0aGUgY2xpY2tlZCAuZ2Nob2ljZVxuICAgICAgICAkKHRoaXMpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgICAkKHRoaXMpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykuY2hhbmdlKCk7XG4gICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2NoZWNrZWQnKTtcbiAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tbG9jYXRpb24nKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEZpcnN0LCB1bmNoZWNrIGFsbCByYWRpbyBidXR0b25zIGluIHRoZSBzYW1lIGdyb3VwXG4gICAgICAgICQodGhpcykuc2libGluZ3MoKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICQodGhpcykuc2libGluZ3MoKS5yZW1vdmVDbGFzcygnY2hlY2tlZCcpO1xuICAgICAgICAvLyBUaGVuLCBjaGVjayB0aGUgcmFkaW8gYnV0dG9uIHdpdGhpbiB0aGUgY2xpY2tlZCAuZ2Nob2ljZVxuICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1sb2NhdGlvbicpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJCh0aGlzKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnY2hlY2tlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmlyc3QsIHVuY2hlY2sgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIHNhbWUgZ3JvdXBcbiAgICAgICAgJCh0aGlzKS5zaWJsaW5ncygpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgJCh0aGlzKS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdjaGVja2VkJyk7XG4gICAgICAgIC8vIFRoZW4sIGNoZWNrIHRoZSByYWRpbyBidXR0b24gd2l0aGluIHRoZSBjbGlja2VkIC5nY2hvaWNlXG4gICAgICAgICQodGhpcykuY2xvc2VzdCgnLm5oLXJhZGlvLWJ1dHRvbicpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJCh0aGlzKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnY2hlY2tlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBiZWNvbWUgbWVtYmVyIGZvcm1cbiAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1iZWNvbWVtZW1iZXItZm9ybScpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gaWYgZmllbGRzZXQgd2l0aCBjbGFzcyBuaC1yYWRpby1zYWxvbiBoYXMgY2xhc3Mgb2YgYWN0aXZlXG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1zYWxvbicpLmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuICAgICAgICAgIC8vIGZpbmQgY2xvc2VzIHN1Ym1pdCBidXR0b24gYW5kIGNoYW5nZSB2YWx1ZSB0byBBcHBseVxuICAgICAgICAgICQoJyNnZm9ybV9zdWJtaXRfYnV0dG9uXzM0JykudmFsKCdBcHBseScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGZpZWxkc2V0IHdpdGggY2xhc3MgbmgtcmFkaW8tcmVzaWRlbnQgaGFzIGNsYXNzIG9mIGFjdGl2ZVxuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tcmVzaWRlbnQnKS5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICAvLyBmaW5kIGNsb3NlcyBzdWJtaXQgYnV0dG9uIGFuZCBjaGFuZ2UgdmFsdWUgdG8gQXBwbHlcbiAgICAgICAgICAkKCcjZ2Zvcm1fc3VibWl0X2J1dHRvbl8zNCcpLnZhbCgnU3VibWl0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYnVpbGQgbWVtYmVyc2hpcCBmb3JtXG4gICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tYnVpbGRtZW1iZXInKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1idWlsZG1lbWJlcicpLmhhc0NsYXNzKCdsb2NhdGlvbic
108pKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSAkKHRoaXMpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykudmFsKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tYnVpbGRtZW1iZXInKS5oYXNDbGFzcygndXNhZ2UnKSkge1xuICAgICAgICAgIHVzYWdlID0gJCh0aGlzKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dCcpLnZhbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKCQodGhpcykuY2xvc2VzdCgnLm5oLXJhZGlvLWJ1aWxkbWVtYmVyJykuaGFzQ2xhc3MoJ2Rlc2tzJykpIHtcbiAgICAgICAgICBkZXNrcyA9ICQodGhpcykuZmluZCgnLmdmaWVsZC1jaG9pY2UtaW5wdXQnKS52YWwoKTtcbiAgICAgICAgfSBlbHNlIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1idWlsZG1lbWJlcicpLmhhc0NsYXNzKCdzZWF0cycpKSB7XG4gICAgICAgICAgc2VhdHMgPSAkKHRoaXMpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykudmFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2F0aW9uID09ICdtYWRpc29uLXNxdWFyZScpIHtcbiAgICAgICAgICBsb2NhdGlvbiA9ICdNYWRpc29uIFNxdWFyZSc7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24gPT0gJ2hvbGx5d29vZCcpIHtcbiAgICAgICAgICBsb2NhdGlvbiA9ICdIb2xseXdvb2QnO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uID09ICd2ZW5pY2UtYmVhY2gnKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSAnVmVuaWNlIEJlYWNoJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVza3MgPT0gJ2RlZGljYXRlZC1kZXNrJykge1xuICAgICAgICAgIG1lbVBhcmVudCA9ICdSZXNpZGVudCc7XG4gICAgICAgICAgbWVtQ2hpbGQgPSAnQXRlbGllcic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2tzID09ICdwcml2YXRlLXNwYWNlJykge1xuICAgICAgICAgIG1lbVBhcmVudCA9ICdSZXNpZGVudCc7XG4gICAgICAgICAgbWVtQ2hpbGQgPSAnU3R1ZGlvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVza3MgPT0gJ2ZsZXhpYmxlLXNlYXRpbmcnKSB7XG4gICAgICAgICAgaWYgKHVzYWdlID09ICd1bmxpbWl0ZWQnKSB7XG4gICAgICAgICAgICBtZW1QYXJlbnQgPSAnUmVzaWRlbnQnO1xuICAgICAgICAgICAgbWVtQ2hpbGQgPSAnR2FsbGVyeSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1lbVBhcmVudCA9ICdTYWxvbic7XG4gICAgICAgICAgICBpZiAoc2VhdHMgPT0gJzEnIHx8IHNlYXRzID09ICcyLTQnKSB7XG4gICAgICAgICAgICAgIG1lbUNoaWxkID0gJ0luZGl2aWR1YWwnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWVtQ2hpbGQgPSAnVGVhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBjb29raWVzXG4gICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBub3cuc2V0VGltZShub3cuZ2V0VGltZSgpICsgMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMCk7IC8vIDEgeWVhciBmcm9tIG5vd1xuICAgICAgICB2Y
108XIgZXhwaXJlcyA9IFwiZXhwaXJlcz1cIiArIG5vdy50b1VUQ1N0cmluZygpO1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBcImxvY2F0aW9uPVwiICsgbG9jYXRpb24gKyBcIjtcIiArIGV4cGlyZXMgKyBcIjtwYXRoPS9cIjtcbiAgICAgICAgdmFyIG1lbWJlcnNoaXBUeXBlID0gbWVtUGFyZW50ICsgJyAnICsgbWVtQ2hpbGQ7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IFwibWVtYmVyc2hpcFR5cGU9XCIgKyBtZW1iZXJzaGlwVHlwZSArIFwiO1wiICsgZXhwaXJlcyArIFwiO3BhdGg9L1wiO1xuICAgICAgfVxuICAgIH0pOyAvLyBjbG9zZSBjbGljayBldmVudCBoYW5kbGVyXG4gIH0gLy8gY2xvc2UgbmhNZW1iZXJGb3JtQ2xpY2tzIGZ1bmN0aW9uXG4gIG5oTWVtYmVyRm9ybUNsaWNrcygpO1xuICBmdW5jdGlvbiBnZXRDb29raWUobmFtZSkge1xuICAgIHZhciBjb29raWVBcnIgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoXCI7XCIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29va2llUGFpciA9IGNvb2tpZUFycltpXS5zcGxpdChcIj1cIik7XG4gICAgICBpZiAobmFtZSA9PSBjb29raWVQYWlyWzBdLnRyaW0oKSkge1xuICAgICAgICAvLyBEZWNvZGUgdGhlIGNvb2tpZSB2YWx1ZSBhbmQgcmV0dXJuXG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29va2llUGFpclsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiBudWxsIGlmIG5vdCBmb3VuZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gc2V0IGNvb2tpZXMgdG8gdXNlIG9uIG5leHQgcGFnZSBvZiBmb3JtXG4gICQoZG9jdW1lbnQpLm9uKCdnZm9ybV9wYWdlX2xvYWRlZCcsIGZ1bmN0aW9uIChldmVudCwgZm9ybUlkLCBjdXJyZW50UGFnZSkge1xuICAgICQoJy5fX2J1aWxkbWVtYmVyc2hpcCAuZm9ybV9faW1nJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgIGlmICghJCh0aGlzKS5oYXNDbGFzcygnaGlkZGVuJykpIHtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgJCgnLl9fYnVpbGRtZW1iZXJzaGlwIC5zZWxlY3Rpb25fdGV4dCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgfSk7XG4gICAgdmFyIHZpZXdwb3J0V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICBpZiAodmlld3BvcnRXaWR0aCA8IDEwMjQpIHtcbiAgICAgICQoJy5fX2J1aWxkbWVtYmVyc2hpcCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJCh0aGlzKS5oZWlnaHQoMCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRQYWdlID09IDIpIHtcbiAgICAgIC8vIFJldHJpZXZlIGNvb2tpZSB2YWx1ZXNcbiAgICAgIHZhciBsb2NhdGlvbkNvb2tpZSA9IGdldENvb2tpZShcImxvY2F0aW9uXCIpO1xuICAgICAgdmFyIG1lbWJlcnNoaXBUeXBlQ29va2llID0gZ2V0Q29va2llKFwibWVtYmVyc2hpcFR5cGVcIik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjb29raWVzIGV4aXN0IGFuZCBzZXQgdGhlIHRleHQgb2YgdGhlIGZpZWxkcyBhY2NvcmRpbmdseVxuICAgICAgaWYgKGxvY2F0aW9uQ29va2llKSB7XG4gICAgICAgICQoJyNuaC1idWlsZG1lbWJlcmZvcm0tbWVtYmVyc2hpcC1sb2NhdGlvbicpLnRleHQobG9jYXRpb25Db29raWUpO1xuICAgICAgICAkKCcubmgtbG9jYXRpb24tY2FsYycpLmZpbmQoJy5naW5wdXRfY29udGFpbmVyIGlucHV0JykudmFsKGxvY2F0aW9uQ29va2llKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZW1iZXJzaGlwVHlwZUNvb2tpZSkge1xuICAgICAgICAkKCcjbmgtYnVpbGRtZW1iZXJmb3JtLW1lbWJlcnNoaXAtdHlwZScpLnRleHQobWVtYmVyc2hpcFR5cGVDb29raWUpO1xuICAgICAgICAkKCcubmgtbWVtYmVyc2hpcC1jYWxjJykuZmluZCgnLmdpbnB1dF9jb250YWluZXIgaW5wdXQnKS52YWwobWVtYmVyc2hpcFR5cGVDb29raWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBidWlsZCBtZW1iZXIgZm9ybSBzdWJtaXQgYnV0dG9uIHRleHRcbiAgICAgIGlmICgkKCcubmgtYnVpbGRtZW1iZXJmb3JtJykubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBpZiBmaWVsZHNldCB3aXRoIGNsYXNzIG5oLXJhZGlvLXNhbG9uIGhhcyBjbGFzcyBvZiBhY3RpdmVcbiAgICAgICAgaWYgKCQoJyNuaC1idWlsZG1lbWJlcmZvcm0tbWVtYmVyc2hpcC10eXBlJykudGV4dCgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3NhbG9uJykpIHtcbiAgICAgICAgICAvLyBmaW5kIGNsb3NlcyBzdWJtaXQgYnV0dG9uIGFuZCBjaGFuZ2UgdmFsdWUgdG8gQXBwbHlcbiAgICAgICAgICAkKCcjZ2Zvcm1fc3VibWl0X2J1dHRvbl8zNScpLnZhbCgnQXBwbHknKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBmaWVsZHNldCB3aXRoIGNsYXNzIG5oLXJhZGlvLXJlc2lkZW50IGhhcyBjbGFzcyBvZiBhY3RpdmVcbiAgICAgICAgaWYgKCQoJyNuaC1idWlsZG1lbWJlcmZvcm0tbWVtYmVyc2hpcC10eXBlJykudGV4dCgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3Jlc2lkZW50JykpIHtcbiAgICAgICAgICAvLyBmaW5kIGNsb3NlcyBzdWJtaXQgYnV0dG9uIGFuZCBjaGFuZ2UgdmFsdWUgdG8gQXBwbHlcbiAgICAgICAgICAkKCcjZ2Zvcm1fc3VibWl0X2J1dHRvbl8zNScpLnZhbCgnU3VibWl0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaG93IHRoZSByaWdodCBpbWFnZVxuICAgICAgICAvLyByZW1vdmUgdGhlIHdvcmQgJ3NhbG9uJyBvciAncmVzaWRlbnQnIGZyb20gdGhlIG1lbWJlcnNoaXAgdHlwZVxuICAgICAgICB2Y
108XIgbWVtYmVyc2hpcFR5cGUgPSAkKCcjbmgtYnVpbGRtZW1iZXJmb3JtLW1lbWJlcnNoaXAtdHlwZScpLnRleHQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBtZW1iZXJzaGlwVHlwZSA9IG1lbWJlcnNoaXBUeXBlLnJlcGxhY2UoJ3NhbG9uJywgJycpO1xuICAgICAgICBtZW1iZXJzaGlwVHlwZSA9IG1lbWJlcnNoaXBUeXBlLnJlcGxhY2UoJ3Jlc2lkZW50JywgJycpO1xuICAgICAgICBtZW1iZXJzaGlwVHlwZSA9IG1lbWJlcnNoaXBUeXBlLnRyaW0oKTtcblxuICAgICAgICAvL3NsdWdpZnkgbG9jYXRpb24sIHJlcGxhY2VzIHNwYWNlcyB3aXRoIGRhc2hlc1xuICAgICAgICB2YXIgX2xvY2F0aW9uID0gJCgnI25oLWJ1aWxkbWVtYmVyZm9ybS1tZW1iZXJzaGlwLWxvY2F0aW9uJykudGV4dCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIF9sb2NhdGlvbiA9IF9sb2NhdGlvbi5yZXBsYWNlKC9cXHMrL2csICctJyk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2cobG9jYXRpb24sIG1lbWJlcnNoaXBUeXBlKTtcblxuICAgICAgICAkKCcuX19idWlsZG1lbWJlcnNoaXAgLmZvcm1fX2ltZ1tkYXRhLWxvY2F0aW9uPVwiJyArIF9sb2NhdGlvbiArICdcIl1bZGF0YS1tZW1iZXJzaGlwPVwiJyArIG1lbWJlcnNoaXBUeXBlICsgJ1wiXScpLmFkZENsYXNzKCdhY3RpdmUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJy5fX2J1aWxkbWVtYmVyc2hpcCAuc2VsZWN0aW9uX3RleHRbZGF0YS1sb2NhdGlvbj1cIicgKyBfbG9jYXRpb24gKyAnXCJdW2RhdGEtbWVtYmVyc2hpcD1cIicgKyBtZW1iZXJzaGlwVHlwZSArICdcIl0nKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgIGlmICh2aWV3cG9ydFdpZHRoIDwgMTAyNCkge1xuICAgICAgICAgICQoJyNnZm9ybV8nICsgZm9ybUlkKS5jbG9zZXN0KCcuZHluYW1pYy1lbmFibGVkJykuZmluZCgnLl9fYnVpbGRtZW1iZXJzaGlwJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygkKHRoaXMpKVxuICAgICAgICAgICAgLy8gJChjdXJyZW50UGFnZSkuY2xvc2VzdCgnLmR5YW5taWMtZW5hYmxlZCcpLmZpbmQoJy5fX2J1aWxkbWVtYmVyc2hpcCcpLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgICAgICB2Y
108XIgY3VycmVudEhlaWdodCA9ICR0aGlzLmhlaWdodCgpO1xuICAgICAgICAgICAgdmFyIGF1dG9IZWlnaHQgPSAkdGhpcy5jc3MoJ2hlaWdodCcsICdhdXRvJykuaGVpZ2h0KCk7XG4gICAgICAgICAgICAkdGhpcy5oZWlnaHQoY3VycmVudEhlaWdodCk7IC8vIFJlc2V0IHRvIG9yaWdpbmFsIGhlaWdodFxuXG4gICAgICAgICAgICAkdGhpcy5hbmltYXRlKHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvSGVpZ2h0XG4gICAgICAgICAgICB9LCA0MDApOyAvLyBBZGp1c3QgdGhlIGR1cmF0aW9uIGFzIG5lZWRlZFxuICAgICAgICAgICAgJHRoaXMuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoJyNnZm9ybV8nICsgZm9ybUlkKS5jbG9zZXN0KCcuZHluYW1pYy1lbmFibGVkJykuZmluZCgnLl9fYnVpbGRtZW1iZXJzaGlwJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgICAgJCh0aGlzKS5oZWlnaHQoJ2F1dG8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3JtRGVmYXVsdENoZWNrZWQoKTtcbiAgICBuaE1lbWJlckZvcm1DbGlja3MoKTtcbiAgfSk7XG5cbiAgLy8gc2V0IGxvY2F0aW9uIGNvb2tpZSB3aXRob3V0IGNsaWNrXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmICgkKCcuZ2Zvcm1fcGFnZScpLmhhc0NsYXNzKCduaC1idWlsZG1lbWJlcmZvcm0nKSkge1xuICAgICAgaWYgKCQoJy5uaC1yYWRpby1idWlsZG1lbWJlci5sb2NhdGlvbicpLmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuICAgICAgICBsb2NhdGlvbiA9ICQoJy5uaC1yYWRpby1idWlsZG1lbWJlci5sb2NhdGlvbiAuZ2ZpZWxkLWNob2ljZS1pbnB1dDpjaGVja2VkJykudmFsKCk7XG4gICAgICAgIGlmIChsb2NhdGlvbiA9PSAnbWFkaXNvbi1zcXVhcmUnKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSAnTWFkaXNvbiBTcXVhcmUnO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uID09ICdob2xseXdvb2QnKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSAnSG9sbHl3b29kJztcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbiA9PSAndmVuaWNlLWJlYWNoJykge1xuICAgICAgICAgIGxvY2F0aW9uID0gJ1ZlbmljZSBCZWFjaCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIG5vdy5zZXRUaW1lKG5vdy5nZXRUaW1lKCkgKyAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwKTsgLy8gMSB5ZWFyIGZyb20gbm93XG4gICAgICAgIHZhciBleHBpcmVzID0gXCJleHBpcmVzPVwiICsgbm93LnRvVVRDU3RyaW5nKCk7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IFwibG9jYXRpb249XCIgKyBsb2NhdGlvbiArIFwiO1wiICsgZXhwaXJlcyArIFwiO3BhdGg9L1wiO1xuICAgICAgfVxuICAgIH1cbiAgfSwgODAwKTtcblxuICAvLyBmb3JtIHNwbGl0IGxvYWQgZGVmYXVsdCBjaGVja2VkIG9uIG1lbWJlcnNoaXAgcGFnZXNcbiAgZnVuY3Rpb24gZm9ybURlZmF1bHRDaGVja2VkKCkge1xuICAgIGlmICgkKCcubmgtcmFkaW8tYnV0dG9uJykubGVuZ3RoID4gMCkge1xuICAgICAgJCgnLm5oLXJhZGlvLWJ1dHRvbicpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
108XIgcmFkaW9DaGVja2VkID0gJCh0aGlzKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dDpjaGVja2VkJykuY2xvc2VzdCgnLmdjaG9pY2UnKTtcbiAgICAgICAgcmFkaW9DaGVja2VkLmFkZENsYXNzKCdjaGVja2VkJyk7XG4gICAgICAgIHJhZGlvQ2hlY2tlZC5jbG9zZXN0KCcubmgtcmFkaW8tYnV0dG9uJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGlmIG5vIGdjaG9pY2UgaXRlbXMgaGF2ZSBjbGFzcyBjaGVja2VkLCBhZGQgY2xhc3MgbmgtcmFkaW8tbWVtYmVyc2hpcC1kZWZhdWx0IHRvIHRoZSBlbGVtZW50IHdpdGggY2xhc3MgbmgtcmFkaW8tbWVtYmVyc2hpcFxuICAgIGlmICgkKCcubmgtcmFkaW8tbWVtYmVyc2hpcCAuZ2Nob2ljZS5jaGVja2VkJykubGVuZ3RoID09IDApIHtcbiAgICAgICQoJy5uaC1yYWRpby1tZW1iZXJzaGlwJykuYWRkQ2xhc3MoJ25oLXJhZGlvLW1lbWJlcnNoaXAtZGVmYXVsdCcpO1xuICAgIH1cblxuICAgIC8vIGJlY29tZSBtZW1iZXIgZm9ybVxuICAgIGlmICgkKCcubmgtYmVjb21lbWVtYmVyLWZvcm0nKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBpZiBmaWVsZHNldCB3aXRoIGNsYXNzIG5oLXJhZGlvLXNhbG9uIGhhcyBjbGFzcyBvZiBhY3RpdmVcbiAgICAgIGlmICgkKCcubmgtYmVjb21lbWVtYmVyLWZvcm0gLm5oLXJhZGlvLXNhbG9uJykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICAgIC8vIGZpbmQgY2xvc2VzIHN1Ym1pdCBidXR0b24gYW5kIGNoYW5nZSB2YWx1ZSB0byBBcHBseVxuICAgICAgICAkKCcubmgtYmVjb21lbWVtYmVyLWZvcm0gaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpLnZhbCgnQXBwbHknKTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIGZpZWxkc2V0IHdpdGggY2xhc3MgbmgtcmFkaW8tcmVzaWRlbnQgaGFzIGNsYXNzIG9mIGFjdGl2ZVxuICAgICAgaWYgKCQodGhpcykuY2xvc2VzdCgnLm5oLXJhZGlvLXJlc2lkZW50JykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICAgIC8vIGZpbmQgY2xvc2VzIHN1Ym1pdCBidXR0b24gYW5kIGNoYW5nZSB2YWx1ZSB0byBBcHBseVxuICAgICAgICAkKCcubmgtYmVjb21lbWVtYmVyLWZvcm0gaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpLnZhbCgnU3VibWl0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvcm1EZWZhdWx0Q2hlY2tlZCgpO1xuICAkKCcubmgtcmFkaW8tYnV0dG9uIC5nZmllbGRfcmFkaW8gLmdjaG9pY2UnKS5ob3ZlcihmdW5jdGlvbiAoKSB7XG4gICAgJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tYnV0dG9uJykudG9nZ2xlQ2xhc3MoJ2hvdmVyJyk7XG4gIH0pO1xuXG4gIC8vIHNhdmUgaW1wb3J0YW50IGZvcm0gaW5wdXRzIHRvIERvbSB0byB1c2UgaW4gcmVkaXJlY3RcbiAgZnVuY3Rpb24gbmhHZkNvbGxlY3RJbnB1dHMoZm9ybUlkTnVtKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2NvbGxlY3RpbmcgaW5wdXRzJyk7XG4gICAgdmFyIGdmb3JtSWRzID0gWyczNCcsICczNSddO1xuICAgIGlmICgkKCcjZ2Zvcm1fJyArIGZvcm1JZE51bSArICdfdmFsaWRhdGlvbl9jb250YWluZXInKS5oYXNDbGFzcygnZ2Zvcm1fdmFsaWRhdGlvbl9lcnJvcicpIHx8ICFnZm9ybUlkcy5pbmNsdWRlcyhmb3JtSWROdW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciAkZm9ybUlkID0gJCgnI2dmb3JtXycgKyBmb3JtSWROdW0pO1xuXG4gICAgLy8gaWYgZm9ybSBpZCBub3QgZm91bmQgcmV0dXJuXG4gICAgaWYgKCRmb3JtSWQubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHNhbG9uQ2hlY2sgPSBmYWxzZTtcbiAgICB2YXIgbG9jYXRpb25UYXJnZXQsIG1lbWJlcnNoaXBUYXJnZXQ7XG4gICAgaWYgKGZvcm1JZE51bSA9PSAzNSkge1xuICAgICAgbG9jYXRpb25UYXJnZXQgPSAkKCcjbmgtYnVpbGRtZW1iZXJmb3JtLW1lbWJlcnNoaXAtbG9jYXRpb24nKS50ZXh0KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIG1lbWJlcnNoaXBUYXJnZXQgPSAkKCcjbmgtYnVpbGRtZW1iZXJmb3JtLW1lbWJlcnNoaXAtdHlwZScpLnRleHQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgc2Fsb25DaGVjayA9IG1lbWJlcnNoaXBUYXJnZXQuaW5jbHVkZXMoJ3NhbG9uJyk7XG4gICAgfVxuICAgIGlmIChmb3JtSWROdW0gPT0gMzQpIHtcbiAgICAgIGxvY2F0aW9uVGFyZ2V0ID0gJGZvcm1JZC5maW5kKCcubmgtcmFkaW8tbG9jYXRpb24gaW5wdXQ6Y2hlY2tlZCcpLnZhbCgpO1xuICAgICAgbWVtYmVyc2hpcFRhcmdldCA9ICRmb3JtSWQuZmluZCgnLm5oLXJhZGlvLXNhbG9uJykuaGFzQ2xhc3MoJ2FjdGl2ZScpID8gJ3NhbG9uJyA6ICdyZXNpZGVudCc7XG4gICAgICBzYWxvbkNoZWNrID0gbWVtYmVyc2hpcFRhcmdldC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdzYWxvbicpO1xuICAgIH1cbiAgICAkZm9ybUlkLmNsb3Nlc3QoJy5mb3JtLXNwbGl0LXNlY3Rpb24nKS5hdHRyKCdkYXRhLWxvY2F0aW9uLXRhcmdldCcsIGxvY2F0aW9uVGFyZ2V0KTtcbiAgICAkZm9ybUlkLmNsb3Nlc3QoJy5mb3JtLXNwbGl0LXNlY3Rpb24nKS5hdHRyKCdkYXRhLW1lbWJlcnNoaXAtdGFyZ2V0JywgbWVtYmVyc2hpcFRhcmdldC50b0xvd2VyQ2FzZSgpKTtcbiAgICAkZm9ybUlkLmNsb3Nlc3QoJy5mb3JtLXNwbGl0LXNlY3Rpb24nKS5hdHRyKCdkYXRhLXNhbG9uLWNoZWNrJywgc2Fsb25DaGVjayk7XG4gIH1cblxuICAvLyBjb2xsZWN0aW9uIGlucHV0cyBvbiBmb3JtIHN1Ym1pc3Npb25cbiAgJCgnYm9keScpLm9uKCdjbGljaycsICdpbnB1dFtpZF49XCJnZm9ybV9zdWJtaXRfYnV0dG9uX1wiXScsIGZ1bmN0aW9uIChlKSB7XG4gICAgLy8gR2V0IHRoZSBidXR0b24ncyBJRFxuICAgIHZhciBidXR0b25JZCA9ICQodGhpcykuYXR0cignaWQnKTtcbiAgICAvLyBFeHRyYWN0IHRoZSBudW1iZXIgZnJvbSB0aGUgSURcbiAgICB2YXIgZm9ybU51bWJlciA9IGJ1dHRvbklkLnJlcGxhY2UoJ2dmb3JtX3N1Ym1pdF9idXR0b25fJywgJycpO1xuICAgIG5oR2ZDb2xsZWN0SW5wdXRzKGZvcm1OdW1iZXIpO1xuICB9KTtcblxuICAvLyBzdGlsbCBub3Qgc3VyZSBzaG93IGZvcm1cbiAgJCgnYm9keScpLm9uKCdjbGljaycsICcjc3RpbGwtbm90LXN1cmUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcuZ2ZpZWxkX2Vycm9yJykucmVtb3ZlQ2xhc3MoJ2dmaWVsZF9lcnJvcicpOyAvLyBSZW1vdmUgZXJyb3IgY2xhc3MgZnJvbSBmaWVsZHNcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcudmFsaWRhdGlvbl9tZXNzYWdlJykuaGlkZSgpOyAvLyBIaWRlIHZhbGlkYXRpb24gbWVzc2FnZXNcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcudmFsaWRhdGlvbl9lcnJvcicpLmhpZGUoKTsgLy8gSGlkZSB0aGUgZm9ybS13aWRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuICAgICQo
108dGhpcykuY2xvc2VzdCgnLmNvbnRhY3RfZm9ybScpLmZpbmQoJy5nZm9ybV92YWxpZGF0aW9uX2Vycm9ycycpLmhpZGUoKTsgLy8gSGlkZSB0aGUgZm9ybS13aWRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuXG4gICAgJCh0aGlzKS5jbG9zZXN0KCcuZm9ybS1zcGxpdC1zZWN0aW9uJykuZmluZCgnLmNvbnRhY3RfZm9ybS1ub3Qtc3VyZScpLnNob3coKTtcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5oaWRlKCk7XG4gIH0pO1xuXG4gIC8vIHN0aWxsIG5vdCBzdXJlIGhpZGUgZm9ybVxuICAkKCdib2R5Jykub24oJ2NsaWNrJywgJyNzdGlsbC1ub3Qtc3VyZS1vZmYnLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcuZ2ZpZWxkX2Vycm9yJykucmVtb3ZlQ2xhc3MoJ2dmaWVsZF9lcnJvcicpOyAvLyBSZW1vdmUgZXJyb3IgY2xhc3MgZnJvbSBmaWVsZHNcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcudmFsaWRhdGlvbl9tZXNzYWdlJykuaGlkZSgpOyAvLyBIaWRlIHZhbGlkYXRpb24gbWVzc2FnZXNcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcudmFsaWRhdGlvbl9lcnJvcicpLmhpZGUoKTsgLy8gSGlkZSB0aGUgZm9ybS13aWRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuICAgICQodGhpcykuY2xvc2VzdCgnLmNvbnRhY3RfZm9ybScpLmZpbmQoJy5nZm9ybV92YWxpZGF0aW9uX2Vycm9ycycpLmhpZGUoKTsgLy8gSGlkZSB0aGUgZm9ybS13aWRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuXG4gICAgJCh0aGlzKS5jbG9zZXN0KCcuZm9ybS1zcGxpdC1zZWN0aW9uJykuZmluZCgnLmNvbnRhY3RfZm9ybScpLnNob3coKTtcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5mb3JtLXNwbGl0LXNlY3Rpb24nKS5maW5kKCcuY29udGFjdF9mb3JtLW5vdC1zdXJlJykuaGlkZSgpO1xuICAgIC8vY2xvc2VzdCBjb250YWN0X2Zvcm0gd2l0aG91dCBjbGFzcyAuY29udGFjdF9mb3JtLW5vdC1zdXJlXG4gIH0pO1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBkeW5hbWljIGZvcm0gZGF0YVxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gQmluZCBjbGljayBldmVudCB0byAuZ2ZpZWxkLWNob2ljZS1pbnB1dCBhbmQgLmdjaG9pY2UgZWxlbWVudHNcbiAgJCgnLmdmaWVsZC1jaG9pY2UtaW5wdXQsIC5nY2hvaWNlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IGZvcm0tc3BsaXQtc2VjdGlvbiBwYXJlbnRcbiAgICB2YXIgc2VjdGlvbiA9ICQodGhpcykuY2xvc2VzdCgnLmZvcm0tc3BsaXQtc2VjdGlvbicpO1xuICAgIG5oRm9ybUFjdGl2ZUlucHV0cyhzZWN0aW9uKTtcbiAgfSk7XG4gIGZ1bmN0aW9uIG5oRm9ybUFjdGl2ZUlucHV0cyhzZWN0aW9uKSB7XG4gICAgLy8gZmluZCB0aGUgY2hpbGQgaW5wdXQgb2YgbmgtcmFkaW8tbWVtYmVyc2hpcCBhbmQgbmgtcmFkaW8tbG9jYXRpb24gdGhhdCBhcmUgY2hlY2tlZCB3aXRoaW4gdGhlIHNlY3Rpb25cbiAgICB2YXIgbWVtYmVyc2hpcENoZWNrZWQgPSBzZWN0aW9uLmZpbmQoJy5uaC1yYWRpby1tZW1iZXJzaGlwIC5nZmllbGQtY2hvaWNlLWlucHV0OmNoZWNrZWQnKS52YWwoKTtcbiAgICB2YXIgbG9jYXRpb25DaGVja2VkID0gc2VjdGlvbi5maW5kKCcubmgtcmFkaW8tbG9jYXRpb24gLmdmaWVsZC1jaG9pY2UtaW5wdXQ6Y2hlY2tlZCcpLnZhbCgpO1xuXG4gICAgLy8gY29uc29sZS5sb2cobWVtYmVyc2hpcENoZWNrZWQsIGxvY2F0aW9uQ2hlY2tlZCk7XG5cbiAgICAvLyBTY29wZSB0byB0aGUgc2VjdGlvbiB3aXRoIGNsYXNzICdmb3JtLXNwbGl0LXNlY3Rpb24nXG4gICAgc2VjdGlvbi5maW5kKCcuZm9ybV9faW1nJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoJCh0aGlzKS5kYXRhKCdtZW1iZXJzaGlwJykgPT0gbWVtYmVyc2hpcENoZWNrZWQgJiYgJCh0aGlzKS5kYXRhKCdsb2NhdGlvbicpID09IGxvY2F0aW9uQ2hlY2tlZCB8fCAkKHRoaXMpLmRhdGEoJ21lbWJlcnNoaXAnKSA9PSAnYW55JyAmJiAkKHRoaXMpLmRhdGEoJ2xvY2F0aW9uJykgPT0gbG9jYXRpb25DaGVja2VkKSB7XG4gICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpLmFkZENsYXNzKCdhY3RpdmUnKTtcblxuICAgICAgICAvLyBhbmltYXRlIHNlY3Rpb24gaGVpZ2h0IG9uIG1vYmlsZVxuICAgICAgICB2Y
108XIgdmlld3BvcnRXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICB2YXIgJHNlY3Rpb25UZXh0ID0gc2VjdGlvbi5maW5kKCcuZm9ybS1zcGxpdC1zZWN0aW9uX190ZXh0Jyk7XG4gICAgICAgIGlmICh2aWV3cG9ydFdpZHRoIDwgNzY4KSB7XG4gICAgICAgICAgc2VjdGlvbi5maW5kKCcuZm9ybS1zcGxpdC1zZWN0aW9uX19pbWFnZXMnKS5hZGRDbGFzcygnYWN0aXZlJykuYW5pbWF0ZSh7XG4gICAgICAgICAgICBoZWlnaHQ6ICcxNzAnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld3BvcnRXaWR0aCA8IDEwMjQpIHtcbiAgICAgICAgICBzZWN0aW9uLmZpbmQoJy5mb3JtLXNwbGl0LXNlY3Rpb25fX2ltYWdlcycpLmFkZENsYXNzKCdhY3RpdmUnKS5hbmltYXRlKHtcbiAgICAgICAgICAgIGhlaWdodDogJzIyMCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoISRzZWN0aW9uVGV4dC5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgIHNlY3Rpb24uZmluZCgnLmZvcm0tc3BsaXQtc2VjdGlvbl9fdGV4dCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICB2YXIgdGFsbGVzdEhlaWdodCA9IDA7XG5cbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGFsbGVzdCBwLnNlbGVjdGlvbl90ZXh0XG4gICAgICAgICAgICAgICR0aGlzLmZpbmQoJ3Auc2VsZWN0aW9uX3RleHQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2Y
108XIgdGV4dEhlaWdodCA9ICQodGhpcykuaGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRIZWlnaHQgPiB0YWxsZXN0SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICB0YWxsZXN0SGVpZ2h0ID0gdGV4dEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAkdGhpcy5jc3MoJ2hlaWdodCcsICcwJyk7IC8vIFJlc2V0IHRvIG9yaWdpbmFsIGhlaWdodCBvZiAwXG5cbiAgICAgICAgICAgICAgJHRoaXMuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0YWxsZXN0SGVpZ2h0XG4gICAgICAgICAgICAgIH0sIDQwMCk7IC8vIEFkanVzdCB0aGUgZHVyYXRpb24gYXMgbmVlZGVkXG4gICAgICAgICAgICAgICR0aGlzLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghJCh0aGlzKS5oYXNDbGFzcygnaGlkZGVuJykpIHtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnaGlkZGVuJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNlY3Rpb24uZmluZCgnLnNlbGVjdGlvbl90ZXh0JykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoJCh0aGlzKS5kYXRhKCdtZW1iZXJzaGlwJykgPT0gbWVtYmVyc2hpcENoZWNrZWQgJiYgJCh0aGlzKS5kYXRhKCdsb2NhdGlvbicpID09IGxvY2F0aW9uQ2hlY2tlZCkge1xuICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRGVib3VuY2UgZnVuY3Rpb25cbiAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCkge1xuICAgIHZhciB0aW1lb3V0O1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
108XIgX3RoaXMgPSB0aGlzO1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBmdW5jLmFwcGx5KF90aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgdGFsbGVzdCBoZWlnaHQgYW5kIHJlYXBwbHkgdGhlIGZ1bmN0aW9uIG9uIHdpbmRvdyByZXNpemVcbiAgZnVuY3Rpb24gdXBkYXRlVGFsbGVzdEhlaWdodCgpIHtcbiAgICB2YXIgdmlld3BvcnRXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgIGlmICh2aWV3cG9ydFdpZHRoIDwgMTAyNCkge1xuICAgICAgLy8gYmVjb21lIG1lbWJlclxuICAgICAgJCgnLmR5bmFtaWMtZW5hYmxlZCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuX19iZWNvbWVtZW1iZXInKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKCQodGhpcykuZmluZCgnLmZvcm0tc3BsaXQtc2VjdGlvbl9faW1hZ2VzJykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5mb3JtLXNwbGl0LXNlY3Rpb25fX2ltYWdlcy5hY3RpdmUnKS5jc3MoJ2hlaWdodCcsICcxNzBweCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5mb3JtLXNwbGl0LXNlY3Rpb25fX2ltYWdlcycpLmNzcygnaGVpZ2h0JywgJzAnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRhbGxlc3RIZWlnaHQgPSAwO1xuICAgICAgICAgICQodGhpcykuZmluZCgncC5zZWxlY3Rpb25fdGV4dCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRleHRIZWlnaHQgPSAkKHRoaXMpLmhlaWdodCgpO1xuICAgICAgICAgICAgaWYgKHRleHRIZWlnaHQgPiB0YWxsZXN0SGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHRhbGxlc3RIZWlnaHQgPSB0ZXh0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciB0ZXh0Q29udGFpbmVyID0gJCh0aGlzKS5maW5kKCcuZm9ybS1zcGxpdC1zZWN0aW9uX190ZXh0Jyk7XG4gICAgICAgICAgaWYgKHRleHRDb250YWluZXIuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICAgICAgICB0ZXh0Q29udGFpbmVyLmFuaW1hdGUoe1xuICAgICAgICAgICAgICBoZWlnaHQ6IHRhbGxlc3RIZWlnaHRcbiAgICAgICAgICAgIH0sIDQwMCk7IC8vIEFuaW1hdGUgdG8gdGhlIHRhbGxlc3QgaGVpZ2h0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgkKHRoaXMpLmZpbmQoJy5fX2J1aWxkbWVtYmVyc2hpcCcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuX19idWlsZG1lbWJlcnNoaXAnKS5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnLl9fYnVpbGRtZW1iZXJzaGlwJykuY3NzKCdoZWlnaHQnLCAnYXV0bycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5fX2J1aWxkbWVtYmVyc2hpcCcpLmNzcygnaGVpZ2h0JywgJzAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodmlld3BvcnRXaWR0aCA+IDEwMjQpIHtcbiAgICAgICQoJy5keW5hbWljLWVuYWJsZWQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQodGhpcykuZmluZCgnLl9fYmVjb21lbWVtYmVyJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICQodGhpcykuZmluZCgnLmZvcm0tc3BsaXQtc2VjdGlvbl9faW1hZ2VzJykuY3NzKCdoZWlnaHQnLCAnYXV0bycpO1xuICAgICAgICAgICQodGhpcykuZmluZCgnLmZvcm0tc3BsaXQtc2VjdGlvbl9fdGV4dCcpLmNzcygnaGVpZ2h0JywgJ2F1dG8nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuX19idWlsZG1lbWJlcnNoaXAnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgJCh0aGlzKS5maW5kKCcuX19idWlsZG1lbWJlcnNoaXAnKS5jc3MoJ2hlaWdodCcsICdhdXRvJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEJpbmQgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB0byB3aW5kb3cgcmVzaXplXG4gICQod2luZG93KS5yZXNpemUoZGVib3VuY2UodXBkYXRlVGFsbGVzdEhlaWdodCwgMjAwKSk7XG4gIGZ1bmN0aW9uIGVxdWFsaXplSGVhZGVySGVpZ2h0cygpIHtcbiAgICB2YXIgJGhlYWRlcnMgPSAkKCcuY29tcGFyaXNvbi1jaGlsZC1oZWFkZXInKTtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gMDtcbiAgICB2YXIgdGFsbGVzdEhlYWRlciA9IG51bGw7XG5cbiAgICAvLyBSZXNldCBoZWlnaHRzIGFuZCBsb2cgaW5pdGlhbCBzdGF0ZVxuICAgICRoZWFkZXJzLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAkKHRoaXMpLmNzcygnaGVpZ2h0JywgJ2F1dG8nKTtcbiAgICAgIHZhciBjdXJyZW50SGVpZ2h0ID0gJCh0aGlzKS5vdXRlckhlaWdodCgpO1xuICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgbWF4SGVpZ2h0ID0gY3VycmVudEhlaWdodDtcbiAgICAgICAgdGFsbGVzdEhlYWRlciA9ICQodGhpcyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgYWxsIGhlYWRlcnMgdG8gdGhlIGhlaWdodCBvZiB0aGUgdGFsbGVzdCBoZWFkZXJcbiAgICAkaGVhZGVycy5oZWlnaHQobWF4SGVpZ2h0KTtcbiAgfVxuICAvLyBSdW4gYWZ0ZXIgYSBzaG9ydCBkZWxheSB0byBlbnN1cmUgY29udGVudCBpcyBsb2FkZWRcbiAgc2V0VGltZW91dChlcXVhbGl6ZUhlYWRlckhlaWdodHMsIDEwMCk7XG5cbiAgLy8gUnVuIG9uIHdpbmRvdyByZXNpemUsIGJ1dCB3YWl0IHVudGlsIHJlc2l6ZSBpcyBmaW5pc2hlZFxuICB2YXIgcmVzaXplVGltZXI7XG4gICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dChyZXNpemVUaW1lcik7XG4gICAgcmVzaXplVGltZXIgPSBzZXRUaW
1081lb3V0KGVxdWFsaXplSGVhZGVySGVpZ2h0cywgMjUwKTtcbiAgfSk7XG5cbiAgLy8gSWYgeW91J3JlIHVzaW5nIGFueSBpbWFnZSBsYXp5LWxvYWRpbmcsIHJ1biBhZnRlciBpbWFnZXMgbG9hZFxuICAvLyAkKCdpbWcnKS5vbignbG9hZCcsIGVxdWFsaXplSGVhZGVySGVpZ2h0cyk7XG59KTtcblxuLy8gQ3JlYXRlIGlmcmFtZXMgYWZ0ZXIgcGFnZSBsb2FkXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICB2YXIgcGxhY2Vob2xkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnZpZGVvLWVtYmVkLXBsYWNlaG9sZGVyJyk7XG4gIHBsYWNlaG9sZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwbGFjZWhvbGRlcikge1xuICAgIHZhciBfaWZyYW1lJGNsYXNzTGlzdDtcbiAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAvLyBJbml0aWFsbHkgc2V0IG9wYWNpdHkgdG8gMFxuICAgIC8vIGlmcmFtZS5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgIC8vIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gJ29wYWNpdHkgMXMgZWFzZS1pbi1vdXQnO1xuXG4gICAgLy8gU2V0IHRoZSBzcmMgYXR0cmlidXRlXG4gICAgaWZyYW1lLnNyYyA9IHBsYWNlaG9sZGVyLmRhdGFzZXQuc3JjO1xuXG4gICAgLy8gU2V0IGFkZGl0aW9uYWwgYXR0cmlidXRlc1xuICAgIHZhciBhdHRyaWJ1dGVzID0gcGxhY2Vob2xkZXIuZGF0YXNldC5hdHRyaWJ1dGVzLnNwbGl0KCcgJyk7XG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICB2Y
108XIgX2F0dHIkc3BsaXQgPSBhdHRyLnNwbGl0KCc9JyksXG4gICAgICAgIF9hdHRyJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF9hdHRyJHNwbGl0LCAyKSxcbiAgICAgICAga2V5ID0gX2F0dHIkc3BsaXQyWzBdLFxuICAgICAgICB2YWx1ZSA9IF9hdHRyJHNwbGl0MlsxXTtcbiAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSB8fCAnJyk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgY2xhc3Nlc1xuICAgIHZhciBjbGFzc2VzID0gcGxhY2Vob2xkZXIuZGF0YXNldC5jbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgKF9pZnJhbWUkY2xhc3NMaXN0ID0gaWZyYW1lLmNsYXNzTGlzdCkuYWRkLmFwcGx5KF9pZnJhbWUkY2xhc3NMaXN0LCBfdG9Db25zdW1hYmxlQXJyYXkoY2xhc3NlcykpO1xuXG4gICAgLy8gQWRkIGxvYWQgZXZlbnQgbGlzdGVuZXJcbiAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEZhZGUgaW4gdGhlIGlmcmFtZVxuICAgICAgLy8gaWZyYW1lLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggaWZyYW1lXG4gICAgcGxhY2Vob2xkZXIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaWZyYW1lLCBwbGFjZWhvbGRlcik7XG4gIH0pO1xufSk7XG5cbi8vIEVtYWlsIHBvcHVwIGFuZCB0cmFja2luZyBvcHQtaW4gaGFuZGxpbmdcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIC8vIENoZWNrIGlmIHRyYWNraW5nIG9wdC1pbiBkaXYgZXhpc3RzIG9uIHBhZ2UgbG9hZCBhbmQgaWYgY29va2llIGV4aXN0c1xuICAgIHZhciBlbWFpbFBvcHVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcHVwJyk7XG4gICAgaWYgKGVtYWlsUG9wdXAgJiYgIWNoZWNrQ29va2llKCdlbWFpbC1wb3B1cC1jbG9zZWQnKSkge1xuICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGlfdHJhY2tpbmdfb3B0X2luX2RpdicpKSB7XG4gICAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgncGktaW5hY3RpdmUnKTtcbiAgICAgIH1cbiAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgfVxuICB9LCAyMDAwKTtcbn0pO1xuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gIHZhciB0cmFja2luZ0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaV90cmFja2luZ19vcHRfaW5fZGl2Jyk7XG4gIGlmICh0cmFja2luZ0Rpdikge1xuICAgIC8vIENyZWF0ZSBhIE11dGF0aW9uT2JzZXJ2ZXIgdG8gd2F0Y2ggZm9yIHN0eWxlIGNoYW5nZXNcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHtcbiAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRpdiBpcyBub3cgaGlkZGVuXG4gICAgICAgICAgaWYgKHRyYWNraW5nRGl2LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgICAgdmFyIGVtYWlsUG9wdXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtcG9wdXAnKTtcbiAgICAgICAgICAgIGlmIChlbWFpbFBvcHVwKSB7XG4gICAgICAgICAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgncGktaW5hY3RpdmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIG9ic2VydmVyIHNpbmNlIHdlIG5vIGxvbmdlciBuZWVkIHRvIH
108dhdGNoXG4gICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IG9ic2VydmluZyB0aGUgdHJhY2tpbmcgZGl2IGZvciBzdHlsZSBjaGFuZ2VzXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0cmFja2luZ0Rpdiwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZSddXG4gICAgfSk7XG4gIH1cbn0sIDEwMDApO1xuXG4vLyBFbWFpbCBwb3B1cCBjbG9zZSBidXR0b25cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbWFpbFBvcHVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcHVwJyk7XG4gIGlmIChlbWFpbFBvcHVwKSB7XG4gICAgdmFyIGNsb3NlQnV0dG9uID0gZW1haWxQb3B1cC5xdWVyeVNlbGVjdG9yKCcuZW1haWwtcG9wdXBfX2Nsb3NlJyk7XG4gICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBlbWFpbFBvcHVwLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRlZCcpO1xuXG4gICAgICAvLyBDcmVhdGUgY29va2llIHRoYXQgZXhwaXJlcyBpbiAzMCBkYXlzXG4gICAgICBjcmVhdGVDb29raWUoJ2VtYWlsLXBvcHVwLWNsb3NlZCcsICd0cnVlJywgMzApO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcbiAgfVxufSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/scripts.js\n");
109
110/***/ }),
111
112/***/ "./src/js/utils.js":
113/*!*************************!*\
114  !*** ./src/js/utils.js ***!
115  \*************************/
116/*! exports provided: groupEventListener, getPreviousSibling, classChain, isInViewport, isOutOfViewport */
117/***/ (function(module, __webpack_exports__, __webpack_require__) {
118
119"use strict";
120eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"groupEventListener\", function() { return groupEventListener; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPreviousSibling\", function() { return getPreviousSibling; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classChain\", function() { return classChain; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isInViewport\", function() { return isInViewport; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isOutOfViewport\", function() { return isOutOfViewport; });\nfunction groupEventListener(event, selector, callback) {\n  for (var i = 0; i < selector.length; i++) {\n    selector[i].addEventListener(event, callback);\n  }\n}\nfunction getPreviousSibling(elem, selector) {\n  // Get the next sibling element\n  var sibling = elem.previousElementSibling;\n\n  // If there's no selector, return the first sibling\n  if (!selector) return sibling;\n\n  // If the sibling matches our selector, use it\n  // If not, jump to the next sibling and continue the loop\n  while (sibling) {\n    if (sibling.matches(selector)) return sibling;\n    sibling = sibling.previousElementSibling;\n  }\n}\n;\nfunction classChain(elt) {\n  var list = elt.classList;\n  return {\n    toggle: function toggle(c) {\n      list.toggle(c);\n      return this;\n    },\n    add: function add(c) {\n      list.add(c);\n      return this;\n    },\n    remove: function remove(c) {\n      list.remove(c);\n      return this;\n    }\n  };\n}\nfunction isInViewport(elem) {\n  var bounding = elem.getBoundingClientRect();\n  return bounding.top >= 0 && bounding.left >= 0 && bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) && bounding.right <= (window.innerWidth || document.documentElement.clientWidth);\n}\n;\nfunction isOutOfViewport(elem) {\n  // Get element's bounding\n  var bounding = elem.getBoundingClientRect();\n\n  // Check if it's out of the viewport on each side\n  var out = {};\n  out.top = bounding.top < 0;\n  out.left = bounding.left < 0;\n  out.bottom = bounding.bottom > (window.innerHeight || document.documentElement.clientHeight);\n  out.right = bounding.right > (window.innerWidth || document.documentElement.clientWidth);\n  out.any = out.top || out.left || out.bottom || out.right;\n  out.all = out.top && out.left && out.bottom && out.right;\n  return out;\n}\n;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdXRpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvanMvdXRpbHMuanM/MzJlMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ3JvdXBFdmVudExpc3RlbmVyKGV2ZW50LCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rvci5sZW5ndGg7IGkrKykge1xuICAgIHNlbGVjdG9yW2ldLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFByZXZpb3VzU2libGluZyhlbGVtLCBzZWxlY3Rvcikge1xuICAvLyBHZXQgdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gIHZhciBzaWJsaW5nID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gIC8vIElmIHRoZXJlJ3Mgbm8gc2VsZWN0b3IsIHJldHVybiB0aGUgZmlyc3Qgc2libGluZ1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gc2libGluZztcblxuICAvLyBJZiB0aGUgc2libGluZyBtYXRjaGVzIG91ciBzZWxlY3RvciwgdXNlIGl0XG4gIC8vIElmIG5vdCwganVtcCB0byB0aGUgbmV4dCBzaWJsaW5nIGFuZCBjb250aW51ZSB0aGUgbG9vcFxuICB3aGlsZSAoc2libGluZykge1xuICAgIGlmIChzaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSByZXR1cm4gc2libGluZztcbiAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICB9XG59XG47XG5leHBvcnQgZnVuY3Rpb24gY2xhc3NDaGFpbihlbHQpIHtcbiAgdmFyIGxpc3QgPSBlbHQuY2xhc3NMaXN0O1xuICByZXR1cm4ge1xuICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKGMpIHtcbiAgICAgIGxpc3QudG9nZ2xlKGMpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBhZGQ6IGZ1bmN0aW9uIGFkZChjKSB7XG4gICAgICBsaXN0LmFkZChjKTtcbiAgICAgIHJldHVybi
120B0aGlzO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoYykge1xuICAgICAgbGlzdC5yZW1vdmUoYyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJblZpZXdwb3J0KGVsZW0pIHtcbiAgdmFyIGJvdW5kaW5nID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIGJvdW5kaW5nLnRvcCA+PSAwICYmIGJvdW5kaW5nLmxlZnQgPj0gMCAmJiBib3VuZGluZy5ib3R0b20gPD0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSAmJiBib3VuZGluZy5yaWdodCA8PSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtcbn1cbjtcbmV4cG9ydCBmdW5jdGlvbiBpc091dE9mVmlld3BvcnQoZWxlbSkge1xuICAvLyBHZXQgZWxlbWVudCdzIGJvdW5kaW5nXG4gIHZhciBib3VuZGluZyA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBvdXQgb2YgdGhlIHZpZXdwb3J0IG9uIGVhY2ggc2lkZVxuICB2YXIgb3V0ID0ge307XG4gIG91dC50b3AgPSBib3VuZGluZy50b3AgPCAwO1xuICBvdXQubGVmdCA9IGJvdW5kaW5nLmxlZnQgPCAwO1xuICBvdXQuYm90dG9tID0gYm91bmRpbmcuYm90dG9tID4gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcbiAgb3V0LnJpZ2h0ID0gYm91bmRpbmcucmlnaHQgPiAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtcbiAgb3V0LmFueSA9IG91dC50b3AgfHwgb3V0LmxlZnQgfHwgb3V0LmJvdHRvbSB8fCBvdXQucmlnaHQ7XG4gIG91dC5hbGwgPSBvdXQudG9wICYmIG91dC5sZWZ0ICYmIG91dC5ib3R0b20gJiYgb3V0LnJpZ2h0O1xuICByZXR1cm4gb3V0O1xufVxuOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/utils.js\n"
vendor: 26 bytes, lines 120-124
120);
121
122/***/ })
123
124/******/ });

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.