← back to Dw Theme Hamburger

assets/grid.js

1037 lines

/*
 * ATTENTION: An "eval-source-map" devtool has been used.
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./node_modules/@pixelunion/age-gate/dist/index.es.js":
/*!************************************************************!*\
  !*** ./node_modules/@pixelunion/age-gate/dist/index.es.js ***!
  \************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"PageAgeGate\": () => (/* binding */ PageAgeGate),\n/* harmony export */   \"SiteAgeGate\": () => (/* binding */ SiteAgeGate)\n/* harmony export */ });\n\n/*!\n * @pixelunion/age-gate v1.1.2\n * (c) 2025 Pixel Union\n */\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}\n\nvar scrollLock = __webpack_require__(/*! scroll-lock */ \"./node_modules/scroll-lock/dist/scroll-lock.js\");\nvar isbot = __webpack_require__(/*! isbot */ \"./node_modules/isbot/index.js\");\nfunction getAge(birthdate) {\n  var today = new Date();\n  var age = today.getFullYear() - birthdate.getFullYear();\n  var m = today.getMonth() - birthdate.getMonth();\n  if (m < 0 || m === 0 && today.getDate() < birthdate.getDate()) {\n    age--;\n  }\n  return age;\n}\nvar SiteAgeGate = /*#__PURE__*/function () {\n  function SiteAgeGate(el) {\n    _classCallCheck(this, SiteAgeGate);\n    this._el = el;\n    this._ageGateForm = el.querySelector('[data-age-gate]');\n    this._ageGateErrorEl = this._ageGateForm.querySelector('[data-age-gate-error]');\n    this._requiredAge = this._ageGateForm.dataset.requiredAge;\n    this._el.addEventListener('age-gate:open', this._open.bind(this));\n    this._el.addEventListener('age-gate:close', this._close.bind(this));\n    this._ageGateForm.addEventListener('submit', this._onFormSubmit.bind(this));\n    if (isbot(navigator.userAgent)) {\n      this._close();\n    } else if (this._el.style.display === '') {\n      this._open();\n    }\n  }\n  _createClass(SiteAgeGate, [{\n    key: \"_open\",\n    value: function _open() {\n      scrollLock.disablePageScroll();\n      this._el.style.display = '';\n    }\n  }, {\n    key: \"_close\",\n    value: function _close() {\n      scrollLock.enablePageScroll();\n      this._el.style.display = 'none';\n    }\n  }, {\n    key: \"_onFormSubmit\",\n    value: function _onFormSubmit(event) {\n      event.preventDefault();\n      event.stopPropagation();\n      var data = new FormData(event.target);\n      var day = data.get('day');\n      var month = data.get('month');\n      var year = data.get('year');\n      if (day === '' || month === '' || year === '') return;\n      var age = getAge(new Date(year, month, day));\n      if (age >= this._requiredAge) {\n        this._close();\n        sessionStorage.setItem('age-gate', age);\n      } else {\n        this._ageGateErrorEl.style.display = '';\n      }\n    }\n  }]);\n  return SiteAgeGate;\n}();\n\nvar PageAgeGate = /*#__PURE__*/function () {\n  function PageAgeGate() {\n    _classCallCheck(this, PageAgeGate);\n    this._ageGateEl = document.getElementById('age-gate-page');\n  }\n  _createClass(PageAgeGate, [{\n    key: \"onSectionLoad\",\n    value: function onSectionLoad() {\n      var openEvent = new CustomEvent('age-gate:open');\n      if (this._ageGateEl) {\n        this._ageGateEl.dispatchEvent(openEvent);\n      }\n    }\n  }, {\n    key: \"onSectionSelect\",\n    value: function onSectionSelect() {\n      var openEvent = new CustomEvent('age-gate:open');\n      if (this._ageGateEl) {\n        this._ageGateEl.dispatchEvent(openEvent);\n      }\n    }\n  }, {\n    key: \"onSectionDeselect\",\n    value: function onSectionDeselect() {\n      var closeEvent = new CustomEvent('age-gate:close');\n      if (this._ageGateEl) {\n        this._ageGateEl.dispatchEvent(closeEvent);\n      }\n    }\n  }]);\n  return PageAgeGate;\n}();\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYWdlLWdhdGUvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYWdlLWdhdGUvZGlzdC9pbmRleC5lcy5qcz9hYWY3Il0sInNvdXJjZXNDb250ZW50IjpbIlxuLyohXG4gKiBAcGl4ZWx1bmlvbi9hZ2UtZ2F0ZSB2MS4xLjJcbiAqIChjKSAyMDI1IFBpeGVsIFVuaW9uXG4gKi9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxudmFyIHNjcm9sbExvY2sgPSByZXF1aXJlKCdzY3JvbGwtbG9jaycpO1xudmFyIGlzYm90ID0gcmVxdWlyZSgnaXNib3QnKTtcbmZ1bmN0aW9uIGdldEFnZShiaXJ0aGRhdGUpIHtcbiAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgdmFyIGFnZSA9IHRvZGF5LmdldEZ1bGxZZWFyKCkgLSBiaXJ0aGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIG0gPSB0b2RheS5nZXRNb250aCgpIC0gYmlydGhkYXRlLmdldE1vbnRoKCk7XG4gIGlmIChtIDwgMCB8fCBtID09PSAwICYmIHRvZGF5LmdldERhdGUoKSA8IGJpcnRoZGF0ZS5nZXREYXRlKCkpIHtcbiAgICBhZ2UtLTtcbiAgfVxuICByZXR1cm4gYWdlO1xufVxudmFyIFNpdGVBZ2VHYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2l0ZUFnZUdhdGUoZWwpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2l0ZUFnZUdhdGUpO1xuICAgIHRoaXMuX2VsID0gZWw7XG4gICAgdGhpcy5fYWdlR2F0ZUZvcm0gPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hZ2UtZ2F0ZV0nKTtcbiAgICB0aGlzLl9hZ2VHYXRlRXJyb3JFbCA9IHRoaXMuX2FnZUdhdGVGb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFnZS1nYXRlLWVycm9yXScpO1xuICAgIHRoaXMuX3JlcXVpcmVkQWdlID0gdGhpcy5fYWdlR2F0ZUZvcm0uZGF0YXNldC5yZXF1aXJlZEFnZTtcbiAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdhZ2UtZ2F0ZTpvcGVuJywgdGhpcy5fb3Blbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdhZ2UtZ2F0ZTpjbG9zZScsIHRoaXMuX2Nsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2FnZUdhdGVGb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuX29uRm9ybVN1Ym1pdC5iaW5kKHRoaXMpKTtcbiAgICBpZiAoaXNib3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9lbC5zdHlsZS5kaXNwbGF5ID09PSAnJykge1xuICAgICAgdGhpcy5fb3BlbigpO1xuICAgIH1cbiAgfVxuICBfY3JlYXRlQ2xhc3MoU2l0ZUFnZUdhdGUsIFt7XG4gICAga2V5OiBcIl9vcGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vcGVuKCkge1xuICAgICAgc2Nyb2xsTG9jay5kaXNhYmxlUGFnZVNjcm9sbCgpO1xuICAgICAgdGhpcy5fZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2Nsb3NlKCkge1xuICAgICAgc2Nyb2xsTG9jay5lbmFibGVQYWdlU2Nyb2xsKCk7XG4gICAgICB0aGlzLl9lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25Gb3JtU3VibWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkZvcm1TdWJtaXQoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHZhciBkYXRhID0gbmV3IEZvcm1EYXRhKGV2ZW50LnRhcmdldCk7XG4gICAgICB2YXIgZGF5ID0gZGF0YS5nZXQoJ2RheScpO1xuICAgICAgdmFyIG1vbnRoID0gZGF0YS5nZXQoJ21vbnRoJyk7XG4gICAgICB2YXIgeWVhciA9IGRhdGEuZ2V0KCd5ZWFyJyk7XG4gICAgICBpZiAoZGF5ID09PSAnJyB8fCBtb250aCA9PT0gJycgfHwgeWVhciA9PT0gJycpIHJldHVybjtcbiAgICAgIHZhciBhZ2UgPSBnZXRBZ2UobmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkpO1xuICAgICAgaWYgKGFnZSA+PSB0aGlzLl9yZXF1aXJlZEFnZSkge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdhZ2UtZ2F0ZScsIGFnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTaXRlQWdlR2F0ZTtcbn0oKTtcblxudmFyIFBhZ2VBZ2VHYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGFnZUFnZUdhdGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhZ2VBZ2VHYXRlKTtcbiAgICB0aGlzLl9hZ2VHYXRlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlLWdhdGUtcGFnZScpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhQYWdlQWdlR2F0ZSwgW3tcbiAgICBrZXk6IFwib25TZWN0aW9uTG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblNlY3Rpb25Mb2FkKCkge1xuICAgICAgdmFyIG9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnYWdlLWdhdGU6b3BlbicpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChvcGVuRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25TZWxlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25TZWN0aW9uU2VsZWN0KCkge1xuICAgICAgdmFyIG9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnYWdlLWdhdGU6b3BlbicpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChvcGVuRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25EZXNlbGVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblNlY3Rpb25EZXNlbGVjdCgpIHtcbiAgICAgIHZhciBjbG9zZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdhZ2UtZ2F0ZTpjbG9zZScpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChjbG9zZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFBhZ2VBZ2VHYXRlO1xufSgpO1xuXG5leHBvcnQgeyBQYWdlQWdlR2F0ZSwgU2l0ZUFnZUdhdGUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/age-gate/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/animations/dist/animations.es.js":
/*!*******************************************************************!*\
  !*** ./node_modules/@pixelunion/animations/dist/animations.es.js ***!
  \*******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"Animation\": () => (/* binding */ Animation),\n/* harmony export */   \"AnimationsManager\": () => (/* binding */ AnimationsManager),\n/* harmony export */   \"animation\": () => (/* binding */ animation),\n/* harmony export */   \"transition\": () => (/* binding */ transition)\n/* harmony export */ });\n\n  /*!\n   * @pixelunion/animations v0.1.0\n   * (c) 2019 Pixel Union\n   * Released under the UNLICENSED license.\n  */\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(source, true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(source).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\n/**\n * Promisified version of window.requestAnimationFrame.\n * @returns {Promise} Promise will resolve when requestAnimationFrame callback is run.\n */\nfunction raf() {\n  return new Promise(function (resolve) {\n    window.requestAnimationFrame(resolve);\n  });\n}\n/**\n * Represents an HTML element with associate states\n */\n\n\nvar Animation =\n/*#__PURE__*/\nfunction () {\n  /**\n   * @param {Object} options\n   * @param {HTMLElement}  options.el Target element\n   * @param {String} [options.state=initial] Initial state. This is also the default state.\n   * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n   * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to\n   * update with change of state.\n   * @param {String} [options.endEvent=transitionend] Event to listen for at end of state change.\n   * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n   * next state change.\n   * @param {Function} [options.onStart] Callback to execute immediate after\n   * applying stateChangeAttribute.\n   */\n  function Animation(options) {\n    _classCallCheck(this, Animation);\n\n    this._el = options.el;\n    this.cancelRunning = null;\n    this._state = options.state || 'initial';\n    this.initialState = this._state;\n    this.stateAttribute = options.stateAttribute || 'data-animation-state';\n    this.stateChangeAttribute = options.stateChangeAttribute || 'data-animation';\n    this.endEvent = options.endEvent || 'transitionend';\n    this.hold = !!options.hold;\n\n    this.onStart = options.onStart || function () {\n      /* do nothing */\n    };\n\n    this.activeEventHandler = null;\n  }\n  /**\n   * Returns target element\n   *\n   * @return {HTMLElement} Target element\n   */\n\n\n  _createClass(Animation, [{\n    key: \"isState\",\n\n    /**\n     * Check if a state is active\n     * @param {String} state State to compare\n     *\n     * @return {Boolean}\n     */\n    value: function isState(state) {\n      return state === this._state;\n    }\n    /**\n     * Sequences a change to a new state.\n     * @param {String} state Target state\n     *\n     * @param {Boolean} options.force Switch to final state immediately\n     *\n     * @param {Function} options.onStart Callback to execute immediately after\n     * applying stateChangeAttribute for this state change only.\n     *\n     * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n     * next state change.\n     *\n     * @return {Promise} Resolves when endEvent triggered\n     */\n\n  }, {\n    key: \"animateTo\",\n    value: function animateTo(state) {\n      var _this = this;\n\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var from = this._el.dataset[this.stateAttribute] || this._state;\n      var to = state || this.initialState;\n      var force = options.force;\n      var hold = 'hold' in options ? options.hold : this.hold;\n      return new Promise(function (resolve) {\n        if (_this.cancelRunning) {\n          _this.cancelRunning();\n        }\n\n        if (from === to) {\n          // Removing this here fixes some lingering attributes. But why?\n          _this._el.removeAttribute(_this.stateChangeAttribute);\n\n          resolve(from, null);\n          return;\n        }\n\n        var running = true;\n\n        _this.cancelRunning = function () {\n          running = false;\n          resolve(null, null);\n        };\n\n        _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n        _this.activeEventHandler = null;\n\n        if (force) {\n          _this._el.setAttribute(_this.stateChangeAttribute, \"\".concat(from, \"=>\").concat(to));\n\n          _this.onStart({\n            el: _this._el,\n            from: from,\n            to: to\n          });\n\n          if (typeof options.onStart === 'function') {\n            options.onStart({\n              el: _this._el,\n              from: from,\n              to: to\n            });\n          }\n\n          _this._el.setAttribute(_this.stateAttribute, to);\n\n          _this._state = to;\n\n          if (!hold) {\n            _this._el.removeAttribute(_this.stateChangeAttribute);\n          }\n\n          resolve(to, null);\n          return;\n        }\n\n        raf().then(function () {\n          if (!running) throw new Error('cancelled');\n\n          _this._el.setAttribute(_this.stateChangeAttribute, \"\".concat(from, \"=>\").concat(to));\n\n          _this.onStart({\n            el: _this._el,\n            from: from,\n            to: to\n          });\n\n          if (typeof options.onStart === 'function') {\n            options.onStart({\n              el: _this._el,\n              from: from,\n              to: to\n            });\n          }\n\n          return raf();\n        }).then(function () {\n          if (!running) throw new Error('cancelled');\n\n          _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n          _this.activeEventHandler = function (e) {\n            // Ignore any events bubbling up\n            if (e.target !== _this._el || !running) return;\n\n            _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n            if (!hold) {\n              _this._el.removeAttribute(_this.stateChangeAttribute);\n            }\n\n            resolve(to, e);\n          };\n\n          _this._el.addEventListener(_this.endEvent, _this.activeEventHandler);\n\n          _this._el.setAttribute(_this.stateAttribute, to);\n\n          _this._state = to;\n        })[\"catch\"](function (error) {\n          // Only catch 'cancelled' errors.\n          if (error.message !== 'cancelled') throw error;\n        });\n      });\n    }\n    /**\n     * Remove any event listeners\n     */\n\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      this._el.removeEventListener(this.endEvent, this.activeEventHandler);\n\n      this.activeEventHandler = null;\n    }\n  }, {\n    key: \"el\",\n    get: function get() {\n      return this._el;\n    }\n    /**\n     * Returns current state\n     *\n     * @return {String} Current state\n     */\n\n  }, {\n    key: \"state\",\n    get: function get() {\n      return this._state;\n    }\n  }]);\n\n  return Animation;\n}();\n\n/**\n * Manage state changes for a set of elements\n */\n\nvar AnimationsManager =\n/*#__PURE__*/\nfunction () {\n  function AnimationsManager() {\n    _classCallCheck(this, AnimationsManager);\n\n    this.animations = new Map();\n  }\n  /**\n   * Add a new element and return an animation for that element. If element already has an associated animation, return that animation.\n   * @param {Object} options\n   * @param {HTMLElement}  options.el Target element\n   * @param {String} [options.state=initial] Initial state. This is also the default state.\n   * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n   * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to update with change of state.\n   * @param {String} [options.endEvent=transitionend] Event name to listen for at end of state change.\n   * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the next state change.\n   * @param {Function} [options.onStart] Callback to execute immediate after applying stateChangeAttribute.\n   *\n   * @return {Animation}\n   */\n\n\n  _createClass(AnimationsManager, [{\n    key: \"add\",\n    value: function add(options) {\n      if (this.animations.has(options.el)) return this.animations.get(options.el);\n      var animation = new Animation(options);\n      this.animations.set(options.el, animation);\n      return animation;\n    }\n    /**\n     * Remove a single animation\n     * @param {Animation} animation Animation to remove. Any event listeners will also be removed.\n     */\n\n  }, {\n    key: \"remove\",\n    value: function remove(animation) {\n      this.animations[\"delete\"](animation.el);\n      animation.unload();\n    }\n    /**\n     * Remove all animations, including all event listeners.\n     */\n\n  }, {\n    key: \"removeAll\",\n    value: function removeAll() {\n      this.animations.forEach(function (animation) {\n        return animation.unload();\n      });\n    }\n  }]);\n\n  return AnimationsManager;\n}();\n\nfunction animation(options) {\n  var setOptions = {\n    endEvent: 'animationend',\n    hold: true\n  };\n  return new Animation(_objectSpread2({\n    options: options\n  }, setOptions));\n}\n\nfunction transition(options) {\n  return new Animation(options);\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYW5pbWF0aW9ucy9kaXN0L2FuaW1hdGlvbnMuZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL2FuaW1hdGlvbnMvZGlzdC9hbmltYXRpb25zLmVzLmpzP2U5NTciXSwic291cmNlc0NvbnRlbnQiOlsiXG4gIC8qIVxuICAgKiBAcGl4ZWx1bmlvbi9hbmltYXRpb25zIHYwLjEuMFxuICAgKiAoYykgMjAxOSBQaXhlbCBVbmlvblxuICAgKiBSZWxlYXNlZCB1bmRlciB0aGUgVU5MSUNFTlNFRCBsaWNlbnNlLlxuICAqL1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKHNvdXJjZSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogUHJvbWlzaWZpZWQgdmVyc2lvbiBvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGNhbGxiYWNrIGlzIHJ1bi5cbiAqL1xuZnVuY3Rpb24gcmFmKCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUpO1xuICB9KTtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhbiBIVE1MIGVsZW1lbnQgd2l0aCBhc3NvY2lhdGUgc3RhdGVzXG4gKi9cblxuXG52YXIgQW5pbWF0aW9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9ICBvcHRpb25zLmVsIFRhcmdldCBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0ZT1pbml0aWFsXSBJbml0aWFsIHN0YXRlLiBUaGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0ZUF0dHJpYnV0ZT1kYXRhLXJldmVhbGVyXSBBdHRyaWJ1dGUgbmFtZSB0byB1cGRhdGUgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlQ2hhbmdlQXR0cmlidXRlPWRhdGEtcmV2ZWFsZXItdHJhbnNpdGlvbl0gQXR0cmlidXRlIG5hbWUgdG9cbiAgICogdXBkYXRlIHdpdGggY2hhbmdlIG9mIHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZW5kRXZlbnQ9dHJhbnNpdGlvbmVuZF0gRXZlbnQgdG8gbGlzdGVuIGZvciBhdCBlbmQgb2Ygc3RhdGUgY2hhbmdlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvbGQ9ZmFsc2VdIElmIHRydWUsIGNoYW5nZUF0dHJpYnV0ZSB3aWxsIG5vdCBiZSByZW1vdmVkIHVudGlsIHRoZVxuICAgKiBuZXh0IHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25TdGFydF0gQ2FsbGJhY2sgdG8gZXhlY3V0ZSBpbW1lZGlhdGUgYWZ0ZXJcbiAgICogYXBwbHlpbmcgc3RhdGVDaGFuZ2VBdHRyaWJ1dGUuXG4gICAqL1xuICBmdW5jdGlvbiBBbmltYXRpb24ob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRpb24pO1xuXG4gICAgdGhpcy5fZWwgPSBvcHRpb25zLmVsO1xuICAgIHRoaXMuY2FuY2VsUnVubmluZyA9IG51bGw7XG4gICAgdGhpcy5fc3RhdGUgPSBvcHRpb25zLnN0YXRlIHx8ICdpbml0aWFsJztcbiAgICB0aGlzLmluaXRpYWxTdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgIHRoaXMuc3RhdGVBdHRyaWJ1dGUgPSBvcHRpb25zLnN0YXRlQXR0cmlidXRlIHx8ICdkYXRhLWFuaW1hdGlvbi1zdGF0ZSc7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSA9IG9wdGlvbnMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUgfHwgJ2RhdGEtYW5pbWF0aW9uJztcbiAgICB0aGlzLmVuZEV2ZW50ID0gb3B0aW9ucy5lbmRFdmVudCB8fCAndHJhbnNpdGlvbmVuZCc7XG4gICAgdGhpcy5ob2xkID0gISFvcHRpb25zLmhvbGQ7XG5cbiAgICB0aGlzLm9uU3RhcnQgPSBvcHRpb25zLm9uU3RhcnQgfHwgZnVuY3Rpb24gKCkge1xuICAgICAgLyogZG8gbm90aGluZyAqL1xuICAgIH07XG5cbiAgICB0aGlzLmFjdGl2ZUV2ZW50SGFuZGxlciA9IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGFyZ2V0IGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9IFRhcmdldCBlbGVtZW50XG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKEFuaW1hdGlvbiwgW3tcbiAgICBrZXk6IFwiaXNTdGF0ZVwiLFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBzdGF0ZSBpcyBhY3RpdmVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUgU3RhdGUgdG8gY29tcGFyZVxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNTdGF0ZShzdGF0ZSkge1xuICAgICAgcmV0dXJuIHN0YXRlID09PSB0aGlzLl9zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VxdWVuY2VzIGEgY2hhbmdlIHRvIGEgbmV3IHN0YXRlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZSBUYXJnZXQgc3RhdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5mb3JjZSBTd2l0Y2ggdG8gZmluYWwgc3RhdGUgaW1tZWRpYXRlbHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMub25TdGFydCBDYWxsYmFjayB0byBleGVjdXRlIGltbWVkaWF0ZWx5IGFmdGVyXG4gICAgICogYXBwbHlpbmcgc3RhdGVDaGFuZ2VBdHRyaWJ1dGUgZm9yIHRoaXMgc3RhdGUgY2hhbmdlIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvbGQ9ZmFsc2VdIElmIHRydWUsIGNoYW5nZUF0dHJpYnV0ZSB3aWxsIG5vdCBiZSByZW1vdmVkIHVudGlsIHRoZVxuICAgICAqIG5leHQgc3RhdGUgY2hhbmdlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBlbmRFdmVudCB0cmlnZ2VyZWRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFuaW1hdGVUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhbmltYXRlVG8oc3RhdGUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBmcm9tID0gdGhpcy5fZWwuZGF0YXNldFt0aGlzLnN0YXRlQXR0cmlidXRlXSB8fCB0aGlzLl9zdGF0ZTtcbiAgICAgIHZhciB0byA9IHN0YXRlIHx8IHRoaXMuaW5pdGlhbFN0YXRlO1xuICAgICAgdmFyIGZvcmNlID0gb3B0aW9ucy5mb3JjZTtcbiAgICAgIHZhciBob2xkID0gJ2hvbGQnIGluIG9wdGlvbnMgPyBvcHRpb25zLmhvbGQgOiB0aGlzLmhvbGQ7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKF90aGlzLmNhbmNlbFJ1bm5pbmcpIHtcbiAgICAgICAgICBfdGhpcy5jYW5jZWxSdW5uaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICAvLyBSZW1vdmluZyB0aGlzIGhlcmUgZml4ZXMgc29tZSBsaW5nZXJpbmcgYXR0cmlidXRlcy4gQnV0IHdoeT9cbiAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlQXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlKTtcblxuICAgICAgICAgIHJlc29sdmUoZnJvbSwgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJ1bm5pbmcgPSB0cnVlO1xuXG4gICAgICAgIF90aGlzLmNhbmNlbFJ1bm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJlc29sdmUobnVsbCwgbnVsbCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3RoaXMuZW5kRXZlbnQsIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyID0gbnVsbDtcblxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICBfdGhpcy5fZWwuc2V0QXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlLCBcIlwiLmNvbmNhdChmcm9tLCBcIj0+XCIpLmNvbmNhdCh0bykpO1xuXG4gICAgICAgICAgX3RoaXMub25TdGFydCh7XG4gICAgICAgICAgICBlbDogX3RoaXMuX2VsLFxuICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgIHRvOiB0b1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uU3RhcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25TdGFydCh7XG4gICAgICAgICAgICAgIGVsOiBfdGhpcy5fZWwsXG4gICAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICAgIHRvOiB0b1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuX2VsLnNldEF0dHJpYnV0ZShfdGhpcy5zdGF0ZUF0dHJpYnV0ZSwgdG8pO1xuXG4gICAgICAgICAgX3RoaXMuX3N0YXRlID0gdG87XG5cbiAgICAgICAgICBpZiAoIWhvbGQpIHtcbiAgICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUodG8sIG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhZigpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghcnVubmluZykgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcblxuICAgICAgICAgIF90aGlzLl9lbC5zZXRBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUsIFwiXCIuY29uY2F0KGZyb20sIFwiPT5cIikuY29uY2F0KHRvKSk7XG5cbiAgICAgICAgICBfdGhpcy5vblN0YXJ0KHtcbiAgICAgICAgICAgIGVsOiBfdGhpcy5fZWwsXG4gICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgdG86IHRvXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25TdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3B0aW9ucy5vblN0YXJ0KHtcbiAgICAgICAgICAgICAgZWw6IF90aGlzLl9lbCxcbiAgICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgICAgdG86IHRvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmFmKCk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghcnVubmluZykgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcblxuICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKF90aGlzLmVuZEV2ZW50LCBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgICAgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBhbnkgZXZlbnRzIGJ1YmJsaW5nIHVwXG4gICAgICAgICAgICBpZiAoZS50YXJnZXQgIT09IF90aGlzLl9lbCB8fCAhcnVubmluZykgcmV0dXJuO1xuXG4gICAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihfdGhpcy5lbmRFdmVudCwgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICAgICAgaWYgKCFob2xkKSB7XG4gICAgICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHRvLCBlKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgX3RoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoX3RoaXMuZW5kRXZlbnQsIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgICBfdGhpcy5fZWwuc2V0QXR0cmlidXRlKF90aGlzLnN0YXRlQXR0cmlidXRlLCB0byk7XG5cbiAgICAgICAgICBfdGhpcy5fc3RhdGUgPSB0bztcbiAgICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBPbmx5IGNhdGNoICdjYW5jZWxsZWQnIGVycm9ycy5cbiAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSAhPT0gJ2NhbmNlbGxlZCcpIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYW55IGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5sb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5lbmRFdmVudCwgdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICB0aGlzLmFjdGl2ZUV2ZW50SGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY3VycmVudCBzdGF0ZVxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDdXJyZW50IHN0YXRlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdGF0ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmltYXRpb247XG59KCk7XG5cbi8qKlxuICogTWFuYWdlIHN0YXRlIGNoYW5nZXMgZm9yIGEgc2V0IG9mIGVsZW1lbnRzXG4gKi9cblxudmFyIEFuaW1hdGlvbnNNYW5hZ2VyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQW5pbWF0aW9uc01hbmFnZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuaW1hdGlvbnNNYW5hZ2VyKTtcblxuICAgIHRoaXMuYW5pbWF0aW9ucyA9IG5ldyBNYXAoKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IGVsZW1lbnQgYW5kIHJldHVybiBhbiBhbmltYXRpb24gZm9yIHRoYXQgZWxlbWVudC4gSWYgZWxlbWVudCBhbHJlYWR5IGhhcyBhbiBhc3NvY2lhdGVkIGFuaW1hdGlvbiwgcmV0dXJuIHRoYXQgYW5pbWF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSAgb3B0aW9ucy5lbCBUYXJnZXQgZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGU9aW5pdGlhbF0gSW5pdGlhbCBzdGF0ZS4gVGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGVBdHRyaWJ1dGU9ZGF0YS1yZXZlYWxlcl0gQXR0cmlidXRlIG5hbWUgdG8gdXBkYXRlIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZT1kYXRhLXJldmVhbGVyLXRyYW5zaXRpb25dIEF0dHJpYnV0ZSBuYW1lIHRvIHVwZGF0ZSB3aXRoIGNoYW5nZSBvZiBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmVuZEV2ZW50PXRyYW5zaXRpb25lbmRdIEV2ZW50IG5hbWUgdG8gbGlzdGVuIGZvciBhdCBlbmQgb2Ygc3RhdGUgY2hhbmdlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhvbGQ9ZmFsc2VdIElmIHRydWUsIGNoYW5nZUF0dHJpYnV0ZSB3aWxsIG5vdCBiZSByZW1vdmVkIHVudGlsIHRoZSBuZXh0IHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25TdGFydF0gQ2FsbGJhY2sgdG8gZXhlY3V0ZSBpbW1lZGlhdGUgYWZ0ZXIgYXBwbHlpbmcgc3RhdGVDaGFuZ2VBdHRyaWJ1dGUuXG4gICAqXG4gICAqIEByZXR1cm4ge0FuaW1hdGlvbn1cbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0aW9uc01hbmFnZXIsIFt7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQob3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuYW5pbWF0aW9ucy5oYXMob3B0aW9ucy5lbCkpIHJldHVybiB0aGlzLmFuaW1hdGlvbnMuZ2V0KG9wdGlvbnMuZWwpO1xuICAgICAgdmFyIGFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24ob3B0aW9ucyk7XG4gICAgICB0aGlzLmFuaW1hdGlvbnMuc2V0KG9wdGlvbnMuZWwsIGFuaW1hdGlvbik7XG4gICAgICByZXR1cm4gYW5pbWF0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBzaW5nbGUgYW5pbWF0aW9uXG4gICAgICogQHBhcmFtIHtBbmltYXRpb259IGFuaW1hdGlvbiBBbmltYXRpb24gdG8gcmVtb3ZlLiBBbnkgZXZlbnQgbGlzdGVuZXJzIHdpbGwgYWxzbyBiZSByZW1vdmVkLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZShhbmltYXRpb24pIHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uc1tcImRlbGV0ZVwiXShhbmltYXRpb24uZWwpO1xuICAgICAgYW5pbWF0aW9uLnVubG9hZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGFuaW1hdGlvbnMsIGluY2x1ZGluZyBhbGwgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlQWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUFsbCgpIHtcbiAgICAgIHRoaXMuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmltYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbi51bmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmltYXRpb25zTWFuYWdlcjtcbn0oKTtcblxuZnVuY3Rpb24gYW5pbWF0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIHNldE9wdGlvbnMgPSB7XG4gICAgZW5kRXZlbnQ6ICdhbmltYXRpb25lbmQnLFxuICAgIGhvbGQ6IHRydWVcbiAgfTtcbiAgcmV0dXJuIG5ldyBBbmltYXRpb24oX29iamVjdFNwcmVhZDIoe1xuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfSwgc2V0T3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2l0aW9uKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBBbmltYXRpb24ob3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IEFuaW1hdGlvbiwgQW5pbWF0aW9uc01hbmFnZXIsIGFuaW1hdGlvbiwgdHJhbnNpdGlvbiB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/animations/dist/animations.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/events/dist/EventHandler.js":
/*!**************************************************************!*\
  !*** ./node_modules/@pixelunion/events/dist/EventHandler.js ***!
  \**************************************************************/
/***/ ((__unused_webpack_module, exports) => {

"use strict";
eval("\nexports.__esModule = true;\nvar EventHandler = /** @class */ (function () {\n    function EventHandler() {\n        this.events = [];\n    }\n    EventHandler.prototype.register = function (el, event, listener) {\n        if (!el || !event || !listener)\n            return null;\n        this.events.push({ el: el, event: event, listener: listener });\n        el.addEventListener(event, listener);\n        return { el: el, event: event, listener: listener };\n    };\n    EventHandler.prototype.unregister = function (_a) {\n        var el = _a.el, event = _a.event, listener = _a.listener;\n        if (!el || !event || !listener)\n            return null;\n        this.events = this.events.filter(function (e) { return el !== e.el\n            || event !== e.event || listener !== e.listener; });\n        el.removeEventListener(event, listener);\n        return { el: el, event: event, listener: listener };\n    };\n    EventHandler.prototype.unregisterAll = function () {\n        this.events.forEach(function (_a) {\n            var el = _a.el, event = _a.event, listener = _a.listener;\n            return el.removeEventListener(event, listener);\n        });\n        this.events = [];\n    };\n    return EventHandler;\n}());\nexports.default = EventHandler;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vZXZlbnRzL2Rpc3QvRXZlbnRIYW5kbGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9ldmVudHMvZGlzdC9FdmVudEhhbmRsZXIuanM/ZDU5OSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgRXZlbnRIYW5kbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV2ZW50SGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uIChlbCwgZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghZWwgfHwgIWV2ZW50IHx8ICFsaXN0ZW5lcilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9KTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4geyBlbDogZWwsIGV2ZW50OiBldmVudCwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gICAgfTtcbiAgICBFdmVudEhhbmRsZXIucHJvdG90eXBlLnVucmVnaXN0ZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIGVsID0gX2EuZWwsIGV2ZW50ID0gX2EuZXZlbnQsIGxpc3RlbmVyID0gX2EubGlzdGVuZXI7XG4gICAgICAgIGlmICghZWwgfHwgIWV2ZW50IHx8ICFsaXN0ZW5lcilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IHRoaXMuZXZlbnRzLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZWwgIT09IGUuZWxcbiAgICAgICAgICAgIHx8IGV2ZW50ICE9PSBlLmV2ZW50IHx8IGxpc3RlbmVyICE9PSBlLmxpc3RlbmVyOyB9KTtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4geyBlbDogZWwsIGV2ZW50OiBldmVudCwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gICAgfTtcbiAgICBFdmVudEhhbmRsZXIucHJvdG90eXBlLnVucmVnaXN0ZXJBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBfYS5lbCwgZXZlbnQgPSBfYS5ldmVudCwgbGlzdGVuZXIgPSBfYS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHJldHVybiBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgIH07XG4gICAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcbn0oKSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEV2ZW50SGFuZGxlcjtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/events/dist/EventHandler.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/grouped-content/dist/index.js":
/*!****************************************************************!*\
  !*** ./node_modules/@pixelunion/grouped-content/dist/index.js ***!
  \****************************************************************/
/***/ ((module) => {

"use strict";
eval("\n\n// forEach method, could be shipped as part of an Object Literal/Module\nfunction forEach(array, callback, scope) {\n  var index = 0;\n\n  for (index = 0; index < array.length; index += 1) {\n    callback.call(scope, array[index], index); // passes back stuff we need\n  }\n}\n\nfunction hasClass(el, className) {\n  var regex = new RegExp('^' + className + '| +' + className, 'g');\n\n  return el.className.match(regex);\n}\n\nfunction addClass(el, className) {\n  // Return if it already has the className\n  if (hasClass(el, className)) return;\n\n  el.className += ' ' + className;\n}\n\nfunction removeClass(el, className) {\n  // Return if it doesn't already have the className\n  if (!hasClass(el, className)) return;\n\n  var regex = new RegExp('^' + className + '| +' + className, 'g');\n\n  el.className = el.className.replace(regex, '');\n}\n\nfunction toggleClass(el, className) {\n  if (hasClass(el, className)) {\n    removeClass(el, className);\n  } else {\n    addClass(el, className);\n  }\n}\n\nfunction findPairingFromPairingTrigger(pairings, pairingTrigger) {\n  var foundPairing = null;\n\n  forEach(pairings, function (pairing) {\n    if (pairing.trigger === pairingTrigger) {\n      foundPairing = pairing;\n    }\n  });\n\n  return foundPairing;\n}\n\n/**\n * See {@link https://stackoverflow.com/revisions/2117523/11 Stack Overflow}\n * An RFC4122 v4 compliant uuid solution\n */\nfunction uuidv4() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n    var r = Math.random() * 16 | 0;\n    var v = c === 'x' ? r : r & 0x3 | 0x8;\n\n    return v.toString(16);\n  });\n}\n\nfunction init(groupedContent) {\n  var triggers = groupedContent.triggers;\n  var pairings = groupedContent.pairings;\n\n  triggers.setAttribute('role', 'tablist');\n\n  forEach(pairings, function (pairing, index) {\n    pairing.trigger.setAttribute('role', 'tab');\n    pairing.trigger.setAttribute('aria-controls', groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content');\n\n    var triggerContent = pairing.trigger.innerHTML;\n    var triggerWrapper = document.createElement('span');\n    triggerWrapper.innerHTML = triggerContent;\n\n    pairing.trigger.innerHTML = '';\n    pairing.trigger.appendChild(triggerWrapper);\n\n    if (pairing.trigger.children.length > 0) {\n      forEach(pairing.trigger.children, function (child) {\n        child.setAttribute('tabIndex', '-1');\n      });\n    }\n\n    if (hasClass(pairing.trigger, 'active')) {\n      pairing.trigger.setAttribute('aria-selected', 'true');\n      pairing.trigger.setAttribute('tabIndex', '0');\n    } else {\n      pairing.trigger.setAttribute('tabIndex', '-1');\n    }\n\n    pairing.content.id = groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content';\n    pairing.content.setAttribute('role', 'tabpanel');\n\n    if (!hasClass(pairing.content, 'active')) {\n      pairing.content.setAttribute('aria-hidden', 'true');\n    }\n  });\n}\n\nfunction update(groupedContent) {\n  var pairings = groupedContent.pairings;\n\n  forEach(pairings, function (pairing) {\n    pairing.trigger.removeAttribute('aria-selected');\n    pairing.content.removeAttribute('aria-hidden');\n\n    if (hasClass(pairing.trigger, 'active')) {\n      pairing.trigger.setAttribute('aria-selected', 'true');\n      pairing.trigger.setAttribute('tabIndex', '0');\n    } else {\n      pairing.trigger.setAttribute('tabIndex', '-1');\n    }\n\n    if (!hasClass(pairing.content, 'active')) {\n      pairing.content.setAttribute('aria-hidden', 'true');\n    }\n  });\n}\n\nvar a11y = {\n  init: init,\n  update: update\n};\n\nvar asyncGenerator = function () {\n  function AwaitValue(value) {\n    this.value = value;\n  }\n\n  function AsyncGenerator(gen) {\n    var front, back;\n\n    function send(key, arg) {\n      return new Promise(function (resolve, reject) {\n        var request = {\n          key: key,\n          arg: arg,\n          resolve: resolve,\n          reject: reject,\n          next: null\n        };\n\n        if (back) {\n          back = back.next = request;\n        } else {\n          front = back = request;\n          resume(key, arg);\n        }\n      });\n    }\n\n    function resume(key, arg) {\n      try {\n        var result = gen[key](arg);\n        var value = result.value;\n\n        if (value instanceof AwaitValue) {\n          Promise.resolve(value.value).then(function (arg) {\n            resume(\"next\", arg);\n          }, function (arg) {\n            resume(\"throw\", arg);\n          });\n        } else {\n          settle(result.done ? \"return\" : \"normal\", result.value);\n        }\n      } catch (err) {\n        settle(\"throw\", err);\n      }\n    }\n\n    function settle(type, value) {\n      switch (type) {\n        case \"return\":\n          front.resolve({\n            value: value,\n            done: true\n          });\n          break;\n\n        case \"throw\":\n          front.reject(value);\n          break;\n\n        default:\n          front.resolve({\n            value: value,\n            done: false\n          });\n          break;\n      }\n\n      front = front.next;\n\n      if (front) {\n        resume(front.key, front.arg);\n      } else {\n        back = null;\n      }\n    }\n\n    this._invoke = send;\n\n    if (typeof gen.return !== \"function\") {\n      this.return = undefined;\n    }\n  }\n\n  if (typeof Symbol === \"function\" && Symbol.asyncIterator) {\n    AsyncGenerator.prototype[Symbol.asyncIterator] = function () {\n      return this;\n    };\n  }\n\n  AsyncGenerator.prototype.next = function (arg) {\n    return this._invoke(\"next\", arg);\n  };\n\n  AsyncGenerator.prototype.throw = function (arg) {\n    return this._invoke(\"throw\", arg);\n  };\n\n  AsyncGenerator.prototype.return = function (arg) {\n    return this._invoke(\"return\", arg);\n  };\n\n  return {\n    wrap: function (fn) {\n      return function () {\n        return new AsyncGenerator(fn.apply(this, arguments));\n      };\n    },\n    await: function (value) {\n      return new AwaitValue(value);\n    }\n  };\n}();\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\n/** A class for creating, managing, and destroying groupable content as tabs. */\n\nvar TabsLayout = function () {\n  function TabsLayout(groupedContent) {\n    classCallCheck(this, TabsLayout);\n\n    this.groupedContent = groupedContent;\n    this.pairings = groupedContent.pairings;\n    this.events = [];\n\n    this._handleKeydown = this._handleKeydown.bind(this);\n    this._handleClick = this._handleClick.bind(this);\n\n    this._init();\n    a11y.init(this.groupedContent);\n  }\n\n  createClass(TabsLayout, [{\n    key: 'unload',\n    value: function unload() {\n      forEach(this.events, function (event) {\n        event.trigger.removeEventListener(event.type, event.fn);\n      });\n    }\n  }, {\n    key: '_init',\n    value: function _init() {\n      var _this = this;\n\n      var existingActive = false;\n\n      forEach(this.pairings, function (pairing) {\n        var trigger = pairing.trigger;\n\n        if (hasClass(trigger, 'active')) {\n          existingActive = true;\n        }\n\n        trigger.addEventListener('keydown', _this._handleKeydown);\n        trigger.addEventListener('click', _this._handleClick);\n\n        _this.events.push({\n          trigger: trigger,\n          type: 'keydown',\n          fn: _this._handleKeydown\n        });\n\n        _this.events.push({\n          trigger: trigger,\n          type: 'click',\n          fn: _this._handleClick\n        });\n      });\n\n      if (!existingActive) {\n        addClass(this.pairings[0].trigger, 'active');\n        addClass(this.pairings[0].content, 'active');\n      }\n    }\n  }, {\n    key: '_handleKeydown',\n    value: function _handleKeydown(event) {\n      var trigger = event.currentTarget;\n      var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n      var pairingIndex = this.pairings.indexOf(pairing);\n      var prevIndex = pairingIndex - 1 < 0 ? this.pairings.length - 1 : pairingIndex - 1;\n      var nextIndex = pairingIndex + 1 >= this.pairings.length ? 0 : pairingIndex + 1;\n\n      var nextPairing = null;\n\n      switch (event.key) {\n        case 'ArrowLeft':\n          nextPairing = this.pairings[prevIndex];\n          break;\n        case 'ArrowRight':\n          nextPairing = this.pairings[nextIndex];\n          break;\n        default:\n          nextPairing = null;\n          break;\n      }\n\n      // Fast exit if we can't find the tab or tabs\n      if (nextPairing === null) return;\n\n      event.preventDefault();\n\n      forEach(this.pairings, function (inactivePairing) {\n        removeClass(inactivePairing.trigger, 'active');\n        removeClass(inactivePairing.content, 'active');\n      });\n\n      addClass(nextPairing.trigger, 'active');\n      addClass(nextPairing.content, 'active');\n\n      nextPairing.trigger.focus();\n\n      a11y.update(this.groupedContent);\n    }\n  }, {\n    key: '_handleClick',\n    value: function _handleClick(event) {\n      var trigger = event.currentTarget;\n      var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n      // Fast exit if we can't find the tab or tabs\n      if (pairing === null) return;\n\n      event.preventDefault();\n\n      forEach(this.pairings, function (inactivePairing) {\n        removeClass(inactivePairing.trigger, 'active');\n        removeClass(inactivePairing.content, 'active');\n      });\n\n      addClass(pairing.trigger, 'active');\n      addClass(pairing.content, 'active');\n\n      a11y.update(this.groupedContent);\n    }\n  }]);\n  return TabsLayout;\n}();\n\nfunction init$1(groupedContent) {\n  var pairings = groupedContent.pairings;\n\n  forEach(pairings, function (pairing, index) {\n    pairing.trigger.setAttribute('role', 'button');\n    pairing.trigger.setAttribute('aria-controls', groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content');\n    pairing.trigger.setAttribute('tabIndex', '0');\n\n    if (pairing.trigger.children.length > 0) {\n      forEach(pairing.trigger.children, function (child) {\n        child.setAttribute('tabIndex', '-1');\n      });\n    }\n\n    if (hasClass(pairing.trigger, 'active')) {\n      pairing.trigger.setAttribute('aria-expanded', 'true');\n    } else {\n      pairing.trigger.setAttribute('aria-expanded', 'false');\n    }\n\n    pairing.content.id = groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content';\n\n    if (!hasClass(pairing.content, 'active')) {\n      pairing.content.setAttribute('aria-hidden', 'true');\n    }\n  });\n}\n\nfunction update$1(groupedContent) {\n  var pairings = groupedContent.pairings;\n\n  forEach(pairings, function (pairing) {\n    pairing.content.removeAttribute('aria-hidden');\n\n    if (hasClass(pairing.trigger, 'active')) {\n      pairing.trigger.setAttribute('aria-expanded', 'true');\n    } else {\n      pairing.trigger.setAttribute('aria-expanded', 'false');\n    }\n\n    if (!hasClass(pairing.content, 'active')) {\n      pairing.content.setAttribute('aria-hidden', 'true');\n    }\n  });\n}\n\nvar a11y$1 = {\n  init: init$1,\n  update: update$1\n};\n\n/** A class for creating, managing, and destroying groupable content as an accordion. */\n\nvar AccordionLayout = function () {\n  function AccordionLayout(groupedContent) {\n    classCallCheck(this, AccordionLayout);\n\n    this.groupedContent = groupedContent;\n    this.pairings = groupedContent.pairings;\n    this.events = [];\n\n    this._handleKeydown = this._handleKeydown.bind(this);\n    this._handleClick = this._handleClick.bind(this);\n\n    this._init(this.pairings);\n    a11y$1.init(this.groupedContent);\n  }\n\n  createClass(AccordionLayout, [{\n    key: 'unload',\n    value: function unload() {\n      forEach(this.events, function (event) {\n        event.trigger.removeEventListener(event.type, event.fn);\n      });\n    }\n  }, {\n    key: '_init',\n    value: function _init() {\n      var _this = this;\n\n      forEach(this.pairings, function (pairing) {\n        var trigger = pairing.trigger;\n        var content = pairing.content;\n\n        trigger.parentNode.insertBefore(content, trigger.nextSibling);\n\n        trigger.addEventListener('keydown', _this._handleKeydown);\n        trigger.addEventListener('click', _this._handleClick);\n\n        _this.events.push({\n          trigger: trigger,\n          type: 'keydown',\n          fn: _this._handleKeydown\n        });\n\n        _this.events.push({\n          trigger: trigger,\n          type: 'click',\n          fn: _this._handleClick\n        });\n      });\n\n      this.groupedContent.contents.remove();\n    }\n  }, {\n    key: '_handleKeydown',\n    value: function _handleKeydown(event) {\n      var trigger = event.currentTarget;\n      var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n      // Fast exit if enter isn't pressed or we can't find the group\n      if (event.key !== 'Enter' || pairing === null) return;\n\n      event.preventDefault();\n\n      toggleClass(pairing.trigger, 'active');\n      toggleClass(pairing.content, 'active');\n      a11y$1.update(this.groupedContent);\n    }\n  }, {\n    key: '_handleClick',\n    value: function _handleClick(event) {\n      var trigger = event.currentTarget;\n      var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n      // Fast exit if we can't find the group\n      if (pairing === null) return;\n\n      event.preventDefault();\n\n      toggleClass(pairing.trigger, 'active');\n      toggleClass(pairing.content, 'active');\n      a11y$1.update(this.groupedContent);\n    }\n  }]);\n  return AccordionLayout;\n}();\n\n/**\n * Returns an array of nodes related to the heading node.\n * @param {node} heading - The heading node to search for content from.\n * @returns {node[]}\n */\nfunction getHeadingContent(heading) {\n  var headingTagNames = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n  var tagNameIndex = headingTagNames.indexOf(heading.tagName);\n  var content = [];\n\n  var sibling = heading.nextElementSibling;\n\n  while (sibling !== null && (headingTagNames.indexOf(sibling.tagName) === -1 || headingTagNames.indexOf(sibling.tagName) > tagNameIndex)) {\n    content.push(sibling);\n\n    sibling = sibling.nextElementSibling;\n  }\n\n  return content;\n}\n\n/**\n * Returns an object array representing the heading tree from a given node.\n * Root nodes are evaluated differently, and requires the evaluatingRoot flag\n * to be true.\n * @param {node} el - The node being evaluated.\n * @param {node[]} children - The children of the evaluated node.\n * @param {boolean} [evaluatingRoot] - Whether to evaluate as root node.\n * @returns {Object[]}\n */\nfunction getHeadingTree(el, children) {\n  var evaluatingRoot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var headingTagNames = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n  var tagNameIndex = headingTagNames.indexOf(el.tagName);\n  var headings = [];\n\n  var currentLowestTagNameIndex = 5;\n\n  for (var i = 0; i < children.length; i += 1) {\n    var child = children[i];\n    var childTagNameIndex = headingTagNames.indexOf(child.tagName);\n\n    if (childTagNameIndex !== -1 && childTagNameIndex < currentLowestTagNameIndex) {\n      currentLowestTagNameIndex = childTagNameIndex;\n    }\n\n    if (evaluatingRoot && childTagNameIndex !== -1 && childTagNameIndex <= currentLowestTagNameIndex || !evaluatingRoot && childTagNameIndex !== -1 && childTagNameIndex === tagNameIndex + 1) {\n      var siblings = getHeadingContent(child);\n\n      var childNode = {\n        el: child,\n        content: siblings,\n        children: getHeadingTree(child, siblings)\n      };\n\n      headings.push(childNode);\n    }\n  }\n\n  return headings;\n}\n\n/**\n * Returns groupings of headings that meet the minimum sequence value\n * and don't contain any invalid headings.\n * @param {Object[]} headings - An array of heading objects.\n * @param {int[]} invalidHeadings - An array of invalid heading integers,\n *                                  representing indexes of headings.\n * @param {*} minInSequence - Minimum headings in sequence before being considered\n *                            as a grouping.\n * @returns {Object[][]}\n */\nfunction getHeadingGroupsInSequence(headings, invalidHeadings, minInSequence) {\n  var headingGroupsInSequence = [];\n  var currentHeadingGroupInSequence = [];\n  var currentSequence = 0;\n\n  for (var i = 0; i < headings.length; i += 1) {\n    if (invalidHeadings.indexOf(i) === -1) {\n      currentHeadingGroupInSequence.push(headings[i]);\n      currentSequence += 1;\n\n      if (i !== headings.length - 1 && headings[i].el.tagName !== headings[i + 1].el.tagName && invalidHeadings.indexOf(i + 1)) {\n        currentHeadingGroupInSequence = [];\n        currentSequence = 0;\n      } else if (i !== 0 && headings[i].el.tagName !== headings[i - 1].el.tagName) {\n        currentHeadingGroupInSequence.pop();\n        currentSequence -= 1;\n\n        if (currentSequence >= minInSequence) {\n          headingGroupsInSequence.push(currentHeadingGroupInSequence);\n        }\n\n        currentHeadingGroupInSequence = [headings[i]];\n        currentSequence = 1;\n      }\n    }\n  }\n\n  if (currentSequence >= minInSequence) {\n    headingGroupsInSequence.push(currentHeadingGroupInSequence);\n  }\n\n  return headingGroupsInSequence;\n}\n\n/**\n * Generates necessary DOM elements to group related content.\n * Returns a object array representing the grouped content.\n * @param {Object[]} children - An array of objects.\n * @returns {Object[]}\n */\nfunction createGroupedContent(children) {\n  var pairings = [];\n\n  var firstChild = children[0].el;\n  var triggers = document.createElement('div');\n  var contents = document.createElement('div');\n\n  contents = firstChild.parentNode.insertBefore(contents, firstChild.nextSibling);\n  triggers = firstChild.parentNode.insertBefore(triggers, firstChild.nextSibling);\n\n  for (var i = 0; i < children.length; i += 1) {\n    var child = children[i];\n    var trigger = child.el;\n    var content = document.createElement('div');\n\n    trigger = triggers.appendChild(trigger);\n    content = contents.appendChild(content);\n\n    for (var j = 0; j < child.content.length; j += 1) {\n      content.appendChild(child.content[j]);\n    }\n\n    pairings.push({\n      trigger: trigger,\n      content: content\n    });\n  }\n\n  return {\n    triggers: triggers,\n    contents: contents,\n    pairings: pairings\n  };\n}\n\n/**\n * Returns all groupable content within the supplied node.\n * @param {node} node - A node to traverse for groupable content.\n * @returns {Object[][]}\n */\n/*\n * Recursive function:\n *  Returns all groups of headings that\n *  are elegible to become grouped content.\n */\nfunction getGroupedContentSet(node) {\n  var children = node.children;\n  var childrenWithGroupableContent = [];\n  var groupedContentSet = [];\n\n  if (children.length === 0) {\n    return [];\n  }\n\n  for (var i = 0; i < children.length; i += 1) {\n    var childGroupableContent = getGroupedContentSet(children[i]);\n\n    if (childGroupableContent.length > 0) {\n      childrenWithGroupableContent.push(i);\n      groupedContentSet = groupedContentSet.concat(childGroupableContent);\n    }\n  }\n\n  var headingGroupsInSequence = getHeadingGroupsInSequence(children, childrenWithGroupableContent, 3);\n\n  for (var _i = 0; _i < headingGroupsInSequence.length; _i += 1) {\n    groupedContentSet.push(createGroupedContent(headingGroupsInSequence[_i]));\n  }\n\n  return groupedContentSet;\n}\n\n/**\n * When static parsing isn't enough, there's intelliparse™!\n * Searches through dom content to find heading groupings that\n * are elegible to become tab groups.\n * Assumes that content is in a flattened hierarchy in the dom\n * and interprets increasing heading values as a deeper level of nesting.\n * Returns all groupable content as an array of object arrays.\n * @param {node} el - The node who's content will be searched for groupable content.\n * @returns {Object[][]}\n */\nfunction intelliParse(el) {\n  var children = el.children;\n  var heading = el.querySelector('h1, h2, h3, h4, h5, h6');\n\n  // Fast return if there's no headings\n  if (children.length === 0) return [];\n\n  var rootNode = {\n    el: el,\n    content: null,\n    children: getHeadingTree(heading, children, true)\n  };\n\n  return getGroupedContentSet(rootNode);\n}\n\n/**\n * Parses content from a given node based on a static structure.\n * The structure is as follows:\n * <ul class=\"tabs\">\n *   <li class=\"active\">Tab 1</li>\n *   <li>Tab 2</li>\n *   <li>Tab 3</li>\n * </ul>\n *\n * <ul class=\"tabs-content\">\n *   <li class=\"active\">\n *     <p>Tab 1 content goes here.</p>\n *   </li>\n *   <li>\n *     <p>Tab 2 content goes here.</p>\n *   </li>\n *   <li>\n *     <p>Tab 3 content goes here.</p>\n *   </li>\n * </ul>\n * Returns all groupable content as an array of object arrays.\n * @param {node} el - The node who's content will be searched for groupable content.\n * @returns {Object[][]}\n */\nfunction staticParse(el) {\n  var groupedContentSet = [];\n\n  var tabs = el.querySelectorAll('.tabs');\n\n  for (var i = 0; i < tabs.length; i += 1) {\n    var triggers = tabs[i].children;\n    var contents = tabs[i].nextElementSibling.children;\n\n    // Only add a tab group if equal triggers to contents\n    if (triggers.length === contents.length) {\n      var length = groupedContentSet.push({\n        triggers: tabs[i],\n        contents: tabs[i].nextElementSibling,\n        pairings: []\n      });\n      var index = length - 1;\n\n      for (var j = 0; j < triggers.length; j += 1) {\n        var trigger = triggers[j];\n        var content = contents[j];\n\n        var pairing = {\n          trigger: trigger,\n          content: content\n        };\n\n        groupedContentSet[index].pairings.push(pairing);\n      }\n    }\n  }\n\n  return groupedContentSet;\n}\n\n/**\n * Returns all groupable content as an array of object arrays.\n * @param {node} content - The node to parse for groupable content.\n * @param {boolean} intelliparse - Whether to use intelligent parsing.\n * @returns {Object[][]}\n */\nfunction parse(content) {\n  var intelliparse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  var groupedContentSet = intelliparse ? intelliParse(content) : staticParse(content);\n\n  return groupedContentSet;\n}\n\n/** A class for creating, managing, and destroying groupable content. */\n\nvar GroupedContent = function () {\n  /**\n   * Create grouped content\n   * @param {node} el - The element to search for groupable content in.\n   * @param {Object}  [options] - Additional options\n   * @param {string}  [options.layout] - The layout to display groupable content in.\n   * @param {boolean} [options.intelliparse] - The parsing algorithm used to find content with.\n   */\n  function GroupedContent(el) {\n    var _this = this;\n\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, GroupedContent);\n\n    this.namespace = 'grouped-content';\n    this.el = el;\n    this.groupedContentInstances = [];\n\n    var layout = options.layout || 'tabs';\n    var intelliparse = !!options.intelliparse;\n\n    forEach(parse(el, intelliparse), function (groupedContent) {\n      var id = uuidv4();\n      var instance = null;\n      var groupedContentWrapper = document.createElement('div');\n\n      groupedContentWrapper = groupedContent.triggers.parentNode.insertBefore(groupedContentWrapper, groupedContent.triggers.nextSibling);\n\n      addClass(groupedContentWrapper, _this.namespace);\n      addClass(groupedContentWrapper, _this.namespace + '-layout-' + layout);\n\n      groupedContentWrapper.appendChild(groupedContent.triggers);\n      groupedContentWrapper.appendChild(groupedContent.contents);\n\n      groupedContent.namespace = _this.namespace;\n      groupedContent.id = id;\n      groupedContent.triggers.id = _this.namespace + '-' + id + '-triggers';\n      groupedContent.contents.id = _this.namespace + '-' + id + '-contents';\n\n      addClass(groupedContent.triggers, _this.namespace + '-triggers');\n      addClass(groupedContent.contents, _this.namespace + '-contents');\n\n      forEach(groupedContent.pairings, function (pairing) {\n        addClass(pairing.trigger, _this.namespace + '-trigger');\n        addClass(pairing.content, _this.namespace + '-content');\n      });\n\n      switch (layout) {\n        case 'accordion':\n          instance = new AccordionLayout(groupedContent);\n          break;\n        case 'tabs':\n        default:\n          instance = new TabsLayout(groupedContent);\n          break;\n      }\n\n      _this.groupedContentInstances.push({\n        groupedContent: groupedContent,\n        instance: instance\n      });\n    });\n  }\n\n  /** Unload all grouped content instances */\n\n\n  createClass(GroupedContent, [{\n    key: 'unload',\n    value: function unload() {\n      forEach(this.groupedContentInstances, function (groupedContentInstance) {\n        groupedContentInstance.instance.unload();\n      });\n    }\n  }]);\n  return GroupedContent;\n}();\n\nmodule.exports = GroupedContent;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vZ3JvdXBlZC1jb250ZW50L2Rpc3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL2dyb3VwZWQtY29udGVudC9kaXN0L2luZGV4LmpzP2NkNTYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBmb3JFYWNoIG1ldGhvZCwgY291bGQgYmUgc2hpcHBlZCBhcyBwYXJ0IG9mIGFuIE9iamVjdCBMaXRlcmFsL01vZHVsZVxuZnVuY3Rpb24gZm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIHNjb3BlKSB7XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYXJyYXkubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY2FsbGJhY2suY2FsbChzY29wZSwgYXJyYXlbaW5kZXhdLCBpbmRleCk7IC8vIHBhc3NlcyBiYWNrIHN0dWZmIHdlIG5lZWRcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgY2xhc3NOYW1lICsgJ3wgKycgKyBjbGFzc05hbWUsICdnJyk7XG5cbiAgcmV0dXJuIGVsLmNsYXNzTmFtZS5tYXRjaChyZWdleCk7XG59XG5cbmZ1bmN0aW9uIGFkZENsYXNzKGVsLCBjbGFzc05hbWUpIHtcbiAgLy8gUmV0dXJuIGlmIGl0IGFscmVhZHkgaGFzIHRoZSBjbGFzc05hbWVcbiAgaWYgKGhhc0NsYXNzKGVsLCBjbGFzc05hbWUpKSByZXR1cm47XG5cbiAgZWwuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAvLyBSZXR1cm4gaWYgaXQgZG9lc24ndCBhbHJlYWR5IGhhdmUgdGhlIGNsYXNzTmFtZVxuICBpZiAoIWhhc0NsYXNzKGVsLCBjbGFzc05hbWUpKSByZXR1cm47XG5cbiAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyBjbGFzc05hbWUgKyAnfCArJyArIGNsYXNzTmFtZSwgJ2cnKTtcblxuICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUucmVwbGFjZShyZWdleCwgJycpO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gIGlmIChoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSkge1xuICAgIHJlbW92ZUNsYXNzKGVsLCBjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGFkZENsYXNzKGVsLCBjbGFzc05hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWlyaW5nRnJvbVBhaXJpbmdUcmlnZ2VyKHBhaXJpbmdzLCBwYWlyaW5nVHJpZ2dlcikge1xuICB2YXIgZm91bmRQYWlyaW5nID0gbnVsbDtcblxuICBmb3JFYWNoKHBhaXJpbmdzLCBmdW5jdGlvbiAocGFpcmluZykge1xuICAgIGlmIChwYWlyaW5nLnRyaWdnZXIgPT09IHBhaXJpbmdUcmlnZ2VyKSB7XG4gICAgICBmb3VuZFBhaXJpbmcgPSBwYWlyaW5nO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZvdW5kUGFpcmluZztcbn1cblxuLyoqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcmV2aXNpb25zLzIxMTc1MjMvMTEgU3RhY2sgT3ZlcmZsb3d9XG4gKiBBbiBSRkM0MTIyIHY0IGNvbXBsaWFudCB1dWlkIHNvbHV0aW9uXG4gKi9cbmZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gICAgdmFyIHYgPSBjID09PSAneCcgPyByIDogciAmIDB4MyB8IDB4ODtcblxuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluaXQoZ3JvdXBlZENvbnRlbnQpIHtcbiAgdmFyIHRyaWdnZXJzID0gZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnM7XG4gIHZhciBwYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuXG4gIHRyaWdnZXJzLnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWJsaXN0Jyk7XG5cbiAgZm9yRWFjaChwYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcsIGluZGV4KSB7XG4gICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWInKTtcbiAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJywgZ3JvdXBlZENvbnRlbnQubmFtZXNwYWNlICsgJy0nICsgZ3JvdXBlZENvbnRlbnQuaWQgKyAnLScgKyBpbmRleCArICctY29udGVudCcpO1xuXG4gICAgdmFyIHRyaWdnZXJDb250ZW50ID0gcGFpcmluZy50cmlnZ2VyLmlubmVySFRNTDtcbiAgICB2YXIgdHJpZ2dlcldyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdHJpZ2dlcldyYXBwZXIuaW5uZXJIVE1MID0gdHJpZ2dlckNvbnRlbnQ7XG5cbiAgICBwYWlyaW5nLnRyaWdnZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgcGFpcmluZy50cmlnZ2VyLmFwcGVuZENoaWxkKHRyaWdnZXJXcmFwcGVyKTtcblxuICAgIGlmIChwYWlyaW5nLnRyaWdnZXIuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yRWFjaChwYWlyaW5nLnRyaWdnZXIuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJy0xJyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGFzQ2xhc3MocGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJykpIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnMCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xuICAgIH1cblxuICAgIHBhaXJpbmcuY29udGVudC5pZCA9IGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnO1xuICAgIHBhaXJpbmcuY29udGVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFicGFuZWwnKTtcblxuICAgIGlmICghaGFzQ2xhc3MocGFpcmluZy5jb250ZW50LCAnYWN0aXZlJykpIHtcbiAgICAgIHBhaXJpbmcuY29udGVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGUoZ3JvdXBlZENvbnRlbnQpIHtcbiAgdmFyIHBhaXJpbmdzID0gZ3JvdXBlZENvbnRlbnQucGFpcmluZ3M7XG5cbiAgZm9yRWFjaChwYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcpIHtcbiAgICBwYWlyaW5nLnRyaWdnZXIucmVtb3ZlQXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJyk7XG4gICAgcGFpcmluZy5jb250ZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgIGlmIChoYXNDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICcwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJy0xJyk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy5jb250ZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIH1cbiAgfSk7XG59XG5cbnZhciBhMTF5ID0ge1xuICBpbml0OiBpbml0LFxuICB1cGRhdGU6IHVwZGF0ZVxufTtcblxudmFyIGFzeW5jR2VuZXJhdG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBd2FpdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gQXN5bmNHZW5lcmF0b3IoZ2VuKSB7XG4gICAgdmFyIGZyb250LCBiYWNrO1xuXG4gICAgZnVuY3Rpb24gc2VuZChrZXksIGFyZykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgYXJnOiBhcmcsXG4gICAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3Q6IHJlamVjdCxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGJhY2spIHtcbiAgICAgICAgICBiYWNrID0gYmFjay5uZXh0ID0gcmVxdWVzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcm9udCA9IGJhY2sgPSByZXF1ZXN0O1xuICAgICAgICAgIHJlc3VtZShrZXksIGFyZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc3VtZShrZXksIGFyZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBd2FpdFZhbHVlKSB7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlLnZhbHVlKS50aGVuKGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgIHJlc3VtZShcIm5leHRcIiwgYXJnKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXN1bWUoXCJ0aHJvd1wiLCBhcmcpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldHRsZShyZXN1bHQuZG9uZSA/IFwicmV0dXJuXCIgOiBcIm5vcm1hbFwiLCByZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0dGxlKFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXR0bGUodHlwZSwgdmFsdWUpIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwicmV0dXJuXCI6XG4gICAgICAgICAgZnJvbnQucmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcInRocm93XCI6XG4gICAgICAgICAgZnJvbnQucmVqZWN0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGZyb250LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZnJvbnQgPSBmcm9udC5uZXh0O1xuXG4gICAgICBpZiAoZnJvbnQpIHtcbiAgICAgICAgcmVzdW1lKGZyb250LmtleSwgZnJvbnQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2ludm9rZSA9IHNlbmQ7XG5cbiAgICBpZiAodHlwZW9mIGdlbi5yZXR1cm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5yZXR1cm4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuYXN5bmNJdGVyYXRvcikge1xuICAgIEFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG5cbiAgQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcIm5leHRcIiwgYXJnKTtcbiAgfTtcblxuICBBc3luY0dlbmVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcInRocm93XCIsIGFyZyk7XG4gIH07XG5cbiAgQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLnJldHVybiA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKFwicmV0dXJuXCIsIGFyZyk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB3cmFwOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXN5bmNHZW5lcmF0b3IoZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgYXdhaXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5ldyBBd2FpdFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH07XG59KCk7XG5cblxuXG5cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxuLyoqIEEgY2xhc3MgZm9yIGNyZWF0aW5nLCBtYW5hZ2luZywgYW5kIGRlc3Ryb3lpbmcgZ3JvdXBhYmxlIGNvbnRlbnQgYXMgdGFicy4gKi9cblxudmFyIFRhYnNMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRhYnNMYXlvdXQoZ3JvdXBlZENvbnRlbnQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUYWJzTGF5b3V0KTtcblxuICAgIHRoaXMuZ3JvdXBlZENvbnRlbnQgPSBncm91cGVkQ29udGVudDtcbiAgICB0aGlzLnBhaXJpbmdzID0gZ3JvdXBlZENvbnRlbnQucGFpcmluZ3M7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcblxuICAgIHRoaXMuX2hhbmRsZUtleWRvd24gPSB0aGlzLl9oYW5kbGVLZXlkb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5faGFuZGxlQ2xpY2sgPSB0aGlzLl9oYW5kbGVDbGljay5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIGExMXkuaW5pdCh0aGlzLmdyb3VwZWRDb250ZW50KTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFRhYnNMYXlvdXQsIFt7XG4gICAga2V5OiAndW5sb2FkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgZm9yRWFjaCh0aGlzLmV2ZW50cywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBldmVudC5mbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaW5pdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGV4aXN0aW5nQWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIGZvckVhY2godGhpcy5wYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcpIHtcbiAgICAgICAgdmFyIHRyaWdnZXIgPSBwYWlyaW5nLnRyaWdnZXI7XG5cbiAgICAgICAgaWYgKGhhc0NsYXNzKHRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgICAgIGV4aXN0aW5nQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF90aGlzLl9oYW5kbGVLZXlkb3duKTtcbiAgICAgICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIF90aGlzLl9oYW5kbGVDbGljayk7XG5cbiAgICAgICAgX3RoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgdHlwZTogJ2tleWRvd24nLFxuICAgICAgICAgIGZuOiBfdGhpcy5faGFuZGxlS2V5ZG93blxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgICAgdHJpZ2dlcjogdHJpZ2dlcixcbiAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgIGZuOiBfdGhpcy5faGFuZGxlQ2xpY2tcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFleGlzdGluZ0FjdGl2ZSkge1xuICAgICAgICBhZGRDbGFzcyh0aGlzLnBhaXJpbmdzWzBdLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgICAgYWRkQ2xhc3ModGhpcy5wYWlyaW5nc1swXS5jb250ZW50LCAnYWN0aXZlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUtleWRvd24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgdmFyIHBhaXJpbmcgPSBmaW5kUGFpcmluZ0Zyb21QYWlyaW5nVHJpZ2dlcih0aGlzLnBhaXJpbmdzLCB0cmlnZ2VyKTtcbiAgICAgIHZhciBwYWlyaW5nSW5kZXggPSB0aGlzLnBhaXJpbmdzLmluZGV4T2YocGFpcmluZyk7XG4gICAgICB2YXIgcHJldkluZGV4ID0gcGFpcmluZ0luZGV4IC0gMSA8IDAgPyB0aGlzLnBhaXJpbmdzLmxlbmd0aCAtIDEgOiBwYWlyaW5nSW5kZXggLSAxO1xuICAgICAgdmFyIG5leHRJbmRleCA9IHBhaXJpbmdJbmRleCArIDEgPj0gdGhpcy5wYWlyaW5ncy5sZW5ndGggPyAwIDogcGFpcmluZ0luZGV4ICsgMTtcblxuICAgICAgdmFyIG5leHRQYWlyaW5nID0gbnVsbDtcblxuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICBuZXh0UGFpcmluZyA9IHRoaXMucGFpcmluZ3NbcHJldkluZGV4XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgbmV4dFBhaXJpbmcgPSB0aGlzLnBhaXJpbmdzW25leHRJbmRleF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbmV4dFBhaXJpbmcgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBGYXN0IGV4aXQgaWYgd2UgY2FuJ3QgZmluZCB0aGUgdGFiIG9yIHRhYnNcbiAgICAgIGlmIChuZXh0UGFpcmluZyA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBmb3JFYWNoKHRoaXMucGFpcmluZ3MsIGZ1bmN0aW9uIChpbmFjdGl2ZVBhaXJpbmcpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoaW5hY3RpdmVQYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoaW5hY3RpdmVQYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBhZGRDbGFzcyhuZXh0UGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJyk7XG4gICAgICBhZGRDbGFzcyhuZXh0UGFpcmluZy5jb250ZW50LCAnYWN0aXZlJyk7XG5cbiAgICAgIG5leHRQYWlyaW5nLnRyaWdnZXIuZm9jdXMoKTtcblxuICAgICAgYTExeS51cGRhdGUodGhpcy5ncm91cGVkQ29udGVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUNsaWNrJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2hhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgICB2YXIgdHJpZ2dlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICB2YXIgcGFpcmluZyA9IGZpbmRQYWlyaW5nRnJvbVBhaXJpbmdUcmlnZ2VyKHRoaXMucGFpcmluZ3MsIHRyaWdnZXIpO1xuXG4gICAgICAvLyBGYXN0IGV4aXQgaWYgd2UgY2FuJ3QgZmluZCB0aGUgdGFiIG9yIHRhYnNcbiAgICAgIGlmIChwYWlyaW5nID09PSBudWxsKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGZvckVhY2godGhpcy5wYWlyaW5ncywgZnVuY3Rpb24gKGluYWN0aXZlUGFpcmluZykge1xuICAgICAgICByZW1vdmVDbGFzcyhpbmFjdGl2ZVBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpO1xuICAgICAgICByZW1vdmVDbGFzcyhpbmFjdGl2ZVBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGFkZENsYXNzKHBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpO1xuICAgICAgYWRkQ2xhc3MocGFpcmluZy5jb250ZW50LCAnYWN0aXZlJyk7XG5cbiAgICAgIGExMXkudXBkYXRlKHRoaXMuZ3JvdXBlZENvbnRlbnQpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVGFic0xheW91dDtcbn0oKTtcblxuZnVuY3Rpb24gaW5pdCQxKGdyb3VwZWRDb250ZW50KSB7XG4gIHZhciBwYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuXG4gIGZvckVhY2gocGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nLCBpbmRleCkge1xuICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycsIGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnKTtcbiAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICcwJyk7XG5cbiAgICBpZiAocGFpcmluZy50cmlnZ2VyLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvckVhY2gocGFpcmluZy50cmlnZ2VyLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0NsYXNzKHBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpKSB7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgIH1cblxuICAgIHBhaXJpbmcuY29udGVudC5pZCA9IGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnO1xuXG4gICAgaWYgKCFoYXNDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy5jb250ZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZSQxKGdyb3VwZWRDb250ZW50KSB7XG4gIHZhciBwYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuXG4gIGZvckVhY2gocGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nKSB7XG4gICAgcGFpcmluZy5jb250ZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgIGlmIChoYXNDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NsYXNzKHBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpKSB7XG4gICAgICBwYWlyaW5nLmNvbnRlbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgfVxuICB9KTtcbn1cblxudmFyIGExMXkkMSA9IHtcbiAgaW5pdDogaW5pdCQxLFxuICB1cGRhdGU6IHVwZGF0ZSQxXG59O1xuXG4vKiogQSBjbGFzcyBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgZGVzdHJveWluZyBncm91cGFibGUgY29udGVudCBhcyBhbiBhY2NvcmRpb24uICovXG5cbnZhciBBY2NvcmRpb25MYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFjY29yZGlvbkxheW91dChncm91cGVkQ29udGVudCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEFjY29yZGlvbkxheW91dCk7XG5cbiAgICB0aGlzLmdyb3VwZWRDb250ZW50ID0gZ3JvdXBlZENvbnRlbnQ7XG4gICAgdGhpcy5wYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG5cbiAgICB0aGlzLl9oYW5kbGVLZXlkb3duID0gdGhpcy5faGFuZGxlS2V5ZG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2hhbmRsZUNsaWNrID0gdGhpcy5faGFuZGxlQ2xpY2suYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2luaXQodGhpcy5wYWlyaW5ncyk7XG4gICAgYTExeSQxLmluaXQodGhpcy5ncm91cGVkQ29udGVudCk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhBY2NvcmRpb25MYXlvdXQsIFt7XG4gICAga2V5OiAndW5sb2FkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgZm9yRWFjaCh0aGlzLmV2ZW50cywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBldmVudC5mbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaW5pdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgZm9yRWFjaCh0aGlzLnBhaXJpbmdzLCBmdW5jdGlvbiAocGFpcmluZykge1xuICAgICAgICB2YXIgdHJpZ2dlciA9IHBhaXJpbmcudHJpZ2dlcjtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBwYWlyaW5nLmNvbnRlbnQ7XG5cbiAgICAgICAgdHJpZ2dlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb250ZW50LCB0cmlnZ2VyLm5leHRTaWJsaW5nKTtcblxuICAgICAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAgICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBfdGhpcy5faGFuZGxlQ2xpY2spO1xuXG4gICAgICAgIF90aGlzLmV2ZW50cy5wdXNoKHtcbiAgICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgICAgIHR5cGU6ICdrZXlkb3duJyxcbiAgICAgICAgICBmbjogX3RoaXMuX2hhbmRsZUtleWRvd25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgICBmbjogX3RoaXMuX2hhbmRsZUNsaWNrXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZ3JvdXBlZENvbnRlbnQuY29udGVudHMucmVtb3ZlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUtleWRvd24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgdmFyIHBhaXJpbmcgPSBmaW5kUGFpcmluZ0Zyb21QYWlyaW5nVHJpZ2dlcih0aGlzLnBhaXJpbmdzLCB0cmlnZ2VyKTtcblxuICAgICAgLy8gRmFzdCBleGl0IGlmIGVudGVyIGlzbid0IHByZXNzZWQgb3Igd2UgY2FuJ3QgZmluZCB0aGUgZ3JvdXBcbiAgICAgIGlmIChldmVudC5rZXkgIT09ICdFbnRlcicgfHwgcGFpcmluZyA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB0b2dnbGVDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgIHRvZ2dsZUNsYXNzKHBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpO1xuICAgICAgYTExeSQxLnVwZGF0ZSh0aGlzLmdyb3VwZWRDb250ZW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaGFuZGxlQ2xpY2snLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgIHZhciBwYWlyaW5nID0gZmluZFBhaXJpbmdGcm9tUGFpcmluZ1RyaWdnZXIodGhpcy5wYWlyaW5ncywgdHJpZ2dlcik7XG5cbiAgICAgIC8vIEZhc3QgZXhpdCBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBncm91cFxuICAgICAgaWYgKHBhaXJpbmcgPT09IG51bGwpIHJldHVybjtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdG9nZ2xlQ2xhc3MocGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJyk7XG4gICAgICB0b2dnbGVDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKTtcbiAgICAgIGExMXkkMS51cGRhdGUodGhpcy5ncm91cGVkQ29udGVudCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBY2NvcmRpb25MYXlvdXQ7XG59KCk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBub2RlcyByZWxhdGVkIHRvIHRoZSBoZWFkaW5nIG5vZGUuXG4gKiBAcGFyYW0ge25vZGV9IGhlYWRpbmcgLSBUaGUgaGVhZGluZyBub2RlIHRvIHNlYXJjaCBmb3IgY29udGVudCBmcm9tLlxuICogQHJldHVybnMge25vZGVbXX1cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhZGluZ0NvbnRlbnQoaGVhZGluZykge1xuICB2YXIgaGVhZGluZ1RhZ05hbWVzID0gWydIMScsICdIMicsICdIMycsICdINCcsICdINScsICdINiddO1xuICB2YXIgdGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoaGVhZGluZy50YWdOYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBbXTtcblxuICB2YXIgc2libGluZyA9IGhlYWRpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gIHdoaWxlIChzaWJsaW5nICE9PSBudWxsICYmIChoZWFkaW5nVGFnTmFtZXMuaW5kZXhPZihzaWJsaW5nLnRhZ05hbWUpID09PSAtMSB8fCBoZWFkaW5nVGFnTmFtZXMuaW5kZXhPZihzaWJsaW5nLnRhZ05hbWUpID4gdGFnTmFtZUluZGV4KSkge1xuICAgIGNvbnRlbnQucHVzaChzaWJsaW5nKTtcblxuICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZztcbiAgfVxuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IGFycmF5IHJlcHJlc2VudGluZyB0aGUgaGVhZGluZyB0cmVlIGZyb20gYSBnaXZlbiBub2RlLlxuICogUm9vdCBub2RlcyBhcmUgZXZhbHVhdGVkIGRpZmZlcmVudGx5LCBhbmQgcmVxdWlyZXMgdGhlIGV2YWx1YXRpbmdSb290IGZsYWdcbiAqIHRvIGJlIHRydWUuXG4gKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIG5vZGUgYmVpbmcgZXZhbHVhdGVkLlxuICogQHBhcmFtIHtub2RlW119IGNoaWxkcmVuIC0gVGhlIGNoaWxkcmVuIG9mIHRoZSBldmFsdWF0ZWQgbm9kZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V2YWx1YXRpbmdSb290XSAtIFdoZXRoZXIgdG8gZXZhbHVhdGUgYXMgcm9vdCBub2RlLlxuICogQHJldHVybnMge09iamVjdFtdfVxuICovXG5mdW5jdGlvbiBnZXRIZWFkaW5nVHJlZShlbCwgY2hpbGRyZW4pIHtcbiAgdmFyIGV2YWx1YXRpbmdSb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgaGVhZGluZ1RhZ05hbWVzID0gWydIMScsICdIMicsICdIMycsICdINCcsICdINScsICdINiddO1xuICB2YXIgdGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoZWwudGFnTmFtZSk7XG4gIHZhciBoZWFkaW5ncyA9IFtdO1xuXG4gIHZhciBjdXJyZW50TG93ZXN0VGFnTmFtZUluZGV4ID0gNTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgdmFyIGNoaWxkVGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoY2hpbGQudGFnTmFtZSk7XG5cbiAgICBpZiAoY2hpbGRUYWdOYW1lSW5kZXggIT09IC0xICYmIGNoaWxkVGFnTmFtZUluZGV4IDwgY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCkge1xuICAgICAgY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCA9IGNoaWxkVGFnTmFtZUluZGV4O1xuICAgIH1cblxuICAgIGlmIChldmFsdWF0aW5nUm9vdCAmJiBjaGlsZFRhZ05hbWVJbmRleCAhPT0gLTEgJiYgY2hpbGRUYWdOYW1lSW5kZXggPD0gY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCB8fCAhZXZhbHVhdGluZ1Jvb3QgJiYgY2hpbGRUYWdOYW1lSW5kZXggIT09IC0xICYmIGNoaWxkVGFnTmFtZUluZGV4ID09PSB0YWdOYW1lSW5kZXggKyAxKSB7XG4gICAgICB2YXIgc2libGluZ3MgPSBnZXRIZWFkaW5nQ29udGVudChjaGlsZCk7XG5cbiAgICAgIHZhciBjaGlsZE5vZGUgPSB7XG4gICAgICAgIGVsOiBjaGlsZCxcbiAgICAgICAgY29udGVudDogc2libGluZ3MsXG4gICAgICAgIGNoaWxkcmVuOiBnZXRIZWFkaW5nVHJlZShjaGlsZCwgc2libGluZ3MpXG4gICAgICB9O1xuXG4gICAgICBoZWFkaW5ncy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhlYWRpbmdzO1xufVxuXG4vKipcbiAqIFJldHVybnMgZ3JvdXBpbmdzIG9mIGhlYWRpbmdzIHRoYXQgbWVldCB0aGUgbWluaW11bSBzZXF1ZW5jZSB2YWx1ZVxuICogYW5kIGRvbid0IGNvbnRhaW4gYW55IGludmFsaWQgaGVhZGluZ3MuXG4gKiBAcGFyYW0ge09iamVjdFtdfSBoZWFkaW5ncyAtIEFuIGFycmF5IG9mIGhlYWRpbmcgb2JqZWN0cy5cbiAqIEBwYXJhbSB7aW50W119IGludmFsaWRIZWFkaW5ncyAtIEFuIGFycmF5IG9mIGludmFsaWQgaGVhZGluZyBpbnRlZ2VycyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGluZyBpbmRleGVzIG9mIGhlYWRpbmdzLlxuICogQHBhcmFtIHsqfSBtaW5JblNlcXVlbmNlIC0gTWluaW11bSBoZWFkaW5ncyBpbiBzZXF1ZW5jZSBiZWZvcmUgYmVpbmcgY29uc2lkZXJlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBncm91cGluZy5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG5mdW5jdGlvbiBnZXRIZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZShoZWFkaW5ncywgaW52YWxpZEhlYWRpbmdzLCBtaW5JblNlcXVlbmNlKSB7XG4gIHZhciBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZSA9IFtdO1xuICB2YXIgY3VycmVudEhlYWRpbmdHcm91cEluU2VxdWVuY2UgPSBbXTtcbiAgdmFyIGN1cnJlbnRTZXF1ZW5jZSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkaW5ncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChpbnZhbGlkSGVhZGluZ3MuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlLnB1c2goaGVhZGluZ3NbaV0pO1xuICAgICAgY3VycmVudFNlcXVlbmNlICs9IDE7XG5cbiAgICAgIGlmIChpICE9PSBoZWFkaW5ncy5sZW5ndGggLSAxICYmIGhlYWRpbmdzW2ldLmVsLnRhZ05hbWUgIT09IGhlYWRpbmdzW2kgKyAxXS5lbC50YWdOYW1lICYmIGludmFsaWRIZWFkaW5ncy5pbmRleE9mKGkgKyAxKSkge1xuICAgICAgICBjdXJyZW50SGVhZGluZ0dyb3VwSW5TZXF1ZW5jZSA9IFtdO1xuICAgICAgICBjdXJyZW50U2VxdWVuY2UgPSAwO1xuICAgICAgfSBlbHNlIGlmIChpICE9PSAwICYmIGhlYWRpbmdzW2ldLmVsLnRhZ05hbWUgIT09IGhlYWRpbmdzW2kgLSAxXS5lbC50YWdOYW1lKSB7XG4gICAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlLnBvcCgpO1xuICAgICAgICBjdXJyZW50U2VxdWVuY2UgLT0gMTtcblxuICAgICAgICBpZiAoY3VycmVudFNlcXVlbmNlID49IG1pbkluU2VxdWVuY2UpIHtcbiAgICAgICAgICBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZS5wdXNoKGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlID0gW2hlYWRpbmdzW2ldXTtcbiAgICAgICAgY3VycmVudFNlcXVlbmNlID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudFNlcXVlbmNlID49IG1pbkluU2VxdWVuY2UpIHtcbiAgICBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZS5wdXNoKGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlKTtcbiAgfVxuXG4gIHJldHVybiBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgbmVjZXNzYXJ5IERPTSBlbGVtZW50cyB0byBncm91cCByZWxhdGVkIGNvbnRlbnQuXG4gKiBSZXR1cm5zIGEgb2JqZWN0IGFycmF5IHJlcHJlc2VudGluZyB0aGUgZ3JvdXBlZCBjb250ZW50LlxuICogQHBhcmFtIHtPYmplY3RbXX0gY2hpbGRyZW4gLSBBbiBhcnJheSBvZiBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdFtdfVxuICovXG5mdW5jdGlvbiBjcmVhdGVHcm91cGVkQ29udGVudChjaGlsZHJlbikge1xuICB2YXIgcGFpcmluZ3MgPSBbXTtcblxuICB2YXIgZmlyc3RDaGlsZCA9IGNoaWxkcmVuWzBdLmVsO1xuICB2YXIgdHJpZ2dlcnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdmFyIGNvbnRlbnRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgY29udGVudHMgPSBmaXJzdENoaWxkLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRlbnRzLCBmaXJzdENoaWxkLm5leHRTaWJsaW5nKTtcbiAgdHJpZ2dlcnMgPSBmaXJzdENoaWxkLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyaWdnZXJzLCBmaXJzdENoaWxkLm5leHRTaWJsaW5nKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgdmFyIHRyaWdnZXIgPSBjaGlsZC5lbDtcbiAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgdHJpZ2dlciA9IHRyaWdnZXJzLmFwcGVuZENoaWxkKHRyaWdnZXIpO1xuICAgIGNvbnRlbnQgPSBjb250ZW50cy5hcHBlbmRDaGlsZChjb250ZW50KTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGQuY29udGVudC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgY29udGVudC5hcHBlbmRDaGlsZChjaGlsZC5jb250ZW50W2pdKTtcbiAgICB9XG5cbiAgICBwYWlyaW5ncy5wdXNoKHtcbiAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICBjb250ZW50OiBjb250ZW50XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRyaWdnZXJzOiB0cmlnZ2VycyxcbiAgICBjb250ZW50czogY29udGVudHMsXG4gICAgcGFpcmluZ3M6IHBhaXJpbmdzXG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ3JvdXBhYmxlIGNvbnRlbnQgd2l0aGluIHRoZSBzdXBwbGllZCBub2RlLlxuICogQHBhcmFtIHtub2RlfSBub2RlIC0gQSBub2RlIHRvIHRyYXZlcnNlIGZvciBncm91cGFibGUgY29udGVudC5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG4vKlxuICogUmVjdXJzaXZlIGZ1bmN0aW9uOlxuICogIFJldHVybnMgYWxsIGdyb3VwcyBvZiBoZWFkaW5ncyB0aGF0XG4gKiAgYXJlIGVsZWdpYmxlIHRvIGJlY29tZSBncm91cGVkIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwZWRDb250ZW50U2V0KG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgdmFyIGNoaWxkcmVuV2l0aEdyb3VwYWJsZUNvbnRlbnQgPSBbXTtcbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gW107XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgY2hpbGRHcm91cGFibGVDb250ZW50ID0gZ2V0R3JvdXBlZENvbnRlbnRTZXQoY2hpbGRyZW5baV0pO1xuXG4gICAgaWYgKGNoaWxkR3JvdXBhYmxlQ29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGlsZHJlbldpdGhHcm91cGFibGVDb250ZW50LnB1c2goaSk7XG4gICAgICBncm91cGVkQ29udGVudFNldCA9IGdyb3VwZWRDb250ZW50U2V0LmNvbmNhdChjaGlsZEdyb3VwYWJsZUNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZSA9IGdldEhlYWRpbmdHcm91cHNJblNlcXVlbmNlKGNoaWxkcmVuLCBjaGlsZHJlbldpdGhHcm91cGFibGVDb250ZW50LCAzKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgaGVhZGluZ0dyb3Vwc0luU2VxdWVuY2UubGVuZ3RoOyBfaSArPSAxKSB7XG4gICAgZ3JvdXBlZENvbnRlbnRTZXQucHVzaChjcmVhdGVHcm91cGVkQ29udGVudChoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZVtfaV0pKTtcbiAgfVxuXG4gIHJldHVybiBncm91cGVkQ29udGVudFNldDtcbn1cblxuLyoqXG4gKiBXaGVuIHN0YXRpYyBwYXJzaW5nIGlzbid0IGVub3VnaCwgdGhlcmUncyBpbnRlbGxpcGFyc2XihKIhXG4gKiBTZWFyY2hlcyB0aHJvdWdoIGRvbSBjb250ZW50IHRvIGZpbmQgaGVhZGluZyBncm91cGluZ3MgdGhhdFxuICogYXJlIGVsZWdpYmxlIHRvIGJlY29tZSB0YWIgZ3JvdXBzLlxuICogQXNzdW1lcyB0aGF0IGNvbnRlbnQgaXMgaW4gYSBmbGF0dGVuZWQgaGllcmFyY2h5IGluIHRoZSBkb21cbiAqIGFuZCBpbnRlcnByZXRzIGluY3JlYXNpbmcgaGVhZGluZyB2YWx1ZXMgYXMgYSBkZWVwZXIgbGV2ZWwgb2YgbmVzdGluZy5cbiAqIFJldHVybnMgYWxsIGdyb3VwYWJsZSBjb250ZW50IGFzIGFuIGFycmF5IG9mIG9iamVjdCBhcnJheXMuXG4gKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIG5vZGUgd2hvJ3MgY29udGVudCB3aWxsIGJlIHNlYXJjaGVkIGZvciBncm91cGFibGUgY29udGVudC5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG5mdW5jdGlvbiBpbnRlbGxpUGFyc2UoZWwpIHtcbiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47XG4gIHZhciBoZWFkaW5nID0gZWwucXVlcnlTZWxlY3RvcignaDEsIGgyLCBoMywgaDQsIGg1LCBoNicpO1xuXG4gIC8vIEZhc3QgcmV0dXJuIGlmIHRoZXJlJ3Mgbm8gaGVhZGluZ3NcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIHZhciByb290Tm9kZSA9IHtcbiAgICBlbDogZWwsXG4gICAgY29udGVudDogbnVsbCxcbiAgICBjaGlsZHJlbjogZ2V0SGVhZGluZ1RyZWUoaGVhZGluZywgY2hpbGRyZW4sIHRydWUpXG4gIH07XG5cbiAgcmV0dXJuIGdldEdyb3VwZWRDb250ZW50U2V0KHJvb3ROb2RlKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgY29udGVudCBmcm9tIGEgZ2l2ZW4gbm9kZSBiYXNlZCBvbiBhIHN0YXRpYyBzdHJ1Y3R1cmUuXG4gKiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6XG4gKiA8dWwgY2xhc3M9XCJ0YWJzXCI+XG4gKiAgIDxsaSBjbGFzcz1cImFjdGl2ZVwiPlRhYiAxPC9saT5cbiAqICAgPGxpPlRhYiAyPC9saT5cbiAqICAgPGxpPlRhYiAzPC9saT5cbiAqIDwvdWw+XG4gKlxuICogPHVsIGNsYXNzPVwidGFicy1jb250ZW50XCI+XG4gKiAgIDxsaSBjbGFzcz1cImFjdGl2ZVwiPlxuICogICAgIDxwPlRhYiAxIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIDxwPlRhYiAyIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIDxwPlRhYiAzIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqIDwvdWw+XG4gKiBSZXR1cm5zIGFsbCBncm91cGFibGUgY29udGVudCBhcyBhbiBhcnJheSBvZiBvYmplY3QgYXJyYXlzLlxuICogQHBhcmFtIHtub2RlfSBlbCAtIFRoZSBub2RlIHdobydzIGNvbnRlbnQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgZ3JvdXBhYmxlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0W11bXX1cbiAqL1xuZnVuY3Rpb24gc3RhdGljUGFyc2UoZWwpIHtcbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gW107XG5cbiAgdmFyIHRhYnMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCcudGFicycpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciB0cmlnZ2VycyA9IHRhYnNbaV0uY2hpbGRyZW47XG4gICAgdmFyIGNvbnRlbnRzID0gdGFic1tpXS5uZXh0RWxlbWVudFNpYmxpbmcuY2hpbGRyZW47XG5cbiAgICAvLyBPbmx5IGFkZCBhIHRhYiBncm91cCBpZiBlcXVhbCB0cmlnZ2VycyB0byBjb250ZW50c1xuICAgIGlmICh0cmlnZ2Vycy5sZW5ndGggPT09IGNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGdyb3VwZWRDb250ZW50U2V0LnB1c2goe1xuICAgICAgICB0cmlnZ2VyczogdGFic1tpXSxcbiAgICAgICAgY29udGVudHM6IHRhYnNbaV0ubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICBwYWlyaW5nczogW11cbiAgICAgIH0pO1xuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0cmlnZ2Vycy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICB2YXIgdHJpZ2dlciA9IHRyaWdnZXJzW2pdO1xuICAgICAgICB2YXIgY29udGVudCA9IGNvbnRlbnRzW2pdO1xuXG4gICAgICAgIHZhciBwYWlyaW5nID0ge1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgY29udGVudDogY29udGVudFxuICAgICAgICB9O1xuXG4gICAgICAgIGdyb3VwZWRDb250ZW50U2V0W2luZGV4XS5wYWlyaW5ncy5wdXNoKHBhaXJpbmcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncm91cGVkQ29udGVudFNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBncm91cGFibGUgY29udGVudCBhcyBhbiBhcnJheSBvZiBvYmplY3QgYXJyYXlzLlxuICogQHBhcmFtIHtub2RlfSBjb250ZW50IC0gVGhlIG5vZGUgdG8gcGFyc2UgZm9yIGdyb3VwYWJsZSBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFufSBpbnRlbGxpcGFyc2UgLSBXaGV0aGVyIHRvIHVzZSBpbnRlbGxpZ2VudCBwYXJzaW5nLlxuICogQHJldHVybnMge09iamVjdFtdW119XG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGNvbnRlbnQpIHtcbiAgdmFyIGludGVsbGlwYXJzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gaW50ZWxsaXBhcnNlID8gaW50ZWxsaVBhcnNlKGNvbnRlbnQpIDogc3RhdGljUGFyc2UoY29udGVudCk7XG5cbiAgcmV0dXJuIGdyb3VwZWRDb250ZW50U2V0O1xufVxuXG4vKiogQSBjbGFzcyBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgZGVzdHJveWluZyBncm91cGFibGUgY29udGVudC4gKi9cblxudmFyIEdyb3VwZWRDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlIGdyb3VwZWQgY29udGVudFxuICAgKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIGVsZW1lbnQgdG8gc2VhcmNoIGZvciBncm91cGFibGUgY29udGVudCBpbi5cbiAgICogQHBhcmFtIHtPYmplY3R9ICBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9ICBbb3B0aW9ucy5sYXlvdXRdIC0gVGhlIGxheW91dCB0byBkaXNwbGF5IGdyb3VwYWJsZSBjb250ZW50IGluLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmludGVsbGlwYXJzZV0gLSBUaGUgcGFyc2luZyBhbGdvcml0aG0gdXNlZCB0byBmaW5kIGNvbnRlbnQgd2l0aC5cbiAgICovXG4gIGZ1bmN0aW9uIEdyb3VwZWRDb250ZW50KGVsKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHcm91cGVkQ29udGVudCk7XG5cbiAgICB0aGlzLm5hbWVzcGFjZSA9ICdncm91cGVkLWNvbnRlbnQnO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLmdyb3VwZWRDb250ZW50SW5zdGFuY2VzID0gW107XG5cbiAgICB2YXIgbGF5b3V0ID0gb3B0aW9ucy5sYXlvdXQgfHwgJ3RhYnMnO1xuICAgIHZhciBpbnRlbGxpcGFyc2UgPSAhIW9wdGlvbnMuaW50ZWxsaXBhcnNlO1xuXG4gICAgZm9yRWFjaChwYXJzZShlbCwgaW50ZWxsaXBhcnNlKSwgZnVuY3Rpb24gKGdyb3VwZWRDb250ZW50KSB7XG4gICAgICB2YXIgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG51bGw7XG4gICAgICB2YXIgZ3JvdXBlZENvbnRlbnRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGdyb3VwZWRDb250ZW50V3JhcHBlciA9IGdyb3VwZWRDb250ZW50LnRyaWdnZXJzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGdyb3VwZWRDb250ZW50V3JhcHBlciwgZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMubmV4dFNpYmxpbmcpO1xuXG4gICAgICBhZGRDbGFzcyhncm91cGVkQ29udGVudFdyYXBwZXIsIF90aGlzLm5hbWVzcGFjZSk7XG4gICAgICBhZGRDbGFzcyhncm91cGVkQ29udGVudFdyYXBwZXIsIF90aGlzLm5hbWVzcGFjZSArICctbGF5b3V0LScgKyBsYXlvdXQpO1xuXG4gICAgICBncm91cGVkQ29udGVudFdyYXBwZXIuYXBwZW5kQ2hpbGQoZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMpO1xuICAgICAgZ3JvdXBlZENvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKGdyb3VwZWRDb250ZW50LmNvbnRlbnRzKTtcblxuICAgICAgZ3JvdXBlZENvbnRlbnQubmFtZXNwYWNlID0gX3RoaXMubmFtZXNwYWNlO1xuICAgICAgZ3JvdXBlZENvbnRlbnQuaWQgPSBpZDtcbiAgICAgIGdyb3VwZWRDb250ZW50LnRyaWdnZXJzLmlkID0gX3RoaXMubmFtZXNwYWNlICsgJy0nICsgaWQgKyAnLXRyaWdnZXJzJztcbiAgICAgIGdyb3VwZWRDb250ZW50LmNvbnRlbnRzLmlkID0gX3RoaXMubmFtZXNwYWNlICsgJy0nICsgaWQgKyAnLWNvbnRlbnRzJztcblxuICAgICAgYWRkQ2xhc3MoZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMsIF90aGlzLm5hbWVzcGFjZSArICctdHJpZ2dlcnMnKTtcbiAgICAgIGFkZENsYXNzKGdyb3VwZWRDb250ZW50LmNvbnRlbnRzLCBfdGhpcy5uYW1lc3BhY2UgKyAnLWNvbnRlbnRzJyk7XG5cbiAgICAgIGZvckVhY2goZ3JvdXBlZENvbnRlbnQucGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nKSB7XG4gICAgICAgIGFkZENsYXNzKHBhaXJpbmcudHJpZ2dlciwgX3RoaXMubmFtZXNwYWNlICsgJy10cmlnZ2VyJyk7XG4gICAgICAgIGFkZENsYXNzKHBhaXJpbmcuY29udGVudCwgX3RoaXMubmFtZXNwYWNlICsgJy1jb250ZW50Jyk7XG4gICAgICB9KTtcblxuICAgICAgc3dpdGNoIChsYXlvdXQpIHtcbiAgICAgICAgY2FzZSAnYWNjb3JkaW9uJzpcbiAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY2NvcmRpb25MYXlvdXQoZ3JvdXBlZENvbnRlbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0YWJzJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBUYWJzTGF5b3V0KGdyb3VwZWRDb250ZW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZ3JvdXBlZENvbnRlbnRJbnN0YW5jZXMucHVzaCh7XG4gICAgICAgIGdyb3VwZWRDb250ZW50OiBncm91cGVkQ29udGVudCxcbiAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBVbmxvYWQgYWxsIGdyb3VwZWQgY29udGVudCBpbnN0YW5jZXMgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEdyb3VwZWRDb250ZW50LCBbe1xuICAgIGtleTogJ3VubG9hZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIGZvckVhY2godGhpcy5ncm91cGVkQ29udGVudEluc3RhbmNlcywgZnVuY3Rpb24gKGdyb3VwZWRDb250ZW50SW5zdGFuY2UpIHtcbiAgICAgICAgZ3JvdXBlZENvbnRlbnRJbnN0YW5jZS5pbnN0YW5jZS51bmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gR3JvdXBlZENvbnRlbnQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gR3JvdXBlZENvbnRlbnQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/grouped-content/dist/index.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/pxs-complementary-products/dist/index.es.js":
/*!******************************************************************************!*\
  !*** ./node_modules/@pixelunion/pxs-complementary-products/dist/index.es.js ***!
  \******************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n\n/*!\n * @pixelunion/pxs-complementary-products v3.5.3\n * (c) 2022 Pixel Union\n */\n\n\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {};\n\nfunction unwrapExports (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar EventHandler_1 = createCommonjsModule(function (module, exports) {\nexports.__esModule = true;\nvar EventHandler = /** @class */ (function () {\n    function EventHandler() {\n        this.events = [];\n    }\n    EventHandler.prototype.register = function (el, event, listener) {\n        if (!el || !event || !listener)\n            return null;\n        this.events.push({ el: el, event: event, listener: listener });\n        el.addEventListener(event, listener);\n        return { el: el, event: event, listener: listener };\n    };\n    EventHandler.prototype.unregister = function (_a) {\n        var el = _a.el, event = _a.event, listener = _a.listener;\n        if (!el || !event || !listener)\n            return null;\n        this.events = this.events.filter(function (e) { return el !== e.el\n            || event !== e.event || listener !== e.listener; });\n        el.removeEventListener(event, listener);\n        return { el: el, event: event, listener: listener };\n    };\n    EventHandler.prototype.unregisterAll = function () {\n        this.events.forEach(function (_a) {\n            var el = _a.el, event = _a.event, listener = _a.listener;\n            return el.removeEventListener(event, listener);\n        });\n        this.events = [];\n    };\n    return EventHandler;\n}());\nexports[\"default\"] = EventHandler;\n});\n\nvar EventHandler = unwrapExports(EventHandler_1);\n\n/*!\n   * @pixelunion/shopify-asyncview v2.0.5\n   * (c) 2020 Pixel Union\n  */\n\nfunction _classCallCheck$1(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties$1(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass$1(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties$1(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(n);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n  return arr2;\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar deferred = {};\n\nvar AsyncView = /*#__PURE__*/function () {\n  function AsyncView() {\n    _classCallCheck$1(this, AsyncView);\n  }\n\n  _createClass$1(AsyncView, null, [{\n    key: \"load\",\n\n    /**\n     * Load the template given by the provided URL into the provided\n     * view\n     *\n     * @param {string} url - The url to load\n     * @param {object} query - An object containing additional query parameters of the URL\n     * @param {string} query.view - A required query parameter indicating which view to load\n     * @param {object} [options] - Config options\n     * @param {string} [options.hash] - A hash of the current page content\n     */\n    value: function load(url) {\n      var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      if (!('view' in query)) {\n        return Promise.reject(new Error('\\'view\\' not found in \\'query\\' parameter'));\n      }\n\n      var querylessUrl = url.replace(/\\?[^#]+/, '');\n      var queryParamsString = new RegExp(/.+\\?([^#]+)/).exec(url);\n      var queryParams = query;\n\n      if (queryParamsString && queryParamsString.length >= 2) {\n        queryParamsString[1].split('&').forEach(function (param) {\n          var _param$split = param.split('='),\n              _param$split2 = _slicedToArray(_param$split, 2),\n              key = _param$split2[0],\n              value = _param$split2[1];\n\n          queryParams[key] = value;\n        });\n      } // NOTE: We're adding an additional timestamp to the query.\n      // This is to prevent certain browsers from returning cached\n      // versions of the url we are requesting.\n      // See this PR for more info: https://github.com/pixelunion/shopify-asyncview/pull/4\n\n\n      var cachebustingParams = _objectSpread2({}, queryParams, {\n        _: new Date().getTime()\n      });\n\n      var hashUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n        return \"\".concat(address, \"?\").concat(Object.keys(queryParams).sort().map(function (key) {\n          return \"\".concat(key, \"=\").concat(encodeURIComponent(queryParams[key]));\n        }).join('&')).concat(hash);\n      });\n      var requestUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n        return \"\".concat(address, \"?\").concat(Object.keys(cachebustingParams).sort().map(function (key) {\n          return \"\".concat(key, \"=\").concat(encodeURIComponent(cachebustingParams[key]));\n        }).join('&')).concat(hash);\n      });\n      var promise = new Promise(function (resolve, reject) {\n        var data;\n\n        if (hashUrl in deferred) {\n          resolve(deferred[hashUrl]);\n          return;\n        }\n\n        deferred[hashUrl] = promise;\n\n        if (options.hash) {\n          data = sessionStorage.getItem(hashUrl);\n\n          if (data) {\n            var deserialized = JSON.parse(data);\n\n            if (options.hash === deserialized.options.hash) {\n              delete deferred[hashUrl];\n              resolve(deserialized);\n              return;\n            }\n          }\n        }\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', requestUrl, true);\n\n        xhr.onload = function () {\n          var el = xhr.response;\n          var newOptions = {};\n          var optionsEl = el.querySelector('[data-options]');\n\n          if (optionsEl && optionsEl.innerHTML) {\n            newOptions = JSON.parse(el.querySelector('[data-options]').innerHTML);\n          }\n\n          var htmlEls = el.querySelectorAll('[data-html]');\n          var newHtml = {};\n\n          if (htmlEls.length === 1 && htmlEls[0].getAttribute('data-html') === '') {\n            newHtml = htmlEls[0].innerHTML;\n          } else {\n            for (var i = 0; i < htmlEls.length; i++) {\n              newHtml[htmlEls[i].getAttribute('data-html')] = htmlEls[i].innerHTML;\n            }\n          }\n\n          var dataEls = el.querySelectorAll('[data-data]');\n          var newData = {};\n\n          if (dataEls.length === 1 && dataEls[0].getAttribute('data-data') === '') {\n            newData = JSON.parse(dataEls[0].innerHTML);\n          } else {\n            for (var _i = 0; _i < dataEls.length; _i++) {\n              newData[dataEls[_i].getAttribute('data-data')] = JSON.parse(dataEls[_i].innerHTML);\n            }\n          }\n\n          if (options.hash) {\n            try {\n              sessionStorage.setItem(hashUrl, JSON.stringify({\n                options: newOptions,\n                data: newData,\n                html: newHtml\n              }));\n            } catch (error) {\n              console.error(error);\n            }\n          }\n\n          delete deferred[hashUrl];\n          resolve({\n            data: newData,\n            html: newHtml\n          });\n        };\n\n        xhr.onerror = function () {\n          delete deferred[hashUrl];\n          reject();\n        };\n\n        xhr.responseType = 'document';\n        xhr.send();\n      });\n      return promise;\n    }\n  }]);\n\n  return AsyncView;\n}();\n\nvar evEmitter = createCommonjsModule(function (module) {\n/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if (  module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : commonjsGlobal, function() {\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice(0);\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( var i=0; i < listeners.length; i++ ) {\n    var listener = listeners[i];\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n});\n\nvar getSize = createCommonjsModule(function (module) {\n/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n  /* jshint strict: false */ /* globals define, module */\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n})( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  var num = parseFloat( value );\n  // not a percent like '100%', and a number\n  var isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n  function( message ) {\n    console.error( message );\n  };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  var size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0\n  };\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    size[ measurement ] = 0;\n  }\n  return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n  var style = getComputedStyle( elem );\n  if ( !style ) {\n    logError( 'Style returned ' + style +\n      '. Are you running this code in a hidden iframe on Firefox? ' +\n      'See https://bit.ly/getsizebug1' );\n  }\n  return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n  // setup once\n  if ( isSetup ) {\n    return;\n  }\n  isSetup = true;\n\n  // -------------------------- box sizing -------------------------- //\n\n  /**\n   * Chrome & Safari measure the outer-width on style.width on border-box elems\n   * IE11 & Firefox<29 measures the inner-width\n   */\n  var div = document.createElement('div');\n  div.style.width = '200px';\n  div.style.padding = '1px 2px 3px 4px';\n  div.style.borderStyle = 'solid';\n  div.style.borderWidth = '1px 2px 3px 4px';\n  div.style.boxSizing = 'border-box';\n\n  var body = document.body || document.documentElement;\n  body.appendChild( div );\n  var style = getStyle( div );\n  // round value for browser zoom. desandro/masonry#928\n  isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n  getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n  body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  setup();\n\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) {\n    elem = document.querySelector( elem );\n  }\n\n  // do not proceed on non-objects\n  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n    return;\n  }\n\n  var style = getStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) {\n    return getZeroSize();\n  }\n\n  var size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    var value = style[ measurement ];\n    var num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  }\n\n  var paddingWidth = size.paddingLeft + size.paddingRight;\n  var paddingHeight = size.paddingTop + size.paddingBottom;\n  var marginWidth = size.marginLeft + size.marginRight;\n  var marginHeight = size.marginTop + size.marginBottom;\n  var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n  // overwrite width and height if we can get it from style\n  var styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n  }\n\n  var styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n});\n});\n\nvar matchesSelector = createCommonjsModule(function (module) {\n/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.matchesSelector = factory();\n  }\n\n}( window, function factory() {\n\n  var matchesMethod = ( function() {\n    var ElemProto = window.Element.prototype;\n    // check for the standard method name first\n    if ( ElemProto.matches ) {\n      return 'matches';\n    }\n    // check un-prefixed\n    if ( ElemProto.matchesSelector ) {\n      return 'matchesSelector';\n    }\n    // check vendor prefixes\n    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n    for ( var i=0; i < prefixes.length; i++ ) {\n      var prefix = prefixes[i];\n      var method = prefix + 'MatchesSelector';\n      if ( ElemProto[ method ] ) {\n        return method;\n      }\n    }\n  })();\n\n  return function matchesSelector( elem, selector ) {\n    return elem[ matchesMethod ]( selector );\n  };\n\n}));\n});\n\nvar utils = createCommonjsModule(function (module) {\n/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      matchesSelector\n    );\n  } else {\n    // browser global\n    window.fizzyUIUtils = factory(\n      window,\n      window.matchesSelector\n    );\n  }\n\n}( window, function factory( window, matchesSelector ) {\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  for ( var prop in b ) {\n    a[ prop ] = b[ prop ];\n  }\n  return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  if ( Array.isArray( obj ) ) {\n    // use object if already an array\n    return obj;\n  }\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) {\n    return [];\n  }\n\n  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  if ( isArrayLike ) {\n    // convert nodeList to array\n    return arraySlice.call( obj );\n  }\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  var index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( matchesSelector( elem, selector ) ) {\n      return elem;\n    }\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n  var ffElems = [];\n\n  elems.forEach( function( elem ) {\n    // check that elem is an actual element\n    if ( !( elem instanceof HTMLElement ) ) {\n      return;\n    }\n    // add elem if no selector\n    if ( !selector ) {\n      ffElems.push( elem );\n      return;\n    }\n    // filter & find items if we have a selector\n    // filter\n    if ( matchesSelector( elem, selector ) ) {\n      ffElems.push( elem );\n    }\n    // find children\n    var childElems = elem.querySelectorAll( selector );\n    // concat childElems to filterFound array\n    for ( var i=0; i < childElems.length; i++ ) {\n      ffElems.push( childElems[i] );\n    }\n  });\n\n  return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  var method = _class.prototype[ methodName ];\n  var timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    var timeout = this[ timeoutName ];\n    clearTimeout( timeout );\n\n    var args = arguments;\n    var _this = this;\n    this[ timeoutName ] = setTimeout( function() {\n      method.apply( _this, args );\n      delete _this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n  var readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( callback );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', callback );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    var dashedNamespace = utils.toDashed( namespace );\n    var dataAttr = 'data-' + dashedNamespace;\n    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n    var elems = utils.makeArray( dataAttrElems )\n      .concat( utils.makeArray( jsDashElems ) );\n    var dataOptionsAttr = dataAttr + '-options';\n    var jQuery = window.jQuery;\n\n    elems.forEach( function( elem ) {\n      var attr = elem.getAttribute( dataAttr ) ||\n        elem.getAttribute( dataOptionsAttr );\n      var options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n          ': ' + error );\n        }\n        return;\n      }\n      // initialize\n      var instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    });\n\n  });\n};\n\n// -----  ----- //\n\nreturn utils;\n\n}));\n});\n\nvar cell = createCommonjsModule(function (module) {\n// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        getSize\n    );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory(\n        window,\n        window.getSize\n    );\n  }\n\n}( window, function factory( window, getSize ) {\n\nfunction Cell( elem, parent ) {\n  this.element = elem;\n  this.parent = parent;\n\n  this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n  this.element.style.position = 'absolute';\n  this.element.setAttribute( 'aria-hidden', 'true' );\n  this.x = 0;\n  this.shift = 0;\n  this.element.style[ this.parent.originSide ] = 0;\n};\n\nproto.destroy = function() {\n  // reset style\n  this.unselect();\n  this.element.style.position = '';\n  var side = this.parent.originSide;\n  this.element.style[ side ] = '';\n  this.element.style.transform = '';\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n  this.x = x;\n  this.updateTarget();\n  this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n  var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n  this.target = this.x + this.size[ marginProperty ] +\n    this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n  // render position of cell with in slider\n  var sideOffset = this.parent.originSide === 'left' ? 1 : -1;\n\n  var adjustedX = this.parent.options.percentPosition ?\n    x * sideOffset * ( this.parent.size.innerWidth / this.size.width ) :\n    x * sideOffset;\n\n  this.element.style.transform = 'translateX(' +\n    this.parent.getPositionValue( adjustedX ) + ')';\n};\n\nproto.select = function() {\n  this.element.classList.add('is-selected');\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n  this.element.classList.remove('is-selected');\n  this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} shift - 0, 1, or -1\n */\nproto.wrapShift = function( shift ) {\n  this.shift = shift;\n  this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n  this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n} ) );\n});\n\nvar slide = createCommonjsModule(function (module) {\n// slide\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( window, function factory() {\n\nfunction Slide( parent ) {\n  this.parent = parent;\n  this.isOriginLeft = parent.originSide == 'left';\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length == 1 ) {\n    this.x = cell.x; // x comes from first cell\n    var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n    this.firstMargin = cell.size[ beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n  var lastCell = this.getLastCell();\n  var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n  var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.cells.forEach( function( cell ) {\n    cell.select();\n  } );\n};\n\nproto.unselect = function() {\n  this.cells.forEach( function( cell ) {\n    cell.unselect();\n  } );\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  } );\n};\n\nreturn Slide;\n\n} ) );\n});\n\nvar animate = createCommonjsModule(function (module) {\n// animate\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        utils\n    );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory(\n        window,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, utils ) {\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) {\n    return;\n  }\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  var previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) {\n    var _this = this;\n    requestAnimationFrame( function animateFrame() {\n      _this.animate();\n    } );\n  }\n};\n\nproto.positionSlider = function() {\n  var x = this.x;\n  // wrap position around\n  if ( this.options.wrapAround && this.cells.length > 1 ) {\n    x = utils.modulo( x, this.slideableWidth );\n    x -= this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  this.setTranslateX( x, this.isAnimating );\n  this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n  x += this.cursorPosition;\n  // reverse if right-to-left and using transform\n  x = this.options.rightToLeft ? -x : x;\n  var translateX = this.getPositionValue( x );\n  // use 3D transforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = is3d ?\n    'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n  var firstSlide = this.slides[0];\n  if ( !firstSlide ) {\n    return;\n  }\n  var positionX = -this.x - firstSlide.target;\n  var progress = positionX / this.slidesWidth;\n  this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) {\n    return;\n  }\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  var isResting = !this.isPointerDown &&\n      Math.round( this.x * 100 ) == Math.round( previousX * 100 );\n  if ( isResting ) {\n    this.restingFrames++;\n  }\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  var beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  for ( var i = 0; i < cells.length; i++ ) {\n    var cell = cells[i];\n    var cellShift = gap > 0 ? shift : 0;\n    cell.wrapShift( cellShift );\n    gap -= cell.size.outerWidth;\n  }\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  for ( var i = 0; i < cells.length; i++ ) {\n    cells[i].wrapShift( 0 );\n  }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) {\n    return;\n  }\n  // change the position to drag position by applying force\n  var dragVelocity = this.dragX - this.x;\n  var dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  var dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n    return;\n  }\n  var distance = this.selectedSlide.target * -1 - this.x;\n  var force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n});\n\nvar flickity = createCommonjsModule(function (module) {\n// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        evEmitter,\n        getSize,\n        utils,\n        cell,\n        slide,\n        animate\n    );\n  } else {\n    // browser global\n    var _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n        window,\n        window.EvEmitter,\n        window.getSize,\n        window.fizzyUIUtils,\n        _Flickity.Cell,\n        _Flickity.Slide,\n        _Flickity.animatePrototype\n    );\n  }\n\n}( window, function factory( window, EvEmitter, getSize,\n    utils, Cell, Slide, animatePrototype ) {\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n  elems = utils.makeArray( elems );\n  while ( elems.length ) {\n    toElem.appendChild( elems.shift() );\n  }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    var instance = instances[ this.element.flickityGUID ];\n    if ( instance ) instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true,\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  // add id for Flickity.data\n  var id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.originSide = this.options.rightToLeft ? 'right' : 'left';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n\n  if ( this.options.resize || this.options.watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( var eventName in this.options.on ) {\n    var listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  Flickity.createMethods.forEach( function( method ) {\n    this[ method ]();\n  }, this );\n\n  if ( this.options.watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) {\n    return;\n  }\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  var cellElems = this._filterFindCellElements( this.element.children );\n  moveElements( cellElems, this.slider );\n  this.viewport.appendChild( this.slider );\n  this.element.appendChild( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n  this.selectInitialIndex();\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  var slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  slider.style[ this.originSide ] = 0;\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  var cellElems = this._filterFindCellElements( elems );\n\n  // create new Flickity for collection\n  var cells = cellElems.map( function( cellElem ) {\n    return new Cell( cellElem, this );\n  }, this );\n\n  return cells;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  var cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    var startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n  var len = this.cells.length;\n  for ( var i = index; i < len; i++ ) {\n    var cell = this.cells[i];\n    cell.setPosition( cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  }\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( function( cell ) {\n    cell.getSize();\n  } );\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) {\n    return;\n  }\n\n  var slide = new Slide( this );\n  this.slides.push( slide );\n  var isOriginLeft = this.originSide == 'left';\n  var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n  var canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( function( cell, i ) {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n    if ( canCellFit.call( this, i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( this );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  }, this );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  var groupCells = this.options.groupCells;\n  if ( !groupCells ) {\n    return function() {\n      return false;\n    };\n  } else if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    var number = parseInt( groupCells, 10 );\n    return function( i ) {\n      return ( i % number ) !== 0;\n    };\n  }\n  // default, group by width of slide\n  // parse '75%\n  var percentMatch = typeof groupCells == 'string' &&\n    groupCells.match( /^(\\d+)%$/ );\n  var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n  return function( i, slideWidth ) {\n    /* eslint-disable-next-line no-invalid-this */\n    return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n  };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n  // cell align, then based on origin side\n  center: {\n    left: 0.5,\n    right: 0.5,\n  },\n  left: {\n    left: 0,\n    right: 1,\n  },\n  right: {\n    right: 0,\n    left: 1,\n  },\n};\n\nproto.setCellAlign = function() {\n  var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n  this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( this.options.setGallerySize ) {\n    var height = this.options.adaptiveHeight && this.selectedSlide ?\n      this.selectedSlide.height : this.maxCellHeight;\n    this.viewport.style.height = height + 'px';\n  }\n};\n\nproto._getWrapShiftCells = function() {\n  // only for wrap-around\n  if ( !this.options.wrapAround ) {\n    return;\n  }\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  var gapX = this.cursorPosition;\n  var cellIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  gapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  var cells = [];\n  while ( gapX > 0 ) {\n    var cell = this.cells[ cellIndex ];\n    if ( !cell ) {\n      break;\n    }\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n    return;\n  }\n  var isRightToLeft = this.options.rightToLeft;\n  var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n  var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n  var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n  // content is less than gallery size\n  var isContentSmaller = contentWidth < this.size.innerWidth;\n  // bounds\n  var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n  var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n  // contain each cell target\n  this.slides.forEach( function( slide ) {\n    if ( isContentSmaller ) {\n      // all cells fit inside gallery\n      slide.target = contentWidth * this.cellAlign;\n    } else {\n      // contain to bounds\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    }\n  }, this );\n};\n\n// -----  ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    var $event = type;\n    if ( event ) {\n      // create jQuery event\n      var jQEvent = new jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) {\n    return;\n  }\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.options.wrapAround || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) {\n    return;\n  }\n  var prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index != prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n  // old v1 event name, remove in v3\n  this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  var len = this.slides.length;\n  var isWrapping = this.options.wrapAround && len > 1;\n  if ( !isWrapping ) {\n    return index;\n  }\n  var wrapIndex = utils.modulo( index, len );\n  // go to shortest\n  var delta = Math.abs( wrapIndex - this.selectedIndex );\n  var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n  var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n  if ( !this.isDragSelect && backWrapDelta < delta ) {\n    index += len;\n  } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n    index -= len;\n  }\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= this.slideableWidth;\n  } else if ( index >= len ) {\n    this.x += this.slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  var slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) {\n    return;\n  }\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  // Remove in v3?\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) {\n    this.selectedSlide.unselect();\n  }\n};\n\nproto.selectInitialIndex = function() {\n  var initialIndex = this.options.initialIndex;\n  // already activated, select previous selectedIndex\n  if ( this.isInitActivated ) {\n    this.select( this.selectedIndex, false, true );\n    return;\n  }\n  // select with selector string\n  if ( initialIndex && typeof initialIndex == 'string' ) {\n    var cell = this.queryCell( initialIndex );\n    if ( cell ) {\n      this.selectCell( initialIndex, false, true );\n      return;\n    }\n  }\n\n  var index = 0;\n  // select with number\n  if ( initialIndex && this.slides[ initialIndex ] ) {\n    index = initialIndex;\n  }\n  // select instantly\n  this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  var cell = this.queryCell( value );\n  if ( !cell ) {\n    return;\n  }\n\n  var index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slides that has cell\n  for ( var i = 0; i < this.slides.length; i++ ) {\n    var slide = this.slides[i];\n    var index = slide.cells.indexOf( cell );\n    if ( index != -1 ) {\n      return i;\n    }\n  }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( var i = 0; i < this.cells.length; i++ ) {\n    var cell = this.cells[i];\n    if ( cell.element == elem ) {\n      return cell;\n    }\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  var cells = [];\n  elems.forEach( function( elem ) {\n    var cell = this.getCell( elem );\n    if ( cell ) {\n      cells.push( cell );\n    }\n  }, this );\n  return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  } );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  var cell = this.getCell( elem );\n  if ( cell ) {\n    return cell;\n  }\n  // try to get parent cell elem\n  elem = utils.getParent( elem, '.flickity-slider > *' );\n  return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) {\n    return this.selectedSlide.getCellElements();\n  }\n  index = index === undefined ? this.selectedIndex : index;\n\n  var len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements();\n  }\n\n  var cellElems = [];\n  for ( var i = index - adjCount; i <= index + adjCount; i++ ) {\n    var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n    var slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  if ( typeof selector == 'string' ) {\n    // do not select invalid selectors from hash: #123, #/. #791\n    if ( selector.match( /^[#.]?[\\d/]/ ) ) {\n      return;\n    }\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n  // HACK iOS does not allow touch events to bubble up?!\n  if ( event.type != 'touchstart' ) {\n    event.preventDefault();\n  }\n  this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  // #1177 disable resize behavior when animating or dragging for iOS 15\n  if ( !this.isActive || this.isAnimating || this.isDragging ) {\n    return;\n  }\n  this.getSize();\n  // wrap values\n  if ( this.options.wrapAround ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  var selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  var watchOption = this.options.watchCSS;\n  if ( !watchOption ) {\n    return;\n  }\n\n  var afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.indexOf('flickity') != -1 ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  // only work if element is in focus\n  var isNotFocused = document.activeElement && document.activeElement != this.element;\n  if ( !this.options.accessibility || isNotFocused ) {\n    return;\n  }\n\n  var handler = Flickity.keyboardHandlers[ event.keyCode ];\n  if ( handler ) {\n    handler.call( this );\n  }\n};\n\nFlickity.keyboardHandlers = {\n  // left arrow\n  37: function() {\n    var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this.uiChange();\n    this[ leftMethod ]();\n  },\n  // right arrow\n  39: function() {\n    var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this.uiChange();\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  // TODO remove scrollTo once focus options gets more support\n  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus ...\n  //    #Browser_compatibility\n  var prevScrollY = window.pageYOffset;\n  this.element.focus({ preventScroll: true });\n  // hack to fix scroll jump after focus, #76\n  if ( window.pageYOffset != prevScrollY ) {\n    window.scrollTo( window.pageXOffset, prevScrollY );\n  }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) {\n    return;\n  }\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( function( cell ) {\n    cell.destroy();\n  } );\n  this.element.removeChild( this.viewport );\n  // move child elements back into element\n  moveElements( this.slider.children, this.element );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.allOff();\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.flickityGUID;\n  return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n  jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar unipointer = createCommonjsModule(function (module) {\n/*!\n * Unipointer v2.4.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*global define, module, require */\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      evEmitter\n    );\n  } else {\n    // browser global\n    window.Unipointer = factory(\n      window,\n      window.EvEmitter\n    );\n  }\n\n}( window, function factory( window, EvEmitter ) {\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n  // munge isAdd, default to true\n  isAdd = isAdd === undefined ? true : isAdd;\n  var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n  // default to mouse events\n  var startEvent = 'mousedown';\n  if ( 'ontouchstart' in window ) {\n    // HACK prefer Touch Events as you can preventDefault on touchstart to\n    // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n    startEvent = 'touchstart';\n  } else if ( window.PointerEvent ) {\n    // Pointer Events\n    startEvent = 'pointerdown';\n  }\n  elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n  for ( var i=0; i < touches.length; i++ ) {\n    var touch = touches[i];\n    if ( touch.identifier == this.pointerIdentifier ) {\n      return touch;\n    }\n  }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  // dismiss clicks from right or middle buttons\n  var button = event.button;\n  if ( button && ( button !== 0 && button !== 1 ) ) {\n    return;\n  }\n  this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n  // dismiss right click and other pointers\n  // button = 0 is okay, 1-4 not\n  if ( event.button || this.isPointerDown ) {\n    return;\n  }\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n\n  this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n  mousedown: [ 'mousemove', 'mouseup' ],\n  touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n  pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n  if ( !event ) {\n    return;\n  }\n  // get proper events to match start event\n  var events = postStartEvents[ event.type ];\n  // bind events to node\n  events.forEach( function( eventName ) {\n    window.addEventListener( eventName, this );\n  }, this );\n  // save these arguments\n  this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n  // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n  if ( !this._boundPointerEvents ) {\n    return;\n  }\n  this._boundPointerEvents.forEach( function( eventName ) {\n    window.removeEventListener( eventName, this );\n  }, this );\n\n  delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n  this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerMove( event, event );\n  }\n};\n\nproto.ontouchmove = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerMove( event, touch );\n  }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n  this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n  this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n  this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerUp( event, event );\n  }\n};\n\nproto.ontouchend = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerUp( event, touch );\n  }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n  this._pointerReset();\n  this._unbindPostStartEvents();\n  this.pointerDone();\n};\n\nproto._pointerReset = function() {\n  // reset properties\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerCancel( event, event );\n  }\n};\n\nproto.ontouchcancel = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerCancel( event, touch );\n  }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// -----  ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n  return {\n    x: pointer.pageX,\n    y: pointer.pageY\n  };\n};\n\n// -----  ----- //\n\nreturn Unipointer;\n\n}));\n});\n\nvar unidragger = createCommonjsModule(function (module) {\n/*!\n * Unidragger v2.4.0\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      unipointer\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n      window,\n      window.Unipointer\n    );\n  }\n\n}( window, function factory( window, Unipointer ) {\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n  this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n  // munge isAdd, default to true\n  isAdd = isAdd === undefined ? true : isAdd;\n  // bind each handle\n  var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n  var touchAction = isAdd ? this._touchActionValue : '';\n  for ( var i=0; i < this.handles.length; i++ ) {\n    var handle = this.handles[i];\n    this._bindStartEvent( handle, isAdd );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) {\n      handle.style.touchAction = touchAction;\n    }\n  }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  var isOkay = this.okayPointerDown( event );\n  if ( !isOkay ) {\n    return;\n  }\n  // track start event position\n  // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n\n  event.preventDefault();\n  this.pointerDownBlur();\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n  TEXTAREA: true,\n  INPUT: true,\n  SELECT: true,\n  OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n  radio: true,\n  checkbox: true,\n  button: true,\n  submit: true,\n  image: true,\n  file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n  var isCursorNode = cursorNodes[ event.target.nodeName ];\n  var isClickType = clickTypes[ event.target.type ];\n  var isOkay = !isCursorNode || isClickType;\n  if ( !isOkay ) {\n    this._pointerReset();\n  }\n  return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n  var focused = document.activeElement;\n  // do not blur body for IE10, metafizzy/flickity#117\n  var canBlur = focused && focused.blur && focused != document.body;\n  if ( canBlur ) {\n    focused.blur();\n  }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n  var moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY\n  };\n  // start drag if pointer has moved far enough to start drag\n  if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n    this._dragStart( event, pointer );\n  }\n  return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n  if ( this.isDragging ) {\n    this._dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this._staticClick( event, pointer );\n  }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  // prevent clicks\n  this.isPreventingClicks = true;\n  this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n  // do not drag if not dragging yet\n  if ( !this.isDragging ) {\n    return;\n  }\n\n  this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  event.preventDefault();\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n  // set flags\n  this.isDragging = false;\n  // re-enable clicking async\n  setTimeout( function() {\n    delete this.isPreventingClicks;\n  }.bind( this ) );\n\n  this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) {\n    event.preventDefault();\n  }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n    return;\n  }\n\n  this.staticClick( event, pointer );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( event.type != 'mouseup' ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 300ms\n    setTimeout( function() {\n      delete this.isIgnoringMouseUp;\n    }.bind( this ), 400 );\n  }\n};\n\nproto.staticClick = function( event, pointer ) {\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// -----  ----- //\n\nreturn Unidragger;\n\n}));\n});\n\nvar drag = createCommonjsModule(function (module) {\n// drag\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        flickity,\n        unidragger,\n        utils\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n        window,\n        window.Flickity,\n        window.Unidragger,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n} );\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// --------------------------  -------------------------- //\n\nproto._createDrag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'deactivate', this.onDeactivateDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable == '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  if ( this.isDraggable ) {\n    this.element.classList.add('is-draggable');\n  } else {\n    this.element.classList.remove('is-draggable');\n  }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n  this.options.draggable = true;\n  this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n  this.options.draggable = false;\n  this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    this._pointerDownDefault( event, pointer );\n    return;\n  }\n  var isOkay = this.okayPointerDown( event );\n  if ( !isOkay ) {\n    return;\n  }\n\n  this._pointerDownPreventDefault( event );\n  this.pointerDownFocus( event );\n  // blur\n  if ( document.activeElement != this.element ) {\n    // do not blur if already focused\n    this.pointerDownBlur();\n  }\n\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n\n  this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n  // track start event position\n  // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n  INPUT: true,\n  TEXTAREA: true,\n  SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  if ( !isFocusNode ) {\n    this.focus();\n  }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n  var isTouchStart = event.type == 'touchstart';\n  var isTouchPointer = event.pointerType == 'touch';\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n    event.preventDefault();\n  }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n  this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n  this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  var direction = this.options.rightToLeft ? -1 : 1;\n  if ( this.options.wrapAround ) {\n    // wrap around move. #589\n    moveVector.x %= this.slideableWidth;\n  }\n  var dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.options.wrapAround && this.slides.length ) {\n    // slow drag\n    var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n\n  this.dragMoveTime = new Date();\n  this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  if ( this.options.freeScroll ) {\n    this.isFreeScrolling = true;\n  }\n  // set selectedIndex based on where flick will end up\n  var index = this.dragEndRestingSelect();\n\n  if ( this.options.freeScroll && !this.options.wrapAround ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    var restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // TODO refactor this, selecting here feels weird\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.options.wrapAround;\n  this.select( index );\n  delete this.isDragSelect;\n  this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n  var restingX = this.getRestingPosition();\n  // how far away from selected slide\n  var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  var positiveResting = this._getClosestResting( restingX, distance, 1 );\n  var negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  var index = positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n  return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  var index = this.selectedIndex;\n  var minDistance = Infinity;\n  var condition = this.options.contain && !this.options.wrapAround ?\n    // if contain, keep going if distance is equal to minDistance\n    function( dist, minDist ) {\n      return dist <= minDist;\n    } : function( dist, minDist ) {\n      return dist < minDist;\n    };\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) {\n      break;\n    }\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment,\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n  var len = this.slides.length;\n  // wrap around if at least 2 slides\n  var isWrapAround = this.options.wrapAround && len > 1;\n  var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  var slide = this.slides[ slideIndex ];\n  if ( !slide ) {\n    return null;\n  }\n  // add distance for wrap-around slides\n  var wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  var delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n  // get clickedCell, if cell was clicked\n  var clickedCell = this.getParentCell( event.target );\n  var cellElem = clickedCell && clickedCell.element;\n  var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n  this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  var scroll = getScrollPosition();\n  var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this._pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset,\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n});\n\nvar prevNextButton = createCommonjsModule(function (module) {\n// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        flickity,\n        unipointer,\n        utils\n    );\n  } else {\n    // browser global\n    factory(\n        window,\n        window.Flickity,\n        window.Unipointer,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n  this.direction = direction;\n  this.parent = parent;\n  this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n  // properties\n  this.isEnabled = true;\n  this.isPrevious = this.direction == -1;\n  var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n  this.isLeft = this.direction == leftDirection;\n\n  var element = this.element = document.createElement('button');\n  element.className = 'flickity-button flickity-prev-next-button';\n  element.className += this.isPrevious ? ' previous' : ' next';\n  // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  // init as disabled\n  this.disable();\n\n  element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n  // create arrow\n  var svg = this.createSVG();\n  element.appendChild( svg );\n  // events\n  this.parent.on( 'select', this.update.bind( this ) );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n  this.bindStartEvent( this.element );\n  this.element.addEventListener( 'click', this );\n  // add to DOM\n  this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n  // remove from DOM\n  this.parent.element.removeChild( this.element );\n  // click events\n  this.unbindStartEvent( this.element );\n  this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n  var svg = document.createElementNS( svgURI, 'svg' );\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  var path = document.createElementNS( svgURI, 'path' );\n  var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n  }\n  svg.appendChild( path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) {\n    return shape;\n  }\n  // create movement string\n  return 'M ' + shape.x0 + ',50' +\n    ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n    ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n    ' L ' + shape.x3 + ',50 ' +\n    ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n    ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n    ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.parent.uiChange();\n  var method = this.isPrevious ? 'previous' : 'next';\n  this.parent[ method ]();\n};\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  if ( this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = false;\n  this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = true;\n  this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n  // index of first or last slide, if previous or next\n  var slides = this.parent.slides;\n  // enable is wrapAround and at least 2 slides\n  if ( this.parent.options.wrapAround && slides.length > 1 ) {\n    this.enable();\n    return;\n  }\n  var lastIndex = slides.length ? slides.length - 1 : 0;\n  var boundIndex = this.isPrevious ? 0 : lastIndex;\n  var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n  this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n  this.deactivate();\n  this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30,\n  },\n} );\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) {\n    return;\n  }\n\n  this.prevButton = new PrevNextButton( -1, this );\n  this.nextButton = new PrevNextButton( 1, this );\n\n  this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.activate();\n  this.nextButton.activate();\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.deactivate();\n  this.nextButton.deactivate();\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar pageDots = createCommonjsModule(function (module) {\n// page dots\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        flickity,\n        unipointer,\n        utils\n    );\n  } else {\n    // browser global\n    factory(\n        window,\n        window.Flickity,\n        window.Unipointer,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\nfunction PageDots( parent ) {\n  this.parent = parent;\n  this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n  // create holder element\n  this.holder = document.createElement('ol');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n  // events\n  this.handleClick = this.onClick.bind( this );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n  this.setDots();\n  this.holder.addEventListener( 'click', this.handleClick );\n  this.bindStartEvent( this.holder );\n  // add to DOM\n  this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n  this.holder.removeEventListener( 'click', this.handleClick );\n  this.unbindStartEvent( this.holder );\n  // remove from DOM\n  this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n  // get difference between number of slides and number of dots\n  var delta = this.parent.slides.length - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  var fragment = document.createDocumentFragment();\n  var newDots = [];\n  var length = this.dots.length;\n  var max = length + count;\n\n  for ( var i = length; i < max; i++ ) {\n    var dot = document.createElement('li');\n    dot.className = 'dot';\n    dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n    fragment.appendChild( dot );\n    newDots.push( dot );\n  }\n\n  this.holder.appendChild( fragment );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  var removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( function( dot ) {\n    this.holder.removeChild( dot );\n  }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.className = 'dot';\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) {\n    return;\n  }\n  this.selectedDot = this.dots[ this.parent.selectedIndex ];\n  this.selectedDot.className = 'dot is-selected';\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n  var target = event.target;\n  // only care about dot clicks\n  if ( target.nodeName != 'LI' ) {\n    return;\n  }\n\n  this.parent.uiChange();\n  var index = this.dots.indexOf( target );\n  this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n  this.deactivate();\n  this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pageDots: true,\n} );\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n  if ( !this.options.pageDots ) {\n    return;\n  }\n  this.pageDots = new PageDots( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n  this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.deactivate();\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar player = createCommonjsModule(function (module) {\n// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        evEmitter,\n        utils,\n        flickity\n    );\n  } else {\n    // browser global\n    factory(\n        window.EvEmitter,\n        window.fizzyUIUtils,\n        window.Flickity\n    );\n  }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n  this.parent = parent;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state == 'playing' ) {\n    return;\n  }\n  // do not play if page is hidden, start playing when page is visible\n  var isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state != 'playing' ) {\n    return;\n  }\n\n  var time = this.parent.options.autoPlay;\n  // default to 3 seconds\n  time = typeof time == 'number' ? time : 3000;\n  var _this = this;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( function() {\n    _this.parent.next( true );\n    _this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state == 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state == 'paused' ) {\n    this.play();\n  }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  var isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pauseAutoPlayOnHover: true,\n} );\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n  this.player = new Player( this );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) {\n    return;\n  }\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) {\n    return;\n  }\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar addRemoveCell = createCommonjsModule(function (module) {\n// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        flickity,\n        utils\n    );\n  } else {\n    // browser global\n    factory(\n        window,\n        window.Flickity,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  var fragment = document.createDocumentFragment();\n  cells.forEach( function( cell ) {\n    fragment.appendChild( cell.element );\n  } );\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n  var cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  var len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  var fragment = getCellsFragment( cells );\n  // append to slider\n  var isAppend = index == len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    var insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    var endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n  var cells = this.getCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n\n  var minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( function( cell ) {\n    cell.remove();\n    var index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  }, this );\n\n  this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  var cell = this.getCell( elem );\n  if ( !cell ) {\n    return;\n  }\n  cell.getSize();\n\n  var index = this.cells.indexOf( cell );\n  this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n * @param {Boolean} isPositioningSlider - Positions slider after selection\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n  var prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex\n  // try to maintain position & select previous selected element\n  var cell = this.getCell( prevSelectedElem );\n  if ( cell ) {\n    this.selectedIndex = this.getCellSlideIndex( cell );\n  }\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n  // do not position slider after lazy load\n  if ( isPositioningSlider ) {\n    this.positionSliderAtSelected();\n  }\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n});\n\nvar lazyload = createCommonjsModule(function (module) {\n// lazyload\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        flickity,\n        utils\n    );\n  } else {\n    // browser global\n    factory(\n        window,\n        window.Flickity,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, utils ) {\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n  this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n  var lazyLoad = this.options.lazyLoad;\n  if ( !lazyLoad ) {\n    return;\n  }\n  // get adjacent cells, use lazyLoad option for adjacent count\n  var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  var cellElems = this.getAdjacentCellElements( adjCount );\n  // get lazy images in those cells\n  var lazyImages = [];\n  cellElems.forEach( function( cellElem ) {\n    var lazyCellImages = getCellLazyImages( cellElem );\n    lazyImages = lazyImages.concat( lazyCellImages );\n  } );\n  // load lazy images\n  lazyImages.forEach( function( img ) {\n    new LazyLoader( img, this );\n  }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.nodeName == 'IMG' ) {\n    var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n    var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n    var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n    if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n      return [ cellElem ];\n    }\n  }\n  // select lazy images in cell\n  var lazySelector = 'img[data-flickity-lazyload], ' +\n    'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n  var imgs = cellElem.querySelectorAll( lazySelector );\n  return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Flickity} flickity - Flickity instance\n */\nfunction LazyLoader( img, flickity ) {\n  this.img = img;\n  this.flickity = flickity;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  var src = this.img.getAttribute('data-flickity-lazyload') ||\n    this.img.getAttribute('data-flickity-lazyload-src');\n  var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) {\n    this.img.setAttribute( 'srcset', srcset );\n  }\n  // remove attr\n  this.img.removeAttribute('data-flickity-lazyload');\n  this.img.removeAttribute('data-flickity-lazyload-src');\n  this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n\n  var cell = this.flickity.getParentCell( this.img );\n  var cellElem = cell && cell.element;\n  this.flickity.cellSizeChange( cellElem );\n\n  this.img.classList.add( className );\n  this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n});\n\nvar js = createCommonjsModule(function (module) {\n/*!\n * Flickity v2.3.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2021 Metafizzy\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if (  module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        flickity,\n        drag,\n        prevNextButton,\n        pageDots,\n        player,\n        addRemoveCell,\n        lazyload\n    );\n  }\n\n} )( window, function factory( Flickity ) {\n  return Flickity;\n} );\n});\n\nvar ComplementaryProducts = /*#__PURE__*/function () {\n  function ComplementaryProducts(options) {\n    _classCallCheck(this, ComplementaryProducts);\n\n    this.sectionEl = options.sectionEl;\n    this.sectionId = options.sectionId;\n    this.events = new EventHandler();\n    this.productId = options.productId;\n    this.includeIndicatorDots = options.includeIndicatorDots || false;\n    this.recommendationsRoute = options.productRecommendationsRoute;\n    this.limit = options.limit;\n    var defaultArrowShape = {\n      x0: 10,\n      x1: 60,\n      y1: 50,\n      x2: 65,\n      y2: 45,\n      x3: 20\n    };\n    this.arrowShape = options.arrowShape || defaultArrowShape;\n    this.recommendationsEl = this.sectionEl.querySelector('[data-complementary-products]');\n    this.loadRecommendations();\n  }\n\n  _createClass(ComplementaryProducts, [{\n    key: \"loadRecommendations\",\n    value: function loadRecommendations() {\n      var _this = this;\n\n      var url = \"\".concat(this.recommendationsRoute, \"?section_id=\").concat(this.sectionId, \"&limit=\").concat(this.limit, \"&product_id=\").concat(this.productId, \"&intent=complementary\");\n      AsyncView.load(url, {\n        view: ''\n      }).then(function (_ref) {\n        var html = _ref.html;\n        if (_typeof(html) === 'object' && Object.keys(html).length === 0) return;\n\n        if (html.trim().length === 0) {\n          _this.recommendationsEl.classList.add('complementary-products--no-recommendations');\n\n          return;\n        }\n\n        _this.recommendationsEl.innerHTML = html;\n\n        if (!_pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.instance) {\n          _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.init();\n        }\n\n        _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(_this.recommendationsEl);\n\n        var slider = _this.recommendationsEl.querySelector('[data-slider]');\n\n        var slides = _this.recommendationsEl.querySelectorAll('[data-slide]');\n\n        if (slides.length > 1) {\n          _this.slider = new js(slider, {\n            cellSelector: '[data-slide]',\n            accessibility: false,\n            adaptiveHeight: false,\n            autoPlay: false,\n            cellAlign: 'left',\n            contain: true,\n            imagesLoaded: true,\n            pageDots: _this.includeIndicatorDots,\n            wrapAround: true,\n            arrowShape: _this.arrowShape\n          });\n\n          _this.events.register(slider, 'rimg:load', function () {\n            _this.slider.resize();\n          });\n        }\n      });\n    }\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      this.slider.destroy();\n    }\n  }]);\n\n  return ComplementaryProducts;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ComplementaryProducts);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLWNvbXBsZW1lbnRhcnktcHJvZHVjdHMvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLWNvbXBsZW1lbnRhcnktcHJvZHVjdHMvZGlzdC9pbmRleC5lcy5qcz8xNzE0Il0sInNvdXJjZXNDb250ZW50IjpbIlxuLyohXG4gKiBAcGl4ZWx1bmlvbi9weHMtY29tcGxlbWVudGFyeS1wcm9kdWN0cyB2My41LjNcbiAqIChjKSAyMDIyIFBpeGVsIFVuaW9uXG4gKi9cblxuaW1wb3J0IHJpbWcgZnJvbSAnQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5JztcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbnZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5mdW5jdGlvbiB1bndyYXBFeHBvcnRzICh4KSB7XG5cdHJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ2RlZmF1bHQnKSA/IHhbJ2RlZmF1bHQnXSA6IHg7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBtb2R1bGUpIHtcblx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xufVxuXG52YXIgRXZlbnRIYW5kbGVyXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIEV2ZW50SGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoZWwsIGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7IGVsOiBlbCwgZXZlbnQ6IGV2ZW50LCBsaXN0ZW5lcjogbGlzdGVuZXIgfSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBlbCA9IF9hLmVsLCBldmVudCA9IF9hLmV2ZW50LCBsaXN0ZW5lciA9IF9hLmxpc3RlbmVyO1xuICAgICAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSB0aGlzLmV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVsICE9PSBlLmVsXG4gICAgICAgICAgICB8fCBldmVudCAhPT0gZS5ldmVudCB8fCBsaXN0ZW5lciAhPT0gZS5saXN0ZW5lcjsgfSk7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIGVsID0gX2EuZWwsIGV2ZW50ID0gX2EuZXZlbnQsIGxpc3RlbmVyID0gX2EubGlzdGVuZXI7XG4gICAgICAgICAgICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB9O1xuICAgIHJldHVybiBFdmVudEhhbmRsZXI7XG59KCkpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFdmVudEhhbmRsZXI7XG59KTtcblxudmFyIEV2ZW50SGFuZGxlciA9IHVud3JhcEV4cG9ydHMoRXZlbnRIYW5kbGVyXzEpO1xuXG4vKiFcbiAgICogQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcgdjIuMC41XG4gICAqIChjKSAyMDIwIFBpeGVsIFVuaW9uXG4gICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkMSh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDEoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obik7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG52YXIgZGVmZXJyZWQgPSB7fTtcblxudmFyIEFzeW5jVmlldyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFzeW5jVmlldygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBBc3luY1ZpZXcpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzJDEoQXN5bmNWaWV3LCBudWxsLCBbe1xuICAgIGtleTogXCJsb2FkXCIsXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSB0ZW1wbGF0ZSBnaXZlbiBieSB0aGUgcHJvdmlkZWQgVVJMIGludG8gdGhlIHByb3ZpZGVkXG4gICAgICogdmlld1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSB1cmwgdG8gbG9hZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBxdWVyeSAtIEFuIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyBvZiB0aGUgVVJMXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5LnZpZXcgLSBBIHJlcXVpcmVkIHF1ZXJ5IHBhcmFtZXRlciBpbmRpY2F0aW5nIHdoaWNoIHZpZXcgdG8gbG9hZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBDb25maWcgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5oYXNoXSAtIEEgaGFzaCBvZiB0aGUgY3VycmVudCBwYWdlIGNvbnRlbnRcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZCh1cmwpIHtcbiAgICAgIHZhciBxdWVyeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICAgIGlmICghKCd2aWV3JyBpbiBxdWVyeSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignXFwndmlld1xcJyBub3QgZm91bmQgaW4gXFwncXVlcnlcXCcgcGFyYW1ldGVyJykpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcXVlcnlsZXNzVXJsID0gdXJsLnJlcGxhY2UoL1xcP1teI10rLywgJycpO1xuICAgICAgdmFyIHF1ZXJ5UGFyYW1zU3RyaW5nID0gbmV3IFJlZ0V4cCgvLitcXD8oW14jXSspLykuZXhlYyh1cmwpO1xuICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gcXVlcnk7XG5cbiAgICAgIGlmIChxdWVyeVBhcmFtc1N0cmluZyAmJiBxdWVyeVBhcmFtc1N0cmluZy5sZW5ndGggPj0gMikge1xuICAgICAgICBxdWVyeVBhcmFtc1N0cmluZ1sxXS5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgdmFyIF9wYXJhbSRzcGxpdCA9IHBhcmFtLnNwbGl0KCc9JyksXG4gICAgICAgICAgICAgIF9wYXJhbSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfcGFyYW0kc3BsaXQsIDIpLFxuICAgICAgICAgICAgICBrZXkgPSBfcGFyYW0kc3BsaXQyWzBdLFxuICAgICAgICAgICAgICB2YWx1ZSA9IF9wYXJhbSRzcGxpdDJbMV07XG5cbiAgICAgICAgICBxdWVyeVBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSAvLyBOT1RFOiBXZSdyZSBhZGRpbmcgYW4gYWRkaXRpb25hbCB0aW1lc3RhbXAgdG8gdGhlIHF1ZXJ5LlxuICAgICAgLy8gVGhpcyBpcyB0byBwcmV2ZW50IGNlcnRhaW4gYnJvd3NlcnMgZnJvbSByZXR1cm5pbmcgY2FjaGVkXG4gICAgICAvLyB2ZXJzaW9ucyBvZiB0aGUgdXJsIHdlIGFyZSByZXF1ZXN0aW5nLlxuICAgICAgLy8gU2VlIHRoaXMgUFIgZm9yIG1vcmUgaW5mbzogaHR0cHM6Ly9naXRodWIuY29tL3BpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcvcHVsbC80XG5cblxuICAgICAgdmFyIGNhY2hlYnVzdGluZ1BhcmFtcyA9IF9vYmplY3RTcHJlYWQyKHt9LCBxdWVyeVBhcmFtcywge1xuICAgICAgICBfOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBoYXNoVXJsID0gcXVlcnlsZXNzVXJsLnJlcGxhY2UoLyhbXiNdKykoLiopLywgZnVuY3Rpb24gKG1hdGNoLCBhZGRyZXNzLCBoYXNoKSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChhZGRyZXNzLCBcIj9cIikuY29uY2F0KE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoa2V5LCBcIj1cIikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtc1trZXldKSk7XG4gICAgICAgIH0pLmpvaW4oJyYnKSkuY29uY2F0KGhhc2gpO1xuICAgICAgfSk7XG4gICAgICB2YXIgcmVxdWVzdFVybCA9IHF1ZXJ5bGVzc1VybC5yZXBsYWNlKC8oW14jXSspKC4qKS8sIGZ1bmN0aW9uIChtYXRjaCwgYWRkcmVzcywgaGFzaCkge1xuICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoYWRkcmVzcywgXCI/XCIpLmNvbmNhdChPYmplY3Qua2V5cyhjYWNoZWJ1c3RpbmdQYXJhbXMpLnNvcnQoKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXksIFwiPVwiKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlYnVzdGluZ1BhcmFtc1trZXldKSk7XG4gICAgICAgIH0pLmpvaW4oJyYnKSkuY29uY2F0KGhhc2gpO1xuICAgICAgfSk7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGRhdGE7XG5cbiAgICAgICAgaWYgKGhhc2hVcmwgaW4gZGVmZXJyZWQpIHtcbiAgICAgICAgICByZXNvbHZlKGRlZmVycmVkW2hhc2hVcmxdKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWZlcnJlZFtoYXNoVXJsXSA9IHByb21pc2U7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgICAgICAgIGRhdGEgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGhhc2hVcmwpO1xuXG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBkZXNlcmlhbGl6ZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNoID09PSBkZXNlcmlhbGl6ZWQub3B0aW9ucy5oYXNoKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBkZWZlcnJlZFtoYXNoVXJsXTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShkZXNlcmlhbGl6ZWQpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbignR0VUJywgcmVxdWVzdFVybCwgdHJ1ZSk7XG5cbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgZWwgPSB4aHIucmVzcG9uc2U7XG4gICAgICAgICAgdmFyIG5ld09wdGlvbnMgPSB7fTtcbiAgICAgICAgICB2YXIgb3B0aW9uc0VsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtb3B0aW9uc10nKTtcblxuICAgICAgICAgIGlmIChvcHRpb25zRWwgJiYgb3B0aW9uc0VsLmlubmVySFRNTCkge1xuICAgICAgICAgICAgbmV3T3B0aW9ucyA9IEpTT04ucGFyc2UoZWwucXVlcnlTZWxlY3RvcignW2RhdGEtb3B0aW9uc10nKS5pbm5lckhUTUwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBodG1sRWxzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtaHRtbF0nKTtcbiAgICAgICAgICB2YXIgbmV3SHRtbCA9IHt9O1xuXG4gICAgICAgICAgaWYgKGh0bWxFbHMubGVuZ3RoID09PSAxICYmIGh0bWxFbHNbMF0uZ2V0QXR0cmlidXRlKCdkYXRhLWh0bWwnKSA9PT0gJycpIHtcbiAgICAgICAgICAgIG5ld0h0bWwgPSBodG1sRWxzWzBdLmlubmVySFRNTDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG1sRWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIG5ld0h0bWxbaHRtbEVsc1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaHRtbCcpXSA9IGh0bWxFbHNbaV0uaW5uZXJIVE1MO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBkYXRhRWxzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZGF0YV0nKTtcbiAgICAgICAgICB2YXIgbmV3RGF0YSA9IHt9O1xuXG4gICAgICAgICAgaWYgKGRhdGFFbHMubGVuZ3RoID09PSAxICYmIGRhdGFFbHNbMF0uZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGEnKSA9PT0gJycpIHtcbiAgICAgICAgICAgIG5ld0RhdGEgPSBKU09OLnBhcnNlKGRhdGFFbHNbMF0uaW5uZXJIVE1MKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRhdGFFbHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIG5ld0RhdGFbZGF0YUVsc1tfaV0uZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGEnKV0gPSBKU09OLnBhcnNlKGRhdGFFbHNbX2ldLmlubmVySFRNTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShoYXNoVXJsLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgb3B0aW9uczogbmV3T3B0aW9ucyxcbiAgICAgICAgICAgICAgICBkYXRhOiBuZXdEYXRhLFxuICAgICAgICAgICAgICAgIGh0bWw6IG5ld0h0bWxcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVsZXRlIGRlZmVycmVkW2hhc2hVcmxdO1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgZGF0YTogbmV3RGF0YSxcbiAgICAgICAgICAgIGh0bWw6IG5ld0h0bWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkZWxldGUgZGVmZXJyZWRbaGFzaFVybF07XG4gICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBc3luY1ZpZXc7XG59KCk7XG5cbnZhciBldkVtaXR0ZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKipcbiAqIEV2RW1pdHRlciB2MS4xLjBcbiAqIExpbCcgZXZlbnQgZW1pdHRlclxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4vKiBqc2hpbnQgdW51c2VkOiB0cnVlLCB1bmRlZjogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHdpbmRvdyAqL1xuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KUyAtIEJyb3dzZXJpZnksIFdlYnBhY2tcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCcm93c2VyIGdsb2JhbHNcbiAgICBnbG9iYWwuRXZFbWl0dGVyID0gZmFjdG9yeSgpO1xuICB9XG5cbn0oIHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBjb21tb25qc0dsb2JhbCwgZnVuY3Rpb24oKSB7XG5cbmZ1bmN0aW9uIEV2RW1pdHRlcigpIHt9XG5cbnZhciBwcm90byA9IEV2RW1pdHRlci5wcm90b3R5cGU7XG5cbnByb3RvLm9uID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIGlmICggIWV2ZW50TmFtZSB8fCAhbGlzdGVuZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHNldCBldmVudHMgaGFzaFxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICAvLyBzZXQgbGlzdGVuZXJzIGFycmF5XG4gIHZhciBsaXN0ZW5lcnMgPSBldmVudHNbIGV2ZW50TmFtZSBdID0gZXZlbnRzWyBldmVudE5hbWUgXSB8fCBbXTtcbiAgLy8gb25seSBhZGQgb25jZVxuICBpZiAoIGxpc3RlbmVycy5pbmRleE9mKCBsaXN0ZW5lciApID09IC0xICkge1xuICAgIGxpc3RlbmVycy5wdXNoKCBsaXN0ZW5lciApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5vbmNlID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIGlmICggIWV2ZW50TmFtZSB8fCAhbGlzdGVuZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGFkZCBldmVudFxuICB0aGlzLm9uKCBldmVudE5hbWUsIGxpc3RlbmVyICk7XG4gIC8vIHNldCBvbmNlIGZsYWdcbiAgLy8gc2V0IG9uY2VFdmVudHMgaGFzaFxuICB2YXIgb25jZUV2ZW50cyA9IHRoaXMuX29uY2VFdmVudHMgPSB0aGlzLl9vbmNlRXZlbnRzIHx8IHt9O1xuICAvLyBzZXQgb25jZUxpc3RlbmVycyBvYmplY3RcbiAgdmFyIG9uY2VMaXN0ZW5lcnMgPSBvbmNlRXZlbnRzWyBldmVudE5hbWUgXSA9IG9uY2VFdmVudHNbIGV2ZW50TmFtZSBdIHx8IHt9O1xuICAvLyBzZXQgZmxhZ1xuICBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLm9mZiA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzICYmIHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF07XG4gIGlmICggIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YoIGxpc3RlbmVyICk7XG4gIGlmICggaW5kZXggIT0gLTEgKSB7XG4gICAgbGlzdGVuZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8uZW1pdEV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgYXJncyApIHtcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdO1xuICBpZiAoICFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGNvcHkgb3ZlciB0byBhdm9pZCBpbnRlcmZlcmVuY2UgaWYgLm9mZigpIGluIGxpc3RlbmVyXG4gIGxpc3RlbmVycyA9IGxpc3RlbmVycy5zbGljZSgwKTtcbiAgYXJncyA9IGFyZ3MgfHwgW107XG4gIC8vIG9uY2Ugc3R1ZmZcbiAgdmFyIG9uY2VMaXN0ZW5lcnMgPSB0aGlzLl9vbmNlRXZlbnRzICYmIHRoaXMuX29uY2VFdmVudHNbIGV2ZW50TmFtZSBdO1xuXG4gIGZvciAoIHZhciBpPTA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgIHZhciBpc09uY2UgPSBvbmNlTGlzdGVuZXJzICYmIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgaWYgKCBpc09uY2UgKSB7XG4gICAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICAgIC8vIHJlbW92ZSBiZWZvcmUgdHJpZ2dlciB0byBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgdGhpcy5vZmYoIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgICAgIC8vIHVuc2V0IG9uY2UgZmxhZ1xuICAgICAgZGVsZXRlIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgfVxuICAgIC8vIHRyaWdnZXIgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5hcHBseSggdGhpcywgYXJncyApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5hbGxPZmYgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuX2V2ZW50cztcbiAgZGVsZXRlIHRoaXMuX29uY2VFdmVudHM7XG59O1xuXG5yZXR1cm4gRXZFbWl0dGVyO1xuXG59KSk7XG59KTtcblxudmFyIGdldFNpemUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKiFcbiAqIGdldFNpemUgdjIuMC4zXG4gKiBtZWFzdXJlIHNpemUgb2YgZWxlbWVudHNcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLyoganNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuLyogZ2xvYmFscyBjb25zb2xlOiBmYWxzZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUgKi9cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5nZXRTaXplID0gZmFjdG9yeSgpO1xuICB9XG5cbn0pKCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoKSB7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZ2V0IGEgbnVtYmVyIGZyb20gYSBzdHJpbmcsIG5vdCBhIHBlcmNlbnRhZ2VcbmZ1bmN0aW9uIGdldFN0eWxlU2l6ZSggdmFsdWUgKSB7XG4gIHZhciBudW0gPSBwYXJzZUZsb2F0KCB2YWx1ZSApO1xuICAvLyBub3QgYSBwZXJjZW50IGxpa2UgJzEwMCUnLCBhbmQgYSBudW1iZXJcbiAgdmFyIGlzVmFsaWQgPSB2YWx1ZS5pbmRleE9mKCclJykgPT0gLTEgJiYgIWlzTmFOKCBudW0gKTtcbiAgcmV0dXJuIGlzVmFsaWQgJiYgbnVtO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIGxvZ0Vycm9yID0gdHlwZW9mIGNvbnNvbGUgPT0gJ3VuZGVmaW5lZCcgPyBub29wIDpcbiAgZnVuY3Rpb24oIG1lc3NhZ2UgKSB7XG4gICAgY29uc29sZS5lcnJvciggbWVzc2FnZSApO1xuICB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZWFzdXJlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudmFyIG1lYXN1cmVtZW50cyA9IFtcbiAgJ3BhZGRpbmdMZWZ0JyxcbiAgJ3BhZGRpbmdSaWdodCcsXG4gICdwYWRkaW5nVG9wJyxcbiAgJ3BhZGRpbmdCb3R0b20nLFxuICAnbWFyZ2luTGVmdCcsXG4gICdtYXJnaW5SaWdodCcsXG4gICdtYXJnaW5Ub3AnLFxuICAnbWFyZ2luQm90dG9tJyxcbiAgJ2JvcmRlckxlZnRXaWR0aCcsXG4gICdib3JkZXJSaWdodFdpZHRoJyxcbiAgJ2JvcmRlclRvcFdpZHRoJyxcbiAgJ2JvcmRlckJvdHRvbVdpZHRoJ1xuXTtcblxudmFyIG1lYXN1cmVtZW50c0xlbmd0aCA9IG1lYXN1cmVtZW50cy5sZW5ndGg7XG5cbmZ1bmN0aW9uIGdldFplcm9TaXplKCkge1xuICB2YXIgc2l6ZSA9IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgaW5uZXJXaWR0aDogMCxcbiAgICBpbm5lckhlaWdodDogMCxcbiAgICBvdXRlcldpZHRoOiAwLFxuICAgIG91dGVySGVpZ2h0OiAwXG4gIH07XG4gIGZvciAoIHZhciBpPTA7IGkgPCBtZWFzdXJlbWVudHNMZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlbWVudHNbaV07XG4gICAgc2l6ZVsgbWVhc3VyZW1lbnQgXSA9IDA7XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldFN0eWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogZ2V0U3R5bGUsIGdldCBzdHlsZSBvZiBlbGVtZW50LCBjaGVjayBmb3IgRmlyZWZveCBidWdcbiAqIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTU0ODM5N1xuICovXG5mdW5jdGlvbiBnZXRTdHlsZSggZWxlbSApIHtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuICBpZiAoICFzdHlsZSApIHtcbiAgICBsb2dFcnJvciggJ1N0eWxlIHJldHVybmVkICcgKyBzdHlsZSArXG4gICAgICAnLiBBcmUgeW91IHJ1bm5pbmcgdGhpcyBjb2RlIGluIGEgaGlkZGVuIGlmcmFtZSBvbiBGaXJlZm94PyAnICtcbiAgICAgICdTZWUgaHR0cHM6Ly9iaXQubHkvZ2V0c2l6ZWJ1ZzEnICk7XG4gIH1cbiAgcmV0dXJuIHN0eWxlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgaXNTZXR1cCA9IGZhbHNlO1xuXG52YXIgaXNCb3hTaXplT3V0ZXI7XG5cbi8qKlxuICogc2V0dXBcbiAqIGNoZWNrIGlzQm94U2l6ZXJPdXRlclxuICogZG8gb24gZmlyc3QgZ2V0U2l6ZSgpIHJhdGhlciB0aGFuIG9uIHBhZ2UgbG9hZCBmb3IgRmlyZWZveCBidWdcbiAqL1xuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIC8vIHNldHVwIG9uY2VcbiAgaWYgKCBpc1NldHVwICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc1NldHVwID0gdHJ1ZTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBib3ggc2l6aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLyoqXG4gICAqIENocm9tZSAmIFNhZmFyaSBtZWFzdXJlIHRoZSBvdXRlci13aWR0aCBvbiBzdHlsZS53aWR0aCBvbiBib3JkZXItYm94IGVsZW1zXG4gICAqIElFMTEgJiBGaXJlZm94PDI5IG1lYXN1cmVzIHRoZSBpbm5lci13aWR0aFxuICAgKi9cbiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkaXYuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuICBkaXYuc3R5bGUucGFkZGluZyA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnO1xuICBkaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4IDJweCAzcHggNHB4JztcbiAgZGl2LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcblxuICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICBib2R5LmFwcGVuZENoaWxkKCBkaXYgKTtcbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoIGRpdiApO1xuICAvLyByb3VuZCB2YWx1ZSBmb3IgYnJvd3NlciB6b29tLiBkZXNhbmRyby9tYXNvbnJ5IzkyOFxuICBpc0JveFNpemVPdXRlciA9IE1hdGgucm91bmQoIGdldFN0eWxlU2l6ZSggc3R5bGUud2lkdGggKSApID09IDIwMDtcbiAgZ2V0U2l6ZS5pc0JveFNpemVPdXRlciA9IGlzQm94U2l6ZU91dGVyO1xuXG4gIGJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXRTaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIGdldFNpemUoIGVsZW0gKSB7XG4gIHNldHVwKCk7XG5cbiAgLy8gdXNlIHF1ZXJ5U2VsZXRvciBpZiBlbGVtIGlzIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBlbGVtID09ICdzdHJpbmcnICkge1xuICAgIGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBlbGVtICk7XG4gIH1cblxuICAvLyBkbyBub3QgcHJvY2VlZCBvbiBub24tb2JqZWN0c1xuICBpZiAoICFlbGVtIHx8IHR5cGVvZiBlbGVtICE9ICdvYmplY3QnIHx8ICFlbGVtLm5vZGVUeXBlICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IGdldFN0eWxlKCBlbGVtICk7XG5cbiAgLy8gaWYgaGlkZGVuLCBldmVyeXRoaW5nIGlzIDBcbiAgaWYgKCBzdHlsZS5kaXNwbGF5ID09ICdub25lJyApIHtcbiAgICByZXR1cm4gZ2V0WmVyb1NpemUoKTtcbiAgfVxuXG4gIHZhciBzaXplID0ge307XG4gIHNpemUud2lkdGggPSBlbGVtLm9mZnNldFdpZHRoO1xuICBzaXplLmhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0O1xuXG4gIHZhciBpc0JvcmRlckJveCA9IHNpemUuaXNCb3JkZXJCb3ggPSBzdHlsZS5ib3hTaXppbmcgPT0gJ2JvcmRlci1ib3gnO1xuXG4gIC8vIGdldCBhbGwgbWVhc3VyZW1lbnRzXG4gIGZvciAoIHZhciBpPTA7IGkgPCBtZWFzdXJlbWVudHNMZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlbWVudHNbaV07XG4gICAgdmFyIHZhbHVlID0gc3R5bGVbIG1lYXN1cmVtZW50IF07XG4gICAgdmFyIG51bSA9IHBhcnNlRmxvYXQoIHZhbHVlICk7XG4gICAgLy8gYW55ICdhdXRvJywgJ21lZGl1bScgdmFsdWUgd2lsbCBiZSAwXG4gICAgc2l6ZVsgbWVhc3VyZW1lbnQgXSA9ICFpc05hTiggbnVtICkgPyBudW0gOiAwO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdXaWR0aCA9IHNpemUucGFkZGluZ0xlZnQgKyBzaXplLnBhZGRpbmdSaWdodDtcbiAgdmFyIHBhZGRpbmdIZWlnaHQgPSBzaXplLnBhZGRpbmdUb3AgKyBzaXplLnBhZGRpbmdCb3R0b207XG4gIHZhciBtYXJnaW5XaWR0aCA9IHNpemUubWFyZ2luTGVmdCArIHNpemUubWFyZ2luUmlnaHQ7XG4gIHZhciBtYXJnaW5IZWlnaHQgPSBzaXplLm1hcmdpblRvcCArIHNpemUubWFyZ2luQm90dG9tO1xuICB2YXIgYm9yZGVyV2lkdGggPSBzaXplLmJvcmRlckxlZnRXaWR0aCArIHNpemUuYm9yZGVyUmlnaHRXaWR0aDtcbiAgdmFyIGJvcmRlckhlaWdodCA9IHNpemUuYm9yZGVyVG9wV2lkdGggKyBzaXplLmJvcmRlckJvdHRvbVdpZHRoO1xuXG4gIHZhciBpc0JvcmRlckJveFNpemVPdXRlciA9IGlzQm9yZGVyQm94ICYmIGlzQm94U2l6ZU91dGVyO1xuXG4gIC8vIG92ZXJ3cml0ZSB3aWR0aCBhbmQgaGVpZ2h0IGlmIHdlIGNhbiBnZXQgaXQgZnJvbSBzdHlsZVxuICB2YXIgc3R5bGVXaWR0aCA9IGdldFN0eWxlU2l6ZSggc3R5bGUud2lkdGggKTtcbiAgaWYgKCBzdHlsZVdpZHRoICE9PSBmYWxzZSApIHtcbiAgICBzaXplLndpZHRoID0gc3R5bGVXaWR0aCArXG4gICAgICAvLyBhZGQgcGFkZGluZyBhbmQgYm9yZGVyIHVubGVzcyBpdCdzIGFscmVhZHkgaW5jbHVkaW5nIGl0XG4gICAgICAoIGlzQm9yZGVyQm94U2l6ZU91dGVyID8gMCA6IHBhZGRpbmdXaWR0aCArIGJvcmRlcldpZHRoICk7XG4gIH1cblxuICB2YXIgc3R5bGVIZWlnaHQgPSBnZXRTdHlsZVNpemUoIHN0eWxlLmhlaWdodCApO1xuICBpZiAoIHN0eWxlSGVpZ2h0ICE9PSBmYWxzZSApIHtcbiAgICBzaXplLmhlaWdodCA9IHN0eWxlSGVpZ2h0ICtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgdW5sZXNzIGl0J3MgYWxyZWFkeSBpbmNsdWRpbmcgaXRcbiAgICAgICggaXNCb3JkZXJCb3hTaXplT3V0ZXIgPyAwIDogcGFkZGluZ0hlaWdodCArIGJvcmRlckhlaWdodCApO1xuICB9XG5cbiAgc2l6ZS5pbm5lcldpZHRoID0gc2l6ZS53aWR0aCAtICggcGFkZGluZ1dpZHRoICsgYm9yZGVyV2lkdGggKTtcbiAgc2l6ZS5pbm5lckhlaWdodCA9IHNpemUuaGVpZ2h0IC0gKCBwYWRkaW5nSGVpZ2h0ICsgYm9yZGVySGVpZ2h0ICk7XG5cbiAgc2l6ZS5vdXRlcldpZHRoID0gc2l6ZS53aWR0aCArIG1hcmdpbldpZHRoO1xuICBzaXplLm91dGVySGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyBtYXJnaW5IZWlnaHQ7XG5cbiAgcmV0dXJuIHNpemU7XG59XG5cbnJldHVybiBnZXRTaXplO1xuXG59KTtcbn0pO1xuXG52YXIgbWF0Y2hlc1NlbGVjdG9yID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLyoqXG4gKiBtYXRjaGVzU2VsZWN0b3IgdjIuMC4yXG4gKiBtYXRjaGVzU2VsZWN0b3IoIGVsZW1lbnQsICcuc2VsZWN0b3InIClcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgc3RyaWN0OiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cubWF0Y2hlc1NlbGVjdG9yID0gZmFjdG9yeSgpO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSgpIHtcblxuICB2YXIgbWF0Y2hlc01ldGhvZCA9ICggZnVuY3Rpb24oKSB7XG4gICAgdmFyIEVsZW1Qcm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTtcbiAgICAvLyBjaGVjayBmb3IgdGhlIHN0YW5kYXJkIG1ldGhvZCBuYW1lIGZpcnN0XG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlcyApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlcyc7XG4gICAgfVxuICAgIC8vIGNoZWNrIHVuLXByZWZpeGVkXG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuICdtYXRjaGVzU2VsZWN0b3InO1xuICAgIH1cbiAgICAvLyBjaGVjayB2ZW5kb3IgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4ZXMgPSBbICd3ZWJraXQnLCAnbW96JywgJ21zJywgJ28nIF07XG5cbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICB2YXIgcHJlZml4ID0gcHJlZml4ZXNbaV07XG4gICAgICB2YXIgbWV0aG9kID0gcHJlZml4ICsgJ01hdGNoZXNTZWxlY3Rvcic7XG4gICAgICBpZiAoIEVsZW1Qcm90b1sgbWV0aG9kIF0gKSB7XG4gICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IoIGVsZW0sIHNlbGVjdG9yICkge1xuICAgIHJldHVybiBlbGVtWyBtYXRjaGVzTWV0aG9kIF0oIHNlbGVjdG9yICk7XG4gIH07XG5cbn0pKTtcbn0pO1xuXG52YXIgdXRpbHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKipcbiAqIEZpenp5IFVJIHV0aWxzIHYyLjAuN1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIG1hdGNoZXNTZWxlY3RvclxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuZml6enlVSVV0aWxzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5tYXRjaGVzU2VsZWN0b3JcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBtYXRjaGVzU2VsZWN0b3IgKSB7XG5cbnZhciB1dGlscyA9IHt9O1xuXG4vLyAtLS0tLSBleHRlbmQgLS0tLS0gLy9cblxuLy8gZXh0ZW5kcyBvYmplY3RzXG51dGlscy5leHRlbmQgPSBmdW5jdGlvbiggYSwgYiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gYiApIHtcbiAgICBhWyBwcm9wIF0gPSBiWyBwcm9wIF07XG4gIH1cbiAgcmV0dXJuIGE7XG59O1xuXG4vLyAtLS0tLSBtb2R1bG8gLS0tLS0gLy9cblxudXRpbHMubW9kdWxvID0gZnVuY3Rpb24oIG51bSwgZGl2ICkge1xuICByZXR1cm4gKCAoIG51bSAlIGRpdiApICsgZGl2ICkgJSBkaXY7XG59O1xuXG4vLyAtLS0tLSBtYWtlQXJyYXkgLS0tLS0gLy9cblxudmFyIGFycmF5U2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8vIHR1cm4gZWxlbWVudCBvciBub2RlTGlzdCBpbnRvIGFuIGFycmF5XG51dGlscy5tYWtlQXJyYXkgPSBmdW5jdGlvbiggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLy8gcmV0dXJuIGVtcHR5IGFycmF5IGlmIHVuZGVmaW5lZCBvciBudWxsLiAjNlxuICBpZiAoIG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn07XG5cbi8vIC0tLS0tIHJlbW92ZUZyb20gLS0tLS0gLy9cblxudXRpbHMucmVtb3ZlRnJvbSA9IGZ1bmN0aW9uKCBhcnksIG9iaiApIHtcbiAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YoIG9iaiApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGFyeS5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGdldFBhcmVudCAtLS0tLSAvL1xuXG51dGlscy5nZXRQYXJlbnQgPSBmdW5jdGlvbiggZWxlbSwgc2VsZWN0b3IgKSB7XG4gIHdoaWxlICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0gIT0gZG9jdW1lbnQuYm9keSApIHtcbiAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRRdWVyeUVsZW1lbnQgLS0tLS0gLy9cblxuLy8gdXNlIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG51dGlscy5nZXRRdWVyeUVsZW1lbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWxlbSApO1xuICB9XG4gIHJldHVybiBlbGVtO1xufTtcblxuLy8gLS0tLS0gaGFuZGxlRXZlbnQgLS0tLS0gLy9cblxuLy8gZW5hYmxlIC5vbnR5cGUgdG8gdHJpZ2dlciBmcm9tIC5hZGRFdmVudExpc3RlbmVyKCBlbGVtLCAndHlwZScgKVxudXRpbHMuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZmlsdGVyRmluZEVsZW1lbnRzIC0tLS0tIC8vXG5cbnV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcywgc2VsZWN0b3IgKSB7XG4gIC8vIG1ha2UgYXJyYXkgb2YgZWxlbXNcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBmZkVsZW1zID0gW107XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gY2hlY2sgdGhhdCBlbGVtIGlzIGFuIGFjdHVhbCBlbGVtZW50XG4gICAgaWYgKCAhKCBlbGVtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYWRkIGVsZW0gaWYgbm8gc2VsZWN0b3JcbiAgICBpZiAoICFzZWxlY3RvciApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYSBzZWxlY3RvclxuICAgIC8vIGZpbHRlclxuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBlbGVtICk7XG4gICAgfVxuICAgIC8vIGZpbmQgY2hpbGRyZW5cbiAgICB2YXIgY2hpbGRFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKTtcbiAgICAvLyBjb25jYXQgY2hpbGRFbGVtcyB0byBmaWx0ZXJGb3VuZCBhcnJheVxuICAgIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBjaGlsZEVsZW1zW2ldICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZmZFbGVtcztcbn07XG5cbi8vIC0tLS0tIGRlYm91bmNlTWV0aG9kIC0tLS0tIC8vXG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kID0gZnVuY3Rpb24oIF9jbGFzcywgbWV0aG9kTmFtZSwgdGhyZXNob2xkICkge1xuICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMTAwO1xuICAvLyBvcmlnaW5hbCBtZXRob2RcbiAgdmFyIG1ldGhvZCA9IF9jbGFzcy5wcm90b3R5cGVbIG1ldGhvZE5hbWUgXTtcbiAgdmFyIHRpbWVvdXROYW1lID0gbWV0aG9kTmFtZSArICdUaW1lb3V0JztcblxuICBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXNbIHRpbWVvdXROYW1lIF0gPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgIG1ldGhvZC5hcHBseSggX3RoaXMsIGFyZ3MgKTtcbiAgICAgIGRlbGV0ZSBfdGhpc1sgdGltZW91dE5hbWUgXTtcbiAgICB9LCB0aHJlc2hvbGQgKTtcbiAgfTtcbn07XG5cbi8vIC0tLS0tIGRvY1JlYWR5IC0tLS0tIC8vXG5cbnV0aWxzLmRvY1JlYWR5ID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gIGlmICggcmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IHJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJyApIHtcbiAgICAvLyBkbyBhc3luYyB0byBhbGxvdyBmb3Igb3RoZXIgc2NyaXB0cyB0byBydW4uIG1ldGFmaXp6eS9mbGlja2l0eSM0NDFcbiAgICBzZXRUaW1lb3V0KCBjYWxsYmFjayApO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgY2FsbGJhY2sgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gaHRtbEluaXQgLS0tLS0gLy9cblxuLy8gaHR0cDovL2phbWVzcm9iZXJ0cy5uYW1lL2Jsb2cvMjAxMC8wMi8yMi9zdHJpbmctZnVuY3Rpb25zLWZvci1qYXZhc2NyaXB0LXRyaW0tdG8tY2FtZWwtY2FzZS10by1kYXNoZWQtYW5kLXRvLXVuZGVyc2NvcmUvXG51dGlscy50b0Rhc2hlZCA9IGZ1bmN0aW9uKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyguKShbQS1aXSkvZywgZnVuY3Rpb24oIG1hdGNoLCAkMSwgJDIgKSB7XG4gICAgcmV0dXJuICQxICsgJy0nICsgJDI7XG4gIH0pLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuLyoqXG4gKiBhbGxvdyB1c2VyIHRvIGluaXRpYWxpemUgY2xhc3NlcyB2aWEgW2RhdGEtbmFtZXNwYWNlXSBvciAuanMtbmFtZXNwYWNlIGNsYXNzXG4gKiBodG1sSW5pdCggV2lkZ2V0LCAnd2lkZ2V0TmFtZScgKVxuICogb3B0aW9ucyBhcmUgcGFyc2VkIGZyb20gZGF0YS1uYW1lc3BhY2Utb3B0aW9uc1xuICovXG51dGlscy5odG1sSW5pdCA9IGZ1bmN0aW9uKCBXaWRnZXRDbGFzcywgbmFtZXNwYWNlICkge1xuICB1dGlscy5kb2NSZWFkeSggZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhc2hlZE5hbWVzcGFjZSA9IHV0aWxzLnRvRGFzaGVkKCBuYW1lc3BhY2UgKTtcbiAgICB2YXIgZGF0YUF0dHIgPSAnZGF0YS0nICsgZGFzaGVkTmFtZXNwYWNlO1xuICAgIHZhciBkYXRhQXR0ckVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1snICsgZGF0YUF0dHIgKyAnXScgKTtcbiAgICB2YXIganNEYXNoRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLmpzLScgKyBkYXNoZWROYW1lc3BhY2UgKTtcbiAgICB2YXIgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGRhdGFBdHRyRWxlbXMgKVxuICAgICAgLmNvbmNhdCggdXRpbHMubWFrZUFycmF5KCBqc0Rhc2hFbGVtcyApICk7XG4gICAgdmFyIGRhdGFPcHRpb25zQXR0ciA9IGRhdGFBdHRyICsgJy1vcHRpb25zJztcbiAgICB2YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVyeTtcblxuICAgIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YUF0dHIgKSB8fFxuICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YU9wdGlvbnNBdHRyICk7XG4gICAgICB2YXIgb3B0aW9ucztcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyICYmIEpTT04ucGFyc2UoIGF0dHIgKTtcbiAgICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcbiAgICAgICAgLy8gbG9nIGVycm9yLCBkbyBub3QgaW5pdGlhbGl6ZVxuICAgICAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciggJ0Vycm9yIHBhcnNpbmcgJyArIGRhdGFBdHRyICsgJyBvbiAnICsgZWxlbS5jbGFzc05hbWUgK1xuICAgICAgICAgICc6ICcgKyBlcnJvciApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXaWRnZXRDbGFzcyggZWxlbSwgb3B0aW9ucyApO1xuICAgICAgLy8gbWFrZSBhdmFpbGFibGUgdmlhICQoKS5kYXRhKCduYW1lc3BhY2UnKVxuICAgICAgaWYgKCBqUXVlcnkgKSB7XG4gICAgICAgIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lc3BhY2UsIGluc3RhbmNlICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIHV0aWxzO1xuXG59KSk7XG59KTtcblxudmFyIGNlbGwgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBGbGlja2l0eS5DZWxsXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgICAgd2luZG93LFxuICAgICAgICBnZXRTaXplXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuQ2VsbCA9IGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBnZXRTaXplICkge1xuXG5mdW5jdGlvbiBDZWxsKCBlbGVtLCBwYXJlbnQgKSB7XG4gIHRoaXMuZWxlbWVudCA9IGVsZW07XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gIHRoaXMuY3JlYXRlKCk7XG59XG5cbnZhciBwcm90byA9IENlbGwucHJvdG90eXBlO1xuXG5wcm90by5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XG4gIHRoaXMueCA9IDA7XG4gIHRoaXMuc2hpZnQgPSAwO1xuICB0aGlzLmVsZW1lbnQuc3R5bGVbIHRoaXMucGFyZW50Lm9yaWdpblNpZGUgXSA9IDA7XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlc2V0IHN0eWxlXG4gIHRoaXMudW5zZWxlY3QoKTtcbiAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJyc7XG4gIHZhciBzaWRlID0gdGhpcy5wYXJlbnQub3JpZ2luU2lkZTtcbiAgdGhpcy5lbGVtZW50LnN0eWxlWyBzaWRlIF0gPSAnJztcbiAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xufTtcblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbnByb3RvLnNldFBvc2l0aW9uID0gZnVuY3Rpb24oIHggKSB7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMudXBkYXRlVGFyZ2V0KCk7XG4gIHRoaXMucmVuZGVyUG9zaXRpb24oIHggKTtcbn07XG5cbi8vIHNldERlZmF1bHRUYXJnZXQgdjEgbWV0aG9kLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcmVtb3ZlIGluIHYzXG5wcm90by51cGRhdGVUYXJnZXQgPSBwcm90by5zZXREZWZhdWx0VGFyZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBtYXJnaW5Qcm9wZXJ0eSA9IHRoaXMucGFyZW50Lm9yaWdpblNpZGUgPT0gJ2xlZnQnID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0JztcbiAgdGhpcy50YXJnZXQgPSB0aGlzLnggKyB0aGlzLnNpemVbIG1hcmdpblByb3BlcnR5IF0gK1xuICAgIHRoaXMuc2l6ZS53aWR0aCAqIHRoaXMucGFyZW50LmNlbGxBbGlnbjtcbn07XG5cbnByb3RvLnJlbmRlclBvc2l0aW9uID0gZnVuY3Rpb24oIHggKSB7XG4gIC8vIHJlbmRlciBwb3NpdGlvbiBvZiBjZWxsIHdpdGggaW4gc2xpZGVyXG4gIHZhciBzaWRlT2Zmc2V0ID0gdGhpcy5wYXJlbnQub3JpZ2luU2lkZSA9PT0gJ2xlZnQnID8gMSA6IC0xO1xuXG4gIHZhciBhZGp1c3RlZFggPSB0aGlzLnBhcmVudC5vcHRpb25zLnBlcmNlbnRQb3NpdGlvbiA/XG4gICAgeCAqIHNpZGVPZmZzZXQgKiAoIHRoaXMucGFyZW50LnNpemUuaW5uZXJXaWR0aCAvIHRoaXMuc2l6ZS53aWR0aCApIDpcbiAgICB4ICogc2lkZU9mZnNldDtcblxuICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoJyArXG4gICAgdGhpcy5wYXJlbnQuZ2V0UG9zaXRpb25WYWx1ZSggYWRqdXN0ZWRYICkgKyAnKSc7XG59O1xuXG5wcm90by5zZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzLXNlbGVjdGVkJyk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG59O1xuXG5wcm90by51bnNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtc2VsZWN0ZWQnKTtcbiAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc2hpZnQgLSAwLCAxLCBvciAtMVxuICovXG5wcm90by53cmFwU2hpZnQgPSBmdW5jdGlvbiggc2hpZnQgKSB7XG4gIHRoaXMuc2hpZnQgPSBzaGlmdDtcbiAgdGhpcy5yZW5kZXJQb3NpdGlvbiggdGhpcy54ICsgdGhpcy5wYXJlbnQuc2xpZGVhYmxlV2lkdGggKiBzaGlmdCApO1xufTtcblxucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbnJldHVybiBDZWxsO1xuXG59ICkgKTtcbn0pO1xuXG52YXIgc2xpZGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBzbGlkZVxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuU2xpZGUgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuXG5mdW5jdGlvbiBTbGlkZSggcGFyZW50ICkge1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5pc09yaWdpbkxlZnQgPSBwYXJlbnQub3JpZ2luU2lkZSA9PSAnbGVmdCc7XG4gIHRoaXMuY2VsbHMgPSBbXTtcbiAgdGhpcy5vdXRlcldpZHRoID0gMDtcbiAgdGhpcy5oZWlnaHQgPSAwO1xufVxuXG52YXIgcHJvdG8gPSBTbGlkZS5wcm90b3R5cGU7XG5cbnByb3RvLmFkZENlbGwgPSBmdW5jdGlvbiggY2VsbCApIHtcbiAgdGhpcy5jZWxscy5wdXNoKCBjZWxsICk7XG4gIHRoaXMub3V0ZXJXaWR0aCArPSBjZWxsLnNpemUub3V0ZXJXaWR0aDtcbiAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heCggY2VsbC5zaXplLm91dGVySGVpZ2h0LCB0aGlzLmhlaWdodCApO1xuICAvLyBmaXJzdCBjZWxsIHN0dWZmXG4gIGlmICggdGhpcy5jZWxscy5sZW5ndGggPT0gMSApIHtcbiAgICB0aGlzLnggPSBjZWxsLng7IC8vIHggY29tZXMgZnJvbSBmaXJzdCBjZWxsXG4gICAgdmFyIGJlZ2luTWFyZ2luID0gdGhpcy5pc09yaWdpbkxlZnQgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHRoaXMuZmlyc3RNYXJnaW4gPSBjZWxsLnNpemVbIGJlZ2luTWFyZ2luIF07XG4gIH1cbn07XG5cbnByb3RvLnVwZGF0ZVRhcmdldCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZW5kTWFyZ2luID0gdGhpcy5pc09yaWdpbkxlZnQgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnO1xuICB2YXIgbGFzdENlbGwgPSB0aGlzLmdldExhc3RDZWxsKCk7XG4gIHZhciBsYXN0TWFyZ2luID0gbGFzdENlbGwgPyBsYXN0Q2VsbC5zaXplWyBlbmRNYXJnaW4gXSA6IDA7XG4gIHZhciBzbGlkZVdpZHRoID0gdGhpcy5vdXRlcldpZHRoIC0gKCB0aGlzLmZpcnN0TWFyZ2luICsgbGFzdE1hcmdpbiApO1xuICB0aGlzLnRhcmdldCA9IHRoaXMueCArIHRoaXMuZmlyc3RNYXJnaW4gKyBzbGlkZVdpZHRoICogdGhpcy5wYXJlbnQuY2VsbEFsaWduO1xufTtcblxucHJvdG8uZ2V0TGFzdENlbGwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2VsbHNbIHRoaXMuY2VsbHMubGVuZ3RoIC0gMSBdO1xufTtcblxucHJvdG8uc2VsZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5zZWxlY3QoKTtcbiAgfSApO1xufTtcblxucHJvdG8udW5zZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jZWxscy5mb3JFYWNoKCBmdW5jdGlvbiggY2VsbCApIHtcbiAgICBjZWxsLnVuc2VsZWN0KCk7XG4gIH0gKTtcbn07XG5cbnByb3RvLmdldENlbGxFbGVtZW50cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jZWxscy5tYXAoIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIHJldHVybiBjZWxsLmVsZW1lbnQ7XG4gIH0gKTtcbn07XG5cbnJldHVybiBTbGlkZTtcblxufSApICk7XG59KTtcblxudmFyIGFuaW1hdGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBhbmltYXRlXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgICAgd2luZG93LFxuICAgICAgICB1dGlsc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuRmxpY2tpdHkgPSB3aW5kb3cuRmxpY2tpdHkgfHwge307XG4gICAgd2luZG93LkZsaWNraXR5LmFuaW1hdGVQcm90b3R5cGUgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCB1dGlscyApIHtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYW5pbWF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSB7fTtcblxucHJvdG8uc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLmlzQW5pbWF0aW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuICB0aGlzLnJlc3RpbmdGcmFtZXMgPSAwO1xuICB0aGlzLmFuaW1hdGUoKTtcbn07XG5cbnByb3RvLmFuaW1hdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5hcHBseURyYWdGb3JjZSgpO1xuICB0aGlzLmFwcGx5U2VsZWN0ZWRBdHRyYWN0aW9uKCk7XG5cbiAgdmFyIHByZXZpb3VzWCA9IHRoaXMueDtcblxuICB0aGlzLmludGVncmF0ZVBoeXNpY3MoKTtcbiAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xuICB0aGlzLnNldHRsZSggcHJldmlvdXNYICk7XG4gIC8vIGFuaW1hdGUgbmV4dCBmcmFtZVxuICBpZiAoIHRoaXMuaXNBbmltYXRpbmcgKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGZ1bmN0aW9uIGFuaW1hdGVGcmFtZSgpIHtcbiAgICAgIF90aGlzLmFuaW1hdGUoKTtcbiAgICB9ICk7XG4gIH1cbn07XG5cbnByb3RvLnBvc2l0aW9uU2xpZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciB4ID0gdGhpcy54O1xuICAvLyB3cmFwIHBvc2l0aW9uIGFyb3VuZFxuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICYmIHRoaXMuY2VsbHMubGVuZ3RoID4gMSApIHtcbiAgICB4ID0gdXRpbHMubW9kdWxvKCB4LCB0aGlzLnNsaWRlYWJsZVdpZHRoICk7XG4gICAgeCAtPSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICAgIHRoaXMuc2hpZnRXcmFwQ2VsbHMoIHggKTtcbiAgfVxuXG4gIHRoaXMuc2V0VHJhbnNsYXRlWCggeCwgdGhpcy5pc0FuaW1hdGluZyApO1xuICB0aGlzLmRpc3BhdGNoU2Nyb2xsRXZlbnQoKTtcbn07XG5cbnByb3RvLnNldFRyYW5zbGF0ZVggPSBmdW5jdGlvbiggeCwgaXMzZCApIHtcbiAgeCArPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICAvLyByZXZlcnNlIGlmIHJpZ2h0LXRvLWxlZnQgYW5kIHVzaW5nIHRyYW5zZm9ybVxuICB4ID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gLXggOiB4O1xuICB2YXIgdHJhbnNsYXRlWCA9IHRoaXMuZ2V0UG9zaXRpb25WYWx1ZSggeCApO1xuICAvLyB1c2UgM0QgdHJhbnNmb3JtcyBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIG9uIGlPU1xuICAvLyBidXQgdXNlIDJEIHdoZW4gc2V0dGxlZCwgZm9yIGJldHRlciBmb250LXJlbmRlcmluZ1xuICB0aGlzLnNsaWRlci5zdHlsZS50cmFuc2Zvcm0gPSBpczNkID9cbiAgICAndHJhbnNsYXRlM2QoJyArIHRyYW5zbGF0ZVggKyAnLDAsMCknIDogJ3RyYW5zbGF0ZVgoJyArIHRyYW5zbGF0ZVggKyAnKSc7XG59O1xuXG5wcm90by5kaXNwYXRjaFNjcm9sbEV2ZW50ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmaXJzdFNsaWRlID0gdGhpcy5zbGlkZXNbMF07XG4gIGlmICggIWZpcnN0U2xpZGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBwb3NpdGlvblggPSAtdGhpcy54IC0gZmlyc3RTbGlkZS50YXJnZXQ7XG4gIHZhciBwcm9ncmVzcyA9IHBvc2l0aW9uWCAvIHRoaXMuc2xpZGVzV2lkdGg7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3Njcm9sbCcsIG51bGwsIFsgcHJvZ3Jlc3MsIHBvc2l0aW9uWCBdICk7XG59O1xuXG5wcm90by5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMueCA9IC10aGlzLnNlbGVjdGVkU2xpZGUudGFyZ2V0O1xuICB0aGlzLnZlbG9jaXR5ID0gMDsgLy8gc3RvcCB3b2JibGVcbiAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xufTtcblxucHJvdG8uZ2V0UG9zaXRpb25WYWx1ZSA9IGZ1bmN0aW9uKCBwb3NpdGlvbiApIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICkge1xuICAgIC8vIHBlcmNlbnQgcG9zaXRpb24sIHJvdW5kIHRvIDIgZGlnaXRzLCBsaWtlIDEyLjM0JVxuICAgIHJldHVybiAoIE1hdGgucm91bmQoICggcG9zaXRpb24gLyB0aGlzLnNpemUuaW5uZXJXaWR0aCApICogMTAwMDAgKSAqIDAuMDEgKSArICclJztcbiAgfSBlbHNlIHtcbiAgICAvLyBwaXhlbCBwb3NpdGlvbmluZ1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCBwb3NpdGlvbiApICsgJ3B4JztcbiAgfVxufTtcblxucHJvdG8uc2V0dGxlID0gZnVuY3Rpb24oIHByZXZpb3VzWCApIHtcbiAgLy8ga2VlcCB0cmFjayBvZiBmcmFtZXMgd2hlcmUgeCBoYXNuJ3QgbW92ZWRcbiAgdmFyIGlzUmVzdGluZyA9ICF0aGlzLmlzUG9pbnRlckRvd24gJiZcbiAgICAgIE1hdGgucm91bmQoIHRoaXMueCAqIDEwMCApID09IE1hdGgucm91bmQoIHByZXZpb3VzWCAqIDEwMCApO1xuICBpZiAoIGlzUmVzdGluZyApIHtcbiAgICB0aGlzLnJlc3RpbmdGcmFtZXMrKztcbiAgfVxuICAvLyBzdG9wIGFuaW1hdGluZyBpZiByZXN0aW5nIGZvciAzIG9yIG1vcmUgZnJhbWVzXG4gIGlmICggdGhpcy5yZXN0aW5nRnJhbWVzID4gMiApIHtcbiAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgZGVsZXRlIHRoaXMuaXNGcmVlU2Nyb2xsaW5nO1xuICAgIC8vIHJlbmRlciBwb3NpdGlvbiB3aXRoIHRyYW5zbGF0ZVggd2hlbiBzZXR0bGVkXG4gICAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3NldHRsZScsIG51bGwsIFsgdGhpcy5zZWxlY3RlZEluZGV4IF0gKTtcbiAgfVxufTtcblxucHJvdG8uc2hpZnRXcmFwQ2VsbHMgPSBmdW5jdGlvbiggeCApIHtcbiAgLy8gc2hpZnQgYmVmb3JlIGNlbGxzXG4gIHZhciBiZWZvcmVHYXAgPSB0aGlzLmN1cnNvclBvc2l0aW9uICsgeDtcbiAgdGhpcy5fc2hpZnRDZWxscyggdGhpcy5iZWZvcmVTaGlmdENlbGxzLCBiZWZvcmVHYXAsIC0xICk7XG4gIC8vIHNoaWZ0IGFmdGVyIGNlbGxzXG4gIHZhciBhZnRlckdhcCA9IHRoaXMuc2l6ZS5pbm5lcldpZHRoIC0gKCB4ICsgdGhpcy5zbGlkZWFibGVXaWR0aCArIHRoaXMuY3Vyc29yUG9zaXRpb24gKTtcbiAgdGhpcy5fc2hpZnRDZWxscyggdGhpcy5hZnRlclNoaWZ0Q2VsbHMsIGFmdGVyR2FwLCAxICk7XG59O1xuXG5wcm90by5fc2hpZnRDZWxscyA9IGZ1bmN0aW9uKCBjZWxscywgZ2FwLCBzaGlmdCApIHtcbiAgZm9yICggdmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSBjZWxsc1tpXTtcbiAgICB2YXIgY2VsbFNoaWZ0ID0gZ2FwID4gMCA/IHNoaWZ0IDogMDtcbiAgICBjZWxsLndyYXBTaGlmdCggY2VsbFNoaWZ0ICk7XG4gICAgZ2FwIC09IGNlbGwuc2l6ZS5vdXRlcldpZHRoO1xuICB9XG59O1xuXG5wcm90by5fdW5zaGlmdENlbGxzID0gZnVuY3Rpb24oIGNlbGxzICkge1xuICBpZiAoICFjZWxscyB8fCAhY2VsbHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICBjZWxsc1tpXS53cmFwU2hpZnQoIDAgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGh5c2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by5pbnRlZ3JhdGVQaHlzaWNzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMueCArPSB0aGlzLnZlbG9jaXR5O1xuICB0aGlzLnZlbG9jaXR5ICo9IHRoaXMuZ2V0RnJpY3Rpb25GYWN0b3IoKTtcbn07XG5cbnByb3RvLmFwcGx5Rm9yY2UgPSBmdW5jdGlvbiggZm9yY2UgKSB7XG4gIHRoaXMudmVsb2NpdHkgKz0gZm9yY2U7XG59O1xuXG5wcm90by5nZXRGcmljdGlvbkZhY3RvciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gMSAtIHRoaXMub3B0aW9uc1sgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPyAnZnJlZVNjcm9sbEZyaWN0aW9uJyA6ICdmcmljdGlvbicgXTtcbn07XG5cbnByb3RvLmdldFJlc3RpbmdQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBteSB0aGFua3MgdG8gU3RldmVuIFdpdHRlbnMsIHdobyBzaW1wbGlmaWVkIHRoaXMgbWF0aCBncmVhdGx5XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLnZlbG9jaXR5IC8gKCAxIC0gdGhpcy5nZXRGcmljdGlvbkZhY3RvcigpICk7XG59O1xuXG5wcm90by5hcHBseURyYWdGb3JjZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlIHx8ICF0aGlzLmlzUG9pbnRlckRvd24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGNoYW5nZSB0aGUgcG9zaXRpb24gdG8gZHJhZyBwb3NpdGlvbiBieSBhcHBseWluZyBmb3JjZVxuICB2YXIgZHJhZ1ZlbG9jaXR5ID0gdGhpcy5kcmFnWCAtIHRoaXMueDtcbiAgdmFyIGRyYWdGb3JjZSA9IGRyYWdWZWxvY2l0eSAtIHRoaXMudmVsb2NpdHk7XG4gIHRoaXMuYXBwbHlGb3JjZSggZHJhZ0ZvcmNlICk7XG59O1xuXG5wcm90by5hcHBseVNlbGVjdGVkQXR0cmFjdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBkbyBub3QgYXR0cmFjdCBpZiBwb2ludGVyIGRvd24gb3Igbm8gc2xpZGVzXG4gIHZhciBkcmFnRG93biA9IHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5pc1BvaW50ZXJEb3duO1xuICBpZiAoIGRyYWdEb3duIHx8IHRoaXMuaXNGcmVlU2Nyb2xsaW5nIHx8ICF0aGlzLnNsaWRlcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBkaXN0YW5jZSA9IHRoaXMuc2VsZWN0ZWRTbGlkZS50YXJnZXQgKiAtMSAtIHRoaXMueDtcbiAgdmFyIGZvcmNlID0gZGlzdGFuY2UgKiB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRBdHRyYWN0aW9uO1xuICB0aGlzLmFwcGx5Rm9yY2UoIGZvcmNlICk7XG59O1xuXG5yZXR1cm4gcHJvdG87XG5cbn0gKSApO1xufSk7XG5cbnZhciBmbGlja2l0eSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8vIEZsaWNraXR5IG1haW5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1wYXJhbXMgKi9cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIGV2RW1pdHRlcixcbiAgICAgICAgZ2V0U2l6ZSxcbiAgICAgICAgdXRpbHMsXG4gICAgICAgIGNlbGwsXG4gICAgICAgIHNsaWRlLFxuICAgICAgICBhbmltYXRlXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHZhciBfRmxpY2tpdHkgPSB3aW5kb3cuRmxpY2tpdHk7XG5cbiAgICB3aW5kb3cuRmxpY2tpdHkgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICAgIHdpbmRvdy5nZXRTaXplLFxuICAgICAgICB3aW5kb3cuZml6enlVSVV0aWxzLFxuICAgICAgICBfRmxpY2tpdHkuQ2VsbCxcbiAgICAgICAgX0ZsaWNraXR5LlNsaWRlLFxuICAgICAgICBfRmxpY2tpdHkuYW5pbWF0ZVByb3RvdHlwZVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSxcbiAgICB1dGlscywgQ2VsbCwgU2xpZGUsIGFuaW1hdGVQcm90b3R5cGUgKSB7XG5cbi8vIHZhcnNcbnZhciBqUXVlcnkgPSB3aW5kb3cualF1ZXJ5O1xudmFyIGdldENvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtcbnZhciBjb25zb2xlID0gd2luZG93LmNvbnNvbGU7XG5cbmZ1bmN0aW9uIG1vdmVFbGVtZW50cyggZWxlbXMsIHRvRWxlbSApIHtcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHdoaWxlICggZWxlbXMubGVuZ3RoICkge1xuICAgIHRvRWxlbS5hcHBlbmRDaGlsZCggZWxlbXMuc2hpZnQoKSApO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsaWNraXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyc1xudmFyIEdVSUQgPSAwO1xuLy8gaW50ZXJuYWwgc3RvcmUgb2YgYWxsIEZsaWNraXR5IGludGFuY2VzXG52YXIgaW5zdGFuY2VzID0ge307XG5cbmZ1bmN0aW9uIEZsaWNraXR5KCBlbGVtZW50LCBvcHRpb25zICkge1xuICB2YXIgcXVlcnlFbGVtZW50ID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtZW50ICk7XG4gIGlmICggIXF1ZXJ5RWxlbWVudCApIHtcbiAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCAnQmFkIGVsZW1lbnQgZm9yIEZsaWNraXR5OiAnICsgKCBxdWVyeUVsZW1lbnQgfHwgZWxlbWVudCApICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQgPSBxdWVyeUVsZW1lbnQ7XG4gIC8vIGRvIG5vdCBpbml0aWFsaXplIHR3aWNlIG9uIHNhbWUgZWxlbWVudFxuICBpZiAoIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQgKSB7XG4gICAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzWyB0aGlzLmVsZW1lbnQuZmxpY2tpdHlHVUlEIF07XG4gICAgaWYgKCBpbnN0YW5jZSApIGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8vIGFkZCBqUXVlcnlcbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGpRdWVyeSggdGhpcy5lbGVtZW50ICk7XG4gIH1cbiAgLy8gb3B0aW9uc1xuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5leHRlbmQoIHt9LCB0aGlzLmNvbnN0cnVjdG9yLmRlZmF1bHRzICk7XG4gIHRoaXMub3B0aW9uKCBvcHRpb25zICk7XG5cbiAgLy8ga2ljayB0aGluZ3Mgb2ZmXG4gIHRoaXMuX2NyZWF0ZSgpO1xufVxuXG5GbGlja2l0eS5kZWZhdWx0cyA9IHtcbiAgYWNjZXNzaWJpbGl0eTogdHJ1ZSxcbiAgLy8gYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICBjZWxsQWxpZ246ICdjZW50ZXInLFxuICAvLyBjZWxsU2VsZWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gY29udGFpbjogZmFsc2UsXG4gIGZyZWVTY3JvbGxGcmljdGlvbjogMC4wNzUsIC8vIGZyaWN0aW9uIHdoZW4gZnJlZS1zY3JvbGxpbmdcbiAgZnJpY3Rpb246IDAuMjgsIC8vIGZyaWN0aW9uIHdoZW4gc2VsZWN0aW5nXG4gIG5hbWVzcGFjZUpRdWVyeUV2ZW50czogdHJ1ZSxcbiAgLy8gaW5pdGlhbEluZGV4OiAwLFxuICBwZXJjZW50UG9zaXRpb246IHRydWUsXG4gIHJlc2l6ZTogdHJ1ZSxcbiAgc2VsZWN0ZWRBdHRyYWN0aW9uOiAwLjAyNSxcbiAgc2V0R2FsbGVyeVNpemU6IHRydWUsXG4gIC8vIHdhdGNoQ1NTOiBmYWxzZSxcbiAgLy8gd3JhcEFyb3VuZDogZmFsc2Vcbn07XG5cbi8vIGhhc2ggb2YgbWV0aG9kcyB0cmlnZ2VyZWQgb24gX2NyZWF0ZSgpXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzID0gW107XG5cbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcbi8vIGluaGVyaXQgRXZlbnRFbWl0dGVyXG51dGlscy5leHRlbmQoIHByb3RvLCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbnByb3RvLl9jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gYWRkIGlkIGZvciBGbGlja2l0eS5kYXRhXG4gIHZhciBpZCA9IHRoaXMuZ3VpZCA9ICsrR1VJRDtcbiAgdGhpcy5lbGVtZW50LmZsaWNraXR5R1VJRCA9IGlkOyAvLyBleHBhbmRvXG4gIGluc3RhbmNlc1sgaWQgXSA9IHRoaXM7IC8vIGFzc29jaWF0ZSB2aWEgaWRcbiAgLy8gaW5pdGlhbCBwcm9wZXJ0aWVzXG4gIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG4gIC8vIGhvdyBtYW55IGZyYW1lcyBzbGlkZXIgaGFzIGJlZW4gaW4gc2FtZSBwb3NpdGlvblxuICB0aGlzLnJlc3RpbmdGcmFtZXMgPSAwO1xuICAvLyBpbml0aWFsIHBoeXNpY3MgcHJvcGVydGllc1xuICB0aGlzLnggPSAwO1xuICB0aGlzLnZlbG9jaXR5ID0gMDtcbiAgdGhpcy5vcmlnaW5TaWRlID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgLy8gY3JlYXRlIHZpZXdwb3J0ICYgc2xpZGVyXG4gIHRoaXMudmlld3BvcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGhpcy52aWV3cG9ydC5jbGFzc05hbWUgPSAnZmxpY2tpdHktdmlld3BvcnQnO1xuICB0aGlzLl9jcmVhdGVTbGlkZXIoKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy5yZXNpemUgfHwgdGhpcy5vcHRpb25zLndhdGNoQ1NTICkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB9XG5cbiAgLy8gYWRkIGxpc3RlbmVycyBmcm9tIG9uIG9wdGlvblxuICBmb3IgKCB2YXIgZXZlbnROYW1lIGluIHRoaXMub3B0aW9ucy5vbiApIHtcbiAgICB2YXIgbGlzdGVuZXIgPSB0aGlzLm9wdGlvbnMub25bIGV2ZW50TmFtZSBdO1xuICAgIHRoaXMub24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgfVxuXG4gIEZsaWNraXR5LmNyZWF0ZU1ldGhvZHMuZm9yRWFjaCggZnVuY3Rpb24oIG1ldGhvZCApIHtcbiAgICB0aGlzWyBtZXRob2QgXSgpO1xuICB9LCB0aGlzICk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMud2F0Y2hDU1MgKSB7XG4gICAgdGhpcy53YXRjaENTUygpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG59O1xuXG4vKipcbiAqIHNldCBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gZXh0ZW5kXG4gKi9cbnByb3RvLm9wdGlvbiA9IGZ1bmN0aW9uKCBvcHRzICkge1xuICB1dGlscy5leHRlbmQoIHRoaXMub3B0aW9ucywgb3B0cyApO1xufTtcblxucHJvdG8uYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLmlzQWN0aXZlICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZsaWNraXR5LWVuYWJsZWQnKTtcbiAgaWYgKCB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgKSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZsaWNraXR5LXJ0bCcpO1xuICB9XG5cbiAgdGhpcy5nZXRTaXplKCk7XG4gIC8vIG1vdmUgaW5pdGlhbCBjZWxsIGVsZW1lbnRzIHNvIHRoZXkgY2FuIGJlIGxvYWRlZCBhcyBjZWxsc1xuICB2YXIgY2VsbEVsZW1zID0gdGhpcy5fZmlsdGVyRmluZENlbGxFbGVtZW50cyggdGhpcy5lbGVtZW50LmNoaWxkcmVuICk7XG4gIG1vdmVFbGVtZW50cyggY2VsbEVsZW1zLCB0aGlzLnNsaWRlciApO1xuICB0aGlzLnZpZXdwb3J0LmFwcGVuZENoaWxkKCB0aGlzLnNsaWRlciApO1xuICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoIHRoaXMudmlld3BvcnQgKTtcbiAgLy8gZ2V0IGNlbGxzIGZyb20gY2hpbGRyZW5cbiAgdGhpcy5yZWxvYWRDZWxscygpO1xuXG4gIGlmICggdGhpcy5vcHRpb25zLmFjY2Vzc2liaWxpdHkgKSB7XG4gICAgLy8gYWxsb3cgZWxlbWVudCB0byBmb2N1c2FibGVcbiAgICB0aGlzLmVsZW1lbnQudGFiSW5kZXggPSAwO1xuICAgIC8vIGxpc3RlbiBmb3Iga2V5IHByZXNzZXNcbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2tleWRvd24nLCB0aGlzICk7XG4gIH1cblxuICB0aGlzLmVtaXRFdmVudCgnYWN0aXZhdGUnKTtcbiAgdGhpcy5zZWxlY3RJbml0aWFsSW5kZXgoKTtcbiAgLy8gZmxhZyBmb3IgaW5pdGlhbCBhY3RpdmF0aW9uLCBmb3IgdXNpbmcgaW5pdGlhbEluZGV4XG4gIHRoaXMuaXNJbml0QWN0aXZhdGVkID0gdHJ1ZTtcbiAgLy8gcmVhZHkgZXZlbnQuICM0OTNcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZWFkeScpO1xufTtcblxuLy8gc2xpZGVyIHBvc2l0aW9ucyB0aGUgY2VsbHNcbnByb3RvLl9jcmVhdGVTbGlkZXIgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2xpZGVyIGVsZW1lbnQgZG9lcyBhbGwgdGhlIHBvc2l0aW9uaW5nXG4gIHZhciBzbGlkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc2xpZGVyLmNsYXNzTmFtZSA9ICdmbGlja2l0eS1zbGlkZXInO1xuICBzbGlkZXIuc3R5bGVbIHRoaXMub3JpZ2luU2lkZSBdID0gMDtcbiAgdGhpcy5zbGlkZXIgPSBzbGlkZXI7XG59O1xuXG5wcm90by5fZmlsdGVyRmluZENlbGxFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgcmV0dXJuIHV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyggZWxlbXMsIHRoaXMub3B0aW9ucy5jZWxsU2VsZWN0b3IgKTtcbn07XG5cbi8vIGdvZXMgdGhyb3VnaCBhbGwgY2hpbGRyZW5cbnByb3RvLnJlbG9hZENlbGxzID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICB0aGlzLmNlbGxzID0gdGhpcy5fbWFrZUNlbGxzKCB0aGlzLnNsaWRlci5jaGlsZHJlbiApO1xuICB0aGlzLnBvc2l0aW9uQ2VsbHMoKTtcbiAgdGhpcy5fZ2V0V3JhcFNoaWZ0Q2VsbHMoKTtcbiAgdGhpcy5zZXRHYWxsZXJ5U2l6ZSgpO1xufTtcblxuLyoqXG4gKiB0dXJuIGVsZW1lbnRzIGludG8gRmxpY2tpdHkuQ2VsbHNcbiAqIEBwYXJhbSB7W0FycmF5LCBOb2RlTGlzdCwgSFRNTEVsZW1lbnRdfSBlbGVtcyAtIGVsZW1lbnRzIHRvIG1ha2UgaW50byBjZWxsc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGNvbGxlY3Rpb24gb2YgbmV3IEZsaWNraXR5IENlbGxzXG4gKi9cbnByb3RvLl9tYWtlQ2VsbHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBjZWxsRWxlbXMgPSB0aGlzLl9maWx0ZXJGaW5kQ2VsbEVsZW1lbnRzKCBlbGVtcyApO1xuXG4gIC8vIGNyZWF0ZSBuZXcgRmxpY2tpdHkgZm9yIGNvbGxlY3Rpb25cbiAgdmFyIGNlbGxzID0gY2VsbEVsZW1zLm1hcCggZnVuY3Rpb24oIGNlbGxFbGVtICkge1xuICAgIHJldHVybiBuZXcgQ2VsbCggY2VsbEVsZW0sIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xuXG4gIHJldHVybiBjZWxscztcbn07XG5cbnByb3RvLmdldExhc3RDZWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNlbGxzWyB0aGlzLmNlbGxzLmxlbmd0aCAtIDEgXTtcbn07XG5cbnByb3RvLmdldExhc3RTbGlkZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zbGlkZXNbIHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEgXTtcbn07XG5cbi8vIHBvc2l0aW9ucyBhbGwgY2VsbHNcbnByb3RvLnBvc2l0aW9uQ2VsbHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2l6ZSBhbGwgY2VsbHNcbiAgdGhpcy5fc2l6ZUNlbGxzKCB0aGlzLmNlbGxzICk7XG4gIC8vIHBvc2l0aW9uIGFsbCBjZWxsc1xuICB0aGlzLl9wb3NpdGlvbkNlbGxzKCAwICk7XG59O1xuXG4vKipcbiAqIHBvc2l0aW9uIGNlcnRhaW4gY2VsbHNcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSB3aGljaCBjZWxsIHRvIHN0YXJ0IHdpdGhcbiAqL1xucHJvdG8uX3Bvc2l0aW9uQ2VsbHMgPSBmdW5jdGlvbiggaW5kZXggKSB7XG4gIGluZGV4ID0gaW5kZXggfHwgMDtcbiAgLy8gYWxzbyBtZWFzdXJlIG1heENlbGxIZWlnaHRcbiAgLy8gc3RhcnQgMCBpZiBwb3NpdGlvbmluZyBhbGwgY2VsbHNcbiAgdGhpcy5tYXhDZWxsSGVpZ2h0ID0gaW5kZXggPyB0aGlzLm1heENlbGxIZWlnaHQgfHwgMCA6IDA7XG4gIHZhciBjZWxsWCA9IDA7XG4gIC8vIGdldCBjZWxsWFxuICBpZiAoIGluZGV4ID4gMCApIHtcbiAgICB2YXIgc3RhcnRDZWxsID0gdGhpcy5jZWxsc1sgaW5kZXggLSAxIF07XG4gICAgY2VsbFggPSBzdGFydENlbGwueCArIHN0YXJ0Q2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbiAgdmFyIGxlbiA9IHRoaXMuY2VsbHMubGVuZ3RoO1xuICBmb3IgKCB2YXIgaSA9IGluZGV4OyBpIDwgbGVuOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzW2ldO1xuICAgIGNlbGwuc2V0UG9zaXRpb24oIGNlbGxYICk7XG4gICAgY2VsbFggKz0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gICAgdGhpcy5tYXhDZWxsSGVpZ2h0ID0gTWF0aC5tYXgoIGNlbGwuc2l6ZS5vdXRlckhlaWdodCwgdGhpcy5tYXhDZWxsSGVpZ2h0ICk7XG4gIH1cbiAgLy8ga2VlcCB0cmFjayBvZiBjZWxsWCBmb3Igd3JhcC1hcm91bmRcbiAgdGhpcy5zbGlkZWFibGVXaWR0aCA9IGNlbGxYO1xuICAvLyBzbGlkZXNcbiAgdGhpcy51cGRhdGVTbGlkZXMoKTtcbiAgLy8gY29udGFpbiBzbGlkZXMgdGFyZ2V0XG4gIHRoaXMuX2NvbnRhaW5TbGlkZXMoKTtcbiAgLy8gdXBkYXRlIHNsaWRlc1dpZHRoXG4gIHRoaXMuc2xpZGVzV2lkdGggPSBsZW4gPyB0aGlzLmdldExhc3RTbGlkZSgpLnRhcmdldCAtIHRoaXMuc2xpZGVzWzBdLnRhcmdldCA6IDA7XG59O1xuXG4vKipcbiAqIGNlbGwuZ2V0U2l6ZSgpIG9uIG11bHRpcGxlIGNlbGxzXG4gKiBAcGFyYW0ge0FycmF5fSBjZWxscyAtIGNlbGxzIHRvIHNpemVcbiAqL1xucHJvdG8uX3NpemVDZWxscyA9IGZ1bmN0aW9uKCBjZWxscyApIHtcbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5nZXRTaXplKCk7XG4gIH0gKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by51cGRhdGVTbGlkZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zbGlkZXMgPSBbXTtcbiAgaWYgKCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNsaWRlID0gbmV3IFNsaWRlKCB0aGlzICk7XG4gIHRoaXMuc2xpZGVzLnB1c2goIHNsaWRlICk7XG4gIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLm9yaWdpblNpZGUgPT0gJ2xlZnQnO1xuICB2YXIgbmV4dE1hcmdpbiA9IGlzT3JpZ2luTGVmdCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCc7XG5cbiAgdmFyIGNhbkNlbGxGaXQgPSB0aGlzLl9nZXRDYW5DZWxsRml0KCk7XG5cbiAgdGhpcy5jZWxscy5mb3JFYWNoKCBmdW5jdGlvbiggY2VsbCwgaSApIHtcbiAgICAvLyBqdXN0IGFkZCBjZWxsIGlmIGZpcnN0IGNlbGwgaW4gc2xpZGVcbiAgICBpZiAoICFzbGlkZS5jZWxscy5sZW5ndGggKSB7XG4gICAgICBzbGlkZS5hZGRDZWxsKCBjZWxsICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNsaWRlV2lkdGggPSAoIHNsaWRlLm91dGVyV2lkdGggLSBzbGlkZS5maXJzdE1hcmdpbiApICtcbiAgICAgICggY2VsbC5zaXplLm91dGVyV2lkdGggLSBjZWxsLnNpemVbIG5leHRNYXJnaW4gXSApO1xuXG4gICAgaWYgKCBjYW5DZWxsRml0LmNhbGwoIHRoaXMsIGksIHNsaWRlV2lkdGggKSApIHtcbiAgICAgIHNsaWRlLmFkZENlbGwoIGNlbGwgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9lc24ndCBmaXQsIG5ldyBzbGlkZVxuICAgICAgc2xpZGUudXBkYXRlVGFyZ2V0KCk7XG5cbiAgICAgIHNsaWRlID0gbmV3IFNsaWRlKCB0aGlzICk7XG4gICAgICB0aGlzLnNsaWRlcy5wdXNoKCBzbGlkZSApO1xuICAgICAgc2xpZGUuYWRkQ2VsbCggY2VsbCApO1xuICAgIH1cbiAgfSwgdGhpcyApO1xuICAvLyBsYXN0IHNsaWRlXG4gIHNsaWRlLnVwZGF0ZVRhcmdldCgpO1xuICAvLyB1cGRhdGUgLnNlbGVjdGVkU2xpZGVcbiAgdGhpcy51cGRhdGVTZWxlY3RlZFNsaWRlKCk7XG59O1xuXG5wcm90by5fZ2V0Q2FuQ2VsbEZpdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZ3JvdXBDZWxscyA9IHRoaXMub3B0aW9ucy5ncm91cENlbGxzO1xuICBpZiAoICFncm91cENlbGxzICkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgZ3JvdXBDZWxscyA9PSAnbnVtYmVyJyApIHtcbiAgICAvLyBncm91cCBieSBudW1iZXIuIDMgLT4gWzAsMSwyXSwgWzMsNCw1XSwgLi4uXG4gICAgdmFyIG51bWJlciA9IHBhcnNlSW50KCBncm91cENlbGxzLCAxMCApO1xuICAgIHJldHVybiBmdW5jdGlvbiggaSApIHtcbiAgICAgIHJldHVybiAoIGkgJSBudW1iZXIgKSAhPT0gMDtcbiAgICB9O1xuICB9XG4gIC8vIGRlZmF1bHQsIGdyb3VwIGJ5IHdpZHRoIG9mIHNsaWRlXG4gIC8vIHBhcnNlICc3NSVcbiAgdmFyIHBlcmNlbnRNYXRjaCA9IHR5cGVvZiBncm91cENlbGxzID09ICdzdHJpbmcnICYmXG4gICAgZ3JvdXBDZWxscy5tYXRjaCggL14oXFxkKyklJC8gKTtcbiAgdmFyIHBlcmNlbnQgPSBwZXJjZW50TWF0Y2ggPyBwYXJzZUludCggcGVyY2VudE1hdGNoWzFdLCAxMCApIC8gMTAwIDogMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCBpLCBzbGlkZVdpZHRoICkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXMgKi9cbiAgICByZXR1cm4gc2xpZGVXaWR0aCA8PSAoIHRoaXMuc2l6ZS5pbm5lcldpZHRoICsgMSApICogcGVyY2VudDtcbiAgfTtcbn07XG5cbi8vIGFsaWFzIF9pbml0IGZvciBqUXVlcnkgcGx1Z2luIC5mbGlja2l0eSgpXG5wcm90by5faW5pdCA9XG5wcm90by5yZXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucG9zaXRpb25DZWxscygpO1xuICB0aGlzLnBvc2l0aW9uU2xpZGVyQXRTZWxlY3RlZCgpO1xufTtcblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbiAgdGhpcy5zZXRDZWxsQWxpZ24oKTtcbiAgdGhpcy5jdXJzb3JQb3NpdGlvbiA9IHRoaXMuc2l6ZS5pbm5lcldpZHRoICogdGhpcy5jZWxsQWxpZ247XG59O1xuXG52YXIgY2VsbEFsaWduU2hvcnRoYW5kcyA9IHtcbiAgLy8gY2VsbCBhbGlnbiwgdGhlbiBiYXNlZCBvbiBvcmlnaW4gc2lkZVxuICBjZW50ZXI6IHtcbiAgICBsZWZ0OiAwLjUsXG4gICAgcmlnaHQ6IDAuNSxcbiAgfSxcbiAgbGVmdDoge1xuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IDEsXG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcmlnaHQ6IDAsXG4gICAgbGVmdDogMSxcbiAgfSxcbn07XG5cbnByb3RvLnNldENlbGxBbGlnbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2hvcnRoYW5kID0gY2VsbEFsaWduU2hvcnRoYW5kc1sgdGhpcy5vcHRpb25zLmNlbGxBbGlnbiBdO1xuICB0aGlzLmNlbGxBbGlnbiA9IHNob3J0aGFuZCA/IHNob3J0aGFuZFsgdGhpcy5vcmlnaW5TaWRlIF0gOiB0aGlzLm9wdGlvbnMuY2VsbEFsaWduO1xufTtcblxucHJvdG8uc2V0R2FsbGVyeVNpemUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMuc2V0R2FsbGVyeVNpemUgKSB7XG4gICAgdmFyIGhlaWdodCA9IHRoaXMub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCAmJiB0aGlzLnNlbGVjdGVkU2xpZGUgP1xuICAgICAgdGhpcy5zZWxlY3RlZFNsaWRlLmhlaWdodCA6IHRoaXMubWF4Q2VsbEhlaWdodDtcbiAgICB0aGlzLnZpZXdwb3J0LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cbn07XG5cbnByb3RvLl9nZXRXcmFwU2hpZnRDZWxscyA9IGZ1bmN0aW9uKCkge1xuICAvLyBvbmx5IGZvciB3cmFwLWFyb3VuZFxuICBpZiAoICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdW5zaGlmdCBwcmV2aW91cyBjZWxsc1xuICB0aGlzLl91bnNoaWZ0Q2VsbHMoIHRoaXMuYmVmb3JlU2hpZnRDZWxscyApO1xuICB0aGlzLl91bnNoaWZ0Q2VsbHMoIHRoaXMuYWZ0ZXJTaGlmdENlbGxzICk7XG4gIC8vIGdldCBiZWZvcmUgY2VsbHNcbiAgLy8gaW5pdGlhbCBnYXBcbiAgdmFyIGdhcFggPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICB2YXIgY2VsbEluZGV4ID0gdGhpcy5jZWxscy5sZW5ndGggLSAxO1xuICB0aGlzLmJlZm9yZVNoaWZ0Q2VsbHMgPSB0aGlzLl9nZXRHYXBDZWxscyggZ2FwWCwgY2VsbEluZGV4LCAtMSApO1xuICAvLyBnZXQgYWZ0ZXIgY2VsbHNcbiAgLy8gZW5kaW5nIGdhcCBiZXR3ZWVuIGxhc3QgY2VsbCBhbmQgZW5kIG9mIGdhbGxlcnkgdmlld3BvcnRcbiAgZ2FwWCA9IHRoaXMuc2l6ZS5pbm5lcldpZHRoIC0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgLy8gc3RhcnQgY2xvbmluZyBhdCBmaXJzdCBjZWxsLCB3b3JraW5nIGZvcndhcmRzXG4gIHRoaXMuYWZ0ZXJTaGlmdENlbGxzID0gdGhpcy5fZ2V0R2FwQ2VsbHMoIGdhcFgsIDAsIDEgKTtcbn07XG5cbnByb3RvLl9nZXRHYXBDZWxscyA9IGZ1bmN0aW9uKCBnYXBYLCBjZWxsSW5kZXgsIGluY3JlbWVudCApIHtcbiAgLy8ga2VlcCBhZGRpbmcgY2VsbHMgdW50aWwgdGhlIGNvdmVyIHRoZSBpbml0aWFsIGdhcFxuICB2YXIgY2VsbHMgPSBbXTtcbiAgd2hpbGUgKCBnYXBYID4gMCApIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbIGNlbGxJbmRleCBdO1xuICAgIGlmICggIWNlbGwgKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2VsbHMucHVzaCggY2VsbCApO1xuICAgIGNlbGxJbmRleCArPSBpbmNyZW1lbnQ7XG4gICAgZ2FwWCAtPSBjZWxsLnNpemUub3V0ZXJXaWR0aDtcbiAgfVxuICByZXR1cm4gY2VsbHM7XG59O1xuXG4vLyAtLS0tLSBjb250YWluIC0tLS0tIC8vXG5cbi8vIGNvbnRhaW4gY2VsbCB0YXJnZXRzIHNvIG5vIGV4Y2VzcyBzbGlkaW5nXG5wcm90by5fY29udGFpblNsaWRlcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMuY29udGFpbiB8fCB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCB8fCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpc1JpZ2h0VG9MZWZ0ID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0O1xuICB2YXIgYmVnaW5NYXJnaW4gPSBpc1JpZ2h0VG9MZWZ0ID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JztcbiAgdmFyIGVuZE1hcmdpbiA9IGlzUmlnaHRUb0xlZnQgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICB2YXIgY29udGVudFdpZHRoID0gdGhpcy5zbGlkZWFibGVXaWR0aCAtIHRoaXMuZ2V0TGFzdENlbGwoKS5zaXplWyBlbmRNYXJnaW4gXTtcbiAgLy8gY29udGVudCBpcyBsZXNzIHRoYW4gZ2FsbGVyeSBzaXplXG4gIHZhciBpc0NvbnRlbnRTbWFsbGVyID0gY29udGVudFdpZHRoIDwgdGhpcy5zaXplLmlubmVyV2lkdGg7XG4gIC8vIGJvdW5kc1xuICB2YXIgYmVnaW5Cb3VuZCA9IHRoaXMuY3Vyc29yUG9zaXRpb24gKyB0aGlzLmNlbGxzWzBdLnNpemVbIGJlZ2luTWFyZ2luIF07XG4gIHZhciBlbmRCb3VuZCA9IGNvbnRlbnRXaWR0aCAtIHRoaXMuc2l6ZS5pbm5lcldpZHRoICogKCAxIC0gdGhpcy5jZWxsQWxpZ24gKTtcbiAgLy8gY29udGFpbiBlYWNoIGNlbGwgdGFyZ2V0XG4gIHRoaXMuc2xpZGVzLmZvckVhY2goIGZ1bmN0aW9uKCBzbGlkZSApIHtcbiAgICBpZiAoIGlzQ29udGVudFNtYWxsZXIgKSB7XG4gICAgICAvLyBhbGwgY2VsbHMgZml0IGluc2lkZSBnYWxsZXJ5XG4gICAgICBzbGlkZS50YXJnZXQgPSBjb250ZW50V2lkdGggKiB0aGlzLmNlbGxBbGlnbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29udGFpbiB0byBib3VuZHNcbiAgICAgIHNsaWRlLnRhcmdldCA9IE1hdGgubWF4KCBzbGlkZS50YXJnZXQsIGJlZ2luQm91bmQgKTtcbiAgICAgIHNsaWRlLnRhcmdldCA9IE1hdGgubWluKCBzbGlkZS50YXJnZXQsIGVuZEJvdW5kICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuLyoqXG4gKiBlbWl0cyBldmVudHMgdmlhIGV2ZW50RW1pdHRlciBhbmQgalF1ZXJ5IGV2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBuYW1lIG9mIGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIG9yaWdpbmFsIGV2ZW50XG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gZXh0cmEgYXJndW1lbnRzXG4gKi9cbnByb3RvLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGFyZ3MgKSB7XG4gIHZhciBlbWl0QXJncyA9IGV2ZW50ID8gWyBldmVudCBdLmNvbmNhdCggYXJncyApIDogYXJncztcbiAgdGhpcy5lbWl0RXZlbnQoIHR5cGUsIGVtaXRBcmdzICk7XG5cbiAgaWYgKCBqUXVlcnkgJiYgdGhpcy4kZWxlbWVudCApIHtcbiAgICAvLyBkZWZhdWx0IHRyaWdnZXIgd2l0aCB0eXBlIGlmIG5vIGV2ZW50XG4gICAgdHlwZSArPSB0aGlzLm9wdGlvbnMubmFtZXNwYWNlSlF1ZXJ5RXZlbnRzID8gJy5mbGlja2l0eScgOiAnJztcbiAgICB2YXIgJGV2ZW50ID0gdHlwZTtcbiAgICBpZiAoIGV2ZW50ICkge1xuICAgICAgLy8gY3JlYXRlIGpRdWVyeSBldmVudFxuICAgICAgdmFyIGpRRXZlbnQgPSBuZXcgalF1ZXJ5LkV2ZW50KCBldmVudCApO1xuICAgICAgalFFdmVudC50eXBlID0gdHlwZTtcbiAgICAgICRldmVudCA9IGpRRXZlbnQ7XG4gICAgfVxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggJGV2ZW50LCBhcmdzICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlbGVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgc2xpZGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNXcmFwIC0gd2lsbCB3cmFwLWFyb3VuZCB0byBsYXN0L2ZpcnN0IGlmIGF0IHRoZSBlbmRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gd2lsbCBpbW1lZGlhdGVseSBzZXQgcG9zaXRpb24gYXQgc2VsZWN0ZWQgY2VsbFxuICovXG5wcm90by5zZWxlY3QgPSBmdW5jdGlvbiggaW5kZXgsIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICBpZiAoICF0aGlzLmlzQWN0aXZlICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpbmRleCA9IHBhcnNlSW50KCBpbmRleCwgMTAgKTtcbiAgdGhpcy5fd3JhcFNlbGVjdCggaW5kZXggKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kIHx8IGlzV3JhcCApIHtcbiAgICBpbmRleCA9IHV0aWxzLm1vZHVsbyggaW5kZXgsIHRoaXMuc2xpZGVzLmxlbmd0aCApO1xuICB9XG4gIC8vIGJhaWwgaWYgaW52YWxpZCBpbmRleFxuICBpZiAoICF0aGlzLnNsaWRlc1sgaW5kZXggXSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHByZXZJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleDtcbiAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gIHRoaXMudXBkYXRlU2VsZWN0ZWRTbGlkZSgpO1xuICBpZiAoIGlzSW5zdGFudCApIHtcbiAgICB0aGlzLnBvc2l0aW9uU2xpZGVyQXRTZWxlY3RlZCgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgfVxuICBpZiAoIHRoaXMub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCApIHtcbiAgICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIH1cbiAgLy8gZXZlbnRzXG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3NlbGVjdCcsIG51bGwsIFsgaW5kZXggXSApO1xuICAvLyBjaGFuZ2UgZXZlbnQgaWYgbmV3IGluZGV4XG4gIGlmICggaW5kZXggIT0gcHJldkluZGV4ICkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2NoYW5nZScsIG51bGwsIFsgaW5kZXggXSApO1xuICB9XG4gIC8vIG9sZCB2MSBldmVudCBuYW1lLCByZW1vdmUgaW4gdjNcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjZWxsU2VsZWN0Jyk7XG59O1xuXG4vLyB3cmFwcyBwb3NpdGlvbiBmb3Igd3JhcEFyb3VuZCwgdG8gbW92ZSB0byBjbG9zZXN0IHNsaWRlLiAjMTEzXG5wcm90by5fd3JhcFNlbGVjdCA9IGZ1bmN0aW9uKCBpbmRleCApIHtcbiAgdmFyIGxlbiA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgdmFyIGlzV3JhcHBpbmcgPSB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiBsZW4gPiAxO1xuICBpZiAoICFpc1dyYXBwaW5nICkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICB2YXIgd3JhcEluZGV4ID0gdXRpbHMubW9kdWxvKCBpbmRleCwgbGVuICk7XG4gIC8vIGdvIHRvIHNob3J0ZXN0XG4gIHZhciBkZWx0YSA9IE1hdGguYWJzKCB3cmFwSW5kZXggLSB0aGlzLnNlbGVjdGVkSW5kZXggKTtcbiAgdmFyIGJhY2tXcmFwRGVsdGEgPSBNYXRoLmFicyggKCB3cmFwSW5kZXggKyBsZW4gKSAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICB2YXIgZm9yZXdhcmRXcmFwRGVsdGEgPSBNYXRoLmFicyggKCB3cmFwSW5kZXggLSBsZW4gKSAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICBpZiAoICF0aGlzLmlzRHJhZ1NlbGVjdCAmJiBiYWNrV3JhcERlbHRhIDwgZGVsdGEgKSB7XG4gICAgaW5kZXggKz0gbGVuO1xuICB9IGVsc2UgaWYgKCAhdGhpcy5pc0RyYWdTZWxlY3QgJiYgZm9yZXdhcmRXcmFwRGVsdGEgPCBkZWx0YSApIHtcbiAgICBpbmRleCAtPSBsZW47XG4gIH1cbiAgLy8gd3JhcCBwb3NpdGlvbiBzbyBzbGlkZXIgaXMgd2l0aGluIG5vcm1hbCBhcmVhXG4gIGlmICggaW5kZXggPCAwICkge1xuICAgIHRoaXMueCAtPSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICB9IGVsc2UgaWYgKCBpbmRleCA+PSBsZW4gKSB7XG4gICAgdGhpcy54ICs9IHRoaXMuc2xpZGVhYmxlV2lkdGg7XG4gIH1cbn07XG5cbnByb3RvLnByZXZpb3VzID0gZnVuY3Rpb24oIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICB0aGlzLnNlbGVjdCggdGhpcy5zZWxlY3RlZEluZGV4IC0gMSwgaXNXcmFwLCBpc0luc3RhbnQgKTtcbn07XG5cbnByb3RvLm5leHQgPSBmdW5jdGlvbiggaXNXcmFwLCBpc0luc3RhbnQgKSB7XG4gIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXggKyAxLCBpc1dyYXAsIGlzSW5zdGFudCApO1xufTtcblxucHJvdG8udXBkYXRlU2VsZWN0ZWRTbGlkZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1sgdGhpcy5zZWxlY3RlZEluZGV4IF07XG4gIC8vIHNlbGVjdGVkSW5kZXggY291bGQgYmUgb3V0c2lkZSBvZiBzbGlkZXMsIGlmIHRyaWdnZXJlZCBiZWZvcmUgcmVzaXplKClcbiAgaWYgKCAhc2xpZGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHVuc2VsZWN0IHByZXZpb3VzIHNlbGVjdGVkIHNsaWRlXG4gIHRoaXMudW5zZWxlY3RTZWxlY3RlZFNsaWRlKCk7XG4gIC8vIHVwZGF0ZSBuZXcgc2VsZWN0ZWQgc2xpZGVcbiAgdGhpcy5zZWxlY3RlZFNsaWRlID0gc2xpZGU7XG4gIHNsaWRlLnNlbGVjdCgpO1xuICB0aGlzLnNlbGVjdGVkQ2VsbHMgPSBzbGlkZS5jZWxscztcbiAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gc2xpZGUuZ2V0Q2VsbEVsZW1lbnRzKCk7XG4gIC8vIEhBQ0s6IHNlbGVjdGVkQ2VsbCAmIHNlbGVjdGVkRWxlbWVudCBpcyBmaXJzdCBjZWxsIGluIHNsaWRlLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAvLyBSZW1vdmUgaW4gdjM/XG4gIHRoaXMuc2VsZWN0ZWRDZWxsID0gc2xpZGUuY2VsbHNbMF07XG4gIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRzWzBdO1xufTtcblxucHJvdG8udW5zZWxlY3RTZWxlY3RlZFNsaWRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5zZWxlY3RlZFNsaWRlICkge1xuICAgIHRoaXMuc2VsZWN0ZWRTbGlkZS51bnNlbGVjdCgpO1xuICB9XG59O1xuXG5wcm90by5zZWxlY3RJbml0aWFsSW5kZXggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGluaXRpYWxJbmRleCA9IHRoaXMub3B0aW9ucy5pbml0aWFsSW5kZXg7XG4gIC8vIGFscmVhZHkgYWN0aXZhdGVkLCBzZWxlY3QgcHJldmlvdXMgc2VsZWN0ZWRJbmRleFxuICBpZiAoIHRoaXMuaXNJbml0QWN0aXZhdGVkICkge1xuICAgIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXgsIGZhbHNlLCB0cnVlICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHNlbGVjdCB3aXRoIHNlbGVjdG9yIHN0cmluZ1xuICBpZiAoIGluaXRpYWxJbmRleCAmJiB0eXBlb2YgaW5pdGlhbEluZGV4ID09ICdzdHJpbmcnICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5xdWVyeUNlbGwoIGluaXRpYWxJbmRleCApO1xuICAgIGlmICggY2VsbCApIHtcbiAgICAgIHRoaXMuc2VsZWN0Q2VsbCggaW5pdGlhbEluZGV4LCBmYWxzZSwgdHJ1ZSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbmRleCA9IDA7XG4gIC8vIHNlbGVjdCB3aXRoIG51bWJlclxuICBpZiAoIGluaXRpYWxJbmRleCAmJiB0aGlzLnNsaWRlc1sgaW5pdGlhbEluZGV4IF0gKSB7XG4gICAgaW5kZXggPSBpbml0aWFsSW5kZXg7XG4gIH1cbiAgLy8gc2VsZWN0IGluc3RhbnRseVxuICB0aGlzLnNlbGVjdCggaW5kZXgsIGZhbHNlLCB0cnVlICk7XG59O1xuXG4vKipcbiAqIHNlbGVjdCBzbGlkZSBmcm9tIG51bWJlciBvciBjZWxsIGVsZW1lbnRcbiAqIEBwYXJhbSB7W0VsZW1lbnQsIE51bWJlcl19IHZhbHVlIC0gemVyby1iYXNlZCBpbmRleCBvciBlbGVtZW50IHRvIHNlbGVjdFxuICogQHBhcmFtIHtCb29sZWFufSBpc1dyYXAgLSBlbmFibGVzIHdyYXBwaW5nIGFyb3VuZCBmb3IgZXh0cmEgaW5kZXhcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gZGlzYWJsZXMgc2xpZGUgYW5pbWF0aW9uXG4gKi9cbnByb3RvLnNlbGVjdENlbGwgPSBmdW5jdGlvbiggdmFsdWUsIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICAvLyBnZXQgY2VsbFxuICB2YXIgY2VsbCA9IHRoaXMucXVlcnlDZWxsKCB2YWx1ZSApO1xuICBpZiAoICFjZWxsICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBpbmRleCA9IHRoaXMuZ2V0Q2VsbFNsaWRlSW5kZXgoIGNlbGwgKTtcbiAgdGhpcy5zZWxlY3QoIGluZGV4LCBpc1dyYXAsIGlzSW5zdGFudCApO1xufTtcblxucHJvdG8uZ2V0Q2VsbFNsaWRlSW5kZXggPSBmdW5jdGlvbiggY2VsbCApIHtcbiAgLy8gZ2V0IGluZGV4IG9mIHNsaWRlcyB0aGF0IGhhcyBjZWxsXG4gIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuc2xpZGVzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2ldO1xuICAgIHZhciBpbmRleCA9IHNsaWRlLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXQgY2VsbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXQgRmxpY2tpdHkuQ2VsbCwgZ2l2ZW4gYW4gRWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtIC0gbWF0Y2hpbmcgY2VsbCBlbGVtZW50XG4gKiBAcmV0dXJucyB7RmxpY2tpdHkuQ2VsbH0gY2VsbCAtIG1hdGNoaW5nIGNlbGxcbiAqL1xucHJvdG8uZ2V0Q2VsbCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAvLyBsb29wIHRocm91Z2ggY2VsbHMgdG8gZ2V0IHRoZSBvbmUgdGhhdCBtYXRjaGVzXG4gIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzW2ldO1xuICAgIGlmICggY2VsbC5lbGVtZW50ID09IGVsZW0gKSB7XG4gICAgICByZXR1cm4gY2VsbDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IGNvbGxlY3Rpb24gb2YgRmxpY2tpdHkuQ2VsbHMsIGdpdmVuIEVsZW1lbnRzXG4gKiBAcGFyYW0ge1tFbGVtZW50LCBBcnJheSwgTm9kZUxpc3RdfSBlbGVtcyAtIG11bHRpcGxlIGVsZW1lbnRzXG4gKiBAcmV0dXJucyB7QXJyYXl9IGNlbGxzIC0gRmxpY2tpdHkuQ2VsbHNcbiAqL1xucHJvdG8uZ2V0Q2VsbHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICB2YXIgY2VsbHMgPSBbXTtcbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmdldENlbGwoIGVsZW0gKTtcbiAgICBpZiAoIGNlbGwgKSB7XG4gICAgICBjZWxscy5wdXNoKCBjZWxsICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG4gIHJldHVybiBjZWxscztcbn07XG5cbi8qKlxuICogZ2V0IGNlbGwgZWxlbWVudHNcbiAqIEByZXR1cm5zIHtBcnJheX0gY2VsbEVsZW1zXG4gKi9cbnByb3RvLmdldENlbGxFbGVtZW50cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jZWxscy5tYXAoIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIHJldHVybiBjZWxsLmVsZW1lbnQ7XG4gIH0gKTtcbn07XG5cbi8qKlxuICogZ2V0IHBhcmVudCBjZWxsIGZyb20gYW4gZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtIC0gY2hpbGQgZWxlbWVudFxuICogQHJldHVybnMge0ZsaWNraXQuQ2VsbH0gY2VsbCAtIHBhcmVudCBjZWxsXG4gKi9cbnByb3RvLmdldFBhcmVudENlbGwgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgLy8gZmlyc3QgY2hlY2sgaWYgZWxlbSBpcyBjZWxsXG4gIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG4gIGlmICggY2VsbCApIHtcbiAgICByZXR1cm4gY2VsbDtcbiAgfVxuICAvLyB0cnkgdG8gZ2V0IHBhcmVudCBjZWxsIGVsZW1cbiAgZWxlbSA9IHV0aWxzLmdldFBhcmVudCggZWxlbSwgJy5mbGlja2l0eS1zbGlkZXIgPiAqJyApO1xuICByZXR1cm4gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG59O1xuXG4vKipcbiAqIGdldCBjZWxscyBhZGphY2VudCB0byBhIHNsaWRlXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGFkakNvdW50IC0gbnVtYmVyIG9mIGFkamFjZW50IHNsaWRlc1xuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCAtIGluZGV4IG9mIHNsaWRlIHRvIHN0YXJ0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGNlbGxzIC0gYXJyYXkgb2YgRmxpY2tpdHkuQ2VsbHNcbiAqL1xucHJvdG8uZ2V0QWRqYWNlbnRDZWxsRWxlbWVudHMgPSBmdW5jdGlvbiggYWRqQ291bnQsIGluZGV4ICkge1xuICBpZiAoICFhZGpDb3VudCApIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNsaWRlLmdldENlbGxFbGVtZW50cygpO1xuICB9XG4gIGluZGV4ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHRoaXMuc2VsZWN0ZWRJbmRleCA6IGluZGV4O1xuXG4gIHZhciBsZW4gPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gIGlmICggMSArICggYWRqQ291bnQgKiAyICkgPj0gbGVuICkge1xuICAgIHJldHVybiB0aGlzLmdldENlbGxFbGVtZW50cygpO1xuICB9XG5cbiAgdmFyIGNlbGxFbGVtcyA9IFtdO1xuICBmb3IgKCB2YXIgaSA9IGluZGV4IC0gYWRqQ291bnQ7IGkgPD0gaW5kZXggKyBhZGpDb3VudDsgaSsrICkge1xuICAgIHZhciBzbGlkZUluZGV4ID0gdGhpcy5vcHRpb25zLndyYXBBcm91bmQgPyB1dGlscy5tb2R1bG8oIGksIGxlbiApIDogaTtcbiAgICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1sgc2xpZGVJbmRleCBdO1xuICAgIGlmICggc2xpZGUgKSB7XG4gICAgICBjZWxsRWxlbXMgPSBjZWxsRWxlbXMuY29uY2F0KCBzbGlkZS5nZXRDZWxsRWxlbWVudHMoKSApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2VsbEVsZW1zO1xufTtcblxuLyoqXG4gKiBzZWxlY3Qgc2xpZGUgZnJvbSBudW1iZXIgb3IgY2VsbCBlbGVtZW50XG4gKiBAcGFyYW0ge1tFbGVtZW50LCBTdHJpbmcsIE51bWJlcl19IHNlbGVjdG9yIC0gZWxlbWVudCwgc2VsZWN0b3Igc3RyaW5nLCBvciBpbmRleFxuICogQHJldHVybnMge0ZsaWNraXR5LkNlbGx9IC0gbWF0Y2hpbmcgY2VsbFxuICovXG5wcm90by5xdWVyeUNlbGwgPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG4gIGlmICggdHlwZW9mIHNlbGVjdG9yID09ICdudW1iZXInICkge1xuICAgIC8vIHVzZSBudW1iZXIgYXMgaW5kZXhcbiAgICByZXR1cm4gdGhpcy5jZWxsc1sgc2VsZWN0b3IgXTtcbiAgfVxuICBpZiAoIHR5cGVvZiBzZWxlY3RvciA9PSAnc3RyaW5nJyApIHtcbiAgICAvLyBkbyBub3Qgc2VsZWN0IGludmFsaWQgc2VsZWN0b3JzIGZyb20gaGFzaDogIzEyMywgIy8uICM3OTFcbiAgICBpZiAoIHNlbGVjdG9yLm1hdGNoKCAvXlsjLl0/W1xcZC9dLyApICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB1c2Ugc3RyaW5nIGFzIHNlbGVjdG9yLCBnZXQgZWxlbWVudFxuICAgIHNlbGVjdG9yID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XG4gIH1cbiAgLy8gZ2V0IGNlbGwgZnJvbSBlbGVtZW50XG4gIHJldHVybiB0aGlzLmdldENlbGwoIHNlbGVjdG9yICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBldmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8udWlDaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbWl0RXZlbnQoJ3VpQ2hhbmdlJyk7XG59O1xuXG4vLyBrZWVwIGZvY3VzIG9uIGVsZW1lbnQgd2hlbiBjaGlsZCBVSSBlbGVtZW50cyBhcmUgY2xpY2tlZFxucHJvdG8uY2hpbGRVSVBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBIQUNLIGlPUyBkb2VzIG5vdCBhbGxvdyB0b3VjaCBldmVudHMgdG8gYnViYmxlIHVwPyFcbiAgaWYgKCBldmVudC50eXBlICE9ICd0b3VjaHN0YXJ0JyApIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIHRoaXMuZm9jdXMoKTtcbn07XG5cbi8vIC0tLS0tIHJlc2l6ZSAtLS0tLSAvL1xuXG5wcm90by5vbnJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLndhdGNoQ1NTKCk7XG4gIHRoaXMucmVzaXplKCk7XG59O1xuXG51dGlscy5kZWJvdW5jZU1ldGhvZCggRmxpY2tpdHksICdvbnJlc2l6ZScsIDE1MCApO1xuXG5wcm90by5yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgLy8gIzExNzcgZGlzYWJsZSByZXNpemUgYmVoYXZpb3Igd2hlbiBhbmltYXRpbmcgb3IgZHJhZ2dpbmcgZm9yIGlPUyAxNVxuICBpZiAoICF0aGlzLmlzQWN0aXZlIHx8IHRoaXMuaXNBbmltYXRpbmcgfHwgdGhpcy5pc0RyYWdnaW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmdldFNpemUoKTtcbiAgLy8gd3JhcCB2YWx1ZXNcbiAgaWYgKCB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCApIHtcbiAgICB0aGlzLnggPSB1dGlscy5tb2R1bG8oIHRoaXMueCwgdGhpcy5zbGlkZWFibGVXaWR0aCApO1xuICB9XG4gIHRoaXMucG9zaXRpb25DZWxscygpO1xuICB0aGlzLl9nZXRXcmFwU2hpZnRDZWxscygpO1xuICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIHRoaXMuZW1pdEV2ZW50KCdyZXNpemUnKTtcbiAgLy8gdXBkYXRlIHNlbGVjdGVkIGluZGV4IGZvciBncm91cCBzbGlkZXMsIGluc3RhbnRcbiAgLy8gVE9ETzogcG9zaXRpb24gY2FuIGJlIGxvc3QgYmV0d2VlbiBncm91cHMgb2YgdmFyaW91cyBudW1iZXJzXG4gIHZhciBzZWxlY3RlZEVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHMgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnRzWzBdO1xuICB0aGlzLnNlbGVjdENlbGwoIHNlbGVjdGVkRWxlbWVudCwgZmFsc2UsIHRydWUgKTtcbn07XG5cbi8vIHdhdGNoZXMgdGhlIDphZnRlciBwcm9wZXJ0eSwgYWN0aXZhdGVzL2RlYWN0aXZhdGVzXG5wcm90by53YXRjaENTUyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd2F0Y2hPcHRpb24gPSB0aGlzLm9wdGlvbnMud2F0Y2hDU1M7XG4gIGlmICggIXdhdGNoT3B0aW9uICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBhZnRlckNvbnRlbnQgPSBnZXRDb21wdXRlZFN0eWxlKCB0aGlzLmVsZW1lbnQsICc6YWZ0ZXInICkuY29udGVudDtcbiAgLy8gYWN0aXZhdGUgaWYgOmFmdGVyIHsgY29udGVudDogJ2ZsaWNraXR5JyB9XG4gIGlmICggYWZ0ZXJDb250ZW50LmluZGV4T2YoJ2ZsaWNraXR5JykgIT0gLTEgKSB7XG4gICAgdGhpcy5hY3RpdmF0ZSgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB9XG59O1xuXG4vLyAtLS0tLSBrZXlkb3duIC0tLS0tIC8vXG5cbi8vIGdvIHByZXZpb3VzL25leHQgaWYgbGVmdC9yaWdodCBrZXlzIHByZXNzZWRcbnByb3RvLm9ua2V5ZG93biA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgLy8gb25seSB3b3JrIGlmIGVsZW1lbnQgaXMgaW4gZm9jdXNcbiAgdmFyIGlzTm90Rm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSB0aGlzLmVsZW1lbnQ7XG4gIGlmICggIXRoaXMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5IHx8IGlzTm90Rm9jdXNlZCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IEZsaWNraXR5LmtleWJvYXJkSGFuZGxlcnNbIGV2ZW50LmtleUNvZGUgXTtcbiAgaWYgKCBoYW5kbGVyICkge1xuICAgIGhhbmRsZXIuY2FsbCggdGhpcyApO1xuICB9XG59O1xuXG5GbGlja2l0eS5rZXlib2FyZEhhbmRsZXJzID0ge1xuICAvLyBsZWZ0IGFycm93XG4gIDM3OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVmdE1ldGhvZCA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdCA/ICduZXh0JyA6ICdwcmV2aW91cyc7XG4gICAgdGhpcy51aUNoYW5nZSgpO1xuICAgIHRoaXNbIGxlZnRNZXRob2QgXSgpO1xuICB9LFxuICAvLyByaWdodCBhcnJvd1xuICAzOTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJpZ2h0TWV0aG9kID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gJ3ByZXZpb3VzJyA6ICduZXh0JztcbiAgICB0aGlzLnVpQ2hhbmdlKCk7XG4gICAgdGhpc1sgcmlnaHRNZXRob2QgXSgpO1xuICB9LFxufTtcblxuLy8gLS0tLS0gZm9jdXMgLS0tLS0gLy9cblxucHJvdG8uZm9jdXMgPSBmdW5jdGlvbigpIHtcbiAgLy8gVE9ETyByZW1vdmUgc2Nyb2xsVG8gb25jZSBmb2N1cyBvcHRpb25zIGdldHMgbW9yZSBzdXBwb3J0XG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1cyAuLi5cbiAgLy8gICAgI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICB2YXIgcHJldlNjcm9sbFkgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gIHRoaXMuZWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gIC8vIGhhY2sgdG8gZml4IHNjcm9sbCBqdW1wIGFmdGVyIGZvY3VzLCAjNzZcbiAgaWYgKCB3aW5kb3cucGFnZVlPZmZzZXQgIT0gcHJldlNjcm9sbFkgKSB7XG4gICAgd2luZG93LnNjcm9sbFRvKCB3aW5kb3cucGFnZVhPZmZzZXQsIHByZXZTY3JvbGxZICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlc3Ryb3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZGVhY3RpdmF0ZSBhbGwgRmxpY2tpdHkgZnVuY3Rpb25hbGl0eSwgYnV0IGtlZXAgc3R1ZmYgYXZhaWxhYmxlXG5wcm90by5kZWFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuaXNBY3RpdmUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmbGlja2l0eS1lbmFibGVkJyk7XG4gIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmbGlja2l0eS1ydGwnKTtcbiAgdGhpcy51bnNlbGVjdFNlbGVjdGVkU2xpZGUoKTtcbiAgLy8gZGVzdHJveSBjZWxsc1xuICB0aGlzLmNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGNlbGwuZGVzdHJveSgpO1xuICB9ICk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZCggdGhpcy52aWV3cG9ydCApO1xuICAvLyBtb3ZlIGNoaWxkIGVsZW1lbnRzIGJhY2sgaW50byBlbGVtZW50XG4gIG1vdmVFbGVtZW50cyggdGhpcy5zbGlkZXIuY2hpbGRyZW4sIHRoaXMuZWxlbWVudCApO1xuICBpZiAoIHRoaXMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5ICkge1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgdGhpcyApO1xuICB9XG4gIC8vIHNldCBmbGFnc1xuICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gIHRoaXMuZW1pdEV2ZW50KCdkZWFjdGl2YXRlJyk7XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMgKTtcbiAgdGhpcy5hbGxPZmYoKTtcbiAgdGhpcy5lbWl0RXZlbnQoJ2Rlc3Ryb3knKTtcbiAgaWYgKCBqUXVlcnkgJiYgdGhpcy4kZWxlbWVudCApIHtcbiAgICBqUXVlcnkucmVtb3ZlRGF0YSggdGhpcy5lbGVtZW50LCAnZmxpY2tpdHknICk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQ7XG4gIGRlbGV0ZSBpbnN0YW5jZXNbIHRoaXMuZ3VpZCBdO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJvdG90eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggcHJvdG8sIGFuaW1hdGVQcm90b3R5cGUgKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZXh0cmFzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogZ2V0IEZsaWNraXR5IGluc3RhbmNlIGZyb20gZWxlbWVudFxuICogQHBhcmFtIHtbRWxlbWVudCwgU3RyaW5nXX0gZWxlbSAtIGVsZW1lbnQgb3Igc2VsZWN0b3Igc3RyaW5nXG4gKiBAcmV0dXJucyB7RmxpY2tpdHl9IC0gRmxpY2tpdHkgaW5zdGFuY2VcbiAqL1xuRmxpY2tpdHkuZGF0YSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICBlbGVtID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtICk7XG4gIHZhciBpZCA9IGVsZW0gJiYgZWxlbS5mbGlja2l0eUdVSUQ7XG4gIHJldHVybiBpZCAmJiBpbnN0YW5jZXNbIGlkIF07XG59O1xuXG51dGlscy5odG1sSW5pdCggRmxpY2tpdHksICdmbGlja2l0eScgKTtcblxuaWYgKCBqUXVlcnkgJiYgalF1ZXJ5LmJyaWRnZXQgKSB7XG4gIGpRdWVyeS5icmlkZ2V0KCAnZmxpY2tpdHknLCBGbGlja2l0eSApO1xufVxuXG4vLyBzZXQgaW50ZXJuYWwgalF1ZXJ5LCBmb3IgV2VicGFjayArIGpRdWVyeSB2MywgIzQ3OFxuRmxpY2tpdHkuc2V0SlF1ZXJ5ID0gZnVuY3Rpb24oIGpxICkge1xuICBqUXVlcnkgPSBqcTtcbn07XG5cbkZsaWNraXR5LkNlbGwgPSBDZWxsO1xuRmxpY2tpdHkuU2xpZGUgPSBTbGlkZTtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59ICkgKTtcbn0pO1xuXG52YXIgdW5pcG9pbnRlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8qIVxuICogVW5pcG9pbnRlciB2Mi40LjBcbiAqIGJhc2UgY2xhc3MgZm9yIGRvaW5nIG9uZSB0aGluZyB3aXRoIHBvaW50ZXIgZXZlbnRcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qZ2xvYmFsIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgZXZFbWl0dGVyXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5Vbmlwb2ludGVyID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXJcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBFdkVtaXR0ZXIgKSB7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBVbmlwb2ludGVyKCkge31cblxuLy8gaW5oZXJpdCBFdkVtaXR0ZXJcbnZhciBwcm90byA9IFVuaXBvaW50ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG5wcm90by5iaW5kU3RhcnRFdmVudCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB0aGlzLl9iaW5kU3RhcnRFdmVudCggZWxlbSwgdHJ1ZSApO1xufTtcblxucHJvdG8udW5iaW5kU3RhcnRFdmVudCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB0aGlzLl9iaW5kU3RhcnRFdmVudCggZWxlbSwgZmFsc2UgKTtcbn07XG5cbi8qKlxuICogQWRkIG9yIHJlbW92ZSBzdGFydCBldmVudFxuICogQHBhcmFtIHtCb29sZWFufSBpc0FkZCAtIHJlbW92ZSBpZiBmYWxzZXlcbiAqL1xucHJvdG8uX2JpbmRTdGFydEV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIGlzQWRkICkge1xuICAvLyBtdW5nZSBpc0FkZCwgZGVmYXVsdCB0byB0cnVlXG4gIGlzQWRkID0gaXNBZGQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBpc0FkZDtcbiAgdmFyIGJpbmRNZXRob2QgPSBpc0FkZCA/ICdhZGRFdmVudExpc3RlbmVyJyA6ICdyZW1vdmVFdmVudExpc3RlbmVyJztcblxuICAvLyBkZWZhdWx0IHRvIG1vdXNlIGV2ZW50c1xuICB2YXIgc3RhcnRFdmVudCA9ICdtb3VzZWRvd24nO1xuICBpZiAoICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyApIHtcbiAgICAvLyBIQUNLIHByZWZlciBUb3VjaCBFdmVudHMgYXMgeW91IGNhbiBwcmV2ZW50RGVmYXVsdCBvbiB0b3VjaHN0YXJ0IHRvXG4gICAgLy8gZGlzYWJsZSBzY3JvbGwgaW4gaU9TICYgbW9iaWxlIENocm9tZSBtZXRhZml6enkvZmxpY2tpdHkjMTE3N1xuICAgIHN0YXJ0RXZlbnQgPSAndG91Y2hzdGFydCc7XG4gIH0gZWxzZSBpZiAoIHdpbmRvdy5Qb2ludGVyRXZlbnQgKSB7XG4gICAgLy8gUG9pbnRlciBFdmVudHNcbiAgICBzdGFydEV2ZW50ID0gJ3BvaW50ZXJkb3duJztcbiAgfVxuICBlbGVtWyBiaW5kTWV0aG9kIF0oIHN0YXJ0RXZlbnQsIHRoaXMgKTtcbn07XG5cbi8vIHRyaWdnZXIgaGFuZGxlciBtZXRob2RzIGZvciBldmVudHNcbnByb3RvLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgbWV0aG9kID0gJ29uJyArIGV2ZW50LnR5cGU7XG4gIGlmICggdGhpc1sgbWV0aG9kIF0gKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oIGV2ZW50ICk7XG4gIH1cbn07XG5cbi8vIHJldHVybnMgdGhlIHRvdWNoIHRoYXQgd2UncmUga2VlcGluZyB0cmFjayBvZlxucHJvdG8uZ2V0VG91Y2ggPSBmdW5jdGlvbiggdG91Y2hlcyApIHtcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRvdWNoZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTtcbiAgICBpZiAoIHRvdWNoLmlkZW50aWZpZXIgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICAgIHJldHVybiB0b3VjaDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIC0tLS0tIHN0YXJ0IGV2ZW50IC0tLS0tIC8vXG5cbnByb3RvLm9ubW91c2Vkb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBkaXNtaXNzIGNsaWNrcyBmcm9tIHJpZ2h0IG9yIG1pZGRsZSBidXR0b25zXG4gIHZhciBidXR0b24gPSBldmVudC5idXR0b247XG4gIGlmICggYnV0dG9uICYmICggYnV0dG9uICE9PSAwICYmIGJ1dHRvbiAhPT0gMSApICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9wb2ludGVyRG93biggZXZlbnQsIGV2ZW50ICk7XG59O1xuXG5wcm90by5vbnRvdWNoc3RhcnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb3duKCBldmVudCwgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gKTtcbn07XG5cbnByb3RvLm9ucG9pbnRlcmRvd24gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb3duKCBldmVudCwgZXZlbnQgKTtcbn07XG5cbi8qKlxuICogcG9pbnRlciBzdGFydFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqL1xucHJvdG8uX3BvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBkaXNtaXNzIHJpZ2h0IGNsaWNrIGFuZCBvdGhlciBwb2ludGVyc1xuICAvLyBidXR0b24gPSAwIGlzIG9rYXksIDEtNCBub3RcbiAgaWYgKCBldmVudC5idXR0b24gfHwgdGhpcy5pc1BvaW50ZXJEb3duICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuaXNQb2ludGVyRG93biA9IHRydWU7XG4gIC8vIHNhdmUgcG9pbnRlciBpZGVudGlmaWVyIHRvIG1hdGNoIHVwIHRvdWNoIGV2ZW50c1xuICB0aGlzLnBvaW50ZXJJZGVudGlmaWVyID0gcG9pbnRlci5wb2ludGVySWQgIT09IHVuZGVmaW5lZCA/XG4gICAgLy8gcG9pbnRlcklkIGZvciBwb2ludGVyIGV2ZW50cywgdG91Y2guaW5kZW50aWZpZXIgZm9yIHRvdWNoIGV2ZW50c1xuICAgIHBvaW50ZXIucG9pbnRlcklkIDogcG9pbnRlci5pZGVudGlmaWVyO1xuXG4gIHRoaXMucG9pbnRlckRvd24oIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5wb2ludGVyRG93biA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5fYmluZFBvc3RTdGFydEV2ZW50cyggZXZlbnQgKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyRG93bicsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gaGFzaCBvZiBldmVudHMgdG8gYmUgYm91bmQgYWZ0ZXIgc3RhcnQgZXZlbnRcbnZhciBwb3N0U3RhcnRFdmVudHMgPSB7XG4gIG1vdXNlZG93bjogWyAnbW91c2Vtb3ZlJywgJ21vdXNldXAnIF0sXG4gIHRvdWNoc3RhcnQ6IFsgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcsICd0b3VjaGNhbmNlbCcgXSxcbiAgcG9pbnRlcmRvd246IFsgJ3BvaW50ZXJtb3ZlJywgJ3BvaW50ZXJ1cCcsICdwb2ludGVyY2FuY2VsJyBdLFxufTtcblxucHJvdG8uX2JpbmRQb3N0U3RhcnRFdmVudHMgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggIWV2ZW50ICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBnZXQgcHJvcGVyIGV2ZW50cyB0byBtYXRjaCBzdGFydCBldmVudFxuICB2YXIgZXZlbnRzID0gcG9zdFN0YXJ0RXZlbnRzWyBldmVudC50eXBlIF07XG4gIC8vIGJpbmQgZXZlbnRzIHRvIG5vZGVcbiAgZXZlbnRzLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudE5hbWUgKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgdGhpcyApO1xuICB9LCB0aGlzICk7XG4gIC8vIHNhdmUgdGhlc2UgYXJndW1lbnRzXG4gIHRoaXMuX2JvdW5kUG9pbnRlckV2ZW50cyA9IGV2ZW50cztcbn07XG5cbnByb3RvLl91bmJpbmRQb3N0U3RhcnRFdmVudHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgZm9yIF9ib3VuZEV2ZW50cywgaW4gY2FzZSBkcmFnRW5kIHRyaWdnZXJlZCB0d2ljZSAob2xkIElFOCBidWcpXG4gIGlmICggIXRoaXMuX2JvdW5kUG9pbnRlckV2ZW50cyApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzLmZvckVhY2goIGZ1bmN0aW9uKCBldmVudE5hbWUgKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIGV2ZW50TmFtZSwgdGhpcyApO1xuICB9LCB0aGlzICk7XG5cbiAgZGVsZXRlIHRoaXMuX2JvdW5kUG9pbnRlckV2ZW50cztcbn07XG5cbi8vIC0tLS0tIG1vdmUgZXZlbnQgLS0tLS0gLy9cblxucHJvdG8ub25tb3VzZW1vdmUgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJNb3ZlKCBldmVudCwgZXZlbnQgKTtcbn07XG5cbnByb3RvLm9ucG9pbnRlcm1vdmUgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggZXZlbnQucG9pbnRlcklkID09IHRoaXMucG9pbnRlcklkZW50aWZpZXIgKSB7XG4gICAgdGhpcy5fcG9pbnRlck1vdmUoIGV2ZW50LCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5vbnRvdWNobW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRvdWNoID0gdGhpcy5nZXRUb3VjaCggZXZlbnQuY2hhbmdlZFRvdWNoZXMgKTtcbiAgaWYgKCB0b3VjaCApIHtcbiAgICB0aGlzLl9wb2ludGVyTW92ZSggZXZlbnQsIHRvdWNoICk7XG4gIH1cbn07XG5cbi8qKlxuICogcG9pbnRlciBtb3ZlXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICogQHByaXZhdGVcbiAqL1xucHJvdG8uX3BvaW50ZXJNb3ZlID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLnBvaW50ZXJNb3ZlKCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gcHVibGljXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyTW92ZScsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gLS0tLS0gZW5kIGV2ZW50IC0tLS0tIC8vXG5cblxucHJvdG8ub25tb3VzZXVwID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB0aGlzLl9wb2ludGVyVXAoIGV2ZW50LCBldmVudCApO1xufTtcblxucHJvdG8ub25wb2ludGVydXAgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggZXZlbnQucG9pbnRlcklkID09IHRoaXMucG9pbnRlcklkZW50aWZpZXIgKSB7XG4gICAgdGhpcy5fcG9pbnRlclVwKCBldmVudCwgZXZlbnQgKTtcbiAgfVxufTtcblxucHJvdG8ub250b3VjaGVuZCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRvdWNoID0gdGhpcy5nZXRUb3VjaCggZXZlbnQuY2hhbmdlZFRvdWNoZXMgKTtcbiAgaWYgKCB0b3VjaCApIHtcbiAgICB0aGlzLl9wb2ludGVyVXAoIGV2ZW50LCB0b3VjaCApO1xuICB9XG59O1xuXG4vKipcbiAqIHBvaW50ZXIgdXBcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50IG9yIFRvdWNofSBwb2ludGVyXG4gKiBAcHJpdmF0ZVxuICovXG5wcm90by5fcG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLl9wb2ludGVyRG9uZSgpO1xuICB0aGlzLnBvaW50ZXJVcCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbi8vIHB1YmxpY1xucHJvdG8ucG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJVcCcsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gLS0tLS0gcG9pbnRlciBkb25lIC0tLS0tIC8vXG5cbi8vIHRyaWdnZXJlZCBvbiBwb2ludGVyIHVwICYgcG9pbnRlciBjYW5jZWxcbnByb3RvLl9wb2ludGVyRG9uZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9wb2ludGVyUmVzZXQoKTtcbiAgdGhpcy5fdW5iaW5kUG9zdFN0YXJ0RXZlbnRzKCk7XG4gIHRoaXMucG9pbnRlckRvbmUoKTtcbn07XG5cbnByb3RvLl9wb2ludGVyUmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmVzZXQgcHJvcGVydGllc1xuICB0aGlzLmlzUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgZGVsZXRlIHRoaXMucG9pbnRlcklkZW50aWZpZXI7XG59O1xuXG5wcm90by5wb2ludGVyRG9uZSA9IG5vb3A7XG5cbi8vIC0tLS0tIHBvaW50ZXIgY2FuY2VsIC0tLS0tIC8vXG5cbnByb3RvLm9ucG9pbnRlcmNhbmNlbCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5wb2ludGVySWQgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICB0aGlzLl9wb2ludGVyQ2FuY2VsKCBldmVudCwgZXZlbnQgKTtcbiAgfVxufTtcblxucHJvdG8ub250b3VjaGNhbmNlbCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRvdWNoID0gdGhpcy5nZXRUb3VjaCggZXZlbnQuY2hhbmdlZFRvdWNoZXMgKTtcbiAgaWYgKCB0b3VjaCApIHtcbiAgICB0aGlzLl9wb2ludGVyQ2FuY2VsKCBldmVudCwgdG91Y2ggKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwb2ludGVyIGNhbmNlbFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqIEBwcml2YXRlXG4gKi9cbnByb3RvLl9wb2ludGVyQ2FuY2VsID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLl9wb2ludGVyRG9uZSgpO1xuICB0aGlzLnBvaW50ZXJDYW5jZWwoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG4vLyBwdWJsaWNcbnByb3RvLnBvaW50ZXJDYW5jZWwgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlckNhbmNlbCcsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbi8vIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGdldHRpbmcgeC95IGNvb3JkcyBmcm9tIGV2ZW50XG5Vbmlwb2ludGVyLmdldFBvaW50ZXJQb2ludCA9IGZ1bmN0aW9uKCBwb2ludGVyICkge1xuICByZXR1cm4ge1xuICAgIHg6IHBvaW50ZXIucGFnZVgsXG4gICAgeTogcG9pbnRlci5wYWdlWVxuICB9O1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBVbmlwb2ludGVyO1xuXG59KSk7XG59KTtcblxudmFyIHVuaWRyYWdnZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKiFcbiAqIFVuaWRyYWdnZXIgdjIuNC4wXG4gKiBEcmFnZ2FibGUgYmFzZSBjbGFzc1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bnVzZWQ6IHRydWUsIHVuZGVmOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHVuaXBvaW50ZXJcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LlVuaWRyYWdnZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LlVuaXBvaW50ZXJcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBVbmlwb2ludGVyICkge1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVbmlkcmFnZ2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIFVuaWRyYWdnZXIoKSB7fVxuXG4vLyBpbmhlcml0IFVuaXBvaW50ZXIgJiBFdkVtaXR0ZXJcbnZhciBwcm90byA9IFVuaWRyYWdnZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVW5pcG9pbnRlci5wcm90b3R5cGUgKTtcblxuLy8gLS0tLS0gYmluZCBzdGFydCAtLS0tLSAvL1xuXG5wcm90by5iaW5kSGFuZGxlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9iaW5kSGFuZGxlcyggdHJ1ZSApO1xufTtcblxucHJvdG8udW5iaW5kSGFuZGxlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9iaW5kSGFuZGxlcyggZmFsc2UgKTtcbn07XG5cbi8qKlxuICogQWRkIG9yIHJlbW92ZSBzdGFydCBldmVudFxuICogQHBhcmFtIHtCb29sZWFufSBpc0FkZFxuICovXG5wcm90by5fYmluZEhhbmRsZXMgPSBmdW5jdGlvbiggaXNBZGQgKSB7XG4gIC8vIG11bmdlIGlzQWRkLCBkZWZhdWx0IHRvIHRydWVcbiAgaXNBZGQgPSBpc0FkZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGlzQWRkO1xuICAvLyBiaW5kIGVhY2ggaGFuZGxlXG4gIHZhciBiaW5kTWV0aG9kID0gaXNBZGQgPyAnYWRkRXZlbnRMaXN0ZW5lcicgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG4gIHZhciB0b3VjaEFjdGlvbiA9IGlzQWRkID8gdGhpcy5fdG91Y2hBY3Rpb25WYWx1ZSA6ICcnO1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5oYW5kbGVzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBoYW5kbGUgPSB0aGlzLmhhbmRsZXNbaV07XG4gICAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGhhbmRsZSwgaXNBZGQgKTtcbiAgICBoYW5kbGVbIGJpbmRNZXRob2QgXSggJ2NsaWNrJywgdGhpcyApO1xuICAgIC8vIHRvdWNoLWFjdGlvbjogbm9uZSB0byBvdmVycmlkZSBicm93c2VyIHRvdWNoIGdlc3R1cmVzLiBtZXRhZml6enkvZmxpY2tpdHkjNTQwXG4gICAgaWYgKCB3aW5kb3cuUG9pbnRlckV2ZW50ICkge1xuICAgICAgaGFuZGxlLnN0eWxlLnRvdWNoQWN0aW9uID0gdG91Y2hBY3Rpb247XG4gICAgfVxuICB9XG59O1xuXG4vLyBwcm90b3R5cGUgc28gaXQgY2FuIGJlIG92ZXJ3cml0ZWFibGUgYnkgRmxpY2tpdHlcbnByb3RvLl90b3VjaEFjdGlvblZhbHVlID0gJ25vbmUnO1xuXG4vLyAtLS0tLSBzdGFydCBldmVudCAtLS0tLSAvL1xuXG4vKipcbiAqIHBvaW50ZXIgc3RhcnRcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50IG9yIFRvdWNofSBwb2ludGVyXG4gKi9cbnByb3RvLnBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB2YXIgaXNPa2F5ID0gdGhpcy5va2F5UG9pbnRlckRvd24oIGV2ZW50ICk7XG4gIGlmICggIWlzT2theSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdHJhY2sgc3RhcnQgZXZlbnQgcG9zaXRpb25cbiAgLy8gU2FmYXJpIDkgb3ZlcnJpZGVzIHBhZ2VYIGFuZCBwYWdlWS4gVGhlc2UgdmFsdWVzIG5lZWRzIHRvIGJlIGNvcGllZC4gZmxpY2tpdHkjODQyXG4gIHRoaXMucG9pbnRlckRvd25Qb2ludGVyID0ge1xuICAgIHBhZ2VYOiBwb2ludGVyLnBhZ2VYLFxuICAgIHBhZ2VZOiBwb2ludGVyLnBhZ2VZLFxuICB9O1xuXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHRoaXMucG9pbnRlckRvd25CbHVyKCk7XG4gIC8vIGJpbmQgbW92ZSBhbmQgZW5kIGV2ZW50c1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJEb3duJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyBub2RlcyB0aGF0IGhhdmUgdGV4dCBmaWVsZHNcbnZhciBjdXJzb3JOb2RlcyA9IHtcbiAgVEVYVEFSRUE6IHRydWUsXG4gIElOUFVUOiB0cnVlLFxuICBTRUxFQ1Q6IHRydWUsXG4gIE9QVElPTjogdHJ1ZSxcbn07XG5cbi8vIGlucHV0IHR5cGVzIHRoYXQgZG8gbm90IGhhdmUgdGV4dCBmaWVsZHNcbnZhciBjbGlja1R5cGVzID0ge1xuICByYWRpbzogdHJ1ZSxcbiAgY2hlY2tib3g6IHRydWUsXG4gIGJ1dHRvbjogdHJ1ZSxcbiAgc3VibWl0OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgZmlsZTogdHJ1ZSxcbn07XG5cbi8vIGRpc21pc3MgaW5wdXRzIHdpdGggdGV4dCBmaWVsZHMuIGZsaWNraXR5IzQwMywgZmxpY2tpdHkjNDA0XG5wcm90by5va2F5UG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBpc0N1cnNvck5vZGUgPSBjdXJzb3JOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIHZhciBpc0NsaWNrVHlwZSA9IGNsaWNrVHlwZXNbIGV2ZW50LnRhcmdldC50eXBlIF07XG4gIHZhciBpc09rYXkgPSAhaXNDdXJzb3JOb2RlIHx8IGlzQ2xpY2tUeXBlO1xuICBpZiAoICFpc09rYXkgKSB7XG4gICAgdGhpcy5fcG9pbnRlclJlc2V0KCk7XG4gIH1cbiAgcmV0dXJuIGlzT2theTtcbn07XG5cbi8vIGtsdWRnZSB0byBibHVyIHByZXZpb3VzbHkgZm9jdXNlZCBpbnB1dFxucHJvdG8ucG9pbnRlckRvd25CbHVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgLy8gZG8gbm90IGJsdXIgYm9keSBmb3IgSUUxMCwgbWV0YWZpenp5L2ZsaWNraXR5IzExN1xuICB2YXIgY2FuQmx1ciA9IGZvY3VzZWQgJiYgZm9jdXNlZC5ibHVyICYmIGZvY3VzZWQgIT0gZG9jdW1lbnQuYm9keTtcbiAgaWYgKCBjYW5CbHVyICkge1xuICAgIGZvY3VzZWQuYmx1cigpO1xuICB9XG59O1xuXG4vLyAtLS0tLSBtb3ZlIGV2ZW50IC0tLS0tIC8vXG5cbi8qKlxuICogZHJhZyBtb3ZlXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB0aGlzLl9kcmFnUG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlck1vdmUnLCBbIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yIF0gKTtcbiAgdGhpcy5fZHJhZ01vdmUoIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICk7XG59O1xuXG4vLyBiYXNlIHBvaW50ZXIgbW92ZSBsb2dpY1xucHJvdG8uX2RyYWdQb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB7XG4gICAgeDogcG9pbnRlci5wYWdlWCAtIHRoaXMucG9pbnRlckRvd25Qb2ludGVyLnBhZ2VYLFxuICAgIHk6IHBvaW50ZXIucGFnZVkgLSB0aGlzLnBvaW50ZXJEb3duUG9pbnRlci5wYWdlWVxuICB9O1xuICAvLyBzdGFydCBkcmFnIGlmIHBvaW50ZXIgaGFzIG1vdmVkIGZhciBlbm91Z2ggdG8gc3RhcnQgZHJhZ1xuICBpZiAoICF0aGlzLmlzRHJhZ2dpbmcgJiYgdGhpcy5oYXNEcmFnU3RhcnRlZCggbW92ZVZlY3RvciApICkge1xuICAgIHRoaXMuX2RyYWdTdGFydCggZXZlbnQsIHBvaW50ZXIgKTtcbiAgfVxuICByZXR1cm4gbW92ZVZlY3Rvcjtcbn07XG5cbi8vIGNvbmRpdGlvbiBpZiBwb2ludGVyIGhhcyBtb3ZlZCBmYXIgZW5vdWdoIHRvIHN0YXJ0IGRyYWdcbnByb3RvLmhhc0RyYWdTdGFydGVkID0gZnVuY3Rpb24oIG1vdmVWZWN0b3IgKSB7XG4gIHJldHVybiBNYXRoLmFicyggbW92ZVZlY3Rvci54ICkgPiAzIHx8IE1hdGguYWJzKCBtb3ZlVmVjdG9yLnkgKSA+IDM7XG59O1xuXG4vLyAtLS0tLSBlbmQgZXZlbnQgLS0tLS0gLy9cblxuLyoqXG4gKiBwb2ludGVyIHVwXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlclVwJywgWyBldmVudCwgcG9pbnRlciBdICk7XG4gIHRoaXMuX2RyYWdQb2ludGVyVXAoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5fZHJhZ1BvaW50ZXJVcCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgaWYgKCB0aGlzLmlzRHJhZ2dpbmcgKSB7XG4gICAgdGhpcy5fZHJhZ0VuZCggZXZlbnQsIHBvaW50ZXIgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBwb2ludGVyIGRpZG4ndCBtb3ZlIGVub3VnaCBmb3IgZHJhZyB0byBzdGFydFxuICAgIHRoaXMuX3N0YXRpY0NsaWNrKCBldmVudCwgcG9pbnRlciApO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkcmFnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGRyYWdTdGFydFxucHJvdG8uX2RyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgLy8gcHJldmVudCBjbGlja3NcbiAgdGhpcy5pc1ByZXZlbnRpbmdDbGlja3MgPSB0cnVlO1xuICB0aGlzLmRyYWdTdGFydCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLmRyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdkcmFnU3RhcnQnLCBbIGV2ZW50LCBwb2ludGVyIF0gKTtcbn07XG5cbi8vIGRyYWdNb3ZlXG5wcm90by5fZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIC8vIGRvIG5vdCBkcmFnIGlmIG5vdCBkcmFnZ2luZyB5ZXRcbiAgaWYgKCAhdGhpcy5pc0RyYWdnaW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuZHJhZ01vdmUoIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICk7XG59O1xuXG5wcm90by5kcmFnTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdkcmFnTW92ZScsIFsgZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgXSApO1xufTtcblxuLy8gZHJhZ0VuZFxucHJvdG8uX2RyYWdFbmQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIHNldCBmbGFnc1xuICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgLy8gcmUtZW5hYmxlIGNsaWNraW5nIGFzeW5jXG4gIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzLmlzUHJldmVudGluZ0NsaWNrcztcbiAgfS5iaW5kKCB0aGlzICkgKTtcblxuICB0aGlzLmRyYWdFbmQoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5kcmFnRW5kID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ2RyYWdFbmQnLCBbIGV2ZW50LCBwb2ludGVyIF0gKTtcbn07XG5cbi8vIC0tLS0tIG9uY2xpY2sgLS0tLS0gLy9cblxuLy8gaGFuZGxlIGFsbCBjbGlja3MgYW5kIHByZXZlbnQgY2xpY2tzIHdoZW4gZHJhZ2dpbmdcbnByb3RvLm9uY2xpY2sgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggdGhpcy5pc1ByZXZlbnRpbmdDbGlja3MgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gc3RhdGljQ2xpY2sgLS0tLS0gLy9cblxuLy8gdHJpZ2dlcmVkIGFmdGVyIHBvaW50ZXIgZG93biAmIHVwIHdpdGggbm8vdGlueSBtb3ZlbWVudFxucHJvdG8uX3N0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBpZ25vcmUgZW11bGF0ZWQgbW91c2UgdXAgY2xpY2tzXG4gIGlmICggdGhpcy5pc0lnbm9yaW5nTW91c2VVcCAmJiBldmVudC50eXBlID09ICdtb3VzZXVwJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnN0YXRpY0NsaWNrKCBldmVudCwgcG9pbnRlciApO1xuXG4gIC8vIHNldCBmbGFnIGZvciBlbXVsYXRlZCBjbGlja3MgMzAwbXMgYWZ0ZXIgdG91Y2hlbmRcbiAgaWYgKCBldmVudC50eXBlICE9ICdtb3VzZXVwJyApIHtcbiAgICB0aGlzLmlzSWdub3JpbmdNb3VzZVVwID0gdHJ1ZTtcbiAgICAvLyByZXNldCBmbGFnIGFmdGVyIDMwMG1zXG4gICAgc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICBkZWxldGUgdGhpcy5pc0lnbm9yaW5nTW91c2VVcDtcbiAgICB9LmJpbmQoIHRoaXMgKSwgNDAwICk7XG4gIH1cbn07XG5cbnByb3RvLnN0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3N0YXRpY0NsaWNrJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSB1dGlscyAtLS0tLSAvL1xuXG5VbmlkcmFnZ2VyLmdldFBvaW50ZXJQb2ludCA9IFVuaXBvaW50ZXIuZ2V0UG9pbnRlclBvaW50O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIFVuaWRyYWdnZXI7XG5cbn0pKTtcbn0pO1xuXG52YXIgZHJhZyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8vIGRyYWdcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIGZsaWNraXR5LFxuICAgICAgICB1bmlkcmFnZ2VyLFxuICAgICAgICB1dGlsc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuRmxpY2tpdHkgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgICAgd2luZG93LlVuaWRyYWdnZXIsXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pZHJhZ2dlciwgdXRpbHMgKSB7XG5cbi8vIC0tLS0tIGRlZmF1bHRzIC0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggRmxpY2tpdHkuZGVmYXVsdHMsIHtcbiAgZHJhZ2dhYmxlOiAnPjEnLFxuICBkcmFnVGhyZXNob2xkOiAzLFxufSApO1xuXG4vLyAtLS0tLSBjcmVhdGUgLS0tLS0gLy9cblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlRHJhZycpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkcmFnIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG51dGlscy5leHRlbmQoIHByb3RvLCBVbmlkcmFnZ2VyLnByb3RvdHlwZSApO1xucHJvdG8uX3RvdWNoQWN0aW9uVmFsdWUgPSAncGFuLXknO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8uX2NyZWF0ZURyYWcgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5vbkFjdGl2YXRlRHJhZyApO1xuICB0aGlzLm9uKCAndWlDaGFuZ2UnLCB0aGlzLl91aUNoYW5nZURyYWcgKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLm9uRGVhY3RpdmF0ZURyYWcgKTtcbiAgdGhpcy5vbiggJ2NlbGxDaGFuZ2UnLCB0aGlzLnVwZGF0ZURyYWdnYWJsZSApO1xuICAvLyBUT0RPIHVwZGF0ZURyYWdnYWJsZSBvbiByZXNpemU/IGlmIGdyb3VwQ2VsbHMgJiBzbGlkZXMgY2hhbmdlXG59O1xuXG5wcm90by5vbkFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmhhbmRsZXMgPSBbIHRoaXMudmlld3BvcnQgXTtcbiAgdGhpcy5iaW5kSGFuZGxlcygpO1xuICB0aGlzLnVwZGF0ZURyYWdnYWJsZSgpO1xufTtcblxucHJvdG8ub25EZWFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnVuYmluZEhhbmRsZXMoKTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xufTtcblxucHJvdG8udXBkYXRlRHJhZ2dhYmxlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRpc2FibGUgZHJhZ2dpbmcgaWYgbGVzcyB0aGFuIDIgc2xpZGVzLiAjMjc4XG4gIGlmICggdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9PSAnPjEnICkge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLnNsaWRlcy5sZW5ndGggPiAxO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlO1xuICB9XG4gIGlmICggdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtZHJhZ2dhYmxlJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xuICB9XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxucHJvdG8uYmluZERyYWcgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9IHRydWU7XG4gIHRoaXMudXBkYXRlRHJhZ2dhYmxlKCk7XG59O1xuXG5wcm90by51bmJpbmREcmFnID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgdGhpcy51cGRhdGVEcmFnZ2FibGUoKTtcbn07XG5cbnByb3RvLl91aUNoYW5nZURyYWcgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuaXNGcmVlU2Nyb2xsaW5nO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcG9pbnRlciBldmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8ucG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgdGhpcy5fcG9pbnRlckRvd25EZWZhdWx0KCBldmVudCwgcG9pbnRlciApO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaXNPa2F5ID0gdGhpcy5va2F5UG9pbnRlckRvd24oIGV2ZW50ICk7XG4gIGlmICggIWlzT2theSApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl9wb2ludGVyRG93blByZXZlbnREZWZhdWx0KCBldmVudCApO1xuICB0aGlzLnBvaW50ZXJEb3duRm9jdXMoIGV2ZW50ICk7XG4gIC8vIGJsdXJcbiAgaWYgKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZWxlbWVudCApIHtcbiAgICAvLyBkbyBub3QgYmx1ciBpZiBhbHJlYWR5IGZvY3VzZWRcbiAgICB0aGlzLnBvaW50ZXJEb3duQmx1cigpO1xuICB9XG5cbiAgLy8gc3RvcCBpZiBpdCB3YXMgbW92aW5nXG4gIHRoaXMuZHJhZ1ggPSB0aGlzLng7XG4gIHRoaXMudmlld3BvcnQuY2xhc3NMaXN0LmFkZCgnaXMtcG9pbnRlci1kb3duJyk7XG4gIC8vIHRyYWNrIHNjcm9sbGluZ1xuICB0aGlzLnBvaW50ZXJEb3duU2Nyb2xsID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCB0aGlzICk7XG5cbiAgdGhpcy5fcG9pbnRlckRvd25EZWZhdWx0KCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gZGVmYXVsdCBwb2ludGVyRG93biBsb2dpYywgdXNlZCBmb3Igc3RhdGljQ2xpY2tcbnByb3RvLl9wb2ludGVyRG93bkRlZmF1bHQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIHRyYWNrIHN0YXJ0IGV2ZW50IHBvc2l0aW9uXG4gIC8vIFNhZmFyaSA5IG92ZXJyaWRlcyBwYWdlWCBhbmQgcGFnZVkuIFRoZXNlIHZhbHVlcyBuZWVkcyB0byBiZSBjb3BpZWQuICM3NzlcbiAgdGhpcy5wb2ludGVyRG93blBvaW50ZXIgPSB7XG4gICAgcGFnZVg6IHBvaW50ZXIucGFnZVgsXG4gICAgcGFnZVk6IHBvaW50ZXIucGFnZVksXG4gIH07XG4gIC8vIGJpbmQgbW92ZSBhbmQgZW5kIGV2ZW50c1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyRG93bicsIGV2ZW50LCBbIHBvaW50ZXIgXSApO1xufTtcblxudmFyIGZvY3VzTm9kZXMgPSB7XG4gIElOUFVUOiB0cnVlLFxuICBURVhUQVJFQTogdHJ1ZSxcbiAgU0VMRUNUOiB0cnVlLFxufTtcblxucHJvdG8ucG9pbnRlckRvd25Gb2N1cyA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIGlzRm9jdXNOb2RlID0gZm9jdXNOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIGlmICggIWlzRm9jdXNOb2RlICkge1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxufTtcblxucHJvdG8uX3BvaW50ZXJEb3duUHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBpc1RvdWNoU3RhcnQgPSBldmVudC50eXBlID09ICd0b3VjaHN0YXJ0JztcbiAgdmFyIGlzVG91Y2hQb2ludGVyID0gZXZlbnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJztcbiAgdmFyIGlzRm9jdXNOb2RlID0gZm9jdXNOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIGlmICggIWlzVG91Y2hTdGFydCAmJiAhaXNUb3VjaFBvaW50ZXIgJiYgIWlzRm9jdXNOb2RlICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIG1vdmUgLS0tLS0gLy9cblxucHJvdG8uaGFzRHJhZ1N0YXJ0ZWQgPSBmdW5jdGlvbiggbW92ZVZlY3RvciApIHtcbiAgcmV0dXJuIE1hdGguYWJzKCBtb3ZlVmVjdG9yLnggKSA+IHRoaXMub3B0aW9ucy5kcmFnVGhyZXNob2xkO1xufTtcblxuLy8gLS0tLS0gdXAgLS0tLS0gLy9cblxucHJvdG8ucG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICBkZWxldGUgdGhpcy5pc1RvdWNoU2Nyb2xsaW5nO1xuICB0aGlzLnZpZXdwb3J0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLXBvaW50ZXItZG93bicpO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyVXAnLCBldmVudCwgWyBwb2ludGVyIF0gKTtcbiAgdGhpcy5fZHJhZ1BvaW50ZXJVcCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLnBvaW50ZXJEb25lID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2Nyb2xsJywgdGhpcyApO1xuICBkZWxldGUgdGhpcy5wb2ludGVyRG93blNjcm9sbDtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRyYWdnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLmRyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgaWYgKCAhdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5kcmFnU3RhcnRQb3NpdGlvbiA9IHRoaXMueDtcbiAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Njcm9sbCcsIHRoaXMgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnZHJhZ1N0YXJ0JywgZXZlbnQsIFsgcG9pbnRlciBdICk7XG59O1xuXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB0aGlzLl9kcmFnUG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3BvaW50ZXJNb3ZlJywgZXZlbnQsIFsgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG4gIHRoaXMuX2RyYWdNb3ZlKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApO1xufTtcblxucHJvdG8uZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgdGhpcy5wcmV2aW91c0RyYWdYID0gdGhpcy5kcmFnWDtcbiAgLy8gcmV2ZXJzZSBpZiByaWdodC10by1sZWZ0XG4gIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgPyAtMSA6IDE7XG4gIGlmICggdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgLy8gd3JhcCBhcm91bmQgbW92ZS4gIzU4OVxuICAgIG1vdmVWZWN0b3IueCAlPSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICB9XG4gIHZhciBkcmFnWCA9IHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gKyBtb3ZlVmVjdG9yLnggKiBkaXJlY3Rpb247XG5cbiAgaWYgKCAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgJiYgdGhpcy5zbGlkZXMubGVuZ3RoICkge1xuICAgIC8vIHNsb3cgZHJhZ1xuICAgIHZhciBvcmlnaW5Cb3VuZCA9IE1hdGgubWF4KCAtdGhpcy5zbGlkZXNbMF0udGFyZ2V0LCB0aGlzLmRyYWdTdGFydFBvc2l0aW9uICk7XG4gICAgZHJhZ1ggPSBkcmFnWCA+IG9yaWdpbkJvdW5kID8gKCBkcmFnWCArIG9yaWdpbkJvdW5kICkgKiAwLjUgOiBkcmFnWDtcbiAgICB2YXIgZW5kQm91bmQgPSBNYXRoLm1pbiggLXRoaXMuZ2V0TGFzdFNsaWRlKCkudGFyZ2V0LCB0aGlzLmRyYWdTdGFydFBvc2l0aW9uICk7XG4gICAgZHJhZ1ggPSBkcmFnWCA8IGVuZEJvdW5kID8gKCBkcmFnWCArIGVuZEJvdW5kICkgKiAwLjUgOiBkcmFnWDtcbiAgfVxuXG4gIHRoaXMuZHJhZ1ggPSBkcmFnWDtcblxuICB0aGlzLmRyYWdNb3ZlVGltZSA9IG5ldyBEYXRlKCk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2RyYWdNb3ZlJywgZXZlbnQsIFsgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG59O1xuXG5wcm90by5kcmFnRW5kID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIHRoaXMub3B0aW9ucy5mcmVlU2Nyb2xsICkge1xuICAgIHRoaXMuaXNGcmVlU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgfVxuICAvLyBzZXQgc2VsZWN0ZWRJbmRleCBiYXNlZCBvbiB3aGVyZSBmbGljayB3aWxsIGVuZCB1cFxuICB2YXIgaW5kZXggPSB0aGlzLmRyYWdFbmRSZXN0aW5nU2VsZWN0KCk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMuZnJlZVNjcm9sbCAmJiAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgLy8gaWYgZnJlZS1zY3JvbGwgJiBub3Qgd3JhcCBhcm91bmRcbiAgICAvLyBkbyBub3QgZnJlZS1zY3JvbGwgaWYgZ29pbmcgb3V0c2lkZSBvZiBib3VuZGluZyBzbGlkZXNcbiAgICAvLyBzbyBib3VuZGluZyBzbGlkZXMgY2FuIGF0dHJhY3Qgc2xpZGVyLCBhbmQga2VlcCBpdCBpbiBib3VuZHNcbiAgICB2YXIgcmVzdGluZ1ggPSB0aGlzLmdldFJlc3RpbmdQb3NpdGlvbigpO1xuICAgIHRoaXMuaXNGcmVlU2Nyb2xsaW5nID0gLXJlc3RpbmdYID4gdGhpcy5zbGlkZXNbMF0udGFyZ2V0ICYmXG4gICAgICAtcmVzdGluZ1ggPCB0aGlzLmdldExhc3RTbGlkZSgpLnRhcmdldDtcbiAgfSBlbHNlIGlmICggIXRoaXMub3B0aW9ucy5mcmVlU2Nyb2xsICYmIGluZGV4ID09IHRoaXMuc2VsZWN0ZWRJbmRleCApIHtcbiAgICAvLyBib29zdCBzZWxlY3Rpb24gaWYgc2VsZWN0ZWQgaW5kZXggaGFzIG5vdCBjaGFuZ2VkXG4gICAgaW5kZXggKz0gdGhpcy5kcmFnRW5kQm9vc3RTZWxlY3QoKTtcbiAgfVxuICBkZWxldGUgdGhpcy5wcmV2aW91c0RyYWdYO1xuICAvLyBhcHBseSBzZWxlY3Rpb25cbiAgLy8gVE9ETyByZWZhY3RvciB0aGlzLCBzZWxlY3RpbmcgaGVyZSBmZWVscyB3ZWlyZFxuICAvLyBIQUNLLCBzZXQgZmxhZyBzbyBkcmFnZ2luZyBzdGF5cyBpbiBjb3JyZWN0IGRpcmVjdGlvblxuICB0aGlzLmlzRHJhZ1NlbGVjdCA9IHRoaXMub3B0aW9ucy53cmFwQXJvdW5kO1xuICB0aGlzLnNlbGVjdCggaW5kZXggKTtcbiAgZGVsZXRlIHRoaXMuaXNEcmFnU2VsZWN0O1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdkcmFnRW5kJywgZXZlbnQsIFsgcG9pbnRlciBdICk7XG59O1xuXG5wcm90by5kcmFnRW5kUmVzdGluZ1NlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzdGluZ1ggPSB0aGlzLmdldFJlc3RpbmdQb3NpdGlvbigpO1xuICAvLyBob3cgZmFyIGF3YXkgZnJvbSBzZWxlY3RlZCBzbGlkZVxuICB2YXIgZGlzdGFuY2UgPSBNYXRoLmFicyggdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtcmVzdGluZ1gsIHRoaXMuc2VsZWN0ZWRJbmRleCApICk7XG4gIC8vIGdldCBjbG9zZXQgcmVzdGluZyBnb2luZyB1cCBhbmQgZ29pbmcgZG93blxuICB2YXIgcG9zaXRpdmVSZXN0aW5nID0gdGhpcy5fZ2V0Q2xvc2VzdFJlc3RpbmcoIHJlc3RpbmdYLCBkaXN0YW5jZSwgMSApO1xuICB2YXIgbmVnYXRpdmVSZXN0aW5nID0gdGhpcy5fZ2V0Q2xvc2VzdFJlc3RpbmcoIHJlc3RpbmdYLCBkaXN0YW5jZSwgLTEgKTtcbiAgLy8gdXNlIGNsb3NlciByZXN0aW5nIGZvciB3cmFwLWFyb3VuZFxuICB2YXIgaW5kZXggPSBwb3NpdGl2ZVJlc3RpbmcuZGlzdGFuY2UgPCBuZWdhdGl2ZVJlc3RpbmcuZGlzdGFuY2UgP1xuICAgIHBvc2l0aXZlUmVzdGluZy5pbmRleCA6IG5lZ2F0aXZlUmVzdGluZy5pbmRleDtcbiAgcmV0dXJuIGluZGV4O1xufTtcblxuLyoqXG4gKiBnaXZlbiByZXN0aW5nIFggYW5kIGRpc3RhbmNlIHRvIHNlbGVjdGVkIGNlbGxcbiAqIGdldCB0aGUgZGlzdGFuY2UgYW5kIGluZGV4IG9mIHRoZSBjbG9zZXN0IGNlbGxcbiAqIEBwYXJhbSB7TnVtYmVyfSByZXN0aW5nWCAtIGVzdGltYXRlZCBwb3N0LWZsaWNrIHJlc3RpbmcgcG9zaXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBkaXN0YW5jZSAtIGRpc3RhbmNlIHRvIHNlbGVjdGVkIGNlbGxcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5jcmVtZW50IC0gKzEgb3IgLTEsIGdvaW5nIHVwIG9yIGRvd25cbiAqIEByZXR1cm5zIHtPYmplY3R9IC0geyBkaXN0YW5jZToge051bWJlcn0sIGluZGV4OiB7SW50ZWdlcn0gfVxuICovXG5wcm90by5fZ2V0Q2xvc2VzdFJlc3RpbmcgPSBmdW5jdGlvbiggcmVzdGluZ1gsIGRpc3RhbmNlLCBpbmNyZW1lbnQgKSB7XG4gIHZhciBpbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleDtcbiAgdmFyIG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gIHZhciBjb25kaXRpb24gPSB0aGlzLm9wdGlvbnMuY29udGFpbiAmJiAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgP1xuICAgIC8vIGlmIGNvbnRhaW4sIGtlZXAgZ29pbmcgaWYgZGlzdGFuY2UgaXMgZXF1YWwgdG8gbWluRGlzdGFuY2VcbiAgICBmdW5jdGlvbiggZGlzdCwgbWluRGlzdCApIHtcbiAgICAgIHJldHVybiBkaXN0IDw9IG1pbkRpc3Q7XG4gICAgfSA6IGZ1bmN0aW9uKCBkaXN0LCBtaW5EaXN0ICkge1xuICAgICAgcmV0dXJuIGRpc3QgPCBtaW5EaXN0O1xuICAgIH07XG4gIHdoaWxlICggY29uZGl0aW9uKCBkaXN0YW5jZSwgbWluRGlzdGFuY2UgKSApIHtcbiAgICAvLyBtZWFzdXJlIGRpc3RhbmNlIHRvIG5leHQgY2VsbFxuICAgIGluZGV4ICs9IGluY3JlbWVudDtcbiAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIGRpc3RhbmNlID0gdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtcmVzdGluZ1gsIGluZGV4ICk7XG4gICAgaWYgKCBkaXN0YW5jZSA9PT0gbnVsbCApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkaXN0YW5jZSA9IE1hdGguYWJzKCBkaXN0YW5jZSApO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGlzdGFuY2U6IG1pbkRpc3RhbmNlLFxuICAgIC8vIHNlbGVjdGVkIHdhcyBwcmV2aW91cyBpbmRleFxuICAgIGluZGV4OiBpbmRleCAtIGluY3JlbWVudCxcbiAgfTtcbn07XG5cbi8qKlxuICogbWVhc3VyZSBkaXN0YW5jZSBiZXR3ZWVuIHggYW5kIGEgc2xpZGUgdGFyZ2V0XG4gKiBAcGFyYW0ge051bWJlcn0geCAtIGhvcml6b250YWwgcG9zaXRpb25cbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSBzbGlkZSBpbmRleFxuICogQHJldHVybnMge051bWJlcn0gLSBzbGlkZSBkaXN0YW5jZVxuICovXG5wcm90by5nZXRTbGlkZURpc3RhbmNlID0gZnVuY3Rpb24oIHgsIGluZGV4ICkge1xuICB2YXIgbGVuID0gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICAvLyB3cmFwIGFyb3VuZCBpZiBhdCBsZWFzdCAyIHNsaWRlc1xuICB2YXIgaXNXcmFwQXJvdW5kID0gdGhpcy5vcHRpb25zLndyYXBBcm91bmQgJiYgbGVuID4gMTtcbiAgdmFyIHNsaWRlSW5kZXggPSBpc1dyYXBBcm91bmQgPyB1dGlscy5tb2R1bG8oIGluZGV4LCBsZW4gKSA6IGluZGV4O1xuICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1sgc2xpZGVJbmRleCBdO1xuICBpZiAoICFzbGlkZSApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBhZGQgZGlzdGFuY2UgZm9yIHdyYXAtYXJvdW5kIHNsaWRlc1xuICB2YXIgd3JhcCA9IGlzV3JhcEFyb3VuZCA/IHRoaXMuc2xpZGVhYmxlV2lkdGggKiBNYXRoLmZsb29yKCBpbmRleC9sZW4gKSA6IDA7XG4gIHJldHVybiB4IC0gKCBzbGlkZS50YXJnZXQgKyB3cmFwICk7XG59O1xuXG5wcm90by5kcmFnRW5kQm9vc3RTZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG8gbm90IGJvb3N0IGlmIG5vIHByZXZpb3VzRHJhZ1ggb3IgZHJhZ01vdmVUaW1lXG4gIGlmICggdGhpcy5wcmV2aW91c0RyYWdYID09PSB1bmRlZmluZWQgfHwgIXRoaXMuZHJhZ01vdmVUaW1lIHx8XG4gICAgLy8gb3IgaWYgZHJhZyB3YXMgaGVsZCBmb3IgMTAwIG1zXG4gICAgbmV3IERhdGUoKSAtIHRoaXMuZHJhZ01vdmVUaW1lID4gMTAwICkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIGRpc3RhbmNlID0gdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtdGhpcy5kcmFnWCwgdGhpcy5zZWxlY3RlZEluZGV4ICk7XG4gIHZhciBkZWx0YSA9IHRoaXMucHJldmlvdXNEcmFnWCAtIHRoaXMuZHJhZ1g7XG4gIGlmICggZGlzdGFuY2UgPiAwICYmIGRlbHRhID4gMCApIHtcbiAgICAvLyBib29zdCB0byBuZXh0IGlmIG1vdmluZyB0b3dhcmRzIHRoZSByaWdodCwgYW5kIHBvc2l0aXZlIHZlbG9jaXR5XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoIGRpc3RhbmNlIDwgMCAmJiBkZWx0YSA8IDAgKSB7XG4gICAgLy8gYm9vc3QgdG8gcHJldmlvdXMgaWYgbW92aW5nIHRvd2FyZHMgdGhlIGxlZnQsIGFuZCBuZWdhdGl2ZSB2ZWxvY2l0eVxuICAgIHJldHVybiAtMTtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbi8vIC0tLS0tIHN0YXRpY0NsaWNrIC0tLS0tIC8vXG5cbnByb3RvLnN0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBnZXQgY2xpY2tlZENlbGwsIGlmIGNlbGwgd2FzIGNsaWNrZWRcbiAgdmFyIGNsaWNrZWRDZWxsID0gdGhpcy5nZXRQYXJlbnRDZWxsKCBldmVudC50YXJnZXQgKTtcbiAgdmFyIGNlbGxFbGVtID0gY2xpY2tlZENlbGwgJiYgY2xpY2tlZENlbGwuZWxlbWVudDtcbiAgdmFyIGNlbGxJbmRleCA9IGNsaWNrZWRDZWxsICYmIHRoaXMuY2VsbHMuaW5kZXhPZiggY2xpY2tlZENlbGwgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnc3RhdGljQ2xpY2snLCBldmVudCwgWyBwb2ludGVyLCBjZWxsRWxlbSwgY2VsbEluZGV4IF0gKTtcbn07XG5cbi8vIC0tLS0tIHNjcm9sbCAtLS0tLSAvL1xuXG5wcm90by5vbnNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2Nyb2xsID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgdmFyIHNjcm9sbE1vdmVYID0gdGhpcy5wb2ludGVyRG93blNjcm9sbC54IC0gc2Nyb2xsLng7XG4gIHZhciBzY3JvbGxNb3ZlWSA9IHRoaXMucG9pbnRlckRvd25TY3JvbGwueSAtIHNjcm9sbC55O1xuICAvLyBjYW5jZWwgY2xpY2svdGFwIGlmIHNjcm9sbCBpcyB0b28gbXVjaFxuICBpZiAoIE1hdGguYWJzKCBzY3JvbGxNb3ZlWCApID4gMyB8fCBNYXRoLmFicyggc2Nyb2xsTW92ZVkgKSA+IDMgKSB7XG4gICAgdGhpcy5fcG9pbnRlckRvbmUoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gdXRpbHMgLS0tLS0gLy9cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsUG9zaXRpb24oKSB7XG4gIHJldHVybiB7XG4gICAgeDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldCxcbiAgfTtcbn1cblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBGbGlja2l0eTtcblxufSApICk7XG59KTtcblxudmFyIHByZXZOZXh0QnV0dG9uID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLy8gcHJldi9uZXh0IGJ1dHRvbnNcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIGZsaWNraXR5LFxuICAgICAgICB1bmlwb2ludGVyLFxuICAgICAgICB1dGlsc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgICAgd2luZG93LlVuaXBvaW50ZXIsXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pcG9pbnRlciwgdXRpbHMgKSB7XG5cbnZhciBzdmdVUkkgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmV2TmV4dEJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBQcmV2TmV4dEJ1dHRvbiggZGlyZWN0aW9uLCBwYXJlbnQgKSB7XG4gIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fY3JlYXRlKCk7XG59XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFVuaXBvaW50ZXIucHJvdG90eXBlICk7XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHByb3BlcnRpZXNcbiAgdGhpcy5pc0VuYWJsZWQgPSB0cnVlO1xuICB0aGlzLmlzUHJldmlvdXMgPSB0aGlzLmRpcmVjdGlvbiA9PSAtMTtcbiAgdmFyIGxlZnREaXJlY3Rpb24gPSB0aGlzLnBhcmVudC5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gMSA6IC0xO1xuICB0aGlzLmlzTGVmdCA9IHRoaXMuZGlyZWN0aW9uID09IGxlZnREaXJlY3Rpb247XG5cbiAgdmFyIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgZWxlbWVudC5jbGFzc05hbWUgPSAnZmxpY2tpdHktYnV0dG9uIGZsaWNraXR5LXByZXYtbmV4dC1idXR0b24nO1xuICBlbGVtZW50LmNsYXNzTmFtZSArPSB0aGlzLmlzUHJldmlvdXMgPyAnIHByZXZpb3VzJyA6ICcgbmV4dCc7XG4gIC8vIHByZXZlbnQgYnV0dG9uIGZyb20gc3VibWl0dGluZyBmb3JtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwODM2MDc2LzE4MjE4M1xuICBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ3R5cGUnLCAnYnV0dG9uJyApO1xuICAvLyBpbml0IGFzIGRpc2FibGVkXG4gIHRoaXMuZGlzYWJsZSgpO1xuXG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1sYWJlbCcsIHRoaXMuaXNQcmV2aW91cyA/ICdQcmV2aW91cycgOiAnTmV4dCcgKTtcblxuICAvLyBjcmVhdGUgYXJyb3dcbiAgdmFyIHN2ZyA9IHRoaXMuY3JlYXRlU1ZHKCk7XG4gIGVsZW1lbnQuYXBwZW5kQ2hpbGQoIHN2ZyApO1xuICAvLyBldmVudHNcbiAgdGhpcy5wYXJlbnQub24oICdzZWxlY3QnLCB0aGlzLnVwZGF0ZS5iaW5kKCB0aGlzICkgKTtcbiAgdGhpcy5vbiggJ3BvaW50ZXJEb3duJywgdGhpcy5wYXJlbnQuY2hpbGRVSVBvaW50ZXJEb3duLmJpbmQoIHRoaXMucGFyZW50ICkgKTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmJpbmRTdGFydEV2ZW50KCB0aGlzLmVsZW1lbnQgKTtcbiAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMgKTtcbiAgLy8gYWRkIHRvIERPTVxuICB0aGlzLnBhcmVudC5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5kZWFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlbW92ZSBmcm9tIERPTVxuICB0aGlzLnBhcmVudC5lbGVtZW50LnJlbW92ZUNoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbiAgLy8gY2xpY2sgZXZlbnRzXG4gIHRoaXMudW5iaW5kU3RhcnRFdmVudCggdGhpcy5lbGVtZW50ICk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzICk7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuY3JlYXRlU1ZHID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoIHN2Z1VSSSwgJ3N2ZycgKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgJ2ZsaWNraXR5LWJ1dHRvbi1pY29uJyApO1xuICBzdmcuc2V0QXR0cmlidXRlKCAndmlld0JveCcsICcwIDAgMTAwIDEwMCcgKTtcbiAgdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoIHN2Z1VSSSwgJ3BhdGgnICk7XG4gIHZhciBwYXRoTW92ZW1lbnRzID0gZ2V0QXJyb3dNb3ZlbWVudHMoIHRoaXMucGFyZW50Lm9wdGlvbnMuYXJyb3dTaGFwZSApO1xuICBwYXRoLnNldEF0dHJpYnV0ZSggJ2QnLCBwYXRoTW92ZW1lbnRzICk7XG4gIHBhdGguc2V0QXR0cmlidXRlKCAnY2xhc3MnLCAnYXJyb3cnICk7XG4gIC8vIHJvdGF0ZSBhcnJvd1xuICBpZiAoICF0aGlzLmlzTGVmdCApIHtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSggJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMTAwLCAxMDApIHJvdGF0ZSgxODApICcgKTtcbiAgfVxuICBzdmcuYXBwZW5kQ2hpbGQoIHBhdGggKTtcbiAgcmV0dXJuIHN2Zztcbn07XG5cbi8vIGdldCBTVkcgcGF0aCBtb3ZtZW1lbnRcbmZ1bmN0aW9uIGdldEFycm93TW92ZW1lbnRzKCBzaGFwZSApIHtcbiAgLy8gdXNlIHNoYXBlIGFzIG1vdmVtZW50IGlmIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBzaGFwZSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gc2hhcGU7XG4gIH1cbiAgLy8gY3JlYXRlIG1vdmVtZW50IHN0cmluZ1xuICByZXR1cm4gJ00gJyArIHNoYXBlLngwICsgJyw1MCcgK1xuICAgICcgTCAnICsgc2hhcGUueDEgKyAnLCcgKyAoIHNoYXBlLnkxICsgNTAgKSArXG4gICAgJyBMICcgKyBzaGFwZS54MiArICcsJyArICggc2hhcGUueTIgKyA1MCApICtcbiAgICAnIEwgJyArIHNoYXBlLngzICsgJyw1MCAnICtcbiAgICAnIEwgJyArIHNoYXBlLngyICsgJywnICsgKCA1MCAtIHNoYXBlLnkyICkgK1xuICAgICcgTCAnICsgc2hhcGUueDEgKyAnLCcgKyAoIDUwIC0gc2hhcGUueTEgKSArXG4gICAgJyBaJztcbn1cblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gdXRpbHMuaGFuZGxlRXZlbnQ7XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuaXNFbmFibGVkICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBhcmVudC51aUNoYW5nZSgpO1xuICB2YXIgbWV0aG9kID0gdGhpcy5pc1ByZXZpb3VzID8gJ3ByZXZpb3VzJyA6ICduZXh0JztcbiAgdGhpcy5wYXJlbnRbIG1ldGhvZCBdKCk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuaXNFbmFibGVkICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgdGhpcy5pc0VuYWJsZWQgPSB0cnVlO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5pc0VuYWJsZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudC5kaXNhYmxlZCA9IHRydWU7XG4gIHRoaXMuaXNFbmFibGVkID0gZmFsc2U7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGluZGV4IG9mIGZpcnN0IG9yIGxhc3Qgc2xpZGUsIGlmIHByZXZpb3VzIG9yIG5leHRcbiAgdmFyIHNsaWRlcyA9IHRoaXMucGFyZW50LnNsaWRlcztcbiAgLy8gZW5hYmxlIGlzIHdyYXBBcm91bmQgYW5kIGF0IGxlYXN0IDIgc2xpZGVzXG4gIGlmICggdGhpcy5wYXJlbnQub3B0aW9ucy53cmFwQXJvdW5kICYmIHNsaWRlcy5sZW5ndGggPiAxICkge1xuICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBzbGlkZXMubGVuZ3RoID8gc2xpZGVzLmxlbmd0aCAtIDEgOiAwO1xuICB2YXIgYm91bmRJbmRleCA9IHRoaXMuaXNQcmV2aW91cyA/IDAgOiBsYXN0SW5kZXg7XG4gIHZhciBtZXRob2QgPSB0aGlzLnBhcmVudC5zZWxlY3RlZEluZGV4ID09IGJvdW5kSW5kZXggPyAnZGlzYWJsZScgOiAnZW5hYmxlJztcbiAgdGhpc1sgbWV0aG9kIF0oKTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB0aGlzLmFsbE9mZigpO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmxpY2tpdHkgcHJvdG90eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggRmxpY2tpdHkuZGVmYXVsdHMsIHtcbiAgcHJldk5leHRCdXR0b25zOiB0cnVlLFxuICBhcnJvd1NoYXBlOiB7XG4gICAgeDA6IDEwLFxuICAgIHgxOiA2MCwgeTE6IDUwLFxuICAgIHgyOiA3MCwgeTI6IDQwLFxuICAgIHgzOiAzMCxcbiAgfSxcbn0gKTtcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlUHJldk5leHRCdXR0b25zJyk7XG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbnByb3RvLl9jcmVhdGVQcmV2TmV4dEJ1dHRvbnMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLnByZXZOZXh0QnV0dG9ucyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnByZXZCdXR0b24gPSBuZXcgUHJldk5leHRCdXR0b24oIC0xLCB0aGlzICk7XG4gIHRoaXMubmV4dEJ1dHRvbiA9IG5ldyBQcmV2TmV4dEJ1dHRvbiggMSwgdGhpcyApO1xuXG4gIHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMuYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgKTtcbn07XG5cbnByb3RvLmFjdGl2YXRlUHJldk5leHRCdXR0b25zID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucHJldkJ1dHRvbi5hY3RpdmF0ZSgpO1xuICB0aGlzLm5leHRCdXR0b24uYWN0aXZhdGUoKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgKTtcbn07XG5cbnByb3RvLmRlYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wcmV2QnV0dG9uLmRlYWN0aXZhdGUoKTtcbiAgdGhpcy5uZXh0QnV0dG9uLmRlYWN0aXZhdGUoKTtcbiAgdGhpcy5vZmYoICdkZWFjdGl2YXRlJywgdGhpcy5kZWFjdGl2YXRlUHJldk5leHRCdXR0b25zICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuRmxpY2tpdHkuUHJldk5leHRCdXR0b24gPSBQcmV2TmV4dEJ1dHRvbjtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59ICkgKTtcbn0pO1xuXG52YXIgcGFnZURvdHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBwYWdlIGRvdHNcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIGZsaWNraXR5LFxuICAgICAgICB1bmlwb2ludGVyLFxuICAgICAgICB1dGlsc1xuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgICAgd2luZG93LlVuaXBvaW50ZXIsXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pcG9pbnRlciwgdXRpbHMgKSB7XG5cbmZ1bmN0aW9uIFBhZ2VEb3RzKCBwYXJlbnQgKSB7XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9jcmVhdGUoKTtcbn1cblxuUGFnZURvdHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVW5pcG9pbnRlci5wcm90b3R5cGUgKTtcblxuUGFnZURvdHMucHJvdG90eXBlLl9jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gY3JlYXRlIGhvbGRlciBlbGVtZW50XG4gIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb2wnKTtcbiAgdGhpcy5ob2xkZXIuY2xhc3NOYW1lID0gJ2ZsaWNraXR5LXBhZ2UtZG90cyc7XG4gIC8vIGNyZWF0ZSBkb3RzLCBhcnJheSBvZiBlbGVtZW50c1xuICB0aGlzLmRvdHMgPSBbXTtcbiAgLy8gZXZlbnRzXG4gIHRoaXMuaGFuZGxlQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCggdGhpcyApO1xuICB0aGlzLm9uKCAncG9pbnRlckRvd24nLCB0aGlzLnBhcmVudC5jaGlsZFVJUG9pbnRlckRvd24uYmluZCggdGhpcy5wYXJlbnQgKSApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2V0RG90cygpO1xuICB0aGlzLmhvbGRlci5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrICk7XG4gIHRoaXMuYmluZFN0YXJ0RXZlbnQoIHRoaXMuaG9sZGVyICk7XG4gIC8vIGFkZCB0byBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5hcHBlbmRDaGlsZCggdGhpcy5ob2xkZXIgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5kZWFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuaG9sZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2sgKTtcbiAgdGhpcy51bmJpbmRTdGFydEV2ZW50KCB0aGlzLmhvbGRlciApO1xuICAvLyByZW1vdmUgZnJvbSBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5yZW1vdmVDaGlsZCggdGhpcy5ob2xkZXIgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5zZXREb3RzID0gZnVuY3Rpb24oKSB7XG4gIC8vIGdldCBkaWZmZXJlbmNlIGJldHdlZW4gbnVtYmVyIG9mIHNsaWRlcyBhbmQgbnVtYmVyIG9mIGRvdHNcbiAgdmFyIGRlbHRhID0gdGhpcy5wYXJlbnQuc2xpZGVzLmxlbmd0aCAtIHRoaXMuZG90cy5sZW5ndGg7XG4gIGlmICggZGVsdGEgPiAwICkge1xuICAgIHRoaXMuYWRkRG90cyggZGVsdGEgKTtcbiAgfSBlbHNlIGlmICggZGVsdGEgPCAwICkge1xuICAgIHRoaXMucmVtb3ZlRG90cyggLWRlbHRhICk7XG4gIH1cbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5hZGREb3RzID0gZnVuY3Rpb24oIGNvdW50ICkge1xuICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIHZhciBuZXdEb3RzID0gW107XG4gIHZhciBsZW5ndGggPSB0aGlzLmRvdHMubGVuZ3RoO1xuICB2YXIgbWF4ID0gbGVuZ3RoICsgY291bnQ7XG5cbiAgZm9yICggdmFyIGkgPSBsZW5ndGg7IGkgPCBtYXg7IGkrKyApIHtcbiAgICB2YXIgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBkb3QuY2xhc3NOYW1lID0gJ2RvdCc7XG4gICAgZG90LnNldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWwnLCAnUGFnZSBkb3QgJyArICggaSArIDEgKSApO1xuICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb3QgKTtcbiAgICBuZXdEb3RzLnB1c2goIGRvdCApO1xuICB9XG5cbiAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoIGZyYWdtZW50ICk7XG4gIHRoaXMuZG90cyA9IHRoaXMuZG90cy5jb25jYXQoIG5ld0RvdHMgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5yZW1vdmVEb3RzID0gZnVuY3Rpb24oIGNvdW50ICkge1xuICAvLyByZW1vdmUgZnJvbSB0aGlzLmRvdHMgY29sbGVjdGlvblxuICB2YXIgcmVtb3ZlRG90cyA9IHRoaXMuZG90cy5zcGxpY2UoIHRoaXMuZG90cy5sZW5ndGggLSBjb3VudCwgY291bnQgKTtcbiAgLy8gcmVtb3ZlIGZyb20gRE9NXG4gIHJlbW92ZURvdHMuZm9yRWFjaCggZnVuY3Rpb24oIGRvdCApIHtcbiAgICB0aGlzLmhvbGRlci5yZW1vdmVDaGlsZCggZG90ICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS51cGRhdGVTZWxlY3RlZCA9IGZ1bmN0aW9uKCkge1xuICAvLyByZW1vdmUgc2VsZWN0ZWQgY2xhc3Mgb24gcHJldmlvdXNcbiAgaWYgKCB0aGlzLnNlbGVjdGVkRG90ICkge1xuICAgIHRoaXMuc2VsZWN0ZWREb3QuY2xhc3NOYW1lID0gJ2RvdCc7XG4gICAgdGhpcy5zZWxlY3RlZERvdC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpO1xuICB9XG4gIC8vIGRvbid0IHByb2NlZWQgaWYgbm8gZG90c1xuICBpZiAoICF0aGlzLmRvdHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnNlbGVjdGVkRG90ID0gdGhpcy5kb3RzWyB0aGlzLnBhcmVudC5zZWxlY3RlZEluZGV4IF07XG4gIHRoaXMuc2VsZWN0ZWREb3QuY2xhc3NOYW1lID0gJ2RvdCBpcy1zZWxlY3RlZCc7XG4gIHRoaXMuc2VsZWN0ZWREb3Quc2V0QXR0cmlidXRlKCAnYXJpYS1jdXJyZW50JywgJ3N0ZXAnICk7XG59O1xuXG5QYWdlRG90cy5wcm90b3R5cGUub25UYXAgPSAvLyBvbGQgbWV0aG9kIG5hbWUsIGJhY2t3YXJkcy1jb21wYXRpYmxlXG5QYWdlRG90cy5wcm90b3R5cGUub25DbGljayA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgLy8gb25seSBjYXJlIGFib3V0IGRvdCBjbGlja3NcbiAgaWYgKCB0YXJnZXQubm9kZU5hbWUgIT0gJ0xJJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnBhcmVudC51aUNoYW5nZSgpO1xuICB2YXIgaW5kZXggPSB0aGlzLmRvdHMuaW5kZXhPZiggdGFyZ2V0ICk7XG4gIHRoaXMucGFyZW50LnNlbGVjdCggaW5kZXggKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB0aGlzLmFsbE9mZigpO1xufTtcblxuRmxpY2tpdHkuUGFnZURvdHMgPSBQYWdlRG90cztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmxpY2tpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudXRpbHMuZXh0ZW5kKCBGbGlja2l0eS5kZWZhdWx0cywge1xuICBwYWdlRG90czogdHJ1ZSxcbn0gKTtcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlUGFnZURvdHMnKTtcblxudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlUGFnZURvdHMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLnBhZ2VEb3RzICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBhZ2VEb3RzID0gbmV3IFBhZ2VEb3RzKCB0aGlzICk7XG4gIC8vIGV2ZW50c1xuICB0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLmFjdGl2YXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ3NlbGVjdCcsIHRoaXMudXBkYXRlU2VsZWN0ZWRQYWdlRG90cyApO1xuICB0aGlzLm9uKCAnY2VsbENoYW5nZScsIHRoaXMudXBkYXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ3Jlc2l6ZScsIHRoaXMudXBkYXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQYWdlRG90cyApO1xufTtcblxucHJvdG8uYWN0aXZhdGVQYWdlRG90cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBhZ2VEb3RzLmFjdGl2YXRlKCk7XG59O1xuXG5wcm90by51cGRhdGVTZWxlY3RlZFBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMudXBkYXRlU2VsZWN0ZWQoKTtcbn07XG5cbnByb3RvLnVwZGF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMuc2V0RG90cygpO1xufTtcblxucHJvdG8uZGVhY3RpdmF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMuZGVhY3RpdmF0ZSgpO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbkZsaWNraXR5LlBhZ2VEb3RzID0gUGFnZURvdHM7XG5cbnJldHVybiBGbGlja2l0eTtcblxufSApICk7XG59KTtcblxudmFyIHBsYXllciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8vIHBsYXllciAmIGF1dG9QbGF5XG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICBpZiAoICBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgICAgZXZFbWl0dGVyLFxuICAgICAgICB1dGlscyxcbiAgICAgICAgZmxpY2tpdHlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgZmFjdG9yeShcbiAgICAgICAgd2luZG93LkV2RW1pdHRlcixcbiAgICAgICAgd2luZG93LmZpenp5VUlVdGlscyxcbiAgICAgICAgd2luZG93LkZsaWNraXR5XG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIEV2RW1pdHRlciwgdXRpbHMsIEZsaWNraXR5ICkge1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gUGxheWVyKCBwYXJlbnQgKSB7XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLnN0YXRlID0gJ3N0b3BwZWQnO1xuICAvLyB2aXNpYmlsaXR5IGNoYW5nZSBldmVudCBoYW5kbGVyXG4gIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlID0gdGhpcy52aXNpYmlsaXR5Q2hhbmdlLmJpbmQoIHRoaXMgKTtcbiAgdGhpcy5vblZpc2liaWxpdHlQbGF5ID0gdGhpcy52aXNpYmlsaXR5UGxheS5iaW5kKCB0aGlzICk7XG59XG5cblBsYXllci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbi8vIHN0YXJ0IHBsYXlcblBsYXllci5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BsYXlpbmcnICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBkbyBub3QgcGxheSBpZiBwYWdlIGlzIGhpZGRlbiwgc3RhcnQgcGxheWluZyB3aGVuIHBhZ2UgaXMgdmlzaWJsZVxuICB2YXIgaXNQYWdlSGlkZGVuID0gZG9jdW1lbnQuaGlkZGVuO1xuICBpZiAoIGlzUGFnZUhpZGRlbiApIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMub25WaXNpYmlsaXR5UGxheSApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuc3RhdGUgPSAncGxheWluZyc7XG4gIC8vIGxpc3RlbiB0byB2aXNpYmlsaXR5IGNoYW5nZVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlICk7XG4gIC8vIHN0YXJ0IHRpY2tpbmdcbiAgdGhpcy50aWNrKCk7XG59O1xuXG5QbGF5ZXIucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG8gbm90IHRpY2sgaWYgbm90IHBsYXlpbmdcbiAgaWYgKCB0aGlzLnN0YXRlICE9ICdwbGF5aW5nJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGltZSA9IHRoaXMucGFyZW50Lm9wdGlvbnMuYXV0b1BsYXk7XG4gIC8vIGRlZmF1bHQgdG8gMyBzZWNvbmRzXG4gIHRpbWUgPSB0eXBlb2YgdGltZSA9PSAnbnVtYmVyJyA/IHRpbWUgOiAzMDAwO1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICAvLyBIQUNLOiByZXNldCB0aWNrcyBpZiBzdG9wcGVkIGFuZCBzdGFydGVkIHdpdGhpbiBpbnRlcnZhbFxuICB0aGlzLmNsZWFyKCk7XG4gIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgIF90aGlzLnBhcmVudC5uZXh0KCB0cnVlICk7XG4gICAgX3RoaXMudGljaygpO1xuICB9LCB0aW1lICk7XG59O1xuXG5QbGF5ZXIucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zdGF0ZSA9ICdzdG9wcGVkJztcbiAgdGhpcy5jbGVhcigpO1xuICAvLyByZW1vdmUgdmlzaWJpbGl0eSBjaGFuZ2UgZXZlbnRcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSApO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICBjbGVhclRpbWVvdXQoIHRoaXMudGltZW91dCApO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BsYXlpbmcnICkge1xuICAgIHRoaXMuc3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbn07XG5cblBsYXllci5wcm90b3R5cGUudW5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAvLyByZS1zdGFydCBwbGF5IGlmIHBhdXNlZFxuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BhdXNlZCcgKSB7XG4gICAgdGhpcy5wbGF5KCk7XG4gIH1cbn07XG5cbi8vIHBhdXNlIGlmIHBhZ2UgdmlzaWJpbGl0eSBpcyBoaWRkZW4sIHVucGF1c2UgaWYgdmlzaWJsZVxuUGxheWVyLnByb3RvdHlwZS52aXNpYmlsaXR5Q2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpc1BhZ2VIaWRkZW4gPSBkb2N1bWVudC5oaWRkZW47XG4gIHRoaXNbIGlzUGFnZUhpZGRlbiA/ICdwYXVzZScgOiAndW5wYXVzZScgXSgpO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS52aXNpYmlsaXR5UGxheSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXkoKTtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eVBsYXkgKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsaWNraXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggRmxpY2tpdHkuZGVmYXVsdHMsIHtcbiAgcGF1c2VBdXRvUGxheU9uSG92ZXI6IHRydWUsXG59ICk7XG5cbkZsaWNraXR5LmNyZWF0ZU1ldGhvZHMucHVzaCgnX2NyZWF0ZVBsYXllcicpO1xudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyID0gbmV3IFBsYXllciggdGhpcyApO1xuXG4gIHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMuYWN0aXZhdGVQbGF5ZXIgKTtcbiAgdGhpcy5vbiggJ3VpQ2hhbmdlJywgdGhpcy5zdG9wUGxheWVyICk7XG4gIHRoaXMub24oICdwb2ludGVyRG93bicsIHRoaXMuc3RvcFBsYXllciApO1xuICB0aGlzLm9uKCAnZGVhY3RpdmF0ZScsIHRoaXMuZGVhY3RpdmF0ZVBsYXllciApO1xufTtcblxucHJvdG8uYWN0aXZhdGVQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLmF1dG9QbGF5ICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBsYXllci5wbGF5KCk7XG4gIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2VlbnRlcicsIHRoaXMgKTtcbn07XG5cbi8vIFBsYXllciBBUEksIGRvbid0IGhhdGUgdGhlIC4uLiB0aGFua3MgSSBrbm93IHdoZXJlIHRoZSBkb29yIGlzXG5cbnByb3RvLnBsYXlQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIucGxheSgpO1xufTtcblxucHJvdG8uc3RvcFBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci5zdG9wKCk7XG59O1xuXG5wcm90by5wYXVzZVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci5wYXVzZSgpO1xufTtcblxucHJvdG8udW5wYXVzZVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci51bnBhdXNlKCk7XG59O1xuXG5wcm90by5kZWFjdGl2YXRlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnN0b3AoKTtcbiAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgdGhpcyApO1xufTtcblxuLy8gLS0tLS0gbW91c2VlbnRlci9sZWF2ZSAtLS0tLSAvL1xuXG4vLyBwYXVzZSBhdXRvLXBsYXkgb24gaG92ZXJcbnByb3RvLm9ubW91c2VlbnRlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMucGF1c2VBdXRvUGxheU9uSG92ZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2VsZWF2ZScsIHRoaXMgKTtcbn07XG5cbi8vIHJlc3VtZSBhdXRvLXBsYXkgb24gaG92ZXIgb2ZmXG5wcm90by5vbm1vdXNlbGVhdmUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIudW5wYXVzZSgpO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlbGVhdmUnLCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuRmxpY2tpdHkuUGxheWVyID0gUGxheWVyO1xuXG5yZXR1cm4gRmxpY2tpdHk7XG5cbn0gKSApO1xufSk7XG5cbnZhciBhZGRSZW1vdmVDZWxsID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLy8gYWRkLCByZW1vdmUgY2VsbFxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgZmxpY2tpdHksXG4gICAgICAgIHV0aWxzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIHV0aWxzICkge1xuXG4vLyBhcHBlbmQgY2VsbHMgdG8gYSBkb2N1bWVudCBmcmFnbWVudFxuZnVuY3Rpb24gZ2V0Q2VsbHNGcmFnbWVudCggY2VsbHMgKSB7XG4gIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNlbGwuZWxlbWVudCApO1xuICB9ICk7XG4gIHJldHVybiBmcmFnbWVudDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWRkL3JlbW92ZSBjZWxsIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbi8qKlxuICogSW5zZXJ0LCBwcmVwZW5kLCBvciBhcHBlbmQgY2VsbHNcbiAqIEBwYXJhbSB7W0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdF19IGVsZW1zIC0gRWxlbWVudHMgdG8gaW5zZXJ0XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IC0gWmVyby1iYXNlZCBudW1iZXIgdG8gaW5zZXJ0XG4gKi9cbnByb3RvLmluc2VydCA9IGZ1bmN0aW9uKCBlbGVtcywgaW5kZXggKSB7XG4gIHZhciBjZWxscyA9IHRoaXMuX21ha2VDZWxscyggZWxlbXMgKTtcbiAgaWYgKCAhY2VsbHMgfHwgIWNlbGxzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxlbiA9IHRoaXMuY2VsbHMubGVuZ3RoO1xuICAvLyBkZWZhdWx0IHRvIGFwcGVuZFxuICBpbmRleCA9IGluZGV4ID09PSB1bmRlZmluZWQgPyBsZW4gOiBpbmRleDtcbiAgLy8gYWRkIGNlbGxzIHdpdGggZG9jdW1lbnQgZnJhZ21lbnRcbiAgdmFyIGZyYWdtZW50ID0gZ2V0Q2VsbHNGcmFnbWVudCggY2VsbHMgKTtcbiAgLy8gYXBwZW5kIHRvIHNsaWRlclxuICB2YXIgaXNBcHBlbmQgPSBpbmRleCA9PSBsZW47XG4gIGlmICggaXNBcHBlbmQgKSB7XG4gICAgdGhpcy5zbGlkZXIuYXBwZW5kQ2hpbGQoIGZyYWdtZW50ICk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGluc2VydENlbGxFbGVtZW50ID0gdGhpcy5jZWxsc1sgaW5kZXggXS5lbGVtZW50O1xuICAgIHRoaXMuc2xpZGVyLmluc2VydEJlZm9yZSggZnJhZ21lbnQsIGluc2VydENlbGxFbGVtZW50ICk7XG4gIH1cbiAgLy8gYWRkIHRvIHRoaXMuY2VsbHNcbiAgaWYgKCBpbmRleCA9PT0gMCApIHtcbiAgICAvLyBwcmVwZW5kLCBhZGQgdG8gc3RhcnRcbiAgICB0aGlzLmNlbGxzID0gY2VsbHMuY29uY2F0KCB0aGlzLmNlbGxzICk7XG4gIH0gZWxzZSBpZiAoIGlzQXBwZW5kICkge1xuICAgIC8vIGFwcGVuZCwgYWRkIHRvIGVuZFxuICAgIHRoaXMuY2VsbHMgPSB0aGlzLmNlbGxzLmNvbmNhdCggY2VsbHMgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpbnNlcnQgaW4gdGhpcy5jZWxsc1xuICAgIHZhciBlbmRDZWxscyA9IHRoaXMuY2VsbHMuc3BsaWNlKCBpbmRleCwgbGVuIC0gaW5kZXggKTtcbiAgICB0aGlzLmNlbGxzID0gdGhpcy5jZWxscy5jb25jYXQoIGNlbGxzICkuY29uY2F0KCBlbmRDZWxscyApO1xuICB9XG5cbiAgdGhpcy5fc2l6ZUNlbGxzKCBjZWxscyApO1xuICB0aGlzLmNlbGxDaGFuZ2UoIGluZGV4LCB0cnVlICk7XG59O1xuXG5wcm90by5hcHBlbmQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHRoaXMuaW5zZXJ0KCBlbGVtcywgdGhpcy5jZWxscy5sZW5ndGggKTtcbn07XG5cbnByb3RvLnByZXBlbmQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHRoaXMuaW5zZXJ0KCBlbGVtcywgMCApO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgY2VsbHNcbiAqIEBwYXJhbSB7W0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdF19IGVsZW1zIC0gRUxlbWVudHMgdG8gcmVtb3ZlXG4gKi9cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGNlbGxzID0gdGhpcy5nZXRDZWxscyggZWxlbXMgKTtcbiAgaWYgKCAhY2VsbHMgfHwgIWNlbGxzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbWluQ2VsbEluZGV4ID0gdGhpcy5jZWxscy5sZW5ndGggLSAxO1xuICAvLyByZW1vdmUgY2VsbHMgZnJvbSBjb2xsZWN0aW9uICYgRE9NXG4gIGNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGNlbGwucmVtb3ZlKCk7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5jZWxscy5pbmRleE9mKCBjZWxsICk7XG4gICAgbWluQ2VsbEluZGV4ID0gTWF0aC5taW4oIGluZGV4LCBtaW5DZWxsSW5kZXggKTtcbiAgICB1dGlscy5yZW1vdmVGcm9tKCB0aGlzLmNlbGxzLCBjZWxsICk7XG4gIH0sIHRoaXMgKTtcblxuICB0aGlzLmNlbGxDaGFuZ2UoIG1pbkNlbGxJbmRleCwgdHJ1ZSApO1xufTtcblxuLyoqXG4gKiBsb2dpYyB0byBiZSBydW4gYWZ0ZXIgYSBjZWxsJ3Mgc2l6ZSBjaGFuZ2VzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW0gLSBjZWxsJ3MgZWxlbWVudFxuICovXG5wcm90by5jZWxsU2l6ZUNoYW5nZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggZWxlbSApO1xuICBpZiAoICFjZWxsICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjZWxsLmdldFNpemUoKTtcblxuICB2YXIgaW5kZXggPSB0aGlzLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgdGhpcy5jZWxsQ2hhbmdlKCBpbmRleCApO1xufTtcblxuLyoqXG4gKiBsb2dpYyBhbnkgdGltZSBhIGNlbGwgaXMgY2hhbmdlZDogYWRkZWQsIHJlbW92ZWQsIG9yIHNpemUgY2hhbmdlZFxuICogQHBhcmFtIHtJbnRlZ2VyfSBjaGFuZ2VkQ2VsbEluZGV4IC0gaW5kZXggb2YgdGhlIGNoYW5nZWQgY2VsbCwgb3B0aW9uYWxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNQb3NpdGlvbmluZ1NsaWRlciAtIFBvc2l0aW9ucyBzbGlkZXIgYWZ0ZXIgc2VsZWN0aW9uXG4gKi9cbnByb3RvLmNlbGxDaGFuZ2UgPSBmdW5jdGlvbiggY2hhbmdlZENlbGxJbmRleCwgaXNQb3NpdGlvbmluZ1NsaWRlciApIHtcbiAgdmFyIHByZXZTZWxlY3RlZEVsZW0gPSB0aGlzLnNlbGVjdGVkRWxlbWVudDtcbiAgdGhpcy5fcG9zaXRpb25DZWxscyggY2hhbmdlZENlbGxJbmRleCApO1xuICB0aGlzLl9nZXRXcmFwU2hpZnRDZWxscygpO1xuICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIC8vIHVwZGF0ZSBzZWxlY3RlZEluZGV4XG4gIC8vIHRyeSB0byBtYWludGFpbiBwb3NpdGlvbiAmIHNlbGVjdCBwcmV2aW91cyBzZWxlY3RlZCBlbGVtZW50XG4gIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBwcmV2U2VsZWN0ZWRFbGVtICk7XG4gIGlmICggY2VsbCApIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLmdldENlbGxTbGlkZUluZGV4KCBjZWxsICk7XG4gIH1cbiAgdGhpcy5zZWxlY3RlZEluZGV4ID0gTWF0aC5taW4oIHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEsIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuXG4gIHRoaXMuZW1pdEV2ZW50KCAnY2VsbENoYW5nZScsIFsgY2hhbmdlZENlbGxJbmRleCBdICk7XG4gIC8vIHBvc2l0aW9uIHNsaWRlclxuICB0aGlzLnNlbGVjdCggdGhpcy5zZWxlY3RlZEluZGV4ICk7XG4gIC8vIGRvIG5vdCBwb3NpdGlvbiBzbGlkZXIgYWZ0ZXIgbGF6eSBsb2FkXG4gIGlmICggaXNQb3NpdGlvbmluZ1NsaWRlciApIHtcbiAgICB0aGlzLnBvc2l0aW9uU2xpZGVyQXRTZWxlY3RlZCgpO1xuICB9XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIEZsaWNraXR5O1xuXG59ICkgKTtcbn0pO1xuXG52YXIgbGF6eWxvYWQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBsYXp5bG9hZFxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgZmxpY2tpdHksXG4gICAgICAgIHV0aWxzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIHV0aWxzICkge1xuXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzLnB1c2goJ19jcmVhdGVMYXp5bG9hZCcpO1xudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlTGF6eWxvYWQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vbiggJ3NlbGVjdCcsIHRoaXMubGF6eUxvYWQgKTtcbn07XG5cbnByb3RvLmxhenlMb2FkID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsYXp5TG9hZCA9IHRoaXMub3B0aW9ucy5sYXp5TG9hZDtcbiAgaWYgKCAhbGF6eUxvYWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGdldCBhZGphY2VudCBjZWxscywgdXNlIGxhenlMb2FkIG9wdGlvbiBmb3IgYWRqYWNlbnQgY291bnRcbiAgdmFyIGFkakNvdW50ID0gdHlwZW9mIGxhenlMb2FkID09ICdudW1iZXInID8gbGF6eUxvYWQgOiAwO1xuICB2YXIgY2VsbEVsZW1zID0gdGhpcy5nZXRBZGphY2VudENlbGxFbGVtZW50cyggYWRqQ291bnQgKTtcbiAgLy8gZ2V0IGxhenkgaW1hZ2VzIGluIHRob3NlIGNlbGxzXG4gIHZhciBsYXp5SW1hZ2VzID0gW107XG4gIGNlbGxFbGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggY2VsbEVsZW0gKSB7XG4gICAgdmFyIGxhenlDZWxsSW1hZ2VzID0gZ2V0Q2VsbExhenlJbWFnZXMoIGNlbGxFbGVtICk7XG4gICAgbGF6eUltYWdlcyA9IGxhenlJbWFnZXMuY29uY2F0KCBsYXp5Q2VsbEltYWdlcyApO1xuICB9ICk7XG4gIC8vIGxvYWQgbGF6eSBpbWFnZXNcbiAgbGF6eUltYWdlcy5mb3JFYWNoKCBmdW5jdGlvbiggaW1nICkge1xuICAgIG5ldyBMYXp5TG9hZGVyKCBpbWcsIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuZnVuY3Rpb24gZ2V0Q2VsbExhenlJbWFnZXMoIGNlbGxFbGVtICkge1xuICAvLyBjaGVjayBpZiBjZWxsIGVsZW1lbnQgaXMgbGF6eSBpbWFnZVxuICBpZiAoIGNlbGxFbGVtLm5vZGVOYW1lID09ICdJTUcnICkge1xuICAgIHZhciBsYXp5bG9hZEF0dHIgPSBjZWxsRWxlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgICB2YXIgc3JjQXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmMnKTtcbiAgICB2YXIgc3Jjc2V0QXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmNzZXQnKTtcbiAgICBpZiAoIGxhenlsb2FkQXR0ciB8fCBzcmNBdHRyIHx8IHNyY3NldEF0dHIgKSB7XG4gICAgICByZXR1cm4gWyBjZWxsRWxlbSBdO1xuICAgIH1cbiAgfVxuICAvLyBzZWxlY3QgbGF6eSBpbWFnZXMgaW4gY2VsbFxuICB2YXIgbGF6eVNlbGVjdG9yID0gJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkXSwgJyArXG4gICAgJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY10sIGltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY3NldF0nO1xuICB2YXIgaW1ncyA9IGNlbGxFbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIGxhenlTZWxlY3RvciApO1xuICByZXR1cm4gdXRpbHMubWFrZUFycmF5KCBpbWdzICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExhenlMb2FkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBjbGFzcyB0byBoYW5kbGUgbG9hZGluZyBpbWFnZXNcbiAqIEBwYXJhbSB7SW1hZ2V9IGltZyAtIEltYWdlIGVsZW1lbnRcbiAqIEBwYXJhbSB7RmxpY2tpdHl9IGZsaWNraXR5IC0gRmxpY2tpdHkgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gTGF6eUxvYWRlciggaW1nLCBmbGlja2l0eSApIHtcbiAgdGhpcy5pbWcgPSBpbWc7XG4gIHRoaXMuZmxpY2tpdHkgPSBmbGlja2l0eTtcbiAgdGhpcy5sb2FkKCk7XG59XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gdXRpbHMuaGFuZGxlRXZlbnQ7XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgLy8gZ2V0IHNyYyAmIHNyY3NldFxuICB2YXIgc3JjID0gdGhpcy5pbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkJykgfHxcbiAgICB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3JjJyk7XG4gIHZhciBzcmNzZXQgPSB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG4gIC8vIHNldCBzcmMgJiBzZXJzZXRcbiAgdGhpcy5pbWcuc3JjID0gc3JjO1xuICBpZiAoIHNyY3NldCApIHtcbiAgICB0aGlzLmltZy5zZXRBdHRyaWJ1dGUoICdzcmNzZXQnLCBzcmNzZXQgKTtcbiAgfVxuICAvLyByZW1vdmUgYXR0clxuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgdGhpcy5pbWcucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyYycpO1xuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG59O1xuXG5MYXp5TG9hZGVyLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWxvYWRlZCcgKTtcbn07XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWVycm9yJyApO1xufTtcblxuTGF6eUxvYWRlci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiggZXZlbnQsIGNsYXNzTmFtZSApIHtcbiAgLy8gdW5iaW5kIGV2ZW50c1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5pbWcucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xuXG4gIHZhciBjZWxsID0gdGhpcy5mbGlja2l0eS5nZXRQYXJlbnRDZWxsKCB0aGlzLmltZyApO1xuICB2YXIgY2VsbEVsZW0gPSBjZWxsICYmIGNlbGwuZWxlbWVudDtcbiAgdGhpcy5mbGlja2l0eS5jZWxsU2l6ZUNoYW5nZSggY2VsbEVsZW0gKTtcblxuICB0aGlzLmltZy5jbGFzc0xpc3QuYWRkKCBjbGFzc05hbWUgKTtcbiAgdGhpcy5mbGlja2l0eS5kaXNwYXRjaEV2ZW50KCAnbGF6eUxvYWQnLCBldmVudCwgY2VsbEVsZW0gKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5GbGlja2l0eS5MYXp5TG9hZGVyID0gTGF6eUxvYWRlcjtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59ICkgKTtcbn0pO1xuXG52YXIganMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKiFcbiAqIEZsaWNraXR5IHYyLjMuMFxuICogVG91Y2gsIHJlc3BvbnNpdmUsIGZsaWNrYWJsZSBjYXJvdXNlbHNcbiAqXG4gKiBMaWNlbnNlZCBHUEx2MyBmb3Igb3BlbiBzb3VyY2UgdXNlXG4gKiBvciBGbGlja2l0eSBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlXG4gKlxuICogaHR0cHM6Ly9mbGlja2l0eS5tZXRhZml6enkuY29cbiAqIENvcHlyaWdodCAyMDE1LTIwMjEgTWV0YWZpenp5XG4gKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCAgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICAgIGZsaWNraXR5LFxuICAgICAgICBkcmFnLFxuICAgICAgICBwcmV2TmV4dEJ1dHRvbixcbiAgICAgICAgcGFnZURvdHMsXG4gICAgICAgIHBsYXllcixcbiAgICAgICAgYWRkUmVtb3ZlQ2VsbCxcbiAgICAgICAgbGF6eWxvYWRcbiAgICApO1xuICB9XG5cbn0gKSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCBGbGlja2l0eSApIHtcbiAgcmV0dXJuIEZsaWNraXR5O1xufSApO1xufSk7XG5cbnZhciBDb21wbGVtZW50YXJ5UHJvZHVjdHMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb21wbGVtZW50YXJ5UHJvZHVjdHMob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wbGVtZW50YXJ5UHJvZHVjdHMpO1xuXG4gICAgdGhpcy5zZWN0aW9uRWwgPSBvcHRpb25zLnNlY3Rpb25FbDtcbiAgICB0aGlzLnNlY3Rpb25JZCA9IG9wdGlvbnMuc2VjdGlvbklkO1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMucHJvZHVjdElkID0gb3B0aW9ucy5wcm9kdWN0SWQ7XG4gICAgdGhpcy5pbmNsdWRlSW5kaWNhdG9yRG90cyA9IG9wdGlvbnMuaW5jbHVkZUluZGljYXRvckRvdHMgfHwgZmFsc2U7XG4gICAgdGhpcy5yZWNvbW1lbmRhdGlvbnNSb3V0ZSA9IG9wdGlvbnMucHJvZHVjdFJlY29tbWVuZGF0aW9uc1JvdXRlO1xuICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0O1xuICAgIHZhciBkZWZhdWx0QXJyb3dTaGFwZSA9IHtcbiAgICAgIHgwOiAxMCxcbiAgICAgIHgxOiA2MCxcbiAgICAgIHkxOiA1MCxcbiAgICAgIHgyOiA2NSxcbiAgICAgIHkyOiA0NSxcbiAgICAgIHgzOiAyMFxuICAgIH07XG4gICAgdGhpcy5hcnJvd1NoYXBlID0gb3B0aW9ucy5hcnJvd1NoYXBlIHx8IGRlZmF1bHRBcnJvd1NoYXBlO1xuICAgIHRoaXMucmVjb21tZW5kYXRpb25zRWwgPSB0aGlzLnNlY3Rpb25FbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb21wbGVtZW50YXJ5LXByb2R1Y3RzXScpO1xuICAgIHRoaXMubG9hZFJlY29tbWVuZGF0aW9ucygpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbXBsZW1lbnRhcnlQcm9kdWN0cywgW3tcbiAgICBrZXk6IFwibG9hZFJlY29tbWVuZGF0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkUmVjb21tZW5kYXRpb25zKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHVybCA9IFwiXCIuY29uY2F0KHRoaXMucmVjb21tZW5kYXRpb25zUm91dGUsIFwiP3NlY3Rpb25faWQ9XCIpLmNvbmNhdCh0aGlzLnNlY3Rpb25JZCwgXCImbGltaXQ9XCIpLmNvbmNhdCh0aGlzLmxpbWl0LCBcIiZwcm9kdWN0X2lkPVwiKS5jb25jYXQodGhpcy5wcm9kdWN0SWQsIFwiJmludGVudD1jb21wbGVtZW50YXJ5XCIpO1xuICAgICAgQXN5bmNWaWV3LmxvYWQodXJsLCB7XG4gICAgICAgIHZpZXc6ICcnXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBodG1sID0gX3JlZi5odG1sO1xuICAgICAgICBpZiAoX3R5cGVvZihodG1sKSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoaHRtbCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGh0bWwudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIF90aGlzLnJlY29tbWVuZGF0aW9uc0VsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZW1lbnRhcnktcHJvZHVjdHMtLW5vLXJlY29tbWVuZGF0aW9ucycpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMucmVjb21tZW5kYXRpb25zRWwuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgICBpZiAoIXJpbWcuaW5zdGFuY2UpIHtcbiAgICAgICAgICByaW1nLmluaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJpbWcud2F0Y2goX3RoaXMucmVjb21tZW5kYXRpb25zRWwpO1xuXG4gICAgICAgIHZhciBzbGlkZXIgPSBfdGhpcy5yZWNvbW1lbmRhdGlvbnNFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zbGlkZXJdJyk7XG5cbiAgICAgICAgdmFyIHNsaWRlcyA9IF90aGlzLnJlY29tbWVuZGF0aW9uc0VsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNsaWRlXScpO1xuXG4gICAgICAgIGlmIChzbGlkZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIF90aGlzLnNsaWRlciA9IG5ldyBqcyhzbGlkZXIsIHtcbiAgICAgICAgICAgIGNlbGxTZWxlY3RvcjogJ1tkYXRhLXNsaWRlXScsXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiBmYWxzZSxcbiAgICAgICAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgIGF1dG9QbGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxuICAgICAgICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgICAgICAgIGltYWdlc0xvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHBhZ2VEb3RzOiBfdGhpcy5pbmNsdWRlSW5kaWNhdG9yRG90cyxcbiAgICAgICAgICAgIHdyYXBBcm91bmQ6IHRydWUsXG4gICAgICAgICAgICBhcnJvd1NoYXBlOiBfdGhpcy5hcnJvd1NoYXBlXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpcy5ldmVudHMucmVnaXN0ZXIoc2xpZGVyLCAncmltZzpsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuc2xpZGVyLnJlc2l6ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5sb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIHRoaXMuc2xpZGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tcGxlbWVudGFyeVByb2R1Y3RzO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBDb21wbGVtZW50YXJ5UHJvZHVjdHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/pxs-complementary-products/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/pxs-gift-card-recipient-form/dist/index.es.js":
/*!********************************************************************************!*\
  !*** ./node_modules/@pixelunion/pxs-gift-card-recipient-form/dist/index.es.js ***!
  \********************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*!\n * @pixelunion/pxs-gift-card-recipient-form v1.1.0\n * (c) 2024 Pixel Union\n */\n\nfunction unwrapExports (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar EventHandler_1 = createCommonjsModule(function (module, exports) {\nexports.__esModule = true;\nvar EventHandler = /** @class */ (function () {\n    function EventHandler() {\n        this.events = [];\n    }\n    EventHandler.prototype.register = function (el, event, listener) {\n        if (!el || !event || !listener)\n            return null;\n        this.events.push({ el: el, event: event, listener: listener });\n        el.addEventListener(event, listener);\n        return { el: el, event: event, listener: listener };\n    };\n    EventHandler.prototype.unregister = function (_a) {\n        var el = _a.el, event = _a.event, listener = _a.listener;\n        if (!el || !event || !listener)\n            return null;\n        this.events = this.events.filter(function (e) { return el !== e.el\n            || event !== e.event || listener !== e.listener; });\n        el.removeEventListener(event, listener);\n        return { el: el, event: event, listener: listener };\n    };\n    EventHandler.prototype.unregisterAll = function () {\n        this.events.forEach(function (_a) {\n            var el = _a.el, event = _a.event, listener = _a.listener;\n            return el.removeEventListener(event, listener);\n        });\n        this.events = [];\n    };\n    return EventHandler;\n}());\nexports[\"default\"] = EventHandler;\n});\n\nvar EventHandler = unwrapExports(EventHandler_1);\n\n/*!\n   * @pixelunion/animations v0.1.0\n   * (c) 2019 Pixel Union\n   * Released under the UNLICENSED license.\n  */\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\n/**\n * Promisified version of window.requestAnimationFrame.\n * @returns {Promise} Promise will resolve when requestAnimationFrame callback is run.\n */\nfunction raf() {\n  return new Promise(function (resolve) {\n    window.requestAnimationFrame(resolve);\n  });\n}\n/**\n * Represents an HTML element with associate states\n */\n\n\nvar Animation =\n/*#__PURE__*/\nfunction () {\n  /**\n   * @param {Object} options\n   * @param {HTMLElement}  options.el Target element\n   * @param {String} [options.state=initial] Initial state. This is also the default state.\n   * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n   * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to\n   * update with change of state.\n   * @param {String} [options.endEvent=transitionend] Event to listen for at end of state change.\n   * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n   * next state change.\n   * @param {Function} [options.onStart] Callback to execute immediate after\n   * applying stateChangeAttribute.\n   */\n  function Animation(options) {\n    _classCallCheck(this, Animation);\n\n    this._el = options.el;\n    this.cancelRunning = null;\n    this._state = options.state || 'initial';\n    this.initialState = this._state;\n    this.stateAttribute = options.stateAttribute || 'data-animation-state';\n    this.stateChangeAttribute = options.stateChangeAttribute || 'data-animation';\n    this.endEvent = options.endEvent || 'transitionend';\n    this.hold = !!options.hold;\n\n    this.onStart = options.onStart || function () {\n      /* do nothing */\n    };\n\n    this.activeEventHandler = null;\n  }\n  /**\n   * Returns target element\n   *\n   * @return {HTMLElement} Target element\n   */\n\n\n  _createClass(Animation, [{\n    key: \"isState\",\n\n    /**\n     * Check if a state is active\n     * @param {String} state State to compare\n     *\n     * @return {Boolean}\n     */\n    value: function isState(state) {\n      return state === this._state;\n    }\n    /**\n     * Sequences a change to a new state.\n     * @param {String} state Target state\n     *\n     * @param {Boolean} options.force Switch to final state immediately\n     *\n     * @param {Function} options.onStart Callback to execute immediately after\n     * applying stateChangeAttribute for this state change only.\n     *\n     * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n     * next state change.\n     *\n     * @return {Promise} Resolves when endEvent triggered\n     */\n\n  }, {\n    key: \"animateTo\",\n    value: function animateTo(state) {\n      var _this = this;\n\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var from = this._el.dataset[this.stateAttribute] || this._state;\n      var to = state || this.initialState;\n      var force = options.force;\n      var hold = 'hold' in options ? options.hold : this.hold;\n      return new Promise(function (resolve) {\n        if (_this.cancelRunning) {\n          _this.cancelRunning();\n        }\n\n        if (from === to) {\n          // Removing this here fixes some lingering attributes. But why?\n          _this._el.removeAttribute(_this.stateChangeAttribute);\n\n          resolve(from, null);\n          return;\n        }\n\n        var running = true;\n\n        _this.cancelRunning = function () {\n          running = false;\n          resolve(null, null);\n        };\n\n        _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n        _this.activeEventHandler = null;\n\n        if (force) {\n          _this._el.setAttribute(_this.stateChangeAttribute, \"\".concat(from, \"=>\").concat(to));\n\n          _this.onStart({\n            el: _this._el,\n            from: from,\n            to: to\n          });\n\n          if (typeof options.onStart === 'function') {\n            options.onStart({\n              el: _this._el,\n              from: from,\n              to: to\n            });\n          }\n\n          _this._el.setAttribute(_this.stateAttribute, to);\n\n          _this._state = to;\n\n          if (!hold) {\n            _this._el.removeAttribute(_this.stateChangeAttribute);\n          }\n\n          resolve(to, null);\n          return;\n        }\n\n        raf().then(function () {\n          if (!running) throw new Error('cancelled');\n\n          _this._el.setAttribute(_this.stateChangeAttribute, \"\".concat(from, \"=>\").concat(to));\n\n          _this.onStart({\n            el: _this._el,\n            from: from,\n            to: to\n          });\n\n          if (typeof options.onStart === 'function') {\n            options.onStart({\n              el: _this._el,\n              from: from,\n              to: to\n            });\n          }\n\n          return raf();\n        }).then(function () {\n          if (!running) throw new Error('cancelled');\n\n          _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n          _this.activeEventHandler = function (e) {\n            // Ignore any events bubbling up\n            if (e.target !== _this._el || !running) return;\n\n            _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n            if (!hold) {\n              _this._el.removeAttribute(_this.stateChangeAttribute);\n            }\n\n            resolve(to, e);\n          };\n\n          _this._el.addEventListener(_this.endEvent, _this.activeEventHandler);\n\n          _this._el.setAttribute(_this.stateAttribute, to);\n\n          _this._state = to;\n        })[\"catch\"](function (error) {\n          // Only catch 'cancelled' errors.\n          if (error.message !== 'cancelled') throw error;\n        });\n      });\n    }\n    /**\n     * Remove any event listeners\n     */\n\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      this._el.removeEventListener(this.endEvent, this.activeEventHandler);\n\n      this.activeEventHandler = null;\n    }\n  }, {\n    key: \"el\",\n    get: function get() {\n      return this._el;\n    }\n    /**\n     * Returns current state\n     *\n     * @return {String} Current state\n     */\n\n  }, {\n    key: \"state\",\n    get: function get() {\n      return this._state;\n    }\n  }]);\n\n  return Animation;\n}();\n\nfunction transition(options) {\n  return new Animation(options);\n}\n\nclass RecipientForm {\n  constructor(el) {\n    this.el = el;\n    this.events = new EventHandler();\n    this.recipientForm = this.el.querySelector('[data-recipient-form]');\n    this.recipientFormInputs = this.el.querySelectorAll('[data-recipient-form-input]');\n    this.recipientFormEmailInput = this.el.querySelector('[data-recipient-form-email-input]');\n    this.disclosure = this.el.querySelector('[data-recipient-disclosure]');\n    this.disclosureCheckbox = this.el.querySelector('[data-recipient-disclosure-checkbox]');\n    this.checkmark = this.disclosure.querySelector('.checkmark');\n    this.checkmarkCheck = this.disclosure.querySelector('.checkmark__check');\n    this.fillAnimation = transition({\n      el: this.checkmark\n    });\n    this.checkAnimation = transition({\n      el: this.checkmarkCheck\n    });\n    this.events.register(this.recipientForm, 'keydown', event => this._onKeydown(event));\n    this.events.register(this.disclosure, 'toggle', () => this._onToggle());\n    this.events.register(this.disclosureCheckbox, 'change', () => this._onChange());\n  }\n\n  _onChange() {\n    this.disclosure.open = this.disclosureCheckbox.checked;\n  }\n\n  _onKeydown(event) {\n    // Prevent input form submission\n    if (event.key === 'Enter' && event.target.matches('[data-recipient-form-input]')) {\n      event.preventDefault();\n    }\n  }\n\n  _onToggle() {\n    if (this.disclosure.open) {\n      this._showRecipientForm();\n    } else {\n      this._hideRecipientForm();\n    }\n  }\n\n  _showRecipientForm() {\n    if (this.checkmark && this.checkmarkCheck) {\n      this.fillAnimation.animateTo('checked');\n      this.checkAnimation.animateTo('checked');\n    }\n\n    this.disclosureCheckbox.checked = true;\n    this.recipientFormEmailInput.required = true;\n  }\n\n  _hideRecipientForm() {\n    if (this.checkmark && this.checkmarkCheck) {\n      this.fillAnimation.animateTo('unchecked');\n      this.checkAnimation.animateTo('unchecked');\n    }\n\n    this.disclosureCheckbox.checked = false;\n    this.recipientFormEmailInput.required = false;\n\n    this._resetRecipientForm();\n  }\n\n  _resetRecipientForm() {\n    this.recipientFormInputs.forEach(el => {\n      el.value = '';\n\n      if (el.classList.contains('form-field-filled')) {\n        el.classList.remove('form-field-filled');\n      }\n    });\n\n    if (this.recipientForm.classList.contains('recipient-form--has-errors')) {\n      this.recipientForm.classList.remove('recipient-form--has-errors');\n    }\n  }\n\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RecipientForm);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLWdpZnQtY2FyZC1yZWNpcGllbnQtZm9ybS9kaXN0L2luZGV4LmVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9weHMtZ2lmdC1jYXJkLXJlY2lwaWVudC1mb3JtL2Rpc3QvaW5kZXguZXMuanM/NTZjOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIVxuICogQHBpeGVsdW5pb24vcHhzLWdpZnQtY2FyZC1yZWNpcGllbnQtZm9ybSB2MS4xLjBcbiAqIChjKSAyMDI0IFBpeGVsIFVuaW9uXG4gKi9cblxuZnVuY3Rpb24gdW53cmFwRXhwb3J0cyAoeCkge1xuXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7XG5cdHJldHVybiBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxudmFyIEV2ZW50SGFuZGxlcl8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBFdmVudEhhbmRsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXZlbnRIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgIH1cbiAgICBFdmVudEhhbmRsZXIucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKGVsLCBldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCFlbCB8fCAhZXZlbnQgfHwgIWxpc3RlbmVyKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2goeyBlbDogZWwsIGV2ZW50OiBldmVudCwgbGlzdGVuZXI6IGxpc3RlbmVyIH0pO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB7IGVsOiBlbCwgZXZlbnQ6IGV2ZW50LCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgICB9O1xuICAgIEV2ZW50SGFuZGxlci5wcm90b3R5cGUudW5yZWdpc3RlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgZWwgPSBfYS5lbCwgZXZlbnQgPSBfYS5ldmVudCwgbGlzdGVuZXIgPSBfYS5saXN0ZW5lcjtcbiAgICAgICAgaWYgKCFlbCB8fCAhZXZlbnQgfHwgIWxpc3RlbmVyKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gdGhpcy5ldmVudHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlbCAhPT0gZS5lbFxuICAgICAgICAgICAgfHwgZXZlbnQgIT09IGUuZXZlbnQgfHwgbGlzdGVuZXIgIT09IGUubGlzdGVuZXI7IH0pO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB7IGVsOiBlbCwgZXZlbnQ6IGV2ZW50LCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgICB9O1xuICAgIEV2ZW50SGFuZGxlci5wcm90b3R5cGUudW5yZWdpc3RlckFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IF9hLmVsLCBldmVudCA9IF9hLmV2ZW50LCBsaXN0ZW5lciA9IF9hLmxpc3RlbmVyO1xuICAgICAgICAgICAgcmV0dXJuIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRIYW5kbGVyO1xufSgpKTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gRXZlbnRIYW5kbGVyO1xufSk7XG5cbnZhciBFdmVudEhhbmRsZXIgPSB1bndyYXBFeHBvcnRzKEV2ZW50SGFuZGxlcl8xKTtcblxuLyohXG4gICAqIEBwaXhlbHVuaW9uL2FuaW1hdGlvbnMgdjAuMS4wXG4gICAqIChjKSAyMDE5IFBpeGVsIFVuaW9uXG4gICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBVTkxJQ0VOU0VEIGxpY2Vuc2UuXG4gICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuLyoqXG4gKiBQcm9taXNpZmllZCB2ZXJzaW9uIG9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgY2FsbGJhY2sgaXMgcnVuLlxuICovXG5mdW5jdGlvbiByYWYoKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSk7XG4gIH0pO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEhUTUwgZWxlbWVudCB3aXRoIGFzc29jaWF0ZSBzdGF0ZXNcbiAqL1xuXG5cbnZhciBBbmltYXRpb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gIG9wdGlvbnMuZWwgVGFyZ2V0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlPWluaXRpYWxdIEluaXRpYWwgc3RhdGUuIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlQXR0cmlidXRlPWRhdGEtcmV2ZWFsZXJdIEF0dHJpYnV0ZSBuYW1lIHRvIHVwZGF0ZSB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGU9ZGF0YS1yZXZlYWxlci10cmFuc2l0aW9uXSBBdHRyaWJ1dGUgbmFtZSB0b1xuICAgKiB1cGRhdGUgd2l0aCBjaGFuZ2Ugb2Ygc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5lbmRFdmVudD10cmFuc2l0aW9uZW5kXSBFdmVudCB0byBsaXN0ZW4gZm9yIGF0IGVuZCBvZiBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9sZD1mYWxzZV0gSWYgdHJ1ZSwgY2hhbmdlQXR0cmlidXRlIHdpbGwgbm90IGJlIHJlbW92ZWQgdW50aWwgdGhlXG4gICAqIG5leHQgc3RhdGUgY2hhbmdlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vblN0YXJ0XSBDYWxsYmFjayB0byBleGVjdXRlIGltbWVkaWF0ZSBhZnRlclxuICAgKiBhcHBseWluZyBzdGF0ZUNoYW5nZUF0dHJpYnV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIEFuaW1hdGlvbihvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuaW1hdGlvbik7XG5cbiAgICB0aGlzLl9lbCA9IG9wdGlvbnMuZWw7XG4gICAgdGhpcy5jYW5jZWxSdW5uaW5nID0gbnVsbDtcbiAgICB0aGlzLl9zdGF0ZSA9IG9wdGlvbnMuc3RhdGUgfHwgJ2luaXRpYWwnO1xuICAgIHRoaXMuaW5pdGlhbFN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgdGhpcy5zdGF0ZUF0dHJpYnV0ZSA9IG9wdGlvbnMuc3RhdGVBdHRyaWJ1dGUgfHwgJ2RhdGEtYW5pbWF0aW9uLXN0YXRlJztcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlID0gb3B0aW9ucy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSB8fCAnZGF0YS1hbmltYXRpb24nO1xuICAgIHRoaXMuZW5kRXZlbnQgPSBvcHRpb25zLmVuZEV2ZW50IHx8ICd0cmFuc2l0aW9uZW5kJztcbiAgICB0aGlzLmhvbGQgPSAhIW9wdGlvbnMuaG9sZDtcblxuICAgIHRoaXMub25TdGFydCA9IG9wdGlvbnMub25TdGFydCB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAvKiBkbyBub3RoaW5nICovXG4gICAgfTtcblxuICAgIHRoaXMuYWN0aXZlRXZlbnRIYW5kbGVyID0gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0YXJnZXQgZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gVGFyZ2V0IGVsZW1lbnRcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0aW9uLCBbe1xuICAgIGtleTogXCJpc1N0YXRlXCIsXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHN0YXRlIGlzIGFjdGl2ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZSBTdGF0ZSB0byBjb21wYXJlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N0YXRlKHN0YXRlKSB7XG4gICAgICByZXR1cm4gc3RhdGUgPT09IHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXF1ZW5jZXMgYSBjaGFuZ2UgdG8gYSBuZXcgc3RhdGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlIFRhcmdldCBzdGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmZvcmNlIFN3aXRjaCB0byBmaW5hbCBzdGF0ZSBpbW1lZGlhdGVseVxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vblN0YXJ0IENhbGxiYWNrIHRvIGV4ZWN1dGUgaW1tZWRpYXRlbHkgYWZ0ZXJcbiAgICAgKiBhcHBseWluZyBzdGF0ZUNoYW5nZUF0dHJpYnV0ZSBmb3IgdGhpcyBzdGF0ZSBjaGFuZ2Ugb25seS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaG9sZD1mYWxzZV0gSWYgdHJ1ZSwgY2hhbmdlQXR0cmlidXRlIHdpbGwgbm90IGJlIHJlbW92ZWQgdW50aWwgdGhlXG4gICAgICogbmV4dCBzdGF0ZSBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIGVuZEV2ZW50IHRyaWdnZXJlZFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYW5pbWF0ZVRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFuaW1hdGVUbyhzdGF0ZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIGZyb20gPSB0aGlzLl9lbC5kYXRhc2V0W3RoaXMuc3RhdGVBdHRyaWJ1dGVdIHx8IHRoaXMuX3N0YXRlO1xuICAgICAgdmFyIHRvID0gc3RhdGUgfHwgdGhpcy5pbml0aWFsU3RhdGU7XG4gICAgICB2YXIgZm9yY2UgPSBvcHRpb25zLmZvcmNlO1xuICAgICAgdmFyIGhvbGQgPSAnaG9sZCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuaG9sZCA6IHRoaXMuaG9sZDtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBpZiAoX3RoaXMuY2FuY2VsUnVubmluZykge1xuICAgICAgICAgIF90aGlzLmNhbmNlbFJ1bm5pbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcm9tID09PSB0bykge1xuICAgICAgICAgIC8vIFJlbW92aW5nIHRoaXMgaGVyZSBmaXhlcyBzb21lIGxpbmdlcmluZyBhdHRyaWJ1dGVzLiBCdXQgd2h5P1xuICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShmcm9tLCBudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgX3RoaXMuY2FuY2VsUnVubmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgcmVzb2x2ZShudWxsLCBudWxsKTtcbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihfdGhpcy5lbmRFdmVudCwgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIgPSBudWxsO1xuXG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgIF90aGlzLl9lbC5zZXRBdHRyaWJ1dGUoX3RoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUsIFwiXCIuY29uY2F0KGZyb20sIFwiPT5cIikuY29uY2F0KHRvKSk7XG5cbiAgICAgICAgICBfdGhpcy5vblN0YXJ0KHtcbiAgICAgICAgICAgIGVsOiBfdGhpcy5fZWwsXG4gICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgdG86IHRvXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25TdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3B0aW9ucy5vblN0YXJ0KHtcbiAgICAgICAgICAgICAgZWw6IF90aGlzLl9lbCxcbiAgICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgICAgdG86IHRvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5fZWwuc2V0QXR0cmlidXRlKF90aGlzLnN0YXRlQXR0cmlidXRlLCB0byk7XG5cbiAgICAgICAgICBfdGhpcy5fc3RhdGUgPSB0bztcblxuICAgICAgICAgIGlmICghaG9sZCkge1xuICAgICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSh0bywgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmFmKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFydW5uaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuXG4gICAgICAgICAgX3RoaXMuX2VsLnNldEF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSwgXCJcIi5jb25jYXQoZnJvbSwgXCI9PlwiKS5jb25jYXQodG8pKTtcblxuICAgICAgICAgIF90aGlzLm9uU3RhcnQoe1xuICAgICAgICAgICAgZWw6IF90aGlzLl9lbCxcbiAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICB0bzogdG9cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vblN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uU3RhcnQoe1xuICAgICAgICAgICAgICBlbDogX3RoaXMuX2VsLFxuICAgICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgICB0bzogdG9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByYWYoKTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFydW5uaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbmNlbGxlZCcpO1xuXG4gICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3RoaXMuZW5kRXZlbnQsIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgICBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGFueSBldmVudHMgYnViYmxpbmcgdXBcbiAgICAgICAgICAgIGlmIChlLnRhcmdldCAhPT0gX3RoaXMuX2VsIHx8ICFydW5uaW5nKSByZXR1cm47XG5cbiAgICAgICAgICAgIF90aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKF90aGlzLmVuZEV2ZW50LCBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgICAgICBpZiAoIWhvbGQpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUodG8sIGUpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBfdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihfdGhpcy5lbmRFdmVudCwgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICAgIF90aGlzLl9lbC5zZXRBdHRyaWJ1dGUoX3RoaXMuc3RhdGVBdHRyaWJ1dGUsIHRvKTtcblxuICAgICAgICAgIF90aGlzLl9zdGF0ZSA9IHRvO1xuICAgICAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIC8vIE9ubHkgY2F0Y2ggJ2NhbmNlbGxlZCcgZXJyb3JzLlxuICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlICE9PSAnY2FuY2VsbGVkJykgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbnkgZXZlbnQgbGlzdGVuZXJzXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLmVuZEV2ZW50LCB0aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgIHRoaXMuYWN0aXZlRXZlbnRIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjdXJyZW50IHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IEN1cnJlbnQgc3RhdGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0YXRlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFuaW1hdGlvbjtcbn0oKTtcblxuZnVuY3Rpb24gdHJhbnNpdGlvbihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgQW5pbWF0aW9uKG9wdGlvbnMpO1xufVxuXG5jbGFzcyBSZWNpcGllbnRGb3JtIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5yZWNpcGllbnRGb3JtID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNpcGllbnQtZm9ybV0nKTtcbiAgICB0aGlzLnJlY2lwaWVudEZvcm1JbnB1dHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWlucHV0XScpO1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUVtYWlsSW5wdXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWVtYWlsLWlucHV0XScpO1xuICAgIHRoaXMuZGlzY2xvc3VyZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcmVjaXBpZW50LWRpc2Nsb3N1cmVdJyk7XG4gICAgdGhpcy5kaXNjbG9zdXJlQ2hlY2tib3ggPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1kaXNjbG9zdXJlLWNoZWNrYm94XScpO1xuICAgIHRoaXMuY2hlY2ttYXJrID0gdGhpcy5kaXNjbG9zdXJlLnF1ZXJ5U2VsZWN0b3IoJy5jaGVja21hcmsnKTtcbiAgICB0aGlzLmNoZWNrbWFya0NoZWNrID0gdGhpcy5kaXNjbG9zdXJlLnF1ZXJ5U2VsZWN0b3IoJy5jaGVja21hcmtfX2NoZWNrJyk7XG4gICAgdGhpcy5maWxsQW5pbWF0aW9uID0gdHJhbnNpdGlvbih7XG4gICAgICBlbDogdGhpcy5jaGVja21hcmtcbiAgICB9KTtcbiAgICB0aGlzLmNoZWNrQW5pbWF0aW9uID0gdHJhbnNpdGlvbih7XG4gICAgICBlbDogdGhpcy5jaGVja21hcmtDaGVja1xuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMucmVjaXBpZW50Rm9ybSwgJ2tleWRvd24nLCBldmVudCA9PiB0aGlzLl9vbktleWRvd24oZXZlbnQpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmRpc2Nsb3N1cmUsICd0b2dnbGUnLCAoKSA9PiB0aGlzLl9vblRvZ2dsZSgpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmRpc2Nsb3N1cmVDaGVja2JveCwgJ2NoYW5nZScsICgpID0+IHRoaXMuX29uQ2hhbmdlKCkpO1xuICB9XG5cbiAgX29uQ2hhbmdlKCkge1xuICAgIHRoaXMuZGlzY2xvc3VyZS5vcGVuID0gdGhpcy5kaXNjbG9zdXJlQ2hlY2tib3guY2hlY2tlZDtcbiAgfVxuXG4gIF9vbktleWRvd24oZXZlbnQpIHtcbiAgICAvLyBQcmV2ZW50IGlucHV0IGZvcm0gc3VibWlzc2lvblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWlucHV0XScpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9vblRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNjbG9zdXJlLm9wZW4pIHtcbiAgICAgIHRoaXMuX3Nob3dSZWNpcGllbnRGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hpZGVSZWNpcGllbnRGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgX3Nob3dSZWNpcGllbnRGb3JtKCkge1xuICAgIGlmICh0aGlzLmNoZWNrbWFyayAmJiB0aGlzLmNoZWNrbWFya0NoZWNrKSB7XG4gICAgICB0aGlzLmZpbGxBbmltYXRpb24uYW5pbWF0ZVRvKCdjaGVja2VkJyk7XG4gICAgICB0aGlzLmNoZWNrQW5pbWF0aW9uLmFuaW1hdGVUbygnY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY2xvc3VyZUNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUVtYWlsSW5wdXQucmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgX2hpZGVSZWNpcGllbnRGb3JtKCkge1xuICAgIGlmICh0aGlzLmNoZWNrbWFyayAmJiB0aGlzLmNoZWNrbWFya0NoZWNrKSB7XG4gICAgICB0aGlzLmZpbGxBbmltYXRpb24uYW5pbWF0ZVRvKCd1bmNoZWNrZWQnKTtcbiAgICAgIHRoaXMuY2hlY2tBbmltYXRpb24uYW5pbWF0ZVRvKCd1bmNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRpc2Nsb3N1cmVDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZWNpcGllbnRGb3JtRW1haWxJbnB1dC5yZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcmVzZXRSZWNpcGllbnRGb3JtKCk7XG4gIH1cblxuICBfcmVzZXRSZWNpcGllbnRGb3JtKCkge1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUlucHV0cy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnZhbHVlID0gJyc7XG5cbiAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zvcm0tZmllbGQtZmlsbGVkJykpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZm9ybS1maWVsZC1maWxsZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnJlY2lwaWVudEZvcm0uY2xhc3NMaXN0LmNvbnRhaW5zKCdyZWNpcGllbnQtZm9ybS0taGFzLWVycm9ycycpKSB7XG4gICAgICB0aGlzLnJlY2lwaWVudEZvcm0uY2xhc3NMaXN0LnJlbW92ZSgncmVjaXBpZW50LWZvcm0tLWhhcy1lcnJvcnMnKTtcbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBSZWNpcGllbnRGb3JtO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/pxs-gift-card-recipient-form/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/pxs-map/dist/index.es.js":
/*!***********************************************************!*\
  !*** ./node_modules/@pixelunion/pxs-map/dist/index.es.js ***!
  \***********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var scriptjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! scriptjs */ \"./node_modules/scriptjs/dist/script.js\");\n/* harmony import */ var scriptjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scriptjs__WEBPACK_IMPORTED_MODULE_0__);\n\n/*!\n * @pixelunion/pxs-map v3.2.0\n * (c) 2024 Pixel Union\n */\n\n\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(n);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n  return arr2;\n}\n\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n/*\n * Function to convert any given latitude and longitude format to decimal degrees\n */\nfunction getDecimalDegrees() {\n  var firstComponent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n  var secondComponent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  var thirdComponent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  var fourthComponent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n  var directions = {\n    N: 1,\n    E: 1,\n    S: -1,\n    W: -1\n  };\n  var decimalDegrees = 0.0;\n  var components = [firstComponent, secondComponent, thirdComponent, fourthComponent];\n\n  for (var i = 0; i < components.length; i++) {\n    var component = components[i];\n\n    if (component) {\n      if (Number.isNaN(parseFloat(component))) {\n        decimalDegrees *= directions[component];\n      } else {\n        decimalDegrees += parseFloat(component) / Math.pow(60, i);\n      }\n    }\n  }\n\n  return decimalDegrees;\n}\n/*\n * By providing the ability to use a place name, or latitude and longitude coordinates\n * we give merchants, and our demo stores the option to bypass the Geocoding API.\n * The Geocoding API (https://developers.google.com/maps/documentation/geocoding/usage-and-billing) allows us\n * to take a place name and convert it to latitude and longitude expressed in decimal degrees.\n */\n\n\nfunction getLatitudeLongitude(address) {\n  // Degrees, Minutes and Seconds: DDD° MM' SS.S\"\n  var latLongDegreesMinutesSeconds = /^([0-9]{1,3})(?:°[ ]?| )([0-9]{1,2})(?:'[ ]?| )([0-9]{1,2}(?:\\.[0-9]+)?)(?:\"[ ]?| )?(N|E|S|W) ?([0-9]{1,3})(?:°[ ]?| )([0-9]{1,2})(?:'[ ]?| )([0-9]{1,2}(?:\\.[0-9]+)?)(?:\"[ ]?| )?(N|E|S|W)$/g; // Degrees and Decimal Minutes: DDD° MM.MMM'\n\n  var latLongDegreesMinutes = /^([0-9]{1,3})(?:°[ ]?| )([0-9]{1,2}(?:\\.[0-9]+)?)(?:'[ ]?| )?(N|E|S|W) ?([0-9]{1,3})(?:°[ ]?| )([0-9]{1,2}(?:\\.[0-9]+)?)(?:'[ ]?| )?(N|E|S|W)$/g; // Decimal Degrees: DDD.DDDDD°\n\n  var latLongDegrees = /^([-|+]?[0-9]{1,3}(?:\\.[0-9]+)?)(?:°[ ]?| )?(N|E|S|W)?,? ?([-|+]?[0-9]{1,3}(?:\\.[0-9]+)?)(?:°[ ]?| )?(N|E|S|W)?$/g;\n  var latLongFormats = [latLongDegreesMinutesSeconds, latLongDegreesMinutes, latLongDegrees];\n  var latLongMatches = latLongFormats.map(function (latLongFormat) {\n    return address.match(latLongFormat);\n  });\n  /*\n   * Select the first latitude and longitude format that is matched.\n   * Ordering:\n   *   1. Degrees, minutes, and seconds,\n   *   2. Degrees, and decimal minutes,\n   *   3. Decimal degrees.\n   */\n\n  var latLongMatch = latLongMatches.reduce(function (accumulator, value, index) {\n    if (!accumulator && value) {\n      var latLongResult = latLongFormats[index].exec(address);\n      var lat = latLongResult.slice(1, latLongResult.length / 2 + 1);\n      var lng = latLongResult.slice(latLongResult.length / 2 + 1, latLongResult.length);\n      return {\n        lat: lat,\n        lng: lng\n      };\n    }\n\n    return accumulator;\n  }, null);\n  return new Promise(function (resolve, reject) {\n    // If we've got a match on latitude and longitude, use that and avoid geocoding\n    if (latLongMatch) {\n      var latDecimalDegrees = getDecimalDegrees.apply(void 0, _toConsumableArray(latLongMatch.lat));\n      var longDecimalDegrees = getDecimalDegrees.apply(void 0, _toConsumableArray(latLongMatch.lng));\n      resolve({\n        lat: latDecimalDegrees,\n        lng: longDecimalDegrees\n      });\n    } else {\n      // Otherwise, geocode the assumed address\n      var geocoder = new google.maps.Geocoder();\n      geocoder.geocode({\n        address: address\n      }, function (results, status) {\n        if (status !== google.maps.GeocoderStatus.OK || !results[0]) {\n          reject(status);\n        } else {\n          resolve(results[0].geometry.location);\n        }\n      });\n    }\n  });\n}\n\nfunction getMapStyles(colors) {\n  if (!colors) {\n    return [];\n  }\n\n  return [{\n    elementType: 'geometry',\n    stylers: [{\n      color: colors.e\n    }]\n  }, {\n    elementType: 'labels.icon',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    elementType: 'labels.text.fill',\n    stylers: [{\n      color: colors.a\n    }]\n  }, {\n    elementType: 'labels.text.stroke',\n    stylers: [{\n      color: colors.e\n    }]\n  }, {\n    featureType: 'administrative',\n    elementType: 'geometry',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'administrative.country',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'administrative.land_parcel',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'administrative.neighborhood',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'administrative.locality',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'poi',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'road',\n    elementType: 'geometry.fill',\n    stylers: [{\n      color: colors.d\n    }]\n  }, {\n    featureType: 'road',\n    elementType: 'labels.icon',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'road.arterial',\n    elementType: 'geometry',\n    stylers: [{\n      color: colors.c\n    }]\n  }, {\n    featureType: 'road.highway',\n    elementType: 'geometry',\n    stylers: [{\n      color: colors.b\n    }]\n  }, {\n    featureType: 'road.highway.controlled_access',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'road.local',\n    elementType: 'labels.text.fill',\n    stylers: [{\n      color: colors.b\n    }]\n  }, {\n    featureType: 'road.local',\n    elementType: 'labels.text.stroke',\n    stylers: [{\n      color: colors.e\n    }]\n  }, {\n    featureType: 'transit',\n    stylers: [{\n      visibility: 'off'\n    }]\n  }, {\n    featureType: 'water',\n    elementType: 'geometry',\n    stylers: [{\n      color: colors.f\n    }]\n  }];\n}\n\nfunction createMap(options) {\n  var container = options.container,\n      address = options.address,\n      zoom = options.zoom,\n      colors = options.colors;\n  return getLatitudeLongitude(address).then(function (latLong) {\n    var map = new google.maps.Map(container, {\n      center: latLong,\n      clickableIcons: false,\n      disableDefaultUI: true,\n      disableDoubleClickZoom: true,\n      gestureHandling: 'none',\n      keyboardShortcuts: false,\n      maxZoom: zoom,\n      minZoom: zoom,\n      scrollWheel: false,\n      styles: getMapStyles(colors),\n      zoom: zoom,\n      zoomControl: false\n    });\n    new google.maps.Marker({\n      clickable: false,\n      map: map,\n      position: map.getCenter()\n    });\n    map.panBy(0, 0);\n  })[\"catch\"](function (status) {\n    var usageLimits = 'https://developers.google.com/maps/faq#usagelimits';\n    var errorMessage;\n\n    switch (status) {\n      case 'ZERO_RESULTS':\n        errorMessage = \"<p>Unable to find the address:</p> \".concat(address);\n        break;\n\n      case 'OVER_QUERY_LIMIT':\n        errorMessage = \"\\n            <p>Unable to load Google Maps, you have reached your usage limit.</p>\\n            <p>\\n              Please visit\\n              <a href=\\\"\".concat(usageLimits, \"\\\" target=\\\"_blank\\\">\").concat(usageLimits, \"</a>\\n              for more details.\\n            </p>\\n          \");\n        break;\n\n      default:\n        errorMessage = 'Unable to load Google Maps.';\n        break;\n    }\n\n    throw errorMessage;\n  });\n}\n\nfunction displayErrorInThemeEditor(container, errorMessage) {\n  var isThemeEditor = window.Shopify && window.Shopify.designMode;\n\n  if (!isThemeEditor) {\n    return;\n  }\n\n  container.innerHTML = \"<div class=\\\"map-error-message\\\">\".concat(errorMessage, \"</div>\");\n}\n\nvar PxsMap = function PxsMap(section) {\n  var _this = this;\n\n  _classCallCheck(this, PxsMap);\n\n  this.map = null;\n  var el = section.el.querySelector('[data-map]');\n  var container = el.querySelector('[data-map-container]');\n  var settings = section.data;\n  var address = settings.address,\n      colors = settings.colors;\n  var apiKey = settings.api_key; // Scale so range is 12 ~ 17, rather than 1 to 6\n\n  var zoom = Number.isNaN(settings.zoom) ? 13 : 11 + parseInt(settings.zoom, 10);\n\n  if (apiKey) {\n    if (window.googleMaps === undefined) {\n      scriptjs__WEBPACK_IMPORTED_MODULE_0___default()(\"https://maps.googleapis.com/maps/api/js?key=\".concat(apiKey), function () {\n        window.googleMaps = true;\n        createMap({\n          container: container,\n          address: address,\n          zoom: zoom,\n          colors: colors\n        }).then(function (map) {\n          _this.map = map;\n        })[\"catch\"](function (error) {\n          return displayErrorInThemeEditor(container, error);\n        });\n      });\n    } else {\n      createMap({\n        container: container,\n        address: address,\n        zoom: zoom,\n        colors: colors\n      }).then(function (map) {\n        _this.map = map;\n      })[\"catch\"](function (error) {\n        return displayErrorInThemeEditor(container, error);\n      });\n    }\n  }\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PxsMap);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLW1hcC9kaXN0L2luZGV4LmVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9weHMtbWFwL2Rpc3QvaW5kZXguZXMuanM/YTViMyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIVxuICogQHBpeGVsdW5pb24vcHhzLW1hcCB2My4yLjBcbiAqIChjKSAyMDI0IFBpeGVsIFVuaW9uXG4gKi9cblxuaW1wb3J0ICRzY3JpcHQgZnJvbSAnc2NyaXB0anMnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShuKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBjb252ZXJ0IGFueSBnaXZlbiBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGZvcm1hdCB0byBkZWNpbWFsIGRlZ3JlZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVjaW1hbERlZ3JlZXMoKSB7XG4gIHZhciBmaXJzdENvbXBvbmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcbiAgdmFyIHNlY29uZENvbXBvbmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIHRoaXJkQ29tcG9uZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuICB2YXIgZm91cnRoQ29tcG9uZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAwO1xuICB2YXIgZGlyZWN0aW9ucyA9IHtcbiAgICBOOiAxLFxuICAgIEU6IDEsXG4gICAgUzogLTEsXG4gICAgVzogLTFcbiAgfTtcbiAgdmFyIGRlY2ltYWxEZWdyZWVzID0gMC4wO1xuICB2YXIgY29tcG9uZW50cyA9IFtmaXJzdENvbXBvbmVudCwgc2Vjb25kQ29tcG9uZW50LCB0aGlyZENvbXBvbmVudCwgZm91cnRoQ29tcG9uZW50XTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcblxuICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VGbG9hdChjb21wb25lbnQpKSkge1xuICAgICAgICBkZWNpbWFsRGVncmVlcyAqPSBkaXJlY3Rpb25zW2NvbXBvbmVudF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNpbWFsRGVncmVlcyArPSBwYXJzZUZsb2F0KGNvbXBvbmVudCkgLyBNYXRoLnBvdyg2MCwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY2ltYWxEZWdyZWVzO1xufVxuLypcbiAqIEJ5IHByb3ZpZGluZyB0aGUgYWJpbGl0eSB0byB1c2UgYSBwbGFjZSBuYW1lLCBvciBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGNvb3JkaW5hdGVzXG4gKiB3ZSBnaXZlIG1lcmNoYW50cywgYW5kIG91ciBkZW1vIHN0b3JlcyB0aGUgb3B0aW9uIHRvIGJ5cGFzcyB0aGUgR2VvY29kaW5nIEFQSS5cbiAqIFRoZSBHZW9jb2RpbmcgQVBJIChodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vZ2VvY29kaW5nL3VzYWdlLWFuZC1iaWxsaW5nKSBhbGxvd3MgdXNcbiAqIHRvIHRha2UgYSBwbGFjZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgZXhwcmVzc2VkIGluIGRlY2ltYWwgZGVncmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExhdGl0dWRlTG9uZ2l0dWRlKGFkZHJlc3MpIHtcbiAgLy8gRGVncmVlcywgTWludXRlcyBhbmQgU2Vjb25kczogREREwrAgTU0nIFNTLlNcIlxuICB2YXIgbGF0TG9uZ0RlZ3JlZXNNaW51dGVzU2Vjb25kcyA9IC9eKFswLTldezEsM30pKD86wrBbIF0/fCApKFswLTldezEsMn0pKD86J1sgXT98ICkoWzAtOV17MSwyfSg/OlxcLlswLTldKyk/KSg/OlwiWyBdP3wgKT8oTnxFfFN8VykgPyhbMC05XXsxLDN9KSg/OsKwWyBdP3wgKShbMC05XXsxLDJ9KSg/OidbIF0/fCApKFswLTldezEsMn0oPzpcXC5bMC05XSspPykoPzpcIlsgXT98ICk/KE58RXxTfFcpJC9nOyAvLyBEZWdyZWVzIGFuZCBEZWNpbWFsIE1pbnV0ZXM6IERERMKwIE1NLk1NTSdcblxuICB2YXIgbGF0TG9uZ0RlZ3JlZXNNaW51dGVzID0gL14oWzAtOV17MSwzfSkoPzrCsFsgXT98ICkoWzAtOV17MSwyfSg/OlxcLlswLTldKyk/KSg/OidbIF0/fCApPyhOfEV8U3xXKSA/KFswLTldezEsM30pKD86wrBbIF0/fCApKFswLTldezEsMn0oPzpcXC5bMC05XSspPykoPzonWyBdP3wgKT8oTnxFfFN8VykkL2c7IC8vIERlY2ltYWwgRGVncmVlczogRERELkREREREwrBcblxuICB2YXIgbGF0TG9uZ0RlZ3JlZXMgPSAvXihbLXwrXT9bMC05XXsxLDN9KD86XFwuWzAtOV0rKT8pKD86wrBbIF0/fCApPyhOfEV8U3xXKT8sPyA/KFstfCtdP1swLTldezEsM30oPzpcXC5bMC05XSspPykoPzrCsFsgXT98ICk/KE58RXxTfFcpPyQvZztcbiAgdmFyIGxhdExvbmdGb3JtYXRzID0gW2xhdExvbmdEZWdyZWVzTWludXRlc1NlY29uZHMsIGxhdExvbmdEZWdyZWVzTWludXRlcywgbGF0TG9uZ0RlZ3JlZXNdO1xuICB2YXIgbGF0TG9uZ01hdGNoZXMgPSBsYXRMb25nRm9ybWF0cy5tYXAoZnVuY3Rpb24gKGxhdExvbmdGb3JtYXQpIHtcbiAgICByZXR1cm4gYWRkcmVzcy5tYXRjaChsYXRMb25nRm9ybWF0KTtcbiAgfSk7XG4gIC8qXG4gICAqIFNlbGVjdCB0aGUgZmlyc3QgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBmb3JtYXQgdGhhdCBpcyBtYXRjaGVkLlxuICAgKiBPcmRlcmluZzpcbiAgICogICAxLiBEZWdyZWVzLCBtaW51dGVzLCBhbmQgc2Vjb25kcyxcbiAgICogICAyLiBEZWdyZWVzLCBhbmQgZGVjaW1hbCBtaW51dGVzLFxuICAgKiAgIDMuIERlY2ltYWwgZGVncmVlcy5cbiAgICovXG5cbiAgdmFyIGxhdExvbmdNYXRjaCA9IGxhdExvbmdNYXRjaGVzLnJlZHVjZShmdW5jdGlvbiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCkge1xuICAgIGlmICghYWNjdW11bGF0b3IgJiYgdmFsdWUpIHtcbiAgICAgIHZhciBsYXRMb25nUmVzdWx0ID0gbGF0TG9uZ0Zvcm1hdHNbaW5kZXhdLmV4ZWMoYWRkcmVzcyk7XG4gICAgICB2YXIgbGF0ID0gbGF0TG9uZ1Jlc3VsdC5zbGljZSgxLCBsYXRMb25nUmVzdWx0Lmxlbmd0aCAvIDIgKyAxKTtcbiAgICAgIHZhciBsbmcgPSBsYXRMb25nUmVzdWx0LnNsaWNlKGxhdExvbmdSZXN1bHQubGVuZ3RoIC8gMiArIDEsIGxhdExvbmdSZXN1bHQubGVuZ3RoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhdDogbGF0LFxuICAgICAgICBsbmc6IGxuZ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH0sIG51bGwpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIC8vIElmIHdlJ3ZlIGdvdCBhIG1hdGNoIG9uIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUsIHVzZSB0aGF0IGFuZCBhdm9pZCBnZW9jb2RpbmdcbiAgICBpZiAobGF0TG9uZ01hdGNoKSB7XG4gICAgICB2YXIgbGF0RGVjaW1hbERlZ3JlZXMgPSBnZXREZWNpbWFsRGVncmVlcy5hcHBseSh2b2lkIDAsIF90b0NvbnN1bWFibGVBcnJheShsYXRMb25nTWF0Y2gubGF0KSk7XG4gICAgICB2YXIgbG9uZ0RlY2ltYWxEZWdyZWVzID0gZ2V0RGVjaW1hbERlZ3JlZXMuYXBwbHkodm9pZCAwLCBfdG9Db25zdW1hYmxlQXJyYXkobGF0TG9uZ01hdGNoLmxuZykpO1xuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGxhdDogbGF0RGVjaW1hbERlZ3JlZXMsXG4gICAgICAgIGxuZzogbG9uZ0RlY2ltYWxEZWdyZWVzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlLCBnZW9jb2RlIHRoZSBhc3N1bWVkIGFkZHJlc3NcbiAgICAgIHZhciBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuICAgICAgZ2VvY29kZXIuZ2VvY29kZSh7XG4gICAgICAgIGFkZHJlc3M6IGFkZHJlc3NcbiAgICAgIH0sIGZ1bmN0aW9uIChyZXN1bHRzLCBzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0sgfHwgIXJlc3VsdHNbMF0pIHtcbiAgICAgICAgICByZWplY3Qoc3RhdHVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdHNbMF0uZ2VvbWV0cnkubG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRNYXBTdHlsZXMoY29sb3JzKSB7XG4gIGlmICghY29sb3JzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFt7XG4gICAgZWxlbWVudFR5cGU6ICdnZW9tZXRyeScsXG4gICAgc3R5bGVyczogW3tcbiAgICAgIGNvbG9yOiBjb2xvcnMuZVxuICAgIH1dXG4gIH0sIHtcbiAgICBlbGVtZW50VHlwZTogJ2xhYmVscy5pY29uJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgdmlzaWJpbGl0eTogJ29mZidcbiAgICB9XVxuICB9LCB7XG4gICAgZWxlbWVudFR5cGU6ICdsYWJlbHMudGV4dC5maWxsJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgY29sb3I6IGNvbG9ycy5hXG4gICAgfV1cbiAgfSwge1xuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuc3Ryb2tlJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgY29sb3I6IGNvbG9ycy5lXG4gICAgfV1cbiAgfSwge1xuICAgIGZlYXR1cmVUeXBlOiAnYWRtaW5pc3RyYXRpdmUnLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ2FkbWluaXN0cmF0aXZlLmNvdW50cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ2FkbWluaXN0cmF0aXZlLmxhbmRfcGFyY2VsJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgdmlzaWJpbGl0eTogJ29mZidcbiAgICB9XVxuICB9LCB7XG4gICAgZmVhdHVyZVR5cGU6ICdhZG1pbmlzdHJhdGl2ZS5uZWlnaGJvcmhvb2QnLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ2FkbWluaXN0cmF0aXZlLmxvY2FsaXR5JyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgdmlzaWJpbGl0eTogJ29mZidcbiAgICB9XVxuICB9LCB7XG4gICAgZmVhdHVyZVR5cGU6ICdwb2knLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQnLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnkuZmlsbCcsXG4gICAgc3R5bGVyczogW3tcbiAgICAgIGNvbG9yOiBjb2xvcnMuZFxuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQnLFxuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLmljb24nLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQuYXJ0ZXJpYWwnLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICBjb2xvcjogY29sb3JzLmNcbiAgICB9XVxuICB9LCB7XG4gICAgZmVhdHVyZVR5cGU6ICdyb2FkLmhpZ2h3YXknLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICBjb2xvcjogY29sb3JzLmJcbiAgICB9XVxuICB9LCB7XG4gICAgZmVhdHVyZVR5cGU6ICdyb2FkLmhpZ2h3YXkuY29udHJvbGxlZF9hY2Nlc3MnLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICB2aXNpYmlsaXR5OiAnb2ZmJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQubG9jYWwnLFxuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuZmlsbCcsXG4gICAgc3R5bGVyczogW3tcbiAgICAgIGNvbG9yOiBjb2xvcnMuYlxuICAgIH1dXG4gIH0sIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQubG9jYWwnLFxuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuc3Ryb2tlJyxcbiAgICBzdHlsZXJzOiBbe1xuICAgICAgY29sb3I6IGNvbG9ycy5lXG4gICAgfV1cbiAgfSwge1xuICAgIGZlYXR1cmVUeXBlOiAndHJhbnNpdCcsXG4gICAgc3R5bGVyczogW3tcbiAgICAgIHZpc2liaWxpdHk6ICdvZmYnXG4gICAgfV1cbiAgfSwge1xuICAgIGZlYXR1cmVUeXBlOiAnd2F0ZXInLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFt7XG4gICAgICBjb2xvcjogY29sb3JzLmZcbiAgICB9XVxuICB9XTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFwKG9wdGlvbnMpIHtcbiAgdmFyIGNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyLFxuICAgICAgYWRkcmVzcyA9IG9wdGlvbnMuYWRkcmVzcyxcbiAgICAgIHpvb20gPSBvcHRpb25zLnpvb20sXG4gICAgICBjb2xvcnMgPSBvcHRpb25zLmNvbG9ycztcbiAgcmV0dXJuIGdldExhdGl0dWRlTG9uZ2l0dWRlKGFkZHJlc3MpLnRoZW4oZnVuY3Rpb24gKGxhdExvbmcpIHtcbiAgICB2YXIgbWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcChjb250YWluZXIsIHtcbiAgICAgIGNlbnRlcjogbGF0TG9uZyxcbiAgICAgIGNsaWNrYWJsZUljb25zOiBmYWxzZSxcbiAgICAgIGRpc2FibGVEZWZhdWx0VUk6IHRydWUsXG4gICAgICBkaXNhYmxlRG91YmxlQ2xpY2tab29tOiB0cnVlLFxuICAgICAgZ2VzdHVyZUhhbmRsaW5nOiAnbm9uZScsXG4gICAgICBrZXlib2FyZFNob3J0Y3V0czogZmFsc2UsXG4gICAgICBtYXhab29tOiB6b29tLFxuICAgICAgbWluWm9vbTogem9vbSxcbiAgICAgIHNjcm9sbFdoZWVsOiBmYWxzZSxcbiAgICAgIHN0eWxlczogZ2V0TWFwU3R5bGVzKGNvbG9ycyksXG4gICAgICB6b29tOiB6b29tLFxuICAgICAgem9vbUNvbnRyb2w6IGZhbHNlXG4gICAgfSk7XG4gICAgbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICBjbGlja2FibGU6IGZhbHNlLFxuICAgICAgbWFwOiBtYXAsXG4gICAgICBwb3NpdGlvbjogbWFwLmdldENlbnRlcigpXG4gICAgfSk7XG4gICAgbWFwLnBhbkJ5KDAsIDApO1xuICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICB2YXIgdXNhZ2VMaW1pdHMgPSAnaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9mYXEjdXNhZ2VsaW1pdHMnO1xuICAgIHZhciBlcnJvck1lc3NhZ2U7XG5cbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSAnWkVST19SRVNVTFRTJzpcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gXCI8cD5VbmFibGUgdG8gZmluZCB0aGUgYWRkcmVzczo8L3A+IFwiLmNvbmNhdChhZGRyZXNzKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ09WRVJfUVVFUllfTElNSVQnOlxuICAgICAgICBlcnJvck1lc3NhZ2UgPSBcIlxcbiAgICAgICAgICAgIDxwPlVuYWJsZSB0byBsb2FkIEdvb2dsZSBNYXBzLCB5b3UgaGF2ZSByZWFjaGVkIHlvdXIgdXNhZ2UgbGltaXQuPC9wPlxcbiAgICAgICAgICAgIDxwPlxcbiAgICAgICAgICAgICAgUGxlYXNlIHZpc2l0XFxuICAgICAgICAgICAgICA8YSBocmVmPVxcXCJcIi5jb25jYXQodXNhZ2VMaW1pdHMsIFwiXFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+XCIpLmNvbmNhdCh1c2FnZUxpbWl0cywgXCI8L2E+XFxuICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLlxcbiAgICAgICAgICAgIDwvcD5cXG4gICAgICAgICAgXCIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gJ1VuYWJsZSB0byBsb2FkIEdvb2dsZSBNYXBzLic7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yTWVzc2FnZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRpc3BsYXlFcnJvckluVGhlbWVFZGl0b3IoY29udGFpbmVyLCBlcnJvck1lc3NhZ2UpIHtcbiAgdmFyIGlzVGhlbWVFZGl0b3IgPSB3aW5kb3cuU2hvcGlmeSAmJiB3aW5kb3cuU2hvcGlmeS5kZXNpZ25Nb2RlO1xuXG4gIGlmICghaXNUaGVtZUVkaXRvcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIjxkaXYgY2xhc3M9XFxcIm1hcC1lcnJvci1tZXNzYWdlXFxcIj5cIi5jb25jYXQoZXJyb3JNZXNzYWdlLCBcIjwvZGl2PlwiKTtcbn1cblxudmFyIFB4c01hcCA9IGZ1bmN0aW9uIFB4c01hcChzZWN0aW9uKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB4c01hcCk7XG5cbiAgdGhpcy5tYXAgPSBudWxsO1xuICB2YXIgZWwgPSBzZWN0aW9uLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1hcF0nKTtcbiAgdmFyIGNvbnRhaW5lciA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1hcC1jb250YWluZXJdJyk7XG4gIHZhciBzZXR0aW5ncyA9IHNlY3Rpb24uZGF0YTtcbiAgdmFyIGFkZHJlc3MgPSBzZXR0aW5ncy5hZGRyZXNzLFxuICAgICAgY29sb3JzID0gc2V0dGluZ3MuY29sb3JzO1xuICB2YXIgYXBpS2V5ID0gc2V0dGluZ3MuYXBpX2tleTsgLy8gU2NhbGUgc28gcmFuZ2UgaXMgMTIgfiAxNywgcmF0aGVyIHRoYW4gMSB0byA2XG5cbiAgdmFyIHpvb20gPSBOdW1iZXIuaXNOYU4oc2V0dGluZ3Muem9vbSkgPyAxMyA6IDExICsgcGFyc2VJbnQoc2V0dGluZ3Muem9vbSwgMTApO1xuXG4gIGlmIChhcGlLZXkpIHtcbiAgICBpZiAod2luZG93Lmdvb2dsZU1hcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgJHNjcmlwdChcImh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9XCIuY29uY2F0KGFwaUtleSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luZG93Lmdvb2dsZU1hcHMgPSB0cnVlO1xuICAgICAgICBjcmVhdGVNYXAoe1xuICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgICBjb2xvcnM6IGNvbG9yc1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICBfdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRpc3BsYXlFcnJvckluVGhlbWVFZGl0b3IoY29udGFpbmVyLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyZWF0ZU1hcCh7XG4gICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBjb2xvcnM6IGNvbG9yc1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgIF90aGlzLm1hcCA9IG1hcDtcbiAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkaXNwbGF5RXJyb3JJblRoZW1lRWRpdG9yKGNvbnRhaW5lciwgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQeHNNYXA7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/pxs-map/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/pxs-video/dist/index.es.js":
/*!*************************************************************!*\
  !*** ./node_modules/@pixelunion/pxs-video/dist/index.es.js ***!
  \*************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*!\n * @pixelunion/pxs-video v2.0.0\n * (c) 2023 Pixel Union\n */\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar script = createCommonjsModule(function (module) {\n/*!\n  * $script.js JS loader & dependency manager\n  * https://github.com/ded/script.js\n  * (c) Dustin Diaz 2014 | License MIT\n  */\n\n(function (name, definition) {\n  if ( module.exports) module.exports = definition();\n  else this[name] = definition();\n})('$script', function () {\n  var doc = document\n    , head = doc.getElementsByTagName('head')[0]\n    , f = false\n    , push = 'push'\n    , readyState = 'readyState'\n    , onreadystatechange = 'onreadystatechange'\n    , list = {}\n    , delay = {}\n    , scripts = {}\n    , scriptpath\n    , urlArgs;\n\n  function every(ar, fn) {\n    for (var i = 0, j = ar.length; i < j; ++i) if (!fn(ar[i])) return f\n    return 1\n  }\n  function each(ar, fn) {\n    every(ar, function (el) {\n      fn(el);\n      return 1\n    });\n  }\n\n  function $script(paths, idOrDone, optDone) {\n    paths = paths[push] ? paths : [paths];\n    var idOrDoneIsDone = idOrDone && idOrDone.call\n      , done = idOrDoneIsDone ? idOrDone : optDone\n      , id = idOrDoneIsDone ? paths.join('') : idOrDone\n      , queue = paths.length;\n    function loopFn(item) {\n      return item.call ? item() : list[item]\n    }\n    function callback() {\n      if (!--queue) {\n        list[id] = 1;\n        done && done();\n        for (var dset in delay) {\n          every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = []);\n        }\n      }\n    }\n    setTimeout(function () {\n      each(paths, function loading(path, force) {\n        if (path === null) return callback()\n        \n        if (!force && !/^https?:\\/\\//.test(path) && scriptpath) {\n          path = (path.indexOf('.js') === -1) ? scriptpath + path + '.js' : scriptpath + path;\n        }\n        \n        if (scripts[path]) {\n          return (scripts[path] == 2) ? callback() : setTimeout(function () { loading(path, true); }, 0)\n        }\n\n        scripts[path] = 1;\n        create(path, callback);\n      });\n    }, 0);\n    return $script\n  }\n\n  function create(path, fn) {\n    var el = doc.createElement('script'), loaded;\n    el.onload = el.onerror = el[onreadystatechange] = function () {\n      if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) return;\n      el.onload = el[onreadystatechange] = null;\n      loaded = 1;\n      scripts[path] = 2;\n      fn();\n    };\n    el.async = 1;\n    el.src = urlArgs ? path + (path.indexOf('?') === -1 ? '?' : '&') + urlArgs : path;\n    head.insertBefore(el, head.lastChild);\n  }\n\n  $script.get = create;\n\n  $script.order = function (scripts, id, done) {\n    (function callback(s) {\n      s = scripts.shift();\n      !scripts.length ? $script(s, id, done) : $script(s, callback);\n    }());\n  };\n\n  $script.path = function (p) {\n    scriptpath = p;\n  };\n  $script.urlArgs = function (str) {\n    urlArgs = str;\n  };\n  $script.ready = function (deps, ready, req) {\n    deps = deps[push] ? deps : [deps];\n    var missing = [];\n    !each(deps, function (dep) {\n      list[dep] || missing[push](dep);\n    }) && every(deps, function (dep) {return list[dep]}) ?\n      ready() : !function (key) {\n      delay[key] = delay[key] || [];\n      delay[key][push](ready);\n      req && req(missing);\n    }(deps.join('|'));\n    return $script\n  };\n\n  $script.done = function (idOrDone) {\n    $script([null], idOrDone);\n  };\n\n  return $script\n});\n});\n\nvar api = 'https://www.youtube.com/iframe_api';\nvar apiLoadedCallbacks = [];\nvar apiLoaded = false;\n\nwindow.onYouTubeIframeAPIReady = function () {\n  apiLoadedCallbacks.forEach(function (apiLoadedCallback) {\n    return apiLoadedCallback();\n  });\n  apiLoadedCallbacks = [];\n  apiLoaded = true;\n};\n\nvar Youtube = /*#__PURE__*/function () {\n  function Youtube(el, id, options) {\n    _classCallCheck(this, Youtube);\n\n    this.el = el;\n    this.id = id;\n    this.startMuted = options.startMuted;\n    this.loopVideo = options.loopVideo;\n    this.iframeEl = document.createElement('div');\n    this.el.appendChild(this.iframeEl);\n    this.onApiLoaded = this._onApiLoaded.bind(this);\n    this.isReady = false;\n    this.onReady = this._onReady.bind(this);\n    this.onReadyCallback = null;\n    this.playerState = null;\n    this.onStateChange = this._onStateChange.bind(this);\n    this.onPlayCallback = null;\n    this.onPlayError = null;\n\n    if (apiLoaded) {\n      this._onApiLoaded();\n    } else {\n      apiLoadedCallbacks.push(this.onApiLoaded);\n      script(api);\n    }\n  }\n\n  _createClass(Youtube, [{\n    key: \"play\",\n    value: function play() {\n      var _this = this;\n\n      return new Promise(function (resolve, reject) {\n        _this.onPlayCallback = resolve;\n        _this.onPlayError = reject;\n\n        if (_this.isReady) {\n          _this.player.playVideo();\n        } else {\n          _this.onReadyCallback = function () {\n            _this.player.playVideo();\n          };\n        }\n      });\n    }\n  }, {\n    key: \"pause\",\n    value: function pause() {\n      this.player.pauseVideo();\n    }\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      this.player.destroy();\n    }\n  }, {\n    key: \"_onApiLoaded\",\n    value: function _onApiLoaded() {\n      var playerVars = {\n        modestbranding: true,\n        showinfo: false,\n        controls: false,\n        loop: this.loopVideo,\n        mute: this.startMuted,\n        rel: 0\n      };\n\n      if (this.loopVideo) {\n        // This is required to allow 'loop' to work based on the YouTube api\n        playerVars.playlist = this.id;\n      }\n\n      this.player = new YT.Player(this.iframeEl, {\n        videoId: this.id,\n        playerVars: playerVars,\n        events: {\n          onReady: this.onReady,\n          onStateChange: this.onStateChange\n        }\n      });\n    }\n  }, {\n    key: \"_onReady\",\n    value: function _onReady() {\n      this.isReady = true;\n\n      if (this.onReadyCallback) {\n        this.onReadyCallback();\n      }\n    }\n  }, {\n    key: \"_onStateChange\",\n    value: function _onStateChange(event) {\n      var state = event.data;\n\n      if (this.onPlayCallback) {\n        if (state === YT.PlayerState.PLAYING) {\n          this.onPlayCallback();\n          this.onPlayCallback = null;\n          this.onPlayError = null;\n        } else if (this.playerState === YT.PlayerState.BUFFERING && (state === YT.PlayerState.UNSTARTED || state === YT.PlayerState.PAUSED)) {\n          this.onPlayError();\n          this.onPlayCallback = null;\n          this.onPlayError = null;\n        }\n      }\n\n      this.playerState = state;\n    }\n  }]);\n\n  return Youtube;\n}();\n\nvar api$1 = 'https://player.vimeo.com/api/player.js';\nvar thumbnailApi = 'http://vimeo.com/api/v2/video/{id}.json';\nvar apiLoaded$1 = false;\n\nvar VimeoPlayer = /*#__PURE__*/function () {\n  function VimeoPlayer(section, el, id, options) {\n    var _this = this;\n\n    _classCallCheck(this, VimeoPlayer);\n\n    this.section = section;\n    this.el = el;\n    this.id = id;\n    this.startMuted = options.startMuted;\n    this.loopVideo = options.loopVideo;\n    this.coverImage = this.section.querySelector('[data-vimeo-image]');\n    this.onApiLoaded = this._onApiLoaded.bind(this);\n    this.isReady = false;\n    this.onReady = this._onReady.bind(this);\n    this.onReadyCallback = null;\n    this.onPlayCallback = null;\n    this.startedPlaying = false;\n    this.onProgress = this._onProgress.bind(this);\n\n    if (apiLoaded$1) {\n      this._onApiLoaded();\n    } else {\n      script(api$1, this.onApiLoaded);\n    }\n\n    if (this.coverImage) {\n      // Add the cover image for vimeo videos\n      fetch(thumbnailApi.replace('{id}', this.id)).then(function (response) {\n        return response.json();\n      }).then(function (data) {\n        _this.coverImage.setAttribute('src', data[0].thumbnail_large);\n      });\n    }\n  }\n\n  _createClass(VimeoPlayer, [{\n    key: \"play\",\n    value: function play() {\n      var _this2 = this;\n\n      return new Promise(function (resolve, reject) {\n        _this2.onPlayCallback = resolve;\n        _this2.onPlayError = reject;\n\n        if (_this2.isReady) {\n          _this2.player.play().then(function () {\n            _this2.player.on('progress', _this2.onProgress);\n          })[\"catch\"](function (error) {\n            _this2.player.off('progress', _this2.onProgress);\n\n            _this2.onPlayError();\n          });\n        } else {\n          _this2.onReadyCallback = function () {\n            _this2.player.play().then(function () {\n              _this2.player.on('progress', _this2.onProgress);\n            })[\"catch\"](function (error) {\n              _this2.player.off('progress', _this2.onProgress);\n\n              _this2.onPlayError();\n            });\n          };\n        }\n      });\n    }\n  }, {\n    key: \"pause\",\n    value: function pause() {\n      this.player.pause()[\"catch\"]();\n    }\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      this.player.unload()[\"catch\"]();\n    }\n  }, {\n    key: \"_onApiLoaded\",\n    value: function _onApiLoaded() {\n      var _this3 = this;\n\n      this.player = new window.Vimeo.Player(this.el, {\n        id: this.id,\n        muted: this.startMuted,\n        loop: this.loopVideo\n      });\n      this.player.ready().then(function () {\n        _this3._onReady();\n      })[\"catch\"](function () {\n        _this3.onPlayError();\n      });\n      apiLoaded$1 = true;\n    }\n  }, {\n    key: \"_onReady\",\n    value: function _onReady() {\n      this.isReady = true;\n\n      if (this.onReadyCallback) {\n        this.onReadyCallback();\n      }\n    }\n  }, {\n    key: \"_onProgress\",\n    value: function _onProgress() {\n      this.startedPlaying = true;\n      this.player.off('progress', this.onProgress);\n\n      if (this.onPlayCallback) {\n        this.onPlayCallback();\n        this.onPlayCallback = null;\n      }\n    }\n  }]);\n\n  return VimeoPlayer;\n}();\n\nvar loadPlyrStyles = null;\n\nvar HTML5Video = /*#__PURE__*/function () {\n  function HTML5Video(section, el, options) {\n    var _this = this;\n\n    _classCallCheck(this, HTML5Video);\n\n    this.section = section;\n    this.videoElement = el.querySelector('[data-html5-video]');\n    this.startMuted = options.startMuted;\n    this.loopVideo = options.loopVideo;\n    this.aspectRatio = options.aspectRatio;\n    this.setupVideo = this.setupVideo.bind(this);\n    this.play = this.play.bind(this);\n    this.pause = this.pause.bind(this);\n    this.unload = this.unload.bind(this);\n\n    if (!(loadPlyrStyles instanceof Promise)) {\n      loadPlyrStyles = new Promise(function (resolve) {\n        var stylesheet = document.createElement('link');\n        stylesheet.setAttribute('rel', 'stylesheet');\n        stylesheet.href = 'https://cdn.shopify.com/shopifycloud/shopify-plyr/v1.0/shopify-plyr.css';\n        stylesheet.onload = resolve;\n        document.body.appendChild(stylesheet);\n      });\n    }\n\n    window.Shopify.loadFeatures([{\n      name: 'video-ui',\n      version: '1.0',\n      onLoad: function onLoad() {\n        return loadPlyrStyles.then(function () {\n          return _this.setupVideo();\n        });\n      }\n    }]);\n  }\n\n  _createClass(HTML5Video, [{\n    key: \"setupVideo\",\n    value: function setupVideo() {\n      if (!Shopify.Plyr) {\n        return;\n      }\n\n      this.player = new Shopify.Plyr(this.videoElement, {\n        muted: this.startMuted,\n        loop: {\n          active: this.loopVideo\n        },\n        ratio: this.aspectRatio\n      });\n    }\n  }, {\n    key: \"play\",\n    value: function play() {\n      var _this2 = this;\n\n      return new Promise(function (resolve, reject) {\n        if (_this2.player) {\n          _this2.player.play();\n\n          resolve();\n        }\n      });\n    }\n  }, {\n    key: \"pause\",\n    value: function pause() {\n      this.player.pause();\n    }\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      if (this.player) {\n        this.player.destroy();\n      }\n    }\n  }]);\n\n  return HTML5Video;\n}();\n\nvar Video = /*#__PURE__*/function () {\n  function Video(section) {\n    var _this = this;\n\n    _classCallCheck(this, Video);\n\n    this.el = section.el;\n    this.settings = section.data;\n    this.playButton = this.el.querySelector('[data-video-play-button]');\n    this.videoEl = this.el.querySelector('[data-video]');\n    this.video = null;\n    this.playButtonClicked = false;\n    var autoplay = this.settings.autoplay || false;\n    var startMuted = this.settings.startMuted != null ? this.settings.startMuted : true;\n    var loopVideo = this.settings.loopVideo || false;\n    var aspectRatio = this.settings.aspectRatio;\n    var type = this.videoEl.getAttribute('data-video');\n    var id = this.videoEl.getAttribute('data-video-id');\n\n    switch (type) {\n      case 'youtube':\n        this.video = new Youtube(this.videoEl, id, {\n          startMuted: startMuted,\n          loopVideo: loopVideo\n        });\n        break;\n\n      case 'vimeo':\n        this.video = new VimeoPlayer(this.el, this.videoEl, id, {\n          startMuted: startMuted,\n          loopVideo: loopVideo\n        });\n        break;\n\n      case 'html5':\n        this.video = new HTML5Video(this.el, this.videoEl, {\n          startMuted: startMuted,\n          loopVideo: loopVideo,\n          aspectRatio: aspectRatio\n        });\n        break;\n\n      default:\n        this.video = null;\n        break;\n    }\n\n    this._play = this._play.bind(this);\n\n    if (this.playButton) {\n      this.onPlayButtonClick = function () {\n        _this.playButtonClicked = true;\n\n        _this._play();\n      };\n\n      this.playButton.addEventListener('click', this.onPlayButtonClick);\n    }\n\n    if (!this.viewportIsMobile() && autoplay) {\n      // Set up autoplay for when the video is in the viewport\n      this.observer = new IntersectionObserver(function (entries) {\n        var isIntersecting = entries[0].isIntersecting;\n\n        if (isIntersecting) {\n          _this._play();\n\n          _this.observer.unobserve(_this.videoEl);\n        }\n      });\n      this.observer.observe(this.videoEl);\n    }\n  }\n\n  _createClass(Video, [{\n    key: \"_play\",\n    value: function _play() {\n      var _this2 = this;\n\n      this.el.dataset.videoLoading = true;\n      this.video.play().then(function () {\n        _this2.el.dataset.videoTransitioning = true;\n        setTimeout(function () {\n          _this2.el.dataset.videoLoading = false;\n          _this2.el.dataset.videoTransitioning = false;\n          _this2.el.dataset.videoPlaying = true; // This is for accessibility, the video should receive focus after playing.\n\n          if (_this2.playButtonClicked) {\n            _this2.videoEl.focus();\n          }\n        }, 200);\n      })[\"catch\"](function () {\n        // We should pause the video in case it does start\n        // playing underneath the overlay\n        _this2.video.pause();\n\n        _this2.el.dataset.videoLoading = false;\n        _this2.el.dataset.videoPlaying = false;\n      });\n    } // This method can be overridden by the theme if the breakpoint is different than 720.\n\n  }, {\n    key: \"viewportIsMobile\",\n    value: function viewportIsMobile() {\n      return window.innerWidth < 720;\n    }\n  }, {\n    key: \"onSectionUnload\",\n    value: function onSectionUnload() {\n      if (this.playButton) {\n        this.playButton.removeEventListener('click', this.onPlayClick);\n      }\n\n      if (this.video) {\n        this.video.unload();\n      }\n    }\n  }]);\n\n  return Video;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Video);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcHhzLXZpZGVvL2Rpc3QvaW5kZXguZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL3B4cy12aWRlby9kaXN0L2luZGV4LmVzLmpzP2RjYWUiXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKiFcbiAqIEBwaXhlbHVuaW9uL3B4cy12aWRlbyB2Mi4wLjBcbiAqIChjKSAyMDIzIFBpeGVsIFVuaW9uXG4gKi9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7XG5cdHJldHVybiBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxudmFyIHNjcmlwdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8qIVxuICAqICRzY3JpcHQuanMgSlMgbG9hZGVyICYgZGVwZW5kZW5jeSBtYW5hZ2VyXG4gICogaHR0cHM6Ly9naXRodWIuY29tL2RlZC9zY3JpcHQuanNcbiAgKiAoYykgRHVzdGluIERpYXogMjAxNCB8IExpY2Vuc2UgTUlUXG4gICovXG5cbihmdW5jdGlvbiAobmFtZSwgZGVmaW5pdGlvbikge1xuICBpZiAoIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKTtcbiAgZWxzZSB0aGlzW25hbWVdID0gZGVmaW5pdGlvbigpO1xufSkoJyRzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBkb2MgPSBkb2N1bWVudFxuICAgICwgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gICAgLCBmID0gZmFsc2VcbiAgICAsIHB1c2ggPSAncHVzaCdcbiAgICAsIHJlYWR5U3RhdGUgPSAncmVhZHlTdGF0ZSdcbiAgICAsIG9ucmVhZHlzdGF0ZWNoYW5nZSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICAgLCBsaXN0ID0ge31cbiAgICAsIGRlbGF5ID0ge31cbiAgICAsIHNjcmlwdHMgPSB7fVxuICAgICwgc2NyaXB0cGF0aFxuICAgICwgdXJsQXJncztcblxuICBmdW5jdGlvbiBldmVyeShhciwgZm4pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFyLmxlbmd0aDsgaSA8IGo7ICsraSkgaWYgKCFmbihhcltpXSkpIHJldHVybiBmXG4gICAgcmV0dXJuIDFcbiAgfVxuICBmdW5jdGlvbiBlYWNoKGFyLCBmbikge1xuICAgIGV2ZXJ5KGFyLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGZuKGVsKTtcbiAgICAgIHJldHVybiAxXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiAkc2NyaXB0KHBhdGhzLCBpZE9yRG9uZSwgb3B0RG9uZSkge1xuICAgIHBhdGhzID0gcGF0aHNbcHVzaF0gPyBwYXRocyA6IFtwYXRoc107XG4gICAgdmFyIGlkT3JEb25lSXNEb25lID0gaWRPckRvbmUgJiYgaWRPckRvbmUuY2FsbFxuICAgICAgLCBkb25lID0gaWRPckRvbmVJc0RvbmUgPyBpZE9yRG9uZSA6IG9wdERvbmVcbiAgICAgICwgaWQgPSBpZE9yRG9uZUlzRG9uZSA/IHBhdGhzLmpvaW4oJycpIDogaWRPckRvbmVcbiAgICAgICwgcXVldWUgPSBwYXRocy5sZW5ndGg7XG4gICAgZnVuY3Rpb24gbG9vcEZuKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmNhbGwgPyBpdGVtKCkgOiBsaXN0W2l0ZW1dXG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgaWYgKCEtLXF1ZXVlKSB7XG4gICAgICAgIGxpc3RbaWRdID0gMTtcbiAgICAgICAgZG9uZSAmJiBkb25lKCk7XG4gICAgICAgIGZvciAodmFyIGRzZXQgaW4gZGVsYXkpIHtcbiAgICAgICAgICBldmVyeShkc2V0LnNwbGl0KCd8JyksIGxvb3BGbikgJiYgIWVhY2goZGVsYXlbZHNldF0sIGxvb3BGbikgJiYgKGRlbGF5W2RzZXRdID0gW10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZWFjaChwYXRocywgZnVuY3Rpb24gbG9hZGluZyhwYXRoLCBmb3JjZSkge1xuICAgICAgICBpZiAocGF0aCA9PT0gbnVsbCkgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9yY2UgJiYgIS9eaHR0cHM/OlxcL1xcLy8udGVzdChwYXRoKSAmJiBzY3JpcHRwYXRoKSB7XG4gICAgICAgICAgcGF0aCA9IChwYXRoLmluZGV4T2YoJy5qcycpID09PSAtMSkgPyBzY3JpcHRwYXRoICsgcGF0aCArICcuanMnIDogc2NyaXB0cGF0aCArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChzY3JpcHRzW3BhdGhdKSB7XG4gICAgICAgICAgcmV0dXJuIChzY3JpcHRzW3BhdGhdID09IDIpID8gY2FsbGJhY2soKSA6IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBsb2FkaW5nKHBhdGgsIHRydWUpOyB9LCAwKVxuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0c1twYXRoXSA9IDE7XG4gICAgICAgIGNyZWF0ZShwYXRoLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9LCAwKTtcbiAgICByZXR1cm4gJHNjcmlwdFxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlKHBhdGgsIGZuKSB7XG4gICAgdmFyIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBsb2FkZWQ7XG4gICAgZWwub25sb2FkID0gZWwub25lcnJvciA9IGVsW29ucmVhZHlzdGF0ZWNoYW5nZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoKGVsW3JlYWR5U3RhdGVdICYmICEoL15jfGxvYWRlLy50ZXN0KGVsW3JlYWR5U3RhdGVdKSkpIHx8IGxvYWRlZCkgcmV0dXJuO1xuICAgICAgZWwub25sb2FkID0gZWxbb25yZWFkeXN0YXRlY2hhbmdlXSA9IG51bGw7XG4gICAgICBsb2FkZWQgPSAxO1xuICAgICAgc2NyaXB0c1twYXRoXSA9IDI7XG4gICAgICBmbigpO1xuICAgIH07XG4gICAgZWwuYXN5bmMgPSAxO1xuICAgIGVsLnNyYyA9IHVybEFyZ3MgPyBwYXRoICsgKHBhdGguaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyB1cmxBcmdzIDogcGF0aDtcbiAgICBoZWFkLmluc2VydEJlZm9yZShlbCwgaGVhZC5sYXN0Q2hpbGQpO1xuICB9XG5cbiAgJHNjcmlwdC5nZXQgPSBjcmVhdGU7XG5cbiAgJHNjcmlwdC5vcmRlciA9IGZ1bmN0aW9uIChzY3JpcHRzLCBpZCwgZG9uZSkge1xuICAgIChmdW5jdGlvbiBjYWxsYmFjayhzKSB7XG4gICAgICBzID0gc2NyaXB0cy5zaGlmdCgpO1xuICAgICAgIXNjcmlwdHMubGVuZ3RoID8gJHNjcmlwdChzLCBpZCwgZG9uZSkgOiAkc2NyaXB0KHMsIGNhbGxiYWNrKTtcbiAgICB9KCkpO1xuICB9O1xuXG4gICRzY3JpcHQucGF0aCA9IGZ1bmN0aW9uIChwKSB7XG4gICAgc2NyaXB0cGF0aCA9IHA7XG4gIH07XG4gICRzY3JpcHQudXJsQXJncyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICB1cmxBcmdzID0gc3RyO1xuICB9O1xuICAkc2NyaXB0LnJlYWR5ID0gZnVuY3Rpb24gKGRlcHMsIHJlYWR5LCByZXEpIHtcbiAgICBkZXBzID0gZGVwc1twdXNoXSA/IGRlcHMgOiBbZGVwc107XG4gICAgdmFyIG1pc3NpbmcgPSBbXTtcbiAgICAhZWFjaChkZXBzLCBmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBsaXN0W2RlcF0gfHwgbWlzc2luZ1twdXNoXShkZXApO1xuICAgIH0pICYmIGV2ZXJ5KGRlcHMsIGZ1bmN0aW9uIChkZXApIHtyZXR1cm4gbGlzdFtkZXBdfSkgP1xuICAgICAgcmVhZHkoKSA6ICFmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWxheVtrZXldID0gZGVsYXlba2V5XSB8fCBbXTtcbiAgICAgIGRlbGF5W2tleV1bcHVzaF0ocmVhZHkpO1xuICAgICAgcmVxICYmIHJlcShtaXNzaW5nKTtcbiAgICB9KGRlcHMuam9pbignfCcpKTtcbiAgICByZXR1cm4gJHNjcmlwdFxuICB9O1xuXG4gICRzY3JpcHQuZG9uZSA9IGZ1bmN0aW9uIChpZE9yRG9uZSkge1xuICAgICRzY3JpcHQoW251bGxdLCBpZE9yRG9uZSk7XG4gIH07XG5cbiAgcmV0dXJuICRzY3JpcHRcbn0pO1xufSk7XG5cbnZhciBhcGkgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7XG52YXIgYXBpTG9hZGVkQ2FsbGJhY2tzID0gW107XG52YXIgYXBpTG9hZGVkID0gZmFsc2U7XG5cbndpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgYXBpTG9hZGVkQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGFwaUxvYWRlZENhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGFwaUxvYWRlZENhbGxiYWNrKCk7XG4gIH0pO1xuICBhcGlMb2FkZWRDYWxsYmFja3MgPSBbXTtcbiAgYXBpTG9hZGVkID0gdHJ1ZTtcbn07XG5cbnZhciBZb3V0dWJlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWW91dHViZShlbCwgaWQsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWW91dHViZSk7XG5cbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc3RhcnRNdXRlZCA9IG9wdGlvbnMuc3RhcnRNdXRlZDtcbiAgICB0aGlzLmxvb3BWaWRlbyA9IG9wdGlvbnMubG9vcFZpZGVvO1xuICAgIHRoaXMuaWZyYW1lRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMuaWZyYW1lRWwpO1xuICAgIHRoaXMub25BcGlMb2FkZWQgPSB0aGlzLl9vbkFwaUxvYWRlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMub25SZWFkeSA9IHRoaXMuX29uUmVhZHkuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uUmVhZHlDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlID0gdGhpcy5fb25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25QbGF5Q2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMub25QbGF5RXJyb3IgPSBudWxsO1xuXG4gICAgaWYgKGFwaUxvYWRlZCkge1xuICAgICAgdGhpcy5fb25BcGlMb2FkZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpTG9hZGVkQ2FsbGJhY2tzLnB1c2godGhpcy5vbkFwaUxvYWRlZCk7XG4gICAgICBzY3JpcHQoYXBpKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoWW91dHViZSwgW3tcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgX3RoaXMub25QbGF5Q2FsbGJhY2sgPSByZXNvbHZlO1xuICAgICAgICBfdGhpcy5vblBsYXlFcnJvciA9IHJlamVjdDtcblxuICAgICAgICBpZiAoX3RoaXMuaXNSZWFkeSkge1xuICAgICAgICAgIF90aGlzLnBsYXllci5wbGF5VmlkZW8oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5vblJlYWR5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5wbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5wbGF5ZXIucGF1c2VWaWRlbygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgdGhpcy5wbGF5ZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25BcGlMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uQXBpTG9hZGVkKCkge1xuICAgICAgdmFyIHBsYXllclZhcnMgPSB7XG4gICAgICAgIG1vZGVzdGJyYW5kaW5nOiB0cnVlLFxuICAgICAgICBzaG93aW5mbzogZmFsc2UsXG4gICAgICAgIGNvbnRyb2xzOiBmYWxzZSxcbiAgICAgICAgbG9vcDogdGhpcy5sb29wVmlkZW8sXG4gICAgICAgIG11dGU6IHRoaXMuc3RhcnRNdXRlZCxcbiAgICAgICAgcmVsOiAwXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5sb29wVmlkZW8pIHtcbiAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCB0byBhbGxvdyAnbG9vcCcgdG8gd29yayBiYXNlZCBvbiB0aGUgWW91VHViZSBhcGlcbiAgICAgICAgcGxheWVyVmFycy5wbGF5bGlzdCA9IHRoaXMuaWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheWVyID0gbmV3IFlULlBsYXllcih0aGlzLmlmcmFtZUVsLCB7XG4gICAgICAgIHZpZGVvSWQ6IHRoaXMuaWQsXG4gICAgICAgIHBsYXllclZhcnM6IHBsYXllclZhcnMsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIG9uUmVhZHk6IHRoaXMub25SZWFkeSxcbiAgICAgICAgICBvblN0YXRlQ2hhbmdlOiB0aGlzLm9uU3RhdGVDaGFuZ2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblJlYWR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblJlYWR5KCkge1xuICAgICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMub25SZWFkeUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblN0YXRlQ2hhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblN0YXRlQ2hhbmdlKGV2ZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBldmVudC5kYXRhO1xuXG4gICAgICBpZiAodGhpcy5vblBsYXlDYWxsYmFjaykge1xuICAgICAgICBpZiAoc3RhdGUgPT09IFlULlBsYXllclN0YXRlLlBMQVlJTkcpIHtcbiAgICAgICAgICB0aGlzLm9uUGxheUNhbGxiYWNrKCk7XG4gICAgICAgICAgdGhpcy5vblBsYXlDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblBsYXlFcnJvciA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gWVQuUGxheWVyU3RhdGUuQlVGRkVSSU5HICYmIChzdGF0ZSA9PT0gWVQuUGxheWVyU3RhdGUuVU5TVEFSVEVEIHx8IHN0YXRlID09PSBZVC5QbGF5ZXJTdGF0ZS5QQVVTRUQpKSB7XG4gICAgICAgICAgdGhpcy5vblBsYXlFcnJvcigpO1xuICAgICAgICAgIHRoaXMub25QbGF5Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25QbGF5RXJyb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gWW91dHViZTtcbn0oKTtcblxudmFyIGFwaSQxID0gJ2h0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS9hcGkvcGxheWVyLmpzJztcbnZhciB0aHVtYm5haWxBcGkgPSAnaHR0cDovL3ZpbWVvLmNvbS9hcGkvdjIvdmlkZW8ve2lkfS5qc29uJztcbnZhciBhcGlMb2FkZWQkMSA9IGZhbHNlO1xuXG52YXIgVmltZW9QbGF5ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBWaW1lb1BsYXllcihzZWN0aW9uLCBlbCwgaWQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpbWVvUGxheWVyKTtcblxuICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnN0YXJ0TXV0ZWQgPSBvcHRpb25zLnN0YXJ0TXV0ZWQ7XG4gICAgdGhpcy5sb29wVmlkZW8gPSBvcHRpb25zLmxvb3BWaWRlbztcbiAgICB0aGlzLmNvdmVySW1hZ2UgPSB0aGlzLnNlY3Rpb24ucXVlcnlTZWxlY3RvcignW2RhdGEtdmltZW8taW1hZ2VdJyk7XG4gICAgdGhpcy5vbkFwaUxvYWRlZCA9IHRoaXMuX29uQXBpTG9hZGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5vblJlYWR5ID0gdGhpcy5fb25SZWFkeS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLm9uUGxheUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLnN0YXJ0ZWRQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5vblByb2dyZXNzID0gdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKGFwaUxvYWRlZCQxKSB7XG4gICAgICB0aGlzLl9vbkFwaUxvYWRlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHQoYXBpJDEsIHRoaXMub25BcGlMb2FkZWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvdmVySW1hZ2UpIHtcbiAgICAgIC8vIEFkZCB0aGUgY292ZXIgaW1hZ2UgZm9yIHZpbWVvIHZpZGVvc1xuICAgICAgZmV0Y2godGh1bWJuYWlsQXBpLnJlcGxhY2UoJ3tpZH0nLCB0aGlzLmlkKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgX3RoaXMuY292ZXJJbWFnZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGRhdGFbMF0udGh1bWJuYWlsX2xhcmdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaW1lb1BsYXllciwgW3tcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIF90aGlzMi5vblBsYXlDYWxsYmFjayA9IHJlc29sdmU7XG4gICAgICAgIF90aGlzMi5vblBsYXlFcnJvciA9IHJlamVjdDtcblxuICAgICAgICBpZiAoX3RoaXMyLmlzUmVhZHkpIHtcbiAgICAgICAgICBfdGhpczIucGxheWVyLnBsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3Byb2dyZXNzJywgX3RoaXMyLm9uUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBfdGhpczIucGxheWVyLm9mZigncHJvZ3Jlc3MnLCBfdGhpczIub25Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgIF90aGlzMi5vblBsYXlFcnJvcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMi5vblJlYWR5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczIucGxheWVyLnBsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLnBsYXllci5vbigncHJvZ3Jlc3MnLCBfdGhpczIub25Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICBfdGhpczIucGxheWVyLm9mZigncHJvZ3Jlc3MnLCBfdGhpczIub25Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgICAgX3RoaXMyLm9uUGxheUVycm9yKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLnBsYXllci5wYXVzZSgpW1wiY2F0Y2hcIl0oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5sb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIHRoaXMucGxheWVyLnVubG9hZCgpW1wiY2F0Y2hcIl0oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uQXBpTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkFwaUxvYWRlZCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB0aGlzLnBsYXllciA9IG5ldyB3aW5kb3cuVmltZW8uUGxheWVyKHRoaXMuZWwsIHtcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIG11dGVkOiB0aGlzLnN0YXJ0TXV0ZWQsXG4gICAgICAgIGxvb3A6IHRoaXMubG9vcFZpZGVvXG4gICAgICB9KTtcbiAgICAgIHRoaXMucGxheWVyLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5fb25SZWFkeSgpO1xuICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5vblBsYXlFcnJvcigpO1xuICAgICAgfSk7XG4gICAgICBhcGlMb2FkZWQkMSA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblJlYWR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblJlYWR5KCkge1xuICAgICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcblxuICAgICAgaWYgKHRoaXMub25SZWFkeUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblByb2dyZXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblByb2dyZXNzKCkge1xuICAgICAgdGhpcy5zdGFydGVkUGxheWluZyA9IHRydWU7XG4gICAgICB0aGlzLnBsYXllci5vZmYoJ3Byb2dyZXNzJywgdGhpcy5vblByb2dyZXNzKTtcblxuICAgICAgaWYgKHRoaXMub25QbGF5Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vblBsYXlDYWxsYmFjaygpO1xuICAgICAgICB0aGlzLm9uUGxheUNhbGxiYWNrID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmltZW9QbGF5ZXI7XG59KCk7XG5cbnZhciBsb2FkUGx5clN0eWxlcyA9IG51bGw7XG5cbnZhciBIVE1MNVZpZGVvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSFRNTDVWaWRlbyhzZWN0aW9uLCBlbCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSFRNTDVWaWRlbyk7XG5cbiAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uO1xuICAgIHRoaXMudmlkZW9FbGVtZW50ID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtaHRtbDUtdmlkZW9dJyk7XG4gICAgdGhpcy5zdGFydE11dGVkID0gb3B0aW9ucy5zdGFydE11dGVkO1xuICAgIHRoaXMubG9vcFZpZGVvID0gb3B0aW9ucy5sb29wVmlkZW87XG4gICAgdGhpcy5hc3BlY3RSYXRpbyA9IG9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgdGhpcy5zZXR1cFZpZGVvID0gdGhpcy5zZXR1cFZpZGVvLmJpbmQodGhpcyk7XG4gICAgdGhpcy5wbGF5ID0gdGhpcy5wbGF5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5wYXVzZSA9IHRoaXMucGF1c2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVubG9hZCA9IHRoaXMudW5sb2FkLmJpbmQodGhpcyk7XG5cbiAgICBpZiAoIShsb2FkUGx5clN0eWxlcyBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICBsb2FkUGx5clN0eWxlcyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHZhciBzdHlsZXNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBzdHlsZXNoZWV0LnNldEF0dHJpYnV0ZSgncmVsJywgJ3N0eWxlc2hlZXQnKTtcbiAgICAgICAgc3R5bGVzaGVldC5ocmVmID0gJ2h0dHBzOi8vY2RuLnNob3BpZnkuY29tL3Nob3BpZnljbG91ZC9zaG9waWZ5LXBseXIvdjEuMC9zaG9waWZ5LXBseXIuY3NzJztcbiAgICAgICAgc3R5bGVzaGVldC5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN0eWxlc2hlZXQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgd2luZG93LlNob3BpZnkubG9hZEZlYXR1cmVzKFt7XG4gICAgICBuYW1lOiAndmlkZW8tdWknLFxuICAgICAgdmVyc2lvbjogJzEuMCcsXG4gICAgICBvbkxvYWQ6IGZ1bmN0aW9uIG9uTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQbHlyU3R5bGVzLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zZXR1cFZpZGVvKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1dKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhIVE1MNVZpZGVvLCBbe1xuICAgIGtleTogXCJzZXR1cFZpZGVvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldHVwVmlkZW8oKSB7XG4gICAgICBpZiAoIVNob3BpZnkuUGx5cikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheWVyID0gbmV3IFNob3BpZnkuUGx5cih0aGlzLnZpZGVvRWxlbWVudCwge1xuICAgICAgICBtdXRlZDogdGhpcy5zdGFydE11dGVkLFxuICAgICAgICBsb29wOiB7XG4gICAgICAgICAgYWN0aXZlOiB0aGlzLmxvb3BWaWRlb1xuICAgICAgICB9LFxuICAgICAgICByYXRpbzogdGhpcy5hc3BlY3RSYXRpb1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAoX3RoaXMyLnBsYXllcikge1xuICAgICAgICAgIF90aGlzMi5wbGF5ZXIucGxheSgpO1xuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLnBsYXllci5wYXVzZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgaWYgKHRoaXMucGxheWVyKSB7XG4gICAgICAgIHRoaXMucGxheWVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSFRNTDVWaWRlbztcbn0oKTtcblxudmFyIFZpZGVvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVmlkZW8oc2VjdGlvbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmlkZW8pO1xuXG4gICAgdGhpcy5lbCA9IHNlY3Rpb24uZWw7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNlY3Rpb24uZGF0YTtcbiAgICB0aGlzLnBsYXlCdXR0b24gPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXZpZGVvLXBsYXktYnV0dG9uXScpO1xuICAgIHRoaXMudmlkZW9FbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdmlkZW9dJyk7XG4gICAgdGhpcy52aWRlbyA9IG51bGw7XG4gICAgdGhpcy5wbGF5QnV0dG9uQ2xpY2tlZCA9IGZhbHNlO1xuICAgIHZhciBhdXRvcGxheSA9IHRoaXMuc2V0dGluZ3MuYXV0b3BsYXkgfHwgZmFsc2U7XG4gICAgdmFyIHN0YXJ0TXV0ZWQgPSB0aGlzLnNldHRpbmdzLnN0YXJ0TXV0ZWQgIT0gbnVsbCA/IHRoaXMuc2V0dGluZ3Muc3RhcnRNdXRlZCA6IHRydWU7XG4gICAgdmFyIGxvb3BWaWRlbyA9IHRoaXMuc2V0dGluZ3MubG9vcFZpZGVvIHx8IGZhbHNlO1xuICAgIHZhciBhc3BlY3RSYXRpbyA9IHRoaXMuc2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgdmFyIHR5cGUgPSB0aGlzLnZpZGVvRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZGVvJyk7XG4gICAgdmFyIGlkID0gdGhpcy52aWRlb0VsLmdldEF0dHJpYnV0ZSgnZGF0YS12aWRlby1pZCcpO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgdGhpcy52aWRlbyA9IG5ldyBZb3V0dWJlKHRoaXMudmlkZW9FbCwgaWQsIHtcbiAgICAgICAgICBzdGFydE11dGVkOiBzdGFydE11dGVkLFxuICAgICAgICAgIGxvb3BWaWRlbzogbG9vcFZpZGVvXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndmltZW8nOlxuICAgICAgICB0aGlzLnZpZGVvID0gbmV3IFZpbWVvUGxheWVyKHRoaXMuZWwsIHRoaXMudmlkZW9FbCwgaWQsIHtcbiAgICAgICAgICBzdGFydE11dGVkOiBzdGFydE11dGVkLFxuICAgICAgICAgIGxvb3BWaWRlbzogbG9vcFZpZGVvXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnaHRtbDUnOlxuICAgICAgICB0aGlzLnZpZGVvID0gbmV3IEhUTUw1VmlkZW8odGhpcy5lbCwgdGhpcy52aWRlb0VsLCB7XG4gICAgICAgICAgc3RhcnRNdXRlZDogc3RhcnRNdXRlZCxcbiAgICAgICAgICBsb29wVmlkZW86IGxvb3BWaWRlbyxcbiAgICAgICAgICBhc3BlY3RSYXRpbzogYXNwZWN0UmF0aW9cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnZpZGVvID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fcGxheSA9IHRoaXMuX3BsYXkuYmluZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLnBsYXlCdXR0b24pIHtcbiAgICAgIHRoaXMub25QbGF5QnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnBsYXlCdXR0b25DbGlja2VkID0gdHJ1ZTtcblxuICAgICAgICBfdGhpcy5fcGxheSgpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5wbGF5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vblBsYXlCdXR0b25DbGljayk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZpZXdwb3J0SXNNb2JpbGUoKSAmJiBhdXRvcGxheSkge1xuICAgICAgLy8gU2V0IHVwIGF1dG9wbGF5IGZvciB3aGVuIHRoZSB2aWRlbyBpcyBpbiB0aGUgdmlld3BvcnRcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgICAgdmFyIGlzSW50ZXJzZWN0aW5nID0gZW50cmllc1swXS5pc0ludGVyc2VjdGluZztcblxuICAgICAgICBpZiAoaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICBfdGhpcy5fcGxheSgpO1xuXG4gICAgICAgICAgX3RoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKF90aGlzLnZpZGVvRWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnZpZGVvRWwpO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaWRlbywgW3tcbiAgICBrZXk6IFwiX3BsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3BsYXkoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5lbC5kYXRhc2V0LnZpZGVvTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnZpZGVvLnBsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9UcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9UcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9QbGF5aW5nID0gdHJ1ZTsgLy8gVGhpcyBpcyBmb3IgYWNjZXNzaWJpbGl0eSwgdGhlIHZpZGVvIHNob3VsZCByZWNlaXZlIGZvY3VzIGFmdGVyIHBsYXlpbmcuXG5cbiAgICAgICAgICBpZiAoX3RoaXMyLnBsYXlCdXR0b25DbGlja2VkKSB7XG4gICAgICAgICAgICBfdGhpczIudmlkZW9FbC5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBXZSBzaG91bGQgcGF1c2UgdGhlIHZpZGVvIGluIGNhc2UgaXQgZG9lcyBzdGFydFxuICAgICAgICAvLyBwbGF5aW5nIHVuZGVybmVhdGggdGhlIG92ZXJsYXlcbiAgICAgICAgX3RoaXMyLnZpZGVvLnBhdXNlKCk7XG5cbiAgICAgICAgX3RoaXMyLmVsLmRhdGFzZXQudmlkZW9Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIF90aGlzMi5lbC5kYXRhc2V0LnZpZGVvUGxheWluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgdGhlbWUgaWYgdGhlIGJyZWFrcG9pbnQgaXMgZGlmZmVyZW50IHRoYW4gNzIwLlxuXG4gIH0sIHtcbiAgICBrZXk6IFwidmlld3BvcnRJc01vYmlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2aWV3cG9ydElzTW9iaWxlKCkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoIDwgNzIwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25VbmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25TZWN0aW9uVW5sb2FkKCkge1xuICAgICAgaWYgKHRoaXMucGxheUJ1dHRvbikge1xuICAgICAgICB0aGlzLnBsYXlCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uUGxheUNsaWNrKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgdGhpcy52aWRlby51bmxvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmlkZW87XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFZpZGVvO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/pxs-video/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/rimg-shopify/dist/index.es.js":
/*!****************************************************************!*\
  !*** ./node_modules/@pixelunion/rimg-shopify/dist/index.es.js ***!
  \****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/*!\n * @pixelunion/rimg-shopify v2.7.1\n * (c) 2023 Pixel Union\n */\n/*!\n * @pixelunion/rimg v2.2.2\n * (c) 2022 Pixel Union\n */\n\n/**\n * The default template render function. Turns a template string into an image\n * URL.\n *\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\nfunction defaultTemplateRender(template, size) {\n  return template.replace('{size}', \"\".concat(size.width, \"x\").concat(size.height));\n}\n/**\n * @type Settings\n */\n\n\nvar defaults = {\n  scale: 1,\n  template: false,\n  templateRender: defaultTemplateRender,\n  max: {\n    width: Infinity,\n    height: Infinity\n  },\n  round: 32,\n  placeholder: false,\n  crop: null\n};\n/**\n * Get a data attribute value from an element, with a default fallback and\n * sanitization step.\n *\n * @param {Element} el\n *\n * @param {String} name\n *        The data attribute name.\n *\n * @param {Object} options\n *        An object holding fallback values if the data attribute does not\n *        exist. If this object doesn't have the property, we further fallback\n *        to our defaults.\n *\n * @param {Function} [sanitize]\n *        A function to sanitize the data attribute value with.\n *\n * @returns {String|*}\n */\n\nfunction getData(el, name, options, sanitize) {\n  var attr = \"data-rimg-\".concat(name);\n  if (!el.hasAttribute(attr)) return options[name] || defaults[name];\n  var value = el.getAttribute(attr);\n  return sanitize ? sanitize(value) : value;\n}\n/**\n * Sanitize data attributes that represent a size (in the form of `10x10`).\n *\n * @param {String} value\n * @returns {Object} An object with `width` and `height` properties.\n */\n\n\nfunction parseSize(value) {\n  value = value.split('x');\n  return {\n    width: parseInt(value[0], 10),\n    height: parseInt(value[1], 10)\n  };\n}\n/**\n * Sanitize crop values to ensure they are valid, or null\n *\n * @param {String} value\n * @returns {Object} Shopify crop parameter ('top', 'center', 'bottom', 'left', 'right') or null, if an unsupported value is found\n */\n\n\nfunction processCropValue(value) {\n  switch (value) {\n    case 'top':\n    case 'center':\n    case 'bottom':\n    case 'left':\n    case 'right':\n      return value;\n\n    default:\n      return null;\n  }\n}\n/**\n * Loads information about an element.\n *\n * Options can be set on the element itself using data attributes, or through\n * the `options` parameter. Data attributes take priority.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n * @returns {Item}\n */\n\n\nfunction parseItem(el) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var isImage = el.hasAttribute('data-rimg-template');\n  /**\n   * @typedef {Settings} Item\n   */\n\n  return {\n    el: el,\n    // Type of element\n    isImage: isImage,\n    isBackgroundImage: isImage && el.tagName !== 'IMG',\n    // Image scale\n    scale: parseInt(getData(el, 'scale', options)),\n    // Device density\n    density: window.devicePixelRatio || 1,\n    // Image template URL\n    template: getData(el, 'template', options),\n    templateRender: options.templateRender || defaults.templateRender,\n    // Maximum image dimensions\n    max: getData(el, 'max', options, parseSize),\n    // Round image dimensions to the nearest multiple\n    round: getData(el, 'round', options),\n    // Placeholder image dimensions\n    placeholder: getData(el, 'placeholder', options, parseSize),\n    // Crop value; null if image is uncropped, otherwise equal to the Shopify crop parameter ('center', 'top', etc.)\n    crop: getData(el, 'crop', options, processCropValue)\n  };\n}\n/**\n * Round to the nearest multiple.\n *\n * This is so we don't tax the image server too much.\n *\n * @param {Number} size The size, in pixels.\n * @param {Number} [multiple] The multiple to round to the nearest.\n * @param {Number} [maxLimit] Maximum allowed value - value to return if rounded multiple is above this limit\n * @returns {Number}\n */\n\n\nfunction roundSize(size) {\n  var multiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 32;\n  var maxLimit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;\n  return size === 0 ? multiple : Math.min(Math.ceil(size / multiple) * multiple, maxLimit);\n}\n/**\n * Get the size of an element.\n *\n * If it is too small, it's parent element is checked, and so on. This helps\n * avoid the situation where an element doesn't have a size yet or is positioned\n * out of the layout.\n *\n * @param {HTMLElement} el\n * @return {Object} size\n * @return {Number} size.width The width, in pixels.\n * @return {Number} size.height The height, in pixels.\n */\n\n\nfunction getElementSize(el) {\n  var size = {\n    width: 0,\n    height: 0\n  };\n\n  while (el) {\n    size.width = el.offsetWidth;\n    size.height = el.offsetHeight;\n    if (size.width > 20 && size.height > 20) break;\n    el = el.parentNode;\n  }\n\n  return size;\n}\n/**\n * Return the maximum supported density of the image, given the container.\n *\n * @param {Item} item\n * @param {Size} size\n */\n\n\nfunction supportedDensity(item, size) {\n  return Math.min(Math.min(Math.max(item.max.width / size.width, 1), item.density), Math.min(Math.max(item.max.height / size.height, 1), item.density)).toFixed(2);\n}\n/**\n * Trigger a custom event.\n *\n * Note: this approach is deprecated, but still required to support older\n * browsers such as IE 10.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events\n *\n * @param {HTMLElement} el\n *        The element to trigger the event on.\n *\n * @param {String} name\n *        The event name.\n *\n * @returns {Boolean}\n *          True if the event was canceled.\n */\n\n\nfunction trigger(el, name) {\n  var event = document.createEvent('Event');\n  event.initEvent(name, true, true);\n  return !el.dispatchEvent(event);\n}\n/**\n * Set the image URL on the element. Supports background images and `srcset`.\n *\n * @param {Item} item\n * @param {Size} size\n * @param {Boolean} isPlaceholder\n */\n\n\nfunction setImage(item, size, isPlaceholder, onLoad) {\n  var render = item.templateRender;\n  var density = isPlaceholder ? 1 : supportedDensity(item, size);\n  var round = isPlaceholder ? 1 : item.round; // Calculate the final display size, taking into account the image's\n  // maximum dimensions.\n\n  var targetWidth = size.width * density;\n  var targetHeight = size.height * density;\n  var displaySize;\n\n  if (item.crop) {\n    displaySize = {\n      width: roundSize(targetWidth, round, item.max.width),\n      height: roundSize(targetHeight, round, item.max.height)\n    };\n  } else {\n    // Shopify serves images clamped by the requested dimensions (fitted to the smallest dimension).\n    // To get the desired and expected pixel density we need to request cover dimensions (fitted to largest dimension).\n    // This isn't a problem with cropped images which are served at the exact dimension requested.\n    var containerAspectRatio = size.width / size.height;\n    var imageAspectRatio = item.max.width / item.max.height;\n\n    if (containerAspectRatio > imageAspectRatio) {\n      // fit width\n      displaySize = {\n        width: roundSize(targetWidth, round, item.max.width),\n        height: roundSize(targetWidth / imageAspectRatio, round, item.max.height)\n      };\n    } else {\n      // fit height\n      displaySize = {\n        width: roundSize(targetHeight * imageAspectRatio, round, item.max.width),\n        height: roundSize(targetHeight, round, item.max.height)\n      };\n    }\n  }\n\n  var url = render(item.template, displaySize); // On load callback\n\n  var image = new Image();\n  image.onload = onLoad;\n  image.src = url; // Set image\n\n  if (item.isBackgroundImage) {\n    item.el.style.backgroundImage = \"url('\".concat(url, \"')\");\n  } else {\n    item.el.setAttribute('srcset', \"\".concat(url, \" \").concat(density, \"x\"));\n  }\n}\n/**\n * Load the image, set loaded status, and trigger the load event.\n *\n * @fires rimg:load\n * @fires rimg:error\n * @param {Item} item\n * @param {Size} size\n */\n\n\nfunction loadFullImage(item, size) {\n  var el = item.el;\n  setImage(item, size, false, function (event) {\n    if (event.type === 'load') {\n      el.setAttribute('data-rimg', 'loaded');\n    } else {\n      el.setAttribute('data-rimg', 'error');\n      trigger(el, 'rimg:error');\n    }\n\n    trigger(el, 'rimg:load');\n  });\n}\n/**\n * Load in a responsive image.\n *\n * Sets the image's `srcset` attribute to the final image URLs, calculated based\n * on the actual size the image is being shown at.\n *\n * @fires rimg:loading\n *        The image URLs have been set and we are waiting for them to load.\n *\n * @fires rimg:loaded\n *        The final image has loaded.\n *\n * @fires rimg:error\n *        The final image failed loading.\n *\n * @param {Item} item\n */\n\n\nfunction loadImage(item) {\n  var el = item.el; // Already loaded?\n\n  var status = el.getAttribute('data-rimg');\n  if (status === 'loading' || status === 'loaded') return; // Is the SVG loaded?\n  // In Firefox, el.complete always returns true [citation needed, may not be the case anymore, Jan/2022]\n  // so we also check el.naturalWidth, which equals 0 until the image loads\n\n  if (!item.isBackgroundImage) {\n    if (el.naturalWidth === 0 || !el.complete) {\n      // Wait for the load event, then call load image\n      el.addEventListener('load', function cb() {\n        el.removeEventListener('load', cb);\n        loadImage(item);\n      });\n      return;\n    }\n  } // Trigger loading event, and stop if cancelled\n\n\n  if (trigger(el, 'rimg:loading')) return; // Mark as loading\n\n  el.setAttribute('data-rimg', 'loading'); // Get element size. This is used as the ideal display size.\n\n  var size = getElementSize(item.el);\n  size.width *= item.scale;\n  size.height *= item.scale;\n\n  if (item.placeholder) {\n    // Load a placeholder image first, followed by the full image. Force the\n    // element to keep its dimensions while it loads. If the image is smaller\n    // than the element size, use the image's size. Density is taken into account\n    // for HiDPI devices to avoid blurry images.\n    if (!item.isBackgroundImage) {\n      el.setAttribute('width', Math.min(Math.floor(item.max.width / item.density), size.width));\n      el.setAttribute('height', Math.min(Math.floor(item.max.height / item.density), size.height));\n    }\n\n    setImage(item, item.placeholder, true, function () {\n      return loadFullImage(item, size);\n    });\n  } else {\n    loadFullImage(item, size);\n  }\n}\n/**\n * Prepare an element to be displayed on the screen.\n *\n * Images have special logic applied to them to swap out the different sources.\n *\n * @fires rimg:enter\n *        The element is entering the viewport.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\n\n\nfunction load(el, options) {\n  if (!el) return;\n  trigger(el, 'rimg:enter');\n  var item = parseItem(el, options);\n\n  if (item.isImage) {\n    if (!item.isBackgroundImage) {\n      el.setAttribute('data-rimg-template-svg', el.getAttribute('srcset'));\n    }\n\n    loadImage(item);\n  }\n}\n/**\n * Reset an element's state so that its image can be recalculated.\n *\n * @fires rimg:update\n *        The element is being updated.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\n\n\nfunction update(el, options) {\n  if (!el) return;\n  trigger(el, 'rimg:update');\n  var item = parseItem(el, options);\n\n  if (item.isImage) {\n    if (!item.isBackgroundImage) {\n      el.setAttribute('data-rimg', 'lazy');\n      el.setAttribute('srcset', el.getAttribute('data-rimg-template-svg'));\n    }\n\n    loadImage(item);\n  }\n}\n/**\n * Returns true if the element is within the viewport.\n * @param {HTMLElement} el\n * @returns {Boolean}\n */\n\n\nfunction inViewport(el) {\n  if (!el.offsetWidth || !el.offsetHeight || !el.getClientRects().length) {\n    return false;\n  }\n\n  var root = document.documentElement;\n  var width = Math.min(root.clientWidth, window.innerWidth);\n  var height = Math.min(root.clientHeight, window.innerHeight);\n  var rect = el.getBoundingClientRect();\n  return rect.bottom >= 0 && rect.right >= 0 && rect.top <= height && rect.left <= width;\n}\n/**\n * @typedef {Object} Size\n * @property {Number} width\n * @property {Number} height\n */\n\n/**\n * A function to turn a template string into a URL.\n *\n * @callback TemplateRenderer\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\n\n/**\n * @typedef {Object} Settings\n *\n * @property {String} [template]\n *           A template string used to generate URLs for an image. This allows us to\n *           dynamically load images with sizes to match the container's size.\n *\n * @property {TemplateRenderer} [templateRender]\n *           A function to turn a template string into a URL.\n *\n * @property {Size} [max]\n *           The maximum available size for the image. This ensures we don't\n *           try to load an image larger than is possible.\n * \n * @property {Number} [scale]\n *           A number to scale the final image dimensions by. \n *           Only applies to lazy-loaded images. Defaults to 1.\n *\n * @property {Number} [round]\n *           Round image dimensions to the nearest multiple. This is intended to\n *           tax the image server less by lowering the number of possible image\n *           sizes requested.\n *\n * @property {Size} [placeholder]\n *           The size of the lo-fi image to load before the full image.\n * \n * @property {String} [crop]\n *           Crop value; null if image is uncropped, otherwise equal \n *           to the Shopify crop parameter ('center', 'top', etc.).\n */\n\n/**\n * Initialize the responsive image handler.\n *\n * @param {String|HTMLElement|NodeList} selector\n *        The CSS selector, element, or elements to track for lazy-loading.\n *\n * @param {Settings} options\n *\n * @returns {PublicApi}\n */\n\n\nfunction rimg() {\n  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // Intersections\n\n  var io = new IntersectionObserver(function (entries) {\n    entries.forEach(function (entry) {\n      if (entry.isIntersecting || entry.intersectionRatio > 0) {\n        io.unobserve(entry.target);\n        load(entry.target, options);\n      }\n    });\n  }, {\n    // Watch the viewport, with 20% vertical margins\n    rootMargin: '20% 0px'\n  });\n  /**\n   * @typedef {Object} PublicApi\n   */\n\n  var api = {\n    /**\n     * Track a new selector, element, or nodelist for lazy-loading.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    track: function track() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n      var els = querySelector(selector);\n\n      for (var i = 0; i < els.length; i++) {\n        // If an element is already in the viewport, load it right away. This\n        // fixes a race-condition with dynamically added elements.\n        if (inViewport(els[i])) {\n          load(els[i], options);\n        } else {\n          io.observe(els[i]);\n        }\n      }\n    },\n\n    /**\n     * Update element(s) that have already been loaded to force their images\n     * to be recalculated.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    update: function update$1() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"loaded\"]';\n      var els = querySelector(selector);\n\n      for (var i = 0; i < els.length; i++) {\n        update(els[i], options);\n      }\n    },\n\n    /**\n     * Stop tracking element(s) for lazy-loading.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    untrack: function untrack() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n      var els = querySelector(selector);\n\n      for (var i = 0; i < els.length; i++) {\n        io.unobserve(els[i]);\n      }\n    },\n\n    /**\n     * Manually load images.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    load: function load$1() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n      var els = querySelector(selector);\n\n      for (var i = 0; i < els.length; i++) {\n        load(els[i], options);\n      }\n    },\n\n    /**\n     * Unload all event handlers and observers.\n     * @type Function\n     */\n    unload: function unload() {\n      io.disconnect();\n    }\n  }; // Add initial elements\n\n  api.track(selector);\n  return api;\n}\n/**\n * Finds a group of elements on the page.\n *\n * @param {String|HTMLElement|NodeList} selector\n * @returns {Object} An array-like object.\n */\n\n\nfunction querySelector(selector) {\n  if (typeof selector === 'string') {\n    return document.querySelectorAll(selector);\n  }\n\n  if (selector instanceof HTMLElement) {\n    return [selector];\n  }\n\n  if (selector instanceof NodeList) {\n    return selector;\n  }\n\n  return [];\n}\n\n/**\n * Polyfill for Element.matches().\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\n */\nif (!Element.prototype.matches) {\n  Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {\n    var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n        i = matches.length;\n\n    while (--i >= 0 && matches.item(i) !== this) {}\n\n    return i > -1;\n  };\n}\n\nvar state = {\n  init: init,\n  watch: watch,\n  unwatch: unwatch,\n  load: load$1\n};\n\nfunction init() {\n  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  state.selector = selector;\n  state.instance = rimg(selector, options);\n  state.loadedWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); // Listen for Shopify theme editor events\n\n  document.addEventListener('shopify:section:load', function (event) {\n    return watch(event.target);\n  });\n  window.addEventListener('resize', function () {\n    return _update();\n  });\n  document.addEventListener('shopify:section:unload', function (event) {\n    return unwatch(event.target);\n  }); // Listen for custom events to allow themes to hook into rimg\n\n  document.addEventListener('theme:rimg:watch', function (event) {\n    return watch(event.target);\n  });\n  document.addEventListener('theme:rimg:unwatch', function (event) {\n    return unwatch(event.target);\n  }); // Support custom events triggered through jQuery\n  // See: https://github.com/jquery/jquery/issues/3347\n\n  if (window.jQuery) {\n    jQuery(document).on({\n      'theme:rimg:watch': function themeRimgWatch(event) {\n        return watch(event.target);\n      },\n      'theme:rimg:unwatch': function themeRimgUnwatch(event) {\n        return unwatch(event.target);\n      }\n    });\n  }\n}\n/**\n * Track an element, and its children.\n *\n * @param {HTMLElement} el\n */\n\n\nfunction watch(el) {\n  // Track element\n  if (typeof el.matches === 'function' && el.matches(state.selector)) {\n    state.instance.track(el);\n  } // Track element's children\n\n\n  state.instance.track(el.querySelectorAll(state.selector));\n}\n/**\n * Untrack an element, and its children\n *\n * @param {HTMLElement} el\n * @private\n */\n\n\nfunction unwatch(el) {\n  // Untrack element's children\n  state.instance.untrack(el.querySelectorAll(state.selector)); // Untrack element\n\n  if (typeof el.matches === 'function' && el.matches(state.selector)) {\n    state.instance.untrack(el);\n  }\n}\n/**\n * Manually load an image\n *\n * @param {HTMLElement} el\n */\n\n\nfunction load$1(el) {\n  // Load element\n  if (typeof el.matches === 'function' && el.matches(state.selector)) {\n    state.instance.load(el);\n  } // Load element's children\n\n\n  state.instance.load(el.querySelectorAll(state.selector));\n}\n/**\n * Update an element, and its children.\n *\n * @param {HTMLElement} el\n */\n\n\nfunction _update() {\n  var currentWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); // Return if we're not 2x smaller, or larger than the existing loading size\n\n  if (currentWidth / state.loadedWidth > 0.5 && currentWidth / state.loadedWidth < 2) {\n    return;\n  }\n\n  state.loadedWidth = currentWidth;\n  state.instance.update();\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (state);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5L2Rpc3QvaW5kZXguZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL3JpbWctc2hvcGlmeS9kaXN0L2luZGV4LmVzLmpzP2Q5MmEiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnkgdjIuNy4xXG4gKiAoYykgMjAyMyBQaXhlbCBVbmlvblxuICovXG4vKiFcbiAqIEBwaXhlbHVuaW9uL3JpbWcgdjIuMi4yXG4gKiAoYykgMjAyMiBQaXhlbCBVbmlvblxuICovXG5cbi8qKlxuICogVGhlIGRlZmF1bHQgdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9uLiBUdXJucyBhIHRlbXBsYXRlIHN0cmluZyBpbnRvIGFuIGltYWdlXG4gKiBVUkwuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge1NpemV9IHNpemVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRUZW1wbGF0ZVJlbmRlcih0ZW1wbGF0ZSwgc2l6ZSkge1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgne3NpemV9JywgXCJcIi5jb25jYXQoc2l6ZS53aWR0aCwgXCJ4XCIpLmNvbmNhdChzaXplLmhlaWdodCkpO1xufVxuLyoqXG4gKiBAdHlwZSBTZXR0aW5nc1xuICovXG5cblxudmFyIGRlZmF1bHRzID0ge1xuICBzY2FsZTogMSxcbiAgdGVtcGxhdGU6IGZhbHNlLFxuICB0ZW1wbGF0ZVJlbmRlcjogZGVmYXVsdFRlbXBsYXRlUmVuZGVyLFxuICBtYXg6IHtcbiAgICB3aWR0aDogSW5maW5pdHksXG4gICAgaGVpZ2h0OiBJbmZpbml0eVxuICB9LFxuICByb3VuZDogMzIsXG4gIHBsYWNlaG9sZGVyOiBmYWxzZSxcbiAgY3JvcDogbnVsbFxufTtcbi8qKlxuICogR2V0IGEgZGF0YSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhbiBlbGVtZW50LCB3aXRoIGEgZGVmYXVsdCBmYWxsYmFjayBhbmRcbiAqIHNhbml0aXphdGlvbiBzdGVwLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogICAgICAgIFRoZSBkYXRhIGF0dHJpYnV0ZSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgICAgICAgQW4gb2JqZWN0IGhvbGRpbmcgZmFsbGJhY2sgdmFsdWVzIGlmIHRoZSBkYXRhIGF0dHJpYnV0ZSBkb2VzIG5vdFxuICogICAgICAgIGV4aXN0LiBJZiB0aGlzIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIHByb3BlcnR5LCB3ZSBmdXJ0aGVyIGZhbGxiYWNrXG4gKiAgICAgICAgdG8gb3VyIGRlZmF1bHRzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtzYW5pdGl6ZV1cbiAqICAgICAgICBBIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSBkYXRhIGF0dHJpYnV0ZSB2YWx1ZSB3aXRoLlxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd8Kn1cbiAqL1xuXG5mdW5jdGlvbiBnZXREYXRhKGVsLCBuYW1lLCBvcHRpb25zLCBzYW5pdGl6ZSkge1xuICB2YXIgYXR0ciA9IFwiZGF0YS1yaW1nLVwiLmNvbmNhdChuYW1lKTtcbiAgaWYgKCFlbC5oYXNBdHRyaWJ1dGUoYXR0cikpIHJldHVybiBvcHRpb25zW25hbWVdIHx8IGRlZmF1bHRzW25hbWVdO1xuICB2YXIgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gIHJldHVybiBzYW5pdGl6ZSA/IHNhbml0aXplKHZhbHVlKSA6IHZhbHVlO1xufVxuLyoqXG4gKiBTYW5pdGl6ZSBkYXRhIGF0dHJpYnV0ZXMgdGhhdCByZXByZXNlbnQgYSBzaXplIChpbiB0aGUgZm9ybSBvZiBgMTB4MTBgKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBwYXJzZVNpemUodmFsdWUpIHtcbiAgdmFsdWUgPSB2YWx1ZS5zcGxpdCgneCcpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBwYXJzZUludCh2YWx1ZVswXSwgMTApLFxuICAgIGhlaWdodDogcGFyc2VJbnQodmFsdWVbMV0sIDEwKVxuICB9O1xufVxuLyoqXG4gKiBTYW5pdGl6ZSBjcm9wIHZhbHVlcyB0byBlbnN1cmUgdGhleSBhcmUgdmFsaWQsIG9yIG51bGxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtPYmplY3R9IFNob3BpZnkgY3JvcCBwYXJhbWV0ZXIgKCd0b3AnLCAnY2VudGVyJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0Jykgb3IgbnVsbCwgaWYgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgaXMgZm91bmRcbiAqL1xuXG5cbmZ1bmN0aW9uIHByb2Nlc3NDcm9wVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh2YWx1ZSkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgY2FzZSAnY2VudGVyJzpcbiAgICBjYXNlICdib3R0b20nOlxuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBMb2FkcyBpbmZvcm1hdGlvbiBhYm91dCBhbiBlbGVtZW50LlxuICpcbiAqIE9wdGlvbnMgY2FuIGJlIHNldCBvbiB0aGUgZWxlbWVudCBpdHNlbGYgdXNpbmcgZGF0YSBhdHRyaWJ1dGVzLCBvciB0aHJvdWdoXG4gKiB0aGUgYG9wdGlvbnNgIHBhcmFtZXRlci4gRGF0YSBhdHRyaWJ1dGVzIHRha2UgcHJpb3JpdHkuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtJdGVtfVxuICovXG5cblxuZnVuY3Rpb24gcGFyc2VJdGVtKGVsKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIGlzSW1hZ2UgPSBlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmltZy10ZW1wbGF0ZScpO1xuICAvKipcbiAgICogQHR5cGVkZWYge1NldHRpbmdzfSBJdGVtXG4gICAqL1xuXG4gIHJldHVybiB7XG4gICAgZWw6IGVsLFxuICAgIC8vIFR5cGUgb2YgZWxlbWVudFxuICAgIGlzSW1hZ2U6IGlzSW1hZ2UsXG4gICAgaXNCYWNrZ3JvdW5kSW1hZ2U6IGlzSW1hZ2UgJiYgZWwudGFnTmFtZSAhPT0gJ0lNRycsXG4gICAgLy8gSW1hZ2Ugc2NhbGVcbiAgICBzY2FsZTogcGFyc2VJbnQoZ2V0RGF0YShlbCwgJ3NjYWxlJywgb3B0aW9ucykpLFxuICAgIC8vIERldmljZSBkZW5zaXR5XG4gICAgZGVuc2l0eTogd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSxcbiAgICAvLyBJbWFnZSB0ZW1wbGF0ZSBVUkxcbiAgICB0ZW1wbGF0ZTogZ2V0RGF0YShlbCwgJ3RlbXBsYXRlJywgb3B0aW9ucyksXG4gICAgdGVtcGxhdGVSZW5kZXI6IG9wdGlvbnMudGVtcGxhdGVSZW5kZXIgfHwgZGVmYXVsdHMudGVtcGxhdGVSZW5kZXIsXG4gICAgLy8gTWF4aW11bSBpbWFnZSBkaW1lbnNpb25zXG4gICAgbWF4OiBnZXREYXRhKGVsLCAnbWF4Jywgb3B0aW9ucywgcGFyc2VTaXplKSxcbiAgICAvLyBSb3VuZCBpbWFnZSBkaW1lbnNpb25zIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlXG4gICAgcm91bmQ6IGdldERhdGEoZWwsICdyb3VuZCcsIG9wdGlvbnMpLFxuICAgIC8vIFBsYWNlaG9sZGVyIGltYWdlIGRpbWVuc2lvbnNcbiAgICBwbGFjZWhvbGRlcjogZ2V0RGF0YShlbCwgJ3BsYWNlaG9sZGVyJywgb3B0aW9ucywgcGFyc2VTaXplKSxcbiAgICAvLyBDcm9wIHZhbHVlOyBudWxsIGlmIGltYWdlIGlzIHVuY3JvcHBlZCwgb3RoZXJ3aXNlIGVxdWFsIHRvIHRoZSBTaG9waWZ5IGNyb3AgcGFyYW1ldGVyICgnY2VudGVyJywgJ3RvcCcsIGV0Yy4pXG4gICAgY3JvcDogZ2V0RGF0YShlbCwgJ2Nyb3AnLCBvcHRpb25zLCBwcm9jZXNzQ3JvcFZhbHVlKVxuICB9O1xufVxuLyoqXG4gKiBSb3VuZCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZS5cbiAqXG4gKiBUaGlzIGlzIHNvIHdlIGRvbid0IHRheCB0aGUgaW1hZ2Ugc2VydmVyIHRvbyBtdWNoLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzaXplIFRoZSBzaXplLCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge051bWJlcn0gW211bHRpcGxlXSBUaGUgbXVsdGlwbGUgdG8gcm91bmQgdG8gdGhlIG5lYXJlc3QuXG4gKiBAcGFyYW0ge051bWJlcn0gW21heExpbWl0XSBNYXhpbXVtIGFsbG93ZWQgdmFsdWUgLSB2YWx1ZSB0byByZXR1cm4gaWYgcm91bmRlZCBtdWx0aXBsZSBpcyBhYm92ZSB0aGlzIGxpbWl0XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5cblxuZnVuY3Rpb24gcm91bmRTaXplKHNpemUpIHtcbiAgdmFyIG11bHRpcGxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAzMjtcbiAgdmFyIG1heExpbWl0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBJbmZpbml0eTtcbiAgcmV0dXJuIHNpemUgPT09IDAgPyBtdWx0aXBsZSA6IE1hdGgubWluKE1hdGguY2VpbChzaXplIC8gbXVsdGlwbGUpICogbXVsdGlwbGUsIG1heExpbWl0KTtcbn1cbi8qKlxuICogR2V0IHRoZSBzaXplIG9mIGFuIGVsZW1lbnQuXG4gKlxuICogSWYgaXQgaXMgdG9vIHNtYWxsLCBpdCdzIHBhcmVudCBlbGVtZW50IGlzIGNoZWNrZWQsIGFuZCBzbyBvbi4gVGhpcyBoZWxwc1xuICogYXZvaWQgdGhlIHNpdHVhdGlvbiB3aGVyZSBhbiBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhIHNpemUgeWV0IG9yIGlzIHBvc2l0aW9uZWRcbiAqIG91dCBvZiB0aGUgbGF5b3V0LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtPYmplY3R9IHNpemVcbiAqIEByZXR1cm4ge051bWJlcn0gc2l6ZS53aWR0aCBUaGUgd2lkdGgsIGluIHBpeGVscy5cbiAqIEByZXR1cm4ge051bWJlcn0gc2l6ZS5oZWlnaHQgVGhlIGhlaWdodCwgaW4gcGl4ZWxzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudFNpemUoZWwpIHtcbiAgdmFyIHNpemUgPSB7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG5cbiAgd2hpbGUgKGVsKSB7XG4gICAgc2l6ZS53aWR0aCA9IGVsLm9mZnNldFdpZHRoO1xuICAgIHNpemUuaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0O1xuICAgIGlmIChzaXplLndpZHRoID4gMjAgJiYgc2l6ZS5oZWlnaHQgPiAyMCkgYnJlYWs7XG4gICAgZWwgPSBlbC5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIHNpemU7XG59XG4vKipcbiAqIFJldHVybiB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgZGVuc2l0eSBvZiB0aGUgaW1hZ2UsIGdpdmVuIHRoZSBjb250YWluZXIuXG4gKlxuICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gKiBAcGFyYW0ge1NpemV9IHNpemVcbiAqL1xuXG5cbmZ1bmN0aW9uIHN1cHBvcnRlZERlbnNpdHkoaXRlbSwgc2l6ZSkge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5taW4oTWF0aC5tYXgoaXRlbS5tYXgud2lkdGggLyBzaXplLndpZHRoLCAxKSwgaXRlbS5kZW5zaXR5KSwgTWF0aC5taW4oTWF0aC5tYXgoaXRlbS5tYXguaGVpZ2h0IC8gc2l6ZS5oZWlnaHQsIDEpLCBpdGVtLmRlbnNpdHkpKS50b0ZpeGVkKDIpO1xufVxuLyoqXG4gKiBUcmlnZ2VyIGEgY3VzdG9tIGV2ZW50LlxuICpcbiAqIE5vdGU6IHRoaXMgYXBwcm9hY2ggaXMgZGVwcmVjYXRlZCwgYnV0IHN0aWxsIHJlcXVpcmVkIHRvIHN1cHBvcnQgb2xkZXJcbiAqIGJyb3dzZXJzIHN1Y2ggYXMgSUUgMTAuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9HdWlkZS9FdmVudHMvQ3JlYXRpbmdfYW5kX3RyaWdnZXJpbmdfZXZlbnRzXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogICAgICAgIFRoZSBldmVudCBuYW1lLlxuICpcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogICAgICAgICAgVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGNhbmNlbGVkLlxuICovXG5cblxuZnVuY3Rpb24gdHJpZ2dlcihlbCwgbmFtZSkge1xuICB2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIHRydWUsIHRydWUpO1xuICByZXR1cm4gIWVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuLyoqXG4gKiBTZXQgdGhlIGltYWdlIFVSTCBvbiB0aGUgZWxlbWVudC4gU3VwcG9ydHMgYmFja2dyb3VuZCBpbWFnZXMgYW5kIGBzcmNzZXRgLlxuICpcbiAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzUGxhY2Vob2xkZXJcbiAqL1xuXG5cbmZ1bmN0aW9uIHNldEltYWdlKGl0ZW0sIHNpemUsIGlzUGxhY2Vob2xkZXIsIG9uTG9hZCkge1xuICB2YXIgcmVuZGVyID0gaXRlbS50ZW1wbGF0ZVJlbmRlcjtcbiAgdmFyIGRlbnNpdHkgPSBpc1BsYWNlaG9sZGVyID8gMSA6IHN1cHBvcnRlZERlbnNpdHkoaXRlbSwgc2l6ZSk7XG4gIHZhciByb3VuZCA9IGlzUGxhY2Vob2xkZXIgPyAxIDogaXRlbS5yb3VuZDsgLy8gQ2FsY3VsYXRlIHRoZSBmaW5hbCBkaXNwbGF5IHNpemUsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGltYWdlJ3NcbiAgLy8gbWF4aW11bSBkaW1lbnNpb25zLlxuXG4gIHZhciB0YXJnZXRXaWR0aCA9IHNpemUud2lkdGggKiBkZW5zaXR5O1xuICB2YXIgdGFyZ2V0SGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKiBkZW5zaXR5O1xuICB2YXIgZGlzcGxheVNpemU7XG5cbiAgaWYgKGl0ZW0uY3JvcCkge1xuICAgIGRpc3BsYXlTaXplID0ge1xuICAgICAgd2lkdGg6IHJvdW5kU2l6ZSh0YXJnZXRXaWR0aCwgcm91bmQsIGl0ZW0ubWF4LndpZHRoKSxcbiAgICAgIGhlaWdodDogcm91bmRTaXplKHRhcmdldEhlaWdodCwgcm91bmQsIGl0ZW0ubWF4LmhlaWdodClcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFNob3BpZnkgc2VydmVzIGltYWdlcyBjbGFtcGVkIGJ5IHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucyAoZml0dGVkIHRvIHRoZSBzbWFsbGVzdCBkaW1lbnNpb24pLlxuICAgIC8vIFRvIGdldCB0aGUgZGVzaXJlZCBhbmQgZXhwZWN0ZWQgcGl4ZWwgZGVuc2l0eSB3ZSBuZWVkIHRvIHJlcXVlc3QgY292ZXIgZGltZW5zaW9ucyAoZml0dGVkIHRvIGxhcmdlc3QgZGltZW5zaW9uKS5cbiAgICAvLyBUaGlzIGlzbid0IGEgcHJvYmxlbSB3aXRoIGNyb3BwZWQgaW1hZ2VzIHdoaWNoIGFyZSBzZXJ2ZWQgYXQgdGhlIGV4YWN0IGRpbWVuc2lvbiByZXF1ZXN0ZWQuXG4gICAgdmFyIGNvbnRhaW5lckFzcGVjdFJhdGlvID0gc2l6ZS53aWR0aCAvIHNpemUuaGVpZ2h0O1xuICAgIHZhciBpbWFnZUFzcGVjdFJhdGlvID0gaXRlbS5tYXgud2lkdGggLyBpdGVtLm1heC5oZWlnaHQ7XG5cbiAgICBpZiAoY29udGFpbmVyQXNwZWN0UmF0aW8gPiBpbWFnZUFzcGVjdFJhdGlvKSB7XG4gICAgICAvLyBmaXQgd2lkdGhcbiAgICAgIGRpc3BsYXlTaXplID0ge1xuICAgICAgICB3aWR0aDogcm91bmRTaXplKHRhcmdldFdpZHRoLCByb3VuZCwgaXRlbS5tYXgud2lkdGgpLFxuICAgICAgICBoZWlnaHQ6IHJvdW5kU2l6ZSh0YXJnZXRXaWR0aCAvIGltYWdlQXNwZWN0UmF0aW8sIHJvdW5kLCBpdGVtLm1heC5oZWlnaHQpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmaXQgaGVpZ2h0XG4gICAgICBkaXNwbGF5U2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IHJvdW5kU2l6ZSh0YXJnZXRIZWlnaHQgKiBpbWFnZUFzcGVjdFJhdGlvLCByb3VuZCwgaXRlbS5tYXgud2lkdGgpLFxuICAgICAgICBoZWlnaHQ6IHJvdW5kU2l6ZSh0YXJnZXRIZWlnaHQsIHJvdW5kLCBpdGVtLm1heC5oZWlnaHQpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cmwgPSByZW5kZXIoaXRlbS50ZW1wbGF0ZSwgZGlzcGxheVNpemUpOyAvLyBPbiBsb2FkIGNhbGxiYWNrXG5cbiAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gIGltYWdlLm9ubG9hZCA9IG9uTG9hZDtcbiAgaW1hZ2Uuc3JjID0gdXJsOyAvLyBTZXQgaW1hZ2VcblxuICBpZiAoaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgIGl0ZW0uZWwuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gXCJ1cmwoJ1wiLmNvbmNhdCh1cmwsIFwiJylcIik7XG4gIH0gZWxzZSB7XG4gICAgaXRlbS5lbC5zZXRBdHRyaWJ1dGUoJ3NyY3NldCcsIFwiXCIuY29uY2F0KHVybCwgXCIgXCIpLmNvbmNhdChkZW5zaXR5LCBcInhcIikpO1xuICB9XG59XG4vKipcbiAqIExvYWQgdGhlIGltYWdlLCBzZXQgbG9hZGVkIHN0YXR1cywgYW5kIHRyaWdnZXIgdGhlIGxvYWQgZXZlbnQuXG4gKlxuICogQGZpcmVzIHJpbWc6bG9hZFxuICogQGZpcmVzIHJpbWc6ZXJyb3JcbiAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKi9cblxuXG5mdW5jdGlvbiBsb2FkRnVsbEltYWdlKGl0ZW0sIHNpemUpIHtcbiAgdmFyIGVsID0gaXRlbS5lbDtcbiAgc2V0SW1hZ2UoaXRlbSwgc2l6ZSwgZmFsc2UsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC50eXBlID09PSAnbG9hZCcpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xvYWRlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZycsICdlcnJvcicpO1xuICAgICAgdHJpZ2dlcihlbCwgJ3JpbWc6ZXJyb3InKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyKGVsLCAncmltZzpsb2FkJyk7XG4gIH0pO1xufVxuLyoqXG4gKiBMb2FkIGluIGEgcmVzcG9uc2l2ZSBpbWFnZS5cbiAqXG4gKiBTZXRzIHRoZSBpbWFnZSdzIGBzcmNzZXRgIGF0dHJpYnV0ZSB0byB0aGUgZmluYWwgaW1hZ2UgVVJMcywgY2FsY3VsYXRlZCBiYXNlZFxuICogb24gdGhlIGFjdHVhbCBzaXplIHRoZSBpbWFnZSBpcyBiZWluZyBzaG93biBhdC5cbiAqXG4gKiBAZmlyZXMgcmltZzpsb2FkaW5nXG4gKiAgICAgICAgVGhlIGltYWdlIFVSTHMgaGF2ZSBiZWVuIHNldCBhbmQgd2UgYXJlIHdhaXRpbmcgZm9yIHRoZW0gdG8gbG9hZC5cbiAqXG4gKiBAZmlyZXMgcmltZzpsb2FkZWRcbiAqICAgICAgICBUaGUgZmluYWwgaW1hZ2UgaGFzIGxvYWRlZC5cbiAqXG4gKiBAZmlyZXMgcmltZzplcnJvclxuICogICAgICAgIFRoZSBmaW5hbCBpbWFnZSBmYWlsZWQgbG9hZGluZy5cbiAqXG4gKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAqL1xuXG5cbmZ1bmN0aW9uIGxvYWRJbWFnZShpdGVtKSB7XG4gIHZhciBlbCA9IGl0ZW0uZWw7IC8vIEFscmVhZHkgbG9hZGVkP1xuXG4gIHZhciBzdGF0dXMgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZycpO1xuICBpZiAoc3RhdHVzID09PSAnbG9hZGluZycgfHwgc3RhdHVzID09PSAnbG9hZGVkJykgcmV0dXJuOyAvLyBJcyB0aGUgU1ZHIGxvYWRlZD9cbiAgLy8gSW4gRmlyZWZveCwgZWwuY29tcGxldGUgYWx3YXlzIHJldHVybnMgdHJ1ZSBbY2l0YXRpb24gbmVlZGVkLCBtYXkgbm90IGJlIHRoZSBjYXNlIGFueW1vcmUsIEphbi8yMDIyXVxuICAvLyBzbyB3ZSBhbHNvIGNoZWNrIGVsLm5hdHVyYWxXaWR0aCwgd2hpY2ggZXF1YWxzIDAgdW50aWwgdGhlIGltYWdlIGxvYWRzXG5cbiAgaWYgKCFpdGVtLmlzQmFja2dyb3VuZEltYWdlKSB7XG4gICAgaWYgKGVsLm5hdHVyYWxXaWR0aCA9PT0gMCB8fCAhZWwuY29tcGxldGUpIHtcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBsb2FkIGV2ZW50LCB0aGVuIGNhbGwgbG9hZCBpbWFnZVxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uIGNiKCkge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgY2IpO1xuICAgICAgICBsb2FkSW1hZ2UoaXRlbSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gLy8gVHJpZ2dlciBsb2FkaW5nIGV2ZW50LCBhbmQgc3RvcCBpZiBjYW5jZWxsZWRcblxuXG4gIGlmICh0cmlnZ2VyKGVsLCAncmltZzpsb2FkaW5nJykpIHJldHVybjsgLy8gTWFyayBhcyBsb2FkaW5nXG5cbiAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnLCAnbG9hZGluZycpOyAvLyBHZXQgZWxlbWVudCBzaXplLiBUaGlzIGlzIHVzZWQgYXMgdGhlIGlkZWFsIGRpc3BsYXkgc2l6ZS5cblxuICB2YXIgc2l6ZSA9IGdldEVsZW1lbnRTaXplKGl0ZW0uZWwpO1xuICBzaXplLndpZHRoICo9IGl0ZW0uc2NhbGU7XG4gIHNpemUuaGVpZ2h0ICo9IGl0ZW0uc2NhbGU7XG5cbiAgaWYgKGl0ZW0ucGxhY2Vob2xkZXIpIHtcbiAgICAvLyBMb2FkIGEgcGxhY2Vob2xkZXIgaW1hZ2UgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBmdWxsIGltYWdlLiBGb3JjZSB0aGVcbiAgICAvLyBlbGVtZW50IHRvIGtlZXAgaXRzIGRpbWVuc2lvbnMgd2hpbGUgaXQgbG9hZHMuIElmIHRoZSBpbWFnZSBpcyBzbWFsbGVyXG4gICAgLy8gdGhhbiB0aGUgZWxlbWVudCBzaXplLCB1c2UgdGhlIGltYWdlJ3Mgc2l6ZS4gRGVuc2l0eSBpcyB0YWtlbiBpbnRvIGFjY291bnRcbiAgICAvLyBmb3IgSGlEUEkgZGV2aWNlcyB0byBhdm9pZCBibHVycnkgaW1hZ2VzLlxuICAgIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd3aWR0aCcsIE1hdGgubWluKE1hdGguZmxvb3IoaXRlbS5tYXgud2lkdGggLyBpdGVtLmRlbnNpdHkpLCBzaXplLndpZHRoKSk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIE1hdGgubWluKE1hdGguZmxvb3IoaXRlbS5tYXguaGVpZ2h0IC8gaXRlbS5kZW5zaXR5KSwgc2l6ZS5oZWlnaHQpKTtcbiAgICB9XG5cbiAgICBzZXRJbWFnZShpdGVtLCBpdGVtLnBsYWNlaG9sZGVyLCB0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbG9hZEZ1bGxJbWFnZShpdGVtLCBzaXplKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsb2FkRnVsbEltYWdlKGl0ZW0sIHNpemUpO1xuICB9XG59XG4vKipcbiAqIFByZXBhcmUgYW4gZWxlbWVudCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi5cbiAqXG4gKiBJbWFnZXMgaGF2ZSBzcGVjaWFsIGxvZ2ljIGFwcGxpZWQgdG8gdGhlbSB0byBzd2FwIG91dCB0aGUgZGlmZmVyZW50IHNvdXJjZXMuXG4gKlxuICogQGZpcmVzIHJpbWc6ZW50ZXJcbiAqICAgICAgICBUaGUgZWxlbWVudCBpcyBlbnRlcmluZyB0aGUgdmlld3BvcnQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqL1xuXG5cbmZ1bmN0aW9uIGxvYWQoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICB0cmlnZ2VyKGVsLCAncmltZzplbnRlcicpO1xuICB2YXIgaXRlbSA9IHBhcnNlSXRlbShlbCwgb3B0aW9ucyk7XG5cbiAgaWYgKGl0ZW0uaXNJbWFnZSkge1xuICAgIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXJpbWctdGVtcGxhdGUtc3ZnJywgZWwuZ2V0QXR0cmlidXRlKCdzcmNzZXQnKSk7XG4gICAgfVxuXG4gICAgbG9hZEltYWdlKGl0ZW0pO1xuICB9XG59XG4vKipcbiAqIFJlc2V0IGFuIGVsZW1lbnQncyBzdGF0ZSBzbyB0aGF0IGl0cyBpbWFnZSBjYW4gYmUgcmVjYWxjdWxhdGVkLlxuICpcbiAqIEBmaXJlcyByaW1nOnVwZGF0ZVxuICogICAgICAgIFRoZSBlbGVtZW50IGlzIGJlaW5nIHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqL1xuXG5cbmZ1bmN0aW9uIHVwZGF0ZShlbCwgb3B0aW9ucykge1xuICBpZiAoIWVsKSByZXR1cm47XG4gIHRyaWdnZXIoZWwsICdyaW1nOnVwZGF0ZScpO1xuICB2YXIgaXRlbSA9IHBhcnNlSXRlbShlbCwgb3B0aW9ucyk7XG5cbiAgaWYgKGl0ZW0uaXNJbWFnZSkge1xuICAgIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnLCAnbGF6eScpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdzcmNzZXQnLCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZy10ZW1wbGF0ZS1zdmcnKSk7XG4gICAgfVxuXG4gICAgbG9hZEltYWdlKGl0ZW0pO1xuICB9XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5cblxuZnVuY3Rpb24gaW5WaWV3cG9ydChlbCkge1xuICBpZiAoIWVsLm9mZnNldFdpZHRoIHx8ICFlbC5vZmZzZXRIZWlnaHQgfHwgIWVsLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIHZhciB3aWR0aCA9IE1hdGgubWluKHJvb3QuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoKTtcbiAgdmFyIGhlaWdodCA9IE1hdGgubWluKHJvb3QuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4gcmVjdC5ib3R0b20gPj0gMCAmJiByZWN0LnJpZ2h0ID49IDAgJiYgcmVjdC50b3AgPD0gaGVpZ2h0ICYmIHJlY3QubGVmdCA8PSB3aWR0aDtcbn1cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2l6ZVxuICogQHByb3BlcnR5IHtOdW1iZXJ9IHdpZHRoXG4gKiBAcHJvcGVydHkge051bWJlcn0gaGVpZ2h0XG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRvIHR1cm4gYSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBhIFVSTC5cbiAqXG4gKiBAY2FsbGJhY2sgVGVtcGxhdGVSZW5kZXJlclxuICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge1NpemV9IHNpemVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZXR0aW5nc1xuICpcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdGVtcGxhdGVdXG4gKiAgICAgICAgICAgQSB0ZW1wbGF0ZSBzdHJpbmcgdXNlZCB0byBnZW5lcmF0ZSBVUkxzIGZvciBhbiBpbWFnZS4gVGhpcyBhbGxvd3MgdXMgdG9cbiAqICAgICAgICAgICBkeW5hbWljYWxseSBsb2FkIGltYWdlcyB3aXRoIHNpemVzIHRvIG1hdGNoIHRoZSBjb250YWluZXIncyBzaXplLlxuICpcbiAqIEBwcm9wZXJ0eSB7VGVtcGxhdGVSZW5kZXJlcn0gW3RlbXBsYXRlUmVuZGVyXVxuICogICAgICAgICAgIEEgZnVuY3Rpb24gdG8gdHVybiBhIHRlbXBsYXRlIHN0cmluZyBpbnRvIGEgVVJMLlxuICpcbiAqIEBwcm9wZXJ0eSB7U2l6ZX0gW21heF1cbiAqICAgICAgICAgICBUaGUgbWF4aW11bSBhdmFpbGFibGUgc2l6ZSBmb3IgdGhlIGltYWdlLiBUaGlzIGVuc3VyZXMgd2UgZG9uJ3RcbiAqICAgICAgICAgICB0cnkgdG8gbG9hZCBhbiBpbWFnZSBsYXJnZXIgdGhhbiBpcyBwb3NzaWJsZS5cbiAqIFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzY2FsZV1cbiAqICAgICAgICAgICBBIG51bWJlciB0byBzY2FsZSB0aGUgZmluYWwgaW1hZ2UgZGltZW5zaW9ucyBieS4gXG4gKiAgICAgICAgICAgT25seSBhcHBsaWVzIHRvIGxhenktbG9hZGVkIGltYWdlcy4gRGVmYXVsdHMgdG8gMS5cbiAqXG4gKiBAcHJvcGVydHkge051bWJlcn0gW3JvdW5kXVxuICogICAgICAgICAgIFJvdW5kIGltYWdlIGRpbWVuc2lvbnMgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUuIFRoaXMgaXMgaW50ZW5kZWQgdG9cbiAqICAgICAgICAgICB0YXggdGhlIGltYWdlIHNlcnZlciBsZXNzIGJ5IGxvd2VyaW5nIHRoZSBudW1iZXIgb2YgcG9zc2libGUgaW1hZ2VcbiAqICAgICAgICAgICBzaXplcyByZXF1ZXN0ZWQuXG4gKlxuICogQHByb3BlcnR5IHtTaXplfSBbcGxhY2Vob2xkZXJdXG4gKiAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGxvLWZpIGltYWdlIHRvIGxvYWQgYmVmb3JlIHRoZSBmdWxsIGltYWdlLlxuICogXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW2Nyb3BdXG4gKiAgICAgICAgICAgQ3JvcCB2YWx1ZTsgbnVsbCBpZiBpbWFnZSBpcyB1bmNyb3BwZWQsIG90aGVyd2lzZSBlcXVhbCBcbiAqICAgICAgICAgICB0byB0aGUgU2hvcGlmeSBjcm9wIHBhcmFtZXRlciAoJ2NlbnRlcicsICd0b3AnLCBldGMuKS5cbiAqL1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIHJlc3BvbnNpdmUgaW1hZ2UgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAqICAgICAgICBUaGUgQ1NTIHNlbGVjdG9yLCBlbGVtZW50LCBvciBlbGVtZW50cyB0byB0cmFjayBmb3IgbGF6eS1sb2FkaW5nLlxuICpcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7UHVibGljQXBpfVxuICovXG5cblxuZnVuY3Rpb24gcmltZygpIHtcbiAgdmFyIHNlbGVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2RhdGEtcmltZz1cImxhenlcIl0nO1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307IC8vIEludGVyc2VjdGlvbnNcblxuICB2YXIgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcgfHwgZW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gPiAwKSB7XG4gICAgICAgIGlvLnVub2JzZXJ2ZShlbnRyeS50YXJnZXQpO1xuICAgICAgICBsb2FkKGVudHJ5LnRhcmdldCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIHtcbiAgICAvLyBXYXRjaCB0aGUgdmlld3BvcnQsIHdpdGggMjAlIHZlcnRpY2FsIG1hcmdpbnNcbiAgICByb290TWFyZ2luOiAnMjAlIDBweCdcbiAgfSk7XG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBQdWJsaWNBcGlcbiAgICovXG5cbiAgdmFyIGFwaSA9IHtcbiAgICAvKipcbiAgICAgKiBUcmFjayBhIG5ldyBzZWxlY3RvciwgZWxlbWVudCwgb3Igbm9kZWxpc3QgZm9yIGxhenktbG9hZGluZy5cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fSBzZWxlY3RvclxuICAgICAqL1xuICAgIHRyYWNrOiBmdW5jdGlvbiB0cmFjaygpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsYXp5XCJdJztcbiAgICAgIHZhciBlbHMgPSBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCBpcyBhbHJlYWR5IGluIHRoZSB2aWV3cG9ydCwgbG9hZCBpdCByaWdodCBhd2F5LiBUaGlzXG4gICAgICAgIC8vIGZpeGVzIGEgcmFjZS1jb25kaXRpb24gd2l0aCBkeW5hbWljYWxseSBhZGRlZCBlbGVtZW50cy5cbiAgICAgICAgaWYgKGluVmlld3BvcnQoZWxzW2ldKSkge1xuICAgICAgICAgIGxvYWQoZWxzW2ldLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpby5vYnNlcnZlKGVsc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGVsZW1lbnQocykgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgdG8gZm9yY2UgdGhlaXIgaW1hZ2VzXG4gICAgICogdG8gYmUgcmVjYWxjdWxhdGVkLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUkMSgpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsb2FkZWRcIl0nO1xuICAgICAgdmFyIGVscyA9IHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cGRhdGUoZWxzW2ldLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0cmFja2luZyBlbGVtZW50KHMpIGZvciBsYXp5LWxvYWRpbmcuXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAgICAgKi9cbiAgICB1bnRyYWNrOiBmdW5jdGlvbiB1bnRyYWNrKCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2RhdGEtcmltZ10nO1xuICAgICAgdmFyIGVscyA9IHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpby51bm9ic2VydmUoZWxzW2ldKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgbG9hZCBpbWFnZXMuXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbiBsb2FkJDEoKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nXSc7XG4gICAgICB2YXIgZWxzID0gcXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxvYWQoZWxzW2ldLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5sb2FkIGFsbCBldmVudCBoYW5kbGVycyBhbmQgb2JzZXJ2ZXJzLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICovXG4gICAgdW5sb2FkOiBmdW5jdGlvbiB1bmxvYWQoKSB7XG4gICAgICBpby5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9OyAvLyBBZGQgaW5pdGlhbCBlbGVtZW50c1xuXG4gIGFwaS50cmFjayhzZWxlY3Rvcik7XG4gIHJldHVybiBhcGk7XG59XG4vKipcbiAqIEZpbmRzIGEgZ3JvdXAgb2YgZWxlbWVudHMgb24gdGhlIHBhZ2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBhcnJheS1saWtlIG9iamVjdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH1cblxuICBpZiAoc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBbc2VsZWN0b3JdO1xuICB9XG5cbiAgaWYgKHNlbGVjdG9yIGluc3RhbmNlb2YgTm9kZUxpc3QpIHtcbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cblxuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogUG9seWZpbGwgZm9yIEVsZW1lbnQubWF0Y2hlcygpLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlc1xuICovXG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcbiAgRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA9IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZnVuY3Rpb24gKHMpIHtcbiAgICB2YXIgbWF0Y2hlcyA9ICh0aGlzLmRvY3VtZW50IHx8IHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzKSxcbiAgICAgICAgaSA9IG1hdGNoZXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKC0taSA+PSAwICYmIG1hdGNoZXMuaXRlbShpKSAhPT0gdGhpcykge31cblxuICAgIHJldHVybiBpID4gLTE7XG4gIH07XG59XG5cbnZhciBzdGF0ZSA9IHtcbiAgaW5pdDogaW5pdCxcbiAgd2F0Y2g6IHdhdGNoLFxuICB1bndhdGNoOiB1bndhdGNoLFxuICBsb2FkOiBsb2FkJDFcbn07XG5cbmZ1bmN0aW9uIGluaXQoKSB7XG4gIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsYXp5XCJdJztcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBzdGF0ZS5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICBzdGF0ZS5pbnN0YW5jZSA9IHJpbWcoc2VsZWN0b3IsIG9wdGlvbnMpO1xuICBzdGF0ZS5sb2FkZWRXaWR0aCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IC8vIExpc3RlbiBmb3IgU2hvcGlmeSB0aGVtZSBlZGl0b3IgZXZlbnRzXG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOmxvYWQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gd2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgfSk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF91cGRhdGUoKTtcbiAgfSk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjp1bmxvYWQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gdW53YXRjaChldmVudC50YXJnZXQpO1xuICB9KTsgLy8gTGlzdGVuIGZvciBjdXN0b20gZXZlbnRzIHRvIGFsbG93IHRoZW1lcyB0byBob29rIGludG8gcmltZ1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RoZW1lOnJpbWc6d2F0Y2gnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gd2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgfSk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RoZW1lOnJpbWc6dW53YXRjaCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiB1bndhdGNoKGV2ZW50LnRhcmdldCk7XG4gIH0pOyAvLyBTdXBwb3J0IGN1c3RvbSBldmVudHMgdHJpZ2dlcmVkIHRocm91Z2ggalF1ZXJ5XG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvaXNzdWVzLzMzNDdcblxuICBpZiAod2luZG93LmpRdWVyeSkge1xuICAgIGpRdWVyeShkb2N1bWVudCkub24oe1xuICAgICAgJ3RoZW1lOnJpbWc6d2F0Y2gnOiBmdW5jdGlvbiB0aGVtZVJpbWdXYXRjaChldmVudCkge1xuICAgICAgICByZXR1cm4gd2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgICAgIH0sXG4gICAgICAndGhlbWU6cmltZzp1bndhdGNoJzogZnVuY3Rpb24gdGhlbWVSaW1nVW53YXRjaChldmVudCkge1xuICAgICAgICByZXR1cm4gdW53YXRjaChldmVudC50YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIFRyYWNrIGFuIGVsZW1lbnQsIGFuZCBpdHMgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqL1xuXG5cbmZ1bmN0aW9uIHdhdGNoKGVsKSB7XG4gIC8vIFRyYWNrIGVsZW1lbnRcbiAgaWYgKHR5cGVvZiBlbC5tYXRjaGVzID09PSAnZnVuY3Rpb24nICYmIGVsLm1hdGNoZXMoc3RhdGUuc2VsZWN0b3IpKSB7XG4gICAgc3RhdGUuaW5zdGFuY2UudHJhY2soZWwpO1xuICB9IC8vIFRyYWNrIGVsZW1lbnQncyBjaGlsZHJlblxuXG5cbiAgc3RhdGUuaW5zdGFuY2UudHJhY2soZWwucXVlcnlTZWxlY3RvckFsbChzdGF0ZS5zZWxlY3RvcikpO1xufVxuLyoqXG4gKiBVbnRyYWNrIGFuIGVsZW1lbnQsIGFuZCBpdHMgY2hpbGRyZW5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICogQHByaXZhdGVcbiAqL1xuXG5cbmZ1bmN0aW9uIHVud2F0Y2goZWwpIHtcbiAgLy8gVW50cmFjayBlbGVtZW50J3MgY2hpbGRyZW5cbiAgc3RhdGUuaW5zdGFuY2UudW50cmFjayhlbC5xdWVyeVNlbGVjdG9yQWxsKHN0YXRlLnNlbGVjdG9yKSk7IC8vIFVudHJhY2sgZWxlbWVudFxuXG4gIGlmICh0eXBlb2YgZWwubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBlbC5tYXRjaGVzKHN0YXRlLnNlbGVjdG9yKSkge1xuICAgIHN0YXRlLmluc3RhbmNlLnVudHJhY2soZWwpO1xuICB9XG59XG4vKipcbiAqIE1hbnVhbGx5IGxvYWQgYW4gaW1hZ2VcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICovXG5cblxuZnVuY3Rpb24gbG9hZCQxKGVsKSB7XG4gIC8vIExvYWQgZWxlbWVudFxuICBpZiAodHlwZW9mIGVsLm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiYgZWwubWF0Y2hlcyhzdGF0ZS5zZWxlY3RvcikpIHtcbiAgICBzdGF0ZS5pbnN0YW5jZS5sb2FkKGVsKTtcbiAgfSAvLyBMb2FkIGVsZW1lbnQncyBjaGlsZHJlblxuXG5cbiAgc3RhdGUuaW5zdGFuY2UubG9hZChlbC5xdWVyeVNlbGVjdG9yQWxsKHN0YXRlLnNlbGVjdG9yKSk7XG59XG4vKipcbiAqIFVwZGF0ZSBhbiBlbGVtZW50LCBhbmQgaXRzIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKi9cblxuXG5mdW5jdGlvbiBfdXBkYXRlKCkge1xuICB2YXIgY3VycmVudFdpZHRoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgLy8gUmV0dXJuIGlmIHdlJ3JlIG5vdCAyeCBzbWFsbGVyLCBvciBsYXJnZXIgdGhhbiB0aGUgZXhpc3RpbmcgbG9hZGluZyBzaXplXG5cbiAgaWYgKGN1cnJlbnRXaWR0aCAvIHN0YXRlLmxvYWRlZFdpZHRoID4gMC41ICYmIGN1cnJlbnRXaWR0aCAvIHN0YXRlLmxvYWRlZFdpZHRoIDwgMikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmxvYWRlZFdpZHRoID0gY3VycmVudFdpZHRoO1xuICBzdGF0ZS5pbnN0YW5jZS51cGRhdGUoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RhdGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js":
/*!*********************************************************************!*\
  !*** ./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js ***!
  \*********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n  /*!\n   * @pixelunion/shopify-asyncview v2.0.5\n   * (c) 2020 Pixel Union\n  */\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(n);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n  return arr2;\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar deferred = {};\n\nvar AsyncView = /*#__PURE__*/function () {\n  function AsyncView() {\n    _classCallCheck(this, AsyncView);\n  }\n\n  _createClass(AsyncView, null, [{\n    key: \"load\",\n\n    /**\n     * Load the template given by the provided URL into the provided\n     * view\n     *\n     * @param {string} url - The url to load\n     * @param {object} query - An object containing additional query parameters of the URL\n     * @param {string} query.view - A required query parameter indicating which view to load\n     * @param {object} [options] - Config options\n     * @param {string} [options.hash] - A hash of the current page content\n     */\n    value: function load(url) {\n      var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      if (!('view' in query)) {\n        return Promise.reject(new Error('\\'view\\' not found in \\'query\\' parameter'));\n      }\n\n      var querylessUrl = url.replace(/\\?[^#]+/, '');\n      var queryParamsString = new RegExp(/.+\\?([^#]+)/).exec(url);\n      var queryParams = query;\n\n      if (queryParamsString && queryParamsString.length >= 2) {\n        queryParamsString[1].split('&').forEach(function (param) {\n          var _param$split = param.split('='),\n              _param$split2 = _slicedToArray(_param$split, 2),\n              key = _param$split2[0],\n              value = _param$split2[1];\n\n          queryParams[key] = value;\n        });\n      } // NOTE: We're adding an additional timestamp to the query.\n      // This is to prevent certain browsers from returning cached\n      // versions of the url we are requesting.\n      // See this PR for more info: https://github.com/pixelunion/shopify-asyncview/pull/4\n\n\n      var cachebustingParams = _objectSpread2({}, queryParams, {\n        _: new Date().getTime()\n      });\n\n      var hashUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n        return \"\".concat(address, \"?\").concat(Object.keys(queryParams).sort().map(function (key) {\n          return \"\".concat(key, \"=\").concat(encodeURIComponent(queryParams[key]));\n        }).join('&')).concat(hash);\n      });\n      var requestUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n        return \"\".concat(address, \"?\").concat(Object.keys(cachebustingParams).sort().map(function (key) {\n          return \"\".concat(key, \"=\").concat(encodeURIComponent(cachebustingParams[key]));\n        }).join('&')).concat(hash);\n      });\n      var promise = new Promise(function (resolve, reject) {\n        var data;\n\n        if (hashUrl in deferred) {\n          resolve(deferred[hashUrl]);\n          return;\n        }\n\n        deferred[hashUrl] = promise;\n\n        if (options.hash) {\n          data = sessionStorage.getItem(hashUrl);\n\n          if (data) {\n            var deserialized = JSON.parse(data);\n\n            if (options.hash === deserialized.options.hash) {\n              delete deferred[hashUrl];\n              resolve(deserialized);\n              return;\n            }\n          }\n        }\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', requestUrl, true);\n\n        xhr.onload = function () {\n          var el = xhr.response;\n          var newOptions = {};\n          var optionsEl = el.querySelector('[data-options]');\n\n          if (optionsEl && optionsEl.innerHTML) {\n            newOptions = JSON.parse(el.querySelector('[data-options]').innerHTML);\n          }\n\n          var htmlEls = el.querySelectorAll('[data-html]');\n          var newHtml = {};\n\n          if (htmlEls.length === 1 && htmlEls[0].getAttribute('data-html') === '') {\n            newHtml = htmlEls[0].innerHTML;\n          } else {\n            for (var i = 0; i < htmlEls.length; i++) {\n              newHtml[htmlEls[i].getAttribute('data-html')] = htmlEls[i].innerHTML;\n            }\n          }\n\n          var dataEls = el.querySelectorAll('[data-data]');\n          var newData = {};\n\n          if (dataEls.length === 1 && dataEls[0].getAttribute('data-data') === '') {\n            newData = JSON.parse(dataEls[0].innerHTML);\n          } else {\n            for (var _i = 0; _i < dataEls.length; _i++) {\n              newData[dataEls[_i].getAttribute('data-data')] = JSON.parse(dataEls[_i].innerHTML);\n            }\n          }\n\n          if (options.hash) {\n            try {\n              sessionStorage.setItem(hashUrl, JSON.stringify({\n                options: newOptions,\n                data: newData,\n                html: newHtml\n              }));\n            } catch (error) {\n              console.error(error);\n            }\n          }\n\n          delete deferred[hashUrl];\n          resolve({\n            data: newData,\n            html: newHtml\n          });\n        };\n\n        xhr.onerror = function () {\n          delete deferred[hashUrl];\n          reject();\n        };\n\n        xhr.responseType = 'document';\n        xhr.send();\n      });\n      return promise;\n    }\n  }]);\n\n  return AsyncView;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AsyncView);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcvZGlzdC9pbmRleC5lcy5qcz8zMDBlIl0sInNvdXJjZXNDb250ZW50IjpbIlxuICAvKiFcbiAgICogQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcgdjIuMC41XG4gICAqIChjKSAyMDIwIFBpeGVsIFVuaW9uXG4gICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KTtcbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZCA9IHRydWU7XG4gICAgX2UgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShuKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbnZhciBkZWZlcnJlZCA9IHt9O1xuXG52YXIgQXN5bmNWaWV3ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQXN5bmNWaWV3KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBc3luY1ZpZXcpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFzeW5jVmlldywgbnVsbCwgW3tcbiAgICBrZXk6IFwibG9hZFwiLFxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgdGVtcGxhdGUgZ2l2ZW4gYnkgdGhlIHByb3ZpZGVkIFVSTCBpbnRvIHRoZSBwcm92aWRlZFxuICAgICAqIHZpZXdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgdXJsIHRvIGxvYWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gcXVlcnkgLSBBbiBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMgb2YgdGhlIFVSTFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeS52aWV3IC0gQSByZXF1aXJlZCBxdWVyeSBwYXJhbWV0ZXIgaW5kaWNhdGluZyB3aGljaCB2aWV3IHRvIGxvYWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gQ29uZmlnIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaGFzaF0gLSBBIGhhc2ggb2YgdGhlIGN1cnJlbnQgcGFnZSBjb250ZW50XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICB2YXIgcXVlcnkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgICBpZiAoISgndmlldycgaW4gcXVlcnkpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1xcJ3ZpZXdcXCcgbm90IGZvdW5kIGluIFxcJ3F1ZXJ5XFwnIHBhcmFtZXRlcicpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHF1ZXJ5bGVzc1VybCA9IHVybC5yZXBsYWNlKC9cXD9bXiNdKy8sICcnKTtcbiAgICAgIHZhciBxdWVyeVBhcmFtc1N0cmluZyA9IG5ldyBSZWdFeHAoLy4rXFw/KFteI10rKS8pLmV4ZWModXJsKTtcbiAgICAgIHZhciBxdWVyeVBhcmFtcyA9IHF1ZXJ5O1xuXG4gICAgICBpZiAocXVlcnlQYXJhbXNTdHJpbmcgJiYgcXVlcnlQYXJhbXNTdHJpbmcubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcXVlcnlQYXJhbXNTdHJpbmdbMV0uc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgIHZhciBfcGFyYW0kc3BsaXQgPSBwYXJhbS5zcGxpdCgnPScpLFxuICAgICAgICAgICAgICBfcGFyYW0kc3BsaXQyID0gX3NsaWNlZFRvQXJyYXkoX3BhcmFtJHNwbGl0LCAyKSxcbiAgICAgICAgICAgICAga2V5ID0gX3BhcmFtJHNwbGl0MlswXSxcbiAgICAgICAgICAgICAgdmFsdWUgPSBfcGFyYW0kc3BsaXQyWzFdO1xuXG4gICAgICAgICAgcXVlcnlQYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gLy8gTk9URTogV2UncmUgYWRkaW5nIGFuIGFkZGl0aW9uYWwgdGltZXN0YW1wIHRvIHRoZSBxdWVyeS5cbiAgICAgIC8vIFRoaXMgaXMgdG8gcHJldmVudCBjZXJ0YWluIGJyb3dzZXJzIGZyb20gcmV0dXJuaW5nIGNhY2hlZFxuICAgICAgLy8gdmVyc2lvbnMgb2YgdGhlIHVybCB3ZSBhcmUgcmVxdWVzdGluZy5cbiAgICAgIC8vIFNlZSB0aGlzIFBSIGZvciBtb3JlIGluZm86IGh0dHBzOi8vZ2l0aHViLmNvbS9waXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3L3B1bGwvNFxuXG5cbiAgICAgIHZhciBjYWNoZWJ1c3RpbmdQYXJhbXMgPSBfb2JqZWN0U3ByZWFkMih7fSwgcXVlcnlQYXJhbXMsIHtcbiAgICAgICAgXzogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgaGFzaFVybCA9IHF1ZXJ5bGVzc1VybC5yZXBsYWNlKC8oW14jXSspKC4qKS8sIGZ1bmN0aW9uIChtYXRjaCwgYWRkcmVzcywgaGFzaCkge1xuICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoYWRkcmVzcywgXCI/XCIpLmNvbmNhdChPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykuc29ydCgpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI9XCIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQocXVlcnlQYXJhbXNba2V5XSkpO1xuICAgICAgICB9KS5qb2luKCcmJykpLmNvbmNhdChoYXNoKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHJlcXVlc3RVcmwgPSBxdWVyeWxlc3NVcmwucmVwbGFjZSgvKFteI10rKSguKikvLCBmdW5jdGlvbiAobWF0Y2gsIGFkZHJlc3MsIGhhc2gpIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGFkZHJlc3MsIFwiP1wiKS5jb25jYXQoT2JqZWN0LmtleXMoY2FjaGVidXN0aW5nUGFyYW1zKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoa2V5LCBcIj1cIikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChjYWNoZWJ1c3RpbmdQYXJhbXNba2V5XSkpO1xuICAgICAgICB9KS5qb2luKCcmJykpLmNvbmNhdChoYXNoKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBkYXRhO1xuXG4gICAgICAgIGlmIChoYXNoVXJsIGluIGRlZmVycmVkKSB7XG4gICAgICAgICAgcmVzb2x2ZShkZWZlcnJlZFtoYXNoVXJsXSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmZXJyZWRbaGFzaFVybF0gPSBwcm9taXNlO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgICAgICBkYXRhID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShoYXNoVXJsKTtcblxuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB2YXIgZGVzZXJpYWxpemVkID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzaCA9PT0gZGVzZXJpYWxpemVkLm9wdGlvbnMuaGFzaCkge1xuICAgICAgICAgICAgICBkZWxldGUgZGVmZXJyZWRbaGFzaFVybF07XG4gICAgICAgICAgICAgIHJlc29sdmUoZGVzZXJpYWxpemVkKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHJlcXVlc3RVcmwsIHRydWUpO1xuXG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGVsID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgIHZhciBuZXdPcHRpb25zID0ge307XG4gICAgICAgICAgdmFyIG9wdGlvbnNFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW9wdGlvbnNdJyk7XG5cbiAgICAgICAgICBpZiAob3B0aW9uc0VsICYmIG9wdGlvbnNFbC5pbm5lckhUTUwpIHtcbiAgICAgICAgICAgIG5ld09wdGlvbnMgPSBKU09OLnBhcnNlKGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW9wdGlvbnNdJykuaW5uZXJIVE1MKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaHRtbEVscyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWh0bWxdJyk7XG4gICAgICAgICAgdmFyIG5ld0h0bWwgPSB7fTtcblxuICAgICAgICAgIGlmIChodG1sRWxzLmxlbmd0aCA9PT0gMSAmJiBodG1sRWxzWzBdLmdldEF0dHJpYnV0ZSgnZGF0YS1odG1sJykgPT09ICcnKSB7XG4gICAgICAgICAgICBuZXdIdG1sID0gaHRtbEVsc1swXS5pbm5lckhUTUw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRtbEVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBuZXdIdG1sW2h0bWxFbHNbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLWh0bWwnKV0gPSBodG1sRWxzW2ldLmlubmVySFRNTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZGF0YUVscyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWRhdGFdJyk7XG4gICAgICAgICAgdmFyIG5ld0RhdGEgPSB7fTtcblxuICAgICAgICAgIGlmIChkYXRhRWxzLmxlbmd0aCA9PT0gMSAmJiBkYXRhRWxzWzBdLmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRhJykgPT09ICcnKSB7XG4gICAgICAgICAgICBuZXdEYXRhID0gSlNPTi5wYXJzZShkYXRhRWxzWzBdLmlubmVySFRNTCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkYXRhRWxzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICBuZXdEYXRhW2RhdGFFbHNbX2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRhJyldID0gSlNPTi5wYXJzZShkYXRhRWxzW19pXS5pbm5lckhUTUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oaGFzaFVybCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IG5ld09wdGlvbnMsXG4gICAgICAgICAgICAgICAgZGF0YTogbmV3RGF0YSxcbiAgICAgICAgICAgICAgICBodG1sOiBuZXdIdG1sXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlbGV0ZSBkZWZlcnJlZFtoYXNoVXJsXTtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIGRhdGE6IG5ld0RhdGEsXG4gICAgICAgICAgICBodG1sOiBuZXdIdG1sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGVsZXRlIGRlZmVycmVkW2hhc2hVcmxdO1xuICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnZG9jdW1lbnQnO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQXN5bmNWaWV3O1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBBc3luY1ZpZXc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/shopify-cross-border/dist/index.es.js":
/*!************************************************************************!*\
  !*** ./node_modules/@pixelunion/shopify-cross-border/dist/index.es.js ***!
  \************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createCommonjsModule(fn) {\n  var module = { exports: {} };\n\treturn fn(module, module.exports), module.exports;\n}\n\nvar EventHandler_1 = createCommonjsModule(function (module, exports) {\n\nexports.__esModule = true;\n\nvar EventHandler =\n/** @class */\nfunction () {\n  function EventHandler() {\n    this.events = [];\n  }\n\n  EventHandler.prototype.register = function (el, event, listener) {\n    if (!el || !event || !listener) return null;\n    this.events.push({\n      el: el,\n      event: event,\n      listener: listener\n    });\n    el.addEventListener(event, listener);\n    return {\n      el: el,\n      event: event,\n      listener: listener\n    };\n  };\n\n  EventHandler.prototype.unregister = function (_a) {\n    var el = _a.el,\n        event = _a.event,\n        listener = _a.listener;\n    if (!el || !event || !listener) return null;\n    this.events = this.events.filter(function (e) {\n      return el !== e.el || event !== e.event || listener !== e.listener;\n    });\n    el.removeEventListener(event, listener);\n    return {\n      el: el,\n      event: event,\n      listener: listener\n    };\n  };\n\n  EventHandler.prototype.unregisterAll = function () {\n    this.events.forEach(function (_a) {\n      var el = _a.el,\n          event = _a.event,\n          listener = _a.listener;\n      return el.removeEventListener(event, listener);\n    });\n    this.events = [];\n  };\n\n  return EventHandler;\n}();\n\nexports[\"default\"] = EventHandler;\n});\n\nvar Events = /*@__PURE__*/getDefaultExportFromCjs(EventHandler_1);\n\nvar selectors = {\n  disclosureList: '[data-disclosure-list]',\n  disclosureToggle: '[data-disclosure-toggle]',\n  disclosureInput: '[data-disclosure-input]',\n  disclosureOptions: '[data-disclosure-option]'\n};\nvar classes = {\n  listVisible: 'disclosure-list--visible',\n  alternateDrop: 'disclosure-list--alternate-drop'\n};\n\nvar Disclosure = /*#__PURE__*/function () {\n  function Disclosure(el) {\n    _classCallCheck(this, Disclosure);\n\n    this.el = el;\n    this.events = new Events();\n    this.cache = {};\n\n    this._cacheSelectors();\n\n    this._connectOptions();\n\n    this._connectToggle();\n\n    this._onFocusOut();\n  }\n\n  _createClass(Disclosure, [{\n    key: \"_cacheSelectors\",\n    value: function _cacheSelectors() {\n      this.cache = {\n        disclosureList: this.el.querySelector(selectors.disclosureList),\n        disclosureToggle: this.el.querySelector(selectors.disclosureToggle),\n        disclosureInput: this.el.querySelector(selectors.disclosureInput),\n        disclosureOptions: this.el.querySelectorAll(selectors.disclosureOptions)\n      };\n    }\n  }, {\n    key: \"_connectToggle\",\n    value: function _connectToggle() {\n      var _this = this;\n\n      this.events.register(this.cache.disclosureToggle, 'click', function (e) {\n        var ariaExpanded = e.currentTarget.getAttribute('aria-expanded') === 'true';\n        e.currentTarget.setAttribute('aria-expanded', !ariaExpanded);\n\n        _this.cache.disclosureList.classList.remove(classes.alternateDrop);\n\n        _this.cache.disclosureList.classList.toggle(classes.listVisible);\n\n        window.requestAnimationFrame(function () {\n          var _this$cache$disclosur = _this.cache.disclosureList.getBoundingClientRect(),\n              left = _this$cache$disclosur.left,\n              width = _this$cache$disclosur.width;\n\n          var _window = window,\n              innerWidth = _window.innerWidth;\n          var gutter = 30;\n\n          if (left + width + gutter > innerWidth) {\n            _this.cache.disclosureList.classList.add(classes.alternateDrop);\n          }\n        });\n      });\n    }\n  }, {\n    key: \"_connectOptions\",\n    value: function _connectOptions() {\n      var _this2 = this;\n\n      var options = this.cache.disclosureOptions;\n\n      for (var i = 0; i < options.length; i++) {\n        var option = options[i];\n        this.events.register(option, 'click', function (e) {\n          return _this2._submitForm(e.currentTarget.dataset.value);\n        });\n      }\n    }\n  }, {\n    key: \"_onFocusOut\",\n    value: function _onFocusOut() {\n      var _this3 = this;\n\n      this.events.register(this.cache.disclosureToggle, 'focusout', function (e) {\n        var disclosureLostFocus = !_this3.el.contains(e.relatedTarget);\n\n        if (disclosureLostFocus) {\n          _this3._hideList();\n        }\n      });\n      this.events.register(this.cache.disclosureList, 'focusout', function (e) {\n        var childInFocus = e.currentTarget.contains(e.relatedTarget);\n\n        var isVisible = _this3.cache.disclosureList.classList.contains(classes.listVisible);\n\n        if (isVisible && !childInFocus) {\n          _this3._hideList();\n        }\n      });\n      this.events.register(this.el, 'keyup', function (e) {\n        if (e.defaultPrevented) {\n          return; // Do nothing if the event was already processed\n        }\n\n        if (e.key !== 'Escape' || e.key !== 'Esc') return;\n\n        _this3._hideList();\n\n        _this3.cache.disclosureToggle.focus();\n      });\n      this.events.register(document.body, 'click', function (e) {\n        var isOption = _this3.el.contains(e.target);\n\n        var isVisible = _this3.cache.disclosureList.classList.contains(classes.listVisible);\n\n        if (isVisible && !isOption) {\n          _this3._hideList();\n        }\n      });\n    }\n  }, {\n    key: \"_submitForm\",\n    value: function _submitForm(value) {\n      this.cache.disclosureInput.value = value;\n      this.el.closest('form').submit();\n    }\n  }, {\n    key: \"_hideList\",\n    value: function _hideList() {\n      this.cache.disclosureList.classList.remove(classes.listVisible);\n      this.cache.disclosureToggle.setAttribute('aria-expanded', false);\n    }\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      this.events.unregisterAll();\n    }\n  }]);\n\n  return Disclosure;\n}();\n\nif (!Element.prototype.matches) {\n  Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n}\n\nif (!Element.prototype.closest) {\n  Element.prototype.closest = function closest(s) {\n    var el = this;\n\n    do {\n      if (el.matches(s)) return el;\n      el = el.parentElement || el.parentNode;\n    } while (el !== null && el.nodeType === 1);\n\n    return null;\n  };\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Disclosure);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1jcm9zcy1ib3JkZXIvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1jcm9zcy1ib3JkZXIvZGlzdC9pbmRleC5lcy5qcz9hZTI3Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4pIHtcbiAgdmFyIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfTtcblx0cmV0dXJuIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxudmFyIEV2ZW50SGFuZGxlcl8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgRXZlbnRIYW5kbGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRIYW5kbGVyKCkge1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gIH1cblxuICBFdmVudEhhbmRsZXIucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKGVsLCBldmVudCwgbGlzdGVuZXIpIHtcbiAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpIHJldHVybiBudWxsO1xuICAgIHRoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgZWw6IGVsLFxuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyXG4gICAgfSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiB7XG4gICAgICBlbDogZWwsXG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcjogbGlzdGVuZXJcbiAgICB9O1xuICB9O1xuXG4gIEV2ZW50SGFuZGxlci5wcm90b3R5cGUudW5yZWdpc3RlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBlbCA9IF9hLmVsLFxuICAgICAgICBldmVudCA9IF9hLmV2ZW50LFxuICAgICAgICBsaXN0ZW5lciA9IF9hLmxpc3RlbmVyO1xuICAgIGlmICghZWwgfHwgIWV2ZW50IHx8ICFsaXN0ZW5lcikgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5ldmVudHMgPSB0aGlzLmV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlbCAhPT0gZS5lbCB8fCBldmVudCAhPT0gZS5ldmVudCB8fCBsaXN0ZW5lciAhPT0gZS5saXN0ZW5lcjtcbiAgICB9KTtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsOiBlbCxcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lclxuICAgIH07XG4gIH07XG5cbiAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyQWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICB2YXIgZWwgPSBfYS5lbCxcbiAgICAgICAgICBldmVudCA9IF9hLmV2ZW50LFxuICAgICAgICAgIGxpc3RlbmVyID0gX2EubGlzdGVuZXI7XG4gICAgICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gIH07XG5cbiAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcbn0oKTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFdmVudEhhbmRsZXI7XG59KTtcblxudmFyIEV2ZW50cyA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhFdmVudEhhbmRsZXJfMSk7XG5cbnZhciBzZWxlY3RvcnMgPSB7XG4gIGRpc2Nsb3N1cmVMaXN0OiAnW2RhdGEtZGlzY2xvc3VyZS1saXN0XScsXG4gIGRpc2Nsb3N1cmVUb2dnbGU6ICdbZGF0YS1kaXNjbG9zdXJlLXRvZ2dsZV0nLFxuICBkaXNjbG9zdXJlSW5wdXQ6ICdbZGF0YS1kaXNjbG9zdXJlLWlucHV0XScsXG4gIGRpc2Nsb3N1cmVPcHRpb25zOiAnW2RhdGEtZGlzY2xvc3VyZS1vcHRpb25dJ1xufTtcbnZhciBjbGFzc2VzID0ge1xuICBsaXN0VmlzaWJsZTogJ2Rpc2Nsb3N1cmUtbGlzdC0tdmlzaWJsZScsXG4gIGFsdGVybmF0ZURyb3A6ICdkaXNjbG9zdXJlLWxpc3QtLWFsdGVybmF0ZS1kcm9wJ1xufTtcblxudmFyIERpc2Nsb3N1cmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBEaXNjbG9zdXJlKGVsKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc2Nsb3N1cmUpO1xuXG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuY2FjaGUgPSB7fTtcblxuICAgIHRoaXMuX2NhY2hlU2VsZWN0b3JzKCk7XG5cbiAgICB0aGlzLl9jb25uZWN0T3B0aW9ucygpO1xuXG4gICAgdGhpcy5fY29ubmVjdFRvZ2dsZSgpO1xuXG4gICAgdGhpcy5fb25Gb2N1c091dCgpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKERpc2Nsb3N1cmUsIFt7XG4gICAga2V5OiBcIl9jYWNoZVNlbGVjdG9yc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FjaGVTZWxlY3RvcnMoKSB7XG4gICAgICB0aGlzLmNhY2hlID0ge1xuICAgICAgICBkaXNjbG9zdXJlTGlzdDogdGhpcy5lbC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9ycy5kaXNjbG9zdXJlTGlzdCksXG4gICAgICAgIGRpc2Nsb3N1cmVUb2dnbGU6IHRoaXMuZWwucXVlcnlTZWxlY3RvcihzZWxlY3RvcnMuZGlzY2xvc3VyZVRvZ2dsZSksXG4gICAgICAgIGRpc2Nsb3N1cmVJbnB1dDogdGhpcy5lbC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9ycy5kaXNjbG9zdXJlSW5wdXQpLFxuICAgICAgICBkaXNjbG9zdXJlT3B0aW9uczogdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9ycy5kaXNjbG9zdXJlT3B0aW9ucylcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jb25uZWN0VG9nZ2xlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jb25uZWN0VG9nZ2xlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5jYWNoZS5kaXNjbG9zdXJlVG9nZ2xlLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgYXJpYUV4cGFuZGVkID0gZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09PSAndHJ1ZSc7XG4gICAgICAgIGUuY3VycmVudFRhcmdldC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAhYXJpYUV4cGFuZGVkKTtcblxuICAgICAgICBfdGhpcy5jYWNoZS5kaXNjbG9zdXJlTGlzdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzZXMuYWx0ZXJuYXRlRHJvcCk7XG5cbiAgICAgICAgX3RoaXMuY2FjaGUuZGlzY2xvc3VyZUxpc3QuY2xhc3NMaXN0LnRvZ2dsZShjbGFzc2VzLmxpc3RWaXNpYmxlKTtcblxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkY2FjaGUkZGlzY2xvc3VyID0gX3RoaXMuY2FjaGUuZGlzY2xvc3VyZUxpc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgIGxlZnQgPSBfdGhpcyRjYWNoZSRkaXNjbG9zdXIubGVmdCxcbiAgICAgICAgICAgICAgd2lkdGggPSBfdGhpcyRjYWNoZSRkaXNjbG9zdXIud2lkdGg7XG5cbiAgICAgICAgICB2YXIgX3dpbmRvdyA9IHdpbmRvdyxcbiAgICAgICAgICAgICAgaW5uZXJXaWR0aCA9IF93aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgICB2YXIgZ3V0dGVyID0gMzA7XG5cbiAgICAgICAgICBpZiAobGVmdCArIHdpZHRoICsgZ3V0dGVyID4gaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgX3RoaXMuY2FjaGUuZGlzY2xvc3VyZUxpc3QuY2xhc3NMaXN0LmFkZChjbGFzc2VzLmFsdGVybmF0ZURyb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2Nvbm5lY3RPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jb25uZWN0T3B0aW9ucygpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuY2FjaGUuZGlzY2xvc3VyZU9wdGlvbnM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgb3B0aW9uID0gb3B0aW9uc1tpXTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIob3B0aW9uLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuX3N1Ym1pdEZvcm0oZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uRm9jdXNPdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uRm9jdXNPdXQoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5jYWNoZS5kaXNjbG9zdXJlVG9nZ2xlLCAnZm9jdXNvdXQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgZGlzY2xvc3VyZUxvc3RGb2N1cyA9ICFfdGhpczMuZWwuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KTtcblxuICAgICAgICBpZiAoZGlzY2xvc3VyZUxvc3RGb2N1cykge1xuICAgICAgICAgIF90aGlzMy5faGlkZUxpc3QoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmNhY2hlLmRpc2Nsb3N1cmVMaXN0LCAnZm9jdXNvdXQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hpbGRJbkZvY3VzID0gZS5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCk7XG5cbiAgICAgICAgdmFyIGlzVmlzaWJsZSA9IF90aGlzMy5jYWNoZS5kaXNjbG9zdXJlTGlzdC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3Nlcy5saXN0VmlzaWJsZSk7XG5cbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhY2hpbGRJbkZvY3VzKSB7XG4gICAgICAgICAgX3RoaXMzLl9oaWRlTGlzdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMuZWwsICdrZXl1cCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICByZXR1cm47IC8vIERvIG5vdGhpbmcgaWYgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUua2V5ICE9PSAnRXNjYXBlJyB8fCBlLmtleSAhPT0gJ0VzYycpIHJldHVybjtcblxuICAgICAgICBfdGhpczMuX2hpZGVMaXN0KCk7XG5cbiAgICAgICAgX3RoaXMzLmNhY2hlLmRpc2Nsb3N1cmVUb2dnbGUuZm9jdXMoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIoZG9jdW1lbnQuYm9keSwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIGlzT3B0aW9uID0gX3RoaXMzLmVsLmNvbnRhaW5zKGUudGFyZ2V0KTtcblxuICAgICAgICB2YXIgaXNWaXNpYmxlID0gX3RoaXMzLmNhY2hlLmRpc2Nsb3N1cmVMaXN0LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc2VzLmxpc3RWaXNpYmxlKTtcblxuICAgICAgICBpZiAoaXNWaXNpYmxlICYmICFpc09wdGlvbikge1xuICAgICAgICAgIF90aGlzMy5faGlkZUxpc3QoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9zdWJtaXRGb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zdWJtaXRGb3JtKHZhbHVlKSB7XG4gICAgICB0aGlzLmNhY2hlLmRpc2Nsb3N1cmVJbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5lbC5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9oaWRlTGlzdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGlkZUxpc3QoKSB7XG4gICAgICB0aGlzLmNhY2hlLmRpc2Nsb3N1cmVMaXN0LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3Nlcy5saXN0VmlzaWJsZSk7XG4gICAgICB0aGlzLmNhY2hlLmRpc2Nsb3N1cmVUb2dnbGUuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgdGhpcy5ldmVudHMudW5yZWdpc3RlckFsbCgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBEaXNjbG9zdXJlO1xufSgpO1xuXG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcbiAgRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA9IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcjtcbn1cblxuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0KSB7XG4gIEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QgPSBmdW5jdGlvbiBjbG9zZXN0KHMpIHtcbiAgICB2YXIgZWwgPSB0aGlzO1xuXG4gICAgZG8ge1xuICAgICAgaWYgKGVsLm1hdGNoZXMocykpIHJldHVybiBlbDtcbiAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudCB8fCBlbC5wYXJlbnROb2RlO1xuICAgIH0gd2hpbGUgKGVsICE9PSBudWxsICYmIGVsLm5vZGVUeXBlID09PSAxKTtcblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjbG9zdXJlO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-cross-border/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js":
/*!***********************************************************************************************!*\
  !*** ./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js ***!
  \***********************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*!\n * @pixelunion/shopify-sections-manager v1.0.0\n * (c) 2019 Pixel Union\n */\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nfunction triggerInstanceEvent(instance, eventName) {\n  if (instance && instance[eventName]) {\n    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n\n    instance[eventName].apply(instance, args);\n  }\n}\n\nfunction loadData(el) {\n  var dataEl = el.querySelector('[data-section-data]');\n  if (!dataEl) return {};\n\n  // Load data from attribute, or innerHTML\n  var data = dataEl.getAttribute('data-section-data') || dataEl.innerHTML;\n\n  try {\n    return JSON.parse(data);\n  } catch (error) {\n    console.warn('Sections: invalid section data found. ' + error.message);\n    return {};\n  }\n}\n\nvar ShopifySectionsManager = function () {\n  function ShopifySectionsManager() {\n    classCallCheck(this, ShopifySectionsManager);\n\n    this.handlers = {};\n    this.instances = {};\n    this._onSectionEvent = this._onSectionEvent.bind(this);\n\n    document.addEventListener('shopify:section:load', this._onSectionEvent);\n    document.addEventListener('shopify:section:unload', this._onSectionEvent);\n    document.addEventListener('shopify:section:select', this._onSectionEvent);\n    document.addEventListener('shopify:section:deselect', this._onSectionEvent);\n    document.addEventListener('shopify:section:reorder', this._onSectionEvent);\n    document.addEventListener('shopify:block:select', this._onSectionEvent);\n    document.addEventListener('shopify:block:deselect', this._onSectionEvent);\n  }\n\n  /**\n   * Stop listening for section events, and unbind all handlers.\n   */\n\n\n  createClass(ShopifySectionsManager, [{\n    key: 'unbind',\n    value: function unbind() {\n      document.removeEventListener('shopify:section:load', this._onSectionEvent);\n      document.removeEventListener('shopify:section:unload', this._onSectionEvent);\n      document.removeEventListener('shopify:section:select', this._onSectionEvent);\n      document.removeEventListener('shopify:section:deselect', this._onSectionEvent);\n      document.removeEventListener('shopify:section:reorder', this._onSectionEvent);\n      document.removeEventListener('shopify:block:select', this._onSectionEvent);\n      document.removeEventListener('shopify:block:deselect', this._onSectionEvent);\n\n      // Unload all instances\n      for (var i = 0; i < this.instances.length; i++) {\n        triggerInstanceEvent(this.instances[i], 'onSectionUnload');\n      }\n\n      this.handlers = {};\n      this.instances = {};\n    }\n\n    /**\n     * Register a section handler.\n     *\n     * @param {string} type\n     *        The section type to handle. The handler will be called for all\n     *        sections with this type.\n     *\n     * @param {function} handler\n     *        The handler function is passed information about a specific section\n     *        instance. The handler is expected to return an object that will be\n     *        associated with the section instance.\n     *\n     *        Section handlers are passed an object with the following parameters:\n     *          {string} id\n     *          An ID that maps to a specific section instance. Typically the\n     *          section's filename for static sections, or a generated ID for\n     *          dynamic sections.\n     *\n     *          {string} type\n     *          The section type, as supplied when registered.\n     *\n     *          {Element} el\n     *          The root DOM element for the section instance.\n     *\n     *          {Object} data\n     *          Data loaded from the section script element. Defaults to an\n     *          empty object.\n     *\n     *          {Function} postMessage\n     *          A function that can be called to pass messages between sections.\n     *          The function should be called with a message \"name\", and\n     *          optionally some data.\n     */\n\n  }, {\n    key: 'register',\n    value: function register(type, handler) {\n      if (this.handlers[type]) {\n        console.warn('Sections: section handler already exists of type \\'' + type + '\\'.');\n      }\n\n      // Store the section handler\n      this.handlers[type] = handler;\n\n      // Init sections for this type\n      this._initSections(type);\n    }\n\n    /**\n     * Initialize sections already on the page.\n     */\n\n  }, {\n    key: '_initSections',\n    value: function _initSections(type) {\n      // Fetch all existing sections of our type on the page\n      var dataEls = document.querySelectorAll('[data-section-type=\"' + type + '\"]');\n      if (!dataEls) return;\n\n      // Create an instance for each section\n      for (var i = 0; i < dataEls.length; i++) {\n        var dataEl = dataEls[i];\n        var el = dataEl.parentNode;\n\n        // Get instance ID\n        var idEl = el.querySelector('[data-section-id]');\n\n        if (!idEl) {\n          console.warn('Sections: unable to find section id for \\'' + type + '\\'.', el);\n          return;\n        }\n\n        var sectionId = idEl.getAttribute('data-section-id');\n        if (!sectionId) {\n          console.warn('Sections: unable to find section id for \\'' + type + '\\'.', el);\n          return;\n        }\n\n        this._createInstance(sectionId, el);\n      }\n    }\n  }, {\n    key: '_onSectionEvent',\n    value: function _onSectionEvent(event) {\n      var el = event.target;\n      var sectionId = event.detail.sectionId;\n      var blockId = event.detail.blockId;\n      var instance = this.instances[sectionId];\n\n      switch (event.type) {\n        case 'shopify:section:load':\n          this._createInstance(sectionId, el);\n          break;\n\n        case 'shopify:section:unload':\n          triggerInstanceEvent(instance, 'onSectionUnload', { el: el, id: sectionId });\n          delete this.instances[sectionId];\n          break;\n\n        case 'shopify:section:select':\n          triggerInstanceEvent(instance, 'onSectionSelect', { el: el, id: sectionId });\n          break;\n\n        case 'shopify:section:deselect':\n          triggerInstanceEvent(instance, 'onSectionDeselect', { el: el, id: sectionId });\n          break;\n\n        case 'shopify:section:reorder':\n          triggerInstanceEvent(instance, 'onSectionReorder', { el: el, id: sectionId });\n          break;\n\n        case 'shopify:block:select':\n          triggerInstanceEvent(instance, 'onSectionBlockSelect', { el: el, id: blockId });\n          break;\n\n        case 'shopify:block:deselect':\n          triggerInstanceEvent(instance, 'onSectionBlockDeselect', { el: el, id: blockId });\n          break;\n\n        default:\n          break;\n      }\n    }\n  }, {\n    key: '_postMessage',\n    value: function _postMessage(name, data) {\n      var _this = this;\n\n      Object.keys(this.instances).forEach(function (id) {\n        triggerInstanceEvent(_this.instances[id], 'onSectionMessage', name, data);\n      });\n    }\n  }, {\n    key: '_createInstance',\n    value: function _createInstance(id, el) {\n      var typeEl = el.querySelector('[data-section-type]');\n      if (!typeEl) return;\n\n      var type = typeEl.getAttribute('data-section-type');\n      if (!type) return;\n\n      var handler = this.handlers[type];\n      if (!handler) {\n        console.warn('Sections: unable to find section handler for type \\'' + type + '\\'.');\n        return;\n      }\n\n      var data = loadData(el);\n      var postMessage = this._postMessage.bind(this);\n\n      this.instances[id] = handler({ id: id, type: type, el: el, data: data, postMessage: postMessage });\n    }\n  }]);\n  return ShopifySectionsManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ShopifySectionsManager);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyL2Rpc3Qvc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyLmVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9zaG9waWZ5LXNlY3Rpb25zLW1hbmFnZXIvZGlzdC9zaG9waWZ5LXNlY3Rpb25zLW1hbmFnZXIuZXMuanM/MGRmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIVxuICogQHBpeGVsdW5pb24vc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyIHYxLjAuMFxuICogKGMpIDIwMTkgUGl4ZWwgVW5pb25cbiAqL1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5mdW5jdGlvbiB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgZXZlbnROYW1lKSB7XG4gIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZVtldmVudE5hbWVdKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZVtldmVudE5hbWVdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkRGF0YShlbCkge1xuICB2YXIgZGF0YUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi1kYXRhXScpO1xuICBpZiAoIWRhdGFFbCkgcmV0dXJuIHt9O1xuXG4gIC8vIExvYWQgZGF0YSBmcm9tIGF0dHJpYnV0ZSwgb3IgaW5uZXJIVE1MXG4gIHZhciBkYXRhID0gZGF0YUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWN0aW9uLWRhdGEnKSB8fCBkYXRhRWwuaW5uZXJIVE1MO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdTZWN0aW9uczogaW52YWxpZCBzZWN0aW9uIGRhdGEgZm91bmQuICcgKyBlcnJvci5tZXNzYWdlKTtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxudmFyIFNob3BpZnlTZWN0aW9uc01hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNob3BpZnlTZWN0aW9uc01hbmFnZXIoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2hvcGlmeVNlY3Rpb25zTWFuYWdlcik7XG5cbiAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgdGhpcy5pbnN0YW5jZXMgPSB7fTtcbiAgICB0aGlzLl9vblNlY3Rpb25FdmVudCA9IHRoaXMuX29uU2VjdGlvbkV2ZW50LmJpbmQodGhpcyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246bG9hZCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOmRlc2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpyZW9yZGVyJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6YmxvY2s6c2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6YmxvY2s6ZGVzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBsaXN0ZW5pbmcgZm9yIHNlY3Rpb24gZXZlbnRzLCBhbmQgdW5iaW5kIGFsbCBoYW5kbGVycy5cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTaG9waWZ5U2VjdGlvbnNNYW5hZ2VyLCBbe1xuICAgIGtleTogJ3VuYmluZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVuYmluZCgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnVubG9hZCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246ZGVzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246cmVvcmRlcicsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6YmxvY2s6c2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpibG9jazpkZXNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcblxuICAgICAgLy8gVW5sb2FkIGFsbCBpbnN0YW5jZXNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQodGhpcy5pbnN0YW5jZXNbaV0sICdvblNlY3Rpb25VbmxvYWQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5pbnN0YW5jZXMgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHNlY3Rpb24gaGFuZGxlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAgICogICAgICAgIFRoZSBzZWN0aW9uIHR5cGUgdG8gaGFuZGxlLiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBmb3IgYWxsXG4gICAgICogICAgICAgIHNlY3Rpb25zIHdpdGggdGhpcyB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlclxuICAgICAqICAgICAgICBUaGUgaGFuZGxlciBmdW5jdGlvbiBpcyBwYXNzZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBzZWN0aW9uXG4gICAgICogICAgICAgIGluc3RhbmNlLiBUaGUgaGFuZGxlciBpcyBleHBlY3RlZCB0byByZXR1cm4gYW4gb2JqZWN0IHRoYXQgd2lsbCBiZVxuICAgICAqICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3Rpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiAgICAgICAgU2VjdGlvbiBoYW5kbGVycyBhcmUgcGFzc2VkIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAgICAgKiAgICAgICAgICB7c3RyaW5nfSBpZFxuICAgICAqICAgICAgICAgIEFuIElEIHRoYXQgbWFwcyB0byBhIHNwZWNpZmljIHNlY3Rpb24gaW5zdGFuY2UuIFR5cGljYWxseSB0aGVcbiAgICAgKiAgICAgICAgICBzZWN0aW9uJ3MgZmlsZW5hbWUgZm9yIHN0YXRpYyBzZWN0aW9ucywgb3IgYSBnZW5lcmF0ZWQgSUQgZm9yXG4gICAgICogICAgICAgICAgZHluYW1pYyBzZWN0aW9ucy5cbiAgICAgKlxuICAgICAqICAgICAgICAgIHtzdHJpbmd9IHR5cGVcbiAgICAgKiAgICAgICAgICBUaGUgc2VjdGlvbiB0eXBlLCBhcyBzdXBwbGllZCB3aGVuIHJlZ2lzdGVyZWQuXG4gICAgICpcbiAgICAgKiAgICAgICAgICB7RWxlbWVudH0gZWxcbiAgICAgKiAgICAgICAgICBUaGUgcm9vdCBET00gZWxlbWVudCBmb3IgdGhlIHNlY3Rpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiAgICAgICAgICB7T2JqZWN0fSBkYXRhXG4gICAgICogICAgICAgICAgRGF0YSBsb2FkZWQgZnJvbSB0aGUgc2VjdGlvbiBzY3JpcHQgZWxlbWVudC4gRGVmYXVsdHMgdG8gYW5cbiAgICAgKiAgICAgICAgICBlbXB0eSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAgICAgICAgICB7RnVuY3Rpb259IHBvc3RNZXNzYWdlXG4gICAgICogICAgICAgICAgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gcGFzcyBtZXNzYWdlcyBiZXR3ZWVuIHNlY3Rpb25zLlxuICAgICAqICAgICAgICAgIFRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBtZXNzYWdlIFwibmFtZVwiLCBhbmRcbiAgICAgKiAgICAgICAgICBvcHRpb25hbGx5IHNvbWUgZGF0YS5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncmVnaXN0ZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3Rlcih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICBpZiAodGhpcy5oYW5kbGVyc1t0eXBlXSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NlY3Rpb25zOiBzZWN0aW9uIGhhbmRsZXIgYWxyZWFkeSBleGlzdHMgb2YgdHlwZSBcXCcnICsgdHlwZSArICdcXCcuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBzZWN0aW9uIGhhbmRsZXJcbiAgICAgIHRoaXMuaGFuZGxlcnNbdHlwZV0gPSBoYW5kbGVyO1xuXG4gICAgICAvLyBJbml0IHNlY3Rpb25zIGZvciB0aGlzIHR5cGVcbiAgICAgIHRoaXMuX2luaXRTZWN0aW9ucyh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHNlY3Rpb25zIGFscmVhZHkgb24gdGhlIHBhZ2UuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ19pbml0U2VjdGlvbnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdFNlY3Rpb25zKHR5cGUpIHtcbiAgICAgIC8vIEZldGNoIGFsbCBleGlzdGluZyBzZWN0aW9ucyBvZiBvdXIgdHlwZSBvbiB0aGUgcGFnZVxuICAgICAgdmFyIGRhdGFFbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zZWN0aW9uLXR5cGU9XCInICsgdHlwZSArICdcIl0nKTtcbiAgICAgIGlmICghZGF0YUVscykgcmV0dXJuO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2UgZm9yIGVhY2ggc2VjdGlvblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhRWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBkYXRhRWwgPSBkYXRhRWxzW2ldO1xuICAgICAgICB2YXIgZWwgPSBkYXRhRWwucGFyZW50Tm9kZTtcblxuICAgICAgICAvLyBHZXQgaW5zdGFuY2UgSURcbiAgICAgICAgdmFyIGlkRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zZWN0aW9uLWlkXScpO1xuXG4gICAgICAgIGlmICghaWRFbCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaWQgZm9yIFxcJycgKyB0eXBlICsgJ1xcJy4nLCBlbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY3Rpb25JZCA9IGlkRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXNlY3Rpb24taWQnKTtcbiAgICAgICAgaWYgKCFzZWN0aW9uSWQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1NlY3Rpb25zOiB1bmFibGUgdG8gZmluZCBzZWN0aW9uIGlkIGZvciBcXCcnICsgdHlwZSArICdcXCcuJywgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NyZWF0ZUluc3RhbmNlKHNlY3Rpb25JZCwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19vblNlY3Rpb25FdmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vblNlY3Rpb25FdmVudChldmVudCkge1xuICAgICAgdmFyIGVsID0gZXZlbnQudGFyZ2V0O1xuICAgICAgdmFyIHNlY3Rpb25JZCA9IGV2ZW50LmRldGFpbC5zZWN0aW9uSWQ7XG4gICAgICB2YXIgYmxvY2tJZCA9IGV2ZW50LmRldGFpbC5ibG9ja0lkO1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXNbc2VjdGlvbklkXTtcblxuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJzpcbiAgICAgICAgICB0aGlzLl9jcmVhdGVJbnN0YW5jZShzZWN0aW9uSWQsIGVsKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJzpcbiAgICAgICAgICB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvblVubG9hZCcsIHsgZWw6IGVsLCBpZDogc2VjdGlvbklkIH0pO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmluc3RhbmNlc1tzZWN0aW9uSWRdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3Nob3BpZnk6c2VjdGlvbjpzZWxlY3QnOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uU2VsZWN0JywgeyBlbDogZWwsIGlkOiBzZWN0aW9uSWQgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOmRlc2VsZWN0JzpcbiAgICAgICAgICB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvbkRlc2VsZWN0JywgeyBlbDogZWwsIGlkOiBzZWN0aW9uSWQgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOnJlb3JkZXInOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uUmVvcmRlcicsIHsgZWw6IGVsLCBpZDogc2VjdGlvbklkIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3Nob3BpZnk6YmxvY2s6c2VsZWN0JzpcbiAgICAgICAgICB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvbkJsb2NrU2VsZWN0JywgeyBlbDogZWwsIGlkOiBibG9ja0lkIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3Nob3BpZnk6YmxvY2s6ZGVzZWxlY3QnOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uQmxvY2tEZXNlbGVjdCcsIHsgZWw6IGVsLCBpZDogYmxvY2tJZCB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19wb3N0TWVzc2FnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9wb3N0TWVzc2FnZShuYW1lLCBkYXRhKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQoX3RoaXMuaW5zdGFuY2VzW2lkXSwgJ29uU2VjdGlvbk1lc3NhZ2UnLCBuYW1lLCBkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19jcmVhdGVJbnN0YW5jZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jcmVhdGVJbnN0YW5jZShpZCwgZWwpIHtcbiAgICAgIHZhciB0eXBlRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zZWN0aW9uLXR5cGVdJyk7XG4gICAgICBpZiAoIXR5cGVFbCkgcmV0dXJuO1xuXG4gICAgICB2YXIgdHlwZSA9IHR5cGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VjdGlvbi10eXBlJyk7XG4gICAgICBpZiAoIXR5cGUpIHJldHVybjtcblxuICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzW3R5cGVdO1xuICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaGFuZGxlciBmb3IgdHlwZSBcXCcnICsgdHlwZSArICdcXCcuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRhdGEgPSBsb2FkRGF0YShlbCk7XG4gICAgICB2YXIgcG9zdE1lc3NhZ2UgPSB0aGlzLl9wb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLmluc3RhbmNlc1tpZF0gPSBoYW5kbGVyKHsgaWQ6IGlkLCB0eXBlOiB0eXBlLCBlbDogZWwsIGRhdGE6IGRhdGEsIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZSB9KTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFNob3BpZnlTZWN0aW9uc01hbmFnZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFNob3BpZnlTZWN0aW9uc01hbmFnZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js\n");

/***/ }),

/***/ "./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js":
/*!***************************************************************************!*\
  !*** ./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js ***!
  \***************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nconst LOCAL_STORAGE_KEY = 'pxu-shopify-surface-pick-up';\nconst loadingClass = 'surface-pick-up--loading';\n\nconst isNotExpired = timestamp => timestamp + 1000 * 60 * 60 >= Date.now();\n\nconst removeTrailingSlash = s => s.replace(/(.*)\\/$/, '$1'); // Haversine Distance\n// The haversine formula is an equation giving great-circle distances between\n// two points on a sphere from their longitudes and latitudes\n\n\nfunction calculateDistance(latitude1, longitude1, latitude2, longitude2, unitSystem) {\n  const dtor = Math.PI / 180;\n  const radius = unitSystem === 'metric' ? 6378.14 : 3959;\n  const rlat1 = latitude1 * dtor;\n  const rlong1 = longitude1 * dtor;\n  const rlat2 = latitude2 * dtor;\n  const rlong2 = longitude2 * dtor;\n  const dlon = rlong1 - rlong2;\n  const dlat = rlat1 - rlat2;\n  const a = Math.sin(dlat / 2) ** 2 + Math.cos(rlat1) * Math.cos(rlat2) * Math.sin(dlon / 2) ** 2;\n  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n  return radius * c;\n}\n\nasync function getGeoLocation() {\n  return new Promise((resolve, reject) => {\n    const options = {\n      maximumAge: 3600000,\n      // 1 hour\n      timeout: 5000\n    };\n\n    if (navigator.geolocation) {\n      navigator.geolocation.getCurrentPosition(({\n        coords\n      }) => resolve(coords), reject, options);\n    } else {\n      reject();\n    }\n  });\n}\n\nasync function setLocation({\n  latitude,\n  longitude\n}) {\n  const newData = {\n    latitude,\n    longitude,\n    timestamp: Date.now()\n  };\n  localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(newData));\n  return fetch('/localization.json', {\n    method: 'PUT',\n    headers: {\n      'Content-Type': 'application/json'\n    },\n    body: JSON.stringify({\n      latitude,\n      longitude\n    })\n  }).then(() => ({\n    latitude,\n    longitude\n  }));\n}\n\nasync function getLocation(requestLocation = false) {\n  const cachedLocation = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY));\n\n  if (cachedLocation && isNotExpired(cachedLocation.timestamp)) {\n    return cachedLocation;\n  }\n\n  if (requestLocation) {\n    return getGeoLocation().then(coords => {\n      setLocation(coords); // We don't need to wait for this\n\n      return coords;\n    });\n  }\n\n  return null;\n}\n\nclass SurfacePickUp {\n  constructor(el, options) {\n    this.el = el;\n    this.options = {\n      root_url: window.Theme && window.Theme.routes && window.Theme.routes.root_url || '',\n      ...options\n    };\n    this.options.root_url = removeTrailingSlash(this.options.root_url);\n    this.callbacks = [];\n    this.onBtnPress = null;\n    this.latestVariantId = null;\n  }\n\n  load(variantId) {\n    // If no variant is available, empty element and quick-return\n    if (!variantId) {\n      this.el.innerHTML = '';\n      return Promise.resolve(true);\n    } // Because Shopify doesn't expose any `pick_up_enabled` data on the shop object, we\n    // don't know if the variant might be, or is definitely not available for pick up.\n    // Until we know the shop has > 0 pick up locations, we want to avoid prompting the\n    // user for location data (it's annoying, and only makes sense to do if we use it).\n    //\n    // Instead, we have to make an initial request, check and see if any pick up locations\n    // were returned, then ask for the users location, then make another request to get the\n    // location-aware pick up locations.\n    //\n    // As far as I can tell the pick up aware locations differ only in sort order - which\n    // we could do on the front end - but we're following this approach to ensure future\n    // compatibility with any changes Shopify makes (maybe disabling options based on\n    // user location, or whatever else).\n    //\n    // Shopify has indicated they will look into adding pick_up_enabled data to the shop\n    // object, which which case this method can be greatly simplifed into 2 simple cases.\n\n\n    this.latestVariantId = variantId;\n    this.el.classList.add(loadingClass);\n    return this._getData(variantId).then(data => this._injectData(data));\n  }\n\n  onModalRequest(callback) {\n    if (this.callbacks.indexOf(callback) >= 0) return;\n    this.callbacks.push(callback);\n  }\n\n  offModalRequest(callback) {\n    this.callbacks.splice(this.callbacks.indexOf(callback));\n  }\n\n  unload() {\n    this.callbacks = [];\n    this.el.innerHTML = '';\n  }\n\n  _getData(variantId) {\n    return new Promise(resolve => {\n      const xhr = new XMLHttpRequest();\n      const requestUrl = `${this.options.root_url}/variants/${variantId}/?section_id=surface-pick-up`;\n      xhr.open('GET', requestUrl, true);\n\n      xhr.onload = () => {\n        const el = xhr.response;\n        const embed = el.querySelector('[data-html=\"surface-pick-up-embed\"]');\n        const itemsContainer = el.querySelector('[data-html=\"surface-pick-up-items\"]');\n        const items = itemsContainer.content.querySelectorAll('[data-surface-pick-up-item]');\n        resolve({\n          embed,\n          itemsContainer,\n          items,\n          variantId\n        });\n      };\n\n      xhr.onerror = () => {\n        resolve({\n          embed: {\n            innerHTML: ''\n          },\n          itemsContainer: {\n            innerHTML: ''\n          },\n          items: [],\n          variantId\n        });\n      };\n\n      xhr.responseType = 'document';\n      xhr.send();\n    });\n  }\n\n  _injectData({\n    embed,\n    itemsContainer,\n    items,\n    variantId\n  }) {\n    if (variantId !== this.latestVariantId || items.length === 0) {\n      this.el.innerHTML = '';\n      this.el.classList.remove(loadingClass);\n      return;\n    }\n\n    this.el.innerHTML = embed.innerHTML;\n    this.el.classList.remove(loadingClass);\n    let calculatedDistances = false;\n\n    const calculateDistances = () => {\n      if (calculatedDistances) return Promise.resolve();\n      return getLocation(true).then(coords => {\n        items.forEach(item => {\n          const distanceEl = item.querySelector('[data-distance]');\n          const distanceUnitEl = item.querySelector('[data-distance-unit]');\n          const unitSystem = distanceUnitEl.dataset.distanceUnit;\n          const itemLatitude = parseFloat(distanceEl.dataset.latitude);\n          const itemLongitude = parseFloat(distanceEl.dataset.longitude);\n\n          if (coords && isFinite(itemLatitude) && isFinite(itemLongitude)) {\n            const distance = calculateDistance(coords.latitude, coords.longitude, itemLatitude, itemLongitude, unitSystem);\n            distanceEl.innerHTML = distance.toFixed(1);\n          } else {\n            distanceEl.remove();\n            distanceUnitEl.remove();\n          }\n        });\n      }).catch(e => {\n        console.log(e);\n        items.forEach(item => {\n          const distanceEl = item.querySelector('[data-distance]');\n          const distanceUnitEl = item.querySelector('[data-distance-unit]');\n          distanceEl.remove();\n          distanceUnitEl.remove();\n        });\n      }).finally(() => {\n        calculatedDistances = true;\n      });\n    };\n\n    this.el.querySelector('[data-surface-pick-up-embed-modal-btn]').addEventListener('click', () => {\n      calculateDistances().then(() => this.callbacks.forEach(callback => callback(itemsContainer.innerHTML)));\n    });\n  }\n\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SurfacePickUp);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zdXJmYWNlLXBpY2stdXAvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zdXJmYWNlLXBpY2stdXAvZGlzdC9pbmRleC5lcy5qcz83YWU5Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IExPQ0FMX1NUT1JBR0VfS0VZID0gJ3B4dS1zaG9waWZ5LXN1cmZhY2UtcGljay11cCc7XG5jb25zdCBsb2FkaW5nQ2xhc3MgPSAnc3VyZmFjZS1waWNrLXVwLS1sb2FkaW5nJztcblxuY29uc3QgaXNOb3RFeHBpcmVkID0gdGltZXN0YW1wID0+IHRpbWVzdGFtcCArIDEwMDAgKiA2MCAqIDYwID49IERhdGUubm93KCk7XG5cbmNvbnN0IHJlbW92ZVRyYWlsaW5nU2xhc2ggPSBzID0+IHMucmVwbGFjZSgvKC4qKVxcLyQvLCAnJDEnKTsgLy8gSGF2ZXJzaW5lIERpc3RhbmNlXG4vLyBUaGUgaGF2ZXJzaW5lIGZvcm11bGEgaXMgYW4gZXF1YXRpb24gZ2l2aW5nIGdyZWF0LWNpcmNsZSBkaXN0YW5jZXMgYmV0d2VlblxuLy8gdHdvIHBvaW50cyBvbiBhIHNwaGVyZSBmcm9tIHRoZWlyIGxvbmdpdHVkZXMgYW5kIGxhdGl0dWRlc1xuXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZURpc3RhbmNlKGxhdGl0dWRlMSwgbG9uZ2l0dWRlMSwgbGF0aXR1ZGUyLCBsb25naXR1ZGUyLCB1bml0U3lzdGVtKSB7XG4gIGNvbnN0IGR0b3IgPSBNYXRoLlBJIC8gMTgwO1xuICBjb25zdCByYWRpdXMgPSB1bml0U3lzdGVtID09PSAnbWV0cmljJyA/IDYzNzguMTQgOiAzOTU5O1xuICBjb25zdCBybGF0MSA9IGxhdGl0dWRlMSAqIGR0b3I7XG4gIGNvbnN0IHJsb25nMSA9IGxvbmdpdHVkZTEgKiBkdG9yO1xuICBjb25zdCBybGF0MiA9IGxhdGl0dWRlMiAqIGR0b3I7XG4gIGNvbnN0IHJsb25nMiA9IGxvbmdpdHVkZTIgKiBkdG9yO1xuICBjb25zdCBkbG9uID0gcmxvbmcxIC0gcmxvbmcyO1xuICBjb25zdCBkbGF0ID0gcmxhdDEgLSBybGF0MjtcbiAgY29uc3QgYSA9IE1hdGguc2luKGRsYXQgLyAyKSAqKiAyICsgTWF0aC5jb3MocmxhdDEpICogTWF0aC5jb3MocmxhdDIpICogTWF0aC5zaW4oZGxvbiAvIDIpICoqIDI7XG4gIGNvbnN0IGMgPSAyICogTWF0aC5hdGFuMihNYXRoLnNxcnQoYSksIE1hdGguc3FydCgxIC0gYSkpO1xuICByZXR1cm4gcmFkaXVzICogYztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24oKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG1heGltdW1BZ2U6IDM2MDAwMDAsXG4gICAgICAvLyAxIGhvdXJcbiAgICAgIHRpbWVvdXQ6IDUwMDBcbiAgICB9O1xuXG4gICAgaWYgKG5hdmlnYXRvci5nZW9sb2NhdGlvbikge1xuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigoe1xuICAgICAgICBjb29yZHNcbiAgICAgIH0pID0+IHJlc29sdmUoY29vcmRzKSwgcmVqZWN0LCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVqZWN0KCk7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0TG9jYXRpb24oe1xuICBsYXRpdHVkZSxcbiAgbG9uZ2l0dWRlXG59KSB7XG4gIGNvbnN0IG5ld0RhdGEgPSB7XG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9O1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkobmV3RGF0YSkpO1xuICByZXR1cm4gZmV0Y2goJy9sb2NhbGl6YXRpb24uanNvbicsIHtcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlXG4gICAgfSlcbiAgfSkudGhlbigoKSA9PiAoe1xuICAgIGxhdGl0dWRlLFxuICAgIGxvbmdpdHVkZVxuICB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uKHJlcXVlc3RMb2NhdGlvbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGNhY2hlZExvY2F0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWSkpO1xuXG4gIGlmIChjYWNoZWRMb2NhdGlvbiAmJiBpc05vdEV4cGlyZWQoY2FjaGVkTG9jYXRpb24udGltZXN0YW1wKSkge1xuICAgIHJldHVybiBjYWNoZWRMb2NhdGlvbjtcbiAgfVxuXG4gIGlmIChyZXF1ZXN0TG9jYXRpb24pIHtcbiAgICByZXR1cm4gZ2V0R2VvTG9jYXRpb24oKS50aGVuKGNvb3JkcyA9PiB7XG4gICAgICBzZXRMb2NhdGlvbihjb29yZHMpOyAvLyBXZSBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIHRoaXNcblxuICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jbGFzcyBTdXJmYWNlUGlja1VwIHtcbiAgY29uc3RydWN0b3IoZWwsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgcm9vdF91cmw6IHdpbmRvdy5UaGVtZSAmJiB3aW5kb3cuVGhlbWUucm91dGVzICYmIHdpbmRvdy5UaGVtZS5yb3V0ZXMucm9vdF91cmwgfHwgJycsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbnMucm9vdF91cmwgPSByZW1vdmVUcmFpbGluZ1NsYXNoKHRoaXMub3B0aW9ucy5yb290X3VybCk7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBbXTtcbiAgICB0aGlzLm9uQnRuUHJlc3MgPSBudWxsO1xuICAgIHRoaXMubGF0ZXN0VmFyaWFudElkID0gbnVsbDtcbiAgfVxuXG4gIGxvYWQodmFyaWFudElkKSB7XG4gICAgLy8gSWYgbm8gdmFyaWFudCBpcyBhdmFpbGFibGUsIGVtcHR5IGVsZW1lbnQgYW5kIHF1aWNrLXJldHVyblxuICAgIGlmICghdmFyaWFudElkKSB7XG4gICAgICB0aGlzLmVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9IC8vIEJlY2F1c2UgU2hvcGlmeSBkb2Vzbid0IGV4cG9zZSBhbnkgYHBpY2tfdXBfZW5hYmxlZGAgZGF0YSBvbiB0aGUgc2hvcCBvYmplY3QsIHdlXG4gICAgLy8gZG9uJ3Qga25vdyBpZiB0aGUgdmFyaWFudCBtaWdodCBiZSwgb3IgaXMgZGVmaW5pdGVseSBub3QgYXZhaWxhYmxlIGZvciBwaWNrIHVwLlxuICAgIC8vIFVudGlsIHdlIGtub3cgdGhlIHNob3AgaGFzID4gMCBwaWNrIHVwIGxvY2F0aW9ucywgd2Ugd2FudCB0byBhdm9pZCBwcm9tcHRpbmcgdGhlXG4gICAgLy8gdXNlciBmb3IgbG9jYXRpb24gZGF0YSAoaXQncyBhbm5veWluZywgYW5kIG9ubHkgbWFrZXMgc2Vuc2UgdG8gZG8gaWYgd2UgdXNlIGl0KS5cbiAgICAvL1xuICAgIC8vIEluc3RlYWQsIHdlIGhhdmUgdG8gbWFrZSBhbiBpbml0aWFsIHJlcXVlc3QsIGNoZWNrIGFuZCBzZWUgaWYgYW55IHBpY2sgdXAgbG9jYXRpb25zXG4gICAgLy8gd2VyZSByZXR1cm5lZCwgdGhlbiBhc2sgZm9yIHRoZSB1c2VycyBsb2NhdGlvbiwgdGhlbiBtYWtlIGFub3RoZXIgcmVxdWVzdCB0byBnZXQgdGhlXG4gICAgLy8gbG9jYXRpb24tYXdhcmUgcGljayB1cCBsb2NhdGlvbnMuXG4gICAgLy9cbiAgICAvLyBBcyBmYXIgYXMgSSBjYW4gdGVsbCB0aGUgcGljayB1cCBhd2FyZSBsb2NhdGlvbnMgZGlmZmVyIG9ubHkgaW4gc29ydCBvcmRlciAtIHdoaWNoXG4gICAgLy8gd2UgY291bGQgZG8gb24gdGhlIGZyb250IGVuZCAtIGJ1dCB3ZSdyZSBmb2xsb3dpbmcgdGhpcyBhcHByb2FjaCB0byBlbnN1cmUgZnV0dXJlXG4gICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIGFueSBjaGFuZ2VzIFNob3BpZnkgbWFrZXMgKG1heWJlIGRpc2FibGluZyBvcHRpb25zIGJhc2VkIG9uXG4gICAgLy8gdXNlciBsb2NhdGlvbiwgb3Igd2hhdGV2ZXIgZWxzZSkuXG4gICAgLy9cbiAgICAvLyBTaG9waWZ5IGhhcyBpbmRpY2F0ZWQgdGhleSB3aWxsIGxvb2sgaW50byBhZGRpbmcgcGlja191cF9lbmFibGVkIGRhdGEgdG8gdGhlIHNob3BcbiAgICAvLyBvYmplY3QsIHdoaWNoIHdoaWNoIGNhc2UgdGhpcyBtZXRob2QgY2FuIGJlIGdyZWF0bHkgc2ltcGxpZmVkIGludG8gMiBzaW1wbGUgY2FzZXMuXG5cblxuICAgIHRoaXMubGF0ZXN0VmFyaWFudElkID0gdmFyaWFudElkO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZChsb2FkaW5nQ2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl9nZXREYXRhKHZhcmlhbnRJZCkudGhlbihkYXRhID0+IHRoaXMuX2luamVjdERhdGEoZGF0YSkpO1xuICB9XG5cbiAgb25Nb2RhbFJlcXVlc3QoY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjaykgPj0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgb2ZmTW9kYWxSZXF1ZXN0KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5jYWxsYmFja3Muc3BsaWNlKHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spKTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBfZ2V0RGF0YSh2YXJpYW50SWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RVcmwgPSBgJHt0aGlzLm9wdGlvbnMucm9vdF91cmx9L3ZhcmlhbnRzLyR7dmFyaWFudElkfS8/c2VjdGlvbl9pZD1zdXJmYWNlLXBpY2stdXBgO1xuICAgICAgeGhyLm9wZW4oJ0dFVCcsIHJlcXVlc3RVcmwsIHRydWUpO1xuXG4gICAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgY29uc3QgZW1iZWQgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1odG1sPVwic3VyZmFjZS1waWNrLXVwLWVtYmVkXCJdJyk7XG4gICAgICAgIGNvbnN0IGl0ZW1zQ29udGFpbmVyID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtaHRtbD1cInN1cmZhY2UtcGljay11cC1pdGVtc1wiXScpO1xuICAgICAgICBjb25zdCBpdGVtcyA9IGl0ZW1zQ29udGFpbmVyLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc3VyZmFjZS1waWNrLXVwLWl0ZW1dJyk7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIGVtYmVkLFxuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIHZhcmlhbnRJZFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBlbWJlZDoge1xuICAgICAgICAgICAgaW5uZXJIVE1MOiAnJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaXRlbXNDb250YWluZXI6IHtcbiAgICAgICAgICAgIGlubmVySFRNTDogJydcbiAgICAgICAgICB9LFxuICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICB2YXJpYW50SWRcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2RvY3VtZW50JztcbiAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG4gIH1cblxuICBfaW5qZWN0RGF0YSh7XG4gICAgZW1iZWQsXG4gICAgaXRlbXNDb250YWluZXIsXG4gICAgaXRlbXMsXG4gICAgdmFyaWFudElkXG4gIH0pIHtcbiAgICBpZiAodmFyaWFudElkICE9PSB0aGlzLmxhdGVzdFZhcmlhbnRJZCB8fCBpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUobG9hZGluZ0NsYXNzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVsLmlubmVySFRNTCA9IGVtYmVkLmlubmVySFRNTDtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUobG9hZGluZ0NsYXNzKTtcbiAgICBsZXQgY2FsY3VsYXRlZERpc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FsY3VsYXRlRGlzdGFuY2VzID0gKCkgPT4ge1xuICAgICAgaWYgKGNhbGN1bGF0ZWREaXN0YW5jZXMpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIHJldHVybiBnZXRMb2NhdGlvbih0cnVlKS50aGVuKGNvb3JkcyA9PiB7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VFbCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtZGlzdGFuY2VdJyk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VVbml0RWwgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3RhbmNlLXVuaXRdJyk7XG4gICAgICAgICAgY29uc3QgdW5pdFN5c3RlbSA9IGRpc3RhbmNlVW5pdEVsLmRhdGFzZXQuZGlzdGFuY2VVbml0O1xuICAgICAgICAgIGNvbnN0IGl0ZW1MYXRpdHVkZSA9IHBhcnNlRmxvYXQoZGlzdGFuY2VFbC5kYXRhc2V0LmxhdGl0dWRlKTtcbiAgICAgICAgICBjb25zdCBpdGVtTG9uZ2l0dWRlID0gcGFyc2VGbG9hdChkaXN0YW5jZUVsLmRhdGFzZXQubG9uZ2l0dWRlKTtcblxuICAgICAgICAgIGlmIChjb29yZHMgJiYgaXNGaW5pdGUoaXRlbUxhdGl0dWRlKSAmJiBpc0Zpbml0ZShpdGVtTG9uZ2l0dWRlKSkge1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBjYWxjdWxhdGVEaXN0YW5jZShjb29yZHMubGF0aXR1ZGUsIGNvb3Jkcy5sb25naXR1ZGUsIGl0ZW1MYXRpdHVkZSwgaXRlbUxvbmdpdHVkZSwgdW5pdFN5c3RlbSk7XG4gICAgICAgICAgICBkaXN0YW5jZUVsLmlubmVySFRNTCA9IGRpc3RhbmNlLnRvRml4ZWQoMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3RhbmNlRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICBkaXN0YW5jZVVuaXRFbC5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlRWwgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3RhbmNlXScpO1xuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlVW5pdEVsID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kaXN0YW5jZS11bml0XScpO1xuICAgICAgICAgIGRpc3RhbmNlRWwucmVtb3ZlKCk7XG4gICAgICAgICAgZGlzdGFuY2VVbml0RWwucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGNhbGN1bGF0ZWREaXN0YW5jZXMgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc3VyZmFjZS1waWNrLXVwLWVtYmVkLW1vZGFsLWJ0bl0nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNhbGN1bGF0ZURpc3RhbmNlcygpLnRoZW4oKCkgPT4gdGhpcy5jYWxsYmFja3MuZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayhpdGVtc0NvbnRhaW5lci5pbm5lckhUTUwpKSk7XG4gICAgfSk7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTdXJmYWNlUGlja1VwO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js\n");

/***/ }),

/***/ "./node_modules/@shopify/theme-addresses/theme-addresses.js":
/*!******************************************************************!*\
  !*** ./node_modules/@shopify/theme-addresses/theme-addresses.js ***!
  \******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CountryProvinceSelector\": () => (/* binding */ CountryProvinceSelector)\n/* harmony export */ });\n/**\n * CountryProvinceSelector Constructor\n * @param {String} countryOptions the country options in html string\n */\nfunction CountryProvinceSelector(countryOptions) {\n  if (typeof countryOptions !== 'string') {\n    throw new TypeError(countryOptions + ' is not a string.');\n  }\n  this.countryOptions = countryOptions;\n}\n\n/**\n * Builds the country and province selector with the given node element\n * @param {Node} countryNodeElement The <select> element for country\n * @param {Node} provinceNodeElement The <select> element for province\n * @param {Object} options Additional settings available\n * @param {CountryProvinceSelector~onCountryChange} options.onCountryChange callback after a country `change` event\n * @param {CountryProvinceSelector~onProvinceChange} options.onProvinceChange callback after a province `change` event\n */\nCountryProvinceSelector.prototype.build = function (countryNodeElement, provinceNodeElement, options) {\n  if (typeof countryNodeElement !== 'object') {\n    throw new TypeError(countryNodeElement + ' is not a object.');\n  }\n\n  if (typeof provinceNodeElement !== 'object') {\n    throw new TypeError(provinceNodeElement + ' is not a object.');\n  }\n\n  var defaultValue = countryNodeElement.getAttribute('data-default');\n  options = options || {}\n\n  countryNodeElement.innerHTML = this.countryOptions;\n  countryNodeElement.value = defaultValue;\n\n  if (defaultValue && getOption(countryNodeElement, defaultValue)) {\n    var provinces = buildProvince(countryNodeElement, provinceNodeElement, defaultValue);\n    options.onCountryChange && options.onCountryChange(provinces, provinceNodeElement, countryNodeElement);\n  }\n\n  // Listen for value change on the country select\n  countryNodeElement.addEventListener('change', function (event) {\n    var target = event.target;\n    var selectedValue = target.value;\n    \n    var provinces = buildProvince(target, provinceNodeElement, selectedValue);\n    options.onCountryChange && options.onCountryChange(provinces, provinceNodeElement, countryNodeElement);\n  });\n\n  options.onProvinceChange && provinceNodeElement.addEventListener('change', options.onProvinceChange);\n}\n\n/**\n * This callback is called after a user interacted with a country `<select>`\n * @callback CountryProvinceSelector~onCountryChange\n * @param {array} provinces the parsed provinces\n * @param {Node} provinceNodeElement province `<select>` element\n * @param {Node} countryNodeElement country `<select>` element\n */\n\n /**\n * This callback is called after a user interacted with a province `<select>`\n * @callback CountryProvinceSelector~onProvinceChange\n * @param {Event} event the province selector `change` event object\n */\n\n/**\n * Returns the <option> with the specified value from the\n * given node element\n * A null is returned if no such <option> is found\n */\nfunction getOption(nodeElement, value) {\n  return nodeElement.querySelector('option[value=\"' + value +'\"]')\n}\n\n/**\n * Builds the options for province selector\n */\nfunction buildOptions (provinceNodeElement, provinces) {\n  var defaultValue = provinceNodeElement.getAttribute('data-default');\n\n  provinces.forEach(function (option) {\n    var optionElement = document.createElement('option');\n    optionElement.value = option[0];\n    optionElement.textContent = option[1];\n\n    provinceNodeElement.appendChild(optionElement);\n  })\n\n  if (defaultValue && getOption(provinceNodeElement, defaultValue)) {\n    provinceNodeElement.value = defaultValue;\n  }\n}\n\n/**\n * Builds the province selector\n */\nfunction buildProvince (countryNodeElement, provinceNodeElement, selectedValue) {\n  var selectedOption = getOption(countryNodeElement, selectedValue);\n  var provinces = JSON.parse(selectedOption.getAttribute('data-provinces'));\n\n  provinceNodeElement.options.length = 0;\n\n  if (provinces.length) {\n    buildOptions(provinceNodeElement, provinces)\n  }\n\n  return provinces;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHNob3BpZnkvdGhlbWUtYWRkcmVzc2VzL3RoZW1lLWFkZHJlc3Nlcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHNob3BpZnkvdGhlbWUtYWRkcmVzc2VzL3RoZW1lLWFkZHJlc3Nlcy5qcz8xOWI1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IgQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb3VudHJ5T3B0aW9ucyB0aGUgY291bnRyeSBvcHRpb25zIGluIGh0bWwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcihjb3VudHJ5T3B0aW9ucykge1xuICBpZiAodHlwZW9mIGNvdW50cnlPcHRpb25zICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoY291bnRyeU9wdGlvbnMgKyAnIGlzIG5vdCBhIHN0cmluZy4nKTtcbiAgfVxuICB0aGlzLmNvdW50cnlPcHRpb25zID0gY291bnRyeU9wdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb3VudHJ5IGFuZCBwcm92aW5jZSBzZWxlY3RvciB3aXRoIHRoZSBnaXZlbiBub2RlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Tm9kZX0gY291bnRyeU5vZGVFbGVtZW50IFRoZSA8c2VsZWN0PiBlbGVtZW50IGZvciBjb3VudHJ5XG4gKiBAcGFyYW0ge05vZGV9IHByb3ZpbmNlTm9kZUVsZW1lbnQgVGhlIDxzZWxlY3Q+IGVsZW1lbnQgZm9yIHByb3ZpbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBZGRpdGlvbmFsIHNldHRpbmdzIGF2YWlsYWJsZVxuICogQHBhcmFtIHtDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcn5vbkNvdW50cnlDaGFuZ2V9IG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlIGNhbGxiYWNrIGFmdGVyIGEgY291bnRyeSBgY2hhbmdlYCBldmVudFxuICogQHBhcmFtIHtDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcn5vblByb3ZpbmNlQ2hhbmdlfSBvcHRpb25zLm9uUHJvdmluY2VDaGFuZ2UgY2FsbGJhY2sgYWZ0ZXIgYSBwcm92aW5jZSBgY2hhbmdlYCBldmVudFxuICovXG5Db3VudHJ5UHJvdmluY2VTZWxlY3Rvci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoY291bnRyeU5vZGVFbGVtZW50LCBwcm92aW5jZU5vZGVFbGVtZW50LCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgY291bnRyeU5vZGVFbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoY291bnRyeU5vZGVFbGVtZW50ICsgJyBpcyBub3QgYSBvYmplY3QuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByb3ZpbmNlTm9kZUVsZW1lbnQgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihwcm92aW5jZU5vZGVFbGVtZW50ICsgJyBpcyBub3QgYSBvYmplY3QuJyk7XG4gIH1cblxuICB2YXIgZGVmYXVsdFZhbHVlID0gY291bnRyeU5vZGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kZWZhdWx0Jyk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgY291bnRyeU5vZGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuY291bnRyeU9wdGlvbnM7XG4gIGNvdW50cnlOb2RlRWxlbWVudC52YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcblxuICBpZiAoZGVmYXVsdFZhbHVlICYmIGdldE9wdGlvbihjb3VudHJ5Tm9kZUVsZW1lbnQsIGRlZmF1bHRWYWx1ZSkpIHtcbiAgICB2YXIgcHJvdmluY2VzID0gYnVpbGRQcm92aW5jZShjb3VudHJ5Tm9kZUVsZW1lbnQsIHByb3ZpbmNlTm9kZUVsZW1lbnQsIGRlZmF1bHRWYWx1ZSk7XG4gICAgb3B0aW9ucy5vbkNvdW50cnlDaGFuZ2UgJiYgb3B0aW9ucy5vbkNvdW50cnlDaGFuZ2UocHJvdmluY2VzLCBwcm92aW5jZU5vZGVFbGVtZW50LCBjb3VudHJ5Tm9kZUVsZW1lbnQpO1xuICB9XG5cbiAgLy8gTGlzdGVuIGZvciB2YWx1ZSBjaGFuZ2Ugb24gdGhlIGNvdW50cnkgc2VsZWN0XG4gIGNvdW50cnlOb2RlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciBzZWxlY3RlZFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xuICAgIFxuICAgIHZhciBwcm92aW5jZXMgPSBidWlsZFByb3ZpbmNlKHRhcmdldCwgcHJvdmluY2VOb2RlRWxlbWVudCwgc2VsZWN0ZWRWYWx1ZSk7XG4gICAgb3B0aW9ucy5vbkNvdW50cnlDaGFuZ2UgJiYgb3B0aW9ucy5vbkNvdW50cnlDaGFuZ2UocHJvdmluY2VzLCBwcm92aW5jZU5vZGVFbGVtZW50LCBjb3VudHJ5Tm9kZUVsZW1lbnQpO1xuICB9KTtcblxuICBvcHRpb25zLm9uUHJvdmluY2VDaGFuZ2UgJiYgcHJvdmluY2VOb2RlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvcHRpb25zLm9uUHJvdmluY2VDaGFuZ2UpO1xufVxuXG4vKipcbiAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGFmdGVyIGEgdXNlciBpbnRlcmFjdGVkIHdpdGggYSBjb3VudHJ5IGA8c2VsZWN0PmBcbiAqIEBjYWxsYmFjayBDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcn5vbkNvdW50cnlDaGFuZ2VcbiAqIEBwYXJhbSB7YXJyYXl9IHByb3ZpbmNlcyB0aGUgcGFyc2VkIHByb3ZpbmNlc1xuICogQHBhcmFtIHtOb2RlfSBwcm92aW5jZU5vZGVFbGVtZW50IHByb3ZpbmNlIGA8c2VsZWN0PmAgZWxlbWVudFxuICogQHBhcmFtIHtOb2RlfSBjb3VudHJ5Tm9kZUVsZW1lbnQgY291bnRyeSBgPHNlbGVjdD5gIGVsZW1lbnRcbiAqL1xuXG4gLyoqXG4gKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciBhIHVzZXIgaW50ZXJhY3RlZCB3aXRoIGEgcHJvdmluY2UgYDxzZWxlY3Q+YFxuICogQGNhbGxiYWNrIENvdW50cnlQcm92aW5jZVNlbGVjdG9yfm9uUHJvdmluY2VDaGFuZ2VcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IHRoZSBwcm92aW5jZSBzZWxlY3RvciBgY2hhbmdlYCBldmVudCBvYmplY3RcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIDxvcHRpb24+IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZVxuICogZ2l2ZW4gbm9kZSBlbGVtZW50XG4gKiBBIG51bGwgaXMgcmV0dXJuZWQgaWYgbm8gc3VjaCA8b3B0aW9uPiBpcyBmb3VuZFxuICovXG5mdW5jdGlvbiBnZXRPcHRpb24obm9kZUVsZW1lbnQsIHZhbHVlKSB7XG4gIHJldHVybiBub2RlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdvcHRpb25bdmFsdWU9XCInICsgdmFsdWUgKydcIl0nKVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgb3B0aW9ucyBmb3IgcHJvdmluY2Ugc2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gYnVpbGRPcHRpb25zIChwcm92aW5jZU5vZGVFbGVtZW50LCBwcm92aW5jZXMpIHtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3ZpbmNlTm9kZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWRlZmF1bHQnKTtcblxuICBwcm92aW5jZXMuZm9yRWFjaChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgdmFyIG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gb3B0aW9uWzBdO1xuICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb25bMV07XG5cbiAgICBwcm92aW5jZU5vZGVFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvbkVsZW1lbnQpO1xuICB9KVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgJiYgZ2V0T3B0aW9uKHByb3ZpbmNlTm9kZUVsZW1lbnQsIGRlZmF1bHRWYWx1ZSkpIHtcbiAgICBwcm92aW5jZU5vZGVFbGVtZW50LnZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBwcm92aW5jZSBzZWxlY3RvclxuICovXG5mdW5jdGlvbiBidWlsZFByb3ZpbmNlIChjb3VudHJ5Tm9kZUVsZW1lbnQsIHByb3ZpbmNlTm9kZUVsZW1lbnQsIHNlbGVjdGVkVmFsdWUpIHtcbiAgdmFyIHNlbGVjdGVkT3B0aW9uID0gZ2V0T3B0aW9uKGNvdW50cnlOb2RlRWxlbWVudCwgc2VsZWN0ZWRWYWx1ZSk7XG4gIHZhciBwcm92aW5jZXMgPSBKU09OLnBhcnNlKHNlbGVjdGVkT3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS1wcm92aW5jZXMnKSk7XG5cbiAgcHJvdmluY2VOb2RlRWxlbWVudC5vcHRpb25zLmxlbmd0aCA9IDA7XG5cbiAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICBidWlsZE9wdGlvbnMocHJvdmluY2VOb2RlRWxlbWVudCwgcHJvdmluY2VzKVxuICB9XG5cbiAgcmV0dXJuIHByb3ZpbmNlcztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@shopify/theme-addresses/theme-addresses.js\n");

/***/ }),

/***/ "./node_modules/@vimeo/player/dist/player.es.js":
/*!******************************************************!*\
  !*** ./node_modules/@vimeo/player/dist/player.es.js ***!
  \******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/*! @vimeo/player v2.16.1 | (c) 2021 Vimeo | MIT License | https://github.com/vimeo/player.js */\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\n/**\n * @module lib/functions\n */\n\n/**\n * Check to see this is a node environment.\n * @type {Boolean}\n */\n\n/* global global */\nvar isNode = typeof __webpack_require__.g !== 'undefined' && {}.toString.call(__webpack_require__.g) === '[object global]';\n/**\n * Get the name of the method for a given getter or setter.\n *\n * @param {string} prop The name of the property.\n * @param {string} type Either “get” or “set”.\n * @return {string}\n */\n\nfunction getMethodName(prop, type) {\n  if (prop.indexOf(type.toLowerCase()) === 0) {\n    return prop;\n  }\n\n  return \"\".concat(type.toLowerCase()).concat(prop.substr(0, 1).toUpperCase()).concat(prop.substr(1));\n}\n/**\n * Check to see if the object is a DOM Element.\n *\n * @param {*} element The object to check.\n * @return {boolean}\n */\n\nfunction isDomElement(element) {\n  return Boolean(element && element.nodeType === 1 && 'nodeName' in element && element.ownerDocument && element.ownerDocument.defaultView);\n}\n/**\n * Check to see whether the value is a number.\n *\n * @see http://dl.dropboxusercontent.com/u/35146/js/tests/isNumber.html\n * @param {*} value The value to check.\n * @param {boolean} integer Check if the value is an integer.\n * @return {boolean}\n */\n\nfunction isInteger(value) {\n  // eslint-disable-next-line eqeqeq\n  return !isNaN(parseFloat(value)) && isFinite(value) && Math.floor(value) == value;\n}\n/**\n * Check to see if the URL is a Vimeo url.\n *\n * @param {string} url The url string.\n * @return {boolean}\n */\n\nfunction isVimeoUrl(url) {\n  return /^(https?:)?\\/\\/((player|www)\\.)?vimeo\\.com(?=$|\\/)/.test(url);\n}\n/**\n * Get the Vimeo URL from an element.\n * The element must have either a data-vimeo-id or data-vimeo-url attribute.\n *\n * @param {object} oEmbedParameters The oEmbed parameters.\n * @return {string}\n */\n\nfunction getVimeoUrl() {\n  var oEmbedParameters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var id = oEmbedParameters.id;\n  var url = oEmbedParameters.url;\n  var idOrUrl = id || url;\n\n  if (!idOrUrl) {\n    throw new Error('An id or url must be passed, either in an options object or as a data-vimeo-id or data-vimeo-url attribute.');\n  }\n\n  if (isInteger(idOrUrl)) {\n    return \"https://vimeo.com/\".concat(idOrUrl);\n  }\n\n  if (isVimeoUrl(idOrUrl)) {\n    return idOrUrl.replace('http:', 'https:');\n  }\n\n  if (id) {\n    throw new TypeError(\"\\u201C\".concat(id, \"\\u201D is not a valid video id.\"));\n  }\n\n  throw new TypeError(\"\\u201C\".concat(idOrUrl, \"\\u201D is not a vimeo.com url.\"));\n}\n\nvar arrayIndexOfSupport = typeof Array.prototype.indexOf !== 'undefined';\nvar postMessageSupport = typeof window !== 'undefined' && typeof window.postMessage !== 'undefined';\n\nif (!isNode && (!arrayIndexOfSupport || !postMessageSupport)) {\n  throw new Error('Sorry, the Vimeo Player API is not available in this browser.');\n}\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\n/*!\n * weakmap-polyfill v2.0.1 - ECMAScript6 WeakMap polyfill\n * https://github.com/polygonplanet/weakmap-polyfill\n * Copyright (c) 2015-2020 Polygon Planet <polygon.planet.aqua@gmail.com>\n * @license MIT\n */\n(function (self) {\n\n  if (self.WeakMap) {\n    return;\n  }\n\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  var defineProperty = function (object, name, value) {\n    if (Object.defineProperty) {\n      Object.defineProperty(object, name, {\n        configurable: true,\n        writable: true,\n        value: value\n      });\n    } else {\n      object[name] = value;\n    }\n  };\n\n  self.WeakMap = function () {\n    // ECMA-262 23.3 WeakMap Objects\n    function WeakMap() {\n      if (this === void 0) {\n        throw new TypeError(\"Constructor WeakMap requires 'new'\");\n      }\n\n      defineProperty(this, '_id', genId('_WeakMap')); // ECMA-262 23.3.1.1 WeakMap([iterable])\n\n      if (arguments.length > 0) {\n        // Currently, WeakMap `iterable` argument is not supported\n        throw new TypeError('WeakMap iterable is not supported');\n      }\n    } // ECMA-262 23.3.3.2 WeakMap.prototype.delete(key)\n\n\n    defineProperty(WeakMap.prototype, 'delete', function (key) {\n      checkInstance(this, 'delete');\n\n      if (!isObject(key)) {\n        return false;\n      }\n\n      var entry = key[this._id];\n\n      if (entry && entry[0] === key) {\n        delete key[this._id];\n        return true;\n      }\n\n      return false;\n    }); // ECMA-262 23.3.3.3 WeakMap.prototype.get(key)\n\n    defineProperty(WeakMap.prototype, 'get', function (key) {\n      checkInstance(this, 'get');\n\n      if (!isObject(key)) {\n        return void 0;\n      }\n\n      var entry = key[this._id];\n\n      if (entry && entry[0] === key) {\n        return entry[1];\n      }\n\n      return void 0;\n    }); // ECMA-262 23.3.3.4 WeakMap.prototype.has(key)\n\n    defineProperty(WeakMap.prototype, 'has', function (key) {\n      checkInstance(this, 'has');\n\n      if (!isObject(key)) {\n        return false;\n      }\n\n      var entry = key[this._id];\n\n      if (entry && entry[0] === key) {\n        return true;\n      }\n\n      return false;\n    }); // ECMA-262 23.3.3.5 WeakMap.prototype.set(key, value)\n\n    defineProperty(WeakMap.prototype, 'set', function (key, value) {\n      checkInstance(this, 'set');\n\n      if (!isObject(key)) {\n        throw new TypeError('Invalid value used as weak map key');\n      }\n\n      var entry = key[this._id];\n\n      if (entry && entry[0] === key) {\n        entry[1] = value;\n        return this;\n      }\n\n      defineProperty(key, this._id, [key, value]);\n      return this;\n    });\n\n    function checkInstance(x, methodName) {\n      if (!isObject(x) || !hasOwnProperty.call(x, '_id')) {\n        throw new TypeError(methodName + ' method called on incompatible receiver ' + typeof x);\n      }\n    }\n\n    function genId(prefix) {\n      return prefix + '_' + rand() + '.' + rand();\n    }\n\n    function rand() {\n      return Math.random().toString().substring(2);\n    }\n\n    defineProperty(WeakMap, '_polyfill', true);\n    return WeakMap;\n  }();\n\n  function isObject(x) {\n    return Object(x) === x;\n  }\n})(typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : commonjsGlobal);\n\nvar npo_src = createCommonjsModule(function (module) {\n/*! Native Promise Only\n    v0.8.1 (c) Kyle Simpson\n    MIT License: http://getify.mit-license.org\n*/\n(function UMD(name, context, definition) {\n  // special form of UMD for polyfilling across evironments\n  context[name] = context[name] || definition();\n\n  if ( module.exports) {\n    module.exports = context[name];\n  }\n})(\"Promise\", typeof commonjsGlobal != \"undefined\" ? commonjsGlobal : commonjsGlobal, function DEF() {\n\n  var builtInProp,\n      cycle,\n      scheduling_queue,\n      ToString = Object.prototype.toString,\n      timer = typeof setImmediate != \"undefined\" ? function timer(fn) {\n    return setImmediate(fn);\n  } : setTimeout; // dammit, IE8.\n\n  try {\n    Object.defineProperty({}, \"x\", {});\n\n    builtInProp = function builtInProp(obj, name, val, config) {\n      return Object.defineProperty(obj, name, {\n        value: val,\n        writable: true,\n        configurable: config !== false\n      });\n    };\n  } catch (err) {\n    builtInProp = function builtInProp(obj, name, val) {\n      obj[name] = val;\n      return obj;\n    };\n  } // Note: using a queue instead of array for efficiency\n\n\n  scheduling_queue = function Queue() {\n    var first, last, item;\n\n    function Item(fn, self) {\n      this.fn = fn;\n      this.self = self;\n      this.next = void 0;\n    }\n\n    return {\n      add: function add(fn, self) {\n        item = new Item(fn, self);\n\n        if (last) {\n          last.next = item;\n        } else {\n          first = item;\n        }\n\n        last = item;\n        item = void 0;\n      },\n      drain: function drain() {\n        var f = first;\n        first = last = cycle = void 0;\n\n        while (f) {\n          f.fn.call(f.self);\n          f = f.next;\n        }\n      }\n    };\n  }();\n\n  function schedule(fn, self) {\n    scheduling_queue.add(fn, self);\n\n    if (!cycle) {\n      cycle = timer(scheduling_queue.drain);\n    }\n  } // promise duck typing\n\n\n  function isThenable(o) {\n    var _then,\n        o_type = typeof o;\n\n    if (o != null && (o_type == \"object\" || o_type == \"function\")) {\n      _then = o.then;\n    }\n\n    return typeof _then == \"function\" ? _then : false;\n  }\n\n  function notify() {\n    for (var i = 0; i < this.chain.length; i++) {\n      notifyIsolated(this, this.state === 1 ? this.chain[i].success : this.chain[i].failure, this.chain[i]);\n    }\n\n    this.chain.length = 0;\n  } // NOTE: This is a separate function to isolate\n  // the `try..catch` so that other code can be\n  // optimized better\n\n\n  function notifyIsolated(self, cb, chain) {\n    var ret, _then;\n\n    try {\n      if (cb === false) {\n        chain.reject(self.msg);\n      } else {\n        if (cb === true) {\n          ret = self.msg;\n        } else {\n          ret = cb.call(void 0, self.msg);\n        }\n\n        if (ret === chain.promise) {\n          chain.reject(TypeError(\"Promise-chain cycle\"));\n        } else if (_then = isThenable(ret)) {\n          _then.call(ret, chain.resolve, chain.reject);\n        } else {\n          chain.resolve(ret);\n        }\n      }\n    } catch (err) {\n      chain.reject(err);\n    }\n  }\n\n  function resolve(msg) {\n    var _then,\n        self = this; // already triggered?\n\n\n    if (self.triggered) {\n      return;\n    }\n\n    self.triggered = true; // unwrap\n\n    if (self.def) {\n      self = self.def;\n    }\n\n    try {\n      if (_then = isThenable(msg)) {\n        schedule(function () {\n          var def_wrapper = new MakeDefWrapper(self);\n\n          try {\n            _then.call(msg, function $resolve$() {\n              resolve.apply(def_wrapper, arguments);\n            }, function $reject$() {\n              reject.apply(def_wrapper, arguments);\n            });\n          } catch (err) {\n            reject.call(def_wrapper, err);\n          }\n        });\n      } else {\n        self.msg = msg;\n        self.state = 1;\n\n        if (self.chain.length > 0) {\n          schedule(notify, self);\n        }\n      }\n    } catch (err) {\n      reject.call(new MakeDefWrapper(self), err);\n    }\n  }\n\n  function reject(msg) {\n    var self = this; // already triggered?\n\n    if (self.triggered) {\n      return;\n    }\n\n    self.triggered = true; // unwrap\n\n    if (self.def) {\n      self = self.def;\n    }\n\n    self.msg = msg;\n    self.state = 2;\n\n    if (self.chain.length > 0) {\n      schedule(notify, self);\n    }\n  }\n\n  function iteratePromises(Constructor, arr, resolver, rejecter) {\n    for (var idx = 0; idx < arr.length; idx++) {\n      (function IIFE(idx) {\n        Constructor.resolve(arr[idx]).then(function $resolver$(msg) {\n          resolver(idx, msg);\n        }, rejecter);\n      })(idx);\n    }\n  }\n\n  function MakeDefWrapper(self) {\n    this.def = self;\n    this.triggered = false;\n  }\n\n  function MakeDef(self) {\n    this.promise = self;\n    this.state = 0;\n    this.triggered = false;\n    this.chain = [];\n    this.msg = void 0;\n  }\n\n  function Promise(executor) {\n    if (typeof executor != \"function\") {\n      throw TypeError(\"Not a function\");\n    }\n\n    if (this.__NPO__ !== 0) {\n      throw TypeError(\"Not a promise\");\n    } // instance shadowing the inherited \"brand\"\n    // to signal an already \"initialized\" promise\n\n\n    this.__NPO__ = 1;\n    var def = new MakeDef(this);\n\n    this[\"then\"] = function then(success, failure) {\n      var o = {\n        success: typeof success == \"function\" ? success : true,\n        failure: typeof failure == \"function\" ? failure : false\n      }; // Note: `then(..)` itself can be borrowed to be used against\n      // a different promise constructor for making the chained promise,\n      // by substituting a different `this` binding.\n\n      o.promise = new this.constructor(function extractChain(resolve, reject) {\n        if (typeof resolve != \"function\" || typeof reject != \"function\") {\n          throw TypeError(\"Not a function\");\n        }\n\n        o.resolve = resolve;\n        o.reject = reject;\n      });\n      def.chain.push(o);\n\n      if (def.state !== 0) {\n        schedule(notify, def);\n      }\n\n      return o.promise;\n    };\n\n    this[\"catch\"] = function $catch$(failure) {\n      return this.then(void 0, failure);\n    };\n\n    try {\n      executor.call(void 0, function publicResolve(msg) {\n        resolve.call(def, msg);\n      }, function publicReject(msg) {\n        reject.call(def, msg);\n      });\n    } catch (err) {\n      reject.call(def, err);\n    }\n  }\n\n  var PromisePrototype = builtInProp({}, \"constructor\", Promise,\n  /*configurable=*/\n  false); // Note: Android 4 cannot use `Object.defineProperty(..)` here\n\n  Promise.prototype = PromisePrototype; // built-in \"brand\" to signal an \"uninitialized\" promise\n\n  builtInProp(PromisePrototype, \"__NPO__\", 0,\n  /*configurable=*/\n  false);\n  builtInProp(Promise, \"resolve\", function Promise$resolve(msg) {\n    var Constructor = this; // spec mandated checks\n    // note: best \"isPromise\" check that's practical for now\n\n    if (msg && typeof msg == \"object\" && msg.__NPO__ === 1) {\n      return msg;\n    }\n\n    return new Constructor(function executor(resolve, reject) {\n      if (typeof resolve != \"function\" || typeof reject != \"function\") {\n        throw TypeError(\"Not a function\");\n      }\n\n      resolve(msg);\n    });\n  });\n  builtInProp(Promise, \"reject\", function Promise$reject(msg) {\n    return new this(function executor(resolve, reject) {\n      if (typeof resolve != \"function\" || typeof reject != \"function\") {\n        throw TypeError(\"Not a function\");\n      }\n\n      reject(msg);\n    });\n  });\n  builtInProp(Promise, \"all\", function Promise$all(arr) {\n    var Constructor = this; // spec mandated checks\n\n    if (ToString.call(arr) != \"[object Array]\") {\n      return Constructor.reject(TypeError(\"Not an array\"));\n    }\n\n    if (arr.length === 0) {\n      return Constructor.resolve([]);\n    }\n\n    return new Constructor(function executor(resolve, reject) {\n      if (typeof resolve != \"function\" || typeof reject != \"function\") {\n        throw TypeError(\"Not a function\");\n      }\n\n      var len = arr.length,\n          msgs = Array(len),\n          count = 0;\n      iteratePromises(Constructor, arr, function resolver(idx, msg) {\n        msgs[idx] = msg;\n\n        if (++count === len) {\n          resolve(msgs);\n        }\n      }, reject);\n    });\n  });\n  builtInProp(Promise, \"race\", function Promise$race(arr) {\n    var Constructor = this; // spec mandated checks\n\n    if (ToString.call(arr) != \"[object Array]\") {\n      return Constructor.reject(TypeError(\"Not an array\"));\n    }\n\n    return new Constructor(function executor(resolve, reject) {\n      if (typeof resolve != \"function\" || typeof reject != \"function\") {\n        throw TypeError(\"Not a function\");\n      }\n\n      iteratePromises(Constructor, arr, function resolver(idx, msg) {\n        resolve(msg);\n      }, reject);\n    });\n  });\n  return Promise;\n});\n});\n\n/**\n * @module lib/callbacks\n */\nvar callbackMap = new WeakMap();\n/**\n * Store a callback for a method or event for a player.\n *\n * @param {Player} player The player object.\n * @param {string} name The method or event name.\n * @param {(function(this:Player, *): void|{resolve: function, reject: function})} callback\n *        The callback to call or an object with resolve and reject functions for a promise.\n * @return {void}\n */\n\nfunction storeCallback(player, name, callback) {\n  var playerCallbacks = callbackMap.get(player.element) || {};\n\n  if (!(name in playerCallbacks)) {\n    playerCallbacks[name] = [];\n  }\n\n  playerCallbacks[name].push(callback);\n  callbackMap.set(player.element, playerCallbacks);\n}\n/**\n * Get the callbacks for a player and event or method.\n *\n * @param {Player} player The player object.\n * @param {string} name The method or event name\n * @return {function[]}\n */\n\nfunction getCallbacks(player, name) {\n  var playerCallbacks = callbackMap.get(player.element) || {};\n  return playerCallbacks[name] || [];\n}\n/**\n * Remove a stored callback for a method or event for a player.\n *\n * @param {Player} player The player object.\n * @param {string} name The method or event name\n * @param {function} [callback] The specific callback to remove.\n * @return {boolean} Was this the last callback?\n */\n\nfunction removeCallback(player, name, callback) {\n  var playerCallbacks = callbackMap.get(player.element) || {};\n\n  if (!playerCallbacks[name]) {\n    return true;\n  } // If no callback is passed, remove all callbacks for the event\n\n\n  if (!callback) {\n    playerCallbacks[name] = [];\n    callbackMap.set(player.element, playerCallbacks);\n    return true;\n  }\n\n  var index = playerCallbacks[name].indexOf(callback);\n\n  if (index !== -1) {\n    playerCallbacks[name].splice(index, 1);\n  }\n\n  callbackMap.set(player.element, playerCallbacks);\n  return playerCallbacks[name] && playerCallbacks[name].length === 0;\n}\n/**\n * Return the first stored callback for a player and event or method.\n *\n * @param {Player} player The player object.\n * @param {string} name The method or event name.\n * @return {function} The callback, or false if there were none\n */\n\nfunction shiftCallbacks(player, name) {\n  var playerCallbacks = getCallbacks(player, name);\n\n  if (playerCallbacks.length < 1) {\n    return false;\n  }\n\n  var callback = playerCallbacks.shift();\n  removeCallback(player, name, callback);\n  return callback;\n}\n/**\n * Move callbacks associated with an element to another element.\n *\n * @param {HTMLElement} oldElement The old element.\n * @param {HTMLElement} newElement The new element.\n * @return {void}\n */\n\nfunction swapCallbacks(oldElement, newElement) {\n  var playerCallbacks = callbackMap.get(oldElement);\n  callbackMap.set(newElement, playerCallbacks);\n  callbackMap.delete(oldElement);\n}\n\n/**\n * @module lib/embed\n */\nvar oEmbedParameters = ['autopause', 'autoplay', 'background', 'byline', 'color', 'controls', 'dnt', 'height', 'id', 'keyboard', 'loop', 'maxheight', 'maxwidth', 'muted', 'playsinline', 'portrait', 'responsive', 'speed', 'texttrack', 'title', 'transparent', 'url', 'width'];\n/**\n * Get the 'data-vimeo'-prefixed attributes from an element as an object.\n *\n * @param {HTMLElement} element The element.\n * @param {Object} [defaults={}] The default values to use.\n * @return {Object<string, string>}\n */\n\nfunction getOEmbedParameters(element) {\n  var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  return oEmbedParameters.reduce(function (params, param) {\n    var value = element.getAttribute(\"data-vimeo-\".concat(param));\n\n    if (value || value === '') {\n      params[param] = value === '' ? 1 : value;\n    }\n\n    return params;\n  }, defaults);\n}\n/**\n * Create an embed from oEmbed data inside an element.\n *\n * @param {object} data The oEmbed data.\n * @param {HTMLElement} element The element to put the iframe in.\n * @return {HTMLIFrameElement} The iframe embed.\n */\n\nfunction createEmbed(_ref, element) {\n  var html = _ref.html;\n\n  if (!element) {\n    throw new TypeError('An element must be provided');\n  }\n\n  if (element.getAttribute('data-vimeo-initialized') !== null) {\n    return element.querySelector('iframe');\n  }\n\n  var div = document.createElement('div');\n  div.innerHTML = html;\n  element.appendChild(div.firstChild);\n  element.setAttribute('data-vimeo-initialized', 'true');\n  return element.querySelector('iframe');\n}\n/**\n * Make an oEmbed call for the specified URL.\n *\n * @param {string} videoUrl The vimeo.com url for the video.\n * @param {Object} [params] Parameters to pass to oEmbed.\n * @param {HTMLElement} element The element.\n * @return {Promise}\n */\n\nfunction getOEmbedData(videoUrl) {\n  var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var element = arguments.length > 2 ? arguments[2] : undefined;\n  return new Promise(function (resolve, reject) {\n    if (!isVimeoUrl(videoUrl)) {\n      throw new TypeError(\"\\u201C\".concat(videoUrl, \"\\u201D is not a vimeo.com url.\"));\n    }\n\n    var url = \"https://vimeo.com/api/oembed.json?url=\".concat(encodeURIComponent(videoUrl));\n\n    for (var param in params) {\n      if (params.hasOwnProperty(param)) {\n        url += \"&\".concat(param, \"=\").concat(encodeURIComponent(params[param]));\n      }\n    }\n\n    var xhr = 'XDomainRequest' in window ? new XDomainRequest() : new XMLHttpRequest();\n    xhr.open('GET', url, true);\n\n    xhr.onload = function () {\n      if (xhr.status === 404) {\n        reject(new Error(\"\\u201C\".concat(videoUrl, \"\\u201D was not found.\")));\n        return;\n      }\n\n      if (xhr.status === 403) {\n        reject(new Error(\"\\u201C\".concat(videoUrl, \"\\u201D is not embeddable.\")));\n        return;\n      }\n\n      try {\n        var json = JSON.parse(xhr.responseText); // Check api response for 403 on oembed\n\n        if (json.domain_status_code === 403) {\n          // We still want to create the embed to give users visual feedback\n          createEmbed(json, element);\n          reject(new Error(\"\\u201C\".concat(videoUrl, \"\\u201D is not embeddable.\")));\n          return;\n        }\n\n        resolve(json);\n      } catch (error) {\n        reject(error);\n      }\n    };\n\n    xhr.onerror = function () {\n      var status = xhr.status ? \" (\".concat(xhr.status, \")\") : '';\n      reject(new Error(\"There was an error fetching the embed code from Vimeo\".concat(status, \".\")));\n    };\n\n    xhr.send();\n  });\n}\n/**\n * Initialize all embeds within a specific element\n *\n * @param {HTMLElement} [parent=document] The parent element.\n * @return {void}\n */\n\nfunction initializeEmbeds() {\n  var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n  var elements = [].slice.call(parent.querySelectorAll('[data-vimeo-id], [data-vimeo-url]'));\n\n  var handleError = function handleError(error) {\n    if ('console' in window && console.error) {\n      console.error(\"There was an error creating an embed: \".concat(error));\n    }\n  };\n\n  elements.forEach(function (element) {\n    try {\n      // Skip any that have data-vimeo-defer\n      if (element.getAttribute('data-vimeo-defer') !== null) {\n        return;\n      }\n\n      var params = getOEmbedParameters(element);\n      var url = getVimeoUrl(params);\n      getOEmbedData(url, params, element).then(function (data) {\n        return createEmbed(data, element);\n      }).catch(handleError);\n    } catch (error) {\n      handleError(error);\n    }\n  });\n}\n/**\n * Resize embeds when messaged by the player.\n *\n * @param {HTMLElement} [parent=document] The parent element.\n * @return {void}\n */\n\nfunction resizeEmbeds() {\n  var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n\n  // Prevent execution if users include the player.js script multiple times.\n  if (window.VimeoPlayerResizeEmbeds_) {\n    return;\n  }\n\n  window.VimeoPlayerResizeEmbeds_ = true;\n\n  var onMessage = function onMessage(event) {\n    if (!isVimeoUrl(event.origin)) {\n      return;\n    } // 'spacechange' is fired only on embeds with cards\n\n\n    if (!event.data || event.data.event !== 'spacechange') {\n      return;\n    }\n\n    var iframes = parent.querySelectorAll('iframe');\n\n    for (var i = 0; i < iframes.length; i++) {\n      if (iframes[i].contentWindow !== event.source) {\n        continue;\n      } // Change padding-bottom of the enclosing div to accommodate\n      // card carousel without distorting aspect ratio\n\n\n      var space = iframes[i].parentElement;\n      space.style.paddingBottom = \"\".concat(event.data.data[0].bottom, \"px\");\n      break;\n    }\n  };\n\n  window.addEventListener('message', onMessage);\n}\n\n/**\n * @module lib/postmessage\n */\n/**\n * Parse a message received from postMessage.\n *\n * @param {*} data The data received from postMessage.\n * @return {object}\n */\n\nfunction parseMessageData(data) {\n  if (typeof data === 'string') {\n    try {\n      data = JSON.parse(data);\n    } catch (error) {\n      // If the message cannot be parsed, throw the error as a warning\n      console.warn(error);\n      return {};\n    }\n  }\n\n  return data;\n}\n/**\n * Post a message to the specified target.\n *\n * @param {Player} player The player object to use.\n * @param {string} method The API method to call.\n * @param {object} params The parameters to send to the player.\n * @return {void}\n */\n\nfunction postMessage(player, method, params) {\n  if (!player.element.contentWindow || !player.element.contentWindow.postMessage) {\n    return;\n  }\n\n  var message = {\n    method: method\n  };\n\n  if (params !== undefined) {\n    message.value = params;\n  } // IE 8 and 9 do not support passing messages, so stringify them\n\n\n  var ieVersion = parseFloat(navigator.userAgent.toLowerCase().replace(/^.*msie (\\d+).*$/, '$1'));\n\n  if (ieVersion >= 8 && ieVersion < 10) {\n    message = JSON.stringify(message);\n  }\n\n  player.element.contentWindow.postMessage(message, player.origin);\n}\n/**\n * Parse the data received from a message event.\n *\n * @param {Player} player The player that received the message.\n * @param {(Object|string)} data The message data. Strings will be parsed into JSON.\n * @return {void}\n */\n\nfunction processData(player, data) {\n  data = parseMessageData(data);\n  var callbacks = [];\n  var param;\n\n  if (data.event) {\n    if (data.event === 'error') {\n      var promises = getCallbacks(player, data.data.method);\n      promises.forEach(function (promise) {\n        var error = new Error(data.data.message);\n        error.name = data.data.name;\n        promise.reject(error);\n        removeCallback(player, data.data.method, promise);\n      });\n    }\n\n    callbacks = getCallbacks(player, \"event:\".concat(data.event));\n    param = data.data;\n  } else if (data.method) {\n    var callback = shiftCallbacks(player, data.method);\n\n    if (callback) {\n      callbacks.push(callback);\n      param = data.value;\n    }\n  }\n\n  callbacks.forEach(function (callback) {\n    try {\n      if (typeof callback === 'function') {\n        callback.call(player, param);\n        return;\n      }\n\n      callback.resolve(param);\n    } catch (e) {// empty\n    }\n  });\n}\n\n/* MIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nTerms */\nfunction initializeScreenfull() {\n  var fn = function () {\n    var val;\n    var fnMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'], // New WebKit\n    ['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'], // Old WebKit\n    ['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'], ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'], ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];\n    var i = 0;\n    var l = fnMap.length;\n    var ret = {};\n\n    for (; i < l; i++) {\n      val = fnMap[i];\n\n      if (val && val[1] in document) {\n        for (i = 0; i < val.length; i++) {\n          ret[fnMap[0][i]] = val[i];\n        }\n\n        return ret;\n      }\n    }\n\n    return false;\n  }();\n\n  var eventNameMap = {\n    fullscreenchange: fn.fullscreenchange,\n    fullscreenerror: fn.fullscreenerror\n  };\n  var screenfull = {\n    request: function request(element) {\n      return new Promise(function (resolve, reject) {\n        var onFullScreenEntered = function onFullScreenEntered() {\n          screenfull.off('fullscreenchange', onFullScreenEntered);\n          resolve();\n        };\n\n        screenfull.on('fullscreenchange', onFullScreenEntered);\n        element = element || document.documentElement;\n        var returnPromise = element[fn.requestFullscreen]();\n\n        if (returnPromise instanceof Promise) {\n          returnPromise.then(onFullScreenEntered).catch(reject);\n        }\n      });\n    },\n    exit: function exit() {\n      return new Promise(function (resolve, reject) {\n        if (!screenfull.isFullscreen) {\n          resolve();\n          return;\n        }\n\n        var onFullScreenExit = function onFullScreenExit() {\n          screenfull.off('fullscreenchange', onFullScreenExit);\n          resolve();\n        };\n\n        screenfull.on('fullscreenchange', onFullScreenExit);\n        var returnPromise = document[fn.exitFullscreen]();\n\n        if (returnPromise instanceof Promise) {\n          returnPromise.then(onFullScreenExit).catch(reject);\n        }\n      });\n    },\n    on: function on(event, callback) {\n      var eventName = eventNameMap[event];\n\n      if (eventName) {\n        document.addEventListener(eventName, callback);\n      }\n    },\n    off: function off(event, callback) {\n      var eventName = eventNameMap[event];\n\n      if (eventName) {\n        document.removeEventListener(eventName, callback);\n      }\n    }\n  };\n  Object.defineProperties(screenfull, {\n    isFullscreen: {\n      get: function get() {\n        return Boolean(document[fn.fullscreenElement]);\n      }\n    },\n    element: {\n      enumerable: true,\n      get: function get() {\n        return document[fn.fullscreenElement];\n      }\n    },\n    isEnabled: {\n      enumerable: true,\n      get: function get() {\n        // Coerce to boolean in case of old WebKit\n        return Boolean(document[fn.fullscreenEnabled]);\n      }\n    }\n  });\n  return screenfull;\n}\n\nvar playerMap = new WeakMap();\nvar readyMap = new WeakMap();\nvar screenfull = {};\n\nvar Player = /*#__PURE__*/function () {\n  /**\n   * Create a Player.\n   *\n   * @param {(HTMLIFrameElement|HTMLElement|string|jQuery)} element A reference to the Vimeo\n   *        player iframe, and id, or a jQuery object.\n   * @param {object} [options] oEmbed parameters to use when creating an embed in the element.\n   * @return {Player}\n   */\n  function Player(element) {\n    var _this = this;\n\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, Player);\n\n    /* global jQuery */\n    if (window.jQuery && element instanceof jQuery) {\n      if (element.length > 1 && window.console && console.warn) {\n        console.warn('A jQuery object with multiple elements was passed, using the first element.');\n      }\n\n      element = element[0];\n    } // Find an element by ID\n\n\n    if (typeof document !== 'undefined' && typeof element === 'string') {\n      element = document.getElementById(element);\n    } // Not an element!\n\n\n    if (!isDomElement(element)) {\n      throw new TypeError('You must pass either a valid element or a valid id.');\n    } // Already initialized an embed in this div, so grab the iframe\n\n\n    if (element.nodeName !== 'IFRAME') {\n      var iframe = element.querySelector('iframe');\n\n      if (iframe) {\n        element = iframe;\n      }\n    } // iframe url is not a Vimeo url\n\n\n    if (element.nodeName === 'IFRAME' && !isVimeoUrl(element.getAttribute('src') || '')) {\n      throw new Error('The player element passed isn’t a Vimeo embed.');\n    } // If there is already a player object in the map, return that\n\n\n    if (playerMap.has(element)) {\n      return playerMap.get(element);\n    }\n\n    this._window = element.ownerDocument.defaultView;\n    this.element = element;\n    this.origin = '*';\n    var readyPromise = new npo_src(function (resolve, reject) {\n      _this._onMessage = function (event) {\n        if (!isVimeoUrl(event.origin) || _this.element.contentWindow !== event.source) {\n          return;\n        }\n\n        if (_this.origin === '*') {\n          _this.origin = event.origin;\n        }\n\n        var data = parseMessageData(event.data);\n        var isError = data && data.event === 'error';\n        var isReadyError = isError && data.data && data.data.method === 'ready';\n\n        if (isReadyError) {\n          var error = new Error(data.data.message);\n          error.name = data.data.name;\n          reject(error);\n          return;\n        }\n\n        var isReadyEvent = data && data.event === 'ready';\n        var isPingResponse = data && data.method === 'ping';\n\n        if (isReadyEvent || isPingResponse) {\n          _this.element.setAttribute('data-ready', 'true');\n\n          resolve();\n          return;\n        }\n\n        processData(_this, data);\n      };\n\n      _this._window.addEventListener('message', _this._onMessage);\n\n      if (_this.element.nodeName !== 'IFRAME') {\n        var params = getOEmbedParameters(element, options);\n        var url = getVimeoUrl(params);\n        getOEmbedData(url, params, element).then(function (data) {\n          var iframe = createEmbed(data, element); // Overwrite element with the new iframe,\n          // but store reference to the original element\n\n          _this.element = iframe;\n          _this._originalElement = element;\n          swapCallbacks(element, iframe);\n          playerMap.set(_this.element, _this);\n          return data;\n        }).catch(reject);\n      }\n    }); // Store a copy of this Player in the map\n\n    readyMap.set(this, readyPromise);\n    playerMap.set(this.element, this); // Send a ping to the iframe so the ready promise will be resolved if\n    // the player is already ready.\n\n    if (this.element.nodeName === 'IFRAME') {\n      postMessage(this, 'ping');\n    }\n\n    if (screenfull.isEnabled) {\n      var exitFullscreen = function exitFullscreen() {\n        return screenfull.exit();\n      };\n\n      this.fullscreenchangeHandler = function () {\n        if (screenfull.isFullscreen) {\n          storeCallback(_this, 'event:exitFullscreen', exitFullscreen);\n        } else {\n          removeCallback(_this, 'event:exitFullscreen', exitFullscreen);\n        } // eslint-disable-next-line\n\n\n        _this.ready().then(function () {\n          postMessage(_this, 'fullscreenchange', screenfull.isFullscreen);\n        });\n      };\n\n      screenfull.on('fullscreenchange', this.fullscreenchangeHandler);\n    }\n\n    return this;\n  }\n  /**\n   * Get a promise for a method.\n   *\n   * @param {string} name The API method to call.\n   * @param {Object} [args={}] Arguments to send via postMessage.\n   * @return {Promise}\n   */\n\n\n  _createClass(Player, [{\n    key: \"callMethod\",\n    value: function callMethod(name) {\n      var _this2 = this;\n\n      var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      return new npo_src(function (resolve, reject) {\n        // We are storing the resolve/reject handlers to call later, so we\n        // can’t return here.\n        // eslint-disable-next-line promise/always-return\n        return _this2.ready().then(function () {\n          storeCallback(_this2, name, {\n            resolve: resolve,\n            reject: reject\n          });\n          postMessage(_this2, name, args);\n        }).catch(reject);\n      });\n    }\n    /**\n     * Get a promise for the value of a player property.\n     *\n     * @param {string} name The property name\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"get\",\n    value: function get(name) {\n      var _this3 = this;\n\n      return new npo_src(function (resolve, reject) {\n        name = getMethodName(name, 'get'); // We are storing the resolve/reject handlers to call later, so we\n        // can’t return here.\n        // eslint-disable-next-line promise/always-return\n\n        return _this3.ready().then(function () {\n          storeCallback(_this3, name, {\n            resolve: resolve,\n            reject: reject\n          });\n          postMessage(_this3, name);\n        }).catch(reject);\n      });\n    }\n    /**\n     * Get a promise for setting the value of a player property.\n     *\n     * @param {string} name The API method to call.\n     * @param {mixed} value The value to set.\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"set\",\n    value: function set(name, value) {\n      var _this4 = this;\n\n      return new npo_src(function (resolve, reject) {\n        name = getMethodName(name, 'set');\n\n        if (value === undefined || value === null) {\n          throw new TypeError('There must be a value to set.');\n        } // We are storing the resolve/reject handlers to call later, so we\n        // can’t return here.\n        // eslint-disable-next-line promise/always-return\n\n\n        return _this4.ready().then(function () {\n          storeCallback(_this4, name, {\n            resolve: resolve,\n            reject: reject\n          });\n          postMessage(_this4, name, value);\n        }).catch(reject);\n      });\n    }\n    /**\n     * Add an event listener for the specified event. Will call the\n     * callback with a single parameter, `data`, that contains the data for\n     * that event.\n     *\n     * @param {string} eventName The name of the event.\n     * @param {function(*)} callback The function to call when the event fires.\n     * @return {void}\n     */\n\n  }, {\n    key: \"on\",\n    value: function on(eventName, callback) {\n      if (!eventName) {\n        throw new TypeError('You must pass an event name.');\n      }\n\n      if (!callback) {\n        throw new TypeError('You must pass a callback function.');\n      }\n\n      if (typeof callback !== 'function') {\n        throw new TypeError('The callback must be a function.');\n      }\n\n      var callbacks = getCallbacks(this, \"event:\".concat(eventName));\n\n      if (callbacks.length === 0) {\n        this.callMethod('addEventListener', eventName).catch(function () {// Ignore the error. There will be an error event fired that\n          // will trigger the error callback if they are listening.\n        });\n      }\n\n      storeCallback(this, \"event:\".concat(eventName), callback);\n    }\n    /**\n     * Remove an event listener for the specified event. Will remove all\n     * listeners for that event if a `callback` isn’t passed, or only that\n     * specific callback if it is passed.\n     *\n     * @param {string} eventName The name of the event.\n     * @param {function} [callback] The specific callback to remove.\n     * @return {void}\n     */\n\n  }, {\n    key: \"off\",\n    value: function off(eventName, callback) {\n      if (!eventName) {\n        throw new TypeError('You must pass an event name.');\n      }\n\n      if (callback && typeof callback !== 'function') {\n        throw new TypeError('The callback must be a function.');\n      }\n\n      var lastCallback = removeCallback(this, \"event:\".concat(eventName), callback); // If there are no callbacks left, remove the listener\n\n      if (lastCallback) {\n        this.callMethod('removeEventListener', eventName).catch(function (e) {// Ignore the error. There will be an error event fired that\n          // will trigger the error callback if they are listening.\n        });\n      }\n    }\n    /**\n     * A promise to load a new video.\n     *\n     * @promise LoadVideoPromise\n     * @fulfill {number} The video with this id successfully loaded.\n     * @reject {TypeError} The id was not a number.\n     */\n\n    /**\n     * Load a new video into this embed. The promise will be resolved if\n     * the video is successfully loaded, or it will be rejected if it could\n     * not be loaded.\n     *\n     * @param {number|object} options The id of the video or an object with embed options.\n     * @return {LoadVideoPromise}\n     */\n\n  }, {\n    key: \"loadVideo\",\n    value: function loadVideo(options) {\n      return this.callMethod('loadVideo', options);\n    }\n    /**\n     * A promise to perform an action when the Player is ready.\n     *\n     * @todo document errors\n     * @promise LoadVideoPromise\n     * @fulfill {void}\n     */\n\n    /**\n     * Trigger a function when the player iframe has initialized. You do not\n     * need to wait for `ready` to trigger to begin adding event listeners\n     * or calling other methods.\n     *\n     * @return {ReadyPromise}\n     */\n\n  }, {\n    key: \"ready\",\n    value: function ready() {\n      var readyPromise = readyMap.get(this) || new npo_src(function (resolve, reject) {\n        reject(new Error('Unknown player. Probably unloaded.'));\n      });\n      return npo_src.resolve(readyPromise);\n    }\n    /**\n     * A promise to add a cue point to the player.\n     *\n     * @promise AddCuePointPromise\n     * @fulfill {string} The id of the cue point to use for removeCuePoint.\n     * @reject {RangeError} the time was less than 0 or greater than the\n     *         video’s duration.\n     * @reject {UnsupportedError} Cue points are not supported with the current\n     *         player or browser.\n     */\n\n    /**\n     * Add a cue point to the player.\n     *\n     * @param {number} time The time for the cue point.\n     * @param {object} [data] Arbitrary data to be returned with the cue point.\n     * @return {AddCuePointPromise}\n     */\n\n  }, {\n    key: \"addCuePoint\",\n    value: function addCuePoint(time) {\n      var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      return this.callMethod('addCuePoint', {\n        time: time,\n        data: data\n      });\n    }\n    /**\n     * A promise to remove a cue point from the player.\n     *\n     * @promise AddCuePointPromise\n     * @fulfill {string} The id of the cue point that was removed.\n     * @reject {InvalidCuePoint} The cue point with the specified id was not\n     *         found.\n     * @reject {UnsupportedError} Cue points are not supported with the current\n     *         player or browser.\n     */\n\n    /**\n     * Remove a cue point from the video.\n     *\n     * @param {string} id The id of the cue point to remove.\n     * @return {RemoveCuePointPromise}\n     */\n\n  }, {\n    key: \"removeCuePoint\",\n    value: function removeCuePoint(id) {\n      return this.callMethod('removeCuePoint', id);\n    }\n    /**\n     * A representation of a text track on a video.\n     *\n     * @typedef {Object} VimeoTextTrack\n     * @property {string} language The ISO language code.\n     * @property {string} kind The kind of track it is (captions or subtitles).\n     * @property {string} label The human‐readable label for the track.\n     */\n\n    /**\n     * A promise to enable a text track.\n     *\n     * @promise EnableTextTrackPromise\n     * @fulfill {VimeoTextTrack} The text track that was enabled.\n     * @reject {InvalidTrackLanguageError} No track was available with the\n     *         specified language.\n     * @reject {InvalidTrackError} No track was available with the specified\n     *         language and kind.\n     */\n\n    /**\n     * Enable the text track with the specified language, and optionally the\n     * specified kind (captions or subtitles).\n     *\n     * When set via the API, the track language will not change the viewer’s\n     * stored preference.\n     *\n     * @param {string} language The two‐letter language code.\n     * @param {string} [kind] The kind of track to enable (captions or subtitles).\n     * @return {EnableTextTrackPromise}\n     */\n\n  }, {\n    key: \"enableTextTrack\",\n    value: function enableTextTrack(language, kind) {\n      if (!language) {\n        throw new TypeError('You must pass a language.');\n      }\n\n      return this.callMethod('enableTextTrack', {\n        language: language,\n        kind: kind\n      });\n    }\n    /**\n     * A promise to disable the active text track.\n     *\n     * @promise DisableTextTrackPromise\n     * @fulfill {void} The track was disabled.\n     */\n\n    /**\n     * Disable the currently-active text track.\n     *\n     * @return {DisableTextTrackPromise}\n     */\n\n  }, {\n    key: \"disableTextTrack\",\n    value: function disableTextTrack() {\n      return this.callMethod('disableTextTrack');\n    }\n    /**\n     * A promise to pause the video.\n     *\n     * @promise PausePromise\n     * @fulfill {void} The video was paused.\n     */\n\n    /**\n     * Pause the video if it’s playing.\n     *\n     * @return {PausePromise}\n     */\n\n  }, {\n    key: \"pause\",\n    value: function pause() {\n      return this.callMethod('pause');\n    }\n    /**\n     * A promise to play the video.\n     *\n     * @promise PlayPromise\n     * @fulfill {void} The video was played.\n     */\n\n    /**\n     * Play the video if it’s paused. **Note:** on iOS and some other\n     * mobile devices, you cannot programmatically trigger play. Once the\n     * viewer has tapped on the play button in the player, however, you\n     * will be able to use this function.\n     *\n     * @return {PlayPromise}\n     */\n\n  }, {\n    key: \"play\",\n    value: function play() {\n      return this.callMethod('play');\n    }\n    /**\n     * Request that the player enters fullscreen.\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"requestFullscreen\",\n    value: function requestFullscreen() {\n      if (screenfull.isEnabled) {\n        return screenfull.request(this.element);\n      }\n\n      return this.callMethod('requestFullscreen');\n    }\n    /**\n     * Request that the player exits fullscreen.\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"exitFullscreen\",\n    value: function exitFullscreen() {\n      if (screenfull.isEnabled) {\n        return screenfull.exit();\n      }\n\n      return this.callMethod('exitFullscreen');\n    }\n    /**\n     * Returns true if the player is currently fullscreen.\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"getFullscreen\",\n    value: function getFullscreen() {\n      if (screenfull.isEnabled) {\n        return npo_src.resolve(screenfull.isFullscreen);\n      }\n\n      return this.get('fullscreen');\n    }\n    /**\n     * Request that the player enters picture-in-picture.\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"requestPictureInPicture\",\n    value: function requestPictureInPicture() {\n      return this.callMethod('requestPictureInPicture');\n    }\n    /**\n     * Request that the player exits picture-in-picture.\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"exitPictureInPicture\",\n    value: function exitPictureInPicture() {\n      return this.callMethod('exitPictureInPicture');\n    }\n    /**\n     * Returns true if the player is currently picture-in-picture.\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"getPictureInPicture\",\n    value: function getPictureInPicture() {\n      return this.get('pictureInPicture');\n    }\n    /**\n     * A promise to unload the video.\n     *\n     * @promise UnloadPromise\n     * @fulfill {void} The video was unloaded.\n     */\n\n    /**\n     * Return the player to its initial state.\n     *\n     * @return {UnloadPromise}\n     */\n\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      return this.callMethod('unload');\n    }\n    /**\n     * Cleanup the player and remove it from the DOM\n     *\n     * It won't be usable and a new one should be constructed\n     *  in order to do any operations.\n     *\n     * @return {Promise}\n     */\n\n  }, {\n    key: \"destroy\",\n    value: function destroy() {\n      var _this5 = this;\n\n      return new npo_src(function (resolve) {\n        readyMap.delete(_this5);\n        playerMap.delete(_this5.element);\n\n        if (_this5._originalElement) {\n          playerMap.delete(_this5._originalElement);\n\n          _this5._originalElement.removeAttribute('data-vimeo-initialized');\n        }\n\n        if (_this5.element && _this5.element.nodeName === 'IFRAME' && _this5.element.parentNode) {\n          // If we've added an additional wrapper div, remove that from the DOM.\n          // If not, just remove the iframe element.\n          if (_this5.element.parentNode.parentNode && _this5._originalElement && _this5._originalElement !== _this5.element.parentNode) {\n            _this5.element.parentNode.parentNode.removeChild(_this5.element.parentNode);\n          } else {\n            _this5.element.parentNode.removeChild(_this5.element);\n          }\n        } // If the clip is private there is a case where the element stays the\n        // div element. Destroy should reset the div and remove the iframe child.\n\n\n        if (_this5.element && _this5.element.nodeName === 'DIV' && _this5.element.parentNode) {\n          _this5.element.removeAttribute('data-vimeo-initialized');\n\n          var iframe = _this5.element.querySelector('iframe');\n\n          if (iframe && iframe.parentNode) {\n            // If we've added an additional wrapper div, remove that from the DOM.\n            // If not, just remove the iframe element.\n            if (iframe.parentNode.parentNode && _this5._originalElement && _this5._originalElement !== iframe.parentNode) {\n              iframe.parentNode.parentNode.removeChild(iframe.parentNode);\n            } else {\n              iframe.parentNode.removeChild(iframe);\n            }\n          }\n        }\n\n        _this5._window.removeEventListener('message', _this5._onMessage);\n\n        if (screenfull.isEnabled) {\n          screenfull.off('fullscreenchange', _this5.fullscreenchangeHandler);\n        }\n\n        resolve();\n      });\n    }\n    /**\n     * A promise to get the autopause behavior of the video.\n     *\n     * @promise GetAutopausePromise\n     * @fulfill {boolean} Whether autopause is turned on or off.\n     * @reject {UnsupportedError} Autopause is not supported with the current\n     *         player or browser.\n     */\n\n    /**\n     * Get the autopause behavior for this player.\n     *\n     * @return {GetAutopausePromise}\n     */\n\n  }, {\n    key: \"getAutopause\",\n    value: function getAutopause() {\n      return this.get('autopause');\n    }\n    /**\n     * A promise to set the autopause behavior of the video.\n     *\n     * @promise SetAutopausePromise\n     * @fulfill {boolean} Whether autopause is turned on or off.\n     * @reject {UnsupportedError} Autopause is not supported with the current\n     *         player or browser.\n     */\n\n    /**\n     * Enable or disable the autopause behavior of this player.\n     *\n     * By default, when another video is played in the same browser, this\n     * player will automatically pause. Unless you have a specific reason\n     * for doing so, we recommend that you leave autopause set to the\n     * default (`true`).\n     *\n     * @param {boolean} autopause\n     * @return {SetAutopausePromise}\n     */\n\n  }, {\n    key: \"setAutopause\",\n    value: function setAutopause(autopause) {\n      return this.set('autopause', autopause);\n    }\n    /**\n     * A promise to get the buffered property of the video.\n     *\n     * @promise GetBufferedPromise\n     * @fulfill {Array} Buffered Timeranges converted to an Array.\n     */\n\n    /**\n     * Get the buffered property of the video.\n     *\n     * @return {GetBufferedPromise}\n     */\n\n  }, {\n    key: \"getBuffered\",\n    value: function getBuffered() {\n      return this.get('buffered');\n    }\n    /**\n     * @typedef {Object} CameraProperties\n     * @prop {number} props.yaw - Number between 0 and 360.\n     * @prop {number} props.pitch - Number between -90 and 90.\n     * @prop {number} props.roll - Number between -180 and 180.\n     * @prop {number} props.fov - The field of view in degrees.\n     */\n\n    /**\n     * A promise to get the camera properties of the player.\n     *\n     * @promise GetCameraPromise\n     * @fulfill {CameraProperties} The camera properties.\n     */\n\n    /**\n     * For 360° videos get the camera properties for this player.\n     *\n     * @return {GetCameraPromise}\n     */\n\n  }, {\n    key: \"getCameraProps\",\n    value: function getCameraProps() {\n      return this.get('cameraProps');\n    }\n    /**\n     * A promise to set the camera properties of the player.\n     *\n     * @promise SetCameraPromise\n     * @fulfill {Object} The camera was successfully set.\n     * @reject {RangeError} The range was out of bounds.\n     */\n\n    /**\n     * For 360° videos set the camera properties for this player.\n     *\n     * @param {CameraProperties} camera The camera properties\n     * @return {SetCameraPromise}\n     */\n\n  }, {\n    key: \"setCameraProps\",\n    value: function setCameraProps(camera) {\n      return this.set('cameraProps', camera);\n    }\n    /**\n     * A representation of a chapter.\n     *\n     * @typedef {Object} VimeoChapter\n     * @property {number} startTime The start time of the chapter.\n     * @property {object} title The title of the chapter.\n     * @property {number} index The place in the order of Chapters. Starts at 1.\n     */\n\n    /**\n     * A promise to get chapters for the video.\n     *\n     * @promise GetChaptersPromise\n     * @fulfill {VimeoChapter[]} The chapters for the video.\n     */\n\n    /**\n     * Get an array of all the chapters for the video.\n     *\n     * @return {GetChaptersPromise}\n     */\n\n  }, {\n    key: \"getChapters\",\n    value: function getChapters() {\n      return this.get('chapters');\n    }\n    /**\n     * A promise to get the currently active chapter.\n     *\n     * @promise GetCurrentChaptersPromise\n     * @fulfill {VimeoChapter|undefined} The current chapter for the video.\n     */\n\n    /**\n     * Get the currently active chapter for the video.\n     *\n     * @return {GetCurrentChaptersPromise}\n     */\n\n  }, {\n    key: \"getCurrentChapter\",\n    value: function getCurrentChapter() {\n      return this.get('currentChapter');\n    }\n    /**\n     * A promise to get the color of the player.\n     *\n     * @promise GetColorPromise\n     * @fulfill {string} The hex color of the player.\n     */\n\n    /**\n     * Get the color for this player.\n     *\n     * @return {GetColorPromise}\n     */\n\n  }, {\n    key: \"getColor\",\n    value: function getColor() {\n      return this.get('color');\n    }\n    /**\n     * A promise to set the color of the player.\n     *\n     * @promise SetColorPromise\n     * @fulfill {string} The color was successfully set.\n     * @reject {TypeError} The string was not a valid hex or rgb color.\n     * @reject {ContrastError} The color was set, but the contrast is\n     *         outside of the acceptable range.\n     * @reject {EmbedSettingsError} The owner of the player has chosen to\n     *         use a specific color.\n     */\n\n    /**\n     * Set the color of this player to a hex or rgb string. Setting the\n     * color may fail if the owner of the video has set their embed\n     * preferences to force a specific color.\n     *\n     * @param {string} color The hex or rgb color string to set.\n     * @return {SetColorPromise}\n     */\n\n  }, {\n    key: \"setColor\",\n    value: function setColor(color) {\n      return this.set('color', color);\n    }\n    /**\n     * A representation of a cue point.\n     *\n     * @typedef {Object} VimeoCuePoint\n     * @property {number} time The time of the cue point.\n     * @property {object} data The data passed when adding the cue point.\n     * @property {string} id The unique id for use with removeCuePoint.\n     */\n\n    /**\n     * A promise to get the cue points of a video.\n     *\n     * @promise GetCuePointsPromise\n     * @fulfill {VimeoCuePoint[]} The cue points added to the video.\n     * @reject {UnsupportedError} Cue points are not supported with the current\n     *         player or browser.\n     */\n\n    /**\n     * Get an array of the cue points added to the video.\n     *\n     * @return {GetCuePointsPromise}\n     */\n\n  }, {\n    key: \"getCuePoints\",\n    value: function getCuePoints() {\n      return this.get('cuePoints');\n    }\n    /**\n     * A promise to get the current time of the video.\n     *\n     * @promise GetCurrentTimePromise\n     * @fulfill {number} The current time in seconds.\n     */\n\n    /**\n     * Get the current playback position in seconds.\n     *\n     * @return {GetCurrentTimePromise}\n     */\n\n  }, {\n    key: \"getCurrentTime\",\n    value: function getCurrentTime() {\n      return this.get('currentTime');\n    }\n    /**\n     * A promise to set the current time of the video.\n     *\n     * @promise SetCurrentTimePromise\n     * @fulfill {number} The actual current time that was set.\n     * @reject {RangeError} the time was less than 0 or greater than the\n     *         video’s duration.\n     */\n\n    /**\n     * Set the current playback position in seconds. If the player was\n     * paused, it will remain paused. Likewise, if the player was playing,\n     * it will resume playing once the video has buffered.\n     *\n     * You can provide an accurate time and the player will attempt to seek\n     * to as close to that time as possible. The exact time will be the\n     * fulfilled value of the promise.\n     *\n     * @param {number} currentTime\n     * @return {SetCurrentTimePromise}\n     */\n\n  }, {\n    key: \"setCurrentTime\",\n    value: function setCurrentTime(currentTime) {\n      return this.set('currentTime', currentTime);\n    }\n    /**\n     * A promise to get the duration of the video.\n     *\n     * @promise GetDurationPromise\n     * @fulfill {number} The duration in seconds.\n     */\n\n    /**\n     * Get the duration of the video in seconds. It will be rounded to the\n     * nearest second before playback begins, and to the nearest thousandth\n     * of a second after playback begins.\n     *\n     * @return {GetDurationPromise}\n     */\n\n  }, {\n    key: \"getDuration\",\n    value: function getDuration() {\n      return this.get('duration');\n    }\n    /**\n     * A promise to get the ended state of the video.\n     *\n     * @promise GetEndedPromise\n     * @fulfill {boolean} Whether or not the video has ended.\n     */\n\n    /**\n     * Get the ended state of the video. The video has ended if\n     * `currentTime === duration`.\n     *\n     * @return {GetEndedPromise}\n     */\n\n  }, {\n    key: \"getEnded\",\n    value: function getEnded() {\n      return this.get('ended');\n    }\n    /**\n     * A promise to get the loop state of the player.\n     *\n     * @promise GetLoopPromise\n     * @fulfill {boolean} Whether or not the player is set to loop.\n     */\n\n    /**\n     * Get the loop state of the player.\n     *\n     * @return {GetLoopPromise}\n     */\n\n  }, {\n    key: \"getLoop\",\n    value: function getLoop() {\n      return this.get('loop');\n    }\n    /**\n     * A promise to set the loop state of the player.\n     *\n     * @promise SetLoopPromise\n     * @fulfill {boolean} The loop state that was set.\n     */\n\n    /**\n     * Set the loop state of the player. When set to `true`, the player\n     * will start over immediately once playback ends.\n     *\n     * @param {boolean} loop\n     * @return {SetLoopPromise}\n     */\n\n  }, {\n    key: \"setLoop\",\n    value: function setLoop(loop) {\n      return this.set('loop', loop);\n    }\n    /**\n     * A promise to set the muted state of the player.\n     *\n     * @promise SetMutedPromise\n     * @fulfill {boolean} The muted state that was set.\n     */\n\n    /**\n     * Set the muted state of the player. When set to `true`, the player\n     * volume will be muted.\n     *\n     * @param {boolean} muted\n     * @return {SetMutedPromise}\n     */\n\n  }, {\n    key: \"setMuted\",\n    value: function setMuted(muted) {\n      return this.set('muted', muted);\n    }\n    /**\n     * A promise to get the muted state of the player.\n     *\n     * @promise GetMutedPromise\n     * @fulfill {boolean} Whether or not the player is muted.\n     */\n\n    /**\n     * Get the muted state of the player.\n     *\n     * @return {GetMutedPromise}\n     */\n\n  }, {\n    key: \"getMuted\",\n    value: function getMuted() {\n      return this.get('muted');\n    }\n    /**\n     * A promise to get the paused state of the player.\n     *\n     * @promise GetLoopPromise\n     * @fulfill {boolean} Whether or not the video is paused.\n     */\n\n    /**\n     * Get the paused state of the player.\n     *\n     * @return {GetLoopPromise}\n     */\n\n  }, {\n    key: \"getPaused\",\n    value: function getPaused() {\n      return this.get('paused');\n    }\n    /**\n     * A promise to get the playback rate of the player.\n     *\n     * @promise GetPlaybackRatePromise\n     * @fulfill {number} The playback rate of the player on a scale from 0.5 to 2.\n     */\n\n    /**\n     * Get the playback rate of the player on a scale from `0.5` to `2`.\n     *\n     * @return {GetPlaybackRatePromise}\n     */\n\n  }, {\n    key: \"getPlaybackRate\",\n    value: function getPlaybackRate() {\n      return this.get('playbackRate');\n    }\n    /**\n     * A promise to set the playbackrate of the player.\n     *\n     * @promise SetPlaybackRatePromise\n     * @fulfill {number} The playback rate was set.\n     * @reject {RangeError} The playback rate was less than 0.5 or greater than 2.\n     */\n\n    /**\n     * Set the playback rate of the player on a scale from `0.5` to `2`. When set\n     * via the API, the playback rate will not be synchronized to other\n     * players or stored as the viewer's preference.\n     *\n     * @param {number} playbackRate\n     * @return {SetPlaybackRatePromise}\n     */\n\n  }, {\n    key: \"setPlaybackRate\",\n    value: function setPlaybackRate(playbackRate) {\n      return this.set('playbackRate', playbackRate);\n    }\n    /**\n     * A promise to get the played property of the video.\n     *\n     * @promise GetPlayedPromise\n     * @fulfill {Array} Played Timeranges converted to an Array.\n     */\n\n    /**\n     * Get the played property of the video.\n     *\n     * @return {GetPlayedPromise}\n     */\n\n  }, {\n    key: \"getPlayed\",\n    value: function getPlayed() {\n      return this.get('played');\n    }\n    /**\n     * A promise to get the qualities available of the current video.\n     *\n     * @promise GetQualitiesPromise\n     * @fulfill {Array} The qualities of the video.\n     */\n\n    /**\n     * Get the qualities of the current video.\n     *\n     * @return {GetQualitiesPromise}\n     */\n\n  }, {\n    key: \"getQualities\",\n    value: function getQualities() {\n      return this.get('qualities');\n    }\n    /**\n     * A promise to get the current set quality of the video.\n     *\n     * @promise GetQualityPromise\n     * @fulfill {string} The current set quality.\n     */\n\n    /**\n     * Get the current set quality of the video.\n     *\n     * @return {GetQualityPromise}\n     */\n\n  }, {\n    key: \"getQuality\",\n    value: function getQuality() {\n      return this.get('quality');\n    }\n    /**\n     * A promise to set the video quality.\n     *\n     * @promise SetQualityPromise\n     * @fulfill {number} The quality was set.\n     * @reject {RangeError} The quality is not available.\n     */\n\n    /**\n     * Set a video quality.\n     *\n     * @param {string} quality\n     * @return {SetQualityPromise}\n     */\n\n  }, {\n    key: \"setQuality\",\n    value: function setQuality(quality) {\n      return this.set('quality', quality);\n    }\n    /**\n     * A promise to get the seekable property of the video.\n     *\n     * @promise GetSeekablePromise\n     * @fulfill {Array} Seekable Timeranges converted to an Array.\n     */\n\n    /**\n     * Get the seekable property of the video.\n     *\n     * @return {GetSeekablePromise}\n     */\n\n  }, {\n    key: \"getSeekable\",\n    value: function getSeekable() {\n      return this.get('seekable');\n    }\n    /**\n     * A promise to get the seeking property of the player.\n     *\n     * @promise GetSeekingPromise\n     * @fulfill {boolean} Whether or not the player is currently seeking.\n     */\n\n    /**\n     * Get if the player is currently seeking.\n     *\n     * @return {GetSeekingPromise}\n     */\n\n  }, {\n    key: \"getSeeking\",\n    value: function getSeeking() {\n      return this.get('seeking');\n    }\n    /**\n     * A promise to get the text tracks of a video.\n     *\n     * @promise GetTextTracksPromise\n     * @fulfill {VimeoTextTrack[]} The text tracks associated with the video.\n     */\n\n    /**\n     * Get an array of the text tracks that exist for the video.\n     *\n     * @return {GetTextTracksPromise}\n     */\n\n  }, {\n    key: \"getTextTracks\",\n    value: function getTextTracks() {\n      return this.get('textTracks');\n    }\n    /**\n     * A promise to get the embed code for the video.\n     *\n     * @promise GetVideoEmbedCodePromise\n     * @fulfill {string} The `<iframe>` embed code for the video.\n     */\n\n    /**\n     * Get the `<iframe>` embed code for the video.\n     *\n     * @return {GetVideoEmbedCodePromise}\n     */\n\n  }, {\n    key: \"getVideoEmbedCode\",\n    value: function getVideoEmbedCode() {\n      return this.get('videoEmbedCode');\n    }\n    /**\n     * A promise to get the id of the video.\n     *\n     * @promise GetVideoIdPromise\n     * @fulfill {number} The id of the video.\n     */\n\n    /**\n     * Get the id of the video.\n     *\n     * @return {GetVideoIdPromise}\n     */\n\n  }, {\n    key: \"getVideoId\",\n    value: function getVideoId() {\n      return this.get('videoId');\n    }\n    /**\n     * A promise to get the title of the video.\n     *\n     * @promise GetVideoTitlePromise\n     * @fulfill {number} The title of the video.\n     */\n\n    /**\n     * Get the title of the video.\n     *\n     * @return {GetVideoTitlePromise}\n     */\n\n  }, {\n    key: \"getVideoTitle\",\n    value: function getVideoTitle() {\n      return this.get('videoTitle');\n    }\n    /**\n     * A promise to get the native width of the video.\n     *\n     * @promise GetVideoWidthPromise\n     * @fulfill {number} The native width of the video.\n     */\n\n    /**\n     * Get the native width of the currently‐playing video. The width of\n     * the highest‐resolution available will be used before playback begins.\n     *\n     * @return {GetVideoWidthPromise}\n     */\n\n  }, {\n    key: \"getVideoWidth\",\n    value: function getVideoWidth() {\n      return this.get('videoWidth');\n    }\n    /**\n     * A promise to get the native height of the video.\n     *\n     * @promise GetVideoHeightPromise\n     * @fulfill {number} The native height of the video.\n     */\n\n    /**\n     * Get the native height of the currently‐playing video. The height of\n     * the highest‐resolution available will be used before playback begins.\n     *\n     * @return {GetVideoHeightPromise}\n     */\n\n  }, {\n    key: \"getVideoHeight\",\n    value: function getVideoHeight() {\n      return this.get('videoHeight');\n    }\n    /**\n     * A promise to get the vimeo.com url for the video.\n     *\n     * @promise GetVideoUrlPromise\n     * @fulfill {number} The vimeo.com url for the video.\n     * @reject {PrivacyError} The url isn’t available because of the video’s privacy setting.\n     */\n\n    /**\n     * Get the vimeo.com url for the video.\n     *\n     * @return {GetVideoUrlPromise}\n     */\n\n  }, {\n    key: \"getVideoUrl\",\n    value: function getVideoUrl() {\n      return this.get('videoUrl');\n    }\n    /**\n     * A promise to get the volume level of the player.\n     *\n     * @promise GetVolumePromise\n     * @fulfill {number} The volume level of the player on a scale from 0 to 1.\n     */\n\n    /**\n     * Get the current volume level of the player on a scale from `0` to `1`.\n     *\n     * Most mobile devices do not support an independent volume from the\n     * system volume. In those cases, this method will always return `1`.\n     *\n     * @return {GetVolumePromise}\n     */\n\n  }, {\n    key: \"getVolume\",\n    value: function getVolume() {\n      return this.get('volume');\n    }\n    /**\n     * A promise to set the volume level of the player.\n     *\n     * @promise SetVolumePromise\n     * @fulfill {number} The volume was set.\n     * @reject {RangeError} The volume was less than 0 or greater than 1.\n     */\n\n    /**\n     * Set the volume of the player on a scale from `0` to `1`. When set\n     * via the API, the volume level will not be synchronized to other\n     * players or stored as the viewer’s preference.\n     *\n     * Most mobile devices do not support setting the volume. An error will\n     * *not* be triggered in that situation.\n     *\n     * @param {number} volume\n     * @return {SetVolumePromise}\n     */\n\n  }, {\n    key: \"setVolume\",\n    value: function setVolume(volume) {\n      return this.set('volume', volume);\n    }\n  }]);\n\n  return Player;\n}(); // Setup embed only if this is not a node environment\n\n\nif (!isNode) {\n  screenfull = initializeScreenfull();\n  initializeEmbeds();\n  resizeEmbeds();\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Player);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHZpbWVvL3BsYXllci9kaXN0L3BsYXllci5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvQHZpbWVvL3BsYXllci9kaXN0L3BsYXllci5lcy5qcz84NGM5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qISBAdmltZW8vcGxheWVyIHYyLjE2LjEgfCAoYykgMjAyMSBWaW1lbyB8IE1JVCBMaWNlbnNlIHwgaHR0cHM6Ly9naXRodWIuY29tL3ZpbWVvL3BsYXllci5qcyAqL1xuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIEBtb2R1bGUgbGliL2Z1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIHRoaXMgaXMgYSBub2RlIGVudmlyb25tZW50LlxuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cblxuLyogZ2xvYmFsIGdsb2JhbCAqL1xudmFyIGlzTm9kZSA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsKSA9PT0gJ1tvYmplY3QgZ2xvYmFsXSc7XG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGZvciBhIGdpdmVuIGdldHRlciBvciBzZXR0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWl0aGVyIOKAnGdldOKAnSBvciDigJxzZXTigJ0uXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZ2V0TWV0aG9kTmFtZShwcm9wLCB0eXBlKSB7XG4gIGlmIChwcm9wLmluZGV4T2YodHlwZS50b0xvd2VyQ2FzZSgpKSA9PT0gMCkge1xuICAgIHJldHVybiBwcm9wO1xuICB9XG5cbiAgcmV0dXJuIFwiXCIuY29uY2F0KHR5cGUudG9Mb3dlckNhc2UoKSkuY29uY2F0KHByb3Auc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkpLmNvbmNhdChwcm9wLnN1YnN0cigxKSk7XG59XG4vKipcbiAqIENoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0IGlzIGEgRE9NIEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmZ1bmN0aW9uIGlzRG9tRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBCb29sZWFuKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiAnbm9kZU5hbWUnIGluIGVsZW1lbnQgJiYgZWxlbWVudC5vd25lckRvY3VtZW50ICYmIGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyk7XG59XG4vKipcbiAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBhIG51bWJlci5cbiAqXG4gKiBAc2VlIGh0dHA6Ly9kbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tL3UvMzUxNDYvanMvdGVzdHMvaXNOdW1iZXIuaHRtbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGludGVnZXIgQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PSB2YWx1ZTtcbn1cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBVUkwgaXMgYSBWaW1lbyB1cmwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgdXJsIHN0cmluZy5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuZnVuY3Rpb24gaXNWaW1lb1VybCh1cmwpIHtcbiAgcmV0dXJuIC9eKGh0dHBzPzopP1xcL1xcLygocGxheWVyfHd3dylcXC4pP3ZpbWVvXFwuY29tKD89JHxcXC8pLy50ZXN0KHVybCk7XG59XG4vKipcbiAqIEdldCB0aGUgVmltZW8gVVJMIGZyb20gYW4gZWxlbWVudC5cbiAqIFRoZSBlbGVtZW50IG11c3QgaGF2ZSBlaXRoZXIgYSBkYXRhLXZpbWVvLWlkIG9yIGRhdGEtdmltZW8tdXJsIGF0dHJpYnV0ZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb0VtYmVkUGFyYW1ldGVycyBUaGUgb0VtYmVkIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZ2V0VmltZW9VcmwoKSB7XG4gIHZhciBvRW1iZWRQYXJhbWV0ZXJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgdmFyIGlkID0gb0VtYmVkUGFyYW1ldGVycy5pZDtcbiAgdmFyIHVybCA9IG9FbWJlZFBhcmFtZXRlcnMudXJsO1xuICB2YXIgaWRPclVybCA9IGlkIHx8IHVybDtcblxuICBpZiAoIWlkT3JVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGlkIG9yIHVybCBtdXN0IGJlIHBhc3NlZCwgZWl0aGVyIGluIGFuIG9wdGlvbnMgb2JqZWN0IG9yIGFzIGEgZGF0YS12aW1lby1pZCBvciBkYXRhLXZpbWVvLXVybCBhdHRyaWJ1dGUuJyk7XG4gIH1cblxuICBpZiAoaXNJbnRlZ2VyKGlkT3JVcmwpKSB7XG4gICAgcmV0dXJuIFwiaHR0cHM6Ly92aW1lby5jb20vXCIuY29uY2F0KGlkT3JVcmwpO1xuICB9XG5cbiAgaWYgKGlzVmltZW9VcmwoaWRPclVybCkpIHtcbiAgICByZXR1cm4gaWRPclVybC5yZXBsYWNlKCdodHRwOicsICdodHRwczonKTtcbiAgfVxuXG4gIGlmIChpZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJcXHUyMDFDXCIuY29uY2F0KGlkLCBcIlxcdTIwMUQgaXMgbm90IGEgdmFsaWQgdmlkZW8gaWQuXCIpKTtcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJcXHUyMDFDXCIuY29uY2F0KGlkT3JVcmwsIFwiXFx1MjAxRCBpcyBub3QgYSB2aW1lby5jb20gdXJsLlwiKSk7XG59XG5cbnZhciBhcnJheUluZGV4T2ZTdXBwb3J0ID0gdHlwZW9mIEFycmF5LnByb3RvdHlwZS5pbmRleE9mICE9PSAndW5kZWZpbmVkJztcbnZhciBwb3N0TWVzc2FnZVN1cHBvcnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LnBvc3RNZXNzYWdlICE9PSAndW5kZWZpbmVkJztcblxuaWYgKCFpc05vZGUgJiYgKCFhcnJheUluZGV4T2ZTdXBwb3J0IHx8ICFwb3N0TWVzc2FnZVN1cHBvcnQpKSB7XG4gIHRocm93IG5ldyBFcnJvcignU29ycnksIHRoZSBWaW1lbyBQbGF5ZXIgQVBJIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBicm93c2VyLicpO1xufVxuXG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4sIG1vZHVsZSkge1xuXHRyZXR1cm4gbW9kdWxlID0geyBleHBvcnRzOiB7fSB9LCBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8qIVxuICogd2Vha21hcC1wb2x5ZmlsbCB2Mi4wLjEgLSBFQ01BU2NyaXB0NiBXZWFrTWFwIHBvbHlmaWxsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcG9seWdvbnBsYW5ldC93ZWFrbWFwLXBvbHlmaWxsXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBQb2x5Z29uIFBsYW5ldCA8cG9seWdvbi5wbGFuZXQuYXF1YUBnbWFpbC5jb20+XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuKGZ1bmN0aW9uIChzZWxmKSB7XG5cbiAgaWYgKHNlbGYuV2Vha01hcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdFtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfTtcblxuICBzZWxmLldlYWtNYXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gRUNNQS0yNjIgMjMuMyBXZWFrTWFwIE9iamVjdHNcbiAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgaWYgKHRoaXMgPT09IHZvaWQgMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ29uc3RydWN0b3IgV2Vha01hcCByZXF1aXJlcyAnbmV3J1wiKTtcbiAgICAgIH1cblxuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ19pZCcsIGdlbklkKCdfV2Vha01hcCcpKTsgLy8gRUNNQS0yNjIgMjMuMy4xLjEgV2Vha01hcChbaXRlcmFibGVdKVxuXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQ3VycmVudGx5LCBXZWFrTWFwIGBpdGVyYWJsZWAgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXZWFrTWFwIGl0ZXJhYmxlIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIH1cbiAgICB9IC8vIEVDTUEtMjYyIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG5cblxuICAgIGRlZmluZVByb3BlcnR5KFdlYWtNYXAucHJvdG90eXBlLCAnZGVsZXRlJywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgY2hlY2tJbnN0YW5jZSh0aGlzLCAnZGVsZXRlJyk7XG5cbiAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9pZF07XG5cbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIGRlbGV0ZSBrZXlbdGhpcy5faWRdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pOyAvLyBFQ01BLTI2MiAyMy4zLjMuMyBXZWFrTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuXG4gICAgZGVmaW5lUHJvcGVydHkoV2Vha01hcC5wcm90b3R5cGUsICdnZXQnLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBjaGVja0luc3RhbmNlKHRoaXMsICdnZXQnKTtcblxuICAgICAgaWYgKCFpc09iamVjdChrZXkpKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9pZF07XG5cbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBlbnRyeVsxXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9KTsgLy8gRUNNQS0yNjIgMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcblxuICAgIGRlZmluZVByb3BlcnR5KFdlYWtNYXAucHJvdG90eXBlLCAnaGFzJywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgY2hlY2tJbnN0YW5jZSh0aGlzLCAnaGFzJyk7XG5cbiAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9pZF07XG5cbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7IC8vIEVDTUEtMjYyIDIzLjMuMy41IFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuXG4gICAgZGVmaW5lUHJvcGVydHkoV2Vha01hcC5wcm90b3R5cGUsICdzZXQnLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgY2hlY2tJbnN0YW5jZSh0aGlzLCAnc2V0Jyk7XG5cbiAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHZhbHVlIHVzZWQgYXMgd2VhayBtYXAga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLl9pZF07XG5cbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeVswXSA9PT0ga2V5KSB7XG4gICAgICAgIGVudHJ5WzFdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBkZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX2lkLCBba2V5LCB2YWx1ZV0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjaGVja0luc3RhbmNlKHgsIG1ldGhvZE5hbWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QoeCkgfHwgIWhhc093blByb3BlcnR5LmNhbGwoeCwgJ19pZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobWV0aG9kTmFtZSArICcgbWV0aG9kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXIgJyArIHR5cGVvZiB4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5JZChwcmVmaXgpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyAnXycgKyByYW5kKCkgKyAnLicgKyByYW5kKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmFuZCgpIHtcbiAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpO1xuICAgIH1cblxuICAgIGRlZmluZVByb3BlcnR5KFdlYWtNYXAsICdfcG9seWZpbGwnLCB0cnVlKTtcbiAgICByZXR1cm4gV2Vha01hcDtcbiAgfSgpO1xuXG4gIGZ1bmN0aW9uIGlzT2JqZWN0KHgpIHtcbiAgICByZXR1cm4gT2JqZWN0KHgpID09PSB4O1xuICB9XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgY29tbW9uanNHbG9iYWwgIT09ICd1bmRlZmluZWQnID8gY29tbW9uanNHbG9iYWwgOiBjb21tb25qc0dsb2JhbCk7XG5cbnZhciBucG9fc3JjID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLyohIE5hdGl2ZSBQcm9taXNlIE9ubHlcbiAgICB2MC44LjEgKGMpIEt5bGUgU2ltcHNvblxuICAgIE1JVCBMaWNlbnNlOiBodHRwOi8vZ2V0aWZ5Lm1pdC1saWNlbnNlLm9yZ1xuKi9cbihmdW5jdGlvbiBVTUQobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICAvLyBzcGVjaWFsIGZvcm0gb2YgVU1EIGZvciBwb2x5ZmlsbGluZyBhY3Jvc3MgZXZpcm9ubWVudHNcbiAgY29udGV4dFtuYW1lXSA9IGNvbnRleHRbbmFtZV0gfHwgZGVmaW5pdGlvbigpO1xuXG4gIGlmICggbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGNvbnRleHRbbmFtZV07XG4gIH1cbn0pKFwiUHJvbWlzZVwiLCB0eXBlb2YgY29tbW9uanNHbG9iYWwgIT0gXCJ1bmRlZmluZWRcIiA/IGNvbW1vbmpzR2xvYmFsIDogY29tbW9uanNHbG9iYWwsIGZ1bmN0aW9uIERFRigpIHtcblxuICB2YXIgYnVpbHRJblByb3AsXG4gICAgICBjeWNsZSxcbiAgICAgIHNjaGVkdWxpbmdfcXVldWUsXG4gICAgICBUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgICB0aW1lciA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT0gXCJ1bmRlZmluZWRcIiA/IGZ1bmN0aW9uIHRpbWVyKGZuKSB7XG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZShmbik7XG4gIH0gOiBzZXRUaW1lb3V0OyAvLyBkYW1taXQsIElFOC5cblxuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgXCJ4XCIsIHt9KTtcblxuICAgIGJ1aWx0SW5Qcm9wID0gZnVuY3Rpb24gYnVpbHRJblByb3Aob2JqLCBuYW1lLCB2YWwsIGNvbmZpZykge1xuICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIHtcbiAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogY29uZmlnICE9PSBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYnVpbHRJblByb3AgPSBmdW5jdGlvbiBidWlsdEluUHJvcChvYmosIG5hbWUsIHZhbCkge1xuICAgICAgb2JqW25hbWVdID0gdmFsO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICB9IC8vIE5vdGU6IHVzaW5nIGEgcXVldWUgaW5zdGVhZCBvZiBhcnJheSBmb3IgZWZmaWNpZW5jeVxuXG5cbiAgc2NoZWR1bGluZ19xdWV1ZSA9IGZ1bmN0aW9uIFF1ZXVlKCkge1xuICAgIHZhciBmaXJzdCwgbGFzdCwgaXRlbTtcblxuICAgIGZ1bmN0aW9uIEl0ZW0oZm4sIHNlbGYpIHtcbiAgICAgIHRoaXMuZm4gPSBmbjtcbiAgICAgIHRoaXMuc2VsZiA9IHNlbGY7XG4gICAgICB0aGlzLm5leHQgPSB2b2lkIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKGZuLCBzZWxmKSB7XG4gICAgICAgIGl0ZW0gPSBuZXcgSXRlbShmbiwgc2VsZik7XG5cbiAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICBsYXN0Lm5leHQgPSBpdGVtO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpcnN0ID0gaXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3QgPSBpdGVtO1xuICAgICAgICBpdGVtID0gdm9pZCAwO1xuICAgICAgfSxcbiAgICAgIGRyYWluOiBmdW5jdGlvbiBkcmFpbigpIHtcbiAgICAgICAgdmFyIGYgPSBmaXJzdDtcbiAgICAgICAgZmlyc3QgPSBsYXN0ID0gY3ljbGUgPSB2b2lkIDA7XG5cbiAgICAgICAgd2hpbGUgKGYpIHtcbiAgICAgICAgICBmLmZuLmNhbGwoZi5zZWxmKTtcbiAgICAgICAgICBmID0gZi5uZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSgpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGZuLCBzZWxmKSB7XG4gICAgc2NoZWR1bGluZ19xdWV1ZS5hZGQoZm4sIHNlbGYpO1xuXG4gICAgaWYgKCFjeWNsZSkge1xuICAgICAgY3ljbGUgPSB0aW1lcihzY2hlZHVsaW5nX3F1ZXVlLmRyYWluKTtcbiAgICB9XG4gIH0gLy8gcHJvbWlzZSBkdWNrIHR5cGluZ1xuXG5cbiAgZnVuY3Rpb24gaXNUaGVuYWJsZShvKSB7XG4gICAgdmFyIF90aGVuLFxuICAgICAgICBvX3R5cGUgPSB0eXBlb2YgbztcblxuICAgIGlmIChvICE9IG51bGwgJiYgKG9fdHlwZSA9PSBcIm9iamVjdFwiIHx8IG9fdHlwZSA9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICBfdGhlbiA9IG8udGhlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIF90aGVuID09IFwiZnVuY3Rpb25cIiA/IF90aGVuIDogZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoYWluLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub3RpZnlJc29sYXRlZCh0aGlzLCB0aGlzLnN0YXRlID09PSAxID8gdGhpcy5jaGFpbltpXS5zdWNjZXNzIDogdGhpcy5jaGFpbltpXS5mYWlsdXJlLCB0aGlzLmNoYWluW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYWluLmxlbmd0aCA9IDA7XG4gIH0gLy8gTk9URTogVGhpcyBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGlzb2xhdGVcbiAgLy8gdGhlIGB0cnkuLmNhdGNoYCBzbyB0aGF0IG90aGVyIGNvZGUgY2FuIGJlXG4gIC8vIG9wdGltaXplZCBiZXR0ZXJcblxuXG4gIGZ1bmN0aW9uIG5vdGlmeUlzb2xhdGVkKHNlbGYsIGNiLCBjaGFpbikge1xuICAgIHZhciByZXQsIF90aGVuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjYiA9PT0gZmFsc2UpIHtcbiAgICAgICAgY2hhaW4ucmVqZWN0KHNlbGYubXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjYiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldCA9IHNlbGYubXNnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGNiLmNhbGwodm9pZCAwLCBzZWxmLm1zZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0ID09PSBjaGFpbi5wcm9taXNlKSB7XG4gICAgICAgICAgY2hhaW4ucmVqZWN0KFR5cGVFcnJvcihcIlByb21pc2UtY2hhaW4gY3ljbGVcIikpO1xuICAgICAgICB9IGVsc2UgaWYgKF90aGVuID0gaXNUaGVuYWJsZShyZXQpKSB7XG4gICAgICAgICAgX3RoZW4uY2FsbChyZXQsIGNoYWluLnJlc29sdmUsIGNoYWluLnJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhaW4ucmVzb2x2ZShyZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjaGFpbi5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlKG1zZykge1xuICAgIHZhciBfdGhlbixcbiAgICAgICAgc2VsZiA9IHRoaXM7IC8vIGFscmVhZHkgdHJpZ2dlcmVkP1xuXG5cbiAgICBpZiAoc2VsZi50cmlnZ2VyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLnRyaWdnZXJlZCA9IHRydWU7IC8vIHVud3JhcFxuXG4gICAgaWYgKHNlbGYuZGVmKSB7XG4gICAgICBzZWxmID0gc2VsZi5kZWY7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChfdGhlbiA9IGlzVGhlbmFibGUobXNnKSkge1xuICAgICAgICBzY2hlZHVsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGRlZl93cmFwcGVyID0gbmV3IE1ha2VEZWZXcmFwcGVyKHNlbGYpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF90aGVuLmNhbGwobXNnLCBmdW5jdGlvbiAkcmVzb2x2ZSQoKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUuYXBwbHkoZGVmX3dyYXBwZXIsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAkcmVqZWN0JCgpIHtcbiAgICAgICAgICAgICAgcmVqZWN0LmFwcGx5KGRlZl93cmFwcGVyLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QuY2FsbChkZWZfd3JhcHBlciwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5tc2cgPSBtc2c7XG4gICAgICAgIHNlbGYuc3RhdGUgPSAxO1xuXG4gICAgICAgIGlmIChzZWxmLmNoYWluLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzY2hlZHVsZShub3RpZnksIHNlbGYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZWplY3QuY2FsbChuZXcgTWFrZURlZldyYXBwZXIoc2VsZiksIGVycik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0KG1zZykge1xuICAgIHZhciBzZWxmID0gdGhpczsgLy8gYWxyZWFkeSB0cmlnZ2VyZWQ/XG5cbiAgICBpZiAoc2VsZi50cmlnZ2VyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLnRyaWdnZXJlZCA9IHRydWU7IC8vIHVud3JhcFxuXG4gICAgaWYgKHNlbGYuZGVmKSB7XG4gICAgICBzZWxmID0gc2VsZi5kZWY7XG4gICAgfVxuXG4gICAgc2VsZi5tc2cgPSBtc2c7XG4gICAgc2VsZi5zdGF0ZSA9IDI7XG5cbiAgICBpZiAoc2VsZi5jaGFpbi5sZW5ndGggPiAwKSB7XG4gICAgICBzY2hlZHVsZShub3RpZnksIHNlbGYpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGl0ZXJhdGVQcm9taXNlcyhDb25zdHJ1Y3RvciwgYXJyLCByZXNvbHZlciwgcmVqZWN0ZXIpIHtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhcnIubGVuZ3RoOyBpZHgrKykge1xuICAgICAgKGZ1bmN0aW9uIElJRkUoaWR4KSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnJlc29sdmUoYXJyW2lkeF0pLnRoZW4oZnVuY3Rpb24gJHJlc29sdmVyJChtc2cpIHtcbiAgICAgICAgICByZXNvbHZlcihpZHgsIG1zZyk7XG4gICAgICAgIH0sIHJlamVjdGVyKTtcbiAgICAgIH0pKGlkeCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gTWFrZURlZldyYXBwZXIoc2VsZikge1xuICAgIHRoaXMuZGVmID0gc2VsZjtcbiAgICB0aGlzLnRyaWdnZXJlZCA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gTWFrZURlZihzZWxmKSB7XG4gICAgdGhpcy5wcm9taXNlID0gc2VsZjtcbiAgICB0aGlzLnN0YXRlID0gMDtcbiAgICB0aGlzLnRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2hhaW4gPSBbXTtcbiAgICB0aGlzLm1zZyA9IHZvaWQgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiTm90IGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX19OUE9fXyAhPT0gMCkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiTm90IGEgcHJvbWlzZVwiKTtcbiAgICB9IC8vIGluc3RhbmNlIHNoYWRvd2luZyB0aGUgaW5oZXJpdGVkIFwiYnJhbmRcIlxuICAgIC8vIHRvIHNpZ25hbCBhbiBhbHJlYWR5IFwiaW5pdGlhbGl6ZWRcIiBwcm9taXNlXG5cblxuICAgIHRoaXMuX19OUE9fXyA9IDE7XG4gICAgdmFyIGRlZiA9IG5ldyBNYWtlRGVmKHRoaXMpO1xuXG4gICAgdGhpc1tcInRoZW5cIl0gPSBmdW5jdGlvbiB0aGVuKHN1Y2Nlc3MsIGZhaWx1cmUpIHtcbiAgICAgIHZhciBvID0ge1xuICAgICAgICBzdWNjZXNzOiB0eXBlb2Ygc3VjY2VzcyA9PSBcImZ1bmN0aW9uXCIgPyBzdWNjZXNzIDogdHJ1ZSxcbiAgICAgICAgZmFpbHVyZTogdHlwZW9mIGZhaWx1cmUgPT0gXCJmdW5jdGlvblwiID8gZmFpbHVyZSA6IGZhbHNlXG4gICAgICB9OyAvLyBOb3RlOiBgdGhlbiguLilgIGl0c2VsZiBjYW4gYmUgYm9ycm93ZWQgdG8gYmUgdXNlZCBhZ2FpbnN0XG4gICAgICAvLyBhIGRpZmZlcmVudCBwcm9taXNlIGNvbnN0cnVjdG9yIGZvciBtYWtpbmcgdGhlIGNoYWluZWQgcHJvbWlzZSxcbiAgICAgIC8vIGJ5IHN1YnN0aXR1dGluZyBhIGRpZmZlcmVudCBgdGhpc2AgYmluZGluZy5cblxuICAgICAgby5wcm9taXNlID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZnVuY3Rpb24gZXh0cmFjdENoYWluKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiTm90IGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBvLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICBvLnJlamVjdCA9IHJlamVjdDtcbiAgICAgIH0pO1xuICAgICAgZGVmLmNoYWluLnB1c2gobyk7XG5cbiAgICAgIGlmIChkZWYuc3RhdGUgIT09IDApIHtcbiAgICAgICAgc2NoZWR1bGUobm90aWZ5LCBkZWYpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gby5wcm9taXNlO1xuICAgIH07XG5cbiAgICB0aGlzW1wiY2F0Y2hcIl0gPSBmdW5jdGlvbiAkY2F0Y2gkKGZhaWx1cmUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBmYWlsdXJlKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yLmNhbGwodm9pZCAwLCBmdW5jdGlvbiBwdWJsaWNSZXNvbHZlKG1zZykge1xuICAgICAgICByZXNvbHZlLmNhbGwoZGVmLCBtc2cpO1xuICAgICAgfSwgZnVuY3Rpb24gcHVibGljUmVqZWN0KG1zZykge1xuICAgICAgICByZWplY3QuY2FsbChkZWYsIG1zZyk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlamVjdC5jYWxsKGRlZiwgZXJyKTtcbiAgICB9XG4gIH1cblxuICB2YXIgUHJvbWlzZVByb3RvdHlwZSA9IGJ1aWx0SW5Qcm9wKHt9LCBcImNvbnN0cnVjdG9yXCIsIFByb21pc2UsXG4gIC8qY29uZmlndXJhYmxlPSovXG4gIGZhbHNlKTsgLy8gTm90ZTogQW5kcm9pZCA0IGNhbm5vdCB1c2UgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSguLilgIGhlcmVcblxuICBQcm9taXNlLnByb3RvdHlwZSA9IFByb21pc2VQcm90b3R5cGU7IC8vIGJ1aWx0LWluIFwiYnJhbmRcIiB0byBzaWduYWwgYW4gXCJ1bmluaXRpYWxpemVkXCIgcHJvbWlzZVxuXG4gIGJ1aWx0SW5Qcm9wKFByb21pc2VQcm90b3R5cGUsIFwiX19OUE9fX1wiLCAwLFxuICAvKmNvbmZpZ3VyYWJsZT0qL1xuICBmYWxzZSk7XG4gIGJ1aWx0SW5Qcm9wKFByb21pc2UsIFwicmVzb2x2ZVwiLCBmdW5jdGlvbiBQcm9taXNlJHJlc29sdmUobXNnKSB7XG4gICAgdmFyIENvbnN0cnVjdG9yID0gdGhpczsgLy8gc3BlYyBtYW5kYXRlZCBjaGVja3NcbiAgICAvLyBub3RlOiBiZXN0IFwiaXNQcm9taXNlXCIgY2hlY2sgdGhhdCdzIHByYWN0aWNhbCBmb3Igbm93XG5cbiAgICBpZiAobXNnICYmIHR5cGVvZiBtc2cgPT0gXCJvYmplY3RcIiAmJiBtc2cuX19OUE9fXyA9PT0gMSkge1xuICAgICAgcmV0dXJuIG1zZztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcmVqZWN0ICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZShtc2cpO1xuICAgIH0pO1xuICB9KTtcbiAgYnVpbHRJblByb3AoUHJvbWlzZSwgXCJyZWplY3RcIiwgZnVuY3Rpb24gUHJvbWlzZSRyZWplY3QobXNnKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcmVqZWN0ICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG1zZyk7XG4gICAgfSk7XG4gIH0pO1xuICBidWlsdEluUHJvcChQcm9taXNlLCBcImFsbFwiLCBmdW5jdGlvbiBQcm9taXNlJGFsbChhcnIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzOyAvLyBzcGVjIG1hbmRhdGVkIGNoZWNrc1xuXG4gICAgaWYgKFRvU3RyaW5nLmNhbGwoYXJyKSAhPSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgIHJldHVybiBDb25zdHJ1Y3Rvci5yZWplY3QoVHlwZUVycm9yKFwiTm90IGFuIGFycmF5XCIpKTtcbiAgICB9XG5cbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIENvbnN0cnVjdG9yLnJlc29sdmUoW10pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcihcIk5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGVuID0gYXJyLmxlbmd0aCxcbiAgICAgICAgICBtc2dzID0gQXJyYXkobGVuKSxcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICBpdGVyYXRlUHJvbWlzZXMoQ29uc3RydWN0b3IsIGFyciwgZnVuY3Rpb24gcmVzb2x2ZXIoaWR4LCBtc2cpIHtcbiAgICAgICAgbXNnc1tpZHhdID0gbXNnO1xuXG4gICAgICAgIGlmICgrK2NvdW50ID09PSBsZW4pIHtcbiAgICAgICAgICByZXNvbHZlKG1zZ3MpO1xuICAgICAgICB9XG4gICAgICB9LCByZWplY3QpO1xuICAgIH0pO1xuICB9KTtcbiAgYnVpbHRJblByb3AoUHJvbWlzZSwgXCJyYWNlXCIsIGZ1bmN0aW9uIFByb21pc2UkcmFjZShhcnIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzOyAvLyBzcGVjIG1hbmRhdGVkIGNoZWNrc1xuXG4gICAgaWYgKFRvU3RyaW5nLmNhbGwoYXJyKSAhPSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgIHJldHVybiBDb25zdHJ1Y3Rvci5yZWplY3QoVHlwZUVycm9yKFwiTm90IGFuIGFycmF5XCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcmVqZWN0ICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgaXRlcmF0ZVByb21pc2VzKENvbnN0cnVjdG9yLCBhcnIsIGZ1bmN0aW9uIHJlc29sdmVyKGlkeCwgbXNnKSB7XG4gICAgICAgIHJlc29sdmUobXNnKTtcbiAgICAgIH0sIHJlamVjdCk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gUHJvbWlzZTtcbn0pO1xufSk7XG5cbi8qKlxuICogQG1vZHVsZSBsaWIvY2FsbGJhY2tzXG4gKi9cbnZhciBjYWxsYmFja01hcCA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIFN0b3JlIGEgY2FsbGJhY2sgZm9yIGEgbWV0aG9kIG9yIGV2ZW50IGZvciBhIHBsYXllci5cbiAqXG4gKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG1ldGhvZCBvciBldmVudCBuYW1lLlxuICogQHBhcmFtIHsoZnVuY3Rpb24odGhpczpQbGF5ZXIsICopOiB2b2lkfHtyZXNvbHZlOiBmdW5jdGlvbiwgcmVqZWN0OiBmdW5jdGlvbn0pfSBjYWxsYmFja1xuICogICAgICAgIFRoZSBjYWxsYmFjayB0byBjYWxsIG9yIGFuIG9iamVjdCB3aXRoIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnMgZm9yIGEgcHJvbWlzZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cblxuZnVuY3Rpb24gc3RvcmVDYWxsYmFjayhwbGF5ZXIsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIHZhciBwbGF5ZXJDYWxsYmFja3MgPSBjYWxsYmFja01hcC5nZXQocGxheWVyLmVsZW1lbnQpIHx8IHt9O1xuXG4gIGlmICghKG5hbWUgaW4gcGxheWVyQ2FsbGJhY2tzKSkge1xuICAgIHBsYXllckNhbGxiYWNrc1tuYW1lXSA9IFtdO1xuICB9XG5cbiAgcGxheWVyQ2FsbGJhY2tzW25hbWVdLnB1c2goY2FsbGJhY2spO1xuICBjYWxsYmFja01hcC5zZXQocGxheWVyLmVsZW1lbnQsIHBsYXllckNhbGxiYWNrcyk7XG59XG4vKipcbiAqIEdldCB0aGUgY2FsbGJhY2tzIGZvciBhIHBsYXllciBhbmQgZXZlbnQgb3IgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbWV0aG9kIG9yIGV2ZW50IG5hbWVcbiAqIEByZXR1cm4ge2Z1bmN0aW9uW119XG4gKi9cblxuZnVuY3Rpb24gZ2V0Q2FsbGJhY2tzKHBsYXllciwgbmFtZSkge1xuICB2YXIgcGxheWVyQ2FsbGJhY2tzID0gY2FsbGJhY2tNYXAuZ2V0KHBsYXllci5lbGVtZW50KSB8fCB7fTtcbiAgcmV0dXJuIHBsYXllckNhbGxiYWNrc1tuYW1lXSB8fCBbXTtcbn1cbi8qKlxuICogUmVtb3ZlIGEgc3RvcmVkIGNhbGxiYWNrIGZvciBhIG1ldGhvZCBvciBldmVudCBmb3IgYSBwbGF5ZXIuXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBtZXRob2Qgb3IgZXZlbnQgbmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgc3BlY2lmaWMgY2FsbGJhY2sgdG8gcmVtb3ZlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gV2FzIHRoaXMgdGhlIGxhc3QgY2FsbGJhY2s/XG4gKi9cblxuZnVuY3Rpb24gcmVtb3ZlQ2FsbGJhY2socGxheWVyLCBuYW1lLCBjYWxsYmFjaykge1xuICB2YXIgcGxheWVyQ2FsbGJhY2tzID0gY2FsbGJhY2tNYXAuZ2V0KHBsYXllci5lbGVtZW50KSB8fCB7fTtcblxuICBpZiAoIXBsYXllckNhbGxiYWNrc1tuYW1lXSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZCwgcmVtb3ZlIGFsbCBjYWxsYmFja3MgZm9yIHRoZSBldmVudFxuXG5cbiAgaWYgKCFjYWxsYmFjaykge1xuICAgIHBsYXllckNhbGxiYWNrc1tuYW1lXSA9IFtdO1xuICAgIGNhbGxiYWNrTWFwLnNldChwbGF5ZXIuZWxlbWVudCwgcGxheWVyQ2FsbGJhY2tzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBpbmRleCA9IHBsYXllckNhbGxiYWNrc1tuYW1lXS5pbmRleE9mKGNhbGxiYWNrKTtcblxuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgcGxheWVyQ2FsbGJhY2tzW25hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICBjYWxsYmFja01hcC5zZXQocGxheWVyLmVsZW1lbnQsIHBsYXllckNhbGxiYWNrcyk7XG4gIHJldHVybiBwbGF5ZXJDYWxsYmFja3NbbmFtZV0gJiYgcGxheWVyQ2FsbGJhY2tzW25hbWVdLmxlbmd0aCA9PT0gMDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBmaXJzdCBzdG9yZWQgY2FsbGJhY2sgZm9yIGEgcGxheWVyIGFuZCBldmVudCBvciBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBtZXRob2Qgb3IgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgY2FsbGJhY2ssIG9yIGZhbHNlIGlmIHRoZXJlIHdlcmUgbm9uZVxuICovXG5cbmZ1bmN0aW9uIHNoaWZ0Q2FsbGJhY2tzKHBsYXllciwgbmFtZSkge1xuICB2YXIgcGxheWVyQ2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKHBsYXllciwgbmFtZSk7XG5cbiAgaWYgKHBsYXllckNhbGxiYWNrcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGNhbGxiYWNrID0gcGxheWVyQ2FsbGJhY2tzLnNoaWZ0KCk7XG4gIHJlbW92ZUNhbGxiYWNrKHBsYXllciwgbmFtZSwgY2FsbGJhY2spO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG4vKipcbiAqIE1vdmUgY2FsbGJhY2tzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IHRvIGFub3RoZXIgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBvbGRFbGVtZW50IFRoZSBvbGQgZWxlbWVudC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5ld0VsZW1lbnQgVGhlIG5ldyBlbGVtZW50LlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiBzd2FwQ2FsbGJhY2tzKG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQpIHtcbiAgdmFyIHBsYXllckNhbGxiYWNrcyA9IGNhbGxiYWNrTWFwLmdldChvbGRFbGVtZW50KTtcbiAgY2FsbGJhY2tNYXAuc2V0KG5ld0VsZW1lbnQsIHBsYXllckNhbGxiYWNrcyk7XG4gIGNhbGxiYWNrTWFwLmRlbGV0ZShvbGRFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBAbW9kdWxlIGxpYi9lbWJlZFxuICovXG52YXIgb0VtYmVkUGFyYW1ldGVycyA9IFsnYXV0b3BhdXNlJywgJ2F1dG9wbGF5JywgJ2JhY2tncm91bmQnLCAnYnlsaW5lJywgJ2NvbG9yJywgJ2NvbnRyb2xzJywgJ2RudCcsICdoZWlnaHQnLCAnaWQnLCAna2V5Ym9hcmQnLCAnbG9vcCcsICdtYXhoZWlnaHQnLCAnbWF4d2lkdGgnLCAnbXV0ZWQnLCAncGxheXNpbmxpbmUnLCAncG9ydHJhaXQnLCAncmVzcG9uc2l2ZScsICdzcGVlZCcsICd0ZXh0dHJhY2snLCAndGl0bGUnLCAndHJhbnNwYXJlbnQnLCAndXJsJywgJ3dpZHRoJ107XG4vKipcbiAqIEdldCB0aGUgJ2RhdGEtdmltZW8nLXByZWZpeGVkIGF0dHJpYnV0ZXMgZnJvbSBhbiBlbGVtZW50IGFzIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50LlxuICogQHBhcmFtIHtPYmplY3R9IFtkZWZhdWx0cz17fV0gVGhlIGRlZmF1bHQgdmFsdWVzIHRvIHVzZS5cbiAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsIHN0cmluZz59XG4gKi9cblxuZnVuY3Rpb24gZ2V0T0VtYmVkUGFyYW1ldGVycyhlbGVtZW50KSB7XG4gIHZhciBkZWZhdWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHJldHVybiBvRW1iZWRQYXJhbWV0ZXJzLnJlZHVjZShmdW5jdGlvbiAocGFyYW1zLCBwYXJhbSkge1xuICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS12aW1lby1cIi5jb25jYXQocGFyYW0pKTtcblxuICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHBhcmFtc1twYXJhbV0gPSB2YWx1ZSA9PT0gJycgPyAxIDogdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfSwgZGVmYXVsdHMpO1xufVxuLyoqXG4gKiBDcmVhdGUgYW4gZW1iZWQgZnJvbSBvRW1iZWQgZGF0YSBpbnNpZGUgYW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgb0VtYmVkIGRhdGEuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHB1dCB0aGUgaWZyYW1lIGluLlxuICogQHJldHVybiB7SFRNTElGcmFtZUVsZW1lbnR9IFRoZSBpZnJhbWUgZW1iZWQuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRW1iZWQoX3JlZiwgZWxlbWVudCkge1xuICB2YXIgaHRtbCA9IF9yZWYuaHRtbDtcblxuICBpZiAoIWVsZW1lbnQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbiBlbGVtZW50IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS12aW1lby1pbml0aWFsaXplZCcpICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG4gIH1cblxuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICBlbGVtZW50LmFwcGVuZENoaWxkKGRpdi5maXJzdENoaWxkKTtcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdmltZW8taW5pdGlhbGl6ZWQnLCAndHJ1ZScpO1xuICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcbn1cbi8qKlxuICogTWFrZSBhbiBvRW1iZWQgY2FsbCBmb3IgdGhlIHNwZWNpZmllZCBVUkwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZpZGVvVXJsIFRoZSB2aW1lby5jb20gdXJsIGZvciB0aGUgdmlkZW8uXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gUGFyYW1ldGVycyB0byBwYXNzIHRvIG9FbWJlZC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQuXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5cbmZ1bmN0aW9uIGdldE9FbWJlZERhdGEodmlkZW9VcmwpIHtcbiAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBlbGVtZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgaWYgKCFpc1ZpbWVvVXJsKHZpZGVvVXJsKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlxcdTIwMUNcIi5jb25jYXQodmlkZW9VcmwsIFwiXFx1MjAxRCBpcyBub3QgYSB2aW1lby5jb20gdXJsLlwiKSk7XG4gICAgfVxuXG4gICAgdmFyIHVybCA9IFwiaHR0cHM6Ly92aW1lby5jb20vYXBpL29lbWJlZC5qc29uP3VybD1cIi5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHZpZGVvVXJsKSk7XG5cbiAgICBmb3IgKHZhciBwYXJhbSBpbiBwYXJhbXMpIHtcbiAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW0pKSB7XG4gICAgICAgIHVybCArPSBcIiZcIi5jb25jYXQocGFyYW0sIFwiPVwiKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1twYXJhbV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgeGhyID0gJ1hEb21haW5SZXF1ZXN0JyBpbiB3aW5kb3cgPyBuZXcgWERvbWFpblJlcXVlc3QoKSA6IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlxcdTIwMUNcIi5jb25jYXQodmlkZW9VcmwsIFwiXFx1MjAxRCB3YXMgbm90IGZvdW5kLlwiKSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlxcdTIwMUNcIi5jb25jYXQodmlkZW9VcmwsIFwiXFx1MjAxRCBpcyBub3QgZW1iZWRkYWJsZS5cIikpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7IC8vIENoZWNrIGFwaSByZXNwb25zZSBmb3IgNDAzIG9uIG9lbWJlZFxuXG4gICAgICAgIGlmIChqc29uLmRvbWFpbl9zdGF0dXNfY29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgd2FudCB0byBjcmVhdGUgdGhlIGVtYmVkIHRvIGdpdmUgdXNlcnMgdmlzdWFsIGZlZWRiYWNrXG4gICAgICAgICAgY3JlYXRlRW1iZWQoanNvbiwgZWxlbWVudCk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlxcdTIwMUNcIi5jb25jYXQodmlkZW9VcmwsIFwiXFx1MjAxRCBpcyBub3QgZW1iZWRkYWJsZS5cIikpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKGpzb24pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cyA/IFwiIChcIi5jb25jYXQoeGhyLnN0YXR1cywgXCIpXCIpIDogJyc7XG4gICAgICByZWplY3QobmV3IEVycm9yKFwiVGhlcmUgd2FzIGFuIGVycm9yIGZldGNoaW5nIHRoZSBlbWJlZCBjb2RlIGZyb20gVmltZW9cIi5jb25jYXQoc3RhdHVzLCBcIi5cIikpKTtcbiAgICB9O1xuXG4gICAgeGhyLnNlbmQoKTtcbiAgfSk7XG59XG4vKipcbiAqIEluaXRpYWxpemUgYWxsIGVtYmVkcyB3aXRoaW4gYSBzcGVjaWZpYyBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3BhcmVudD1kb2N1bWVudF0gVGhlIHBhcmVudCBlbGVtZW50LlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiBpbml0aWFsaXplRW1iZWRzKCkge1xuICB2YXIgcGFyZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBkb2N1bWVudDtcbiAgdmFyIGVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChwYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdmltZW8taWRdLCBbZGF0YS12aW1lby11cmxdJykpO1xuXG4gIHZhciBoYW5kbGVFcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgaWYgKCdjb25zb2xlJyBpbiB3aW5kb3cgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlRoZXJlIHdhcyBhbiBlcnJvciBjcmVhdGluZyBhbiBlbWJlZDogXCIuY29uY2F0KGVycm9yKSk7XG4gICAgfVxuICB9O1xuXG4gIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgLy8gU2tpcCBhbnkgdGhhdCBoYXZlIGRhdGEtdmltZW8tZGVmZXJcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS12aW1lby1kZWZlcicpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmFtcyA9IGdldE9FbWJlZFBhcmFtZXRlcnMoZWxlbWVudCk7XG4gICAgICB2YXIgdXJsID0gZ2V0VmltZW9VcmwocGFyYW1zKTtcbiAgICAgIGdldE9FbWJlZERhdGEodXJsLCBwYXJhbXMsIGVsZW1lbnQpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVtYmVkKGRhdGEsIGVsZW1lbnQpO1xuICAgICAgfSkuY2F0Y2goaGFuZGxlRXJyb3IpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBoYW5kbGVFcnJvcihlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogUmVzaXplIGVtYmVkcyB3aGVuIG1lc3NhZ2VkIGJ5IHRoZSBwbGF5ZXIuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3BhcmVudD1kb2N1bWVudF0gVGhlIHBhcmVudCBlbGVtZW50LlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiByZXNpemVFbWJlZHMoKSB7XG4gIHZhciBwYXJlbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGRvY3VtZW50O1xuXG4gIC8vIFByZXZlbnQgZXhlY3V0aW9uIGlmIHVzZXJzIGluY2x1ZGUgdGhlIHBsYXllci5qcyBzY3JpcHQgbXVsdGlwbGUgdGltZXMuXG4gIGlmICh3aW5kb3cuVmltZW9QbGF5ZXJSZXNpemVFbWJlZHNfKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2luZG93LlZpbWVvUGxheWVyUmVzaXplRW1iZWRzXyA9IHRydWU7XG5cbiAgdmFyIG9uTWVzc2FnZSA9IGZ1bmN0aW9uIG9uTWVzc2FnZShldmVudCkge1xuICAgIGlmICghaXNWaW1lb1VybChldmVudC5vcmlnaW4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyAnc3BhY2VjaGFuZ2UnIGlzIGZpcmVkIG9ubHkgb24gZW1iZWRzIHdpdGggY2FyZHNcblxuXG4gICAgaWYgKCFldmVudC5kYXRhIHx8IGV2ZW50LmRhdGEuZXZlbnQgIT09ICdzcGFjZWNoYW5nZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaWZyYW1lcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWZyYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlmcmFtZXNbaV0uY29udGVudFdpbmRvdyAhPT0gZXZlbnQuc291cmNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBDaGFuZ2UgcGFkZGluZy1ib3R0b20gb2YgdGhlIGVuY2xvc2luZyBkaXYgdG8gYWNjb21tb2RhdGVcbiAgICAgIC8vIGNhcmQgY2Fyb3VzZWwgd2l0aG91dCBkaXN0b3J0aW5nIGFzcGVjdCByYXRpb1xuXG5cbiAgICAgIHZhciBzcGFjZSA9IGlmcmFtZXNbaV0ucGFyZW50RWxlbWVudDtcbiAgICAgIHNwYWNlLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIlwiLmNvbmNhdChldmVudC5kYXRhLmRhdGFbMF0uYm90dG9tLCBcInB4XCIpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25NZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBAbW9kdWxlIGxpYi9wb3N0bWVzc2FnZVxuICovXG4vKipcbiAqIFBhcnNlIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHBvc3RNZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgZGF0YSByZWNlaXZlZCBmcm9tIHBvc3RNZXNzYWdlLlxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlTWVzc2FnZURhdGEoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcGFyc2VkLCB0aHJvdyB0aGUgZXJyb3IgYXMgYSB3YXJuaW5nXG4gICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuLyoqXG4gKiBQb3N0IGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgb2JqZWN0IHRvIHVzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgVGhlIEFQSSBtZXRob2QgdG8gY2FsbC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMgdG8gc2VuZCB0byB0aGUgcGxheWVyLlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuXG5mdW5jdGlvbiBwb3N0TWVzc2FnZShwbGF5ZXIsIG1ldGhvZCwgcGFyYW1zKSB7XG4gIGlmICghcGxheWVyLmVsZW1lbnQuY29udGVudFdpbmRvdyB8fCAhcGxheWVyLmVsZW1lbnQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtZXNzYWdlID0ge1xuICAgIG1ldGhvZDogbWV0aG9kXG4gIH07XG5cbiAgaWYgKHBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVzc2FnZS52YWx1ZSA9IHBhcmFtcztcbiAgfSAvLyBJRSA4IGFuZCA5IGRvIG5vdCBzdXBwb3J0IHBhc3NpbmcgbWVzc2FnZXMsIHNvIHN0cmluZ2lmeSB0aGVtXG5cblxuICB2YXIgaWVWZXJzaW9uID0gcGFyc2VGbG9hdChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXi4qbXNpZSAoXFxkKykuKiQvLCAnJDEnKSk7XG5cbiAgaWYgKGllVmVyc2lvbiA+PSA4ICYmIGllVmVyc2lvbiA8IDEwKSB7XG4gICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuICB9XG5cbiAgcGxheWVyLmVsZW1lbnQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShtZXNzYWdlLCBwbGF5ZXIub3JpZ2luKTtcbn1cbi8qKlxuICogUGFyc2UgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSBhIG1lc3NhZ2UgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIHRoYXQgcmVjZWl2ZWQgdGhlIG1lc3NhZ2UuXG4gKiBAcGFyYW0geyhPYmplY3R8c3RyaW5nKX0gZGF0YSBUaGUgbWVzc2FnZSBkYXRhLiBTdHJpbmdzIHdpbGwgYmUgcGFyc2VkIGludG8gSlNPTi5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cblxuZnVuY3Rpb24gcHJvY2Vzc0RhdGEocGxheWVyLCBkYXRhKSB7XG4gIGRhdGEgPSBwYXJzZU1lc3NhZ2VEYXRhKGRhdGEpO1xuICB2YXIgY2FsbGJhY2tzID0gW107XG4gIHZhciBwYXJhbTtcblxuICBpZiAoZGF0YS5ldmVudCkge1xuICAgIGlmIChkYXRhLmV2ZW50ID09PSAnZXJyb3InKSB7XG4gICAgICB2YXIgcHJvbWlzZXMgPSBnZXRDYWxsYmFja3MocGxheWVyLCBkYXRhLmRhdGEubWV0aG9kKTtcbiAgICAgIHByb21pc2VzLmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKGRhdGEuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IubmFtZSA9IGRhdGEuZGF0YS5uYW1lO1xuICAgICAgICBwcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIHJlbW92ZUNhbGxiYWNrKHBsYXllciwgZGF0YS5kYXRhLm1ldGhvZCwgcHJvbWlzZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MocGxheWVyLCBcImV2ZW50OlwiLmNvbmNhdChkYXRhLmV2ZW50KSk7XG4gICAgcGFyYW0gPSBkYXRhLmRhdGE7XG4gIH0gZWxzZSBpZiAoZGF0YS5tZXRob2QpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBzaGlmdENhbGxiYWNrcyhwbGF5ZXIsIGRhdGEubWV0aG9kKTtcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgcGFyYW0gPSBkYXRhLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwocGxheWVyLCBwYXJhbSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sucmVzb2x2ZShwYXJhbSk7XG4gICAgfSBjYXRjaCAoZSkgey8vIGVtcHR5XG4gICAgfVxuICB9KTtcbn1cblxuLyogTUlUIExpY2Vuc2VcblxuQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSlcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuVGVybXMgKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVTY3JlZW5mdWxsKCkge1xuICB2YXIgZm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbDtcbiAgICB2YXIgZm5NYXAgPSBbWydyZXF1ZXN0RnVsbHNjcmVlbicsICdleGl0RnVsbHNjcmVlbicsICdmdWxsc2NyZWVuRWxlbWVudCcsICdmdWxsc2NyZWVuRW5hYmxlZCcsICdmdWxsc2NyZWVuY2hhbmdlJywgJ2Z1bGxzY3JlZW5lcnJvciddLCAvLyBOZXcgV2ViS2l0XG4gICAgWyd3ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbicsICd3ZWJraXRFeGl0RnVsbHNjcmVlbicsICd3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCcsICd3ZWJraXRGdWxsc2NyZWVuRW5hYmxlZCcsICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywgJ3dlYmtpdGZ1bGxzY3JlZW5lcnJvciddLCAvLyBPbGQgV2ViS2l0XG4gICAgWyd3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbicsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCcsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ10sIFsnbW96UmVxdWVzdEZ1bGxTY3JlZW4nLCAnbW96Q2FuY2VsRnVsbFNjcmVlbicsICdtb3pGdWxsU2NyZWVuRWxlbWVudCcsICdtb3pGdWxsU2NyZWVuRW5hYmxlZCcsICdtb3pmdWxsc2NyZWVuY2hhbmdlJywgJ21vemZ1bGxzY3JlZW5lcnJvciddLCBbJ21zUmVxdWVzdEZ1bGxzY3JlZW4nLCAnbXNFeGl0RnVsbHNjcmVlbicsICdtc0Z1bGxzY3JlZW5FbGVtZW50JywgJ21zRnVsbHNjcmVlbkVuYWJsZWQnLCAnTVNGdWxsc2NyZWVuQ2hhbmdlJywgJ01TRnVsbHNjcmVlbkVycm9yJ11dO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbCA9IGZuTWFwLmxlbmd0aDtcbiAgICB2YXIgcmV0ID0ge307XG5cbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFsID0gZm5NYXBbaV07XG5cbiAgICAgIGlmICh2YWwgJiYgdmFsWzFdIGluIGRvY3VtZW50KSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXRbZm5NYXBbMF1baV1dID0gdmFsW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0oKTtcblxuICB2YXIgZXZlbnROYW1lTWFwID0ge1xuICAgIGZ1bGxzY3JlZW5jaGFuZ2U6IGZuLmZ1bGxzY3JlZW5jaGFuZ2UsXG4gICAgZnVsbHNjcmVlbmVycm9yOiBmbi5mdWxsc2NyZWVuZXJyb3JcbiAgfTtcbiAgdmFyIHNjcmVlbmZ1bGwgPSB7XG4gICAgcmVxdWVzdDogZnVuY3Rpb24gcmVxdWVzdChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgb25GdWxsU2NyZWVuRW50ZXJlZCA9IGZ1bmN0aW9uIG9uRnVsbFNjcmVlbkVudGVyZWQoKSB7XG4gICAgICAgICAgc2NyZWVuZnVsbC5vZmYoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBvbkZ1bGxTY3JlZW5FbnRlcmVkKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NyZWVuZnVsbC5vbignZnVsbHNjcmVlbmNoYW5nZScsIG9uRnVsbFNjcmVlbkVudGVyZWQpO1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHZhciByZXR1cm5Qcm9taXNlID0gZWxlbWVudFtmbi5yZXF1ZXN0RnVsbHNjcmVlbl0oKTtcblxuICAgICAgICBpZiAocmV0dXJuUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm5Qcm9taXNlLnRoZW4ob25GdWxsU2NyZWVuRW50ZXJlZCkuY2F0Y2gocmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBleGl0OiBmdW5jdGlvbiBleGl0KCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKCFzY3JlZW5mdWxsLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb25GdWxsU2NyZWVuRXhpdCA9IGZ1bmN0aW9uIG9uRnVsbFNjcmVlbkV4aXQoKSB7XG4gICAgICAgICAgc2NyZWVuZnVsbC5vZmYoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBvbkZ1bGxTY3JlZW5FeGl0KTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NyZWVuZnVsbC5vbignZnVsbHNjcmVlbmNoYW5nZScsIG9uRnVsbFNjcmVlbkV4aXQpO1xuICAgICAgICB2YXIgcmV0dXJuUHJvbWlzZSA9IGRvY3VtZW50W2ZuLmV4aXRGdWxsc2NyZWVuXSgpO1xuXG4gICAgICAgIGlmIChyZXR1cm5Qcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgIHJldHVyblByb21pc2UudGhlbihvbkZ1bGxTY3JlZW5FeGl0KS5jYXRjaChyZWplY3QpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uOiBmdW5jdGlvbiBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBldmVudE5hbWUgPSBldmVudE5hbWVNYXBbZXZlbnRdO1xuXG4gICAgICBpZiAoZXZlbnROYW1lKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvZmY6IGZ1bmN0aW9uIG9mZihldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBldmVudE5hbWUgPSBldmVudE5hbWVNYXBbZXZlbnRdO1xuXG4gICAgICBpZiAoZXZlbnROYW1lKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzY3JlZW5mdWxsLCB7XG4gICAgaXNGdWxsc2NyZWVuOiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZG9jdW1lbnRbZm4uZnVsbHNjcmVlbkVsZW1lbnRdKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVsZW1lbnQ6IHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50W2ZuLmZ1bGxzY3JlZW5FbGVtZW50XTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGlzRW5hYmxlZDoge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAvLyBDb2VyY2UgdG8gYm9vbGVhbiBpbiBjYXNlIG9mIG9sZCBXZWJLaXRcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZG9jdW1lbnRbZm4uZnVsbHNjcmVlbkVuYWJsZWRdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc2NyZWVuZnVsbDtcbn1cblxudmFyIHBsYXllck1hcCA9IG5ldyBXZWFrTWFwKCk7XG52YXIgcmVhZHlNYXAgPSBuZXcgV2Vha01hcCgpO1xudmFyIHNjcmVlbmZ1bGwgPSB7fTtcblxudmFyIFBsYXllciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBQbGF5ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KEhUTUxJRnJhbWVFbGVtZW50fEhUTUxFbGVtZW50fHN0cmluZ3xqUXVlcnkpfSBlbGVtZW50IEEgcmVmZXJlbmNlIHRvIHRoZSBWaW1lb1xuICAgKiAgICAgICAgcGxheWVyIGlmcmFtZSwgYW5kIGlkLCBvciBhIGpRdWVyeSBvYmplY3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gb0VtYmVkIHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYW4gZW1iZWQgaW4gdGhlIGVsZW1lbnQuXG4gICAqIEByZXR1cm4ge1BsYXllcn1cbiAgICovXG4gIGZ1bmN0aW9uIFBsYXllcihlbGVtZW50KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5ZXIpO1xuXG4gICAgLyogZ2xvYmFsIGpRdWVyeSAqL1xuICAgIGlmICh3aW5kb3cualF1ZXJ5ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgIGlmIChlbGVtZW50Lmxlbmd0aCA+IDEgJiYgd2luZG93LmNvbnNvbGUgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQSBqUXVlcnkgb2JqZWN0IHdpdGggbXVsdGlwbGUgZWxlbWVudHMgd2FzIHBhc3NlZCwgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQuJyk7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50WzBdO1xuICAgIH0gLy8gRmluZCBhbiBlbGVtZW50IGJ5IElEXG5cblxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpO1xuICAgIH0gLy8gTm90IGFuIGVsZW1lbnQhXG5cblxuICAgIGlmICghaXNEb21FbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGVpdGhlciBhIHZhbGlkIGVsZW1lbnQgb3IgYSB2YWxpZCBpZC4nKTtcbiAgICB9IC8vIEFscmVhZHkgaW5pdGlhbGl6ZWQgYW4gZW1iZWQgaW4gdGhpcyBkaXYsIHNvIGdyYWIgdGhlIGlmcmFtZVxuXG5cbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSAhPT0gJ0lGUkFNRScpIHtcbiAgICAgIHZhciBpZnJhbWUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuXG4gICAgICBpZiAoaWZyYW1lKSB7XG4gICAgICAgIGVsZW1lbnQgPSBpZnJhbWU7XG4gICAgICB9XG4gICAgfSAvLyBpZnJhbWUgdXJsIGlzIG5vdCBhIFZpbWVvIHVybFxuXG5cbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0lGUkFNRScgJiYgIWlzVmltZW9VcmwoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcGxheWVyIGVsZW1lbnQgcGFzc2VkIGlzbuKAmXQgYSBWaW1lbyBlbWJlZC4nKTtcbiAgICB9IC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBwbGF5ZXIgb2JqZWN0IGluIHRoZSBtYXAsIHJldHVybiB0aGF0XG5cblxuICAgIGlmIChwbGF5ZXJNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gcGxheWVyTWFwLmdldChlbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLl93aW5kb3cgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm9yaWdpbiA9ICcqJztcbiAgICB2YXIgcmVhZHlQcm9taXNlID0gbmV3IG5wb19zcmMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMuX29uTWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIWlzVmltZW9VcmwoZXZlbnQub3JpZ2luKSB8fCBfdGhpcy5lbGVtZW50LmNvbnRlbnRXaW5kb3cgIT09IGV2ZW50LnNvdXJjZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcy5vcmlnaW4gPT09ICcqJykge1xuICAgICAgICAgIF90aGlzLm9yaWdpbiA9IGV2ZW50Lm9yaWdpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhID0gcGFyc2VNZXNzYWdlRGF0YShldmVudC5kYXRhKTtcbiAgICAgICAgdmFyIGlzRXJyb3IgPSBkYXRhICYmIGRhdGEuZXZlbnQgPT09ICdlcnJvcic7XG4gICAgICAgIHZhciBpc1JlYWR5RXJyb3IgPSBpc0Vycm9yICYmIGRhdGEuZGF0YSAmJiBkYXRhLmRhdGEubWV0aG9kID09PSAncmVhZHknO1xuXG4gICAgICAgIGlmIChpc1JlYWR5RXJyb3IpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoZGF0YS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgIGVycm9yLm5hbWUgPSBkYXRhLmRhdGEubmFtZTtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpc1JlYWR5RXZlbnQgPSBkYXRhICYmIGRhdGEuZXZlbnQgPT09ICdyZWFkeSc7XG4gICAgICAgIHZhciBpc1BpbmdSZXNwb25zZSA9IGRhdGEgJiYgZGF0YS5tZXRob2QgPT09ICdwaW5nJztcblxuICAgICAgICBpZiAoaXNSZWFkeUV2ZW50IHx8IGlzUGluZ1Jlc3BvbnNlKSB7XG4gICAgICAgICAgX3RoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknLCAndHJ1ZScpO1xuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3NEYXRhKF90aGlzLCBkYXRhKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIF90aGlzLl9vbk1lc3NhZ2UpO1xuXG4gICAgICBpZiAoX3RoaXMuZWxlbWVudC5ub2RlTmFtZSAhPT0gJ0lGUkFNRScpIHtcbiAgICAgICAgdmFyIHBhcmFtcyA9IGdldE9FbWJlZFBhcmFtZXRlcnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIHZhciB1cmwgPSBnZXRWaW1lb1VybChwYXJhbXMpO1xuICAgICAgICBnZXRPRW1iZWREYXRhKHVybCwgcGFyYW1zLCBlbGVtZW50KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgdmFyIGlmcmFtZSA9IGNyZWF0ZUVtYmVkKGRhdGEsIGVsZW1lbnQpOyAvLyBPdmVyd3JpdGUgZWxlbWVudCB3aXRoIHRoZSBuZXcgaWZyYW1lLFxuICAgICAgICAgIC8vIGJ1dCBzdG9yZSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGVsZW1lbnRcblxuICAgICAgICAgIF90aGlzLmVsZW1lbnQgPSBpZnJhbWU7XG4gICAgICAgICAgX3RoaXMuX29yaWdpbmFsRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgc3dhcENhbGxiYWNrcyhlbGVtZW50LCBpZnJhbWUpO1xuICAgICAgICAgIHBsYXllck1hcC5zZXQoX3RoaXMuZWxlbWVudCwgX3RoaXMpO1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfVxuICAgIH0pOyAvLyBTdG9yZSBhIGNvcHkgb2YgdGhpcyBQbGF5ZXIgaW4gdGhlIG1hcFxuXG4gICAgcmVhZHlNYXAuc2V0KHRoaXMsIHJlYWR5UHJvbWlzZSk7XG4gICAgcGxheWVyTWFwLnNldCh0aGlzLmVsZW1lbnQsIHRoaXMpOyAvLyBTZW5kIGEgcGluZyB0byB0aGUgaWZyYW1lIHNvIHRoZSByZWFkeSBwcm9taXNlIHdpbGwgYmUgcmVzb2x2ZWQgaWZcbiAgICAvLyB0aGUgcGxheWVyIGlzIGFscmVhZHkgcmVhZHkuXG5cbiAgICBpZiAodGhpcy5lbGVtZW50Lm5vZGVOYW1lID09PSAnSUZSQU1FJykge1xuICAgICAgcG9zdE1lc3NhZ2UodGhpcywgJ3BpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoc2NyZWVuZnVsbC5pc0VuYWJsZWQpIHtcbiAgICAgIHZhciBleGl0RnVsbHNjcmVlbiA9IGZ1bmN0aW9uIGV4aXRGdWxsc2NyZWVuKCkge1xuICAgICAgICByZXR1cm4gc2NyZWVuZnVsbC5leGl0KCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmZ1bGxzY3JlZW5jaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2NyZWVuZnVsbC5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICBzdG9yZUNhbGxiYWNrKF90aGlzLCAnZXZlbnQ6ZXhpdEZ1bGxzY3JlZW4nLCBleGl0RnVsbHNjcmVlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtb3ZlQ2FsbGJhY2soX3RoaXMsICdldmVudDpleGl0RnVsbHNjcmVlbicsIGV4aXRGdWxsc2NyZWVuKTtcbiAgICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcblxuXG4gICAgICAgIF90aGlzLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcG9zdE1lc3NhZ2UoX3RoaXMsICdmdWxsc2NyZWVuY2hhbmdlJywgc2NyZWVuZnVsbC5pc0Z1bGxzY3JlZW4pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHNjcmVlbmZ1bGwub24oJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLmZ1bGxzY3JlZW5jaGFuZ2VIYW5kbGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogR2V0IGEgcHJvbWlzZSBmb3IgYSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBBUEkgbWV0aG9kIHRvIGNhbGwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbYXJncz17fV0gQXJndW1lbnRzIHRvIHNlbmQgdmlhIHBvc3RNZXNzYWdlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhQbGF5ZXIsIFt7XG4gICAga2V5OiBcImNhbGxNZXRob2RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FsbE1ldGhvZChuYW1lKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyBucG9fc3JjKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgLy8gV2UgYXJlIHN0b3JpbmcgdGhlIHJlc29sdmUvcmVqZWN0IGhhbmRsZXJzIHRvIGNhbGwgbGF0ZXIsIHNvIHdlXG4gICAgICAgIC8vIGNhbuKAmXQgcmV0dXJuIGhlcmUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2Fsd2F5cy1yZXR1cm5cbiAgICAgICAgcmV0dXJuIF90aGlzMi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0b3JlQ2FsbGJhY2soX3RoaXMyLCBuYW1lLCB7XG4gICAgICAgICAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0OiByZWplY3RcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwb3N0TWVzc2FnZShfdGhpczIsIG5hbWUsIGFyZ3MpO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIHByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZiBhIHBsYXllciBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBwcm9wZXJ0eSBuYW1lXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgbnBvX3NyYyhmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIG5hbWUgPSBnZXRNZXRob2ROYW1lKG5hbWUsICdnZXQnKTsgLy8gV2UgYXJlIHN0b3JpbmcgdGhlIHJlc29sdmUvcmVqZWN0IGhhbmRsZXJzIHRvIGNhbGwgbGF0ZXIsIHNvIHdlXG4gICAgICAgIC8vIGNhbuKAmXQgcmV0dXJuIGhlcmUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2Fsd2F5cy1yZXR1cm5cblxuICAgICAgICByZXR1cm4gX3RoaXMzLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcmVDYWxsYmFjayhfdGhpczMsIG5hbWUsIHtcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvc3RNZXNzYWdlKF90aGlzMywgbmFtZSk7XG4gICAgICAgIH0pLmNhdGNoKHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgcHJvbWlzZSBmb3Igc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBwbGF5ZXIgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgQVBJIG1ldGhvZCB0byBjYWxsLlxuICAgICAqIEBwYXJhbSB7bWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IG5wb19zcmMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBuYW1lID0gZ2V0TWV0aG9kTmFtZShuYW1lLCAnc2V0Jyk7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGVyZSBtdXN0IGJlIGEgdmFsdWUgdG8gc2V0LicpO1xuICAgICAgICB9IC8vIFdlIGFyZSBzdG9yaW5nIHRoZSByZXNvbHZlL3JlamVjdCBoYW5kbGVycyB0byBjYWxsIGxhdGVyLCBzbyB3ZVxuICAgICAgICAvLyBjYW7igJl0IHJldHVybiBoZXJlLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9hbHdheXMtcmV0dXJuXG5cblxuICAgICAgICByZXR1cm4gX3RoaXM0LnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcmVDYWxsYmFjayhfdGhpczQsIG5hbWUsIHtcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvc3RNZXNzYWdlKF90aGlzNCwgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBldmVudC4gV2lsbCBjYWxsIHRoZVxuICAgICAqIGNhbGxiYWNrIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLCBgZGF0YWAsIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yXG4gICAgICogdGhhdCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKil9IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGZpcmVzLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoIWV2ZW50TmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGFuIGV2ZW50IG5hbWUuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3ModGhpcywgXCJldmVudDpcIi5jb25jYXQoZXZlbnROYW1lKSk7XG5cbiAgICAgIGlmIChjYWxsYmFja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuY2FsbE1ldGhvZCgnYWRkRXZlbnRMaXN0ZW5lcicsIGV2ZW50TmFtZSkuY2F0Y2goZnVuY3Rpb24gKCkgey8vIElnbm9yZSB0aGUgZXJyb3IuIFRoZXJlIHdpbGwgYmUgYW4gZXJyb3IgZXZlbnQgZmlyZWQgdGhhdFxuICAgICAgICAgIC8vIHdpbGwgdHJpZ2dlciB0aGUgZXJyb3IgY2FsbGJhY2sgaWYgdGhleSBhcmUgbGlzdGVuaW5nLlxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgc3RvcmVDYWxsYmFjayh0aGlzLCBcImV2ZW50OlwiLmNvbmNhdChldmVudE5hbWUpLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBldmVudC4gV2lsbCByZW1vdmUgYWxsXG4gICAgICogbGlzdGVuZXJzIGZvciB0aGF0IGV2ZW50IGlmIGEgYGNhbGxiYWNrYCBpc27igJl0IHBhc3NlZCwgb3Igb25seSB0aGF0XG4gICAgICogc3BlY2lmaWMgY2FsbGJhY2sgaWYgaXQgaXMgcGFzc2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgc3BlY2lmaWMgY2FsbGJhY2sgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvZmZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmICghZXZlbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gZXZlbnQgbmFtZS4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGFzdENhbGxiYWNrID0gcmVtb3ZlQ2FsbGJhY2sodGhpcywgXCJldmVudDpcIi5jb25jYXQoZXZlbnROYW1lKSwgY2FsbGJhY2spOyAvLyBJZiB0aGVyZSBhcmUgbm8gY2FsbGJhY2tzIGxlZnQsIHJlbW92ZSB0aGUgbGlzdGVuZXJcblxuICAgICAgaWYgKGxhc3RDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbGxNZXRob2QoJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBldmVudE5hbWUpLmNhdGNoKGZ1bmN0aW9uIChlKSB7Ly8gSWdub3JlIHRoZSBlcnJvci4gVGhlcmUgd2lsbCBiZSBhbiBlcnJvciBldmVudCBmaXJlZCB0aGF0XG4gICAgICAgICAgLy8gd2lsbCB0cmlnZ2VyIHRoZSBlcnJvciBjYWxsYmFjayBpZiB0aGV5IGFyZSBsaXN0ZW5pbmcuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gbG9hZCBhIG5ldyB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIExvYWRWaWRlb1Byb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgdmlkZW8gd2l0aCB0aGlzIGlkIHN1Y2Nlc3NmdWxseSBsb2FkZWQuXG4gICAgICogQHJlamVjdCB7VHlwZUVycm9yfSBUaGUgaWQgd2FzIG5vdCBhIG51bWJlci5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSBuZXcgdmlkZW8gaW50byB0aGlzIGVtYmVkLiBUaGUgcHJvbWlzZSB3aWxsIGJlIHJlc29sdmVkIGlmXG4gICAgICogdGhlIHZpZGVvIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIG9yIGl0IHdpbGwgYmUgcmVqZWN0ZWQgaWYgaXQgY291bGRcbiAgICAgKiBub3QgYmUgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ8b2JqZWN0fSBvcHRpb25zIFRoZSBpZCBvZiB0aGUgdmlkZW8gb3IgYW4gb2JqZWN0IHdpdGggZW1iZWQgb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJuIHtMb2FkVmlkZW9Qcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFZpZGVvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWRWaWRlbyhvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdsb2FkVmlkZW8nLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHBlcmZvcm0gYW4gYWN0aW9uIHdoZW4gdGhlIFBsYXllciBpcyByZWFkeS5cbiAgICAgKlxuICAgICAqIEB0b2RvIGRvY3VtZW50IGVycm9yc1xuICAgICAqIEBwcm9taXNlIExvYWRWaWRlb1Byb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7dm9pZH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYSBmdW5jdGlvbiB3aGVuIHRoZSBwbGF5ZXIgaWZyYW1lIGhhcyBpbml0aWFsaXplZC4gWW91IGRvIG5vdFxuICAgICAqIG5lZWQgdG8gd2FpdCBmb3IgYHJlYWR5YCB0byB0cmlnZ2VyIHRvIGJlZ2luIGFkZGluZyBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBvciBjYWxsaW5nIG90aGVyIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtSZWFkeVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZWFkeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkeSgpIHtcbiAgICAgIHZhciByZWFkeVByb21pc2UgPSByZWFkeU1hcC5nZXQodGhpcykgfHwgbmV3IG5wb19zcmMoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdVbmtub3duIHBsYXllci4gUHJvYmFibHkgdW5sb2FkZWQuJykpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnBvX3NyYy5yZXNvbHZlKHJlYWR5UHJvbWlzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBhZGQgYSBjdWUgcG9pbnQgdG8gdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEFkZEN1ZVBvaW50UHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtzdHJpbmd9IFRoZSBpZCBvZiB0aGUgY3VlIHBvaW50IHRvIHVzZSBmb3IgcmVtb3ZlQ3VlUG9pbnQuXG4gICAgICogQHJlamVjdCB7UmFuZ2VFcnJvcn0gdGhlIHRpbWUgd2FzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGVcbiAgICAgKiAgICAgICAgIHZpZGVv4oCZcyBkdXJhdGlvbi5cbiAgICAgKiBAcmVqZWN0IHtVbnN1cHBvcnRlZEVycm9yfSBDdWUgcG9pbnRzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhlIGN1cnJlbnRcbiAgICAgKiAgICAgICAgIHBsYXllciBvciBicm93c2VyLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQWRkIGEgY3VlIHBvaW50IHRvIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBmb3IgdGhlIGN1ZSBwb2ludC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIEFyYml0cmFyeSBkYXRhIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIGN1ZSBwb2ludC5cbiAgICAgKiBAcmV0dXJuIHtBZGRDdWVQb2ludFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRDdWVQb2ludFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRDdWVQb2ludCh0aW1lKSB7XG4gICAgICB2YXIgZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdhZGRDdWVQb2ludCcsIHtcbiAgICAgICAgdGltZTogdGltZSxcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byByZW1vdmUgYSBjdWUgcG9pbnQgZnJvbSB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgQWRkQ3VlUG9pbnRQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge3N0cmluZ30gVGhlIGlkIG9mIHRoZSBjdWUgcG9pbnQgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICAgKiBAcmVqZWN0IHtJbnZhbGlkQ3VlUG9pbnR9IFRoZSBjdWUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIHdhcyBub3RcbiAgICAgKiAgICAgICAgIGZvdW5kLlxuICAgICAqIEByZWplY3Qge1Vuc3VwcG9ydGVkRXJyb3J9IEN1ZSBwb2ludHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY3VycmVudFxuICAgICAqICAgICAgICAgcGxheWVyIG9yIGJyb3dzZXIuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBjdWUgcG9pbnQgZnJvbSB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIGlkIG9mIHRoZSBjdWUgcG9pbnQgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm4ge1JlbW92ZUN1ZVBvaW50UHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUN1ZVBvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUN1ZVBvaW50KGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdyZW1vdmVDdWVQb2ludCcsIGlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRleHQgdHJhY2sgb24gYSB2aWRlby5cbiAgICAgKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFZpbWVvVGV4dFRyYWNrXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGxhbmd1YWdlIFRoZSBJU08gbGFuZ3VhZ2UgY29kZS5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30ga2luZCBUaGUga2luZCBvZiB0cmFjayBpdCBpcyAoY2FwdGlvbnMgb3Igc3VidGl0bGVzKS5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gbGFiZWwgVGhlIGh1bWFu4oCQcmVhZGFibGUgbGFiZWwgZm9yIHRoZSB0cmFjay5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBlbmFibGUgYSB0ZXh0IHRyYWNrLlxuICAgICAqXG4gICAgICogQHByb21pc2UgRW5hYmxlVGV4dFRyYWNrUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtWaW1lb1RleHRUcmFja30gVGhlIHRleHQgdHJhY2sgdGhhdCB3YXMgZW5hYmxlZC5cbiAgICAgKiBAcmVqZWN0IHtJbnZhbGlkVHJhY2tMYW5ndWFnZUVycm9yfSBObyB0cmFjayB3YXMgYXZhaWxhYmxlIHdpdGggdGhlXG4gICAgICogICAgICAgICBzcGVjaWZpZWQgbGFuZ3VhZ2UuXG4gICAgICogQHJlamVjdCB7SW52YWxpZFRyYWNrRXJyb3J9IE5vIHRyYWNrIHdhcyBhdmFpbGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkXG4gICAgICogICAgICAgICBsYW5ndWFnZSBhbmQga2luZC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0aGUgdGV4dCB0cmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UsIGFuZCBvcHRpb25hbGx5IHRoZVxuICAgICAqIHNwZWNpZmllZCBraW5kIChjYXB0aW9ucyBvciBzdWJ0aXRsZXMpLlxuICAgICAqXG4gICAgICogV2hlbiBzZXQgdmlhIHRoZSBBUEksIHRoZSB0cmFjayBsYW5ndWFnZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHZpZXdlcuKAmXNcbiAgICAgKiBzdG9yZWQgcHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSBUaGUgdHdv4oCQbGV0dGVyIGxhbmd1YWdlIGNvZGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtraW5kXSBUaGUga2luZCBvZiB0cmFjayB0byBlbmFibGUgKGNhcHRpb25zIG9yIHN1YnRpdGxlcykuXG4gICAgICogQHJldHVybiB7RW5hYmxlVGV4dFRyYWNrUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVuYWJsZVRleHRUcmFja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVUZXh0VHJhY2sobGFuZ3VhZ2UsIGtpbmQpIHtcbiAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIGxhbmd1YWdlLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdlbmFibGVUZXh0VHJhY2snLCB7XG4gICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAga2luZDoga2luZFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBkaXNhYmxlIHRoZSBhY3RpdmUgdGV4dCB0cmFjay5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIERpc2FibGVUZXh0VHJhY2tQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge3ZvaWR9IFRoZSB0cmFjayB3YXMgZGlzYWJsZWQuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIHRoZSBjdXJyZW50bHktYWN0aXZlIHRleHQgdHJhY2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtEaXNhYmxlVGV4dFRyYWNrUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc2FibGVUZXh0VHJhY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzYWJsZVRleHRUcmFjaygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoJ2Rpc2FibGVUZXh0VHJhY2snKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHBhdXNlIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIFBhdXNlUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHt2b2lkfSBUaGUgdmlkZW8gd2FzIHBhdXNlZC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSB2aWRlbyBpZiBpdOKAmXMgcGxheWluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1BhdXNlUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZCgncGF1c2UnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHBsYXkgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgUGxheVByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7dm9pZH0gVGhlIHZpZGVvIHdhcyBwbGF5ZWQuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSB2aWRlbyBpZiBpdOKAmXMgcGF1c2VkLiAqKk5vdGU6Kiogb24gaU9TIGFuZCBzb21lIG90aGVyXG4gICAgICogbW9iaWxlIGRldmljZXMsIHlvdSBjYW5ub3QgcHJvZ3JhbW1hdGljYWxseSB0cmlnZ2VyIHBsYXkuIE9uY2UgdGhlXG4gICAgICogdmlld2VyIGhhcyB0YXBwZWQgb24gdGhlIHBsYXkgYnV0dG9uIGluIHRoZSBwbGF5ZXIsIGhvd2V2ZXIsIHlvdVxuICAgICAqIHdpbGwgYmUgYWJsZSB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1BsYXlQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZCgncGxheScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBlbnRlcnMgZnVsbHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVxdWVzdEZ1bGxzY3JlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVxdWVzdEZ1bGxzY3JlZW4oKSB7XG4gICAgICBpZiAoc2NyZWVuZnVsbC5pc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIHNjcmVlbmZ1bGwucmVxdWVzdCh0aGlzLmVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdyZXF1ZXN0RnVsbHNjcmVlbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBleGl0cyBmdWxsc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJleGl0RnVsbHNjcmVlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleGl0RnVsbHNjcmVlbigpIHtcbiAgICAgIGlmIChzY3JlZW5mdWxsLmlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gc2NyZWVuZnVsbC5leGl0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoJ2V4aXRGdWxsc2NyZWVuJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBmdWxsc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRGdWxsc2NyZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZ1bGxzY3JlZW4oKSB7XG4gICAgICBpZiAoc2NyZWVuZnVsbC5pc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIG5wb19zcmMucmVzb2x2ZShzY3JlZW5mdWxsLmlzRnVsbHNjcmVlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldCgnZnVsbHNjcmVlbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBlbnRlcnMgcGljdHVyZS1pbi1waWN0dXJlLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZXF1ZXN0UGljdHVyZUluUGljdHVyZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXF1ZXN0UGljdHVyZUluUGljdHVyZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoJ3JlcXVlc3RQaWN0dXJlSW5QaWN0dXJlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIGV4aXRzIHBpY3R1cmUtaW4tcGljdHVyZS5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZXhpdFBpY3R1cmVJblBpY3R1cmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhpdFBpY3R1cmVJblBpY3R1cmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKCdleGl0UGljdHVyZUluUGljdHVyZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGljdHVyZS1pbi1waWN0dXJlLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRQaWN0dXJlSW5QaWN0dXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBpY3R1cmVJblBpY3R1cmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3BpY3R1cmVJblBpY3R1cmUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHVubG9hZCB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBVbmxvYWRQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge3ZvaWR9IFRoZSB2aWRlbyB3YXMgdW5sb2FkZWQuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHBsYXllciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1VubG9hZFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZCgndW5sb2FkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFudXAgdGhlIHBsYXllciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIERPTVxuICAgICAqXG4gICAgICogSXQgd29uJ3QgYmUgdXNhYmxlIGFuZCBhIG5ldyBvbmUgc2hvdWxkIGJlIGNvbnN0cnVjdGVkXG4gICAgICogIGluIG9yZGVyIHRvIGRvIGFueSBvcGVyYXRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IG5wb19zcmMoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgcmVhZHlNYXAuZGVsZXRlKF90aGlzNSk7XG4gICAgICAgIHBsYXllck1hcC5kZWxldGUoX3RoaXM1LmVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChfdGhpczUuX29yaWdpbmFsRWxlbWVudCkge1xuICAgICAgICAgIHBsYXllck1hcC5kZWxldGUoX3RoaXM1Ll9vcmlnaW5hbEVsZW1lbnQpO1xuXG4gICAgICAgICAgX3RoaXM1Ll9vcmlnaW5hbEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXZpbWVvLWluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXM1LmVsZW1lbnQgJiYgX3RoaXM1LmVsZW1lbnQubm9kZU5hbWUgPT09ICdJRlJBTUUnICYmIF90aGlzNS5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBJZiB3ZSd2ZSBhZGRlZCBhbiBhZGRpdGlvbmFsIHdyYXBwZXIgZGl2LCByZW1vdmUgdGhhdCBmcm9tIHRoZSBET00uXG4gICAgICAgICAgLy8gSWYgbm90LCBqdXN0IHJlbW92ZSB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICAgICAgaWYgKF90aGlzNS5lbGVtZW50LnBhcmVudE5vZGUucGFyZW50Tm9kZSAmJiBfdGhpczUuX29yaWdpbmFsRWxlbWVudCAmJiBfdGhpczUuX29yaWdpbmFsRWxlbWVudCAhPT0gX3RoaXM1LmVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgX3RoaXM1LmVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF90aGlzNS5lbGVtZW50LnBhcmVudE5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczUuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF90aGlzNS5lbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gSWYgdGhlIGNsaXAgaXMgcHJpdmF0ZSB0aGVyZSBpcyBhIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgc3RheXMgdGhlXG4gICAgICAgIC8vIGRpdiBlbGVtZW50LiBEZXN0cm95IHNob3VsZCByZXNldCB0aGUgZGl2IGFuZCByZW1vdmUgdGhlIGlmcmFtZSBjaGlsZC5cblxuXG4gICAgICAgIGlmIChfdGhpczUuZWxlbWVudCAmJiBfdGhpczUuZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0RJVicgJiYgX3RoaXM1LmVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIF90aGlzNS5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS12aW1lby1pbml0aWFsaXplZCcpO1xuXG4gICAgICAgICAgdmFyIGlmcmFtZSA9IF90aGlzNS5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuXG4gICAgICAgICAgaWYgKGlmcmFtZSAmJiBpZnJhbWUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgLy8gSWYgd2UndmUgYWRkZWQgYW4gYWRkaXRpb25hbCB3cmFwcGVyIGRpdiwgcmVtb3ZlIHRoYXQgZnJvbSB0aGUgRE9NLlxuICAgICAgICAgICAgLy8gSWYgbm90LCBqdXN0IHJlbW92ZSB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICAgICAgICBpZiAoaWZyYW1lLnBhcmVudE5vZGUucGFyZW50Tm9kZSAmJiBfdGhpczUuX29yaWdpbmFsRWxlbWVudCAmJiBfdGhpczUuX29yaWdpbmFsRWxlbWVudCAhPT0gaWZyYW1lLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgaWZyYW1lLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpZnJhbWUucGFyZW50Tm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzNS5fd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBfdGhpczUuX29uTWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKHNjcmVlbmZ1bGwuaXNFbmFibGVkKSB7XG4gICAgICAgICAgc2NyZWVuZnVsbC5vZmYoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBfdGhpczUuZnVsbHNjcmVlbmNoYW5nZUhhbmRsZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIGF1dG9wYXVzZSBiZWhhdmlvciBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRBdXRvcGF1c2VQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge2Jvb2xlYW59IFdoZXRoZXIgYXV0b3BhdXNlIGlzIHR1cm5lZCBvbiBvciBvZmYuXG4gICAgICogQHJlamVjdCB7VW5zdXBwb3J0ZWRFcnJvcn0gQXV0b3BhdXNlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY3VycmVudFxuICAgICAqICAgICAgICAgcGxheWVyIG9yIGJyb3dzZXIuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGF1dG9wYXVzZSBiZWhhdmlvciBmb3IgdGhpcyBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRBdXRvcGF1c2VQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QXV0b3BhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF1dG9wYXVzZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnYXV0b3BhdXNlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBzZXQgdGhlIGF1dG9wYXVzZSBiZWhhdmlvciBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRBdXRvcGF1c2VQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge2Jvb2xlYW59IFdoZXRoZXIgYXV0b3BhdXNlIGlzIHR1cm5lZCBvbiBvciBvZmYuXG4gICAgICogQHJlamVjdCB7VW5zdXBwb3J0ZWRFcnJvcn0gQXV0b3BhdXNlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGUgY3VycmVudFxuICAgICAqICAgICAgICAgcGxheWVyIG9yIGJyb3dzZXIuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b3BhdXNlIGJlaGF2aW9yIG9mIHRoaXMgcGxheWVyLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgd2hlbiBhbm90aGVyIHZpZGVvIGlzIHBsYXllZCBpbiB0aGUgc2FtZSBicm93c2VyLCB0aGlzXG4gICAgICogcGxheWVyIHdpbGwgYXV0b21hdGljYWxseSBwYXVzZS4gVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgcmVhc29uXG4gICAgICogZm9yIGRvaW5nIHNvLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgbGVhdmUgYXV0b3BhdXNlIHNldCB0byB0aGVcbiAgICAgKiBkZWZhdWx0IChgdHJ1ZWApLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdXRvcGF1c2VcbiAgICAgKiBAcmV0dXJuIHtTZXRBdXRvcGF1c2VQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0QXV0b3BhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEF1dG9wYXVzZShhdXRvcGF1c2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldCgnYXV0b3BhdXNlJywgYXV0b3BhdXNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgYnVmZmVyZWQgcHJvcGVydHkgb2YgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0QnVmZmVyZWRQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge0FycmF5fSBCdWZmZXJlZCBUaW1lcmFuZ2VzIGNvbnZlcnRlZCB0byBhbiBBcnJheS5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnVmZmVyZWQgcHJvcGVydHkgb2YgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0QnVmZmVyZWRQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QnVmZmVyZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QnVmZmVyZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2J1ZmZlcmVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IENhbWVyYVByb3BlcnRpZXNcbiAgICAgKiBAcHJvcCB7bnVtYmVyfSBwcm9wcy55YXcgLSBOdW1iZXIgYmV0d2VlbiAwIGFuZCAzNjAuXG4gICAgICogQHByb3Age251bWJlcn0gcHJvcHMucGl0Y2ggLSBOdW1iZXIgYmV0d2VlbiAtOTAgYW5kIDkwLlxuICAgICAqIEBwcm9wIHtudW1iZXJ9IHByb3BzLnJvbGwgLSBOdW1iZXIgYmV0d2VlbiAtMTgwIGFuZCAxODAuXG4gICAgICogQHByb3Age251bWJlcn0gcHJvcHMuZm92IC0gVGhlIGZpZWxkIG9mIHZpZXcgaW4gZGVncmVlcy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIGNhbWVyYSBwcm9wZXJ0aWVzIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRDYW1lcmFQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge0NhbWVyYVByb3BlcnRpZXN9IFRoZSBjYW1lcmEgcHJvcGVydGllcy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEZvciAzNjDCsCB2aWRlb3MgZ2V0IHRoZSBjYW1lcmEgcHJvcGVydGllcyBmb3IgdGhpcyBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRDYW1lcmFQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FtZXJhUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FtZXJhUHJvcHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2NhbWVyYVByb3BzJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBzZXQgdGhlIGNhbWVyYSBwcm9wZXJ0aWVzIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRDYW1lcmFQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge09iamVjdH0gVGhlIGNhbWVyYSB3YXMgc3VjY2Vzc2Z1bGx5IHNldC5cbiAgICAgKiBAcmVqZWN0IHtSYW5nZUVycm9yfSBUaGUgcmFuZ2Ugd2FzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBGb3IgMzYwwrAgdmlkZW9zIHNldCB0aGUgY2FtZXJhIHByb3BlcnRpZXMgZm9yIHRoaXMgcGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDYW1lcmFQcm9wZXJ0aWVzfSBjYW1lcmEgVGhlIGNhbWVyYSBwcm9wZXJ0aWVzXG4gICAgICogQHJldHVybiB7U2V0Q2FtZXJhUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldENhbWVyYVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENhbWVyYVByb3BzKGNhbWVyYSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0KCdjYW1lcmFQcm9wcycsIGNhbWVyYSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBjaGFwdGVyLlxuICAgICAqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gVmltZW9DaGFwdGVyXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHN0YXJ0VGltZSBUaGUgc3RhcnQgdGltZSBvZiB0aGUgY2hhcHRlci5cbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBjaGFwdGVyLlxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmRleCBUaGUgcGxhY2UgaW4gdGhlIG9yZGVyIG9mIENoYXB0ZXJzLiBTdGFydHMgYXQgMS5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgY2hhcHRlcnMgZm9yIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldENoYXB0ZXJzUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtWaW1lb0NoYXB0ZXJbXX0gVGhlIGNoYXB0ZXJzIGZvciB0aGUgdmlkZW8uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSBjaGFwdGVycyBmb3IgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0Q2hhcHRlcnNQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2hhcHRlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2hhcHRlcnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2NoYXB0ZXJzJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2hhcHRlci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldEN1cnJlbnRDaGFwdGVyc1Byb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7VmltZW9DaGFwdGVyfHVuZGVmaW5lZH0gVGhlIGN1cnJlbnQgY2hhcHRlciBmb3IgdGhlIHZpZGVvLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGNoYXB0ZXIgZm9yIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldEN1cnJlbnRDaGFwdGVyc1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50Q2hhcHRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50Q2hhcHRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnY3VycmVudENoYXB0ZXInKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgY29sb3Igb2YgdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldENvbG9yUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtzdHJpbmd9IFRoZSBoZXggY29sb3Igb2YgdGhlIHBsYXllci5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29sb3IgZm9yIHRoaXMgcGxheWVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0Q29sb3JQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q29sb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29sb3IoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2NvbG9yJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBzZXQgdGhlIGNvbG9yIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRDb2xvclByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7c3RyaW5nfSBUaGUgY29sb3Igd2FzIHN1Y2Nlc3NmdWxseSBzZXQuXG4gICAgICogQHJlamVjdCB7VHlwZUVycm9yfSBUaGUgc3RyaW5nIHdhcyBub3QgYSB2YWxpZCBoZXggb3IgcmdiIGNvbG9yLlxuICAgICAqIEByZWplY3Qge0NvbnRyYXN0RXJyb3J9IFRoZSBjb2xvciB3YXMgc2V0LCBidXQgdGhlIGNvbnRyYXN0IGlzXG4gICAgICogICAgICAgICBvdXRzaWRlIG9mIHRoZSBhY2NlcHRhYmxlIHJhbmdlLlxuICAgICAqIEByZWplY3Qge0VtYmVkU2V0dGluZ3NFcnJvcn0gVGhlIG93bmVyIG9mIHRoZSBwbGF5ZXIgaGFzIGNob3NlbiB0b1xuICAgICAqICAgICAgICAgdXNlIGEgc3BlY2lmaWMgY29sb3IuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNvbG9yIG9mIHRoaXMgcGxheWVyIHRvIGEgaGV4IG9yIHJnYiBzdHJpbmcuIFNldHRpbmcgdGhlXG4gICAgICogY29sb3IgbWF5IGZhaWwgaWYgdGhlIG93bmVyIG9mIHRoZSB2aWRlbyBoYXMgc2V0IHRoZWlyIGVtYmVkXG4gICAgICogcHJlZmVyZW5jZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBjb2xvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciBUaGUgaGV4IG9yIHJnYiBjb2xvciBzdHJpbmcgdG8gc2V0LlxuICAgICAqIEByZXR1cm4ge1NldENvbG9yUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldENvbG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbG9yKGNvbG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ2NvbG9yJywgY29sb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgY3VlIHBvaW50LlxuICAgICAqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gVmltZW9DdWVQb2ludFxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIG9mIHRoZSBjdWUgcG9pbnQuXG4gICAgICogQHByb3BlcnR5IHtvYmplY3R9IGRhdGEgVGhlIGRhdGEgcGFzc2VkIHdoZW4gYWRkaW5nIHRoZSBjdWUgcG9pbnQuXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSB1bmlxdWUgaWQgZm9yIHVzZSB3aXRoIHJlbW92ZUN1ZVBvaW50LlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgY3VlIHBvaW50cyBvZiBhIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0Q3VlUG9pbnRzUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtWaW1lb0N1ZVBvaW50W119IFRoZSBjdWUgcG9pbnRzIGFkZGVkIHRvIHRoZSB2aWRlby5cbiAgICAgKiBAcmVqZWN0IHtVbnN1cHBvcnRlZEVycm9yfSBDdWUgcG9pbnRzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhlIGN1cnJlbnRcbiAgICAgKiAgICAgICAgIHBsYXllciBvciBicm93c2VyLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBjdWUgcG9pbnRzIGFkZGVkIHRvIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldEN1ZVBvaW50c1Byb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdWVQb2ludHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VlUG9pbnRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdjdWVQb2ludHMnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldEN1cnJlbnRUaW1lUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSBjdXJyZW50IHRpbWUgaW4gc2Vjb25kcy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0Q3VycmVudFRpbWVQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2N1cnJlbnRUaW1lJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBzZXQgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRDdXJyZW50VGltZVByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgYWN0dWFsIGN1cnJlbnQgdGltZSB0aGF0IHdhcyBzZXQuXG4gICAgICogQHJlamVjdCB7UmFuZ2VFcnJvcn0gdGhlIHRpbWUgd2FzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGVcbiAgICAgKiAgICAgICAgIHZpZGVv4oCZcyBkdXJhdGlvbi5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBzZWNvbmRzLiBJZiB0aGUgcGxheWVyIHdhc1xuICAgICAqIHBhdXNlZCwgaXQgd2lsbCByZW1haW4gcGF1c2VkLiBMaWtld2lzZSwgaWYgdGhlIHBsYXllciB3YXMgcGxheWluZyxcbiAgICAgKiBpdCB3aWxsIHJlc3VtZSBwbGF5aW5nIG9uY2UgdGhlIHZpZGVvIGhhcyBidWZmZXJlZC5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gcHJvdmlkZSBhbiBhY2N1cmF0ZSB0aW1lIGFuZCB0aGUgcGxheWVyIHdpbGwgYXR0ZW1wdCB0byBzZWVrXG4gICAgICogdG8gYXMgY2xvc2UgdG8gdGhhdCB0aW1lIGFzIHBvc3NpYmxlLiBUaGUgZXhhY3QgdGltZSB3aWxsIGJlIHRoZVxuICAgICAqIGZ1bGZpbGxlZCB2YWx1ZSBvZiB0aGUgcHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50VGltZVxuICAgICAqIEByZXR1cm4ge1NldEN1cnJlbnRUaW1lUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEN1cnJlbnRUaW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEN1cnJlbnRUaW1lKGN1cnJlbnRUaW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ2N1cnJlbnRUaW1lJywgY3VycmVudFRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXREdXJhdGlvblByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgZHVyYXRpb24gaW4gc2Vjb25kcy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIHZpZGVvIGluIHNlY29uZHMuIEl0IHdpbGwgYmUgcm91bmRlZCB0byB0aGVcbiAgICAgKiBuZWFyZXN0IHNlY29uZCBiZWZvcmUgcGxheWJhY2sgYmVnaW5zLCBhbmQgdG8gdGhlIG5lYXJlc3QgdGhvdXNhbmR0aFxuICAgICAqIG9mIGEgc2Vjb25kIGFmdGVyIHBsYXliYWNrIGJlZ2lucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldER1cmF0aW9uUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdkdXJhdGlvbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBlbmRlZCBzdGF0ZSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRFbmRlZFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIHZpZGVvIGhhcyBlbmRlZC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZW5kZWQgc3RhdGUgb2YgdGhlIHZpZGVvLiBUaGUgdmlkZW8gaGFzIGVuZGVkIGlmXG4gICAgICogYGN1cnJlbnRUaW1lID09PSBkdXJhdGlvbmAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRFbmRlZFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRFbmRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFbmRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnZW5kZWQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgbG9vcCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0TG9vcFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBzZXQgdG8gbG9vcC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbG9vcCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0TG9vcFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRMb29wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldExvb3AoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ2xvb3AnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHNldCB0aGUgbG9vcCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgU2V0TG9vcFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7Ym9vbGVhbn0gVGhlIGxvb3Agc3RhdGUgdGhhdCB3YXMgc2V0LlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsb29wIHN0YXRlIG9mIHRoZSBwbGF5ZXIuIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIHBsYXllclxuICAgICAqIHdpbGwgc3RhcnQgb3ZlciBpbW1lZGlhdGVseSBvbmNlIHBsYXliYWNrIGVuZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvb3BcbiAgICAgKiBAcmV0dXJuIHtTZXRMb29wUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldExvb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TG9vcChsb29wKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ2xvb3AnLCBsb29wKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHNldCB0aGUgbXV0ZWQgc3RhdGUgb2YgdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIFNldE11dGVkUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtib29sZWFufSBUaGUgbXV0ZWQgc3RhdGUgdGhhdCB3YXMgc2V0LlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtdXRlZCBzdGF0ZSBvZiB0aGUgcGxheWVyLiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBwbGF5ZXJcbiAgICAgKiB2b2x1bWUgd2lsbCBiZSBtdXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbXV0ZWRcbiAgICAgKiBAcmV0dXJuIHtTZXRNdXRlZFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRNdXRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRNdXRlZChtdXRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0KCdtdXRlZCcsIG11dGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgbXV0ZWQgc3RhdGUgb2YgdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldE11dGVkUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIG11dGVkLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtdXRlZCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0TXV0ZWRQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TXV0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TXV0ZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ211dGVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHBhdXNlZCBzdGF0ZSBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0TG9vcFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIHZpZGVvIGlzIHBhdXNlZC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcGF1c2VkIHN0YXRlIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRMb29wUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFBhdXNlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYXVzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3BhdXNlZCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBwbGF5YmFjayByYXRlIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRQbGF5YmFja1JhdGVQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge251bWJlcn0gVGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIHBsYXllciBvbiBhIHNjYWxlIGZyb20gMC41IHRvIDIuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIHBsYXllciBvbiBhIHNjYWxlIGZyb20gYDAuNWAgdG8gYDJgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0UGxheWJhY2tSYXRlUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFBsYXliYWNrUmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQbGF5YmFja1JhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3BsYXliYWNrUmF0ZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gc2V0IHRoZSBwbGF5YmFja3JhdGUgb2YgdGhlIHBsYXllci5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIFNldFBsYXliYWNrUmF0ZVByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgcGxheWJhY2sgcmF0ZSB3YXMgc2V0LlxuICAgICAqIEByZWplY3Qge1JhbmdlRXJyb3J9IFRoZSBwbGF5YmFjayByYXRlIHdhcyBsZXNzIHRoYW4gMC41IG9yIGdyZWF0ZXIgdGhhbiAyLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwbGF5YmFjayByYXRlIG9mIHRoZSBwbGF5ZXIgb24gYSBzY2FsZSBmcm9tIGAwLjVgIHRvIGAyYC4gV2hlbiBzZXRcbiAgICAgKiB2aWEgdGhlIEFQSSwgdGhlIHBsYXliYWNrIHJhdGUgd2lsbCBub3QgYmUgc3luY2hyb25pemVkIHRvIG90aGVyXG4gICAgICogcGxheWVycyBvciBzdG9yZWQgYXMgdGhlIHZpZXdlcidzIHByZWZlcmVuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGxheWJhY2tSYXRlXG4gICAgICogQHJldHVybiB7U2V0UGxheWJhY2tSYXRlUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFBsYXliYWNrUmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ3BsYXliYWNrUmF0ZScsIHBsYXliYWNrUmF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHBsYXllZCBwcm9wZXJ0eSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRQbGF5ZWRQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge0FycmF5fSBQbGF5ZWQgVGltZXJhbmdlcyBjb252ZXJ0ZWQgdG8gYW4gQXJyYXkuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBsYXllZCBwcm9wZXJ0eSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRQbGF5ZWRQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UGxheWVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBsYXllZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgncGxheWVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHF1YWxpdGllcyBhdmFpbGFibGUgb2YgdGhlIGN1cnJlbnQgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRRdWFsaXRpZXNQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge0FycmF5fSBUaGUgcXVhbGl0aWVzIG9mIHRoZSB2aWRlby5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcXVhbGl0aWVzIG9mIHRoZSBjdXJyZW50IHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0UXVhbGl0aWVzUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFF1YWxpdGllc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRRdWFsaXRpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3F1YWxpdGllcycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBjdXJyZW50IHNldCBxdWFsaXR5IG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldFF1YWxpdHlQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge3N0cmluZ30gVGhlIGN1cnJlbnQgc2V0IHF1YWxpdHkuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgc2V0IHF1YWxpdHkgb2YgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0UXVhbGl0eVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRRdWFsaXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFF1YWxpdHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3F1YWxpdHknKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHNldCB0aGUgdmlkZW8gcXVhbGl0eS5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIFNldFF1YWxpdHlQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge251bWJlcn0gVGhlIHF1YWxpdHkgd2FzIHNldC5cbiAgICAgKiBAcmVqZWN0IHtSYW5nZUVycm9yfSBUaGUgcXVhbGl0eSBpcyBub3QgYXZhaWxhYmxlLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IGEgdmlkZW8gcXVhbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaXR5XG4gICAgICogQHJldHVybiB7U2V0UXVhbGl0eVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRRdWFsaXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFF1YWxpdHkocXVhbGl0eSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0KCdxdWFsaXR5JywgcXVhbGl0eSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHNlZWthYmxlIHByb3BlcnR5IG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldFNlZWthYmxlUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtBcnJheX0gU2Vla2FibGUgVGltZXJhbmdlcyBjb252ZXJ0ZWQgdG8gYW4gQXJyYXkuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlZWthYmxlIHByb3BlcnR5IG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldFNlZWthYmxlUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFNlZWthYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlZWthYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdzZWVrYWJsZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBzZWVraW5nIHByb3BlcnR5IG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRTZWVraW5nUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBzZWVraW5nLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IGlmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHNlZWtpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRTZWVraW5nUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFNlZWtpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2Vla2luZygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnc2Vla2luZycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSB0ZXh0IHRyYWNrcyBvZiBhIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0VGV4dFRyYWNrc1Byb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7VmltZW9UZXh0VHJhY2tbXX0gVGhlIHRleHQgdHJhY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlkZW8uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHRleHQgdHJhY2tzIHRoYXQgZXhpc3QgZm9yIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldFRleHRUcmFja3NQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VGV4dFRyYWNrc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUZXh0VHJhY2tzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd0ZXh0VHJhY2tzJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIGVtYmVkIGNvZGUgZm9yIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldFZpZGVvRW1iZWRDb2RlUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtzdHJpbmd9IFRoZSBgPGlmcmFtZT5gIGVtYmVkIGNvZGUgZm9yIHRoZSB2aWRlby5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYDxpZnJhbWU+YCBlbWJlZCBjb2RlIGZvciB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRWaWRlb0VtYmVkQ29kZVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRWaWRlb0VtYmVkQ29kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWRlb0VtYmVkQ29kZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgndmlkZW9FbWJlZENvZGUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgaWQgb2YgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0VmlkZW9JZFByb21pc2VcbiAgICAgKiBAZnVsZmlsbCB7bnVtYmVyfSBUaGUgaWQgb2YgdGhlIHZpZGVvLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBpZCBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRWaWRlb0lkUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFZpZGVvSWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmlkZW9JZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgndmlkZW9JZCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSB0aXRsZSBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRWaWRlb1RpdGxlUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSB0aXRsZSBvZiB0aGUgdmlkZW8uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldFZpZGVvVGl0bGVQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmlkZW9UaXRsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWRlb1RpdGxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd2aWRlb1RpdGxlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIG5hdGl2ZSB3aWR0aCBvZiB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBHZXRWaWRlb1dpZHRoUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSBuYXRpdmUgd2lkdGggb2YgdGhlIHZpZGVvLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuYXRpdmUgd2lkdGggb2YgdGhlIGN1cnJlbnRseeKAkHBsYXlpbmcgdmlkZW8uIFRoZSB3aWR0aCBvZlxuICAgICAqIHRoZSBoaWdoZXN04oCQcmVzb2x1dGlvbiBhdmFpbGFibGUgd2lsbCBiZSB1c2VkIGJlZm9yZSBwbGF5YmFjayBiZWdpbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRWaWRlb1dpZHRoUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFZpZGVvV2lkdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmlkZW9XaWR0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgndmlkZW9XaWR0aCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2UgdG8gZ2V0IHRoZSBuYXRpdmUgaGVpZ2h0IG9mIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBwcm9taXNlIEdldFZpZGVvSGVpZ2h0UHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSBuYXRpdmUgaGVpZ2h0IG9mIHRoZSB2aWRlby5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmF0aXZlIGhlaWdodCBvZiB0aGUgY3VycmVudGx54oCQcGxheWluZyB2aWRlby4gVGhlIGhlaWdodCBvZlxuICAgICAqIHRoZSBoaWdoZXN04oCQcmVzb2x1dGlvbiBhdmFpbGFibGUgd2lsbCBiZSB1c2VkIGJlZm9yZSBwbGF5YmFjayBiZWdpbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtHZXRWaWRlb0hlaWdodFByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRWaWRlb0hlaWdodFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWaWRlb0hlaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgndmlkZW9IZWlnaHQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIGdldCB0aGUgdmltZW8uY29tIHVybCBmb3IgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0VmlkZW9VcmxQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge251bWJlcn0gVGhlIHZpbWVvLmNvbSB1cmwgZm9yIHRoZSB2aWRlby5cbiAgICAgKiBAcmVqZWN0IHtQcml2YWN5RXJyb3J9IFRoZSB1cmwgaXNu4oCZdCBhdmFpbGFibGUgYmVjYXVzZSBvZiB0aGUgdmlkZW/igJlzIHByaXZhY3kgc2V0dGluZy5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmltZW8uY29tIHVybCBmb3IgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQHJldHVybiB7R2V0VmlkZW9VcmxQcm9taXNlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmlkZW9VcmxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmlkZW9VcmwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoJ3ZpZGVvVXJsJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0byBnZXQgdGhlIHZvbHVtZSBsZXZlbCBvZiB0aGUgcGxheWVyLlxuICAgICAqXG4gICAgICogQHByb21pc2UgR2V0Vm9sdW1lUHJvbWlzZVxuICAgICAqIEBmdWxmaWxsIHtudW1iZXJ9IFRoZSB2b2x1bWUgbGV2ZWwgb2YgdGhlIHBsYXllciBvbiBhIHNjYWxlIGZyb20gMCB0byAxLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHZvbHVtZSBsZXZlbCBvZiB0aGUgcGxheWVyIG9uIGEgc2NhbGUgZnJvbSBgMGAgdG8gYDFgLlxuICAgICAqXG4gICAgICogTW9zdCBtb2JpbGUgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBhbiBpbmRlcGVuZGVudCB2b2x1bWUgZnJvbSB0aGVcbiAgICAgKiBzeXN0ZW0gdm9sdW1lLiBJbiB0aG9zZSBjYXNlcywgdGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgcmV0dXJuIGAxYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0dldFZvbHVtZVByb21pc2V9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Vm9sdW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd2b2x1bWUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwcm9taXNlIHRvIHNldCB0aGUgdm9sdW1lIGxldmVsIG9mIHRoZSBwbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvbWlzZSBTZXRWb2x1bWVQcm9taXNlXG4gICAgICogQGZ1bGZpbGwge251bWJlcn0gVGhlIHZvbHVtZSB3YXMgc2V0LlxuICAgICAqIEByZWplY3Qge1JhbmdlRXJyb3J9IFRoZSB2b2x1bWUgd2FzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiAxLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB2b2x1bWUgb2YgdGhlIHBsYXllciBvbiBhIHNjYWxlIGZyb20gYDBgIHRvIGAxYC4gV2hlbiBzZXRcbiAgICAgKiB2aWEgdGhlIEFQSSwgdGhlIHZvbHVtZSBsZXZlbCB3aWxsIG5vdCBiZSBzeW5jaHJvbml6ZWQgdG8gb3RoZXJcbiAgICAgKiBwbGF5ZXJzIG9yIHN0b3JlZCBhcyB0aGUgdmlld2Vy4oCZcyBwcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogTW9zdCBtb2JpbGUgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSB2b2x1bWUuIEFuIGVycm9yIHdpbGxcbiAgICAgKiAqbm90KiBiZSB0cmlnZ2VyZWQgaW4gdGhhdCBzaXR1YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdm9sdW1lXG4gICAgICogQHJldHVybiB7U2V0Vm9sdW1lUHJvbWlzZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFZvbHVtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWb2x1bWUodm9sdW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXQoJ3ZvbHVtZScsIHZvbHVtZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBsYXllcjtcbn0oKTsgLy8gU2V0dXAgZW1iZWQgb25seSBpZiB0aGlzIGlzIG5vdCBhIG5vZGUgZW52aXJvbm1lbnRcblxuXG5pZiAoIWlzTm9kZSkge1xuICBzY3JlZW5mdWxsID0gaW5pdGlhbGl6ZVNjcmVlbmZ1bGwoKTtcbiAgaW5pdGlhbGl6ZUVtYmVkcygpO1xuICByZXNpemVFbWJlZHMoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxheWVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@vimeo/player/dist/player.es.js\n");

/***/ }),

/***/ "./source/scripts/components/FacetedFilters.js":
/*!*****************************************************!*\
  !*** ./source/scripts/components/FacetedFilters.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ FacetedFilters)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n\n\nclass FacetedFilters {\n  constructor(section) {\n    this.el = section.el;\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__.default();\n    this.filterInputs = null;\n    this.dropdowns = this.el.querySelectorAll('[data-filter-group]');\n    this.summaryEls = this.el.querySelectorAll('[data-filter-group-summary]');\n    this.filterContents = this.el.querySelectorAll('[data-filter-group-content]');\n    this.closedState = 'closed';\n    this.openState = 'open';\n    this.disclosureAnimations = {};\n    this.filterRange = this.el.querySelectorAll('[data-filter-range]');\n    this.rangeNames = [];\n    this.filterRange.forEach(el => {\n      this.rangeNames.push(el.name);\n    });\n    this.updateTimeout = null;\n    this.initFilterEvents = this.initFilterEvents.bind(this);\n    this.updatePrice = this.updatePrice.bind(this);\n    this.buildFilterQuery = this.buildFilterQuery.bind(this);\n    this.initAnimations();\n    this.initFilterEvents();\n  }\n\n  initFilterEvents() {\n    /* For radio buttons */\n    this.filterInputs = this.el.querySelectorAll('[data-filter-input]');\n    this.filterInputs.forEach(filter => {\n      this.events.register(filter, 'click', e => {\n        const target = e.currentTarget;\n\n        if (target.dataset.hasOwnProperty('disabled')) {\n          e.preventDefault();\n          return;\n        }\n\n        this._filterClick(target);\n      });\n    });\n    this.filterContents.forEach(content => {\n      this.events.register(window, 'resize', () => this._setStyleVariables(content));\n    });\n    this.events.register(window, 'keyup', e => {\n      if (e.key === 'Escape') {\n        this.closeAllDropdowns();\n      }\n    });\n    /* For range input */\n\n    this.filterRange.forEach(filter => {\n      this.events.register(filter, 'change', e => this.updatePrice(e.currentTarget));\n      this.events.register(filter, 'keyup', e => {\n        if (e.key !== 'Tab') {\n          this.updatePrice(e.currentTarget);\n        }\n      });\n    });\n    this.summaryEls.forEach(summary => {\n      this.events.register(summary, 'click', event => {\n        this.animateDisclosure(event);\n      });\n    });\n    /* When clicking outside dropdown element, close dropdown */\n\n    this.events.register(document.body, 'click', e => {\n      if (!e.target.closest('[data-filter-group]')) {\n        this.closeAllDropdowns();\n      }\n    });\n  }\n\n  _filterClick(target) {\n    const checkbox = target.querySelector('[data-filter-checkbox]');\n\n    if (target.hasAttribute('data-filter-active')) {\n      if (checkbox) {\n        checkbox.removeAttribute('data-checked');\n      }\n\n      target.removeAttribute('data-filter-active');\n    } else {\n      if (checkbox) {\n        checkbox.setAttribute('data-checked', '');\n      }\n\n      target.setAttribute('data-filter-active', '');\n    }\n  }\n  /*\n   * Initialize animations on checkbox container\n   * using filter tag as JSON key\n   */\n\n\n  initAnimations() {\n    this.summaryEls.forEach(summary => {\n      const filterList = summary.nextElementSibling;\n      const currentDetailsEl = summary.closest('[data-filter-group]');\n      const index = summary.dataset.filterGroupIndex;\n      this.disclosureAnimations[index] = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_0__.transition)({\n        el: filterList,\n        state: this.closedState\n      });\n      currentDetailsEl.style.setProperty('--closed-height', `${summary.offsetHeight}px`);\n    });\n  }\n\n  buildFilterQuery(element) {\n    let searchParameters; // If input is price range, the url_to_add property is not available, so we\n    // need to build the query manually\n\n    if (element.classList.contains('filter-range-input')) {\n      const currentSearch = window.location.search.replace('?', '');\n      const formData = new FormData(element.closest('form'));\n      const newSearch = new URLSearchParams(formData).toString(); // Filter through current search string to see if price range input already exists,\n      // if it does, create new string without current price range parameters\n\n      const splitCurrentSearch = currentSearch.split('&');\n      let filteredCurrentSearch = splitCurrentSearch.filter(search => {\n        if (search.includes(this.rangeNames[0]) || search.includes(this.rangeNames[1])) {\n          return false;\n        }\n\n        return true;\n      });\n      filteredCurrentSearch = filteredCurrentSearch.join('&'); // If current search parameters exist, append new search parameters\n      // on to existing parameters\n\n      if (filteredCurrentSearch.length > 0) {\n        searchParameters = `${filteredCurrentSearch}&${newSearch}`;\n      } else {\n        searchParameters = `${newSearch}`;\n      }\n    }\n\n    let urlQueryString = '';\n    urlQueryString = `?${searchParameters}`;\n    return urlQueryString;\n  }\n\n  updatePrice(element) {\n    // cancel any pending requests\n    if (this.updateTimeout !== null) {\n      clearTimeout(this.updateTimeout);\n    } // Wait for user to finish entering input before reloading page\n\n\n    this.updateTimeout = setTimeout(() => {\n      this.getFilteredResults(element);\n    }, 2000);\n  }\n\n  getFilteredResults(element) {\n    const filterQuery = this.buildFilterQuery(element);\n    window.location.search = filterQuery;\n  }\n\n  animateDisclosure(event) {\n    event.preventDefault();\n    const summary = event.currentTarget;\n    const filterList = summary.nextElementSibling;\n    const currentDetailsEl = summary.closest('[data-filter-group]');\n    /* Handle dropdowns on click event outside disclosure */\n\n    if (filterList == null) {\n      this.closeAllDropdowns();\n    } else {\n      if (filterList.dataset.animation) return;\n\n      if (filterList.dataset.animationState === this.openState) {\n        this.closeDisclosure(currentDetailsEl);\n      } else {\n        /* Close any open dropdowns before opening new dropdown */\n        this.closeAllDropdowns();\n        this.openDisclosure(currentDetailsEl);\n      }\n    }\n  }\n\n  _setStyleVariables(el) {\n    // On desktop, we should check if the dropdown overflows the\n    // viewport, and add a class if it does so we can align it\n    // relative to the summary element accordingly\n    const {\n      right: rightBounds,\n      left: leftBounds\n    } = el.getBoundingClientRect();\n\n    if (rightBounds >= window.innerWidth) {\n      el.classList.add('filters--overflow-right');\n    }\n\n    if (leftBounds <= 0) {\n      el.classList.add('filters--overflow-left');\n    } // We need to absolutely position the open disclosure to center it on mobile\n    // and make it full screen, so we set some CSS variables to do that\n\n\n    const wrapper = el.closest('.faceted-filters');\n    const {\n      width: mobileWidth,\n      left: mobileLeft\n    } = wrapper.getBoundingClientRect();\n    el.style.setProperty('--mobile-width', `${mobileWidth}px`);\n    el.style.setProperty('--mobile-left', `${mobileLeft}px`);\n    el.style.setProperty('--open-height', `${el.offsetHeight}px`);\n  }\n\n  openDisclosure(detailsEl) {\n    const index = detailsEl.querySelector('[data-filter-group-summary]').dataset.filterGroupIndex;\n    detailsEl.setAttribute('open', '');\n    this.disclosureAnimations[index].animateTo(this.openState, {\n      onStart: ({\n        el\n      }) => {\n        this._setStyleVariables(el);\n      }\n    });\n    detailsEl.classList.add('dropdown-expanded');\n  }\n\n  closeDisclosure(detailsEl) {\n    const index = detailsEl.querySelector('[data-filter-group-summary]').dataset.filterGroupIndex;\n    this.disclosureAnimations[index].animateTo(this.closedState).then(() => {\n      detailsEl.removeAttribute('open');\n    });\n    detailsEl.classList.remove('dropdown-expanded');\n  }\n\n  closeAllDropdowns() {\n    this.dropdowns.forEach(dropdown => {\n      if (dropdown.classList.contains('dropdown-expanded')) {\n        this.closeDisclosure(dropdown);\n      }\n    });\n  }\n\n  unload() {\n    if (this.events) {\n      this.events.unregisterAll();\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL0ZhY2V0ZWRGaWx0ZXJzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvRmFjZXRlZEZpbHRlcnMuanM/M2MwYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSAnQHBpeGVsdW5pb24vYW5pbWF0aW9ucyc7XG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZhY2V0ZWRGaWx0ZXJzIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuXG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG5cbiAgICB0aGlzLmZpbHRlcklucHV0cyA9IG51bGw7XG4gICAgdGhpcy5kcm9wZG93bnMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlci1ncm91cF0nKTtcbiAgICB0aGlzLnN1bW1hcnlFbHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlci1ncm91cC1zdW1tYXJ5XScpO1xuICAgIHRoaXMuZmlsdGVyQ29udGVudHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlci1ncm91cC1jb250ZW50XScpO1xuXG4gICAgdGhpcy5jbG9zZWRTdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMub3BlblN0YXRlID0gJ29wZW4nO1xuICAgIHRoaXMuZGlzY2xvc3VyZUFuaW1hdGlvbnMgPSB7fTtcblxuICAgIHRoaXMuZmlsdGVyUmFuZ2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZpbHRlci1yYW5nZV0nKTtcbiAgICB0aGlzLnJhbmdlTmFtZXMgPSBbXTtcblxuICAgIHRoaXMuZmlsdGVyUmFuZ2UuZm9yRWFjaChlbCA9PiB7XG4gICAgICB0aGlzLnJhbmdlTmFtZXMucHVzaChlbC5uYW1lKTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlVGltZW91dCA9IG51bGw7XG5cbiAgICB0aGlzLmluaXRGaWx0ZXJFdmVudHMgPSB0aGlzLmluaXRGaWx0ZXJFdmVudHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZVByaWNlID0gdGhpcy51cGRhdGVQcmljZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYnVpbGRGaWx0ZXJRdWVyeSA9IHRoaXMuYnVpbGRGaWx0ZXJRdWVyeS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5pbml0QW5pbWF0aW9ucygpO1xuICAgIHRoaXMuaW5pdEZpbHRlckV2ZW50cygpO1xuICB9XG5cbiAgaW5pdEZpbHRlckV2ZW50cygpIHtcbiAgICAvKiBGb3IgcmFkaW8gYnV0dG9ucyAqL1xuICAgIHRoaXMuZmlsdGVySW5wdXRzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1maWx0ZXItaW5wdXRdJyk7XG5cbiAgICB0aGlzLmZpbHRlcklucHV0cy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihmaWx0ZXIsICdjbGljaycsIGUgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmICh0YXJnZXQuZGF0YXNldC5oYXNPd25Qcm9wZXJ0eSgnZGlzYWJsZWQnKSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maWx0ZXJDbGljayh0YXJnZXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbHRlckNvbnRlbnRzLmZvckVhY2goY29udGVudCA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRTdHlsZVZhcmlhYmxlcyhjb250ZW50KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdrZXl1cCcsIGUgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICB0aGlzLmNsb3NlQWxsRHJvcGRvd25zKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKiBGb3IgcmFuZ2UgaW5wdXQgKi9cbiAgICB0aGlzLmZpbHRlclJhbmdlLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGZpbHRlciwgJ2NoYW5nZScsIGUgPT4gdGhpcy51cGRhdGVQcmljZShlLmN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGZpbHRlciwgJ2tleXVwJywgZSA9PiB7XG4gICAgICAgIGlmIChlLmtleSAhPT0gJ1RhYicpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVByaWNlKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zdW1tYXJ5RWxzLmZvckVhY2goc3VtbWFyeSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihzdW1tYXJ5LCAnY2xpY2snLCBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuYW5pbWF0ZURpc2Nsb3N1cmUoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKiBXaGVuIGNsaWNraW5nIG91dHNpZGUgZHJvcGRvd24gZWxlbWVudCwgY2xvc2UgZHJvcGRvd24gKi9cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihkb2N1bWVudC5ib2R5LCAnY2xpY2snLCBlID0+IHtcbiAgICAgIGlmICghZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtZmlsdGVyLWdyb3VwXScpKSB7XG4gICAgICAgIHRoaXMuY2xvc2VBbGxEcm9wZG93bnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9maWx0ZXJDbGljayh0YXJnZXQpIHtcbiAgICBjb25zdCBjaGVja2JveCA9IHRhcmdldC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1maWx0ZXItY2hlY2tib3hdJyk7XG5cbiAgICBpZiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1maWx0ZXItYWN0aXZlJykpIHtcbiAgICAgIGlmIChjaGVja2JveCkge1xuICAgICAgICBjaGVja2JveC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY2hlY2tlZCcpO1xuICAgICAgfVxuICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1maWx0ZXItYWN0aXZlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVja2JveCkge1xuICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2hlY2tlZCcsICcnKTtcbiAgICAgIH1cbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZmlsdGVyLWFjdGl2ZScsICcnKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBJbml0aWFsaXplIGFuaW1hdGlvbnMgb24gY2hlY2tib3ggY29udGFpbmVyXG4gICAqIHVzaW5nIGZpbHRlciB0YWcgYXMgSlNPTiBrZXlcbiAgICovXG5cbiAgaW5pdEFuaW1hdGlvbnMoKSB7XG4gICAgdGhpcy5zdW1tYXJ5RWxzLmZvckVhY2goc3VtbWFyeSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gc3VtbWFyeS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICBjb25zdCBjdXJyZW50RGV0YWlsc0VsID0gc3VtbWFyeS5jbG9zZXN0KCdbZGF0YS1maWx0ZXItZ3JvdXBdJyk7XG4gICAgICBjb25zdCBpbmRleCA9IHN1bW1hcnkuZGF0YXNldC5maWx0ZXJHcm91cEluZGV4O1xuICAgICAgdGhpcy5kaXNjbG9zdXJlQW5pbWF0aW9uc1tpbmRleF0gPSB0cmFuc2l0aW9uKHsgZWw6IGZpbHRlckxpc3QsIHN0YXRlOiB0aGlzLmNsb3NlZFN0YXRlIH0pO1xuICAgICAgY3VycmVudERldGFpbHNFbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jbG9zZWQtaGVpZ2h0JywgYCR7c3VtbWFyeS5vZmZzZXRIZWlnaHR9cHhgKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJ1aWxkRmlsdGVyUXVlcnkoZWxlbWVudCkge1xuICAgIGxldCBzZWFyY2hQYXJhbWV0ZXJzO1xuXG4gICAgLy8gSWYgaW5wdXQgaXMgcHJpY2UgcmFuZ2UsIHRoZSB1cmxfdG9fYWRkIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUsIHNvIHdlXG4gICAgLy8gbmVlZCB0byBidWlsZCB0aGUgcXVlcnkgbWFudWFsbHlcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZpbHRlci1yYW5nZS1pbnB1dCcpKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VhcmNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKCc/JywgJycpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudC5jbG9zZXN0KCdmb3JtJykpO1xuICAgICAgY29uc3QgbmV3U2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSkudG9TdHJpbmcoKTtcblxuICAgICAgLy8gRmlsdGVyIHRocm91Z2ggY3VycmVudCBzZWFyY2ggc3RyaW5nIHRvIHNlZSBpZiBwcmljZSByYW5nZSBpbnB1dCBhbHJlYWR5IGV4aXN0cyxcbiAgICAgIC8vIGlmIGl0IGRvZXMsIGNyZWF0ZSBuZXcgc3RyaW5nIHdpdGhvdXQgY3VycmVudCBwcmljZSByYW5nZSBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBzcGxpdEN1cnJlbnRTZWFyY2ggPSBjdXJyZW50U2VhcmNoLnNwbGl0KCcmJyk7XG5cbiAgICAgIGxldCBmaWx0ZXJlZEN1cnJlbnRTZWFyY2ggPSBzcGxpdEN1cnJlbnRTZWFyY2guZmlsdGVyKHNlYXJjaCA9PiB7XG4gICAgICAgIGlmIChzZWFyY2guaW5jbHVkZXModGhpcy5yYW5nZU5hbWVzWzBdKSB8fCBzZWFyY2guaW5jbHVkZXModGhpcy5yYW5nZU5hbWVzWzFdKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGZpbHRlcmVkQ3VycmVudFNlYXJjaCA9IGZpbHRlcmVkQ3VycmVudFNlYXJjaC5qb2luKCcmJyk7XG5cbiAgICAgIC8vIElmIGN1cnJlbnQgc2VhcmNoIHBhcmFtZXRlcnMgZXhpc3QsIGFwcGVuZCBuZXcgc2VhcmNoIHBhcmFtZXRlcnNcbiAgICAgIC8vIG9uIHRvIGV4aXN0aW5nIHBhcmFtZXRlcnNcbiAgICAgIGlmIChmaWx0ZXJlZEN1cnJlbnRTZWFyY2gubGVuZ3RoID4gMCkge1xuICAgICAgICBzZWFyY2hQYXJhbWV0ZXJzID0gYCR7ZmlsdGVyZWRDdXJyZW50U2VhcmNofSYke25ld1NlYXJjaH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VhcmNoUGFyYW1ldGVycyA9IGAke25ld1NlYXJjaH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB1cmxRdWVyeVN0cmluZyA9ICcnO1xuXG4gICAgdXJsUXVlcnlTdHJpbmcgPSBgPyR7c2VhcmNoUGFyYW1ldGVyc31gO1xuXG4gICAgcmV0dXJuIHVybFF1ZXJ5U3RyaW5nO1xuICB9XG5cbiAgdXBkYXRlUHJpY2UoZWxlbWVudCkge1xuICAgIC8vIGNhbmNlbCBhbnkgcGVuZGluZyByZXF1ZXN0c1xuICAgIGlmICh0aGlzLnVwZGF0ZVRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZGF0ZVRpbWVvdXQpO1xuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIHVzZXIgdG8gZmluaXNoIGVudGVyaW5nIGlucHV0IGJlZm9yZSByZWxvYWRpbmcgcGFnZVxuICAgIHRoaXMudXBkYXRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5nZXRGaWx0ZXJlZFJlc3VsdHMoZWxlbWVudCk7XG4gICAgfSwgMjAwMCk7XG4gIH1cblxuICBnZXRGaWx0ZXJlZFJlc3VsdHMoZWxlbWVudCkge1xuICAgIGNvbnN0IGZpbHRlclF1ZXJ5ID0gdGhpcy5idWlsZEZpbHRlclF1ZXJ5KGVsZW1lbnQpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPSBmaWx0ZXJRdWVyeTtcbiAgfVxuXG4gIGFuaW1hdGVEaXNjbG9zdXJlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCBmaWx0ZXJMaXN0ID0gc3VtbWFyeS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgY29uc3QgY3VycmVudERldGFpbHNFbCA9IHN1bW1hcnkuY2xvc2VzdCgnW2RhdGEtZmlsdGVyLWdyb3VwXScpO1xuXG4gICAgLyogSGFuZGxlIGRyb3Bkb3ducyBvbiBjbGljayBldmVudCBvdXRzaWRlIGRpc2Nsb3N1cmUgKi9cbiAgICBpZiAoZmlsdGVyTGlzdCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmNsb3NlQWxsRHJvcGRvd25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWx0ZXJMaXN0LmRhdGFzZXQuYW5pbWF0aW9uKSByZXR1cm47XG5cbiAgICAgIGlmIChmaWx0ZXJMaXN0LmRhdGFzZXQuYW5pbWF0aW9uU3RhdGUgPT09IHRoaXMub3BlblN0YXRlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VEaXNjbG9zdXJlKGN1cnJlbnREZXRhaWxzRWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogQ2xvc2UgYW55IG9wZW4gZHJvcGRvd25zIGJlZm9yZSBvcGVuaW5nIG5ldyBkcm9wZG93biAqL1xuICAgICAgICB0aGlzLmNsb3NlQWxsRHJvcGRvd25zKCk7XG4gICAgICAgIHRoaXMub3BlbkRpc2Nsb3N1cmUoY3VycmVudERldGFpbHNFbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3NldFN0eWxlVmFyaWFibGVzKGVsKSB7XG4gICAgLy8gT24gZGVza3RvcCwgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBkcm9wZG93biBvdmVyZmxvd3MgdGhlXG4gICAgLy8gdmlld3BvcnQsIGFuZCBhZGQgYSBjbGFzcyBpZiBpdCBkb2VzIHNvIHdlIGNhbiBhbGlnbiBpdFxuICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBzdW1tYXJ5IGVsZW1lbnQgYWNjb3JkaW5nbHlcblxuICAgIGNvbnN0IHsgcmlnaHQ6IHJpZ2h0Qm91bmRzLCBsZWZ0OiBsZWZ0Qm91bmRzIH0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmIChyaWdodEJvdW5kcyA+PSB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnZmlsdGVycy0tb3ZlcmZsb3ctcmlnaHQnKTtcbiAgICB9XG5cbiAgICBpZiAobGVmdEJvdW5kcyA8PSAwKSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmaWx0ZXJzLS1vdmVyZmxvdy1sZWZ0Jyk7XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byBhYnNvbHV0ZWx5IHBvc2l0aW9uIHRoZSBvcGVuIGRpc2Nsb3N1cmUgdG8gY2VudGVyIGl0IG9uIG1vYmlsZVxuICAgIC8vIGFuZCBtYWtlIGl0IGZ1bGwgc2NyZWVuLCBzbyB3ZSBzZXQgc29tZSBDU1MgdmFyaWFibGVzIHRvIGRvIHRoYXRcbiAgICBjb25zdCB3cmFwcGVyID0gZWwuY2xvc2VzdCgnLmZhY2V0ZWQtZmlsdGVycycpO1xuXG4gICAgY29uc3QgeyB3aWR0aDogbW9iaWxlV2lkdGgsIGxlZnQ6IG1vYmlsZUxlZnQgfSA9IHdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1tb2JpbGUtd2lkdGgnLCBgJHttb2JpbGVXaWR0aH1weGApO1xuICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCctLW1vYmlsZS1sZWZ0JywgYCR7bW9iaWxlTGVmdH1weGApO1xuXG4gICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJy0tb3Blbi1oZWlnaHQnLCBgJHtlbC5vZmZzZXRIZWlnaHR9cHhgKTtcbiAgfVxuXG4gIG9wZW5EaXNjbG9zdXJlKGRldGFpbHNFbCkge1xuICAgIGNvbnN0IGluZGV4ID0gZGV0YWlsc0VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZpbHRlci1ncm91cC1zdW1tYXJ5XScpLmRhdGFzZXQuZmlsdGVyR3JvdXBJbmRleDtcbiAgICBkZXRhaWxzRWwuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpO1xuXG4gICAgdGhpcy5kaXNjbG9zdXJlQW5pbWF0aW9uc1tpbmRleF1cbiAgICAgIC5hbmltYXRlVG8odGhpcy5vcGVuU3RhdGUsIHtcbiAgICAgICAgb25TdGFydDogKHsgZWwgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3NldFN0eWxlVmFyaWFibGVzKGVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBkZXRhaWxzRWwuY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tZXhwYW5kZWQnKTtcbiAgfVxuXG4gIGNsb3NlRGlzY2xvc3VyZShkZXRhaWxzRWwpIHtcbiAgICBjb25zdCBpbmRleCA9IGRldGFpbHNFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1maWx0ZXItZ3JvdXAtc3VtbWFyeV0nKS5kYXRhc2V0LmZpbHRlckdyb3VwSW5kZXg7XG5cbiAgICB0aGlzLmRpc2Nsb3N1cmVBbmltYXRpb25zW2luZGV4XVxuICAgICAgLmFuaW1hdGVUbyh0aGlzLmNsb3NlZFN0YXRlKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBkZXRhaWxzRWwucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG4gICAgICB9KTtcblxuICAgIGRldGFpbHNFbC5jbGFzc0xpc3QucmVtb3ZlKCdkcm9wZG93bi1leHBhbmRlZCcpO1xuICB9XG5cbiAgY2xvc2VBbGxEcm9wZG93bnMoKSB7XG4gICAgdGhpcy5kcm9wZG93bnMuZm9yRWFjaChkcm9wZG93biA9PiB7XG4gICAgICBpZiAoZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKCdkcm9wZG93bi1leHBhbmRlZCcpKSB7XG4gICAgICAgIHRoaXMuY2xvc2VEaXNjbG9zdXJlKGRyb3Bkb3duKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICBpZiAodGhpcy5ldmVudHMpIHtcbiAgICAgIHRoaXMuZXZlbnRzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxRQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/FacetedFilters.js\n");

/***/ }),

/***/ "./source/scripts/components/ImageZoom.js":
/*!************************************************!*\
  !*** ./source/scripts/components/ImageZoom.js ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ImageZoom)\n/* harmony export */ });\nclass ImageZoom {\n  constructor(component) {\n    this.viewport = component.viewport;\n    this.images = component.images;\n    this.imageId = null;\n    this.el = null;\n    this.zoomArea = null;\n    this.zoomAreaContainer = null;\n    this.toggleZoomEvent = this.toggleZoom.bind(this);\n    this.zoomImageEvent = this.zoomImage.bind(this);\n    this.setVariables();\n    this.prepareZoom();\n  }\n\n  _unbindEvents() {\n    if (this.zoomAreaContainer) {\n      this.zoomAreaContainer.removeEventListener('click', this.toggleZoomEvent);\n    }\n\n    if (this.zoomArea) {\n      this.zoomArea.removeEventListener('mouseout', this.toggleZoomEvent);\n      this.zoomArea.removeEventListener('mousemove', this.zoomImageEvent);\n    }\n  }\n\n  setVariables() {\n    const currentImage = this.viewport.querySelector('[data-product-gallery-selected=\"true\"] img');\n\n    if (!currentImage) {\n      this.imageId = null;\n      this.el = null;\n      this.zoomArea = null;\n      this.zoomAreaContainer = null;\n      return;\n    }\n\n    this.imageId = currentImage.getAttribute('data-image-zoom');\n    const div = document.createElement('div');\n    div.innerHTML = this.images[this.imageId];\n    this.el = div.firstElementChild;\n    this.zoomArea = this.viewport.querySelector(`[data-product-zoom-id=\"${this.imageId}\"]`);\n    this.zoomAreaContainer = this.viewport.querySelector(`[data-media=\"${this.imageId}\"] .product-gallery--media-wrapper`);\n    this.zoomAreaContainer.addEventListener('click', this.toggleZoomEvent);\n    this.zoomArea.addEventListener('mouseout', this.toggleZoomEvent);\n    this.zoomArea.addEventListener('mousemove', this.zoomImageEvent);\n  }\n\n  prepareZoom(resetVariables) {\n    if (resetVariables) {\n      this._unbindEvents();\n\n      this.setVariables();\n    }\n\n    if (!this.imageId) return;\n    const imageSource = this.el.getAttribute('src');\n    const {\n      width: photoAreaWidth,\n      height: photoAreaHeight\n    } = this.zoomAreaContainer.getBoundingClientRect();\n    const newImage = new Image();\n    newImage.addEventListener('load', () => {\n      this.zoomImageWidth = newImage.width;\n      this.zoomImageHeight = newImage.height;\n      const ratio = Math.max(this.zoomImageWidth / photoAreaWidth, this.zoomImageHeight / photoAreaHeight); // Only enable the zoom if a certain zooming ratio is met.\n\n      if (ratio < 1.4) {\n        this.zoomAreaContainer.classList.remove('zoom-enabled');\n      } else {\n        this.zoomAreaContainer.classList.add('zoom-enabled');\n        this.zoomArea.style.backgroundImage = `url(${imageSource})`;\n      }\n    });\n    newImage.src = imageSource;\n  }\n\n  toggleZoom(e) {\n    if (this.zoomAreaContainer.classList.contains('zoom-enabled')) {\n      if (e.type === 'mouseout') {\n        this.zoomArea.classList.remove('active');\n        return;\n      }\n\n      this.zoomArea.classList.toggle('active');\n      this.zoomImage(e);\n    }\n  }\n\n  zoomImage(e) {\n    const {\n      width: zoomWidth,\n      height: zoomHeight\n    } = this.zoomArea.getBoundingClientRect();\n    const {\n      top: bigImageTop,\n      left: bigImageLeft\n    } = this.zoomAreaContainer.getBoundingClientRect();\n    const bigImageX = Math.round(bigImageLeft);\n    const bigImageY = Math.round(bigImageTop);\n    const mousePositionX = e.clientX - bigImageX;\n    const mousePositionY = e.clientY - bigImageY; // Make sure our mouse position is still inside our box.\n\n    if (mousePositionX < zoomWidth && mousePositionY < zoomHeight && mousePositionX > 0 && mousePositionY > 0) {\n      if (this.zoomArea.classList.contains('active')) {\n        // Figure out how to position the zoomed image.\n        let ratioX = Math.round(mousePositionX / zoomWidth * this.zoomImageWidth - zoomWidth / 2) * -1;\n        let ratioY = Math.round(mousePositionY / zoomHeight * this.zoomImageHeight - zoomHeight / 2) * -1;\n\n        if (ratioX > 0) {\n          ratioX = 0;\n        }\n\n        if (ratioY > 0) {\n          ratioY = 0;\n        }\n\n        if (ratioX < -(this.zoomImageWidth - zoomWidth)) {\n          ratioX = -(this.zoomImageWidth - zoomWidth);\n        }\n\n        if (ratioY < -(this.zoomImageHeight - zoomHeight)) {\n          ratioY = -(this.zoomImageHeight - zoomHeight);\n        }\n\n        const newBackgroundPosition = `${ratioX}px ${ratioY}px`;\n        this.zoomArea.style.backgroundPosition = newBackgroundPosition;\n      }\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL0ltYWdlWm9vbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL0ltYWdlWm9vbS5qcz9hMjU4Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlWm9vbSB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkge1xuICAgIHRoaXMudmlld3BvcnQgPSBjb21wb25lbnQudmlld3BvcnQ7XG4gICAgdGhpcy5pbWFnZXMgPSBjb21wb25lbnQuaW1hZ2VzO1xuICAgIHRoaXMuaW1hZ2VJZCA9IG51bGw7XG4gICAgdGhpcy5lbCA9IG51bGw7XG4gICAgdGhpcy56b29tQXJlYSA9IG51bGw7XG4gICAgdGhpcy56b29tQXJlYUNvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy50b2dnbGVab29tRXZlbnQgPSB0aGlzLnRvZ2dsZVpvb20uYmluZCh0aGlzKTtcbiAgICB0aGlzLnpvb21JbWFnZUV2ZW50ID0gdGhpcy56b29tSW1hZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNldFZhcmlhYmxlcygpO1xuICAgIHRoaXMucHJlcGFyZVpvb20oKTtcbiAgfVxuXG4gIF91bmJpbmRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuem9vbUFyZWFDb250YWluZXIpIHtcbiAgICAgIHRoaXMuem9vbUFyZWFDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnRvZ2dsZVpvb21FdmVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuem9vbUFyZWEpIHtcbiAgICAgIHRoaXMuem9vbUFyZWEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLnRvZ2dsZVpvb21FdmVudCk7XG4gICAgICB0aGlzLnpvb21BcmVhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuem9vbUltYWdlRXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHNldFZhcmlhYmxlcygpIHtcbiAgICBjb25zdCBjdXJyZW50SW1hZ2UgPSB0aGlzLnZpZXdwb3J0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtZ2FsbGVyeS1zZWxlY3RlZD1cInRydWVcIl0gaW1nJyk7XG4gICAgaWYgKCFjdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuaW1hZ2VJZCA9IG51bGw7XG4gICAgICB0aGlzLmVsID0gbnVsbDtcbiAgICAgIHRoaXMuem9vbUFyZWEgPSBudWxsO1xuICAgICAgdGhpcy56b29tQXJlYUNvbnRhaW5lciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZUlkID0gY3VycmVudEltYWdlLmdldEF0dHJpYnV0ZSgnZGF0YS1pbWFnZS16b29tJyk7XG5cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGRpdi5pbm5lckhUTUwgPSB0aGlzLmltYWdlc1t0aGlzLmltYWdlSWRdO1xuICAgIHRoaXMuZWwgPSBkaXYuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgdGhpcy56b29tQXJlYSA9IHRoaXMudmlld3BvcnQucXVlcnlTZWxlY3RvcihgW2RhdGEtcHJvZHVjdC16b29tLWlkPVwiJHt0aGlzLmltYWdlSWR9XCJdYCk7XG4gICAgdGhpcy56b29tQXJlYUNvbnRhaW5lciA9IHRoaXMudmlld3BvcnQucXVlcnlTZWxlY3RvcihgW2RhdGEtbWVkaWE9XCIke3RoaXMuaW1hZ2VJZH1cIl0gLnByb2R1Y3QtZ2FsbGVyeS0tbWVkaWEtd3JhcHBlcmApO1xuXG4gICAgdGhpcy56b29tQXJlYUNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudG9nZ2xlWm9vbUV2ZW50KTtcbiAgICB0aGlzLnpvb21BcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy50b2dnbGVab29tRXZlbnQpO1xuICAgIHRoaXMuem9vbUFyZWEuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy56b29tSW1hZ2VFdmVudCk7XG4gIH1cblxuICBwcmVwYXJlWm9vbShyZXNldFZhcmlhYmxlcykge1xuICAgIGlmIChyZXNldFZhcmlhYmxlcykge1xuICAgICAgdGhpcy5fdW5iaW5kRXZlbnRzKCk7XG4gICAgICB0aGlzLnNldFZhcmlhYmxlcygpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pbWFnZUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBpbWFnZVNvdXJjZSA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICBjb25zdCB7IHdpZHRoOiBwaG90b0FyZWFXaWR0aCwgaGVpZ2h0OiBwaG90b0FyZWFIZWlnaHQgfSA9IHRoaXMuem9vbUFyZWFDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBuZXdJbWFnZSA9IG5ldyBJbWFnZSgpO1xuXG4gICAgbmV3SW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgIHRoaXMuem9vbUltYWdlV2lkdGggPSBuZXdJbWFnZS53aWR0aDtcbiAgICAgIHRoaXMuem9vbUltYWdlSGVpZ2h0ID0gbmV3SW1hZ2UuaGVpZ2h0O1xuXG4gICAgICBjb25zdCByYXRpbyA9IE1hdGgubWF4KFxuICAgICAgICB0aGlzLnpvb21JbWFnZVdpZHRoIC8gcGhvdG9BcmVhV2lkdGgsXG4gICAgICAgIHRoaXMuem9vbUltYWdlSGVpZ2h0IC8gcGhvdG9BcmVhSGVpZ2h0LFxuICAgICAgKTtcblxuICAgICAgLy8gT25seSBlbmFibGUgdGhlIHpvb20gaWYgYSBjZXJ0YWluIHpvb21pbmcgcmF0aW8gaXMgbWV0LlxuICAgICAgaWYgKHJhdGlvIDwgMS40KSB7XG4gICAgICAgIHRoaXMuem9vbUFyZWFDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnem9vbS1lbmFibGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnpvb21BcmVhQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3pvb20tZW5hYmxlZCcpO1xuXG4gICAgICAgIHRoaXMuem9vbUFyZWEuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2ltYWdlU291cmNlfSlgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbmV3SW1hZ2Uuc3JjID0gaW1hZ2VTb3VyY2U7XG4gIH1cblxuICB0b2dnbGVab29tKGUpIHtcbiAgICBpZiAodGhpcy56b29tQXJlYUNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ3pvb20tZW5hYmxlZCcpKSB7XG4gICAgICBpZiAoZS50eXBlID09PSAnbW91c2VvdXQnKSB7XG4gICAgICAgIHRoaXMuem9vbUFyZWEuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy56b29tQXJlYS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTtcblxuICAgICAgdGhpcy56b29tSW1hZ2UoZSk7XG4gICAgfVxuICB9XG5cbiAgem9vbUltYWdlKGUpIHtcbiAgICBjb25zdCB7IHdpZHRoOiB6b29tV2lkdGgsIGhlaWdodDogem9vbUhlaWdodCB9ID0gdGhpcy56b29tQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB7IHRvcDogYmlnSW1hZ2VUb3AsIGxlZnQ6IGJpZ0ltYWdlTGVmdCB9ID0gdGhpcy56b29tQXJlYUNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IGJpZ0ltYWdlWCA9IE1hdGgucm91bmQoYmlnSW1hZ2VMZWZ0KTtcbiAgICBjb25zdCBiaWdJbWFnZVkgPSBNYXRoLnJvdW5kKGJpZ0ltYWdlVG9wKTtcblxuICAgIGNvbnN0IG1vdXNlUG9zaXRpb25YID0gZS5jbGllbnRYIC0gYmlnSW1hZ2VYO1xuICAgIGNvbnN0IG1vdXNlUG9zaXRpb25ZID0gZS5jbGllbnRZIC0gYmlnSW1hZ2VZO1xuXG4gICAgLy8gTWFrZSBzdXJlIG91ciBtb3VzZSBwb3NpdGlvbiBpcyBzdGlsbCBpbnNpZGUgb3VyIGJveC5cbiAgICBpZiAoKG1vdXNlUG9zaXRpb25YIDwgem9vbVdpZHRoKVxuICAgICAgJiYgKG1vdXNlUG9zaXRpb25ZIDwgem9vbUhlaWdodClcbiAgICAgICYmIChtb3VzZVBvc2l0aW9uWCA+IDApXG4gICAgICAmJiAobW91c2VQb3NpdGlvblkgPiAwKSkge1xuICAgICAgaWYgKHRoaXMuem9vbUFyZWEuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xuICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyB0byBwb3NpdGlvbiB0aGUgem9vbWVkIGltYWdlLlxuICAgICAgICBsZXQgcmF0aW9YID0gTWF0aC5yb3VuZCgoKG1vdXNlUG9zaXRpb25YIC8gem9vbVdpZHRoKSAqIHRoaXMuem9vbUltYWdlV2lkdGgpIC0gKHpvb21XaWR0aCAvIDIpKSAqIC0xO1xuICAgICAgICBsZXQgcmF0aW9ZID0gTWF0aC5yb3VuZCgoKG1vdXNlUG9zaXRpb25ZIC8gem9vbUhlaWdodCkgKiB0aGlzLnpvb21JbWFnZUhlaWdodCkgLSAoem9vbUhlaWdodCAvIDIpKSAqIC0xO1xuXG4gICAgICAgIGlmIChyYXRpb1ggPiAwKSB7IHJhdGlvWCA9IDA7IH1cbiAgICAgICAgaWYgKHJhdGlvWSA+IDApIHsgcmF0aW9ZID0gMDsgfVxuXG4gICAgICAgIGlmIChyYXRpb1ggPCAtKHRoaXMuem9vbUltYWdlV2lkdGggLSB6b29tV2lkdGgpKSB7XG4gICAgICAgICAgcmF0aW9YID0gLSh0aGlzLnpvb21JbWFnZVdpZHRoIC0gem9vbVdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmF0aW9ZIDwgLSh0aGlzLnpvb21JbWFnZUhlaWdodCAtIHpvb21IZWlnaHQpKSB7XG4gICAgICAgICAgcmF0aW9ZID0gLSh0aGlzLnpvb21JbWFnZUhlaWdodCAtIHpvb21IZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3QmFja2dyb3VuZFBvc2l0aW9uID0gYCR7cmF0aW9YfXB4ICR7cmF0aW9ZfXB4YDtcblxuICAgICAgICB0aGlzLnpvb21BcmVhLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9IG5ld0JhY2tncm91bmRQb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcklBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/components/ImageZoom.js\n");

/***/ }),

/***/ "./source/scripts/components/MasonryGrid.js":
/*!**************************************************!*\
  !*** ./source/scripts/components/MasonryGrid.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ MasonryGrid)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var masonry_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! masonry-layout */ \"./node_modules/masonry-layout/masonry.js\");\n/* harmony import */ var masonry_layout__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(masonry_layout__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\n\n\nclass MasonryGrid {\n  constructor({\n    el,\n    settings\n  }) {\n    this.el = el;\n    this.layout = this.layout.bind(this);\n    _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(this.el);\n    const defaultSettings = {\n      itemSelector: '[data-masonry-item]',\n      columnWidth: '[data-masonry-sizer]',\n      gutter: 0,\n      percentPosition: false\n    };\n    this.settings = _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.extend(defaultSettings, settings);\n    this.masonry = new (masonry_layout__WEBPACK_IMPORTED_MODULE_1___default())(this.el, this.settings);\n    this.layout();\n    this.el.addEventListener('rimg:load', this.layout);\n  }\n\n  layout() {\n    this.masonry.layout();\n  }\n\n  unload() {\n    this.masonry.destroy();\n    this.el.removeEventListener('rimg:load', this.layout);\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01hc29ucnlHcmlkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvTWFzb25yeUdyaWQuanM/ODI4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknO1xuaW1wb3J0IE1hc29ucnkgZnJvbSAnbWFzb25yeS1sYXlvdXQnO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hc29ucnlHcmlkIHtcbiAgY29uc3RydWN0b3IoeyBlbCwgc2V0dGluZ3MgfSkge1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLmxheW91dCA9IHRoaXMubGF5b3V0LmJpbmQodGhpcyk7XG4gICAgcmltZy53YXRjaCh0aGlzLmVsKTtcblxuICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5ncyA9IHtcbiAgICAgIGl0ZW1TZWxlY3RvcjogJ1tkYXRhLW1hc29ucnktaXRlbV0nLFxuICAgICAgY29sdW1uV2lkdGg6ICdbZGF0YS1tYXNvbnJ5LXNpemVyXScsXG4gICAgICBndXR0ZXI6IDAsXG4gICAgICBwZXJjZW50UG9zaXRpb246IGZhbHNlLFxuICAgIH07XG5cbiAgICB0aGlzLnNldHRpbmdzID0gdGhlbWVVdGlscy5leHRlbmQoZGVmYXVsdFNldHRpbmdzLCBzZXR0aW5ncyk7XG4gICAgdGhpcy5tYXNvbnJ5ID0gbmV3IE1hc29ucnkodGhpcy5lbCwgdGhpcy5zZXR0aW5ncyk7XG4gICAgdGhpcy5sYXlvdXQoKTtcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsIHRoaXMubGF5b3V0KTtcbiAgfVxuXG4gIGxheW91dCgpIHtcbiAgICB0aGlzLm1hc29ucnkubGF5b3V0KCk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5tYXNvbnJ5LmRlc3Ryb3koKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsIHRoaXMubGF5b3V0KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEzQkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/MasonryGrid.js\n");

/***/ }),

/***/ "./source/scripts/components/MasonryVideo.js":
/*!***************************************************!*\
  !*** ./source/scripts/components/MasonryVideo.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ MasonryVideo)\n/* harmony export */ });\n/* harmony import */ var reframe_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! reframe.js */ \"./node_modules/reframe.js/dist/reframe.es.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Modal */ \"./source/scripts/components/Modal.js\");\n\n\nclass MasonryVideo {\n  constructor(el, event) {\n    this.el = el;\n    this.modal = null;\n    const {\n      currentTarget: target\n    } = event;\n    const modalID = target.dataset.masonryVideo;\n    const modalEl = this.el.querySelector(`[data-modal-id=\"${modalID}\"]`);\n    this.modal = new _Modal__WEBPACK_IMPORTED_MODULE_1__.default({\n      el: modalEl,\n      callbacks: {\n        onOpen: ({\n          modal,\n          contents\n        }) => this._open({\n          modal,\n          contents\n        }),\n        onClose: () => this._close()\n      }\n    });\n    this.modal.open();\n  }\n\n  onSectionUnload() {\n    if (this.modal) {\n      this.modal.close();\n    }\n  }\n\n  _open({\n    modal,\n    contents\n  }) {\n    const video = modal.querySelector('[data-masonry-video]');\n\n    try {\n      contents.innerHTML = JSON.parse(video.innerText);\n      (0,reframe_js__WEBPACK_IMPORTED_MODULE_0__.default)(contents);\n      (0,reframe_js__WEBPACK_IMPORTED_MODULE_0__.default)(contents.querySelectorAll('iframe'));\n      this.modal.showModal();\n    } catch {\n      console.warn('Unable to parse contents of video');\n    }\n  }\n\n  _close() {\n    this.modal = null;\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01hc29ucnlWaWRlby5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01hc29ucnlWaWRlby5qcz8wZDU3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWZyYW1lIGZyb20gJ3JlZnJhbWUuanMnO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4vTW9kYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXNvbnJ5VmlkZW8ge1xuICBjb25zdHJ1Y3RvcihlbCwgZXZlbnQpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5tb2RhbCA9IG51bGw7XG5cbiAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQ6IHRhcmdldCB9ID0gZXZlbnQ7XG4gICAgY29uc3QgbW9kYWxJRCA9IHRhcmdldC5kYXRhc2V0Lm1hc29ucnlWaWRlbztcbiAgICBjb25zdCBtb2RhbEVsID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1tb2RhbC1pZD1cIiR7bW9kYWxJRH1cIl1gKTtcblxuICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwoe1xuICAgICAgZWw6IG1vZGFsRWwsXG4gICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgb25PcGVuOiAoeyBtb2RhbCwgY29udGVudHMgfSkgPT4gdGhpcy5fb3Blbih7XG4gICAgICAgICAgbW9kYWwsXG4gICAgICAgICAgY29udGVudHMsXG4gICAgICAgIH0pLFxuICAgICAgICBvbkNsb3NlOiAoKSA9PiB0aGlzLl9jbG9zZSgpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMubW9kYWwub3BlbigpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIGlmICh0aGlzLm1vZGFsKSB7XG4gICAgICB0aGlzLm1vZGFsLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgX29wZW4oeyBtb2RhbCwgY29udGVudHMgfSkge1xuICAgIGNvbnN0IHZpZGVvID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWFzb25yeS12aWRlb10nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb250ZW50cy5pbm5lckhUTUwgPSBKU09OLnBhcnNlKHZpZGVvLmlubmVyVGV4dCk7XG5cbiAgICAgIHJlZnJhbWUoY29udGVudHMpO1xuICAgICAgcmVmcmFtZShjb250ZW50cy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSk7XG5cbiAgICAgIHRoaXMubW9kYWwuc2hvd01vZGFsKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBwYXJzZSBjb250ZW50cyBvZiB2aWRlbycpO1xuICAgIH1cbiAgfVxuXG4gIF9jbG9zZSgpIHtcbiAgICB0aGlzLm1vZGFsID0gbnVsbDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUxBO0FBRkE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBL0NBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/components/MasonryVideo.js\n");

/***/ }),

/***/ "./source/scripts/components/Modal.js":
/*!********************************************!*\
  !*** ./source/scripts/components/Modal.js ***!
  \********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ Modal)\n/* harmony export */ });\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\nclass Modal {\n  constructor(component = {}, options = {}) {\n    this.options = options;\n    this.el = component.el;\n    this.modalInner = this.el.querySelector('[data-modal-inner]');\n    this.contents = this.el.querySelector('[data-modal-contents]');\n    this.mobileFriendly = 'modalMobileFriendly' in this.el.dataset;\n    this.el.querySelector('[data-modal-close]').addEventListener('click', () => this.close());\n    this.selectors = {\n      open: 'modal-opened',\n      visible: 'modal-visible',\n      active: 'modal-active',\n      scrollLock: 'scroll-locked'\n    };\n    const defaultCallbacks = {\n      onOpen: () => ({}),\n      onClose: () => ({})\n    };\n    this.callbacks = { ...defaultCallbacks,\n      ...component.callbacks\n    };\n  } // Manually open a modal.\n\n\n  open() {\n    this.el.classList.add(this.selectors.open);\n    window.addEventListener('resize', () => this._resize()); // Use onOpen to insert contents into modal\n\n    return this.callbacks.onOpen({\n      modal: this.el,\n      contents: this.contents\n    });\n  } // Close modal, and clean up\n\n\n  close() {\n    this.el.classList.remove(this.selectors.active);\n    this.el.classList.remove(this.selectors.visible);\n    this.el.classList.remove(this.selectors.open);\n    document.body.classList.remove(this.selectors.scrollLock);\n    this.contents.innerHTML = '';\n    this.callbacks.onClose();\n    window.removeEventListener('resize', () => this._resize());\n  }\n  /*\n            Make a modal visible after content has been added\n            */\n\n\n  showModal() {\n    // Wait on animation frame after opening to ensure animations are played\n    window.requestAnimationFrame(() => {\n      document.body.classList.add(this.selectors.scrollLock);\n\n      if (this.options && this.options.reposition && this.options.reposition !== false) {\n        this._position();\n      }\n\n      this.el.addEventListener('transitionend', () => this.el.classList.add(this.selectors.active));\n      this.el.classList.add(this.selectors.visible);\n    });\n  }\n\n  _resize() {\n    if (this.options && this.options.reposition && this.options.reposition !== false) {\n      this._position();\n    } // Some modals shouldn't be visible on mobile\n\n\n    if (!this.mobileFriendly) {\n      const windowWidth = _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.windowWidth();\n\n      if (windowWidth > _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.breakpoints.small) {\n        return;\n      }\n\n      this.close();\n    }\n  }\n  /*\n            Center modal vertically and horizontally\n            */\n\n\n  _position() {\n    const {\n      width,\n      height\n    } = this.modalInner.getBoundingClientRect();\n    this.modalInner.style.marginTop = `${-(height / 2)}px`;\n    this.modalInner.style.marginLeft = `${-(width / 2)}px`;\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01vZGFsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvTW9kYWwuanM/NjBhZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kYWwge1xuICBjb25zdHJ1Y3Rvcihjb21wb25lbnQgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmVsID0gY29tcG9uZW50LmVsO1xuICAgIHRoaXMubW9kYWxJbm5lciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kYWwtaW5uZXJdJyk7XG4gICAgdGhpcy5jb250ZW50cyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kYWwtY29udGVudHNdJyk7XG4gICAgdGhpcy5tb2JpbGVGcmllbmRseSA9ICdtb2RhbE1vYmlsZUZyaWVuZGx5JyBpbiB0aGlzLmVsLmRhdGFzZXQ7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGFsLWNsb3NlXScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcblxuICAgIHRoaXMuc2VsZWN0b3JzID0ge1xuICAgICAgb3BlbjogJ21vZGFsLW9wZW5lZCcsXG4gICAgICB2aXNpYmxlOiAnbW9kYWwtdmlzaWJsZScsXG4gICAgICBhY3RpdmU6ICdtb2RhbC1hY3RpdmUnLFxuICAgICAgc2Nyb2xsTG9jazogJ3Njcm9sbC1sb2NrZWQnLFxuICAgIH07XG5cbiAgICBjb25zdCBkZWZhdWx0Q2FsbGJhY2tzID0ge1xuICAgICAgb25PcGVuOiAoKSA9PiAoe30pLFxuICAgICAgb25DbG9zZTogKCkgPT4gKHt9KSxcbiAgICB9O1xuXG4gICAgdGhpcy5jYWxsYmFja3MgPSB7XG4gICAgICAuLi5kZWZhdWx0Q2FsbGJhY2tzLFxuICAgICAgLi4uY29tcG9uZW50LmNhbGxiYWNrcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gTWFudWFsbHkgb3BlbiBhIG1vZGFsLlxuICBvcGVuKCkge1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCh0aGlzLnNlbGVjdG9ycy5vcGVuKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5fcmVzaXplKCkpO1xuXG4gICAgLy8gVXNlIG9uT3BlbiB0byBpbnNlcnQgY29udGVudHMgaW50byBtb2RhbFxuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5vbk9wZW4oe1xuICAgICAgbW9kYWw6IHRoaXMuZWwsXG4gICAgICBjb250ZW50czogdGhpcy5jb250ZW50cyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENsb3NlIG1vZGFsLCBhbmQgY2xlYW4gdXBcbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2VsZWN0b3JzLmFjdGl2ZSk7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2VsZWN0b3JzLnZpc2libGUpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNlbGVjdG9ycy5vcGVuKTtcblxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNlbGVjdG9ycy5zY3JvbGxMb2NrKTtcblxuICAgIHRoaXMuY29udGVudHMuaW5uZXJIVE1MID0gJyc7XG5cbiAgICB0aGlzLmNhbGxiYWNrcy5vbkNsb3NlKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3Jlc2l6ZSgpKTtcbiAgfVxuXG4gIC8qXG4gICAgICAgICAgICBNYWtlIGEgbW9kYWwgdmlzaWJsZSBhZnRlciBjb250ZW50IGhhcyBiZWVuIGFkZGVkXG4gICAgICAgICAgICAqL1xuICBzaG93TW9kYWwoKSB7XG4gICAgLy8gV2FpdCBvbiBhbmltYXRpb24gZnJhbWUgYWZ0ZXIgb3BlbmluZyB0byBlbnN1cmUgYW5pbWF0aW9ucyBhcmUgcGxheWVkXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQodGhpcy5zZWxlY3RvcnMuc2Nyb2xsTG9jayk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlcG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLnJlcG9zaXRpb24gIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHRoaXMuZWwuY2xhc3NMaXN0LmFkZCh0aGlzLnNlbGVjdG9ycy5hY3RpdmUpKTtcbiAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCh0aGlzLnNlbGVjdG9ycy52aXNpYmxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9yZXNpemUoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucmVwb3NpdGlvbiAmJiB0aGlzLm9wdGlvbnMucmVwb3NpdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gU29tZSBtb2RhbHMgc2hvdWxkbid0IGJlIHZpc2libGUgb24gbW9iaWxlXG4gICAgaWYgKCF0aGlzLm1vYmlsZUZyaWVuZGx5KSB7XG4gICAgICBjb25zdCB3aW5kb3dXaWR0aCA9IHRoZW1lVXRpbHMud2luZG93V2lkdGgoKTtcbiAgICAgIGlmICh3aW5kb3dXaWR0aCA+IHRoZW1lVXRpbHMuYnJlYWtwb2ludHMuc21hbGwpIHsgcmV0dXJuOyB9XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICAgICAgICAgIENlbnRlciBtb2RhbCB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICovXG4gIF9wb3NpdGlvbigpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMubW9kYWxJbm5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMubW9kYWxJbm5lci5zdHlsZS5tYXJnaW5Ub3AgPSBgJHstKGhlaWdodCAvIDIpfXB4YDtcbiAgICB0aGlzLm1vZGFsSW5uZXIuc3R5bGUubWFyZ2luTGVmdCA9IGAkey0od2lkdGggLyAyKX1weGA7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBRUE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQTdGQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/Modal.js\n");

/***/ }),

/***/ "./source/scripts/components/PredictiveSearch.js":
/*!*******************************************************!*\
  !*** ./source/scripts/components/PredictiveSearch.js ***!
  \*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ PredictiveSearch)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _SiteOverlay__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./SiteOverlay */ \"./source/scripts/components/SiteOverlay.js\");\n\n\n\n\n\nclass PredictiveSearch {\n  constructor({\n    el\n  }) {\n    this.el = el;\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    this.siteOverlay = new _SiteOverlay__WEBPACK_IMPORTED_MODULE_4__.default();\n    this.input = this.el.querySelector('[data-search-input]');\n    this.results = this.el.querySelector('[data-search-results]');\n    this.resultsContainer = this.el.querySelector('[data-search-results-container]');\n    this.animation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n      el: this.resultsContainer\n    });\n    this.isOpen = false;\n    this.events.register(window, 'keyup', e => this._onKeyUp(e));\n    this.events.register(window, 'resize', _themeUtils__WEBPACK_IMPORTED_MODULE_3__.default.debounce(() => this._onResize(), 250));\n    this.events.register(this.el, 'submit', e => this._onSubmit(e));\n    this.events.register(this.input, 'input', _themeUtils__WEBPACK_IMPORTED_MODULE_3__.default.debounce(() => this._onChange(), 250));\n    this.events.register(this.input, 'focus', () => this._onFocus());\n    this.events.register(this.input, 'keydown', e => this._onKeydown(e));\n    this.events.register(document.body, 'click', e => {\n      if (!e.target.closest('[data-search-form]')) {\n        this._close();\n      }\n    });\n  }\n\n  _getQuery() {\n    return this.input.value.trim();\n  }\n\n  _onChange() {\n    const searchTerm = this._getQuery();\n\n    if (!searchTerm.length) {\n      this._close();\n\n      return;\n    }\n\n    this._getSearchResults(searchTerm);\n  }\n\n  _onBlur() {\n    this._close();\n  }\n\n  _onFocus() {\n    const searchTerm = this._getQuery();\n\n    if (!searchTerm.length) return;\n\n    this._getSearchResults(searchTerm);\n  }\n\n  _onSubmit(e) {\n    if (!this._getQuery().length) e.preventDefault();\n  }\n\n  _onKeyUp(e) {\n    if (e.code === 'Escape') {\n      this.input.value = '';\n\n      this._close();\n    }\n  }\n\n  _onKeydown(e) {\n    // Prevent the cursor from moving in the input when using the up and down arrow keys\n    if (e.code === 'ArrowUp' || e.code === 'ArrowDown') {\n      e.preventDefault();\n    }\n  }\n\n  _onResize() {\n    this._resizeSearchResults();\n\n    if (_themeUtils__WEBPACK_IMPORTED_MODULE_3__.default.isLessThanLarge()) {\n      this._close();\n    }\n  }\n\n  _getSearchResults(searchTerm) {\n    this.resultsContainer.setAttribute('data-loading', 'true');\n    fetch(`${window.Theme.routes.predictive_search_url}?q=${encodeURIComponent(searchTerm)}&section_id=predictive-search`).then(response => {\n      if (!response.ok) {\n        const error = new Error(response.status);\n\n        this._close();\n\n        throw error;\n      }\n\n      return response.text();\n    }).then(text => {\n      const resultsMarkup = new DOMParser().parseFromString(text, 'text/html').querySelector('#shopify-section-predictive-search').innerHTML;\n\n      this._renderSearchResults(resultsMarkup);\n\n      _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.watch(this.results);\n    }).catch(error => {\n      this._close();\n\n      throw error;\n    });\n  }\n\n  _registerEvents() {\n    this.searchButton = this.el.querySelector('[data-predictive-search-button]');\n    this.events.register(this.searchButton, 'blur', () => this._onBlur());\n  }\n\n  _resizeSearchResults() {\n    const offset = 30;\n    const position = this.input.getBoundingClientRect();\n    const maxHeight = window.innerHeight - position.bottom - offset;\n    this.resultsContainer.style.setProperty('--results-container-height', `${maxHeight}px`);\n  }\n\n  _renderSearchResults(resultsMarkup) {\n    this.resultsContainer.setAttribute('data-loading', 'false');\n    this.results.innerHTML = resultsMarkup;\n\n    this._open();\n\n    this._registerEvents();\n\n    this._resizeSearchResults();\n  }\n\n  _open() {\n    if (this.isOpen) return;\n    this.isOpen = true;\n    this.animation.animateTo('open').then(() => {\n      document.body.classList.add('scroll-locked');\n      this.siteOverlay.open();\n    });\n  }\n\n  _close() {\n    if (!this.isOpen) return;\n    this.animation.animateTo('closed').then(() => {\n      this.isOpen = false;\n      document.body.classList.remove('scroll-locked');\n      this.siteOverlay.close();\n    });\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1ByZWRpY3RpdmVTZWFyY2guanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9QcmVkaWN0aXZlU2VhcmNoLmpzP2FkMWIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICdAcGl4ZWx1bmlvbi9ldmVudHMnO1xuaW1wb3J0IHsgdHJhbnNpdGlvbiB9IGZyb20gJ0BwaXhlbHVuaW9uL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHJpbWcgZnJvbSAnQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5JztcbmltcG9ydCB0aGVtZVV0aWxzIGZyb20gJy4uL3RoZW1lVXRpbHMnO1xuaW1wb3J0IFNpdGVPdmVybGF5IGZyb20gJy4vU2l0ZU92ZXJsYXknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcmVkaWN0aXZlU2VhcmNoIHtcbiAgY29uc3RydWN0b3IoeyBlbCB9KSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMuc2l0ZU92ZXJsYXkgPSBuZXcgU2l0ZU92ZXJsYXkoKTtcblxuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1pbnB1dF0nKTtcbiAgICB0aGlzLnJlc3VsdHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1yZXN1bHRzXScpO1xuICAgIHRoaXMucmVzdWx0c0NvbnRhaW5lciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLXJlc3VsdHMtY29udGFpbmVyXScpO1xuICAgIHRoaXMuYW5pbWF0aW9uID0gdHJhbnNpdGlvbih7IGVsOiB0aGlzLnJlc3VsdHNDb250YWluZXIgfSk7XG5cbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuXG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAna2V5dXAnLCBlID0+IHRoaXMuX29uS2V5VXAoZSkpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRoZW1lVXRpbHMuZGVib3VuY2UoKCkgPT4gdGhpcy5fb25SZXNpemUoKSwgMjUwKSk7XG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5lbCwgJ3N1Ym1pdCcsIGUgPT4gdGhpcy5fb25TdWJtaXQoZSkpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMuaW5wdXQsICdpbnB1dCcsIHRoZW1lVXRpbHMuZGVib3VuY2UoKCkgPT4gdGhpcy5fb25DaGFuZ2UoKSwgMjUwKSk7XG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5pbnB1dCwgJ2ZvY3VzJywgKCkgPT4gdGhpcy5fb25Gb2N1cygpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmlucHV0LCAna2V5ZG93bicsIGUgPT4gdGhpcy5fb25LZXlkb3duKGUpKTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGRvY3VtZW50LmJvZHksICdjbGljaycsIGUgPT4ge1xuICAgICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1zZWFyY2gtZm9ybV0nKSkge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2dldFF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0LnZhbHVlLnRyaW0oKTtcbiAgfVxuXG4gIF9vbkNoYW5nZSgpIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5fZ2V0UXVlcnkoKTtcblxuICAgIGlmICghc2VhcmNoVGVybS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0U2VhcmNoUmVzdWx0cyhzZWFyY2hUZXJtKTtcbiAgfVxuXG4gIF9vbkJsdXIoKSB7XG4gICAgdGhpcy5fY2xvc2UoKTtcbiAgfVxuXG4gIF9vbkZvY3VzKCkge1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLl9nZXRRdWVyeSgpO1xuXG4gICAgaWYgKCFzZWFyY2hUZXJtLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZ2V0U2VhcmNoUmVzdWx0cyhzZWFyY2hUZXJtKTtcbiAgfVxuXG4gIF9vblN1Ym1pdChlKSB7XG4gICAgaWYgKCF0aGlzLl9nZXRRdWVyeSgpLmxlbmd0aCkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgX29uS2V5VXAoZSkge1xuICAgIGlmIChlLmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLmlucHV0LnZhbHVlID0gJyc7XG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9vbktleWRvd24oZSkge1xuICAgIC8vIFByZXZlbnQgdGhlIGN1cnNvciBmcm9tIG1vdmluZyBpbiB0aGUgaW5wdXQgd2hlbiB1c2luZyB0aGUgdXAgYW5kIGRvd24gYXJyb3cga2V5c1xuICAgIGlmIChlLmNvZGUgPT09ICdBcnJvd1VwJyB8fCBlLmNvZGUgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgX29uUmVzaXplKCkge1xuICAgIHRoaXMuX3Jlc2l6ZVNlYXJjaFJlc3VsdHMoKTtcblxuICAgIGlmICh0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpKSB7XG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRTZWFyY2hSZXN1bHRzKHNlYXJjaFRlcm0pIHtcbiAgICB0aGlzLnJlc3VsdHNDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnLCAndHJ1ZScpO1xuXG4gICAgZmV0Y2goYCR7d2luZG93LlRoZW1lLnJvdXRlcy5wcmVkaWN0aXZlX3NlYXJjaF91cmx9P3E9JHtlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoVGVybSl9JnNlY3Rpb25faWQ9cHJlZGljdGl2ZS1zZWFyY2hgKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIH0pXG4gICAgICAudGhlbih0ZXh0ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0c01hcmt1cCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGV4dCwgJ3RleHQvaHRtbCcpLnF1ZXJ5U2VsZWN0b3IoJyNzaG9waWZ5LXNlY3Rpb24tcHJlZGljdGl2ZS1zZWFyY2gnKS5pbm5lckhUTUw7XG4gICAgICAgIHRoaXMuX3JlbmRlclNlYXJjaFJlc3VsdHMocmVzdWx0c01hcmt1cCk7XG4gICAgICAgIHJpbWcud2F0Y2godGhpcy5yZXN1bHRzKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9XG5cbiAgX3JlZ2lzdGVyRXZlbnRzKCkge1xuICAgIHRoaXMuc2VhcmNoQnV0dG9uID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcmVkaWN0aXZlLXNlYXJjaC1idXR0b25dJyk7XG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5zZWFyY2hCdXR0b24sICdibHVyJywgKCkgPT4gdGhpcy5fb25CbHVyKCkpO1xuICB9XG5cbiAgX3Jlc2l6ZVNlYXJjaFJlc3VsdHMoKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gMzA7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmlucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHBvc2l0aW9uLmJvdHRvbSAtIG9mZnNldDtcblxuICAgIHRoaXMucmVzdWx0c0NvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1yZXN1bHRzLWNvbnRhaW5lci1oZWlnaHQnLCBgJHttYXhIZWlnaHR9cHhgKTtcbiAgfVxuXG4gIF9yZW5kZXJTZWFyY2hSZXN1bHRzKHJlc3VsdHNNYXJrdXApIHtcbiAgICB0aGlzLnJlc3VsdHNDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnLCAnZmFsc2UnKTtcbiAgICB0aGlzLnJlc3VsdHMuaW5uZXJIVE1MID0gcmVzdWx0c01hcmt1cDtcblxuICAgIHRoaXMuX29wZW4oKTtcbiAgICB0aGlzLl9yZWdpc3RlckV2ZW50cygpO1xuICAgIHRoaXMuX3Jlc2l6ZVNlYXJjaFJlc3VsdHMoKTtcbiAgfVxuXG4gIF9vcGVuKCkge1xuICAgIGlmICh0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcblxuICAgIHRoaXMuYW5pbWF0aW9uLmFuaW1hdGVUbygnb3BlbicpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsLWxvY2tlZCcpO1xuICAgICAgICB0aGlzLnNpdGVPdmVybGF5Lm9wZW4oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgX2Nsb3NlKCkge1xuICAgIGlmICghdGhpcy5pc09wZW4pIHJldHVybjtcblxuICAgIHRoaXMuYW5pbWF0aW9uLmFuaW1hdGVUbygnY2xvc2VkJylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzY3JvbGwtbG9ja2VkJyk7XG4gICAgICAgIHRoaXMuc2l0ZU92ZXJsYXkuY2xvc2UoKTtcbiAgICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5KQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/PredictiveSearch.js\n");

/***/ }),

/***/ "./source/scripts/components/Product.js":
/*!**********************************************!*\
  !*** ./source/scripts/components/Product.js ***!
  \**********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ Product)\n/* harmony export */ });\n/* harmony import */ var morphdom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! morphdom */ \"./node_modules/morphdom/dist/morphdom-esm.js\");\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var _pixelunion_pxs_complementary_products__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @pixelunion/pxs-complementary-products */ \"./node_modules/@pixelunion/pxs-complementary-products/dist/index.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _pixelunion_shopify_surface_pick_up__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @pixelunion/shopify-surface-pick-up */ \"./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js\");\n/* harmony import */ var _pixelunion_pxs_gift_card_recipient_form__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @pixelunion/pxs-gift-card-recipient-form */ \"./node_modules/@pixelunion/pxs-gift-card-recipient-form/dist/index.es.js\");\n/* harmony import */ var _helpers_VariantHelper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../helpers/VariantHelper */ \"./source/scripts/helpers/VariantHelper.js\");\n/* harmony import */ var _ProductGallery__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ProductGallery */ \"./source/scripts/components/ProductGallery.js\");\n/* harmony import */ var _RTE__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RTE */ \"./source/scripts/components/RTE.js\");\n/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Select */ \"./source/scripts/components/Select.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Modal */ \"./source/scripts/components/Modal.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass Product {\n  constructor(el, options, sectionId) {\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__.default();\n    this.positionProductInfo = this.positionProductInfo.bind(this);\n    this.el = el;\n    this.surfacePickUp = new _pixelunion_shopify_surface_pick_up__WEBPACK_IMPORTED_MODULE_5__.default(this.el.querySelector('[data-surface-pick-up]'));\n    this.surfacePickUp.onModalRequest(contents => {\n      this.modal = new _Modal__WEBPACK_IMPORTED_MODULE_12__.default({\n        el: this.el.querySelector('[data-modal-id=\"surface-pick-up\"]'),\n        callbacks: {\n          onOpen: ({\n            modal\n          }) => {\n            const modalHeader = modal.querySelector('[data-modal-header]');\n            const modalContents = modal.querySelector('[data-modal-contents]');\n\n            if (this.product && this.variantHelpers) {\n              const variant = this.variantHelpers.getVariantFromOptions(this.variantHelpers.getCurrentOptions());\n              modalHeader.innerHTML = `<h2 class=\"surface-pick-up-modal__header\">${this.product.title}</h2><span class=\"surface-pick-up-modal__subtitle\">${variant.title}</span>`;\n            }\n\n            modalContents.innerHTML = contents;\n          }\n        }\n      }, {\n        reposition: false\n      });\n      this.modal.open();\n      this.modal.showModal();\n    });\n    this.recipientFormEl = this.el.querySelector('[data-recipient-form]');\n\n    if (this.recipientFormEl) {\n      this.recipientForm = new _pixelunion_pxs_gift_card_recipient_form__WEBPACK_IMPORTED_MODULE_6__.default(this.el);\n    } // Set up conditional options\n\n\n    this.product = options.product;\n    this.productSettings = options.product_settings;\n    this.labels = JSON.parse(document.querySelector('[data-product-success-labels]').innerHTML);\n    this.imagesLayout = options.images_layout;\n    this.isQuickshop = options.isQuickshop;\n    this.enableZoom = options.enable_zoom;\n    this.enableVideoAutoplay = options.enable_video_autoplay;\n    this.enableVideoLooping = options.enable_video_looping;\n    this.enableCartRedirection = options.enable_cart_redirection;\n    this.enableFixedPositioning = options.enable_fixed_positioning;\n    this.productRecommendationLimit = options.product_recommendation_limit;\n    this.variantHelpers = null;\n    this.productMasonryLayout = null;\n    this.rteViews = [];\n    this.selectViews = [];\n    this.productForm = this.el.querySelector('[data-product-form]');\n    this.productContainer = this.el.querySelector('.product');\n    this.productImages = this.el.querySelector('.product-images');\n    this.productDetailsWrapper = this.el.querySelector('.product-details-wrapper');\n    this.productDetails = this.el.querySelector('.product-details');\n    this.productMessages = this.el.querySelector('.product-message');\n    this.addToCartBtn = this.el.querySelector('.add-to-cart');\n    this.productQuantityInput = this.el.querySelector('[data-product-quantity-input]');\n    this.images = JSON.parse(this.el.querySelector('[data-images]').innerText);\n    this.smallGallery = _themeUtils__WEBPACK_IMPORTED_MODULE_11__.default.isSmall();\n    this.productGallery = null;\n    this.unitPrice = this.el.querySelector('[data-unit-price]');\n    this.taxLine = this.el.querySelector('[data-tax-line]');\n    this.complementaryProductsEl = this.el.querySelector('[data-complementary-products]');\n    if (!this.product) return;\n\n    this._initProductGallery();\n\n    this.reloadGallery = this._reloadGallery.bind(this);\n    window.addEventListener('resize', this.reloadGallery);\n    this.el.querySelectorAll('.rte').forEach(rte => this.rteViews.push(new _RTE__WEBPACK_IMPORTED_MODULE_9__.default({\n      el: rte\n    })));\n    this.el.querySelectorAll('select').forEach(select => {\n      if (!select.hasAttribute('data-select-ignore')) {\n        this.selectViews.push(new _Select__WEBPACK_IMPORTED_MODULE_10__.default({\n          el: select\n        }));\n      }\n    });\n    this.setupVariants();\n\n    if (this.enableFixedPositioning) {\n      this.positionProductInfo();\n    }\n\n    if (this.addToCartBtn) {\n      this.addToCartBtn.addEventListener('click', event => this.addToCart(event));\n    }\n\n    if (Shopify.PaymentButton != null) {\n      Shopify.PaymentButton.init();\n    }\n\n    if (this.complementaryProductsEl) {\n      this.complementaryProductRecommendations = new _pixelunion_pxs_complementary_products__WEBPACK_IMPORTED_MODULE_3__.default({\n        sectionEl: this.el,\n        sectionId,\n        productId: this.product.id,\n        productRecommendationsRoute: window.Theme.routes.product_recommendations_url,\n        includeIndicatorDots: true,\n        limit: this.productRecommendationLimit\n      });\n    }\n  }\n\n  _initProductGallery() {\n    this.productGallery = new _ProductGallery__WEBPACK_IMPORTED_MODULE_8__.default(this.el.querySelector('[data-product-gallery]'), {\n      product_container: this.productContainer,\n      images_layout: this.imagesLayout,\n      images_json: this.images,\n      enable_zoom: this.enableZoom,\n      enable_video_looping: this.enableVideoLooping,\n      enable_video_autoplay: this.enableVideoAutoplay,\n      isQuickshop: this.isQuickshop\n    });\n  }\n\n  _reloadGallery() {\n    if (_themeUtils__WEBPACK_IMPORTED_MODULE_11__.default.isSmall() && !this.smallGallery) {\n      this.productGallery.unload();\n      this.productGallery = null;\n\n      this._initProductGallery();\n\n      this.smallGallery = true;\n    }\n\n    if (!_themeUtils__WEBPACK_IMPORTED_MODULE_11__.default.isSmall() && this.smallGallery) {\n      this.productGallery.unload();\n      this.productGallery = null;\n\n      this._initProductGallery();\n\n      this.smallGallery = false;\n    }\n  }\n\n  unload() {\n    clearTimeout(this.positionTimeout);\n\n    if (this.variantHelpers != null) {\n      this.variantHelpers.unload();\n    }\n\n    if (this.productGallery) {\n      this.productGallery.unload();\n    }\n\n    if (this.rteViews.length > 0) {\n      this.rteViews = [];\n    }\n\n    if (this.selectViews.length > 0) {\n      this.selectViews = [];\n    }\n\n    window.removeEventListener('resize', this.reloadGallery);\n  }\n\n  setupVariants() {\n    const event = document.createEvent('Event');\n    const variantDropdowns = this.el.querySelectorAll('[data-option-select]');\n    this.variantHelpers = new _helpers_VariantHelper__WEBPACK_IMPORTED_MODULE_7__.default({\n      addToCartButton: this.el.querySelector('.add-to-cart'),\n      priceFields: this.el.querySelectorAll('.product-price'),\n      productForm: this.el.querySelector('[data-product-form]'),\n      productGallery: this.productGallery,\n      productThumbnails: this.el.querySelectorAll('.product-thumbnails img'),\n      selector: variantDropdowns,\n      type: 'select',\n      productJSON: this.product,\n      productSettings: this.productSettings,\n      unitPrice: this.unitPrice,\n      taxLine: this.taxLine,\n      quantityInput: this.productQuantityInput\n    });\n    this.variantHelpers.onVariantChange(v => {\n      const id = v ? v.id : null;\n      this.surfacePickUp.load(id);\n    });\n\n    if (variantDropdowns.length) {\n      event.initEvent('change', true, true);\n      variantDropdowns.forEach(variantDropdown => variantDropdown.dispatchEvent(event));\n    } else {\n      this.surfacePickUp.load(this.product.variants[0].id);\n    }\n  }\n\n  positionProductInfo() {\n    const detailsHeight = this.productDetails.getBoundingClientRect().height;\n    let viewportHeight = window.innerHeight;\n\n    if (document.documentElement.clientHeight < window.innerHeight) {\n      viewportHeight = document.documentElement.clientHeight;\n    }\n\n    if (window.innerWidth > 770 && viewportHeight > detailsHeight) {\n      this.triggerFixedProductInfo();\n    } else {\n      this.productDetails.classList.remove('product-details-fixed');\n      this.productDetails.classList.remove('product-details-absolute');\n    }\n\n    return requestAnimationFrame(this.positionProductInfo);\n  }\n\n  triggerFixedProductInfo() {\n    if (this.imagesLayout !== 'list') {\n      return;\n    }\n\n    const {\n      scrollTop\n    } = window;\n    const {\n      height: imagesHeight,\n      top: imagesOffsetTop\n    } = this.productImages.getBoundingClientRect();\n    const imagesOffsetBottom = imagesOffsetTop + imagesHeight;\n    const detailsWrapperOffset = this.productDetailsWrapper.getBoundingClientRect().top;\n    let {\n      height: detailsHeight,\n      top: detailsOffsetTop\n    } = this.productDetails.getBoundingClientRect();\n    let detailsOffsetBottom = detailsOffsetTop + detailsHeight;\n\n    if (detailsHeight < imagesHeight) {\n      // If we're far enough down the page that the content is near the window top\n      if (detailsWrapperOffset - scrollTop < 0) {\n        // Check if our details / images are out of line but low enough to \"fix\"\n        if (detailsOffsetBottom < imagesOffsetBottom || scrollTop < detailsOffsetTop) {\n          this.productDetails.classList.remove('product-details-absolute');\n          this.productDetails.classList.add('product-details-fixed');\n        }\n\n        ({\n          height: detailsHeight,\n          top: detailsOffsetTop\n        } = this.productDetails.getBoundingClientRect());\n        detailsOffsetBottom = detailsOffsetTop + detailsHeight; // If we're far enough down then this positions items near the bottom\n\n        if (detailsOffsetBottom >= imagesOffsetBottom || scrollTop >= detailsOffsetTop) {\n          this.productDetails.classList.remove('product-details-fixed');\n          this.productDetails.classList.add('product-details-absolute');\n        }\n      } else {\n        this.productDetails.classList.remove('product-details-fixed');\n        this.productDetails.classList.remove('product-details-absolute');\n      }\n    }\n  }\n\n  addToCart(e) {\n    if (this.enableCartRedirection) {\n      return;\n    } // Reload the cart page when a product is added to the cart\n\n\n    if (!document.body.classList.contains('template-cart')) {\n      e.preventDefault();\n    }\n\n    if (this.recipientFormEl) {\n      this.recipientFormEl.classList.remove('recipient-form--has-errors');\n    }\n\n    this.productMessages.innerHTML = '';\n    const formData = new FormData(this.productForm);\n    fetch(`${window.Theme.routes.cart_add_url}.js`, {\n      method: 'POST',\n      body: formData,\n      headers: {\n        'X-Requested-With': 'XMLHttpRequest'\n      }\n    }).then(response => {\n      if (!response.ok) {\n        const error = new Error();\n        error.response = response;\n        throw error;\n      }\n\n      return response.json();\n    }).then(item => {\n      if (!item) return;\n      const message = window.Theme.addToCartSuccess.replace('**product**', item.title).replace('**cart_link**', `<a href=\"${window.Theme.routes.cart_url}\">${this.labels.cartLink}</a>`).replace('**continue_link**', `<a href=\"${window.Theme.routes.all_products_collection_url}\">${this.labels.continueLink}</a>`).replace('**checkout_link**', `<button type=\"submit\" name=\"checkout\" form=\"checkout_form\">${this.labels.checkoutLink}</button>`);\n      setTimeout(() => {\n        this.productMessages.innerHTML = message;\n        this.productMessages.classList.add('success-message');\n        this.productMessages.classList.remove('error-message');\n        this.updateCart(item);\n      }, 500);\n    }).catch(error => this.handleErrors(error));\n  }\n\n  updateCart() {\n    document.querySelector('.mini-cart').classList.remove('empty');\n    const miniCartItemWrapper = document.querySelector('.mini-cart-item-wrapper');\n    const cartCount = document.querySelectorAll('.cart-count-number');\n    _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_2__.default.load(window.Theme.routes.cart_url, {\n      view: 'mini-ajax'\n    }).then(({\n      data,\n      html\n    }) => {\n      const updatedMiniCart = document.createElement('div');\n      updatedMiniCart.innerHTML = html.miniCart;\n      cartCount.forEach(el => el.innerText = data.itemCount);\n      (0,morphdom__WEBPACK_IMPORTED_MODULE_0__.default)(miniCartItemWrapper, updatedMiniCart.querySelector('.mini-cart-item-wrapper'), {\n        onBeforeElUpdated: (fromEl, toEl) => {\n          if (fromEl.tagName === 'IMG' && fromEl.src === toEl.src) {\n            return false;\n          }\n\n          return true;\n        }\n      });\n    });\n    _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_4__.default.watch(miniCartItemWrapper);\n  }\n\n  handleErrors(error) {\n    error.response.json().then(err => setTimeout(() => {\n      if (err.errors && err.errors.email) {\n        this.recipientFormEl.classList.add('recipient-form--has-errors');\n      } else {\n        this.productMessages.innerHTML = err.description;\n        this.productMessages.classList.add('error-message');\n        this.productMessages.classList.remove('success-message');\n      }\n    }, 1000));\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9Qcm9kdWN0LmpzP2FjOGYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vcnBoZG9tIGZyb20gJ21vcnBoZG9tJztcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnQHBpeGVsdW5pb24vZXZlbnRzJztcbmltcG9ydCBBc3luY1ZpZXcgZnJvbSAnQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcnO1xuaW1wb3J0IENvbXBsZW1lbnRhcnlQcm9kdWN0cyBmcm9tICdAcGl4ZWx1bmlvbi9weHMtY29tcGxlbWVudGFyeS1wcm9kdWN0cyc7XG5pbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknO1xuaW1wb3J0IFNob3BpZnlTdXJmYWNlUGlja1VwIGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktc3VyZmFjZS1waWNrLXVwJztcbmltcG9ydCBSZWNpcGllbnRGb3JtIGZyb20gJ0BwaXhlbHVuaW9uL3B4cy1naWZ0LWNhcmQtcmVjaXBpZW50LWZvcm0nO1xuaW1wb3J0IFZhcmlhbnRIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9WYXJpYW50SGVscGVyJztcbmltcG9ydCBQcm9kdWN0R2FsbGVyeSBmcm9tICcuL1Byb2R1Y3RHYWxsZXJ5JztcbmltcG9ydCBSVEUgZnJvbSAnLi9SVEUnO1xuaW1wb3J0IFNlbGVjdCBmcm9tICcuL1NlbGVjdCc7XG5pbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcbmltcG9ydCBNb2RhbCBmcm9tICcuL01vZGFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdCB7XG4gIGNvbnN0cnVjdG9yKGVsLCBvcHRpb25zLCBzZWN0aW9uSWQpIHtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLnBvc2l0aW9uUHJvZHVjdEluZm8gPSB0aGlzLnBvc2l0aW9uUHJvZHVjdEluZm8uYmluZCh0aGlzKTtcbiAgICB0aGlzLmVsID0gZWw7XG5cbiAgICB0aGlzLnN1cmZhY2VQaWNrVXAgPSBuZXcgU2hvcGlmeVN1cmZhY2VQaWNrVXAodGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zdXJmYWNlLXBpY2stdXBdJykpO1xuICAgIHRoaXMuc3VyZmFjZVBpY2tVcC5vbk1vZGFsUmVxdWVzdChjb250ZW50cyA9PiB7XG4gICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKFxuICAgICAgICB7XG4gICAgICAgICAgZWw6IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kYWwtaWQ9XCJzdXJmYWNlLXBpY2stdXBcIl0nKSxcbiAgICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgIG9uT3BlbjogKHsgbW9kYWwgfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtb2RhbEhlYWRlciA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGFsLWhlYWRlcl0nKTtcbiAgICAgICAgICAgICAgY29uc3QgbW9kYWxDb250ZW50cyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGFsLWNvbnRlbnRzXScpO1xuXG4gICAgICAgICAgICAgIGlmICh0aGlzLnByb2R1Y3QgJiYgdGhpcy52YXJpYW50SGVscGVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRIZWxwZXJzLmdldFZhcmlhbnRGcm9tT3B0aW9ucyh0aGlzLnZhcmlhbnRIZWxwZXJzLmdldEN1cnJlbnRPcHRpb25zKCkpO1xuXG4gICAgICAgICAgICAgICAgbW9kYWxIZWFkZXIuaW5uZXJIVE1MID0gYDxoMiBjbGFzcz1cInN1cmZhY2UtcGljay11cC1tb2RhbF9faGVhZGVyXCI+JHt0aGlzLnByb2R1Y3QudGl0bGV9PC9oMj48c3BhbiBjbGFzcz1cInN1cmZhY2UtcGljay11cC1tb2RhbF9fc3VidGl0bGVcIj4ke3ZhcmlhbnQudGl0bGV9PC9zcGFuPmA7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBtb2RhbENvbnRlbnRzLmlubmVySFRNTCA9IGNvbnRlbnRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcmVwb3NpdGlvbjogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5tb2RhbC5vcGVuKCk7XG4gICAgICB0aGlzLm1vZGFsLnNob3dNb2RhbCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWNpcGllbnRGb3JtRWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1mb3JtXScpO1xuXG4gICAgaWYgKHRoaXMucmVjaXBpZW50Rm9ybUVsKSB7XG4gICAgICB0aGlzLnJlY2lwaWVudEZvcm0gPSBuZXcgUmVjaXBpZW50Rm9ybSh0aGlzLmVsKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgY29uZGl0aW9uYWwgb3B0aW9uc1xuICAgIHRoaXMucHJvZHVjdCA9IG9wdGlvbnMucHJvZHVjdDtcbiAgICB0aGlzLnByb2R1Y3RTZXR0aW5ncyA9IG9wdGlvbnMucHJvZHVjdF9zZXR0aW5ncztcbiAgICB0aGlzLmxhYmVscyA9IEpTT04ucGFyc2UoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1zdWNjZXNzLWxhYmVsc10nKS5pbm5lckhUTUwpO1xuICAgIHRoaXMuaW1hZ2VzTGF5b3V0ID0gb3B0aW9ucy5pbWFnZXNfbGF5b3V0O1xuICAgIHRoaXMuaXNRdWlja3Nob3AgPSBvcHRpb25zLmlzUXVpY2tzaG9wO1xuICAgIHRoaXMuZW5hYmxlWm9vbSA9IG9wdGlvbnMuZW5hYmxlX3pvb207XG4gICAgdGhpcy5lbmFibGVWaWRlb0F1dG9wbGF5ID0gb3B0aW9ucy5lbmFibGVfdmlkZW9fYXV0b3BsYXk7XG4gICAgdGhpcy5lbmFibGVWaWRlb0xvb3BpbmcgPSBvcHRpb25zLmVuYWJsZV92aWRlb19sb29waW5nO1xuICAgIHRoaXMuZW5hYmxlQ2FydFJlZGlyZWN0aW9uID0gb3B0aW9ucy5lbmFibGVfY2FydF9yZWRpcmVjdGlvbjtcbiAgICB0aGlzLmVuYWJsZUZpeGVkUG9zaXRpb25pbmcgPSBvcHRpb25zLmVuYWJsZV9maXhlZF9wb3NpdGlvbmluZztcbiAgICB0aGlzLnByb2R1Y3RSZWNvbW1lbmRhdGlvbkxpbWl0ID0gb3B0aW9ucy5wcm9kdWN0X3JlY29tbWVuZGF0aW9uX2xpbWl0O1xuXG4gICAgdGhpcy52YXJpYW50SGVscGVycyA9IG51bGw7XG4gICAgdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCA9IG51bGw7XG4gICAgdGhpcy5ydGVWaWV3cyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0Vmlld3MgPSBbXTtcblxuICAgIHRoaXMucHJvZHVjdEZvcm0gPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtZm9ybV0nKTtcbiAgICB0aGlzLnByb2R1Y3RDb250YWluZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0Jyk7XG4gICAgdGhpcy5wcm9kdWN0SW1hZ2VzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1pbWFnZXMnKTtcbiAgICB0aGlzLnByb2R1Y3REZXRhaWxzV3JhcHBlciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtZGV0YWlscy13cmFwcGVyJyk7XG4gICAgdGhpcy5wcm9kdWN0RGV0YWlscyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtZGV0YWlscycpO1xuICAgIHRoaXMucHJvZHVjdE1lc3NhZ2VzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1tZXNzYWdlJyk7XG4gICAgdGhpcy5hZGRUb0NhcnRCdG4gPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5hZGQtdG8tY2FydCcpO1xuICAgIHRoaXMucHJvZHVjdFF1YW50aXR5SW5wdXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtcXVhbnRpdHktaW5wdXRdJyk7XG4gICAgdGhpcy5pbWFnZXMgPSBKU09OLnBhcnNlKHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtaW1hZ2VzXScpLmlubmVyVGV4dCk7XG4gICAgdGhpcy5zbWFsbEdhbGxlcnkgPSB0aGVtZVV0aWxzLmlzU21hbGwoKTtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5ID0gbnVsbDtcbiAgICB0aGlzLnVuaXRQcmljZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdW5pdC1wcmljZV0nKTtcbiAgICB0aGlzLnRheExpbmUgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRheC1saW5lXScpO1xuICAgIHRoaXMuY29tcGxlbWVudGFyeVByb2R1Y3RzRWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbXBsZW1lbnRhcnktcHJvZHVjdHNdJyk7XG5cbiAgICBpZiAoIXRoaXMucHJvZHVjdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5faW5pdFByb2R1Y3RHYWxsZXJ5KCk7XG5cbiAgICB0aGlzLnJlbG9hZEdhbGxlcnkgPSB0aGlzLl9yZWxvYWRHYWxsZXJ5LmJpbmQodGhpcyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVsb2FkR2FsbGVyeSk7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ydGUnKS5mb3JFYWNoKHJ0ZSA9PiB0aGlzLnJ0ZVZpZXdzLnB1c2gobmV3IFJURSh7IGVsOiBydGUgfSkpKTtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpLmZvckVhY2goc2VsZWN0ID0+IHtcbiAgICAgIGlmICghc2VsZWN0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1zZWxlY3QtaWdub3JlJykpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RWaWV3cy5wdXNoKG5ldyBTZWxlY3QoeyBlbDogc2VsZWN0IH0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2V0dXBWYXJpYW50cygpO1xuXG4gICAgaWYgKHRoaXMuZW5hYmxlRml4ZWRQb3NpdGlvbmluZykge1xuICAgICAgdGhpcy5wb3NpdGlvblByb2R1Y3RJbmZvKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWRkVG9DYXJ0QnRuKSB7XG4gICAgICB0aGlzLmFkZFRvQ2FydEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuYWRkVG9DYXJ0KGV2ZW50KSk7XG4gICAgfVxuXG4gICAgaWYgKFNob3BpZnkuUGF5bWVudEJ1dHRvbiAhPSBudWxsKSB7XG4gICAgICBTaG9waWZ5LlBheW1lbnRCdXR0b24uaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBsZW1lbnRhcnlQcm9kdWN0c0VsKSB7XG4gICAgICB0aGlzLmNvbXBsZW1lbnRhcnlQcm9kdWN0UmVjb21tZW5kYXRpb25zID0gbmV3IENvbXBsZW1lbnRhcnlQcm9kdWN0cyh7XG4gICAgICAgIHNlY3Rpb25FbDogdGhpcy5lbCxcbiAgICAgICAgc2VjdGlvbklkLFxuICAgICAgICBwcm9kdWN0SWQ6IHRoaXMucHJvZHVjdC5pZCxcbiAgICAgICAgcHJvZHVjdFJlY29tbWVuZGF0aW9uc1JvdXRlOiB3aW5kb3cuVGhlbWUucm91dGVzLnByb2R1Y3RfcmVjb21tZW5kYXRpb25zX3VybCxcbiAgICAgICAgaW5jbHVkZUluZGljYXRvckRvdHM6IHRydWUsXG4gICAgICAgIGxpbWl0OiB0aGlzLnByb2R1Y3RSZWNvbW1lbmRhdGlvbkxpbWl0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX2luaXRQcm9kdWN0R2FsbGVyeSgpIHtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5ID0gbmV3IFByb2R1Y3RHYWxsZXJ5KFxuICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LWdhbGxlcnldJyksXG4gICAgICB7XG4gICAgICAgIHByb2R1Y3RfY29udGFpbmVyOiB0aGlzLnByb2R1Y3RDb250YWluZXIsXG4gICAgICAgIGltYWdlc19sYXlvdXQ6IHRoaXMuaW1hZ2VzTGF5b3V0LFxuICAgICAgICBpbWFnZXNfanNvbjogdGhpcy5pbWFnZXMsXG4gICAgICAgIGVuYWJsZV96b29tOiB0aGlzLmVuYWJsZVpvb20sXG4gICAgICAgIGVuYWJsZV92aWRlb19sb29waW5nOiB0aGlzLmVuYWJsZVZpZGVvTG9vcGluZyxcbiAgICAgICAgZW5hYmxlX3ZpZGVvX2F1dG9wbGF5OiB0aGlzLmVuYWJsZVZpZGVvQXV0b3BsYXksXG4gICAgICAgIGlzUXVpY2tzaG9wOiB0aGlzLmlzUXVpY2tzaG9wLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgX3JlbG9hZEdhbGxlcnkoKSB7XG4gICAgaWYgKHRoZW1lVXRpbHMuaXNTbWFsbCgpICYmICF0aGlzLnNtYWxsR2FsbGVyeSkge1xuICAgICAgdGhpcy5wcm9kdWN0R2FsbGVyeS51bmxvYWQoKTtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnkgPSBudWxsO1xuICAgICAgdGhpcy5faW5pdFByb2R1Y3RHYWxsZXJ5KCk7XG4gICAgICB0aGlzLnNtYWxsR2FsbGVyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGVtZVV0aWxzLmlzU21hbGwoKSAmJiB0aGlzLnNtYWxsR2FsbGVyeSkge1xuICAgICAgdGhpcy5wcm9kdWN0R2FsbGVyeS51bmxvYWQoKTtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnkgPSBudWxsO1xuICAgICAgdGhpcy5faW5pdFByb2R1Y3RHYWxsZXJ5KCk7XG4gICAgICB0aGlzLnNtYWxsR2FsbGVyeSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5wb3NpdGlvblRpbWVvdXQpO1xuXG4gICAgaWYgKHRoaXMudmFyaWFudEhlbHBlcnMgIT0gbnVsbCkge1xuICAgICAgdGhpcy52YXJpYW50SGVscGVycy51bmxvYWQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZHVjdEdhbGxlcnkpIHtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnkudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucnRlVmlld3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5ydGVWaWV3cyA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdFZpZXdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0Vmlld3MgPSBbXTtcbiAgICB9XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVsb2FkR2FsbGVyeSk7XG4gIH1cblxuICBzZXR1cFZhcmlhbnRzKCkge1xuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgY29uc3QgdmFyaWFudERyb3Bkb3ducyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtb3B0aW9uLXNlbGVjdF0nKTtcblxuICAgIHRoaXMudmFyaWFudEhlbHBlcnMgPSBuZXcgVmFyaWFudEhlbHBlcih7XG4gICAgICBhZGRUb0NhcnRCdXR0b246IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmFkZC10by1jYXJ0JyksXG4gICAgICBwcmljZUZpZWxkczogdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1wcmljZScpLFxuICAgICAgcHJvZHVjdEZvcm06IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1mb3JtXScpLFxuICAgICAgcHJvZHVjdEdhbGxlcnk6IHRoaXMucHJvZHVjdEdhbGxlcnksXG4gICAgICBwcm9kdWN0VGh1bWJuYWlsczogdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC10aHVtYm5haWxzIGltZycpLFxuICAgICAgc2VsZWN0b3I6IHZhcmlhbnREcm9wZG93bnMsXG4gICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgIHByb2R1Y3RKU09OOiB0aGlzLnByb2R1Y3QsXG4gICAgICBwcm9kdWN0U2V0dGluZ3M6IHRoaXMucHJvZHVjdFNldHRpbmdzLFxuICAgICAgdW5pdFByaWNlOiB0aGlzLnVuaXRQcmljZSxcbiAgICAgIHRheExpbmU6IHRoaXMudGF4TGluZSxcbiAgICAgIHF1YW50aXR5SW5wdXQ6IHRoaXMucHJvZHVjdFF1YW50aXR5SW5wdXQsXG4gICAgfSk7XG4gICAgdGhpcy52YXJpYW50SGVscGVycy5vblZhcmlhbnRDaGFuZ2UodiA9PiB7XG4gICAgICBjb25zdCBpZCA9IHYgPyB2LmlkIDogbnVsbDtcblxuICAgICAgdGhpcy5zdXJmYWNlUGlja1VwLmxvYWQoaWQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHZhcmlhbnREcm9wZG93bnMubGVuZ3RoKSB7XG4gICAgICBldmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuICAgICAgdmFyaWFudERyb3Bkb3ducy5mb3JFYWNoKHZhcmlhbnREcm9wZG93biA9PiB2YXJpYW50RHJvcGRvd24uZGlzcGF0Y2hFdmVudChldmVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1cmZhY2VQaWNrVXAubG9hZCh0aGlzLnByb2R1Y3QudmFyaWFudHNbMF0uaWQpO1xuICAgIH1cbiAgfVxuXG4gIHBvc2l0aW9uUHJvZHVjdEluZm8oKSB7XG4gICAgY29uc3QgZGV0YWlsc0hlaWdodCA9IHRoaXMucHJvZHVjdERldGFpbHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGxldCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDwgd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICB2aWV3cG9ydEhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHdpbmRvdy5pbm5lcldpZHRoID4gNzcwKVxuICAgICAgJiYgKHZpZXdwb3J0SGVpZ2h0ID4gZGV0YWlsc0hlaWdodClcbiAgICApIHtcbiAgICAgIHRoaXMudHJpZ2dlckZpeGVkUHJvZHVjdEluZm8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9kdWN0RGV0YWlscy5jbGFzc0xpc3QucmVtb3ZlKCdwcm9kdWN0LWRldGFpbHMtZml4ZWQnKTtcbiAgICAgIHRoaXMucHJvZHVjdERldGFpbHMuY2xhc3NMaXN0LnJlbW92ZSgncHJvZHVjdC1kZXRhaWxzLWFic29sdXRlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnBvc2l0aW9uUHJvZHVjdEluZm8pO1xuICB9XG5cbiAgdHJpZ2dlckZpeGVkUHJvZHVjdEluZm8oKSB7XG4gICAgaWYgKHRoaXMuaW1hZ2VzTGF5b3V0ICE9PSAnbGlzdCcpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCB7IHNjcm9sbFRvcCB9ID0gd2luZG93O1xuICAgIGNvbnN0IHsgaGVpZ2h0OiBpbWFnZXNIZWlnaHQsIHRvcDogaW1hZ2VzT2Zmc2V0VG9wIH0gPSB0aGlzLnByb2R1Y3RJbWFnZXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaW1hZ2VzT2Zmc2V0Qm90dG9tID0gaW1hZ2VzT2Zmc2V0VG9wICsgaW1hZ2VzSGVpZ2h0O1xuICAgIGNvbnN0IGRldGFpbHNXcmFwcGVyT2Zmc2V0ID0gdGhpcy5wcm9kdWN0RGV0YWlsc1dyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIGxldCB7IGhlaWdodDogZGV0YWlsc0hlaWdodCwgdG9wOiBkZXRhaWxzT2Zmc2V0VG9wIH0gPSB0aGlzLnByb2R1Y3REZXRhaWxzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBkZXRhaWxzT2Zmc2V0Qm90dG9tID0gZGV0YWlsc09mZnNldFRvcCArIGRldGFpbHNIZWlnaHQ7XG5cbiAgICBpZiAoZGV0YWlsc0hlaWdodCA8IGltYWdlc0hlaWdodCkge1xuICAgICAgLy8gSWYgd2UncmUgZmFyIGVub3VnaCBkb3duIHRoZSBwYWdlIHRoYXQgdGhlIGNvbnRlbnQgaXMgbmVhciB0aGUgd2luZG93IHRvcFxuICAgICAgaWYgKChkZXRhaWxzV3JhcHBlck9mZnNldCAtIHNjcm9sbFRvcCkgPCAwKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG91ciBkZXRhaWxzIC8gaW1hZ2VzIGFyZSBvdXQgb2YgbGluZSBidXQgbG93IGVub3VnaCB0byBcImZpeFwiXG4gICAgICAgIGlmICgoZGV0YWlsc09mZnNldEJvdHRvbSA8IGltYWdlc09mZnNldEJvdHRvbSkgfHwgKHNjcm9sbFRvcCA8IGRldGFpbHNPZmZzZXRUb3ApKSB7XG4gICAgICAgICAgdGhpcy5wcm9kdWN0RGV0YWlscy5jbGFzc0xpc3QucmVtb3ZlKCdwcm9kdWN0LWRldGFpbHMtYWJzb2x1dGUnKTtcbiAgICAgICAgICB0aGlzLnByb2R1Y3REZXRhaWxzLmNsYXNzTGlzdC5hZGQoJ3Byb2R1Y3QtZGV0YWlscy1maXhlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgKHsgaGVpZ2h0OiBkZXRhaWxzSGVpZ2h0LCB0b3A6IGRldGFpbHNPZmZzZXRUb3AgfSA9IHRoaXMucHJvZHVjdERldGFpbHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICBkZXRhaWxzT2Zmc2V0Qm90dG9tID0gZGV0YWlsc09mZnNldFRvcCArIGRldGFpbHNIZWlnaHQ7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgZmFyIGVub3VnaCBkb3duIHRoZW4gdGhpcyBwb3NpdGlvbnMgaXRlbXMgbmVhciB0aGUgYm90dG9tXG4gICAgICAgIGlmICgoZGV0YWlsc09mZnNldEJvdHRvbSA+PSBpbWFnZXNPZmZzZXRCb3R0b20pIHx8IChzY3JvbGxUb3AgPj0gZGV0YWlsc09mZnNldFRvcCkpIHtcbiAgICAgICAgICB0aGlzLnByb2R1Y3REZXRhaWxzLmNsYXNzTGlzdC5yZW1vdmUoJ3Byb2R1Y3QtZGV0YWlscy1maXhlZCcpO1xuICAgICAgICAgIHRoaXMucHJvZHVjdERldGFpbHMuY2xhc3NMaXN0LmFkZCgncHJvZHVjdC1kZXRhaWxzLWFic29sdXRlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvZHVjdERldGFpbHMuY2xhc3NMaXN0LnJlbW92ZSgncHJvZHVjdC1kZXRhaWxzLWZpeGVkJyk7XG4gICAgICAgIHRoaXMucHJvZHVjdERldGFpbHMuY2xhc3NMaXN0LnJlbW92ZSgncHJvZHVjdC1kZXRhaWxzLWFic29sdXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkVG9DYXJ0KGUpIHtcbiAgICBpZiAodGhpcy5lbmFibGVDYXJ0UmVkaXJlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWxvYWQgdGhlIGNhcnQgcGFnZSB3aGVuIGEgcHJvZHVjdCBpcyBhZGRlZCB0byB0aGUgY2FydFxuICAgIGlmICghZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3RlbXBsYXRlLWNhcnQnKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlY2lwaWVudEZvcm1FbCkge1xuICAgICAgdGhpcy5yZWNpcGllbnRGb3JtRWwuY2xhc3NMaXN0LnJlbW92ZSgncmVjaXBpZW50LWZvcm0tLWhhcy1lcnJvcnMnKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2R1Y3RNZXNzYWdlcy5pbm5lckhUTUwgPSAnJztcblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKHRoaXMucHJvZHVjdEZvcm0pO1xuXG4gICAgZmV0Y2goXG4gICAgICBgJHt3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfYWRkX3VybH0uanNgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oaXRlbSA9PiB7XG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gd2luZG93LlRoZW1lLmFkZFRvQ2FydFN1Y2Nlc3NcbiAgICAgICAgICAucmVwbGFjZSgnKipwcm9kdWN0KionLCBpdGVtLnRpdGxlKVxuICAgICAgICAgIC5yZXBsYWNlKCcqKmNhcnRfbGluayoqJywgYDxhIGhyZWY9XCIke3dpbmRvdy5UaGVtZS5yb3V0ZXMuY2FydF91cmx9XCI+JHt0aGlzLmxhYmVscy5jYXJ0TGlua308L2E+YClcbiAgICAgICAgICAucmVwbGFjZSgnKipjb250aW51ZV9saW5rKionLCBgPGEgaHJlZj1cIiR7d2luZG93LlRoZW1lLnJvdXRlcy5hbGxfcHJvZHVjdHNfY29sbGVjdGlvbl91cmx9XCI+JHt0aGlzLmxhYmVscy5jb250aW51ZUxpbmt9PC9hPmApXG4gICAgICAgICAgLnJlcGxhY2UoJyoqY2hlY2tvdXRfbGluayoqJywgYDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIG5hbWU9XCJjaGVja291dFwiIGZvcm09XCJjaGVja291dF9mb3JtXCI+JHt0aGlzLmxhYmVscy5jaGVja291dExpbmt9PC9idXR0b24+YCk7XG5cbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RNZXNzYWdlcy5pbm5lckhUTUwgPSBtZXNzYWdlO1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0TWVzc2FnZXMuY2xhc3NMaXN0LmFkZCgnc3VjY2Vzcy1tZXNzYWdlJyk7XG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RNZXNzYWdlcy5jbGFzc0xpc3QucmVtb3ZlKCdlcnJvci1tZXNzYWdlJyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnQoaXRlbSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICA1MDAsXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMuaGFuZGxlRXJyb3JzKGVycm9yKSk7XG4gIH1cblxuICB1cGRhdGVDYXJ0KCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5taW5pLWNhcnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdlbXB0eScpO1xuICAgIGNvbnN0IG1pbmlDYXJ0SXRlbVdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWluaS1jYXJ0LWl0ZW0td3JhcHBlcicpO1xuICAgIGNvbnN0IGNhcnRDb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJ0LWNvdW50LW51bWJlcicpO1xuXG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfdXJsLFxuICAgICAgeyB2aWV3OiAnbWluaS1hamF4JyB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IGRhdGEsIGh0bWwgfSkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkTWluaUNhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdXBkYXRlZE1pbmlDYXJ0LmlubmVySFRNTCA9IGh0bWwubWluaUNhcnQ7XG4gICAgICAgIGNhcnRDb3VudC5mb3JFYWNoKGVsID0+IGVsLmlubmVyVGV4dCA9IGRhdGEuaXRlbUNvdW50KTtcblxuICAgICAgICBtb3JwaGRvbShcbiAgICAgICAgICBtaW5pQ2FydEl0ZW1XcmFwcGVyLFxuICAgICAgICAgIHVwZGF0ZWRNaW5pQ2FydC5xdWVyeVNlbGVjdG9yKCcubWluaS1jYXJ0LWl0ZW0td3JhcHBlcicpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmcm9tRWwudGFnTmFtZSA9PT0gJ0lNRycgJiYgZnJvbUVsLnNyYyA9PT0gdG9FbC5zcmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIHJpbWcud2F0Y2gobWluaUNhcnRJdGVtV3JhcHBlcik7XG4gIH1cblxuICBoYW5kbGVFcnJvcnMoZXJyb3IpIHtcbiAgICBlcnJvci5yZXNwb25zZS5qc29uKCkudGhlbihlcnIgPT4gc2V0VGltZW91dChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKGVyci5lcnJvcnMgJiYgZXJyLmVycm9ycy5lbWFpbCkge1xuICAgICAgICAgIHRoaXMucmVjaXBpZW50Rm9ybUVsLmNsYXNzTGlzdC5hZGQoJ3JlY2lwaWVudC1mb3JtLS1oYXMtZXJyb3JzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9kdWN0TWVzc2FnZXMuaW5uZXJIVE1MID0gZXJyLmRlc2NyaXB0aW9uO1xuICAgICAgICAgIHRoaXMucHJvZHVjdE1lc3NhZ2VzLmNsYXNzTGlzdC5hZGQoJ2Vycm9yLW1lc3NhZ2UnKTtcbiAgICAgICAgICB0aGlzLnByb2R1Y3RNZXNzYWdlcy5jbGFzc0xpc3QucmVtb3ZlKCdzdWNjZXNzLW1lc3NhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIDEwMDAsXG4gICAgKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUZBO0FBa0JBO0FBREE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBY0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSEE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQU5BO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFoV0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/Product.js\n");

/***/ }),

/***/ "./source/scripts/components/ProductGallery.js":
/*!*****************************************************!*\
  !*** ./source/scripts/components/ProductGallery.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ProductGallery)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _vimeo_player__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vimeo/player */ \"./node_modules/@vimeo/player/dist/player.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _ImageZoom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ImageZoom */ \"./source/scripts/components/ImageZoom.js\");\n/* harmony import */ var _helpers_youtubeIframeAPIHelper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers/youtubeIframeAPIHelper */ \"./source/scripts/helpers/youtubeIframeAPIHelper.js\");\n/* harmony import */ var _ProductSlideshow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ProductSlideshow */ \"./source/scripts/components/ProductSlideshow.js\");\n/* harmony import */ var _MasonryGrid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\n\n\n\n\n\n\n\n\nclass ProductGallery {\n  constructor(el, settings) {\n    this.el = el;\n    this.initialGallery = this.el.innerHTML;\n    this.settings = settings;\n    this.layout = this.el.dataset.productGalleryLayout;\n    this.productContainer = this.settings.product_container;\n    this.media = [];\n    this.models = {};\n    this.players = [];\n    this.flickityEvents = [];\n    this.pageDots = null;\n    this.flickityNavButtons = null;\n    this.externalVideoLoaded = false;\n    this.videoLoaded = false;\n    this.modelLoaded = false;\n    this.productMasonryLayout = null;\n    this.flickity = null;\n    this.viewport = this.el.querySelector('[data-product-gallery-viewport]');\n    this.navigation = this.el.querySelector('[data-product-gallery-navigation]');\n    this.masonryContainer = this.el.querySelector('[data-masonry-gallery]');\n    this.figures = this.el.querySelectorAll('[data-product-gallery-figure]');\n    this.initMasonry = this._initProductMasonry.bind(this);\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n\n    if (this.viewport) {\n      this.selected = {\n        figure: this.viewport.querySelector('[data-product-gallery-selected=\"true\"]'),\n        thumbnail: this.navigation ? this.navigation.querySelector('[data-product-gallery-selected=\"true\"]') : null\n      };\n    }\n\n    if (this.layout !== 'masonry') {\n      this._loadLibrariesAndInitMedia();\n    }\n\n    this._registerEvents();\n\n    this._initLayout();\n  }\n\n  _loadLibrariesAndInitMedia() {\n    const features = [];\n\n    if (this.el.querySelector('[data-media-type=\"model\"]')) {\n      features.push({\n        name: 'model-viewer-ui',\n        version: '1.0',\n        onLoad: this._onModelLibraryLoad.bind(this)\n      });\n      features.push({\n        name: 'shopify-xr',\n        version: '1.0'\n      });\n    }\n\n    if (this.el.querySelector('[data-media-type=\"video\"]')) {\n      Promise.all([new Promise(resolve => {\n        if (!document.querySelector('#plyr-stylesheet')) {\n          const link = document.createElement('link');\n          link.setAttribute('id', 'plyr-stylesheet');\n          link.setAttribute('rel', 'stylesheet');\n          link.setAttribute('href', 'https://cdn.shopify.com/shopifycloud/shopify-plyr/v1.0/shopify-plyr.css');\n          link.onload = resolve;\n          document.body.appendChild(link);\n        } else {\n          resolve();\n        }\n      }), new Promise(resolve => {\n        features.push({\n          name: 'video-ui',\n          version: '1.0',\n          onLoad: resolve\n        });\n      })]).then(this._onVideoLibraryLoad.bind(this));\n    }\n\n    if (this.el.querySelector('[data-media-type=\"external_video\"]')) {\n      (0,_helpers_youtubeIframeAPIHelper__WEBPACK_IMPORTED_MODULE_5__.default)().then(this._onExternalVideoLibraryLoad.bind(this));\n    }\n\n    if (features.length) {\n      Shopify.loadFeatures(features);\n    }\n  }\n\n  _registerEvents() {\n    if (this.el.querySelector('[data-media-type=\"model\"]')) {\n      this.events.register(this.viewport, 'click', e => {\n        if ('shopifyXr' in e.target.dataset) {\n          this._onViewInYourSpaceClick(e.target);\n        }\n      });\n    }\n\n    if (this.layout === 'masonry') {\n      this.events.register(window, 'resize', e => this.initMasonry(e));\n    }\n\n    _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_3__.default.watch(this.el);\n  }\n\n  _initLayout() {\n    if (this.layout === 'masonry') {\n      this._initProductMasonry();\n    } else if (this.layout === 'slideshow') {\n      this.slideshow = new _ProductSlideshow__WEBPACK_IMPORTED_MODULE_6__.default({\n        el: this.el\n      });\n\n      if (this.navigation) {\n        this.thumbnails = this.navigation.querySelectorAll('[data-product-gallery-thumbnail]');\n\n        this.onThumbnailClick = e => this._selectMediaByIndex(e.currentTarget.dataset.productGalleryThumbnail);\n\n        this.thumbnails.forEach(thumbnail => this.events.register(thumbnail, 'click', this.onThumbnailClick));\n      }\n\n      if (this.settings.enable_zoom && this.el.querySelectorAll('[data-media-type=\"image\"]').length > 0) {\n        this.zoomView = new _ImageZoom__WEBPACK_IMPORTED_MODULE_4__.default({\n          viewport: this.viewport,\n          images: this.settings.images_json\n        });\n      }\n    }\n  }\n\n  selectMediaByVariant(variant) {\n    if (!variant || !variant.featured_media) return;\n\n    if (this.slideshow) {\n      const figure = this.viewport.querySelector(`[data-media=\"${variant.featured_media.id}\"]`);\n      this.slideshow.selectThumbnail(variant.featured_media.id);\n\n      this._selectMediaByIndex(figure.dataset.productGalleryFigure);\n    } else if (this.flickity) {\n      const slideIndex = this.el.querySelector(`[data-media=\"${variant.featured_media.id}\"]`).dataset.productGalleryFigure;\n      this.flickity.select(parseInt(slideIndex, 10));\n    }\n  }\n\n  unload() {\n    this.events.unregisterAll();\n    this.media.forEach(m => m.unload());\n    this.media = [];\n\n    if (this.productMasonryLayout) {\n      this.productMasonryLayout.unload();\n      this.productMasonryLayout = null;\n    }\n\n    if (this.flickity) {\n      this.flickity.destroy();\n      this.flickity = null;\n      this.flickityEvents = [];\n    }\n\n    if (this.imageZoom) {\n      this.imageZoom.unload();\n    }\n\n    this.el.innerHTML = this.initialGallery;\n  }\n\n  _onModelLibraryLoad() {\n    if (!Shopify.ModelViewerUI) return;\n    if (this.modelLoaded) return;\n    this.el.querySelectorAll('[data-media-type=\"model\"]').forEach(figure => {\n      const controls = ['zoom-in', 'zoom-out'];\n      const {\n        productGalleryFigure\n      } = figure.dataset;\n      if (document.fullscreenEnabled) controls.push('fullscreen');\n\n      const onPlayListener = () => {\n        if (this.flickity) {\n          this.flickity.unbindDrag();\n        }\n      };\n\n      const onPauseListener = () => {\n        if (this.flickity) {\n          this.flickity.bindDrag();\n        }\n      };\n\n      const modelViewer = figure.querySelector('model-viewer');\n\n      if (modelViewer) {\n        const player = new Shopify.ModelViewerUI(figure.querySelector('model-viewer'), {\n          controls\n        });\n        this.models[productGalleryFigure] = player;\n        this.media.push({\n          type: 'model',\n          figure,\n          player,\n          focus: () => {},\n          restart: () => {},\n          pause: () => player.pause(),\n          play: () => player.play(),\n          unload: () => {}\n        });\n\n        if (this.flickity) {\n          this.events.register(modelViewer, 'shopify_model_viewer_ui_toggle_play', onPlayListener);\n          this.events.register(modelViewer, 'shopify_model_viewer_ui_toggle_pause', onPauseListener);\n          this.flickity.resize();\n        }\n      }\n    });\n\n    if (this.productMasonryLayout) {\n      this.productMasonryLayout.layout();\n    }\n\n    this.modelLoaded = true;\n  }\n\n  _onViewInYourSpaceClick(target) {\n    if (target.dataset.shopifyModel3dId === this.selected.figure.dataset.media) return;\n    const figure = this.viewport.querySelector(`[data-media=\"${target.dataset.shopifyModel3dId}\"]`);\n\n    this._selectMediaByEl(figure);\n  }\n\n  _selectMediaByEl(el) {\n    this._selectMediaByIndex(parseInt(el.dataset.productGalleryFigure, 10));\n  }\n\n  _onVideoLibraryLoad() {\n    if (!Shopify.Plyr) return;\n    if (this.videoLoaded && this.settings.isQuickshop) return;\n    const videoFigures = this.el.querySelectorAll('[data-media-type=\"video\"]');\n\n    for (let i = 0; i < videoFigures.length; i++) {\n      const videoFigure = videoFigures[i];\n      const player = new Shopify.Plyr(videoFigure.querySelector('video'), {\n        loop: {\n          active: this.settings.enable_video_looping\n        }\n      });\n      const plyrEl = videoFigure.querySelector('.plyr');\n      const video = {\n        type: 'video',\n        figure: videoFigure,\n        player,\n        focus: () => plyrEl.focus(),\n        restart: () => {\n          player.restart();\n          player.play();\n        },\n        pause: () => player.pause(),\n        play: () => player.play(),\n        unload: () => player.destroy()\n      };\n      this.events.register(videoFigure, 'play', () => this._pauseMedia(video));\n      this.media.push(video);\n\n      if (this.flickity) {\n        this.flickity.resize();\n      }\n    }\n\n    if (this.productMasonryLayout && this.settings.isQuickshop) {\n      setTimeout(() => {\n        this.productMasonryLayout.layout();\n      }, 100);\n    } else if (this.productMasonryLayout && !this.settings.isQuickshop) {\n      this.productMasonryLayout.layout();\n    }\n\n    this.videoLoaded = true;\n  }\n\n  _onExternalVideoLibraryLoad() {\n    if (this.externalVideoLoaded && this.settings.isQuickshop) return;\n    const videoFigures = this.el.querySelectorAll('figure[data-media-type=\"external_video\"]');\n\n    for (let i = 0; i < videoFigures.length; i++) {\n      const videoFigure = videoFigures[i];\n      const videoIframe = videoFigure.querySelector('iframe');\n      const iframeSrc = videoIframe.src;\n      let video;\n\n      if (iframeSrc.includes('youtube')) {\n        const player = new YT.Player(videoIframe);\n        video = {\n          type: 'video',\n          figure: videoFigure,\n          player,\n          focus: () => player.getIframe().focus(),\n          restart: () => {\n            player.seekTo(0);\n            player.playVideo();\n          },\n          pause: () => player.pauseVideo(),\n          play: () => {\n            videoFigure.classList.add('video-playing');\n            player.playVideo();\n          },\n          unload: () => player.destroy()\n        }; // `player` is a Youtube Player instance so we want to add this event using the JS API,\n        // not using our own Events library. It will be removed when the player this media is\n        // unloaded and the player's `destroy` method is called.\n\n        player.addEventListener('onStateChange', ({\n          data\n        }) => {\n          if (data === YT.PlayerState.ENDED && this.settings.enable_video_looping) {\n            video.restart();\n          } else if (data === YT.PlayerState.PLAYING) {\n            this._pauseMedia(video);\n          }\n        });\n      } else {\n        const player = new _vimeo_player__WEBPACK_IMPORTED_MODULE_2__.default(videoIframe);\n        player.setLoop(this.settings.enable_video_looping);\n        video = {\n          type: 'video',\n          figure: videoFigure,\n          player,\n          focus: () => videoIframe.focus(),\n          restart: () => {\n            player.setCurrentTime(0);\n            player.play();\n          },\n          pause: () => player.pause(),\n          play: () => player.play(),\n          unload: () => player.unload()\n        };\n      }\n\n      this.media.push(video);\n\n      if (this.flickity) {\n        this.flickity.resize();\n      }\n    }\n\n    if (this.productMasonryLayout && this.settings.isQuickshop) {\n      setTimeout(() => {\n        this.productMasonryLayout.layout();\n      }, 100);\n    } else if (this.productMasonryLayout && !this.settings.isQuickshop) {\n      this.productMasonryLayout.layout();\n    }\n\n    this.externalVideoLoaded = true;\n  }\n\n  _onMediaSelect(media) {\n    if (!media) return;\n\n    switch (media.type) {\n      case 'video':\n        media.focus();\n\n        if (this.settings.enable_video_autoplay && !_themeUtils__WEBPACK_IMPORTED_MODULE_8__.default.isSmall() && this.layout !== 'list' && this.layout !== 'masonry') {\n          media.play();\n        }\n\n        break;\n\n      case 'model':\n        if (document.querySelector('html').classList.contains('no-touch')) {\n          media.play();\n        }\n\n        break;\n\n      default:\n        break;\n    }\n  }\n\n  _pauseMedia(excludeMedia = null) {\n    this.media.forEach(m => {\n      if (m !== excludeMedia) {\n        m.pause();\n      }\n    });\n  }\n\n  _selectMediaByIndex(index) {\n    if (this.layout !== 'slideshow') return;\n    const figure = this.figures[index];\n    this.selected.figure.dataset.productGallerySelected = false;\n    this.selected.figure.setAttribute('aria-hidden', true);\n    this.selected.figure = figure;\n    this.selected.figure.dataset.productGallerySelected = true;\n    this.selected.figure.setAttribute('aria-hidden', false);\n\n    if (this.navigation) {\n      const thumbnail = this.thumbnails[index];\n      this.selected.thumbnail.dataset.productGallerySelected = false;\n      this.selected.thumbnail = thumbnail;\n      this.selected.thumbnail.dataset.productGallerySelected = true;\n    }\n\n    this._pauseMedia();\n\n    this._onMediaSelect(this.media.filter(m => m.figure === this.selected.figure)[0]);\n\n    if (this.zoomView && figure.dataset.mediaType === 'image') {\n      this.zoomView.prepareZoom(true);\n    }\n  }\n\n  _initProductMasonry(e) {\n    if (e && document.fullscreenElement) {\n      return;\n    } else if (e && !document.fullscreenElement) {\n      if (this.productMasonryLayout) {\n        this.productMasonryLayout.layout();\n      }\n    }\n\n    if (_themeUtils__WEBPACK_IMPORTED_MODULE_8__.default.isSmall()) {\n      if (this.productMasonryLayout) {\n        this.unload();\n        this.el.setAttribute('style', '');\n\n        this._registerEvents();\n      }\n\n      if (!this.flickity) {\n        this._initProductFlickity();\n      }\n    } else {\n      if (this.flickity) {\n        this.unload();\n        this.el.setAttribute('style', '');\n\n        this._registerEvents();\n      }\n\n      if (!this.productMasonryLayout) {\n        if (this.figures.length > 1) {\n          this.productMasonryLayout = new _MasonryGrid__WEBPACK_IMPORTED_MODULE_7__.default({\n            el: this.el,\n            settings: {\n              itemSelector: '.product-gallery--viewport--figure',\n              columnWidth: '[data-masonry-image-sizer]'\n            }\n          });\n        }\n\n        this._loadLibrariesAndInitMedia();\n      }\n\n      if (this.productMasonryLayout && this.settings.isQuickshop) {\n        setTimeout(() => {\n          this.productMasonryLayout.layout();\n        }, 100);\n      } else if (this.productMasonryLayout && !this.settings.isQuickshop) {\n        this.productMasonryLayout.layout();\n      }\n    }\n  }\n\n  _selectFlickitySlide(el) {\n    if (el.hasAttribute('data-mobile-slider-button')) {\n      if (el.dataset.mobileSliderButton === 'next') {\n        this.flickity.next();\n      } else {\n        this.flickity.previous();\n      }\n    }\n\n    if (el.hasAttribute('data-mobile-slider-dot')) {\n      this.flickity.select(parseInt(el.dataset.slideDotIndex, 10));\n    }\n\n    this._pauseMedia();\n\n    this._onMediaSelect(this.media.filter(m => m.figure === this.flickity.selectedElement)[0]);\n  }\n\n  _selectFlickityNav() {\n    this.pageDots.forEach(dotEl => {\n      if (parseInt(dotEl.dataset.slideDotIndex, 10) === this.flickity.selectedIndex) {\n        dotEl.classList.add('selected');\n      } else {\n        dotEl.classList.remove('selected');\n      }\n    });\n    this.flickityNavButtons.forEach(navEl => {\n      if (navEl.dataset.mobileSliderButton === 'prev' && this.flickity.selectedIndex === 0) {\n        navEl.disabled = true;\n      } else if (navEl.dataset.mobileSliderButton === 'next' && this.flickity.selectedIndex === this.flickity.slides.length - 1) {\n        navEl.disabled = true;\n      } else {\n        navEl.disabled = false;\n      }\n    });\n  }\n\n  _initProductFlickity() {\n    if (this.figures.length <= 1) return;\n\n    if (!this.flickity) {\n      this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_1___default())(this.el, {\n        cellAlign: 'left',\n        cellSelector: '.product-gallery--viewport--figure',\n        contain: true,\n        percentPosition: false,\n        prevNextButtons: true,\n        adaptiveHeight: true,\n        setGallerySize: true,\n        pageDots: true,\n        lazyLoad: false\n      });\n      this.pageDots = this.productContainer.querySelectorAll('[data-mobile-slider-dot]');\n      this.flickityNavButtons = this.productContainer.querySelectorAll('[data-mobile-slider-button]');\n      this.flickity.on('select', () => this._selectFlickityNav());\n      this.flickityNavButtons.forEach(el => {\n        this.flickityEvents.push(this.events.register(el, 'click', () => this._selectFlickitySlide(el)));\n      });\n      this.pageDots.forEach(el => {\n        this.flickityEvents.push(this.events.register(el, 'click', () => this._selectFlickitySlide(el)));\n      });\n      this.flickityEvents.push(this.events.register(this.el, 'rimg:load', () => this.flickity.resize())); // Flickity controls the pointerdown event which prevents model-viewer-ui from\n      // triggering .play() on mouseup. This returns this functionality.\n\n      this.flickity.on('staticClick', (event, pointer, cellElement) => {\n        const figure = cellElement;\n\n        if (figure && this.models[figure.dataset.productGalleryFigure]) {\n          const model = this.models[figure.dataset.productGalleryFigure];\n          model.play();\n        }\n      });\n    }\n\n    this._loadLibrariesAndInitMedia();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RHYWxsZXJ5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvUHJvZHVjdEdhbGxlcnkuanM/MWMwZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IFZpbWVvIGZyb20gJ0B2aW1lby9wbGF5ZXInO1xuaW1wb3J0IHJpbWcgZnJvbSAnQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5JztcbmltcG9ydCBJbWFnZVpvb20gZnJvbSAnLi9JbWFnZVpvb20nO1xuaW1wb3J0IGxvYWRZb3V0dWJlSWZyYW1lQVBJIGZyb20gJy4uL2hlbHBlcnMveW91dHViZUlmcmFtZUFQSUhlbHBlcic7XG5pbXBvcnQgUHJvZHVjdFNsaWRlc2hvdyBmcm9tICcuL1Byb2R1Y3RTbGlkZXNob3cnO1xuaW1wb3J0IE1hc29ucnlHcmlkIGZyb20gJy4vTWFzb25yeUdyaWQnO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RHYWxsZXJ5IHtcbiAgY29uc3RydWN0b3IoZWwsIHNldHRpbmdzKSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuaW5pdGlhbEdhbGxlcnkgPSB0aGlzLmVsLmlubmVySFRNTDtcbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5sYXlvdXQgPSB0aGlzLmVsLmRhdGFzZXQucHJvZHVjdEdhbGxlcnlMYXlvdXQ7XG4gICAgdGhpcy5wcm9kdWN0Q29udGFpbmVyID0gdGhpcy5zZXR0aW5ncy5wcm9kdWN0X2NvbnRhaW5lcjtcbiAgICB0aGlzLm1lZGlhID0gW107XG4gICAgdGhpcy5tb2RlbHMgPSB7fTtcbiAgICB0aGlzLnBsYXllcnMgPSBbXTtcbiAgICB0aGlzLmZsaWNraXR5RXZlbnRzID0gW107XG4gICAgdGhpcy5wYWdlRG90cyA9IG51bGw7XG4gICAgdGhpcy5mbGlja2l0eU5hdkJ1dHRvbnMgPSBudWxsO1xuICAgIHRoaXMuZXh0ZXJuYWxWaWRlb0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMudmlkZW9Mb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsTG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCA9IG51bGw7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG5cbiAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LWdhbGxlcnktdmlld3BvcnRdJyk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LWdhbGxlcnktbmF2aWdhdGlvbl0nKTtcbiAgICB0aGlzLm1hc29ucnlDb250YWluZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1hc29ucnktZ2FsbGVyeV0nKTtcbiAgICB0aGlzLmZpZ3VyZXMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXByb2R1Y3QtZ2FsbGVyeS1maWd1cmVdJyk7XG5cbiAgICB0aGlzLmluaXRNYXNvbnJ5ID0gdGhpcy5faW5pdFByb2R1Y3RNYXNvbnJ5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG5cbiAgICBpZiAodGhpcy52aWV3cG9ydCkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHtcbiAgICAgICAgZmlndXJlOiB0aGlzLnZpZXdwb3J0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtZ2FsbGVyeS1zZWxlY3RlZD1cInRydWVcIl0nKSxcbiAgICAgICAgdGh1bWJuYWlsOiB0aGlzLm5hdmlnYXRpb24gPyB0aGlzLm5hdmlnYXRpb24ucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1nYWxsZXJ5LXNlbGVjdGVkPVwidHJ1ZVwiXScpIDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGF5b3V0ICE9PSAnbWFzb25yeScpIHtcbiAgICAgIHRoaXMuX2xvYWRMaWJyYXJpZXNBbmRJbml0TWVkaWEoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWdpc3RlckV2ZW50cygpO1xuICAgIHRoaXMuX2luaXRMYXlvdXQoKTtcbiAgfVxuXG4gIF9sb2FkTGlicmFyaWVzQW5kSW5pdE1lZGlhKCkge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAodGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tZWRpYS10eXBlPVwibW9kZWxcIl0nKSkge1xuICAgICAgZmVhdHVyZXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdtb2RlbC12aWV3ZXItdWknLFxuICAgICAgICAgIHZlcnNpb246ICcxLjAnLFxuICAgICAgICAgIG9uTG9hZDogdGhpcy5fb25Nb2RlbExpYnJhcnlMb2FkLmJpbmQodGhpcyksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgZmVhdHVyZXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdzaG9waWZ5LXhyJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWVkaWEtdHlwZT1cInZpZGVvXCJdJykpIHtcbiAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGx5ci1zdHlsZXNoZWV0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG5cbiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpZCcsICdwbHlyLXN0eWxlc2hlZXQnKTtcbiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnc3R5bGVzaGVldCcpO1xuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vc2hvcGlmeWNsb3VkL3Nob3BpZnktcGx5ci92MS4wL3Nob3BpZnktcGx5ci5jc3MnKTtcbiAgICAgICAgICAgIGxpbmsub25sb2FkID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICBmZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6ICd2aWRlby11aScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgICAgICAgIG9uTG9hZDogcmVzb2x2ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICBdKS50aGVuKHRoaXMuX29uVmlkZW9MaWJyYXJ5TG9hZC5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tZWRpYS10eXBlPVwiZXh0ZXJuYWxfdmlkZW9cIl0nKSkge1xuICAgICAgbG9hZFlvdXR1YmVJZnJhbWVBUEkoKS50aGVuKHRoaXMuX29uRXh0ZXJuYWxWaWRlb0xpYnJhcnlMb2FkLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgIFNob3BpZnkubG9hZEZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICB9XG4gIH1cblxuICBfcmVnaXN0ZXJFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWVkaWEtdHlwZT1cIm1vZGVsXCJdJykpIHtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMudmlld3BvcnQsICdjbGljaycsIGUgPT4ge1xuICAgICAgICBpZiAoJ3Nob3BpZnlYcicgaW4gZS50YXJnZXQuZGF0YXNldCkge1xuICAgICAgICAgIHRoaXMuX29uVmlld0luWW91clNwYWNlQ2xpY2soZS50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICdtYXNvbnJ5Jykge1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAncmVzaXplJywgKGUpID0+IHRoaXMuaW5pdE1hc29ucnkoZSkpO1xuICAgIH1cblxuICAgIHJpbWcud2F0Y2godGhpcy5lbCk7XG4gIH1cblxuICBfaW5pdExheW91dCgpIHtcbiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICdtYXNvbnJ5Jykge1xuICAgICAgdGhpcy5faW5pdFByb2R1Y3RNYXNvbnJ5KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxheW91dCA9PT0gJ3NsaWRlc2hvdycpIHtcbiAgICAgIHRoaXMuc2xpZGVzaG93ID0gbmV3IFByb2R1Y3RTbGlkZXNob3coeyBlbDogdGhpcy5lbCB9KTtcblxuICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbikge1xuICAgICAgICB0aGlzLnRodW1ibmFpbHMgPSB0aGlzLm5hdmlnYXRpb24ucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJvZHVjdC1nYWxsZXJ5LXRodW1ibmFpbF0nKTtcbiAgICAgICAgdGhpcy5vblRodW1ibmFpbENsaWNrID0gZSA9PiAoXG4gICAgICAgICAgdGhpcy5fc2VsZWN0TWVkaWFCeUluZGV4KGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5VGh1bWJuYWlsKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMudGh1bWJuYWlscy5mb3JFYWNoKHRodW1ibmFpbCA9PiB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aHVtYm5haWwsICdjbGljaycsIHRoaXMub25UaHVtYm5haWxDbGljaykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVfem9vbSAmJiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1lZGlhLXR5cGU9XCJpbWFnZVwiXScpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy56b29tVmlldyA9IG5ldyBJbWFnZVpvb20oe1xuICAgICAgICAgIHZpZXdwb3J0OiB0aGlzLnZpZXdwb3J0LFxuICAgICAgICAgIGltYWdlczogdGhpcy5zZXR0aW5ncy5pbWFnZXNfanNvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0TWVkaWFCeVZhcmlhbnQodmFyaWFudCkge1xuICAgIGlmICghdmFyaWFudCB8fCAhdmFyaWFudC5mZWF0dXJlZF9tZWRpYSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuc2xpZGVzaG93KSB7XG4gICAgICBjb25zdCBmaWd1cmUgPSB0aGlzLnZpZXdwb3J0LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1lZGlhPVwiJHt2YXJpYW50LmZlYXR1cmVkX21lZGlhLmlkfVwiXWApO1xuICAgICAgdGhpcy5zbGlkZXNob3cuc2VsZWN0VGh1bWJuYWlsKHZhcmlhbnQuZmVhdHVyZWRfbWVkaWEuaWQpO1xuICAgICAgdGhpcy5fc2VsZWN0TWVkaWFCeUluZGV4KGZpZ3VyZS5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5RmlndXJlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIGNvbnN0IHNsaWRlSW5kZXggPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1lZGlhPVwiJHt2YXJpYW50LmZlYXR1cmVkX21lZGlhLmlkfVwiXWApLmRhdGFzZXQucHJvZHVjdEdhbGxlcnlGaWd1cmU7XG4gICAgICB0aGlzLmZsaWNraXR5LnNlbGVjdChwYXJzZUludChzbGlkZUluZGV4LCAxMCkpO1xuICAgIH1cbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLmV2ZW50cy51bnJlZ2lzdGVyQWxsKCk7XG5cbiAgICB0aGlzLm1lZGlhLmZvckVhY2gobSA9PiBtLnVubG9hZCgpKTtcbiAgICB0aGlzLm1lZGlhID0gW107XG5cbiAgICBpZiAodGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCkge1xuICAgICAgdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dC51bmxvYWQoKTtcbiAgICAgIHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgICAgdGhpcy5mbGlja2l0eUV2ZW50cyA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmltYWdlWm9vbSkge1xuICAgICAgdGhpcy5pbWFnZVpvb20udW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5pbm5lckhUTUwgPSB0aGlzLmluaXRpYWxHYWxsZXJ5O1xuICB9XG5cbiAgX29uTW9kZWxMaWJyYXJ5TG9hZCgpIHtcbiAgICBpZiAoIVNob3BpZnkuTW9kZWxWaWV3ZXJVSSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLm1vZGVsTG9hZGVkKSByZXR1cm47XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1lZGlhLXR5cGU9XCJtb2RlbFwiXScpLmZvckVhY2goZmlndXJlID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xzID0gWyd6b29tLWluJywgJ3pvb20tb3V0J107XG4gICAgICBjb25zdCB7IHByb2R1Y3RHYWxsZXJ5RmlndXJlIH0gPSBmaWd1cmUuZGF0YXNldDtcblxuICAgICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkKSBjb250cm9scy5wdXNoKCdmdWxsc2NyZWVuJyk7XG5cbiAgICAgIGNvbnN0IG9uUGxheUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICAgIHRoaXMuZmxpY2tpdHkudW5iaW5kRHJhZygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblBhdXNlTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICAgICAgdGhpcy5mbGlja2l0eS5iaW5kRHJhZygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2RlbFZpZXdlciA9IGZpZ3VyZS5xdWVyeVNlbGVjdG9yKCdtb2RlbC12aWV3ZXInKTtcblxuICAgICAgaWYgKG1vZGVsVmlld2VyKSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBTaG9waWZ5Lk1vZGVsVmlld2VyVUkoZmlndXJlLnF1ZXJ5U2VsZWN0b3IoJ21vZGVsLXZpZXdlcicpLCB7IGNvbnRyb2xzIH0pO1xuXG4gICAgICAgIHRoaXMubW9kZWxzW3Byb2R1Y3RHYWxsZXJ5RmlndXJlXSA9IHBsYXllcjtcblxuICAgICAgICB0aGlzLm1lZGlhLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdtb2RlbCcsXG4gICAgICAgICAgZmlndXJlLFxuICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICBmb2N1czogKCkgPT4ge30sXG4gICAgICAgICAgcmVzdGFydDogKCkgPT4ge30sXG4gICAgICAgICAgcGF1c2U6ICgpID0+IHBsYXllci5wYXVzZSgpLFxuICAgICAgICAgIHBsYXk6ICgpID0+IHBsYXllci5wbGF5KCksXG4gICAgICAgICAgdW5sb2FkOiAoKSA9PiB7fSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihtb2RlbFZpZXdlciwgJ3Nob3BpZnlfbW9kZWxfdmlld2VyX3VpX3RvZ2dsZV9wbGF5Jywgb25QbGF5TGlzdGVuZXIpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKG1vZGVsVmlld2VyLCAnc2hvcGlmeV9tb2RlbF92aWV3ZXJfdWlfdG9nZ2xlX3BhdXNlJywgb25QYXVzZUxpc3RlbmVyKTtcbiAgICAgICAgICB0aGlzLmZsaWNraXR5LnJlc2l6ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQpIHtcbiAgICAgIHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQubGF5b3V0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5tb2RlbExvYWRlZCA9IHRydWU7XG4gIH1cblxuICBfb25WaWV3SW5Zb3VyU3BhY2VDbGljayh0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0LmRhdGFzZXQuc2hvcGlmeU1vZGVsM2RJZCA9PT0gdGhpcy5zZWxlY3RlZC5maWd1cmUuZGF0YXNldC5tZWRpYSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmlndXJlID0gdGhpcy52aWV3cG9ydC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1tZWRpYT1cIiR7dGFyZ2V0LmRhdGFzZXQuc2hvcGlmeU1vZGVsM2RJZH1cIl1gKTtcbiAgICB0aGlzLl9zZWxlY3RNZWRpYUJ5RWwoZmlndXJlKTtcbiAgfVxuXG4gIF9zZWxlY3RNZWRpYUJ5RWwoZWwpIHtcbiAgICB0aGlzLl9zZWxlY3RNZWRpYUJ5SW5kZXgocGFyc2VJbnQoZWwuZGF0YXNldC5wcm9kdWN0R2FsbGVyeUZpZ3VyZSwgMTApKTtcbiAgfVxuXG4gIF9vblZpZGVvTGlicmFyeUxvYWQoKSB7XG4gICAgaWYgKCFTaG9waWZ5LlBseXIpIHJldHVybjtcbiAgICBpZiAodGhpcy52aWRlb0xvYWRlZCAmJiB0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSByZXR1cm47XG5cbiAgICBjb25zdCB2aWRlb0ZpZ3VyZXMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1lZGlhLXR5cGU9XCJ2aWRlb1wiXScpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWRlb0ZpZ3VyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZpZGVvRmlndXJlID0gdmlkZW9GaWd1cmVzW2ldO1xuICAgICAgY29uc3QgcGxheWVyID0gbmV3IFNob3BpZnkuUGx5cihcbiAgICAgICAgdmlkZW9GaWd1cmUucXVlcnlTZWxlY3RvcigndmlkZW8nKSxcbiAgICAgICAge1xuICAgICAgICAgIGxvb3A6IHsgYWN0aXZlOiB0aGlzLnNldHRpbmdzLmVuYWJsZV92aWRlb19sb29waW5nIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwbHlyRWwgPSB2aWRlb0ZpZ3VyZS5xdWVyeVNlbGVjdG9yKCcucGx5cicpO1xuXG4gICAgICBjb25zdCB2aWRlbyA9IHtcbiAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgZmlndXJlOiB2aWRlb0ZpZ3VyZSxcbiAgICAgICAgcGxheWVyLFxuICAgICAgICBmb2N1czogKCkgPT4gcGx5ckVsLmZvY3VzKCksXG4gICAgICAgIHJlc3RhcnQ6ICgpID0+IHtcbiAgICAgICAgICBwbGF5ZXIucmVzdGFydCgpO1xuICAgICAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHBhdXNlOiAoKSA9PiBwbGF5ZXIucGF1c2UoKSxcbiAgICAgICAgcGxheTogKCkgPT4gcGxheWVyLnBsYXkoKSxcbiAgICAgICAgdW5sb2FkOiAoKSA9PiBwbGF5ZXIuZGVzdHJveSgpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodmlkZW9GaWd1cmUsICdwbGF5JywgKCkgPT4gdGhpcy5fcGF1c2VNZWRpYSh2aWRlbykpO1xuXG4gICAgICB0aGlzLm1lZGlhLnB1c2godmlkZW8pO1xuXG4gICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLmZsaWNraXR5LnJlc2l6ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0ICYmIHRoaXMuc2V0dGluZ3MuaXNRdWlja3Nob3ApIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0LmxheW91dCgpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQgJiYgIXRoaXMuc2V0dGluZ3MuaXNRdWlja3Nob3ApIHtcbiAgICAgIHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQubGF5b3V0KCk7XG4gICAgfVxuXG4gICAgdGhpcy52aWRlb0xvYWRlZCA9IHRydWU7XG4gIH1cblxuICBfb25FeHRlcm5hbFZpZGVvTGlicmFyeUxvYWQoKSB7XG4gICAgaWYgKHRoaXMuZXh0ZXJuYWxWaWRlb0xvYWRlZCAmJiB0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSByZXR1cm47XG5cbiAgICBjb25zdCB2aWRlb0ZpZ3VyZXMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ZpZ3VyZVtkYXRhLW1lZGlhLXR5cGU9XCJleHRlcm5hbF92aWRlb1wiXScpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWRlb0ZpZ3VyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZpZGVvRmlndXJlID0gdmlkZW9GaWd1cmVzW2ldO1xuICAgICAgY29uc3QgdmlkZW9JZnJhbWUgPSB2aWRlb0ZpZ3VyZS5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKTtcbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IHZpZGVvSWZyYW1lLnNyYztcbiAgICAgIGxldCB2aWRlbztcblxuICAgICAgaWYgKGlmcmFtZVNyYy5pbmNsdWRlcygneW91dHViZScpKSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBZVC5QbGF5ZXIodmlkZW9JZnJhbWUpO1xuXG4gICAgICAgIHZpZGVvID0ge1xuICAgICAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICAgICAgZmlndXJlOiB2aWRlb0ZpZ3VyZSxcbiAgICAgICAgICBwbGF5ZXIsXG4gICAgICAgICAgZm9jdXM6ICgpID0+IHBsYXllci5nZXRJZnJhbWUoKS5mb2N1cygpLFxuICAgICAgICAgIHJlc3RhcnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHBsYXllci5zZWVrVG8oMCk7XG4gICAgICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXVzZTogKCkgPT4gcGxheWVyLnBhdXNlVmlkZW8oKSxcbiAgICAgICAgICBwbGF5OiAoKSA9PiB7XG4gICAgICAgICAgICB2aWRlb0ZpZ3VyZS5jbGFzc0xpc3QuYWRkKCd2aWRlby1wbGF5aW5nJyk7XG5cbiAgICAgICAgICAgIHBsYXllci5wbGF5VmlkZW8oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVubG9hZDogKCkgPT4gcGxheWVyLmRlc3Ryb3koKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBgcGxheWVyYCBpcyBhIFlvdXR1YmUgUGxheWVyIGluc3RhbmNlIHNvIHdlIHdhbnQgdG8gYWRkIHRoaXMgZXZlbnQgdXNpbmcgdGhlIEpTIEFQSSxcbiAgICAgICAgLy8gbm90IHVzaW5nIG91ciBvd24gRXZlbnRzIGxpYnJhcnkuIEl0IHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoZSBwbGF5ZXIgdGhpcyBtZWRpYSBpc1xuICAgICAgICAvLyB1bmxvYWRlZCBhbmQgdGhlIHBsYXllcidzIGBkZXN0cm95YCBtZXRob2QgaXMgY2FsbGVkLlxuICAgICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignb25TdGF0ZUNoYW5nZScsICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhID09PSBZVC5QbGF5ZXJTdGF0ZS5FTkRFRCAmJiB0aGlzLnNldHRpbmdzLmVuYWJsZV92aWRlb19sb29waW5nKSB7XG4gICAgICAgICAgICB2aWRlby5yZXN0YXJ0KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBZVC5QbGF5ZXJTdGF0ZS5QTEFZSU5HKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXVzZU1lZGlhKHZpZGVvKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGxheWVyID0gbmV3IFZpbWVvKHZpZGVvSWZyYW1lKTtcbiAgICAgICAgcGxheWVyLnNldExvb3AodGhpcy5zZXR0aW5ncy5lbmFibGVfdmlkZW9fbG9vcGluZyk7XG5cbiAgICAgICAgdmlkZW8gPSB7XG4gICAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgICBmaWd1cmU6IHZpZGVvRmlndXJlLFxuICAgICAgICAgIHBsYXllcixcbiAgICAgICAgICBmb2N1czogKCkgPT4gdmlkZW9JZnJhbWUuZm9jdXMoKSxcbiAgICAgICAgICByZXN0YXJ0OiAoKSA9PiB7XG4gICAgICAgICAgICBwbGF5ZXIuc2V0Q3VycmVudFRpbWUoMCk7XG4gICAgICAgICAgICBwbGF5ZXIucGxheSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcGF1c2U6ICgpID0+IHBsYXllci5wYXVzZSgpLFxuICAgICAgICAgIHBsYXk6ICgpID0+IHBsYXllci5wbGF5KCksXG4gICAgICAgICAgdW5sb2FkOiAoKSA9PiBwbGF5ZXIudW5sb2FkKCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aGlzLm1lZGlhLnB1c2godmlkZW8pO1xuXG4gICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLmZsaWNraXR5LnJlc2l6ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCAmJiB0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dC5sYXlvdXQoKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0ICYmICF0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSB7XG4gICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0LmxheW91dCgpO1xuICAgIH1cblxuICAgIHRoaXMuZXh0ZXJuYWxWaWRlb0xvYWRlZCA9IHRydWU7XG4gIH1cblxuICBfb25NZWRpYVNlbGVjdChtZWRpYSkge1xuICAgIGlmICghbWVkaWEpIHJldHVybjtcblxuICAgIHN3aXRjaCAobWVkaWEudHlwZSkge1xuICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICBtZWRpYS5mb2N1cygpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5lbmFibGVfdmlkZW9fYXV0b3BsYXlcbiAgICAgICAgICAmJiAhdGhlbWVVdGlscy5pc1NtYWxsKClcbiAgICAgICAgICAmJiB0aGlzLmxheW91dCAhPT0gJ2xpc3QnXG4gICAgICAgICAgJiYgdGhpcy5sYXlvdXQgIT09ICdtYXNvbnJ5J1xuICAgICAgICApIHtcbiAgICAgICAgICBtZWRpYS5wbGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJykuY2xhc3NMaXN0LmNvbnRhaW5zKCduby10b3VjaCcpKSB7XG4gICAgICAgICAgbWVkaWEucGxheSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgX3BhdXNlTWVkaWEoZXhjbHVkZU1lZGlhID0gbnVsbCkge1xuICAgIHRoaXMubWVkaWEuZm9yRWFjaChtID0+IHtcbiAgICAgIGlmIChtICE9PSBleGNsdWRlTWVkaWEpIHtcbiAgICAgICAgbS5wYXVzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3NlbGVjdE1lZGlhQnlJbmRleChpbmRleCkge1xuICAgIGlmICh0aGlzLmxheW91dCAhPT0gJ3NsaWRlc2hvdycpIHJldHVybjtcblxuICAgIGNvbnN0IGZpZ3VyZSA9IHRoaXMuZmlndXJlc1tpbmRleF07XG5cbiAgICB0aGlzLnNlbGVjdGVkLmZpZ3VyZS5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5U2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkLmZpZ3VyZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZC5maWd1cmUgPSBmaWd1cmU7XG4gICAgdGhpcy5zZWxlY3RlZC5maWd1cmUuZGF0YXNldC5wcm9kdWN0R2FsbGVyeVNlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkLmZpZ3VyZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgZmFsc2UpO1xuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvbikge1xuICAgICAgY29uc3QgdGh1bWJuYWlsID0gdGhpcy50aHVtYm5haWxzW2luZGV4XTtcblxuICAgICAgdGhpcy5zZWxlY3RlZC50aHVtYm5haWwuZGF0YXNldC5wcm9kdWN0R2FsbGVyeVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkLnRodW1ibmFpbCA9IHRodW1ibmFpbDtcbiAgICAgIHRoaXMuc2VsZWN0ZWQudGh1bWJuYWlsLmRhdGFzZXQucHJvZHVjdEdhbGxlcnlTZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5fcGF1c2VNZWRpYSgpO1xuICAgIHRoaXMuX29uTWVkaWFTZWxlY3QodGhpcy5tZWRpYS5maWx0ZXIobSA9PiBtLmZpZ3VyZSA9PT0gdGhpcy5zZWxlY3RlZC5maWd1cmUpWzBdKTtcbiAgICBpZiAodGhpcy56b29tVmlldyAmJiBmaWd1cmUuZGF0YXNldC5tZWRpYVR5cGUgPT09ICdpbWFnZScpIHtcbiAgICAgIHRoaXMuem9vbVZpZXcucHJlcGFyZVpvb20odHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgX2luaXRQcm9kdWN0TWFzb25yeShlKSB7XG4gICAgaWYgKGUgJiYgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGUgJiYgIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0LmxheW91dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGVtZVV0aWxzLmlzU21hbGwoKSkge1xuICAgICAgaWYgKHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQpIHtcbiAgICAgICAgdGhpcy51bmxvYWQoKTtcbiAgICAgICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckV2ZW50cygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZmxpY2tpdHkpIHtcbiAgICAgICAgdGhpcy5faW5pdFByb2R1Y3RGbGlja2l0eSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnJyk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRXZlbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5wcm9kdWN0TWFzb25yeUxheW91dCkge1xuICAgICAgICBpZiAodGhpcy5maWd1cmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0ID0gbmV3IE1hc29ucnlHcmlkKHtcbiAgICAgICAgICAgIGVsOiB0aGlzLmVsLFxuICAgICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgaXRlbVNlbGVjdG9yOiAnLnByb2R1Y3QtZ2FsbGVyeS0tdmlld3BvcnQtLWZpZ3VyZScsXG4gICAgICAgICAgICAgIGNvbHVtbldpZHRoOiAnW2RhdGEtbWFzb25yeS1pbWFnZS1zaXplcl0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWRMaWJyYXJpZXNBbmRJbml0TWVkaWEoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQgJiYgdGhpcy5zZXR0aW5ncy5pc1F1aWNrc2hvcCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0LmxheW91dCgpO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2R1Y3RNYXNvbnJ5TGF5b3V0ICYmICF0aGlzLnNldHRpbmdzLmlzUXVpY2tzaG9wKSB7XG4gICAgICAgIHRoaXMucHJvZHVjdE1hc29ucnlMYXlvdXQubGF5b3V0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3NlbGVjdEZsaWNraXR5U2xpZGUoZWwpIHtcbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCdkYXRhLW1vYmlsZS1zbGlkZXItYnV0dG9uJykpIHtcbiAgICAgIGlmIChlbC5kYXRhc2V0Lm1vYmlsZVNsaWRlckJ1dHRvbiA9PT0gJ25leHQnKSB7XG4gICAgICAgIHRoaXMuZmxpY2tpdHkubmV4dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mbGlja2l0eS5wcmV2aW91cygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtbW9iaWxlLXNsaWRlci1kb3QnKSkge1xuICAgICAgdGhpcy5mbGlja2l0eS5zZWxlY3QocGFyc2VJbnQoZWwuZGF0YXNldC5zbGlkZURvdEluZGV4LCAxMCkpO1xuICAgIH1cblxuICAgIHRoaXMuX3BhdXNlTWVkaWEoKTtcbiAgICB0aGlzLl9vbk1lZGlhU2VsZWN0KHRoaXMubWVkaWEuZmlsdGVyKG0gPT4gbS5maWd1cmUgPT09IHRoaXMuZmxpY2tpdHkuc2VsZWN0ZWRFbGVtZW50KVswXSk7XG4gIH1cblxuICBfc2VsZWN0RmxpY2tpdHlOYXYoKSB7XG4gICAgdGhpcy5wYWdlRG90cy5mb3JFYWNoKGRvdEVsID0+IHtcbiAgICAgIGlmIChwYXJzZUludChkb3RFbC5kYXRhc2V0LnNsaWRlRG90SW5kZXgsIDEwKSA9PT0gdGhpcy5mbGlja2l0eS5zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgIGRvdEVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb3RFbC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5mbGlja2l0eU5hdkJ1dHRvbnMuZm9yRWFjaChuYXZFbCA9PiB7XG4gICAgICBpZiAobmF2RWwuZGF0YXNldC5tb2JpbGVTbGlkZXJCdXR0b24gPT09ICdwcmV2JyAmJiB0aGlzLmZsaWNraXR5LnNlbGVjdGVkSW5kZXggPT09IDApIHtcbiAgICAgICAgbmF2RWwuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuYXZFbC5kYXRhc2V0Lm1vYmlsZVNsaWRlckJ1dHRvbiA9PT0gJ25leHQnICYmIHRoaXMuZmxpY2tpdHkuc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy5mbGlja2l0eS5zbGlkZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBuYXZFbC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYXZFbC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2luaXRQcm9kdWN0RmxpY2tpdHkoKSB7XG4gICAgaWYgKHRoaXMuZmlndXJlcy5sZW5ndGggPD0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KFxuICAgICAgICB0aGlzLmVsLFxuICAgICAgICB7XG4gICAgICAgICAgY2VsbEFsaWduOiAnbGVmdCcsXG4gICAgICAgICAgY2VsbFNlbGVjdG9yOiAnLnByb2R1Y3QtZ2FsbGVyeS0tdmlld3BvcnQtLWZpZ3VyZScsXG4gICAgICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgICAgICBwZXJjZW50UG9zaXRpb246IGZhbHNlLFxuICAgICAgICAgIHByZXZOZXh0QnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICBhZGFwdGl2ZUhlaWdodDogdHJ1ZSxcbiAgICAgICAgICBzZXRHYWxsZXJ5U2l6ZTogdHJ1ZSxcbiAgICAgICAgICBwYWdlRG90czogdHJ1ZSxcbiAgICAgICAgICBsYXp5TG9hZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICB0aGlzLnBhZ2VEb3RzID0gdGhpcy5wcm9kdWN0Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1vYmlsZS1zbGlkZXItZG90XScpO1xuICAgICAgdGhpcy5mbGlja2l0eU5hdkJ1dHRvbnMgPSB0aGlzLnByb2R1Y3RDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbW9iaWxlLXNsaWRlci1idXR0b25dJyk7XG5cbiAgICAgIHRoaXMuZmxpY2tpdHkub24oJ3NlbGVjdCcsICgpID0+IHRoaXMuX3NlbGVjdEZsaWNraXR5TmF2KCkpO1xuXG4gICAgICB0aGlzLmZsaWNraXR5TmF2QnV0dG9ucy5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgdGhpcy5mbGlja2l0eUV2ZW50cy5wdXNoKHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGVsLCAnY2xpY2snLCAoKSA9PiB0aGlzLl9zZWxlY3RGbGlja2l0eVNsaWRlKGVsKSkpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucGFnZURvdHMuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIHRoaXMuZmxpY2tpdHlFdmVudHMucHVzaCh0aGlzLmV2ZW50cy5yZWdpc3RlcihlbCwgJ2NsaWNrJywgKCkgPT4gdGhpcy5fc2VsZWN0RmxpY2tpdHlTbGlkZShlbCkpKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmZsaWNraXR5RXZlbnRzLnB1c2godGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5lbCwgJ3JpbWc6bG9hZCcsICgpID0+IHRoaXMuZmxpY2tpdHkucmVzaXplKCkpKTtcblxuICAgICAgLy8gRmxpY2tpdHkgY29udHJvbHMgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHdoaWNoIHByZXZlbnRzIG1vZGVsLXZpZXdlci11aSBmcm9tXG4gICAgICAvLyB0cmlnZ2VyaW5nIC5wbGF5KCkgb24gbW91c2V1cC4gVGhpcyByZXR1cm5zIHRoaXMgZnVuY3Rpb25hbGl0eS5cbiAgICAgIHRoaXMuZmxpY2tpdHkub24oJ3N0YXRpY0NsaWNrJywgKGV2ZW50LCBwb2ludGVyLCBjZWxsRWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBmaWd1cmUgPSBjZWxsRWxlbWVudDtcblxuICAgICAgICBpZiAoZmlndXJlICYmIHRoaXMubW9kZWxzW2ZpZ3VyZS5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5RmlndXJlXSkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHNbZmlndXJlLmRhdGFzZXQucHJvZHVjdEdhbGxlcnlGaWd1cmVdO1xuICAgICAgICAgIG1vZGVsLnBsYXkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRMaWJyYXJpZXNBbmRJbml0TWVkaWEoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUVBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBREE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBY0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFmQTtBQW1CQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQWFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQWxCQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBRkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQWFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBOWlCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductGallery.js\n");

/***/ }),

/***/ "./source/scripts/components/ProductHighVariant.js":
/*!*********************************************************!*\
  !*** ./source/scripts/components/ProductHighVariant.js ***!
  \*********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ProductHighVariant)\n/* harmony export */ });\n/* harmony import */ var morphdom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! morphdom */ \"./node_modules/morphdom/dist/morphdom-esm.js\");\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n\n\n\nclass ProductHighVariant {\n  constructor(el) {\n    this.el = el; // Prevent cart redirection\n\n    document.addEventListener('product-form:cart:navigate', event => {\n      event.preventDefault();\n    }); // Handle successful cart addition\n\n    document.addEventListener('product-form:submit:success', () => {\n      this.updateMiniCart();\n    });\n  }\n\n  updateMiniCart() {\n    document.querySelector('.mini-cart').classList.remove('empty');\n    const miniCartItemWrapper = document.querySelector('.mini-cart-item-wrapper');\n    const cartCount = document.querySelectorAll('.cart-count-number');\n    _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__.default.load(window.Theme.routes.cart_url, {\n      view: 'mini-ajax'\n    }).then(({\n      data,\n      html\n    }) => {\n      const updatedMiniCart = document.createElement('div');\n      updatedMiniCart.innerHTML = html.miniCart;\n      cartCount.forEach(el => {\n        el.innerText = data.itemCount;\n      });\n      (0,morphdom__WEBPACK_IMPORTED_MODULE_0__.default)(miniCartItemWrapper, updatedMiniCart.querySelector('.mini-cart-item-wrapper'), {\n        onBeforeElUpdated: (fromEl, toEl) => {\n          if (fromEl.tagName === 'IMG' && fromEl.src === toEl.src) {\n            return false;\n          }\n\n          return true;\n        }\n      });\n    });\n    _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.watch(miniCartItemWrapper);\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RIaWdoVmFyaWFudC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RIaWdoVmFyaWFudC5qcz8xMmMzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb3JwaGRvbSBmcm9tICdtb3JwaGRvbSc7XG5pbXBvcnQgQXN5bmNWaWV3IGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3JztcbmltcG9ydCByaW1nIGZyb20gJ0BwaXhlbHVuaW9uL3JpbWctc2hvcGlmeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RIaWdoVmFyaWFudCB7XG4gIGNvbnN0cnVjdG9yKGVsKSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuXG4gICAgLy8gUHJldmVudCBjYXJ0IHJlZGlyZWN0aW9uXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZHVjdC1mb3JtOmNhcnQ6bmF2aWdhdGUnLCBldmVudCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIHN1Y2Nlc3NmdWwgY2FydCBhZGRpdGlvblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2R1Y3QtZm9ybTpzdWJtaXQ6c3VjY2VzcycsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTWluaUNhcnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZU1pbmlDYXJ0KCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5taW5pLWNhcnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdlbXB0eScpO1xuICAgIGNvbnN0IG1pbmlDYXJ0SXRlbVdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWluaS1jYXJ0LWl0ZW0td3JhcHBlcicpO1xuICAgIGNvbnN0IGNhcnRDb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJ0LWNvdW50LW51bWJlcicpO1xuXG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfdXJsLFxuICAgICAgeyB2aWV3OiAnbWluaS1hamF4JyB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IGRhdGEsIGh0bWwgfSkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkTWluaUNhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdXBkYXRlZE1pbmlDYXJ0LmlubmVySFRNTCA9IGh0bWwubWluaUNhcnQ7XG4gICAgICAgIGNhcnRDb3VudC5mb3JFYWNoKGVsID0+IHsgZWwuaW5uZXJUZXh0ID0gZGF0YS5pdGVtQ291bnQ7IH0pO1xuXG4gICAgICAgIG1vcnBoZG9tKFxuICAgICAgICAgIG1pbmlDYXJ0SXRlbVdyYXBwZXIsXG4gICAgICAgICAgdXBkYXRlZE1pbmlDYXJ0LnF1ZXJ5U2VsZWN0b3IoJy5taW5pLWNhcnQtaXRlbS13cmFwcGVyJyksXG4gICAgICAgICAge1xuICAgICAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGZyb21FbC50YWdOYW1lID09PSAnSU1HJyAmJiBmcm9tRWwuc3JjID09PSB0b0VsLnNyYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgcmltZy53YXRjaChtaW5pQ2FydEl0ZW1XcmFwcGVyKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBTkE7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQTdDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductHighVariant.js\n");

/***/ }),

/***/ "./source/scripts/components/ProductListItem.js":
/*!******************************************************!*\
  !*** ./source/scripts/components/ProductListItem.js ***!
  \******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ProductListItem)\n/* harmony export */ });\n/* harmony import */ var _Quickshop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Quickshop */ \"./source/scripts/components/Quickshop.js\");\n\nclass ProductListItem {\n  constructor({\n    el\n  }) {\n    this.el = el;\n    this.el.querySelector('.product-list-item-thumbnail').addEventListener('click', event => this.redirectToProduct(event));\n    this.productHover = this.el.closest('[data-product-hover]').dataset.productHover;\n    this.quickshopTrigger = this.el.querySelector('.quick-shop-modal-trigger');\n\n    if (this.productHover === 'quick-shop' && this.quickshopTrigger !== null) {\n      this.quickshop = new _Quickshop__WEBPACK_IMPORTED_MODULE_0__.default();\n      this.quickshopTrigger.addEventListener('click', event => this.openQuickShop(event));\n      this.quickshopTrigger.addEventListener('mouseover', event => this.preloadQuickshop(event));\n    }\n  }\n\n  remove() {\n    if (this.quickshop) {\n      this.quickshop.unload();\n      this.quickshopTrigger.removeEventListener('click', event => this.openQuickShop(event));\n      this.quickshopTrigger.removeEventListener('mouseover', event => this.preloadQuickshop(event));\n    }\n\n    this.el.querySelector('.product-list-item-thumbnail').removeEventListener('click', event => this.redirectToProduct(event));\n  }\n\n  redirectToProduct({\n    target\n  }) {\n    const url = !target.classList.contains('quick-shop-modal-trigger') ? target.dataset.url : null;\n\n    if (url) {\n      window.location = url;\n    }\n  }\n\n  openQuickShop(e) {\n    const productUrl = e.currentTarget.getAttribute('data-product-url');\n    return this.quickshop.open(productUrl);\n  }\n\n  preloadQuickshop(e) {\n    const productUrl = e.currentTarget.getAttribute('data-product-url');\n    return this.quickshop.load(productUrl);\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RMaXN0SXRlbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RMaXN0SXRlbS5qcz9kNjZjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBRdWlja3Nob3AgZnJvbSAnLi9RdWlja3Nob3AnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0TGlzdEl0ZW0ge1xuICBjb25zdHJ1Y3Rvcih7IGVsIH0pIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5lbFxuICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0LWxpc3QtaXRlbS10aHVtYm5haWwnKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gdGhpcy5yZWRpcmVjdFRvUHJvZHVjdChldmVudCkpO1xuICAgIHRoaXMucHJvZHVjdEhvdmVyID0gdGhpcy5lbC5jbG9zZXN0KCdbZGF0YS1wcm9kdWN0LWhvdmVyXScpLmRhdGFzZXQucHJvZHVjdEhvdmVyO1xuICAgIHRoaXMucXVpY2tzaG9wVHJpZ2dlciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnF1aWNrLXNob3AtbW9kYWwtdHJpZ2dlcicpO1xuXG4gICAgaWYgKHRoaXMucHJvZHVjdEhvdmVyID09PSAncXVpY2stc2hvcCcgJiYgdGhpcy5xdWlja3Nob3BUcmlnZ2VyICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnF1aWNrc2hvcCA9IG5ldyBRdWlja3Nob3AoKTtcbiAgICAgIHRoaXMucXVpY2tzaG9wVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMub3BlblF1aWNrU2hvcChldmVudCkpO1xuICAgICAgdGhpcy5xdWlja3Nob3BUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGV2ZW50ID0+IHRoaXMucHJlbG9hZFF1aWNrc2hvcChldmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy5xdWlja3Nob3ApIHtcbiAgICAgIHRoaXMucXVpY2tzaG9wLnVubG9hZCgpO1xuICAgICAgdGhpcy5xdWlja3Nob3BUcmlnZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gdGhpcy5vcGVuUXVpY2tTaG9wKGV2ZW50KSk7XG4gICAgICB0aGlzLnF1aWNrc2hvcFRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZXZlbnQgPT4gdGhpcy5wcmVsb2FkUXVpY2tzaG9wKGV2ZW50KSk7XG4gICAgfVxuICAgIHRoaXMuZWxcbiAgICAgIC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1saXN0LWl0ZW0tdGh1bWJuYWlsJylcbiAgICAgIC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMucmVkaXJlY3RUb1Byb2R1Y3QoZXZlbnQpKTtcbiAgfVxuXG4gIHJlZGlyZWN0VG9Qcm9kdWN0KHsgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCB1cmwgPSAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygncXVpY2stc2hvcC1tb2RhbC10cmlnZ2VyJykgPyB0YXJnZXQuZGF0YXNldC51cmwgOiBudWxsO1xuXG4gICAgaWYgKHVybCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uID0gdXJsO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5RdWlja1Nob3AoZSkge1xuICAgIGNvbnN0IHByb2R1Y3RVcmwgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXByb2R1Y3QtdXJsJyk7XG4gICAgcmV0dXJuIHRoaXMucXVpY2tzaG9wLm9wZW4ocHJvZHVjdFVybCk7XG4gIH1cblxuICBwcmVsb2FkUXVpY2tzaG9wKGUpIHtcbiAgICBjb25zdCBwcm9kdWN0VXJsID0gZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1wcm9kdWN0LXVybCcpO1xuICAgIHJldHVybiB0aGlzLnF1aWNrc2hvcC5sb2FkKHByb2R1Y3RVcmwpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTVDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductListItem.js\n");

/***/ }),

/***/ "./source/scripts/components/ProductMasonry.js":
/*!*****************************************************!*\
  !*** ./source/scripts/components/ProductMasonry.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ProductMasonry)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _MasonryGrid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n\n\n\n\nclass ProductMasonry {\n  constructor({\n    el\n  }) {\n    this.el = el;\n    this.selectors = {\n      gallery: {\n        el: '[data-masonry-gallery]',\n        itemSelector: '.product-gallery--viewport--figure',\n        columnWidth: '[data-masonry-image-sizer]'\n      },\n      relatedProducts: {\n        el: '[data-masonry-products]',\n        itemSelector: '.product-list-item',\n        columnWidth: '[data-masonry-products-sizer]'\n      }\n    };\n    this.masonry = {\n      gallery: null,\n      relatedProducts: null\n    };\n    this.flickity = {\n      gallery: null,\n      relatedProducts: null\n    };\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__.default();\n    this.gallery = this.el.querySelector(this.selectors.gallery.el);\n    this.relatedProducts = this.el.querySelector(this.selectors.relatedProducts.el);\n    this.hasGallery = !!this.gallery;\n    this.hasRelatedProducts = !!this.relatedProducts;\n    this._initLayout = this._initLayout.bind(this);\n\n    this._bindEvents();\n\n    this._initLayout();\n  }\n\n  remove() {\n    this.events.unregisterAll();\n\n    if (this.flickity) {\n      this._destroyFlickity();\n    }\n\n    if (this.masonry) {\n      this._destroyMasonry();\n    }\n  }\n\n  onSectionUnload() {\n    this.remove();\n  }\n\n  _bindEvents() {\n    this.onRimgLoadEvent = () => {\n      if (this.flickity.gallery) {\n        _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.flickityResize(this.flickity.gallery);\n      }\n\n      if (this.flickity.relatedProducts) {\n        _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.flickityResize(this.flickity.relatedProducts);\n      }\n    };\n\n    this.resizeDebouncedEvent = _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.debounce(this._initLayout, 100);\n    this.events.register(window, 'resize', this.resizeDebouncedEvent);\n    this.events.register(this.el, 'rimg:load', this.onRimgLoadEvent);\n  }\n\n  _initLayout() {\n    if (_themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.isSmall()) {\n      this._initMobile();\n    } else {\n      this._initDesktop();\n    }\n  }\n\n  _initMobile() {\n    this._destroyMasonry();\n\n    this._initFlickity();\n  }\n\n  _initDesktop() {\n    this._destroyFlickity();\n\n    this._initMasonry();\n  }\n\n  _initFlickity() {\n    if (this.hasGallery && !this.flickity.gallery) {\n      this._galleryReset();\n\n      this.flickity.gallery = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.gallery, {\n        cellAlign: 'left',\n        cellSelector: this.selectors.gallery.itemSelector,\n        contain: false,\n        percentPosition: false,\n        prevNextButtons: true,\n        adaptiveHeight: true,\n        pageDots: true,\n        setGallerySize: false,\n        lazyLoad: false\n      });\n\n      this._flickityEvents({\n        el: this.gallery,\n        flickity: this.flickity.gallery\n      });\n    }\n\n    if (this.hasRelatedProducts && !this.flickity.relatedProducts) {\n      this._relatedProductsReset();\n\n      this.flickity.relatedProducts = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.relatedProducts, {\n        cellAlign: 'left',\n        cellSelector: this.selectors.relatedProducts.itemSelector,\n        contain: true,\n        prevNextButtons: false,\n        pageDots: false,\n        setGallerySize: false\n      });\n\n      this._flickityEvents({\n        el: this.relatedProducts,\n        flickity: this.flickity.relatedProducts\n      });\n    }\n  }\n\n  _destroyFlickity() {\n    if (this.flickity.gallery) {\n      this.flickity.gallery.destroy();\n      this.flickity.gallery = null;\n      this.events.unregister(this.onResize);\n    }\n\n    if (this.flickity.relatedProducts) {\n      this.flickity.relatedProducts.destroy();\n      this.flickity.relatedProducts = null;\n    }\n  }\n\n  _initMasonry() {\n    if (this.hasGallery && !this.masonry.gallery) {\n      this._galleryReset();\n\n      this.masonry.gallery = new _MasonryGrid__WEBPACK_IMPORTED_MODULE_3__.default({\n        el: this.gallery,\n        settings: {\n          itemSelector: this.selectors.gallery.itemSelector,\n          columnWidth: this.selectors.gallery.columnWidth\n        }\n      });\n    }\n\n    if (this.hasRelatedProducts && !this.masonry.relatedProducts) {\n      this._relatedProductsReset();\n\n      this.masonry.relatedProducts = new _MasonryGrid__WEBPACK_IMPORTED_MODULE_3__.default({\n        el: this.relatedProducts,\n        settings: {\n          itemSelector: this.selectors.relatedProducts.itemSelector,\n          columnWidth: this.selectors.relatedProducts.columnWidth\n        }\n      });\n    }\n  }\n\n  _destroyMasonry() {\n    if (this.masonry.gallery) {\n      this.masonry.gallery.unload();\n      this.masonry.gallery = null;\n    }\n\n    if (this.masonry.relatedProducts) {\n      this.masonry.relatedProducts.unload();\n      this.masonry.relatedProducts = null;\n    }\n  }\n\n  _galleryReset() {\n    this.gallery.querySelectorAll(this.selectors.gallery.itemSelector).forEach(item => item.setAttribute('style', ''));\n  }\n\n  _relatedProductsReset() {\n    this.relatedProducts.querySelectorAll(this.selectors.relatedProducts.itemSelector).forEach(item => item.setAttribute('style', ''));\n  }\n\n  _flickityEvents({\n    el,\n    flickity\n  }) {\n    const event = document.createEvent('Event');\n    event.initEvent('product-masonry-layout', true, true);\n\n    this.flickityResizeEvent = () => _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.flickityResize(flickity);\n\n    this.flickityDebouncedEvent = _themeUtils__WEBPACK_IMPORTED_MODULE_2__.default.debounce(() => el.dispatchEvent(event), 10);\n    flickity.on('cellSelect', () => el.dispatchEvent(event));\n    flickity.on('settle', () => el.dispatchEvent(event));\n    this.events.register(el, 'product-masonry-layout', this.flickityResizeEvent); // Sets the Slider to the height of the first slide\n\n    el.dispatchEvent(event);\n    this.onResize = this.events.register(window, 'resize', this.flickityDebouncedEvent);\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RNYXNvbnJ5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvUHJvZHVjdE1hc29ucnkuanM/MTg5OCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICdAcGl4ZWx1bmlvbi9ldmVudHMnO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5pbXBvcnQgTWFzb25yeUdyaWQgZnJvbSAnLi9NYXNvbnJ5R3JpZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RNYXNvbnJ5IHtcbiAgY29uc3RydWN0b3IoeyBlbCB9KSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuc2VsZWN0b3JzID0ge1xuICAgICAgZ2FsbGVyeToge1xuICAgICAgICBlbDogJ1tkYXRhLW1hc29ucnktZ2FsbGVyeV0nLFxuICAgICAgICBpdGVtU2VsZWN0b3I6ICcucHJvZHVjdC1nYWxsZXJ5LS12aWV3cG9ydC0tZmlndXJlJyxcbiAgICAgICAgY29sdW1uV2lkdGg6ICdbZGF0YS1tYXNvbnJ5LWltYWdlLXNpemVyXScsXG4gICAgICB9LFxuICAgICAgcmVsYXRlZFByb2R1Y3RzOiB7XG4gICAgICAgIGVsOiAnW2RhdGEtbWFzb25yeS1wcm9kdWN0c10nLFxuICAgICAgICBpdGVtU2VsZWN0b3I6ICcucHJvZHVjdC1saXN0LWl0ZW0nLFxuICAgICAgICBjb2x1bW5XaWR0aDogJ1tkYXRhLW1hc29ucnktcHJvZHVjdHMtc2l6ZXJdJyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMubWFzb25yeSA9IHtcbiAgICAgIGdhbGxlcnk6IG51bGwsXG4gICAgICByZWxhdGVkUHJvZHVjdHM6IG51bGwsXG4gICAgfTtcblxuICAgIHRoaXMuZmxpY2tpdHkgPSB7XG4gICAgICBnYWxsZXJ5OiBudWxsLFxuICAgICAgcmVsYXRlZFByb2R1Y3RzOiBudWxsLFxuICAgIH07XG5cbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcblxuICAgIHRoaXMuZ2FsbGVyeSA9IHRoaXMuZWwucXVlcnlTZWxlY3Rvcih0aGlzLnNlbGVjdG9ycy5nYWxsZXJ5LmVsKTtcbiAgICB0aGlzLnJlbGF0ZWRQcm9kdWN0cyA9IHRoaXMuZWwucXVlcnlTZWxlY3Rvcih0aGlzLnNlbGVjdG9ycy5yZWxhdGVkUHJvZHVjdHMuZWwpO1xuXG4gICAgdGhpcy5oYXNHYWxsZXJ5ID0gISF0aGlzLmdhbGxlcnk7XG4gICAgdGhpcy5oYXNSZWxhdGVkUHJvZHVjdHMgPSAhIXRoaXMucmVsYXRlZFByb2R1Y3RzO1xuXG4gICAgdGhpcy5faW5pdExheW91dCA9IHRoaXMuX2luaXRMYXlvdXQuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgICB0aGlzLl9pbml0TGF5b3V0KCk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5ldmVudHMudW5yZWdpc3RlckFsbCgpO1xuXG4gICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1hc29ucnkpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lNYXNvbnJ5KCk7XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gIH1cblxuICBfYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLm9uUmltZ0xvYWRFdmVudCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmZsaWNraXR5LmdhbGxlcnkpIHtcbiAgICAgICAgdGhlbWVVdGlscy5mbGlja2l0eVJlc2l6ZSh0aGlzLmZsaWNraXR5LmdhbGxlcnkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5mbGlja2l0eS5yZWxhdGVkUHJvZHVjdHMpIHtcbiAgICAgICAgdGhlbWVVdGlscy5mbGlja2l0eVJlc2l6ZSh0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnJlc2l6ZURlYm91bmNlZEV2ZW50ID0gdGhlbWVVdGlscy5kZWJvdW5jZSh0aGlzLl9pbml0TGF5b3V0LCAxMDApO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMucmVzaXplRGVib3VuY2VkRXZlbnQpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMuZWwsICdyaW1nOmxvYWQnLCB0aGlzLm9uUmltZ0xvYWRFdmVudCk7XG4gIH1cblxuICBfaW5pdExheW91dCgpIHtcbiAgICBpZiAodGhlbWVVdGlscy5pc1NtYWxsKCkpIHtcbiAgICAgIHRoaXMuX2luaXRNb2JpbGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW5pdERlc2t0b3AoKTtcbiAgICB9XG4gIH1cblxuICBfaW5pdE1vYmlsZSgpIHtcbiAgICB0aGlzLl9kZXN0cm95TWFzb25yeSgpO1xuICAgIHRoaXMuX2luaXRGbGlja2l0eSgpO1xuICB9XG5cbiAgX2luaXREZXNrdG9wKCkge1xuICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICAgIHRoaXMuX2luaXRNYXNvbnJ5KCk7XG4gIH1cblxuICBfaW5pdEZsaWNraXR5KCkge1xuICAgIGlmICh0aGlzLmhhc0dhbGxlcnkgJiYgIXRoaXMuZmxpY2tpdHkuZ2FsbGVyeSkge1xuICAgICAgdGhpcy5fZ2FsbGVyeVJlc2V0KCk7XG5cbiAgICAgIHRoaXMuZmxpY2tpdHkuZ2FsbGVyeSA9IG5ldyBGbGlja2l0eSh0aGlzLmdhbGxlcnksIHtcbiAgICAgICAgY2VsbEFsaWduOiAnbGVmdCcsXG4gICAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMuZ2FsbGVyeS5pdGVtU2VsZWN0b3IsXG4gICAgICAgIGNvbnRhaW46IGZhbHNlLFxuICAgICAgICBwZXJjZW50UG9zaXRpb246IGZhbHNlLFxuICAgICAgICBwcmV2TmV4dEJ1dHRvbnM6IHRydWUsXG4gICAgICAgIGFkYXB0aXZlSGVpZ2h0OiB0cnVlLFxuICAgICAgICBwYWdlRG90czogdHJ1ZSxcbiAgICAgICAgc2V0R2FsbGVyeVNpemU6IGZhbHNlLFxuICAgICAgICBsYXp5TG9hZDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZmxpY2tpdHlFdmVudHMoe1xuICAgICAgICBlbDogdGhpcy5nYWxsZXJ5LFxuICAgICAgICBmbGlja2l0eTogdGhpcy5mbGlja2l0eS5nYWxsZXJ5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzUmVsYXRlZFByb2R1Y3RzICYmICF0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cykge1xuICAgICAgdGhpcy5fcmVsYXRlZFByb2R1Y3RzUmVzZXQoKTtcblxuICAgICAgdGhpcy5mbGlja2l0eS5yZWxhdGVkUHJvZHVjdHMgPSBuZXcgRmxpY2tpdHkodGhpcy5yZWxhdGVkUHJvZHVjdHMsIHtcbiAgICAgICAgY2VsbEFsaWduOiAnbGVmdCcsXG4gICAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMucmVsYXRlZFByb2R1Y3RzLml0ZW1TZWxlY3RvcixcbiAgICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgICAgcHJldk5leHRCdXR0b25zOiBmYWxzZSxcbiAgICAgICAgcGFnZURvdHM6IGZhbHNlLFxuICAgICAgICBzZXRHYWxsZXJ5U2l6ZTogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZmxpY2tpdHlFdmVudHMoe1xuICAgICAgICBlbDogdGhpcy5yZWxhdGVkUHJvZHVjdHMsXG4gICAgICAgIGZsaWNraXR5OiB0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95RmxpY2tpdHkoKSB7XG4gICAgaWYgKHRoaXMuZmxpY2tpdHkuZ2FsbGVyeSkge1xuICAgICAgdGhpcy5mbGlja2l0eS5nYWxsZXJ5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkuZ2FsbGVyeSA9IG51bGw7XG5cbiAgICAgIHRoaXMuZXZlbnRzLnVucmVnaXN0ZXIodGhpcy5vblJlc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmxpY2tpdHkucmVsYXRlZFByb2R1Y3RzKSB7XG4gICAgICB0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmZsaWNraXR5LnJlbGF0ZWRQcm9kdWN0cyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2luaXRNYXNvbnJ5KCkge1xuICAgIGlmICh0aGlzLmhhc0dhbGxlcnkgJiYgIXRoaXMubWFzb25yeS5nYWxsZXJ5KSB7XG4gICAgICB0aGlzLl9nYWxsZXJ5UmVzZXQoKTtcbiAgICAgIHRoaXMubWFzb25yeS5nYWxsZXJ5ID0gbmV3IE1hc29ucnlHcmlkKHtcbiAgICAgICAgZWw6IHRoaXMuZ2FsbGVyeSxcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICBpdGVtU2VsZWN0b3I6IHRoaXMuc2VsZWN0b3JzLmdhbGxlcnkuaXRlbVNlbGVjdG9yLFxuICAgICAgICAgIGNvbHVtbldpZHRoOiB0aGlzLnNlbGVjdG9ycy5nYWxsZXJ5LmNvbHVtbldpZHRoLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzUmVsYXRlZFByb2R1Y3RzICYmICF0aGlzLm1hc29ucnkucmVsYXRlZFByb2R1Y3RzKSB7XG4gICAgICB0aGlzLl9yZWxhdGVkUHJvZHVjdHNSZXNldCgpO1xuXG4gICAgICB0aGlzLm1hc29ucnkucmVsYXRlZFByb2R1Y3RzID0gbmV3IE1hc29ucnlHcmlkKHtcbiAgICAgICAgZWw6IHRoaXMucmVsYXRlZFByb2R1Y3RzLFxuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIGl0ZW1TZWxlY3RvcjogdGhpcy5zZWxlY3RvcnMucmVsYXRlZFByb2R1Y3RzLml0ZW1TZWxlY3RvcixcbiAgICAgICAgICBjb2x1bW5XaWR0aDogdGhpcy5zZWxlY3RvcnMucmVsYXRlZFByb2R1Y3RzLmNvbHVtbldpZHRoLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX2Rlc3Ryb3lNYXNvbnJ5KCkge1xuICAgIGlmICh0aGlzLm1hc29ucnkuZ2FsbGVyeSkge1xuICAgICAgdGhpcy5tYXNvbnJ5LmdhbGxlcnkudW5sb2FkKCk7XG4gICAgICB0aGlzLm1hc29ucnkuZ2FsbGVyeSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFzb25yeS5yZWxhdGVkUHJvZHVjdHMpIHtcbiAgICAgIHRoaXMubWFzb25yeS5yZWxhdGVkUHJvZHVjdHMudW5sb2FkKCk7XG4gICAgICB0aGlzLm1hc29ucnkucmVsYXRlZFByb2R1Y3RzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBfZ2FsbGVyeVJlc2V0KCkge1xuICAgIHRoaXMuZ2FsbGVyeVxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZWxlY3RvcnMuZ2FsbGVyeS5pdGVtU2VsZWN0b3IpXG4gICAgICAuZm9yRWFjaChpdGVtID0+IGl0ZW0uc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKSk7XG4gIH1cblxuICBfcmVsYXRlZFByb2R1Y3RzUmVzZXQoKSB7XG4gICAgdGhpcy5yZWxhdGVkUHJvZHVjdHNcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuc2VsZWN0b3JzLnJlbGF0ZWRQcm9kdWN0cy5pdGVtU2VsZWN0b3IpXG4gICAgICAuZm9yRWFjaChpdGVtID0+IGl0ZW0uc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKSk7XG4gIH1cblxuICBfZmxpY2tpdHlFdmVudHMoeyBlbCwgZmxpY2tpdHkgfSkge1xuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KCdwcm9kdWN0LW1hc29ucnktbGF5b3V0JywgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICB0aGlzLmZsaWNraXR5UmVzaXplRXZlbnQgPSAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKGZsaWNraXR5KTtcbiAgICB0aGlzLmZsaWNraXR5RGVib3VuY2VkRXZlbnQgPSB0aGVtZVV0aWxzLmRlYm91bmNlKCgpID0+IGVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpLCAxMCk7XG5cbiAgICBmbGlja2l0eS5vbignY2VsbFNlbGVjdCcsICgpID0+IGVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpKTtcblxuICAgIGZsaWNraXR5Lm9uKCdzZXR0bGUnLCAoKSA9PiBlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KSk7XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihlbCwgJ3Byb2R1Y3QtbWFzb25yeS1sYXlvdXQnLCB0aGlzLmZsaWNraXR5UmVzaXplRXZlbnQpO1xuXG4gICAgLy8gU2V0cyB0aGUgU2xpZGVyIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGZpcnN0IHNsaWRlXG4gICAgZWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICB0aGlzLm9uUmVzaXplID0gdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAncmVzaXplJywgdGhpcy5mbGlja2l0eURlYm91bmNlZEV2ZW50KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTkE7QUFhQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUZBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUZBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQW5OQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductMasonry.js\n");

/***/ }),

/***/ "./source/scripts/components/ProductSlideshow.js":
/*!*******************************************************!*\
  !*** ./source/scripts/components/ProductSlideshow.js ***!
  \*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ProductSlideshow)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n\nclass ProductSlideshow {\n  constructor({\n    el\n  }) {\n    this.el = el;\n    this.productGalleryNavigationPrevious = this.el.querySelector('.product-thumbnails-navigation-previous');\n    this.productGalleryNavigationNext = this.el.querySelector('.product-thumbnails-navigation-next');\n    this.productGalleryNavigationWrapper = this.el.querySelector('.product-gallery--navigation-wrapper');\n    this.productGalleryNavigation = this.el.querySelector('.product-gallery--navigation');\n    this.productGalleryMediaThumbnails = this.el.querySelectorAll('.product-gallery--media-thumbnail');\n\n    if (this.productGalleryNavigationPrevious) {\n      this.productGalleryNavigationPrevious.addEventListener('click', event => this.moveProductThumbnails(event));\n    }\n\n    if (this.productGalleryNavigationNext) {\n      this.productGalleryNavigationNext.addEventListener('click', event => this.moveProductThumbnails(event));\n    }\n\n    this.moving = false;\n\n    if (this.productGalleryNavigation) {\n      _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(this.productGalleryNavigation);\n\n      if (this.productGalleryNavigation.classList.contains('has-side-scroll')) {\n        this.setupProductSlideshow();\n        this.productGalleryNavigation.addEventListener('rimg:load', () => {\n          this.setupProductSlideshow();\n        });\n        window.addEventListener('resize', () => {\n          const selectedThumbnail = this.el.querySelector('[data-product-gallery-selected=\"true\"]');\n          this.setupProductSlideshow(true);\n\n          if (selectedThumbnail) {\n            this.selectThumbnail(selectedThumbnail.dataset.media);\n          } else {\n            this.productGalleryNavigation.style.left = 0;\n          }\n        });\n      }\n    }\n  }\n\n  setupProductSlideshow() {\n    let tallestImageHeight = 0;\n    let containerWidth = 0;\n    this.productThumbnailPadding = parseInt(window.getComputedStyle(this.productGalleryMediaThumbnails[0]).paddingLeft, 10) * 2;\n    this.productThumbnailMargin = parseInt(window.getComputedStyle(this.productGalleryMediaThumbnails[0]).marginRight, 10) * 2;\n    this.productGalleryMediaThumbnails.forEach(productGalleryMediaThumbnail => {\n      productGalleryMediaThumbnail.style.width = `${this.productGalleryNavigationWrapper.getBoundingClientRect().width / 4 - this.productThumbnailPadding - this.productThumbnailMargin}px`;\n      const currentImageHeight = productGalleryMediaThumbnail.getBoundingClientRect().height;\n      let currentImageWidth = productGalleryMediaThumbnail.getBoundingClientRect().width + this.productThumbnailMargin;\n\n      if (currentImageHeight > tallestImageHeight) {\n        tallestImageHeight = currentImageHeight;\n      }\n\n      containerWidth += currentImageWidth;\n    });\n    this.productGalleryNavigationWrapper.style.height = `${tallestImageHeight}px`;\n    this.productGalleryNavigation.style.width = `${containerWidth}px`;\n  }\n\n  moveProductThumbnails(e) {\n    const {\n      width: containerWidth\n    } = this.productGalleryNavigationWrapper.getBoundingClientRect();\n    const {\n      offsetLeft: currentPosition,\n      offsetWidth: totalWidth\n    } = this.productGalleryNavigation;\n    const rightEdge = -(totalWidth - containerWidth);\n    const leftEdge = 0;\n    let distance;\n\n    if (e.currentTarget.classList.contains('product-thumbnails-navigation-next') && currentPosition - containerWidth > -this.productGalleryNavigation.getBoundingClientRect().width) {\n      distance = currentPosition - containerWidth > rightEdge ? currentPosition - containerWidth : rightEdge;\n    } else if (e.target.classList.contains('product-thumbnails-navigation-previous') && currentPosition < 0) {\n      distance = currentPosition + containerWidth < leftEdge ? currentPosition + containerWidth : leftEdge;\n    }\n\n    this.productGalleryNavigation.style.left = `${distance}px`;\n  }\n\n  selectThumbnail(mediaId) {\n    if (!this.productGalleryNavigation) return;\n    const thumbnail = this.productGalleryNavigation.querySelector(`[data-media=\"${mediaId}\"]`);\n    const thumbnailIndex = thumbnail.dataset.productGalleryThumbnail;\n    const slides = Math.floor(thumbnailIndex / 4);\n    const containerWidth = this.productGalleryNavigationWrapper.getBoundingClientRect().width;\n    const newPosition = -(containerWidth * slides);\n    this.productGalleryNavigation.style.left = `${newPosition}px`;\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RTbGlkZXNob3cuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9Qcm9kdWN0U2xpZGVzaG93LmpzP2M2OWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJpbWcgZnJvbSAnQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdFNsaWRlc2hvdyB7XG4gIGNvbnN0cnVjdG9yKHsgZWwgfSkge1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvblByZXZpb3VzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC10aHVtYm5haWxzLW5hdmlnYXRpb24tcHJldmlvdXMnKTtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbk5leHQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0LXRodW1ibmFpbHMtbmF2aWdhdGlvbi1uZXh0Jyk7XG4gICAgdGhpcy5wcm9kdWN0R2FsbGVyeU5hdmlnYXRpb25XcmFwcGVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1nYWxsZXJ5LS1uYXZpZ2F0aW9uLXdyYXBwZXInKTtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbiA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtZ2FsbGVyeS0tbmF2aWdhdGlvbicpO1xuICAgIHRoaXMucHJvZHVjdEdhbGxlcnlNZWRpYVRodW1ibmFpbHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0LWdhbGxlcnktLW1lZGlhLXRodW1ibmFpbCcpO1xuXG4gICAgaWYgKHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uUHJldmlvdXMpIHtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uUHJldmlvdXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLm1vdmVQcm9kdWN0VGh1bWJuYWlscyhldmVudCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbk5leHQpIHtcbiAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uTmV4dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMubW92ZVByb2R1Y3RUaHVtYm5haWxzKGV2ZW50KSk7XG4gICAgfVxuXG4gICAgdGhpcy5tb3ZpbmcgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbikge1xuICAgICAgcmltZy53YXRjaCh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbi5jbGFzc0xpc3QuY29udGFpbnMoJ2hhcy1zaWRlLXNjcm9sbCcpKSB7XG4gICAgICAgIHRoaXMuc2V0dXBQcm9kdWN0U2xpZGVzaG93KCk7XG4gICAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsICgpID0+IHsgdGhpcy5zZXR1cFByb2R1Y3RTbGlkZXNob3coKTsgfSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFRodW1ibmFpbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1nYWxsZXJ5LXNlbGVjdGVkPVwidHJ1ZVwiXScpO1xuICAgICAgICAgIHRoaXMuc2V0dXBQcm9kdWN0U2xpZGVzaG93KHRydWUpO1xuICAgICAgICAgIGlmIChzZWxlY3RlZFRodW1ibmFpbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RUaHVtYm5haWwoc2VsZWN0ZWRUaHVtYm5haWwuZGF0YXNldC5tZWRpYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uLnN0eWxlLmxlZnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0dXBQcm9kdWN0U2xpZGVzaG93KCkge1xuICAgIGxldCB0YWxsZXN0SW1hZ2VIZWlnaHQgPSAwO1xuICAgIGxldCBjb250YWluZXJXaWR0aCA9IDA7XG5cbiAgICB0aGlzLnByb2R1Y3RUaHVtYm5haWxQYWRkaW5nID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wcm9kdWN0R2FsbGVyeU1lZGlhVGh1bWJuYWlsc1swXSkucGFkZGluZ0xlZnQsIDEwKSAqIDI7XG4gICAgdGhpcy5wcm9kdWN0VGh1bWJuYWlsTWFyZ2luID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wcm9kdWN0R2FsbGVyeU1lZGlhVGh1bWJuYWlsc1swXSkubWFyZ2luUmlnaHQsIDEwKSAqIDI7XG5cbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TWVkaWFUaHVtYm5haWxzLmZvckVhY2gocHJvZHVjdEdhbGxlcnlNZWRpYVRodW1ibmFpbCA9PiB7XG4gICAgICBwcm9kdWN0R2FsbGVyeU1lZGlhVGh1bWJuYWlsLnN0eWxlLndpZHRoID0gYCR7KCh0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbldyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyA0KSAtIHRoaXMucHJvZHVjdFRodW1ibmFpbFBhZGRpbmcgLSB0aGlzLnByb2R1Y3RUaHVtYm5haWxNYXJnaW4pfXB4YDtcblxuICAgICAgY29uc3QgY3VycmVudEltYWdlSGVpZ2h0ID0gcHJvZHVjdEdhbGxlcnlNZWRpYVRodW1ibmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICBsZXQgY3VycmVudEltYWdlV2lkdGggPSBwcm9kdWN0R2FsbGVyeU1lZGlhVGh1bWJuYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICsgdGhpcy5wcm9kdWN0VGh1bWJuYWlsTWFyZ2luO1xuXG4gICAgICBpZiAoY3VycmVudEltYWdlSGVpZ2h0ID4gdGFsbGVzdEltYWdlSGVpZ2h0KSB7XG4gICAgICAgIHRhbGxlc3RJbWFnZUhlaWdodCA9IGN1cnJlbnRJbWFnZUhlaWdodDtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVyV2lkdGggKz0gY3VycmVudEltYWdlV2lkdGg7XG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbldyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7dGFsbGVzdEltYWdlSGVpZ2h0fXB4YDtcbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbi5zdHlsZS53aWR0aCA9IGAke2NvbnRhaW5lcldpZHRofXB4YDtcbiAgfVxuXG4gIG1vdmVQcm9kdWN0VGh1bWJuYWlscyhlKSB7XG4gICAgY29uc3QgeyB3aWR0aDogY29udGFpbmVyV2lkdGggfSA9IHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uV3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB7IG9mZnNldExlZnQ6IGN1cnJlbnRQb3NpdGlvbiwgb2Zmc2V0V2lkdGg6IHRvdGFsV2lkdGggfSA9IHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uO1xuICAgIGNvbnN0IHJpZ2h0RWRnZSA9IC0odG90YWxXaWR0aCAtIGNvbnRhaW5lcldpZHRoKTtcbiAgICBjb25zdCBsZWZ0RWRnZSA9IDA7XG4gICAgbGV0IGRpc3RhbmNlO1xuXG4gICAgaWYgKGUuY3VycmVudFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3Byb2R1Y3QtdGh1bWJuYWlscy1uYXZpZ2F0aW9uLW5leHQnKSAmJiAoKGN1cnJlbnRQb3NpdGlvbiAtIGNvbnRhaW5lcldpZHRoKSA+IC0odGhpcy5wcm9kdWN0R2FsbGVyeU5hdmlnYXRpb24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKSkge1xuICAgICAgZGlzdGFuY2UgPSBjdXJyZW50UG9zaXRpb24gLSBjb250YWluZXJXaWR0aCA+IHJpZ2h0RWRnZVxuICAgICAgICA/IGN1cnJlbnRQb3NpdGlvbiAtIGNvbnRhaW5lcldpZHRoXG4gICAgICAgIDogcmlnaHRFZGdlO1xuICAgIH0gZWxzZSBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwcm9kdWN0LXRodW1ibmFpbHMtbmF2aWdhdGlvbi1wcmV2aW91cycpICYmIChjdXJyZW50UG9zaXRpb24gPCAwKSkge1xuICAgICAgZGlzdGFuY2UgPSBjdXJyZW50UG9zaXRpb24gKyBjb250YWluZXJXaWR0aCA8IGxlZnRFZGdlXG4gICAgICAgID8gY3VycmVudFBvc2l0aW9uICsgY29udGFpbmVyV2lkdGhcbiAgICAgICAgOiBsZWZ0RWRnZTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbi5zdHlsZS5sZWZ0ID0gYCR7ZGlzdGFuY2V9cHhgO1xuICB9XG5cbiAgc2VsZWN0VGh1bWJuYWlsKG1lZGlhSWQpIHtcbiAgICBpZiAoIXRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCB0aHVtYm5haWwgPSB0aGlzLnByb2R1Y3RHYWxsZXJ5TmF2aWdhdGlvbi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1tZWRpYT1cIiR7bWVkaWFJZH1cIl1gKTtcbiAgICBjb25zdCB0aHVtYm5haWxJbmRleCA9IHRodW1ibmFpbC5kYXRhc2V0LnByb2R1Y3RHYWxsZXJ5VGh1bWJuYWlsO1xuICAgIGNvbnN0IHNsaWRlcyA9IE1hdGguZmxvb3IodGh1bWJuYWlsSW5kZXggLyA0KTtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMucHJvZHVjdEdhbGxlcnlOYXZpZ2F0aW9uV3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IC0oY29udGFpbmVyV2lkdGggKiBzbGlkZXMpO1xuXG4gICAgdGhpcy5wcm9kdWN0R2FsbGVyeU5hdmlnYXRpb24uc3R5bGUubGVmdCA9IGAke25ld1Bvc2l0aW9ufXB4YDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUE5RkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/ProductSlideshow.js\n");

/***/ }),

/***/ "./source/scripts/components/Quickshop.js":
/*!************************************************!*\
  !*** ./source/scripts/components/Quickshop.js ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ Quickshop)\n/* harmony export */ });\n/* harmony import */ var _Product__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Product */ \"./source/scripts/components/Product.js\");\n\nclass Quickshop {\n  constructor() {\n    this.el = document.querySelector('[data-quickshop]');\n    this.contentEl = document.querySelector('[data-quickshop-content]');\n    this.closeEl = document.querySelector('[data-quickshop-close]');\n    this.injectEl = this.el.querySelector('[data-quickshop-product-inject]');\n    this.useCaching = !(window.Shopify && window.Shopify.designMode);\n    this.deferred = {};\n    this.onContentClick = this._onContentClick.bind(this);\n    this.onCloseClick = this.close.bind(this);\n  }\n\n  load(url) {\n    let data;\n\n    if (url in this.deferred) {\n      return this.deferred[url];\n    }\n\n    this.deferred[url] = new Promise((resolve, reject) => {\n      const [baseUrl, params] = url.split('?');\n      const request = new XMLHttpRequest();\n      request.open('GET', `${baseUrl}?${params ? `${params}&&view=quickshop` : 'view=quickshop'}`, true);\n      request.responseType = 'text';\n\n      request.onload = () => {\n        const el = document.createElement('div');\n        el.innerHTML = request.response;\n        const options = JSON.parse(el.querySelector('[data-product-options]').innerHTML);\n        const html = el.querySelector('[data-product-html]').innerHTML;\n\n        if (this.useCaching) {\n          try {\n            sessionStorage.setItem(url, JSON.stringify({\n              options,\n              html\n            }));\n          } catch {}\n        }\n\n        delete this.deferred[url];\n        resolve({\n          options,\n          html\n        });\n      };\n\n      request.onerror = () => {\n        delete this.deferred[url];\n        reject();\n      };\n\n      request.send();\n    });\n    return this.deferred[url];\n  }\n\n  open(url) {\n    this.el.addEventListener('click', this.onCloseClick);\n    this.contentEl.addEventListener('click', this.onContentClick);\n    this.closeEl.addEventListener('click', this.onCloseClick);\n    this.el.classList.add('quickshop-visible');\n    return this.load(url).then(data => {\n      this.injectEl.innerHTML = data.html;\n      this.product = new _Product__WEBPACK_IMPORTED_MODULE_0__.default(this.injectEl, data.options);\n      this.el.classList.add('quickshop-loaded');\n    });\n  }\n\n  close() {\n    if (this.product != null) {\n      this.product.unload();\n    }\n\n    this.el.removeEventListener('click', this.onCloseClick);\n    this.contentEl.removeEventListener('click', this.onContentClick);\n    this.closeEl.removeEventListener('click', this.onCloseClick);\n    this.el.classList.remove('quickshop-loaded');\n    return this.el.classList.remove('quickshop-visible');\n  }\n\n  unload() {\n    return this.close();\n  }\n\n  _onContentClick(e) {\n    return e.stopPropagation();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1F1aWNrc2hvcC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1F1aWNrc2hvcC5qcz8wNTQ0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9kdWN0IGZyb20gJy4vUHJvZHVjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1aWNrc2hvcCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1xdWlja3Nob3BdJyk7XG4gICAgdGhpcy5jb250ZW50RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1xdWlja3Nob3AtY29udGVudF0nKTtcbiAgICB0aGlzLmNsb3NlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1xdWlja3Nob3AtY2xvc2VdJyk7XG4gICAgdGhpcy5pbmplY3RFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcXVpY2tzaG9wLXByb2R1Y3QtaW5qZWN0XScpO1xuICAgIHRoaXMudXNlQ2FjaGluZyA9ICEod2luZG93LlNob3BpZnkgJiYgd2luZG93LlNob3BpZnkuZGVzaWduTW9kZSk7XG5cbiAgICB0aGlzLmRlZmVycmVkID0ge307XG5cbiAgICB0aGlzLm9uQ29udGVudENsaWNrID0gdGhpcy5fb25Db250ZW50Q2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uQ2xvc2VDbGljayA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGxvYWQodXJsKSB7XG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKHVybCBpbiB0aGlzLmRlZmVycmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZlcnJlZFt1cmxdO1xuICAgIH1cblxuICAgIHRoaXMuZGVmZXJyZWRbdXJsXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IFtiYXNlVXJsLCBwYXJhbXNdID0gdXJsLnNwbGl0KCc/Jyk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHJlcXVlc3Qub3BlbignR0VUJywgYCR7YmFzZVVybH0/JHtwYXJhbXMgPyBgJHtwYXJhbXN9JiZ2aWV3PXF1aWNrc2hvcGAgOiAndmlldz1xdWlja3Nob3AnfWAsIHRydWUpO1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG4gICAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gcmVxdWVzdC5yZXNwb25zZTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gSlNPTi5wYXJzZShlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LW9wdGlvbnNdJykuaW5uZXJIVE1MKTtcbiAgICAgICAgY29uc3QgaHRtbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtaHRtbF0nKS5pbm5lckhUTUw7XG5cbiAgICAgICAgaWYgKHRoaXMudXNlQ2FjaGluZykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgb3B0aW9ucywgaHRtbCB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmZXJyZWRbdXJsXTtcbiAgICAgICAgcmVzb2x2ZSh7IG9wdGlvbnMsIGh0bWwgfSk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZlcnJlZFt1cmxdO1xuICAgICAgICByZWplY3QoKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmRlZmVycmVkW3VybF07XG4gIH1cblxuICBvcGVuKHVybCkge1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xvc2VDbGljayk7XG4gICAgdGhpcy5jb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ29udGVudENsaWNrKTtcbiAgICB0aGlzLmNsb3NlRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xvc2VDbGljayk7XG5cbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3F1aWNrc2hvcC12aXNpYmxlJyk7XG5cbiAgICByZXR1cm4gdGhpcy5sb2FkKHVybCkudGhlbihkYXRhID0+IHtcbiAgICAgIHRoaXMuaW5qZWN0RWwuaW5uZXJIVE1MID0gZGF0YS5odG1sO1xuICAgICAgdGhpcy5wcm9kdWN0ID0gbmV3IFByb2R1Y3QodGhpcy5pbmplY3RFbCwgZGF0YS5vcHRpb25zKTtcbiAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgncXVpY2tzaG9wLWxvYWRlZCcpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMucHJvZHVjdCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnByb2R1Y3QudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbG9zZUNsaWNrKTtcbiAgICB0aGlzLmNvbnRlbnRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Db250ZW50Q2xpY2spO1xuICAgIHRoaXMuY2xvc2VFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbG9zZUNsaWNrKTtcblxuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgncXVpY2tzaG9wLWxvYWRlZCcpO1xuICAgIHJldHVybiB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3F1aWNrc2hvcC12aXNpYmxlJyk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIF9vbkNvbnRlbnRDbGljayhlKSB7XG4gICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6RkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/Quickshop.js\n");

/***/ }),

/***/ "./source/scripts/components/RTE.js":
/*!******************************************!*\
  !*** ./source/scripts/components/RTE.js ***!
  \******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ RTE)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_grouped_content__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/grouped-content */ \"./node_modules/@pixelunion/grouped-content/dist/index.js\");\n/* harmony import */ var _pixelunion_grouped_content__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_pixelunion_grouped_content__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var reframe_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! reframe.js */ \"./node_modules/reframe.js/dist/reframe.es.js\");\n\n\nclass RTE {\n  constructor(component) {\n    this.el = component.el;\n    this.setupTabs();\n    (0,reframe_js__WEBPACK_IMPORTED_MODULE_1__.default)(this.el.querySelectorAll('iframe'));\n    const videos = this.el.querySelectorAll('iframe');\n\n    for (let i = 0; i < videos.length; i++) {\n      const video = videos[i];\n\n      if (video.classList.contains('highlight')) {\n        video.parentNode.classList.add('highlight');\n      }\n    }\n  }\n\n  setupTabs() {\n    return new (_pixelunion_grouped_content__WEBPACK_IMPORTED_MODULE_0___default())(this.el, {\n      layout: 'tabs',\n      intelliparse: false\n    });\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1JURS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1JURS5qcz8xYTIwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHcm91cGVkQ29udGVudCBmcm9tICdAcGl4ZWx1bmlvbi9ncm91cGVkLWNvbnRlbnQnO1xuaW1wb3J0IHJlZnJhbWUgZnJvbSAncmVmcmFtZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJURSB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkge1xuICAgIHRoaXMuZWwgPSBjb21wb25lbnQuZWw7XG4gICAgdGhpcy5zZXR1cFRhYnMoKTtcblxuICAgIHJlZnJhbWUodGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSk7XG5cbiAgICBjb25zdCB2aWRlb3MgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlkZW9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB2aWRlbyA9IHZpZGVvc1tpXTtcbiAgICAgIGlmICh2aWRlby5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZ2hsaWdodCcpKSB7XG4gICAgICAgIHZpZGVvLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0dXBUYWJzKCkge1xuICAgIHJldHVybiBuZXcgR3JvdXBlZENvbnRlbnQodGhpcy5lbCwgeyBsYXlvdXQ6ICd0YWJzJywgaW50ZWxsaXBhcnNlOiBmYWxzZSB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFuQkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/components/RTE.js\n");

/***/ }),

/***/ "./source/scripts/components/SearchTakeover.js":
/*!*****************************************************!*\
  !*** ./source/scripts/components/SearchTakeover.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ SearchTakeover)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n/* harmony import */ var _SiteOverlay__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SiteOverlay */ \"./source/scripts/components/SiteOverlay.js\");\n\n\n\nclass SearchTakeover {\n  constructor(el) {\n    this.el = el;\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    this.siteOverlay = new _SiteOverlay__WEBPACK_IMPORTED_MODULE_2__.default();\n    this.input = this.el.querySelector('[data-search-input]');\n    this.close = this.el.querySelector('[data-search-takeover-close]');\n    this.animation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n      el: this.el,\n      state: 'closed'\n    });\n    this.isOpen = false;\n    this.events.register(window, 'keyup', e => this._onKeyUp(e));\n    this.events.register(this.close, 'click', () => this._close());\n    this.events.register(document.body, 'click', e => {\n      if (!e.target.closest('[data-header-search-toggle], [data-search-takeover]')) {\n        this._close();\n      }\n    });\n  }\n\n  _onKeyUp(e) {\n    if (e.code === 'Escape') {\n      this._close();\n    }\n  }\n\n  open() {\n    if (this.isOpen) return;\n    this.isOpen = true;\n    this.animation.animateTo('open').then(() => {\n      const {\n        length\n      } = this.input.value;\n      this.input.setSelectionRange(length, length);\n      this.input.focus();\n      this.siteOverlay.open();\n    });\n  }\n\n  _close() {\n    if (!this.isOpen) return;\n    this.animation.animateTo('closed').then(() => {\n      this.isOpen = false;\n      this.siteOverlay.close();\n    });\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1NlYXJjaFRha2VvdmVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvU2VhcmNoVGFrZW92ZXIuanM/YTA0MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSAnQHBpeGVsdW5pb24vYW5pbWF0aW9ucyc7XG5pbXBvcnQgU2l0ZU92ZXJsYXkgZnJvbSAnLi9TaXRlT3ZlcmxheSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaFRha2VvdmVyIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5zaXRlT3ZlcmxheSA9IG5ldyBTaXRlT3ZlcmxheSgpO1xuXG4gICAgdGhpcy5pbnB1dCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLWlucHV0XScpO1xuICAgIHRoaXMuY2xvc2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC10YWtlb3Zlci1jbG9zZV0nKTtcbiAgICB0aGlzLmFuaW1hdGlvbiA9IHRyYW5zaXRpb24oeyBlbDogdGhpcy5lbCwgc3RhdGU6ICdjbG9zZWQnIH0pO1xuXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHdpbmRvdywgJ2tleXVwJywgZSA9PiB0aGlzLl9vbktleVVwKGUpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmNsb3NlLCAnY2xpY2snLCAoKSA9PiB0aGlzLl9jbG9zZSgpKTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGRvY3VtZW50LmJvZHksICdjbGljaycsIGUgPT4ge1xuICAgICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1oZWFkZXItc2VhcmNoLXRvZ2dsZV0sIFtkYXRhLXNlYXJjaC10YWtlb3Zlcl0nKSkge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX29uS2V5VXAoZSkge1xuICAgIGlmIChlLmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuXG4gICAgdGhpcy5hbmltYXRpb24uYW5pbWF0ZVRvKCdvcGVuJylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHRoaXMuaW5wdXQudmFsdWU7XG4gICAgICAgIHRoaXMuaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UobGVuZ3RoLCBsZW5ndGgpO1xuICAgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuc2l0ZU92ZXJsYXkub3BlbigpO1xuICAgICAgfSk7XG4gIH1cblxuICBfY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5hbmltYXRpb24uYW5pbWF0ZVRvKCdjbG9zZWQnKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNpdGVPdmVybGF5LmNsb3NlKCk7XG4gICAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbERBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/components/SearchTakeover.js\n");

/***/ }),

/***/ "./source/scripts/components/Select.js":
/*!*********************************************!*\
  !*** ./source/scripts/components/Select.js ***!
  \*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ Select)\n/* harmony export */ });\nfunction updateSelect(select) {\n  const {\n    selectedIndex,\n    options\n  } = select;\n  if (selectedIndex < 0) return;\n  const {\n    text\n  } = options[selectedIndex];\n\n  if (text) {\n    let sibling = select.parentNode.firstElementChild; // Loop through each sibling and push to the array\n\n    while (sibling) {\n      if (sibling.nodeType === 1 && sibling !== select && (sibling.classList.contains('selected-text') || sibling.classList.contains('selected-option'))) {\n        sibling.innerText = text;\n      }\n\n      sibling = sibling.nextElementSibling;\n    }\n  }\n}\n\nclass Select {\n  constructor({\n    el\n  }) {\n    const {\n      parentElement\n    } = el;\n\n    if (parentElement && !parentElement.classList.contains('select-wrapper') && !el.classList.contains('product-variants') && !el.classList.contains('select-disable-wrapper')) {\n      const wrapperEl = document.createElement('div');\n      const selectedTextEl = document.createElement('span');\n      wrapperEl.classList.add('select-wrapper');\n      selectedTextEl.classList.add('selected-text');\n      wrapperEl.appendChild(selectedTextEl);\n      parentElement.insertBefore(wrapperEl, el);\n      wrapperEl.appendChild(el);\n    }\n\n    updateSelect(el);\n    el.addEventListener('change', event => updateSelect(event.target));\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1NlbGVjdC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1NlbGVjdC5qcz81NjA1Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIHVwZGF0ZVNlbGVjdChzZWxlY3QpIHtcbiAgY29uc3QgeyBzZWxlY3RlZEluZGV4LCBvcHRpb25zIH0gPSBzZWxlY3Q7XG5cbiAgaWYgKHNlbGVjdGVkSW5kZXggPCAwKSByZXR1cm47XG5cbiAgY29uc3QgeyB0ZXh0IH0gPSBvcHRpb25zW3NlbGVjdGVkSW5kZXhdO1xuXG4gIGlmICh0ZXh0KSB7XG4gICAgbGV0IHNpYmxpbmcgPSBzZWxlY3QucGFyZW50Tm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBzaWJsaW5nIGFuZCBwdXNoIHRvIHRoZSBhcnJheVxuICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHNpYmxpbmcubm9kZVR5cGUgPT09IDFcbiAgICAgICAgJiYgc2libGluZyAhPT0gc2VsZWN0XG4gICAgICAgICYmIChzaWJsaW5nLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQtdGV4dCcpIHx8IHNpYmxpbmcuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZC1vcHRpb24nKSlcbiAgICAgICkge1xuICAgICAgICBzaWJsaW5nLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgICB9XG5cbiAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IHtcbiAgY29uc3RydWN0b3IoeyBlbCB9KSB7XG4gICAgY29uc3QgeyBwYXJlbnRFbGVtZW50IH0gPSBlbDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmICFwYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0LXdyYXBwZXInKSAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdwcm9kdWN0LXZhcmlhbnRzJykgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0LWRpc2FibGUtd3JhcHBlcicpKSB7XG4gICAgICBjb25zdCB3cmFwcGVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXG4gICAgICB3cmFwcGVyRWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0LXdyYXBwZXInKTtcbiAgICAgIHNlbGVjdGVkVGV4dEVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkLXRleHQnKTtcbiAgICAgIHdyYXBwZXJFbC5hcHBlbmRDaGlsZChzZWxlY3RlZFRleHRFbCk7XG4gICAgICBwYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh3cmFwcGVyRWwsIGVsKTtcbiAgICAgIHdyYXBwZXJFbC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuXG4gICAgdXBkYXRlU2VsZWN0KGVsKTtcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHVwZGF0ZVNlbGVjdChldmVudC50YXJnZXQpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBbkJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/components/Select.js\n");

/***/ }),

/***/ "./source/scripts/components/SiteOverlay.js":
/*!**************************************************!*\
  !*** ./source/scripts/components/SiteOverlay.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ SiteOverlay)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n\n\nclass SiteOverlay {\n  constructor() {\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    this.overlay = document.querySelector('[data-site-overlay]');\n    this.animation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n      el: this.overlay,\n      state: 'closed'\n    });\n    this.events.register(this.overlay, 'click', () => this.close());\n  }\n\n  open() {\n    this.animation.animateTo('open');\n  }\n\n  close() {\n    this.animation.animateTo('closed');\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1NpdGVPdmVybGF5LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvU2l0ZU92ZXJsYXkuanM/ZjZlMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSAnQHBpeGVsdW5pb24vYW5pbWF0aW9ucyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpdGVPdmVybGF5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5vdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc2l0ZS1vdmVybGF5XScpO1xuICAgIHRoaXMuYW5pbWF0aW9uID0gdHJhbnNpdGlvbih7IGVsOiB0aGlzLm92ZXJsYXksIHN0YXRlOiAnY2xvc2VkJyB9KTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMub3ZlcmxheSwgJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgdGhpcy5hbmltYXRpb24uYW5pbWF0ZVRvKCdvcGVuJyk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmFuaW1hdGlvbi5hbmltYXRlVG8oJ2Nsb3NlZCcpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/components/SiteOverlay.js\n");

/***/ }),

/***/ "./source/scripts/grid.js":
/*!********************************!*\
  !*** ./source/scripts/grid.js ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _polyfills_nodeListForEach__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./polyfills/nodeListForEach */ \"./source/scripts/polyfills/nodeListForEach.js\");\n/* harmony import */ var _polyfills_nodeListForEach__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_polyfills_nodeListForEach__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _helpers_globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers/globals */ \"./source/scripts/helpers/globals.js\");\n/* harmony import */ var _helpers_globals__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_helpers_globals__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _pixelunion_shopify_sections_manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/shopify-sections-manager */ \"./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js\");\n/* harmony import */ var intersection_observer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! intersection-observer */ \"./node_modules/intersection-observer/intersection-observer.js\");\n/* harmony import */ var intersection_observer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(intersection_observer__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _pixelunion_pxs_map__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @pixelunion/pxs-map */ \"./node_modules/@pixelunion/pxs-map/dist/index.es.js\");\n/* harmony import */ var _pixelunion_pxs_video__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @pixelunion/pxs-video */ \"./node_modules/@pixelunion/pxs-video/dist/index.es.js\");\n/* harmony import */ var _helpers_polyfill_nodelist_foreach__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers/polyfill-nodelist-foreach */ \"./source/scripts/helpers/polyfill-nodelist-foreach.js\");\n/* harmony import */ var _helpers_polyfill_nodelist_foreach__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_helpers_polyfill_nodelist_foreach__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @pixelunion/age-gate */ \"./node_modules/@pixelunion/age-gate/dist/index.es.js\");\n/* harmony import */ var _helpers_FlickityTouchFix__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./helpers/FlickityTouchFix */ \"./source/scripts/helpers/FlickityTouchFix.js\");\n/* harmony import */ var _templates_TemplateAccount__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./templates/TemplateAccount */ \"./source/scripts/templates/TemplateAccount.js\");\n/* harmony import */ var _templates_TemplateLogin__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./templates/TemplateLogin */ \"./source/scripts/templates/TemplateLogin.js\");\n/* harmony import */ var _templates_TemplateGiftCard__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./templates/TemplateGiftCard */ \"./source/scripts/templates/TemplateGiftCard.js\");\n/* harmony import */ var _components_RTE__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./components/RTE */ \"./source/scripts/components/RTE.js\");\n/* harmony import */ var _components_Select__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./components/Select */ \"./source/scripts/components/Select.js\");\n/* harmony import */ var _components_ProductHighVariant__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./components/ProductHighVariant */ \"./source/scripts/components/ProductHighVariant.js\");\n/* harmony import */ var _sections_DynamicBlog__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./sections/DynamicBlog */ \"./source/scripts/sections/DynamicBlog.js\");\n/* harmony import */ var _sections_DynamicFeaturedCollection__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./sections/DynamicFeaturedCollection */ \"./source/scripts/sections/DynamicFeaturedCollection.js\");\n/* harmony import */ var _sections_DynamicMasonry__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./sections/DynamicMasonry */ \"./source/scripts/sections/DynamicMasonry.js\");\n/* harmony import */ var _sections_DynamicPromotion__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./sections/DynamicPromotion */ \"./source/scripts/sections/DynamicPromotion.js\");\n/* harmony import */ var _sections_DynamicSlideshow__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./sections/DynamicSlideshow */ \"./source/scripts/sections/DynamicSlideshow.js\");\n/* harmony import */ var _sections_DynamicTestimonials__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./sections/DynamicTestimonials */ \"./source/scripts/sections/DynamicTestimonials.js\");\n/* harmony import */ var _sections_StaticArticle__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./sections/StaticArticle */ \"./source/scripts/sections/StaticArticle.js\");\n/* harmony import */ var _sections_StaticHeader__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./sections/StaticHeader */ \"./source/scripts/sections/StaticHeader.js\");\n/* harmony import */ var _sections_StaticFooter__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./sections/StaticFooter */ \"./source/scripts/sections/StaticFooter.js\");\n/* harmony import */ var _sections_StaticCollection__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./sections/StaticCollection */ \"./source/scripts/sections/StaticCollection.js\");\n/* harmony import */ var _sections_StaticCart__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./sections/StaticCart */ \"./source/scripts/sections/StaticCart.js\");\n/* harmony import */ var _sections_StaticBlog__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./sections/StaticBlog */ \"./source/scripts/sections/StaticBlog.js\");\n/* harmony import */ var _sections_StaticBlogMasonry__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./sections/StaticBlogMasonry */ \"./source/scripts/sections/StaticBlogMasonry.js\");\n/* harmony import */ var _sections_StaticCollectionsList__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./sections/StaticCollectionsList */ \"./source/scripts/sections/StaticCollectionsList.js\");\n/* harmony import */ var _sections_StaticProductRecommendations__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./sections/StaticProductRecommendations */ \"./source/scripts/sections/StaticProductRecommendations.js\");\n/* harmony import */ var _sections_StaticSearch__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./sections/StaticSearch */ \"./source/scripts/sections/StaticSearch.js\");\n/* harmony import */ var _sections_ProductSection__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./sections/ProductSection */ \"./source/scripts/sections/ProductSection.js\");\n\n\n\n\n\n\n\n\n // Flickity iOS fix\n\n // Templates\n\n\n\n // Components\n\n\n\n // Dynamic Sections\n\n\n\n\n\n\n // Static sections\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction spamCheck(e) {\n  if (e.target.querySelector('.comment-check').value.length > 0) {\n    e.preventDefault();\n  }\n}\n\n_pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_4__.default.init();\nconst sections = new _pixelunion_shopify_sections_manager__WEBPACK_IMPORTED_MODULE_2__.default(); // Dynamic Sections\n\nsections.register('dynamic-blog', section => new _sections_DynamicBlog__WEBPACK_IMPORTED_MODULE_16__.default(section));\nsections.register('dynamic-featured-collection', section => new _sections_DynamicFeaturedCollection__WEBPACK_IMPORTED_MODULE_17__.default(section));\nsections.register('dynamic-masonry', section => new _sections_DynamicMasonry__WEBPACK_IMPORTED_MODULE_18__.default(section));\nsections.register('dynamic-promotion', section => new _sections_DynamicPromotion__WEBPACK_IMPORTED_MODULE_19__.default(section));\nsections.register('dynamic-slideshow', section => new _sections_DynamicSlideshow__WEBPACK_IMPORTED_MODULE_20__.default(section));\nsections.register('dynamic-testimonials', section => new _sections_DynamicTestimonials__WEBPACK_IMPORTED_MODULE_21__.default(section));\nsections.register('pxs-video', section => new _pixelunion_pxs_video__WEBPACK_IMPORTED_MODULE_6__.default(section));\nsections.register('product', section => new _sections_ProductSection__WEBPACK_IMPORTED_MODULE_32__.default(section));\nsections.register('pxs-map', section => new _pixelunion_pxs_map__WEBPACK_IMPORTED_MODULE_5__.default(section)); // Static Sections\n\nsections.register('static-article', section => new _sections_StaticArticle__WEBPACK_IMPORTED_MODULE_22__.default(section));\nsections.register('static-collection', section => new _sections_StaticCollection__WEBPACK_IMPORTED_MODULE_25__.default(section));\nsections.register('static-collections-list', section => new _sections_StaticCollectionsList__WEBPACK_IMPORTED_MODULE_29__.default(section));\nsections.register('static-header', section => new _sections_StaticHeader__WEBPACK_IMPORTED_MODULE_23__.default(section));\nsections.register('static-footer', section => new _sections_StaticFooter__WEBPACK_IMPORTED_MODULE_24__.default(section));\nsections.register('static-cart', section => new _sections_StaticCart__WEBPACK_IMPORTED_MODULE_26__.default(section));\nsections.register('static-blog', section => new _sections_StaticBlog__WEBPACK_IMPORTED_MODULE_27__.default(section));\nsections.register('static-blog-masonry', section => new _sections_StaticBlogMasonry__WEBPACK_IMPORTED_MODULE_28__.default(section));\nsections.register('static-product-recommendations', section => new _sections_StaticProductRecommendations__WEBPACK_IMPORTED_MODULE_30__.default(section));\nsections.register('static-search', section => new _sections_StaticSearch__WEBPACK_IMPORTED_MODULE_31__.default(section));\nsections.register('age-gate', section => new _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_8__.PageAgeGate(section));\n(0,_helpers_FlickityTouchFix__WEBPACK_IMPORTED_MODULE_9__.default)();\nconst contactForm = document.querySelector('.contact-form');\n\nif (contactForm) {\n  contactForm.addEventListener('submit', event => spamCheck(event));\n}\n\ndocument.addEventListener('DOMContentLoaded', () => document.documentElement.classList.remove('loading')); // Set up conditionals\n\nconst isProduct = document.body.classList.contains('template-product');\nconst isProductHighVariant = isProduct && document.querySelector('product-form');\nconst customerTemplates = [\"template-order\", \"template-addresses\", \"template-login\", \"template-account\"];\nlet isAccount;\n\nfor (let i = 0; i < customerTemplates.length; i++) {\n  if (document.body.classList.contains(customerTemplates[i])) {\n    isAccount = true;\n  }\n}\n\nconst isPasswordPage = document.body.classList.contains('template-password');\nconst isGiftCardPage = document.body.classList.contains('template-gift_card');\n\nif (isAccount) {\n  new _templates_TemplateAccount__WEBPACK_IMPORTED_MODULE_10__.default({\n    el: document.body\n  });\n}\n\nif (isPasswordPage) {\n  new _templates_TemplateLogin__WEBPACK_IMPORTED_MODULE_11__.default();\n}\n\nif (isGiftCardPage) {\n  new _templates_TemplateGiftCard__WEBPACK_IMPORTED_MODULE_12__.default();\n}\n\nif (!isProduct) {\n  document.querySelectorAll('.rte').forEach(rte => new _components_RTE__WEBPACK_IMPORTED_MODULE_13__.default({\n    el: rte\n  }));\n  document.querySelectorAll('select').forEach(sel => new _components_Select__WEBPACK_IMPORTED_MODULE_14__.default({\n    el: sel\n  }));\n}\n\nif (isProductHighVariant) {\n  new _components_ProductHighVariant__WEBPACK_IMPORTED_MODULE_15__.default();\n}\n\nconst ageGatePage = document.getElementById('age-gate-page');\n\nif (ageGatePage) {\n  new _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_8__.SiteAgeGate(ageGatePage);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9ncmlkLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2dyaWQuanM/ZWVlMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4vcG9seWZpbGxzL25vZGVMaXN0Rm9yRWFjaCc7XG5pbXBvcnQgJy4vaGVscGVycy9nbG9iYWxzJztcbmltcG9ydCBTaG9waWZ5U2VjdGlvbnNNYW5hZ2VyIGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktc2VjdGlvbnMtbWFuYWdlcic7XG5pbXBvcnQgJ2ludGVyc2VjdGlvbi1vYnNlcnZlcic7XG5pbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknO1xuaW1wb3J0IFB4c01hcCBmcm9tICdAcGl4ZWx1bmlvbi9weHMtbWFwJztcbmltcG9ydCBQeHNWaWRlbyBmcm9tICdAcGl4ZWx1bmlvbi9weHMtdmlkZW8nO1xuaW1wb3J0ICcuL2hlbHBlcnMvcG9seWZpbGwtbm9kZWxpc3QtZm9yZWFjaCc7XG5pbXBvcnQgeyBTaXRlQWdlR2F0ZSwgUGFnZUFnZUdhdGUgfSBmcm9tICdAcGl4ZWx1bmlvbi9hZ2UtZ2F0ZSc7XG5cbi8vIEZsaWNraXR5IGlPUyBmaXhcbmltcG9ydCBmbGlja2l0eVRvdWNoRml4IGZyb20gJy4vaGVscGVycy9GbGlja2l0eVRvdWNoRml4Jztcbi8vIFRlbXBsYXRlc1xuaW1wb3J0IFRlbXBsYXRlQWNjb3VudCBmcm9tICcuL3RlbXBsYXRlcy9UZW1wbGF0ZUFjY291bnQnO1xuaW1wb3J0IFRlbXBsYXRlTG9naW4gZnJvbSAnLi90ZW1wbGF0ZXMvVGVtcGxhdGVMb2dpbic7XG5pbXBvcnQgVGVtcGxhdGVHaWZ0Q2FyZCBmcm9tICcuL3RlbXBsYXRlcy9UZW1wbGF0ZUdpZnRDYXJkJztcbi8vIENvbXBvbmVudHNcbmltcG9ydCBSVEUgZnJvbSAnLi9jb21wb25lbnRzL1JURSc7XG5pbXBvcnQgU2VsZWN0IGZyb20gJy4vY29tcG9uZW50cy9TZWxlY3QnO1xuaW1wb3J0IFByb2R1Y3RIaWdoVmFyaWFudCBmcm9tICcuL2NvbXBvbmVudHMvUHJvZHVjdEhpZ2hWYXJpYW50Jztcbi8vIER5bmFtaWMgU2VjdGlvbnNcbmltcG9ydCBEeW5hbWljQmxvZyBmcm9tICcuL3NlY3Rpb25zL0R5bmFtaWNCbG9nJztcbmltcG9ydCBEeW5hbWljRmVhdHVyZWRDb2xsZWN0aW9uIGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY0ZlYXR1cmVkQ29sbGVjdGlvbic7XG5pbXBvcnQgRHluYW1pY01hc29ucnkgZnJvbSAnLi9zZWN0aW9ucy9EeW5hbWljTWFzb25yeSc7XG5pbXBvcnQgRHluYW1pY1Byb21vdGlvbiBmcm9tICcuL3NlY3Rpb25zL0R5bmFtaWNQcm9tb3Rpb24nO1xuaW1wb3J0IER5bmFtaWNTbGlkZXNob3cgZnJvbSAnLi9zZWN0aW9ucy9EeW5hbWljU2xpZGVzaG93JztcbmltcG9ydCBEeW5hbWljVGVzdGltb25pYWxzIGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY1Rlc3RpbW9uaWFscyc7XG4vLyBTdGF0aWMgc2VjdGlvbnNcbmltcG9ydCBTdGF0aWNBcnRpY2xlIGZyb20gJy4vc2VjdGlvbnMvU3RhdGljQXJ0aWNsZSc7XG5pbXBvcnQgU3RhdGljSGVhZGVyIGZyb20gJy4vc2VjdGlvbnMvU3RhdGljSGVhZGVyJztcbmltcG9ydCBTdGF0aWNGb290ZXIgZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNGb290ZXInO1xuaW1wb3J0IFN0YXRpY0NvbGxlY3Rpb24gZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNDb2xsZWN0aW9uJztcbmltcG9ydCBTdGF0aWNDYXJ0IGZyb20gJy4vc2VjdGlvbnMvU3RhdGljQ2FydCc7XG5pbXBvcnQgU3RhdGljQmxvZyBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY0Jsb2cnO1xuaW1wb3J0IFN0YXRpY0Jsb2dNYXNvbnJ5IGZyb20gJy4vc2VjdGlvbnMvU3RhdGljQmxvZ01hc29ucnknO1xuaW1wb3J0IFN0YXRpY0NvbGxlY3Rpb25zTGlzdCBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY0NvbGxlY3Rpb25zTGlzdCc7XG5pbXBvcnQgU3RhdGljUHJvZHVjdFJlY29tbWVuZGF0aW9ucyBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY1Byb2R1Y3RSZWNvbW1lbmRhdGlvbnMnO1xuaW1wb3J0IFN0YXRpY1NlYXJjaCBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY1NlYXJjaCc7XG5pbXBvcnQgUHJvZHVjdFNlY3Rpb24gZnJvbSAnLi9zZWN0aW9ucy9Qcm9kdWN0U2VjdGlvbic7XG5cbmZ1bmN0aW9uIHNwYW1DaGVjayhlKSB7XG4gIGlmIChlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCcuY29tbWVudC1jaGVjaycpLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cblxucmltZy5pbml0KCk7XG5cbmNvbnN0IHNlY3Rpb25zID0gbmV3IFNob3BpZnlTZWN0aW9uc01hbmFnZXIoKTtcbi8vIER5bmFtaWMgU2VjdGlvbnNcbnNlY3Rpb25zLnJlZ2lzdGVyKCdkeW5hbWljLWJsb2cnLCBzZWN0aW9uID0+IG5ldyBEeW5hbWljQmxvZyhzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3RlcignZHluYW1pYy1mZWF0dXJlZC1jb2xsZWN0aW9uJywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY0ZlYXR1cmVkQ29sbGVjdGlvbihzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3RlcignZHluYW1pYy1tYXNvbnJ5Jywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY01hc29ucnkoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtcHJvbW90aW9uJywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY1Byb21vdGlvbihzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3RlcignZHluYW1pYy1zbGlkZXNob3cnLCBzZWN0aW9uID0+IG5ldyBEeW5hbWljU2xpZGVzaG93KHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdkeW5hbWljLXRlc3RpbW9uaWFscycsIHNlY3Rpb24gPT4gbmV3IER5bmFtaWNUZXN0aW1vbmlhbHMoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3B4cy12aWRlbycsIHNlY3Rpb24gPT4gbmV3IFB4c1ZpZGVvKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdwcm9kdWN0Jywgc2VjdGlvbiA9PiBuZXcgUHJvZHVjdFNlY3Rpb24oc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3B4cy1tYXAnLCBzZWN0aW9uID0+IG5ldyBQeHNNYXAoc2VjdGlvbikpO1xuLy8gU3RhdGljIFNlY3Rpb25zXG5zZWN0aW9ucy5yZWdpc3Rlcignc3RhdGljLWFydGljbGUnLCBzZWN0aW9uID0+IG5ldyBTdGF0aWNBcnRpY2xlKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtY29sbGVjdGlvbicsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY0NvbGxlY3Rpb24oc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1jb2xsZWN0aW9ucy1saXN0Jywgc2VjdGlvbiA9PiBuZXcgU3RhdGljQ29sbGVjdGlvbnNMaXN0KHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtaGVhZGVyJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljSGVhZGVyKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtZm9vdGVyJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljRm9vdGVyKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtY2FydCcsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY0NhcnQoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1ibG9nJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljQmxvZyhzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3Rlcignc3RhdGljLWJsb2ctbWFzb25yeScsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY0Jsb2dNYXNvbnJ5KHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtcHJvZHVjdC1yZWNvbW1lbmRhdGlvbnMnLCBzZWN0aW9uID0+IG5ldyBTdGF0aWNQcm9kdWN0UmVjb21tZW5kYXRpb25zKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtc2VhcmNoJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljU2VhcmNoKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdhZ2UtZ2F0ZScsIHNlY3Rpb24gPT4gbmV3IFBhZ2VBZ2VHYXRlKHNlY3Rpb24pKTtcblxuZmxpY2tpdHlUb3VjaEZpeCgpO1xuXG5jb25zdCBjb250YWN0Rm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250YWN0LWZvcm0nKTtcblxuaWYgKGNvbnRhY3RGb3JtKSB7XG4gIGNvbnRhY3RGb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGV2ZW50ID0+IHNwYW1DaGVjayhldmVudCkpO1xufVxuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKSk7XG5cbi8vIFNldCB1cCBjb25kaXRpb25hbHNcbmNvbnN0IGlzUHJvZHVjdCA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCd0ZW1wbGF0ZS1wcm9kdWN0Jyk7XG5jb25zdCBpc1Byb2R1Y3RIaWdoVmFyaWFudCA9IGlzUHJvZHVjdCAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdwcm9kdWN0LWZvcm0nKTtcbmNvbnN0IGN1c3RvbWVyVGVtcGxhdGVzID0gW1widGVtcGxhdGUtb3JkZXJcIiwgXCJ0ZW1wbGF0ZS1hZGRyZXNzZXNcIiwgXCJ0ZW1wbGF0ZS1sb2dpblwiLCBcInRlbXBsYXRlLWFjY291bnRcIl07XG5sZXQgaXNBY2NvdW50O1xuZm9yIChsZXQgaT0wO2k8Y3VzdG9tZXJUZW1wbGF0ZXMubGVuZ3RoO2krKykge1xuICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoY3VzdG9tZXJUZW1wbGF0ZXNbaV0pKSB7XG4gICAgaXNBY2NvdW50ID0gdHJ1ZTtcbiAgfVxufVxuY29uc3QgaXNQYXNzd29yZFBhZ2UgPSBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygndGVtcGxhdGUtcGFzc3dvcmQnKTtcbmNvbnN0IGlzR2lmdENhcmRQYWdlID0gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3RlbXBsYXRlLWdpZnRfY2FyZCcpO1xuXG5pZiAoaXNBY2NvdW50KSB7IG5ldyBUZW1wbGF0ZUFjY291bnQoeyBlbDogZG9jdW1lbnQuYm9keSB9KTsgfVxuaWYgKGlzUGFzc3dvcmRQYWdlKSB7IG5ldyBUZW1wbGF0ZUxvZ2luKCk7IH1cbmlmIChpc0dpZnRDYXJkUGFnZSkgeyBuZXcgVGVtcGxhdGVHaWZ0Q2FyZCgpOyB9XG5cbmlmICghaXNQcm9kdWN0KSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ydGUnKS5mb3JFYWNoKHJ0ZSA9PiBuZXcgUlRFKHsgZWw6IHJ0ZSB9KSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpLmZvckVhY2goc2VsID0+IG5ldyBTZWxlY3QoeyBlbDogc2VsIH0pKTtcbn1cblxuaWYgKGlzUHJvZHVjdEhpZ2hWYXJpYW50KSB7XG4gIG5ldyBQcm9kdWN0SGlnaFZhcmlhbnQoKTtcbn1cblxuY29uc3QgYWdlR2F0ZVBhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlLWdhdGUtcGFnZScpO1xuXG5pZiAoYWdlR2F0ZVBhZ2UpIHtcbiAgbmV3IFNpdGVBZ2VHYXRlKGFnZUdhdGVQYWdlKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/grid.js\n");

/***/ }),

/***/ "./source/scripts/helpers/FlickityA11yPatch.js":
/*!*****************************************************!*\
  !*** ./source/scripts/helpers/FlickityA11yPatch.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ FlickityA11yPatch)\n/* harmony export */ });\nclass FlickityA11yPatch {\n  constructor(slider) {\n    this.slider = slider;\n    this.observer = new MutationObserver(m => this._removeAttr(m));\n    this.observer.observe(this.slider, {\n      attributes: true,\n      childList: true,\n      subtree: true\n    });\n    this.slider.querySelectorAll('[aria-hidden]').forEach(el => {\n      el.removeAttribute('aria-hidden');\n    });\n  }\n\n  _removeAttr(mutations) {\n    if (mutations.length) {\n      mutations.forEach(m => {\n        if (m?.target && m.target.hasAttribute('aria-hidden')) {\n          m.target.removeAttribute('aria-hidden');\n        }\n      });\n    }\n  }\n\n  unload() {\n    this.observer.disconnect();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL0ZsaWNraXR5QTExeVBhdGNoLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL2hlbHBlcnMvRmxpY2tpdHlBMTF5UGF0Y2guanM/YmJhOCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBGbGlja2l0eUExMXlQYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHNsaWRlcikge1xuICAgIHRoaXMuc2xpZGVyID0gc2xpZGVyO1xuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtID0+IHRoaXMuX3JlbW92ZUF0dHIobSkpO1xuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnNsaWRlciwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnNsaWRlci5xdWVyeVNlbGVjdG9yQWxsKCdbYXJpYS1oaWRkZW5dJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gICAgfSk7XG4gIH1cblxuICBfcmVtb3ZlQXR0cihtdXRhdGlvbnMpIHtcbiAgICBpZiAobXV0YXRpb25zLmxlbmd0aCkge1xuICAgICAgbXV0YXRpb25zLmZvckVhY2gobSA9PiB7XG4gICAgICAgIGlmIChtPy50YXJnZXQgJiYgbS50YXJnZXQuaGFzQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpKSB7XG4gICAgICAgICAgbS50YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/FlickityA11yPatch.js\n");

/***/ }),

/***/ "./source/scripts/helpers/FlickityTouchFix.js":
/*!****************************************************!*\
  !*** ./source/scripts/helpers/FlickityTouchFix.js ***!
  \****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// This is a helper class to fix a touch issue that came up in flickity\n// on iOS devices as of version 13. It should smooth out some of the scroll\n// and swipe issues that flickity is having on that version of iOS.\nconst flickityTouchFix = () => {\n  let touchingSlider = false;\n  let touchStartCoordsX = 0;\n\n  const onTouchStart = e => {\n    if (e.target.closest && e.target.closest('.flickity-slider')) {\n      touchingSlider = true;\n      touchStartCoordsX = e.touches[0].pageX;\n    } else {\n      touchingSlider = false;\n    }\n  };\n\n  const onTouchMove = e => {\n    if (!(touchingSlider && e.cancelable)) {\n      return;\n    }\n\n    if (Math.abs(e.touches[0].pageX - touchStartCoordsX) > 10) {\n      e.preventDefault();\n    }\n  };\n\n  document.body.addEventListener('touchstart', onTouchStart);\n  document.body.addEventListener('touchmove', onTouchMove, {\n    passive: false\n  });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (flickityTouchFix);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL0ZsaWNraXR5VG91Y2hGaXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy9GbGlja2l0eVRvdWNoRml4LmpzPzlmNTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBmaXggYSB0b3VjaCBpc3N1ZSB0aGF0IGNhbWUgdXAgaW4gZmxpY2tpdHlcbi8vIG9uIGlPUyBkZXZpY2VzIGFzIG9mIHZlcnNpb24gMTMuIEl0IHNob3VsZCBzbW9vdGggb3V0IHNvbWUgb2YgdGhlIHNjcm9sbFxuLy8gYW5kIHN3aXBlIGlzc3VlcyB0aGF0IGZsaWNraXR5IGlzIGhhdmluZyBvbiB0aGF0IHZlcnNpb24gb2YgaU9TLlxuY29uc3QgZmxpY2tpdHlUb3VjaEZpeCA9ICgpID0+IHtcbiAgbGV0IHRvdWNoaW5nU2xpZGVyID0gZmFsc2U7XG4gIGxldCB0b3VjaFN0YXJ0Q29vcmRzWCA9IDA7XG5cbiAgY29uc3Qgb25Ub3VjaFN0YXJ0ID0gZSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QgJiYgZS50YXJnZXQuY2xvc2VzdCgnLmZsaWNraXR5LXNsaWRlcicpKSB7XG4gICAgICB0b3VjaGluZ1NsaWRlciA9IHRydWU7XG4gICAgICB0b3VjaFN0YXJ0Q29vcmRzWCA9IGUudG91Y2hlc1swXS5wYWdlWDtcbiAgICB9IGVsc2Uge1xuICAgICAgdG91Y2hpbmdTbGlkZXIgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25Ub3VjaE1vdmUgPSBlID0+IHtcbiAgICBpZiAoISh0b3VjaGluZ1NsaWRlciAmJiBlLmNhbmNlbGFibGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKGUudG91Y2hlc1swXS5wYWdlWCAtIHRvdWNoU3RhcnRDb29yZHNYKSA+IDEwKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmbGlja2l0eVRvdWNoRml4O1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/FlickityTouchFix.js\n");

/***/ }),

/***/ "./source/scripts/helpers/VariantHelper.js":
/*!*************************************************!*\
  !*** ./source/scripts/helpers/VariantHelper.js ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ VariantHelper)\n/* harmony export */ });\nfunction filter(nodelist, fn) {\n  const filtered = [];\n\n  for (let i = 0; i < nodelist.length; i++) {\n    const node = nodelist[i];\n\n    if (fn(node)) {\n      filtered.push(node);\n    }\n  }\n\n  return filtered;\n}\n\nclass VariantHelper {\n  constructor({\n    addToCartButton = null,\n    // Add to cart button element\n    priceFields = null,\n    // Price field elements\n    productForm = null,\n    // Product form element\n    productGallery = null,\n    // Product gallery object\n    selector = null,\n    // Variant select or input elements,\n    type = 'select',\n    // Type of selector element\n    productJSON = null,\n    // Product JSON\n    productSettings = null,\n    // Product settings JSON\n    unitPrice = null,\n    // Unit price element\n    taxLine = null,\n    // Tax line element\n    quantityInput = null // Quantity input element\n\n  }) {\n    this.callbacks = [];\n    this.options = {\n      addToCartButton,\n      priceFields,\n      productForm,\n      productGallery,\n      selector,\n      type,\n      productJSON,\n      productSettings,\n      unitPrice,\n      taxLine,\n      quantityInput\n    };\n    this.enableHistory = false;\n    this.masterSelect = this.options.productForm.querySelector('.product-select'); // Disabled history state updating in the TE\n\n    const isShopify = window.Shopify && window.Shopify.preview_host;\n\n    if (window.history && window.history.replaceState && this.options.productSettings.enableHistory && !isShopify) {\n      this.enableHistory = true;\n    }\n\n    this._init();\n\n    this._bindEvents();\n  }\n\n  onVariantChange(callback) {\n    if (this.callbacks.indexOf(callback) >= 0) {\n      return;\n    }\n\n    this.callbacks.push(callback);\n  }\n\n  offVariantChange(callback) {\n    if (this.callbacks.indexOf(callback) === -1) {\n      return;\n    }\n\n    this.callbacks.splice(this.callbacks.indexOf(callback));\n  }\n\n  _init() {\n    if (this.options.type === 'select') {\n      this.options.selector.forEach(selector => this._setSelectLabel(selector));\n    }\n  }\n\n  _bindEvents() {\n    this.options.selector.forEach(selector => selector.addEventListener('change', event => this._variantChange(event)));\n  }\n\n  unload() {\n    this.options.selector.forEach(selector => selector.removeEventListener('change', event => this._variantChange(event)));\n  }\n\n  _setSelectLabel(select) {\n    if (!select) return;\n    const {\n      value,\n      previousSibling\n    } = select;\n    previousSibling.innerText = value;\n  }\n\n  getCurrentOptions() {\n    const productOptions = [];\n    let inputs = this.options.selector;\n\n    if (this.options.type === 'radio') {\n      inputs = filter(inputs, input => input.checked);\n    }\n\n    inputs.forEach(input => productOptions.push(input.value));\n    return productOptions;\n  }\n\n  getVariantFromOptions(productOptions) {\n    if (this.options.productJSON.variants == null) {\n      return;\n    }\n\n    let foundVariant = null;\n\n    for (let i = 0; i < this.options.productJSON.variants.length; i++) {\n      const variant = this.options.productJSON.variants[i];\n      const isMatch = productOptions.every((value, index) => variant.options[index] === value);\n\n      if (isMatch) {\n        foundVariant = variant;\n      }\n    }\n\n    return foundVariant;\n  }\n\n  _updateMasterSelect(variant) {\n    if (variant == null) {\n      return;\n    }\n\n    const event = document.createEvent('Event');\n    event.initEvent('change', true, true);\n    this.masterSelect.value = variant.id;\n    this.masterSelect.dispatchEvent(event);\n  }\n\n  _updatePrice(variant) {\n    const {\n      addToCartButton,\n      priceFields,\n      productSettings,\n      unitPrice,\n      taxLine,\n      productDetails\n    } = this.options;\n    const unitPriceAmount = unitPrice ? unitPrice.querySelector('[data-unit-price-amount]') : null;\n    const unitPriceMeasure = unitPrice ? unitPrice.querySelector('[data-unit-price-measure]') : null;\n    const unitPriceQuantity = unitPrice ? unitPrice.querySelector('[data-unit-price-quantity]') : null;\n\n    if (variant) {\n      // strip all of the old data attributes\n      priceFields.forEach(priceField => {\n        const moneyEls = priceField.querySelectorAll('.money');\n        moneyEls.forEach(moneyEl => {\n          for (let j = 0; j < moneyEl.attributes.length; j++) {\n            const attribute = moneyEl.attributes[j];\n\n            if (attribute.name.indexOf('data-') > -1) {\n              moneyEl.removeAttribute(attribute.name);\n            }\n          }\n        });\n      });\n\n      if (taxLine) {\n        if (variant.taxable) {\n          taxLine.classList.remove('hidden');\n        } else {\n          taxLine.classList.add('hidden');\n        }\n      }\n\n      if (variant.available && !document.body.classList.contains('template-password')) {\n        addToCartButton.value = productSettings.addToCartText;\n        addToCartButton.classList.remove('disabled');\n        addToCartButton.removeAttribute('disabled');\n      } else {\n        addToCartButton.value = productSettings.soldOutText;\n        addToCartButton.classList.add('disabled');\n        addToCartButton.setAttribute('disabled', '');\n      }\n\n      if (variant.compare_at_price > variant.price) {\n        priceFields.forEach(priceField => {\n          const moneyEls = priceField.querySelectorAll('.money:not(.original)');\n          moneyEls.forEach(moneyEl => {\n            moneyEl.innerHTML = window.Theme.Currency.formatMoney(variant.price, window.Theme.moneyFormat);\n          });\n        });\n        priceFields.forEach(priceField => {\n          const moneyEls = priceField.querySelectorAll('.money.original');\n          moneyEls.forEach(moneyEl => {\n            moneyEl.innerHTML = window.Theme.Currency.formatMoney(variant.compare_at_price, window.Theme.moneyFormat);\n            moneyEl.classList.add('visible');\n          });\n        });\n      } else {\n        priceFields.forEach(priceField => {\n          const moneyEls = priceField.querySelectorAll('.money');\n          moneyEls.forEach(moneyEl => {\n            moneyEl.innerHTML = window.Theme.Currency.formatMoney(variant.price, window.Theme.moneyFormat);\n          });\n        });\n        priceFields.forEach(priceField => {\n          const moneyEls = priceField.querySelectorAll('.money.original');\n          moneyEls.forEach(moneyEl => {\n            moneyEl.classList.remove('visible');\n          });\n        });\n      }\n\n      if (variant.unit_price) {\n        unitPrice.classList.remove('hidden');\n\n        if (unitPriceQuantity) {\n          unitPriceQuantity.innerHTML = `${variant.unit_price_measurement.quantity_value}${variant.unit_price_measurement.quantity_unit}`;\n        }\n\n        if (unitPriceAmount) {\n          unitPriceAmount.innerHTML = window.Theme.Currency.formatMoney(variant.unit_price, Theme.moneyFormat);\n        }\n\n        if (unitPriceMeasure) {\n          if (variant.unit_price_measurement.reference_value !== 1) {\n            unitPriceMeasure.innerHTML = `${variant.unit_price_measurement.reference_value}${variant.unit_price_measurement.reference_unit}`;\n          } else {\n            unitPriceMeasure.innerHTML = variant.unit_price_measurement.reference_unit;\n          }\n        }\n      } else if (unitPrice) {\n        unitPrice.classList.add('hidden');\n      }\n    } else {\n      // Variant doesn't exist\n      addToCartButton.value = productSettings.unavailableText;\n      addToCartButton.classList.add('disabled');\n      addToCartButton.setAttribute('disabled', '');\n    }\n  }\n\n  _updateImages(variant) {\n    const imageId = __guard__(variant != null ? variant.featured_image : undefined, x => x.id);\n\n    const imagePosition = __guard__(variant != null ? variant.featured_image : undefined, x1 => x1.position) - 1;\n    this.options.productGallery.selectMediaByVariant(variant);\n  }\n\n  _updateHistory(variant) {\n    if (!this.enableHistory || variant == null) {\n      return;\n    }\n\n    const re = new RegExp('([?|&]variant=)[0-9]+(&{0,1})');\n    let {\n      search\n    } = window.location;\n\n    if (search.match(re)) {\n      search = search.replace(re, `$1${variant.id}$2`);\n    } else if (search.indexOf('?') !== -1) {\n      search += `&variant=${variant.id}`;\n    } else {\n      search += `?variant=${variant.id}`;\n    }\n\n    const newUrl = [window.location.protocol, '//', window.location.host, window.location.pathname, search];\n    const variantUrl = newUrl.join('');\n    window.history.replaceState({\n      path: variantUrl\n    }, '', variantUrl);\n  }\n\n  _variantChange(event) {\n    if (this.options.type === 'select') {\n      this._setSelectLabel(event.currentTarget);\n    }\n\n    const productOptions = this.getCurrentOptions();\n    const variant = this.getVariantFromOptions(productOptions);\n\n    this._updateMasterSelect(variant);\n\n    this._updatePrice(variant);\n\n    this._updateImages(variant);\n\n    this._updateHistory(variant);\n\n    this.callbacks.forEach(callback => callback(variant));\n  }\n\n}\n\nfunction __guard__(value, transform) {\n  return typeof value !== 'undefined' && value !== null ? transform(value) : undefined;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL1ZhcmlhbnRIZWxwZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy9WYXJpYW50SGVscGVyLmpzP2QxZTAiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gZmlsdGVyKG5vZGVsaXN0LCBmbikge1xuICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZWxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBub2RlID0gbm9kZWxpc3RbaV07XG5cbiAgICBpZiAoZm4obm9kZSkpIHtcbiAgICAgIGZpbHRlcmVkLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYXJpYW50SGVscGVyIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGFkZFRvQ2FydEJ1dHRvbiA9IG51bGwsIC8vIEFkZCB0byBjYXJ0IGJ1dHRvbiBlbGVtZW50XG4gICAgcHJpY2VGaWVsZHMgPSBudWxsLCAvLyBQcmljZSBmaWVsZCBlbGVtZW50c1xuICAgIHByb2R1Y3RGb3JtID0gbnVsbCwgLy8gUHJvZHVjdCBmb3JtIGVsZW1lbnRcbiAgICBwcm9kdWN0R2FsbGVyeSA9IG51bGwsIC8vIFByb2R1Y3QgZ2FsbGVyeSBvYmplY3RcbiAgICBzZWxlY3RvciA9IG51bGwsIC8vIFZhcmlhbnQgc2VsZWN0IG9yIGlucHV0IGVsZW1lbnRzLFxuICAgIHR5cGUgPSAnc2VsZWN0JywgLy8gVHlwZSBvZiBzZWxlY3RvciBlbGVtZW50XG4gICAgcHJvZHVjdEpTT04gPSBudWxsLCAvLyBQcm9kdWN0IEpTT05cbiAgICBwcm9kdWN0U2V0dGluZ3MgPSBudWxsLCAvLyBQcm9kdWN0IHNldHRpbmdzIEpTT05cbiAgICB1bml0UHJpY2UgPSBudWxsLCAvLyBVbml0IHByaWNlIGVsZW1lbnRcbiAgICB0YXhMaW5lID0gbnVsbCwgLy8gVGF4IGxpbmUgZWxlbWVudFxuICAgIHF1YW50aXR5SW5wdXQgPSBudWxsLCAvLyBRdWFudGl0eSBpbnB1dCBlbGVtZW50XG4gIH0pIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgYWRkVG9DYXJ0QnV0dG9uLFxuICAgICAgcHJpY2VGaWVsZHMsXG4gICAgICBwcm9kdWN0Rm9ybSxcbiAgICAgIHByb2R1Y3RHYWxsZXJ5LFxuICAgICAgc2VsZWN0b3IsXG4gICAgICB0eXBlLFxuICAgICAgcHJvZHVjdEpTT04sXG4gICAgICBwcm9kdWN0U2V0dGluZ3MsXG4gICAgICB1bml0UHJpY2UsXG4gICAgICB0YXhMaW5lLFxuICAgICAgcXVhbnRpdHlJbnB1dCxcbiAgICB9O1xuXG4gICAgdGhpcy5lbmFibGVIaXN0b3J5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXN0ZXJTZWxlY3QgPSB0aGlzLm9wdGlvbnMucHJvZHVjdEZvcm0ucXVlcnlTZWxlY3RvcignLnByb2R1Y3Qtc2VsZWN0Jyk7XG5cbiAgICAvLyBEaXNhYmxlZCBoaXN0b3J5IHN0YXRlIHVwZGF0aW5nIGluIHRoZSBURVxuICAgIGNvbnN0IGlzU2hvcGlmeSA9IHdpbmRvdy5TaG9waWZ5ICYmIHdpbmRvdy5TaG9waWZ5LnByZXZpZXdfaG9zdDtcblxuICAgIGlmICh3aW5kb3cuaGlzdG9yeVxuICAgICAgJiYgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlXG4gICAgICAmJiB0aGlzLm9wdGlvbnMucHJvZHVjdFNldHRpbmdzLmVuYWJsZUhpc3RvcnlcbiAgICAgICYmICFpc1Nob3BpZnkpIHtcbiAgICAgIHRoaXMuZW5hYmxlSGlzdG9yeSA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIG9uVmFyaWFudENoYW5nZShjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSA+PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICBvZmZWYXJpYW50Q2hhbmdlKGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbGJhY2tzLnNwbGljZSh0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSk7XG4gIH1cblxuICBfaW5pdCgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IuZm9yRWFjaChzZWxlY3RvciA9PiB0aGlzLl9zZXRTZWxlY3RMYWJlbChzZWxlY3RvcikpO1xuICAgIH1cbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMub3B0aW9ucy5zZWxlY3Rvci5mb3JFYWNoKHNlbGVjdG9yID0+IHNlbGVjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHRoaXMuX3ZhcmlhbnRDaGFuZ2UoZXZlbnQpKSk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5vcHRpb25zLnNlbGVjdG9yLmZvckVhY2goc2VsZWN0b3IgPT4gc2VsZWN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZXZlbnQgPT4gdGhpcy5fdmFyaWFudENoYW5nZShldmVudCkpKTtcbiAgfVxuXG4gIF9zZXRTZWxlY3RMYWJlbChzZWxlY3QpIHtcbiAgICBpZiAoIXNlbGVjdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyB2YWx1ZSwgcHJldmlvdXNTaWJsaW5nIH0gPSBzZWxlY3Q7XG5cbiAgICBwcmV2aW91c1NpYmxpbmcuaW5uZXJUZXh0ID0gdmFsdWU7XG4gIH1cblxuICBnZXRDdXJyZW50T3B0aW9ucygpIHtcbiAgICBjb25zdCBwcm9kdWN0T3B0aW9ucyA9IFtdO1xuICAgIGxldCBpbnB1dHMgPSB0aGlzLm9wdGlvbnMuc2VsZWN0b3I7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIGlucHV0cyA9IGZpbHRlcihpbnB1dHMsIGlucHV0ID0+IGlucHV0LmNoZWNrZWQpO1xuICAgIH1cblxuICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHByb2R1Y3RPcHRpb25zLnB1c2goaW5wdXQudmFsdWUpKTtcblxuICAgIHJldHVybiBwcm9kdWN0T3B0aW9ucztcbiAgfVxuXG4gIGdldFZhcmlhbnRGcm9tT3B0aW9ucyhwcm9kdWN0T3B0aW9ucykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucHJvZHVjdEpTT04udmFyaWFudHMgPT0gbnVsbCkgeyByZXR1cm47IH1cblxuICAgIGxldCBmb3VuZFZhcmlhbnQgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucHJvZHVjdEpTT04udmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhcmlhbnQgPSB0aGlzLm9wdGlvbnMucHJvZHVjdEpTT04udmFyaWFudHNbaV07XG5cbiAgICAgIGNvbnN0IGlzTWF0Y2ggPSBwcm9kdWN0T3B0aW9ucy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YXJpYW50Lm9wdGlvbnNbaW5kZXhdID09PSB2YWx1ZSk7XG5cbiAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgIGZvdW5kVmFyaWFudCA9IHZhcmlhbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kVmFyaWFudDtcbiAgfVxuXG4gIF91cGRhdGVNYXN0ZXJTZWxlY3QodmFyaWFudCkge1xuICAgIGlmICh2YXJpYW50ID09IG51bGwpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXG4gICAgZXZlbnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcbiAgICB0aGlzLm1hc3RlclNlbGVjdC52YWx1ZSA9IHZhcmlhbnQuaWQ7XG4gICAgdGhpcy5tYXN0ZXJTZWxlY3QuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBfdXBkYXRlUHJpY2UodmFyaWFudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFkZFRvQ2FydEJ1dHRvbixcbiAgICAgIHByaWNlRmllbGRzLFxuICAgICAgcHJvZHVjdFNldHRpbmdzLFxuICAgICAgdW5pdFByaWNlLFxuICAgICAgdGF4TGluZSxcbiAgICAgIHByb2R1Y3REZXRhaWxzLFxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBjb25zdCB1bml0UHJpY2VBbW91bnQgPSB1bml0UHJpY2UgPyB1bml0UHJpY2UucXVlcnlTZWxlY3RvcignW2RhdGEtdW5pdC1wcmljZS1hbW91bnRdJykgOiBudWxsO1xuICAgIGNvbnN0IHVuaXRQcmljZU1lYXN1cmUgPSB1bml0UHJpY2UgPyB1bml0UHJpY2UucXVlcnlTZWxlY3RvcignW2RhdGEtdW5pdC1wcmljZS1tZWFzdXJlXScpIDogbnVsbDtcbiAgICBjb25zdCB1bml0UHJpY2VRdWFudGl0eSA9IHVuaXRQcmljZSA/IHVuaXRQcmljZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS11bml0LXByaWNlLXF1YW50aXR5XScpIDogbnVsbDtcblxuICAgIGlmICh2YXJpYW50KSB7XG4gICAgICAvLyBzdHJpcCBhbGwgb2YgdGhlIG9sZCBkYXRhIGF0dHJpYnV0ZXNcblxuICAgICAgcHJpY2VGaWVsZHMuZm9yRWFjaChwcmljZUZpZWxkID0+IHtcbiAgICAgICAgY29uc3QgbW9uZXlFbHMgPSBwcmljZUZpZWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb25leScpO1xuXG4gICAgICAgIG1vbmV5RWxzLmZvckVhY2gobW9uZXlFbCA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtb25leUVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG1vbmV5RWwuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUubmFtZS5pbmRleE9mKCdkYXRhLScpID4gLTEpIHtcbiAgICAgICAgICAgICAgbW9uZXlFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRheExpbmUpIHtcbiAgICAgICAgaWYgKHZhcmlhbnQudGF4YWJsZSkge1xuICAgICAgICAgIHRheExpbmUuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGF4TGluZS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFudC5hdmFpbGFibGUgJiYgIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCd0ZW1wbGF0ZS1wYXNzd29yZCcpKSB7XG4gICAgICAgIGFkZFRvQ2FydEJ1dHRvbi52YWx1ZSA9IHByb2R1Y3RTZXR0aW5ncy5hZGRUb0NhcnRUZXh0O1xuICAgICAgICBhZGRUb0NhcnRCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgYWRkVG9DYXJ0QnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZFRvQ2FydEJ1dHRvbi52YWx1ZSA9IHByb2R1Y3RTZXR0aW5ncy5zb2xkT3V0VGV4dDtcbiAgICAgICAgYWRkVG9DYXJ0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgICAgIGFkZFRvQ2FydEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFudC5jb21wYXJlX2F0X3ByaWNlID4gdmFyaWFudC5wcmljZSkge1xuICAgICAgICBwcmljZUZpZWxkcy5mb3JFYWNoKHByaWNlRmllbGQgPT4ge1xuICAgICAgICAgIGNvbnN0IG1vbmV5RWxzID0gcHJpY2VGaWVsZC5xdWVyeVNlbGVjdG9yQWxsKCcubW9uZXk6bm90KC5vcmlnaW5hbCknKTtcblxuICAgICAgICAgIG1vbmV5RWxzLmZvckVhY2gobW9uZXlFbCA9PiB7XG4gICAgICAgICAgICBtb25leUVsLmlubmVySFRNTCA9IHdpbmRvdy5UaGVtZS5DdXJyZW5jeS5mb3JtYXRNb25leSh2YXJpYW50LnByaWNlLCB3aW5kb3cuVGhlbWUubW9uZXlGb3JtYXQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcHJpY2VGaWVsZHMuZm9yRWFjaChwcmljZUZpZWxkID0+IHtcbiAgICAgICAgICBjb25zdCBtb25leUVscyA9IHByaWNlRmllbGQucXVlcnlTZWxlY3RvckFsbCgnLm1vbmV5Lm9yaWdpbmFsJyk7XG5cbiAgICAgICAgICBtb25leUVscy5mb3JFYWNoKG1vbmV5RWwgPT4ge1xuICAgICAgICAgICAgbW9uZXlFbC5pbm5lckhUTUwgPSB3aW5kb3cuVGhlbWUuQ3VycmVuY3kuZm9ybWF0TW9uZXkodmFyaWFudC5jb21wYXJlX2F0X3ByaWNlLCB3aW5kb3cuVGhlbWUubW9uZXlGb3JtYXQpO1xuICAgICAgICAgICAgbW9uZXlFbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpY2VGaWVsZHMuZm9yRWFjaChwcmljZUZpZWxkID0+IHtcbiAgICAgICAgICBjb25zdCBtb25leUVscyA9IHByaWNlRmllbGQucXVlcnlTZWxlY3RvckFsbCgnLm1vbmV5Jyk7XG5cbiAgICAgICAgICBtb25leUVscy5mb3JFYWNoKG1vbmV5RWwgPT4ge1xuICAgICAgICAgICAgbW9uZXlFbC5pbm5lckhUTUwgPSB3aW5kb3cuVGhlbWUuQ3VycmVuY3kuZm9ybWF0TW9uZXkodmFyaWFudC5wcmljZSwgd2luZG93LlRoZW1lLm1vbmV5Rm9ybWF0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByaWNlRmllbGRzLmZvckVhY2gocHJpY2VGaWVsZCA9PiB7XG4gICAgICAgICAgY29uc3QgbW9uZXlFbHMgPSBwcmljZUZpZWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb25leS5vcmlnaW5hbCcpO1xuXG4gICAgICAgICAgbW9uZXlFbHMuZm9yRWFjaChtb25leUVsID0+IHtcbiAgICAgICAgICAgIG1vbmV5RWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhbnQudW5pdF9wcmljZSkge1xuICAgICAgICB1bml0UHJpY2UuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgIGlmICh1bml0UHJpY2VRdWFudGl0eSkge1xuICAgICAgICAgIHVuaXRQcmljZVF1YW50aXR5LmlubmVySFRNTCA9IGAke3ZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5xdWFudGl0eV92YWx1ZX0ke3ZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5xdWFudGl0eV91bml0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdFByaWNlQW1vdW50KSB7XG4gICAgICAgICAgdW5pdFByaWNlQW1vdW50LmlubmVySFRNTCA9IHdpbmRvdy5UaGVtZS5DdXJyZW5jeS5mb3JtYXRNb25leSh2YXJpYW50LnVuaXRfcHJpY2UsIFRoZW1lLm1vbmV5Rm9ybWF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bml0UHJpY2VNZWFzdXJlKSB7XG4gICAgICAgICAgaWYgKHZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5yZWZlcmVuY2VfdmFsdWUgIT09IDEpIHtcbiAgICAgICAgICAgIHVuaXRQcmljZU1lYXN1cmUuaW5uZXJIVE1MID0gYCR7dmFyaWFudC51bml0X3ByaWNlX21lYXN1cmVtZW50LnJlZmVyZW5jZV92YWx1ZX0ke3ZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5yZWZlcmVuY2VfdW5pdH1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bml0UHJpY2VNZWFzdXJlLmlubmVySFRNTCA9IHZhcmlhbnQudW5pdF9wcmljZV9tZWFzdXJlbWVudC5yZWZlcmVuY2VfdW5pdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodW5pdFByaWNlKSB7XG4gICAgICAgIHVuaXRQcmljZS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVmFyaWFudCBkb2Vzbid0IGV4aXN0XG4gICAgICBhZGRUb0NhcnRCdXR0b24udmFsdWUgPSBwcm9kdWN0U2V0dGluZ3MudW5hdmFpbGFibGVUZXh0O1xuICAgICAgYWRkVG9DYXJ0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgICBhZGRUb0NhcnRCdXR0b24uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSW1hZ2VzKHZhcmlhbnQpIHtcbiAgICBjb25zdCBpbWFnZUlkID0gX19ndWFyZF9fKHZhcmlhbnQgIT0gbnVsbCA/IHZhcmlhbnQuZmVhdHVyZWRfaW1hZ2UgOiB1bmRlZmluZWQsIHggPT4geC5pZCk7XG4gICAgY29uc3QgaW1hZ2VQb3NpdGlvbiA9IF9fZ3VhcmRfXyh2YXJpYW50ICE9IG51bGwgPyB2YXJpYW50LmZlYXR1cmVkX2ltYWdlIDogdW5kZWZpbmVkLCB4MSA9PiB4MS5wb3NpdGlvbikgLSAxO1xuXG4gICAgdGhpcy5vcHRpb25zLnByb2R1Y3RHYWxsZXJ5LnNlbGVjdE1lZGlhQnlWYXJpYW50KHZhcmlhbnQpO1xuICB9XG5cbiAgX3VwZGF0ZUhpc3RvcnkodmFyaWFudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVIaXN0b3J5IHx8ICh2YXJpYW50ID09IG51bGwpKSB7IHJldHVybjsgfVxuXG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCcoWz98Jl12YXJpYW50PSlbMC05XSsoJnswLDF9KScpO1xuXG4gICAgbGV0IHsgc2VhcmNoIH0gPSB3aW5kb3cubG9jYXRpb247XG5cbiAgICBpZiAoc2VhcmNoLm1hdGNoKHJlKSkge1xuICAgICAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UocmUsIGAkMSR7dmFyaWFudC5pZH0kMmApO1xuICAgIH0gZWxzZSBpZiAoc2VhcmNoLmluZGV4T2YoJz8nKSAhPT0gLTEpIHtcbiAgICAgIHNlYXJjaCArPSBgJnZhcmlhbnQ9JHt2YXJpYW50LmlkfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlYXJjaCArPSBgP3ZhcmlhbnQ9JHt2YXJpYW50LmlkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3VXJsID0gW1xuICAgICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sLFxuICAgICAgJy8vJyxcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgc2VhcmNoLFxuICAgIF07XG5cbiAgICBjb25zdCB2YXJpYW50VXJsID0gbmV3VXJsLmpvaW4oJycpO1xuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IHBhdGg6IHZhcmlhbnRVcmwgfSwgJycsIHZhcmlhbnRVcmwpO1xuICB9XG5cbiAgX3ZhcmlhbnRDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICB0aGlzLl9zZXRTZWxlY3RMYWJlbChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9kdWN0T3B0aW9ucyA9IHRoaXMuZ2V0Q3VycmVudE9wdGlvbnMoKTtcbiAgICBjb25zdCB2YXJpYW50ID0gdGhpcy5nZXRWYXJpYW50RnJvbU9wdGlvbnMocHJvZHVjdE9wdGlvbnMpO1xuXG4gICAgdGhpcy5fdXBkYXRlTWFzdGVyU2VsZWN0KHZhcmlhbnQpO1xuICAgIHRoaXMuX3VwZGF0ZVByaWNlKHZhcmlhbnQpO1xuICAgIHRoaXMuX3VwZGF0ZUltYWdlcyh2YXJpYW50KTtcbiAgICB0aGlzLl91cGRhdGVIaXN0b3J5KHZhcmlhbnQpO1xuICAgIHRoaXMuY2FsbGJhY2tzLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2sodmFyaWFudCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9fZ3VhcmRfXyh2YWx1ZSwgdHJhbnNmb3JtKSB7XG4gIHJldHVybiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkgPyB0cmFuc2Zvcm0odmFsdWUpIDogdW5kZWZpbmVkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQVpBO0FBYUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQWNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBM1JBO0FBQ0E7QUE0UkE7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/VariantHelper.js\n");

/***/ }),

/***/ "./source/scripts/helpers/globals.js":
/*!*******************************************!*\
  !*** ./source/scripts/helpers/globals.js ***!
  \*******************************************/
/***/ (() => {

eval("/**\n * Currency Helpers\n *\n * Current contents\n * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\n *\n */\nwindow.Theme.Currency = (() => {\n  const moneyFormat = '${{amount}}'; // eslint-disable-line no-template-curly-in-string\n\n  function formatMoney(cents, format) {\n    if (typeof cents === 'string') {\n      cents = cents.replace('.', '');\n    }\n\n    let value = '';\n    const placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n    const formatString = format || moneyFormat;\n\n    function formatWithDelimiters(number, precision, thousands, decimal) {\n      thousands = thousands || ',';\n      decimal = decimal || '.';\n\n      if (isNaN(number) || number === null) {\n        return 0;\n      }\n\n      number = (number / 100.0).toFixed(precision);\n      const parts = number.split('.');\n      const dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, `$1${thousands}`);\n      const centsAmount = parts[1] ? decimal + parts[1] : '';\n      return dollarsAmount + centsAmount;\n    }\n\n    switch (formatString.match(placeholderRegex)[1]) {\n      case 'amount':\n        value = formatWithDelimiters(cents, 2);\n        break;\n\n      case 'amount_no_decimals':\n        value = formatWithDelimiters(cents, 0);\n        break;\n\n      case 'amount_with_comma_separator':\n        value = formatWithDelimiters(cents, 2, '.', ',');\n        break;\n\n      case 'amount_no_decimals_with_comma_separator':\n        value = formatWithDelimiters(cents, 0, '.', ',');\n        break;\n\n      case 'amount_no_decimals_with_space_separator':\n        value = formatWithDelimiters(cents, 0, ' ');\n        break;\n\n      case 'amount_with_apostrophe_separator':\n        value = formatWithDelimiters(cents, 2, \"'\");\n        break;\n\n      default:\n        break;\n    }\n\n    return formatString.replace(placeholderRegex, value);\n  }\n\n  return {\n    formatMoney\n  };\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy9nbG9iYWxzLmpzP2VlNjUiXSwibmFtZXMiOlsid2luZG93IiwiVGhlbWUiLCJDdXJyZW5jeSIsIm1vbmV5Rm9ybWF0IiwiZm9ybWF0TW9uZXkiLCJjZW50cyIsImZvcm1hdCIsInJlcGxhY2UiLCJ2YWx1ZSIsInBsYWNlaG9sZGVyUmVnZXgiLCJmb3JtYXRTdHJpbmciLCJmb3JtYXRXaXRoRGVsaW1pdGVycyIsIm51bWJlciIsInByZWNpc2lvbiIsInRob3VzYW5kcyIsImRlY2ltYWwiLCJpc05hTiIsInRvRml4ZWQiLCJwYXJ0cyIsInNwbGl0IiwiZG9sbGFyc0Ftb3VudCIsImNlbnRzQW1vdW50IiwibWF0Y2giXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUFBLE1BQU0sQ0FBQ0MsS0FBUCxDQUFhQyxRQUFiLEdBQXdCLENBQUMsTUFBTTtBQUM3QixRQUFNQyxXQUFXLEdBQUcsYUFBcEIsQ0FENkIsQ0FDTTs7QUFFbkMsV0FBU0MsV0FBVCxDQUFxQkMsS0FBckIsRUFBNEJDLE1BQTVCLEVBQW9DO0FBQ2xDLFFBQUksT0FBT0QsS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUM3QkEsTUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNFLE9BQU4sQ0FBYyxHQUFkLEVBQW1CLEVBQW5CLENBQVI7QUFDRDs7QUFDRCxRQUFJQyxLQUFLLEdBQUcsRUFBWjtBQUNBLFVBQU1DLGdCQUFnQixHQUFHLHFCQUF6QjtBQUNBLFVBQU1DLFlBQVksR0FBR0osTUFBTSxJQUFJSCxXQUEvQjs7QUFFQSxhQUFTUSxvQkFBVCxDQUE4QkMsTUFBOUIsRUFBc0NDLFNBQXRDLEVBQWlEQyxTQUFqRCxFQUE0REMsT0FBNUQsRUFBcUU7QUFDbkVELE1BQUFBLFNBQVMsR0FBR0EsU0FBUyxJQUFJLEdBQXpCO0FBQ0FDLE1BQUFBLE9BQU8sR0FBR0EsT0FBTyxJQUFJLEdBQXJCOztBQUVBLFVBQUlDLEtBQUssQ0FBQ0osTUFBRCxDQUFMLElBQWlCQSxNQUFNLEtBQUssSUFBaEMsRUFBc0M7QUFDcEMsZUFBTyxDQUFQO0FBQ0Q7O0FBRURBLE1BQUFBLE1BQU0sR0FBRyxDQUFDQSxNQUFNLEdBQUcsS0FBVixFQUFpQkssT0FBakIsQ0FBeUJKLFNBQXpCLENBQVQ7QUFFQSxZQUFNSyxLQUFLLEdBQUdOLE1BQU0sQ0FBQ08sS0FBUCxDQUFhLEdBQWIsQ0FBZDtBQUNBLFlBQU1DLGFBQWEsR0FBR0YsS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTWCxPQUFULENBQ3BCLDBCQURvQixFQUVuQixLQUFJTyxTQUFVLEVBRkssQ0FBdEI7QUFJQSxZQUFNTyxXQUFXLEdBQUdILEtBQUssQ0FBQyxDQUFELENBQUwsR0FBV0gsT0FBTyxHQUFHRyxLQUFLLENBQUMsQ0FBRCxDQUExQixHQUFnQyxFQUFwRDtBQUVBLGFBQU9FLGFBQWEsR0FBR0MsV0FBdkI7QUFDRDs7QUFFRCxZQUFRWCxZQUFZLENBQUNZLEtBQWIsQ0FBbUJiLGdCQUFuQixFQUFxQyxDQUFyQyxDQUFSO0FBQ0UsV0FBSyxRQUFMO0FBQ0VELFFBQUFBLEtBQUssR0FBR0csb0JBQW9CLENBQUNOLEtBQUQsRUFBUSxDQUFSLENBQTVCO0FBQ0E7O0FBQ0YsV0FBSyxvQkFBTDtBQUNFRyxRQUFBQSxLQUFLLEdBQUdHLG9CQUFvQixDQUFDTixLQUFELEVBQVEsQ0FBUixDQUE1QjtBQUNBOztBQUNGLFdBQUssNkJBQUw7QUFDRUcsUUFBQUEsS0FBSyxHQUFHRyxvQkFBb0IsQ0FBQ04sS0FBRCxFQUFRLENBQVIsRUFBVyxHQUFYLEVBQWdCLEdBQWhCLENBQTVCO0FBQ0E7O0FBQ0YsV0FBSyx5Q0FBTDtBQUNFRyxRQUFBQSxLQUFLLEdBQUdHLG9CQUFvQixDQUFDTixLQUFELEVBQVEsQ0FBUixFQUFXLEdBQVgsRUFBZ0IsR0FBaEIsQ0FBNUI7QUFDQTs7QUFDRixXQUFLLHlDQUFMO0FBQ0VHLFFBQUFBLEtBQUssR0FBR0csb0JBQW9CLENBQUNOLEtBQUQsRUFBUSxDQUFSLEVBQVcsR0FBWCxDQUE1QjtBQUNBOztBQUNGLFdBQUssa0NBQUw7QUFDRUcsUUFBQUEsS0FBSyxHQUFHRyxvQkFBb0IsQ0FBQ04sS0FBRCxFQUFRLENBQVIsRUFBVyxHQUFYLENBQTVCO0FBQ0E7O0FBQ0Y7QUFDRTtBQXBCSjs7QUF1QkEsV0FBT0ssWUFBWSxDQUFDSCxPQUFiLENBQXFCRSxnQkFBckIsRUFBdUNELEtBQXZDLENBQVA7QUFDRDs7QUFFRCxTQUFPO0FBQ0xKLElBQUFBO0FBREssR0FBUDtBQUdELENBNUR1QixHQUF4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3VycmVuY3kgSGVscGVyc1xuICpcbiAqIEN1cnJlbnQgY29udGVudHNcbiAqIC0gZm9ybWF0TW9uZXkgLSBUYWtlcyBhbiBhbW91bnQgaW4gY2VudHMgYW5kIHJldHVybnMgaXQgYXMgYSBmb3JtYXR0ZWQgZG9sbGFyIHZhbHVlLlxuICpcbiAqL1xuXG53aW5kb3cuVGhlbWUuQ3VycmVuY3kgPSAoKCkgPT4ge1xuICBjb25zdCBtb25leUZvcm1hdCA9ICcke3thbW91bnR9fSc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nXG5cbiAgZnVuY3Rpb24gZm9ybWF0TW9uZXkoY2VudHMsIGZvcm1hdCkge1xuICAgIGlmICh0eXBlb2YgY2VudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjZW50cyA9IGNlbnRzLnJlcGxhY2UoJy4nLCAnJyk7XG4gICAgfVxuICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyUmVnZXggPSAvXFx7XFx7XFxzKihcXHcrKVxccypcXH1cXH0vO1xuICAgIGNvbnN0IGZvcm1hdFN0cmluZyA9IGZvcm1hdCB8fCBtb25leUZvcm1hdDtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdFdpdGhEZWxpbWl0ZXJzKG51bWJlciwgcHJlY2lzaW9uLCB0aG91c2FuZHMsIGRlY2ltYWwpIHtcbiAgICAgIHRob3VzYW5kcyA9IHRob3VzYW5kcyB8fCAnLCc7XG4gICAgICBkZWNpbWFsID0gZGVjaW1hbCB8fCAnLic7XG5cbiAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IG51bWJlciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgbnVtYmVyID0gKG51bWJlciAvIDEwMC4wKS50b0ZpeGVkKHByZWNpc2lvbik7XG5cbiAgICAgIGNvbnN0IHBhcnRzID0gbnVtYmVyLnNwbGl0KCcuJyk7XG4gICAgICBjb25zdCBkb2xsYXJzQW1vdW50ID0gcGFydHNbMF0ucmVwbGFjZShcbiAgICAgICAgLyhcXGQpKD89KFxcZFxcZFxcZCkrKD8hXFxkKSkvZyxcbiAgICAgICAgYCQxJHt0aG91c2FuZHN9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBjZW50c0Ftb3VudCA9IHBhcnRzWzFdID8gZGVjaW1hbCArIHBhcnRzWzFdIDogJyc7XG5cbiAgICAgIHJldHVybiBkb2xsYXJzQW1vdW50ICsgY2VudHNBbW91bnQ7XG4gICAgfVxuXG4gICAgc3dpdGNoIChmb3JtYXRTdHJpbmcubWF0Y2gocGxhY2Vob2xkZXJSZWdleClbMV0pIHtcbiAgICAgIGNhc2UgJ2Ftb3VudCc6XG4gICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Ftb3VudF9ub19kZWNpbWFscyc6XG4gICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcic6XG4gICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDIsICcuJywgJywnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbW91bnRfbm9fZGVjaW1hbHNfd2l0aF9jb21tYV9zZXBhcmF0b3InOlxuICAgICAgICB2YWx1ZSA9IGZvcm1hdFdpdGhEZWxpbWl0ZXJzKGNlbnRzLCAwLCAnLicsICcsJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW1vdW50X25vX2RlY2ltYWxzX3dpdGhfc3BhY2Vfc2VwYXJhdG9yJzpcbiAgICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMCwgJyAnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbW91bnRfd2l0aF9hcG9zdHJvcGhlX3NlcGFyYXRvcic6XG4gICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDIsIFwiJ1wiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0U3RyaW5nLnJlcGxhY2UocGxhY2Vob2xkZXJSZWdleCwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXRNb25leSxcbiAgfTtcbn0pKCk7XG4iXSwiZmlsZSI6Ii4vc291cmNlL3NjcmlwdHMvaGVscGVycy9nbG9iYWxzLmpzLmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/globals.js\n");

/***/ }),

/***/ "./source/scripts/helpers/polyfill-nodelist-foreach.js":
/*!*************************************************************!*\
  !*** ./source/scripts/helpers/polyfill-nodelist-foreach.js ***!
  \*************************************************************/
/***/ (() => {

eval("if (window.NodeList && !NodeList.prototype.forEach) {\n  NodeList.prototype.forEach = Array.prototype.forEach;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy9wb2x5ZmlsbC1ub2RlbGlzdC1mb3JlYWNoLmpzP2E4ZjkiXSwibmFtZXMiOlsid2luZG93IiwiTm9kZUxpc3QiLCJwcm90b3R5cGUiLCJmb3JFYWNoIiwiQXJyYXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLE1BQU0sQ0FBQ0MsUUFBUCxJQUFtQixDQUFDQSxRQUFRLENBQUNDLFNBQVQsQ0FBbUJDLE9BQTNDLEVBQW9EO0FBQ2xERixFQUFBQSxRQUFRLENBQUNDLFNBQVQsQ0FBbUJDLE9BQW5CLEdBQTZCQyxLQUFLLENBQUNGLFNBQU4sQ0FBZ0JDLE9BQTdDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpZiAod2luZG93Lk5vZGVMaXN0ICYmICFOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCkge1xuICBOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoO1xufVxuIl0sImZpbGUiOiIuL3NvdXJjZS9zY3JpcHRzL2hlbHBlcnMvcG9seWZpbGwtbm9kZWxpc3QtZm9yZWFjaC5qcy5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/helpers/polyfill-nodelist-foreach.js\n");

/***/ }),

/***/ "./source/scripts/helpers/youtubeIframeAPIHelper.js":
/*!**********************************************************!*\
  !*** ./source/scripts/helpers/youtubeIframeAPIHelper.js ***!
  \**********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ load)\n/* harmony export */ });\nlet apiReadyResolve = null;\nlet apiReady = null;\nfunction load() {\n  if (apiReady) return apiReady;\n  apiReady = new Promise(resolve => {\n    apiReadyResolve = resolve;\n  });\n\n  if (window.onYouTubeIframeAPIReady) {\n    // If onYouTubeIframeAPIReady is already defined, we need to call it\n    const {\n      onYouTubeIframeAPIReady\n    } = window;\n\n    window.onYouTubeIframeAPIReady = () => {\n      onYouTubeIframeAPIReady();\n      apiReadyResolve();\n    };\n  } else {\n    window.onYouTubeIframeAPIReady = apiReadyResolve;\n  }\n\n  if (!document.querySelector('#youtube-api-script')) {\n    const script = document.createElement('script');\n    script.setAttribute('id', 'youtube-api-script');\n    script.setAttribute('type', 'text/javascript');\n    script.setAttribute('src', 'https://www.youtube.com/iframe_api');\n    document.body.appendChild(script);\n  }\n\n  if (window.YT && YT.loaded) {\n    apiReadyResolve();\n  }\n\n  return apiReady;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL3lvdXR1YmVJZnJhbWVBUElIZWxwZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvaGVscGVycy95b3V0dWJlSWZyYW1lQVBJSGVscGVyLmpzPzJkMWMiXSwic291cmNlc0NvbnRlbnQiOlsibGV0IGFwaVJlYWR5UmVzb2x2ZSA9IG51bGw7XG5sZXQgYXBpUmVhZHkgPSBudWxsO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2FkKCkge1xuICBpZiAoYXBpUmVhZHkpIHJldHVybiBhcGlSZWFkeTtcblxuICBhcGlSZWFkeSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGFwaVJlYWR5UmVzb2x2ZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIGlmICh3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHkpIHtcbiAgICAvLyBJZiBvbllvdVR1YmVJZnJhbWVBUElSZWFkeSBpcyBhbHJlYWR5IGRlZmluZWQsIHdlIG5lZWQgdG8gY2FsbCBpdFxuICAgIGNvbnN0IHsgb25Zb3VUdWJlSWZyYW1lQVBJUmVhZHkgfSA9IHdpbmRvdztcbiAgICB3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHkgPSAoKSA9PiB7XG4gICAgICBvbllvdVR1YmVJZnJhbWVBUElSZWFkeSgpO1xuICAgICAgYXBpUmVhZHlSZXNvbHZlKCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHkgPSBhcGlSZWFkeVJlc29sdmU7XG4gIH1cblxuICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN5b3V0dWJlLWFwaS1zY3JpcHQnKSkge1xuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnaWQnLCAneW91dHViZS1hcGktc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaScpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9XG5cbiAgaWYgKHdpbmRvdy5ZVCAmJiBZVC5sb2FkZWQpIHtcbiAgICBhcGlSZWFkeVJlc29sdmUoKTtcbiAgfVxuXG4gIHJldHVybiBhcGlSZWFkeTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/helpers/youtubeIframeAPIHelper.js\n");

/***/ }),

/***/ "./source/scripts/polyfills/nodeListForEach.js":
/*!*****************************************************!*\
  !*** ./source/scripts/polyfills/nodeListForEach.js ***!
  \*****************************************************/
/***/ (() => {

eval("// https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach\n// Allows use of .forEach on NodeLists in browsers without native support\nif (window.NodeList && !NodeList.prototype.forEach) {\n  NodeList.prototype.forEach = Array.prototype.forEach;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvcG9seWZpbGxzL25vZGVMaXN0Rm9yRWFjaC5qcz9kNTQ0Il0sIm5hbWVzIjpbIndpbmRvdyIsIk5vZGVMaXN0IiwicHJvdG90eXBlIiwiZm9yRWFjaCIsIkFycmF5Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EsSUFBSUEsTUFBTSxDQUFDQyxRQUFQLElBQW1CLENBQUNBLFFBQVEsQ0FBQ0MsU0FBVCxDQUFtQkMsT0FBM0MsRUFBb0Q7QUFDbERGLEVBQUFBLFFBQVEsQ0FBQ0MsU0FBVCxDQUFtQkMsT0FBbkIsR0FBNkJDLEtBQUssQ0FBQ0YsU0FBTixDQUFnQkMsT0FBN0M7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlTGlzdC9mb3JFYWNoXG4vLyBBbGxvd3MgdXNlIG9mIC5mb3JFYWNoIG9uIE5vZGVMaXN0cyBpbiBicm93c2VycyB3aXRob3V0IG5hdGl2ZSBzdXBwb3J0XG5pZiAod2luZG93Lk5vZGVMaXN0ICYmICFOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCkge1xuICBOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoO1xufVxuIl0sImZpbGUiOiIuL3NvdXJjZS9zY3JpcHRzL3BvbHlmaWxscy9ub2RlTGlzdEZvckVhY2guanMuanMiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/polyfills/nodeListForEach.js\n");

/***/ }),

/***/ "./source/scripts/sections/DynamicBlog.js":
/*!************************************************!*\
  !*** ./source/scripts/sections/DynamicBlog.js ***!
  \************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ DynamicBlog)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers/FlickityA11yPatch */ \"./source/scripts/helpers/FlickityA11yPatch.js\");\n\n\n\nclass DynamicBlog {\n  constructor(section) {\n    this.container = 'data-blog-container';\n    this.slide = '.home-blog-post';\n    this.el = section.el;\n    this.container = this.el.querySelector(`[${this.container}]`);\n    this.flickity = null;\n    this._flickity = this._flickity.bind(this);\n\n    this._bindEvents();\n\n    this._flickity();\n\n    this.flickityA11yPatch = new _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_2__.default(this.container);\n  }\n\n  _bindEvents() {\n    window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n  }\n\n  onSectionUnload() {\n    window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n\n    this._destroyFlickity();\n\n    if (this.flickityA11yPatch) {\n      this.flickityA11yPatch.unload();\n    }\n  }\n\n  _flickity() {\n    if (!this.container) return; // If larger than 'small', destroy Flickity and exit\n\n    if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isSmall()) {\n      this._destroyFlickity();\n\n      return;\n    } // If Flickity is initialised, exit\n\n\n    if (this.flickity) {\n      return;\n    }\n\n    this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.container, {\n      cellAlign: 'left',\n      cellSelector: this.slide,\n      contain: true,\n      prevNextButtons: false,\n      pageDots: false,\n      setGallerySize: false\n    });\n\n    this._flickityEvents();\n  }\n\n  _destroyFlickity() {\n    if (this.flickity) {\n      this.flickity.destroy();\n      this.flickity = null;\n      window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(() => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity), 10));\n      this.container.removeEventListener('rimg:load', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n    }\n  }\n\n  _flickityEvents() {\n    // Check for tallest slide at start of transition\n    this.flickity.on('cellSelect', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity)); // Check for tallest slide at end of transition\n\n    this.flickity.on('settle', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n    this.container.addEventListener('rimg:load', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity)); // Sets the Slider to the height of the first slide\n\n    _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity);\n    window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(() => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity), 10));\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljQmxvZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljQmxvZy5qcz85OTdlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBGbGlja2l0eSBmcm9tICdmbGlja2l0eSc7XG5pbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcbmltcG9ydCBGbGlja2l0eUExMXlQYXRjaCBmcm9tICcuLi9oZWxwZXJzL0ZsaWNraXR5QTExeVBhdGNoJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0Jsb2cge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSAnZGF0YS1ibG9nLWNvbnRhaW5lcic7XG4gICAgdGhpcy5zbGlkZSA9ICcuaG9tZS1ibG9nLXBvc3QnO1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbJHt0aGlzLmNvbnRhaW5lcn1dYCk7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG4gICAgdGhpcy5fZmxpY2tpdHkgPSB0aGlzLl9mbGlja2l0eS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICAgIHRoaXMuX2ZsaWNraXR5KCk7XG5cbiAgICB0aGlzLmZsaWNraXR5QTExeVBhdGNoID0gbmV3IEZsaWNraXR5QTExeVBhdGNoKHRoaXMuY29udGFpbmVyKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhlbWVVdGlscy5kZWJvdW5jZSh0aGlzLl9mbGlja2l0eSwgMTAwKSk7XG5cbiAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcblxuICAgIGlmICh0aGlzLmZsaWNraXR5QTExeVBhdGNoKSB7XG4gICAgICB0aGlzLmZsaWNraXR5QTExeVBhdGNoLnVubG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIF9mbGlja2l0eSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAvLyBJZiBsYXJnZXIgdGhhbiAnc21hbGwnLCBkZXN0cm95IEZsaWNraXR5IGFuZCBleGl0XG4gICAgaWYgKCF0aGVtZVV0aWxzLmlzU21hbGwoKSkge1xuICAgICAgdGhpcy5fZGVzdHJveUZsaWNraXR5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgRmxpY2tpdHkgaXMgaW5pdGlhbGlzZWQsIGV4aXRcbiAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxpY2tpdHkgPSBuZXcgRmxpY2tpdHkodGhpcy5jb250YWluZXIsIHtcbiAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxuICAgICAgY2VsbFNlbGVjdG9yOiB0aGlzLnNsaWRlLFxuICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogZmFsc2UsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgICBzZXRHYWxsZXJ5U2l6ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9mbGlja2l0eUV2ZW50cygpO1xuICB9XG5cbiAgX2Rlc3Ryb3lGbGlja2l0eSgpIHtcbiAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgdGhpcy5mbGlja2l0eS5kZXN0cm95KCk7XG4gICAgICB0aGlzLmZsaWNraXR5ID0gbnVsbDtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoZW1lVXRpbHMuZGVib3VuY2UoKCkgPT4gdGhlbWVVdGlscy5mbGlja2l0eVJlc2l6ZSh0aGlzLmZsaWNraXR5KSwgMTApKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsICgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSkpO1xuICAgIH1cbiAgfVxuXG4gIF9mbGlja2l0eUV2ZW50cygpIHtcbiAgICAvLyBDaGVjayBmb3IgdGFsbGVzdCBzbGlkZSBhdCBzdGFydCBvZiB0cmFuc2l0aW9uXG4gICAgdGhpcy5mbGlja2l0eS5vbignY2VsbFNlbGVjdCcsICgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSkpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHRhbGxlc3Qgc2xpZGUgYXQgZW5kIG9mIHRyYW5zaXRpb25cbiAgICB0aGlzLmZsaWNraXR5Lm9uKCdzZXR0bGUnLCAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKHRoaXMuZmxpY2tpdHkpKTtcblxuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsICgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSkpO1xuXG4gICAgLy8gU2V0cyB0aGUgU2xpZGVyIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGZpcnN0IHNsaWRlXG4gICAgdGhlbWVVdGlscy5mbGlja2l0eVJlc2l6ZSh0aGlzLmZsaWNraXR5KTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKCgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSksIDEwKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQS9FQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicBlog.js\n");

/***/ }),

/***/ "./source/scripts/sections/DynamicFeaturedCollection.js":
/*!**************************************************************!*\
  !*** ./source/scripts/sections/DynamicFeaturedCollection.js ***!
  \**************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ DynamicFeaturedCollection)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ProductListItem */ \"./source/scripts/components/ProductListItem.js\");\n/* harmony import */ var _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../helpers/FlickityA11yPatch */ \"./source/scripts/helpers/FlickityA11yPatch.js\");\n\n\n\n\nclass DynamicFeaturedCollection {\n  constructor(section) {\n    this.el = section.el;\n    this._flickity = this._flickity.bind(this);\n    this._destroyFlickity = this._destroyFlickity.bind(this);\n    this.productViews = [];\n    this.container = this.el.querySelector('[data-products-container]');\n    this.slide = '.product-list-item';\n    this.flickity = null;\n\n    this._bindEvents();\n\n    this._setupProducts();\n\n    this._flickity();\n\n    this.flickityA11yPatch = new _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_3__.default(this.container);\n  }\n\n  onSectionUnload() {\n    window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n\n    this._destroyFlickity();\n\n    if (this.flickityA11yPatch) {\n      this.flickityA11yPatch.unload();\n    }\n\n    if (this.productViews.length) {\n      // Destroy existing view listeners\n      this.productViews.map(productView => {\n        productView.remove();\n      });\n    }\n  }\n\n  _bindEvents() {\n    window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n  }\n\n  _setupProducts() {\n    this.el.querySelectorAll('.product-list-item').forEach(productItem => this.productViews.push(new _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__.default({\n      el: productItem\n    })));\n  }\n\n  _flickity() {\n    if (!this.container) {\n      return;\n    } // If larger than 'small', destroy Flickity and exit\n\n\n    if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isSmall()) {\n      this._destroyFlickity();\n\n      return;\n    } // If Flickity is initialised, exit\n\n\n    if (this.flickity) {\n      return;\n    }\n\n    this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.container, {\n      cellAlign: 'left',\n      cellSelector: this.slide,\n      contain: true,\n      prevNextButtons: false,\n      pageDots: false,\n      setGallerySize: false\n    });\n\n    this._flickityEvents();\n  }\n\n  _destroyFlickity() {\n    if (this.flickity) {\n      this.flickity.destroy();\n      this.flickity = null;\n      window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(() => {\n        const event = new Event('home-featured-collections-height', {\n          bubbles: true,\n          cancelable: true\n        });\n        this.container.dispatchEvent(event);\n      }, 10));\n\n      if (this.flickity) {\n        this.container.removeEventListener('rimg:load', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n      }\n\n      this.container.removeEventListener('home-featured-collections-height', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n    }\n  }\n\n  _flickityEvents() {\n    const event = new Event('home-featured-collections-height', {\n      bubbles: true,\n      cancelable: true\n    }); // Check for tallest slide at start of transition\n\n    this.flickity.on('cellSelect', () => this.container.dispatchEvent(event)); // Check for tallest slide at end of transition\n\n    this.flickity.on('settle', () => this.container.dispatchEvent(event));\n\n    if (this.flickity) {\n      this.container.addEventListener('rimg:load', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity));\n    }\n\n    this.container.addEventListener('home-featured-collections-height', () => _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.flickityResize(this.flickity)); // Sets the Slider to the height of the first slide\n\n    this.container.dispatchEvent(event);\n    window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(() => this.container.dispatchEvent(event), 10));\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljRmVhdHVyZWRDb2xsZWN0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNGZWF0dXJlZENvbGxlY3Rpb24uanM/ZTUyYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5pbXBvcnQgUHJvZHVjdExpc3RJdGVtIGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdExpc3RJdGVtJztcbmltcG9ydCBGbGlja2l0eUExMXlQYXRjaCBmcm9tICcuLi9oZWxwZXJzL0ZsaWNraXR5QTExeVBhdGNoJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZlYXR1cmVkQ29sbGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLl9mbGlja2l0eSA9IHRoaXMuX2ZsaWNraXR5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fZGVzdHJveUZsaWNraXR5ID0gdGhpcy5fZGVzdHJveUZsaWNraXR5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5wcm9kdWN0Vmlld3MgPSBbXTtcbiAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdHMtY29udGFpbmVyXScpO1xuICAgIHRoaXMuc2xpZGUgPSAnLnByb2R1Y3QtbGlzdC1pdGVtJztcbiAgICB0aGlzLmZsaWNraXR5ID0gbnVsbDtcblxuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgICB0aGlzLl9zZXR1cFByb2R1Y3RzKCk7XG4gICAgdGhpcy5fZmxpY2tpdHkoKTtcblxuICAgIHRoaXMuZmxpY2tpdHlBMTF5UGF0Y2ggPSBuZXcgRmxpY2tpdHlBMTF5UGF0Y2godGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcblxuICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuXG4gICAgaWYgKHRoaXMuZmxpY2tpdHlBMTF5UGF0Y2gpIHtcbiAgICAgIHRoaXMuZmxpY2tpdHlBMTF5UGF0Y2gudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvZHVjdFZpZXdzLmxlbmd0aCkge1xuICAgICAgLy8gRGVzdHJveSBleGlzdGluZyB2aWV3IGxpc3RlbmVyc1xuICAgICAgdGhpcy5wcm9kdWN0Vmlld3MubWFwKChwcm9kdWN0VmlldykgPT4ge1xuICAgICAgICBwcm9kdWN0Vmlldy5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcbiAgfVxuXG4gIF9zZXR1cFByb2R1Y3RzKCkge1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLnByb2R1Y3QtbGlzdC1pdGVtJykuZm9yRWFjaChwcm9kdWN0SXRlbSA9PiB0aGlzLnByb2R1Y3RWaWV3cy5wdXNoKG5ldyBQcm9kdWN0TGlzdEl0ZW0oeyBlbDogcHJvZHVjdEl0ZW0gfSkpKTtcbiAgfVxuXG4gIF9mbGlja2l0eSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7IHJldHVybjsgfVxuXG4gICAgLy8gSWYgbGFyZ2VyIHRoYW4gJ3NtYWxsJywgZGVzdHJveSBGbGlja2l0eSBhbmQgZXhpdFxuICAgIGlmICghdGhlbWVVdGlscy5pc1NtYWxsKCkpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIEZsaWNraXR5IGlzIGluaXRpYWxpc2VkLCBleGl0XG4gICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KHRoaXMuY29udGFpbmVyLCB7XG4gICAgICBjZWxsQWxpZ246ICdsZWZ0JyxcbiAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zbGlkZSxcbiAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICBwcmV2TmV4dEJ1dHRvbnM6IGZhbHNlLFxuICAgICAgcGFnZURvdHM6IGZhbHNlLFxuICAgICAgc2V0R2FsbGVyeVNpemU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fZmxpY2tpdHlFdmVudHMoKTtcbiAgfVxuXG4gIF9kZXN0cm95RmxpY2tpdHkoKSB7XG4gICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHRoaXMuZmxpY2tpdHkuZGVzdHJveSgpO1xuICAgICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2hvbWUtZmVhdHVyZWQtY29sbGVjdGlvbnMtaGVpZ2h0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH0sIDEwKSk7XG4gICAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdyaW1nOmxvYWQnLCAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKHRoaXMuZmxpY2tpdHkpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignaG9tZS1mZWF0dXJlZC1jb2xsZWN0aW9ucy1oZWlnaHQnLCAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKHRoaXMuZmxpY2tpdHkpKTtcbiAgICB9XG4gIH1cblxuICBfZmxpY2tpdHlFdmVudHMoKSB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2hvbWUtZmVhdHVyZWQtY29sbGVjdGlvbnMtaGVpZ2h0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHRhbGxlc3Qgc2xpZGUgYXQgc3RhcnQgb2YgdHJhbnNpdGlvblxuICAgIHRoaXMuZmxpY2tpdHkub24oJ2NlbGxTZWxlY3QnLCAoKSA9PiB0aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KGV2ZW50KSk7XG5cbiAgICAvLyBDaGVjayBmb3IgdGFsbGVzdCBzbGlkZSBhdCBlbmQgb2YgdHJhbnNpdGlvblxuICAgIHRoaXMuZmxpY2tpdHkub24oJ3NldHRsZScsICgpID0+IHRoaXMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpKTtcblxuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdyaW1nOmxvYWQnLCAoKSA9PiB0aGVtZVV0aWxzLmZsaWNraXR5UmVzaXplKHRoaXMuZmxpY2tpdHkpKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdob21lLWZlYXR1cmVkLWNvbGxlY3Rpb25zLWhlaWdodCcsICgpID0+IHRoZW1lVXRpbHMuZmxpY2tpdHlSZXNpemUodGhpcy5mbGlja2l0eSkpO1xuXG4gICAgLy8gU2V0cyB0aGUgU2xpZGVyIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGZpcnN0IHNsaWRlXG4gICAgdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhlbWVVdGlscy5kZWJvdW5jZSgoKSA9PiB0aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KGV2ZW50KSwgMTApKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBekdBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicFeaturedCollection.js\n");

/***/ }),

/***/ "./source/scripts/sections/DynamicMasonry.js":
/*!***************************************************!*\
  !*** ./source/scripts/sections/DynamicMasonry.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ DynamicMasonry)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryVideo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryVideo */ \"./source/scripts/components/MasonryVideo.js\");\n\nclass DynamicMasonry {\n  constructor(section) {\n    this.el = section.el;\n    this.masonryVideo = null;\n    this.urls = this.el.querySelectorAll('[data-masonry-url]');\n    this.videos = this.el.querySelectorAll('[data-masonry-video]');\n    this._redirectMasonryFeatures = this._redirectMasonryFeatures.bind(this);\n    this._masonryVideo = this._masonryVideo.bind(this);\n\n    this._bindEvents();\n  }\n\n  _bindEvents() {\n    this.urls.forEach(url => url.addEventListener('click', event => this._redirectMasonryFeatures(event)));\n    this.videos.forEach(video => video.addEventListener('click', event => this._masonryVideo(event)));\n  }\n\n  onSectionUnload() {\n    if (this.masonryVideo != null) {\n      this.masonryVideo.remove();\n    }\n\n    this.urls.forEach(url => url.removeEventListener('click', event => this._redirectMasonryFeatures(event)));\n    this.videos.forEach(video => video.removeEventListener('click', event => this._masonryVideo(event)));\n  }\n\n  _redirectMasonryFeatures(e) {\n    const {\n      currentTarget\n    } = e;\n    if (!this.el.contains(currentTarget)) return;\n    const {\n      masonryUrl\n    } = currentTarget.dataset;\n\n    if (masonryUrl !== '') {\n      window.location = masonryUrl;\n    }\n  }\n\n  _masonryVideo(event) {\n    this.masonryVideo = new _components_MasonryVideo__WEBPACK_IMPORTED_MODULE_0__.default(this.el, event);\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljTWFzb25yeS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljTWFzb25yeS5qcz84NTFjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXNvbnJ5VmlkZW8gZnJvbSAnLi4vY29tcG9uZW50cy9NYXNvbnJ5VmlkZW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEeW5hbWljTWFzb25yeSB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLm1hc29ucnlWaWRlbyA9IG51bGw7XG4gICAgdGhpcy51cmxzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1tYXNvbnJ5LXVybF0nKTtcbiAgICB0aGlzLnZpZGVvcyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbWFzb25yeS12aWRlb10nKTtcblxuICAgIHRoaXMuX3JlZGlyZWN0TWFzb25yeUZlYXR1cmVzID0gdGhpcy5fcmVkaXJlY3RNYXNvbnJ5RmVhdHVyZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9tYXNvbnJ5VmlkZW8gPSB0aGlzLl9tYXNvbnJ5VmlkZW8uYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMudXJscy5mb3JFYWNoKHVybCA9PiB1cmwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLl9yZWRpcmVjdE1hc29ucnlGZWF0dXJlcyhldmVudCkpKTtcbiAgICB0aGlzLnZpZGVvcy5mb3JFYWNoKHZpZGVvID0+IHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gdGhpcy5fbWFzb25yeVZpZGVvKGV2ZW50KSkpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIGlmICh0aGlzLm1hc29ucnlWaWRlbyAhPSBudWxsKSB7XG4gICAgICB0aGlzLm1hc29ucnlWaWRlby5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy51cmxzLmZvckVhY2godXJsID0+IHVybC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuX3JlZGlyZWN0TWFzb25yeUZlYXR1cmVzKGV2ZW50KSkpO1xuICAgIHRoaXMudmlkZW9zLmZvckVhY2godmlkZW8gPT4gdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLl9tYXNvbnJ5VmlkZW8oZXZlbnQpKSk7XG4gIH1cblxuICBfcmVkaXJlY3RNYXNvbnJ5RmVhdHVyZXMoZSkge1xuICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZTtcblxuICAgIGlmICghdGhpcy5lbC5jb250YWlucyhjdXJyZW50VGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBtYXNvbnJ5VXJsIH0gPSBjdXJyZW50VGFyZ2V0LmRhdGFzZXQ7XG5cbiAgICBpZiAobWFzb25yeVVybCAhPT0gJycpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IG1hc29ucnlVcmw7XG4gICAgfVxuICB9XG5cbiAgX21hc29ucnlWaWRlbyhldmVudCkge1xuICAgIHRoaXMubWFzb25yeVZpZGVvID0gbmV3IE1hc29ucnlWaWRlbyh0aGlzLmVsLCBldmVudCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6Q0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicMasonry.js\n");

/***/ }),

/***/ "./source/scripts/sections/DynamicPromotion.js":
/*!*****************************************************!*\
  !*** ./source/scripts/sections/DynamicPromotion.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ DynamicPromotion)\n/* harmony export */ });\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\nclass DynamicPromotion {\n  constructor(section) {\n    this.el = section.el;\n    this.adjustHeight = this.adjustHeight.bind(this);\n    this._headerOffset = this._headerOffset.bind(this);\n    this.header = document.querySelector('[data-section-header]');\n    this.parent = this.el.parentElement;\n    this.wrapper = this.el.querySelector('[data-promotion-wrapper]');\n    this.content = this.el.querySelector('[data-promotion-content]');\n    this.image = this.el.querySelector('[data-promotion-image]');\n    this.imageContainer = this.el.querySelector('[data-promotion-image-container]');\n    this.isFullScreen = section.data.layout === 'full-screen';\n\n    this._bindEvents();\n\n    return this.adjustHeight();\n  }\n\n  remove() {\n    window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.debounce(this.adjustHeight, 100));\n    window.removeEventListener('scroll', _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.debounce(this.adjustHeight, 10));\n  }\n\n  onSectionUnload() {\n    this.remove();\n  }\n\n  onSectionReorder() {\n    return this._headerOffset();\n  }\n\n  adjustHeight() {\n    const heights = []; // An image can be shorter than text\n\n    if (this.imageContainer) {\n      if (this.content) {\n        heights.push(this.content.getBoundingClientRect().height);\n      }\n\n      if (this.image) {\n        heights.push(this.image.getBoundingClientRect().height);\n      }\n\n      const minHeight = Math.max.apply(null, heights);\n      this.imageContainer.style.minHeight = `${minHeight}px`;\n    }\n\n    return this._headerOffset();\n  }\n\n  _bindEvents() {\n    window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.debounce(this.adjustHeight, 100));\n    window.addEventListener('scroll', _themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.debounce(this.adjustHeight, 10));\n  } // Adjust container to compensate for header height if its in viewport\n\n\n  _headerOffset() {\n    let newHeight;\n\n    if (!this.isFullScreen || !this.header) {\n      return;\n    }\n\n    const headerHeight = this.header.getBoundingClientRect().height;\n    const headerScrolledHeight = this.header.querySelector('.navigation').getBoundingClientRect().height;\n    const isFirstChild = this.parent.previousElementSibling === null;\n    const isStickyEnabled = document.body.classList.contains('sticky-header');\n    const maxHeight = window.innerHeight;\n\n    if (_themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.isMedium()) {\n      this.wrapper.style.height = '';\n    } // If is first child, always make it full screen minus header height\n\n\n    if (isFirstChild) {\n      newHeight = maxHeight - headerHeight;\n      this.wrapper.style.height = `${newHeight}px`; // Otherwise, if its larger than tablet, and sticky is enabled, take off nav height\n    }\n\n    if (!_themeUtils__WEBPACK_IMPORTED_MODULE_0__.default.isMedium() && isStickyEnabled) {\n      newHeight = maxHeight - headerScrolledHeight;\n      this.wrapper.style.height = `${newHeight}px`; // Is not tablet, and header is not sticky, remove offset\n    }\n\n    this.wrapper.style.height = '';\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljUHJvbW90aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNQcm9tb3Rpb24uanM/ODA0MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY1Byb21vdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLmFkanVzdEhlaWdodCA9IHRoaXMuYWRqdXN0SGVpZ2h0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5faGVhZGVyT2Zmc2V0ID0gdGhpcy5faGVhZGVyT2Zmc2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5oZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zZWN0aW9uLWhlYWRlcl0nKTtcbiAgICB0aGlzLnBhcmVudCA9IHRoaXMuZWwucGFyZW50RWxlbWVudDtcbiAgICB0aGlzLndyYXBwZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb21vdGlvbi13cmFwcGVyXScpO1xuICAgIHRoaXMuY29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvbW90aW9uLWNvbnRlbnRdJyk7XG4gICAgdGhpcy5pbWFnZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvbW90aW9uLWltYWdlXScpO1xuICAgIHRoaXMuaW1hZ2VDb250YWluZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb21vdGlvbi1pbWFnZS1jb250YWluZXJdJyk7XG5cbiAgICB0aGlzLmlzRnVsbFNjcmVlbiA9IHNlY3Rpb24uZGF0YS5sYXlvdXQgPT09ICdmdWxsLXNjcmVlbic7XG5cbiAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuYWRqdXN0SGVpZ2h0KCk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoZW1lVXRpbHMuZGVib3VuY2UodGhpcy5hZGp1c3RIZWlnaHQsIDEwMCkpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuYWRqdXN0SGVpZ2h0LCAxMCkpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gIH1cblxuICBvblNlY3Rpb25SZW9yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJPZmZzZXQoKTtcbiAgfVxuXG4gIGFkanVzdEhlaWdodCgpIHtcbiAgICBjb25zdCBoZWlnaHRzID0gW107XG5cbiAgICAvLyBBbiBpbWFnZSBjYW4gYmUgc2hvcnRlciB0aGFuIHRleHRcbiAgICBpZiAodGhpcy5pbWFnZUNvbnRhaW5lcikge1xuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICBoZWlnaHRzLnB1c2godGhpcy5jb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmltYWdlKSB7XG4gICAgICAgIGhlaWdodHMucHVzaCh0aGlzLmltYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGhlaWdodHMpO1xuXG4gICAgICB0aGlzLmltYWdlQ29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IGAke21pbkhlaWdodH1weGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlck9mZnNldCgpO1xuICB9XG5cbiAgX2JpbmRFdmVudHMoKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoZW1lVXRpbHMuZGVib3VuY2UodGhpcy5hZGp1c3RIZWlnaHQsIDEwMCkpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuYWRqdXN0SGVpZ2h0LCAxMCkpO1xuICB9XG5cbiAgLy8gQWRqdXN0IGNvbnRhaW5lciB0byBjb21wZW5zYXRlIGZvciBoZWFkZXIgaGVpZ2h0IGlmIGl0cyBpbiB2aWV3cG9ydFxuICBfaGVhZGVyT2Zmc2V0KCkge1xuICAgIGxldCBuZXdIZWlnaHQ7XG4gICAgaWYgKCF0aGlzLmlzRnVsbFNjcmVlbiB8fCAhdGhpcy5oZWFkZXIpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgY29uc3QgaGVhZGVyU2Nyb2xsZWRIZWlnaHQgPSB0aGlzLmhlYWRlci5xdWVyeVNlbGVjdG9yKCcubmF2aWdhdGlvbicpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBjb25zdCBpc0ZpcnN0Q2hpbGQgPSB0aGlzLnBhcmVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID09PSBudWxsO1xuICAgIGNvbnN0IGlzU3RpY2t5RW5hYmxlZCA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGlja3ktaGVhZGVyJyk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgaWYgKHRoZW1lVXRpbHMuaXNNZWRpdW0oKSkge1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIH1cblxuICAgIC8vIElmIGlzIGZpcnN0IGNoaWxkLCBhbHdheXMgbWFrZSBpdCBmdWxsIHNjcmVlbiBtaW51cyBoZWFkZXIgaGVpZ2h0XG4gICAgaWYgKGlzRmlyc3RDaGlsZCkge1xuICAgICAgbmV3SGVpZ2h0ID0gbWF4SGVpZ2h0IC0gaGVhZGVySGVpZ2h0O1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9IGAke25ld0hlaWdodH1weGA7XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgaWYgaXRzIGxhcmdlciB0aGFuIHRhYmxldCwgYW5kIHN0aWNreSBpcyBlbmFibGVkLCB0YWtlIG9mZiBuYXYgaGVpZ2h0XG4gICAgfSBpZiAoIXRoZW1lVXRpbHMuaXNNZWRpdW0oKSAmJiBpc1N0aWNreUVuYWJsZWQpIHtcbiAgICAgIG5ld0hlaWdodCA9IG1heEhlaWdodCAtIGhlYWRlclNjcm9sbGVkSGVpZ2h0O1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmhlaWdodCA9IGAke25ld0hlaWdodH1weGA7XG5cbiAgICAgIC8vIElzIG5vdCB0YWJsZXQsIGFuZCBoZWFkZXIgaXMgbm90IHN0aWNreSwgcmVtb3ZlIG9mZnNldFxuICAgIH1cblxuICAgIHRoaXMud3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnJztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkZBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicPromotion.js\n");

/***/ }),

/***/ "./source/scripts/sections/DynamicSlideshow.js":
/*!*****************************************************!*\
  !*** ./source/scripts/sections/DynamicSlideshow.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ DynamicSlideshow)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers/FlickityA11yPatch */ \"./source/scripts/helpers/FlickityA11yPatch.js\");\n\n\nclass DynamicSlideshow {\n  constructor(section) {\n    this.el = section.el;\n    this.slideshow = this.el.querySelector('[data-slideshow]');\n    this.flickity = null;\n    this.slideCount = this.slideshow.querySelectorAll('[data-slideshow-slide]').length;\n    this.autoplay = section.data.autoplay ? section.data.autoplay : null;\n    this.autoplayHoverPause = this.autoplay ? section.data.autoplayHoverPause : false;\n    this.autoplayDelay = this.autoplay ? section.data.autoplayDelay * 1000 : null;\n    this._resizeFlickity = this._resizeFlickity.bind(this);\n\n    this._setupSlideshow();\n\n    this.flickityA11yPatch = new _helpers_FlickityA11yPatch__WEBPACK_IMPORTED_MODULE_1__.default(this.slideshow);\n  }\n\n  onSectionUnload() {\n    if (this.flickity) {\n      this.slideshow.removeEventListener('rimg:load', this._resizeFlickity);\n      this.flickity.destroy();\n      this.flickity = null;\n    }\n\n    if (this.flickityA11yPatch) {\n      this.flickityA11yPatch.unload();\n    }\n  }\n\n  onSectionBlockSelect(block) {\n    if (!this.flickity) {\n      return;\n    }\n\n    const slideIndex = parseInt(block.el.dataset.slideIndex, 10);\n    this.flickity.select(slideIndex, true);\n\n    if (this.autoplay) {\n      this.flickity.stopPlayer();\n    }\n  }\n\n  onSectionBlockDeselect(block) {\n    if (this.autoplay) {\n      this.flickity.playPlayer();\n    }\n  }\n\n  _setupSlideshow() {\n    if (this.slideCount > 1) {\n      this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.slideshow, {\n        adaptiveHeight: true,\n        autoPlay: this.autoplayDelay,\n        cellSelector: '[data-slideshow-slide]',\n        pageDots: true,\n        pauseAutoPlayOnHover: this.autoplayHoverPause,\n        prevNextButtons: true,\n        resize: true,\n        wrapAround: true,\n        draggable: true\n      });\n      this.slideshow.addEventListener('rimg:load', this._resizeFlickity);\n    }\n  }\n\n  _resizeFlickity() {\n    if (this.flickity) {\n      this.flickity.resize();\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljU2xpZGVzaG93LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNTbGlkZXNob3cuanM/MzM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IEZsaWNraXR5QTExeVBhdGNoIGZyb20gJy4uL2hlbHBlcnMvRmxpY2tpdHlBMTF5UGF0Y2gnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEeW5hbWljU2xpZGVzaG93IHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuc2xpZGVzaG93ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zbGlkZXNob3ddJyk7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG4gICAgdGhpcy5zbGlkZUNvdW50ID0gdGhpcy5zbGlkZXNob3cucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc2xpZGVzaG93LXNsaWRlXScpLmxlbmd0aDtcbiAgICB0aGlzLmF1dG9wbGF5ID0gc2VjdGlvbi5kYXRhLmF1dG9wbGF5ID8gc2VjdGlvbi5kYXRhLmF1dG9wbGF5IDogbnVsbDtcbiAgICB0aGlzLmF1dG9wbGF5SG92ZXJQYXVzZSA9IHRoaXMuYXV0b3BsYXkgPyBzZWN0aW9uLmRhdGEuYXV0b3BsYXlIb3ZlclBhdXNlIDogZmFsc2U7XG4gICAgdGhpcy5hdXRvcGxheURlbGF5ID0gdGhpcy5hdXRvcGxheSA/IHNlY3Rpb24uZGF0YS5hdXRvcGxheURlbGF5ICogMTAwMCA6IG51bGw7XG4gICAgdGhpcy5fcmVzaXplRmxpY2tpdHkgPSB0aGlzLl9yZXNpemVGbGlja2l0eS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fc2V0dXBTbGlkZXNob3coKTtcblxuICAgIHRoaXMuZmxpY2tpdHlBMTF5UGF0Y2ggPSBuZXcgRmxpY2tpdHlBMTF5UGF0Y2godGhpcy5zbGlkZXNob3cpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLnNsaWRlc2hvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyaW1nOmxvYWQnLCB0aGlzLl9yZXNpemVGbGlja2l0eSk7XG4gICAgICB0aGlzLmZsaWNraXR5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsaWNraXR5QTExeVBhdGNoKSB7XG4gICAgICB0aGlzLmZsaWNraXR5QTExeVBhdGNoLnVubG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VjdGlvbkJsb2NrU2VsZWN0KGJsb2NrKSB7XG4gICAgaWYgKCF0aGlzLmZsaWNraXR5KSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHNsaWRlSW5kZXggPSBwYXJzZUludChibG9jay5lbC5kYXRhc2V0LnNsaWRlSW5kZXgsIDEwKTtcbiAgICB0aGlzLmZsaWNraXR5LnNlbGVjdChzbGlkZUluZGV4LCB0cnVlKTtcbiAgICBpZiAodGhpcy5hdXRvcGxheSkge1xuICAgICAgdGhpcy5mbGlja2l0eS5zdG9wUGxheWVyKCk7XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uQmxvY2tEZXNlbGVjdChibG9jaykge1xuICAgIGlmICh0aGlzLmF1dG9wbGF5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5LnBsYXlQbGF5ZXIoKTtcbiAgICB9XG4gIH1cblxuICBfc2V0dXBTbGlkZXNob3coKSB7XG4gICAgaWYgKHRoaXMuc2xpZGVDb3VudCA+IDEpIHtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBuZXcgRmxpY2tpdHkodGhpcy5zbGlkZXNob3csIHtcbiAgICAgICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgICAgIGF1dG9QbGF5OiB0aGlzLmF1dG9wbGF5RGVsYXksXG4gICAgICAgIGNlbGxTZWxlY3RvcjogJ1tkYXRhLXNsaWRlc2hvdy1zbGlkZV0nLFxuICAgICAgICBwYWdlRG90czogdHJ1ZSxcbiAgICAgICAgcGF1c2VBdXRvUGxheU9uSG92ZXI6IHRoaXMuYXV0b3BsYXlIb3ZlclBhdXNlLFxuICAgICAgICBwcmV2TmV4dEJ1dHRvbnM6IHRydWUsXG4gICAgICAgIHJlc2l6ZTogdHJ1ZSxcbiAgICAgICAgd3JhcEFyb3VuZDogdHJ1ZSxcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNsaWRlc2hvdy5hZGRFdmVudExpc3RlbmVyKCdyaW1nOmxvYWQnLCB0aGlzLl9yZXNpemVGbGlja2l0eSk7XG4gICAgfVxuICB9XG5cbiAgX3Jlc2l6ZUZsaWNraXR5KCkge1xuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5LnJlc2l6ZSgpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBakVBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicSlideshow.js\n");

/***/ }),

/***/ "./source/scripts/sections/DynamicTestimonials.js":
/*!********************************************************!*\
  !*** ./source/scripts/sections/DynamicTestimonials.js ***!
  \********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ DynamicTestimonials)\n/* harmony export */ });\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flickity */ \"./node_modules/flickity/js/index.js\");\n/* harmony import */ var flickity__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flickity__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\n\nclass DynamicTestimonials {\n  constructor(section) {\n    this.el = section.el;\n    this._flickity = this._flickity.bind(this);\n    this.container = 'data-testimonials-container';\n    this.slide = 'data-testimonial-item';\n    this.testimonialsContainer = this.el.querySelector(`[${this.container}]`);\n    this.flickity = null;\n\n    this._flickity();\n\n    this._bindEvents();\n  }\n\n  onSectionUnload() {\n    this.remove();\n  }\n\n  remove() {\n    window.removeEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n\n    this._destroyFlickity();\n  }\n\n  _bindEvents() {\n    window.addEventListener('resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._flickity, 100));\n  }\n\n  _flickity() {\n    if (!this.testimonialsContainer) return; // If larger than 'small', destroy Flickity and exit\n\n    if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isSmall()) {\n      this._destroyFlickity();\n\n      return;\n    } // If Flickity is initialised, exit\n\n\n    if (this.flickity) {\n      return;\n    }\n\n    this.flickity = new (flickity__WEBPACK_IMPORTED_MODULE_0___default())(this.testimonialsContainer, {\n      cellAlign: 'center',\n      cellSelector: `[${this.slide}]`,\n      contain: true,\n      prevNextButtons: false,\n      pageDots: false\n    });\n  }\n\n  _destroyFlickity() {\n    if (this.flickity) {\n      this.flickity.destroy();\n      this.flickity = null;\n    }\n  }\n\n  onSectionBlockSelect(block) {\n    if (!this.flickity) {\n      return;\n    }\n\n    const {\n      index\n    } = block.el.dataset;\n    this.flickity.select(index, true);\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljVGVzdGltb25pYWxzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNUZXN0aW1vbmlhbHMuanM/MDIwZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNUZXN0aW1vbmlhbHMge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5lbCA9IHNlY3Rpb24uZWw7XG4gICAgdGhpcy5fZmxpY2tpdHkgPSB0aGlzLl9mbGlja2l0eS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY29udGFpbmVyID0gJ2RhdGEtdGVzdGltb25pYWxzLWNvbnRhaW5lcic7XG4gICAgdGhpcy5zbGlkZSA9ICdkYXRhLXRlc3RpbW9uaWFsLWl0ZW0nO1xuICAgIHRoaXMudGVzdGltb25pYWxzQ29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbJHt0aGlzLmNvbnRhaW5lcn1dYCk7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG5cbiAgICB0aGlzLl9mbGlja2l0eSgpO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICB9XG5cbiAgcmVtb3ZlKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcbiAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX2ZsaWNraXR5LCAxMDApKTtcbiAgfVxuXG4gIF9mbGlja2l0eSgpIHtcbiAgICBpZiAoIXRoaXMudGVzdGltb25pYWxzQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAvLyBJZiBsYXJnZXIgdGhhbiAnc21hbGwnLCBkZXN0cm95IEZsaWNraXR5IGFuZCBleGl0XG4gICAgaWYgKCF0aGVtZVV0aWxzLmlzU21hbGwoKSkge1xuICAgICAgdGhpcy5fZGVzdHJveUZsaWNraXR5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgRmxpY2tpdHkgaXMgaW5pdGlhbGlzZWQsIGV4aXRcbiAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxpY2tpdHkgPSBuZXcgRmxpY2tpdHkodGhpcy50ZXN0aW1vbmlhbHNDb250YWluZXIsIHtcbiAgICAgIGNlbGxBbGlnbjogJ2NlbnRlcicsXG4gICAgICBjZWxsU2VsZWN0b3I6IGBbJHt0aGlzLnNsaWRlfV1gLFxuICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogZmFsc2UsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBfZGVzdHJveUZsaWNraXR5KCkge1xuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICB0aGlzLmZsaWNraXR5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VjdGlvbkJsb2NrU2VsZWN0KGJsb2NrKSB7XG4gICAgaWYgKCF0aGlzLmZsaWNraXR5KSB7IHJldHVybjsgfVxuXG4gICAgY29uc3QgeyBpbmRleCB9ID0gYmxvY2suZWwuZGF0YXNldDtcblxuICAgIHRoaXMuZmxpY2tpdHkuc2VsZWN0KGluZGV4LCB0cnVlKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQS9EQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/DynamicTestimonials.js\n");

/***/ }),

/***/ "./source/scripts/sections/ProductSection.js":
/*!***************************************************!*\
  !*** ./source/scripts/sections/ProductSection.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ProductSection)\n/* harmony export */ });\n/* harmony import */ var _components_Product__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Product */ \"./source/scripts/components/Product.js\");\n\nclass ProductSection {\n  constructor(section) {\n    const {\n      el,\n      data,\n      id\n    } = section;\n    this.product = new _components_Product__WEBPACK_IMPORTED_MODULE_0__.default(el, data, id);\n  }\n\n  onSectionUnload() {\n    return this.product.unload();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9Qcm9kdWN0U2VjdGlvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9Qcm9kdWN0U2VjdGlvbi5qcz8xYmE4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9kdWN0IGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RTZWN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIGNvbnN0IHsgZWwsIGRhdGEsIGlkIH0gPSBzZWN0aW9uO1xuXG4gICAgdGhpcy5wcm9kdWN0ID0gbmV3IFByb2R1Y3QoZWwsIGRhdGEsIGlkKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9kdWN0LnVubG9hZCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/ProductSection.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticArticle.js":
/*!**************************************************!*\
  !*** ./source/scripts/sections/StaticArticle.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticArticle)\n/* harmony export */ });\nclass StaticArticle {\n  constructor(section) {\n    this.initializedClass = 'article-initialized';\n    this.el = section.el;\n\n    this._validate();\n  }\n\n  update() {\n    this._validate();\n  }\n\n  onSectionUnload() {\n    window.removeEventListener('resize', () => {\n      this.setupFullWidthImages();\n\n      if (window.innerWidth <= 1080) {\n        this.positionSidebar('below');\n      } else {\n        this.positionSidebar();\n        this.setupFeaturedImage();\n      }\n    });\n  }\n\n  _validate() {\n    if (window.innerWidth <= 1080) {\n      this.positionSidebar('below');\n    } else {\n      this.positionSidebar();\n    }\n\n    this.setupFeaturedImage();\n    this.setupFullWidthImages();\n    window.addEventListener('resize', () => {\n      this.setupFullWidthImages();\n\n      if (window.innerWidth <= 1080) {\n        this.positionSidebar('below');\n      } else {\n        this.positionSidebar();\n        this.setupFeaturedImage();\n      }\n    });\n  }\n\n  setupFeaturedImage() {\n    const posts = this.el.querySelectorAll('.blog-post');\n    posts.forEach(post => {\n      const image = post.querySelector('img.highlight');\n\n      if (image) {\n        image.addEventListener('rimg:load', () => {\n          post.querySelector('.blog-post-inner').style.paddingTop = `${image.getBoundingClientRect().height - 60}px`;\n        });\n      }\n    });\n  }\n\n  setupFullWidthImages() {\n    const postContent = this.el.querySelector('.post-content');\n    const postContentWidth = postContent.getBoundingClientRect().width;\n    const postContentMargin = postContent.style.marginLeft;\n    this.el.querySelectorAll('img.full-width').forEach(image => {\n      image.style.width = `${postContentWidth}px`;\n      image.style.left = `-${postContentMargin}px`;\n    });\n  }\n\n  positionSidebar(position) {\n    const wrapper = this.el.querySelector('.blog-post-wrapper');\n    const sidebar = this.el.querySelector('.blog-sidebar');\n\n    if (position === 'below') {\n      wrapper.parentNode.insertBefore(sidebar, wrapper.nextSibling);\n    } else {\n      wrapper.parentNode.insertBefore(sidebar, wrapper);\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNBcnRpY2xlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0FydGljbGUuanM/NzNjZiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNBcnRpY2xlIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWRDbGFzcyA9ICdhcnRpY2xlLWluaXRpYWxpemVkJztcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLl92YWxpZGF0ZSgpO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuX3ZhbGlkYXRlKCk7XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgIHRoaXMuc2V0dXBGdWxsV2lkdGhJbWFnZXMoKTtcbiAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMDgwKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb25TaWRlYmFyKCdiZWxvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoKTtcbiAgICAgICAgdGhpcy5zZXR1cEZlYXR1cmVkSW1hZ2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF92YWxpZGF0ZSgpIHtcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gMTA4MCkge1xuICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zaXRpb25TaWRlYmFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cEZlYXR1cmVkSW1hZ2UoKTtcbiAgICB0aGlzLnNldHVwRnVsbFdpZHRoSW1hZ2VzKCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuICAgICAgdGhpcy5zZXR1cEZ1bGxXaWR0aEltYWdlcygpO1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwODApIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uU2lkZWJhcigpO1xuICAgICAgICB0aGlzLnNldHVwRmVhdHVyZWRJbWFnZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0dXBGZWF0dXJlZEltYWdlKCkge1xuICAgIGNvbnN0IHBvc3RzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuYmxvZy1wb3N0Jyk7XG5cbiAgICBwb3N0cy5mb3JFYWNoKHBvc3QgPT4ge1xuICAgICAgY29uc3QgaW1hZ2UgPSBwb3N0LnF1ZXJ5U2VsZWN0b3IoJ2ltZy5oaWdobGlnaHQnKTtcblxuICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsICgpID0+IHtcbiAgICAgICAgICBwb3N0LnF1ZXJ5U2VsZWN0b3IoJy5ibG9nLXBvc3QtaW5uZXInKS5zdHlsZS5wYWRkaW5nVG9wID0gYCR7aW1hZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gNjB9cHhgO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldHVwRnVsbFdpZHRoSW1hZ2VzKCkge1xuICAgIGNvbnN0IHBvc3RDb250ZW50ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcucG9zdC1jb250ZW50Jyk7XG4gICAgY29uc3QgcG9zdENvbnRlbnRXaWR0aCA9IHBvc3RDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHBvc3RDb250ZW50TWFyZ2luID0gcG9zdENvbnRlbnQuc3R5bGUubWFyZ2luTGVmdDtcblxuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnaW1nLmZ1bGwtd2lkdGgnKS5mb3JFYWNoKGltYWdlID0+IHtcbiAgICAgIGltYWdlLnN0eWxlLndpZHRoID0gYCR7cG9zdENvbnRlbnRXaWR0aH1weGA7XG4gICAgICBpbWFnZS5zdHlsZS5sZWZ0ID0gYC0ke3Bvc3RDb250ZW50TWFyZ2lufXB4YDtcbiAgICB9KTtcbiAgfVxuXG4gIHBvc2l0aW9uU2lkZWJhcihwb3NpdGlvbikge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5ibG9nLXBvc3Qtd3JhcHBlcicpO1xuICAgIGNvbnN0IHNpZGViYXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5ibG9nLXNpZGViYXInKTtcblxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ2JlbG93Jykge1xuICAgICAgd3JhcHBlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWRlYmFyLCB3cmFwcGVyLm5leHRTaWJsaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd3JhcHBlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWRlYmFyLCB3cmFwcGVyKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvRUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticArticle.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticBlog.js":
/*!***********************************************!*\
  !*** ./source/scripts/sections/StaticBlog.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticBlog)\n/* harmony export */ });\n/* harmony import */ var _components_Select__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Select */ \"./source/scripts/components/Select.js\");\n\nclass StaticBlog {\n  constructor(section) {\n    this.el = section.el;\n    this.initializedClass = 'blog-initialized';\n\n    this._validate();\n  }\n\n  onSectionLoad() {\n    this._validate();\n  }\n\n  onSectionUnload() {\n    window.removeEventListener('resize', () => {\n      this.setupFullWidthImages();\n\n      if (window.innerWidth <= 1080) {\n        this.positionSidebar('below');\n      } else {\n        this.positionSidebar();\n        this.setupFeaturedImage();\n      }\n    });\n    const filterSelect = this.el.querySelector('.blog-tag-filter select');\n\n    if (filterSelect) {\n      filterSelect.removeEventListener('change', event => this.filterBlog(event));\n    }\n  }\n\n  _validate() {\n    if (window.innerWidth <= 1080) {\n      this.positionSidebar('below');\n    } else {\n      this.positionSidebar();\n    }\n\n    this.setupFeaturedImage();\n    this.setupFullWidthImages();\n    window.addEventListener('resize', () => {\n      this.setupFullWidthImages();\n\n      if (window.innerWidth <= 1080) {\n        this.positionSidebar('below');\n      } else {\n        this.positionSidebar();\n        this.setupFeaturedImage();\n      }\n    });\n    const filterSelect = this.el.querySelector('.blog-tag-filter select');\n\n    if (filterSelect) {\n      new _components_Select__WEBPACK_IMPORTED_MODULE_0__.default({\n        el: filterSelect\n      });\n      filterSelect.addEventListener('change', event => this.filterBlog(event));\n    }\n  }\n\n  filterBlog(e) {\n    if (!this.el.querySelector('[data-tag-filter]')) {\n      return;\n    }\n\n    const {\n      tag,\n      dataset\n    } = e.target;\n    const {\n      url\n    } = dataset;\n    window.location.href = tag === 'all' ? `/blogs/${url}` : `/blogs/${url}/tagged/${tag}`;\n  }\n\n  setupFeaturedImage() {\n    const posts = this.el.querySelectorAll('.blog-post');\n    posts.forEach(post => {\n      const image = post.querySelector('img.highlight');\n\n      if (image) {\n        image.addEventListener('rimg:load', () => {\n          post.querySelector('.blog-post-inner').style.paddingTop = `${image.getBoundingClientRect().height - 60}px`;\n        });\n      }\n    });\n  }\n\n  setupFullWidthImages() {\n    const postContent = this.el.querySelector('.post-content');\n    const postContentWidth = postContent.getBoundingClientRect().width;\n    const postContentMargin = postContent.style.marginLeft;\n    this.el.querySelectorAll('img.full-width').forEach(image => {\n      image.style.width = `${postContentWidth}px`;\n      image.style.left = `-${postContentMargin}px`;\n    });\n  }\n\n  positionSidebar(position) {\n    const wrapper = this.el.querySelector('.blog-posts');\n    const sidebar = this.el.querySelector('.blog-sidebar');\n\n    if (position === 'below') {\n      wrapper.parentNode.insertBefore(sidebar, wrapper.nextSibling);\n    } else {\n      wrapper.parentNode.insertBefore(sidebar, wrapper);\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNCbG9nLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0Jsb2cuanM/OWI3YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2VsZWN0IGZyb20gJy4uL2NvbXBvbmVudHMvU2VsZWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljQmxvZyB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLmluaXRpYWxpemVkQ2xhc3MgPSAnYmxvZy1pbml0aWFsaXplZCc7XG4gICAgdGhpcy5fdmFsaWRhdGUoKTtcbiAgfVxuXG4gIG9uU2VjdGlvbkxvYWQoKSB7XG4gICAgdGhpcy5fdmFsaWRhdGUoKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuICAgICAgdGhpcy5zZXR1cEZ1bGxXaWR0aEltYWdlcygpO1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwODApIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uU2lkZWJhcigpO1xuICAgICAgICB0aGlzLnNldHVwRmVhdHVyZWRJbWFnZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyU2VsZWN0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuYmxvZy10YWctZmlsdGVyIHNlbGVjdCcpO1xuXG4gICAgaWYgKGZpbHRlclNlbGVjdCkge1xuICAgICAgZmlsdGVyU2VsZWN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHRoaXMuZmlsdGVyQmxvZyhldmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIF92YWxpZGF0ZSgpIHtcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gMTA4MCkge1xuICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zaXRpb25TaWRlYmFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cEZlYXR1cmVkSW1hZ2UoKTtcbiAgICB0aGlzLnNldHVwRnVsbFdpZHRoSW1hZ2VzKCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuICAgICAgdGhpcy5zZXR1cEZ1bGxXaWR0aEltYWdlcygpO1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwODApIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvblNpZGViYXIoJ2JlbG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uU2lkZWJhcigpO1xuICAgICAgICB0aGlzLnNldHVwRmVhdHVyZWRJbWFnZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyU2VsZWN0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuYmxvZy10YWctZmlsdGVyIHNlbGVjdCcpO1xuXG4gICAgaWYgKGZpbHRlclNlbGVjdCkge1xuICAgICAgbmV3IFNlbGVjdCh7IGVsOiBmaWx0ZXJTZWxlY3QgfSk7XG5cbiAgICAgIGZpbHRlclNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldmVudCA9PiB0aGlzLmZpbHRlckJsb2coZXZlbnQpKTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJCbG9nKGUpIHtcbiAgICBpZiAoIXRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFnLWZpbHRlcl0nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGFnLCBkYXRhc2V0IH0gPSBlLnRhcmdldDtcbiAgICBjb25zdCB7IHVybCB9ID0gZGF0YXNldDtcblxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGFnID09PSAnYWxsJ1xuICAgICAgPyBgL2Jsb2dzLyR7dXJsfWBcbiAgICAgIDogYC9ibG9ncy8ke3VybH0vdGFnZ2VkLyR7dGFnfWA7XG4gIH1cblxuICBzZXR1cEZlYXR1cmVkSW1hZ2UoKSB7XG4gICAgY29uc3QgcG9zdHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ibG9nLXBvc3QnKTtcblxuICAgIHBvc3RzLmZvckVhY2gocG9zdCA9PiB7XG4gICAgICBjb25zdCBpbWFnZSA9IHBvc3QucXVlcnlTZWxlY3RvcignaW1nLmhpZ2hsaWdodCcpO1xuXG4gICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcigncmltZzpsb2FkJywgKCkgPT4ge1xuICAgICAgICAgIHBvc3QucXVlcnlTZWxlY3RvcignLmJsb2ctcG9zdC1pbm5lcicpLnN0eWxlLnBhZGRpbmdUb3AgPSBgJHtpbWFnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSA2MH1weGA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0dXBGdWxsV2lkdGhJbWFnZXMoKSB7XG4gICAgY29uc3QgcG9zdENvbnRlbnQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5wb3N0LWNvbnRlbnQnKTtcbiAgICBjb25zdCBwb3N0Q29udGVudFdpZHRoID0gcG9zdENvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgcG9zdENvbnRlbnRNYXJnaW4gPSBwb3N0Q29udGVudC5zdHlsZS5tYXJnaW5MZWZ0O1xuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdpbWcuZnVsbC13aWR0aCcpLmZvckVhY2goaW1hZ2UgPT4ge1xuICAgICAgaW1hZ2Uuc3R5bGUud2lkdGggPSBgJHtwb3N0Q29udGVudFdpZHRofXB4YDtcbiAgICAgIGltYWdlLnN0eWxlLmxlZnQgPSBgLSR7cG9zdENvbnRlbnRNYXJnaW59cHhgO1xuICAgIH0pO1xuICB9XG5cbiAgcG9zaXRpb25TaWRlYmFyKHBvc2l0aW9uKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmJsb2ctcG9zdHMnKTtcbiAgICBjb25zdCBzaWRlYmFyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuYmxvZy1zaWRlYmFyJyk7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdiZWxvdycpIHtcbiAgICAgIHdyYXBwZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2lkZWJhciwgd3JhcHBlci5uZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdyYXBwZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2lkZWJhciwgd3JhcHBlcik7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExR0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticBlog.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticBlogMasonry.js":
/*!******************************************************!*\
  !*** ./source/scripts/sections/StaticBlogMasonry.js ***!
  \******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticBlogMasonry)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n\nclass StaticBlogMasonry {\n  constructor({\n    el\n  }) {\n    const masonry = el.querySelector('[data-masonry-grid]');\n    this.masonryGrid = new _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__.default({\n      el: masonry\n    });\n  }\n\n  onSectionUnload() {\n    return this.masonryGrid.unload();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNCbG9nTWFzb25yeS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNCbG9nTWFzb25yeS5qcz9jYTc4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXNvbnJ5R3JpZCBmcm9tICcuLi9jb21wb25lbnRzL01hc29ucnlHcmlkJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljQmxvZ01hc29ucnkge1xuICBjb25zdHJ1Y3Rvcih7IGVsIH0pIHtcbiAgICBjb25zdCBtYXNvbnJ5ID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWFzb25yeS1ncmlkXScpO1xuXG4gICAgdGhpcy5tYXNvbnJ5R3JpZCA9IG5ldyBNYXNvbnJ5R3JpZCh7IGVsOiBtYXNvbnJ5IH0pO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHJldHVybiB0aGlzLm1hc29ucnlHcmlkLnVubG9hZCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticBlogMasonry.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticCart.js":
/*!***********************************************!*\
  !*** ./source/scripts/sections/StaticCart.js ***!
  \***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticCart)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var morphdom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! morphdom */ \"./node_modules/morphdom/dist/morphdom-esm.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _shopify_theme_addresses__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @shopify/theme-addresses */ \"./node_modules/@shopify/theme-addresses/theme-addresses.js\");\n\n\n\n\nclass StaticCart {\n  constructor(section) {\n    this.el = section.el;\n    this.cartTable = this.el.querySelector('[data-cart-table]');\n    this.cartDiscountContainer = this.el.querySelector('[data-cart-discount-container]');\n    this.totalPrice = this.el.querySelector('[data-total-price]');\n    this.quantityInputs = null;\n    this.removeItem = null;\n    this.updateTimeout = null;\n    this.initializedClass = 'cart-initialized';\n    this.cartInstructionsTextarea = document.querySelector('.cart-instructions textarea');\n\n    if (this.cartInstructionsTextarea) {\n      this.cartInstructionsTextarea.addEventListener('change', () => this.saveSpecialInstructions());\n    }\n\n    this._bindCartItemEvents();\n\n    const {\n      hasShippingCalculator\n    } = section.data;\n\n    if (hasShippingCalculator) {\n      const countrySelect = document.getElementById('address_country');\n      const provinceSelect = document.getElementById('address_province');\n      const provinceContainer = document.getElementById('address_province_container');\n      if (!countrySelect) return;\n      const observer = new MutationObserver(() => {\n        this.shippingSelects.forEach(select => {\n          const {\n            previousElementSibling,\n            options,\n            selectedIndex\n          } = select;\n          if (!previousElementSibling || !options || !options.length) return;\n          previousElementSibling.innerText = options[selectedIndex >= 0 ? selectedIndex : 0].text;\n        });\n      });\n      this.shippingSubmit = this.el.querySelector('[data-shipping-calculator-submit]');\n\n      this.calculateShipping = () => this._calculateShipping();\n\n      this.shippingSelects = this.el.querySelectorAll('.cart-shipping-calculator select');\n      this.shippingSelects.forEach(shippingSelect => observer.observe(shippingSelect, {\n        childList: true\n      }));\n      this.shippingCountryProvinceSelector = new _shopify_theme_addresses__WEBPACK_IMPORTED_MODULE_3__.CountryProvinceSelector(countrySelect.innerHTML);\n      this.shippingCountryProvinceSelector.build(countrySelect, provinceSelect, {\n        onCountryChange: provinces => {\n          if (provinces.length) {\n            provinceContainer.style.display = 'block';\n          } else {\n            provinceContainer.style.display = 'none';\n          } // \"Province\", \"State\", \"Region\", etc. and \"Postal Code\", \"ZIP Code\", etc.\n          // Even countries without provinces include a label.\n\n\n          const {\n            label,\n            zip_label: zipLabel\n          } = window.Countries[countrySelect.value];\n          provinceContainer.querySelector('label[for=\"address_province\"]').innerHTML = label;\n          this.el.querySelector('label[for=\"address_zip\"]').innerHTML = zipLabel;\n        }\n      });\n      this.shippingSubmit.addEventListener('click', this.calculateShipping);\n\n      if (window.Theme.customerAddress) {\n        this._calculateShipping(window.Theme.customerAddress);\n      }\n    }\n  }\n\n  _bindCartItemEvents() {\n    this.quantityInputs = this.el.querySelectorAll('[data-quantity-key]');\n    this.removeItem = this.el.querySelectorAll('[data-remove-item]');\n    this.cartTable = this.el.querySelector('[data-cart-table]');\n    this.cartDiscountContainer = this.el.querySelector('[data-cart-discount-container]');\n    this.totalPrice = this.el.querySelector('[data-total-price]');\n    this.quantityInputs.forEach(el => el.addEventListener('input', event => this._updateItemQuantity(event)));\n    this.removeItem.forEach(el => el.addEventListener('click', event => this._updateItemQuantity(event)));\n  }\n\n  _unbindCartItemEvents() {\n    this.quantityInputs.forEach(el => el.removeEventListener('input', event => this._updateItemQuantity(event)));\n    this.removeItem.forEach(el => el.removeEventListener('click', event => this._updateItemQuantity(event)));\n    this.quantityInputs = null;\n    this.removeItem = null;\n  }\n\n  onSectionUnload() {\n    this.shippingSubmit.removeEventListener('click', this.calculateShipping);\n\n    if (this.cartInstructionsTextarea) {\n      this.cartInstructionsTextarea.removeEventListener('change', () => this.saveSpecialInstructions());\n    }\n  }\n\n  _updateItemQuantity(event) {\n    event.preventDefault();\n    let quantityInput;\n    let quantity;\n    let lineItemKey;\n\n    if (event.currentTarget.hasAttribute('data-remove-item')) {\n      quantity = 0;\n      lineItemKey = event.currentTarget.dataset.removeItem;\n    } else {\n      quantityInput = event.currentTarget;\n      quantity = quantityInput.value;\n\n      if (quantity === '') {\n        return;\n      }\n\n      lineItemKey = quantityInput.dataset.quantityKey;\n    } // cancel any pending requests\n\n\n    if (this.updateTimeout !== null) {\n      clearTimeout(this.updateTimeout);\n    }\n\n    this.updateTimeout = setTimeout(() => {\n      // Debounce to avoid firing requests while user is still entering number\n      const thisTimeoutId = this.updateTimeout;\n      const request = new XMLHttpRequest();\n      request.open('POST', `${window.Theme.routes.cart_change_url}.js`, true);\n      request.setRequestHeader('Content-Type', 'application/json');\n      request.responseType = 'json';\n\n      request.onload = () => {\n        const cart = request.response; // If another request is in progress, discard this update\n\n        if (this.updateTimeout && this.updateTimeout !== thisTimeoutId) {\n          return;\n        }\n\n        if (cart.item_count === 0) {\n          // reload to show empty cart state\n          window.location.reload();\n          return;\n        }\n\n        this.updateCart(cart, thisTimeoutId);\n      };\n\n      request.send(JSON.stringify({\n        quantity,\n        id: lineItemKey\n      }));\n    }, 300);\n  }\n\n  updateCart(cart, timeoutId) {\n    const cartCounts = document.querySelectorAll('.cart-count-number');\n    cartCounts.forEach(el => {\n      el.innerText = cart.item_count;\n    }); // Swap the cart contents to update discount labels.\n\n    _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_0__.default.load(window.Theme.routes.cart_url, {\n      view: 'ajax'\n    }).then(({\n      data,\n      html\n    }) => {\n      // If another request is in progress, discard this update\n      if (this.updateTimeout !== timeoutId) {\n        return;\n      }\n\n      this._unbindCartItemEvents(); // Inject new cart table contents\n\n\n      const newTableContainer = document.createElement('div');\n      newTableContainer.innerHTML = html.table;\n      (0,morphdom__WEBPACK_IMPORTED_MODULE_1__.default)(this.cartTable, newTableContainer.querySelector('table'), {\n        onBeforeElUpdated: (fromEl, toEl) => {\n          // Skip images if src matches\n          // - we don't want to reload lazy loaded images\n          if (fromEl.tagName === 'IMG' && fromEl.src === toEl.src) {\n            return false;\n          }\n\n          return true;\n        }\n      });\n      _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.watch(this.cartTable); // Inject new cart level discounts\n\n      const newDiscountContainer = document.createElement('div');\n      newDiscountContainer.innerHTML = html.discounts;\n      this.cartDiscountContainer.innerHTML = newDiscountContainer.querySelector('[data-cart-discount-container]').innerHTML; // Update total\n\n      this.totalPrice.innerHTML = data.totalPrice;\n\n      this._bindCartItemEvents();\n    }).catch(() => window.location.reload());\n  }\n\n  saveSpecialInstructions() {\n    const newNote = this.cartInstructionsTextarea.value;\n    const request = new XMLHttpRequest();\n    request.open('POST', `/cart/update.js?note=${encodeURI(newNote)}`);\n    request.responseType = 'json';\n    request.send();\n  }\n\n  _calculateShipping(customerAddress) {\n    let shippingAddress = {};\n\n    if (customerAddress) {\n      shippingAddress = customerAddress;\n    } else {\n      const addressCountry = document.querySelector('#address_country');\n      const addressProvince = document.querySelector('#address_province');\n      const addressZip = document.querySelector('#address_zip');\n      shippingAddress.country = addressCountry ? addressCountry.value : '';\n      shippingAddress.province = addressProvince ? addressProvince.value : '';\n      shippingAddress.zip = addressZip ? addressZip.value : '';\n    }\n\n    const queryString = Object.keys(shippingAddress).map(key => `${encodeURIComponent(`shipping_address[${key}]`)}=${encodeURIComponent(shippingAddress[key])}`).join('&');\n    const request = new XMLHttpRequest();\n    request.open('GET', `/cart/shipping_rates.json?${queryString}`);\n    request.responseType = 'json';\n\n    request.onload = () => {\n      const {\n        status,\n        response\n      } = request;\n\n      if (status === 422) {\n        this._handleErrors(response);\n\n        return;\n      }\n\n      const rates = response.shipping_rates;\n      let address = `${shippingAddress.zip}, ${shippingAddress.province}, ${shippingAddress.country}`;\n\n      if (!shippingAddress.province.length) {\n        address = `${shippingAddress.zip}, ${shippingAddress.country}`;\n      }\n\n      if (!shippingAddress.zip.length) {\n        address = `${shippingAddress.province}, ${shippingAddress.country}`;\n      }\n\n      if (!shippingAddress.province.length || !shippingAddress.zip.length) {\n        address = shippingAddress.country;\n      }\n\n      const cartShippingCalculatorResponse = this.el.querySelector('.cart-shipping-calculator-response');\n      cartShippingCalculatorResponse.innerHTML = '<p class=\"shipping-calculator-response message\"></p><ul class=\"shipping-rates\"/></ul>';\n      const ratesFeedback = this.el.querySelector('.shipping-calculator-response');\n\n      if (rates.length > 1) {\n        const firstRate = window.Theme.Currency.formatMoney(rates[0].price, window.Theme.moneyFormat);\n        const multipleShippingRates = window.Theme.shippingCalcMultiRates.replace('--address--', address).replace('--number_of_rates--', rates.length).replace('--rate--', `<span class='money'>${firstRate}</span>`);\n        ratesFeedback.innerHTML = multipleShippingRates;\n      } else if (rates.length === 1) {\n        const oneShippingRate = window.Theme.shippingCalcOneRate.replace('--address--', address);\n        ratesFeedback.innerHTML = oneShippingRate;\n      } else {\n        ratesFeedback.innerHTML = window.Theme.shippingCalcNoRates;\n      }\n\n      const cartShippingRates = this.el.querySelector('.shipping-rates');\n\n      for (let i = 0; i < rates.length; i++) {\n        const rate = rates[i];\n        const price = window.Theme.Currency.formatMoney(rate.price, window.Theme.moneyFormat);\n        const rateValues = window.Theme.shippingCalcRateValues.replace('--rate_title--', rate.name).replace('--rate--', `<span class='money'>${price}</span>`);\n        const rateEl = document.createElement('li');\n        rateEl.innerHTML = rateValues;\n        cartShippingRates.appendChild(rateEl);\n      }\n    };\n\n    request.send();\n  }\n\n  _handleErrors(errors) {\n    let errorMessage = '';\n\n    if ('zip' in errors) {\n      errorMessage = window.Theme.shippingCalcErrorMessage.replace('--error_message--', errors.zip);\n    } else {\n      errorMessage = errors;\n    }\n\n    document.querySelector('.cart-shipping-calculator-response').innerHTML = `<p>${errorMessage}</p>`;\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNDYXJ0LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0NhcnQuanM/NzU1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXN5bmNWaWV3IGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3JztcbmltcG9ydCBtb3JwaGRvbSBmcm9tICdtb3JwaGRvbSc7XG5pbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknO1xuaW1wb3J0IHsgQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IgfSBmcm9tICdAc2hvcGlmeS90aGVtZS1hZGRyZXNzZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNDYXJ0IHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuY2FydFRhYmxlID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYXJ0LXRhYmxlXScpO1xuICAgIHRoaXMuY2FydERpc2NvdW50Q29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYXJ0LWRpc2NvdW50LWNvbnRhaW5lcl0nKTtcbiAgICB0aGlzLnRvdGFsUHJpY2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvdGFsLXByaWNlXScpO1xuICAgIHRoaXMucXVhbnRpdHlJbnB1dHMgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlSXRlbSA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVUaW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLmluaXRpYWxpemVkQ2xhc3MgPSAnY2FydC1pbml0aWFsaXplZCc7XG4gICAgdGhpcy5jYXJ0SW5zdHJ1Y3Rpb25zVGV4dGFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FydC1pbnN0cnVjdGlvbnMgdGV4dGFyZWEnKTtcblxuICAgIGlmICh0aGlzLmNhcnRJbnN0cnVjdGlvbnNUZXh0YXJlYSkge1xuICAgICAgdGhpcy5jYXJ0SW5zdHJ1Y3Rpb25zVGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gdGhpcy5zYXZlU3BlY2lhbEluc3RydWN0aW9ucygpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iaW5kQ2FydEl0ZW1FdmVudHMoKTtcblxuICAgIGNvbnN0IHsgaGFzU2hpcHBpbmdDYWxjdWxhdG9yIH0gPSBzZWN0aW9uLmRhdGE7XG5cbiAgICBpZiAoaGFzU2hpcHBpbmdDYWxjdWxhdG9yKSB7XG4gICAgICBjb25zdCBjb3VudHJ5U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZHJlc3NfY291bnRyeScpO1xuICAgICAgY29uc3QgcHJvdmluY2VTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkcmVzc19wcm92aW5jZScpO1xuICAgICAgY29uc3QgcHJvdmluY2VDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkcmVzc19wcm92aW5jZV9jb250YWluZXInKTtcblxuICAgICAgaWYgKCFjb3VudHJ5U2VsZWN0KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICB0aGlzLnNoaXBwaW5nU2VsZWN0cy5mb3JFYWNoKHNlbGVjdCA9PiB7XG4gICAgICAgICAgY29uc3QgeyBwcmV2aW91c0VsZW1lbnRTaWJsaW5nLCBvcHRpb25zLCBzZWxlY3RlZEluZGV4IH0gPSBzZWxlY3Q7XG5cbiAgICAgICAgICBpZiAoIXByZXZpb3VzRWxlbWVudFNpYmxpbmcgfHwgIW9wdGlvbnMgfHwgIW9wdGlvbnMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICBwcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlubmVyVGV4dCA9IG9wdGlvbnNbc2VsZWN0ZWRJbmRleCA+PSAwID8gc2VsZWN0ZWRJbmRleCA6IDBdLnRleHQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2hpcHBpbmdTdWJtaXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLWNhbGN1bGF0b3Itc3VibWl0XScpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVTaGlwcGluZyA9ICgpID0+IHRoaXMuX2NhbGN1bGF0ZVNoaXBwaW5nKCk7XG4gICAgICB0aGlzLnNoaXBwaW5nU2VsZWN0cyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLmNhcnQtc2hpcHBpbmctY2FsY3VsYXRvciBzZWxlY3QnKTtcbiAgICAgIHRoaXMuc2hpcHBpbmdTZWxlY3RzLmZvckVhY2goc2hpcHBpbmdTZWxlY3QgPT4gb2JzZXJ2ZXIub2JzZXJ2ZShzaGlwcGluZ1NlbGVjdCwgeyBjaGlsZExpc3Q6IHRydWUgfSkpO1xuICAgICAgdGhpcy5zaGlwcGluZ0NvdW50cnlQcm92aW5jZVNlbGVjdG9yID0gbmV3IENvdW50cnlQcm92aW5jZVNlbGVjdG9yKGNvdW50cnlTZWxlY3QuaW5uZXJIVE1MKTtcblxuICAgICAgdGhpcy5zaGlwcGluZ0NvdW50cnlQcm92aW5jZVNlbGVjdG9yXG4gICAgICAgIC5idWlsZChcbiAgICAgICAgICBjb3VudHJ5U2VsZWN0LFxuICAgICAgICAgIHByb3ZpbmNlU2VsZWN0LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ291bnRyeUNoYW5nZTogcHJvdmluY2VzID0+IHtcbiAgICAgICAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcm92aW5jZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm92aW5jZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gXCJQcm92aW5jZVwiLCBcIlN0YXRlXCIsIFwiUmVnaW9uXCIsIGV0Yy4gYW5kIFwiUG9zdGFsIENvZGVcIiwgXCJaSVAgQ29kZVwiLCBldGMuXG4gICAgICAgICAgICAgIC8vIEV2ZW4gY291bnRyaWVzIHdpdGhvdXQgcHJvdmluY2VzIGluY2x1ZGUgYSBsYWJlbC5cbiAgICAgICAgICAgICAgY29uc3QgeyBsYWJlbCwgemlwX2xhYmVsOiB6aXBMYWJlbCB9ID0gd2luZG93LkNvdW50cmllc1tjb3VudHJ5U2VsZWN0LnZhbHVlXTtcbiAgICAgICAgICAgICAgcHJvdmluY2VDb250YWluZXIucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPVwiYWRkcmVzc19wcm92aW5jZVwiXScpLmlubmVySFRNTCA9IGxhYmVsO1xuICAgICAgICAgICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj1cImFkZHJlc3NfemlwXCJdJykuaW5uZXJIVE1MID0gemlwTGFiZWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgIHRoaXMuc2hpcHBpbmdTdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNhbGN1bGF0ZVNoaXBwaW5nKTtcblxuICAgICAgaWYgKHdpbmRvdy5UaGVtZS5jdXN0b21lckFkZHJlc3MpIHtcbiAgICAgICAgdGhpcy5fY2FsY3VsYXRlU2hpcHBpbmcod2luZG93LlRoZW1lLmN1c3RvbWVyQWRkcmVzcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2JpbmRDYXJ0SXRlbUV2ZW50cygpIHtcbiAgICB0aGlzLnF1YW50aXR5SW5wdXRzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1xdWFudGl0eS1rZXldJyk7XG4gICAgdGhpcy5yZW1vdmVJdGVtID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZW1vdmUtaXRlbV0nKTtcbiAgICB0aGlzLmNhcnRUYWJsZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydC10YWJsZV0nKTtcbiAgICB0aGlzLmNhcnREaXNjb3VudENvbnRhaW5lciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydC1kaXNjb3VudC1jb250YWluZXJdJyk7XG4gICAgdGhpcy50b3RhbFByaWNlID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b3RhbC1wcmljZV0nKTtcblxuICAgIHRoaXMucXVhbnRpdHlJbnB1dHMuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGV2ZW50ID0+IHRoaXMuX3VwZGF0ZUl0ZW1RdWFudGl0eShldmVudCkpKTtcbiAgICB0aGlzLnJlbW92ZUl0ZW0uZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuX3VwZGF0ZUl0ZW1RdWFudGl0eShldmVudCkpKTtcbiAgfVxuXG4gIF91bmJpbmRDYXJ0SXRlbUV2ZW50cygpIHtcbiAgICB0aGlzLnF1YW50aXR5SW5wdXRzLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBldmVudCA9PiB0aGlzLl91cGRhdGVJdGVtUXVhbnRpdHkoZXZlbnQpKSk7XG4gICAgdGhpcy5yZW1vdmVJdGVtLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLl91cGRhdGVJdGVtUXVhbnRpdHkoZXZlbnQpKSk7XG5cbiAgICB0aGlzLnF1YW50aXR5SW5wdXRzID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZUl0ZW0gPSBudWxsO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMuc2hpcHBpbmdTdWJtaXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNhbGN1bGF0ZVNoaXBwaW5nKTtcblxuICAgIGlmICh0aGlzLmNhcnRJbnN0cnVjdGlvbnNUZXh0YXJlYSkge1xuICAgICAgdGhpcy5jYXJ0SW5zdHJ1Y3Rpb25zVGV4dGFyZWEucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gdGhpcy5zYXZlU3BlY2lhbEluc3RydWN0aW9ucygpKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSXRlbVF1YW50aXR5KGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGxldCBxdWFudGl0eUlucHV0O1xuICAgIGxldCBxdWFudGl0eTtcbiAgICBsZXQgbGluZUl0ZW1LZXk7XG5cbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVtb3ZlLWl0ZW0nKSkge1xuICAgICAgcXVhbnRpdHkgPSAwO1xuICAgICAgbGluZUl0ZW1LZXkgPSBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQucmVtb3ZlSXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVhbnRpdHlJbnB1dCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICBxdWFudGl0eSA9IHF1YW50aXR5SW5wdXQudmFsdWU7XG5cbiAgICAgIGlmIChxdWFudGl0eSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsaW5lSXRlbUtleSA9IHF1YW50aXR5SW5wdXQuZGF0YXNldC5xdWFudGl0eUtleTtcbiAgICB9XG5cbiAgICAvLyBjYW5jZWwgYW55IHBlbmRpbmcgcmVxdWVzdHNcbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIERlYm91bmNlIHRvIGF2b2lkIGZpcmluZyByZXF1ZXN0cyB3aGlsZSB1c2VyIGlzIHN0aWxsIGVudGVyaW5nIG51bWJlclxuXG4gICAgICBjb25zdCB0aGlzVGltZW91dElkID0gdGhpcy51cGRhdGVUaW1lb3V0O1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICByZXF1ZXN0Lm9wZW4oJ1BPU1QnLCBgJHt3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfY2hhbmdlX3VybH0uanNgLCB0cnVlKTtcbiAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhcnQgPSByZXF1ZXN0LnJlc3BvbnNlO1xuXG4gICAgICAgIC8vIElmIGFub3RoZXIgcmVxdWVzdCBpcyBpbiBwcm9ncmVzcywgZGlzY2FyZCB0aGlzIHVwZGF0ZVxuICAgICAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0ICYmIHRoaXMudXBkYXRlVGltZW91dCAhPT0gdGhpc1RpbWVvdXRJZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FydC5pdGVtX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgLy8gcmVsb2FkIHRvIHNob3cgZW1wdHkgY2FydCBzdGF0ZVxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0KGNhcnQsIHRoaXNUaW1lb3V0SWQpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Quc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHF1YW50aXR5LFxuICAgICAgICBpZDogbGluZUl0ZW1LZXksXG4gICAgICB9KSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIHVwZGF0ZUNhcnQoY2FydCwgdGltZW91dElkKSB7XG4gICAgY29uc3QgY2FydENvdW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJ0LWNvdW50LW51bWJlcicpO1xuICAgIGNhcnRDb3VudHMuZm9yRWFjaChlbCA9PiB7IGVsLmlubmVyVGV4dCA9IGNhcnQuaXRlbV9jb3VudDsgfSk7XG5cbiAgICAvLyBTd2FwIHRoZSBjYXJ0IGNvbnRlbnRzIHRvIHVwZGF0ZSBkaXNjb3VudCBsYWJlbHMuXG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB3aW5kb3cuVGhlbWUucm91dGVzLmNhcnRfdXJsLFxuICAgICAgeyB2aWV3OiAnYWpheCcgfSxcbiAgICApXG4gICAgICAudGhlbigoeyBkYXRhLCBodG1sIH0pID0+IHtcbiAgICAgICAgLy8gSWYgYW5vdGhlciByZXF1ZXN0IGlzIGluIHByb2dyZXNzLCBkaXNjYXJkIHRoaXMgdXBkYXRlXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVRpbWVvdXQgIT09IHRpbWVvdXRJZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VuYmluZENhcnRJdGVtRXZlbnRzKCk7XG5cbiAgICAgICAgLy8gSW5qZWN0IG5ldyBjYXJ0IHRhYmxlIGNvbnRlbnRzXG4gICAgICAgIGNvbnN0IG5ld1RhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG5ld1RhYmxlQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwudGFibGU7XG5cbiAgICAgICAgbW9ycGhkb20oXG4gICAgICAgICAgdGhpcy5jYXJ0VGFibGUsXG4gICAgICAgICAgbmV3VGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvcigndGFibGUnKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkJlZm9yZUVsVXBkYXRlZDogKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgICAgICAgICAvLyBTa2lwIGltYWdlcyBpZiBzcmMgbWF0Y2hlc1xuICAgICAgICAgICAgICAvLyAtIHdlIGRvbid0IHdhbnQgdG8gcmVsb2FkIGxhenkgbG9hZGVkIGltYWdlc1xuICAgICAgICAgICAgICBpZiAoZnJvbUVsLnRhZ05hbWUgPT09ICdJTUcnICYmIGZyb21FbC5zcmMgPT09IHRvRWwuc3JjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJpbWcud2F0Y2godGhpcy5jYXJ0VGFibGUpO1xuXG4gICAgICAgIC8vIEluamVjdCBuZXcgY2FydCBsZXZlbCBkaXNjb3VudHNcbiAgICAgICAgY29uc3QgbmV3RGlzY291bnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbmV3RGlzY291bnRDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbC5kaXNjb3VudHM7XG4gICAgICAgIHRoaXMuY2FydERpc2NvdW50Q29udGFpbmVyLmlubmVySFRNTCA9IG5ld0Rpc2NvdW50Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhcnQtZGlzY291bnQtY29udGFpbmVyXScpLmlubmVySFRNTDtcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxcbiAgICAgICAgdGhpcy50b3RhbFByaWNlLmlubmVySFRNTCA9IGRhdGEudG90YWxQcmljZTtcbiAgICAgICAgdGhpcy5fYmluZENhcnRJdGVtRXZlbnRzKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XG4gIH1cblxuICBzYXZlU3BlY2lhbEluc3RydWN0aW9ucygpIHtcbiAgICBjb25zdCBuZXdOb3RlID0gdGhpcy5jYXJ0SW5zdHJ1Y3Rpb25zVGV4dGFyZWEudmFsdWU7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKCdQT1NUJywgYC9jYXJ0L3VwZGF0ZS5qcz9ub3RlPSR7ZW5jb2RlVVJJKG5ld05vdGUpfWApO1xuICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgIHJlcXVlc3Quc2VuZCgpO1xuICB9XG5cbiAgX2NhbGN1bGF0ZVNoaXBwaW5nKGN1c3RvbWVyQWRkcmVzcykge1xuICAgIGxldCBzaGlwcGluZ0FkZHJlc3MgPSB7fTtcblxuICAgIGlmIChjdXN0b21lckFkZHJlc3MpIHtcbiAgICAgIHNoaXBwaW5nQWRkcmVzcyA9IGN1c3RvbWVyQWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYWRkcmVzc0NvdW50cnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWRkcmVzc19jb3VudHJ5Jyk7XG4gICAgICBjb25zdCBhZGRyZXNzUHJvdmluY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYWRkcmVzc19wcm92aW5jZScpO1xuICAgICAgY29uc3QgYWRkcmVzc1ppcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhZGRyZXNzX3ppcCcpO1xuICAgICAgc2hpcHBpbmdBZGRyZXNzLmNvdW50cnkgPSBhZGRyZXNzQ291bnRyeSA/IGFkZHJlc3NDb3VudHJ5LnZhbHVlIDogJyc7XG4gICAgICBzaGlwcGluZ0FkZHJlc3MucHJvdmluY2UgPSBhZGRyZXNzUHJvdmluY2UgPyBhZGRyZXNzUHJvdmluY2UudmFsdWUgOiAnJztcbiAgICAgIHNoaXBwaW5nQWRkcmVzcy56aXAgPSBhZGRyZXNzWmlwID8gYWRkcmVzc1ppcC52YWx1ZSA6ICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmtleXMoc2hpcHBpbmdBZGRyZXNzKVxuICAgICAgLm1hcChrZXkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGBzaGlwcGluZ19hZGRyZXNzWyR7a2V5fV1gKX09JHtlbmNvZGVVUklDb21wb25lbnQoc2hpcHBpbmdBZGRyZXNzW2tleV0pfWApXG4gICAgICAuam9pbignJicpO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBgL2NhcnQvc2hpcHBpbmdfcmF0ZXMuanNvbj8ke3F1ZXJ5U3RyaW5nfWApO1xuICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgIHJlcXVlc3Qub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBzdGF0dXMsIHJlc3BvbnNlIH0gPSByZXF1ZXN0O1xuXG4gICAgICBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JzKHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXRlcyA9IHJlc3BvbnNlLnNoaXBwaW5nX3JhdGVzO1xuXG4gICAgICBsZXQgYWRkcmVzcyA9IGAke3NoaXBwaW5nQWRkcmVzcy56aXB9LCAke3NoaXBwaW5nQWRkcmVzcy5wcm92aW5jZX0sICR7c2hpcHBpbmdBZGRyZXNzLmNvdW50cnl9YDtcbiAgICAgIGlmICghc2hpcHBpbmdBZGRyZXNzLnByb3ZpbmNlLmxlbmd0aCkge1xuICAgICAgICBhZGRyZXNzID0gYCR7c2hpcHBpbmdBZGRyZXNzLnppcH0sICR7c2hpcHBpbmdBZGRyZXNzLmNvdW50cnl9YDtcbiAgICAgIH1cbiAgICAgIGlmICghc2hpcHBpbmdBZGRyZXNzLnppcC5sZW5ndGgpIHtcbiAgICAgICAgYWRkcmVzcyA9IGAke3NoaXBwaW5nQWRkcmVzcy5wcm92aW5jZX0sICR7c2hpcHBpbmdBZGRyZXNzLmNvdW50cnl9YDtcbiAgICAgIH1cbiAgICAgIGlmICghc2hpcHBpbmdBZGRyZXNzLnByb3ZpbmNlLmxlbmd0aCB8fCAhc2hpcHBpbmdBZGRyZXNzLnppcC5sZW5ndGgpIHtcbiAgICAgICAgYWRkcmVzcyA9IHNoaXBwaW5nQWRkcmVzcy5jb3VudHJ5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYXJ0U2hpcHBpbmdDYWxjdWxhdG9yUmVzcG9uc2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5jYXJ0LXNoaXBwaW5nLWNhbGN1bGF0b3ItcmVzcG9uc2UnKTtcblxuICAgICAgY2FydFNoaXBwaW5nQ2FsY3VsYXRvclJlc3BvbnNlLmlubmVySFRNTCA9ICc8cCBjbGFzcz1cInNoaXBwaW5nLWNhbGN1bGF0b3ItcmVzcG9uc2UgbWVzc2FnZVwiPjwvcD48dWwgY2xhc3M9XCJzaGlwcGluZy1yYXRlc1wiLz48L3VsPic7XG5cbiAgICAgIGNvbnN0IHJhdGVzRmVlZGJhY2sgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5zaGlwcGluZy1jYWxjdWxhdG9yLXJlc3BvbnNlJyk7XG5cbiAgICAgIGlmIChyYXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0UmF0ZSA9IHdpbmRvdy5UaGVtZS5DdXJyZW5jeS5mb3JtYXRNb25leShyYXRlc1swXS5wcmljZSwgd2luZG93LlRoZW1lLm1vbmV5Rm9ybWF0KTtcbiAgICAgICAgY29uc3QgbXVsdGlwbGVTaGlwcGluZ1JhdGVzID0gd2luZG93LlRoZW1lLnNoaXBwaW5nQ2FsY011bHRpUmF0ZXNcbiAgICAgICAgICAucmVwbGFjZSgnLS1hZGRyZXNzLS0nLCBhZGRyZXNzKVxuICAgICAgICAgIC5yZXBsYWNlKCctLW51bWJlcl9vZl9yYXRlcy0tJywgcmF0ZXMubGVuZ3RoKVxuICAgICAgICAgIC5yZXBsYWNlKCctLXJhdGUtLScsIGA8c3BhbiBjbGFzcz0nbW9uZXknPiR7Zmlyc3RSYXRlfTwvc3Bhbj5gKTtcbiAgICAgICAgcmF0ZXNGZWVkYmFjay5pbm5lckhUTUwgPSBtdWx0aXBsZVNoaXBwaW5nUmF0ZXM7XG4gICAgICB9IGVsc2UgaWYgKHJhdGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBvbmVTaGlwcGluZ1JhdGUgPSB3aW5kb3cuVGhlbWUuc2hpcHBpbmdDYWxjT25lUmF0ZVxuICAgICAgICAgIC5yZXBsYWNlKCctLWFkZHJlc3MtLScsIGFkZHJlc3MpO1xuICAgICAgICByYXRlc0ZlZWRiYWNrLmlubmVySFRNTCA9IG9uZVNoaXBwaW5nUmF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhdGVzRmVlZGJhY2suaW5uZXJIVE1MID0gd2luZG93LlRoZW1lLnNoaXBwaW5nQ2FsY05vUmF0ZXM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhcnRTaGlwcGluZ1JhdGVzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuc2hpcHBpbmctcmF0ZXMnKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByYXRlID0gcmF0ZXNbaV07XG4gICAgICAgIGNvbnN0IHByaWNlID0gd2luZG93LlRoZW1lLkN1cnJlbmN5LmZvcm1hdE1vbmV5KHJhdGUucHJpY2UsIHdpbmRvdy5UaGVtZS5tb25leUZvcm1hdCk7XG4gICAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSB3aW5kb3cuVGhlbWUuc2hpcHBpbmdDYWxjUmF0ZVZhbHVlc1xuICAgICAgICAgIC5yZXBsYWNlKCctLXJhdGVfdGl0bGUtLScsIHJhdGUubmFtZSlcbiAgICAgICAgICAucmVwbGFjZSgnLS1yYXRlLS0nLCBgPHNwYW4gY2xhc3M9J21vbmV5Jz4ke3ByaWNlfTwvc3Bhbj5gKTtcbiAgICAgICAgY29uc3QgcmF0ZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgICAgICByYXRlRWwuaW5uZXJIVE1MID0gcmF0ZVZhbHVlcztcblxuICAgICAgICBjYXJ0U2hpcHBpbmdSYXRlcy5hcHBlbmRDaGlsZChyYXRlRWwpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVxdWVzdC5zZW5kKCk7XG4gIH1cblxuICBfaGFuZGxlRXJyb3JzKGVycm9ycykge1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIGlmICgnemlwJyBpbiBlcnJvcnMpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IHdpbmRvdy5UaGVtZS5zaGlwcGluZ0NhbGNFcnJvck1lc3NhZ2UucmVwbGFjZSgnLS1lcnJvcl9tZXNzYWdlLS0nLCBlcnJvcnMuemlwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JzO1xuICAgIH1cblxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYXJ0LXNoaXBwaW5nLWNhbGN1bGF0b3ItcmVzcG9uc2UnKS5pbm5lckhUTUwgPSBgPHA+JHtlcnJvck1lc3NhZ2V9PC9wPmA7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBYkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFSQTtBQVlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5UQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticCart.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticCollection.js":
/*!*****************************************************!*\
  !*** ./source/scripts/sections/StaticCollection.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticCollection)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n/* harmony import */ var _components_ProductListItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ProductListItem */ \"./source/scripts/components/ProductListItem.js\");\n/* harmony import */ var _components_Select__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/Select */ \"./source/scripts/components/Select.js\");\n/* harmony import */ var _components_FacetedFilters__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/FacetedFilters */ \"./source/scripts/components/FacetedFilters.js\");\n\n\n\n\nclass StaticCollection {\n  constructor(section) {\n    this.el = section.el;\n    this.collectionSortingEl = this.el.querySelector('[data-collection-sorting]');\n    this.masonry = this.el.querySelector('[data-masonry-grid]');\n    this.masonryGrid = null;\n    this.productListItems = [];\n    this.el.querySelectorAll('.product-list-item').forEach(product => this.productListItems.push(new _components_ProductListItem__WEBPACK_IMPORTED_MODULE_1__.default({\n      el: product\n    })));\n\n    if (this.collectionSortingEl) {\n      this.collectionSortingEl.addEventListener('change', event => this.sortCollection(event));\n      new _components_Select__WEBPACK_IMPORTED_MODULE_2__.default({\n        el: this.collectionSortingEl\n      });\n    }\n\n    if (this.masonry) {\n      this.masonryGrid = new _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__.default({\n        el: this.masonry,\n        settings: {\n          itemSelector: '.product-list-item',\n          horizontalOrder: true\n        }\n      });\n    }\n\n    this.facetedFilters = new _components_FacetedFilters__WEBPACK_IMPORTED_MODULE_3__.default(section);\n  }\n\n  remove() {\n    if (this.masonryGrid) {\n      this.masonryGrid.unload();\n    }\n\n    this.productListItems.forEach(item => item.remove());\n\n    if (this.collectionSortingEl) {\n      this.collectionSortingEl.removeEventListener('change', event => this.sortCollection(event));\n    }\n  }\n\n  sortCollection(event) {\n    const {\n      currentTarget\n    } = event;\n    let search;\n    const Sorting = {};\n    Sorting.sort_by = currentTarget.value;\n    const currentVendorSelected = currentTarget.closest('.select-wrapper').classList.contains('vendor-collection');\n    const facetedFiltersEnabled = document.querySelector('[data-faceted-filter]');\n\n    if (currentVendorSelected || facetedFiltersEnabled) {\n      const currentSearch = location.search;\n      const searchParts = currentSearch.split('&');\n\n      for (let index = 0; index < searchParts.length; index++) {\n        const part = searchParts[index];\n\n        if (part.indexOf('sort_by') !== -1) {\n          searchParts.splice(index, 1);\n        }\n      }\n\n      search = searchParts.join('&');\n      location.search = `${search}&${Object.keys(Sorting).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(Sorting[k])}`).join('&')}`;\n    } else {\n      location.search = Object.keys(Sorting).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(Sorting[k])}`).join('&');\n    }\n  }\n\n  onSectionUnload() {\n    this.remove();\n    this.facetedFilters.unload();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNDb2xsZWN0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0NvbGxlY3Rpb24uanM/ZjMzZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWFzb25yeUdyaWQgZnJvbSAnLi4vY29tcG9uZW50cy9NYXNvbnJ5R3JpZCc7XG5pbXBvcnQgUHJvZHVjdExpc3RJdGVtIGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdExpc3RJdGVtJztcbmltcG9ydCBTZWxlY3QgZnJvbSAnLi4vY29tcG9uZW50cy9TZWxlY3QnO1xuaW1wb3J0IEZhY2V0ZWRGaWx0ZXJzIGZyb20gJy4uL2NvbXBvbmVudHMvRmFjZXRlZEZpbHRlcnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuY29sbGVjdGlvblNvcnRpbmdFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY29sbGVjdGlvbi1zb3J0aW5nXScpO1xuICAgIHRoaXMubWFzb25yeSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWFzb25yeS1ncmlkXScpO1xuICAgIHRoaXMubWFzb25yeUdyaWQgPSBudWxsO1xuXG4gICAgdGhpcy5wcm9kdWN0TGlzdEl0ZW1zID0gW107XG4gICAgdGhpcy5lbFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0LWxpc3QtaXRlbScpXG4gICAgICAuZm9yRWFjaChwcm9kdWN0ID0+IHRoaXMucHJvZHVjdExpc3RJdGVtcy5wdXNoKG5ldyBQcm9kdWN0TGlzdEl0ZW0oeyBlbDogcHJvZHVjdCB9KSkpO1xuXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvblNvcnRpbmdFbCkge1xuICAgICAgdGhpcy5jb2xsZWN0aW9uU29ydGluZ0VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHRoaXMuc29ydENvbGxlY3Rpb24oZXZlbnQpKTtcbiAgICAgIG5ldyBTZWxlY3QoeyBlbDogdGhpcy5jb2xsZWN0aW9uU29ydGluZ0VsIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1hc29ucnkpIHtcbiAgICAgIHRoaXMubWFzb25yeUdyaWQgPSBuZXcgTWFzb25yeUdyaWQoe1xuICAgICAgICBlbDogdGhpcy5tYXNvbnJ5LFxuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIGl0ZW1TZWxlY3RvcjogJy5wcm9kdWN0LWxpc3QtaXRlbScsXG4gICAgICAgICAgaG9yaXpvbnRhbE9yZGVyOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5mYWNldGVkRmlsdGVycyA9IG5ldyBGYWNldGVkRmlsdGVycyhzZWN0aW9uKTtcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy5tYXNvbnJ5R3JpZCkge1xuICAgICAgdGhpcy5tYXNvbnJ5R3JpZC51bmxvYWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2R1Y3RMaXN0SXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0ucmVtb3ZlKCkpO1xuXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvblNvcnRpbmdFbCkge1xuICAgICAgdGhpcy5jb2xsZWN0aW9uU29ydGluZ0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHRoaXMuc29ydENvbGxlY3Rpb24oZXZlbnQpKTtcbiAgICB9XG4gIH1cblxuICBzb3J0Q29sbGVjdGlvbihldmVudCkge1xuICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZXZlbnQ7XG4gICAgbGV0IHNlYXJjaDtcblxuICAgIGNvbnN0IFNvcnRpbmcgPSB7fTtcbiAgICBTb3J0aW5nLnNvcnRfYnkgPSBjdXJyZW50VGFyZ2V0LnZhbHVlO1xuXG4gICAgY29uc3QgY3VycmVudFZlbmRvclNlbGVjdGVkID0gY3VycmVudFRhcmdldC5jbG9zZXN0KCcuc2VsZWN0LXdyYXBwZXInKS5jbGFzc0xpc3QuY29udGFpbnMoJ3ZlbmRvci1jb2xsZWN0aW9uJyk7XG4gICAgY29uc3QgZmFjZXRlZEZpbHRlcnNFbmFibGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZmFjZXRlZC1maWx0ZXJdJyk7XG5cbiAgICBpZiAoY3VycmVudFZlbmRvclNlbGVjdGVkIHx8IGZhY2V0ZWRGaWx0ZXJzRW5hYmxlZCkge1xuICAgICAgY29uc3QgY3VycmVudFNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICAgIGNvbnN0IHNlYXJjaFBhcnRzID0gY3VycmVudFNlYXJjaC5zcGxpdCgnJicpO1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2VhcmNoUGFydHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBzZWFyY2hQYXJ0c1tpbmRleF07XG4gICAgICAgIGlmIChwYXJ0LmluZGV4T2YoJ3NvcnRfYnknKSAhPT0gLTEpIHtcbiAgICAgICAgICBzZWFyY2hQYXJ0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlYXJjaCA9IHNlYXJjaFBhcnRzLmpvaW4oJyYnKTtcbiAgICAgIGxvY2F0aW9uLnNlYXJjaCA9IGAke3NlYXJjaH0mJHtPYmplY3Qua2V5cyhTb3J0aW5nKS5tYXAoayA9PiAoXG4gICAgICAgIGAke2VuY29kZVVSSUNvbXBvbmVudChrKX09JHtlbmNvZGVVUklDb21wb25lbnQoU29ydGluZ1trXSl9YFxuICAgICAgKSkuam9pbignJicpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2F0aW9uLnNlYXJjaCA9IE9iamVjdC5rZXlzKFNvcnRpbmcpLm1hcChrID0+IChcbiAgICAgICAgYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGspfT0ke2VuY29kZVVSSUNvbXBvbmVudChTb3J0aW5nW2tdKX1gXG4gICAgICApKS5qb2luKCcmJyk7XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgdGhpcy5mYWNldGVkRmlsdGVycy51bmxvYWQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFGQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTlFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticCollection.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticCollectionsList.js":
/*!**********************************************************!*\
  !*** ./source/scripts/sections/StaticCollectionsList.js ***!
  \**********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticCollectionsList)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n\nclass StaticCollectionsList {\n  constructor(section) {\n    this.el = section.el;\n    this.masonry = this.el.querySelector('[data-masonry-grid]');\n    this.masonryGrid = null;\n\n    if (this.masonry) {\n      this.masonryGrid = new _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__.default({\n        el: this.masonry\n      });\n    }\n  }\n\n  onSectionUnload() {\n    if (this.masonryGrid) {\n      this.masonryGrid.unload();\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNDb2xsZWN0aW9uc0xpc3QuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljQ29sbGVjdGlvbnNMaXN0LmpzP2FmOTgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1hc29ucnlHcmlkIGZyb20gJy4uL2NvbXBvbmVudHMvTWFzb25yeUdyaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uc0xpc3Qge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5lbCA9IHNlY3Rpb24uZWw7XG4gICAgdGhpcy5tYXNvbnJ5ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tYXNvbnJ5LWdyaWRdJyk7XG4gICAgdGhpcy5tYXNvbnJ5R3JpZCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5tYXNvbnJ5KSB7XG4gICAgICB0aGlzLm1hc29ucnlHcmlkID0gbmV3IE1hc29ucnlHcmlkKHsgZWw6IHRoaXMubWFzb25yeSB9KTtcbiAgICB9XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgaWYgKHRoaXMubWFzb25yeUdyaWQpIHtcbiAgICAgIHRoaXMubWFzb25yeUdyaWQudW5sb2FkKCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticCollectionsList.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticFooter.js":
/*!*************************************************!*\
  !*** ./source/scripts/sections/StaticFooter.js ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticFooter)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_shopify_cross_border__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-cross-border */ \"./node_modules/@pixelunion/shopify-cross-border/dist/index.es.js\");\n\n\nclass StaticFooter {\n  constructor(section) {\n    this.el = section.el;\n    this.mailingListEl = this.el.querySelector('.mailing-list');\n    this.upperFooterEl = this.el.querySelector('.upper-footer');\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    const countryDisclosureEls = section.el.querySelectorAll('[data-disclosure-country]');\n    const localeDisclosureEls = section.el.querySelectorAll('[data-disclosure-locale]');\n    this.disclosures = [];\n\n    if (countryDisclosureEls.length > 0) {\n      countryDisclosureEls.forEach(disclosureEl => {\n        this.disclosures.push(new _pixelunion_shopify_cross_border__WEBPACK_IMPORTED_MODULE_1__.default(disclosureEl));\n      });\n    }\n\n    if (localeDisclosureEls.length > 0) {\n      localeDisclosureEls.forEach(disclosureEl => {\n        this.disclosures.push(new _pixelunion_shopify_cross_border__WEBPACK_IMPORTED_MODULE_1__.default(disclosureEl));\n      });\n    }\n\n    this.events.register(window, 'resize', () => {\n      // If the resize was triggered by an Android device's keyboard opening, return\n      if (document.activeElement.getAttribute('type') === 'email') return;\n      if (!this.mailingListEl) return;\n\n      if (window.innerWidth <= 1080 && window.innerWidth !== this.width) {\n        this.upperFooterEl.insertBefore(this.mailingListEl, this.upperFooterEl.firstChild);\n      } else if (window.innerWidth !== this.width) {\n        this.upperFooterEl.appendChild(this.mailingListEl);\n      }\n    });\n  }\n\n  onSectionUnload() {\n    this.events.unregisterAll();\n    this.disclosures.forEach(disclosure => disclosure.unload());\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNGb290ZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljRm9vdGVyLmpzP2YxYjQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50cyBmcm9tICdAcGl4ZWx1bmlvbi9ldmVudHMnO1xuaW1wb3J0IERpc2Nsb3N1cmUgZnJvbSAnQHBpeGVsdW5pb24vc2hvcGlmeS1jcm9zcy1ib3JkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNGb290ZXIge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5lbCA9IHNlY3Rpb24uZWw7XG4gICAgdGhpcy5tYWlsaW5nTGlzdEVsID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcubWFpbGluZy1saXN0Jyk7XG4gICAgdGhpcy51cHBlckZvb3RlckVsID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcudXBwZXItZm9vdGVyJyk7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG5cbiAgICBjb25zdCBjb3VudHJ5RGlzY2xvc3VyZUVscyA9IHNlY3Rpb24uZWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZGlzY2xvc3VyZS1jb3VudHJ5XScpO1xuICAgIGNvbnN0IGxvY2FsZURpc2Nsb3N1cmVFbHMgPSBzZWN0aW9uLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWRpc2Nsb3N1cmUtbG9jYWxlXScpO1xuICAgIHRoaXMuZGlzY2xvc3VyZXMgPSBbXTtcblxuICAgIGlmIChjb3VudHJ5RGlzY2xvc3VyZUVscy5sZW5ndGggPiAwKSB7XG4gICAgICBjb3VudHJ5RGlzY2xvc3VyZUVscy5mb3JFYWNoKGRpc2Nsb3N1cmVFbCA9PiB7XG4gICAgICAgIHRoaXMuZGlzY2xvc3VyZXMucHVzaChuZXcgRGlzY2xvc3VyZShkaXNjbG9zdXJlRWwpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsb2NhbGVEaXNjbG9zdXJlRWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvY2FsZURpc2Nsb3N1cmVFbHMuZm9yRWFjaChkaXNjbG9zdXJlRWwgPT4ge1xuICAgICAgICB0aGlzLmRpc2Nsb3N1cmVzLnB1c2gobmV3IERpc2Nsb3N1cmUoZGlzY2xvc3VyZUVsKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAvLyBJZiB0aGUgcmVzaXplIHdhcyB0cmlnZ2VyZWQgYnkgYW4gQW5kcm9pZCBkZXZpY2UncyBrZXlib2FyZCBvcGVuaW5nLCByZXR1cm5cbiAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgndHlwZScpID09PSAnZW1haWwnKSByZXR1cm47XG4gICAgICBpZiAoIXRoaXMubWFpbGluZ0xpc3RFbCkgcmV0dXJuO1xuXG4gICAgICBpZiAoKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwODApICYmICh3aW5kb3cuaW5uZXJXaWR0aCAhPT0gdGhpcy53aWR0aCkpIHtcbiAgICAgICAgdGhpcy51cHBlckZvb3RlckVsLmluc2VydEJlZm9yZSh0aGlzLm1haWxpbmdMaXN0RWwsIHRoaXMudXBwZXJGb290ZXJFbC5maXJzdENoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggIT09IHRoaXMud2lkdGgpIHtcbiAgICAgICAgdGhpcy51cHBlckZvb3RlckVsLmFwcGVuZENoaWxkKHRoaXMubWFpbGluZ0xpc3RFbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgdGhpcy5ldmVudHMudW5yZWdpc3RlckFsbCgpO1xuXG4gICAgdGhpcy5kaXNjbG9zdXJlcy5mb3JFYWNoKGRpc2Nsb3N1cmUgPT4gZGlzY2xvc3VyZS51bmxvYWQoKSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBekNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticFooter.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticHeader.js":
/*!*************************************************!*\
  !*** ./source/scripts/sections/StaticHeader.js ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticHeader)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n/* harmony import */ var _StaticNavigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./StaticNavigation */ \"./source/scripts/sections/StaticNavigation.js\");\n/* harmony import */ var _components_PredictiveSearch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/PredictiveSearch */ \"./source/scripts/components/PredictiveSearch.js\");\n/* harmony import */ var _components_SearchTakeover__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/SearchTakeover */ \"./source/scripts/components/SearchTakeover.js\");\n\n\n\n\n\nclass StaticHeader extends _StaticNavigation__WEBPACK_IMPORTED_MODULE_2__.default {\n  constructor(section) {\n    super(section);\n    this.el = section.el;\n    this.headerEvents = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    this.mainHeader = this.el.querySelector('[data-header-main]');\n    this.headerContent = this.el.querySelector('[data-header-content]');\n    this.navigationWrapper = this.el.querySelector('[data-navigation-wrapper]');\n    if (!this.navigationWrapper) return;\n\n    if (true /*DW:nav-forced-mobile*/) {\n      this.navigationContent = this.el.querySelector('.navigation-mobile[data-navigation-content]');\n    } else {\n      this.navigationContent = this.el.querySelector('.navigation-desktop[data-navigation-content]');\n    }\n\n    this.branding = this.el.querySelector('[data-header-branding]');\n    this.headerTools = this.el.querySelector('.header-tools');\n    this.headerRight = this.el.querySelector('[data-header-content-right]');\n    this.cachedHeight = 0;\n    this.cachedStickyHeight = 0;\n    this.isCacheStale = true;\n    this.search = this.el.querySelector('[data-header-search-toggle]');\n    this.searchTakeoverEl = this.el.querySelector('[data-search-takeover]');\n    this.searchTakeover = new _components_SearchTakeover__WEBPACK_IMPORTED_MODULE_4__.default(this.searchTakeoverEl);\n    this.headerEvents.register(this.search, 'click', () => this.searchTakeover.open());\n    this.enablePredictiveSearch = section.data.enable_predictive_search;\n    this.headerSearchForms = this.el.querySelectorAll('[data-search-form]');\n\n    if (this.enablePredictiveSearch === 'true') {\n      this.headerSearchForms.forEach(el => new _components_PredictiveSearch__WEBPACK_IMPORTED_MODULE_3__.default({\n        el\n      }));\n    }\n\n    this.isStickyHeader = section.data.stickyHeader;\n    this.isCompactCenter = section.data.compactCenter === 'compact-center';\n    this.navHeight = 0;\n    this.windowWidth = _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.windowWidth();\n    setTimeout(() => {\n      this.navHeight = this.navigationWrapper.getBoundingClientRect().height;\n    }, 100);\n\n    this._setupBranding();\n\n    this._setCompactCenterHeights();\n\n    this._toggleStickyHeader(this._shouldHeaderStick());\n\n    this._bindEvents();\n\n    this.reloadNavigation();\n  }\n\n  onSectionUnload() {\n    super.onSectionUnload();\n    window.removeEventListener('resize', this.resizeHeader);\n    window.removeEventListener('scroll', this.scrollHeader);\n\n    this._toggleStickyHeader(this._shouldHeaderStick());\n  }\n\n  _bindEvents() {\n    this.resizeHeader = () => {\n      // Prevent resize caused by iOS viewport change\n      if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.windowWidth() === this.windowWidth) {\n        return;\n      }\n\n      this.windowWidth = _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.windowWidth();\n      this.navHeight = this.navigationWrapper.getBoundingClientRect().height;\n      this.isCacheStale = true;\n\n      this._toggleStickyHeader(this._shouldHeaderStick());\n\n      this._setCompactCenterHeights();\n    };\n\n    this.scrollHeader = () => {\n      // Only calculate heights on scroll if sticky header is disabled\n      if (!this.isStickyHeader) {\n        this._setCompactCenterHeights();\n      } // Sticky header calculates heights\n\n\n      this._toggleStickyHeader(this._shouldHeaderStick());\n    };\n\n    window.addEventListener('resize', this.resizeHeader);\n    window.addEventListener('scroll', this.scrollHeader);\n  }\n\n  _shouldHeaderStick() {\n    let shouldStick = false;\n\n    if (!this.isStickyHeader) {\n      return shouldStick;\n    }\n\n    if (this.isCacheStale) {\n      let height = document.body.classList.contains('sticky-header') ? 0 : this.headerContent.getBoundingClientRect().height;\n      let stickyHeight = document.body.classList.contains('sticky-header') ? this.headerContent.getBoundingClientRect().height : 0;\n      document.body.classList.toggle('sticky-header');\n      height = !document.body.classList.contains('sticky-header') ? this.headerContent.getBoundingClientRect().height : height;\n      stickyHeight = !document.body.classList.contains('sticky-header') ? stickyHeight : this.headerContent.getBoundingClientRect().height;\n      document.body.classList.toggle('sticky-header');\n      this.cachedHeight = height;\n      this.cachedStickyHeight = stickyHeight;\n      this.isCacheStale = false;\n    }\n\n    if (window.scrollY > this.headerTools.getBoundingClientRect().height + this.cachedHeight - this.cachedStickyHeight) {\n      shouldStick = true;\n    }\n\n    if (_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge()) {\n      shouldStick = false;\n    }\n\n    return shouldStick;\n  }\n\n  _toggleStickyHeader(toggleOn) {\n    let paddingBottom;\n\n    if (toggleOn == null) {\n      toggleOn = false;\n    }\n\n    if (toggleOn && !document.body.classList.contains('sticky-header')) {\n      paddingBottom = this.cachedHeight;\n      this.mainHeader.style.paddingBottom = `${paddingBottom}px`;\n    }\n\n    if (!toggleOn) {\n      paddingBottom = 0;\n      this.mainHeader.style.paddingBottom = `${paddingBottom}px`;\n    }\n\n    if (toggleOn !== document.body.classList.contains('sticky-header')) {\n      if (toggleOn) {\n        document.body.classList.add('sticky-header');\n      } else {\n        document.body.classList.remove('sticky-header');\n      }\n\n      this._setCompactCenterHeights(!toggleOn);\n    }\n  }\n  /*\n        Match Navigation and Branding heights\n        Center navigation vertically if Branding is taller\n        */\n\n\n  _setCompactCenterHeights(toggleOn) {\n    if (toggleOn == null) {\n      toggleOn = true;\n    }\n\n    if (!this.isCompactCenter) {\n      return;\n    }\n\n    let minHeight = 'auto'; // Get height of inner navigation to prevent height locking on two row navigation\n\n    const navHeight = this.navigationContent.getBoundingClientRect().height;\n    let navOffset = 'auto';\n\n    if (!_themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.isLessThanLarge() && toggleOn) {\n      const logoImg = this.branding.querySelector('img');\n\n      if (logoImg && !logoImg.complete) {\n        this.headerEvents.register(logoImg, 'load', () => this._setCompactCenterHeights());\n      }\n\n      const heights = [];\n      heights.push(navHeight);\n      heights.push(this.branding.getBoundingClientRect().height);\n      minHeight = Math.max.apply(null, heights);\n    }\n\n    if (navHeight < minHeight) {\n      navOffset = (minHeight - navHeight) / 2;\n    }\n\n    this.navHeight = this.navigationWrapper.getBoundingClientRect().height;\n\n    if (this.isStickyHeader && document.body.classList.contains('sticky-header')) {\n      this.headerContent.style.minHeight = 'auto';\n      this.navigationWrapper.style.marginTop = 0;\n    } else {\n      this.headerContent.style.minHeight = `${minHeight}px`;\n      this.navigationWrapper.style.marginTop = `${navOffset}px`;\n    }\n  }\n\n  _setupBranding() {\n    // Clone desktop branding to mobile\n    const mobileBranding = this.branding.cloneNode(true);\n    mobileBranding.removeAttribute('data-header-branding');\n    mobileBranding.classList.remove('header-branding-desktop');\n    mobileBranding.classList.add('header-branding-mobile');\n    this.navigationContent.insertBefore(mobileBranding, this.navigationContent.firstChild);\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNIZWFkZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljSGVhZGVyLmpzPzYxZWIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICdAcGl4ZWx1bmlvbi9ldmVudHMnO1xuaW1wb3J0IHRoZW1lVXRpbHMgZnJvbSAnLi4vdGhlbWVVdGlscyc7XG5pbXBvcnQgU3RhdGljTmF2aWdhdGlvbiBmcm9tICcuL1N0YXRpY05hdmlnYXRpb24nO1xuaW1wb3J0IFByZWRpY3RpdmVTZWFyY2ggZnJvbSAnLi4vY29tcG9uZW50cy9QcmVkaWN0aXZlU2VhcmNoJztcbmltcG9ydCBTZWFyY2hUYWtlb3ZlciBmcm9tICcuLi9jb21wb25lbnRzL1NlYXJjaFRha2VvdmVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljSGVhZGVyIGV4dGVuZHMgU3RhdGljTmF2aWdhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICBzdXBlcihzZWN0aW9uKTtcblxuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuXG4gICAgdGhpcy5oZWFkZXJFdmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG5cbiAgICB0aGlzLm1haW5IZWFkZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhlYWRlci1tYWluXScpO1xuICAgIHRoaXMuaGVhZGVyQ29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGVhZGVyLWNvbnRlbnRdJyk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uV3JhcHBlciA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbmF2aWdhdGlvbi13cmFwcGVyXScpO1xuXG4gICAgaWYgKCF0aGlzLm5hdmlnYXRpb25XcmFwcGVyKSByZXR1cm47XG5cbiAgICBpZiAodGhlbWVVdGlscy5pc0xlc3NUaGFuTGFyZ2UoKSkge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tbW9iaWxlW2RhdGEtbmF2aWdhdGlvbi1jb250ZW50XScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hdmlnYXRpb25Db250ZW50ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcubmF2aWdhdGlvbi1kZXNrdG9wW2RhdGEtbmF2aWdhdGlvbi1jb250ZW50XScpO1xuICAgIH1cblxuICAgIHRoaXMuYnJhbmRpbmcgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhlYWRlci1icmFuZGluZ10nKTtcbiAgICB0aGlzLmhlYWRlclRvb2xzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLXRvb2xzJyk7XG5cbiAgICB0aGlzLmhlYWRlclJpZ2h0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZWFkZXItY29udGVudC1yaWdodF0nKTtcblxuICAgIHRoaXMuY2FjaGVkSGVpZ2h0ID0gMDtcbiAgICB0aGlzLmNhY2hlZFN0aWNreUhlaWdodCA9IDA7XG4gICAgdGhpcy5pc0NhY2hlU3RhbGUgPSB0cnVlO1xuXG4gICAgdGhpcy5zZWFyY2ggPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhlYWRlci1zZWFyY2gtdG9nZ2xlXScpO1xuICAgIHRoaXMuc2VhcmNoVGFrZW92ZXJFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLXRha2VvdmVyXScpO1xuICAgIHRoaXMuc2VhcmNoVGFrZW92ZXIgPSBuZXcgU2VhcmNoVGFrZW92ZXIodGhpcy5zZWFyY2hUYWtlb3ZlckVsKTtcbiAgICB0aGlzLmhlYWRlckV2ZW50cy5yZWdpc3Rlcih0aGlzLnNlYXJjaCwgJ2NsaWNrJywgKCkgPT4gdGhpcy5zZWFyY2hUYWtlb3Zlci5vcGVuKCkpO1xuXG4gICAgdGhpcy5lbmFibGVQcmVkaWN0aXZlU2VhcmNoID0gc2VjdGlvbi5kYXRhLmVuYWJsZV9wcmVkaWN0aXZlX3NlYXJjaDtcbiAgICB0aGlzLmhlYWRlclNlYXJjaEZvcm1zID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zZWFyY2gtZm9ybV0nKTtcblxuICAgIGlmICh0aGlzLmVuYWJsZVByZWRpY3RpdmVTZWFyY2ggPT09ICd0cnVlJykge1xuICAgICAgdGhpcy5oZWFkZXJTZWFyY2hGb3Jtcy5mb3JFYWNoKGVsID0+IG5ldyBQcmVkaWN0aXZlU2VhcmNoKHsgZWwgfSkpO1xuICAgIH1cblxuICAgIHRoaXMuaXNTdGlja3lIZWFkZXIgPSBzZWN0aW9uLmRhdGEuc3RpY2t5SGVhZGVyO1xuICAgIHRoaXMuaXNDb21wYWN0Q2VudGVyID0gc2VjdGlvbi5kYXRhLmNvbXBhY3RDZW50ZXIgPT09ICdjb21wYWN0LWNlbnRlcic7XG4gICAgdGhpcy5uYXZIZWlnaHQgPSAwO1xuICAgIHRoaXMud2luZG93V2lkdGggPSB0aGVtZVV0aWxzLndpbmRvd1dpZHRoKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm5hdkhlaWdodCA9IHRoaXMubmF2aWdhdGlvbldyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIH0sXG4gICAgMTAwKTtcbiAgICB0aGlzLl9zZXR1cEJyYW5kaW5nKCk7XG4gICAgdGhpcy5fc2V0Q29tcGFjdENlbnRlckhlaWdodHMoKTtcbiAgICB0aGlzLl90b2dnbGVTdGlja3lIZWFkZXIodGhpcy5fc2hvdWxkSGVhZGVyU3RpY2soKSk7XG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICAgIHRoaXMucmVsb2FkTmF2aWdhdGlvbigpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHN1cGVyLm9uU2VjdGlvblVubG9hZCgpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlc2l6ZUhlYWRlcik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsSGVhZGVyKTtcbiAgICB0aGlzLl90b2dnbGVTdGlja3lIZWFkZXIodGhpcy5fc2hvdWxkSGVhZGVyU3RpY2soKSk7XG4gIH1cblxuICBfYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLnJlc2l6ZUhlYWRlciA9ICgpID0+IHtcbiAgICAgIC8vIFByZXZlbnQgcmVzaXplIGNhdXNlZCBieSBpT1Mgdmlld3BvcnQgY2hhbmdlXG4gICAgICBpZiAodGhlbWVVdGlscy53aW5kb3dXaWR0aCgpID09PSB0aGlzLndpbmRvd1dpZHRoKSB7IHJldHVybjsgfVxuICAgICAgdGhpcy53aW5kb3dXaWR0aCA9IHRoZW1lVXRpbHMud2luZG93V2lkdGgoKTtcblxuICAgICAgdGhpcy5uYXZIZWlnaHQgPSB0aGlzLm5hdmlnYXRpb25XcmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgdGhpcy5pc0NhY2hlU3RhbGUgPSB0cnVlO1xuXG4gICAgICB0aGlzLl90b2dnbGVTdGlja3lIZWFkZXIodGhpcy5fc2hvdWxkSGVhZGVyU3RpY2soKSk7XG4gICAgICB0aGlzLl9zZXRDb21wYWN0Q2VudGVySGVpZ2h0cygpO1xuICAgIH07XG4gICAgdGhpcy5zY3JvbGxIZWFkZXIgPSAoKSA9PiB7XG4gICAgICAvLyBPbmx5IGNhbGN1bGF0ZSBoZWlnaHRzIG9uIHNjcm9sbCBpZiBzdGlja3kgaGVhZGVyIGlzIGRpc2FibGVkXG4gICAgICBpZiAoIXRoaXMuaXNTdGlja3lIZWFkZXIpIHtcbiAgICAgICAgdGhpcy5fc2V0Q29tcGFjdENlbnRlckhlaWdodHMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RpY2t5IGhlYWRlciBjYWxjdWxhdGVzIGhlaWdodHNcbiAgICAgIHRoaXMuX3RvZ2dsZVN0aWNreUhlYWRlcih0aGlzLl9zaG91bGRIZWFkZXJTdGljaygpKTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlc2l6ZUhlYWRlcik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsSGVhZGVyKTtcbiAgfVxuXG4gIF9zaG91bGRIZWFkZXJTdGljaygpIHtcbiAgICBsZXQgc2hvdWxkU3RpY2sgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5pc1N0aWNreUhlYWRlcikge1xuICAgICAgcmV0dXJuIHNob3VsZFN0aWNrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2FjaGVTdGFsZSkge1xuICAgICAgbGV0IGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGlja3ktaGVhZGVyJykgPyAwIDogdGhpcy5oZWFkZXJDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgIGxldCBzdGlja3lIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnc3RpY2t5LWhlYWRlcicpID8gdGhpcy5oZWFkZXJDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCA6IDA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgnc3RpY2t5LWhlYWRlcicpO1xuXG4gICAgICBoZWlnaHQgPSAhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0aWNreS1oZWFkZXInKSA/IHRoaXMuaGVhZGVyQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgOiBoZWlnaHQ7XG4gICAgICBzdGlja3lIZWlnaHQgPSAhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0aWNreS1oZWFkZXInKSA/IHN0aWNreUhlaWdodCA6IHRoaXMuaGVhZGVyQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgnc3RpY2t5LWhlYWRlcicpO1xuXG4gICAgICB0aGlzLmNhY2hlZEhlaWdodCA9IGhlaWdodDtcbiAgICAgIHRoaXMuY2FjaGVkU3RpY2t5SGVpZ2h0ID0gc3RpY2t5SGVpZ2h0O1xuICAgICAgdGhpcy5pc0NhY2hlU3RhbGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiAoKHRoaXMuaGVhZGVyVG9vbHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgdGhpcy5jYWNoZWRIZWlnaHQpIC0gdGhpcy5jYWNoZWRTdGlja3lIZWlnaHQpKSB7XG4gICAgICBzaG91bGRTdGljayA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoZW1lVXRpbHMuaXNMZXNzVGhhbkxhcmdlKCkpIHtcbiAgICAgIHNob3VsZFN0aWNrID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNob3VsZFN0aWNrO1xuICB9XG5cbiAgX3RvZ2dsZVN0aWNreUhlYWRlcih0b2dnbGVPbikge1xuICAgIGxldCBwYWRkaW5nQm90dG9tO1xuICAgIGlmICh0b2dnbGVPbiA9PSBudWxsKSB7IHRvZ2dsZU9uID0gZmFsc2U7IH1cbiAgICBpZiAodG9nZ2xlT24gJiYgIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGlja3ktaGVhZGVyJykpIHtcbiAgICAgIHBhZGRpbmdCb3R0b20gPSB0aGlzLmNhY2hlZEhlaWdodDtcbiAgICAgIHRoaXMubWFpbkhlYWRlci5zdHlsZS5wYWRkaW5nQm90dG9tID0gYCR7cGFkZGluZ0JvdHRvbX1weGA7XG4gICAgfVxuXG4gICAgaWYgKCF0b2dnbGVPbikge1xuICAgICAgcGFkZGluZ0JvdHRvbSA9IDA7XG4gICAgICB0aGlzLm1haW5IZWFkZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9IGAke3BhZGRpbmdCb3R0b219cHhgO1xuICAgIH1cblxuICAgIGlmICh0b2dnbGVPbiAhPT0gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0aWNreS1oZWFkZXInKSkge1xuICAgICAgaWYgKHRvZ2dsZU9uKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnc3RpY2t5LWhlYWRlcicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzdGlja3ktaGVhZGVyJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zZXRDb21wYWN0Q2VudGVySGVpZ2h0cyghdG9nZ2xlT24pO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAgICAgIE1hdGNoIE5hdmlnYXRpb24gYW5kIEJyYW5kaW5nIGhlaWdodHNcbiAgICAgICAgQ2VudGVyIG5hdmlnYXRpb24gdmVydGljYWxseSBpZiBCcmFuZGluZyBpcyB0YWxsZXJcbiAgICAgICAgKi9cbiAgX3NldENvbXBhY3RDZW50ZXJIZWlnaHRzKHRvZ2dsZU9uKSB7XG4gICAgaWYgKHRvZ2dsZU9uID09IG51bGwpIHsgdG9nZ2xlT24gPSB0cnVlOyB9XG4gICAgaWYgKCF0aGlzLmlzQ29tcGFjdENlbnRlcikgeyByZXR1cm47IH1cblxuICAgIGxldCBtaW5IZWlnaHQgPSAnYXV0byc7XG5cbiAgICAvLyBHZXQgaGVpZ2h0IG9mIGlubmVyIG5hdmlnYXRpb24gdG8gcHJldmVudCBoZWlnaHQgbG9ja2luZyBvbiB0d28gcm93IG5hdmlnYXRpb25cbiAgICBjb25zdCBuYXZIZWlnaHQgPSB0aGlzLm5hdmlnYXRpb25Db250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBsZXQgbmF2T2Zmc2V0ID0gJ2F1dG8nO1xuXG4gICAgaWYgKCF0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpICYmIHRvZ2dsZU9uKSB7XG4gICAgICBjb25zdCBsb2dvSW1nID0gdGhpcy5icmFuZGluZy5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcbiAgICAgIGlmIChsb2dvSW1nICYmICFsb2dvSW1nLmNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyRXZlbnRzLnJlZ2lzdGVyKGxvZ29JbWcsICdsb2FkJywgKCkgPT4gdGhpcy5fc2V0Q29tcGFjdENlbnRlckhlaWdodHMoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoZWlnaHRzID0gW107XG4gICAgICBoZWlnaHRzLnB1c2gobmF2SGVpZ2h0KTtcbiAgICAgIGhlaWdodHMucHVzaCh0aGlzLmJyYW5kaW5nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG5cbiAgICAgIG1pbkhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGhlaWdodHMpO1xuICAgIH1cblxuICAgIGlmIChuYXZIZWlnaHQgPCBtaW5IZWlnaHQpIHtcbiAgICAgIG5hdk9mZnNldCA9IChtaW5IZWlnaHQgLSBuYXZIZWlnaHQpIC8gMjtcbiAgICB9XG5cbiAgICB0aGlzLm5hdkhlaWdodCA9IHRoaXMubmF2aWdhdGlvbldyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgaWYgKHRoaXMuaXNTdGlja3lIZWFkZXIgJiYgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3N0aWNreS1oZWFkZXInKSkge1xuICAgICAgdGhpcy5oZWFkZXJDb250ZW50LnN0eWxlLm1pbkhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIuc3R5bGUubWFyZ2luVG9wID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJDb250ZW50LnN0eWxlLm1pbkhlaWdodCA9IGAke21pbkhlaWdodH1weGA7XG4gICAgICB0aGlzLm5hdmlnYXRpb25XcmFwcGVyLnN0eWxlLm1hcmdpblRvcCA9IGAke25hdk9mZnNldH1weGA7XG4gICAgfVxuICB9XG5cbiAgX3NldHVwQnJhbmRpbmcoKSB7XG4gICAgLy8gQ2xvbmUgZGVza3RvcCBicmFuZGluZyB0byBtb2JpbGVcbiAgICBjb25zdCBtb2JpbGVCcmFuZGluZyA9IHRoaXMuYnJhbmRpbmcuY2xvbmVOb2RlKHRydWUpO1xuXG4gICAgbW9iaWxlQnJhbmRpbmcucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhlYWRlci1icmFuZGluZycpO1xuICAgIG1vYmlsZUJyYW5kaW5nLmNsYXNzTGlzdC5yZW1vdmUoJ2hlYWRlci1icmFuZGluZy1kZXNrdG9wJyk7XG4gICAgbW9iaWxlQnJhbmRpbmcuY2xhc3NMaXN0LmFkZCgnaGVhZGVyLWJyYW5kaW5nLW1vYmlsZScpO1xuXG4gICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5pbnNlcnRCZWZvcmUobW9iaWxlQnJhbmRpbmcsIHRoaXMubmF2aWdhdGlvbkNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFyTUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticHeader.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticNavigation.js":
/*!*****************************************************!*\
  !*** ./source/scripts/sections/StaticNavigation.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticNavigation)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _themeUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../themeUtils */ \"./source/scripts/themeUtils.js\");\n\n\nclass StaticNavigation {\n  constructor(section) {\n    this.el = section.el;\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    this.navigationWrapper = this.el.querySelector('[data-navigation-wrapper]');\n    if (!this.navigationWrapper) return;\n    this.navigationWrapper.classList.add('navigation--loading');\n    this.reloadNavigation();\n    this.navigationWrapper.classList.remove('navigation--loading');\n    this.navigationWrapper.classList.add('navigation--loaded');\n  }\n\n  reloadNavigation() {\n    this.events.unregisterAll();\n\n    if (!true /*DW:nav-forced-mobile*/) {\n      this.navigationContent = this.el.querySelector('.navigation-desktop[data-navigation-content]');\n      const headerBranding = document.querySelector('[data-header-branding]');\n      headerBranding.parentNode.insertBefore(this.navigationWrapper, headerBranding.nextSibling);\n      const megaNavs = this.navigationContent.querySelectorAll('li[data-mega-nav=\"true\"]');\n      megaNavs.forEach(el => {\n        el.classList.remove('has-dropdown');\n        el.classList.add('has-mega-nav');\n      });\n    } else {\n      this.navigationContent = this.el.querySelector('.navigation-mobile[data-navigation-content]');\n      const headerMain = document.querySelector('[data-header-main]');\n      headerMain.parentNode.insertBefore(this.navigationWrapper, headerMain.nextSibling);\n      const megaNavs = this.navigationContent.querySelectorAll('li[data-mega-nav=\"true\"]');\n      megaNavs.forEach(el => {\n        el.classList.add('has-dropdown');\n        el.classList.remove('has-mega-nav');\n      });\n    }\n\n    this.el.querySelectorAll('.mega-nav-list li a, .mega-nav-list li summary').forEach(anchor => this.events.register(anchor, 'mouseover', this._onMegaNavAnchorMouseover.bind(this)));\n    this.el.querySelectorAll('.mega-nav-list a, .mega-nav-list summary').forEach(anchor => this.events.register(anchor, 'mouseleave', this._onMegaNavAnchorMouseleave.bind(this)));\n    this.el.querySelectorAll('[data-header-nav-toggle]').forEach(toggle => this.events.register(toggle, 'click', this._onMobileNavigationClick.bind(this)));\n    this.events.register(window, 'resize', _themeUtils__WEBPACK_IMPORTED_MODULE_1__.default.debounce(this._onResize.bind(this), 500));\n    const currentCloseAction = {\n      el: null,\n      timeout: null\n    };\n    this.el.querySelectorAll('.has-dropdown, .has-mega-nav').forEach(toggle => this.events.register(toggle, 'mouseenter', event => {\n      if (true /*DW:nav-forced-mobile*/) return;\n      const {\n        currentTarget\n      } = event;\n\n      if (currentCloseAction.el && currentCloseAction.timeout) {\n        clearTimeout(currentCloseAction.timeout);\n\n        this._closeDropdown(currentCloseAction.el);\n\n        currentCloseAction.el = null;\n        currentCloseAction.timeout = null;\n      }\n\n      if (currentTarget.classList.contains('has-mega-nav')) {\n        this._swapMegaNavImages(currentTarget.querySelector('.mega-nav-image img'));\n      }\n\n      this._openDropdown(currentTarget);\n    }));\n    this.el.querySelectorAll('.has-dropdown, .has-mega-nav').forEach(toggle => this.events.register(toggle, 'mouseleave', event => {\n      if (true /*DW:nav-forced-mobile*/) return;\n      const {\n        currentTarget\n      } = event;\n\n      if (currentCloseAction.el && currentCloseAction.timeout) {\n        // Don't add another action for an element that is nested within a currently closing dropdown\n        if (currentCloseAction.el.contains(currentTarget)) return;\n        clearTimeout(currentCloseAction.timeout); // Close the current dropdown if one exists and hasn't been run, but only if it isn't a child of this new event\n\n        if (!currentTarget.contains(currentCloseAction.el)) {\n          this._closeDropdown(currentCloseAction.el);\n        }\n      }\n\n      currentCloseAction.el = currentTarget;\n      currentCloseAction.timeout = setTimeout(() => {\n        this._closeDropdown(currentCloseAction.el);\n\n        currentCloseAction.el = null;\n        currentCloseAction.timeout = null;\n      }, 400);\n    }));\n    this.detailsElements = this.el.querySelectorAll('[data-nav-details]');\n    this.firstLevelDetails = [...this.el.querySelectorAll('.navigation-menu > .has-dropdown > [data-nav-details]')];\n\n    this.click = e => {\n      e.stopPropagation();\n      const clickedParent = e.target.closest('.navigation-menu-link');\n      const clickedDetailsEl = e.target.closest('[data-nav-details]'); // Close siblings\n\n      if (this.firstLevelDetails.includes(clickedDetailsEl)) {\n        this.firstLevelDetails.forEach(detailsElement => {\n          const details = detailsElement;\n\n          if (details !== clickedDetailsEl) {\n            details.open = false;\n          }\n        });\n      } // If the link being clicked is a parent link, then take control of the navigation\n\n\n      if (clickedParent && clickedParent.dataset.href) {\n        e.preventDefault(); // if already open, continue to link destination\n\n        if (clickedDetailsEl.open) {\n          window.location = clickedParent.dataset.href;\n          return;\n        } // If the submenu isn't open, open it\n\n\n        clickedDetailsEl.open = true;\n      }\n    };\n\n    if (false /*DW:nav-forced-mobile*/) {\n      // Adding click event for details elements on desktop\n      this.detailsElements.forEach(detailsElement => this.events.register(detailsElement, 'click', event => this.click(event)));\n      this.detailsElements.forEach(detailsElement => this.events.register(detailsElement, 'touchend', e => this.click(e)));\n    }\n\n    this.el.querySelectorAll('.has-dropdown > a > [data-subnav-toggle]').forEach(toggle => this.events.register(toggle, 'click', event => {\n      event.stopPropagation();\n      event.preventDefault();\n      const {\n        currentTarget\n      } = event;\n      const triggerEl = currentTarget.parentElement.parentElement;\n\n      if (triggerEl.classList.contains('has-dropdown--active')) {\n        this._closeDropdown(triggerEl);\n      } else {\n        this._openDropdown(triggerEl);\n      }\n    }));\n    this.el.querySelectorAll('.navigation-submenu').forEach(toggle => this.events.register(toggle, 'revealer-animating', event => {\n      if (true /*DW:nav-forced-mobile*/) {\n        return;\n      }\n\n      const {\n        currentTarget: dropdown\n      } = event;\n\n      if (!dropdown.classList.contains('animating-in')) {\n        return;\n      }\n\n      dropdown.classList.remove('navigation-submenu-open-left');\n      dropdown.style.opacity = 0;\n      dropdown.style.display = 'block';\n      const navigationWidth = this.navigationWrapper.getBoundingClientRect().width;\n      const offset = dropdown.getBoundingClientRect().left + window.pageXOffset;\n\n      if (offset + 200 > navigationWidth) {\n        dropdown.classList.add('navigation-submenu-open-left');\n      }\n\n      dropdown.style.opacity = '';\n      dropdown.style.display = '';\n    }));\n  }\n\n  onSectionDeselect() {\n    this._toggleMobileNavigation('close');\n  }\n\n  onSectionUnload() {\n    this.events.unregisterAll();\n\n    this._toggleMobileNavigation('close');\n  }\n\n  _onResize() {\n    if (!true /*DW:nav-forced-mobile*/) {\n      this._toggleMobileNavigation('close');\n    }\n\n    this.reloadNavigation();\n  }\n\n  _onMegaNavAnchorMouseover(e) {\n    this._swapMegaNavImages(e.currentTarget.parentNode);\n  }\n\n  _onMegaNavAnchorMouseleave(e) {\n    const megaNavImage = e.target.closest('.mega-nav').querySelector('.mega-nav-image img');\n    if (!megaNavImage) return;\n    megaNavImage.setAttribute('src', megaNavImage.dataset.image);\n    megaNavImage.setAttribute('alt', megaNavImage.dataset.alt);\n  }\n\n  _onMobileNavigationClick() {\n    this._toggleMobileNavigation();\n  }\n\n  _openDropdown(triggerEl) {\n    triggerEl.classList.add('has-dropdown--active');\n    const navigationSubmenuToggle = triggerEl.querySelector('.navigation-submenu-toggle');\n\n    if (true /*DW:nav-forced-mobile*/) {\n      const dropdown = triggerEl.querySelector('.navigation-submenu');\n      triggerEl.classList.add('has-mobile-dropdown--active');\n      dropdown.classList.add('navigation-submenu-visible');\n\n      this._setTierHeight();\n    } else {\n      const megaNav = triggerEl.querySelector('.mega-nav');\n      const dropdown = triggerEl.querySelector('.navigation-submenu');\n\n      if (megaNav) {\n        megaNav.classList.add('visible');\n      } else {\n        dropdown.classList.add('navigation-submenu-visible');\n        dropdown.classList.add('visible');\n      }\n    }\n\n    navigationSubmenuToggle.setAttribute('aria-expanded', true);\n    this.details = triggerEl.querySelector('[data-nav-details]');\n\n    if (this.details && false /*DW:nav-forced-mobile*/) {\n      this.details.open = true;\n    }\n  }\n\n  _closeDropdown(triggerEl) {\n    triggerEl.classList.remove('has-dropdown--active');\n    triggerEl.querySelectorAll('.has-dropdown, .has-mega-nav').forEach(innerTriggerEl => this._closeDropdown(innerTriggerEl));\n    const dropdown = triggerEl.querySelector('.navigation-submenu');\n    const megaNav = triggerEl.querySelector('.mega-nav');\n    const navigationSubmenuToggle = triggerEl.querySelector('.navigation-submenu-toggle');\n\n    if (dropdown) {\n      dropdown.classList.remove('navigation-submenu-visible');\n      dropdown.classList.remove('visible');\n    }\n\n    triggerEl.classList.remove('has-mobile-dropdown--active');\n\n    if (megaNav) {\n      megaNav.classList.remove('visible');\n    }\n\n    this._setTierHeight();\n\n    if (navigationSubmenuToggle) {\n      navigationSubmenuToggle.setAttribute('aria-expanded', false);\n    }\n\n    this.details = triggerEl.querySelector('[data-nav-details]');\n\n    if (this.details && false /*DW:nav-forced-mobile*/) {\n      this.details.open = false;\n    }\n  }\n\n  _toggleMobileNavigation(force = null) {\n    if (document.body.classList.contains('mobile-nav-open') && force !== 'open') {\n      this.navigationContent.removeAttribute('style');\n      document.body.classList.remove('mobile-nav-open');\n      document.body.classList.remove('lock-scroll');\n      this.navigationContent.classList.remove('visible');\n      this.navigationWrapper.classList.remove('visible');\n      this.navigationWrapper.classList.remove('background'); // Close opened menus on navigation close\n\n      this.navigationContent.querySelectorAll('.has-dropdown--active').forEach(triggerEl => this._closeDropdown(triggerEl));\n    } else if (!document.body.classList.contains('mobile-nav-open') && force !== 'close') {\n      document.body.classList.add('mobile-nav-open');\n      document.body.classList.add('lock-scroll');\n      this.navigationWrapper.classList.add('visible');\n      this.navigationWrapper.classList.add('background');\n      this.navigationContent.classList.add('visible');\n\n      this._setTierHeight();\n    }\n  }\n\n  _setTierHeight() {\n    this.navigationContent.style.overflowY = scroll;\n    this.navigationContent.style.height = '100%';\n  }\n\n  _swapMegaNavImages(target) {\n    if (!target) return;\n    const {\n      image,\n      imageAlt\n    } = target.dataset;\n\n    if (image && image !== '') {\n      const megaNavImg = target.closest('.mega-nav').querySelector('.mega-nav-image img');\n      if (!megaNavImg) return;\n      megaNavImg.setAttribute('src', image);\n      megaNavImg.setAttribute('srcset', '');\n      megaNavImg.setAttribute('alt', imageAlt);\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNOYXZpZ2F0aW9uLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY05hdmlnYXRpb24uanM/Yjk0MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgdGhlbWVVdGlscyBmcm9tICcuLi90aGVtZVV0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljTmF2aWdhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcblxuICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5hdmlnYXRpb24td3JhcHBlcl0nKTtcblxuICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uV3JhcHBlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5uYXZpZ2F0aW9uV3JhcHBlci5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLS1sb2FkaW5nJyk7XG5cbiAgICB0aGlzLnJlbG9hZE5hdmlnYXRpb24oKTtcblxuICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgnbmF2aWdhdGlvbi0tbG9hZGluZycpO1xuICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIuY2xhc3NMaXN0LmFkZCgnbmF2aWdhdGlvbi0tbG9hZGVkJyk7XG4gIH1cblxuICByZWxvYWROYXZpZ2F0aW9uKCkge1xuICAgIHRoaXMuZXZlbnRzLnVucmVnaXN0ZXJBbGwoKTtcblxuICAgIGlmICghdGhlbWVVdGlscy5pc0xlc3NUaGFuTGFyZ2UoKSkge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tZGVza3RvcFtkYXRhLW5hdmlnYXRpb24tY29udGVudF0nKTtcblxuICAgICAgY29uc3QgaGVhZGVyQnJhbmRpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZWFkZXItYnJhbmRpbmddJyk7XG5cbiAgICAgIGhlYWRlckJyYW5kaW5nLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubmF2aWdhdGlvbldyYXBwZXIsIGhlYWRlckJyYW5kaW5nLm5leHRTaWJsaW5nKTtcblxuICAgICAgY29uc3QgbWVnYU5hdnMgPSB0aGlzLm5hdmlnYXRpb25Db250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpW2RhdGEtbWVnYS1uYXY9XCJ0cnVlXCJdJyk7XG5cbiAgICAgIG1lZ2FOYXZzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtZHJvcGRvd24nKTtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnaGFzLW1lZ2EtbmF2Jyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tbW9iaWxlW2RhdGEtbmF2aWdhdGlvbi1jb250ZW50XScpO1xuXG4gICAgICBjb25zdCBoZWFkZXJNYWluID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtaGVhZGVyLW1haW5dJyk7XG5cbiAgICAgIGhlYWRlck1haW4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5uYXZpZ2F0aW9uV3JhcHBlciwgaGVhZGVyTWFpbi5uZXh0U2libGluZyk7XG5cbiAgICAgIGNvbnN0IG1lZ2FOYXZzID0gdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaVtkYXRhLW1lZ2EtbmF2PVwidHJ1ZVwiXScpO1xuXG4gICAgICBtZWdhTmF2cy5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnaGFzLWRyb3Bkb3duJyk7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1tZWdhLW5hdicpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYS1uYXYtbGlzdCBsaSBhLCAubWVnYS1uYXYtbGlzdCBsaSBzdW1tYXJ5JykuZm9yRWFjaChhbmNob3IgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIoYW5jaG9yLCAnbW91c2VvdmVyJywgdGhpcy5fb25NZWdhTmF2QW5jaG9yTW91c2VvdmVyLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhLW5hdi1saXN0IGEsIC5tZWdhLW5hdi1saXN0IHN1bW1hcnknKS5mb3JFYWNoKGFuY2hvciA9PiB0aGlzLmV2ZW50cy5yZWdpc3RlcihhbmNob3IsICdtb3VzZWxlYXZlJywgdGhpcy5fb25NZWdhTmF2QW5jaG9yTW91c2VsZWF2ZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1oZWFkZXItbmF2LXRvZ2dsZV0nKS5mb3JFYWNoKHRvZ2dsZSA9PiB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0b2dnbGUsICdjbGljaycsIHRoaXMuX29uTW9iaWxlTmF2aWdhdGlvbkNsaWNrLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdyZXNpemUnLCB0aGVtZVV0aWxzLmRlYm91bmNlKHRoaXMuX29uUmVzaXplLmJpbmQodGhpcyksIDUwMCkpO1xuXG4gICAgY29uc3QgY3VycmVudENsb3NlQWN0aW9uID0ge1xuICAgICAgZWw6IG51bGwsXG4gICAgICB0aW1lb3V0OiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWRyb3Bkb3duLCAuaGFzLW1lZ2EtbmF2JykuZm9yRWFjaCh0b2dnbGUgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIodG9nZ2xlLCAnbW91c2VlbnRlcicsIGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmIChjdXJyZW50Q2xvc2VBY3Rpb24uZWwgJiYgY3VycmVudENsb3NlQWN0aW9uLnRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGN1cnJlbnRDbG9zZUFjdGlvbi50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bihjdXJyZW50Q2xvc2VBY3Rpb24uZWwpO1xuICAgICAgICBjdXJyZW50Q2xvc2VBY3Rpb24uZWwgPSBudWxsO1xuICAgICAgICBjdXJyZW50Q2xvc2VBY3Rpb24udGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50VGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnaGFzLW1lZ2EtbmF2JykpIHtcbiAgICAgICAgdGhpcy5fc3dhcE1lZ2FOYXZJbWFnZXMoY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCcubWVnYS1uYXYtaW1hZ2UgaW1nJykpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vcGVuRHJvcGRvd24oY3VycmVudFRhcmdldCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWRyb3Bkb3duLCAuaGFzLW1lZ2EtbmF2JykuZm9yRWFjaCh0b2dnbGUgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIodG9nZ2xlLCAnbW91c2VsZWF2ZScsIGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmIChjdXJyZW50Q2xvc2VBY3Rpb24uZWwgJiYgY3VycmVudENsb3NlQWN0aW9uLnRpbWVvdXQpIHtcbiAgICAgICAgLy8gRG9uJ3QgYWRkIGFub3RoZXIgYWN0aW9uIGZvciBhbiBlbGVtZW50IHRoYXQgaXMgbmVzdGVkIHdpdGhpbiBhIGN1cnJlbnRseSBjbG9zaW5nIGRyb3Bkb3duXG4gICAgICAgIGlmIChjdXJyZW50Q2xvc2VBY3Rpb24uZWwuY29udGFpbnMoY3VycmVudFRhcmdldCkpIHJldHVybjtcblxuICAgICAgICBjbGVhclRpbWVvdXQoY3VycmVudENsb3NlQWN0aW9uLnRpbWVvdXQpO1xuXG4gICAgICAgIC8vIENsb3NlIHRoZSBjdXJyZW50IGRyb3Bkb3duIGlmIG9uZSBleGlzdHMgYW5kIGhhc24ndCBiZWVuIHJ1biwgYnV0IG9ubHkgaWYgaXQgaXNuJ3QgYSBjaGlsZCBvZiB0aGlzIG5ldyBldmVudFxuICAgICAgICBpZiAoIWN1cnJlbnRUYXJnZXQuY29udGFpbnMoY3VycmVudENsb3NlQWN0aW9uLmVsKSkge1xuICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oY3VycmVudENsb3NlQWN0aW9uLmVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjdXJyZW50Q2xvc2VBY3Rpb24uZWwgPSBjdXJyZW50VGFyZ2V0O1xuICAgICAgY3VycmVudENsb3NlQWN0aW9uLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bihjdXJyZW50Q2xvc2VBY3Rpb24uZWwpO1xuICAgICAgICBjdXJyZW50Q2xvc2VBY3Rpb24uZWwgPSBudWxsO1xuICAgICAgICBjdXJyZW50Q2xvc2VBY3Rpb24udGltZW91dCA9IG51bGw7XG4gICAgICB9LCA0MDApO1xuICAgIH0pKTtcblxuICAgIHRoaXMuZGV0YWlsc0VsZW1lbnRzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1uYXYtZGV0YWlsc10nKTtcblxuICAgIHRoaXMuZmlyc3RMZXZlbERldGFpbHMgPSBbLi4udGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2aWdhdGlvbi1tZW51ID4gLmhhcy1kcm9wZG93biA+IFtkYXRhLW5hdi1kZXRhaWxzXScpXTtcblxuICAgIHRoaXMuY2xpY2sgPSBlID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IGNsaWNrZWRQYXJlbnQgPSBlLnRhcmdldC5jbG9zZXN0KCcubmF2aWdhdGlvbi1tZW51LWxpbmsnKTtcbiAgICAgIGNvbnN0IGNsaWNrZWREZXRhaWxzRWwgPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1uYXYtZGV0YWlsc10nKTtcblxuICAgICAgLy8gQ2xvc2Ugc2libGluZ3NcbiAgICAgIGlmICh0aGlzLmZpcnN0TGV2ZWxEZXRhaWxzLmluY2x1ZGVzKGNsaWNrZWREZXRhaWxzRWwpKSB7XG4gICAgICAgIHRoaXMuZmlyc3RMZXZlbERldGFpbHMuZm9yRWFjaChkZXRhaWxzRWxlbWVudCA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRldGFpbHNFbGVtZW50O1xuICAgICAgICAgIGlmIChkZXRhaWxzICE9PSBjbGlja2VkRGV0YWlsc0VsKSB7XG4gICAgICAgICAgICBkZXRhaWxzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgbGluayBiZWluZyBjbGlja2VkIGlzIGEgcGFyZW50IGxpbmssIHRoZW4gdGFrZSBjb250cm9sIG9mIHRoZSBuYXZpZ2F0aW9uXG4gICAgICBpZiAoY2xpY2tlZFBhcmVudCAmJiBjbGlja2VkUGFyZW50LmRhdGFzZXQuaHJlZikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIGlmIGFscmVhZHkgb3BlbiwgY29udGludWUgdG8gbGluayBkZXN0aW5hdGlvblxuICAgICAgICBpZiAoY2xpY2tlZERldGFpbHNFbC5vcGVuKSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gY2xpY2tlZFBhcmVudC5kYXRhc2V0LmhyZWY7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHN1Ym1lbnUgaXNuJ3Qgb3Blbiwgb3BlbiBpdFxuICAgICAgICBjbGlja2VkRGV0YWlsc0VsLm9wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodGhlbWVVdGlscy5pc0xhcmdlKCkpIHtcbiAgICAgIC8vIEFkZGluZyBjbGljayBldmVudCBmb3IgZGV0YWlscyBlbGVtZW50cyBvbiBkZXNrdG9wXG4gICAgICB0aGlzLmRldGFpbHNFbGVtZW50cy5mb3JFYWNoKGRldGFpbHNFbGVtZW50ID0+IHRoaXMuZXZlbnRzLnJlZ2lzdGVyKGRldGFpbHNFbGVtZW50LCAnY2xpY2snLCBldmVudCA9PiB0aGlzLmNsaWNrKGV2ZW50KSkpO1xuICAgICAgdGhpcy5kZXRhaWxzRWxlbWVudHMuZm9yRWFjaChkZXRhaWxzRWxlbWVudCA9PiB0aGlzLmV2ZW50cy5yZWdpc3RlcihkZXRhaWxzRWxlbWVudCwgJ3RvdWNoZW5kJywgZSA9PiB0aGlzLmNsaWNrKGUpKSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWRyb3Bkb3duID4gYSA+IFtkYXRhLXN1Ym5hdi10b2dnbGVdJykuZm9yRWFjaCh0b2dnbGUgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIodG9nZ2xlLCAnY2xpY2snLCBldmVudCA9PiB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCB9ID0gZXZlbnQ7XG4gICAgICBjb25zdCB0cmlnZ2VyRWwgPSBjdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgaWYgKHRyaWdnZXJFbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hhcy1kcm9wZG93bi0tYWN0aXZlJykpIHtcbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bih0cmlnZ2VyRWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fb3BlbkRyb3Bkb3duKHRyaWdnZXJFbCk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2aWdhdGlvbi1zdWJtZW51JykuZm9yRWFjaCh0b2dnbGUgPT4gdGhpcy5ldmVudHMucmVnaXN0ZXIodG9nZ2xlLCAncmV2ZWFsZXItYW5pbWF0aW5nJywgZXZlbnQgPT4ge1xuICAgICAgaWYgKHRoZW1lVXRpbHMuaXNMZXNzVGhhbkxhcmdlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQ6IGRyb3Bkb3duIH0gPSBldmVudDtcblxuICAgICAgaWYgKCFkcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoJ2FuaW1hdGluZy1pbicpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZHJvcGRvd24uY2xhc3NMaXN0LnJlbW92ZSgnbmF2aWdhdGlvbi1zdWJtZW51LW9wZW4tbGVmdCcpO1xuICAgICAgZHJvcGRvd24uc3R5bGUub3BhY2l0eSA9IDA7XG4gICAgICBkcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIGNvbnN0IG5hdmlnYXRpb25XaWR0aCA9IHRoaXMubmF2aWdhdGlvbldyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICBjb25zdCBvZmZzZXQgPSBkcm9wZG93bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgd2luZG93LnBhZ2VYT2Zmc2V0O1xuXG4gICAgICBpZiAoKG9mZnNldCArIDIwMCkgPiBuYXZpZ2F0aW9uV2lkdGgpIHtcbiAgICAgICAgZHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnbmF2aWdhdGlvbi1zdWJtZW51LW9wZW4tbGVmdCcpO1xuICAgICAgfVxuXG4gICAgICBkcm9wZG93bi5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgICBkcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfSkpO1xuICB9XG5cbiAgb25TZWN0aW9uRGVzZWxlY3QoKSB7XG4gICAgdGhpcy5fdG9nZ2xlTW9iaWxlTmF2aWdhdGlvbignY2xvc2UnKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLmV2ZW50cy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgdGhpcy5fdG9nZ2xlTW9iaWxlTmF2aWdhdGlvbignY2xvc2UnKTtcbiAgfVxuXG4gIF9vblJlc2l6ZSgpIHtcbiAgICBpZiAoIXRoZW1lVXRpbHMuaXNMZXNzVGhhbkxhcmdlKCkpIHtcbiAgICAgIHRoaXMuX3RvZ2dsZU1vYmlsZU5hdmlnYXRpb24oJ2Nsb3NlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxvYWROYXZpZ2F0aW9uKCk7XG4gIH1cblxuICBfb25NZWdhTmF2QW5jaG9yTW91c2VvdmVyKGUpIHtcbiAgICB0aGlzLl9zd2FwTWVnYU5hdkltYWdlcyhlLmN1cnJlbnRUYXJnZXQucGFyZW50Tm9kZSk7XG4gIH1cblxuICBfb25NZWdhTmF2QW5jaG9yTW91c2VsZWF2ZShlKSB7XG4gICAgY29uc3QgbWVnYU5hdkltYWdlID0gZS50YXJnZXRcbiAgICAgIC5jbG9zZXN0KCcubWVnYS1uYXYnKVxuICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5tZWdhLW5hdi1pbWFnZSBpbWcnKTtcblxuICAgIGlmICghbWVnYU5hdkltYWdlKSByZXR1cm47XG5cbiAgICBtZWdhTmF2SW1hZ2Uuc2V0QXR0cmlidXRlKCdzcmMnLCBtZWdhTmF2SW1hZ2UuZGF0YXNldC5pbWFnZSk7XG4gICAgbWVnYU5hdkltYWdlLnNldEF0dHJpYnV0ZSgnYWx0JywgbWVnYU5hdkltYWdlLmRhdGFzZXQuYWx0KTtcbiAgfVxuXG4gIF9vbk1vYmlsZU5hdmlnYXRpb25DbGljaygpIHtcbiAgICB0aGlzLl90b2dnbGVNb2JpbGVOYXZpZ2F0aW9uKCk7XG4gIH1cblxuICBfb3BlbkRyb3Bkb3duKHRyaWdnZXJFbCkge1xuICAgIHRyaWdnZXJFbC5jbGFzc0xpc3QuYWRkKCdoYXMtZHJvcGRvd24tLWFjdGl2ZScpO1xuXG4gICAgY29uc3QgbmF2aWdhdGlvblN1Ym1lbnVUb2dnbGUgPSB0cmlnZ2VyRWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tc3VibWVudS10b2dnbGUnKTtcblxuICAgIGlmICh0aGVtZVV0aWxzLmlzTGVzc1RoYW5MYXJnZSgpKSB7XG4gICAgICBjb25zdCBkcm9wZG93biA9IHRyaWdnZXJFbC5xdWVyeVNlbGVjdG9yKCcubmF2aWdhdGlvbi1zdWJtZW51Jyk7XG4gICAgICB0cmlnZ2VyRWwuY2xhc3NMaXN0LmFkZCgnaGFzLW1vYmlsZS1kcm9wZG93bi0tYWN0aXZlJyk7XG4gICAgICBkcm9wZG93bi5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLXN1Ym1lbnUtdmlzaWJsZScpO1xuICAgICAgdGhpcy5fc2V0VGllckhlaWdodCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZWdhTmF2ID0gdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3IoJy5tZWdhLW5hdicpO1xuICAgICAgY29uc3QgZHJvcGRvd24gPSB0cmlnZ2VyRWwucXVlcnlTZWxlY3RvcignLm5hdmlnYXRpb24tc3VibWVudScpO1xuXG4gICAgICBpZiAobWVnYU5hdikge1xuICAgICAgICBtZWdhTmF2LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ25hdmlnYXRpb24tc3VibWVudS12aXNpYmxlJyk7XG4gICAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuYXZpZ2F0aW9uU3VibWVudVRvZ2dsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcblxuICAgIHRoaXMuZGV0YWlscyA9IHRyaWdnZXJFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uYXYtZGV0YWlsc10nKTtcbiAgICBpZiAodGhpcy5kZXRhaWxzICYmIHRoZW1lVXRpbHMuaXNMYXJnZSgpKSB7XG4gICAgICB0aGlzLmRldGFpbHMub3BlbiA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgX2Nsb3NlRHJvcGRvd24odHJpZ2dlckVsKSB7XG4gICAgdHJpZ2dlckVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1kcm9wZG93bi0tYWN0aXZlJyk7XG4gICAgdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5oYXMtZHJvcGRvd24sIC5oYXMtbWVnYS1uYXYnKS5mb3JFYWNoKGlubmVyVHJpZ2dlckVsID0+IHRoaXMuX2Nsb3NlRHJvcGRvd24oaW5uZXJUcmlnZ2VyRWwpKTtcblxuICAgIGNvbnN0IGRyb3Bkb3duID0gdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3IoJy5uYXZpZ2F0aW9uLXN1Ym1lbnUnKTtcbiAgICBjb25zdCBtZWdhTmF2ID0gdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3IoJy5tZWdhLW5hdicpO1xuICAgIGNvbnN0IG5hdmlnYXRpb25TdWJtZW51VG9nZ2xlID0gdHJpZ2dlckVsLnF1ZXJ5U2VsZWN0b3IoJy5uYXZpZ2F0aW9uLXN1Ym1lbnUtdG9nZ2xlJyk7XG5cbiAgICBpZiAoZHJvcGRvd24pIHtcbiAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5yZW1vdmUoJ25hdmlnYXRpb24tc3VibWVudS12aXNpYmxlJyk7XG4gICAgICBkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgfVxuXG4gICAgdHJpZ2dlckVsLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1tb2JpbGUtZHJvcGRvd24tLWFjdGl2ZScpO1xuXG4gICAgaWYgKG1lZ2FOYXYpIHtcbiAgICAgIG1lZ2FOYXYuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRUaWVySGVpZ2h0KCk7XG5cbiAgICBpZiAobmF2aWdhdGlvblN1Ym1lbnVUb2dnbGUpIHtcbiAgICAgIG5hdmlnYXRpb25TdWJtZW51VG9nZ2xlLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmRldGFpbHMgPSB0cmlnZ2VyRWwucXVlcnlTZWxlY3RvcignW2RhdGEtbmF2LWRldGFpbHNdJyk7XG4gICAgaWYgKHRoaXMuZGV0YWlscyAmJiB0aGVtZVV0aWxzLmlzTGFyZ2UoKSkge1xuICAgICAgdGhpcy5kZXRhaWxzLm9wZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBfdG9nZ2xlTW9iaWxlTmF2aWdhdGlvbihmb3JjZSA9IG51bGwpIHtcbiAgICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ21vYmlsZS1uYXYtb3BlbicpICYmIGZvcmNlICE9PSAnb3BlbicpIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvbkNvbnRlbnQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtb2JpbGUtbmF2LW9wZW4nKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbG9jay1zY3JvbGwnKTtcbiAgICAgIHRoaXMubmF2aWdhdGlvbkNvbnRlbnQuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7XG4gICAgICB0aGlzLm5hdmlnYXRpb25XcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2JhY2tncm91bmQnKTtcblxuICAgICAgLy8gQ2xvc2Ugb3BlbmVkIG1lbnVzIG9uIG5hdmlnYXRpb24gY2xvc2VcbiAgICAgIHRoaXMubmF2aWdhdGlvbkNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLmhhcy1kcm9wZG93bi0tYWN0aXZlJykuZm9yRWFjaCh0cmlnZ2VyRWwgPT4gdGhpcy5fY2xvc2VEcm9wZG93bih0cmlnZ2VyRWwpKTtcbiAgICB9IGVsc2UgaWYgKCFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnbW9iaWxlLW5hdi1vcGVuJykgJiYgZm9yY2UgIT09ICdjbG9zZScpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbW9iaWxlLW5hdi1vcGVuJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2xvY2stc2Nyb2xsJyk7XG4gICAgICB0aGlzLm5hdmlnYXRpb25XcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICAgIHRoaXMubmF2aWdhdGlvbldyYXBwZXIuY2xhc3NMaXN0LmFkZCgnYmFja2dyb3VuZCcpO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICB0aGlzLl9zZXRUaWVySGVpZ2h0KCk7XG4gICAgfVxuICB9XG5cbiAgX3NldFRpZXJIZWlnaHQoKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5zdHlsZS5vdmVyZmxvd1kgPSBzY3JvbGw7XG4gICAgdGhpcy5uYXZpZ2F0aW9uQ29udGVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gIH1cblxuICBfc3dhcE1lZ2FOYXZJbWFnZXModGFyZ2V0KSB7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIGNvbnN0IHsgaW1hZ2UsIGltYWdlQWx0IH0gPSB0YXJnZXQuZGF0YXNldDtcblxuICAgIGlmIChpbWFnZSAmJiAoaW1hZ2UgIT09ICcnKSkge1xuICAgICAgY29uc3QgbWVnYU5hdkltZyA9IHRhcmdldC5jbG9zZXN0KCcubWVnYS1uYXYnKS5xdWVyeVNlbGVjdG9yKCcubWVnYS1uYXYtaW1hZ2UgaW1nJyk7XG5cbiAgICAgIGlmICghbWVnYU5hdkltZykgcmV0dXJuO1xuXG4gICAgICBtZWdhTmF2SW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgaW1hZ2UpO1xuICAgICAgbWVnYU5hdkltZy5zZXRBdHRyaWJ1dGUoJ3NyY3NldCcsICcnKTtcbiAgICAgIG1lZ2FOYXZJbWcuc2V0QXR0cmlidXRlKCdhbHQnLCBpbWFnZUFsdCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTlUQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticNavigation.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticProductRecommendations.js":
/*!*****************************************************************!*\
  !*** ./source/scripts/sections/StaticProductRecommendations.js ***!
  \*****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticProductRecommendations)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ProductListItem */ \"./source/scripts/components/ProductListItem.js\");\n/* harmony import */ var _components_ProductMasonry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/ProductMasonry */ \"./source/scripts/components/ProductMasonry.js\");\n // eslint-disable-line\n\n\n\n\nclass StaticProductRecommendations {\n  constructor(section) {\n    this.el = section.el;\n    this.data = section.data;\n\n    this._init();\n\n    this.recommendUrl = `${window.Theme.routes.product_recommendations_url}?section_id=${section.id}&product_id=${this.productId}`;\n    this._reloadRecommendations = this._reloadRecommendations.bind(this);\n    window.addEventListener('shopify:section:load', this._reloadRecommendations);\n\n    this._loadRecommendations();\n  }\n\n  remove() {\n    this.productListItems.forEach(item => item.remove());\n  }\n\n  _init() {\n    this.productId = this.data.productId;\n    this.positionedRight = this.data.positionRight;\n    this.productSectionDataEl = document.querySelector('[data-section-type=\"product\"]');\n    this.productSectionIsPresent = !!this.productSectionDataEl;\n    let productSectionData; // The product section can be hidden so we default to using the 'standard'\n    // recommended products section (the one that's not right-aligned).\n\n    if (this.productSectionIsPresent) {\n      productSectionData = JSON.parse(this.productSectionDataEl.innerHTML);\n      this.use_masonry = productSectionData.images_layout === 'masonry';\n\n      if (this.use_masonry) {\n        this.positionedRight = false;\n      }\n\n      const productSectionEl = this.productSectionDataEl.parentElement;\n      this.productContainerEl = productSectionEl.querySelector('.product-container');\n      this.productContainerEl.classList.add(`product-recommendations-position-${this.positionedRight ? 'right' : 'section'}`);\n      this.rightRecommendationContainer = productSectionEl.querySelector('[data-product-recommendations-right]');\n      this.rightRecommendationContainer.innerHTML = '';\n    } else {\n      this.use_masonry = false;\n    }\n\n    if (this.use_masonry || !this.productSectionIsPresent) {\n      this.positionedRight = false;\n    }\n\n    this.sectionRecommendationContainer = this.el.querySelector('[data-product-recommendations-section]');\n  }\n\n  _loadRecommendations() {\n    _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__.default.load(this.recommendUrl, {\n      view: ''\n    }).then(response => {\n      if (!response) return;\n      const {\n        html\n      } = response;\n\n      if (!html.common) {\n        return;\n      }\n\n      const tempContainer = document.createElement('div');\n      tempContainer.innerHTML = html.common;\n      const productsWrapper = tempContainer.querySelector('.product-recommendations');\n\n      if (!this.positionedRight || this.use_masonry) {\n        productsWrapper.innerHTML = html.below;\n      } else {\n        productsWrapper.innerHTML = html.right;\n      }\n\n      if (this.use_masonry) {\n        productsWrapper.classList.remove('row-of-4');\n        productsWrapper.classList.add('row-of-3');\n      } else {\n        // Remove extra products for non-masonry layouts\n        productsWrapper.querySelectorAll('[data-masonry-only]').forEach(product => product.parentNode.removeChild(product));\n      }\n\n      if (this.positionedRight) {\n        this.rightRecommendationContainer.innerHTML = tempContainer.innerHTML;\n      } else {\n        this.sectionRecommendationContainer.innerHTML = tempContainer.innerHTML;\n      }\n\n      if (this.use_masonry) {\n        this.productMasonry = new _components_ProductMasonry__WEBPACK_IMPORTED_MODULE_3__.default({\n          el: this.sectionRecommendationContainer\n        });\n      }\n\n      let productItems;\n\n      if (this.positionedRight) {\n        _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(this.rightRecommendationContainer);\n        productItems = this.rightRecommendationContainer.querySelectorAll('.product-list-item');\n      } else {\n        _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.watch(this.sectionRecommendationContainer);\n        productItems = this.sectionRecommendationContainer.querySelectorAll('.product-list-item');\n      }\n\n      this.productListItems = [];\n      this.el.querySelectorAll('.product-list-item').forEach(product => this.productListItems.push(new _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__.default({\n        el: product\n      })));\n\n      if (productItems.length) {\n        if (window.Shopify && Shopify.PaymentButton) {\n          Shopify.PaymentButton.init();\n        }\n      }\n    });\n  } // This method is only called inside of the theme editor\n  // when the user changes product section settings\n\n\n  _reloadRecommendations() {\n    this._init();\n\n    this._loadRecommendations();\n  }\n\n  onSectionUnload() {\n    if (this.productMasonry) {\n      this.productMasonry.onSectionUnload();\n    }\n\n    this.remove();\n    this.productContainerEl.classList.remove(`product-recommendations-position-${this.positionedRight ? 'right' : 'section'}`);\n    this.rightRecommendationContainer.innerHTML = '';\n    this.sectionRecommendationContainer.innerHTML = '';\n    window.removeEventListener('shopify:section:load', this._reloadRecommendations);\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNQcm9kdWN0UmVjb21tZW5kYXRpb25zLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY1Byb2R1Y3RSZWNvbW1lbmRhdGlvbnMuanM/YWI4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmltZyBmcm9tICdAcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnknOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5pbXBvcnQgQXN5bmNWaWV3IGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3JztcbmltcG9ydCBQcm9kdWN0TGlzdEl0ZW0gZnJvbSAnLi4vY29tcG9uZW50cy9Qcm9kdWN0TGlzdEl0ZW0nO1xuaW1wb3J0IFByb2R1Y3RNYXNvbnJ5IGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdE1hc29ucnknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNQcm9kdWN0UmVjb21tZW5kYXRpb25zIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuZWwgPSBzZWN0aW9uLmVsO1xuICAgIHRoaXMuZGF0YSA9IHNlY3Rpb24uZGF0YTtcbiAgICB0aGlzLl9pbml0KCk7XG4gICAgdGhpcy5yZWNvbW1lbmRVcmwgPSBgJHt3aW5kb3cuVGhlbWUucm91dGVzLnByb2R1Y3RfcmVjb21tZW5kYXRpb25zX3VybH0/c2VjdGlvbl9pZD0ke3NlY3Rpb24uaWR9JnByb2R1Y3RfaWQ9JHt0aGlzLnByb2R1Y3RJZH1gO1xuICAgIHRoaXMuX3JlbG9hZFJlY29tbWVuZGF0aW9ucyA9IHRoaXMuX3JlbG9hZFJlY29tbWVuZGF0aW9ucy5iaW5kKHRoaXMpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246bG9hZCcsIHRoaXMuX3JlbG9hZFJlY29tbWVuZGF0aW9ucyk7XG4gICAgdGhpcy5fbG9hZFJlY29tbWVuZGF0aW9ucygpO1xuICB9XG5cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMucHJvZHVjdExpc3RJdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5yZW1vdmUoKSk7XG4gIH1cblxuICBfaW5pdCgpIHtcbiAgICB0aGlzLnByb2R1Y3RJZCA9IHRoaXMuZGF0YS5wcm9kdWN0SWQ7XG4gICAgdGhpcy5wb3NpdGlvbmVkUmlnaHQgPSB0aGlzLmRhdGEucG9zaXRpb25SaWdodDtcbiAgICB0aGlzLnByb2R1Y3RTZWN0aW9uRGF0YUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi10eXBlPVwicHJvZHVjdFwiXScpO1xuICAgIHRoaXMucHJvZHVjdFNlY3Rpb25Jc1ByZXNlbnQgPSAhIXRoaXMucHJvZHVjdFNlY3Rpb25EYXRhRWw7XG4gICAgbGV0IHByb2R1Y3RTZWN0aW9uRGF0YTtcblxuICAgIC8vIFRoZSBwcm9kdWN0IHNlY3Rpb24gY2FuIGJlIGhpZGRlbiBzbyB3ZSBkZWZhdWx0IHRvIHVzaW5nIHRoZSAnc3RhbmRhcmQnXG4gICAgLy8gcmVjb21tZW5kZWQgcHJvZHVjdHMgc2VjdGlvbiAodGhlIG9uZSB0aGF0J3Mgbm90IHJpZ2h0LWFsaWduZWQpLlxuICAgIGlmICh0aGlzLnByb2R1Y3RTZWN0aW9uSXNQcmVzZW50KSB7XG4gICAgICBwcm9kdWN0U2VjdGlvbkRhdGEgPSBKU09OLnBhcnNlKHRoaXMucHJvZHVjdFNlY3Rpb25EYXRhRWwuaW5uZXJIVE1MKTtcbiAgICAgIHRoaXMudXNlX21hc29ucnkgPSBwcm9kdWN0U2VjdGlvbkRhdGEuaW1hZ2VzX2xheW91dCA9PT0gJ21hc29ucnknO1xuXG4gICAgICBpZiAodGhpcy51c2VfbWFzb25yeSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uZWRSaWdodCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9kdWN0U2VjdGlvbkVsID0gdGhpcy5wcm9kdWN0U2VjdGlvbkRhdGFFbC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICB0aGlzLnByb2R1Y3RDb250YWluZXJFbCA9IHByb2R1Y3RTZWN0aW9uRWwucXVlcnlTZWxlY3RvcignLnByb2R1Y3QtY29udGFpbmVyJyk7XG4gICAgICB0aGlzLnByb2R1Y3RDb250YWluZXJFbC5jbGFzc0xpc3QuYWRkKGBwcm9kdWN0LXJlY29tbWVuZGF0aW9ucy1wb3NpdGlvbi0ke3RoaXMucG9zaXRpb25lZFJpZ2h0ID8gJ3JpZ2h0JyA6ICdzZWN0aW9uJ31gKTtcblxuICAgICAgdGhpcy5yaWdodFJlY29tbWVuZGF0aW9uQ29udGFpbmVyID0gcHJvZHVjdFNlY3Rpb25FbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LXJlY29tbWVuZGF0aW9ucy1yaWdodF0nKTtcbiAgICAgIHRoaXMucmlnaHRSZWNvbW1lbmRhdGlvbkNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VfbWFzb25yeSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZV9tYXNvbnJ5IHx8ICF0aGlzLnByb2R1Y3RTZWN0aW9uSXNQcmVzZW50KSB7XG4gICAgICB0aGlzLnBvc2l0aW9uZWRSaWdodCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2VjdGlvblJlY29tbWVuZGF0aW9uQ29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LXJlY29tbWVuZGF0aW9ucy1zZWN0aW9uXScpO1xuICB9XG5cbiAgX2xvYWRSZWNvbW1lbmRhdGlvbnMoKSB7XG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB0aGlzLnJlY29tbWVuZFVybCxcbiAgICAgIHsgdmlldzogJycgfSxcbiAgICApLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7IGh0bWwgfSA9IHJlc3BvbnNlO1xuICAgICAgaWYgKCFodG1sLmNvbW1vbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB0ZW1wQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0ZW1wQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwuY29tbW9uO1xuICAgICAgY29uc3QgcHJvZHVjdHNXcmFwcGVyID0gdGVtcENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1yZWNvbW1lbmRhdGlvbnMnKTtcblxuICAgICAgaWYgKCF0aGlzLnBvc2l0aW9uZWRSaWdodCB8fCB0aGlzLnVzZV9tYXNvbnJ5KSB7XG4gICAgICAgIHByb2R1Y3RzV3JhcHBlci5pbm5lckhUTUwgPSBodG1sLmJlbG93O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZHVjdHNXcmFwcGVyLmlubmVySFRNTCA9IGh0bWwucmlnaHQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnVzZV9tYXNvbnJ5KSB7XG4gICAgICAgIHByb2R1Y3RzV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdyb3ctb2YtNCcpO1xuICAgICAgICBwcm9kdWN0c1dyYXBwZXIuY2xhc3NMaXN0LmFkZCgncm93LW9mLTMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSBleHRyYSBwcm9kdWN0cyBmb3Igbm9uLW1hc29ucnkgbGF5b3V0c1xuICAgICAgICBwcm9kdWN0c1dyYXBwZXJcbiAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbWFzb25yeS1vbmx5XScpXG4gICAgICAgICAgLmZvckVhY2gocHJvZHVjdCA9PiBwcm9kdWN0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocHJvZHVjdCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wb3NpdGlvbmVkUmlnaHQpIHtcbiAgICAgICAgdGhpcy5yaWdodFJlY29tbWVuZGF0aW9uQ29udGFpbmVyLmlubmVySFRNTCA9IHRlbXBDb250YWluZXIuaW5uZXJIVE1MO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWN0aW9uUmVjb21tZW5kYXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gdGVtcENvbnRhaW5lci5pbm5lckhUTUw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnVzZV9tYXNvbnJ5KSB7XG4gICAgICAgIHRoaXMucHJvZHVjdE1hc29ucnkgPSBuZXcgUHJvZHVjdE1hc29ucnkoeyBlbDogdGhpcy5zZWN0aW9uUmVjb21tZW5kYXRpb25Db250YWluZXIgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBwcm9kdWN0SXRlbXM7XG5cbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uZWRSaWdodCkge1xuICAgICAgICByaW1nLndhdGNoKHRoaXMucmlnaHRSZWNvbW1lbmRhdGlvbkNvbnRhaW5lcik7XG4gICAgICAgIHByb2R1Y3RJdGVtcyA9IHRoaXMucmlnaHRSZWNvbW1lbmRhdGlvbkNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1saXN0LWl0ZW0nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJpbWcud2F0Y2godGhpcy5zZWN0aW9uUmVjb21tZW5kYXRpb25Db250YWluZXIpO1xuICAgICAgICBwcm9kdWN0SXRlbXMgPSB0aGlzLnNlY3Rpb25SZWNvbW1lbmRhdGlvbkNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1saXN0LWl0ZW0nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9kdWN0TGlzdEl0ZW1zID0gW107XG4gICAgICB0aGlzLmVsXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1saXN0LWl0ZW0nKVxuICAgICAgICAuZm9yRWFjaChwcm9kdWN0ID0+IHRoaXMucHJvZHVjdExpc3RJdGVtcy5wdXNoKG5ldyBQcm9kdWN0TGlzdEl0ZW0oeyBlbDogcHJvZHVjdCB9KSkpO1xuXG4gICAgICBpZiAocHJvZHVjdEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICBpZiAod2luZG93LlNob3BpZnkgJiYgU2hvcGlmeS5QYXltZW50QnV0dG9uKSB7XG4gICAgICAgICAgU2hvcGlmeS5QYXltZW50QnV0dG9uLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgaW5zaWRlIG9mIHRoZSB0aGVtZSBlZGl0b3JcbiAgLy8gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHByb2R1Y3Qgc2VjdGlvbiBzZXR0aW5nc1xuICBfcmVsb2FkUmVjb21tZW5kYXRpb25zKCkge1xuICAgIHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLl9sb2FkUmVjb21tZW5kYXRpb25zKCk7XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgaWYgKHRoaXMucHJvZHVjdE1hc29ucnkpIHtcbiAgICAgIHRoaXMucHJvZHVjdE1hc29ucnkub25TZWN0aW9uVW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLnByb2R1Y3RDb250YWluZXJFbC5jbGFzc0xpc3QucmVtb3ZlKGBwcm9kdWN0LXJlY29tbWVuZGF0aW9ucy1wb3NpdGlvbi0ke3RoaXMucG9zaXRpb25lZFJpZ2h0ID8gJ3JpZ2h0JyA6ICdzZWN0aW9uJ31gKTtcbiAgICB0aGlzLnJpZ2h0UmVjb21tZW5kYXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5zZWN0aW9uUmVjb21tZW5kYXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgdGhpcy5fcmVsb2FkUmVjb21tZW5kYXRpb25zKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticProductRecommendations.js\n");

/***/ }),

/***/ "./source/scripts/sections/StaticSearch.js":
/*!*************************************************!*\
  !*** ./source/scripts/sections/StaticSearch.js ***!
  \*************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ StaticSearch)\n/* harmony export */ });\n/* harmony import */ var _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/MasonryGrid */ \"./source/scripts/components/MasonryGrid.js\");\n/* harmony import */ var _components_FacetedFilters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/FacetedFilters */ \"./source/scripts/components/FacetedFilters.js\");\n/* harmony import */ var _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ProductListItem */ \"./source/scripts/components/ProductListItem.js\");\n\n\n\nclass StaticSearch {\n  constructor(section) {\n    this.el = section.el;\n    this.facetedFilters = new _components_FacetedFilters__WEBPACK_IMPORTED_MODULE_1__.default(section);\n    this.masonry = this.el.querySelector('[data-masonry-grid]');\n    this.masonryGrid = null;\n    this.productListItems = [];\n    this.el.querySelectorAll('.product-list-item').forEach(product => this.productListItems.push(new _components_ProductListItem__WEBPACK_IMPORTED_MODULE_2__.default({\n      el: product\n    })));\n\n    if (this.masonry) {\n      this.masonryGrid = new _components_MasonryGrid__WEBPACK_IMPORTED_MODULE_0__.default({\n        el: this.masonry,\n        settings: {\n          itemSelector: '.product-list-item',\n          horizontalOrder: true\n        }\n      });\n    }\n  }\n\n  remove() {\n    if (this.masonryGrid) {\n      this.masonryGrid.unload();\n    }\n\n    this.productListItems.forEach(item => item.remove());\n  }\n\n  onSectionUnload() {\n    this.remove();\n    this.facetedFilters.unload();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNTZWFyY2guanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljU2VhcmNoLmpzPzRlNjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1hc29ucnlHcmlkIGZyb20gJy4uL2NvbXBvbmVudHMvTWFzb25yeUdyaWQnO1xuaW1wb3J0IEZhY2V0ZWRGaWx0ZXJzIGZyb20gJy4uL2NvbXBvbmVudHMvRmFjZXRlZEZpbHRlcnMnO1xuaW1wb3J0IFByb2R1Y3RMaXN0SXRlbSBmcm9tICcuLi9jb21wb25lbnRzL1Byb2R1Y3RMaXN0SXRlbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY1NlYXJjaCB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLmZhY2V0ZWRGaWx0ZXJzID0gbmV3IEZhY2V0ZWRGaWx0ZXJzKHNlY3Rpb24pO1xuICAgIHRoaXMubWFzb25yeSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbWFzb25yeS1ncmlkXScpO1xuICAgIHRoaXMubWFzb25yeUdyaWQgPSBudWxsO1xuXG4gICAgdGhpcy5wcm9kdWN0TGlzdEl0ZW1zID0gW107XG4gICAgdGhpcy5lbFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0LWxpc3QtaXRlbScpXG4gICAgICAuZm9yRWFjaChwcm9kdWN0ID0+IHRoaXMucHJvZHVjdExpc3RJdGVtcy5wdXNoKG5ldyBQcm9kdWN0TGlzdEl0ZW0oeyBlbDogcHJvZHVjdCB9KSkpO1xuXG4gICAgaWYgKHRoaXMubWFzb25yeSkge1xuICAgICAgdGhpcy5tYXNvbnJ5R3JpZCA9IG5ldyBNYXNvbnJ5R3JpZCh7XG4gICAgICAgIGVsOiB0aGlzLm1hc29ucnksXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgaXRlbVNlbGVjdG9yOiAnLnByb2R1Y3QtbGlzdC1pdGVtJyxcbiAgICAgICAgICBob3Jpem9udGFsT3JkZXI6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgaWYgKHRoaXMubWFzb25yeUdyaWQpIHtcbiAgICAgIHRoaXMubWFzb25yeUdyaWQudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9kdWN0TGlzdEl0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLnJlbW92ZSgpKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICAgIHRoaXMuZmFjZXRlZEZpbHRlcnMudW5sb2FkKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUZBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFuQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/sections/StaticSearch.js\n");

/***/ }),

/***/ "./source/scripts/templates/TemplateAccount.js":
/*!*****************************************************!*\
  !*** ./source/scripts/templates/TemplateAccount.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ TemplateAccount)\n/* harmony export */ });\nclass TemplateAccount {\n  constructor({\n    el\n  }) {\n    this.el = el;\n    const deleteAddressEls = this.el.querySelectorAll('.delete-address');\n    const editAddressEls = this.el.querySelectorAll('.edit-address');\n    const addNewAddressEl = this.el.querySelector('.add-new-address');\n    const toggleForgetfulnessEl = this.el.querySelector('.toggle-forgetfulness');\n    const addressCountryEl = this.el.querySelector('.address-country');\n\n    if (deleteAddressEls.length) {\n      deleteAddressEls.forEach(deleteAddressEl => deleteAddressEl.addEventListener('click', event => this.deleteAddress(event)));\n    }\n\n    if (editAddressEls.length) {\n      editAddressEls.forEach(editAddressEl => editAddressEl.addEventListener('click', event => this.editAddress(event)));\n    }\n\n    if (addNewAddressEl) {\n      addNewAddressEl.addEventListener('click', () => this.addNewAddress());\n    }\n\n    if (toggleForgetfulnessEl) {\n      toggleForgetfulnessEl.addEventListener('click', () => this.recoverPassword());\n    }\n\n    if (addressCountryEl) {\n      addressCountryEl.addEventListener('change', () => this.updateProvinceSelectText());\n    }\n\n    if (this.el.classList.contains('template-addresses')) {\n      this.prepareAddresses();\n    }\n\n    if (this.el.classList.contains('template-login')) {\n      this.checkForReset();\n    }\n\n    if (window.location.hash === '#recover') {\n      return this.recoverPassword();\n    }\n  }\n\n  recoverPassword() {\n    this.el.querySelector('.recover-password').classList.toggle('visible');\n    this.el.querySelector('.customer-login').classList.toggle('visible');\n  }\n\n  checkForReset() {\n    if ('sucessfulReset' in this.el.querySelector('.reset-check').dataset) {\n      this.el.querySelector('.successful-reset').classList.add('visible');\n    }\n  }\n\n  prepareAddresses() {\n    new Shopify.CountryProvinceSelector('address-country', 'address-province', {\n      hideElement: 'address-province-container'\n    });\n    const addresses = this.el.querySelectorAll('.customer-address');\n    addresses.forEach(address => {\n      const addressID = address.dataset.addressId;\n      new Shopify.CountryProvinceSelector(`address-country-${addressID}`, `address-province-${addressID}`, {\n        hideElement: `address-province-container-${addressID}`\n      });\n    });\n  }\n\n  deleteAddress(e) {\n    const addressID = e.target.closest('[data-address-id]').dataset.addressId;\n    Shopify.CustomerAddress.destroy(addressID);\n  }\n\n  editAddress(e) {\n    const addressID = e.target.closest('[data-address-id]').dataset.addressId;\n    this.el.querySelector('.customer-address').classList.remove('editing');\n    this.el.querySelector('.customer-address').querySelector('.edit-address').classList.remove('disabled');\n    this.el.querySelector(`.customer-address[data-address-id='${addressID}']`).classList.add('editing');\n    this.el.querySelector(`.customer-address[data-address-id='${addressID}']`).querySelector('.edit-address').classList.add('disabled');\n    this.el.querySelector('.customer-address-edit-form, .customer-new-address').classList.add('hidden');\n    this.el.querySelector(`.customer-address-edit-form[data-address-id='${addressID}']`).classList.remove('hidden');\n  }\n\n  addNewAddress() {\n    this.el.querySelector('.customer-address').classList.remove('editing');\n    this.el.querySelector('.customer-address').querySelector('.edit-address').classList.remove('disabled');\n    this.el.querySelector('.customer-address-edit-form').classList.add('hidden');\n    this.el.querySelector('.customer-new-address').classList.remove('hidden');\n  }\n\n  updateProvinceSelectText() {\n    this.el.querySelector('.address-province').previousElementSibling.innerText = `-- ${window.Theme.pleaseSelectText} --`;\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVBY2NvdW50LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3RlbXBsYXRlcy9UZW1wbGF0ZUFjY291bnQuanM/NzRkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBUZW1wbGF0ZUFjY291bnQge1xuICBjb25zdHJ1Y3Rvcih7IGVsIH0pIHtcbiAgICB0aGlzLmVsID0gZWw7XG5cbiAgICBjb25zdCBkZWxldGVBZGRyZXNzRWxzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVsZXRlLWFkZHJlc3MnKTtcbiAgICBjb25zdCBlZGl0QWRkcmVzc0VscyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLmVkaXQtYWRkcmVzcycpO1xuICAgIGNvbnN0IGFkZE5ld0FkZHJlc3NFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmFkZC1uZXctYWRkcmVzcycpO1xuICAgIGNvbnN0IHRvZ2dsZUZvcmdldGZ1bG5lc3NFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnRvZ2dsZS1mb3JnZXRmdWxuZXNzJyk7XG4gICAgY29uc3QgYWRkcmVzc0NvdW50cnlFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmFkZHJlc3MtY291bnRyeScpO1xuXG4gICAgaWYgKGRlbGV0ZUFkZHJlc3NFbHMubGVuZ3RoKSB7XG4gICAgICBkZWxldGVBZGRyZXNzRWxzLmZvckVhY2goZGVsZXRlQWRkcmVzc0VsID0+IGRlbGV0ZUFkZHJlc3NFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuZGVsZXRlQWRkcmVzcyhldmVudCkpKTtcbiAgICB9XG5cbiAgICBpZiAoZWRpdEFkZHJlc3NFbHMubGVuZ3RoKSB7XG4gICAgICBlZGl0QWRkcmVzc0Vscy5mb3JFYWNoKGVkaXRBZGRyZXNzRWwgPT4gZWRpdEFkZHJlc3NFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuZWRpdEFkZHJlc3MoZXZlbnQpKSk7XG4gICAgfVxuXG4gICAgaWYgKGFkZE5ld0FkZHJlc3NFbCkge1xuICAgICAgYWRkTmV3QWRkcmVzc0VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5hZGROZXdBZGRyZXNzKCkpO1xuICAgIH1cblxuICAgIGlmICh0b2dnbGVGb3JnZXRmdWxuZXNzRWwpIHtcbiAgICAgIHRvZ2dsZUZvcmdldGZ1bG5lc3NFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMucmVjb3ZlclBhc3N3b3JkKCkpO1xuICAgIH1cblxuICAgIGlmIChhZGRyZXNzQ291bnRyeUVsKSB7XG4gICAgICBhZGRyZXNzQ291bnRyeUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHRoaXMudXBkYXRlUHJvdmluY2VTZWxlY3RUZXh0KCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVsLmNsYXNzTGlzdC5jb250YWlucygndGVtcGxhdGUtYWRkcmVzc2VzJykpIHsgdGhpcy5wcmVwYXJlQWRkcmVzc2VzKCk7IH1cbiAgICBpZiAodGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoJ3RlbXBsYXRlLWxvZ2luJykpIHsgdGhpcy5jaGVja0ZvclJlc2V0KCk7IH1cbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggPT09ICcjcmVjb3ZlcicpIHsgcmV0dXJuIHRoaXMucmVjb3ZlclBhc3N3b3JkKCk7IH1cbiAgfVxuXG4gIHJlY292ZXJQYXNzd29yZCgpIHtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5yZWNvdmVyLXBhc3N3b3JkJykuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScpO1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmN1c3RvbWVyLWxvZ2luJykuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScpO1xuICB9XG5cbiAgY2hlY2tGb3JSZXNldCgpIHtcbiAgICBpZiAoJ3N1Y2Vzc2Z1bFJlc2V0JyBpbiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5yZXNldC1jaGVjaycpLmRhdGFzZXQpIHtcbiAgICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnN1Y2Nlc3NmdWwtcmVzZXQnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZUFkZHJlc3NlcygpIHtcbiAgICBuZXcgU2hvcGlmeS5Db3VudHJ5UHJvdmluY2VTZWxlY3RvcignYWRkcmVzcy1jb3VudHJ5JywgJ2FkZHJlc3MtcHJvdmluY2UnLCB7XG4gICAgICBoaWRlRWxlbWVudDogJ2FkZHJlc3MtcHJvdmluY2UtY29udGFpbmVyJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFkZHJlc3NlcyA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLmN1c3RvbWVyLWFkZHJlc3MnKTtcblxuICAgIGFkZHJlc3Nlcy5mb3JFYWNoKGFkZHJlc3MgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzc0lEID0gYWRkcmVzcy5kYXRhc2V0LmFkZHJlc3NJZDtcblxuICAgICAgbmV3IFNob3BpZnkuQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IoYGFkZHJlc3MtY291bnRyeS0ke2FkZHJlc3NJRH1gLCBgYWRkcmVzcy1wcm92aW5jZS0ke2FkZHJlc3NJRH1gLCB7XG4gICAgICAgIGhpZGVFbGVtZW50OiBgYWRkcmVzcy1wcm92aW5jZS1jb250YWluZXItJHthZGRyZXNzSUR9YCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlQWRkcmVzcyhlKSB7XG4gICAgY29uc3QgYWRkcmVzc0lEID0gZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtYWRkcmVzcy1pZF0nKS5kYXRhc2V0LmFkZHJlc3NJZDtcblxuICAgIFNob3BpZnkuQ3VzdG9tZXJBZGRyZXNzLmRlc3Ryb3koYWRkcmVzc0lEKTtcbiAgfVxuXG4gIGVkaXRBZGRyZXNzKGUpIHtcbiAgICBjb25zdCBhZGRyZXNzSUQgPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1hZGRyZXNzLWlkXScpLmRhdGFzZXQuYWRkcmVzc0lkO1xuXG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuY3VzdG9tZXItYWRkcmVzcycpLmNsYXNzTGlzdC5yZW1vdmUoJ2VkaXRpbmcnKTtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b21lci1hZGRyZXNzJykucXVlcnlTZWxlY3RvcignLmVkaXQtYWRkcmVzcycpLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJyk7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoYC5jdXN0b21lci1hZGRyZXNzW2RhdGEtYWRkcmVzcy1pZD0nJHthZGRyZXNzSUR9J11gKS5jbGFzc0xpc3QuYWRkKCdlZGl0aW5nJyk7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGAuY3VzdG9tZXItYWRkcmVzc1tkYXRhLWFkZHJlc3MtaWQ9JyR7YWRkcmVzc0lEfSddYCkucXVlcnlTZWxlY3RvcignLmVkaXQtYWRkcmVzcycpLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b21lci1hZGRyZXNzLWVkaXQtZm9ybSwgLmN1c3RvbWVyLW5ldy1hZGRyZXNzJykuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoYC5jdXN0b21lci1hZGRyZXNzLWVkaXQtZm9ybVtkYXRhLWFkZHJlc3MtaWQ9JyR7YWRkcmVzc0lEfSddYCkuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gIH1cblxuICBhZGROZXdBZGRyZXNzKCkge1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmN1c3RvbWVyLWFkZHJlc3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdlZGl0aW5nJyk7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuY3VzdG9tZXItYWRkcmVzcycpLnF1ZXJ5U2VsZWN0b3IoJy5lZGl0LWFkZHJlc3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xuXG5cbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b21lci1hZGRyZXNzLWVkaXQtZm9ybScpLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmN1c3RvbWVyLW5ldy1hZGRyZXNzJykuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gIH1cblxuICB1cGRhdGVQcm92aW5jZVNlbGVjdFRleHQoKSB7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuYWRkcmVzcy1wcm92aW5jZScpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaW5uZXJUZXh0ID0gYC0tICR7d2luZG93LlRoZW1lLnBsZWFzZVNlbGVjdFRleHR9IC0tYDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5RkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/templates/TemplateAccount.js\n");

/***/ }),

/***/ "./source/scripts/templates/TemplateGiftCard.js":
/*!******************************************************!*\
  !*** ./source/scripts/templates/TemplateGiftCard.js ***!
  \******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ TemplateGiftCard)\n/* harmony export */ });\nclass TemplateGiftCard {\n  constructor() {\n    return this.addQrCode();\n  }\n\n  addQrCode() {\n    const qrWrapper = document.querySelector('[data-qr-code]');\n    return new QRCode(qrWrapper, {\n      text: qrWrapper.dataset.qrCode,\n      width: 120,\n      height: 120\n    });\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVHaWZ0Q2FyZC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVHaWZ0Q2FyZC5qcz80NDExIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbXBsYXRlR2lmdENhcmQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRRckNvZGUoKTtcbiAgfVxuXG4gIGFkZFFyQ29kZSgpIHtcbiAgICBjb25zdCBxcldyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1xci1jb2RlXScpO1xuXG4gICAgcmV0dXJuIG5ldyBRUkNvZGUocXJXcmFwcGVyLCB7XG4gICAgICB0ZXh0OiBxcldyYXBwZXIuZGF0YXNldC5xckNvZGUsXG4gICAgICB3aWR0aDogMTIwLFxuICAgICAgaGVpZ2h0OiAxMjAsXG4gICAgfSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFkQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/templates/TemplateGiftCard.js\n");

/***/ }),

/***/ "./source/scripts/templates/TemplateLogin.js":
/*!***************************************************!*\
  !*** ./source/scripts/templates/TemplateLogin.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ TemplateLogin)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n\nclass TemplateLogin {\n  constructor() {\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    this.adminLogin = document.querySelector('.admin-login-modal');\n    this.events.register(this.adminLogin, 'click', () => this.openModal());\n    this.events.register(document.body, 'click', event => this.closeModal(event));\n    this.modalWrapper = document.querySelector('.password-page-modal-wrapper');\n\n    if (this.modalWrapper) {\n      this.modalContent = this.modalWrapper.querySelector('.password-page-modal');\n      this.modalInput = this.modalWrapper.querySelector('.password-page-input');\n\n      if (this.modalWrapper.querySelector('[data-open-modal]')) {\n        this.openModal();\n      }\n    }\n\n    this.events.register(window, 'resize', () => this.positionModal());\n  }\n\n  closeModal(e) {\n    if (e.target.classList.contains('visible')) {\n      this.modalWrapper.classList.remove('visible');\n      this.events.register(this.modalWrapper, 'transitionend', () => {\n        document.body.classList.remove('scroll-locked');\n      });\n    }\n  }\n\n  openModal() {\n    document.body.classList.add('scroll-locked');\n    this.positionModal();\n    this.modalWrapper.classList.add('visible');\n    this.events.register(this.modalWrapper, 'transitionend', () => {\n      this.modalInput.focus();\n    });\n  }\n\n  positionModal() {\n    const {\n      width,\n      height\n    } = this.modalContent.getBoundingClientRect();\n    this.modalContent.style.marginTop = -(height / 2);\n    this.modalContent.style.marginLeft = -(width / 2);\n  }\n\n  unload() {\n    if (this.events) {\n      this.events.unregisterAll();\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVMb2dpbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvVGVtcGxhdGVMb2dpbi5qcz80MmU1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnQHBpeGVsdW5pb24vZXZlbnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtcGxhdGVMb2dpbiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMuYWRtaW5Mb2dpbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hZG1pbi1sb2dpbi1tb2RhbCcpO1xuXG4gICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5hZG1pbkxvZ2luLCAnY2xpY2snLCAoKSA9PiB0aGlzLm9wZW5Nb2RhbCgpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihkb2N1bWVudC5ib2R5LCAnY2xpY2snLCBldmVudCA9PiB0aGlzLmNsb3NlTW9kYWwoZXZlbnQpKTtcblxuICAgIHRoaXMubW9kYWxXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhc3N3b3JkLXBhZ2UtbW9kYWwtd3JhcHBlcicpO1xuXG4gICAgaWYgKHRoaXMubW9kYWxXcmFwcGVyKSB7XG4gICAgICB0aGlzLm1vZGFsQ29udGVudCA9IHRoaXMubW9kYWxXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5wYXNzd29yZC1wYWdlLW1vZGFsJyk7XG4gICAgICB0aGlzLm1vZGFsSW5wdXQgPSB0aGlzLm1vZGFsV3JhcHBlci5xdWVyeVNlbGVjdG9yKCcucGFzc3dvcmQtcGFnZS1pbnB1dCcpO1xuICAgICAgaWYgKHRoaXMubW9kYWxXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW9wZW4tbW9kYWxdJykpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih3aW5kb3csICdyZXNpemUnLCAoKSA9PiB0aGlzLnBvc2l0aW9uTW9kYWwoKSk7XG4gIH1cblxuICBjbG9zZU1vZGFsKGUpIHtcbiAgICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd2aXNpYmxlJykpIHtcbiAgICAgIHRoaXMubW9kYWxXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTtcbiAgICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMubW9kYWxXcmFwcGVyLCAndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzY3JvbGwtbG9ja2VkJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvcGVuTW9kYWwoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdzY3JvbGwtbG9ja2VkJyk7XG4gICAgdGhpcy5wb3NpdGlvbk1vZGFsKCk7XG4gICAgdGhpcy5tb2RhbFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMubW9kYWxXcmFwcGVyLCAndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgIHRoaXMubW9kYWxJbnB1dC5mb2N1cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcG9zaXRpb25Nb2RhbCgpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMubW9kYWxDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMubW9kYWxDb250ZW50LnN0eWxlLm1hcmdpblRvcCA9IC0oaGVpZ2h0IC8gMik7XG4gICAgdGhpcy5tb2RhbENvbnRlbnQuc3R5bGUubWFyZ2luTGVmdCA9IC0od2lkdGggLyAyKTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICBpZiAodGhpcy5ldmVudHMpIHtcbiAgICAgIHRoaXMuZXZlbnRzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/templates/TemplateLogin.js\n");

/***/ }),

/***/ "./source/scripts/themeUtils.js":
/*!**************************************!*\
  !*** ./source/scripts/themeUtils.js ***!
  \**************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nlet themeUtils;\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (themeUtils = {\n  breakpoints: {\n    small: 770,\n    medium: 1080,\n    large: 1280\n  },\n\n  extend(dest, ...objs) {\n    for (let i = 0; i < objs.length; i++) {\n      const obj = objs[i];\n\n      for (let k in obj) {\n        const v = obj[k];\n        dest[k] = v;\n      }\n    }\n\n    return dest;\n  },\n\n  windowWidth() {\n    return window.innerWidth;\n  },\n\n  isLessThanMedium() {\n    return this.windowWidth() < this.breakpoints.small;\n  },\n\n  isLessThanLarge() {\n    return this.windowWidth() < this.breakpoints.medium;\n  },\n\n  isSmall() {\n    return this.windowWidth() < this.breakpoints.small;\n  },\n\n  isMedium() {\n    return this.windowWidth() >= this.breakpoints.small && this.windowWidth() < this.breakpoints.medium;\n  },\n\n  isLarge() {\n    return this.windowWidth() >= this.breakpoints.medium;\n  },\n\n  debounce(func, wait, immediate) {\n    let timeout = null;\n    return function () {\n      const context = this;\n      const args = arguments;\n\n      const later = function () {\n        timeout = null;\n\n        if (!immediate) {\n          func.apply(context, args);\n        }\n      };\n\n      const callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n\n      if (callNow) {\n        func.apply(context, args);\n      }\n    };\n  },\n\n  unique(array) {\n    let key;\n    let asc;\n    let end;\n    const output = {};\n\n    for (key = 0, end = array.length, asc = end >= 0; asc ? key < end : key > end; asc ? key++ : key--) {\n      output[array[key]] = array[key];\n    }\n\n    return (() => {\n      const result = [];\n\n      for (key in output) {\n        const value = output[key];\n        result.push(value);\n      }\n\n      return result;\n    })();\n  },\n\n  inViewport(el, direction) {\n    let viewportHeight;\n    let viewportWidth;\n\n    if (direction == null) {\n      direction = 'both';\n    }\n\n    const rect = el.getBoundingClientRect();\n    const style = el.currentStyle || window.getComputedStyle(el);\n    const marginRight = parseInt(style.marginRight) || 0;\n    const marginLeft = parseInt(style.marginLeft) || 0;\n\n    if (document.documentElement.clientWidth < window.innerWidth) {\n      viewportWidth = document.documentElement.clientWidth;\n    } else {\n      viewportWidth = window.innerWidth;\n    }\n\n    if (document.documentElement.clientHeight < window.innerHeight) {\n      viewportHeight = document.documentElement.clientHeight;\n    } else {\n      viewportHeight = window.innerHeight;\n    }\n\n    const inViewportH = rect.right - marginRight >= 0 && rect.left - marginLeft <= viewportWidth;\n    const inViewportV = rect.bottom >= 0 && rect.top <= viewportHeight;\n\n    switch (direction) {\n      case 'horizontal':\n        return inViewportH;\n\n      case 'vertical':\n        return inViewportV;\n\n      case 'both':\n        return inViewportV && inViewportH;\n    }\n  },\n\n  /*\n        Resize Flickity slider to tallest cell in viewport\n        */\n  flickityResize(flickity) {\n    if (!flickity) return;\n    const {\n      viewport\n    } = flickity;\n    const heights = [];\n\n    for (let i = 0; i < flickity.cells.length; i++) {\n      const cell = flickity.cells[i];\n\n      if (this.inViewport(cell.element, 'horizontal')) {\n        const style = window.getComputedStyle(cell.element); // Combine the top and bottom margins since these values are not\n        // included in getBoundingClientRect.height();\n\n        const {\n          marginTop,\n          marginBottom\n        } = style;\n        const topMargin = parseInt(marginTop, 10);\n        const bottomMargin = parseInt(marginBottom, 10);\n        const height = topMargin + bottomMargin + cell.element.getBoundingClientRect().height;\n        heights.push(height);\n      }\n    }\n\n    const height = Math.max.apply(null, heights);\n    viewport.style.height = `${height}px`;\n  }\n\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy90aGVtZVV0aWxzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL3NvdXJjZS9zY3JpcHRzL3RoZW1lVXRpbHMuanM/NGRiMCJdLCJzb3VyY2VzQ29udGVudCI6WyJsZXQgdGhlbWVVdGlscztcblxuZXhwb3J0IGRlZmF1bHQgdGhlbWVVdGlscyA9IHtcbiAgYnJlYWtwb2ludHM6IHtcbiAgICBzbWFsbDogNzcwLFxuICAgIG1lZGl1bTogMTA4MCxcbiAgICBsYXJnZTogMTI4MFxuICB9LFxuXG4gIGV4dGVuZChkZXN0LCAuLi5vYmpzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvYmogPSBvYmpzW2ldO1xuICAgICAgZm9yIChsZXQgayBpbiBvYmopIHsgY29uc3QgdiA9IG9ialtrXTsgZGVzdFtrXSA9IHY7IH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG4gIH0sXG5cbiAgd2luZG93V2lkdGgoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoO1xuICB9LFxuXG4gIGlzTGVzc1RoYW5NZWRpdW0oKSB7XG4gICAgcmV0dXJuIHRoaXMud2luZG93V2lkdGgoKSA8IHRoaXMuYnJlYWtwb2ludHMuc21hbGw7XG4gIH0sXG5cbiAgaXNMZXNzVGhhbkxhcmdlKCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd1dpZHRoKCkgPCB0aGlzLmJyZWFrcG9pbnRzLm1lZGl1bTtcbiAgfSxcblxuICBpc1NtYWxsKCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd1dpZHRoKCkgPCB0aGlzLmJyZWFrcG9pbnRzLnNtYWxsO1xuICB9LFxuXG4gIGlzTWVkaXVtKCkge1xuICAgIHJldHVybiAodGhpcy53aW5kb3dXaWR0aCgpID49IHRoaXMuYnJlYWtwb2ludHMuc21hbGwpXG4gICAgICAmJiAodGhpcy53aW5kb3dXaWR0aCgpIDwgdGhpcy5icmVha3BvaW50cy5tZWRpdW0pO1xuICB9LFxuXG4gIGlzTGFyZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMud2luZG93V2lkdGgoKSA+PSB0aGlzLmJyZWFrcG9pbnRzLm1lZGl1bTtcbiAgfSxcblxuICBkZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICBsZXQgdGltZW91dCA9IG51bGw7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXM7XG4gICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICBjb25zdCBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuXG4gICAgICBpZiAoY2FsbE5vdykge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgdW5pcXVlKGFycmF5KSB7XG4gICAgbGV0IGtleTtcbiAgICBsZXQgYXNjO1xuICAgIGxldCBlbmQ7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgZm9yIChrZXkgPSAwLCBlbmQgPSBhcnJheS5sZW5ndGgsIGFzYyA9IChlbmQgPj0gMCk7XG4gICAgICBhc2MgPyBrZXkgPCBlbmQgOiBrZXkgPiBlbmQ7XG4gICAgICBhc2MgPyBrZXkrKyA6IGtleS0tKSB7XG4gICAgICBvdXRwdXRbYXJyYXlba2V5XV0gPSBhcnJheVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChrZXkgaW4gb3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3V0cHV0W2tleV07XG4gICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkoKTtcbiAgfSxcblxuICBpblZpZXdwb3J0KGVsLCBkaXJlY3Rpb24pIHtcbiAgICBsZXQgdmlld3BvcnRIZWlnaHQ7XG4gICAgbGV0IHZpZXdwb3J0V2lkdGg7XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBudWxsKSB7IGRpcmVjdGlvbiA9ICdib3RoJzsgfVxuXG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHN0eWxlID0gZWwuY3VycmVudFN0eWxlIHx8IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICBjb25zdCBtYXJnaW5SaWdodCA9IHBhcnNlSW50KHN0eWxlLm1hcmdpblJpZ2h0KSB8fCAwO1xuICAgIGNvbnN0IG1hcmdpbkxlZnQgPSBwYXJzZUludChzdHlsZS5tYXJnaW5MZWZ0KSB8fCAwO1xuXG4gICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCA8IHdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICB2aWV3cG9ydFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgfVxuXG4gICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPCB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgIHZpZXdwb3J0SGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgY29uc3QgaW5WaWV3cG9ydEggPSAoKHJlY3QucmlnaHQgLSBtYXJnaW5SaWdodCkgPj0gMClcbiAgICAgICYmICgocmVjdC5sZWZ0IC0gbWFyZ2luTGVmdCkgPD0gdmlld3BvcnRXaWR0aCk7XG4gICAgY29uc3QgaW5WaWV3cG9ydFYgPSAocmVjdC5ib3R0b20gPj0gMCkgJiYgKHJlY3QudG9wIDw9IHZpZXdwb3J0SGVpZ2h0KTtcblxuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdob3Jpem9udGFsJzogcmV0dXJuIGluVmlld3BvcnRIO1xuICAgICAgY2FzZSAndmVydGljYWwnOiByZXR1cm4gaW5WaWV3cG9ydFY7XG4gICAgICBjYXNlICdib3RoJzogcmV0dXJuIGluVmlld3BvcnRWICYmIGluVmlld3BvcnRIO1xuICAgIH1cbiAgfSxcblxuICAvKlxuICAgICAgICBSZXNpemUgRmxpY2tpdHkgc2xpZGVyIHRvIHRhbGxlc3QgY2VsbCBpbiB2aWV3cG9ydFxuICAgICAgICAqL1xuICBmbGlja2l0eVJlc2l6ZShmbGlja2l0eSkge1xuICAgIGlmICghZmxpY2tpdHkpIHJldHVybjtcbiAgICBjb25zdCB7IHZpZXdwb3J0IH0gPSBmbGlja2l0eTtcbiAgICBjb25zdCBoZWlnaHRzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsaWNraXR5LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjZWxsID0gZmxpY2tpdHkuY2VsbHNbaV07XG4gICAgICBpZiAodGhpcy5pblZpZXdwb3J0KGNlbGwuZWxlbWVudCwgJ2hvcml6b250YWwnKSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwuZWxlbWVudCk7XG4gICAgICAgIC8vIENvbWJpbmUgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgc2luY2UgdGhlc2UgdmFsdWVzIGFyZSBub3RcbiAgICAgICAgLy8gaW5jbHVkZWQgaW4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmhlaWdodCgpO1xuICAgICAgICBjb25zdCB7IG1hcmdpblRvcCwgbWFyZ2luQm90dG9tIH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgdG9wTWFyZ2luID0gcGFyc2VJbnQobWFyZ2luVG9wLCAxMCk7XG4gICAgICAgIGNvbnN0IGJvdHRvbU1hcmdpbiA9IHBhcnNlSW50KG1hcmdpbkJvdHRvbSwgMTApO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW4gKyBjZWxsLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIGhlaWdodHMucHVzaChoZWlnaHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGhlaWdodHMpO1xuXG4gICAgdmlld3BvcnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgfSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQS9JQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/themeUtils.js\n");

/***/ }),

/***/ "./node_modules/desandro-matches-selector/matches-selector.js":
/*!********************************************************************!*\
  !*** ./node_modules/desandro-matches-selector/matches-selector.js ***!
  \********************************************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  /*global define: false, module: false */\n  'use strict';\n  // universal module definition\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory() {\n  'use strict';\n\n  var matchesMethod = ( function() {\n    var ElemProto = window.Element.prototype;\n    // check for the standard method name first\n    if ( ElemProto.matches ) {\n      return 'matches';\n    }\n    // check un-prefixed\n    if ( ElemProto.matchesSelector ) {\n      return 'matchesSelector';\n    }\n    // check vendor prefixes\n    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n    for ( var i=0; i < prefixes.length; i++ ) {\n      var prefix = prefixes[i];\n      var method = prefix + 'MatchesSelector';\n      if ( ElemProto[ method ] ) {\n        return method;\n      }\n    }\n  })();\n\n  return function matchesSelector( elem, selector ) {\n    return elem[ matchesMethod ]( selector );\n  };\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3Rvci9tYXRjaGVzLXNlbGVjdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9kZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yL21hdGNoZXMtc2VsZWN0b3IuanM/Yzc0NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG1hdGNoZXNTZWxlY3RvciB2Mi4wLjJcbiAqIG1hdGNoZXNTZWxlY3RvciggZWxlbWVudCwgJy5zZWxlY3RvcicgKVxuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCBzdHJpY3Q6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvKmdsb2JhbCBkZWZpbmU6IGZhbHNlLCBtb2R1bGU6IGZhbHNlICovXG4gICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5tYXRjaGVzU2VsZWN0b3IgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG1hdGNoZXNNZXRob2QgPSAoIGZ1bmN0aW9uKCkge1xuICAgIHZhciBFbGVtUHJvdG8gPSB3aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7XG4gICAgLy8gY2hlY2sgZm9yIHRoZSBzdGFuZGFyZCBtZXRob2QgbmFtZSBmaXJzdFxuICAgIGlmICggRWxlbVByb3RvLm1hdGNoZXMgKSB7XG4gICAgICByZXR1cm4gJ21hdGNoZXMnO1xuICAgIH1cbiAgICAvLyBjaGVjayB1bi1wcmVmaXhlZFxuICAgIGlmICggRWxlbVByb3RvLm1hdGNoZXNTZWxlY3RvciApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlc1NlbGVjdG9yJztcbiAgICB9XG4gICAgLy8gY2hlY2sgdmVuZG9yIHByZWZpeGVzXG4gICAgdmFyIHByZWZpeGVzID0gWyAnd2Via2l0JywgJ21veicsICdtcycsICdvJyBdO1xuXG4gICAgZm9yICggdmFyIGk9MDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgICAgdmFyIG1ldGhvZCA9IHByZWZpeCArICdNYXRjaGVzU2VsZWN0b3InO1xuICAgICAgaWYgKCBFbGVtUHJvdG9bIG1ldGhvZCBdICkge1xuICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gZWxlbVsgbWF0Y2hlc01ldGhvZCBdKCBzZWxlY3RvciApO1xuICB9O1xuXG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/desandro-matches-selector/matches-selector.js\n");

/***/ }),

/***/ "./node_modules/ev-emitter/ev-emitter.js":
/*!***********************************************!*\
  !*** ./node_modules/ev-emitter/ev-emitter.js ***!
  \***********************************************/
/***/ (function(module, exports, __webpack_require__) {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if ( true ) {\n    // AMD - RequireJS\n    !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice(0);\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( var i=0; i < listeners.length; i++ ) {\n    var listener = listeners[i]\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZXYtZW1pdHRlci9ldi1lbWl0dGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9ldi1lbWl0dGVyL2V2LWVtaXR0ZXIuanM/MDk0OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV2RW1pdHRlciB2MS4xLjBcbiAqIExpbCcgZXZlbnQgZW1pdHRlclxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4vKiBqc2hpbnQgdW51c2VkOiB0cnVlLCB1bmRlZjogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHdpbmRvdyAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRCAtIFJlcXVpcmVKU1xuICAgIGRlZmluZSggZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTIC0gQnJvd3NlcmlmeSwgV2VicGFja1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xuICAgIGdsb2JhbC5FdkVtaXR0ZXIgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCkge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gRXZFbWl0dGVyKCkge31cblxudmFyIHByb3RvID0gRXZFbWl0dGVyLnByb3RvdHlwZTtcblxucHJvdG8ub24gPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgaWYgKCAhZXZlbnROYW1lIHx8ICFsaXN0ZW5lciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gc2V0IGV2ZW50cyBoYXNoXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIC8vIHNldCBsaXN0ZW5lcnMgYXJyYXlcbiAgdmFyIGxpc3RlbmVycyA9IGV2ZW50c1sgZXZlbnROYW1lIF0gPSBldmVudHNbIGV2ZW50TmFtZSBdIHx8IFtdO1xuICAvLyBvbmx5IGFkZCBvbmNlXG4gIGlmICggbGlzdGVuZXJzLmluZGV4T2YoIGxpc3RlbmVyICkgPT0gLTEgKSB7XG4gICAgbGlzdGVuZXJzLnB1c2goIGxpc3RlbmVyICk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLm9uY2UgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgaWYgKCAhZXZlbnROYW1lIHx8ICFsaXN0ZW5lciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYWRkIGV2ZW50XG4gIHRoaXMub24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgLy8gc2V0IG9uY2UgZmxhZ1xuICAvLyBzZXQgb25jZUV2ZW50cyBoYXNoXG4gIHZhciBvbmNlRXZlbnRzID0gdGhpcy5fb25jZUV2ZW50cyA9IHRoaXMuX29uY2VFdmVudHMgfHwge307XG4gIC8vIHNldCBvbmNlTGlzdGVuZXJzIG9iamVjdFxuICB2YXIgb25jZUxpc3RlbmVycyA9IG9uY2VFdmVudHNbIGV2ZW50TmFtZSBdID0gb25jZUV2ZW50c1sgZXZlbnROYW1lIF0gfHwge307XG4gIC8vIHNldCBmbGFnXG4gIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF0gPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8ub2ZmID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgaWYgKCAhbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZiggbGlzdGVuZXIgKTtcbiAgaWYgKCBpbmRleCAhPSAtMSApIHtcbiAgICBsaXN0ZW5lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5lbWl0RXZlbnQgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBhcmdzICkge1xuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzICYmIHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF07XG4gIGlmICggIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gY29weSBvdmVyIHRvIGF2b2lkIGludGVyZmVyZW5jZSBpZiAub2ZmKCkgaW4gbGlzdGVuZXJcbiAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLnNsaWNlKDApO1xuICBhcmdzID0gYXJncyB8fCBbXTtcbiAgLy8gb25jZSBzdHVmZlxuICB2YXIgb25jZUxpc3RlbmVycyA9IHRoaXMuX29uY2VFdmVudHMgJiYgdGhpcy5fb25jZUV2ZW50c1sgZXZlbnROYW1lIF07XG5cbiAgZm9yICggdmFyIGk9MDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV1cbiAgICB2YXIgaXNPbmNlID0gb25jZUxpc3RlbmVycyAmJiBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdO1xuICAgIGlmICggaXNPbmNlICkge1xuICAgICAgLy8gcmVtb3ZlIGxpc3RlbmVyXG4gICAgICAvLyByZW1vdmUgYmVmb3JlIHRyaWdnZXIgdG8gcHJldmVudCByZWN1cnNpb25cbiAgICAgIHRoaXMub2ZmKCBldmVudE5hbWUsIGxpc3RlbmVyICk7XG4gICAgICAvLyB1bnNldCBvbmNlIGZsYWdcbiAgICAgIGRlbGV0ZSBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdO1xuICAgIH1cbiAgICAvLyB0cmlnZ2VyIGxpc3RlbmVyXG4gICAgbGlzdGVuZXIuYXBwbHkoIHRoaXMsIGFyZ3MgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8uYWxsT2ZmID0gZnVuY3Rpb24oKSB7XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHM7XG4gIGRlbGV0ZSB0aGlzLl9vbmNlRXZlbnRzO1xufTtcblxucmV0dXJuIEV2RW1pdHRlcjtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/ev-emitter/ev-emitter.js\n");

/***/ }),

/***/ "./node_modules/fizzy-ui-utils/utils.js":
/*!**********************************************!*\
  !*** ./node_modules/fizzy-ui-utils/utils.js ***!
  \**********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! desandro-matches-selector/matches-selector */ \"./node_modules/desandro-matches-selector/matches-selector.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( matchesSelector ) {\n      return factory( window, matchesSelector );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  for ( var prop in b ) {\n    a[ prop ] = b[ prop ];\n  }\n  return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  if ( Array.isArray( obj ) ) {\n    // use object if already an array\n    return obj;\n  }\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) {\n    return [];\n  }\n\n  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  if ( isArrayLike ) {\n    // convert nodeList to array\n    return arraySlice.call( obj );\n  }\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  var index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( matchesSelector( elem, selector ) ) {\n      return elem;\n    }\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n  var ffElems = [];\n\n  elems.forEach( function( elem ) {\n    // check that elem is an actual element\n    if ( !( elem instanceof HTMLElement ) ) {\n      return;\n    }\n    // add elem if no selector\n    if ( !selector ) {\n      ffElems.push( elem );\n      return;\n    }\n    // filter & find items if we have a selector\n    // filter\n    if ( matchesSelector( elem, selector ) ) {\n      ffElems.push( elem );\n    }\n    // find children\n    var childElems = elem.querySelectorAll( selector );\n    // concat childElems to filterFound array\n    for ( var i=0; i < childElems.length; i++ ) {\n      ffElems.push( childElems[i] );\n    }\n  });\n\n  return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  var method = _class.prototype[ methodName ];\n  var timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    var timeout = this[ timeoutName ];\n    clearTimeout( timeout );\n\n    var args = arguments;\n    var _this = this;\n    this[ timeoutName ] = setTimeout( function() {\n      method.apply( _this, args );\n      delete _this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n  var readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( callback );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', callback );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    var dashedNamespace = utils.toDashed( namespace );\n    var dataAttr = 'data-' + dashedNamespace;\n    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n    var elems = utils.makeArray( dataAttrElems )\n      .concat( utils.makeArray( jsDashElems ) );\n    var dataOptionsAttr = dataAttr + '-options';\n    var jQuery = window.jQuery;\n\n    elems.forEach( function( elem ) {\n      var attr = elem.getAttribute( dataAttr ) ||\n        elem.getAttribute( dataOptionsAttr );\n      var options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n          ': ' + error );\n        }\n        return;\n      }\n      // initialize\n      var instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    });\n\n  });\n};\n\n// -----  ----- //\n\nreturn utils;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZml6enktdWktdXRpbHMvdXRpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2Zpenp5LXVpLXV0aWxzL3V0aWxzLmpzPzYxNTgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXp6eSBVSSB1dGlscyB2Mi4wLjdcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qanNoaW50IHN0cmljdDogZmFsc2UgKi8gLypnbG9iYWxzIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG5cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICdkZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yL21hdGNoZXMtc2VsZWN0b3InXG4gICAgXSwgZnVuY3Rpb24oIG1hdGNoZXNTZWxlY3RvciApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIG1hdGNoZXNTZWxlY3RvciApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3RvcicpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5maXp6eVVJVXRpbHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93Lm1hdGNoZXNTZWxlY3RvclxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIG1hdGNoZXNTZWxlY3RvciApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSB7fTtcblxuLy8gLS0tLS0gZXh0ZW5kIC0tLS0tIC8vXG5cbi8vIGV4dGVuZHMgb2JqZWN0c1xudXRpbHMuZXh0ZW5kID0gZnVuY3Rpb24oIGEsIGIgKSB7XG4gIGZvciAoIHZhciBwcm9wIGluIGIgKSB7XG4gICAgYVsgcHJvcCBdID0gYlsgcHJvcCBdO1xuICB9XG4gIHJldHVybiBhO1xufTtcblxuLy8gLS0tLS0gbW9kdWxvIC0tLS0tIC8vXG5cbnV0aWxzLm1vZHVsbyA9IGZ1bmN0aW9uKCBudW0sIGRpdiApIHtcbiAgcmV0dXJuICggKCBudW0gJSBkaXYgKSArIGRpdiApICUgZGl2O1xufTtcblxuLy8gLS0tLS0gbWFrZUFycmF5IC0tLS0tIC8vXG5cbnZhciBhcnJheVNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4vLyB0dXJuIGVsZW1lbnQgb3Igbm9kZUxpc3QgaW50byBhbiBhcnJheVxudXRpbHMubWFrZUFycmF5ID0gZnVuY3Rpb24oIG9iaiApIHtcbiAgaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHtcbiAgICAvLyB1c2Ugb2JqZWN0IGlmIGFscmVhZHkgYW4gYXJyYXlcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIC8vIHJldHVybiBlbXB0eSBhcnJheSBpZiB1bmRlZmluZWQgb3IgbnVsbC4gIzZcbiAgaWYgKCBvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQgKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGlzQXJyYXlMaWtlID0gdHlwZW9mIG9iaiA9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqLmxlbmd0aCA9PSAnbnVtYmVyJztcbiAgaWYgKCBpc0FycmF5TGlrZSApIHtcbiAgICAvLyBjb252ZXJ0IG5vZGVMaXN0IHRvIGFycmF5XG4gICAgcmV0dXJuIGFycmF5U2xpY2UuY2FsbCggb2JqICk7XG4gIH1cblxuICAvLyBhcnJheSBvZiBzaW5nbGUgaW5kZXhcbiAgcmV0dXJuIFsgb2JqIF07XG59O1xuXG4vLyAtLS0tLSByZW1vdmVGcm9tIC0tLS0tIC8vXG5cbnV0aWxzLnJlbW92ZUZyb20gPSBmdW5jdGlvbiggYXJ5LCBvYmogKSB7XG4gIHZhciBpbmRleCA9IGFyeS5pbmRleE9mKCBvYmogKTtcbiAgaWYgKCBpbmRleCAhPSAtMSApIHtcbiAgICBhcnkuc3BsaWNlKCBpbmRleCwgMSApO1xuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRQYXJlbnQgLS0tLS0gLy9cblxudXRpbHMuZ2V0UGFyZW50ID0gZnVuY3Rpb24oIGVsZW0sIHNlbGVjdG9yICkge1xuICB3aGlsZSAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtICE9IGRvY3VtZW50LmJvZHkgKSB7XG4gICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTtcbiAgICBpZiAoIG1hdGNoZXNTZWxlY3RvciggZWxlbSwgc2VsZWN0b3IgKSApIHtcbiAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgfVxufTtcblxuLy8gLS0tLS0gZ2V0UXVlcnlFbGVtZW50IC0tLS0tIC8vXG5cbi8vIHVzZSBlbGVtZW50IGFzIHNlbGVjdG9yIHN0cmluZ1xudXRpbHMuZ2V0UXVlcnlFbGVtZW50ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIGlmICggdHlwZW9mIGVsZW0gPT0gJ3N0cmluZycgKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsZW0gKTtcbiAgfVxuICByZXR1cm4gZWxlbTtcbn07XG5cbi8vIC0tLS0tIGhhbmRsZUV2ZW50IC0tLS0tIC8vXG5cbi8vIGVuYWJsZSAub250eXBlIHRvIHRyaWdnZXIgZnJvbSAuYWRkRXZlbnRMaXN0ZW5lciggZWxlbSwgJ3R5cGUnIClcbnV0aWxzLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgbWV0aG9kID0gJ29uJyArIGV2ZW50LnR5cGU7XG4gIGlmICggdGhpc1sgbWV0aG9kIF0gKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oIGV2ZW50ICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGZpbHRlckZpbmRFbGVtZW50cyAtLS0tLSAvL1xuXG51dGlscy5maWx0ZXJGaW5kRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMsIHNlbGVjdG9yICkge1xuICAvLyBtYWtlIGFycmF5IG9mIGVsZW1zXG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICB2YXIgZmZFbGVtcyA9IFtdO1xuXG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIC8vIGNoZWNrIHRoYXQgZWxlbSBpcyBhbiBhY3R1YWwgZWxlbWVudFxuICAgIGlmICggISggZWxlbSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICkgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGFkZCBlbGVtIGlmIG5vIHNlbGVjdG9yXG4gICAgaWYgKCAhc2VsZWN0b3IgKSB7XG4gICAgICBmZkVsZW1zLnB1c2goIGVsZW0gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZmlsdGVyICYgZmluZCBpdGVtcyBpZiB3ZSBoYXZlIGEgc2VsZWN0b3JcbiAgICAvLyBmaWx0ZXJcbiAgICBpZiAoIG1hdGNoZXNTZWxlY3RvciggZWxlbSwgc2VsZWN0b3IgKSApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgIH1cbiAgICAvLyBmaW5kIGNoaWxkcmVuXG4gICAgdmFyIGNoaWxkRWxlbXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIHNlbGVjdG9yICk7XG4gICAgLy8gY29uY2F0IGNoaWxkRWxlbXMgdG8gZmlsdGVyRm91bmQgYXJyYXlcbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgY2hpbGRFbGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggY2hpbGRFbGVtc1tpXSApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZmRWxlbXM7XG59O1xuXG4vLyAtLS0tLSBkZWJvdW5jZU1ldGhvZCAtLS0tLSAvL1xuXG51dGlscy5kZWJvdW5jZU1ldGhvZCA9IGZ1bmN0aW9uKCBfY2xhc3MsIG1ldGhvZE5hbWUsIHRocmVzaG9sZCApIHtcbiAgdGhyZXNob2xkID0gdGhyZXNob2xkIHx8IDEwMDtcbiAgLy8gb3JpZ2luYWwgbWV0aG9kXG4gIHZhciBtZXRob2QgPSBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF07XG4gIHZhciB0aW1lb3V0TmFtZSA9IG1ldGhvZE5hbWUgKyAnVGltZW91dCc7XG5cbiAgX2NsYXNzLnByb3RvdHlwZVsgbWV0aG9kTmFtZSBdID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRpbWVvdXQgPSB0aGlzWyB0aW1lb3V0TmFtZSBdO1xuICAgIGNsZWFyVGltZW91dCggdGltZW91dCApO1xuXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB0aGlzWyB0aW1lb3V0TmFtZSBdID0gc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICBtZXRob2QuYXBwbHkoIF90aGlzLCBhcmdzICk7XG4gICAgICBkZWxldGUgX3RoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgfSwgdGhyZXNob2xkICk7XG4gIH07XG59O1xuXG4vLyAtLS0tLSBkb2NSZWFkeSAtLS0tLSAvL1xuXG51dGlscy5kb2NSZWFkeSA9IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcbiAgdmFyIHJlYWR5U3RhdGUgPSBkb2N1bWVudC5yZWFkeVN0YXRlO1xuICBpZiAoIHJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyB8fCByZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZScgKSB7XG4gICAgLy8gZG8gYXN5bmMgdG8gYWxsb3cgZm9yIG90aGVyIHNjcmlwdHMgdG8gcnVuLiBtZXRhZml6enkvZmxpY2tpdHkjNDQxXG4gICAgc2V0VGltZW91dCggY2FsbGJhY2sgKTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsIGNhbGxiYWNrICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGh0bWxJbml0IC0tLS0tIC8vXG5cbi8vIGh0dHA6Ly9qYW1lc3JvYmVydHMubmFtZS9ibG9nLzIwMTAvMDIvMjIvc3RyaW5nLWZ1bmN0aW9ucy1mb3ItamF2YXNjcmlwdC10cmltLXRvLWNhbWVsLWNhc2UtdG8tZGFzaGVkLWFuZC10by11bmRlcnNjb3JlL1xudXRpbHMudG9EYXNoZWQgPSBmdW5jdGlvbiggc3RyICkge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoIC8oLikoW0EtWl0pL2csIGZ1bmN0aW9uKCBtYXRjaCwgJDEsICQyICkge1xuICAgIHJldHVybiAkMSArICctJyArICQyO1xuICB9KS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTtcbi8qKlxuICogYWxsb3cgdXNlciB0byBpbml0aWFsaXplIGNsYXNzZXMgdmlhIFtkYXRhLW5hbWVzcGFjZV0gb3IgLmpzLW5hbWVzcGFjZSBjbGFzc1xuICogaHRtbEluaXQoIFdpZGdldCwgJ3dpZGdldE5hbWUnIClcbiAqIG9wdGlvbnMgYXJlIHBhcnNlZCBmcm9tIGRhdGEtbmFtZXNwYWNlLW9wdGlvbnNcbiAqL1xudXRpbHMuaHRtbEluaXQgPSBmdW5jdGlvbiggV2lkZ2V0Q2xhc3MsIG5hbWVzcGFjZSApIHtcbiAgdXRpbHMuZG9jUmVhZHkoIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkYXNoZWROYW1lc3BhY2UgPSB1dGlscy50b0Rhc2hlZCggbmFtZXNwYWNlICk7XG4gICAgdmFyIGRhdGFBdHRyID0gJ2RhdGEtJyArIGRhc2hlZE5hbWVzcGFjZTtcbiAgICB2YXIgZGF0YUF0dHJFbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbJyArIGRhdGFBdHRyICsgJ10nICk7XG4gICAgdmFyIGpzRGFzaEVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5qcy0nICsgZGFzaGVkTmFtZXNwYWNlICk7XG4gICAgdmFyIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBkYXRhQXR0ckVsZW1zIClcbiAgICAgIC5jb25jYXQoIHV0aWxzLm1ha2VBcnJheSgganNEYXNoRWxlbXMgKSApO1xuICAgIHZhciBkYXRhT3B0aW9uc0F0dHIgPSBkYXRhQXR0ciArICctb3B0aW9ucyc7XG4gICAgdmFyIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7XG5cbiAgICBlbGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgIHZhciBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIGRhdGFBdHRyICkgfHxcbiAgICAgICAgZWxlbS5nZXRBdHRyaWJ1dGUoIGRhdGFPcHRpb25zQXR0ciApO1xuICAgICAgdmFyIG9wdGlvbnM7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRpb25zID0gYXR0ciAmJiBKU09OLnBhcnNlKCBhdHRyICk7XG4gICAgICB9IGNhdGNoICggZXJyb3IgKSB7XG4gICAgICAgIC8vIGxvZyBlcnJvciwgZG8gbm90IGluaXRpYWxpemVcbiAgICAgICAgaWYgKCBjb25zb2xlICkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdFcnJvciBwYXJzaW5nICcgKyBkYXRhQXR0ciArICcgb24gJyArIGVsZW0uY2xhc3NOYW1lICtcbiAgICAgICAgICAnOiAnICsgZXJyb3IgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBpbml0aWFsaXplXG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgV2lkZ2V0Q2xhc3MoIGVsZW0sIG9wdGlvbnMgKTtcbiAgICAgIC8vIG1ha2UgYXZhaWxhYmxlIHZpYSAkKCkuZGF0YSgnbmFtZXNwYWNlJylcbiAgICAgIGlmICggalF1ZXJ5ICkge1xuICAgICAgICBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZXNwYWNlLCBpbnN0YW5jZSApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH0pO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiB1dGlscztcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLFdBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/fizzy-ui-utils/utils.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/add-remove-cell.js":
/*!*****************************************************!*\
  !*** ./node_modules/flickity/js/add-remove-cell.js ***!
  \*****************************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n      __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, utils ) {\n      return factory( window, Flickity, utils );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  var fragment = document.createDocumentFragment();\n  cells.forEach( function( cell ) {\n    fragment.appendChild( cell.element );\n  });\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.insert = function( elems, index ) {\n  var cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  var len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  var fragment = getCellsFragment( cells );\n  // append to slider\n  var isAppend = index == len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    var insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    var endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.remove = function( elems ) {\n  var cells = this.getCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n\n  var minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( function( cell ) {\n    cell.remove();\n    var index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  }, this );\n\n  this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  var cell = this.getCell( elem );\n  if ( !cell ) {\n    return;\n  }\n  cell.getSize();\n\n  var index = this.cells.indexOf( cell );\n  this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n  var prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex\n  // try to maintain position & select previous selected element\n  var cell = this.getCell( prevSelectedElem );\n  if ( cell ) {\n    this.selectedIndex = this.getCellSlideIndex( cell );\n  }\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n  // do not position slider after lazy load\n  if ( isPositioningSlider ) {\n    this.positionSliderAtSelected();\n  }\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvYWRkLXJlbW92ZS1jZWxsLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9hZGQtcmVtb3ZlLWNlbGwuanM/YmQ3YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhZGQsIHJlbW92ZSBjZWxsXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJy4vZmxpY2tpdHknLFxuICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJ1xuICAgIF0sIGZ1bmN0aW9uKCBGbGlja2l0eSwgdXRpbHMgKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgdXRpbHMgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJy4vZmxpY2tpdHknKSxcbiAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgdXRpbHMgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gYXBwZW5kIGNlbGxzIHRvIGEgZG9jdW1lbnQgZnJhZ21lbnRcbmZ1bmN0aW9uIGdldENlbGxzRnJhZ21lbnQoIGNlbGxzICkge1xuICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIGNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKCBjZWxsLmVsZW1lbnQgKTtcbiAgfSk7XG4gIHJldHVybiBmcmFnbWVudDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWRkL3JlbW92ZSBjZWxsIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbi8qKlxuICogSW5zZXJ0LCBwcmVwZW5kLCBvciBhcHBlbmQgY2VsbHNcbiAqIEBwYXJhbSB7RWxlbWVudCwgQXJyYXksIE5vZGVMaXN0fSBlbGVtc1xuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleFxuICovXG5wcm90by5pbnNlcnQgPSBmdW5jdGlvbiggZWxlbXMsIGluZGV4ICkge1xuICB2YXIgY2VsbHMgPSB0aGlzLl9tYWtlQ2VsbHMoIGVsZW1zICk7XG4gIGlmICggIWNlbGxzIHx8ICFjZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBsZW4gPSB0aGlzLmNlbGxzLmxlbmd0aDtcbiAgLy8gZGVmYXVsdCB0byBhcHBlbmRcbiAgaW5kZXggPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gbGVuIDogaW5kZXg7XG4gIC8vIGFkZCBjZWxscyB3aXRoIGRvY3VtZW50IGZyYWdtZW50XG4gIHZhciBmcmFnbWVudCA9IGdldENlbGxzRnJhZ21lbnQoIGNlbGxzICk7XG4gIC8vIGFwcGVuZCB0byBzbGlkZXJcbiAgdmFyIGlzQXBwZW5kID0gaW5kZXggPT0gbGVuO1xuICBpZiAoIGlzQXBwZW5kICkge1xuICAgIHRoaXMuc2xpZGVyLmFwcGVuZENoaWxkKCBmcmFnbWVudCApO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnNlcnRDZWxsRWxlbWVudCA9IHRoaXMuY2VsbHNbIGluZGV4IF0uZWxlbWVudDtcbiAgICB0aGlzLnNsaWRlci5pbnNlcnRCZWZvcmUoIGZyYWdtZW50LCBpbnNlcnRDZWxsRWxlbWVudCApO1xuICB9XG4gIC8vIGFkZCB0byB0aGlzLmNlbGxzXG4gIGlmICggaW5kZXggPT09IDAgKSB7XG4gICAgLy8gcHJlcGVuZCwgYWRkIHRvIHN0YXJ0XG4gICAgdGhpcy5jZWxscyA9IGNlbGxzLmNvbmNhdCggdGhpcy5jZWxscyApO1xuICB9IGVsc2UgaWYgKCBpc0FwcGVuZCApIHtcbiAgICAvLyBhcHBlbmQsIGFkZCB0byBlbmRcbiAgICB0aGlzLmNlbGxzID0gdGhpcy5jZWxscy5jb25jYXQoIGNlbGxzICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaW5zZXJ0IGluIHRoaXMuY2VsbHNcbiAgICB2YXIgZW5kQ2VsbHMgPSB0aGlzLmNlbGxzLnNwbGljZSggaW5kZXgsIGxlbiAtIGluZGV4ICk7XG4gICAgdGhpcy5jZWxscyA9IHRoaXMuY2VsbHMuY29uY2F0KCBjZWxscyApLmNvbmNhdCggZW5kQ2VsbHMgKTtcbiAgfVxuXG4gIHRoaXMuX3NpemVDZWxscyggY2VsbHMgKTtcbiAgdGhpcy5jZWxsQ2hhbmdlKCBpbmRleCwgdHJ1ZSApO1xufTtcblxucHJvdG8uYXBwZW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB0aGlzLmluc2VydCggZWxlbXMsIHRoaXMuY2VsbHMubGVuZ3RoICk7XG59O1xuXG5wcm90by5wcmVwZW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB0aGlzLmluc2VydCggZWxlbXMsIDAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGNlbGxzXG4gKiBAcGFyYW0ge0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdH0gZWxlbXNcbiAqL1xucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgY2VsbHMgPSB0aGlzLmdldENlbGxzKCBlbGVtcyApO1xuICBpZiAoICFjZWxscyB8fCAhY2VsbHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtaW5DZWxsSW5kZXggPSB0aGlzLmNlbGxzLmxlbmd0aCAtIDE7XG4gIC8vIHJlbW92ZSBjZWxscyBmcm9tIGNvbGxlY3Rpb24gJiBET01cbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5yZW1vdmUoKTtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgICBtaW5DZWxsSW5kZXggPSBNYXRoLm1pbiggaW5kZXgsIG1pbkNlbGxJbmRleCApO1xuICAgIHV0aWxzLnJlbW92ZUZyb20oIHRoaXMuY2VsbHMsIGNlbGwgKTtcbiAgfSwgdGhpcyApO1xuXG4gIHRoaXMuY2VsbENoYW5nZSggbWluQ2VsbEluZGV4LCB0cnVlICk7XG59O1xuXG4vKipcbiAqIGxvZ2ljIHRvIGJlIHJ1biBhZnRlciBhIGNlbGwncyBzaXplIGNoYW5nZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbSAtIGNlbGwncyBlbGVtZW50XG4gKi9cbnByb3RvLmNlbGxTaXplQ2hhbmdlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG4gIGlmICggIWNlbGwgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNlbGwuZ2V0U2l6ZSgpO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuY2VsbHMuaW5kZXhPZiggY2VsbCApO1xuICB0aGlzLmNlbGxDaGFuZ2UoIGluZGV4ICk7XG59O1xuXG4vKipcbiAqIGxvZ2ljIGFueSB0aW1lIGEgY2VsbCBpcyBjaGFuZ2VkOiBhZGRlZCwgcmVtb3ZlZCwgb3Igc2l6ZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGNoYW5nZWRDZWxsSW5kZXggLSBpbmRleCBvZiB0aGUgY2hhbmdlZCBjZWxsLCBvcHRpb25hbFxuICovXG5wcm90by5jZWxsQ2hhbmdlID0gZnVuY3Rpb24oIGNoYW5nZWRDZWxsSW5kZXgsIGlzUG9zaXRpb25pbmdTbGlkZXIgKSB7XG4gIHZhciBwcmV2U2VsZWN0ZWRFbGVtID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQ7XG4gIHRoaXMuX3Bvc2l0aW9uQ2VsbHMoIGNoYW5nZWRDZWxsSW5kZXggKTtcbiAgdGhpcy5fZ2V0V3JhcFNoaWZ0Q2VsbHMoKTtcbiAgdGhpcy5zZXRHYWxsZXJ5U2l6ZSgpO1xuICAvLyB1cGRhdGUgc2VsZWN0ZWRJbmRleFxuICAvLyB0cnkgdG8gbWFpbnRhaW4gcG9zaXRpb24gJiBzZWxlY3QgcHJldmlvdXMgc2VsZWN0ZWQgZWxlbWVudFxuICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggcHJldlNlbGVjdGVkRWxlbSApO1xuICBpZiAoIGNlbGwgKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5nZXRDZWxsU2xpZGVJbmRleCggY2VsbCApO1xuICB9XG4gIHRoaXMuc2VsZWN0ZWRJbmRleCA9IE1hdGgubWluKCB0aGlzLnNsaWRlcy5sZW5ndGggLSAxLCB0aGlzLnNlbGVjdGVkSW5kZXggKTtcblxuICB0aGlzLmVtaXRFdmVudCggJ2NlbGxDaGFuZ2UnLCBbIGNoYW5nZWRDZWxsSW5kZXggXSApO1xuICAvLyBwb3NpdGlvbiBzbGlkZXJcbiAgdGhpcy5zZWxlY3QoIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICAvLyBkbyBub3QgcG9zaXRpb24gc2xpZGVyIGFmdGVyIGxhenkgbG9hZFxuICBpZiAoIGlzUG9zaXRpb25pbmdTbGlkZXIgKSB7XG4gICAgdGhpcy5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLFdBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/add-remove-cell.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/animate.js":
/*!*********************************************!*\
  !*** ./node_modules/flickity/js/animate.js ***!
  \*********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// animate\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( utils ) {\n      return factory( window, utils );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) {\n    return;\n  }\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  var previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) {\n    var _this = this;\n    requestAnimationFrame( function animateFrame() {\n      _this.animate();\n    });\n  }\n};\n\nproto.positionSlider = function() {\n  var x = this.x;\n  // wrap position around\n  if ( this.options.wrapAround && this.cells.length > 1 ) {\n    x = utils.modulo( x, this.slideableWidth );\n    x = x - this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  this.setTranslateX( x, this.isAnimating );\n  this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n  x += this.cursorPosition;\n  // reverse if right-to-left and using transform\n  x = this.options.rightToLeft ? -x : x;\n  var translateX = this.getPositionValue( x );\n  // use 3D tranforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = is3d ?\n    'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n  var firstSlide = this.slides[0];\n  if ( !firstSlide ) {\n    return;\n  }\n  var positionX = -this.x - firstSlide.target;\n  var progress = positionX / this.slidesWidth;\n  this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) {\n    return;\n  }\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 )+ '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\n    this.restingFrames++;\n  }\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  var beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  for ( var i=0; i < cells.length; i++ ) {\n    var cell = cells[i];\n    var cellShift = gap > 0 ? shift : 0;\n    cell.wrapShift( cellShift );\n    gap -= cell.size.outerWidth;\n  }\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  for ( var i=0; i < cells.length; i++ ) {\n    cells[i].wrapShift( 0 );\n  }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) {\n    return;\n  }\n  // change the position to drag position by applying force\n  var dragVelocity = this.dragX - this.x;\n  var dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  var dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n    return;\n  }\n  var distance = this.selectedSlide.target * -1 - this.x;\n  var force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvYW5pbWF0ZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvYW5pbWF0ZS5qcz8wMTUwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGFuaW1hdGVcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnXG4gICAgXSwgZnVuY3Rpb24oIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgdXRpbHMgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LkZsaWNraXR5ID0gd2luZG93LkZsaWNraXR5IHx8IHt9O1xuICAgIHdpbmRvdy5GbGlja2l0eS5hbmltYXRlUHJvdG90eXBlID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCB1dGlscyApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhbmltYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBwcm90byA9IHt9O1xuXG5wcm90by5zdGFydEFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuaXNBbmltYXRpbmcgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG4gIHRoaXMucmVzdGluZ0ZyYW1lcyA9IDA7XG4gIHRoaXMuYW5pbWF0ZSgpO1xufTtcblxucHJvdG8uYW5pbWF0ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmFwcGx5RHJhZ0ZvcmNlKCk7XG4gIHRoaXMuYXBwbHlTZWxlY3RlZEF0dHJhY3Rpb24oKTtcblxuICB2YXIgcHJldmlvdXNYID0gdGhpcy54O1xuXG4gIHRoaXMuaW50ZWdyYXRlUGh5c2ljcygpO1xuICB0aGlzLnBvc2l0aW9uU2xpZGVyKCk7XG4gIHRoaXMuc2V0dGxlKCBwcmV2aW91c1ggKTtcbiAgLy8gYW5pbWF0ZSBuZXh0IGZyYW1lXG4gIGlmICggdGhpcy5pc0FuaW1hdGluZyApIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggZnVuY3Rpb24gYW5pbWF0ZUZyYW1lKCkge1xuICAgICAgX3RoaXMuYW5pbWF0ZSgpO1xuICAgIH0pO1xuICB9XG59O1xuXG5wcm90by5wb3NpdGlvblNsaWRlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgeCA9IHRoaXMueDtcbiAgLy8gd3JhcCBwb3NpdGlvbiBhcm91bmRcbiAgaWYgKCB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiB0aGlzLmNlbGxzLmxlbmd0aCA+IDEgKSB7XG4gICAgeCA9IHV0aWxzLm1vZHVsbyggeCwgdGhpcy5zbGlkZWFibGVXaWR0aCApO1xuICAgIHggPSB4IC0gdGhpcy5zbGlkZWFibGVXaWR0aDtcbiAgICB0aGlzLnNoaWZ0V3JhcENlbGxzKCB4ICk7XG4gIH1cblxuICB0aGlzLnNldFRyYW5zbGF0ZVgoIHgsIHRoaXMuaXNBbmltYXRpbmcgKTtcbiAgdGhpcy5kaXNwYXRjaFNjcm9sbEV2ZW50KCk7XG59O1xuXG5wcm90by5zZXRUcmFuc2xhdGVYID0gZnVuY3Rpb24oIHgsIGlzM2QgKSB7XG4gIHggKz0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgLy8gcmV2ZXJzZSBpZiByaWdodC10by1sZWZ0IGFuZCB1c2luZyB0cmFuc2Zvcm1cbiAgeCA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdCA/IC14IDogeDtcbiAgdmFyIHRyYW5zbGF0ZVggPSB0aGlzLmdldFBvc2l0aW9uVmFsdWUoIHggKTtcbiAgLy8gdXNlIDNEIHRyYW5mb3JtcyBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIG9uIGlPU1xuICAvLyBidXQgdXNlIDJEIHdoZW4gc2V0dGxlZCwgZm9yIGJldHRlciBmb250LXJlbmRlcmluZ1xuICB0aGlzLnNsaWRlci5zdHlsZS50cmFuc2Zvcm0gPSBpczNkID9cbiAgICAndHJhbnNsYXRlM2QoJyArIHRyYW5zbGF0ZVggKyAnLDAsMCknIDogJ3RyYW5zbGF0ZVgoJyArIHRyYW5zbGF0ZVggKyAnKSc7XG59O1xuXG5wcm90by5kaXNwYXRjaFNjcm9sbEV2ZW50ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmaXJzdFNsaWRlID0gdGhpcy5zbGlkZXNbMF07XG4gIGlmICggIWZpcnN0U2xpZGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBwb3NpdGlvblggPSAtdGhpcy54IC0gZmlyc3RTbGlkZS50YXJnZXQ7XG4gIHZhciBwcm9ncmVzcyA9IHBvc2l0aW9uWCAvIHRoaXMuc2xpZGVzV2lkdGg7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3Njcm9sbCcsIG51bGwsIFsgcHJvZ3Jlc3MsIHBvc2l0aW9uWCBdICk7XG59O1xuXG5wcm90by5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMueCA9IC10aGlzLnNlbGVjdGVkU2xpZGUudGFyZ2V0O1xuICB0aGlzLnZlbG9jaXR5ID0gMDsgLy8gc3RvcCB3b2JibGVcbiAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xufTtcblxucHJvdG8uZ2V0UG9zaXRpb25WYWx1ZSA9IGZ1bmN0aW9uKCBwb3NpdGlvbiApIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICkge1xuICAgIC8vIHBlcmNlbnQgcG9zaXRpb24sIHJvdW5kIHRvIDIgZGlnaXRzLCBsaWtlIDEyLjM0JVxuICAgIHJldHVybiAoIE1hdGgucm91bmQoICggcG9zaXRpb24gLyB0aGlzLnNpemUuaW5uZXJXaWR0aCApICogMTAwMDAgKSAqIDAuMDEgKSsgJyUnO1xuICB9IGVsc2Uge1xuICAgIC8vIHBpeGVsIHBvc2l0aW9uaW5nXG4gICAgcmV0dXJuIE1hdGgucm91bmQoIHBvc2l0aW9uICkgKyAncHgnO1xuICB9XG59O1xuXG5wcm90by5zZXR0bGUgPSBmdW5jdGlvbiggcHJldmlvdXNYICkge1xuICAvLyBrZWVwIHRyYWNrIG9mIGZyYW1lcyB3aGVyZSB4IGhhc24ndCBtb3ZlZFxuICBpZiAoICF0aGlzLmlzUG9pbnRlckRvd24gJiYgTWF0aC5yb3VuZCggdGhpcy54ICogMTAwICkgPT0gTWF0aC5yb3VuZCggcHJldmlvdXNYICogMTAwICkgKSB7XG4gICAgdGhpcy5yZXN0aW5nRnJhbWVzKys7XG4gIH1cbiAgLy8gc3RvcCBhbmltYXRpbmcgaWYgcmVzdGluZyBmb3IgMyBvciBtb3JlIGZyYW1lc1xuICBpZiAoIHRoaXMucmVzdGluZ0ZyYW1lcyA+IDIgKSB7XG4gICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLmlzRnJlZVNjcm9sbGluZztcbiAgICAvLyByZW5kZXIgcG9zaXRpb24gd2l0aCB0cmFuc2xhdGVYIHdoZW4gc2V0dGxlZFxuICAgIHRoaXMucG9zaXRpb25TbGlkZXIoKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoICdzZXR0bGUnLCBudWxsLCBbIHRoaXMuc2VsZWN0ZWRJbmRleCBdICk7XG4gIH1cbn07XG5cbnByb3RvLnNoaWZ0V3JhcENlbGxzID0gZnVuY3Rpb24oIHggKSB7XG4gIC8vIHNoaWZ0IGJlZm9yZSBjZWxsc1xuICB2YXIgYmVmb3JlR2FwID0gdGhpcy5jdXJzb3JQb3NpdGlvbiArIHg7XG4gIHRoaXMuX3NoaWZ0Q2VsbHMoIHRoaXMuYmVmb3JlU2hpZnRDZWxscywgYmVmb3JlR2FwLCAtMSApO1xuICAvLyBzaGlmdCBhZnRlciBjZWxsc1xuICB2YXIgYWZ0ZXJHYXAgPSB0aGlzLnNpemUuaW5uZXJXaWR0aCAtICggeCArIHRoaXMuc2xpZGVhYmxlV2lkdGggKyB0aGlzLmN1cnNvclBvc2l0aW9uICk7XG4gIHRoaXMuX3NoaWZ0Q2VsbHMoIHRoaXMuYWZ0ZXJTaGlmdENlbGxzLCBhZnRlckdhcCwgMSApO1xufTtcblxucHJvdG8uX3NoaWZ0Q2VsbHMgPSBmdW5jdGlvbiggY2VsbHMsIGdhcCwgc2hpZnQgKSB7XG4gIGZvciAoIHZhciBpPTA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgY2VsbCA9IGNlbGxzW2ldO1xuICAgIHZhciBjZWxsU2hpZnQgPSBnYXAgPiAwID8gc2hpZnQgOiAwO1xuICAgIGNlbGwud3JhcFNoaWZ0KCBjZWxsU2hpZnQgKTtcbiAgICBnYXAgLT0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbn07XG5cbnByb3RvLl91bnNoaWZ0Q2VsbHMgPSBmdW5jdGlvbiggY2VsbHMgKSB7XG4gIGlmICggIWNlbGxzIHx8ICFjZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoIHZhciBpPTA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICBjZWxsc1tpXS53cmFwU2hpZnQoIDAgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGh5c2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by5pbnRlZ3JhdGVQaHlzaWNzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMueCArPSB0aGlzLnZlbG9jaXR5O1xuICB0aGlzLnZlbG9jaXR5ICo9IHRoaXMuZ2V0RnJpY3Rpb25GYWN0b3IoKTtcbn07XG5cbnByb3RvLmFwcGx5Rm9yY2UgPSBmdW5jdGlvbiggZm9yY2UgKSB7XG4gIHRoaXMudmVsb2NpdHkgKz0gZm9yY2U7XG59O1xuXG5wcm90by5nZXRGcmljdGlvbkZhY3RvciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gMSAtIHRoaXMub3B0aW9uc1sgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPyAnZnJlZVNjcm9sbEZyaWN0aW9uJyA6ICdmcmljdGlvbicgXTtcbn07XG5cbnByb3RvLmdldFJlc3RpbmdQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBteSB0aGFua3MgdG8gU3RldmVuIFdpdHRlbnMsIHdobyBzaW1wbGlmaWVkIHRoaXMgbWF0aCBncmVhdGx5XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLnZlbG9jaXR5IC8gKCAxIC0gdGhpcy5nZXRGcmljdGlvbkZhY3RvcigpICk7XG59O1xuXG5wcm90by5hcHBseURyYWdGb3JjZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlIHx8ICF0aGlzLmlzUG9pbnRlckRvd24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGNoYW5nZSB0aGUgcG9zaXRpb24gdG8gZHJhZyBwb3NpdGlvbiBieSBhcHBseWluZyBmb3JjZVxuICB2YXIgZHJhZ1ZlbG9jaXR5ID0gdGhpcy5kcmFnWCAtIHRoaXMueDtcbiAgdmFyIGRyYWdGb3JjZSA9IGRyYWdWZWxvY2l0eSAtIHRoaXMudmVsb2NpdHk7XG4gIHRoaXMuYXBwbHlGb3JjZSggZHJhZ0ZvcmNlICk7XG59O1xuXG5wcm90by5hcHBseVNlbGVjdGVkQXR0cmFjdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBkbyBub3QgYXR0cmFjdCBpZiBwb2ludGVyIGRvd24gb3Igbm8gc2xpZGVzXG4gIHZhciBkcmFnRG93biA9IHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5pc1BvaW50ZXJEb3duO1xuICBpZiAoIGRyYWdEb3duIHx8IHRoaXMuaXNGcmVlU2Nyb2xsaW5nIHx8ICF0aGlzLnNsaWRlcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBkaXN0YW5jZSA9IHRoaXMuc2VsZWN0ZWRTbGlkZS50YXJnZXQgKiAtMSAtIHRoaXMueDtcbiAgdmFyIGZvcmNlID0gZGlzdGFuY2UgKiB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRBdHRyYWN0aW9uO1xuICB0aGlzLmFwcGx5Rm9yY2UoIGZvcmNlICk7XG59O1xuXG5yZXR1cm4gcHJvdG87XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EsV0FhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/animate.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/cell.js":
/*!******************************************!*\
  !*** ./node_modules/flickity/js/cell.js ***!
  \******************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( getSize ) {\n      return factory( window, getSize );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n  this.element = elem;\n  this.parent = parent;\n\n  this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n  this.element.style.position = 'absolute';\n  this.element.setAttribute( 'aria-hidden', 'true' );\n  this.x = 0;\n  this.shift = 0;\n};\n\nproto.destroy = function() {\n  // reset style\n  this.unselect();\n  this.element.style.position = '';\n  var side = this.parent.originSide;\n  this.element.style[ side ] = '';\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n  this.x = x;\n  this.updateTarget();\n  this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n  var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n  this.target = this.x + this.size[ marginProperty ] +\n    this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n  // render position of cell with in slider\n  var side = this.parent.originSide;\n  this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\nproto.select = function() {\n  this.element.classList.add('is-selected');\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n  this.element.classList.remove('is-selected');\n  this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n  this.shift = shift;\n  this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n  this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvY2VsbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvY2VsbC5qcz9jOGRjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZsaWNraXR5LkNlbGxcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgXSwgZnVuY3Rpb24oIGdldFNpemUgKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBnZXRTaXplICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdnZXQtc2l6ZScpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuQ2VsbCA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuZ2V0U2l6ZVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIGdldFNpemUgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gQ2VsbCggZWxlbSwgcGFyZW50ICkge1xuICB0aGlzLmVsZW1lbnQgPSBlbGVtO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICB0aGlzLmNyZWF0ZSgpO1xufVxuXG52YXIgcHJvdG8gPSBDZWxsLnByb3RvdHlwZTtcblxucHJvdG8uY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicsICd0cnVlJyApO1xuICB0aGlzLnggPSAwO1xuICB0aGlzLnNoaWZ0ID0gMDtcbn07XG5cbnByb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmVzZXQgc3R5bGVcbiAgdGhpcy51bnNlbGVjdCgpO1xuICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnJztcbiAgdmFyIHNpZGUgPSB0aGlzLnBhcmVudC5vcmlnaW5TaWRlO1xuICB0aGlzLmVsZW1lbnQuc3R5bGVbIHNpZGUgXSA9ICcnO1xufTtcblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbnByb3RvLnNldFBvc2l0aW9uID0gZnVuY3Rpb24oIHggKSB7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMudXBkYXRlVGFyZ2V0KCk7XG4gIHRoaXMucmVuZGVyUG9zaXRpb24oIHggKTtcbn07XG5cbi8vIHNldERlZmF1bHRUYXJnZXQgdjEgbWV0aG9kLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcmVtb3ZlIGluIHYzXG5wcm90by51cGRhdGVUYXJnZXQgPSBwcm90by5zZXREZWZhdWx0VGFyZ2V0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBtYXJnaW5Qcm9wZXJ0eSA9IHRoaXMucGFyZW50Lm9yaWdpblNpZGUgPT0gJ2xlZnQnID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0JztcbiAgdGhpcy50YXJnZXQgPSB0aGlzLnggKyB0aGlzLnNpemVbIG1hcmdpblByb3BlcnR5IF0gK1xuICAgIHRoaXMuc2l6ZS53aWR0aCAqIHRoaXMucGFyZW50LmNlbGxBbGlnbjtcbn07XG5cbnByb3RvLnJlbmRlclBvc2l0aW9uID0gZnVuY3Rpb24oIHggKSB7XG4gIC8vIHJlbmRlciBwb3NpdGlvbiBvZiBjZWxsIHdpdGggaW4gc2xpZGVyXG4gIHZhciBzaWRlID0gdGhpcy5wYXJlbnQub3JpZ2luU2lkZTtcbiAgdGhpcy5lbGVtZW50LnN0eWxlWyBzaWRlIF0gPSB0aGlzLnBhcmVudC5nZXRQb3NpdGlvblZhbHVlKCB4ICk7XG59O1xuXG5wcm90by5zZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzLXNlbGVjdGVkJyk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG59O1xuXG5wcm90by51bnNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtc2VsZWN0ZWQnKTtcbiAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZWdlcn0gZmFjdG9yIC0gMCwgMSwgb3IgLTFcbioqL1xucHJvdG8ud3JhcFNoaWZ0ID0gZnVuY3Rpb24oIHNoaWZ0ICkge1xuICB0aGlzLnNoaWZ0ID0gc2hpZnQ7XG4gIHRoaXMucmVuZGVyUG9zaXRpb24oIHRoaXMueCArIHRoaXMucGFyZW50LnNsaWRlYWJsZVdpZHRoICogc2hpZnQgKTtcbn07XG5cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGhpcy5lbGVtZW50ICk7XG59O1xuXG5yZXR1cm4gQ2VsbDtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxXQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/cell.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/drag.js":
/*!******************************************!*\
  !*** ./node_modules/flickity/js/drag.js ***!
  \******************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// drag\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n      __webpack_require__(/*! unidragger/unidragger */ \"./node_modules/unidragger/unidragger.js\"),\n      __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, Unidragger, utils ) {\n      return factory( window, Flickity, Unidragger, utils );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n});\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// --------------------------  -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._createDrag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'deactivate', this.onDeactivateDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  // TODO updateDraggable on resize? if groupCells & slides change\n  // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n  // #457, RubaXa/Sortable#973\n  if ( isTouch && !isTouchmoveScrollCanceled ) {\n    window.addEventListener( 'touchmove', function() {});\n    isTouchmoveScrollCanceled = true;\n  }\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable == '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  if ( this.isDraggable ) {\n    this.element.classList.add('is-draggable');\n  } else {\n    this.element.classList.remove('is-draggable');\n  }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n  this.options.draggable = true;\n  this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n  this.options.draggable = false;\n  this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    this._pointerDownDefault( event, pointer );\n    return;\n  }\n  var isOkay = this.okayPointerDown( event );\n  if ( !isOkay ) {\n    return;\n  }\n\n  this._pointerDownPreventDefault( event );\n  this.pointerDownFocus( event );\n  // blur\n  if ( document.activeElement != this.element ) {\n    // do not blur if already focused\n    this.pointerDownBlur();\n  }\n\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n\n  this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n  // track start event position\n  // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n  INPUT: true,\n  TEXTAREA: true,\n  SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  if ( !isFocusNode ) {\n    this.focus();\n  }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n  var isTouchStart = event.type == 'touchstart';\n  var isTouchPointer = event.pointerType == 'touch';\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n    event.preventDefault();\n  }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n  this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n  this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  var direction = this.options.rightToLeft ? -1 : 1;\n  if ( this.options.wrapAround ) {\n    // wrap around move. #589\n    moveVector.x = moveVector.x % this.slideableWidth;\n  }\n  var dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.options.wrapAround && this.slides.length ) {\n    // slow drag\n    var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n\n  this.dragMoveTime = new Date();\n  this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  if ( this.options.freeScroll ) {\n    this.isFreeScrolling = true;\n  }\n  // set selectedIndex based on where flick will end up\n  var index = this.dragEndRestingSelect();\n\n  if ( this.options.freeScroll && !this.options.wrapAround ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    var restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // TODO refactor this, selecting here feels weird\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.options.wrapAround;\n  this.select( index );\n  delete this.isDragSelect;\n  this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n  var restingX = this.getRestingPosition();\n  // how far away from selected slide\n  var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  var positiveResting = this._getClosestResting( restingX, distance, 1 );\n  var negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  var index = positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n  return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  var index = this.selectedIndex;\n  var minDistance = Infinity;\n  var condition = this.options.contain && !this.options.wrapAround ?\n    // if contain, keep going if distance is equal to minDistance\n    function( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) {\n      break;\n    }\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x\n * @param {Integer} index - slide index\n */\nproto.getSlideDistance = function( x, index ) {\n  var len = this.slides.length;\n  // wrap around if at least 2 slides\n  var isWrapAround = this.options.wrapAround && len > 1;\n  var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  var slide = this.slides[ slideIndex ];\n  if ( !slide ) {\n    return null;\n  }\n  // add distance for wrap-around slides\n  var wrap = isWrapAround ? this.slideableWidth * Math.floor( index / len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  var delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n  // get clickedCell, if cell was clicked\n  var clickedCell = this.getParentCell( event.target );\n  var cellElem = clickedCell && clickedCell.element;\n  var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n  this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  var scroll = getScrollPosition();\n  var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this._pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvZHJhZy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvZHJhZy5qcz80OTY0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGRyYWdcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAndW5pZHJhZ2dlci91bmlkcmFnZ2VyJyxcbiAgICAgICdmaXp6eS11aS11dGlscy91dGlscydcbiAgICBdLCBmdW5jdGlvbiggRmxpY2tpdHksIFVuaWRyYWdnZXIsIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFVuaWRyYWdnZXIsIHV0aWxzICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCcuL2ZsaWNraXR5JyksXG4gICAgICByZXF1aXJlKCd1bmlkcmFnZ2VyJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRmxpY2tpdHksXG4gICAgICB3aW5kb3cuVW5pZHJhZ2dlcixcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pZHJhZ2dlciwgdXRpbHMgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0gZGVmYXVsdHMgLS0tLS0gLy9cblxudXRpbHMuZXh0ZW5kKCBGbGlja2l0eS5kZWZhdWx0cywge1xuICBkcmFnZ2FibGU6ICc+MScsXG4gIGRyYWdUaHJlc2hvbGQ6IDMsXG59KTtcblxuLy8gLS0tLS0gY3JlYXRlIC0tLS0tIC8vXG5cbkZsaWNraXR5LmNyZWF0ZU1ldGhvZHMucHVzaCgnX2NyZWF0ZURyYWcnKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZHJhZyBwcm90b3R5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xudXRpbHMuZXh0ZW5kKCBwcm90bywgVW5pZHJhZ2dlci5wcm90b3R5cGUgKTtcbnByb3RvLl90b3VjaEFjdGlvblZhbHVlID0gJ3Bhbi15JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBpc1RvdWNoID0gJ2NyZWF0ZVRvdWNoJyBpbiBkb2N1bWVudDtcbnZhciBpc1RvdWNobW92ZVNjcm9sbENhbmNlbGVkID0gZmFsc2U7XG5cbnByb3RvLl9jcmVhdGVEcmFnID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMub25BY3RpdmF0ZURyYWcgKTtcbiAgdGhpcy5vbiggJ3VpQ2hhbmdlJywgdGhpcy5fdWlDaGFuZ2VEcmFnICk7XG4gIHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy5vbkRlYWN0aXZhdGVEcmFnICk7XG4gIHRoaXMub24oICdjZWxsQ2hhbmdlJywgdGhpcy51cGRhdGVEcmFnZ2FibGUgKTtcbiAgLy8gVE9ETyB1cGRhdGVEcmFnZ2FibGUgb24gcmVzaXplPyBpZiBncm91cENlbGxzICYgc2xpZGVzIGNoYW5nZVxuICAvLyBIQUNLIC0gYWRkIHNlZW1pbmdseSBpbm5vY3VvdXMgaGFuZGxlciB0byBmaXggaU9TIDEwIHNjcm9sbCBiZWhhdmlvclxuICAvLyAjNDU3LCBSdWJhWGEvU29ydGFibGUjOTczXG4gIGlmICggaXNUb3VjaCAmJiAhaXNUb3VjaG1vdmVTY3JvbGxDYW5jZWxlZCApIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIGZ1bmN0aW9uKCkge30pO1xuICAgIGlzVG91Y2htb3ZlU2Nyb2xsQ2FuY2VsZWQgPSB0cnVlO1xuICB9XG59O1xuXG5wcm90by5vbkFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmhhbmRsZXMgPSBbIHRoaXMudmlld3BvcnQgXTtcbiAgdGhpcy5iaW5kSGFuZGxlcygpO1xuICB0aGlzLnVwZGF0ZURyYWdnYWJsZSgpO1xufTtcblxucHJvdG8ub25EZWFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnVuYmluZEhhbmRsZXMoKTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xufTtcblxucHJvdG8udXBkYXRlRHJhZ2dhYmxlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRpc2FibGUgZHJhZ2dpbmcgaWYgbGVzcyB0aGFuIDIgc2xpZGVzLiAjMjc4XG4gIGlmICggdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9PSAnPjEnICkge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLnNsaWRlcy5sZW5ndGggPiAxO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlO1xuICB9XG4gIGlmICggdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtZHJhZ2dhYmxlJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xuICB9XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxucHJvdG8uYmluZERyYWcgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9IHRydWU7XG4gIHRoaXMudXBkYXRlRHJhZ2dhYmxlKCk7XG59O1xuXG5wcm90by51bmJpbmREcmFnID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgdGhpcy51cGRhdGVEcmFnZ2FibGUoKTtcbn07XG5cbnByb3RvLl91aUNoYW5nZURyYWcgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuaXNGcmVlU2Nyb2xsaW5nO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcG9pbnRlciBldmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8ucG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgdGhpcy5fcG9pbnRlckRvd25EZWZhdWx0KCBldmVudCwgcG9pbnRlciApO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaXNPa2F5ID0gdGhpcy5va2F5UG9pbnRlckRvd24oIGV2ZW50ICk7XG4gIGlmICggIWlzT2theSApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl9wb2ludGVyRG93blByZXZlbnREZWZhdWx0KCBldmVudCApO1xuICB0aGlzLnBvaW50ZXJEb3duRm9jdXMoIGV2ZW50ICk7XG4gIC8vIGJsdXJcbiAgaWYgKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZWxlbWVudCApIHtcbiAgICAvLyBkbyBub3QgYmx1ciBpZiBhbHJlYWR5IGZvY3VzZWRcbiAgICB0aGlzLnBvaW50ZXJEb3duQmx1cigpO1xuICB9XG5cbiAgLy8gc3RvcCBpZiBpdCB3YXMgbW92aW5nXG4gIHRoaXMuZHJhZ1ggPSB0aGlzLng7XG4gIHRoaXMudmlld3BvcnQuY2xhc3NMaXN0LmFkZCgnaXMtcG9pbnRlci1kb3duJyk7XG4gIC8vIHRyYWNrIHNjcm9sbGluZ1xuICB0aGlzLnBvaW50ZXJEb3duU2Nyb2xsID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCB0aGlzICk7XG5cbiAgdGhpcy5fcG9pbnRlckRvd25EZWZhdWx0KCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gZGVmYXVsdCBwb2ludGVyRG93biBsb2dpYywgdXNlZCBmb3Igc3RhdGljQ2xpY2tcbnByb3RvLl9wb2ludGVyRG93bkRlZmF1bHQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIHRyYWNrIHN0YXJ0IGV2ZW50IHBvc2l0aW9uXG4gIC8vIFNhZmFyaSA5IG92ZXJyaWRlcyBwYWdlWCBhbmQgcGFnZVkuIFRoZXNlIHZhbHVlcyBuZWVkcyB0byBiZSBjb3BpZWQuICM3NzlcbiAgdGhpcy5wb2ludGVyRG93blBvaW50ZXIgPSB7XG4gICAgcGFnZVg6IHBvaW50ZXIucGFnZVgsXG4gICAgcGFnZVk6IHBvaW50ZXIucGFnZVksXG4gIH07XG4gIC8vIGJpbmQgbW92ZSBhbmQgZW5kIGV2ZW50c1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyRG93bicsIGV2ZW50LCBbIHBvaW50ZXIgXSApO1xufTtcblxudmFyIGZvY3VzTm9kZXMgPSB7XG4gIElOUFVUOiB0cnVlLFxuICBURVhUQVJFQTogdHJ1ZSxcbiAgU0VMRUNUOiB0cnVlLFxufTtcblxucHJvdG8ucG9pbnRlckRvd25Gb2N1cyA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIGlzRm9jdXNOb2RlID0gZm9jdXNOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIGlmICggIWlzRm9jdXNOb2RlICkge1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxufTtcblxucHJvdG8uX3BvaW50ZXJEb3duUHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBpc1RvdWNoU3RhcnQgPSBldmVudC50eXBlID09ICd0b3VjaHN0YXJ0JztcbiAgdmFyIGlzVG91Y2hQb2ludGVyID0gZXZlbnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJztcbiAgdmFyIGlzRm9jdXNOb2RlID0gZm9jdXNOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIGlmICggIWlzVG91Y2hTdGFydCAmJiAhaXNUb3VjaFBvaW50ZXIgJiYgIWlzRm9jdXNOb2RlICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIG1vdmUgLS0tLS0gLy9cblxucHJvdG8uaGFzRHJhZ1N0YXJ0ZWQgPSBmdW5jdGlvbiggbW92ZVZlY3RvciApIHtcbiAgcmV0dXJuIE1hdGguYWJzKCBtb3ZlVmVjdG9yLnggKSA+IHRoaXMub3B0aW9ucy5kcmFnVGhyZXNob2xkO1xufTtcblxuLy8gLS0tLS0gdXAgLS0tLS0gLy9cblxucHJvdG8ucG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICBkZWxldGUgdGhpcy5pc1RvdWNoU2Nyb2xsaW5nO1xuICB0aGlzLnZpZXdwb3J0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLXBvaW50ZXItZG93bicpO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyVXAnLCBldmVudCwgWyBwb2ludGVyIF0gKTtcbiAgdGhpcy5fZHJhZ1BvaW50ZXJVcCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLnBvaW50ZXJEb25lID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2Nyb2xsJywgdGhpcyApO1xuICBkZWxldGUgdGhpcy5wb2ludGVyRG93blNjcm9sbDtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRyYWdnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLmRyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgaWYgKCAhdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5kcmFnU3RhcnRQb3NpdGlvbiA9IHRoaXMueDtcbiAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Njcm9sbCcsIHRoaXMgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnZHJhZ1N0YXJ0JywgZXZlbnQsIFsgcG9pbnRlciBdICk7XG59O1xuXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB0aGlzLl9kcmFnUG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3BvaW50ZXJNb3ZlJywgZXZlbnQsIFsgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG4gIHRoaXMuX2RyYWdNb3ZlKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApO1xufTtcblxucHJvdG8uZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgdGhpcy5wcmV2aW91c0RyYWdYID0gdGhpcy5kcmFnWDtcbiAgLy8gcmV2ZXJzZSBpZiByaWdodC10by1sZWZ0XG4gIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgPyAtMSA6IDE7XG4gIGlmICggdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgLy8gd3JhcCBhcm91bmQgbW92ZS4gIzU4OVxuICAgIG1vdmVWZWN0b3IueCA9IG1vdmVWZWN0b3IueCAlIHRoaXMuc2xpZGVhYmxlV2lkdGg7XG4gIH1cbiAgdmFyIGRyYWdYID0gdGhpcy5kcmFnU3RhcnRQb3NpdGlvbiArIG1vdmVWZWN0b3IueCAqIGRpcmVjdGlvbjtcblxuICBpZiAoICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiB0aGlzLnNsaWRlcy5sZW5ndGggKSB7XG4gICAgLy8gc2xvdyBkcmFnXG4gICAgdmFyIG9yaWdpbkJvdW5kID0gTWF0aC5tYXgoIC10aGlzLnNsaWRlc1swXS50YXJnZXQsIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gKTtcbiAgICBkcmFnWCA9IGRyYWdYID4gb3JpZ2luQm91bmQgPyAoIGRyYWdYICsgb3JpZ2luQm91bmQgKSAqIDAuNSA6IGRyYWdYO1xuICAgIHZhciBlbmRCb3VuZCA9IE1hdGgubWluKCAtdGhpcy5nZXRMYXN0U2xpZGUoKS50YXJnZXQsIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gKTtcbiAgICBkcmFnWCA9IGRyYWdYIDwgZW5kQm91bmQgPyAoIGRyYWdYICsgZW5kQm91bmQgKSAqIDAuNSA6IGRyYWdYO1xuICB9XG5cbiAgdGhpcy5kcmFnWCA9IGRyYWdYO1xuXG4gIHRoaXMuZHJhZ01vdmVUaW1lID0gbmV3IERhdGUoKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnZHJhZ01vdmUnLCBldmVudCwgWyBwb2ludGVyLCBtb3ZlVmVjdG9yIF0gKTtcbn07XG5cbnByb3RvLmRyYWdFbmQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICggdGhpcy5vcHRpb25zLmZyZWVTY3JvbGwgKSB7XG4gICAgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPSB0cnVlO1xuICB9XG4gIC8vIHNldCBzZWxlY3RlZEluZGV4IGJhc2VkIG9uIHdoZXJlIGZsaWNrIHdpbGwgZW5kIHVwXG4gIHZhciBpbmRleCA9IHRoaXMuZHJhZ0VuZFJlc3RpbmdTZWxlY3QoKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy5mcmVlU2Nyb2xsICYmICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCApIHtcbiAgICAvLyBpZiBmcmVlLXNjcm9sbCAmIG5vdCB3cmFwIGFyb3VuZFxuICAgIC8vIGRvIG5vdCBmcmVlLXNjcm9sbCBpZiBnb2luZyBvdXRzaWRlIG9mIGJvdW5kaW5nIHNsaWRlc1xuICAgIC8vIHNvIGJvdW5kaW5nIHNsaWRlcyBjYW4gYXR0cmFjdCBzbGlkZXIsIGFuZCBrZWVwIGl0IGluIGJvdW5kc1xuICAgIHZhciByZXN0aW5nWCA9IHRoaXMuZ2V0UmVzdGluZ1Bvc2l0aW9uKCk7XG4gICAgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPSAtcmVzdGluZ1ggPiB0aGlzLnNsaWRlc1swXS50YXJnZXQgJiZcbiAgICAgIC1yZXN0aW5nWCA8IHRoaXMuZ2V0TGFzdFNsaWRlKCkudGFyZ2V0O1xuICB9IGVsc2UgaWYgKCAhdGhpcy5vcHRpb25zLmZyZWVTY3JvbGwgJiYgaW5kZXggPT0gdGhpcy5zZWxlY3RlZEluZGV4ICkge1xuICAgIC8vIGJvb3N0IHNlbGVjdGlvbiBpZiBzZWxlY3RlZCBpbmRleCBoYXMgbm90IGNoYW5nZWRcbiAgICBpbmRleCArPSB0aGlzLmRyYWdFbmRCb29zdFNlbGVjdCgpO1xuICB9XG4gIGRlbGV0ZSB0aGlzLnByZXZpb3VzRHJhZ1g7XG4gIC8vIGFwcGx5IHNlbGVjdGlvblxuICAvLyBUT0RPIHJlZmFjdG9yIHRoaXMsIHNlbGVjdGluZyBoZXJlIGZlZWxzIHdlaXJkXG4gIC8vIEhBQ0ssIHNldCBmbGFnIHNvIGRyYWdnaW5nIHN0YXlzIGluIGNvcnJlY3QgZGlyZWN0aW9uXG4gIHRoaXMuaXNEcmFnU2VsZWN0ID0gdGhpcy5vcHRpb25zLndyYXBBcm91bmQ7XG4gIHRoaXMuc2VsZWN0KCBpbmRleCApO1xuICBkZWxldGUgdGhpcy5pc0RyYWdTZWxlY3Q7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2RyYWdFbmQnLCBldmVudCwgWyBwb2ludGVyIF0gKTtcbn07XG5cbnByb3RvLmRyYWdFbmRSZXN0aW5nU2VsZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXN0aW5nWCA9IHRoaXMuZ2V0UmVzdGluZ1Bvc2l0aW9uKCk7XG4gIC8vIGhvdyBmYXIgYXdheSBmcm9tIHNlbGVjdGVkIHNsaWRlXG4gIHZhciBkaXN0YW5jZSA9IE1hdGguYWJzKCB0aGlzLmdldFNsaWRlRGlzdGFuY2UoIC1yZXN0aW5nWCwgdGhpcy5zZWxlY3RlZEluZGV4ICkgKTtcbiAgLy8gZ2V0IGNsb3NldCByZXN0aW5nIGdvaW5nIHVwIGFuZCBnb2luZyBkb3duXG4gIHZhciBwb3NpdGl2ZVJlc3RpbmcgPSB0aGlzLl9nZXRDbG9zZXN0UmVzdGluZyggcmVzdGluZ1gsIGRpc3RhbmNlLCAxICk7XG4gIHZhciBuZWdhdGl2ZVJlc3RpbmcgPSB0aGlzLl9nZXRDbG9zZXN0UmVzdGluZyggcmVzdGluZ1gsIGRpc3RhbmNlLCAtMSApO1xuICAvLyB1c2UgY2xvc2VyIHJlc3RpbmcgZm9yIHdyYXAtYXJvdW5kXG4gIHZhciBpbmRleCA9IHBvc2l0aXZlUmVzdGluZy5kaXN0YW5jZSA8IG5lZ2F0aXZlUmVzdGluZy5kaXN0YW5jZSA/XG4gICAgcG9zaXRpdmVSZXN0aW5nLmluZGV4IDogbmVnYXRpdmVSZXN0aW5nLmluZGV4O1xuICByZXR1cm4gaW5kZXg7XG59O1xuXG4vKipcbiAqIGdpdmVuIHJlc3RpbmcgWCBhbmQgZGlzdGFuY2UgdG8gc2VsZWN0ZWQgY2VsbFxuICogZ2V0IHRoZSBkaXN0YW5jZSBhbmQgaW5kZXggb2YgdGhlIGNsb3Nlc3QgY2VsbFxuICogQHBhcmFtIHtOdW1iZXJ9IHJlc3RpbmdYIC0gZXN0aW1hdGVkIHBvc3QtZmxpY2sgcmVzdGluZyBwb3NpdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IGRpc3RhbmNlIC0gZGlzdGFuY2UgdG8gc2VsZWN0ZWQgY2VsbFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmNyZW1lbnQgLSArMSBvciAtMSwgZ29pbmcgdXAgb3IgZG93blxuICogQHJldHVybnMge09iamVjdH0gLSB7IGRpc3RhbmNlOiB7TnVtYmVyfSwgaW5kZXg6IHtJbnRlZ2VyfSB9XG4gKi9cbnByb3RvLl9nZXRDbG9zZXN0UmVzdGluZyA9IGZ1bmN0aW9uKCByZXN0aW5nWCwgZGlzdGFuY2UsIGluY3JlbWVudCApIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5zZWxlY3RlZEluZGV4O1xuICB2YXIgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgdmFyIGNvbmRpdGlvbiA9IHRoaXMub3B0aW9ucy5jb250YWluICYmICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCA/XG4gICAgLy8gaWYgY29udGFpbiwga2VlcCBnb2luZyBpZiBkaXN0YW5jZSBpcyBlcXVhbCB0byBtaW5EaXN0YW5jZVxuICAgIGZ1bmN0aW9uKCBkLCBtZCApIHsgcmV0dXJuIGQgPD0gbWQ7IH0gOiBmdW5jdGlvbiggZCwgbWQgKSB7IHJldHVybiBkIDwgbWQ7IH07XG4gIHdoaWxlICggY29uZGl0aW9uKCBkaXN0YW5jZSwgbWluRGlzdGFuY2UgKSApIHtcbiAgICAvLyBtZWFzdXJlIGRpc3RhbmNlIHRvIG5leHQgY2VsbFxuICAgIGluZGV4ICs9IGluY3JlbWVudDtcbiAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIGRpc3RhbmNlID0gdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtcmVzdGluZ1gsIGluZGV4ICk7XG4gICAgaWYgKCBkaXN0YW5jZSA9PT0gbnVsbCApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkaXN0YW5jZSA9IE1hdGguYWJzKCBkaXN0YW5jZSApO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGlzdGFuY2U6IG1pbkRpc3RhbmNlLFxuICAgIC8vIHNlbGVjdGVkIHdhcyBwcmV2aW91cyBpbmRleFxuICAgIGluZGV4OiBpbmRleCAtIGluY3JlbWVudFxuICB9O1xufTtcblxuLyoqXG4gKiBtZWFzdXJlIGRpc3RhbmNlIGJldHdlZW4geCBhbmQgYSBzbGlkZSB0YXJnZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IC0gc2xpZGUgaW5kZXhcbiAqL1xucHJvdG8uZ2V0U2xpZGVEaXN0YW5jZSA9IGZ1bmN0aW9uKCB4LCBpbmRleCApIHtcbiAgdmFyIGxlbiA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgLy8gd3JhcCBhcm91bmQgaWYgYXQgbGVhc3QgMiBzbGlkZXNcbiAgdmFyIGlzV3JhcEFyb3VuZCA9IHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICYmIGxlbiA+IDE7XG4gIHZhciBzbGlkZUluZGV4ID0gaXNXcmFwQXJvdW5kID8gdXRpbHMubW9kdWxvKCBpbmRleCwgbGVuICkgOiBpbmRleDtcbiAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbIHNsaWRlSW5kZXggXTtcbiAgaWYgKCAhc2xpZGUgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gYWRkIGRpc3RhbmNlIGZvciB3cmFwLWFyb3VuZCBzbGlkZXNcbiAgdmFyIHdyYXAgPSBpc1dyYXBBcm91bmQgPyB0aGlzLnNsaWRlYWJsZVdpZHRoICogTWF0aC5mbG9vciggaW5kZXggLyBsZW4gKSA6IDA7XG4gIHJldHVybiB4IC0gKCBzbGlkZS50YXJnZXQgKyB3cmFwICk7XG59O1xuXG5wcm90by5kcmFnRW5kQm9vc3RTZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG8gbm90IGJvb3N0IGlmIG5vIHByZXZpb3VzRHJhZ1ggb3IgZHJhZ01vdmVUaW1lXG4gIGlmICggdGhpcy5wcmV2aW91c0RyYWdYID09PSB1bmRlZmluZWQgfHwgIXRoaXMuZHJhZ01vdmVUaW1lIHx8XG4gICAgLy8gb3IgaWYgZHJhZyB3YXMgaGVsZCBmb3IgMTAwIG1zXG4gICAgbmV3IERhdGUoKSAtIHRoaXMuZHJhZ01vdmVUaW1lID4gMTAwICkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIGRpc3RhbmNlID0gdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtdGhpcy5kcmFnWCwgdGhpcy5zZWxlY3RlZEluZGV4ICk7XG4gIHZhciBkZWx0YSA9IHRoaXMucHJldmlvdXNEcmFnWCAtIHRoaXMuZHJhZ1g7XG4gIGlmICggZGlzdGFuY2UgPiAwICYmIGRlbHRhID4gMCApIHtcbiAgICAvLyBib29zdCB0byBuZXh0IGlmIG1vdmluZyB0b3dhcmRzIHRoZSByaWdodCwgYW5kIHBvc2l0aXZlIHZlbG9jaXR5XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoIGRpc3RhbmNlIDwgMCAmJiBkZWx0YSA8IDAgKSB7XG4gICAgLy8gYm9vc3QgdG8gcHJldmlvdXMgaWYgbW92aW5nIHRvd2FyZHMgdGhlIGxlZnQsIGFuZCBuZWdhdGl2ZSB2ZWxvY2l0eVxuICAgIHJldHVybiAtMTtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbi8vIC0tLS0tIHN0YXRpY0NsaWNrIC0tLS0tIC8vXG5cbnByb3RvLnN0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBnZXQgY2xpY2tlZENlbGwsIGlmIGNlbGwgd2FzIGNsaWNrZWRcbiAgdmFyIGNsaWNrZWRDZWxsID0gdGhpcy5nZXRQYXJlbnRDZWxsKCBldmVudC50YXJnZXQgKTtcbiAgdmFyIGNlbGxFbGVtID0gY2xpY2tlZENlbGwgJiYgY2xpY2tlZENlbGwuZWxlbWVudDtcbiAgdmFyIGNlbGxJbmRleCA9IGNsaWNrZWRDZWxsICYmIHRoaXMuY2VsbHMuaW5kZXhPZiggY2xpY2tlZENlbGwgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnc3RhdGljQ2xpY2snLCBldmVudCwgWyBwb2ludGVyLCBjZWxsRWxlbSwgY2VsbEluZGV4IF0gKTtcbn07XG5cbi8vIC0tLS0tIHNjcm9sbCAtLS0tLSAvL1xuXG5wcm90by5vbnNjcm9sbCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2Nyb2xsID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgdmFyIHNjcm9sbE1vdmVYID0gdGhpcy5wb2ludGVyRG93blNjcm9sbC54IC0gc2Nyb2xsLng7XG4gIHZhciBzY3JvbGxNb3ZlWSA9IHRoaXMucG9pbnRlckRvd25TY3JvbGwueSAtIHNjcm9sbC55O1xuICAvLyBjYW5jZWwgY2xpY2svdGFwIGlmIHNjcm9sbCBpcyB0b28gbXVjaFxuICBpZiAoIE1hdGguYWJzKCBzY3JvbGxNb3ZlWCApID4gMyB8fCBNYXRoLmFicyggc2Nyb2xsTW92ZVkgKSA+IDMgKSB7XG4gICAgdGhpcy5fcG9pbnRlckRvbmUoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gdXRpbHMgLS0tLS0gLy9cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsUG9zaXRpb24oKSB7XG4gIHJldHVybiB7XG4gICAgeDogd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldFxuICB9O1xufVxuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIEZsaWNraXR5O1xuXG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxXQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/drag.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/flickity.js":
/*!**********************************************!*\
  !*** ./node_modules/flickity/js/flickity.js ***!
  \**********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Flickity main\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\"),\n      __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\"),\n      __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\"),\n      __webpack_require__(/*! ./cell */ \"./node_modules/flickity/js/cell.js\"),\n      __webpack_require__(/*! ./slide */ \"./node_modules/flickity/js/slide.js\"),\n      __webpack_require__(/*! ./animate */ \"./node_modules/flickity/js/animate.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n      return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else { var _Flickity; }\n\n}( window, function factory( window, EvEmitter, getSize,\n  utils, Cell, Slide, animatePrototype ) {\n\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n  elems = utils.makeArray( elems );\n  while ( elems.length ) {\n    toElem.appendChild( elems.shift() );\n  }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    var instance = instances[ this.element.flickityGUID ];\n    instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  // add id for Flickity.data\n  var id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.originSide = this.options.rightToLeft ? 'right' : 'left';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n\n  if ( this.options.resize || this.options.watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( var eventName in this.options.on ) {\n    var listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  Flickity.createMethods.forEach( function( method ) {\n    this[ method ]();\n  }, this );\n\n  if ( this.options.watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n\n};\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) {\n    return;\n  }\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  var cellElems = this._filterFindCellElements( this.element.children );\n  moveElements( cellElems, this.slider );\n  this.viewport.appendChild( this.slider );\n  this.element.appendChild( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n  this.selectInitialIndex();\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  var slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  slider.style[ this.originSide ] = 0;\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  var cellElems = this._filterFindCellElements( elems );\n\n  // create new Flickity for collection\n  var cells = cellElems.map( function( cellElem ) {\n    return new Cell( cellElem, this );\n  }, this );\n\n  return cells;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  var cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    var startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n  var len = this.cells.length;\n  for ( var i=index; i < len; i++ ) {\n    var cell = this.cells[i];\n    cell.setPosition( cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  }\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( function( cell ) {\n    cell.getSize();\n  });\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) {\n    return;\n  }\n\n  var slide = new Slide( this );\n  this.slides.push( slide );\n  var isOriginLeft = this.originSide == 'left';\n  var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n  var canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( function( cell, i ) {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n    if ( canCellFit.call( this, i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( this );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  }, this );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  var groupCells = this.options.groupCells;\n  if ( !groupCells ) {\n    return function() {\n      return false;\n    };\n  } else if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    var number = parseInt( groupCells, 10 );\n    return function( i ) {\n      return ( i % number ) !== 0;\n    };\n  }\n  // default, group by width of slide\n  // parse '75%\n  var percentMatch = typeof groupCells == 'string' &&\n    groupCells.match(/^(\\d+)%$/);\n  var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n  return function( i, slideWidth ) {\n    return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n  };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n  // cell align, then based on origin side\n  center: {\n    left: 0.5,\n    right: 0.5\n  },\n  left: {\n    left: 0,\n    right: 1\n  },\n  right: {\n    right: 0,\n    left: 1\n  }\n};\n\nproto.setCellAlign = function() {\n  var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n  this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( this.options.setGallerySize ) {\n    var height = this.options.adaptiveHeight && this.selectedSlide ?\n      this.selectedSlide.height : this.maxCellHeight;\n    this.viewport.style.height = height + 'px';\n  }\n};\n\nproto._getWrapShiftCells = function() {\n  // only for wrap-around\n  if ( !this.options.wrapAround ) {\n    return;\n  }\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  var gapX = this.cursorPosition;\n  var cellIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  gapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  var cells = [];\n  while ( gapX > 0 ) {\n    var cell = this.cells[ cellIndex ];\n    if ( !cell ) {\n      break;\n    }\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n    return;\n  }\n  var isRightToLeft = this.options.rightToLeft;\n  var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n  var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n  var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n  // content is less than gallery size\n  var isContentSmaller = contentWidth < this.size.innerWidth;\n  // bounds\n  var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n  var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n  // contain each cell target\n  this.slides.forEach( function( slide ) {\n    if ( isContentSmaller ) {\n      // all cells fit inside gallery\n      slide.target = contentWidth * this.cellAlign;\n    } else {\n      // contain to bounds\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    }\n  }, this );\n};\n\n// -----  ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    var $event = type;\n    if ( event ) {\n      // create jQuery event\n      var jQEvent = jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) {\n    return;\n  }\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.options.wrapAround || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) {\n    return;\n  }\n  var prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index != prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n  // old v1 event name, remove in v3\n  this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  var len = this.slides.length;\n  var isWrapping = this.options.wrapAround && len > 1;\n  if ( !isWrapping ) {\n    return index;\n  }\n  var wrapIndex = utils.modulo( index, len );\n  // go to shortest\n  var delta = Math.abs( wrapIndex - this.selectedIndex );\n  var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n  var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n  if ( !this.isDragSelect && backWrapDelta < delta ) {\n    index += len;\n  } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n    index -= len;\n  }\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= this.slideableWidth;\n  } else if ( index >= len ) {\n    this.x += this.slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  var slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) {\n    return;\n  }\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  // Remove in v3?\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) {\n    this.selectedSlide.unselect();\n  }\n};\n\nproto.selectInitialIndex = function() {\n  var initialIndex = this.options.initialIndex;\n  // already activated, select previous selectedIndex\n  if ( this.isInitActivated ) {\n    this.select( this.selectedIndex, false, true );\n    return;\n  }\n  // select with selector string\n  if ( initialIndex && typeof initialIndex == 'string' ) {\n    var cell = this.queryCell( initialIndex );\n    if ( cell ) {\n      this.selectCell( initialIndex, false, true );\n      return;\n    }\n  }\n\n  var index = 0;\n  // select with number\n  if ( initialIndex && this.slides[ initialIndex ] ) {\n    index = initialIndex;\n  }\n  // select instantly\n  this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {Element or Number} elem\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  var cell = this.queryCell( value );\n  if ( !cell ) {\n    return;\n  }\n\n  var index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slides that has cell\n  for ( var i=0; i < this.slides.length; i++ ) {\n    var slide = this.slides[i];\n    var index = slide.cells.indexOf( cell );\n    if ( index != -1 ) {\n      return i;\n    }\n  }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem\n * @returns {Flickity.Cell} item\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( var i=0; i < this.cells.length; i++ ) {\n    var cell = this.cells[i];\n    if ( cell.element == elem ) {\n      return cell;\n    }\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {Element, Array, NodeList} elems\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  var cells = [];\n  elems.forEach( function( elem ) {\n    var cell = this.getCell( elem );\n    if ( cell ) {\n      cells.push( cell );\n    }\n  }, this );\n  return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  });\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem\n * @returns {Flickit.Cell} cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  var cell = this.getCell( elem );\n  if ( cell ) {\n    return cell;\n  }\n  // try to get parent cell elem\n  elem = utils.getParent( elem, '.flickity-slider > *' );\n  return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) {\n    return this.selectedSlide.getCellElements();\n  }\n  index = index === undefined ? this.selectedIndex : index;\n\n  var len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements();\n  }\n\n  var cellElems = [];\n  for ( var i = index - adjCount; i <= index + adjCount ; i++ ) {\n    var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n    var slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {Element, Selector String, or Number} selector\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  if ( typeof selector == 'string' ) {\n    // do not select invalid selectors from hash: #123, #/. #791\n    if ( selector.match(/^[#\\.]?[\\d\\/]/) ) {\n      return;\n    }\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n  // HACK iOS does not allow touch events to bubble up?!\n  if ( event.type != 'touchstart' ) {\n    event.preventDefault();\n  }\n  this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  if ( !this.isActive ) {\n    return;\n  }\n  this.getSize();\n  // wrap values\n  if ( this.options.wrapAround ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  var selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  var watchOption = this.options.watchCSS;\n  if ( !watchOption ) {\n    return;\n  }\n\n  var afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.indexOf('flickity') != -1 ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  // only work if element is in focus\n  var isNotFocused = document.activeElement && document.activeElement != this.element;\n  if ( !this.options.accessibility ||isNotFocused ) {\n    return;\n  }\n\n  var handler = Flickity.keyboardHandlers[ event.keyCode ];\n  if ( handler ) {\n    handler.call( this );\n  }\n};\n\nFlickity.keyboardHandlers = {\n  // left arrow\n  37: function() {\n    var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this.uiChange();\n    this[ leftMethod ]();\n  },\n  // right arrow\n  39: function() {\n    var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this.uiChange();\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  // TODO remove scrollTo once focus options gets more support\n  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n  var prevScrollY = window.pageYOffset;\n  this.element.focus({ preventScroll: true });\n  // hack to fix scroll jump after focus, #76\n  if ( window.pageYOffset != prevScrollY ) {\n    window.scrollTo( window.pageXOffset, prevScrollY );\n  }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) {\n    return;\n  }\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( function( cell ) {\n    cell.destroy();\n  });\n  this.element.removeChild( this.viewport );\n  // move child elements back into element\n  moveElements( this.slider.children, this.element );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.allOff();\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.flickityGUID;\n  return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n  jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvZmxpY2tpdHkuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL2ZsaWNraXR5LmpzPzEzODUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmxpY2tpdHkgbWFpblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgJ2dldC1zaXplL2dldC1zaXplJyxcbiAgICAgICdmaXp6eS11aS11dGlscy91dGlscycsXG4gICAgICAnLi9jZWxsJyxcbiAgICAgICcuL3NsaWRlJyxcbiAgICAgICcuL2FuaW1hdGUnXG4gICAgXSwgZnVuY3Rpb24oIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIENlbGwsIFNsaWRlLCBhbmltYXRlUHJvdG90eXBlICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyLCBnZXRTaXplLCB1dGlscywgQ2VsbCwgU2xpZGUsIGFuaW1hdGVQcm90b3R5cGUgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ2V2LWVtaXR0ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpLFxuICAgICAgcmVxdWlyZSgnLi9jZWxsJyksXG4gICAgICByZXF1aXJlKCcuL3NsaWRlJyksXG4gICAgICByZXF1aXJlKCcuL2FuaW1hdGUnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB2YXIgX0ZsaWNraXR5ID0gd2luZG93LkZsaWNraXR5O1xuXG4gICAgd2luZG93LkZsaWNraXR5ID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICB3aW5kb3cuZ2V0U2l6ZSxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHMsXG4gICAgICBfRmxpY2tpdHkuQ2VsbCxcbiAgICAgIF9GbGlja2l0eS5TbGlkZSxcbiAgICAgIF9GbGlja2l0eS5hbmltYXRlUHJvdG90eXBlXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyLCBnZXRTaXplLFxuICB1dGlscywgQ2VsbCwgU2xpZGUsIGFuaW1hdGVQcm90b3R5cGUgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gdmFyc1xudmFyIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7XG52YXIgZ2V0Q29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlO1xudmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTtcblxuZnVuY3Rpb24gbW92ZUVsZW1lbnRzKCBlbGVtcywgdG9FbGVtICkge1xuICBlbGVtcyA9IHV0aWxzLm1ha2VBcnJheSggZWxlbXMgKTtcbiAgd2hpbGUgKCBlbGVtcy5sZW5ndGggKSB7XG4gICAgdG9FbGVtLmFwcGVuZENoaWxkKCBlbGVtcy5zaGlmdCgpICk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmxpY2tpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXJzXG52YXIgR1VJRCA9IDA7XG4vLyBpbnRlcm5hbCBzdG9yZSBvZiBhbGwgRmxpY2tpdHkgaW50YW5jZXNcbnZhciBpbnN0YW5jZXMgPSB7fTtcblxuZnVuY3Rpb24gRmxpY2tpdHkoIGVsZW1lbnQsIG9wdGlvbnMgKSB7XG4gIHZhciBxdWVyeUVsZW1lbnQgPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW1lbnQgKTtcbiAgaWYgKCAhcXVlcnlFbGVtZW50ICkge1xuICAgIGlmICggY29uc29sZSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdCYWQgZWxlbWVudCBmb3IgRmxpY2tpdHk6ICcgKyAoIHF1ZXJ5RWxlbWVudCB8fCBlbGVtZW50ICkgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudCA9IHF1ZXJ5RWxlbWVudDtcbiAgLy8gZG8gbm90IGluaXRpYWxpemUgdHdpY2Ugb24gc2FtZSBlbGVtZW50XG4gIGlmICggdGhpcy5lbGVtZW50LmZsaWNraXR5R1VJRCApIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZXNbIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQgXTtcbiAgICBpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvLyBhZGQgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICB9XG4gIC8vIG9wdGlvbnNcbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuZXh0ZW5kKCB7fSwgdGhpcy5jb25zdHJ1Y3Rvci5kZWZhdWx0cyApO1xuICB0aGlzLm9wdGlvbiggb3B0aW9ucyApO1xuXG4gIC8vIGtpY2sgdGhpbmdzIG9mZlxuICB0aGlzLl9jcmVhdGUoKTtcbn1cblxuRmxpY2tpdHkuZGVmYXVsdHMgPSB7XG4gIGFjY2Vzc2liaWxpdHk6IHRydWUsXG4gIC8vIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgY2VsbEFsaWduOiAnY2VudGVyJyxcbiAgLy8gY2VsbFNlbGVjdG9yOiB1bmRlZmluZWQsXG4gIC8vIGNvbnRhaW46IGZhbHNlLFxuICBmcmVlU2Nyb2xsRnJpY3Rpb246IDAuMDc1LCAvLyBmcmljdGlvbiB3aGVuIGZyZWUtc2Nyb2xsaW5nXG4gIGZyaWN0aW9uOiAwLjI4LCAvLyBmcmljdGlvbiB3aGVuIHNlbGVjdGluZ1xuICBuYW1lc3BhY2VKUXVlcnlFdmVudHM6IHRydWUsXG4gIC8vIGluaXRpYWxJbmRleDogMCxcbiAgcGVyY2VudFBvc2l0aW9uOiB0cnVlLFxuICByZXNpemU6IHRydWUsXG4gIHNlbGVjdGVkQXR0cmFjdGlvbjogMC4wMjUsXG4gIHNldEdhbGxlcnlTaXplOiB0cnVlXG4gIC8vIHdhdGNoQ1NTOiBmYWxzZSxcbiAgLy8gd3JhcEFyb3VuZDogZmFsc2Vcbn07XG5cbi8vIGhhc2ggb2YgbWV0aG9kcyB0cmlnZ2VyZWQgb24gX2NyZWF0ZSgpXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzID0gW107XG5cbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcbi8vIGluaGVyaXQgRXZlbnRFbWl0dGVyXG51dGlscy5leHRlbmQoIHByb3RvLCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbnByb3RvLl9jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gYWRkIGlkIGZvciBGbGlja2l0eS5kYXRhXG4gIHZhciBpZCA9IHRoaXMuZ3VpZCA9ICsrR1VJRDtcbiAgdGhpcy5lbGVtZW50LmZsaWNraXR5R1VJRCA9IGlkOyAvLyBleHBhbmRvXG4gIGluc3RhbmNlc1sgaWQgXSA9IHRoaXM7IC8vIGFzc29jaWF0ZSB2aWEgaWRcbiAgLy8gaW5pdGlhbCBwcm9wZXJ0aWVzXG4gIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG4gIC8vIGhvdyBtYW55IGZyYW1lcyBzbGlkZXIgaGFzIGJlZW4gaW4gc2FtZSBwb3NpdGlvblxuICB0aGlzLnJlc3RpbmdGcmFtZXMgPSAwO1xuICAvLyBpbml0aWFsIHBoeXNpY3MgcHJvcGVydGllc1xuICB0aGlzLnggPSAwO1xuICB0aGlzLnZlbG9jaXR5ID0gMDtcbiAgdGhpcy5vcmlnaW5TaWRlID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgLy8gY3JlYXRlIHZpZXdwb3J0ICYgc2xpZGVyXG4gIHRoaXMudmlld3BvcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGhpcy52aWV3cG9ydC5jbGFzc05hbWUgPSAnZmxpY2tpdHktdmlld3BvcnQnO1xuICB0aGlzLl9jcmVhdGVTbGlkZXIoKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy5yZXNpemUgfHwgdGhpcy5vcHRpb25zLndhdGNoQ1NTICkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB9XG5cbiAgLy8gYWRkIGxpc3RlbmVycyBmcm9tIG9uIG9wdGlvblxuICBmb3IgKCB2YXIgZXZlbnROYW1lIGluIHRoaXMub3B0aW9ucy5vbiApIHtcbiAgICB2YXIgbGlzdGVuZXIgPSB0aGlzLm9wdGlvbnMub25bIGV2ZW50TmFtZSBdO1xuICAgIHRoaXMub24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgfVxuXG4gIEZsaWNraXR5LmNyZWF0ZU1ldGhvZHMuZm9yRWFjaCggZnVuY3Rpb24oIG1ldGhvZCApIHtcbiAgICB0aGlzWyBtZXRob2QgXSgpO1xuICB9LCB0aGlzICk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMud2F0Y2hDU1MgKSB7XG4gICAgdGhpcy53YXRjaENTUygpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG59O1xuXG4vKipcbiAqIHNldCBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICovXG5wcm90by5vcHRpb24gPSBmdW5jdGlvbiggb3B0cyApIHtcbiAgdXRpbHMuZXh0ZW5kKCB0aGlzLm9wdGlvbnMsIG9wdHMgKTtcbn07XG5cbnByb3RvLmFjdGl2YXRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5pc0FjdGl2ZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmbGlja2l0eS1lbmFibGVkJyk7XG4gIGlmICggdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ICkge1xuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmbGlja2l0eS1ydGwnKTtcbiAgfVxuXG4gIHRoaXMuZ2V0U2l6ZSgpO1xuICAvLyBtb3ZlIGluaXRpYWwgY2VsbCBlbGVtZW50cyBzbyB0aGV5IGNhbiBiZSBsb2FkZWQgYXMgY2VsbHNcbiAgdmFyIGNlbGxFbGVtcyA9IHRoaXMuX2ZpbHRlckZpbmRDZWxsRWxlbWVudHMoIHRoaXMuZWxlbWVudC5jaGlsZHJlbiApO1xuICBtb3ZlRWxlbWVudHMoIGNlbGxFbGVtcywgdGhpcy5zbGlkZXIgKTtcbiAgdGhpcy52aWV3cG9ydC5hcHBlbmRDaGlsZCggdGhpcy5zbGlkZXIgKTtcbiAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLnZpZXdwb3J0ICk7XG4gIC8vIGdldCBjZWxscyBmcm9tIGNoaWxkcmVuXG4gIHRoaXMucmVsb2FkQ2VsbHMoKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5ICkge1xuICAgIC8vIGFsbG93IGVsZW1lbnQgdG8gZm9jdXNhYmxlXG4gICAgdGhpcy5lbGVtZW50LnRhYkluZGV4ID0gMDtcbiAgICAvLyBsaXN0ZW4gZm9yIGtleSBwcmVzc2VzXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgdGhpcyApO1xuICB9XG5cbiAgdGhpcy5lbWl0RXZlbnQoJ2FjdGl2YXRlJyk7XG4gIHRoaXMuc2VsZWN0SW5pdGlhbEluZGV4KCk7XG4gIC8vIGZsYWcgZm9yIGluaXRpYWwgYWN0aXZhdGlvbiwgZm9yIHVzaW5nIGluaXRpYWxJbmRleFxuICB0aGlzLmlzSW5pdEFjdGl2YXRlZCA9IHRydWU7XG4gIC8vIHJlYWR5IGV2ZW50LiAjNDkzXG4gIHRoaXMuZGlzcGF0Y2hFdmVudCgncmVhZHknKTtcbn07XG5cbi8vIHNsaWRlciBwb3NpdGlvbnMgdGhlIGNlbGxzXG5wcm90by5fY3JlYXRlU2xpZGVyID0gZnVuY3Rpb24oKSB7XG4gIC8vIHNsaWRlciBlbGVtZW50IGRvZXMgYWxsIHRoZSBwb3NpdGlvbmluZ1xuICB2YXIgc2xpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHNsaWRlci5jbGFzc05hbWUgPSAnZmxpY2tpdHktc2xpZGVyJztcbiAgc2xpZGVyLnN0eWxlWyB0aGlzLm9yaWdpblNpZGUgXSA9IDA7XG4gIHRoaXMuc2xpZGVyID0gc2xpZGVyO1xufTtcblxucHJvdG8uX2ZpbHRlckZpbmRDZWxsRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHJldHVybiB1dGlscy5maWx0ZXJGaW5kRWxlbWVudHMoIGVsZW1zLCB0aGlzLm9wdGlvbnMuY2VsbFNlbGVjdG9yICk7XG59O1xuXG4vLyBnb2VzIHRocm91Z2ggYWxsIGNoaWxkcmVuXG5wcm90by5yZWxvYWRDZWxscyA9IGZ1bmN0aW9uKCkge1xuICAvLyBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAgdGhpcy5jZWxscyA9IHRoaXMuX21ha2VDZWxscyggdGhpcy5zbGlkZXIuY2hpbGRyZW4gKTtcbiAgdGhpcy5wb3NpdGlvbkNlbGxzKCk7XG4gIHRoaXMuX2dldFdyYXBTaGlmdENlbGxzKCk7XG4gIHRoaXMuc2V0R2FsbGVyeVNpemUoKTtcbn07XG5cbi8qKlxuICogdHVybiBlbGVtZW50cyBpbnRvIEZsaWNraXR5LkNlbGxzXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEhUTUxFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGNvbGxlY3Rpb24gb2YgbmV3IEZsaWNraXR5IENlbGxzXG4gKi9cbnByb3RvLl9tYWtlQ2VsbHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBjZWxsRWxlbXMgPSB0aGlzLl9maWx0ZXJGaW5kQ2VsbEVsZW1lbnRzKCBlbGVtcyApO1xuXG4gIC8vIGNyZWF0ZSBuZXcgRmxpY2tpdHkgZm9yIGNvbGxlY3Rpb25cbiAgdmFyIGNlbGxzID0gY2VsbEVsZW1zLm1hcCggZnVuY3Rpb24oIGNlbGxFbGVtICkge1xuICAgIHJldHVybiBuZXcgQ2VsbCggY2VsbEVsZW0sIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xuXG4gIHJldHVybiBjZWxscztcbn07XG5cbnByb3RvLmdldExhc3RDZWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNlbGxzWyB0aGlzLmNlbGxzLmxlbmd0aCAtIDEgXTtcbn07XG5cbnByb3RvLmdldExhc3RTbGlkZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zbGlkZXNbIHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEgXTtcbn07XG5cbi8vIHBvc2l0aW9ucyBhbGwgY2VsbHNcbnByb3RvLnBvc2l0aW9uQ2VsbHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2l6ZSBhbGwgY2VsbHNcbiAgdGhpcy5fc2l6ZUNlbGxzKCB0aGlzLmNlbGxzICk7XG4gIC8vIHBvc2l0aW9uIGFsbCBjZWxsc1xuICB0aGlzLl9wb3NpdGlvbkNlbGxzKCAwICk7XG59O1xuXG4vKipcbiAqIHBvc2l0aW9uIGNlcnRhaW4gY2VsbHNcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSB3aGljaCBjZWxsIHRvIHN0YXJ0IHdpdGhcbiAqL1xucHJvdG8uX3Bvc2l0aW9uQ2VsbHMgPSBmdW5jdGlvbiggaW5kZXggKSB7XG4gIGluZGV4ID0gaW5kZXggfHwgMDtcbiAgLy8gYWxzbyBtZWFzdXJlIG1heENlbGxIZWlnaHRcbiAgLy8gc3RhcnQgMCBpZiBwb3NpdGlvbmluZyBhbGwgY2VsbHNcbiAgdGhpcy5tYXhDZWxsSGVpZ2h0ID0gaW5kZXggPyB0aGlzLm1heENlbGxIZWlnaHQgfHwgMCA6IDA7XG4gIHZhciBjZWxsWCA9IDA7XG4gIC8vIGdldCBjZWxsWFxuICBpZiAoIGluZGV4ID4gMCApIHtcbiAgICB2YXIgc3RhcnRDZWxsID0gdGhpcy5jZWxsc1sgaW5kZXggLSAxIF07XG4gICAgY2VsbFggPSBzdGFydENlbGwueCArIHN0YXJ0Q2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbiAgdmFyIGxlbiA9IHRoaXMuY2VsbHMubGVuZ3RoO1xuICBmb3IgKCB2YXIgaT1pbmRleDsgaSA8IGxlbjsgaSsrICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5jZWxsc1tpXTtcbiAgICBjZWxsLnNldFBvc2l0aW9uKCBjZWxsWCApO1xuICAgIGNlbGxYICs9IGNlbGwuc2l6ZS5vdXRlcldpZHRoO1xuICAgIHRoaXMubWF4Q2VsbEhlaWdodCA9IE1hdGgubWF4KCBjZWxsLnNpemUub3V0ZXJIZWlnaHQsIHRoaXMubWF4Q2VsbEhlaWdodCApO1xuICB9XG4gIC8vIGtlZXAgdHJhY2sgb2YgY2VsbFggZm9yIHdyYXAtYXJvdW5kXG4gIHRoaXMuc2xpZGVhYmxlV2lkdGggPSBjZWxsWDtcbiAgLy8gc2xpZGVzXG4gIHRoaXMudXBkYXRlU2xpZGVzKCk7XG4gIC8vIGNvbnRhaW4gc2xpZGVzIHRhcmdldFxuICB0aGlzLl9jb250YWluU2xpZGVzKCk7XG4gIC8vIHVwZGF0ZSBzbGlkZXNXaWR0aFxuICB0aGlzLnNsaWRlc1dpZHRoID0gbGVuID8gdGhpcy5nZXRMYXN0U2xpZGUoKS50YXJnZXQgLSB0aGlzLnNsaWRlc1swXS50YXJnZXQgOiAwO1xufTtcblxuLyoqXG4gKiBjZWxsLmdldFNpemUoKSBvbiBtdWx0aXBsZSBjZWxsc1xuICogQHBhcmFtIHtBcnJheX0gY2VsbHNcbiAqL1xucHJvdG8uX3NpemVDZWxscyA9IGZ1bmN0aW9uKCBjZWxscyApIHtcbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5nZXRTaXplKCk7XG4gIH0pO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLnVwZGF0ZVNsaWRlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNsaWRlcyA9IFtdO1xuICBpZiAoICF0aGlzLmNlbGxzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2xpZGUgPSBuZXcgU2xpZGUoIHRoaXMgKTtcbiAgdGhpcy5zbGlkZXMucHVzaCggc2xpZGUgKTtcbiAgdmFyIGlzT3JpZ2luTGVmdCA9IHRoaXMub3JpZ2luU2lkZSA9PSAnbGVmdCc7XG4gIHZhciBuZXh0TWFyZ2luID0gaXNPcmlnaW5MZWZ0ID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JztcblxuICB2YXIgY2FuQ2VsbEZpdCA9IHRoaXMuX2dldENhbkNlbGxGaXQoKTtcblxuICB0aGlzLmNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsLCBpICkge1xuICAgIC8vIGp1c3QgYWRkIGNlbGwgaWYgZmlyc3QgY2VsbCBpbiBzbGlkZVxuICAgIGlmICggIXNsaWRlLmNlbGxzLmxlbmd0aCApIHtcbiAgICAgIHNsaWRlLmFkZENlbGwoIGNlbGwgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2xpZGVXaWR0aCA9ICggc2xpZGUub3V0ZXJXaWR0aCAtIHNsaWRlLmZpcnN0TWFyZ2luICkgK1xuICAgICAgKCBjZWxsLnNpemUub3V0ZXJXaWR0aCAtIGNlbGwuc2l6ZVsgbmV4dE1hcmdpbiBdICk7XG5cbiAgICBpZiAoIGNhbkNlbGxGaXQuY2FsbCggdGhpcywgaSwgc2xpZGVXaWR0aCApICkge1xuICAgICAgc2xpZGUuYWRkQ2VsbCggY2VsbCApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkb2Vzbid0IGZpdCwgbmV3IHNsaWRlXG4gICAgICBzbGlkZS51cGRhdGVUYXJnZXQoKTtcblxuICAgICAgc2xpZGUgPSBuZXcgU2xpZGUoIHRoaXMgKTtcbiAgICAgIHRoaXMuc2xpZGVzLnB1c2goIHNsaWRlICk7XG4gICAgICBzbGlkZS5hZGRDZWxsKCBjZWxsICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG4gIC8vIGxhc3Qgc2xpZGVcbiAgc2xpZGUudXBkYXRlVGFyZ2V0KCk7XG4gIC8vIHVwZGF0ZSAuc2VsZWN0ZWRTbGlkZVxuICB0aGlzLnVwZGF0ZVNlbGVjdGVkU2xpZGUoKTtcbn07XG5cbnByb3RvLl9nZXRDYW5DZWxsRml0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBncm91cENlbGxzID0gdGhpcy5vcHRpb25zLmdyb3VwQ2VsbHM7XG4gIGlmICggIWdyb3VwQ2VsbHMgKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBncm91cENlbGxzID09ICdudW1iZXInICkge1xuICAgIC8vIGdyb3VwIGJ5IG51bWJlci4gMyAtPiBbMCwxLDJdLCBbMyw0LDVdLCAuLi5cbiAgICB2YXIgbnVtYmVyID0gcGFyc2VJbnQoIGdyb3VwQ2VsbHMsIDEwICk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCBpICkge1xuICAgICAgcmV0dXJuICggaSAlIG51bWJlciApICE9PSAwO1xuICAgIH07XG4gIH1cbiAgLy8gZGVmYXVsdCwgZ3JvdXAgYnkgd2lkdGggb2Ygc2xpZGVcbiAgLy8gcGFyc2UgJzc1JVxuICB2YXIgcGVyY2VudE1hdGNoID0gdHlwZW9mIGdyb3VwQ2VsbHMgPT0gJ3N0cmluZycgJiZcbiAgICBncm91cENlbGxzLm1hdGNoKC9eKFxcZCspJSQvKTtcbiAgdmFyIHBlcmNlbnQgPSBwZXJjZW50TWF0Y2ggPyBwYXJzZUludCggcGVyY2VudE1hdGNoWzFdLCAxMCApIC8gMTAwIDogMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCBpLCBzbGlkZVdpZHRoICkge1xuICAgIHJldHVybiBzbGlkZVdpZHRoIDw9ICggdGhpcy5zaXplLmlubmVyV2lkdGggKyAxICkgKiBwZXJjZW50O1xuICB9O1xufTtcblxuLy8gYWxpYXMgX2luaXQgZm9yIGpRdWVyeSBwbHVnaW4gLmZsaWNraXR5KClcbnByb3RvLl9pbml0ID1cbnByb3RvLnJlcG9zaXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wb3NpdGlvbkNlbGxzKCk7XG4gIHRoaXMucG9zaXRpb25TbGlkZXJBdFNlbGVjdGVkKCk7XG59O1xuXG5wcm90by5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xuICB0aGlzLnNldENlbGxBbGlnbigpO1xuICB0aGlzLmN1cnNvclBvc2l0aW9uID0gdGhpcy5zaXplLmlubmVyV2lkdGggKiB0aGlzLmNlbGxBbGlnbjtcbn07XG5cbnZhciBjZWxsQWxpZ25TaG9ydGhhbmRzID0ge1xuICAvLyBjZWxsIGFsaWduLCB0aGVuIGJhc2VkIG9uIG9yaWdpbiBzaWRlXG4gIGNlbnRlcjoge1xuICAgIGxlZnQ6IDAuNSxcbiAgICByaWdodDogMC41XG4gIH0sXG4gIGxlZnQ6IHtcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiAxXG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcmlnaHQ6IDAsXG4gICAgbGVmdDogMVxuICB9XG59O1xuXG5wcm90by5zZXRDZWxsQWxpZ24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNob3J0aGFuZCA9IGNlbGxBbGlnblNob3J0aGFuZHNbIHRoaXMub3B0aW9ucy5jZWxsQWxpZ24gXTtcbiAgdGhpcy5jZWxsQWxpZ24gPSBzaG9ydGhhbmQgPyBzaG9ydGhhbmRbIHRoaXMub3JpZ2luU2lkZSBdIDogdGhpcy5vcHRpb25zLmNlbGxBbGlnbjtcbn07XG5cbnByb3RvLnNldEdhbGxlcnlTaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5vcHRpb25zLnNldEdhbGxlcnlTaXplICkge1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLm9wdGlvbnMuYWRhcHRpdmVIZWlnaHQgJiYgdGhpcy5zZWxlY3RlZFNsaWRlID9cbiAgICAgIHRoaXMuc2VsZWN0ZWRTbGlkZS5oZWlnaHQgOiB0aGlzLm1heENlbGxIZWlnaHQ7XG4gICAgdGhpcy52aWV3cG9ydC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICB9XG59O1xuXG5wcm90by5fZ2V0V3JhcFNoaWZ0Q2VsbHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gb25seSBmb3Igd3JhcC1hcm91bmRcbiAgaWYgKCAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHVuc2hpZnQgcHJldmlvdXMgY2VsbHNcbiAgdGhpcy5fdW5zaGlmdENlbGxzKCB0aGlzLmJlZm9yZVNoaWZ0Q2VsbHMgKTtcbiAgdGhpcy5fdW5zaGlmdENlbGxzKCB0aGlzLmFmdGVyU2hpZnRDZWxscyApO1xuICAvLyBnZXQgYmVmb3JlIGNlbGxzXG4gIC8vIGluaXRpYWwgZ2FwXG4gIHZhciBnYXBYID0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgdmFyIGNlbGxJbmRleCA9IHRoaXMuY2VsbHMubGVuZ3RoIC0gMTtcbiAgdGhpcy5iZWZvcmVTaGlmdENlbGxzID0gdGhpcy5fZ2V0R2FwQ2VsbHMoIGdhcFgsIGNlbGxJbmRleCwgLTEgKTtcbiAgLy8gZ2V0IGFmdGVyIGNlbGxzXG4gIC8vIGVuZGluZyBnYXAgYmV0d2VlbiBsYXN0IGNlbGwgYW5kIGVuZCBvZiBnYWxsZXJ5IHZpZXdwb3J0XG4gIGdhcFggPSB0aGlzLnNpemUuaW5uZXJXaWR0aCAtIHRoaXMuY3Vyc29yUG9zaXRpb247XG4gIC8vIHN0YXJ0IGNsb25pbmcgYXQgZmlyc3QgY2VsbCwgd29ya2luZyBmb3J3YXJkc1xuICB0aGlzLmFmdGVyU2hpZnRDZWxscyA9IHRoaXMuX2dldEdhcENlbGxzKCBnYXBYLCAwLCAxICk7XG59O1xuXG5wcm90by5fZ2V0R2FwQ2VsbHMgPSBmdW5jdGlvbiggZ2FwWCwgY2VsbEluZGV4LCBpbmNyZW1lbnQgKSB7XG4gIC8vIGtlZXAgYWRkaW5nIGNlbGxzIHVudGlsIHRoZSBjb3ZlciB0aGUgaW5pdGlhbCBnYXBcbiAgdmFyIGNlbGxzID0gW107XG4gIHdoaWxlICggZ2FwWCA+IDAgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzWyBjZWxsSW5kZXggXTtcbiAgICBpZiAoICFjZWxsICkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNlbGxzLnB1c2goIGNlbGwgKTtcbiAgICBjZWxsSW5kZXggKz0gaW5jcmVtZW50O1xuICAgIGdhcFggLT0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbiAgcmV0dXJuIGNlbGxzO1xufTtcblxuLy8gLS0tLS0gY29udGFpbiAtLS0tLSAvL1xuXG4vLyBjb250YWluIGNlbGwgdGFyZ2V0cyBzbyBubyBleGNlc3Mgc2xpZGluZ1xucHJvdG8uX2NvbnRhaW5TbGlkZXMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLmNvbnRhaW4gfHwgdGhpcy5vcHRpb25zLndyYXBBcm91bmQgfHwgIXRoaXMuY2VsbHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaXNSaWdodFRvTGVmdCA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdDtcbiAgdmFyIGJlZ2luTWFyZ2luID0gaXNSaWdodFRvTGVmdCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCc7XG4gIHZhciBlbmRNYXJnaW4gPSBpc1JpZ2h0VG9MZWZ0ID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0JztcbiAgdmFyIGNvbnRlbnRXaWR0aCA9IHRoaXMuc2xpZGVhYmxlV2lkdGggLSB0aGlzLmdldExhc3RDZWxsKCkuc2l6ZVsgZW5kTWFyZ2luIF07XG4gIC8vIGNvbnRlbnQgaXMgbGVzcyB0aGFuIGdhbGxlcnkgc2l6ZVxuICB2YXIgaXNDb250ZW50U21hbGxlciA9IGNvbnRlbnRXaWR0aCA8IHRoaXMuc2l6ZS5pbm5lcldpZHRoO1xuICAvLyBib3VuZHNcbiAgdmFyIGJlZ2luQm91bmQgPSB0aGlzLmN1cnNvclBvc2l0aW9uICsgdGhpcy5jZWxsc1swXS5zaXplWyBiZWdpbk1hcmdpbiBdO1xuICB2YXIgZW5kQm91bmQgPSBjb250ZW50V2lkdGggLSB0aGlzLnNpemUuaW5uZXJXaWR0aCAqICggMSAtIHRoaXMuY2VsbEFsaWduICk7XG4gIC8vIGNvbnRhaW4gZWFjaCBjZWxsIHRhcmdldFxuICB0aGlzLnNsaWRlcy5mb3JFYWNoKCBmdW5jdGlvbiggc2xpZGUgKSB7XG4gICAgaWYgKCBpc0NvbnRlbnRTbWFsbGVyICkge1xuICAgICAgLy8gYWxsIGNlbGxzIGZpdCBpbnNpZGUgZ2FsbGVyeVxuICAgICAgc2xpZGUudGFyZ2V0ID0gY29udGVudFdpZHRoICogdGhpcy5jZWxsQWxpZ247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnRhaW4gdG8gYm91bmRzXG4gICAgICBzbGlkZS50YXJnZXQgPSBNYXRoLm1heCggc2xpZGUudGFyZ2V0LCBiZWdpbkJvdW5kICk7XG4gICAgICBzbGlkZS50YXJnZXQgPSBNYXRoLm1pbiggc2xpZGUudGFyZ2V0LCBlbmRCb3VuZCApO1xuICAgIH1cbiAgfSwgdGhpcyApO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbi8qKlxuICogZW1pdHMgZXZlbnRzIHZpYSBldmVudEVtaXR0ZXIgYW5kIGpRdWVyeSBldmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gbmFtZSBvZiBldmVudFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBvcmlnaW5hbCBldmVudFxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIGV4dHJhIGFyZ3VtZW50c1xuICovXG5wcm90by5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oIHR5cGUsIGV2ZW50LCBhcmdzICkge1xuICB2YXIgZW1pdEFyZ3MgPSBldmVudCA/IFsgZXZlbnQgXS5jb25jYXQoIGFyZ3MgKSA6IGFyZ3M7XG4gIHRoaXMuZW1pdEV2ZW50KCB0eXBlLCBlbWl0QXJncyApO1xuXG4gIGlmICggalF1ZXJ5ICYmIHRoaXMuJGVsZW1lbnQgKSB7XG4gICAgLy8gZGVmYXVsdCB0cmlnZ2VyIHdpdGggdHlwZSBpZiBubyBldmVudFxuICAgIHR5cGUgKz0gdGhpcy5vcHRpb25zLm5hbWVzcGFjZUpRdWVyeUV2ZW50cyA/ICcuZmxpY2tpdHknIDogJyc7XG4gICAgdmFyICRldmVudCA9IHR5cGU7XG4gICAgaWYgKCBldmVudCApIHtcbiAgICAgIC8vIGNyZWF0ZSBqUXVlcnkgZXZlbnRcbiAgICAgIHZhciBqUUV2ZW50ID0galF1ZXJ5LkV2ZW50KCBldmVudCApO1xuICAgICAgalFFdmVudC50eXBlID0gdHlwZTtcbiAgICAgICRldmVudCA9IGpRRXZlbnQ7XG4gICAgfVxuICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggJGV2ZW50LCBhcmdzICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlbGVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgc2xpZGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNXcmFwIC0gd2lsbCB3cmFwLWFyb3VuZCB0byBsYXN0L2ZpcnN0IGlmIGF0IHRoZSBlbmRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gd2lsbCBpbW1lZGlhdGVseSBzZXQgcG9zaXRpb24gYXQgc2VsZWN0ZWQgY2VsbFxuICovXG5wcm90by5zZWxlY3QgPSBmdW5jdGlvbiggaW5kZXgsIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICBpZiAoICF0aGlzLmlzQWN0aXZlICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpbmRleCA9IHBhcnNlSW50KCBpbmRleCwgMTAgKTtcbiAgdGhpcy5fd3JhcFNlbGVjdCggaW5kZXggKTtcblxuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kIHx8IGlzV3JhcCApIHtcbiAgICBpbmRleCA9IHV0aWxzLm1vZHVsbyggaW5kZXgsIHRoaXMuc2xpZGVzLmxlbmd0aCApO1xuICB9XG4gIC8vIGJhaWwgaWYgaW52YWxpZCBpbmRleFxuICBpZiAoICF0aGlzLnNsaWRlc1sgaW5kZXggXSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHByZXZJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleDtcbiAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gIHRoaXMudXBkYXRlU2VsZWN0ZWRTbGlkZSgpO1xuICBpZiAoIGlzSW5zdGFudCApIHtcbiAgICB0aGlzLnBvc2l0aW9uU2xpZGVyQXRTZWxlY3RlZCgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgfVxuICBpZiAoIHRoaXMub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCApIHtcbiAgICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIH1cbiAgLy8gZXZlbnRzXG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3NlbGVjdCcsIG51bGwsIFsgaW5kZXggXSApO1xuICAvLyBjaGFuZ2UgZXZlbnQgaWYgbmV3IGluZGV4XG4gIGlmICggaW5kZXggIT0gcHJldkluZGV4ICkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2NoYW5nZScsIG51bGwsIFsgaW5kZXggXSApO1xuICB9XG4gIC8vIG9sZCB2MSBldmVudCBuYW1lLCByZW1vdmUgaW4gdjNcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjZWxsU2VsZWN0Jyk7XG59O1xuXG4vLyB3cmFwcyBwb3NpdGlvbiBmb3Igd3JhcEFyb3VuZCwgdG8gbW92ZSB0byBjbG9zZXN0IHNsaWRlLiAjMTEzXG5wcm90by5fd3JhcFNlbGVjdCA9IGZ1bmN0aW9uKCBpbmRleCApIHtcbiAgdmFyIGxlbiA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgdmFyIGlzV3JhcHBpbmcgPSB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiBsZW4gPiAxO1xuICBpZiAoICFpc1dyYXBwaW5nICkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICB2YXIgd3JhcEluZGV4ID0gdXRpbHMubW9kdWxvKCBpbmRleCwgbGVuICk7XG4gIC8vIGdvIHRvIHNob3J0ZXN0XG4gIHZhciBkZWx0YSA9IE1hdGguYWJzKCB3cmFwSW5kZXggLSB0aGlzLnNlbGVjdGVkSW5kZXggKTtcbiAgdmFyIGJhY2tXcmFwRGVsdGEgPSBNYXRoLmFicyggKCB3cmFwSW5kZXggKyBsZW4gKSAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICB2YXIgZm9yZXdhcmRXcmFwRGVsdGEgPSBNYXRoLmFicyggKCB3cmFwSW5kZXggLSBsZW4gKSAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICBpZiAoICF0aGlzLmlzRHJhZ1NlbGVjdCAmJiBiYWNrV3JhcERlbHRhIDwgZGVsdGEgKSB7XG4gICAgaW5kZXggKz0gbGVuO1xuICB9IGVsc2UgaWYgKCAhdGhpcy5pc0RyYWdTZWxlY3QgJiYgZm9yZXdhcmRXcmFwRGVsdGEgPCBkZWx0YSApIHtcbiAgICBpbmRleCAtPSBsZW47XG4gIH1cbiAgLy8gd3JhcCBwb3NpdGlvbiBzbyBzbGlkZXIgaXMgd2l0aGluIG5vcm1hbCBhcmVhXG4gIGlmICggaW5kZXggPCAwICkge1xuICAgIHRoaXMueCAtPSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICB9IGVsc2UgaWYgKCBpbmRleCA+PSBsZW4gKSB7XG4gICAgdGhpcy54ICs9IHRoaXMuc2xpZGVhYmxlV2lkdGg7XG4gIH1cbn07XG5cbnByb3RvLnByZXZpb3VzID0gZnVuY3Rpb24oIGlzV3JhcCwgaXNJbnN0YW50ICkge1xuICB0aGlzLnNlbGVjdCggdGhpcy5zZWxlY3RlZEluZGV4IC0gMSwgaXNXcmFwLCBpc0luc3RhbnQgKTtcbn07XG5cbnByb3RvLm5leHQgPSBmdW5jdGlvbiggaXNXcmFwLCBpc0luc3RhbnQgKSB7XG4gIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXggKyAxLCBpc1dyYXAsIGlzSW5zdGFudCApO1xufTtcblxucHJvdG8udXBkYXRlU2VsZWN0ZWRTbGlkZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1sgdGhpcy5zZWxlY3RlZEluZGV4IF07XG4gIC8vIHNlbGVjdGVkSW5kZXggY291bGQgYmUgb3V0c2lkZSBvZiBzbGlkZXMsIGlmIHRyaWdnZXJlZCBiZWZvcmUgcmVzaXplKClcbiAgaWYgKCAhc2xpZGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHVuc2VsZWN0IHByZXZpb3VzIHNlbGVjdGVkIHNsaWRlXG4gIHRoaXMudW5zZWxlY3RTZWxlY3RlZFNsaWRlKCk7XG4gIC8vIHVwZGF0ZSBuZXcgc2VsZWN0ZWQgc2xpZGVcbiAgdGhpcy5zZWxlY3RlZFNsaWRlID0gc2xpZGU7XG4gIHNsaWRlLnNlbGVjdCgpO1xuICB0aGlzLnNlbGVjdGVkQ2VsbHMgPSBzbGlkZS5jZWxscztcbiAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gc2xpZGUuZ2V0Q2VsbEVsZW1lbnRzKCk7XG4gIC8vIEhBQ0s6IHNlbGVjdGVkQ2VsbCAmIHNlbGVjdGVkRWxlbWVudCBpcyBmaXJzdCBjZWxsIGluIHNsaWRlLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAvLyBSZW1vdmUgaW4gdjM/XG4gIHRoaXMuc2VsZWN0ZWRDZWxsID0gc2xpZGUuY2VsbHNbMF07XG4gIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRzWzBdO1xufTtcblxucHJvdG8udW5zZWxlY3RTZWxlY3RlZFNsaWRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5zZWxlY3RlZFNsaWRlICkge1xuICAgIHRoaXMuc2VsZWN0ZWRTbGlkZS51bnNlbGVjdCgpO1xuICB9XG59O1xuXG5wcm90by5zZWxlY3RJbml0aWFsSW5kZXggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGluaXRpYWxJbmRleCA9IHRoaXMub3B0aW9ucy5pbml0aWFsSW5kZXg7XG4gIC8vIGFscmVhZHkgYWN0aXZhdGVkLCBzZWxlY3QgcHJldmlvdXMgc2VsZWN0ZWRJbmRleFxuICBpZiAoIHRoaXMuaXNJbml0QWN0aXZhdGVkICkge1xuICAgIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXgsIGZhbHNlLCB0cnVlICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHNlbGVjdCB3aXRoIHNlbGVjdG9yIHN0cmluZ1xuICBpZiAoIGluaXRpYWxJbmRleCAmJiB0eXBlb2YgaW5pdGlhbEluZGV4ID09ICdzdHJpbmcnICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5xdWVyeUNlbGwoIGluaXRpYWxJbmRleCApO1xuICAgIGlmICggY2VsbCApIHtcbiAgICAgIHRoaXMuc2VsZWN0Q2VsbCggaW5pdGlhbEluZGV4LCBmYWxzZSwgdHJ1ZSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbmRleCA9IDA7XG4gIC8vIHNlbGVjdCB3aXRoIG51bWJlclxuICBpZiAoIGluaXRpYWxJbmRleCAmJiB0aGlzLnNsaWRlc1sgaW5pdGlhbEluZGV4IF0gKSB7XG4gICAgaW5kZXggPSBpbml0aWFsSW5kZXg7XG4gIH1cbiAgLy8gc2VsZWN0IGluc3RhbnRseVxuICB0aGlzLnNlbGVjdCggaW5kZXgsIGZhbHNlLCB0cnVlICk7XG59O1xuXG4vKipcbiAqIHNlbGVjdCBzbGlkZSBmcm9tIG51bWJlciBvciBjZWxsIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudCBvciBOdW1iZXJ9IGVsZW1cbiAqL1xucHJvdG8uc2VsZWN0Q2VsbCA9IGZ1bmN0aW9uKCB2YWx1ZSwgaXNXcmFwLCBpc0luc3RhbnQgKSB7XG4gIC8vIGdldCBjZWxsXG4gIHZhciBjZWxsID0gdGhpcy5xdWVyeUNlbGwoIHZhbHVlICk7XG4gIGlmICggIWNlbGwgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gdGhpcy5nZXRDZWxsU2xpZGVJbmRleCggY2VsbCApO1xuICB0aGlzLnNlbGVjdCggaW5kZXgsIGlzV3JhcCwgaXNJbnN0YW50ICk7XG59O1xuXG5wcm90by5nZXRDZWxsU2xpZGVJbmRleCA9IGZ1bmN0aW9uKCBjZWxsICkge1xuICAvLyBnZXQgaW5kZXggb2Ygc2xpZGVzIHRoYXQgaGFzIGNlbGxcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRoaXMuc2xpZGVzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2ldO1xuICAgIHZhciBpbmRleCA9IHNsaWRlLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXQgY2VsbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXQgRmxpY2tpdHkuQ2VsbCwgZ2l2ZW4gYW4gRWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcmV0dXJucyB7RmxpY2tpdHkuQ2VsbH0gaXRlbVxuICovXG5wcm90by5nZXRDZWxsID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIC8vIGxvb3AgdGhyb3VnaCBjZWxscyB0byBnZXQgdGhlIG9uZSB0aGF0IG1hdGNoZXNcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzW2ldO1xuICAgIGlmICggY2VsbC5lbGVtZW50ID09IGVsZW0gKSB7XG4gICAgICByZXR1cm4gY2VsbDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IGNvbGxlY3Rpb24gb2YgRmxpY2tpdHkuQ2VsbHMsIGdpdmVuIEVsZW1lbnRzXG4gKiBAcGFyYW0ge0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gY2VsbHMgLSBGbGlja2l0eS5DZWxsc1xuICovXG5wcm90by5nZXRDZWxscyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBjZWxscyA9IFtdO1xuICBlbGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbSApIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggZWxlbSApO1xuICAgIGlmICggY2VsbCApIHtcbiAgICAgIGNlbGxzLnB1c2goIGNlbGwgKTtcbiAgICB9XG4gIH0sIHRoaXMgKTtcbiAgcmV0dXJuIGNlbGxzO1xufTtcblxuLyoqXG4gKiBnZXQgY2VsbCBlbGVtZW50c1xuICogQHJldHVybnMge0FycmF5fSBjZWxsRWxlbXNcbiAqL1xucHJvdG8uZ2V0Q2VsbEVsZW1lbnRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNlbGxzLm1hcCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgcmV0dXJuIGNlbGwuZWxlbWVudDtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGdldCBwYXJlbnQgY2VsbCBmcm9tIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge0ZsaWNraXQuQ2VsbH0gY2VsbFxuICovXG5wcm90by5nZXRQYXJlbnRDZWxsID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIC8vIGZpcnN0IGNoZWNrIGlmIGVsZW0gaXMgY2VsbFxuICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggZWxlbSApO1xuICBpZiAoIGNlbGwgKSB7XG4gICAgcmV0dXJuIGNlbGw7XG4gIH1cbiAgLy8gdHJ5IHRvIGdldCBwYXJlbnQgY2VsbCBlbGVtXG4gIGVsZW0gPSB1dGlscy5nZXRQYXJlbnQoIGVsZW0sICcuZmxpY2tpdHktc2xpZGVyID4gKicgKTtcbiAgcmV0dXJuIHRoaXMuZ2V0Q2VsbCggZWxlbSApO1xufTtcblxuLyoqXG4gKiBnZXQgY2VsbHMgYWRqYWNlbnQgdG8gYSBzbGlkZVxuICogQHBhcmFtIHtJbnRlZ2VyfSBhZGpDb3VudCAtIG51bWJlciBvZiBhZGphY2VudCBzbGlkZXNcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggLSBpbmRleCBvZiBzbGlkZSB0byBzdGFydFxuICogQHJldHVybnMge0FycmF5fSBjZWxscyAtIGFycmF5IG9mIEZsaWNraXR5LkNlbGxzXG4gKi9cbnByb3RvLmdldEFkamFjZW50Q2VsbEVsZW1lbnRzID0gZnVuY3Rpb24oIGFkakNvdW50LCBpbmRleCApIHtcbiAgaWYgKCAhYWRqQ291bnQgKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTbGlkZS5nZXRDZWxsRWxlbWVudHMoKTtcbiAgfVxuICBpbmRleCA9IGluZGV4ID09PSB1bmRlZmluZWQgPyB0aGlzLnNlbGVjdGVkSW5kZXggOiBpbmRleDtcblxuICB2YXIgbGVuID0gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICBpZiAoIDEgKyAoIGFkakNvdW50ICogMiApID49IGxlbiApIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDZWxsRWxlbWVudHMoKTtcbiAgfVxuXG4gIHZhciBjZWxsRWxlbXMgPSBbXTtcbiAgZm9yICggdmFyIGkgPSBpbmRleCAtIGFkakNvdW50OyBpIDw9IGluZGV4ICsgYWRqQ291bnQgOyBpKysgKSB7XG4gICAgdmFyIHNsaWRlSW5kZXggPSB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCA/IHV0aWxzLm1vZHVsbyggaSwgbGVuICkgOiBpO1xuICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzWyBzbGlkZUluZGV4IF07XG4gICAgaWYgKCBzbGlkZSApIHtcbiAgICAgIGNlbGxFbGVtcyA9IGNlbGxFbGVtcy5jb25jYXQoIHNsaWRlLmdldENlbGxFbGVtZW50cygpICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjZWxsRWxlbXM7XG59O1xuXG4vKipcbiAqIHNlbGVjdCBzbGlkZSBmcm9tIG51bWJlciBvciBjZWxsIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudCwgU2VsZWN0b3IgU3RyaW5nLCBvciBOdW1iZXJ9IHNlbGVjdG9yXG4gKi9cbnByb3RvLnF1ZXJ5Q2VsbCA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcbiAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT0gJ251bWJlcicgKSB7XG4gICAgLy8gdXNlIG51bWJlciBhcyBpbmRleFxuICAgIHJldHVybiB0aGlzLmNlbGxzWyBzZWxlY3RvciBdO1xuICB9XG4gIGlmICggdHlwZW9mIHNlbGVjdG9yID09ICdzdHJpbmcnICkge1xuICAgIC8vIGRvIG5vdCBzZWxlY3QgaW52YWxpZCBzZWxlY3RvcnMgZnJvbSBoYXNoOiAjMTIzLCAjLy4gIzc5MVxuICAgIGlmICggc2VsZWN0b3IubWF0Y2goL15bI1xcLl0/W1xcZFxcL10vKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gdXNlIHN0cmluZyBhcyBzZWxlY3RvciwgZ2V0IGVsZW1lbnRcbiAgICBzZWxlY3RvciA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApO1xuICB9XG4gIC8vIGdldCBjZWxsIGZyb20gZWxlbWVudFxuICByZXR1cm4gdGhpcy5nZXRDZWxsKCBzZWxlY3RvciApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZXZlbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLnVpQ2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCd1aUNoYW5nZScpO1xufTtcblxuLy8ga2VlcCBmb2N1cyBvbiBlbGVtZW50IHdoZW4gY2hpbGQgVUkgZWxlbWVudHMgYXJlIGNsaWNrZWRcbnByb3RvLmNoaWxkVUlQb2ludGVyRG93biA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgLy8gSEFDSyBpT1MgZG9lcyBub3QgYWxsb3cgdG91Y2ggZXZlbnRzIHRvIGJ1YmJsZSB1cD8hXG4gIGlmICggZXZlbnQudHlwZSAhPSAndG91Y2hzdGFydCcgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICB0aGlzLmZvY3VzKCk7XG59O1xuXG4vLyAtLS0tLSByZXNpemUgLS0tLS0gLy9cblxucHJvdG8ub25yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy53YXRjaENTUygpO1xuICB0aGlzLnJlc2l6ZSgpO1xufTtcblxudXRpbHMuZGVib3VuY2VNZXRob2QoIEZsaWNraXR5LCAnb25yZXNpemUnLCAxNTAgKTtcblxucHJvdG8ucmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuaXNBY3RpdmUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZ2V0U2l6ZSgpO1xuICAvLyB3cmFwIHZhbHVlc1xuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICkge1xuICAgIHRoaXMueCA9IHV0aWxzLm1vZHVsbyggdGhpcy54LCB0aGlzLnNsaWRlYWJsZVdpZHRoICk7XG4gIH1cbiAgdGhpcy5wb3NpdGlvbkNlbGxzKCk7XG4gIHRoaXMuX2dldFdyYXBTaGlmdENlbGxzKCk7XG4gIHRoaXMuc2V0R2FsbGVyeVNpemUoKTtcbiAgdGhpcy5lbWl0RXZlbnQoJ3Jlc2l6ZScpO1xuICAvLyB1cGRhdGUgc2VsZWN0ZWQgaW5kZXggZm9yIGdyb3VwIHNsaWRlcywgaW5zdGFudFxuICAvLyBUT0RPOiBwb3NpdGlvbiBjYW4gYmUgbG9zdCBiZXR3ZWVuIGdyb3VwcyBvZiB2YXJpb3VzIG51bWJlcnNcbiAgdmFyIHNlbGVjdGVkRWxlbWVudCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50cyAmJiB0aGlzLnNlbGVjdGVkRWxlbWVudHNbMF07XG4gIHRoaXMuc2VsZWN0Q2VsbCggc2VsZWN0ZWRFbGVtZW50LCBmYWxzZSwgdHJ1ZSApO1xufTtcblxuLy8gd2F0Y2hlcyB0aGUgOmFmdGVyIHByb3BlcnR5LCBhY3RpdmF0ZXMvZGVhY3RpdmF0ZXNcbnByb3RvLndhdGNoQ1NTID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3YXRjaE9wdGlvbiA9IHRoaXMub3B0aW9ucy53YXRjaENTUztcbiAgaWYgKCAhd2F0Y2hPcHRpb24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFmdGVyQ29udGVudCA9IGdldENvbXB1dGVkU3R5bGUoIHRoaXMuZWxlbWVudCwgJzphZnRlcicgKS5jb250ZW50O1xuICAvLyBhY3RpdmF0ZSBpZiA6YWZ0ZXIgeyBjb250ZW50OiAnZmxpY2tpdHknIH1cbiAgaWYgKCBhZnRlckNvbnRlbnQuaW5kZXhPZignZmxpY2tpdHknKSAhPSAtMSApIHtcbiAgICB0aGlzLmFjdGl2YXRlKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGtleWRvd24gLS0tLS0gLy9cblxuLy8gZ28gcHJldmlvdXMvbmV4dCBpZiBsZWZ0L3JpZ2h0IGtleXMgcHJlc3NlZFxucHJvdG8ub25rZXlkb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBvbmx5IHdvcmsgaWYgZWxlbWVudCBpcyBpbiBmb2N1c1xuICB2YXIgaXNOb3RGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZWxlbWVudDtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLmFjY2Vzc2liaWxpdHkgfHxpc05vdEZvY3VzZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBGbGlja2l0eS5rZXlib2FyZEhhbmRsZXJzWyBldmVudC5rZXlDb2RlIF07XG4gIGlmICggaGFuZGxlciApIHtcbiAgICBoYW5kbGVyLmNhbGwoIHRoaXMgKTtcbiAgfVxufTtcblxuRmxpY2tpdHkua2V5Ym9hcmRIYW5kbGVycyA9IHtcbiAgLy8gbGVmdCBhcnJvd1xuICAzNzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnRNZXRob2QgPSB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgPyAnbmV4dCcgOiAncHJldmlvdXMnO1xuICAgIHRoaXMudWlDaGFuZ2UoKTtcbiAgICB0aGlzWyBsZWZ0TWV0aG9kIF0oKTtcbiAgfSxcbiAgLy8gcmlnaHQgYXJyb3dcbiAgMzk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciByaWdodE1ldGhvZCA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdCA/ICdwcmV2aW91cycgOiAnbmV4dCc7XG4gICAgdGhpcy51aUNoYW5nZSgpO1xuICAgIHRoaXNbIHJpZ2h0TWV0aG9kIF0oKTtcbiAgfSxcbn07XG5cbi8vIC0tLS0tIGZvY3VzIC0tLS0tIC8vXG5cbnByb3RvLmZvY3VzID0gZnVuY3Rpb24oKSB7XG4gIC8vIFRPRE8gcmVtb3ZlIHNjcm9sbFRvIG9uY2UgZm9jdXMgb3B0aW9ucyBnZXRzIG1vcmUgc3VwcG9ydFxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnQvZm9jdXMjQnJvd3Nlcl9jb21wYXRpYmlsaXR5XG4gIHZhciBwcmV2U2Nyb2xsWSA9IHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgdGhpcy5lbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgLy8gaGFjayB0byBmaXggc2Nyb2xsIGp1bXAgYWZ0ZXIgZm9jdXMsICM3NlxuICBpZiAoIHdpbmRvdy5wYWdlWU9mZnNldCAhPSBwcmV2U2Nyb2xsWSApIHtcbiAgICB3aW5kb3cuc2Nyb2xsVG8oIHdpbmRvdy5wYWdlWE9mZnNldCwgcHJldlNjcm9sbFkgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVzdHJveSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBkZWFjdGl2YXRlIGFsbCBGbGlja2l0eSBmdW5jdGlvbmFsaXR5LCBidXQga2VlcCBzdHVmZiBhdmFpbGFibGVcbnByb3RvLmRlYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5pc0FjdGl2ZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZsaWNraXR5LWVuYWJsZWQnKTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZsaWNraXR5LXJ0bCcpO1xuICB0aGlzLnVuc2VsZWN0U2VsZWN0ZWRTbGlkZSgpO1xuICAvLyBkZXN0cm95IGNlbGxzXG4gIHRoaXMuY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5kZXN0cm95KCk7XG4gIH0pO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQoIHRoaXMudmlld3BvcnQgKTtcbiAgLy8gbW92ZSBjaGlsZCBlbGVtZW50cyBiYWNrIGludG8gZWxlbWVudFxuICBtb3ZlRWxlbWVudHMoIHRoaXMuc2xpZGVyLmNoaWxkcmVuLCB0aGlzLmVsZW1lbnQgKTtcbiAgaWYgKCB0aGlzLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSApIHtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJJbmRleCcpO1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAna2V5ZG93bicsIHRoaXMgKTtcbiAgfVxuICAvLyBzZXQgZmxhZ3NcbiAgdGhpcy5pc0FjdGl2ZSA9IGZhbHNlO1xuICB0aGlzLmVtaXRFdmVudCgnZGVhY3RpdmF0ZScpO1xufTtcblxucHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB0aGlzICk7XG4gIHRoaXMuYWxsT2ZmKCk7XG4gIHRoaXMuZW1pdEV2ZW50KCdkZXN0cm95Jyk7XG4gIGlmICggalF1ZXJ5ICYmIHRoaXMuJGVsZW1lbnQgKSB7XG4gICAgalF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMuZWxlbWVudCwgJ2ZsaWNraXR5JyApO1xuICB9XG4gIGRlbGV0ZSB0aGlzLmVsZW1lbnQuZmxpY2tpdHlHVUlEO1xuICBkZWxldGUgaW5zdGFuY2VzWyB0aGlzLmd1aWQgXTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG51dGlscy5leHRlbmQoIHByb3RvLCBhbmltYXRlUHJvdG90eXBlICk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGV4dHJhcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGdldCBGbGlja2l0eSBpbnN0YW5jZSBmcm9tIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge0ZsaWNraXR5fVxuICovXG5GbGlja2l0eS5kYXRhID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIGVsZW0gPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW0gKTtcbiAgdmFyIGlkID0gZWxlbSAmJiBlbGVtLmZsaWNraXR5R1VJRDtcbiAgcmV0dXJuIGlkICYmIGluc3RhbmNlc1sgaWQgXTtcbn07XG5cbnV0aWxzLmh0bWxJbml0KCBGbGlja2l0eSwgJ2ZsaWNraXR5JyApO1xuXG5pZiAoIGpRdWVyeSAmJiBqUXVlcnkuYnJpZGdldCApIHtcbiAgalF1ZXJ5LmJyaWRnZXQoICdmbGlja2l0eScsIEZsaWNraXR5ICk7XG59XG5cbi8vIHNldCBpbnRlcm5hbCBqUXVlcnksIGZvciBXZWJwYWNrICsgalF1ZXJ5IHYzLCAjNDc4XG5GbGlja2l0eS5zZXRKUXVlcnkgPSBmdW5jdGlvbigganEgKSB7XG4gIGpRdWVyeSA9IGpxO1xufTtcblxuRmxpY2tpdHkuQ2VsbCA9IENlbGw7XG5GbGlja2l0eS5TbGlkZSA9IFNsaWRlO1xuXG5yZXR1cm4gRmxpY2tpdHk7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLDJCQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/flickity.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/index.js":
/*!*******************************************!*\
  !*** ./node_modules/flickity/js/index.js ***!
  \*******************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Flickity v2.2.1\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2019 Metafizzy\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n      __webpack_require__(/*! ./drag */ \"./node_modules/flickity/js/drag.js\"),\n      __webpack_require__(/*! ./prev-next-button */ \"./node_modules/flickity/js/prev-next-button.js\"),\n      __webpack_require__(/*! ./page-dots */ \"./node_modules/flickity/js/page-dots.js\"),\n      __webpack_require__(/*! ./player */ \"./node_modules/flickity/js/player.js\"),\n      __webpack_require__(/*! ./add-remove-cell */ \"./node_modules/flickity/js/add-remove-cell.js\"),\n      __webpack_require__(/*! ./lazyload */ \"./node_modules/flickity/js/lazyload.js\")\n    ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n})( window, function factory( Flickity ) {\n  /*jshint strict: false*/\n  return Flickity;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL2luZGV4LmpzPzIxN2IiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBGbGlja2l0eSB2Mi4yLjFcbiAqIFRvdWNoLCByZXNwb25zaXZlLCBmbGlja2FibGUgY2Fyb3VzZWxzXG4gKlxuICogTGljZW5zZWQgR1BMdjMgZm9yIG9wZW4gc291cmNlIHVzZVxuICogb3IgRmxpY2tpdHkgQ29tbWVyY2lhbCBMaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZVxuICpcbiAqIGh0dHBzOi8vZmxpY2tpdHkubWV0YWZpenp5LmNvXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDE5IE1ldGFmaXp6eVxuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAnLi9kcmFnJyxcbiAgICAgICcuL3ByZXYtbmV4dC1idXR0b24nLFxuICAgICAgJy4vcGFnZS1kb3RzJyxcbiAgICAgICcuL3BsYXllcicsXG4gICAgICAnLi9hZGQtcmVtb3ZlLWNlbGwnLFxuICAgICAgJy4vbGF6eWxvYWQnXG4gICAgXSwgZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgnLi9kcmFnJyksXG4gICAgICByZXF1aXJlKCcuL3ByZXYtbmV4dC1idXR0b24nKSxcbiAgICAgIHJlcXVpcmUoJy4vcGFnZS1kb3RzJyksXG4gICAgICByZXF1aXJlKCcuL3BsYXllcicpLFxuICAgICAgcmVxdWlyZSgnLi9hZGQtcmVtb3ZlLWNlbGwnKSxcbiAgICAgIHJlcXVpcmUoJy4vbGF6eWxvYWQnKVxuICAgICk7XG4gIH1cblxufSkoIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggRmxpY2tpdHkgKSB7XG4gIC8qanNoaW50IHN0cmljdDogZmFsc2UqL1xuICByZXR1cm4gRmxpY2tpdHk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/index.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/lazyload.js":
/*!**********************************************!*\
  !*** ./node_modules/flickity/js/lazyload.js ***!
  \**********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// lazyload\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n      __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, utils ) {\n      return factory( window, Flickity, utils );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n  this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n  var lazyLoad = this.options.lazyLoad;\n  if ( !lazyLoad ) {\n    return;\n  }\n  // get adjacent cells, use lazyLoad option for adjacent count\n  var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  var cellElems = this.getAdjacentCellElements( adjCount );\n  // get lazy images in those cells\n  var lazyImages = [];\n  cellElems.forEach( function( cellElem ) {\n    var lazyCellImages = getCellLazyImages( cellElem );\n    lazyImages = lazyImages.concat( lazyCellImages );\n  });\n  // load lazy images\n  lazyImages.forEach( function( img ) {\n    new LazyLoader( img, this );\n  }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.nodeName == 'IMG' ) {\n    var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n    var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n    var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n    if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n      return [ cellElem ];\n    }\n  }\n  // select lazy images in cell\n  var lazySelector = 'img[data-flickity-lazyload], ' +\n    'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n  var imgs = cellElem.querySelectorAll( lazySelector );\n  return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n */\nfunction LazyLoader( img, flickity ) {\n  this.img = img;\n  this.flickity = flickity;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  var src = this.img.getAttribute('data-flickity-lazyload') ||\n    this.img.getAttribute('data-flickity-lazyload-src');\n  var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) {\n    this.img.setAttribute( 'srcset', srcset );\n  }\n  // remove attr\n  this.img.removeAttribute('data-flickity-lazyload');\n  this.img.removeAttribute('data-flickity-lazyload-src');\n  this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n\n  var cell = this.flickity.getParentCell( this.img );\n  var cellElem = cell && cell.element;\n  this.flickity.cellSizeChange( cellElem );\n\n  this.img.classList.add( className );\n  this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvbGF6eWxvYWQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL2xhenlsb2FkLmpzPzhhMTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gbGF6eWxvYWRcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnXG4gICAgXSwgZnVuY3Rpb24oIEZsaWNraXR5LCB1dGlscyApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEZsaWNraXR5LCB1dGlscyApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgd2luZG93LmZpenp5VUlVdGlsc1xuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEZsaWNraXR5LCB1dGlscyApIHtcbid1c2Ugc3RyaWN0JztcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlTGF6eWxvYWQnKTtcbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcblxucHJvdG8uX2NyZWF0ZUxhenlsb2FkID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub24oICdzZWxlY3QnLCB0aGlzLmxhenlMb2FkICk7XG59O1xuXG5wcm90by5sYXp5TG9hZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbGF6eUxvYWQgPSB0aGlzLm9wdGlvbnMubGF6eUxvYWQ7XG4gIGlmICggIWxhenlMb2FkICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBnZXQgYWRqYWNlbnQgY2VsbHMsIHVzZSBsYXp5TG9hZCBvcHRpb24gZm9yIGFkamFjZW50IGNvdW50XG4gIHZhciBhZGpDb3VudCA9IHR5cGVvZiBsYXp5TG9hZCA9PSAnbnVtYmVyJyA/IGxhenlMb2FkIDogMDtcbiAgdmFyIGNlbGxFbGVtcyA9IHRoaXMuZ2V0QWRqYWNlbnRDZWxsRWxlbWVudHMoIGFkakNvdW50ICk7XG4gIC8vIGdldCBsYXp5IGltYWdlcyBpbiB0aG9zZSBjZWxsc1xuICB2YXIgbGF6eUltYWdlcyA9IFtdO1xuICBjZWxsRWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGxFbGVtICkge1xuICAgIHZhciBsYXp5Q2VsbEltYWdlcyA9IGdldENlbGxMYXp5SW1hZ2VzKCBjZWxsRWxlbSApO1xuICAgIGxhenlJbWFnZXMgPSBsYXp5SW1hZ2VzLmNvbmNhdCggbGF6eUNlbGxJbWFnZXMgKTtcbiAgfSk7XG4gIC8vIGxvYWQgbGF6eSBpbWFnZXNcbiAgbGF6eUltYWdlcy5mb3JFYWNoKCBmdW5jdGlvbiggaW1nICkge1xuICAgIG5ldyBMYXp5TG9hZGVyKCBpbWcsIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuZnVuY3Rpb24gZ2V0Q2VsbExhenlJbWFnZXMoIGNlbGxFbGVtICkge1xuICAvLyBjaGVjayBpZiBjZWxsIGVsZW1lbnQgaXMgbGF6eSBpbWFnZVxuICBpZiAoIGNlbGxFbGVtLm5vZGVOYW1lID09ICdJTUcnICkge1xuICAgIHZhciBsYXp5bG9hZEF0dHIgPSBjZWxsRWxlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgICB2YXIgc3JjQXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmMnKTtcbiAgICB2YXIgc3Jjc2V0QXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmNzZXQnKTtcbiAgICBpZiAoIGxhenlsb2FkQXR0ciB8fCBzcmNBdHRyIHx8IHNyY3NldEF0dHIgKSB7XG4gICAgICByZXR1cm4gWyBjZWxsRWxlbSBdO1xuICAgIH1cbiAgfVxuICAvLyBzZWxlY3QgbGF6eSBpbWFnZXMgaW4gY2VsbFxuICB2YXIgbGF6eVNlbGVjdG9yID0gJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkXSwgJyArXG4gICAgJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY10sIGltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY3NldF0nO1xuICB2YXIgaW1ncyA9IGNlbGxFbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIGxhenlTZWxlY3RvciApO1xuICByZXR1cm4gdXRpbHMubWFrZUFycmF5KCBpbWdzICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExhenlMb2FkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBjbGFzcyB0byBoYW5kbGUgbG9hZGluZyBpbWFnZXNcbiAqL1xuZnVuY3Rpb24gTGF6eUxvYWRlciggaW1nLCBmbGlja2l0eSApIHtcbiAgdGhpcy5pbWcgPSBpbWc7XG4gIHRoaXMuZmxpY2tpdHkgPSBmbGlja2l0eTtcbiAgdGhpcy5sb2FkKCk7XG59XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gdXRpbHMuaGFuZGxlRXZlbnQ7XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgLy8gZ2V0IHNyYyAmIHNyY3NldFxuICB2YXIgc3JjID0gdGhpcy5pbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkJykgfHxcbiAgICB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3JjJyk7XG4gIHZhciBzcmNzZXQgPSB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG4gIC8vIHNldCBzcmMgJiBzZXJzZXRcbiAgdGhpcy5pbWcuc3JjID0gc3JjO1xuICBpZiAoIHNyY3NldCApIHtcbiAgICB0aGlzLmltZy5zZXRBdHRyaWJ1dGUoICdzcmNzZXQnLCBzcmNzZXQgKTtcbiAgfVxuICAvLyByZW1vdmUgYXR0clxuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgdGhpcy5pbWcucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyYycpO1xuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG59O1xuXG5MYXp5TG9hZGVyLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWxvYWRlZCcgKTtcbn07XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWVycm9yJyApO1xufTtcblxuTGF6eUxvYWRlci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiggZXZlbnQsIGNsYXNzTmFtZSApIHtcbiAgLy8gdW5iaW5kIGV2ZW50c1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5pbWcucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xuXG4gIHZhciBjZWxsID0gdGhpcy5mbGlja2l0eS5nZXRQYXJlbnRDZWxsKCB0aGlzLmltZyApO1xuICB2YXIgY2VsbEVsZW0gPSBjZWxsICYmIGNlbGwuZWxlbWVudDtcbiAgdGhpcy5mbGlja2l0eS5jZWxsU2l6ZUNoYW5nZSggY2VsbEVsZW0gKTtcblxuICB0aGlzLmltZy5jbGFzc0xpc3QuYWRkKCBjbGFzc05hbWUgKTtcbiAgdGhpcy5mbGlja2l0eS5kaXNwYXRjaEV2ZW50KCAnbGF6eUxvYWQnLCBldmVudCwgY2VsbEVsZW0gKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5GbGlja2l0eS5MYXp5TG9hZGVyID0gTGF6eUxvYWRlcjtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EsV0FjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/lazyload.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/page-dots.js":
/*!***********************************************!*\
  !*** ./node_modules/flickity/js/page-dots.js ***!
  \***********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// page dots\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n      __webpack_require__(/*! unipointer/unipointer */ \"./node_modules/unipointer/unipointer.js\"),\n      __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, Unipointer, utils ) {\n      return factory( window, Flickity, Unipointer, utils );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n  this.parent = parent;\n  this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n  // create holder element\n  this.holder = document.createElement('ol');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n  // events\n  this.handleClick = this.onClick.bind( this );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n  this.setDots();\n  this.holder.addEventListener( 'click', this.handleClick );\n  this.bindStartEvent( this.holder );\n  // add to DOM\n  this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n  this.holder.removeEventListener( 'click', this.handleClick );\n  this.unbindStartEvent( this.holder );\n  // remove from DOM\n  this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n  // get difference between number of slides and number of dots\n  var delta = this.parent.slides.length - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  var fragment = document.createDocumentFragment();\n  var newDots = [];\n  var length = this.dots.length;\n  var max = length + count;\n\n  for ( var i = length; i < max; i++ ) {\n    var dot = document.createElement('li');\n    dot.className = 'dot';\n    dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n    fragment.appendChild( dot );\n    newDots.push( dot );\n  }\n\n  this.holder.appendChild( fragment );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  var removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( function( dot ) {\n    this.holder.removeChild( dot );\n  }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.className = 'dot';\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) {\n    return;\n  }\n  this.selectedDot = this.dots[ this.parent.selectedIndex ];\n  this.selectedDot.className = 'dot is-selected';\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n  var target = event.target;\n  // only care about dot clicks\n  if ( target.nodeName != 'LI' ) {\n    return;\n  }\n\n  this.parent.uiChange();\n  var index = this.dots.indexOf( target );\n  this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n  this.deactivate();\n  this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pageDots: true\n});\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n  if ( !this.options.pageDots ) {\n    return;\n  }\n  this.pageDots = new PageDots( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n  this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.deactivate();\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcGFnZS1kb3RzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9wYWdlLWRvdHMuanM/MDYyOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwYWdlIGRvdHNcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAndW5pcG9pbnRlci91bmlwb2ludGVyJyxcbiAgICAgICdmaXp6eS11aS11dGlscy91dGlscydcbiAgICBdLCBmdW5jdGlvbiggRmxpY2tpdHksIFVuaXBvaW50ZXIsIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFVuaXBvaW50ZXIsIHV0aWxzICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCcuL2ZsaWNraXR5JyksXG4gICAgICByZXF1aXJlKCd1bmlwb2ludGVyJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRmxpY2tpdHksXG4gICAgICB3aW5kb3cuVW5pcG9pbnRlcixcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pcG9pbnRlciwgdXRpbHMgKSB7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhZ2VEb3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gUGFnZURvdHMoIHBhcmVudCApIHtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX2NyZWF0ZSgpO1xufVxuXG5QYWdlRG90cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBVbmlwb2ludGVyLnByb3RvdHlwZSApO1xuXG5QYWdlRG90cy5wcm90b3R5cGUuX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBjcmVhdGUgaG9sZGVyIGVsZW1lbnRcbiAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICB0aGlzLmhvbGRlci5jbGFzc05hbWUgPSAnZmxpY2tpdHktcGFnZS1kb3RzJztcbiAgLy8gY3JlYXRlIGRvdHMsIGFycmF5IG9mIGVsZW1lbnRzXG4gIHRoaXMuZG90cyA9IFtdO1xuICAvLyBldmVudHNcbiAgdGhpcy5oYW5kbGVDbGljayA9IHRoaXMub25DbGljay5iaW5kKCB0aGlzICk7XG4gIHRoaXMub24oICdwb2ludGVyRG93bicsIHRoaXMucGFyZW50LmNoaWxkVUlQb2ludGVyRG93bi5iaW5kKCB0aGlzLnBhcmVudCApICk7XG59O1xuXG5QYWdlRG90cy5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zZXREb3RzKCk7XG4gIHRoaXMuaG9sZGVyLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2sgKTtcbiAgdGhpcy5iaW5kU3RhcnRFdmVudCggdGhpcy5ob2xkZXIgKTtcbiAgLy8gYWRkIHRvIERPTVxuICB0aGlzLnBhcmVudC5lbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLmhvbGRlciApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmRlYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5ob2xkZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGljayApO1xuICB0aGlzLnVuYmluZFN0YXJ0RXZlbnQoIHRoaXMuaG9sZGVyICk7XG4gIC8vIHJlbW92ZSBmcm9tIERPTVxuICB0aGlzLnBhcmVudC5lbGVtZW50LnJlbW92ZUNoaWxkKCB0aGlzLmhvbGRlciApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnNldERvdHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IGRpZmZlcmVuY2UgYmV0d2VlbiBudW1iZXIgb2Ygc2xpZGVzIGFuZCBudW1iZXIgb2YgZG90c1xuICB2YXIgZGVsdGEgPSB0aGlzLnBhcmVudC5zbGlkZXMubGVuZ3RoIC0gdGhpcy5kb3RzLmxlbmd0aDtcbiAgaWYgKCBkZWx0YSA+IDAgKSB7XG4gICAgdGhpcy5hZGREb3RzKCBkZWx0YSApO1xuICB9IGVsc2UgaWYgKCBkZWx0YSA8IDAgKSB7XG4gICAgdGhpcy5yZW1vdmVEb3RzKCAtZGVsdGEgKTtcbiAgfVxufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmFkZERvdHMgPSBmdW5jdGlvbiggY291bnQgKSB7XG4gIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgdmFyIG5ld0RvdHMgPSBbXTtcbiAgdmFyIGxlbmd0aCA9IHRoaXMuZG90cy5sZW5ndGg7XG4gIHZhciBtYXggPSBsZW5ndGggKyBjb3VudDtcblxuICBmb3IgKCB2YXIgaSA9IGxlbmd0aDsgaSA8IG1heDsgaSsrICkge1xuICAgIHZhciBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGRvdC5jbGFzc05hbWUgPSAnZG90JztcbiAgICBkb3Quc2V0QXR0cmlidXRlKCAnYXJpYS1sYWJlbCcsICdQYWdlIGRvdCAnICsgKCBpICsgMSApICk7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvdCApO1xuICAgIG5ld0RvdHMucHVzaCggZG90ICk7XG4gIH1cblxuICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZCggZnJhZ21lbnQgKTtcbiAgdGhpcy5kb3RzID0gdGhpcy5kb3RzLmNvbmNhdCggbmV3RG90cyApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnJlbW92ZURvdHMgPSBmdW5jdGlvbiggY291bnQgKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoaXMuZG90cyBjb2xsZWN0aW9uXG4gIHZhciByZW1vdmVEb3RzID0gdGhpcy5kb3RzLnNwbGljZSggdGhpcy5kb3RzLmxlbmd0aCAtIGNvdW50LCBjb3VudCApO1xuICAvLyByZW1vdmUgZnJvbSBET01cbiAgcmVtb3ZlRG90cy5mb3JFYWNoKCBmdW5jdGlvbiggZG90ICkge1xuICAgIHRoaXMuaG9sZGVyLnJlbW92ZUNoaWxkKCBkb3QgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGVkID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlbW92ZSBzZWxlY3RlZCBjbGFzcyBvbiBwcmV2aW91c1xuICBpZiAoIHRoaXMuc2VsZWN0ZWREb3QgKSB7XG4gICAgdGhpcy5zZWxlY3RlZERvdC5jbGFzc05hbWUgPSAnZG90JztcbiAgICB0aGlzLnNlbGVjdGVkRG90LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50Jyk7XG4gIH1cbiAgLy8gZG9uJ3QgcHJvY2VlZCBpZiBubyBkb3RzXG4gIGlmICggIXRoaXMuZG90cy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc2VsZWN0ZWREb3QgPSB0aGlzLmRvdHNbIHRoaXMucGFyZW50LnNlbGVjdGVkSW5kZXggXTtcbiAgdGhpcy5zZWxlY3RlZERvdC5jbGFzc05hbWUgPSAnZG90IGlzLXNlbGVjdGVkJztcbiAgdGhpcy5zZWxlY3RlZERvdC5zZXRBdHRyaWJ1dGUoICdhcmlhLWN1cnJlbnQnLCAnc3RlcCcgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5vblRhcCA9IC8vIG9sZCBtZXRob2QgbmFtZSwgYmFja3dhcmRzLWNvbXBhdGlibGVcblBhZ2VEb3RzLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAvLyBvbmx5IGNhcmUgYWJvdXQgZG90IGNsaWNrc1xuICBpZiAoIHRhcmdldC5ub2RlTmFtZSAhPSAnTEknICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMucGFyZW50LnVpQ2hhbmdlKCk7XG4gIHZhciBpbmRleCA9IHRoaXMuZG90cy5pbmRleE9mKCB0YXJnZXQgKTtcbiAgdGhpcy5wYXJlbnQuc2VsZWN0KCBpbmRleCApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gIHRoaXMuYWxsT2ZmKCk7XG59O1xuXG5GbGlja2l0eS5QYWdlRG90cyA9IFBhZ2VEb3RzO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGbGlja2l0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG51dGlscy5leHRlbmQoIEZsaWNraXR5LmRlZmF1bHRzLCB7XG4gIHBhZ2VEb3RzOiB0cnVlXG59KTtcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlUGFnZURvdHMnKTtcblxudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlUGFnZURvdHMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLnBhZ2VEb3RzICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBhZ2VEb3RzID0gbmV3IFBhZ2VEb3RzKCB0aGlzICk7XG4gIC8vIGV2ZW50c1xuICB0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLmFjdGl2YXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ3NlbGVjdCcsIHRoaXMudXBkYXRlU2VsZWN0ZWRQYWdlRG90cyApO1xuICB0aGlzLm9uKCAnY2VsbENoYW5nZScsIHRoaXMudXBkYXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ3Jlc2l6ZScsIHRoaXMudXBkYXRlUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQYWdlRG90cyApO1xufTtcblxucHJvdG8uYWN0aXZhdGVQYWdlRG90cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBhZ2VEb3RzLmFjdGl2YXRlKCk7XG59O1xuXG5wcm90by51cGRhdGVTZWxlY3RlZFBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMudXBkYXRlU2VsZWN0ZWQoKTtcbn07XG5cbnByb3RvLnVwZGF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMuc2V0RG90cygpO1xufTtcblxucHJvdG8uZGVhY3RpdmF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFnZURvdHMuZGVhY3RpdmF0ZSgpO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbkZsaWNraXR5LlBhZ2VEb3RzID0gUGFnZURvdHM7XG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EsV0FnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/page-dots.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/player.js":
/*!********************************************!*\
  !*** ./node_modules/flickity/js/player.js ***!
  \********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\"),\n      __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\"),\n      __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter, utils, Flickity ) {\n      return factory( EvEmitter, utils, Flickity );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n  this.parent = parent;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state == 'playing' ) {\n    return;\n  }\n  // do not play if page is hidden, start playing when page is visible\n  var isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state != 'playing' ) {\n    return;\n  }\n\n  var time = this.parent.options.autoPlay;\n  // default to 3 seconds\n  time = typeof time == 'number' ? time : 3000;\n  var _this = this;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( function() {\n    _this.parent.next( true );\n    _this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state == 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state == 'paused' ) {\n    this.play();\n  }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  var isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pauseAutoPlayOnHover: true\n});\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n  this.player = new Player( this );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) {\n    return;\n  }\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) {\n    return;\n  }\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcGxheWVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9wbGF5ZXIuanM/YjE4YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwbGF5ZXIgJiBhdXRvUGxheVxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJyxcbiAgICAgICcuL2ZsaWNraXR5J1xuICAgIF0sIGZ1bmN0aW9uKCBFdkVtaXR0ZXIsIHV0aWxzLCBGbGlja2l0eSApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCBFdkVtaXR0ZXIsIHV0aWxzLCBGbGlja2l0eSApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnZXYtZW1pdHRlcicpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKSxcbiAgICAgIHJlcXVpcmUoJy4vZmxpY2tpdHknKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgd2luZG93LkV2RW1pdHRlcixcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHMsXG4gICAgICB3aW5kb3cuRmxpY2tpdHlcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggRXZFbWl0dGVyLCB1dGlscywgRmxpY2tpdHkgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGxheWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIFBsYXllciggcGFyZW50ICkge1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5zdGF0ZSA9ICdzdG9wcGVkJztcbiAgLy8gdmlzaWJpbGl0eSBjaGFuZ2UgZXZlbnQgaGFuZGxlclxuICB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSA9IHRoaXMudmlzaWJpbGl0eUNoYW5nZS5iaW5kKCB0aGlzICk7XG4gIHRoaXMub25WaXNpYmlsaXR5UGxheSA9IHRoaXMudmlzaWJpbGl0eVBsYXkuYmluZCggdGhpcyApO1xufVxuXG5QbGF5ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG4vLyBzdGFydCBwbGF5XG5QbGF5ZXIucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLnN0YXRlID09ICdwbGF5aW5nJyApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZG8gbm90IHBsYXkgaWYgcGFnZSBpcyBoaWRkZW4sIHN0YXJ0IHBsYXlpbmcgd2hlbiBwYWdlIGlzIHZpc2libGVcbiAgdmFyIGlzUGFnZUhpZGRlbiA9IGRvY3VtZW50LmhpZGRlbjtcbiAgaWYgKCBpc1BhZ2VIaWRkZW4gKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eVBsYXkgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnN0YXRlID0gJ3BsYXlpbmcnO1xuICAvLyBsaXN0ZW4gdG8gdmlzaWJpbGl0eSBjaGFuZ2VcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSApO1xuICAvLyBzdGFydCB0aWNraW5nXG4gIHRoaXMudGljaygpO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS50aWNrID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRvIG5vdCB0aWNrIGlmIG5vdCBwbGF5aW5nXG4gIGlmICggdGhpcy5zdGF0ZSAhPSAncGxheWluZycgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRpbWUgPSB0aGlzLnBhcmVudC5vcHRpb25zLmF1dG9QbGF5O1xuICAvLyBkZWZhdWx0IHRvIDMgc2Vjb25kc1xuICB0aW1lID0gdHlwZW9mIHRpbWUgPT0gJ251bWJlcicgPyB0aW1lIDogMzAwMDtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgLy8gSEFDSzogcmVzZXQgdGlja3MgaWYgc3RvcHBlZCBhbmQgc3RhcnRlZCB3aXRoaW4gaW50ZXJ2YWxcbiAgdGhpcy5jbGVhcigpO1xuICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICBfdGhpcy5wYXJlbnQubmV4dCggdHJ1ZSApO1xuICAgIF90aGlzLnRpY2soKTtcbiAgfSwgdGltZSApO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc3RhdGUgPSAnc3RvcHBlZCc7XG4gIHRoaXMuY2xlYXIoKTtcbiAgLy8gcmVtb3ZlIHZpc2liaWxpdHkgY2hhbmdlIGV2ZW50XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2UgKTtcbn07XG5cblBsYXllci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVvdXQgKTtcbn07XG5cblBsYXllci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLnN0YXRlID09ICdwbGF5aW5nJyApIHtcbiAgICB0aGlzLnN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG59O1xuXG5QbGF5ZXIucHJvdG90eXBlLnVucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmUtc3RhcnQgcGxheSBpZiBwYXVzZWRcbiAgaWYgKCB0aGlzLnN0YXRlID09ICdwYXVzZWQnICkge1xuICAgIHRoaXMucGxheSgpO1xuICB9XG59O1xuXG4vLyBwYXVzZSBpZiBwYWdlIHZpc2liaWxpdHkgaXMgaGlkZGVuLCB1bnBhdXNlIGlmIHZpc2libGVcblBsYXllci5wcm90b3R5cGUudmlzaWJpbGl0eUNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXNQYWdlSGlkZGVuID0gZG9jdW1lbnQuaGlkZGVuO1xuICB0aGlzWyBpc1BhZ2VIaWRkZW4gPyAncGF1c2UnIDogJ3VucGF1c2UnIF0oKTtcbn07XG5cblBsYXllci5wcm90b3R5cGUudmlzaWJpbGl0eVBsYXkgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5KCk7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5vblZpc2liaWxpdHlQbGF5ICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGbGlja2l0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG51dGlscy5leHRlbmQoIEZsaWNraXR5LmRlZmF1bHRzLCB7XG4gIHBhdXNlQXV0b1BsYXlPbkhvdmVyOiB0cnVlXG59KTtcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlUGxheWVyJyk7XG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbnByb3RvLl9jcmVhdGVQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIgPSBuZXcgUGxheWVyKCB0aGlzICk7XG5cbiAgdGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5hY3RpdmF0ZVBsYXllciApO1xuICB0aGlzLm9uKCAndWlDaGFuZ2UnLCB0aGlzLnN0b3BQbGF5ZXIgKTtcbiAgdGhpcy5vbiggJ3BvaW50ZXJEb3duJywgdGhpcy5zdG9wUGxheWVyICk7XG4gIHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy5kZWFjdGl2YXRlUGxheWVyICk7XG59O1xuXG5wcm90by5hY3RpdmF0ZVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMuYXV0b1BsYXkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgdGhpcyApO1xufTtcblxuLy8gUGxheWVyIEFQSSwgZG9uJ3QgaGF0ZSB0aGUgLi4uIHRoYW5rcyBJIGtub3cgd2hlcmUgdGhlIGRvb3IgaXNcblxucHJvdG8ucGxheVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci5wbGF5KCk7XG59O1xuXG5wcm90by5zdG9wUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnN0b3AoKTtcbn07XG5cbnByb3RvLnBhdXNlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnBhdXNlKCk7XG59O1xuXG5wcm90by51bnBhdXNlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnVucGF1c2UoKTtcbn07XG5cbnByb3RvLmRlYWN0aXZhdGVQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIuc3RvcCgpO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlZW50ZXInLCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSBtb3VzZWVudGVyL2xlYXZlIC0tLS0tIC8vXG5cbi8vIHBhdXNlIGF1dG8tcGxheSBvbiBob3ZlclxucHJvdG8ub25tb3VzZWVudGVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMub3B0aW9ucy5wYXVzZUF1dG9QbGF5T25Ib3ZlciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbiAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWxlYXZlJywgdGhpcyApO1xufTtcblxuLy8gcmVzdW1lIGF1dG8tcGxheSBvbiBob3ZlciBvZmZcbnByb3RvLm9ubW91c2VsZWF2ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci51bnBhdXNlKCk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2VsZWF2ZScsIHRoaXMgKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5GbGlja2l0eS5QbGF5ZXIgPSBQbGF5ZXI7XG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EsV0FjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/player.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/prev-next-button.js":
/*!******************************************************!*\
  !*** ./node_modules/flickity/js/prev-next-button.js ***!
  \******************************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ./flickity */ \"./node_modules/flickity/js/flickity.js\"),\n      __webpack_require__(/*! unipointer/unipointer */ \"./node_modules/unipointer/unipointer.js\"),\n      __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Flickity, Unipointer, utils ) {\n      return factory( window, Flickity, Unipointer, utils );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n  this.direction = direction;\n  this.parent = parent;\n  this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n  // properties\n  this.isEnabled = true;\n  this.isPrevious = this.direction == -1;\n  var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n  this.isLeft = this.direction == leftDirection;\n\n  var element = this.element = document.createElement('button');\n  element.className = 'flickity-button flickity-prev-next-button';\n  element.className += this.isPrevious ? ' previous' : ' next';\n  // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  // init as disabled\n  this.disable();\n\n  element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n  // create arrow\n  var svg = this.createSVG();\n  element.appendChild( svg );\n  // events\n  this.parent.on( 'select', this.update.bind( this ) );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n  this.bindStartEvent( this.element );\n  this.element.addEventListener( 'click', this );\n  // add to DOM\n  this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n  // remove from DOM\n  this.parent.element.removeChild( this.element );\n  // click events\n  this.unbindStartEvent( this.element );\n  this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n  var svg = document.createElementNS( svgURI, 'svg');\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  var path = document.createElementNS( svgURI, 'path');\n  var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n  }\n  svg.appendChild( path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) {\n    return shape;\n  }\n  // create movement string\n  return 'M ' + shape.x0 + ',50' +\n    ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n    ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n    ' L ' + shape.x3 + ',50 ' +\n    ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n    ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n    ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.parent.uiChange();\n  var method = this.isPrevious ? 'previous' : 'next';\n  this.parent[ method ]();\n};\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  if ( this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = false;\n  this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = true;\n  this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n  // index of first or last slide, if previous or next\n  var slides = this.parent.slides;\n  // enable is wrapAround and at least 2 slides\n  if ( this.parent.options.wrapAround && slides.length > 1 ) {\n    this.enable();\n    return;\n  }\n  var lastIndex = slides.length ? slides.length - 1 : 0;\n  var boundIndex = this.isPrevious ? 0 : lastIndex;\n  var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n  this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n  this.deactivate();\n  this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30\n  }\n});\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) {\n    return;\n  }\n\n  this.prevButton = new PrevNextButton( -1, this );\n  this.nextButton = new PrevNextButton( 1, this );\n\n  this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.activate();\n  this.nextButton.activate();\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.deactivate();\n  this.nextButton.deactivate();\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcHJldi1uZXh0LWJ1dHRvbi5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcHJldi1uZXh0LWJ1dHRvbi5qcz9jZmI2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIHByZXYvbmV4dCBidXR0b25zXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJy4vZmxpY2tpdHknLFxuICAgICAgJ3VuaXBvaW50ZXIvdW5pcG9pbnRlcicsXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnXG4gICAgXSwgZnVuY3Rpb24oIEZsaWNraXR5LCBVbmlwb2ludGVyLCB1dGlscyApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEZsaWNraXR5LCBVbmlwb2ludGVyLCB1dGlscyApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgndW5pcG9pbnRlcicpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgd2luZG93LlVuaXBvaW50ZXIsXG4gICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFVuaXBvaW50ZXIsIHV0aWxzICkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3ZnVVJJID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJldk5leHRCdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gUHJldk5leHRCdXR0b24oIGRpcmVjdGlvbiwgcGFyZW50ICkge1xuICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX2NyZWF0ZSgpO1xufVxuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBVbmlwb2ludGVyLnByb3RvdHlwZSApO1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBwcm9wZXJ0aWVzXG4gIHRoaXMuaXNFbmFibGVkID0gdHJ1ZTtcbiAgdGhpcy5pc1ByZXZpb3VzID0gdGhpcy5kaXJlY3Rpb24gPT0gLTE7XG4gIHZhciBsZWZ0RGlyZWN0aW9uID0gdGhpcy5wYXJlbnQub3B0aW9ucy5yaWdodFRvTGVmdCA/IDEgOiAtMTtcbiAgdGhpcy5pc0xlZnQgPSB0aGlzLmRpcmVjdGlvbiA9PSBsZWZ0RGlyZWN0aW9uO1xuXG4gIHZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gIGVsZW1lbnQuY2xhc3NOYW1lID0gJ2ZsaWNraXR5LWJ1dHRvbiBmbGlja2l0eS1wcmV2LW5leHQtYnV0dG9uJztcbiAgZWxlbWVudC5jbGFzc05hbWUgKz0gdGhpcy5pc1ByZXZpb3VzID8gJyBwcmV2aW91cycgOiAnIG5leHQnO1xuICAvLyBwcmV2ZW50IGJ1dHRvbiBmcm9tIHN1Ym1pdHRpbmcgZm9ybSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMDgzNjA3Ni8xODIxODNcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoICd0eXBlJywgJ2J1dHRvbicgKTtcbiAgLy8gaW5pdCBhcyBkaXNhYmxlZFxuICB0aGlzLmRpc2FibGUoKTtcblxuICBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWwnLCB0aGlzLmlzUHJldmlvdXMgPyAnUHJldmlvdXMnIDogJ05leHQnICk7XG5cbiAgLy8gY3JlYXRlIGFycm93XG4gIHZhciBzdmcgPSB0aGlzLmNyZWF0ZVNWRygpO1xuICBlbGVtZW50LmFwcGVuZENoaWxkKCBzdmcgKTtcbiAgLy8gZXZlbnRzXG4gIHRoaXMucGFyZW50Lm9uKCAnc2VsZWN0JywgdGhpcy51cGRhdGUuYmluZCggdGhpcyApICk7XG4gIHRoaXMub24oICdwb2ludGVyRG93bicsIHRoaXMucGFyZW50LmNoaWxkVUlQb2ludGVyRG93bi5iaW5kKCB0aGlzLnBhcmVudCApICk7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5iaW5kU3RhcnRFdmVudCggdGhpcy5lbGVtZW50ICk7XG4gIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzICk7XG4gIC8vIGFkZCB0byBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5hcHBlbmRDaGlsZCggdGhpcy5lbGVtZW50ICk7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuZGVhY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyByZW1vdmUgZnJvbSBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5yZW1vdmVDaGlsZCggdGhpcy5lbGVtZW50ICk7XG4gIC8vIGNsaWNrIGV2ZW50c1xuICB0aGlzLnVuYmluZFN0YXJ0RXZlbnQoIHRoaXMuZWxlbWVudCApO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgdGhpcyApO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmNyZWF0ZVNWRyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCBzdmdVUkksICdzdmcnKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgJ2ZsaWNraXR5LWJ1dHRvbi1pY29uJyApO1xuICBzdmcuc2V0QXR0cmlidXRlKCAndmlld0JveCcsICcwIDAgMTAwIDEwMCcgKTtcbiAgdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoIHN2Z1VSSSwgJ3BhdGgnKTtcbiAgdmFyIHBhdGhNb3ZlbWVudHMgPSBnZXRBcnJvd01vdmVtZW50cyggdGhpcy5wYXJlbnQub3B0aW9ucy5hcnJvd1NoYXBlICk7XG4gIHBhdGguc2V0QXR0cmlidXRlKCAnZCcsIHBhdGhNb3ZlbWVudHMgKTtcbiAgcGF0aC5zZXRBdHRyaWJ1dGUoICdjbGFzcycsICdhcnJvdycgKTtcbiAgLy8gcm90YXRlIGFycm93XG4gIGlmICggIXRoaXMuaXNMZWZ0ICkge1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgxMDAsIDEwMCkgcm90YXRlKDE4MCkgJyApO1xuICB9XG4gIHN2Zy5hcHBlbmRDaGlsZCggcGF0aCApO1xuICByZXR1cm4gc3ZnO1xufTtcblxuLy8gZ2V0IFNWRyBwYXRoIG1vdm1lbWVudFxuZnVuY3Rpb24gZ2V0QXJyb3dNb3ZlbWVudHMoIHNoYXBlICkge1xuICAvLyB1c2Ugc2hhcGUgYXMgbW92ZW1lbnQgaWYgc3RyaW5nXG4gIGlmICggdHlwZW9mIHNoYXBlID09ICdzdHJpbmcnICkge1xuICAgIHJldHVybiBzaGFwZTtcbiAgfVxuICAvLyBjcmVhdGUgbW92ZW1lbnQgc3RyaW5nXG4gIHJldHVybiAnTSAnICsgc2hhcGUueDAgKyAnLDUwJyArXG4gICAgJyBMICcgKyBzaGFwZS54MSArICcsJyArICggc2hhcGUueTEgKyA1MCApICtcbiAgICAnIEwgJyArIHNoYXBlLngyICsgJywnICsgKCBzaGFwZS55MiArIDUwICkgK1xuICAgICcgTCAnICsgc2hhcGUueDMgKyAnLDUwICcgK1xuICAgICcgTCAnICsgc2hhcGUueDIgKyAnLCcgKyAoIDUwIC0gc2hhcGUueTIgKSArXG4gICAgJyBMICcgKyBzaGFwZS54MSArICcsJyArICggNTAgLSBzaGFwZS55MSApICtcbiAgICAnIFonO1xufVxuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSB1dGlscy5oYW5kbGVFdmVudDtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLm9uY2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5pc0VuYWJsZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucGFyZW50LnVpQ2hhbmdlKCk7XG4gIHZhciBtZXRob2QgPSB0aGlzLmlzUHJldmlvdXMgPyAncHJldmlvdXMnIDogJ25leHQnO1xuICB0aGlzLnBhcmVudFsgbWV0aG9kIF0oKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5pc0VuYWJsZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlO1xuICB0aGlzLmlzRW5hYmxlZCA9IHRydWU7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzRW5hYmxlZCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5lbGVtZW50LmRpc2FibGVkID0gdHJ1ZTtcbiAgdGhpcy5pc0VuYWJsZWQgPSBmYWxzZTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gaW5kZXggb2YgZmlyc3Qgb3IgbGFzdCBzbGlkZSwgaWYgcHJldmlvdXMgb3IgbmV4dFxuICB2YXIgc2xpZGVzID0gdGhpcy5wYXJlbnQuc2xpZGVzO1xuICAvLyBlbmFibGUgaXMgd3JhcEFyb3VuZCBhbmQgYXQgbGVhc3QgMiBzbGlkZXNcbiAgaWYgKCB0aGlzLnBhcmVudC5vcHRpb25zLndyYXBBcm91bmQgJiYgc2xpZGVzLmxlbmd0aCA+IDEgKSB7XG4gICAgdGhpcy5lbmFibGUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IHNsaWRlcy5sZW5ndGggPyBzbGlkZXMubGVuZ3RoIC0gMSA6IDA7XG4gIHZhciBib3VuZEluZGV4ID0gdGhpcy5pc1ByZXZpb3VzID8gMCA6IGxhc3RJbmRleDtcbiAgdmFyIG1ldGhvZCA9IHRoaXMucGFyZW50LnNlbGVjdGVkSW5kZXggPT0gYm91bmRJbmRleCA/ICdkaXNhYmxlJyA6ICdlbmFibGUnO1xuICB0aGlzWyBtZXRob2QgXSgpO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gIHRoaXMuYWxsT2ZmKCk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGbGlja2l0eSBwcm90b3R5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudXRpbHMuZXh0ZW5kKCBGbGlja2l0eS5kZWZhdWx0cywge1xuICBwcmV2TmV4dEJ1dHRvbnM6IHRydWUsXG4gIGFycm93U2hhcGU6IHtcbiAgICB4MDogMTAsXG4gICAgeDE6IDYwLCB5MTogNTAsXG4gICAgeDI6IDcwLCB5MjogNDAsXG4gICAgeDM6IDMwXG4gIH1cbn0pO1xuXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzLnB1c2goJ19jcmVhdGVQcmV2TmV4dEJ1dHRvbnMnKTtcbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcblxucHJvdG8uX2NyZWF0ZVByZXZOZXh0QnV0dG9ucyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMucHJldk5leHRCdXR0b25zICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMucHJldkJ1dHRvbiA9IG5ldyBQcmV2TmV4dEJ1dHRvbiggLTEsIHRoaXMgKTtcbiAgdGhpcy5uZXh0QnV0dG9uID0gbmV3IFByZXZOZXh0QnV0dG9uKCAxLCB0aGlzICk7XG5cbiAgdGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5hY3RpdmF0ZVByZXZOZXh0QnV0dG9ucyApO1xufTtcblxucHJvdG8uYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wcmV2QnV0dG9uLmFjdGl2YXRlKCk7XG4gIHRoaXMubmV4dEJ1dHRvbi5hY3RpdmF0ZSgpO1xuICB0aGlzLm9uKCAnZGVhY3RpdmF0ZScsIHRoaXMuZGVhY3RpdmF0ZVByZXZOZXh0QnV0dG9ucyApO1xufTtcblxucHJvdG8uZGVhY3RpdmF0ZVByZXZOZXh0QnV0dG9ucyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnByZXZCdXR0b24uZGVhY3RpdmF0ZSgpO1xuICB0aGlzLm5leHRCdXR0b24uZGVhY3RpdmF0ZSgpO1xuICB0aGlzLm9mZiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQcmV2TmV4dEJ1dHRvbnMgKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5GbGlja2l0eS5QcmV2TmV4dEJ1dHRvbiA9IFByZXZOZXh0QnV0dG9uO1xuXG5yZXR1cm4gRmxpY2tpdHk7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLFdBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/prev-next-button.js\n");

/***/ }),

/***/ "./node_modules/flickity/js/slide.js":
/*!*******************************************!*\
  !*** ./node_modules/flickity/js/slide.js ***!
  \*******************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// slide\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n  this.parent = parent;\n  this.isOriginLeft = parent.originSide == 'left';\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length == 1 ) {\n    this.x = cell.x; // x comes from first cell\n    var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n    this.firstMargin = cell.size[ beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n  var lastCell = this.getLastCell();\n  var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n  var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.cells.forEach( function( cell ) {\n    cell.select();\n  });\n};\n\nproto.unselect = function() {\n  this.cells.forEach( function( cell ) {\n    cell.unselect();\n  });\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  });\n};\n\nreturn Slide;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvc2xpZGUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL3NsaWRlLmpzPzc2NTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc2xpZGVcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuU2xpZGUgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBTbGlkZSggcGFyZW50ICkge1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5pc09yaWdpbkxlZnQgPSBwYXJlbnQub3JpZ2luU2lkZSA9PSAnbGVmdCc7XG4gIHRoaXMuY2VsbHMgPSBbXTtcbiAgdGhpcy5vdXRlcldpZHRoID0gMDtcbiAgdGhpcy5oZWlnaHQgPSAwO1xufVxuXG52YXIgcHJvdG8gPSBTbGlkZS5wcm90b3R5cGU7XG5cbnByb3RvLmFkZENlbGwgPSBmdW5jdGlvbiggY2VsbCApIHtcbiAgdGhpcy5jZWxscy5wdXNoKCBjZWxsICk7XG4gIHRoaXMub3V0ZXJXaWR0aCArPSBjZWxsLnNpemUub3V0ZXJXaWR0aDtcbiAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heCggY2VsbC5zaXplLm91dGVySGVpZ2h0LCB0aGlzLmhlaWdodCApO1xuICAvLyBmaXJzdCBjZWxsIHN0dWZmXG4gIGlmICggdGhpcy5jZWxscy5sZW5ndGggPT0gMSApIHtcbiAgICB0aGlzLnggPSBjZWxsLng7IC8vIHggY29tZXMgZnJvbSBmaXJzdCBjZWxsXG4gICAgdmFyIGJlZ2luTWFyZ2luID0gdGhpcy5pc09yaWdpbkxlZnQgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHRoaXMuZmlyc3RNYXJnaW4gPSBjZWxsLnNpemVbIGJlZ2luTWFyZ2luIF07XG4gIH1cbn07XG5cbnByb3RvLnVwZGF0ZVRhcmdldCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZW5kTWFyZ2luID0gdGhpcy5pc09yaWdpbkxlZnQgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnO1xuICB2YXIgbGFzdENlbGwgPSB0aGlzLmdldExhc3RDZWxsKCk7XG4gIHZhciBsYXN0TWFyZ2luID0gbGFzdENlbGwgPyBsYXN0Q2VsbC5zaXplWyBlbmRNYXJnaW4gXSA6IDA7XG4gIHZhciBzbGlkZVdpZHRoID0gdGhpcy5vdXRlcldpZHRoIC0gKCB0aGlzLmZpcnN0TWFyZ2luICsgbGFzdE1hcmdpbiApO1xuICB0aGlzLnRhcmdldCA9IHRoaXMueCArIHRoaXMuZmlyc3RNYXJnaW4gKyBzbGlkZVdpZHRoICogdGhpcy5wYXJlbnQuY2VsbEFsaWduO1xufTtcblxucHJvdG8uZ2V0TGFzdENlbGwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2VsbHNbIHRoaXMuY2VsbHMubGVuZ3RoIC0gMSBdO1xufTtcblxucHJvdG8uc2VsZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5zZWxlY3QoKTtcbiAgfSk7XG59O1xuXG5wcm90by51bnNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGNlbGwudW5zZWxlY3QoKTtcbiAgfSk7XG59O1xuXG5wcm90by5nZXRDZWxsRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2VsbHMubWFwKCBmdW5jdGlvbiggY2VsbCApIHtcbiAgICByZXR1cm4gY2VsbC5lbGVtZW50O1xuICB9KTtcbn07XG5cbnJldHVybiBTbGlkZTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/flickity/js/slide.js\n");

/***/ }),

/***/ "./node_modules/get-size/get-size.js":
/*!*******************************************!*\
  !*** ./node_modules/get-size/get-size.js ***!
  \*******************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n  /* jshint strict: false */ /* globals define, module */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  var num = parseFloat( value );\n  // not a percent like '100%', and a number\n  var isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n  function( message ) {\n    console.error( message );\n  };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  var size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0\n  };\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    size[ measurement ] = 0;\n  }\n  return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n  var style = getComputedStyle( elem );\n  if ( !style ) {\n    logError( 'Style returned ' + style +\n      '. Are you running this code in a hidden iframe on Firefox? ' +\n      'See https://bit.ly/getsizebug1' );\n  }\n  return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n  // setup once\n  if ( isSetup ) {\n    return;\n  }\n  isSetup = true;\n\n  // -------------------------- box sizing -------------------------- //\n\n  /**\n   * Chrome & Safari measure the outer-width on style.width on border-box elems\n   * IE11 & Firefox<29 measures the inner-width\n   */\n  var div = document.createElement('div');\n  div.style.width = '200px';\n  div.style.padding = '1px 2px 3px 4px';\n  div.style.borderStyle = 'solid';\n  div.style.borderWidth = '1px 2px 3px 4px';\n  div.style.boxSizing = 'border-box';\n\n  var body = document.body || document.documentElement;\n  body.appendChild( div );\n  var style = getStyle( div );\n  // round value for browser zoom. desandro/masonry#928\n  isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n  getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n  body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  setup();\n\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) {\n    elem = document.querySelector( elem );\n  }\n\n  // do not proceed on non-objects\n  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n    return;\n  }\n\n  var style = getStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) {\n    return getZeroSize();\n  }\n\n  var size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    var value = style[ measurement ];\n    var num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  }\n\n  var paddingWidth = size.paddingLeft + size.paddingRight;\n  var paddingHeight = size.paddingTop + size.paddingBottom;\n  var marginWidth = size.marginLeft + size.marginRight;\n  var marginHeight = size.marginTop + size.marginBottom;\n  var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n  // overwrite width and height if we can get it from style\n  var styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n  }\n\n  var styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZ2V0LXNpemUvZ2V0LXNpemUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2dldC1zaXplL2dldC1zaXplLmpzPzQwYWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBnZXRTaXplIHYyLjAuM1xuICogbWVhc3VyZSBzaXplIG9mIGVsZW1lbnRzXG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qIGpzaGludCBicm93c2VyOiB0cnVlLCBzdHJpY3Q6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUgKi9cbi8qIGdsb2JhbHMgY29uc29sZTogZmFsc2UgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKiBnbG9iYWxzIGRlZmluZSwgbW9kdWxlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5nZXRTaXplID0gZmFjdG9yeSgpO1xuICB9XG5cbn0pKCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZ2V0IGEgbnVtYmVyIGZyb20gYSBzdHJpbmcsIG5vdCBhIHBlcmNlbnRhZ2VcbmZ1bmN0aW9uIGdldFN0eWxlU2l6ZSggdmFsdWUgKSB7XG4gIHZhciBudW0gPSBwYXJzZUZsb2F0KCB2YWx1ZSApO1xuICAvLyBub3QgYSBwZXJjZW50IGxpa2UgJzEwMCUnLCBhbmQgYSBudW1iZXJcbiAgdmFyIGlzVmFsaWQgPSB2YWx1ZS5pbmRleE9mKCclJykgPT0gLTEgJiYgIWlzTmFOKCBudW0gKTtcbiAgcmV0dXJuIGlzVmFsaWQgJiYgbnVtO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIGxvZ0Vycm9yID0gdHlwZW9mIGNvbnNvbGUgPT0gJ3VuZGVmaW5lZCcgPyBub29wIDpcbiAgZnVuY3Rpb24oIG1lc3NhZ2UgKSB7XG4gICAgY29uc29sZS5lcnJvciggbWVzc2FnZSApO1xuICB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZWFzdXJlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudmFyIG1lYXN1cmVtZW50cyA9IFtcbiAgJ3BhZGRpbmdMZWZ0JyxcbiAgJ3BhZGRpbmdSaWdodCcsXG4gICdwYWRkaW5nVG9wJyxcbiAgJ3BhZGRpbmdCb3R0b20nLFxuICAnbWFyZ2luTGVmdCcsXG4gICdtYXJnaW5SaWdodCcsXG4gICdtYXJnaW5Ub3AnLFxuICAnbWFyZ2luQm90dG9tJyxcbiAgJ2JvcmRlckxlZnRXaWR0aCcsXG4gICdib3JkZXJSaWdodFdpZHRoJyxcbiAgJ2JvcmRlclRvcFdpZHRoJyxcbiAgJ2JvcmRlckJvdHRvbVdpZHRoJ1xuXTtcblxudmFyIG1lYXN1cmVtZW50c0xlbmd0aCA9IG1lYXN1cmVtZW50cy5sZW5ndGg7XG5cbmZ1bmN0aW9uIGdldFplcm9TaXplKCkge1xuICB2YXIgc2l6ZSA9IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgaW5uZXJXaWR0aDogMCxcbiAgICBpbm5lckhlaWdodDogMCxcbiAgICBvdXRlcldpZHRoOiAwLFxuICAgIG91dGVySGVpZ2h0OiAwXG4gIH07XG4gIGZvciAoIHZhciBpPTA7IGkgPCBtZWFzdXJlbWVudHNMZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlbWVudHNbaV07XG4gICAgc2l6ZVsgbWVhc3VyZW1lbnQgXSA9IDA7XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldFN0eWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogZ2V0U3R5bGUsIGdldCBzdHlsZSBvZiBlbGVtZW50LCBjaGVjayBmb3IgRmlyZWZveCBidWdcbiAqIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTU0ODM5N1xuICovXG5mdW5jdGlvbiBnZXRTdHlsZSggZWxlbSApIHtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuICBpZiAoICFzdHlsZSApIHtcbiAgICBsb2dFcnJvciggJ1N0eWxlIHJldHVybmVkICcgKyBzdHlsZSArXG4gICAgICAnLiBBcmUgeW91IHJ1bm5pbmcgdGhpcyBjb2RlIGluIGEgaGlkZGVuIGlmcmFtZSBvbiBGaXJlZm94PyAnICtcbiAgICAgICdTZWUgaHR0cHM6Ly9iaXQubHkvZ2V0c2l6ZWJ1ZzEnICk7XG4gIH1cbiAgcmV0dXJuIHN0eWxlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgaXNTZXR1cCA9IGZhbHNlO1xuXG52YXIgaXNCb3hTaXplT3V0ZXI7XG5cbi8qKlxuICogc2V0dXBcbiAqIGNoZWNrIGlzQm94U2l6ZXJPdXRlclxuICogZG8gb24gZmlyc3QgZ2V0U2l6ZSgpIHJhdGhlciB0aGFuIG9uIHBhZ2UgbG9hZCBmb3IgRmlyZWZveCBidWdcbiAqL1xuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIC8vIHNldHVwIG9uY2VcbiAgaWYgKCBpc1NldHVwICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc1NldHVwID0gdHJ1ZTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBib3ggc2l6aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLyoqXG4gICAqIENocm9tZSAmIFNhZmFyaSBtZWFzdXJlIHRoZSBvdXRlci13aWR0aCBvbiBzdHlsZS53aWR0aCBvbiBib3JkZXItYm94IGVsZW1zXG4gICAqIElFMTEgJiBGaXJlZm94PDI5IG1lYXN1cmVzIHRoZSBpbm5lci13aWR0aFxuICAgKi9cbiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkaXYuc3R5bGUud2lkdGggPSAnMjAwcHgnO1xuICBkaXYuc3R5bGUucGFkZGluZyA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnO1xuICBkaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4IDJweCAzcHggNHB4JztcbiAgZGl2LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcblxuICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICBib2R5LmFwcGVuZENoaWxkKCBkaXYgKTtcbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoIGRpdiApO1xuICAvLyByb3VuZCB2YWx1ZSBmb3IgYnJvd3NlciB6b29tLiBkZXNhbmRyby9tYXNvbnJ5IzkyOFxuICBpc0JveFNpemVPdXRlciA9IE1hdGgucm91bmQoIGdldFN0eWxlU2l6ZSggc3R5bGUud2lkdGggKSApID09IDIwMDtcbiAgZ2V0U2l6ZS5pc0JveFNpemVPdXRlciA9IGlzQm94U2l6ZU91dGVyO1xuXG4gIGJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXRTaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIGdldFNpemUoIGVsZW0gKSB7XG4gIHNldHVwKCk7XG5cbiAgLy8gdXNlIHF1ZXJ5U2VsZXRvciBpZiBlbGVtIGlzIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBlbGVtID09ICdzdHJpbmcnICkge1xuICAgIGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBlbGVtICk7XG4gIH1cblxuICAvLyBkbyBub3QgcHJvY2VlZCBvbiBub24tb2JqZWN0c1xuICBpZiAoICFlbGVtIHx8IHR5cGVvZiBlbGVtICE9ICdvYmplY3QnIHx8ICFlbGVtLm5vZGVUeXBlICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IGdldFN0eWxlKCBlbGVtICk7XG5cbiAgLy8gaWYgaGlkZGVuLCBldmVyeXRoaW5nIGlzIDBcbiAgaWYgKCBzdHlsZS5kaXNwbGF5ID09ICdub25lJyApIHtcbiAgICByZXR1cm4gZ2V0WmVyb1NpemUoKTtcbiAgfVxuXG4gIHZhciBzaXplID0ge307XG4gIHNpemUud2lkdGggPSBlbGVtLm9mZnNldFdpZHRoO1xuICBzaXplLmhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0O1xuXG4gIHZhciBpc0JvcmRlckJveCA9IHNpemUuaXNCb3JkZXJCb3ggPSBzdHlsZS5ib3hTaXppbmcgPT0gJ2JvcmRlci1ib3gnO1xuXG4gIC8vIGdldCBhbGwgbWVhc3VyZW1lbnRzXG4gIGZvciAoIHZhciBpPTA7IGkgPCBtZWFzdXJlbWVudHNMZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlbWVudHNbaV07XG4gICAgdmFyIHZhbHVlID0gc3R5bGVbIG1lYXN1cmVtZW50IF07XG4gICAgdmFyIG51bSA9IHBhcnNlRmxvYXQoIHZhbHVlICk7XG4gICAgLy8gYW55ICdhdXRvJywgJ21lZGl1bScgdmFsdWUgd2lsbCBiZSAwXG4gICAgc2l6ZVsgbWVhc3VyZW1lbnQgXSA9ICFpc05hTiggbnVtICkgPyBudW0gOiAwO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdXaWR0aCA9IHNpemUucGFkZGluZ0xlZnQgKyBzaXplLnBhZGRpbmdSaWdodDtcbiAgdmFyIHBhZGRpbmdIZWlnaHQgPSBzaXplLnBhZGRpbmdUb3AgKyBzaXplLnBhZGRpbmdCb3R0b207XG4gIHZhciBtYXJnaW5XaWR0aCA9IHNpemUubWFyZ2luTGVmdCArIHNpemUubWFyZ2luUmlnaHQ7XG4gIHZhciBtYXJnaW5IZWlnaHQgPSBzaXplLm1hcmdpblRvcCArIHNpemUubWFyZ2luQm90dG9tO1xuICB2YXIgYm9yZGVyV2lkdGggPSBzaXplLmJvcmRlckxlZnRXaWR0aCArIHNpemUuYm9yZGVyUmlnaHRXaWR0aDtcbiAgdmFyIGJvcmRlckhlaWdodCA9IHNpemUuYm9yZGVyVG9wV2lkdGggKyBzaXplLmJvcmRlckJvdHRvbVdpZHRoO1xuXG4gIHZhciBpc0JvcmRlckJveFNpemVPdXRlciA9IGlzQm9yZGVyQm94ICYmIGlzQm94U2l6ZU91dGVyO1xuXG4gIC8vIG92ZXJ3cml0ZSB3aWR0aCBhbmQgaGVpZ2h0IGlmIHdlIGNhbiBnZXQgaXQgZnJvbSBzdHlsZVxuICB2YXIgc3R5bGVXaWR0aCA9IGdldFN0eWxlU2l6ZSggc3R5bGUud2lkdGggKTtcbiAgaWYgKCBzdHlsZVdpZHRoICE9PSBmYWxzZSApIHtcbiAgICBzaXplLndpZHRoID0gc3R5bGVXaWR0aCArXG4gICAgICAvLyBhZGQgcGFkZGluZyBhbmQgYm9yZGVyIHVubGVzcyBpdCdzIGFscmVhZHkgaW5jbHVkaW5nIGl0XG4gICAgICAoIGlzQm9yZGVyQm94U2l6ZU91dGVyID8gMCA6IHBhZGRpbmdXaWR0aCArIGJvcmRlcldpZHRoICk7XG4gIH1cblxuICB2YXIgc3R5bGVIZWlnaHQgPSBnZXRTdHlsZVNpemUoIHN0eWxlLmhlaWdodCApO1xuICBpZiAoIHN0eWxlSGVpZ2h0ICE9PSBmYWxzZSApIHtcbiAgICBzaXplLmhlaWdodCA9IHN0eWxlSGVpZ2h0ICtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgdW5sZXNzIGl0J3MgYWxyZWFkeSBpbmNsdWRpbmcgaXRcbiAgICAgICggaXNCb3JkZXJCb3hTaXplT3V0ZXIgPyAwIDogcGFkZGluZ0hlaWdodCArIGJvcmRlckhlaWdodCApO1xuICB9XG5cbiAgc2l6ZS5pbm5lcldpZHRoID0gc2l6ZS53aWR0aCAtICggcGFkZGluZ1dpZHRoICsgYm9yZGVyV2lkdGggKTtcbiAgc2l6ZS5pbm5lckhlaWdodCA9IHNpemUuaGVpZ2h0IC0gKCBwYWRkaW5nSGVpZ2h0ICsgYm9yZGVySGVpZ2h0ICk7XG5cbiAgc2l6ZS5vdXRlcldpZHRoID0gc2l6ZS53aWR0aCArIG1hcmdpbldpZHRoO1xuICBzaXplLm91dGVySGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyBtYXJnaW5IZWlnaHQ7XG5cbiAgcmV0dXJuIHNpemU7XG59XG5cbnJldHVybiBnZXRTaXplO1xuXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/get-size/get-size.js\n");

/***/ }),

/***/ "./node_modules/intersection-observer/intersection-observer.js":
/*!*********************************************************************!*\
  !*** ./node_modules/intersection-observer/intersection-observer.js ***!
  \*********************************************************************/
/***/ (() => {

eval("/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.\n *\n *  https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n */\n\n(function(window, document) {\n'use strict';\n\n\n// Exits early if all IntersectionObserver and IntersectionObserverEntry\n// features are natively supported.\nif ('IntersectionObserver' in window &&\n    'IntersectionObserverEntry' in window &&\n    'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\n\n  // Minimal polyfill for Edge 15's lack of `isIntersecting`\n  // See: https://github.com/w3c/IntersectionObserver/issues/211\n  if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\n    Object.defineProperty(window.IntersectionObserverEntry.prototype,\n      'isIntersecting', {\n      get: function () {\n        return this.intersectionRatio > 0;\n      }\n    });\n  }\n  return;\n}\n\n\n/**\n * An IntersectionObserver registry. This registry exists to hold a strong\n * reference to IntersectionObserver instances currently observing a target\n * element. Without this registry, instances without another reference may be\n * garbage collected.\n */\nvar registry = [];\n\n\n/**\n * Creates the global IntersectionObserverEntry constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @param {Object} entry A dictionary of instance properties.\n * @constructor\n */\nfunction IntersectionObserverEntry(entry) {\n  this.time = entry.time;\n  this.target = entry.target;\n  this.rootBounds = entry.rootBounds;\n  this.boundingClientRect = entry.boundingClientRect;\n  this.intersectionRect = entry.intersectionRect || getEmptyRect();\n  this.isIntersecting = !!entry.intersectionRect;\n\n  // Calculates the intersection ratio.\n  var targetRect = this.boundingClientRect;\n  var targetArea = targetRect.width * targetRect.height;\n  var intersectionRect = this.intersectionRect;\n  var intersectionArea = intersectionRect.width * intersectionRect.height;\n\n  // Sets intersection ratio.\n  if (targetArea) {\n    // Round the intersection ratio to avoid floating point math issues:\n    // https://github.com/w3c/IntersectionObserver/issues/324\n    this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));\n  } else {\n    // If area is zero and is intersecting, sets to 1, otherwise to 0\n    this.intersectionRatio = this.isIntersecting ? 1 : 0;\n  }\n}\n\n\n/**\n * Creates the global IntersectionObserver constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {Function} callback The function to be invoked after intersection\n *     changes have queued. The function is not invoked if the queue has\n *     been emptied by calling the `takeRecords` method.\n * @param {Object=} opt_options Optional configuration options.\n * @constructor\n */\nfunction IntersectionObserver(callback, opt_options) {\n\n  var options = opt_options || {};\n\n  if (typeof callback != 'function') {\n    throw new Error('callback must be a function');\n  }\n\n  if (options.root && options.root.nodeType != 1) {\n    throw new Error('root must be an Element');\n  }\n\n  // Binds and throttles `this._checkForIntersections`.\n  this._checkForIntersections = throttle(\n      this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n\n  // Private properties.\n  this._callback = callback;\n  this._observationTargets = [];\n  this._queuedEntries = [];\n  this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n\n  // Public properties.\n  this.thresholds = this._initThresholds(options.threshold);\n  this.root = options.root || null;\n  this.rootMargin = this._rootMarginValues.map(function(margin) {\n    return margin.value + margin.unit;\n  }).join(' ');\n}\n\n\n/**\n * The minimum interval within which the document will be checked for\n * intersection changes.\n */\nIntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;\n\n\n/**\n * The frequency in which the polyfill polls for intersection changes.\n * this can be updated on a per instance basis and must be set prior to\n * calling `observe` on the first target.\n */\nIntersectionObserver.prototype.POLL_INTERVAL = null;\n\n/**\n * Use a mutation observer on the root element\n * to detect intersection changes.\n */\nIntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;\n\n\n/**\n * Starts observing a target element for intersection changes based on\n * the thresholds values.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.observe = function(target) {\n  var isTargetAlreadyObserved = this._observationTargets.some(function(item) {\n    return item.element == target;\n  });\n\n  if (isTargetAlreadyObserved) {\n    return;\n  }\n\n  if (!(target && target.nodeType == 1)) {\n    throw new Error('target must be an Element');\n  }\n\n  this._registerInstance();\n  this._observationTargets.push({element: target, entry: null});\n  this._monitorIntersections();\n  this._checkForIntersections();\n};\n\n\n/**\n * Stops observing a target element for intersection changes.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.unobserve = function(target) {\n  this._observationTargets =\n      this._observationTargets.filter(function(item) {\n\n    return item.element != target;\n  });\n  if (!this._observationTargets.length) {\n    this._unmonitorIntersections();\n    this._unregisterInstance();\n  }\n};\n\n\n/**\n * Stops observing all target elements for intersection changes.\n */\nIntersectionObserver.prototype.disconnect = function() {\n  this._observationTargets = [];\n  this._unmonitorIntersections();\n  this._unregisterInstance();\n};\n\n\n/**\n * Returns any queue entries that have not yet been reported to the\n * callback and clears the queue. This can be used in conjunction with the\n * callback to obtain the absolute most up-to-date intersection information.\n * @return {Array} The currently queued entries.\n */\nIntersectionObserver.prototype.takeRecords = function() {\n  var records = this._queuedEntries.slice();\n  this._queuedEntries = [];\n  return records;\n};\n\n\n/**\n * Accepts the threshold value from the user configuration object and\n * returns a sorted array of unique threshold values. If a value is not\n * between 0 and 1 and error is thrown.\n * @private\n * @param {Array|number=} opt_threshold An optional threshold value or\n *     a list of threshold values, defaulting to [0].\n * @return {Array} A sorted list of unique and valid threshold values.\n */\nIntersectionObserver.prototype._initThresholds = function(opt_threshold) {\n  var threshold = opt_threshold || [0];\n  if (!Array.isArray(threshold)) threshold = [threshold];\n\n  return threshold.sort().filter(function(t, i, a) {\n    if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {\n      throw new Error('threshold must be a number between 0 and 1 inclusively');\n    }\n    return t !== a[i - 1];\n  });\n};\n\n\n/**\n * Accepts the rootMargin value from the user configuration object\n * and returns an array of the four margin values as an object containing\n * the value and unit properties. If any of the values are not properly\n * formatted or use a unit other than px or %, and error is thrown.\n * @private\n * @param {string=} opt_rootMargin An optional rootMargin value,\n *     defaulting to '0px'.\n * @return {Array<Object>} An array of margin objects with the keys\n *     value and unit.\n */\nIntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) {\n  var marginString = opt_rootMargin || '0px';\n  var margins = marginString.split(/\\s+/).map(function(margin) {\n    var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n    if (!parts) {\n      throw new Error('rootMargin must be specified in pixels or percent');\n    }\n    return {value: parseFloat(parts[1]), unit: parts[2]};\n  });\n\n  // Handles shorthand.\n  margins[1] = margins[1] || margins[0];\n  margins[2] = margins[2] || margins[0];\n  margins[3] = margins[3] || margins[1];\n\n  return margins;\n};\n\n\n/**\n * Starts polling for intersection changes if the polling is not already\n * happening, and if the page's visibility state is visible.\n * @private\n */\nIntersectionObserver.prototype._monitorIntersections = function() {\n  if (!this._monitoringIntersections) {\n    this._monitoringIntersections = true;\n\n    // If a poll interval is set, use polling instead of listening to\n    // resize and scroll events or DOM mutations.\n    if (this.POLL_INTERVAL) {\n      this._monitoringInterval = setInterval(\n          this._checkForIntersections, this.POLL_INTERVAL);\n    }\n    else {\n      addEvent(window, 'resize', this._checkForIntersections, true);\n      addEvent(document, 'scroll', this._checkForIntersections, true);\n\n      if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in window) {\n        this._domObserver = new MutationObserver(this._checkForIntersections);\n        this._domObserver.observe(document, {\n          attributes: true,\n          childList: true,\n          characterData: true,\n          subtree: true\n        });\n      }\n    }\n  }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @private\n */\nIntersectionObserver.prototype._unmonitorIntersections = function() {\n  if (this._monitoringIntersections) {\n    this._monitoringIntersections = false;\n\n    clearInterval(this._monitoringInterval);\n    this._monitoringInterval = null;\n\n    removeEvent(window, 'resize', this._checkForIntersections, true);\n    removeEvent(document, 'scroll', this._checkForIntersections, true);\n\n    if (this._domObserver) {\n      this._domObserver.disconnect();\n      this._domObserver = null;\n    }\n  }\n};\n\n\n/**\n * Scans each observation target for intersection changes and adds them\n * to the internal entries queue. If new entries are found, it\n * schedules the callback to be invoked.\n * @private\n */\nIntersectionObserver.prototype._checkForIntersections = function() {\n  var rootIsInDom = this._rootIsInDom();\n  var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n\n  this._observationTargets.forEach(function(item) {\n    var target = item.element;\n    var targetRect = getBoundingClientRect(target);\n    var rootContainsTarget = this._rootContainsTarget(target);\n    var oldEntry = item.entry;\n    var intersectionRect = rootIsInDom && rootContainsTarget &&\n        this._computeTargetAndRootIntersection(target, rootRect);\n\n    var newEntry = item.entry = new IntersectionObserverEntry({\n      time: now(),\n      target: target,\n      boundingClientRect: targetRect,\n      rootBounds: rootRect,\n      intersectionRect: intersectionRect\n    });\n\n    if (!oldEntry) {\n      this._queuedEntries.push(newEntry);\n    } else if (rootIsInDom && rootContainsTarget) {\n      // If the new entry intersection ratio has crossed any of the\n      // thresholds, add a new entry.\n      if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n        this._queuedEntries.push(newEntry);\n      }\n    } else {\n      // If the root is not in the DOM or target is not contained within\n      // root but the previous entry for this target had an intersection,\n      // add a new record indicating removal.\n      if (oldEntry && oldEntry.isIntersecting) {\n        this._queuedEntries.push(newEntry);\n      }\n    }\n  }, this);\n\n  if (this._queuedEntries.length) {\n    this._callback(this.takeRecords(), this);\n  }\n};\n\n\n/**\n * Accepts a target and root rect computes the intersection between then\n * following the algorithm in the spec.\n * TODO(philipwalton): at this time clip-path is not considered.\n * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo\n * @param {Element} target The target DOM element\n * @param {Object} rootRect The bounding rect of the root after being\n *     expanded by the rootMargin value.\n * @return {?Object} The final intersection rect object or undefined if no\n *     intersection is found.\n * @private\n */\nIntersectionObserver.prototype._computeTargetAndRootIntersection =\n    function(target, rootRect) {\n\n  // If the element isn't displayed, an intersection can't happen.\n  if (window.getComputedStyle(target).display == 'none') return;\n\n  var targetRect = getBoundingClientRect(target);\n  var intersectionRect = targetRect;\n  var parent = getParentNode(target);\n  var atRoot = false;\n\n  while (!atRoot) {\n    var parentRect = null;\n    var parentComputedStyle = parent.nodeType == 1 ?\n        window.getComputedStyle(parent) : {};\n\n    // If the parent isn't displayed, an intersection can't happen.\n    if (parentComputedStyle.display == 'none') return;\n\n    if (parent == this.root || parent == document) {\n      atRoot = true;\n      parentRect = rootRect;\n    } else {\n      // If the element has a non-visible overflow, and it's not the <body>\n      // or <html> element, update the intersection rect.\n      // Note: <body> and <html> cannot be clipped to a rect that's not also\n      // the document rect, so no need to compute a new intersection.\n      if (parent != document.body &&\n          parent != document.documentElement &&\n          parentComputedStyle.overflow != 'visible') {\n        parentRect = getBoundingClientRect(parent);\n      }\n    }\n\n    // If either of the above conditionals set a new parentRect,\n    // calculate new intersection data.\n    if (parentRect) {\n      intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n\n      if (!intersectionRect) break;\n    }\n    parent = getParentNode(parent);\n  }\n  return intersectionRect;\n};\n\n\n/**\n * Returns the root rect after being expanded by the rootMargin value.\n * @return {Object} The expanded root rect.\n * @private\n */\nIntersectionObserver.prototype._getRootRect = function() {\n  var rootRect;\n  if (this.root) {\n    rootRect = getBoundingClientRect(this.root);\n  } else {\n    // Use <html>/<body> instead of window since scroll bars affect size.\n    var html = document.documentElement;\n    var body = document.body;\n    rootRect = {\n      top: 0,\n      left: 0,\n      right: html.clientWidth || body.clientWidth,\n      width: html.clientWidth || body.clientWidth,\n      bottom: html.clientHeight || body.clientHeight,\n      height: html.clientHeight || body.clientHeight\n    };\n  }\n  return this._expandRectByRootMargin(rootRect);\n};\n\n\n/**\n * Accepts a rect and expands it by the rootMargin value.\n * @param {Object} rect The rect object to expand.\n * @return {Object} The expanded rect.\n * @private\n */\nIntersectionObserver.prototype._expandRectByRootMargin = function(rect) {\n  var margins = this._rootMarginValues.map(function(margin, i) {\n    return margin.unit == 'px' ? margin.value :\n        margin.value * (i % 2 ? rect.width : rect.height) / 100;\n  });\n  var newRect = {\n    top: rect.top - margins[0],\n    right: rect.right + margins[1],\n    bottom: rect.bottom + margins[2],\n    left: rect.left - margins[3]\n  };\n  newRect.width = newRect.right - newRect.left;\n  newRect.height = newRect.bottom - newRect.top;\n\n  return newRect;\n};\n\n\n/**\n * Accepts an old and new entry and returns true if at least one of the\n * threshold values has been crossed.\n * @param {?IntersectionObserverEntry} oldEntry The previous entry for a\n *    particular target element or null if no previous entry exists.\n * @param {IntersectionObserverEntry} newEntry The current entry for a\n *    particular target element.\n * @return {boolean} Returns true if a any threshold has been crossed.\n * @private\n */\nIntersectionObserver.prototype._hasCrossedThreshold =\n    function(oldEntry, newEntry) {\n\n  // To make comparing easier, an entry that has a ratio of 0\n  // but does not actually intersect is given a value of -1\n  var oldRatio = oldEntry && oldEntry.isIntersecting ?\n      oldEntry.intersectionRatio || 0 : -1;\n  var newRatio = newEntry.isIntersecting ?\n      newEntry.intersectionRatio || 0 : -1;\n\n  // Ignore unchanged ratios\n  if (oldRatio === newRatio) return;\n\n  for (var i = 0; i < this.thresholds.length; i++) {\n    var threshold = this.thresholds[i];\n\n    // Return true if an entry matches a threshold or if the new ratio\n    // and the old ratio are on the opposite sides of a threshold.\n    if (threshold == oldRatio || threshold == newRatio ||\n        threshold < oldRatio !== threshold < newRatio) {\n      return true;\n    }\n  }\n};\n\n\n/**\n * Returns whether or not the root element is an element and is in the DOM.\n * @return {boolean} True if the root element is an element and is in the DOM.\n * @private\n */\nIntersectionObserver.prototype._rootIsInDom = function() {\n  return !this.root || containsDeep(document, this.root);\n};\n\n\n/**\n * Returns whether or not the target element is a child of root.\n * @param {Element} target The target element to check.\n * @return {boolean} True if the target element is a child of root.\n * @private\n */\nIntersectionObserver.prototype._rootContainsTarget = function(target) {\n  return containsDeep(this.root || document, target);\n};\n\n\n/**\n * Adds the instance to the global IntersectionObserver registry if it isn't\n * already present.\n * @private\n */\nIntersectionObserver.prototype._registerInstance = function() {\n  if (registry.indexOf(this) < 0) {\n    registry.push(this);\n  }\n};\n\n\n/**\n * Removes the instance from the global IntersectionObserver registry.\n * @private\n */\nIntersectionObserver.prototype._unregisterInstance = function() {\n  var index = registry.indexOf(this);\n  if (index != -1) registry.splice(index, 1);\n};\n\n\n/**\n * Returns the result of the performance.now() method or null in browsers\n * that don't support the API.\n * @return {number} The elapsed time since the page was requested.\n */\nfunction now() {\n  return window.performance && performance.now && performance.now();\n}\n\n\n/**\n * Throttles a function and delays its execution, so it's only called at most\n * once within a given time period.\n * @param {Function} fn The function to throttle.\n * @param {number} timeout The amount of time that must pass before the\n *     function can be called again.\n * @return {Function} The throttled function.\n */\nfunction throttle(fn, timeout) {\n  var timer = null;\n  return function () {\n    if (!timer) {\n      timer = setTimeout(function() {\n        fn();\n        timer = null;\n      }, timeout);\n    }\n  };\n}\n\n\n/**\n * Adds an event handler to a DOM node ensuring cross-browser compatibility.\n * @param {Node} node The DOM node to add the event handler to.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to add.\n * @param {boolean} opt_useCapture Optionally adds the even to the capture\n *     phase. Note: this only works in modern browsers.\n */\nfunction addEvent(node, event, fn, opt_useCapture) {\n  if (typeof node.addEventListener == 'function') {\n    node.addEventListener(event, fn, opt_useCapture || false);\n  }\n  else if (typeof node.attachEvent == 'function') {\n    node.attachEvent('on' + event, fn);\n  }\n}\n\n\n/**\n * Removes a previously added event handler from a DOM node.\n * @param {Node} node The DOM node to remove the event handler from.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to remove.\n * @param {boolean} opt_useCapture If the event handler was added with this\n *     flag set to true, it should be set to true here in order to remove it.\n */\nfunction removeEvent(node, event, fn, opt_useCapture) {\n  if (typeof node.removeEventListener == 'function') {\n    node.removeEventListener(event, fn, opt_useCapture || false);\n  }\n  else if (typeof node.detatchEvent == 'function') {\n    node.detatchEvent('on' + event, fn);\n  }\n}\n\n\n/**\n * Returns the intersection between two rect objects.\n * @param {Object} rect1 The first rect.\n * @param {Object} rect2 The second rect.\n * @return {?Object} The intersection rect or undefined if no intersection\n *     is found.\n */\nfunction computeRectIntersection(rect1, rect2) {\n  var top = Math.max(rect1.top, rect2.top);\n  var bottom = Math.min(rect1.bottom, rect2.bottom);\n  var left = Math.max(rect1.left, rect2.left);\n  var right = Math.min(rect1.right, rect2.right);\n  var width = right - left;\n  var height = bottom - top;\n\n  return (width >= 0 && height >= 0) && {\n    top: top,\n    bottom: bottom,\n    left: left,\n    right: right,\n    width: width,\n    height: height\n  };\n}\n\n\n/**\n * Shims the native getBoundingClientRect for compatibility with older IE.\n * @param {Element} el The element whose bounding rect to get.\n * @return {Object} The (possibly shimmed) rect of the element.\n */\nfunction getBoundingClientRect(el) {\n  var rect;\n\n  try {\n    rect = el.getBoundingClientRect();\n  } catch (err) {\n    // Ignore Windows 7 IE11 \"Unspecified error\"\n    // https://github.com/w3c/IntersectionObserver/pull/205\n  }\n\n  if (!rect) return getEmptyRect();\n\n  // Older IE\n  if (!(rect.width && rect.height)) {\n    rect = {\n      top: rect.top,\n      right: rect.right,\n      bottom: rect.bottom,\n      left: rect.left,\n      width: rect.right - rect.left,\n      height: rect.bottom - rect.top\n    };\n  }\n  return rect;\n}\n\n\n/**\n * Returns an empty rect object. An empty rect is returned when an element\n * is not in the DOM.\n * @return {Object} The empty rect.\n */\nfunction getEmptyRect() {\n  return {\n    top: 0,\n    bottom: 0,\n    left: 0,\n    right: 0,\n    width: 0,\n    height: 0\n  };\n}\n\n/**\n * Checks to see if a parent element contains a child element (including inside\n * shadow DOM).\n * @param {Node} parent The parent element.\n * @param {Node} child The child element.\n * @return {boolean} True if the parent node contains the child node.\n */\nfunction containsDeep(parent, child) {\n  var node = child;\n  while (node) {\n    if (node == parent) return true;\n\n    node = getParentNode(node);\n  }\n  return false;\n}\n\n\n/**\n * Gets the parent node of an element or its host element if the parent node\n * is a shadow root.\n * @param {Node} node The node whose parent to get.\n * @return {Node|null} The parent node or null if no parent exists.\n */\nfunction getParentNode(node) {\n  var parent = node.parentNode;\n\n  if (parent && parent.nodeType == 11 && parent.host) {\n    // If the parent is a shadow root, return the host element.\n    return parent.host;\n  }\n  return parent;\n}\n\n\n// Exposes the constructors globally.\nwindow.IntersectionObserver = IntersectionObserver;\nwindow.IntersectionObserverEntry = IntersectionObserverEntry;\n\n}(window, document));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaW50ZXJzZWN0aW9uLW9ic2VydmVyL2ludGVyc2VjdGlvbi1vYnNlcnZlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvaW50ZXJzZWN0aW9uLW9ic2VydmVyL2ludGVyc2VjdGlvbi1vYnNlcnZlci5qcz81YWJlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgVzNDIFNPRlRXQVJFIEFORCBET0NVTUVOVCBOT1RJQ0UgQU5EIExJQ0VOU0UuXG4gKlxuICogIGh0dHBzOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMTUvY29weXJpZ2h0LXNvZnR3YXJlLWFuZC1kb2N1bWVudFxuICpcbiAqL1xuXG4oZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCkge1xuJ3VzZSBzdHJpY3QnO1xuXG5cbi8vIEV4aXRzIGVhcmx5IGlmIGFsbCBJbnRlcnNlY3Rpb25PYnNlcnZlciBhbmQgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVxuLy8gZmVhdHVyZXMgYXJlIG5hdGl2ZWx5IHN1cHBvcnRlZC5cbmlmICgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdyAmJlxuICAgICdJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5JyBpbiB3aW5kb3cgJiZcbiAgICAnaW50ZXJzZWN0aW9uUmF0aW8nIGluIHdpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5LnByb3RvdHlwZSkge1xuXG4gIC8vIE1pbmltYWwgcG9seWZpbGwgZm9yIEVkZ2UgMTUncyBsYWNrIG9mIGBpc0ludGVyc2VjdGluZ2BcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdzNjL0ludGVyc2VjdGlvbk9ic2VydmVyL2lzc3Vlcy8yMTFcbiAgaWYgKCEoJ2lzSW50ZXJzZWN0aW5nJyBpbiB3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeS5wcm90b3R5cGUpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5LnByb3RvdHlwZSxcbiAgICAgICdpc0ludGVyc2VjdGluZycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb25SYXRpbyA+IDA7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5cbi8qKlxuICogQW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgcmVnaXN0cnkuIFRoaXMgcmVnaXN0cnkgZXhpc3RzIHRvIGhvbGQgYSBzdHJvbmdcbiAqIHJlZmVyZW5jZSB0byBJbnRlcnNlY3Rpb25PYnNlcnZlciBpbnN0YW5jZXMgY3VycmVudGx5IG9ic2VydmluZyBhIHRhcmdldFxuICogZWxlbWVudC4gV2l0aG91dCB0aGlzIHJlZ2lzdHJ5LCBpbnN0YW5jZXMgd2l0aG91dCBhbm90aGVyIHJlZmVyZW5jZSBtYXkgYmVcbiAqIGdhcmJhZ2UgY29sbGVjdGVkLlxuICovXG52YXIgcmVnaXN0cnkgPSBbXTtcblxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGdsb2JhbCBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5IGNvbnN0cnVjdG9yLlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ludGVyc2VjdGlvbk9ic2VydmVyLyNpbnRlcnNlY3Rpb24tb2JzZXJ2ZXItZW50cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbnRyeSBBIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgcHJvcGVydGllcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5KGVudHJ5KSB7XG4gIHRoaXMudGltZSA9IGVudHJ5LnRpbWU7XG4gIHRoaXMudGFyZ2V0ID0gZW50cnkudGFyZ2V0O1xuICB0aGlzLnJvb3RCb3VuZHMgPSBlbnRyeS5yb290Qm91bmRzO1xuICB0aGlzLmJvdW5kaW5nQ2xpZW50UmVjdCA9IGVudHJ5LmJvdW5kaW5nQ2xpZW50UmVjdDtcbiAgdGhpcy5pbnRlcnNlY3Rpb25SZWN0ID0gZW50cnkuaW50ZXJzZWN0aW9uUmVjdCB8fCBnZXRFbXB0eVJlY3QoKTtcbiAgdGhpcy5pc0ludGVyc2VjdGluZyA9ICEhZW50cnkuaW50ZXJzZWN0aW9uUmVjdDtcblxuICAvLyBDYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gcmF0aW8uXG4gIHZhciB0YXJnZXRSZWN0ID0gdGhpcy5ib3VuZGluZ0NsaWVudFJlY3Q7XG4gIHZhciB0YXJnZXRBcmVhID0gdGFyZ2V0UmVjdC53aWR0aCAqIHRhcmdldFJlY3QuaGVpZ2h0O1xuICB2YXIgaW50ZXJzZWN0aW9uUmVjdCA9IHRoaXMuaW50ZXJzZWN0aW9uUmVjdDtcbiAgdmFyIGludGVyc2VjdGlvbkFyZWEgPSBpbnRlcnNlY3Rpb25SZWN0LndpZHRoICogaW50ZXJzZWN0aW9uUmVjdC5oZWlnaHQ7XG5cbiAgLy8gU2V0cyBpbnRlcnNlY3Rpb24gcmF0aW8uXG4gIGlmICh0YXJnZXRBcmVhKSB7XG4gICAgLy8gUm91bmQgdGhlIGludGVyc2VjdGlvbiByYXRpbyB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBtYXRoIGlzc3VlczpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL0ludGVyc2VjdGlvbk9ic2VydmVyL2lzc3Vlcy8zMjRcbiAgICB0aGlzLmludGVyc2VjdGlvblJhdGlvID0gTnVtYmVyKChpbnRlcnNlY3Rpb25BcmVhIC8gdGFyZ2V0QXJlYSkudG9GaXhlZCg0KSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYXJlYSBpcyB6ZXJvIGFuZCBpcyBpbnRlcnNlY3RpbmcsIHNldHMgdG8gMSwgb3RoZXJ3aXNlIHRvIDBcbiAgICB0aGlzLmludGVyc2VjdGlvblJhdGlvID0gdGhpcy5pc0ludGVyc2VjdGluZyA/IDEgOiAwO1xuICB9XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBnbG9iYWwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY29uc3RydWN0b3IuXG4gKiBodHRwczovL3czYy5naXRodWIuaW8vSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvI2ludGVyc2VjdGlvbi1vYnNlcnZlci1pbnRlcmZhY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIGludGVyc2VjdGlvblxuICogICAgIGNoYW5nZXMgaGF2ZSBxdWV1ZWQuIFRoZSBmdW5jdGlvbiBpcyBub3QgaW52b2tlZCBpZiB0aGUgcXVldWUgaGFzXG4gKiAgICAgYmVlbiBlbXB0aWVkIGJ5IGNhbGxpbmcgdGhlIGB0YWtlUmVjb3Jkc2AgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRfb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdF9vcHRpb25zKSB7XG5cbiAgdmFyIG9wdGlvbnMgPSBvcHRfb3B0aW9ucyB8fCB7fTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucm9vdCAmJiBvcHRpb25zLnJvb3Qubm9kZVR5cGUgIT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncm9vdCBtdXN0IGJlIGFuIEVsZW1lbnQnKTtcbiAgfVxuXG4gIC8vIEJpbmRzIGFuZCB0aHJvdHRsZXMgYHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9uc2AuXG4gIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucyA9IHRocm90dGxlKFxuICAgICAgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLmJpbmQodGhpcyksIHRoaXMuVEhST1RUTEVfVElNRU9VVCk7XG5cbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzLlxuICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXTtcbiAgdGhpcy5fcXVldWVkRW50cmllcyA9IFtdO1xuICB0aGlzLl9yb290TWFyZ2luVmFsdWVzID0gdGhpcy5fcGFyc2VSb290TWFyZ2luKG9wdGlvbnMucm9vdE1hcmdpbik7XG5cbiAgLy8gUHVibGljIHByb3BlcnRpZXMuXG4gIHRoaXMudGhyZXNob2xkcyA9IHRoaXMuX2luaXRUaHJlc2hvbGRzKG9wdGlvbnMudGhyZXNob2xkKTtcbiAgdGhpcy5yb290ID0gb3B0aW9ucy5yb290IHx8IG51bGw7XG4gIHRoaXMucm9vdE1hcmdpbiA9IHRoaXMuX3Jvb3RNYXJnaW5WYWx1ZXMubWFwKGZ1bmN0aW9uKG1hcmdpbikge1xuICAgIHJldHVybiBtYXJnaW4udmFsdWUgKyBtYXJnaW4udW5pdDtcbiAgfSkuam9pbignICcpO1xufVxuXG5cbi8qKlxuICogVGhlIG1pbmltdW0gaW50ZXJ2YWwgd2l0aGluIHdoaWNoIHRoZSBkb2N1bWVudCB3aWxsIGJlIGNoZWNrZWQgZm9yXG4gKiBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlRIUk9UVExFX1RJTUVPVVQgPSAxMDA7XG5cblxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGluIHdoaWNoIHRoZSBwb2x5ZmlsbCBwb2xscyBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKiB0aGlzIGNhbiBiZSB1cGRhdGVkIG9uIGEgcGVyIGluc3RhbmNlIGJhc2lzIGFuZCBtdXN0IGJlIHNldCBwcmlvciB0b1xuICogY2FsbGluZyBgb2JzZXJ2ZWAgb24gdGhlIGZpcnN0IHRhcmdldC5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlBPTExfSU5URVJWQUwgPSBudWxsO1xuXG4vKipcbiAqIFVzZSBhIG11dGF0aW9uIG9ic2VydmVyIG9uIHRoZSByb290IGVsZW1lbnRcbiAqIHRvIGRldGVjdCBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlVTRV9NVVRBVElPTl9PQlNFUlZFUiA9IHRydWU7XG5cblxuLyoqXG4gKiBTdGFydHMgb2JzZXJ2aW5nIGEgdGFyZ2V0IGVsZW1lbnQgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzIGJhc2VkIG9uXG4gKiB0aGUgdGhyZXNob2xkcyB2YWx1ZXMuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBUaGUgRE9NIGVsZW1lbnQgdG8gb2JzZXJ2ZS5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgdmFyIGlzVGFyZ2V0QWxyZWFkeU9ic2VydmVkID0gdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiBpdGVtLmVsZW1lbnQgPT0gdGFyZ2V0O1xuICB9KTtcblxuICBpZiAoaXNUYXJnZXRBbHJlYWR5T2JzZXJ2ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoISh0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVUeXBlID09IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBFbGVtZW50Jyk7XG4gIH1cblxuICB0aGlzLl9yZWdpc3Rlckluc3RhbmNlKCk7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5wdXNoKHtlbGVtZW50OiB0YXJnZXQsIGVudHJ5OiBudWxsfSk7XG4gIHRoaXMuX21vbml0b3JJbnRlcnNlY3Rpb25zKCk7XG4gIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucygpO1xufTtcblxuXG4vKipcbiAqIFN0b3BzIG9ic2VydmluZyBhIHRhcmdldCBlbGVtZW50IGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSBET00gZWxlbWVudCB0byBvYnNlcnZlLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUudW5vYnNlcnZlID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cyA9XG4gICAgICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcblxuICAgIHJldHVybiBpdGVtLmVsZW1lbnQgIT0gdGFyZ2V0O1xuICB9KTtcbiAgaWYgKCF0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMubGVuZ3RoKSB7XG4gICAgdGhpcy5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucygpO1xuICAgIHRoaXMuX3VucmVnaXN0ZXJJbnN0YW5jZSgpO1xuICB9XG59O1xuXG5cbi8qKlxuICogU3RvcHMgb2JzZXJ2aW5nIGFsbCB0YXJnZXQgZWxlbWVudHMgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXTtcbiAgdGhpcy5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucygpO1xuICB0aGlzLl91bnJlZ2lzdGVySW5zdGFuY2UoKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFueSBxdWV1ZSBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gcmVwb3J0ZWQgdG8gdGhlXG4gKiBjYWxsYmFjayBhbmQgY2xlYXJzIHRoZSBxdWV1ZS4gVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZVxuICogY2FsbGJhY2sgdG8gb2J0YWluIHRoZSBhYnNvbHV0ZSBtb3N0IHVwLXRvLWRhdGUgaW50ZXJzZWN0aW9uIGluZm9ybWF0aW9uLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBjdXJyZW50bHkgcXVldWVkIGVudHJpZXMuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS50YWtlUmVjb3JkcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVjb3JkcyA9IHRoaXMuX3F1ZXVlZEVudHJpZXMuc2xpY2UoKTtcbiAgdGhpcy5fcXVldWVkRW50cmllcyA9IFtdO1xuICByZXR1cm4gcmVjb3Jkcztcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZnJvbSB0aGUgdXNlciBjb25maWd1cmF0aW9uIG9iamVjdCBhbmRcbiAqIHJldHVybnMgYSBzb3J0ZWQgYXJyYXkgb2YgdW5pcXVlIHRocmVzaG9sZCB2YWx1ZXMuIElmIGEgdmFsdWUgaXMgbm90XG4gKiBiZXR3ZWVuIDAgYW5kIDEgYW5kIGVycm9yIGlzIHRocm93bi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fG51bWJlcj19IG9wdF90aHJlc2hvbGQgQW4gb3B0aW9uYWwgdGhyZXNob2xkIHZhbHVlIG9yXG4gKiAgICAgYSBsaXN0IG9mIHRocmVzaG9sZCB2YWx1ZXMsIGRlZmF1bHRpbmcgdG8gWzBdLlxuICogQHJldHVybiB7QXJyYXl9IEEgc29ydGVkIGxpc3Qgb2YgdW5pcXVlIGFuZCB2YWxpZCB0aHJlc2hvbGQgdmFsdWVzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2luaXRUaHJlc2hvbGRzID0gZnVuY3Rpb24ob3B0X3RocmVzaG9sZCkge1xuICB2YXIgdGhyZXNob2xkID0gb3B0X3RocmVzaG9sZCB8fCBbMF07XG4gIGlmICghQXJyYXkuaXNBcnJheSh0aHJlc2hvbGQpKSB0aHJlc2hvbGQgPSBbdGhyZXNob2xkXTtcblxuICByZXR1cm4gdGhyZXNob2xkLnNvcnQoKS5maWx0ZXIoZnVuY3Rpb24odCwgaSwgYSkge1xuICAgIGlmICh0eXBlb2YgdCAhPSAnbnVtYmVyJyB8fCBpc05hTih0KSB8fCB0IDwgMCB8fCB0ID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlbHknKTtcbiAgICB9XG4gICAgcmV0dXJuIHQgIT09IGFbaSAtIDFdO1xuICB9KTtcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIHRoZSByb290TWFyZ2luIHZhbHVlIGZyb20gdGhlIHVzZXIgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBmb3VyIG1hcmdpbiB2YWx1ZXMgYXMgYW4gb2JqZWN0IGNvbnRhaW5pbmdcbiAqIHRoZSB2YWx1ZSBhbmQgdW5pdCBwcm9wZXJ0aWVzLiBJZiBhbnkgb2YgdGhlIHZhbHVlcyBhcmUgbm90IHByb3Blcmx5XG4gKiBmb3JtYXR0ZWQgb3IgdXNlIGEgdW5pdCBvdGhlciB0aGFuIHB4IG9yICUsIGFuZCBlcnJvciBpcyB0aHJvd24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHRfcm9vdE1hcmdpbiBBbiBvcHRpb25hbCByb290TWFyZ2luIHZhbHVlLFxuICogICAgIGRlZmF1bHRpbmcgdG8gJzBweCcuXG4gKiBAcmV0dXJuIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBtYXJnaW4gb2JqZWN0cyB3aXRoIHRoZSBrZXlzXG4gKiAgICAgdmFsdWUgYW5kIHVuaXQuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcGFyc2VSb290TWFyZ2luID0gZnVuY3Rpb24ob3B0X3Jvb3RNYXJnaW4pIHtcbiAgdmFyIG1hcmdpblN0cmluZyA9IG9wdF9yb290TWFyZ2luIHx8ICcwcHgnO1xuICB2YXIgbWFyZ2lucyA9IG1hcmdpblN0cmluZy5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihtYXJnaW4pIHtcbiAgICB2YXIgcGFydHMgPSAvXigtP1xcZCpcXC4/XFxkKykocHh8JSkkLy5leGVjKG1hcmdpbik7XG4gICAgaWYgKCFwYXJ0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb290TWFyZ2luIG11c3QgYmUgc3BlY2lmaWVkIGluIHBpeGVscyBvciBwZXJjZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IHBhcnNlRmxvYXQocGFydHNbMV0pLCB1bml0OiBwYXJ0c1syXX07XG4gIH0pO1xuXG4gIC8vIEhhbmRsZXMgc2hvcnRoYW5kLlxuICBtYXJnaW5zWzFdID0gbWFyZ2luc1sxXSB8fCBtYXJnaW5zWzBdO1xuICBtYXJnaW5zWzJdID0gbWFyZ2luc1syXSB8fCBtYXJnaW5zWzBdO1xuICBtYXJnaW5zWzNdID0gbWFyZ2luc1szXSB8fCBtYXJnaW5zWzFdO1xuXG4gIHJldHVybiBtYXJnaW5zO1xufTtcblxuXG4vKipcbiAqIFN0YXJ0cyBwb2xsaW5nIGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcyBpZiB0aGUgcG9sbGluZyBpcyBub3QgYWxyZWFkeVxuICogaGFwcGVuaW5nLCBhbmQgaWYgdGhlIHBhZ2UncyB2aXNpYmlsaXR5IHN0YXRlIGlzIHZpc2libGUuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX21vbml0b3JJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5fbW9uaXRvcmluZ0ludGVyc2VjdGlvbnMpIHtcbiAgICB0aGlzLl9tb25pdG9yaW5nSW50ZXJzZWN0aW9ucyA9IHRydWU7XG5cbiAgICAvLyBJZiBhIHBvbGwgaW50ZXJ2YWwgaXMgc2V0LCB1c2UgcG9sbGluZyBpbnN0ZWFkIG9mIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlc2l6ZSBhbmQgc2Nyb2xsIGV2ZW50cyBvciBET00gbXV0YXRpb25zLlxuICAgIGlmICh0aGlzLlBPTExfSU5URVJWQUwpIHtcbiAgICAgIHRoaXMuX21vbml0b3JpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKFxuICAgICAgICAgIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucywgdGhpcy5QT0xMX0lOVEVSVkFMKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhZGRFdmVudCh3aW5kb3csICdyZXNpemUnLCB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMsIHRydWUpO1xuICAgICAgYWRkRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnLCB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMsIHRydWUpO1xuXG4gICAgICBpZiAodGhpcy5VU0VfTVVUQVRJT05fT0JTRVJWRVIgJiYgJ011dGF0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdykge1xuICAgICAgICB0aGlzLl9kb21PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucyk7XG4gICAgICAgIHRoaXMuX2RvbU9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5cbi8qKlxuICogU3RvcHMgcG9sbGluZyBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX3VubW9uaXRvckludGVyc2VjdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX21vbml0b3JpbmdJbnRlcnNlY3Rpb25zKSB7XG4gICAgdGhpcy5fbW9uaXRvcmluZ0ludGVyc2VjdGlvbnMgPSBmYWxzZTtcblxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fbW9uaXRvcmluZ0ludGVydmFsKTtcbiAgICB0aGlzLl9tb25pdG9yaW5nSW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgcmVtb3ZlRXZlbnQod2luZG93LCAncmVzaXplJywgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLCB0cnVlKTtcbiAgICByZW1vdmVFdmVudChkb2N1bWVudCwgJ3Njcm9sbCcsIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucywgdHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5fZG9tT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX2RvbU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuX2RvbU9ic2VydmVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiBTY2FucyBlYWNoIG9ic2VydmF0aW9uIHRhcmdldCBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMgYW5kIGFkZHMgdGhlbVxuICogdG8gdGhlIGludGVybmFsIGVudHJpZXMgcXVldWUuIElmIG5ldyBlbnRyaWVzIGFyZSBmb3VuZCwgaXRcbiAqIHNjaGVkdWxlcyB0aGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24oKSB7XG4gIHZhciByb290SXNJbkRvbSA9IHRoaXMuX3Jvb3RJc0luRG9tKCk7XG4gIHZhciByb290UmVjdCA9IHJvb3RJc0luRG9tID8gdGhpcy5fZ2V0Um9vdFJlY3QoKSA6IGdldEVtcHR5UmVjdCgpO1xuXG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICB2YXIgdGFyZ2V0ID0gaXRlbS5lbGVtZW50O1xuICAgIHZhciB0YXJnZXRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRhcmdldCk7XG4gICAgdmFyIHJvb3RDb250YWluc1RhcmdldCA9IHRoaXMuX3Jvb3RDb250YWluc1RhcmdldCh0YXJnZXQpO1xuICAgIHZhciBvbGRFbnRyeSA9IGl0ZW0uZW50cnk7XG4gICAgdmFyIGludGVyc2VjdGlvblJlY3QgPSByb290SXNJbkRvbSAmJiByb290Q29udGFpbnNUYXJnZXQgJiZcbiAgICAgICAgdGhpcy5fY29tcHV0ZVRhcmdldEFuZFJvb3RJbnRlcnNlY3Rpb24odGFyZ2V0LCByb290UmVjdCk7XG5cbiAgICB2YXIgbmV3RW50cnkgPSBpdGVtLmVudHJ5ID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkoe1xuICAgICAgdGltZTogbm93KCksXG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIGJvdW5kaW5nQ2xpZW50UmVjdDogdGFyZ2V0UmVjdCxcbiAgICAgIHJvb3RCb3VuZHM6IHJvb3RSZWN0LFxuICAgICAgaW50ZXJzZWN0aW9uUmVjdDogaW50ZXJzZWN0aW9uUmVjdFxuICAgIH0pO1xuXG4gICAgaWYgKCFvbGRFbnRyeSkge1xuICAgICAgdGhpcy5fcXVldWVkRW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICB9IGVsc2UgaWYgKHJvb3RJc0luRG9tICYmIHJvb3RDb250YWluc1RhcmdldCkge1xuICAgICAgLy8gSWYgdGhlIG5ldyBlbnRyeSBpbnRlcnNlY3Rpb24gcmF0aW8gaGFzIGNyb3NzZWQgYW55IG9mIHRoZVxuICAgICAgLy8gdGhyZXNob2xkcywgYWRkIGEgbmV3IGVudHJ5LlxuICAgICAgaWYgKHRoaXMuX2hhc0Nyb3NzZWRUaHJlc2hvbGQob2xkRW50cnksIG5ld0VudHJ5KSkge1xuICAgICAgICB0aGlzLl9xdWV1ZWRFbnRyaWVzLnB1c2gobmV3RW50cnkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgcm9vdCBpcyBub3QgaW4gdGhlIERPTSBvciB0YXJnZXQgaXMgbm90IGNvbnRhaW5lZCB3aXRoaW5cbiAgICAgIC8vIHJvb3QgYnV0IHRoZSBwcmV2aW91cyBlbnRyeSBmb3IgdGhpcyB0YXJnZXQgaGFkIGFuIGludGVyc2VjdGlvbixcbiAgICAgIC8vIGFkZCBhIG5ldyByZWNvcmQgaW5kaWNhdGluZyByZW1vdmFsLlxuICAgICAgaWYgKG9sZEVudHJ5ICYmIG9sZEVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlZEVudHJpZXMucHVzaChuZXdFbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB0aGlzKTtcblxuICBpZiAodGhpcy5fcXVldWVkRW50cmllcy5sZW5ndGgpIHtcbiAgICB0aGlzLl9jYWxsYmFjayh0aGlzLnRha2VSZWNvcmRzKCksIHRoaXMpO1xuICB9XG59O1xuXG5cbi8qKlxuICogQWNjZXB0cyBhIHRhcmdldCBhbmQgcm9vdCByZWN0IGNvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGVuXG4gKiBmb2xsb3dpbmcgdGhlIGFsZ29yaXRobSBpbiB0aGUgc3BlYy5cbiAqIFRPRE8ocGhpbGlwd2FsdG9uKTogYXQgdGhpcyB0aW1lIGNsaXAtcGF0aCBpcyBub3QgY29uc2lkZXJlZC5cbiAqIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9JbnRlcnNlY3Rpb25PYnNlcnZlci8jY2FsY3VsYXRlLWludGVyc2VjdGlvbi1yZWN0LWFsZ29cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSB0YXJnZXQgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSByb290UmVjdCBUaGUgYm91bmRpbmcgcmVjdCBvZiB0aGUgcm9vdCBhZnRlciBiZWluZ1xuICogICAgIGV4cGFuZGVkIGJ5IHRoZSByb290TWFyZ2luIHZhbHVlLlxuICogQHJldHVybiB7P09iamVjdH0gVGhlIGZpbmFsIGludGVyc2VjdGlvbiByZWN0IG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm9cbiAqICAgICBpbnRlcnNlY3Rpb24gaXMgZm91bmQuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2NvbXB1dGVUYXJnZXRBbmRSb290SW50ZXJzZWN0aW9uID1cbiAgICBmdW5jdGlvbih0YXJnZXQsIHJvb3RSZWN0KSB7XG5cbiAgLy8gSWYgdGhlIGVsZW1lbnQgaXNuJ3QgZGlzcGxheWVkLCBhbiBpbnRlcnNlY3Rpb24gY2FuJ3QgaGFwcGVuLlxuICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5kaXNwbGF5ID09ICdub25lJykgcmV0dXJuO1xuXG4gIHZhciB0YXJnZXRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRhcmdldCk7XG4gIHZhciBpbnRlcnNlY3Rpb25SZWN0ID0gdGFyZ2V0UmVjdDtcbiAgdmFyIHBhcmVudCA9IGdldFBhcmVudE5vZGUodGFyZ2V0KTtcbiAgdmFyIGF0Um9vdCA9IGZhbHNlO1xuXG4gIHdoaWxlICghYXRSb290KSB7XG4gICAgdmFyIHBhcmVudFJlY3QgPSBudWxsO1xuICAgIHZhciBwYXJlbnRDb21wdXRlZFN0eWxlID0gcGFyZW50Lm5vZGVUeXBlID09IDEgP1xuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpIDoge307XG5cbiAgICAvLyBJZiB0aGUgcGFyZW50IGlzbid0IGRpc3BsYXllZCwgYW4gaW50ZXJzZWN0aW9uIGNhbid0IGhhcHBlbi5cbiAgICBpZiAocGFyZW50Q29tcHV0ZWRTdHlsZS5kaXNwbGF5ID09ICdub25lJykgcmV0dXJuO1xuXG4gICAgaWYgKHBhcmVudCA9PSB0aGlzLnJvb3QgfHwgcGFyZW50ID09IGRvY3VtZW50KSB7XG4gICAgICBhdFJvb3QgPSB0cnVlO1xuICAgICAgcGFyZW50UmVjdCA9IHJvb3RSZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBub24tdmlzaWJsZSBvdmVyZmxvdywgYW5kIGl0J3Mgbm90IHRoZSA8Ym9keT5cbiAgICAgIC8vIG9yIDxodG1sPiBlbGVtZW50LCB1cGRhdGUgdGhlIGludGVyc2VjdGlvbiByZWN0LlxuICAgICAgLy8gTm90ZTogPGJvZHk+IGFuZCA8aHRtbD4gY2Fubm90IGJlIGNsaXBwZWQgdG8gYSByZWN0IHRoYXQncyBub3QgYWxzb1xuICAgICAgLy8gdGhlIGRvY3VtZW50IHJlY3QsIHNvIG5vIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBpbnRlcnNlY3Rpb24uXG4gICAgICBpZiAocGFyZW50ICE9IGRvY3VtZW50LmJvZHkgJiZcbiAgICAgICAgICBwYXJlbnQgIT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmXG4gICAgICAgICAgcGFyZW50Q29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPSAndmlzaWJsZScpIHtcbiAgICAgICAgcGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBvZiB0aGUgYWJvdmUgY29uZGl0aW9uYWxzIHNldCBhIG5ldyBwYXJlbnRSZWN0LFxuICAgIC8vIGNhbGN1bGF0ZSBuZXcgaW50ZXJzZWN0aW9uIGRhdGEuXG4gICAgaWYgKHBhcmVudFJlY3QpIHtcbiAgICAgIGludGVyc2VjdGlvblJlY3QgPSBjb21wdXRlUmVjdEludGVyc2VjdGlvbihwYXJlbnRSZWN0LCBpbnRlcnNlY3Rpb25SZWN0KTtcblxuICAgICAgaWYgKCFpbnRlcnNlY3Rpb25SZWN0KSBicmVhaztcbiAgICB9XG4gICAgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZShwYXJlbnQpO1xuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25SZWN0O1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJvb3QgcmVjdCBhZnRlciBiZWluZyBleHBhbmRlZCBieSB0aGUgcm9vdE1hcmdpbiB2YWx1ZS5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGV4cGFuZGVkIHJvb3QgcmVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fZ2V0Um9vdFJlY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3RSZWN0O1xuICBpZiAodGhpcy5yb290KSB7XG4gICAgcm9vdFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy5yb290KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgPGh0bWw+Lzxib2R5PiBpbnN0ZWFkIG9mIHdpbmRvdyBzaW5jZSBzY3JvbGwgYmFycyBhZmZlY3Qgc2l6ZS5cbiAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgcm9vdFJlY3QgPSB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6IGh0bWwuY2xpZW50V2lkdGggfHwgYm9keS5jbGllbnRXaWR0aCxcbiAgICAgIHdpZHRoOiBodG1sLmNsaWVudFdpZHRoIHx8IGJvZHkuY2xpZW50V2lkdGgsXG4gICAgICBib3R0b206IGh0bWwuY2xpZW50SGVpZ2h0IHx8IGJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgaGVpZ2h0OiBodG1sLmNsaWVudEhlaWdodCB8fCBib2R5LmNsaWVudEhlaWdodFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2V4cGFuZFJlY3RCeVJvb3RNYXJnaW4ocm9vdFJlY3QpO1xufTtcblxuXG4vKipcbiAqIEFjY2VwdHMgYSByZWN0IGFuZCBleHBhbmRzIGl0IGJ5IHRoZSByb290TWFyZ2luIHZhbHVlLlxuICogQHBhcmFtIHtPYmplY3R9IHJlY3QgVGhlIHJlY3Qgb2JqZWN0IHRvIGV4cGFuZC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGV4cGFuZGVkIHJlY3QuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2V4cGFuZFJlY3RCeVJvb3RNYXJnaW4gPSBmdW5jdGlvbihyZWN0KSB7XG4gIHZhciBtYXJnaW5zID0gdGhpcy5fcm9vdE1hcmdpblZhbHVlcy5tYXAoZnVuY3Rpb24obWFyZ2luLCBpKSB7XG4gICAgcmV0dXJuIG1hcmdpbi51bml0ID09ICdweCcgPyBtYXJnaW4udmFsdWUgOlxuICAgICAgICBtYXJnaW4udmFsdWUgKiAoaSAlIDIgPyByZWN0LndpZHRoIDogcmVjdC5oZWlnaHQpIC8gMTAwO1xuICB9KTtcbiAgdmFyIG5ld1JlY3QgPSB7XG4gICAgdG9wOiByZWN0LnRvcCAtIG1hcmdpbnNbMF0sXG4gICAgcmlnaHQ6IHJlY3QucmlnaHQgKyBtYXJnaW5zWzFdLFxuICAgIGJvdHRvbTogcmVjdC5ib3R0b20gKyBtYXJnaW5zWzJdLFxuICAgIGxlZnQ6IHJlY3QubGVmdCAtIG1hcmdpbnNbM11cbiAgfTtcbiAgbmV3UmVjdC53aWR0aCA9IG5ld1JlY3QucmlnaHQgLSBuZXdSZWN0LmxlZnQ7XG4gIG5ld1JlY3QuaGVpZ2h0ID0gbmV3UmVjdC5ib3R0b20gLSBuZXdSZWN0LnRvcDtcblxuICByZXR1cm4gbmV3UmVjdDtcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIGFuIG9sZCBhbmQgbmV3IGVudHJ5IGFuZCByZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZVxuICogdGhyZXNob2xkIHZhbHVlcyBoYXMgYmVlbiBjcm9zc2VkLlxuICogQHBhcmFtIHs/SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeX0gb2xkRW50cnkgVGhlIHByZXZpb3VzIGVudHJ5IGZvciBhXG4gKiAgICBwYXJ0aWN1bGFyIHRhcmdldCBlbGVtZW50IG9yIG51bGwgaWYgbm8gcHJldmlvdXMgZW50cnkgZXhpc3RzLlxuICogQHBhcmFtIHtJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5fSBuZXdFbnRyeSBUaGUgY3VycmVudCBlbnRyeSBmb3IgYVxuICogICAgcGFydGljdWxhciB0YXJnZXQgZWxlbWVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhIGFueSB0aHJlc2hvbGQgaGFzIGJlZW4gY3Jvc3NlZC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5faGFzQ3Jvc3NlZFRocmVzaG9sZCA9XG4gICAgZnVuY3Rpb24ob2xkRW50cnksIG5ld0VudHJ5KSB7XG5cbiAgLy8gVG8gbWFrZSBjb21wYXJpbmcgZWFzaWVyLCBhbiBlbnRyeSB0aGF0IGhhcyBhIHJhdGlvIG9mIDBcbiAgLy8gYnV0IGRvZXMgbm90IGFjdHVhbGx5IGludGVyc2VjdCBpcyBnaXZlbiBhIHZhbHVlIG9mIC0xXG4gIHZhciBvbGRSYXRpbyA9IG9sZEVudHJ5ICYmIG9sZEVudHJ5LmlzSW50ZXJzZWN0aW5nID9cbiAgICAgIG9sZEVudHJ5LmludGVyc2VjdGlvblJhdGlvIHx8IDAgOiAtMTtcbiAgdmFyIG5ld1JhdGlvID0gbmV3RW50cnkuaXNJbnRlcnNlY3RpbmcgP1xuICAgICAgbmV3RW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gfHwgMCA6IC0xO1xuXG4gIC8vIElnbm9yZSB1bmNoYW5nZWQgcmF0aW9zXG4gIGlmIChvbGRSYXRpbyA9PT0gbmV3UmF0aW8pIHJldHVybjtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGhyZXNob2xkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0aHJlc2hvbGQgPSB0aGlzLnRocmVzaG9sZHNbaV07XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhbiBlbnRyeSBtYXRjaGVzIGEgdGhyZXNob2xkIG9yIGlmIHRoZSBuZXcgcmF0aW9cbiAgICAvLyBhbmQgdGhlIG9sZCByYXRpbyBhcmUgb24gdGhlIG9wcG9zaXRlIHNpZGVzIG9mIGEgdGhyZXNob2xkLlxuICAgIGlmICh0aHJlc2hvbGQgPT0gb2xkUmF0aW8gfHwgdGhyZXNob2xkID09IG5ld1JhdGlvIHx8XG4gICAgICAgIHRocmVzaG9sZCA8IG9sZFJhdGlvICE9PSB0aHJlc2hvbGQgPCBuZXdSYXRpbykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcm9vdCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgYW5kIGlzIGluIHRoZSBET00uXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSByb290IGVsZW1lbnQgaXMgYW4gZWxlbWVudCBhbmQgaXMgaW4gdGhlIERPTS5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcm9vdElzSW5Eb20gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICF0aGlzLnJvb3QgfHwgY29udGFpbnNEZWVwKGRvY3VtZW50LCB0aGlzLnJvb3QpO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgY2hpbGQgb2Ygcm9vdC5cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgY2hpbGQgb2Ygcm9vdC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcm9vdENvbnRhaW5zVGFyZ2V0ID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gIHJldHVybiBjb250YWluc0RlZXAodGhpcy5yb290IHx8IGRvY3VtZW50LCB0YXJnZXQpO1xufTtcblxuXG4vKipcbiAqIEFkZHMgdGhlIGluc3RhbmNlIHRvIHRoZSBnbG9iYWwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgcmVnaXN0cnkgaWYgaXQgaXNuJ3RcbiAqIGFscmVhZHkgcHJlc2VudC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocmVnaXN0cnkuaW5kZXhPZih0aGlzKSA8IDApIHtcbiAgICByZWdpc3RyeS5wdXNoKHRoaXMpO1xuICB9XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgZ2xvYmFsIEludGVyc2VjdGlvbk9ic2VydmVyIHJlZ2lzdHJ5LlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl91bnJlZ2lzdGVySW5zdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGluZGV4ID0gcmVnaXN0cnkuaW5kZXhPZih0aGlzKTtcbiAgaWYgKGluZGV4ICE9IC0xKSByZWdpc3RyeS5zcGxpY2UoaW5kZXgsIDEpO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgcGVyZm9ybWFuY2Uubm93KCkgbWV0aG9kIG9yIG51bGwgaW4gYnJvd3NlcnNcbiAqIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgQVBJLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZWxhcHNlZCB0aW1lIHNpbmNlIHRoZSBwYWdlIHdhcyByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZS5ub3cgJiYgcGVyZm9ybWFuY2Uubm93KCk7XG59XG5cblxuLyoqXG4gKiBUaHJvdHRsZXMgYSBmdW5jdGlvbiBhbmQgZGVsYXlzIGl0cyBleGVjdXRpb24sIHNvIGl0J3Mgb25seSBjYWxsZWQgYXQgbW9zdFxuICogb25jZSB3aXRoaW4gYSBnaXZlbiB0aW1lIHBlcmlvZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IG11c3QgcGFzcyBiZWZvcmUgdGhlXG4gKiAgICAgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhZ2Fpbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmbiwgdGltZW91dCkge1xuICB2YXIgdGltZXIgPSBudWxsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGltZXIpIHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgZm4oKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9O1xufVxuXG5cbi8qKlxuICogQWRkcyBhbiBldmVudCBoYW5kbGVyIHRvIGEgRE9NIG5vZGUgZW5zdXJpbmcgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmlsaXR5LlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBET00gbm9kZSB0byBhZGQgdGhlIGV2ZW50IGhhbmRsZXIgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZXZlbnQgaGFuZGxlciB0byBhZGQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF91c2VDYXB0dXJlIE9wdGlvbmFsbHkgYWRkcyB0aGUgZXZlbiB0byB0aGUgY2FwdHVyZVxuICogICAgIHBoYXNlLiBOb3RlOiB0aGlzIG9ubHkgd29ya3MgaW4gbW9kZXJuIGJyb3dzZXJzLlxuICovXG5mdW5jdGlvbiBhZGRFdmVudChub2RlLCBldmVudCwgZm4sIG9wdF91c2VDYXB0dXJlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZS5hZGRFdmVudExpc3RlbmVyID09ICdmdW5jdGlvbicpIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCBvcHRfdXNlQ2FwdHVyZSB8fCBmYWxzZSk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIG5vZGUuYXR0YWNoRXZlbnQgPT0gJ2Z1bmN0aW9uJykge1xuICAgIG5vZGUuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBmbik7XG4gIH1cbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgYSBwcmV2aW91c2x5IGFkZGVkIGV2ZW50IGhhbmRsZXIgZnJvbSBhIERPTSBub2RlLlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBET00gbm9kZSB0byByZW1vdmUgdGhlIGV2ZW50IGhhbmRsZXIgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBldmVudCBoYW5kbGVyIHRvIHJlbW92ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0X3VzZUNhcHR1cmUgSWYgdGhlIGV2ZW50IGhhbmRsZXIgd2FzIGFkZGVkIHdpdGggdGhpc1xuICogICAgIGZsYWcgc2V0IHRvIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBoZXJlIGluIG9yZGVyIHRvIHJlbW92ZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnQobm9kZSwgZXZlbnQsIGZuLCBvcHRfdXNlQ2FwdHVyZSkge1xuICBpZiAodHlwZW9mIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgb3B0X3VzZUNhcHR1cmUgfHwgZmFsc2UpO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBub2RlLmRldGF0Y2hFdmVudCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbm9kZS5kZXRhdGNoRXZlbnQoJ29uJyArIGV2ZW50LCBmbik7XG4gIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHR3byByZWN0IG9iamVjdHMuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdDEgVGhlIGZpcnN0IHJlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdDIgVGhlIHNlY29uZCByZWN0LlxuICogQHJldHVybiB7P09iamVjdH0gVGhlIGludGVyc2VjdGlvbiByZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBpbnRlcnNlY3Rpb25cbiAqICAgICBpcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVJlY3RJbnRlcnNlY3Rpb24ocmVjdDEsIHJlY3QyKSB7XG4gIHZhciB0b3AgPSBNYXRoLm1heChyZWN0MS50b3AsIHJlY3QyLnRvcCk7XG4gIHZhciBib3R0b20gPSBNYXRoLm1pbihyZWN0MS5ib3R0b20sIHJlY3QyLmJvdHRvbSk7XG4gIHZhciBsZWZ0ID0gTWF0aC5tYXgocmVjdDEubGVmdCwgcmVjdDIubGVmdCk7XG4gIHZhciByaWdodCA9IE1hdGgubWluKHJlY3QxLnJpZ2h0LCByZWN0Mi5yaWdodCk7XG4gIHZhciB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgdmFyIGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcblxuICByZXR1cm4gKHdpZHRoID49IDAgJiYgaGVpZ2h0ID49IDApICYmIHtcbiAgICB0b3A6IHRvcCxcbiAgICBib3R0b206IGJvdHRvbSxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIHJpZ2h0OiByaWdodCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cblxuXG4vKipcbiAqIFNoaW1zIHRoZSBuYXRpdmUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgSUUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nIHJlY3QgdG8gZ2V0LlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgKHBvc3NpYmx5IHNoaW1tZWQpIHJlY3Qgb2YgdGhlIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbCkge1xuICB2YXIgcmVjdDtcblxuICB0cnkge1xuICAgIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWdub3JlIFdpbmRvd3MgNyBJRTExIFwiVW5zcGVjaWZpZWQgZXJyb3JcIlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvcHVsbC8yMDVcbiAgfVxuXG4gIGlmICghcmVjdCkgcmV0dXJuIGdldEVtcHR5UmVjdCgpO1xuXG4gIC8vIE9sZGVyIElFXG4gIGlmICghKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpKSB7XG4gICAgcmVjdCA9IHtcbiAgICAgIHRvcDogcmVjdC50b3AsXG4gICAgICByaWdodDogcmVjdC5yaWdodCxcbiAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICB3aWR0aDogcmVjdC5yaWdodCAtIHJlY3QubGVmdCxcbiAgICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlY3Q7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGVtcHR5IHJlY3Qgb2JqZWN0LiBBbiBlbXB0eSByZWN0IGlzIHJldHVybmVkIHdoZW4gYW4gZWxlbWVudFxuICogaXMgbm90IGluIHRoZSBET00uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbXB0eSByZWN0LlxuICovXG5mdW5jdGlvbiBnZXRFbXB0eVJlY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaWYgYSBwYXJlbnQgZWxlbWVudCBjb250YWlucyBhIGNoaWxkIGVsZW1lbnQgKGluY2x1ZGluZyBpbnNpZGVcbiAqIHNoYWRvdyBET00pLlxuICogQHBhcmFtIHtOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBlbGVtZW50LlxuICogQHBhcmFtIHtOb2RlfSBjaGlsZCBUaGUgY2hpbGQgZWxlbWVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhcmVudCBub2RlIGNvbnRhaW5zIHRoZSBjaGlsZCBub2RlLlxuICovXG5mdW5jdGlvbiBjb250YWluc0RlZXAocGFyZW50LCBjaGlsZCkge1xuICB2YXIgbm9kZSA9IGNoaWxkO1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlID09IHBhcmVudCkgcmV0dXJuIHRydWU7XG5cbiAgICBub2RlID0gZ2V0UGFyZW50Tm9kZShub2RlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBHZXRzIHRoZSBwYXJlbnQgbm9kZSBvZiBhbiBlbGVtZW50IG9yIGl0cyBob3N0IGVsZW1lbnQgaWYgdGhlIHBhcmVudCBub2RlXG4gKiBpcyBhIHNoYWRvdyByb290LlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBub2RlIHdob3NlIHBhcmVudCB0byBnZXQuXG4gKiBAcmV0dXJuIHtOb2RlfG51bGx9IFRoZSBwYXJlbnQgbm9kZSBvciBudWxsIGlmIG5vIHBhcmVudCBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhcmVudE5vZGUobm9kZSkge1xuICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gIGlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09IDExICYmIHBhcmVudC5ob3N0KSB7XG4gICAgLy8gSWYgdGhlIHBhcmVudCBpcyBhIHNoYWRvdyByb290LCByZXR1cm4gdGhlIGhvc3QgZWxlbWVudC5cbiAgICByZXR1cm4gcGFyZW50Lmhvc3Q7XG4gIH1cbiAgcmV0dXJuIHBhcmVudDtcbn1cblxuXG4vLyBFeHBvc2VzIHRoZSBjb25zdHJ1Y3RvcnMgZ2xvYmFsbHkuXG53aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBJbnRlcnNlY3Rpb25PYnNlcnZlcjtcbndpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5ID0gSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeTtcblxufSh3aW5kb3csIGRvY3VtZW50KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/intersection-observer/intersection-observer.js\n");

/***/ }),

/***/ "./node_modules/isbot/index.js":
/*!*************************************!*\
  !*** ./node_modules/isbot/index.js ***!
  \*************************************/
/***/ ((module) => {

eval("function _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = !0,\n      o = !1;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) {\n        if (Object(t) !== t) return;\n        f = !1;\n      } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = !0, n = r;\n    } finally {\n      try {\n        if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nfunction _toPrimitive(t, r) {\n  if (\"object\" != typeof t || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != typeof i) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n  var i = _toPrimitive(t, \"string\");\n  return \"symbol\" == typeof i ? i : String(i);\n}\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n  }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}\nfunction _defineProperty(obj, key, value) {\n  key = _toPropertyKey(key);\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\n}\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _classPrivateFieldGet(receiver, privateMap) {\n  var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\");\n  return _classApplyDescriptorGet(receiver, descriptor);\n}\nfunction _classPrivateFieldSet(receiver, privateMap, value) {\n  var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\");\n  _classApplyDescriptorSet(receiver, descriptor, value);\n  return value;\n}\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) {\n  if (!privateMap.has(receiver)) {\n    throw new TypeError(\"attempted to \" + action + \" private field on non-instance\");\n  }\n  return privateMap.get(receiver);\n}\nfunction _classApplyDescriptorGet(receiver, descriptor) {\n  if (descriptor.get) {\n    return descriptor.get.call(receiver);\n  }\n  return descriptor.value;\n}\nfunction _classApplyDescriptorSet(receiver, descriptor, value) {\n  if (descriptor.set) {\n    descriptor.set.call(receiver, value);\n  } else {\n    if (!descriptor.writable) {\n      throw new TypeError(\"attempted to set read only private field\");\n    }\n    descriptor.value = value;\n  }\n}\nfunction _classPrivateMethodGet(receiver, privateSet, fn) {\n  if (!privateSet.has(receiver)) {\n    throw new TypeError(\"attempted to get private field on non-instance\");\n  }\n  return fn;\n}\nfunction _checkPrivateRedeclaration(obj, privateCollection) {\n  if (privateCollection.has(obj)) {\n    throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n  }\n}\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) {\n  _checkPrivateRedeclaration(obj, privateMap);\n  privateMap.set(obj, value);\n}\nfunction _classPrivateMethodInitSpec(obj, privateSet) {\n  _checkPrivateRedeclaration(obj, privateSet);\n  privateSet.add(obj);\n}\n\nvar list = [\n\t\" daum[ /]\",\n\t\" deusu/\",\n\t\" yadirectfetcher\",\n\t\"(?:^| )site\",\n\t\"(?:^|[^g])news\",\n\t\"@[a-z]\",\n\t\"\\\\(at\\\\)[a-z]\",\n\t\"\\\\(github\\\\.com/\",\n\t\"\\\\[at\\\\][a-z]\",\n\t\"^12345\",\n\t\"^<\",\n\t\"^[\\\\w \\\\.\\\\-\\\\(\\\\)]+(/v?\\\\d+(\\\\.\\\\d+)?(\\\\.\\\\d{1,10})?)?$\",\n\t\"^[^ ]{50,}$\",\n\t\"^active\",\n\t\"^ad muncher\",\n\t\"^amaya\",\n\t\"^anglesharp/\",\n\t\"^anonymous\",\n\t\"^avsdevicesdk/\",\n\t\"^axios/\",\n\t\"^bidtellect/\",\n\t\"^biglotron\",\n\t\"^btwebclient/\",\n\t\"^castro\",\n\t\"^clamav[ /]\",\n\t\"^client/\",\n\t\"^cobweb/\",\n\t\"^coccoc\",\n\t\"^custom\",\n\t\"^ddg[_-]android\",\n\t\"^discourse\",\n\t\"^dispatch/\\\\d\",\n\t\"^downcast/\",\n\t\"^duckduckgo\",\n\t\"^facebook\",\n\t\"^fdm[ /]\\\\d\",\n\t\"^getright/\",\n\t\"^gozilla/\",\n\t\"^hatena\",\n\t\"^hobbit\",\n\t\"^hotzonu\",\n\t\"^hwcdn/\",\n\t\"^jeode/\",\n\t\"^jetty/\",\n\t\"^jigsaw\",\n\t\"^linkdex\",\n\t\"^lwp[-: ]\",\n\t\"^metauri\",\n\t\"^microsoft bits\",\n\t\"^movabletype\",\n\t\"^mozilla/\\\\d\\\\.\\\\d \\\\(compatible;?\\\\)$\",\n\t\"^mozilla/\\\\d\\\\.\\\\d \\\\w*$\",\n\t\"^navermailapp\",\n\t\"^netsurf\",\n\t\"^offline explorer\",\n\t\"^php\",\n\t\"^postman\",\n\t\"^postrank\",\n\t\"^python\",\n\t\"^read\",\n\t\"^reed\",\n\t\"^restsharp/\",\n\t\"^snapchat\",\n\t\"^space bison\",\n\t\"^svn\",\n\t\"^swcd \",\n\t\"^taringa\",\n\t\"^test certificate info\",\n\t\"^thumbor/\",\n\t\"^tumblr/\",\n\t\"^user-agent:mozilla\",\n\t\"^valid\",\n\t\"^venus/fedoraplanet\",\n\t\"^w3c\",\n\t\"^webbandit/\",\n\t\"^webcopier\",\n\t\"^wget\",\n\t\"^whatsapp\",\n\t\"^xenu link sleuth\",\n\t\"^yahoo\",\n\t\"^yandex\",\n\t\"^zdm/\\\\d\",\n\t\"^zoom marketplace/\",\n\t\"^{{.*}}$\",\n\t\"adbeat\\\\.com\",\n\t\"appinsights\",\n\t\"archive\",\n\t\"ask jeeves/teoma\",\n\t\"bit\\\\.ly/\",\n\t\"bluecoat drtr\",\n\t\"bot\",\n\t\"browsex\",\n\t\"burpcollaborator\",\n\t\"capture\",\n\t\"catch\",\n\t\"check\",\n\t\"chrome-lighthouse\",\n\t\"chromeframe\",\n\t\"cloud\",\n\t\"crawl\",\n\t\"cryptoapi\",\n\t\"dareboost\",\n\t\"datanyze\",\n\t\"dataprovider\",\n\t\"dejaclick\",\n\t\"dmbrowser\",\n\t\"download\",\n\t\"evc-batch/\",\n\t\"feed\",\n\t\"firephp\",\n\t\"freesafeip\",\n\t\"gomezagent\",\n\t\"google\",\n\t\"headlesschrome/\",\n\t\"http\",\n\t\"httrack\",\n\t\"hubspot marketing grader\",\n\t\"hydra\",\n\t\"ibisbrowser\",\n\t\"images\",\n\t\"inspect\",\n\t\"iplabel\",\n\t\"ips-agent\",\n\t\"java\",\n\t\"library\",\n\t\"mail\\\\.ru/\",\n\t\"manager\",\n\t\"monitor\",\n\t\"morningscore/\",\n\t\"neustar wpm\",\n\t\"nutch\",\n\t\"offbyone\",\n\t\"optimize\",\n\t\"pageburst\",\n\t\"pagespeed\",\n\t\"perl\",\n\t\"phantom\",\n\t\"pingdom\",\n\t\"powermarks\",\n\t\"preview\",\n\t\"proxy\",\n\t\"ptst[ /]\\\\d\",\n\t\"reader\",\n\t\"rexx;\",\n\t\"rigor\",\n\t\"rss\",\n\t\"scan\",\n\t\"scrape\",\n\t\"search\",\n\t\"serp ?reputation ?management\",\n\t\"server\",\n\t\"sogou\",\n\t\"sparkler/\",\n\t\"speedcurve\",\n\t\"spider\",\n\t\"splash\",\n\t\"statuscake\",\n\t\"stumbleupon\\\\.com\",\n\t\"supercleaner\",\n\t\"synapse\",\n\t\"synthetic\",\n\t\"torrent\",\n\t\"tracemyfile\",\n\t\"transcoder\",\n\t\"trendsmapresolver\",\n\t\"twingly recon\",\n\t\"url\",\n\t\"virtuoso\",\n\t\"wappalyzer\",\n\t\"webglance\",\n\t\"webkit2png\",\n\t\"websitemetadataretriever\",\n\t\"whatcms/\",\n\t\"wordpress\",\n\t\"zgrab\"\n];\n\n/**\n * Mutate given list of patter strings\n * @param {string[]} list\n * @returns {string[]}\n */\nfunction amend(list) {\n  try {\n    // Risk: Uses lookbehind assertion, avoid breakage in parsing by using RegExp constructor\n    new RegExp('(?<! cu)bot').test('dangerbot'); // eslint-disable-line prefer-regex-literals\n  } catch (error) {\n    // Skip regex fixes\n    return list;\n  }\n  [\n  // Addresses: Cubot device\n  ['bot', '(?<! cu)bot'],\n  // Addresses: Android webview\n  ['google', '(?<! (?:channel/|google/))google(?!(app|/google| pixel))'],\n  // Addresses: libhttp browser\n  ['http', '(?<!(?:lib))http'],\n  // Addresses: java based browsers\n  ['java', 'java(?!;)'],\n  // Addresses: Yandex Search App\n  ['search', '(?<! ya(?:yandex)?)search']].forEach(function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 2),\n      search = _ref2[0],\n      replace = _ref2[1];\n    var index = list.lastIndexOf(search);\n    if (~index) {\n      list.splice(index, 1, replace);\n    }\n  });\n  return list;\n}\n\namend(list);\nvar flags = 'i';\n\n/**\n * Test user agents for matching patterns\n */\nvar _list = /*#__PURE__*/new WeakMap();\nvar _pattern = /*#__PURE__*/new WeakMap();\nvar _update = /*#__PURE__*/new WeakSet();\nvar _index = /*#__PURE__*/new WeakSet();\nvar Isbot = /*#__PURE__*/function () {\n  function Isbot(patterns) {\n    var _this = this;\n    _classCallCheck(this, Isbot);\n    /**\n     * Find the first index of an existing rule or -1 if not found\n     * @param  {string} rule\n     * @returns {number}\n     */\n    _classPrivateMethodInitSpec(this, _index);\n    /**\n     * Recreate the pattern from rules list\n     */\n    _classPrivateMethodInitSpec(this, _update);\n    /**\n     * @type {string[]}\n     */\n    _classPrivateFieldInitSpec(this, _list, {\n      writable: true,\n      value: void 0\n    });\n    /**\n     * @type {RegExp}\n     */\n    _classPrivateFieldInitSpec(this, _pattern, {\n      writable: true,\n      value: void 0\n    });\n    _classPrivateFieldSet(this, _list, patterns || list.slice());\n    _classPrivateMethodGet(this, _update, _update2).call(this);\n    var isbot = function isbot(ua) {\n      return _this.test(ua);\n    };\n    return Object.defineProperties(isbot, Object.entries(Object.getOwnPropertyDescriptors(Isbot.prototype)).reduce(function (accumulator, _ref) {\n      var _ref2 = _slicedToArray(_ref, 2),\n        prop = _ref2[0],\n        descriptor = _ref2[1];\n      if (typeof descriptor.value === 'function') {\n        Object.assign(accumulator, _defineProperty({}, prop, {\n          value: _this[prop].bind(_this)\n        }));\n      }\n      if (typeof descriptor.get === 'function') {\n        Object.assign(accumulator, _defineProperty({}, prop, {\n          get: function get() {\n            return _this[prop];\n          }\n        }));\n      }\n      return accumulator;\n    }, {}));\n  }\n  _createClass(Isbot, [{\n    key: \"pattern\",\n    get:\n    /**\n     * Get a clone of the pattern\n     * @type RegExp\n     */\n    function get() {\n      return new RegExp(_classPrivateFieldGet(this, _pattern));\n    }\n\n    /**\n     * Match given string against out pattern\n     * @param  {string} ua User Agent string\n     * @returns {boolean}\n     */\n  }, {\n    key: \"test\",\n    value: function test(ua) {\n      return Boolean(ua) && _classPrivateFieldGet(this, _pattern).test(ua);\n    }\n  }, {\n    key: \"isbot\",\n    value: function isbot(ua) {\n      return Boolean(ua) && _classPrivateFieldGet(this, _pattern).test(ua);\n    }\n\n    /**\n     * Get the match for strings' known crawler pattern\n     * @param  {string} ua User Agent string\n     * @returns {string|null}\n     */\n  }, {\n    key: \"find\",\n    value: function find() {\n      var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      var match = ua.match(_classPrivateFieldGet(this, _pattern));\n      return match && match[0];\n    }\n\n    /**\n     * Get the patterns that match user agent string if any\n     * @param  {string} ua User Agent string\n     * @returns {string[]}\n     */\n  }, {\n    key: \"matches\",\n    value: function matches() {\n      var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      return _classPrivateFieldGet(this, _list).filter(function (entry) {\n        return new RegExp(entry, flags).test(ua);\n      });\n    }\n\n    /**\n     * Clear all patterns that match user agent\n     * @param  {string} ua User Agent string\n     * @returns {void}\n     */\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      var ua = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      this.exclude(this.matches(ua));\n    }\n\n    /**\n     * Extent patterns for known crawlers\n     * @param  {string[]} filters\n     * @returns {void}\n     */\n  }, {\n    key: \"extend\",\n    value: function extend() {\n      var _this2 = this;\n      var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      [].push.apply(_classPrivateFieldGet(this, _list), filters.filter(function (rule) {\n        return _classPrivateMethodGet(_this2, _index, _index2).call(_this2, rule) === -1;\n      }).map(function (filter) {\n        return filter.toLowerCase();\n      }));\n      _classPrivateMethodGet(this, _update, _update2).call(this);\n    }\n\n    /**\n     * Exclude patterns from bot pattern rule\n     * @param  {string[]} filters\n     * @returns {void}\n     */\n  }, {\n    key: \"exclude\",\n    value: function exclude() {\n      var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      var length = filters.length;\n      while (length--) {\n        var index = _classPrivateMethodGet(this, _index, _index2).call(this, filters[length]);\n        if (index > -1) {\n          _classPrivateFieldGet(this, _list).splice(index, 1);\n        }\n      }\n      _classPrivateMethodGet(this, _update, _update2).call(this);\n    }\n\n    /**\n     * Create a new Isbot instance using given list or self's list\n     * @param  {string[]} [list]\n     * @returns {Isbot}\n     */\n  }, {\n    key: \"spawn\",\n    value: function spawn(list) {\n      return new Isbot(list || _classPrivateFieldGet(this, _list));\n    }\n  }]);\n  return Isbot;\n}();\nfunction _update2() {\n  _classPrivateFieldSet(this, _pattern, new RegExp(_classPrivateFieldGet(this, _list).join('|'), flags));\n}\nfunction _index2(rule) {\n  return _classPrivateFieldGet(this, _list).indexOf(rule.toLowerCase());\n}\n\nvar isbot = new Isbot();\n\nmodule.exports = isbot;\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvaXNib3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL2lzYm90L2luZGV4LmpzP2U5YzgiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHtcbiAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gdCkge1xuICAgIHZhciBlLFxuICAgICAgbixcbiAgICAgIGksXG4gICAgICB1LFxuICAgICAgYSA9IFtdLFxuICAgICAgZiA9ICEwLFxuICAgICAgbyA9ICExO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSAhMCwgbiA9IHI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZiAmJiBudWxsICE9IHQucmV0dXJuICYmICh1ID0gdC5yZXR1cm4oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG8pIHRocm93IG47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG59XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIFwic3ltYm9sXCIgPT0gdHlwZW9mIGkgPyBpIDogU3RyaW5nKGkpO1xufVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG4gIHJldHVybiBhcnIyO1xufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xuICB2YXIgZGVzY3JpcHRvciA9IF9jbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIFwiZ2V0XCIpO1xuICByZXR1cm4gX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBfY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBcInNldFwiKTtcbiAgX2NsYXNzQXBwbHlEZXNjcmlwdG9yU2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yLCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIF9jbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIGFjdGlvbikge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gXCIgKyBhY3Rpb24gKyBcIiBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xufVxuZnVuY3Rpb24gX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7XG4gIGlmIChkZXNjcmlwdG9yLmdldCkge1xuICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgfVxuICByZXR1cm4gZGVzY3JpcHRvci52YWx1ZTtcbn1cbmZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpIHtcbiAgaWYgKGRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgZGVzY3JpcHRvci5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGlmICghZGVzY3JpcHRvci53cml0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcmVhZCBvbmx5IHByaXZhdGUgZmllbGRcIik7XG4gICAgfVxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldChyZWNlaXZlciwgcHJpdmF0ZVNldCwgZm4pIHtcbiAgaWYgKCFwcml2YXRlU2V0LmhhcyhyZWNlaXZlcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuICByZXR1cm4gZm47XG59XG5mdW5jdGlvbiBfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVDb2xsZWN0aW9uKSB7XG4gIGlmIChwcml2YXRlQ29sbGVjdGlvbi5oYXMob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdFwiKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMob2JqLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVNYXApO1xuICBwcml2YXRlTWFwLnNldChvYmosIHZhbHVlKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyhvYmosIHByaXZhdGVTZXQpIHtcbiAgX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlU2V0KTtcbiAgcHJpdmF0ZVNldC5hZGQob2JqKTtcbn1cblxudmFyIGxpc3QgPSBbXG5cdFwiIGRhdW1bIC9dXCIsXG5cdFwiIGRldXN1L1wiLFxuXHRcIiB5YWRpcmVjdGZldGNoZXJcIixcblx0XCIoPzpefCApc2l0ZVwiLFxuXHRcIig/Ol58W15nXSluZXdzXCIsXG5cdFwiQFthLXpdXCIsXG5cdFwiXFxcXChhdFxcXFwpW2Etel1cIixcblx0XCJcXFxcKGdpdGh1YlxcXFwuY29tL1wiLFxuXHRcIlxcXFxbYXRcXFxcXVthLXpdXCIsXG5cdFwiXjEyMzQ1XCIsXG5cdFwiXjxcIixcblx0XCJeW1xcXFx3IFxcXFwuXFxcXC1cXFxcKFxcXFwpXSsoL3Y/XFxcXGQrKFxcXFwuXFxcXGQrKT8oXFxcXC5cXFxcZHsxLDEwfSk/KT8kXCIsXG5cdFwiXlteIF17NTAsfSRcIixcblx0XCJeYWN0aXZlXCIsXG5cdFwiXmFkIG11bmNoZXJcIixcblx0XCJeYW1heWFcIixcblx0XCJeYW5nbGVzaGFycC9cIixcblx0XCJeYW5vbnltb3VzXCIsXG5cdFwiXmF2c2RldmljZXNkay9cIixcblx0XCJeYXhpb3MvXCIsXG5cdFwiXmJpZHRlbGxlY3QvXCIsXG5cdFwiXmJpZ2xvdHJvblwiLFxuXHRcIl5idHdlYmNsaWVudC9cIixcblx0XCJeY2FzdHJvXCIsXG5cdFwiXmNsYW1hdlsgL11cIixcblx0XCJeY2xpZW50L1wiLFxuXHRcIl5jb2J3ZWIvXCIsXG5cdFwiXmNvY2NvY1wiLFxuXHRcIl5jdXN0b21cIixcblx0XCJeZGRnW18tXWFuZHJvaWRcIixcblx0XCJeZGlzY291cnNlXCIsXG5cdFwiXmRpc3BhdGNoL1xcXFxkXCIsXG5cdFwiXmRvd25jYXN0L1wiLFxuXHRcIl5kdWNrZHVja2dvXCIsXG5cdFwiXmZhY2Vib29rXCIsXG5cdFwiXmZkbVsgL11cXFxcZFwiLFxuXHRcIl5nZXRyaWdodC9cIixcblx0XCJeZ296aWxsYS9cIixcblx0XCJeaGF0ZW5hXCIsXG5cdFwiXmhvYmJpdFwiLFxuXHRcIl5ob3R6b251XCIsXG5cdFwiXmh3Y2RuL1wiLFxuXHRcIl5qZW9kZS9cIixcblx0XCJeamV0dHkvXCIsXG5cdFwiXmppZ3Nhd1wiLFxuXHRcIl5saW5rZGV4XCIsXG5cdFwiXmx3cFstOiBdXCIsXG5cdFwiXm1ldGF1cmlcIixcblx0XCJebWljcm9zb2Z0IGJpdHNcIixcblx0XCJebW92YWJsZXR5cGVcIixcblx0XCJebW96aWxsYS9cXFxcZFxcXFwuXFxcXGQgXFxcXChjb21wYXRpYmxlOz9cXFxcKSRcIixcblx0XCJebW96aWxsYS9cXFxcZFxcXFwuXFxcXGQgXFxcXHcqJFwiLFxuXHRcIl5uYXZlcm1haWxhcHBcIixcblx0XCJebmV0c3VyZlwiLFxuXHRcIl5vZmZsaW5lIGV4cGxvcmVyXCIsXG5cdFwiXnBocFwiLFxuXHRcIl5wb3N0bWFuXCIsXG5cdFwiXnBvc3RyYW5rXCIsXG5cdFwiXnB5dGhvblwiLFxuXHRcIl5yZWFkXCIsXG5cdFwiXnJlZWRcIixcblx0XCJecmVzdHNoYXJwL1wiLFxuXHRcIl5zbmFwY2hhdFwiLFxuXHRcIl5zcGFjZSBiaXNvblwiLFxuXHRcIl5zdm5cIixcblx0XCJec3djZCBcIixcblx0XCJedGFyaW5nYVwiLFxuXHRcIl50ZXN0IGNlcnRpZmljYXRlIGluZm9cIixcblx0XCJedGh1bWJvci9cIixcblx0XCJedHVtYmxyL1wiLFxuXHRcIl51c2VyLWFnZW50Om1vemlsbGFcIixcblx0XCJedmFsaWRcIixcblx0XCJedmVudXMvZmVkb3JhcGxhbmV0XCIsXG5cdFwiXnczY1wiLFxuXHRcIl53ZWJiYW5kaXQvXCIsXG5cdFwiXndlYmNvcGllclwiLFxuXHRcIl53Z2V0XCIsXG5cdFwiXndoYXRzYXBwXCIsXG5cdFwiXnhlbnUgbGluayBzbGV1dGhcIixcblx0XCJeeWFob29cIixcblx0XCJeeWFuZGV4XCIsXG5cdFwiXnpkbS9cXFxcZFwiLFxuXHRcIl56b29tIG1hcmtldHBsYWNlL1wiLFxuXHRcIl57ey4qfX0kXCIsXG5cdFwiYWRiZWF0XFxcXC5jb21cIixcblx0XCJhcHBpbnNpZ2h0c1wiLFxuXHRcImFyY2hpdmVcIixcblx0XCJhc2sgamVldmVzL3Rlb21hXCIsXG5cdFwiYml0XFxcXC5seS9cIixcblx0XCJibHVlY29hdCBkcnRyXCIsXG5cdFwiYm90XCIsXG5cdFwiYnJvd3NleFwiLFxuXHRcImJ1cnBjb2xsYWJvcmF0b3JcIixcblx0XCJjYXB0dXJlXCIsXG5cdFwiY2F0Y2hcIixcblx0XCJjaGVja1wiLFxuXHRcImNocm9tZS1saWdodGhvdXNlXCIsXG5cdFwiY2hyb21lZnJhbWVcIixcblx0XCJjbG91ZFwiLFxuXHRcImNyYXdsXCIsXG5cdFwiY3J5cHRvYXBpXCIsXG5cdFwiZGFyZWJvb3N0XCIsXG5cdFwiZGF0YW55emVcIixcblx0XCJkYXRhcHJvdmlkZXJcIixcblx0XCJkZWphY2xpY2tcIixcblx0XCJkbWJyb3dzZXJcIixcblx0XCJkb3dubG9hZFwiLFxuXHRcImV2Yy1iYXRjaC9cIixcblx0XCJmZWVkXCIsXG5cdFwiZmlyZXBocFwiLFxuXHRcImZyZWVzYWZlaXBcIixcblx0XCJnb21lemFnZW50XCIsXG5cdFwiZ29vZ2xlXCIsXG5cdFwiaGVhZGxlc3NjaHJvbWUvXCIsXG5cdFwiaHR0cFwiLFxuXHRcImh0dHJhY2tcIixcblx0XCJodWJzcG90IG1hcmtldGluZyBncmFkZXJcIixcblx0XCJoeWRyYVwiLFxuXHRcImliaXNicm93c2VyXCIsXG5cdFwiaW1hZ2VzXCIsXG5cdFwiaW5zcGVjdFwiLFxuXHRcImlwbGFiZWxcIixcblx0XCJpcHMtYWdlbnRcIixcblx0XCJqYXZhXCIsXG5cdFwibGlicmFyeVwiLFxuXHRcIm1haWxcXFxcLnJ1L1wiLFxuXHRcIm1hbmFnZXJcIixcblx0XCJtb25pdG9yXCIsXG5cdFwibW9ybmluZ3Njb3JlL1wiLFxuXHRcIm5ldXN0YXIgd3BtXCIsXG5cdFwibnV0Y2hcIixcblx0XCJvZmZieW9uZVwiLFxuXHRcIm9wdGltaXplXCIsXG5cdFwicGFnZWJ1cnN0XCIsXG5cdFwicGFnZXNwZWVkXCIsXG5cdFwicGVybFwiLFxuXHRcInBoYW50b21cIixcblx0XCJwaW5nZG9tXCIsXG5cdFwicG93ZXJtYXJrc1wiLFxuXHRcInByZXZpZXdcIixcblx0XCJwcm94eVwiLFxuXHRcInB0c3RbIC9dXFxcXGRcIixcblx0XCJyZWFkZXJcIixcblx0XCJyZXh4O1wiLFxuXHRcInJpZ29yXCIsXG5cdFwicnNzXCIsXG5cdFwic2NhblwiLFxuXHRcInNjcmFwZVwiLFxuXHRcInNlYXJjaFwiLFxuXHRcInNlcnAgP3JlcHV0YXRpb24gP21hbmFnZW1lbnRcIixcblx0XCJzZXJ2ZXJcIixcblx0XCJzb2dvdVwiLFxuXHRcInNwYXJrbGVyL1wiLFxuXHRcInNwZWVkY3VydmVcIixcblx0XCJzcGlkZXJcIixcblx0XCJzcGxhc2hcIixcblx0XCJzdGF0dXNjYWtlXCIsXG5cdFwic3R1bWJsZXVwb25cXFxcLmNvbVwiLFxuXHRcInN1cGVyY2xlYW5lclwiLFxuXHRcInN5bmFwc2VcIixcblx0XCJzeW50aGV0aWNcIixcblx0XCJ0b3JyZW50XCIsXG5cdFwidHJhY2VteWZpbGVcIixcblx0XCJ0cmFuc2NvZGVyXCIsXG5cdFwidHJlbmRzbWFwcmVzb2x2ZXJcIixcblx0XCJ0d2luZ2x5IHJlY29uXCIsXG5cdFwidXJsXCIsXG5cdFwidmlydHVvc29cIixcblx0XCJ3YXBwYWx5emVyXCIsXG5cdFwid2ViZ2xhbmNlXCIsXG5cdFwid2Via2l0MnBuZ1wiLFxuXHRcIndlYnNpdGVtZXRhZGF0YXJldHJpZXZlclwiLFxuXHRcIndoYXRjbXMvXCIsXG5cdFwid29yZHByZXNzXCIsXG5cdFwiemdyYWJcIlxuXTtcblxuLyoqXG4gKiBNdXRhdGUgZ2l2ZW4gbGlzdCBvZiBwYXR0ZXIgc3RyaW5nc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gbGlzdFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5mdW5jdGlvbiBhbWVuZChsaXN0KSB7XG4gIHRyeSB7XG4gICAgLy8gUmlzazogVXNlcyBsb29rYmVoaW5kIGFzc2VydGlvbiwgYXZvaWQgYnJlYWthZ2UgaW4gcGFyc2luZyBieSB1c2luZyBSZWdFeHAgY29uc3RydWN0b3JcbiAgICBuZXcgUmVnRXhwKCcoPzwhIGN1KWJvdCcpLnRlc3QoJ2RhbmdlcmJvdCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZWdleC1saXRlcmFsc1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFNraXAgcmVnZXggZml4ZXNcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuICBbXG4gIC8vIEFkZHJlc3NlczogQ3Vib3QgZGV2aWNlXG4gIFsnYm90JywgJyg/PCEgY3UpYm90J10sXG4gIC8vIEFkZHJlc3NlczogQW5kcm9pZCB3ZWJ2aWV3XG4gIFsnZ29vZ2xlJywgJyg/PCEgKD86Y2hhbm5lbC98Z29vZ2xlLykpZ29vZ2xlKD8hKGFwcHwvZ29vZ2xlfCBwaXhlbCkpJ10sXG4gIC8vIEFkZHJlc3NlczogbGliaHR0cCBicm93c2VyXG4gIFsnaHR0cCcsICcoPzwhKD86bGliKSlodHRwJ10sXG4gIC8vIEFkZHJlc3NlczogamF2YSBiYXNlZCBicm93c2Vyc1xuICBbJ2phdmEnLCAnamF2YSg/ITspJ10sXG4gIC8vIEFkZHJlc3NlczogWWFuZGV4IFNlYXJjaCBBcHBcbiAgWydzZWFyY2gnLCAnKD88ISB5YSg/OnlhbmRleCk/KXNlYXJjaCddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICBzZWFyY2ggPSBfcmVmMlswXSxcbiAgICAgIHJlcGxhY2UgPSBfcmVmMlsxXTtcbiAgICB2YXIgaW5kZXggPSBsaXN0Lmxhc3RJbmRleE9mKHNlYXJjaCk7XG4gICAgaWYgKH5pbmRleCkge1xuICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEsIHJlcGxhY2UpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaXN0O1xufVxuXG5hbWVuZChsaXN0KTtcbnZhciBmbGFncyA9ICdpJztcblxuLyoqXG4gKiBUZXN0IHVzZXIgYWdlbnRzIGZvciBtYXRjaGluZyBwYXR0ZXJuc1xuICovXG52YXIgX2xpc3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbnZhciBfcGF0dGVybiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xudmFyIF91cGRhdGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbnZhciBfaW5kZXggPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbnZhciBJc2JvdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIElzYm90KHBhdHRlcm5zKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSXNib3QpO1xuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGZpcnN0IGluZGV4IG9mIGFuIGV4aXN0aW5nIHJ1bGUgb3IgLTEgaWYgbm90IGZvdW5kXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBydWxlXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX2luZGV4KTtcbiAgICAvKipcbiAgICAgKiBSZWNyZWF0ZSB0aGUgcGF0dGVybiBmcm9tIHJ1bGVzIGxpc3RcbiAgICAgKi9cbiAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3VwZGF0ZSk7XG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9saXN0LCB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAqL1xuICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9wYXR0ZXJuLCB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICB9KTtcbiAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2xpc3QsIHBhdHRlcm5zIHx8IGxpc3Quc2xpY2UoKSk7XG4gICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfdXBkYXRlLCBfdXBkYXRlMikuY2FsbCh0aGlzKTtcbiAgICB2YXIgaXNib3QgPSBmdW5jdGlvbiBpc2JvdCh1YSkge1xuICAgICAgcmV0dXJuIF90aGlzLnRlc3QodWEpO1xuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlzYm90LCBPYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhJc2JvdC5wcm90b3R5cGUpKS5yZWR1Y2UoZnVuY3Rpb24gKGFjY3VtdWxhdG9yLCBfcmVmKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgcHJvcCA9IF9yZWYyWzBdLFxuICAgICAgICBkZXNjcmlwdG9yID0gX3JlZjJbMV07XG4gICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2N1bXVsYXRvciwgX2RlZmluZVByb3BlcnR5KHt9LCBwcm9wLCB7XG4gICAgICAgICAgdmFsdWU6IF90aGlzW3Byb3BdLmJpbmQoX3RoaXMpXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2N1bXVsYXRvciwgX2RlZmluZVByb3BlcnR5KHt9LCBwcm9wLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwge30pKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoSXNib3QsIFt7XG4gICAga2V5OiBcInBhdHRlcm5cIixcbiAgICBnZXQ6XG4gICAgLyoqXG4gICAgICogR2V0IGEgY2xvbmUgb2YgdGhlIHBhdHRlcm5cbiAgICAgKiBAdHlwZSBSZWdFeHBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BhdHRlcm4pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXRjaCBnaXZlbiBzdHJpbmcgYWdhaW5zdCBvdXQgcGF0dGVyblxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdWEgVXNlciBBZ2VudCBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJ0ZXN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRlc3QodWEpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHVhKSAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BhdHRlcm4pLnRlc3QodWEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc2JvdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc2JvdCh1YSkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odWEpICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGF0dGVybikudGVzdCh1YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXRjaCBmb3Igc3RyaW5ncycga25vd24gY3Jhd2xlciBwYXR0ZXJuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB1YSBVc2VyIEFnZW50IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJmaW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoKSB7XG4gICAgICB2YXIgdWEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgICAgdmFyIG1hdGNoID0gdWEubWF0Y2goX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wYXR0ZXJuKSk7XG4gICAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwYXR0ZXJucyB0aGF0IG1hdGNoIHVzZXIgYWdlbnQgc3RyaW5nIGlmIGFueVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdWEgVXNlciBBZ2VudCBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwibWF0Y2hlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXRjaGVzKCkge1xuICAgICAgdmFyIHVhID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xpc3QpLmZpbHRlcihmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoZW50cnksIGZsYWdzKS50ZXN0KHVhKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBwYXR0ZXJucyB0aGF0IG1hdGNoIHVzZXIgYWdlbnRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHVhIFVzZXIgQWdlbnQgc3RyaW5nXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB2YXIgdWEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgICAgdGhpcy5leGNsdWRlKHRoaXMubWF0Y2hlcyh1YSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dGVudCBwYXR0ZXJucyBmb3Iga25vd24gY3Jhd2xlcnNcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmdbXX0gZmlsdGVyc1xuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcImV4dGVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBmaWx0ZXJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICAgIFtdLnB1c2guYXBwbHkoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9saXN0KSwgZmlsdGVycy5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQoX3RoaXMyLCBfaW5kZXgsIF9pbmRleDIpLmNhbGwoX3RoaXMyLCBydWxlKSA9PT0gLTE7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZmlsdGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9KSk7XG4gICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF91cGRhdGUsIF91cGRhdGUyKS5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2x1ZGUgcGF0dGVybnMgZnJvbSBib3QgcGF0dGVybiBydWxlXG4gICAgICogQHBhcmFtICB7c3RyaW5nW119IGZpbHRlcnNcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJleGNsdWRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4Y2x1ZGUoKSB7XG4gICAgICB2YXIgZmlsdGVycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgICB2YXIgbGVuZ3RoID0gZmlsdGVycy5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfaW5kZXgsIF9pbmRleDIpLmNhbGwodGhpcywgZmlsdGVyc1tsZW5ndGhdKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xpc3QpLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3VwZGF0ZSwgX3VwZGF0ZTIpLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IElzYm90IGluc3RhbmNlIHVzaW5nIGdpdmVuIGxpc3Qgb3Igc2VsZidzIGxpc3RcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmdbXX0gW2xpc3RdXG4gICAgICogQHJldHVybnMge0lzYm90fVxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcInNwYXduXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNwYXduKGxpc3QpIHtcbiAgICAgIHJldHVybiBuZXcgSXNib3QobGlzdCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xpc3QpKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIElzYm90O1xufSgpO1xuZnVuY3Rpb24gX3VwZGF0ZTIoKSB7XG4gIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfcGF0dGVybiwgbmV3IFJlZ0V4cChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xpc3QpLmpvaW4oJ3wnKSwgZmxhZ3MpKTtcbn1cbmZ1bmN0aW9uIF9pbmRleDIocnVsZSkge1xuICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9saXN0KS5pbmRleE9mKHJ1bGUudG9Mb3dlckNhc2UoKSk7XG59XG5cbnZhciBpc2JvdCA9IG5ldyBJc2JvdCgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzYm90O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/isbot/index.js\n");

/***/ }),

/***/ "./node_modules/masonry-layout/masonry.js":
/*!************************************************!*\
  !*** ./node_modules/masonry-layout/masonry.js ***!
  \************************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Masonry v4.2.2\n * Cascading grid layout library\n * https://masonry.desandro.com\n * MIT License\n * by David DeSandro\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*globals define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __webpack_require__(/*! outlayer/outlayer */ \"./node_modules/outlayer/outlayer.js\"),\n        __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\")\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( Outlayer, getSize ) {\n\n'use strict';\n\n// -------------------------- masonryDefinition -------------------------- //\n\n  // create an Outlayer layout class\n  var Masonry = Outlayer.create('masonry');\n  // isFitWidth -> fitWidth\n  Masonry.compatOptions.fitWidth = 'isFitWidth';\n\n  var proto = Masonry.prototype;\n\n  proto._resetLayout = function() {\n    this.getSize();\n    this._getMeasurement( 'columnWidth', 'outerWidth' );\n    this._getMeasurement( 'gutter', 'outerWidth' );\n    this.measureColumns();\n\n    // reset column Y\n    this.colYs = [];\n    for ( var i=0; i < this.cols; i++ ) {\n      this.colYs.push( 0 );\n    }\n\n    this.maxY = 0;\n    this.horizontalColIndex = 0;\n  };\n\n  proto.measureColumns = function() {\n    this.getContainerWidth();\n    // if columnWidth is 0, default to outerWidth of first item\n    if ( !this.columnWidth ) {\n      var firstItem = this.items[0];\n      var firstItemElem = firstItem && firstItem.element;\n      // columnWidth fall back to item of first element\n      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||\n        // if first elem has no width, default to size of container\n        this.containerWidth;\n    }\n\n    var columnWidth = this.columnWidth += this.gutter;\n\n    // calculate columns\n    var containerWidth = this.containerWidth + this.gutter;\n    var cols = containerWidth / columnWidth;\n    // fix rounding errors, typically with gutters\n    var excess = columnWidth - containerWidth % columnWidth;\n    // if overshoot is less than a pixel, round up, otherwise floor it\n    var mathMethod = excess && excess < 1 ? 'round' : 'floor';\n    cols = Math[ mathMethod ]( cols );\n    this.cols = Math.max( cols, 1 );\n  };\n\n  proto.getContainerWidth = function() {\n    // container is parent if fit width\n    var isFitWidth = this._getOption('fitWidth');\n    var container = isFitWidth ? this.element.parentNode : this.element;\n    // check that this.size and size are there\n    // IE8 triggers resize on body size change, so they might not be\n    var size = getSize( container );\n    this.containerWidth = size && size.innerWidth;\n  };\n\n  proto._getItemLayoutPosition = function( item ) {\n    item.getSize();\n    // how many columns does this brick span\n    var remainder = item.size.outerWidth % this.columnWidth;\n    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';\n    // round if off by 1 pixel, otherwise use ceil\n    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );\n    colSpan = Math.min( colSpan, this.cols );\n    // use horizontal or top column position\n    var colPosMethod = this.options.horizontalOrder ?\n      '_getHorizontalColPosition' : '_getTopColPosition';\n    var colPosition = this[ colPosMethod ]( colSpan, item );\n    // position the brick\n    var position = {\n      x: this.columnWidth * colPosition.col,\n      y: colPosition.y\n    };\n    // apply setHeight to necessary columns\n    var setHeight = colPosition.y + item.size.outerHeight;\n    var setMax = colSpan + colPosition.col;\n    for ( var i = colPosition.col; i < setMax; i++ ) {\n      this.colYs[i] = setHeight;\n    }\n\n    return position;\n  };\n\n  proto._getTopColPosition = function( colSpan ) {\n    var colGroup = this._getTopColGroup( colSpan );\n    // get the minimum Y value from the columns\n    var minimumY = Math.min.apply( Math, colGroup );\n\n    return {\n      col: colGroup.indexOf( minimumY ),\n      y: minimumY,\n    };\n  };\n\n  /**\n   * @param {Number} colSpan - number of columns the element spans\n   * @returns {Array} colGroup\n   */\n  proto._getTopColGroup = function( colSpan ) {\n    if ( colSpan < 2 ) {\n      // if brick spans only one column, use all the column Ys\n      return this.colYs;\n    }\n\n    var colGroup = [];\n    // how many different places could this brick fit horizontally\n    var groupCount = this.cols + 1 - colSpan;\n    // for each group potential horizontal position\n    for ( var i = 0; i < groupCount; i++ ) {\n      colGroup[i] = this._getColGroupY( i, colSpan );\n    }\n    return colGroup;\n  };\n\n  proto._getColGroupY = function( col, colSpan ) {\n    if ( colSpan < 2 ) {\n      return this.colYs[ col ];\n    }\n    // make an array of colY values for that one group\n    var groupColYs = this.colYs.slice( col, col + colSpan );\n    // and get the max value of the array\n    return Math.max.apply( Math, groupColYs );\n  };\n\n  // get column position based on horizontal index. #873\n  proto._getHorizontalColPosition = function( colSpan, item ) {\n    var col = this.horizontalColIndex % this.cols;\n    var isOver = colSpan > 1 && col + colSpan > this.cols;\n    // shift to next row if item can't fit on current row\n    col = isOver ? 0 : col;\n    // don't let zero-size items take up space\n    var hasSize = item.size.outerWidth && item.size.outerHeight;\n    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;\n\n    return {\n      col: col,\n      y: this._getColGroupY( col, colSpan ),\n    };\n  };\n\n  proto._manageStamp = function( stamp ) {\n    var stampSize = getSize( stamp );\n    var offset = this._getElementOffset( stamp );\n    // get the columns that this stamp affects\n    var isOriginLeft = this._getOption('originLeft');\n    var firstX = isOriginLeft ? offset.left : offset.right;\n    var lastX = firstX + stampSize.outerWidth;\n    var firstCol = Math.floor( firstX / this.columnWidth );\n    firstCol = Math.max( 0, firstCol );\n    var lastCol = Math.floor( lastX / this.columnWidth );\n    // lastCol should not go over if multiple of columnWidth #425\n    lastCol -= lastX % this.columnWidth ? 0 : 1;\n    lastCol = Math.min( this.cols - 1, lastCol );\n    // set colYs to bottom of the stamp\n\n    var isOriginTop = this._getOption('originTop');\n    var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +\n      stampSize.outerHeight;\n    for ( var i = firstCol; i <= lastCol; i++ ) {\n      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );\n    }\n  };\n\n  proto._getContainerSize = function() {\n    this.maxY = Math.max.apply( Math, this.colYs );\n    var size = {\n      height: this.maxY\n    };\n\n    if ( this._getOption('fitWidth') ) {\n      size.width = this._getContainerFitWidth();\n    }\n\n    return size;\n  };\n\n  proto._getContainerFitWidth = function() {\n    var unusedCols = 0;\n    // count unused columns\n    var i = this.cols;\n    while ( --i ) {\n      if ( this.colYs[i] !== 0 ) {\n        break;\n      }\n      unusedCols++;\n    }\n    // fit container to columns that have been used\n    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;\n  };\n\n  proto.needsResizeLayout = function() {\n    var previousWidth = this.containerWidth;\n    this.getContainerWidth();\n    return previousWidth != this.containerWidth;\n  };\n\n  return Masonry;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbWFzb25yeS1sYXlvdXQvbWFzb25yeS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvbWFzb25yeS1sYXlvdXQvbWFzb25yeS5qcz84NGQzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogTWFzb25yeSB2NC4yLjJcbiAqIENhc2NhZGluZyBncmlkIGxheW91dCBsaWJyYXJ5XG4gKiBodHRwczovL21hc29ucnkuZGVzYW5kcm8uY29tXG4gKiBNSVQgTGljZW5zZVxuICogYnkgRGF2aWQgRGVTYW5kcm9cbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICAgJ291dGxheWVyL291dGxheWVyJyxcbiAgICAgICAgJ2dldC1zaXplL2dldC1zaXplJ1xuICAgICAgXSxcbiAgICAgIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHJlcXVpcmUoJ291dGxheWVyJyksXG4gICAgICByZXF1aXJlKCdnZXQtc2l6ZScpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5NYXNvbnJ5ID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdy5PdXRsYXllcixcbiAgICAgIHdpbmRvdy5nZXRTaXplXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIE91dGxheWVyLCBnZXRTaXplICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1hc29ucnlEZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLy8gY3JlYXRlIGFuIE91dGxheWVyIGxheW91dCBjbGFzc1xuICB2YXIgTWFzb25yeSA9IE91dGxheWVyLmNyZWF0ZSgnbWFzb25yeScpO1xuICAvLyBpc0ZpdFdpZHRoIC0+IGZpdFdpZHRoXG4gIE1hc29ucnkuY29tcGF0T3B0aW9ucy5maXRXaWR0aCA9ICdpc0ZpdFdpZHRoJztcblxuICB2YXIgcHJvdG8gPSBNYXNvbnJ5LnByb3RvdHlwZTtcblxuICBwcm90by5fcmVzZXRMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmdldFNpemUoKTtcbiAgICB0aGlzLl9nZXRNZWFzdXJlbWVudCggJ2NvbHVtbldpZHRoJywgJ291dGVyV2lkdGgnICk7XG4gICAgdGhpcy5fZ2V0TWVhc3VyZW1lbnQoICdndXR0ZXInLCAnb3V0ZXJXaWR0aCcgKTtcbiAgICB0aGlzLm1lYXN1cmVDb2x1bW5zKCk7XG5cbiAgICAvLyByZXNldCBjb2x1bW4gWVxuICAgIHRoaXMuY29sWXMgPSBbXTtcbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5jb2xzOyBpKysgKSB7XG4gICAgICB0aGlzLmNvbFlzLnB1c2goIDAgKTtcbiAgICB9XG5cbiAgICB0aGlzLm1heFkgPSAwO1xuICAgIHRoaXMuaG9yaXpvbnRhbENvbEluZGV4ID0gMDtcbiAgfTtcblxuICBwcm90by5tZWFzdXJlQ29sdW1ucyA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKTtcbiAgICAvLyBpZiBjb2x1bW5XaWR0aCBpcyAwLCBkZWZhdWx0IHRvIG91dGVyV2lkdGggb2YgZmlyc3QgaXRlbVxuICAgIGlmICggIXRoaXMuY29sdW1uV2lkdGggKSB7XG4gICAgICB2YXIgZmlyc3RJdGVtID0gdGhpcy5pdGVtc1swXTtcbiAgICAgIHZhciBmaXJzdEl0ZW1FbGVtID0gZmlyc3RJdGVtICYmIGZpcnN0SXRlbS5lbGVtZW50O1xuICAgICAgLy8gY29sdW1uV2lkdGggZmFsbCBiYWNrIHRvIGl0ZW0gb2YgZmlyc3QgZWxlbWVudFxuICAgICAgdGhpcy5jb2x1bW5XaWR0aCA9IGZpcnN0SXRlbUVsZW0gJiYgZ2V0U2l6ZSggZmlyc3RJdGVtRWxlbSApLm91dGVyV2lkdGggfHxcbiAgICAgICAgLy8gaWYgZmlyc3QgZWxlbSBoYXMgbm8gd2lkdGgsIGRlZmF1bHQgdG8gc2l6ZSBvZiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aDtcbiAgICB9XG5cbiAgICB2YXIgY29sdW1uV2lkdGggPSB0aGlzLmNvbHVtbldpZHRoICs9IHRoaXMuZ3V0dGVyO1xuXG4gICAgLy8gY2FsY3VsYXRlIGNvbHVtbnNcbiAgICB2YXIgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoICsgdGhpcy5ndXR0ZXI7XG4gICAgdmFyIGNvbHMgPSBjb250YWluZXJXaWR0aCAvIGNvbHVtbldpZHRoO1xuICAgIC8vIGZpeCByb3VuZGluZyBlcnJvcnMsIHR5cGljYWxseSB3aXRoIGd1dHRlcnNcbiAgICB2YXIgZXhjZXNzID0gY29sdW1uV2lkdGggLSBjb250YWluZXJXaWR0aCAlIGNvbHVtbldpZHRoO1xuICAgIC8vIGlmIG92ZXJzaG9vdCBpcyBsZXNzIHRoYW4gYSBwaXhlbCwgcm91bmQgdXAsIG90aGVyd2lzZSBmbG9vciBpdFxuICAgIHZhciBtYXRoTWV0aG9kID0gZXhjZXNzICYmIGV4Y2VzcyA8IDEgPyAncm91bmQnIDogJ2Zsb29yJztcbiAgICBjb2xzID0gTWF0aFsgbWF0aE1ldGhvZCBdKCBjb2xzICk7XG4gICAgdGhpcy5jb2xzID0gTWF0aC5tYXgoIGNvbHMsIDEgKTtcbiAgfTtcblxuICBwcm90by5nZXRDb250YWluZXJXaWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIGNvbnRhaW5lciBpcyBwYXJlbnQgaWYgZml0IHdpZHRoXG4gICAgdmFyIGlzRml0V2lkdGggPSB0aGlzLl9nZXRPcHRpb24oJ2ZpdFdpZHRoJyk7XG4gICAgdmFyIGNvbnRhaW5lciA9IGlzRml0V2lkdGggPyB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSA6IHRoaXMuZWxlbWVudDtcbiAgICAvLyBjaGVjayB0aGF0IHRoaXMuc2l6ZSBhbmQgc2l6ZSBhcmUgdGhlcmVcbiAgICAvLyBJRTggdHJpZ2dlcnMgcmVzaXplIG9uIGJvZHkgc2l6ZSBjaGFuZ2UsIHNvIHRoZXkgbWlnaHQgbm90IGJlXG4gICAgdmFyIHNpemUgPSBnZXRTaXplKCBjb250YWluZXIgKTtcbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gc2l6ZSAmJiBzaXplLmlubmVyV2lkdGg7XG4gIH07XG5cbiAgcHJvdG8uX2dldEl0ZW1MYXlvdXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIGl0ZW0uZ2V0U2l6ZSgpO1xuICAgIC8vIGhvdyBtYW55IGNvbHVtbnMgZG9lcyB0aGlzIGJyaWNrIHNwYW5cbiAgICB2YXIgcmVtYWluZGVyID0gaXRlbS5zaXplLm91dGVyV2lkdGggJSB0aGlzLmNvbHVtbldpZHRoO1xuICAgIHZhciBtYXRoTWV0aG9kID0gcmVtYWluZGVyICYmIHJlbWFpbmRlciA8IDEgPyAncm91bmQnIDogJ2NlaWwnO1xuICAgIC8vIHJvdW5kIGlmIG9mZiBieSAxIHBpeGVsLCBvdGhlcndpc2UgdXNlIGNlaWxcbiAgICB2YXIgY29sU3BhbiA9IE1hdGhbIG1hdGhNZXRob2QgXSggaXRlbS5zaXplLm91dGVyV2lkdGggLyB0aGlzLmNvbHVtbldpZHRoICk7XG4gICAgY29sU3BhbiA9IE1hdGgubWluKCBjb2xTcGFuLCB0aGlzLmNvbHMgKTtcbiAgICAvLyB1c2UgaG9yaXpvbnRhbCBvciB0b3AgY29sdW1uIHBvc2l0aW9uXG4gICAgdmFyIGNvbFBvc01ldGhvZCA9IHRoaXMub3B0aW9ucy5ob3Jpem9udGFsT3JkZXIgP1xuICAgICAgJ19nZXRIb3Jpem9udGFsQ29sUG9zaXRpb24nIDogJ19nZXRUb3BDb2xQb3NpdGlvbic7XG4gICAgdmFyIGNvbFBvc2l0aW9uID0gdGhpc1sgY29sUG9zTWV0aG9kIF0oIGNvbFNwYW4sIGl0ZW0gKTtcbiAgICAvLyBwb3NpdGlvbiB0aGUgYnJpY2tcbiAgICB2YXIgcG9zaXRpb24gPSB7XG4gICAgICB4OiB0aGlzLmNvbHVtbldpZHRoICogY29sUG9zaXRpb24uY29sLFxuICAgICAgeTogY29sUG9zaXRpb24ueVxuICAgIH07XG4gICAgLy8gYXBwbHkgc2V0SGVpZ2h0IHRvIG5lY2Vzc2FyeSBjb2x1bW5zXG4gICAgdmFyIHNldEhlaWdodCA9IGNvbFBvc2l0aW9uLnkgKyBpdGVtLnNpemUub3V0ZXJIZWlnaHQ7XG4gICAgdmFyIHNldE1heCA9IGNvbFNwYW4gKyBjb2xQb3NpdGlvbi5jb2w7XG4gICAgZm9yICggdmFyIGkgPSBjb2xQb3NpdGlvbi5jb2w7IGkgPCBzZXRNYXg7IGkrKyApIHtcbiAgICAgIHRoaXMuY29sWXNbaV0gPSBzZXRIZWlnaHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9O1xuXG4gIHByb3RvLl9nZXRUb3BDb2xQb3NpdGlvbiA9IGZ1bmN0aW9uKCBjb2xTcGFuICkge1xuICAgIHZhciBjb2xHcm91cCA9IHRoaXMuX2dldFRvcENvbEdyb3VwKCBjb2xTcGFuICk7XG4gICAgLy8gZ2V0IHRoZSBtaW5pbXVtIFkgdmFsdWUgZnJvbSB0aGUgY29sdW1uc1xuICAgIHZhciBtaW5pbXVtWSA9IE1hdGgubWluLmFwcGx5KCBNYXRoLCBjb2xHcm91cCApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbDogY29sR3JvdXAuaW5kZXhPZiggbWluaW11bVkgKSxcbiAgICAgIHk6IG1pbmltdW1ZLFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjb2xTcGFuIC0gbnVtYmVyIG9mIGNvbHVtbnMgdGhlIGVsZW1lbnQgc3BhbnNcbiAgICogQHJldHVybnMge0FycmF5fSBjb2xHcm91cFxuICAgKi9cbiAgcHJvdG8uX2dldFRvcENvbEdyb3VwID0gZnVuY3Rpb24oIGNvbFNwYW4gKSB7XG4gICAgaWYgKCBjb2xTcGFuIDwgMiApIHtcbiAgICAgIC8vIGlmIGJyaWNrIHNwYW5zIG9ubHkgb25lIGNvbHVtbiwgdXNlIGFsbCB0aGUgY29sdW1uIFlzXG4gICAgICByZXR1cm4gdGhpcy5jb2xZcztcbiAgICB9XG5cbiAgICB2YXIgY29sR3JvdXAgPSBbXTtcbiAgICAvLyBob3cgbWFueSBkaWZmZXJlbnQgcGxhY2VzIGNvdWxkIHRoaXMgYnJpY2sgZml0IGhvcml6b250YWxseVxuICAgIHZhciBncm91cENvdW50ID0gdGhpcy5jb2xzICsgMSAtIGNvbFNwYW47XG4gICAgLy8gZm9yIGVhY2ggZ3JvdXAgcG90ZW50aWFsIGhvcml6b250YWwgcG9zaXRpb25cbiAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBncm91cENvdW50OyBpKysgKSB7XG4gICAgICBjb2xHcm91cFtpXSA9IHRoaXMuX2dldENvbEdyb3VwWSggaSwgY29sU3BhbiApO1xuICAgIH1cbiAgICByZXR1cm4gY29sR3JvdXA7XG4gIH07XG5cbiAgcHJvdG8uX2dldENvbEdyb3VwWSA9IGZ1bmN0aW9uKCBjb2wsIGNvbFNwYW4gKSB7XG4gICAgaWYgKCBjb2xTcGFuIDwgMiApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbFlzWyBjb2wgXTtcbiAgICB9XG4gICAgLy8gbWFrZSBhbiBhcnJheSBvZiBjb2xZIHZhbHVlcyBmb3IgdGhhdCBvbmUgZ3JvdXBcbiAgICB2YXIgZ3JvdXBDb2xZcyA9IHRoaXMuY29sWXMuc2xpY2UoIGNvbCwgY29sICsgY29sU3BhbiApO1xuICAgIC8vIGFuZCBnZXQgdGhlIG1heCB2YWx1ZSBvZiB0aGUgYXJyYXlcbiAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoIE1hdGgsIGdyb3VwQ29sWXMgKTtcbiAgfTtcblxuICAvLyBnZXQgY29sdW1uIHBvc2l0aW9uIGJhc2VkIG9uIGhvcml6b250YWwgaW5kZXguICM4NzNcbiAgcHJvdG8uX2dldEhvcml6b250YWxDb2xQb3NpdGlvbiA9IGZ1bmN0aW9uKCBjb2xTcGFuLCBpdGVtICkge1xuICAgIHZhciBjb2wgPSB0aGlzLmhvcml6b250YWxDb2xJbmRleCAlIHRoaXMuY29scztcbiAgICB2YXIgaXNPdmVyID0gY29sU3BhbiA+IDEgJiYgY29sICsgY29sU3BhbiA+IHRoaXMuY29scztcbiAgICAvLyBzaGlmdCB0byBuZXh0IHJvdyBpZiBpdGVtIGNhbid0IGZpdCBvbiBjdXJyZW50IHJvd1xuICAgIGNvbCA9IGlzT3ZlciA/IDAgOiBjb2w7XG4gICAgLy8gZG9uJ3QgbGV0IHplcm8tc2l6ZSBpdGVtcyB0YWtlIHVwIHNwYWNlXG4gICAgdmFyIGhhc1NpemUgPSBpdGVtLnNpemUub3V0ZXJXaWR0aCAmJiBpdGVtLnNpemUub3V0ZXJIZWlnaHQ7XG4gICAgdGhpcy5ob3Jpem9udGFsQ29sSW5kZXggPSBoYXNTaXplID8gY29sICsgY29sU3BhbiA6IHRoaXMuaG9yaXpvbnRhbENvbEluZGV4O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbDogY29sLFxuICAgICAgeTogdGhpcy5fZ2V0Q29sR3JvdXBZKCBjb2wsIGNvbFNwYW4gKSxcbiAgICB9O1xuICB9O1xuXG4gIHByb3RvLl9tYW5hZ2VTdGFtcCA9IGZ1bmN0aW9uKCBzdGFtcCApIHtcbiAgICB2YXIgc3RhbXBTaXplID0gZ2V0U2l6ZSggc3RhbXAgKTtcbiAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fZ2V0RWxlbWVudE9mZnNldCggc3RhbXAgKTtcbiAgICAvLyBnZXQgdGhlIGNvbHVtbnMgdGhhdCB0aGlzIHN0YW1wIGFmZmVjdHNcbiAgICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5fZ2V0T3B0aW9uKCdvcmlnaW5MZWZ0Jyk7XG4gICAgdmFyIGZpcnN0WCA9IGlzT3JpZ2luTGVmdCA/IG9mZnNldC5sZWZ0IDogb2Zmc2V0LnJpZ2h0O1xuICAgIHZhciBsYXN0WCA9IGZpcnN0WCArIHN0YW1wU2l6ZS5vdXRlcldpZHRoO1xuICAgIHZhciBmaXJzdENvbCA9IE1hdGguZmxvb3IoIGZpcnN0WCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICBmaXJzdENvbCA9IE1hdGgubWF4KCAwLCBmaXJzdENvbCApO1xuICAgIHZhciBsYXN0Q29sID0gTWF0aC5mbG9vciggbGFzdFggLyB0aGlzLmNvbHVtbldpZHRoICk7XG4gICAgLy8gbGFzdENvbCBzaG91bGQgbm90IGdvIG92ZXIgaWYgbXVsdGlwbGUgb2YgY29sdW1uV2lkdGggIzQyNVxuICAgIGxhc3RDb2wgLT0gbGFzdFggJSB0aGlzLmNvbHVtbldpZHRoID8gMCA6IDE7XG4gICAgbGFzdENvbCA9IE1hdGgubWluKCB0aGlzLmNvbHMgLSAxLCBsYXN0Q29sICk7XG4gICAgLy8gc2V0IGNvbFlzIHRvIGJvdHRvbSBvZiB0aGUgc3RhbXBcblxuICAgIHZhciBpc09yaWdpblRvcCA9IHRoaXMuX2dldE9wdGlvbignb3JpZ2luVG9wJyk7XG4gICAgdmFyIHN0YW1wTWF4WSA9ICggaXNPcmlnaW5Ub3AgPyBvZmZzZXQudG9wIDogb2Zmc2V0LmJvdHRvbSApICtcbiAgICAgIHN0YW1wU2l6ZS5vdXRlckhlaWdodDtcbiAgICBmb3IgKCB2YXIgaSA9IGZpcnN0Q29sOyBpIDw9IGxhc3RDb2w7IGkrKyApIHtcbiAgICAgIHRoaXMuY29sWXNbaV0gPSBNYXRoLm1heCggc3RhbXBNYXhZLCB0aGlzLmNvbFlzW2ldICk7XG4gICAgfVxuICB9O1xuXG4gIHByb3RvLl9nZXRDb250YWluZXJTaXplID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5tYXhZID0gTWF0aC5tYXguYXBwbHkoIE1hdGgsIHRoaXMuY29sWXMgKTtcbiAgICB2YXIgc2l6ZSA9IHtcbiAgICAgIGhlaWdodDogdGhpcy5tYXhZXG4gICAgfTtcblxuICAgIGlmICggdGhpcy5fZ2V0T3B0aW9uKCdmaXRXaWR0aCcpICkge1xuICAgICAgc2l6ZS53aWR0aCA9IHRoaXMuX2dldENvbnRhaW5lckZpdFdpZHRoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpemU7XG4gIH07XG5cbiAgcHJvdG8uX2dldENvbnRhaW5lckZpdFdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHVudXNlZENvbHMgPSAwO1xuICAgIC8vIGNvdW50IHVudXNlZCBjb2x1bW5zXG4gICAgdmFyIGkgPSB0aGlzLmNvbHM7XG4gICAgd2hpbGUgKCAtLWkgKSB7XG4gICAgICBpZiAoIHRoaXMuY29sWXNbaV0gIT09IDAgKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdW51c2VkQ29scysrO1xuICAgIH1cbiAgICAvLyBmaXQgY29udGFpbmVyIHRvIGNvbHVtbnMgdGhhdCBoYXZlIGJlZW4gdXNlZFxuICAgIHJldHVybiAoIHRoaXMuY29scyAtIHVudXNlZENvbHMgKSAqIHRoaXMuY29sdW1uV2lkdGggLSB0aGlzLmd1dHRlcjtcbiAgfTtcblxuICBwcm90by5uZWVkc1Jlc2l6ZUxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwcmV2aW91c1dpZHRoID0gdGhpcy5jb250YWluZXJXaWR0aDtcbiAgICB0aGlzLmdldENvbnRhaW5lcldpZHRoKCk7XG4gICAgcmV0dXJuIHByZXZpb3VzV2lkdGggIT0gdGhpcy5jb250YWluZXJXaWR0aDtcbiAgfTtcblxuICByZXR1cm4gTWFzb25yeTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/masonry-layout/masonry.js\n");

/***/ }),

/***/ "./node_modules/morphdom/dist/morphdom-esm.js":
/*!****************************************************!*\
  !*** ./node_modules/morphdom/dist/morphdom-esm.js ***!
  \****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nvar DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n    var toNodeAttrs = toNode.attributes;\n    var attr;\n    var attrName;\n    var attrNamespaceURI;\n    var attrValue;\n    var fromValue;\n\n    // document-fragments dont have attributes so lets not do anything\n    if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n      return;\n    }\n\n    // update attributes on original DOM element\n    for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n        attr = toNodeAttrs[i];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n        attrValue = attr.value;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n            fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n            if (fromValue !== attrValue) {\n                if (attr.prefix === 'xmlns'){\n                    attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n                }\n                fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n            }\n        } else {\n            fromValue = fromNode.getAttribute(attrName);\n\n            if (fromValue !== attrValue) {\n                fromNode.setAttribute(attrName, attrValue);\n            }\n        }\n    }\n\n    // Remove any extra attributes found on the original DOM element that\n    // weren't found on the target element.\n    var fromNodeAttrs = fromNode.attributes;\n\n    for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n        attr = fromNodeAttrs[d];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n\n            if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n                fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n            }\n        } else {\n            if (!toNode.hasAttribute(attrName)) {\n                fromNode.removeAttribute(attrName);\n            }\n        }\n    }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n    var template = doc.createElement('template');\n    template.innerHTML = str;\n    return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n    if (!range) {\n        range = doc.createRange();\n        range.selectNode(doc.body);\n    }\n\n    var fragment = range.createContextualFragment(str);\n    return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n    var fragment = doc.createElement('body');\n    fragment.innerHTML = str;\n    return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n    str = str.trim();\n    if (HAS_TEMPLATE_SUPPORT) {\n      // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which\n      // createContextualFragment doesn't support\n      // <template> support not available in IE\n      return createFragmentFromTemplate(str);\n    } else if (HAS_RANGE_SUPPORT) {\n      return createFragmentFromRange(str);\n    }\n\n    return createFragmentFromWrap(str);\n}\n\n/**\n * Returns true if two node's names are the same.\n *\n * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same\n *       nodeName and different namespace URIs.\n *\n * @param {Element} a\n * @param {Element} b The target element\n * @return {boolean}\n */\nfunction compareNodeNames(fromEl, toEl) {\n    var fromNodeName = fromEl.nodeName;\n    var toNodeName = toEl.nodeName;\n\n    if (fromNodeName === toNodeName) {\n        return true;\n    }\n\n    if (toEl.actualize &&\n        fromNodeName.charCodeAt(0) < 91 && /* from tag name is upper case */\n        toNodeName.charCodeAt(0) > 90 /* target tag name is lower case */) {\n        // If the target element is a virtual DOM node then we may need to normalize the tag name\n        // before comparing. Normal HTML elements that are in the \"http://www.w3.org/1999/xhtml\"\n        // are converted to upper case\n        return fromNodeName === toNodeName.toUpperCase();\n    } else {\n        return false;\n    }\n}\n\n/**\n * Create an element, optionally with a known namespace URI.\n *\n * @param {string} name the element name, e.g. 'div' or 'svg'\n * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of\n * its `xmlns` attribute or its inferred namespace.\n *\n * @return {Element}\n */\nfunction createElementNS(name, namespaceURI) {\n    return !namespaceURI || namespaceURI === NS_XHTML ?\n        doc.createElement(name) :\n        doc.createElementNS(namespaceURI, name);\n}\n\n/**\n * Copies the children of one DOM element to another DOM element\n */\nfunction moveChildren(fromEl, toEl) {\n    var curChild = fromEl.firstChild;\n    while (curChild) {\n        var nextChild = curChild.nextSibling;\n        toEl.appendChild(curChild);\n        curChild = nextChild;\n    }\n    return toEl;\n}\n\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n    if (fromEl[name] !== toEl[name]) {\n        fromEl[name] = toEl[name];\n        if (fromEl[name]) {\n            fromEl.setAttribute(name, '');\n        } else {\n            fromEl.removeAttribute(name);\n        }\n    }\n}\n\nvar specialElHandlers = {\n    OPTION: function(fromEl, toEl) {\n        var parentNode = fromEl.parentNode;\n        if (parentNode) {\n            var parentName = parentNode.nodeName.toUpperCase();\n            if (parentName === 'OPTGROUP') {\n                parentNode = parentNode.parentNode;\n                parentName = parentNode && parentNode.nodeName.toUpperCase();\n            }\n            if (parentName === 'SELECT' && !parentNode.hasAttribute('multiple')) {\n                if (fromEl.hasAttribute('selected') && !toEl.selected) {\n                    // Workaround for MS Edge bug where the 'selected' attribute can only be\n                    // removed if set to a non-empty value:\n                    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12087679/\n                    fromEl.setAttribute('selected', 'selected');\n                    fromEl.removeAttribute('selected');\n                }\n                // We have to reset select element's selectedIndex to -1, otherwise setting\n                // fromEl.selected using the syncBooleanAttrProp below has no effect.\n                // The correct selectedIndex will be set in the SELECT special handler below.\n                parentNode.selectedIndex = -1;\n            }\n        }\n        syncBooleanAttrProp(fromEl, toEl, 'selected');\n    },\n    /**\n     * The \"value\" attribute is special for the <input> element since it sets\n     * the initial value. Changing the \"value\" attribute without changing the\n     * \"value\" property will have no effect since it is only used to the set the\n     * initial value.  Similar for the \"checked\" attribute, and \"disabled\".\n     */\n    INPUT: function(fromEl, toEl) {\n        syncBooleanAttrProp(fromEl, toEl, 'checked');\n        syncBooleanAttrProp(fromEl, toEl, 'disabled');\n\n        if (fromEl.value !== toEl.value) {\n            fromEl.value = toEl.value;\n        }\n\n        if (!toEl.hasAttribute('value')) {\n            fromEl.removeAttribute('value');\n        }\n    },\n\n    TEXTAREA: function(fromEl, toEl) {\n        var newValue = toEl.value;\n        if (fromEl.value !== newValue) {\n            fromEl.value = newValue;\n        }\n\n        var firstChild = fromEl.firstChild;\n        if (firstChild) {\n            // Needed for IE. Apparently IE sets the placeholder as the\n            // node value and vise versa. This ignores an empty update.\n            var oldValue = firstChild.nodeValue;\n\n            if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {\n                return;\n            }\n\n            firstChild.nodeValue = newValue;\n        }\n    },\n    SELECT: function(fromEl, toEl) {\n        if (!toEl.hasAttribute('multiple')) {\n            var selectedIndex = -1;\n            var i = 0;\n            // We have to loop through children of fromEl, not toEl since nodes can be moved\n            // from toEl to fromEl directly when morphing.\n            // At the time this special handler is invoked, all children have already been morphed\n            // and appended to / removed from fromEl, so using fromEl here is safe and correct.\n            var curChild = fromEl.firstChild;\n            var optgroup;\n            var nodeName;\n            while(curChild) {\n                nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n                if (nodeName === 'OPTGROUP') {\n                    optgroup = curChild;\n                    curChild = optgroup.firstChild;\n                } else {\n                    if (nodeName === 'OPTION') {\n                        if (curChild.hasAttribute('selected')) {\n                            selectedIndex = i;\n                            break;\n                        }\n                        i++;\n                    }\n                    curChild = curChild.nextSibling;\n                    if (!curChild && optgroup) {\n                        curChild = optgroup.nextSibling;\n                        optgroup = null;\n                    }\n                }\n            }\n\n            fromEl.selectedIndex = selectedIndex;\n        }\n    }\n};\n\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\n\nfunction noop() {}\n\nfunction defaultGetNodeKey(node) {\n  if (node) {\n      return (node.getAttribute && node.getAttribute('id')) || node.id;\n  }\n}\n\nfunction morphdomFactory(morphAttrs) {\n\n    return function morphdom(fromNode, toNode, options) {\n        if (!options) {\n            options = {};\n        }\n\n        if (typeof toNode === 'string') {\n            if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML') {\n                var toNodeHtml = toNode;\n                toNode = doc.createElement('html');\n                toNode.innerHTML = toNodeHtml;\n            } else {\n                toNode = toElement(toNode);\n            }\n        }\n\n        var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n        var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n        var onNodeAdded = options.onNodeAdded || noop;\n        var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n        var onElUpdated = options.onElUpdated || noop;\n        var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n        var onNodeDiscarded = options.onNodeDiscarded || noop;\n        var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n        var childrenOnly = options.childrenOnly === true;\n\n        // This object is used as a lookup to quickly find all keyed elements in the original DOM tree.\n        var fromNodesLookup = Object.create(null);\n        var keyedRemovalList = [];\n\n        function addKeyedRemoval(key) {\n            keyedRemovalList.push(key);\n        }\n\n        function walkDiscardedChildNodes(node, skipKeyedNodes) {\n            if (node.nodeType === ELEMENT_NODE) {\n                var curChild = node.firstChild;\n                while (curChild) {\n\n                    var key = undefined;\n\n                    if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n                        // If we are skipping keyed nodes then we add the key\n                        // to a list so that it can be handled at the very end.\n                        addKeyedRemoval(key);\n                    } else {\n                        // Only report the node as discarded if it is not keyed. We do this because\n                        // at the end we loop through all keyed elements that were unmatched\n                        // and then discard them in one final pass.\n                        onNodeDiscarded(curChild);\n                        if (curChild.firstChild) {\n                            walkDiscardedChildNodes(curChild, skipKeyedNodes);\n                        }\n                    }\n\n                    curChild = curChild.nextSibling;\n                }\n            }\n        }\n\n        /**\n         * Removes a DOM node out of the original DOM\n         *\n         * @param  {Node} node The node to remove\n         * @param  {Node} parentNode The nodes parent\n         * @param  {Boolean} skipKeyedNodes If true then elements with keys will be skipped and not discarded.\n         * @return {undefined}\n         */\n        function removeNode(node, parentNode, skipKeyedNodes) {\n            if (onBeforeNodeDiscarded(node) === false) {\n                return;\n            }\n\n            if (parentNode) {\n                parentNode.removeChild(node);\n            }\n\n            onNodeDiscarded(node);\n            walkDiscardedChildNodes(node, skipKeyedNodes);\n        }\n\n        // // TreeWalker implementation is no faster, but keeping this around in case this changes in the future\n        // function indexTree(root) {\n        //     var treeWalker = document.createTreeWalker(\n        //         root,\n        //         NodeFilter.SHOW_ELEMENT);\n        //\n        //     var el;\n        //     while((el = treeWalker.nextNode())) {\n        //         var key = getNodeKey(el);\n        //         if (key) {\n        //             fromNodesLookup[key] = el;\n        //         }\n        //     }\n        // }\n\n        // // NodeIterator implementation is no faster, but keeping this around in case this changes in the future\n        //\n        // function indexTree(node) {\n        //     var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT);\n        //     var el;\n        //     while((el = nodeIterator.nextNode())) {\n        //         var key = getNodeKey(el);\n        //         if (key) {\n        //             fromNodesLookup[key] = el;\n        //         }\n        //     }\n        // }\n\n        function indexTree(node) {\n            if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n                var curChild = node.firstChild;\n                while (curChild) {\n                    var key = getNodeKey(curChild);\n                    if (key) {\n                        fromNodesLookup[key] = curChild;\n                    }\n\n                    // Walk recursively\n                    indexTree(curChild);\n\n                    curChild = curChild.nextSibling;\n                }\n            }\n        }\n\n        indexTree(fromNode);\n\n        function handleNodeAdded(el) {\n            onNodeAdded(el);\n\n            var curChild = el.firstChild;\n            while (curChild) {\n                var nextSibling = curChild.nextSibling;\n\n                var key = getNodeKey(curChild);\n                if (key) {\n                    var unmatchedFromEl = fromNodesLookup[key];\n                    if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n                        curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n                        morphEl(unmatchedFromEl, curChild);\n                    }\n                }\n\n                handleNodeAdded(curChild);\n                curChild = nextSibling;\n            }\n        }\n\n        function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n            // We have processed all of the \"to nodes\". If curFromNodeChild is\n            // non-null then we still have some from nodes left over that need\n            // to be removed\n            while (curFromNodeChild) {\n                var fromNextSibling = curFromNodeChild.nextSibling;\n                if ((curFromNodeKey = getNodeKey(curFromNodeChild))) {\n                    // Since the node is keyed it might be matched up later so we defer\n                    // the actual removal to later\n                    addKeyedRemoval(curFromNodeKey);\n                } else {\n                    // NOTE: we skip nested keyed nodes from being removed since there is\n                    //       still a chance they will be matched up later\n                    removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n                }\n                curFromNodeChild = fromNextSibling;\n            }\n        }\n\n        function morphEl(fromEl, toEl, childrenOnly) {\n            var toElKey = getNodeKey(toEl);\n\n            if (toElKey) {\n                // If an element with an ID is being morphed then it will be in the final\n                // DOM so clear it out of the saved elements collection\n                delete fromNodesLookup[toElKey];\n            }\n\n            if (!childrenOnly) {\n                // optional\n                if (onBeforeElUpdated(fromEl, toEl) === false) {\n                    return;\n                }\n\n                // update attributes on original DOM element first\n                morphAttrs(fromEl, toEl);\n                // optional\n                onElUpdated(fromEl);\n\n                if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n                    return;\n                }\n            }\n\n            if (fromEl.nodeName !== 'TEXTAREA') {\n              morphChildren(fromEl, toEl);\n            } else {\n              specialElHandlers.TEXTAREA(fromEl, toEl);\n            }\n        }\n\n        function morphChildren(fromEl, toEl) {\n            var curToNodeChild = toEl.firstChild;\n            var curFromNodeChild = fromEl.firstChild;\n            var curToNodeKey;\n            var curFromNodeKey;\n\n            var fromNextSibling;\n            var toNextSibling;\n            var matchingFromEl;\n\n            // walk the children\n            outer: while (curToNodeChild) {\n                toNextSibling = curToNodeChild.nextSibling;\n                curToNodeKey = getNodeKey(curToNodeChild);\n\n                // walk the fromNode children all the way through\n                while (curFromNodeChild) {\n                    fromNextSibling = curFromNodeChild.nextSibling;\n\n                    if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n                        curToNodeChild = toNextSibling;\n                        curFromNodeChild = fromNextSibling;\n                        continue outer;\n                    }\n\n                    curFromNodeKey = getNodeKey(curFromNodeChild);\n\n                    var curFromNodeType = curFromNodeChild.nodeType;\n\n                    // this means if the curFromNodeChild doesnt have a match with the curToNodeChild\n                    var isCompatible = undefined;\n\n                    if (curFromNodeType === curToNodeChild.nodeType) {\n                        if (curFromNodeType === ELEMENT_NODE) {\n                            // Both nodes being compared are Element nodes\n\n                            if (curToNodeKey) {\n                                // The target node has a key so we want to match it up with the correct element\n                                // in the original DOM tree\n                                if (curToNodeKey !== curFromNodeKey) {\n                                    // The current element in the original DOM tree does not have a matching key so\n                                    // let's check our lookup to see if there is a matching element in the original\n                                    // DOM tree\n                                    if ((matchingFromEl = fromNodesLookup[curToNodeKey])) {\n                                        if (fromNextSibling === matchingFromEl) {\n                                            // Special case for single element removals. To avoid removing the original\n                                            // DOM node out of the tree (since that can break CSS transitions, etc.),\n                                            // we will instead discard the current node and wait until the next\n                                            // iteration to properly match up the keyed target element with its matching\n                                            // element in the original tree\n                                            isCompatible = false;\n                                        } else {\n                                            // We found a matching keyed element somewhere in the original DOM tree.\n                                            // Let's move the original DOM node into the current position and morph\n                                            // it.\n\n                                            // NOTE: We use insertBefore instead of replaceChild because we want to go through\n                                            // the `removeNode()` function for the node that is being discarded so that\n                                            // all lifecycle hooks are correctly invoked\n                                            fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n\n                                            // fromNextSibling = curFromNodeChild.nextSibling;\n\n                                            if (curFromNodeKey) {\n                                                // Since the node is keyed it might be matched up later so we defer\n                                                // the actual removal to later\n                                                addKeyedRemoval(curFromNodeKey);\n                                            } else {\n                                                // NOTE: we skip nested keyed nodes from being removed since there is\n                                                //       still a chance they will be matched up later\n                                                removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n                                            }\n\n                                            curFromNodeChild = matchingFromEl;\n                                        }\n                                    } else {\n                                        // The nodes are not compatible since the \"to\" node has a key and there\n                                        // is no matching keyed node in the source tree\n                                        isCompatible = false;\n                                    }\n                                }\n                            } else if (curFromNodeKey) {\n                                // The original has a key\n                                isCompatible = false;\n                            }\n\n                            isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n                            if (isCompatible) {\n                                // We found compatible DOM elements so transform\n                                // the current \"from\" node to match the current\n                                // target DOM node.\n                                // MORPH\n                                morphEl(curFromNodeChild, curToNodeChild);\n                            }\n\n                        } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n                            // Both nodes being compared are Text or Comment nodes\n                            isCompatible = true;\n                            // Simply update nodeValue on the original node to\n                            // change the text value\n                            if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n                                curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n                            }\n\n                        }\n                    }\n\n                    if (isCompatible) {\n                        // Advance both the \"to\" child and the \"from\" child since we found a match\n                        // Nothing else to do as we already recursively called morphChildren above\n                        curToNodeChild = toNextSibling;\n                        curFromNodeChild = fromNextSibling;\n                        continue outer;\n                    }\n\n                    // No compatible match so remove the old node from the DOM and continue trying to find a\n                    // match in the original DOM. However, we only do this if the from node is not keyed\n                    // since it is possible that a keyed node might match up with a node somewhere else in the\n                    // target tree and we don't want to discard it just yet since it still might find a\n                    // home in the final DOM tree. After everything is done we will remove any keyed nodes\n                    // that didn't find a home\n                    if (curFromNodeKey) {\n                        // Since the node is keyed it might be matched up later so we defer\n                        // the actual removal to later\n                        addKeyedRemoval(curFromNodeKey);\n                    } else {\n                        // NOTE: we skip nested keyed nodes from being removed since there is\n                        //       still a chance they will be matched up later\n                        removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n                    }\n\n                    curFromNodeChild = fromNextSibling;\n                } // END: while(curFromNodeChild) {}\n\n                // If we got this far then we did not find a candidate match for\n                // our \"to node\" and we exhausted all of the children \"from\"\n                // nodes. Therefore, we will just append the current \"to\" node\n                // to the end\n                if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n                    fromEl.appendChild(matchingFromEl);\n                    // MORPH\n                    morphEl(matchingFromEl, curToNodeChild);\n                } else {\n                    var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n                    if (onBeforeNodeAddedResult !== false) {\n                        if (onBeforeNodeAddedResult) {\n                            curToNodeChild = onBeforeNodeAddedResult;\n                        }\n\n                        if (curToNodeChild.actualize) {\n                            curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n                        }\n                        fromEl.appendChild(curToNodeChild);\n                        handleNodeAdded(curToNodeChild);\n                    }\n                }\n\n                curToNodeChild = toNextSibling;\n                curFromNodeChild = fromNextSibling;\n            }\n\n            cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n\n            var specialElHandler = specialElHandlers[fromEl.nodeName];\n            if (specialElHandler) {\n                specialElHandler(fromEl, toEl);\n            }\n        } // END: morphChildren(...)\n\n        var morphedNode = fromNode;\n        var morphedNodeType = morphedNode.nodeType;\n        var toNodeType = toNode.nodeType;\n\n        if (!childrenOnly) {\n            // Handle the case where we are given two DOM nodes that are not\n            // compatible (e.g. <div> --> <span> or <div> --> TEXT)\n            if (morphedNodeType === ELEMENT_NODE) {\n                if (toNodeType === ELEMENT_NODE) {\n                    if (!compareNodeNames(fromNode, toNode)) {\n                        onNodeDiscarded(fromNode);\n                        morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n                    }\n                } else {\n                    // Going from an element node to a text node\n                    morphedNode = toNode;\n                }\n            } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node\n                if (toNodeType === morphedNodeType) {\n                    if (morphedNode.nodeValue !== toNode.nodeValue) {\n                        morphedNode.nodeValue = toNode.nodeValue;\n                    }\n\n                    return morphedNode;\n                } else {\n                    // Text node to something else\n                    morphedNode = toNode;\n                }\n            }\n        }\n\n        if (morphedNode === toNode) {\n            // The \"to node\" was not compatible with the \"from node\" so we had to\n            // toss out the \"from node\" and use the \"to node\"\n            onNodeDiscarded(fromNode);\n        } else {\n            if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n                return;\n            }\n\n            morphEl(morphedNode, toNode, childrenOnly);\n\n            // We now need to loop over any keyed nodes that might need to be\n            // removed. We only do the removal if we know that the keyed node\n            // never found a match. When a keyed node is matched up we remove\n            // it out of fromNodesLookup and we use fromNodesLookup to determine\n            // if a keyed node has been matched up or not\n            if (keyedRemovalList) {\n                for (var i=0, len=keyedRemovalList.length; i<len; i++) {\n                    var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n                    if (elToRemove) {\n                        removeNode(elToRemove, elToRemove.parentNode, false);\n                    }\n                }\n            }\n        }\n\n        if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n            if (morphedNode.actualize) {\n                morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n            }\n            // If we had to swap out the from node with a new node because the old\n            // node was not compatible with the target node then we need to\n            // replace the old DOM node in the original DOM tree. This is only\n            // possible if the original DOM node was part of a DOM tree which\n            // we know is the case if it has a parent node.\n            fromNode.parentNode.replaceChild(morphedNode, fromNode);\n        }\n\n        return morphedNode;\n    };\n}\n\nvar morphdom = morphdomFactory(morphAttrs);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (morphdom);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbW9ycGhkb20vZGlzdC9tb3JwaGRvbS1lc20uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL21vcnBoZG9tL2Rpc3QvbW9ycGhkb20tZXNtLmpzP2ZhZDgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuZnVuY3Rpb24gbW9ycGhBdHRycyhmcm9tTm9kZSwgdG9Ob2RlKSB7XG4gICAgdmFyIHRvTm9kZUF0dHJzID0gdG9Ob2RlLmF0dHJpYnV0ZXM7XG4gICAgdmFyIGF0dHI7XG4gICAgdmFyIGF0dHJOYW1lO1xuICAgIHZhciBhdHRyTmFtZXNwYWNlVVJJO1xuICAgIHZhciBhdHRyVmFsdWU7XG4gICAgdmFyIGZyb21WYWx1ZTtcblxuICAgIC8vIGRvY3VtZW50LWZyYWdtZW50cyBkb250IGhhdmUgYXR0cmlidXRlcyBzbyBsZXRzIG5vdCBkbyBhbnl0aGluZ1xuICAgIGlmICh0b05vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgZnJvbU5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgYXR0cmlidXRlcyBvbiBvcmlnaW5hbCBET00gZWxlbWVudFxuICAgIGZvciAodmFyIGkgPSB0b05vZGVBdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBhdHRyID0gdG9Ob2RlQXR0cnNbaV07XG4gICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHIudmFsdWU7XG5cbiAgICAgICAgaWYgKGF0dHJOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5sb2NhbE5hbWUgfHwgYXR0ck5hbWU7XG4gICAgICAgICAgICBmcm9tVmFsdWUgPSBmcm9tTm9kZS5nZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyLnByZWZpeCA9PT0gJ3htbG5zJyl7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lOyAvLyBJdCdzIG5vdCBhbGxvd2VkIHRvIHNldCBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgWE1MTlMgbmFtZXNwYWNlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgYHhtbG5zYCBwcmVmaXhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tVmFsdWUgPSBmcm9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGV4dHJhIGF0dHJpYnV0ZXMgZm91bmQgb24gdGhlIG9yaWdpbmFsIERPTSBlbGVtZW50IHRoYXRcbiAgICAvLyB3ZXJlbid0IGZvdW5kIG9uIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAgICB2YXIgZnJvbU5vZGVBdHRycyA9IGZyb21Ob2RlLmF0dHJpYnV0ZXM7XG5cbiAgICBmb3IgKHZhciBkID0gZnJvbU5vZGVBdHRycy5sZW5ndGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICBhdHRyID0gZnJvbU5vZGVBdHRyc1tkXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcblxuICAgICAgICAgICAgaWYgKCF0b05vZGUuaGFzQXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0b05vZGUuaGFzQXR0cmlidXRlKGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciByYW5nZTsgLy8gQ3JlYXRlIGEgcmFuZ2Ugb2JqZWN0IGZvciBlZmZpY2VudGx5IHJlbmRlcmluZyBzdHJpbmdzIHRvIGVsZW1lbnRzLlxudmFyIE5TX1hIVE1MID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuXG52YXIgZG9jID0gdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IGRvY3VtZW50O1xudmFyIEhBU19URU1QTEFURV9TVVBQT1JUID0gISFkb2MgJiYgJ2NvbnRlbnQnIGluIGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xudmFyIEhBU19SQU5HRV9TVVBQT1JUID0gISFkb2MgJiYgZG9jLmNyZWF0ZVJhbmdlICYmICdjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQnIGluIGRvYy5jcmVhdGVSYW5nZSgpO1xuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21UZW1wbGF0ZShzdHIpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSBkb2MuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tUmFuZ2Uoc3RyKSB7XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgICByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKGRvYy5ib2R5KTtcbiAgICB9XG5cbiAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RyKTtcbiAgICByZXR1cm4gZnJhZ21lbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tV3JhcChzdHIpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgnYm9keScpO1xuICAgIGZyYWdtZW50LmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gZnJhZ21lbnQuY2hpbGROb2Rlc1swXTtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIGFib3V0IHRoZSBzYW1lXG4gKiB2YXIgaHRtbCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoc3RyLCAndGV4dC9odG1sJyk7XG4gKiByZXR1cm4gaHRtbC5ib2R5LmZpcnN0Q2hpbGQ7XG4gKlxuICogQG1ldGhvZCB0b0VsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gdG9FbGVtZW50KHN0cikge1xuICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgaWYgKEhBU19URU1QTEFURV9TVVBQT1JUKSB7XG4gICAgICAvLyBhdm9pZCByZXN0cmljdGlvbnMgb24gY29udGVudCBmb3IgdGhpbmdzIGxpa2UgYDx0cj48dGg+SGk8L3RoPjwvdHI+YCB3aGljaFxuICAgICAgLy8gY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IGRvZXNuJ3Qgc3VwcG9ydFxuICAgICAgLy8gPHRlbXBsYXRlPiBzdXBwb3J0IG5vdCBhdmFpbGFibGUgaW4gSUVcbiAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21UZW1wbGF0ZShzdHIpO1xuICAgIH0gZWxzZSBpZiAoSEFTX1JBTkdFX1NVUFBPUlQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHR3byBub2RlJ3MgbmFtZXMgYXJlIHRoZSBzYW1lLlxuICpcbiAqIE5PVEU6IFdlIGRvbid0IGJvdGhlciBjaGVja2luZyBgbmFtZXNwYWNlVVJJYCBiZWNhdXNlIHlvdSB3aWxsIG5ldmVyIGZpbmQgdHdvIEhUTUwgZWxlbWVudHMgd2l0aCB0aGUgc2FtZVxuICogICAgICAgbm9kZU5hbWUgYW5kIGRpZmZlcmVudCBuYW1lc3BhY2UgVVJJcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYiBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTmFtZXMoZnJvbUVsLCB0b0VsKSB7XG4gICAgdmFyIGZyb21Ob2RlTmFtZSA9IGZyb21FbC5ub2RlTmFtZTtcbiAgICB2YXIgdG9Ob2RlTmFtZSA9IHRvRWwubm9kZU5hbWU7XG5cbiAgICBpZiAoZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0b0VsLmFjdHVhbGl6ZSAmJlxuICAgICAgICBmcm9tTm9kZU5hbWUuY2hhckNvZGVBdCgwKSA8IDkxICYmIC8qIGZyb20gdGFnIG5hbWUgaXMgdXBwZXIgY2FzZSAqL1xuICAgICAgICB0b05vZGVOYW1lLmNoYXJDb2RlQXQoMCkgPiA5MCAvKiB0YXJnZXQgdGFnIG5hbWUgaXMgbG93ZXIgY2FzZSAqLykge1xuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSB2aXJ0dWFsIERPTSBub2RlIHRoZW4gd2UgbWF5IG5lZWQgdG8gbm9ybWFsaXplIHRoZSB0YWcgbmFtZVxuICAgICAgICAvLyBiZWZvcmUgY29tcGFyaW5nLiBOb3JtYWwgSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBpbiB0aGUgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJcbiAgICAgICAgLy8gYXJlIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlXG4gICAgICAgIHJldHVybiBmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBOU19YSFRNTCA/XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpIDpcbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgY2hpbGRyZW4gb2Ygb25lIERPTSBlbGVtZW50IHRvIGFub3RoZXIgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbW92ZUNoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIHRvRWwuYXBwZW5kQ2hpbGQoY3VyQ2hpbGQpO1xuICAgICAgICBjdXJDaGlsZCA9IG5leHRDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvRWw7XG59XG5cbmZ1bmN0aW9uIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCBuYW1lKSB7XG4gICAgaWYgKGZyb21FbFtuYW1lXSAhPT0gdG9FbFtuYW1lXSkge1xuICAgICAgICBmcm9tRWxbbmFtZV0gPSB0b0VsW25hbWVdO1xuICAgICAgICBpZiAoZnJvbUVsW25hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzcGVjaWFsRWxIYW5kbGVycyA9IHtcbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGZyb21FbC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdTRUxFQ1QnICYmICFwYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tRWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpICYmICF0b0VsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE1TIEVkZ2UgYnVnIHdoZXJlIHRoZSAnc2VsZWN0ZWQnIGF0dHJpYnV0ZSBjYW4gb25seSBiZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGlmIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIwODc2NzkvXG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgc2VsZWN0IGVsZW1lbnQncyBzZWxlY3RlZEluZGV4IHRvIC0xLCBvdGhlcndpc2Ugc2V0dGluZ1xuICAgICAgICAgICAgICAgIC8vIGZyb21FbC5zZWxlY3RlZCB1c2luZyB0aGUgc3luY0Jvb2xlYW5BdHRyUHJvcCBiZWxvdyBoYXMgbm8gZWZmZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0IHNlbGVjdGVkSW5kZXggd2lsbCBiZSBzZXQgaW4gdGhlIFNFTEVDVCBzcGVjaWFsIGhhbmRsZXIgYmVsb3cuXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdzZWxlY3RlZCcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgaXMgc3BlY2lhbCBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBzaW5jZSBpdCBzZXRzXG4gICAgICogdGhlIGluaXRpYWwgdmFsdWUuIENoYW5naW5nIHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICogXCJ2YWx1ZVwiIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3Qgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIHRoZSBzZXQgdGhlXG4gICAgICogaW5pdGlhbCB2YWx1ZS4gIFNpbWlsYXIgZm9yIHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUsIGFuZCBcImRpc2FibGVkXCIuXG4gICAgICovXG4gICAgSU5QVVQ6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2NoZWNrZWQnKTtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IHRvRWwudmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIFRFWFRBUkVBOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgSUUuIEFwcGFyZW50bHkgSUUgc2V0cyB0aGUgcGxhY2Vob2xkZXIgYXMgdGhlXG4gICAgICAgICAgICAvLyBub2RlIHZhbHVlIGFuZCB2aXNlIHZlcnNhLiBUaGlzIGlnbm9yZXMgYW4gZW1wdHkgdXBkYXRlLlxuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAoIW5ld1ZhbHVlICYmIG9sZFZhbHVlID09IGZyb21FbC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFTEVDVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBvZiBmcm9tRWwsIG5vdCB0b0VsIHNpbmNlIG5vZGVzIGNhbiBiZSBtb3ZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0b0VsIHRvIGZyb21FbCBkaXJlY3RseSB3aGVuIG1vcnBoaW5nLlxuICAgICAgICAgICAgLy8gQXQgdGhlIHRpbWUgdGhpcyBzcGVjaWFsIGhhbmRsZXIgaXMgaW52b2tlZCwgYWxsIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBiZWVuIG1vcnBoZWRcbiAgICAgICAgICAgIC8vIGFuZCBhcHBlbmRlZCB0byAvIHJlbW92ZWQgZnJvbSBmcm9tRWwsIHNvIHVzaW5nIGZyb21FbCBoZXJlIGlzIHNhZmUgYW5kIGNvcnJlY3QuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBvcHRncm91cDtcbiAgICAgICAgICAgIHZhciBub2RlTmFtZTtcbiAgICAgICAgICAgIHdoaWxlKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjdXJDaGlsZC5ub2RlTmFtZSAmJiBjdXJDaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnT1BUSU9OJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoaWxkLmhhc0F0dHJpYnV0ZSgnc2VsZWN0ZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3VyQ2hpbGQgJiYgb3B0Z3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gb3B0Z3JvdXAubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZyb21FbC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRleDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUkMSA9IDExO1xudmFyIFRFWFRfTk9ERSA9IDM7XG52YXIgQ09NTUVOVF9OT0RFID0gODtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIGRlZmF1bHRHZXROb2RlS2V5KG5vZGUpIHtcbiAgaWYgKG5vZGUpIHtcbiAgICAgIHJldHVybiAobm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykpIHx8IG5vZGUuaWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpIHtcblxuICAgIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgICAgICAgICB0b05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudCgnaHRtbCcpO1xuICAgICAgICAgICAgICAgIHRvTm9kZS5pbm5lckhUTUwgPSB0b05vZGVIdG1sO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBnZXROb2RlS2V5ID0gb3B0aW9ucy5nZXROb2RlS2V5IHx8IGRlZmF1bHRHZXROb2RlS2V5O1xuICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZUFkZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uQmVmb3JlRWxVcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsVXBkYXRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25FbFVwZGF0ZWQgPSBvcHRpb25zLm9uRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25Ob2RlRGlzY2FyZGVkID0gb3B0aW9ucy5vbk5vZGVEaXNjYXJkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIGNoaWxkcmVuT25seSA9IG9wdGlvbnMuY2hpbGRyZW5Pbmx5ID09PSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYXMgYSBsb29rdXAgdG8gcXVpY2tseSBmaW5kIGFsbCBrZXllZCBlbGVtZW50cyBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuXG4gICAgICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB2YXIga2V5ZWRSZW1vdmFsTGlzdCA9IFtdO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFkZEtleWVkUmVtb3ZhbChrZXkpIHtcbiAgICAgICAgICAgIGtleWVkUmVtb3ZhbExpc3QucHVzaChrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gd2Fsa0Rpc2NhcmRlZENoaWxkTm9kZXMobm9kZSwgc2tpcEtleWVkTm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcEtleWVkTm9kZXMgJiYgKGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHNraXBwaW5nIGtleWVkIG5vZGVzIHRoZW4gd2UgYWRkIHRoZSBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGEgbGlzdCBzbyB0aGF0IGl0IGNhbiBiZSBoYW5kbGVkIGF0IHRoZSB2ZXJ5IGVuZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXBvcnQgdGhlIG5vZGUgYXMgZGlzY2FyZGVkIGlmIGl0IGlzIG5vdCBrZXllZC4gV2UgZG8gdGhpcyBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIHdlIGxvb3AgdGhyb3VnaCBhbGwga2V5ZWQgZWxlbWVudHMgdGhhdCB3ZXJlIHVubWF0Y2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gZGlzY2FyZCB0aGVtIGluIG9uZSBmaW5hbCBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0Rpc2NhcmRlZENoaWxkTm9kZXMoY3VyQ2hpbGQsIHNraXBLZXllZE5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gIHtOb2RlfSBub2RlIFRoZSBub2RlIHRvIHJlbW92ZVxuICAgICAgICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAgICAgICogQHBhcmFtICB7Qm9vbGVhbn0gc2tpcEtleWVkTm9kZXMgSWYgdHJ1ZSB0aGVuIGVsZW1lbnRzIHdpdGgga2V5cyB3aWxsIGJlIHNraXBwZWQgYW5kIG5vdCBkaXNjYXJkZWQuXG4gICAgICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSwgcGFyZW50Tm9kZSwgc2tpcEtleWVkTm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVEaXNjYXJkZWQobm9kZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChub2RlKTtcbiAgICAgICAgICAgIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKG5vZGUsIHNraXBLZXllZE5vZGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIFRyZWVXYWxrZXIgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgICAgIC8vIGZ1bmN0aW9uIGluZGV4VHJlZShyb290KSB7XG4gICAgICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgICAgIC8vICAgICAgICAgcm9vdCxcbiAgICAgICAgLy8gICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICB2YXIgZWw7XG4gICAgICAgIC8vICAgICB3aGlsZSgoZWwgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCkpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgICAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgZnJvbU5vZGVzTG9va3VwW2tleV0gPSBlbDtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGZ1bmN0aW9uIGluZGV4VHJlZShub2RlKSB7XG4gICAgICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAgICAgLy8gICAgIHZhciBlbDtcbiAgICAgICAgLy8gICAgIHdoaWxlKChlbCA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAgICAgLy8gICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBXYWxrIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleFRyZWUoZnJvbU5vZGUpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRTaWJsaW5nID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5tYXRjaGVkRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bm1hdGNoZWRGcm9tRWwgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJDaGlsZCwgdW5tYXRjaGVkRnJvbUVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodW5tYXRjaGVkRnJvbUVsLCBjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAgICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICAgICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGlmICgoY3VyRnJvbU5vZGVLZXkgPSBnZXROb2RlS2V5KGN1ckZyb21Ob2RlQ2hpbGQpKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoY3VyRnJvbU5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgICAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBlbGVtZW50IHdpdGggYW4gSUQgaXMgYmVpbmcgbW9ycGhlZCB0aGVuIGl0IHdpbGwgYmUgaW4gdGhlIGZpbmFsXG4gICAgICAgICAgICAgICAgLy8gRE9NIHNvIGNsZWFyIGl0IG91dCBvZiB0aGUgc2F2ZWQgZWxlbWVudHMgY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVFbFVwZGF0ZWQoZnJvbUVsLCB0b0VsKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgICAgICAgICAgbW9ycGhBdHRycyhmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkKGZyb21FbCwgdG9FbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmcm9tRWwubm9kZU5hbWUgIT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgICAgICAgbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3BlY2lhbEVsSGFuZGxlcnMuVEVYVEFSRUEoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgICAgICB2YXIgY3VyVG9Ob2RlQ2hpbGQgPSB0b0VsLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIGN1clRvTm9kZUtleTtcbiAgICAgICAgICAgIHZhciBjdXJGcm9tTm9kZUtleTtcblxuICAgICAgICAgICAgdmFyIGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgdmFyIG1hdGNoaW5nRnJvbUVsO1xuXG4gICAgICAgICAgICAvLyB3YWxrIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChjdXJUb05vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBjdXJUb05vZGVLZXkgPSBnZXROb2RlS2V5KGN1clRvTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhlIGZyb21Ob2RlIGNoaWxkcmVuIGFsbCB0aGUgd2F5IHRocm91Z2hcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5pc1NhbWVOb2RlICYmIGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVUeXBlID0gY3VyRnJvbU5vZGVDaGlsZC5ub2RlVHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIGlmIHRoZSBjdXJGcm9tTm9kZUNoaWxkIGRvZXNudCBoYXZlIGEgbWF0Y2ggd2l0aCB0aGUgY3VyVG9Ob2RlQ2hpbGRcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBjdXJUb05vZGVDaGlsZC5ub2RlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlS2V5ICE9PSBjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIGtleSBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgY2hlY2sgb3VyIGxvb2t1cCB0byBzZWUgaWYgdGhlcmUgaXMgYSBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbU5leHRTaWJsaW5nID09PSBtYXRjaGluZ0Zyb21FbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHNpbmdsZSBlbGVtZW50IHJlbW92YWxzLiBUbyBhdm9pZCByZW1vdmluZyB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGluc3RlYWQgZGlzY2FyZCB0aGUgY3VycmVudCBub2RlIGFuZCB3YWl0IHVudGlsIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiB0byBwcm9wZXJseSBtYXRjaCB1cCB0aGUga2V5ZWQgdGFyZ2V0IGVsZW1lbnQgd2l0aCBpdHMgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG1hdGNoaW5nIGtleWVkIGVsZW1lbnQgc29tZXdoZXJlIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3MgbW92ZSB0aGUgb3JpZ2luYWwgRE9NIG5vZGUgaW50byB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgbW9ycGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogV2UgdXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIHJlcGxhY2VDaGlsZCBiZWNhdXNlIHdlIHdhbnQgdG8gZ28gdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYHJlbW92ZU5vZGUoKWAgZnVuY3Rpb24gZm9yIHRoZSBub2RlIHRoYXQgaXMgYmVpbmcgZGlzY2FyZGVkIHNvIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUVsLmluc2VydEJlZm9yZShtYXRjaGluZ0Zyb21FbCwgY3VyRnJvbU5vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vIG1hdGNoaW5nIGtleWVkIG5vZGUgaW4gdGhlIHNvdXJjZSB0cmVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBoYXMgYSBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gaXNDb21wYXRpYmxlICE9PSBmYWxzZSAmJiBjb21wYXJlTm9kZU5hbWVzKGN1ckZyb21Ob2RlQ2hpbGQsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGNvbXBhdGlibGUgRE9NIGVsZW1lbnRzIHNvIHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBcImZyb21cIiBub2RlIHRvIG1hdGNoIHRoZSBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhFbChjdXJGcm9tTm9kZUNoaWxkLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IGN1ckZyb21Ob2RlVHlwZSA9PSBDT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBseSB1cGRhdGUgbm9kZVZhbHVlIG9uIHRoZSBvcmlnaW5hbCBub2RlIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlQ2hpbGQubm9kZVZhbHVlICE9PSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIGJvdGggdGhlIFwidG9cIiBjaGlsZCBhbmQgdGhlIFwiZnJvbVwiIGNoaWxkIHNpbmNlIHdlIGZvdW5kIGEgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgZWxzZSB0byBkbyBhcyB3ZSBhbHJlYWR5IHJlY3Vyc2l2ZWx5IGNhbGxlZCBtb3JwaENoaWxkcmVuIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIGluIHRoZSBvcmlnaW5hbCBET00uIEhvd2V2ZXIsIHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgZnJvbSBub2RlIGlzIG5vdCBrZXllZFxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBwb3NzaWJsZSB0aGF0IGEga2V5ZWQgbm9kZSBtaWdodCBtYXRjaCB1cCB3aXRoIGEgbm9kZSBzb21ld2hlcmUgZWxzZSBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gaG9tZSBpbiB0aGUgZmluYWwgRE9NIHRyZWUuIEFmdGVyIGV2ZXJ5dGhpbmcgaXMgZG9uZSB3ZSB3aWxsIHJlbW92ZSBhbnkga2V5ZWQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBkaWRuJ3QgZmluZCBhIGhvbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHN0aWxsIGEgY2hhbmNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIHVwIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfSAvLyBFTkQ6IHdoaWxlKGN1ckZyb21Ob2RlQ2hpbGQpIHt9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiB3ZSBkaWQgbm90IGZpbmQgYSBjYW5kaWRhdGUgbWF0Y2ggZm9yXG4gICAgICAgICAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAgICAgICAgIC8vIG5vZGVzLiBUaGVyZWZvcmUsIHdlIHdpbGwganVzdCBhcHBlbmQgdGhlIGN1cnJlbnQgXCJ0b1wiIG5vZGVcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5hcHBlbmRDaGlsZChtYXRjaGluZ0Zyb21FbCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1PUlBIXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVBZGRlZFJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkJlZm9yZU5vZGVBZGRlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IGN1clRvTm9kZUNoaWxkLmFjdHVhbGl6ZShmcm9tRWwub3duZXJEb2N1bWVudCB8fCBkb2MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUVsLmFwcGVuZENoaWxkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KTtcblxuICAgICAgICAgICAgdmFyIHNwZWNpYWxFbEhhbmRsZXIgPSBzcGVjaWFsRWxIYW5kbGVyc1tmcm9tRWwubm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHNwZWNpYWxFbEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsRWxIYW5kbGVyKGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRU5EOiBtb3JwaENoaWxkcmVuKC4uLilcblxuICAgICAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICAgICAgdmFyIG1vcnBoZWROb2RlVHlwZSA9IG1vcnBoZWROb2RlLm5vZGVUeXBlO1xuICAgICAgICB2YXIgdG9Ob2RlVHlwZSA9IHRvTm9kZS5ub2RlVHlwZTtcblxuICAgICAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR29pbmcgZnJvbSBhbiBlbGVtZW50IG5vZGUgdG8gYSB0ZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChtb3JwaGVkTm9kZVR5cGUgPT09IFRFWFRfTk9ERSB8fCBtb3JwaGVkTm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgeyAvLyBUZXh0IG9yIGNvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlLm5vZGVWYWx1ZSAhPT0gdG9Ob2RlLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUubm9kZVZhbHVlID0gdG9Ob2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vcnBoZWROb2RlID09PSB0b05vZGUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBcInRvIG5vZGVcIiB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgXCJmcm9tIG5vZGVcIiBzbyB3ZSBoYWQgdG9cbiAgICAgICAgICAgIC8vIHRvc3Mgb3V0IHRoZSBcImZyb20gbm9kZVwiIGFuZCB1c2UgdGhlIFwidG8gbm9kZVwiXG4gICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQoZnJvbU5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9ycGhFbChtb3JwaGVkTm9kZSwgdG9Ob2RlLCBjaGlsZHJlbk9ubHkpO1xuXG4gICAgICAgICAgICAvLyBXZSBub3cgbmVlZCB0byBsb29wIG92ZXIgYW55IGtleWVkIG5vZGVzIHRoYXQgbWlnaHQgbmVlZCB0byBiZVxuICAgICAgICAgICAgLy8gcmVtb3ZlZC4gV2Ugb25seSBkbyB0aGUgcmVtb3ZhbCBpZiB3ZSBrbm93IHRoYXQgdGhlIGtleWVkIG5vZGVcbiAgICAgICAgICAgIC8vIG5ldmVyIGZvdW5kIGEgbWF0Y2guIFdoZW4gYSBrZXllZCBub2RlIGlzIG1hdGNoZWQgdXAgd2UgcmVtb3ZlXG4gICAgICAgICAgICAvLyBpdCBvdXQgb2YgZnJvbU5vZGVzTG9va3VwIGFuZCB3ZSB1c2UgZnJvbU5vZGVzTG9va3VwIHRvIGRldGVybWluZVxuICAgICAgICAgICAgLy8gaWYgYSBrZXllZCBub2RlIGhhcyBiZWVuIG1hdGNoZWQgdXAgb3Igbm90XG4gICAgICAgICAgICBpZiAoa2V5ZWRSZW1vdmFsTGlzdCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPWtleWVkUmVtb3ZhbExpc3QubGVuZ3RoOyBpPGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbFRvUmVtb3ZlID0gZnJvbU5vZGVzTG9va3VwW2tleWVkUmVtb3ZhbExpc3RbaV1dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2hpbGRyZW5Pbmx5ICYmIG1vcnBoZWROb2RlICE9PSBmcm9tTm9kZSAmJiBmcm9tTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobW9ycGhlZE5vZGUuYWN0dWFsaXplKSB7XG4gICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSBtb3JwaGVkTm9kZS5hY3R1YWxpemUoZnJvbU5vZGUub3duZXJEb2N1bWVudCB8fCBkb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2UgaGFkIHRvIHN3YXAgb3V0IHRoZSBmcm9tIG5vZGUgd2l0aCBhIG5ldyBub2RlIGJlY2F1c2UgdGhlIG9sZFxuICAgICAgICAgICAgLy8gbm9kZSB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IG5vZGUgdGhlbiB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBvbGQgRE9NIG5vZGUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLiBUaGlzIGlzIG9ubHlcbiAgICAgICAgICAgIC8vIHBvc3NpYmxlIGlmIHRoZSBvcmlnaW5hbCBET00gbm9kZSB3YXMgcGFydCBvZiBhIERPTSB0cmVlIHdoaWNoXG4gICAgICAgICAgICAvLyB3ZSBrbm93IGlzIHRoZSBjYXNlIGlmIGl0IGhhcyBhIHBhcmVudCBub2RlLlxuICAgICAgICAgICAgZnJvbU5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobW9ycGhlZE5vZGUsIGZyb21Ob2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICB9O1xufVxuXG52YXIgbW9ycGhkb20gPSBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycyk7XG5cbmV4cG9ydCBkZWZhdWx0IG1vcnBoZG9tO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/morphdom/dist/morphdom-esm.js\n");

/***/ }),

/***/ "./node_modules/outlayer/item.js":
/*!***************************************!*\
  !*** ./node_modules/outlayer/item.js ***!
  \***************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * Outlayer Item\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, require */\n  if ( true ) {\n    // AMD - RequireJS\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\"),\n        __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\")\n      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( EvEmitter, getSize ) {\n'use strict';\n\n// ----- helpers ----- //\n\nfunction isEmptyObj( obj ) {\n  for ( var prop in obj ) {\n    return false;\n  }\n  prop = null;\n  return true;\n}\n\n// -------------------------- CSS3 support -------------------------- //\n\n\nvar docElemStyle = document.documentElement.style;\n\nvar transitionProperty = typeof docElemStyle.transition == 'string' ?\n  'transition' : 'WebkitTransition';\nvar transformProperty = typeof docElemStyle.transform == 'string' ?\n  'transform' : 'WebkitTransform';\n\nvar transitionEndEvent = {\n  WebkitTransition: 'webkitTransitionEnd',\n  transition: 'transitionend'\n}[ transitionProperty ];\n\n// cache all vendor properties that could have vendor prefix\nvar vendorProperties = {\n  transform: transformProperty,\n  transition: transitionProperty,\n  transitionDuration: transitionProperty + 'Duration',\n  transitionProperty: transitionProperty + 'Property',\n  transitionDelay: transitionProperty + 'Delay'\n};\n\n// -------------------------- Item -------------------------- //\n\nfunction Item( element, layout ) {\n  if ( !element ) {\n    return;\n  }\n\n  this.element = element;\n  // parent layout class, i.e. Masonry, Isotope, or Packery\n  this.layout = layout;\n  this.position = {\n    x: 0,\n    y: 0\n  };\n\n  this._create();\n}\n\n// inherit EvEmitter\nvar proto = Item.prototype = Object.create( EvEmitter.prototype );\nproto.constructor = Item;\n\nproto._create = function() {\n  // transition objects\n  this._transn = {\n    ingProperties: {},\n    clean: {},\n    onEnd: {}\n  };\n\n  this.css({\n    position: 'absolute'\n  });\n};\n\n// trigger specified handler for event type\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\n/**\n * apply CSS styles to element\n * @param {Object} style\n */\nproto.css = function( style ) {\n  var elemStyle = this.element.style;\n\n  for ( var prop in style ) {\n    // use vendor property if available\n    var supportedProp = vendorProperties[ prop ] || prop;\n    elemStyle[ supportedProp ] = style[ prop ];\n  }\n};\n\n // measure position, and sets it\nproto.getPosition = function() {\n  var style = getComputedStyle( this.element );\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n  var xValue = style[ isOriginLeft ? 'left' : 'right' ];\n  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];\n  var x = parseFloat( xValue );\n  var y = parseFloat( yValue );\n  // convert percent to pixels\n  var layoutSize = this.layout.size;\n  if ( xValue.indexOf('%') != -1 ) {\n    x = ( x / 100 ) * layoutSize.width;\n  }\n  if ( yValue.indexOf('%') != -1 ) {\n    y = ( y / 100 ) * layoutSize.height;\n  }\n  // clean up 'auto' or other non-integer values\n  x = isNaN( x ) ? 0 : x;\n  y = isNaN( y ) ? 0 : y;\n  // remove padding from measurement\n  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;\n  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;\n\n  this.position.x = x;\n  this.position.y = y;\n};\n\n// set settled position, apply padding\nproto.layoutPosition = function() {\n  var layoutSize = this.layout.size;\n  var style = {};\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n\n  // x\n  var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';\n  var xProperty = isOriginLeft ? 'left' : 'right';\n  var xResetProperty = isOriginLeft ? 'right' : 'left';\n\n  var x = this.position.x + layoutSize[ xPadding ];\n  // set in percentage or pixels\n  style[ xProperty ] = this.getXValue( x );\n  // reset other property\n  style[ xResetProperty ] = '';\n\n  // y\n  var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';\n  var yProperty = isOriginTop ? 'top' : 'bottom';\n  var yResetProperty = isOriginTop ? 'bottom' : 'top';\n\n  var y = this.position.y + layoutSize[ yPadding ];\n  // set in percentage or pixels\n  style[ yProperty ] = this.getYValue( y );\n  // reset other property\n  style[ yResetProperty ] = '';\n\n  this.css( style );\n  this.emitEvent( 'layout', [ this ] );\n};\n\nproto.getXValue = function( x ) {\n  var isHorizontal = this.layout._getOption('horizontal');\n  return this.layout.options.percentPosition && !isHorizontal ?\n    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';\n};\n\nproto.getYValue = function( y ) {\n  var isHorizontal = this.layout._getOption('horizontal');\n  return this.layout.options.percentPosition && isHorizontal ?\n    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';\n};\n\nproto._transitionTo = function( x, y ) {\n  this.getPosition();\n  // get current x & y from top/left\n  var curX = this.position.x;\n  var curY = this.position.y;\n\n  var didNotMove = x == this.position.x && y == this.position.y;\n\n  // save end position\n  this.setPosition( x, y );\n\n  // if did not move and not transitioning, just go to layout\n  if ( didNotMove && !this.isTransitioning ) {\n    this.layoutPosition();\n    return;\n  }\n\n  var transX = x - curX;\n  var transY = y - curY;\n  var transitionStyle = {};\n  transitionStyle.transform = this.getTranslate( transX, transY );\n\n  this.transition({\n    to: transitionStyle,\n    onTransitionEnd: {\n      transform: this.layoutPosition\n    },\n    isCleaning: true\n  });\n};\n\nproto.getTranslate = function( x, y ) {\n  // flip cooridinates if origin on right or bottom\n  var isOriginLeft = this.layout._getOption('originLeft');\n  var isOriginTop = this.layout._getOption('originTop');\n  x = isOriginLeft ? x : -x;\n  y = isOriginTop ? y : -y;\n  return 'translate3d(' + x + 'px, ' + y + 'px, 0)';\n};\n\n// non transition + transform support\nproto.goTo = function( x, y ) {\n  this.setPosition( x, y );\n  this.layoutPosition();\n};\n\nproto.moveTo = proto._transitionTo;\n\nproto.setPosition = function( x, y ) {\n  this.position.x = parseFloat( x );\n  this.position.y = parseFloat( y );\n};\n\n// ----- transition ----- //\n\n/**\n * @param {Object} style - CSS\n * @param {Function} onTransitionEnd\n */\n\n// non transition, just trigger callback\nproto._nonTransition = function( args ) {\n  this.css( args.to );\n  if ( args.isCleaning ) {\n    this._removeStyles( args.to );\n  }\n  for ( var prop in args.onTransitionEnd ) {\n    args.onTransitionEnd[ prop ].call( this );\n  }\n};\n\n/**\n * proper transition\n * @param {Object} args - arguments\n *   @param {Object} to - style to transition to\n *   @param {Object} from - style to start transition from\n *   @param {Boolean} isCleaning - removes transition styles after transition\n *   @param {Function} onTransitionEnd - callback\n */\nproto.transition = function( args ) {\n  // redirect to nonTransition if no transition duration\n  if ( !parseFloat( this.layout.options.transitionDuration ) ) {\n    this._nonTransition( args );\n    return;\n  }\n\n  var _transition = this._transn;\n  // keep track of onTransitionEnd callback by css property\n  for ( var prop in args.onTransitionEnd ) {\n    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];\n  }\n  // keep track of properties that are transitioning\n  for ( prop in args.to ) {\n    _transition.ingProperties[ prop ] = true;\n    // keep track of properties to clean up when transition is done\n    if ( args.isCleaning ) {\n      _transition.clean[ prop ] = true;\n    }\n  }\n\n  // set from styles\n  if ( args.from ) {\n    this.css( args.from );\n    // force redraw. http://blog.alexmaccaw.com/css-transitions\n    var h = this.element.offsetHeight;\n    // hack for JSHint to hush about unused var\n    h = null;\n  }\n  // enable transition\n  this.enableTransition( args.to );\n  // set styles that are transitioning\n  this.css( args.to );\n\n  this.isTransitioning = true;\n\n};\n\n// dash before all cap letters, including first for\n// WebkitTransform => -webkit-transform\nfunction toDashedAll( str ) {\n  return str.replace( /([A-Z])/g, function( $1 ) {\n    return '-' + $1.toLowerCase();\n  });\n}\n\nvar transitionProps = 'opacity,' + toDashedAll( transformProperty );\n\nproto.enableTransition = function(/* style */) {\n  // HACK changing transitionProperty during a transition\n  // will cause transition to jump\n  if ( this.isTransitioning ) {\n    return;\n  }\n\n  // make `transition: foo, bar, baz` from style object\n  // HACK un-comment this when enableTransition can work\n  // while a transition is happening\n  // var transitionValues = [];\n  // for ( var prop in style ) {\n  //   // dash-ify camelCased properties like WebkitTransition\n  //   prop = vendorProperties[ prop ] || prop;\n  //   transitionValues.push( toDashedAll( prop ) );\n  // }\n  // munge number to millisecond, to match stagger\n  var duration = this.layout.options.transitionDuration;\n  duration = typeof duration == 'number' ? duration + 'ms' : duration;\n  // enable transition styles\n  this.css({\n    transitionProperty: transitionProps,\n    transitionDuration: duration,\n    transitionDelay: this.staggerDelay || 0\n  });\n  // listen for transition end event\n  this.element.addEventListener( transitionEndEvent, this, false );\n};\n\n// ----- events ----- //\n\nproto.onwebkitTransitionEnd = function( event ) {\n  this.ontransitionend( event );\n};\n\nproto.onotransitionend = function( event ) {\n  this.ontransitionend( event );\n};\n\n// properties that I munge to make my life easier\nvar dashedVendorProperties = {\n  '-webkit-transform': 'transform'\n};\n\nproto.ontransitionend = function( event ) {\n  // disregard bubbled events from children\n  if ( event.target !== this.element ) {\n    return;\n  }\n  var _transition = this._transn;\n  // get property name of transitioned property, convert to prefix-free\n  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;\n\n  // remove property that has completed transitioning\n  delete _transition.ingProperties[ propertyName ];\n  // check if any properties are still transitioning\n  if ( isEmptyObj( _transition.ingProperties ) ) {\n    // all properties have completed transitioning\n    this.disableTransition();\n  }\n  // clean style\n  if ( propertyName in _transition.clean ) {\n    // clean up style\n    this.element.style[ event.propertyName ] = '';\n    delete _transition.clean[ propertyName ];\n  }\n  // trigger onTransitionEnd callback\n  if ( propertyName in _transition.onEnd ) {\n    var onTransitionEnd = _transition.onEnd[ propertyName ];\n    onTransitionEnd.call( this );\n    delete _transition.onEnd[ propertyName ];\n  }\n\n  this.emitEvent( 'transitionEnd', [ this ] );\n};\n\nproto.disableTransition = function() {\n  this.removeTransitionStyles();\n  this.element.removeEventListener( transitionEndEvent, this, false );\n  this.isTransitioning = false;\n};\n\n/**\n * removes style property from element\n * @param {Object} style\n**/\nproto._removeStyles = function( style ) {\n  // clean up transition styles\n  var cleanStyle = {};\n  for ( var prop in style ) {\n    cleanStyle[ prop ] = '';\n  }\n  this.css( cleanStyle );\n};\n\nvar cleanTransitionStyle = {\n  transitionProperty: '',\n  transitionDuration: '',\n  transitionDelay: ''\n};\n\nproto.removeTransitionStyles = function() {\n  // remove transition\n  this.css( cleanTransitionStyle );\n};\n\n// ----- stagger ----- //\n\nproto.stagger = function( delay ) {\n  delay = isNaN( delay ) ? 0 : delay;\n  this.staggerDelay = delay + 'ms';\n};\n\n// ----- show/hide/remove ----- //\n\n// remove element from DOM\nproto.removeElem = function() {\n  this.element.parentNode.removeChild( this.element );\n  // remove display: none\n  this.css({ display: '' });\n  this.emitEvent( 'remove', [ this ] );\n};\n\nproto.remove = function() {\n  // just remove element if no transition support or no transition\n  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {\n    this.removeElem();\n    return;\n  }\n\n  // start transition\n  this.once( 'transitionEnd', function() {\n    this.removeElem();\n  });\n  this.hide();\n};\n\nproto.reveal = function() {\n  delete this.isHidden;\n  // remove display: none\n  this.css({ display: '' });\n\n  var options = this.layout.options;\n\n  var onTransitionEnd = {};\n  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');\n  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;\n\n  this.transition({\n    from: options.hiddenStyle,\n    to: options.visibleStyle,\n    isCleaning: true,\n    onTransitionEnd: onTransitionEnd\n  });\n};\n\nproto.onRevealTransitionEnd = function() {\n  // check if still visible\n  // during transition, item may have been hidden\n  if ( !this.isHidden ) {\n    this.emitEvent('reveal');\n  }\n};\n\n/**\n * get style property use for hide/reveal transition end\n * @param {String} styleProperty - hiddenStyle/visibleStyle\n * @returns {String}\n */\nproto.getHideRevealTransitionEndProperty = function( styleProperty ) {\n  var optionStyle = this.layout.options[ styleProperty ];\n  // use opacity\n  if ( optionStyle.opacity ) {\n    return 'opacity';\n  }\n  // get first property\n  for ( var prop in optionStyle ) {\n    return prop;\n  }\n};\n\nproto.hide = function() {\n  // set flag\n  this.isHidden = true;\n  // remove display: none\n  this.css({ display: '' });\n\n  var options = this.layout.options;\n\n  var onTransitionEnd = {};\n  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');\n  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;\n\n  this.transition({\n    from: options.visibleStyle,\n    to: options.hiddenStyle,\n    // keep hidden stuff hidden\n    isCleaning: true,\n    onTransitionEnd: onTransitionEnd\n  });\n};\n\nproto.onHideTransitionEnd = function() {\n  // check if still hidden\n  // during transition, item may have been un-hidden\n  if ( this.isHidden ) {\n    this.css({ display: 'none' });\n    this.emitEvent('hide');\n  }\n};\n\nproto.destroy = function() {\n  this.css({\n    position: '',\n    left: '',\n    right: '',\n    top: '',\n    bottom: '',\n    transition: '',\n    transform: ''\n  });\n};\n\nreturn Item;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvb3V0bGF5ZXIvaXRlbS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvb3V0bGF5ZXIvaXRlbS5qcz8yOGFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3V0bGF5ZXIgSXRlbVxuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTUQgLSBSZXF1aXJlSlNcbiAgICBkZWZpbmUoIFtcbiAgICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcicsXG4gICAgICAgICdnZXQtc2l6ZS9nZXQtc2l6ZSdcbiAgICAgIF0sXG4gICAgICBmYWN0b3J5XG4gICAgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KUyAtIEJyb3dzZXJpZnksIFdlYnBhY2tcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJyksXG4gICAgICByZXF1aXJlKCdnZXQtc2l6ZScpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5PdXRsYXllciA9IHt9O1xuICAgIHdpbmRvdy5PdXRsYXllci5JdGVtID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICB3aW5kb3cuZ2V0U2l6ZVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCBFdkVtaXR0ZXIsIGdldFNpemUgKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tIGhlbHBlcnMgLS0tLS0gLy9cblxuZnVuY3Rpb24gaXNFbXB0eU9iaiggb2JqICkge1xuICBmb3IgKCB2YXIgcHJvcCBpbiBvYmogKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3AgPSBudWxsO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1NTMyBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cblxudmFyIGRvY0VsZW1TdHlsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcblxudmFyIHRyYW5zaXRpb25Qcm9wZXJ0eSA9IHR5cGVvZiBkb2NFbGVtU3R5bGUudHJhbnNpdGlvbiA9PSAnc3RyaW5nJyA/XG4gICd0cmFuc2l0aW9uJyA6ICdXZWJraXRUcmFuc2l0aW9uJztcbnZhciB0cmFuc2Zvcm1Qcm9wZXJ0eSA9IHR5cGVvZiBkb2NFbGVtU3R5bGUudHJhbnNmb3JtID09ICdzdHJpbmcnID9cbiAgJ3RyYW5zZm9ybScgOiAnV2Via2l0VHJhbnNmb3JtJztcblxudmFyIHRyYW5zaXRpb25FbmRFdmVudCA9IHtcbiAgV2Via2l0VHJhbnNpdGlvbjogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICB0cmFuc2l0aW9uOiAndHJhbnNpdGlvbmVuZCdcbn1bIHRyYW5zaXRpb25Qcm9wZXJ0eSBdO1xuXG4vLyBjYWNoZSBhbGwgdmVuZG9yIHByb3BlcnRpZXMgdGhhdCBjb3VsZCBoYXZlIHZlbmRvciBwcmVmaXhcbnZhciB2ZW5kb3JQcm9wZXJ0aWVzID0ge1xuICB0cmFuc2Zvcm06IHRyYW5zZm9ybVByb3BlcnR5LFxuICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uUHJvcGVydHksXG4gIHRyYW5zaXRpb25EdXJhdGlvbjogdHJhbnNpdGlvblByb3BlcnR5ICsgJ0R1cmF0aW9uJyxcbiAgdHJhbnNpdGlvblByb3BlcnR5OiB0cmFuc2l0aW9uUHJvcGVydHkgKyAnUHJvcGVydHknLFxuICB0cmFuc2l0aW9uRGVsYXk6IHRyYW5zaXRpb25Qcm9wZXJ0eSArICdEZWxheSdcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEl0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gSXRlbSggZWxlbWVudCwgbGF5b3V0ICkge1xuICBpZiAoICFlbGVtZW50ICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIC8vIHBhcmVudCBsYXlvdXQgY2xhc3MsIGkuZS4gTWFzb25yeSwgSXNvdG9wZSwgb3IgUGFja2VyeVxuICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgdGhpcy5wb3NpdGlvbiA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICB0aGlzLl9jcmVhdGUoKTtcbn1cblxuLy8gaW5oZXJpdCBFdkVtaXR0ZXJcbnZhciBwcm90byA9IEl0ZW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xucHJvdG8uY29uc3RydWN0b3IgPSBJdGVtO1xuXG5wcm90by5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHRyYW5zaXRpb24gb2JqZWN0c1xuICB0aGlzLl90cmFuc24gPSB7XG4gICAgaW5nUHJvcGVydGllczoge30sXG4gICAgY2xlYW46IHt9LFxuICAgIG9uRW5kOiB7fVxuICB9O1xuXG4gIHRoaXMuY3NzKHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICB9KTtcbn07XG5cbi8vIHRyaWdnZXIgc3BlY2lmaWVkIGhhbmRsZXIgZm9yIGV2ZW50IHR5cGVcbnByb3RvLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgbWV0aG9kID0gJ29uJyArIGV2ZW50LnR5cGU7XG4gIGlmICggdGhpc1sgbWV0aG9kIF0gKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oIGV2ZW50ICk7XG4gIH1cbn07XG5cbnByb3RvLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaXplID0gZ2V0U2l6ZSggdGhpcy5lbGVtZW50ICk7XG59O1xuXG4vKipcbiAqIGFwcGx5IENTUyBzdHlsZXMgdG8gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlXG4gKi9cbnByb3RvLmNzcyA9IGZ1bmN0aW9uKCBzdHlsZSApIHtcbiAgdmFyIGVsZW1TdHlsZSA9IHRoaXMuZWxlbWVudC5zdHlsZTtcblxuICBmb3IgKCB2YXIgcHJvcCBpbiBzdHlsZSApIHtcbiAgICAvLyB1c2UgdmVuZG9yIHByb3BlcnR5IGlmIGF2YWlsYWJsZVxuICAgIHZhciBzdXBwb3J0ZWRQcm9wID0gdmVuZG9yUHJvcGVydGllc1sgcHJvcCBdIHx8IHByb3A7XG4gICAgZWxlbVN0eWxlWyBzdXBwb3J0ZWRQcm9wIF0gPSBzdHlsZVsgcHJvcCBdO1xuICB9XG59O1xuXG4gLy8gbWVhc3VyZSBwb3NpdGlvbiwgYW5kIHNldHMgaXRcbnByb3RvLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoIHRoaXMuZWxlbWVudCApO1xuICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luTGVmdCcpO1xuICB2YXIgaXNPcmlnaW5Ub3AgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgdmFyIHhWYWx1ZSA9IHN0eWxlWyBpc09yaWdpbkxlZnQgPyAnbGVmdCcgOiAncmlnaHQnIF07XG4gIHZhciB5VmFsdWUgPSBzdHlsZVsgaXNPcmlnaW5Ub3AgPyAndG9wJyA6ICdib3R0b20nIF07XG4gIHZhciB4ID0gcGFyc2VGbG9hdCggeFZhbHVlICk7XG4gIHZhciB5ID0gcGFyc2VGbG9hdCggeVZhbHVlICk7XG4gIC8vIGNvbnZlcnQgcGVyY2VudCB0byBwaXhlbHNcbiAgdmFyIGxheW91dFNpemUgPSB0aGlzLmxheW91dC5zaXplO1xuICBpZiAoIHhWYWx1ZS5pbmRleE9mKCclJykgIT0gLTEgKSB7XG4gICAgeCA9ICggeCAvIDEwMCApICogbGF5b3V0U2l6ZS53aWR0aDtcbiAgfVxuICBpZiAoIHlWYWx1ZS5pbmRleE9mKCclJykgIT0gLTEgKSB7XG4gICAgeSA9ICggeSAvIDEwMCApICogbGF5b3V0U2l6ZS5oZWlnaHQ7XG4gIH1cbiAgLy8gY2xlYW4gdXAgJ2F1dG8nIG9yIG90aGVyIG5vbi1pbnRlZ2VyIHZhbHVlc1xuICB4ID0gaXNOYU4oIHggKSA/IDAgOiB4O1xuICB5ID0gaXNOYU4oIHkgKSA/IDAgOiB5O1xuICAvLyByZW1vdmUgcGFkZGluZyBmcm9tIG1lYXN1cmVtZW50XG4gIHggLT0gaXNPcmlnaW5MZWZ0ID8gbGF5b3V0U2l6ZS5wYWRkaW5nTGVmdCA6IGxheW91dFNpemUucGFkZGluZ1JpZ2h0O1xuICB5IC09IGlzT3JpZ2luVG9wID8gbGF5b3V0U2l6ZS5wYWRkaW5nVG9wIDogbGF5b3V0U2l6ZS5wYWRkaW5nQm90dG9tO1xuXG4gIHRoaXMucG9zaXRpb24ueCA9IHg7XG4gIHRoaXMucG9zaXRpb24ueSA9IHk7XG59O1xuXG4vLyBzZXQgc2V0dGxlZCBwb3NpdGlvbiwgYXBwbHkgcGFkZGluZ1xucHJvdG8ubGF5b3V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGxheW91dFNpemUgPSB0aGlzLmxheW91dC5zaXplO1xuICB2YXIgc3R5bGUgPSB7fTtcbiAgdmFyIGlzT3JpZ2luTGVmdCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luVG9wJyk7XG5cbiAgLy8geFxuICB2YXIgeFBhZGRpbmcgPSBpc09yaWdpbkxlZnQgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCc7XG4gIHZhciB4UHJvcGVydHkgPSBpc09yaWdpbkxlZnQgPyAnbGVmdCcgOiAncmlnaHQnO1xuICB2YXIgeFJlc2V0UHJvcGVydHkgPSBpc09yaWdpbkxlZnQgPyAncmlnaHQnIDogJ2xlZnQnO1xuXG4gIHZhciB4ID0gdGhpcy5wb3NpdGlvbi54ICsgbGF5b3V0U2l6ZVsgeFBhZGRpbmcgXTtcbiAgLy8gc2V0IGluIHBlcmNlbnRhZ2Ugb3IgcGl4ZWxzXG4gIHN0eWxlWyB4UHJvcGVydHkgXSA9IHRoaXMuZ2V0WFZhbHVlKCB4ICk7XG4gIC8vIHJlc2V0IG90aGVyIHByb3BlcnR5XG4gIHN0eWxlWyB4UmVzZXRQcm9wZXJ0eSBdID0gJyc7XG5cbiAgLy8geVxuICB2YXIgeVBhZGRpbmcgPSBpc09yaWdpblRvcCA/ICdwYWRkaW5nVG9wJyA6ICdwYWRkaW5nQm90dG9tJztcbiAgdmFyIHlQcm9wZXJ0eSA9IGlzT3JpZ2luVG9wID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgdmFyIHlSZXNldFByb3BlcnR5ID0gaXNPcmlnaW5Ub3AgPyAnYm90dG9tJyA6ICd0b3AnO1xuXG4gIHZhciB5ID0gdGhpcy5wb3NpdGlvbi55ICsgbGF5b3V0U2l6ZVsgeVBhZGRpbmcgXTtcbiAgLy8gc2V0IGluIHBlcmNlbnRhZ2Ugb3IgcGl4ZWxzXG4gIHN0eWxlWyB5UHJvcGVydHkgXSA9IHRoaXMuZ2V0WVZhbHVlKCB5ICk7XG4gIC8vIHJlc2V0IG90aGVyIHByb3BlcnR5XG4gIHN0eWxlWyB5UmVzZXRQcm9wZXJ0eSBdID0gJyc7XG5cbiAgdGhpcy5jc3MoIHN0eWxlICk7XG4gIHRoaXMuZW1pdEV2ZW50KCAnbGF5b3V0JywgWyB0aGlzIF0gKTtcbn07XG5cbnByb3RvLmdldFhWYWx1ZSA9IGZ1bmN0aW9uKCB4ICkge1xuICB2YXIgaXNIb3Jpem9udGFsID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignaG9yaXpvbnRhbCcpO1xuICByZXR1cm4gdGhpcy5sYXlvdXQub3B0aW9ucy5wZXJjZW50UG9zaXRpb24gJiYgIWlzSG9yaXpvbnRhbCA/XG4gICAgKCAoIHggLyB0aGlzLmxheW91dC5zaXplLndpZHRoICkgKiAxMDAgKSArICclJyA6IHggKyAncHgnO1xufTtcblxucHJvdG8uZ2V0WVZhbHVlID0gZnVuY3Rpb24oIHkgKSB7XG4gIHZhciBpc0hvcml6b250YWwgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdob3Jpem9udGFsJyk7XG4gIHJldHVybiB0aGlzLmxheW91dC5vcHRpb25zLnBlcmNlbnRQb3NpdGlvbiAmJiBpc0hvcml6b250YWwgP1xuICAgICggKCB5IC8gdGhpcy5sYXlvdXQuc2l6ZS5oZWlnaHQgKSAqIDEwMCApICsgJyUnIDogeSArICdweCc7XG59O1xuXG5wcm90by5fdHJhbnNpdGlvblRvID0gZnVuY3Rpb24oIHgsIHkgKSB7XG4gIHRoaXMuZ2V0UG9zaXRpb24oKTtcbiAgLy8gZ2V0IGN1cnJlbnQgeCAmIHkgZnJvbSB0b3AvbGVmdFxuICB2YXIgY3VyWCA9IHRoaXMucG9zaXRpb24ueDtcbiAgdmFyIGN1clkgPSB0aGlzLnBvc2l0aW9uLnk7XG5cbiAgdmFyIGRpZE5vdE1vdmUgPSB4ID09IHRoaXMucG9zaXRpb24ueCAmJiB5ID09IHRoaXMucG9zaXRpb24ueTtcblxuICAvLyBzYXZlIGVuZCBwb3NpdGlvblxuICB0aGlzLnNldFBvc2l0aW9uKCB4LCB5ICk7XG5cbiAgLy8gaWYgZGlkIG5vdCBtb3ZlIGFuZCBub3QgdHJhbnNpdGlvbmluZywganVzdCBnbyB0byBsYXlvdXRcbiAgaWYgKCBkaWROb3RNb3ZlICYmICF0aGlzLmlzVHJhbnNpdGlvbmluZyApIHtcbiAgICB0aGlzLmxheW91dFBvc2l0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRyYW5zWCA9IHggLSBjdXJYO1xuICB2YXIgdHJhbnNZID0geSAtIGN1clk7XG4gIHZhciB0cmFuc2l0aW9uU3R5bGUgPSB7fTtcbiAgdHJhbnNpdGlvblN0eWxlLnRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNsYXRlKCB0cmFuc1gsIHRyYW5zWSApO1xuXG4gIHRoaXMudHJhbnNpdGlvbih7XG4gICAgdG86IHRyYW5zaXRpb25TdHlsZSxcbiAgICBvblRyYW5zaXRpb25FbmQ6IHtcbiAgICAgIHRyYW5zZm9ybTogdGhpcy5sYXlvdXRQb3NpdGlvblxuICAgIH0sXG4gICAgaXNDbGVhbmluZzogdHJ1ZVxuICB9KTtcbn07XG5cbnByb3RvLmdldFRyYW5zbGF0ZSA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICAvLyBmbGlwIGNvb3JpZGluYXRlcyBpZiBvcmlnaW4gb24gcmlnaHQgb3IgYm90dG9tXG4gIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5MZWZ0Jyk7XG4gIHZhciBpc09yaWdpblRvcCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpblRvcCcpO1xuICB4ID0gaXNPcmlnaW5MZWZ0ID8geCA6IC14O1xuICB5ID0gaXNPcmlnaW5Ub3AgPyB5IDogLXk7XG4gIHJldHVybiAndHJhbnNsYXRlM2QoJyArIHggKyAncHgsICcgKyB5ICsgJ3B4LCAwKSc7XG59O1xuXG4vLyBub24gdHJhbnNpdGlvbiArIHRyYW5zZm9ybSBzdXBwb3J0XG5wcm90by5nb1RvID0gZnVuY3Rpb24oIHgsIHkgKSB7XG4gIHRoaXMuc2V0UG9zaXRpb24oIHgsIHkgKTtcbiAgdGhpcy5sYXlvdXRQb3NpdGlvbigpO1xufTtcblxucHJvdG8ubW92ZVRvID0gcHJvdG8uX3RyYW5zaXRpb25UbztcblxucHJvdG8uc2V0UG9zaXRpb24gPSBmdW5jdGlvbiggeCwgeSApIHtcbiAgdGhpcy5wb3NpdGlvbi54ID0gcGFyc2VGbG9hdCggeCApO1xuICB0aGlzLnBvc2l0aW9uLnkgPSBwYXJzZUZsb2F0KCB5ICk7XG59O1xuXG4vLyAtLS0tLSB0cmFuc2l0aW9uIC0tLS0tIC8vXG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlIC0gQ1NTXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblRyYW5zaXRpb25FbmRcbiAqL1xuXG4vLyBub24gdHJhbnNpdGlvbiwganVzdCB0cmlnZ2VyIGNhbGxiYWNrXG5wcm90by5fbm9uVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCBhcmdzICkge1xuICB0aGlzLmNzcyggYXJncy50byApO1xuICBpZiAoIGFyZ3MuaXNDbGVhbmluZyApIHtcbiAgICB0aGlzLl9yZW1vdmVTdHlsZXMoIGFyZ3MudG8gKTtcbiAgfVxuICBmb3IgKCB2YXIgcHJvcCBpbiBhcmdzLm9uVHJhbnNpdGlvbkVuZCApIHtcbiAgICBhcmdzLm9uVHJhbnNpdGlvbkVuZFsgcHJvcCBdLmNhbGwoIHRoaXMgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwcm9wZXIgdHJhbnNpdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBhcmd1bWVudHNcbiAqICAgQHBhcmFtIHtPYmplY3R9IHRvIC0gc3R5bGUgdG8gdHJhbnNpdGlvbiB0b1xuICogICBAcGFyYW0ge09iamVjdH0gZnJvbSAtIHN0eWxlIHRvIHN0YXJ0IHRyYW5zaXRpb24gZnJvbVxuICogICBAcGFyYW0ge0Jvb2xlYW59IGlzQ2xlYW5pbmcgLSByZW1vdmVzIHRyYW5zaXRpb24gc3R5bGVzIGFmdGVyIHRyYW5zaXRpb25cbiAqICAgQHBhcmFtIHtGdW5jdGlvbn0gb25UcmFuc2l0aW9uRW5kIC0gY2FsbGJhY2tcbiAqL1xucHJvdG8udHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCBhcmdzICkge1xuICAvLyByZWRpcmVjdCB0byBub25UcmFuc2l0aW9uIGlmIG5vIHRyYW5zaXRpb24gZHVyYXRpb25cbiAgaWYgKCAhcGFyc2VGbG9hdCggdGhpcy5sYXlvdXQub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb24gKSApIHtcbiAgICB0aGlzLl9ub25UcmFuc2l0aW9uKCBhcmdzICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF90cmFuc2l0aW9uID0gdGhpcy5fdHJhbnNuO1xuICAvLyBrZWVwIHRyYWNrIG9mIG9uVHJhbnNpdGlvbkVuZCBjYWxsYmFjayBieSBjc3MgcHJvcGVydHlcbiAgZm9yICggdmFyIHByb3AgaW4gYXJncy5vblRyYW5zaXRpb25FbmQgKSB7XG4gICAgX3RyYW5zaXRpb24ub25FbmRbIHByb3AgXSA9IGFyZ3Mub25UcmFuc2l0aW9uRW5kWyBwcm9wIF07XG4gIH1cbiAgLy8ga2VlcCB0cmFjayBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIHRyYW5zaXRpb25pbmdcbiAgZm9yICggcHJvcCBpbiBhcmdzLnRvICkge1xuICAgIF90cmFuc2l0aW9uLmluZ1Byb3BlcnRpZXNbIHByb3AgXSA9IHRydWU7XG4gICAgLy8ga2VlcCB0cmFjayBvZiBwcm9wZXJ0aWVzIHRvIGNsZWFuIHVwIHdoZW4gdHJhbnNpdGlvbiBpcyBkb25lXG4gICAgaWYgKCBhcmdzLmlzQ2xlYW5pbmcgKSB7XG4gICAgICBfdHJhbnNpdGlvbi5jbGVhblsgcHJvcCBdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgZnJvbSBzdHlsZXNcbiAgaWYgKCBhcmdzLmZyb20gKSB7XG4gICAgdGhpcy5jc3MoIGFyZ3MuZnJvbSApO1xuICAgIC8vIGZvcmNlIHJlZHJhdy4gaHR0cDovL2Jsb2cuYWxleG1hY2Nhdy5jb20vY3NzLXRyYW5zaXRpb25zXG4gICAgdmFyIGggPSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIC8vIGhhY2sgZm9yIEpTSGludCB0byBodXNoIGFib3V0IHVudXNlZCB2YXJcbiAgICBoID0gbnVsbDtcbiAgfVxuICAvLyBlbmFibGUgdHJhbnNpdGlvblxuICB0aGlzLmVuYWJsZVRyYW5zaXRpb24oIGFyZ3MudG8gKTtcbiAgLy8gc2V0IHN0eWxlcyB0aGF0IGFyZSB0cmFuc2l0aW9uaW5nXG4gIHRoaXMuY3NzKCBhcmdzLnRvICk7XG5cbiAgdGhpcy5pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuXG59O1xuXG4vLyBkYXNoIGJlZm9yZSBhbGwgY2FwIGxldHRlcnMsIGluY2x1ZGluZyBmaXJzdCBmb3Jcbi8vIFdlYmtpdFRyYW5zZm9ybSA9PiAtd2Via2l0LXRyYW5zZm9ybVxuZnVuY3Rpb24gdG9EYXNoZWRBbGwoIHN0ciApIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKCAvKFtBLVpdKS9nLCBmdW5jdGlvbiggJDEgKSB7XG4gICAgcmV0dXJuICctJyArICQxLnRvTG93ZXJDYXNlKCk7XG4gIH0pO1xufVxuXG52YXIgdHJhbnNpdGlvblByb3BzID0gJ29wYWNpdHksJyArIHRvRGFzaGVkQWxsKCB0cmFuc2Zvcm1Qcm9wZXJ0eSApO1xuXG5wcm90by5lbmFibGVUcmFuc2l0aW9uID0gZnVuY3Rpb24oLyogc3R5bGUgKi8pIHtcbiAgLy8gSEFDSyBjaGFuZ2luZyB0cmFuc2l0aW9uUHJvcGVydHkgZHVyaW5nIGEgdHJhbnNpdGlvblxuICAvLyB3aWxsIGNhdXNlIHRyYW5zaXRpb24gdG8ganVtcFxuICBpZiAoIHRoaXMuaXNUcmFuc2l0aW9uaW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIG1ha2UgYHRyYW5zaXRpb246IGZvbywgYmFyLCBiYXpgIGZyb20gc3R5bGUgb2JqZWN0XG4gIC8vIEhBQ0sgdW4tY29tbWVudCB0aGlzIHdoZW4gZW5hYmxlVHJhbnNpdGlvbiBjYW4gd29ya1xuICAvLyB3aGlsZSBhIHRyYW5zaXRpb24gaXMgaGFwcGVuaW5nXG4gIC8vIHZhciB0cmFuc2l0aW9uVmFsdWVzID0gW107XG4gIC8vIGZvciAoIHZhciBwcm9wIGluIHN0eWxlICkge1xuICAvLyAgIC8vIGRhc2gtaWZ5IGNhbWVsQ2FzZWQgcHJvcGVydGllcyBsaWtlIFdlYmtpdFRyYW5zaXRpb25cbiAgLy8gICBwcm9wID0gdmVuZG9yUHJvcGVydGllc1sgcHJvcCBdIHx8IHByb3A7XG4gIC8vICAgdHJhbnNpdGlvblZhbHVlcy5wdXNoKCB0b0Rhc2hlZEFsbCggcHJvcCApICk7XG4gIC8vIH1cbiAgLy8gbXVuZ2UgbnVtYmVyIHRvIG1pbGxpc2Vjb25kLCB0byBtYXRjaCBzdGFnZ2VyXG4gIHZhciBkdXJhdGlvbiA9IHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uO1xuICBkdXJhdGlvbiA9IHR5cGVvZiBkdXJhdGlvbiA9PSAnbnVtYmVyJyA/IGR1cmF0aW9uICsgJ21zJyA6IGR1cmF0aW9uO1xuICAvLyBlbmFibGUgdHJhbnNpdGlvbiBzdHlsZXNcbiAgdGhpcy5jc3Moe1xuICAgIHRyYW5zaXRpb25Qcm9wZXJ0eTogdHJhbnNpdGlvblByb3BzLFxuICAgIHRyYW5zaXRpb25EdXJhdGlvbjogZHVyYXRpb24sXG4gICAgdHJhbnNpdGlvbkRlbGF5OiB0aGlzLnN0YWdnZXJEZWxheSB8fCAwXG4gIH0pO1xuICAvLyBsaXN0ZW4gZm9yIHRyYW5zaXRpb24gZW5kIGV2ZW50XG4gIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCB0cmFuc2l0aW9uRW5kRXZlbnQsIHRoaXMsIGZhbHNlICk7XG59O1xuXG4vLyAtLS0tLSBldmVudHMgLS0tLS0gLy9cblxucHJvdG8ub253ZWJraXRUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB0aGlzLm9udHJhbnNpdGlvbmVuZCggZXZlbnQgKTtcbn07XG5cbnByb3RvLm9ub3RyYW5zaXRpb25lbmQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMub250cmFuc2l0aW9uZW5kKCBldmVudCApO1xufTtcblxuLy8gcHJvcGVydGllcyB0aGF0IEkgbXVuZ2UgdG8gbWFrZSBteSBsaWZlIGVhc2llclxudmFyIGRhc2hlZFZlbmRvclByb3BlcnRpZXMgPSB7XG4gICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2Zvcm0nXG59O1xuXG5wcm90by5vbnRyYW5zaXRpb25lbmQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIC8vIGRpc3JlZ2FyZCBidWJibGVkIGV2ZW50cyBmcm9tIGNoaWxkcmVuXG4gIGlmICggZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmVsZW1lbnQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBfdHJhbnNpdGlvbiA9IHRoaXMuX3RyYW5zbjtcbiAgLy8gZ2V0IHByb3BlcnR5IG5hbWUgb2YgdHJhbnNpdGlvbmVkIHByb3BlcnR5LCBjb252ZXJ0IHRvIHByZWZpeC1mcmVlXG4gIHZhciBwcm9wZXJ0eU5hbWUgPSBkYXNoZWRWZW5kb3JQcm9wZXJ0aWVzWyBldmVudC5wcm9wZXJ0eU5hbWUgXSB8fCBldmVudC5wcm9wZXJ0eU5hbWU7XG5cbiAgLy8gcmVtb3ZlIHByb3BlcnR5IHRoYXQgaGFzIGNvbXBsZXRlZCB0cmFuc2l0aW9uaW5nXG4gIGRlbGV0ZSBfdHJhbnNpdGlvbi5pbmdQcm9wZXJ0aWVzWyBwcm9wZXJ0eU5hbWUgXTtcbiAgLy8gY2hlY2sgaWYgYW55IHByb3BlcnRpZXMgYXJlIHN0aWxsIHRyYW5zaXRpb25pbmdcbiAgaWYgKCBpc0VtcHR5T2JqKCBfdHJhbnNpdGlvbi5pbmdQcm9wZXJ0aWVzICkgKSB7XG4gICAgLy8gYWxsIHByb3BlcnRpZXMgaGF2ZSBjb21wbGV0ZWQgdHJhbnNpdGlvbmluZ1xuICAgIHRoaXMuZGlzYWJsZVRyYW5zaXRpb24oKTtcbiAgfVxuICAvLyBjbGVhbiBzdHlsZVxuICBpZiAoIHByb3BlcnR5TmFtZSBpbiBfdHJhbnNpdGlvbi5jbGVhbiApIHtcbiAgICAvLyBjbGVhbiB1cCBzdHlsZVxuICAgIHRoaXMuZWxlbWVudC5zdHlsZVsgZXZlbnQucHJvcGVydHlOYW1lIF0gPSAnJztcbiAgICBkZWxldGUgX3RyYW5zaXRpb24uY2xlYW5bIHByb3BlcnR5TmFtZSBdO1xuICB9XG4gIC8vIHRyaWdnZXIgb25UcmFuc2l0aW9uRW5kIGNhbGxiYWNrXG4gIGlmICggcHJvcGVydHlOYW1lIGluIF90cmFuc2l0aW9uLm9uRW5kICkge1xuICAgIHZhciBvblRyYW5zaXRpb25FbmQgPSBfdHJhbnNpdGlvbi5vbkVuZFsgcHJvcGVydHlOYW1lIF07XG4gICAgb25UcmFuc2l0aW9uRW5kLmNhbGwoIHRoaXMgKTtcbiAgICBkZWxldGUgX3RyYW5zaXRpb24ub25FbmRbIHByb3BlcnR5TmFtZSBdO1xuICB9XG5cbiAgdGhpcy5lbWl0RXZlbnQoICd0cmFuc2l0aW9uRW5kJywgWyB0aGlzIF0gKTtcbn07XG5cbnByb3RvLmRpc2FibGVUcmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVtb3ZlVHJhbnNpdGlvblN0eWxlcygpO1xuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHJhbnNpdGlvbkVuZEV2ZW50LCB0aGlzLCBmYWxzZSApO1xuICB0aGlzLmlzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiByZW1vdmVzIHN0eWxlIHByb3BlcnR5IGZyb20gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlXG4qKi9cbnByb3RvLl9yZW1vdmVTdHlsZXMgPSBmdW5jdGlvbiggc3R5bGUgKSB7XG4gIC8vIGNsZWFuIHVwIHRyYW5zaXRpb24gc3R5bGVzXG4gIHZhciBjbGVhblN0eWxlID0ge307XG4gIGZvciAoIHZhciBwcm9wIGluIHN0eWxlICkge1xuICAgIGNsZWFuU3R5bGVbIHByb3AgXSA9ICcnO1xuICB9XG4gIHRoaXMuY3NzKCBjbGVhblN0eWxlICk7XG59O1xuXG52YXIgY2xlYW5UcmFuc2l0aW9uU3R5bGUgPSB7XG4gIHRyYW5zaXRpb25Qcm9wZXJ0eTogJycsXG4gIHRyYW5zaXRpb25EdXJhdGlvbjogJycsXG4gIHRyYW5zaXRpb25EZWxheTogJydcbn07XG5cbnByb3RvLnJlbW92ZVRyYW5zaXRpb25TdHlsZXMgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmVtb3ZlIHRyYW5zaXRpb25cbiAgdGhpcy5jc3MoIGNsZWFuVHJhbnNpdGlvblN0eWxlICk7XG59O1xuXG4vLyAtLS0tLSBzdGFnZ2VyIC0tLS0tIC8vXG5cbnByb3RvLnN0YWdnZXIgPSBmdW5jdGlvbiggZGVsYXkgKSB7XG4gIGRlbGF5ID0gaXNOYU4oIGRlbGF5ICkgPyAwIDogZGVsYXk7XG4gIHRoaXMuc3RhZ2dlckRlbGF5ID0gZGVsYXkgKyAnbXMnO1xufTtcblxuLy8gLS0tLS0gc2hvdy9oaWRlL3JlbW92ZSAtLS0tLSAvL1xuXG4vLyByZW1vdmUgZWxlbWVudCBmcm9tIERPTVxucHJvdG8ucmVtb3ZlRWxlbSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGhpcy5lbGVtZW50ICk7XG4gIC8vIHJlbW92ZSBkaXNwbGF5OiBub25lXG4gIHRoaXMuY3NzKHsgZGlzcGxheTogJycgfSk7XG4gIHRoaXMuZW1pdEV2ZW50KCAncmVtb3ZlJywgWyB0aGlzIF0gKTtcbn07XG5cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBqdXN0IHJlbW92ZSBlbGVtZW50IGlmIG5vIHRyYW5zaXRpb24gc3VwcG9ydCBvciBubyB0cmFuc2l0aW9uXG4gIGlmICggIXRyYW5zaXRpb25Qcm9wZXJ0eSB8fCAhcGFyc2VGbG9hdCggdGhpcy5sYXlvdXQub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb24gKSApIHtcbiAgICB0aGlzLnJlbW92ZUVsZW0oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzdGFydCB0cmFuc2l0aW9uXG4gIHRoaXMub25jZSggJ3RyYW5zaXRpb25FbmQnLCBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUVsZW0oKTtcbiAgfSk7XG4gIHRoaXMuaGlkZSgpO1xufTtcblxucHJvdG8ucmV2ZWFsID0gZnVuY3Rpb24oKSB7XG4gIGRlbGV0ZSB0aGlzLmlzSGlkZGVuO1xuICAvLyByZW1vdmUgZGlzcGxheTogbm9uZVxuICB0aGlzLmNzcyh7IGRpc3BsYXk6ICcnIH0pO1xuXG4gIHZhciBvcHRpb25zID0gdGhpcy5sYXlvdXQub3B0aW9ucztcblxuICB2YXIgb25UcmFuc2l0aW9uRW5kID0ge307XG4gIHZhciB0cmFuc2l0aW9uRW5kUHJvcGVydHkgPSB0aGlzLmdldEhpZGVSZXZlYWxUcmFuc2l0aW9uRW5kUHJvcGVydHkoJ3Zpc2libGVTdHlsZScpO1xuICBvblRyYW5zaXRpb25FbmRbIHRyYW5zaXRpb25FbmRQcm9wZXJ0eSBdID0gdGhpcy5vblJldmVhbFRyYW5zaXRpb25FbmQ7XG5cbiAgdGhpcy50cmFuc2l0aW9uKHtcbiAgICBmcm9tOiBvcHRpb25zLmhpZGRlblN0eWxlLFxuICAgIHRvOiBvcHRpb25zLnZpc2libGVTdHlsZSxcbiAgICBpc0NsZWFuaW5nOiB0cnVlLFxuICAgIG9uVHJhbnNpdGlvbkVuZDogb25UcmFuc2l0aW9uRW5kXG4gIH0pO1xufTtcblxucHJvdG8ub25SZXZlYWxUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNoZWNrIGlmIHN0aWxsIHZpc2libGVcbiAgLy8gZHVyaW5nIHRyYW5zaXRpb24sIGl0ZW0gbWF5IGhhdmUgYmVlbiBoaWRkZW5cbiAgaWYgKCAhdGhpcy5pc0hpZGRlbiApIHtcbiAgICB0aGlzLmVtaXRFdmVudCgncmV2ZWFsJyk7XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IHN0eWxlIHByb3BlcnR5IHVzZSBmb3IgaGlkZS9yZXZlYWwgdHJhbnNpdGlvbiBlbmRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHlsZVByb3BlcnR5IC0gaGlkZGVuU3R5bGUvdmlzaWJsZVN0eWxlXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5wcm90by5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5ID0gZnVuY3Rpb24oIHN0eWxlUHJvcGVydHkgKSB7XG4gIHZhciBvcHRpb25TdHlsZSA9IHRoaXMubGF5b3V0Lm9wdGlvbnNbIHN0eWxlUHJvcGVydHkgXTtcbiAgLy8gdXNlIG9wYWNpdHlcbiAgaWYgKCBvcHRpb25TdHlsZS5vcGFjaXR5ICkge1xuICAgIHJldHVybiAnb3BhY2l0eSc7XG4gIH1cbiAgLy8gZ2V0IGZpcnN0IHByb3BlcnR5XG4gIGZvciAoIHZhciBwcm9wIGluIG9wdGlvblN0eWxlICkge1xuICAgIHJldHVybiBwcm9wO1xuICB9XG59O1xuXG5wcm90by5oaWRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHNldCBmbGFnXG4gIHRoaXMuaXNIaWRkZW4gPSB0cnVlO1xuICAvLyByZW1vdmUgZGlzcGxheTogbm9uZVxuICB0aGlzLmNzcyh7IGRpc3BsYXk6ICcnIH0pO1xuXG4gIHZhciBvcHRpb25zID0gdGhpcy5sYXlvdXQub3B0aW9ucztcblxuICB2YXIgb25UcmFuc2l0aW9uRW5kID0ge307XG4gIHZhciB0cmFuc2l0aW9uRW5kUHJvcGVydHkgPSB0aGlzLmdldEhpZGVSZXZlYWxUcmFuc2l0aW9uRW5kUHJvcGVydHkoJ2hpZGRlblN0eWxlJyk7XG4gIG9uVHJhbnNpdGlvbkVuZFsgdHJhbnNpdGlvbkVuZFByb3BlcnR5IF0gPSB0aGlzLm9uSGlkZVRyYW5zaXRpb25FbmQ7XG5cbiAgdGhpcy50cmFuc2l0aW9uKHtcbiAgICBmcm9tOiBvcHRpb25zLnZpc2libGVTdHlsZSxcbiAgICB0bzogb3B0aW9ucy5oaWRkZW5TdHlsZSxcbiAgICAvLyBrZWVwIGhpZGRlbiBzdHVmZiBoaWRkZW5cbiAgICBpc0NsZWFuaW5nOiB0cnVlLFxuICAgIG9uVHJhbnNpdGlvbkVuZDogb25UcmFuc2l0aW9uRW5kXG4gIH0pO1xufTtcblxucHJvdG8ub25IaWRlVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCkge1xuICAvLyBjaGVjayBpZiBzdGlsbCBoaWRkZW5cbiAgLy8gZHVyaW5nIHRyYW5zaXRpb24sIGl0ZW0gbWF5IGhhdmUgYmVlbiB1bi1oaWRkZW5cbiAgaWYgKCB0aGlzLmlzSGlkZGVuICkge1xuICAgIHRoaXMuY3NzKHsgZGlzcGxheTogJ25vbmUnIH0pO1xuICAgIHRoaXMuZW1pdEV2ZW50KCdoaWRlJyk7XG4gIH1cbn07XG5cbnByb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jc3Moe1xuICAgIHBvc2l0aW9uOiAnJyxcbiAgICBsZWZ0OiAnJyxcbiAgICByaWdodDogJycsXG4gICAgdG9wOiAnJyxcbiAgICBib3R0b206ICcnLFxuICAgIHRyYW5zaXRpb246ICcnLFxuICAgIHRyYW5zZm9ybTogJydcbiAgfSk7XG59O1xuXG5yZXR1cm4gSXRlbTtcblxufSkpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FDQTtBQUFBO0FBQUE7QUFBQSxrR0FDQTtBQUNBLFdBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/outlayer/item.js\n");

/***/ }),

/***/ "./node_modules/outlayer/outlayer.js":
/*!*******************************************!*\
  !*** ./node_modules/outlayer/outlayer.js ***!
  \*******************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Outlayer v2.1.1\n * the brains and guts of a layout library\n * MIT license\n */\n\n( function( window, factory ) {\n  'use strict';\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, require */\n  if ( true ) {\n    // AMD - RequireJS\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n        __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\"),\n        __webpack_require__(/*! get-size/get-size */ \"./node_modules/get-size/get-size.js\"),\n        __webpack_require__(/*! fizzy-ui-utils/utils */ \"./node_modules/fizzy-ui-utils/utils.js\"),\n        __webpack_require__(/*! ./item */ \"./node_modules/outlayer/item.js\")\n      ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter, getSize, utils, Item ) {\n        return factory( window, EvEmitter, getSize, utils, Item);\n      }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, EvEmitter, getSize, utils, Item ) {\n'use strict';\n\n// ----- vars ----- //\n\nvar console = window.console;\nvar jQuery = window.jQuery;\nvar noop = function() {};\n\n// -------------------------- Outlayer -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Outlayer intances\nvar instances = {};\n\n\n/**\n * @param {Element, String} element\n * @param {Object} options\n * @constructor\n */\nfunction Outlayer( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for ' + this.constructor.namespace +\n        ': ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // add id for Outlayer.getFromElement\n  var id = ++GUID;\n  this.element.outlayerGUID = id; // expando\n  instances[ id ] = this; // associate via id\n\n  // kick it off\n  this._create();\n\n  var isInitLayout = this._getOption('initLayout');\n  if ( isInitLayout ) {\n    this.layout();\n  }\n}\n\n// settings are for internal use only\nOutlayer.namespace = 'outlayer';\nOutlayer.Item = Item;\n\n// default options\nOutlayer.defaults = {\n  containerStyle: {\n    position: 'relative'\n  },\n  initLayout: true,\n  originLeft: true,\n  originTop: true,\n  resize: true,\n  resizeContainer: true,\n  // item options\n  transitionDuration: '0.4s',\n  hiddenStyle: {\n    opacity: 0,\n    transform: 'scale(0.001)'\n  },\n  visibleStyle: {\n    opacity: 1,\n    transform: 'scale(1)'\n  }\n};\n\nvar proto = Outlayer.prototype;\n// inherit EvEmitter\nutils.extend( proto, EvEmitter.prototype );\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\n/**\n * get backwards compatible option value, check old name\n */\nproto._getOption = function( option ) {\n  var oldOption = this.constructor.compatOptions[ option ];\n  return oldOption && this.options[ oldOption ] !== undefined ?\n    this.options[ oldOption ] : this.options[ option ];\n};\n\nOutlayer.compatOptions = {\n  // currentName: oldName\n  initLayout: 'isInitLayout',\n  horizontal: 'isHorizontal',\n  layoutInstant: 'isLayoutInstant',\n  originLeft: 'isOriginLeft',\n  originTop: 'isOriginTop',\n  resize: 'isResizeBound',\n  resizeContainer: 'isResizingContainer'\n};\n\nproto._create = function() {\n  // get items from children\n  this.reloadItems();\n  // elements that affect layout, but are not laid out\n  this.stamps = [];\n  this.stamp( this.options.stamp );\n  // set container style\n  utils.extend( this.element.style, this.options.containerStyle );\n\n  // bind resize method\n  var canBindResize = this._getOption('resize');\n  if ( canBindResize ) {\n    this.bindResize();\n  }\n};\n\n// goes through all children again and gets bricks in proper order\nproto.reloadItems = function() {\n  // collection of item elements\n  this.items = this._itemize( this.element.children );\n};\n\n\n/**\n * turn elements into Outlayer.Items to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Outlayer Items\n */\nproto._itemize = function( elems ) {\n\n  var itemElems = this._filterFindItemElements( elems );\n  var Item = this.constructor.Item;\n\n  // create new Outlayer Items for collection\n  var items = [];\n  for ( var i=0; i < itemElems.length; i++ ) {\n    var elem = itemElems[i];\n    var item = new Item( elem, this );\n    items.push( item );\n  }\n\n  return items;\n};\n\n/**\n * get item elements to be used in layout\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - item elements\n */\nproto._filterFindItemElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.itemSelector );\n};\n\n/**\n * getter method for getting item elements\n * @returns {Array} elems - collection of item elements\n */\nproto.getItemElements = function() {\n  return this.items.map( function( item ) {\n    return item.element;\n  });\n};\n\n// ----- init & layout ----- //\n\n/**\n * lays out all items\n */\nproto.layout = function() {\n  this._resetLayout();\n  this._manageStamps();\n\n  // don't animate first layout\n  var layoutInstant = this._getOption('layoutInstant');\n  var isInstant = layoutInstant !== undefined ?\n    layoutInstant : !this._isLayoutInited;\n  this.layoutItems( this.items, isInstant );\n\n  // flag for initalized\n  this._isLayoutInited = true;\n};\n\n// _init is alias for layout\nproto._init = proto.layout;\n\n/**\n * logic before any new layout\n */\nproto._resetLayout = function() {\n  this.getSize();\n};\n\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\n/**\n * get measurement from option, for columnWidth, rowHeight, gutter\n * if option is String -> get element from selector string, & get size of element\n * if option is Element -> get size of element\n * else use option as a number\n *\n * @param {String} measurement\n * @param {String} size - width or height\n * @private\n */\nproto._getMeasurement = function( measurement, size ) {\n  var option = this.options[ measurement ];\n  var elem;\n  if ( !option ) {\n    // default to 0\n    this[ measurement ] = 0;\n  } else {\n    // use option as an element\n    if ( typeof option == 'string' ) {\n      elem = this.element.querySelector( option );\n    } else if ( option instanceof HTMLElement ) {\n      elem = option;\n    }\n    // use size of element, if element\n    this[ measurement ] = elem ? getSize( elem )[ size ] : option;\n  }\n};\n\n/**\n * layout a collection of item elements\n * @api public\n */\nproto.layoutItems = function( items, isInstant ) {\n  items = this._getItemsForLayout( items );\n\n  this._layoutItems( items, isInstant );\n\n  this._postLayout();\n};\n\n/**\n * get the items to be laid out\n * you may want to skip over some items\n * @param {Array} items\n * @returns {Array} items\n */\nproto._getItemsForLayout = function( items ) {\n  return items.filter( function( item ) {\n    return !item.isIgnored;\n  });\n};\n\n/**\n * layout items\n * @param {Array} items\n * @param {Boolean} isInstant\n */\nproto._layoutItems = function( items, isInstant ) {\n  this._emitCompleteOnItems( 'layout', items );\n\n  if ( !items || !items.length ) {\n    // no items, emit event with empty array\n    return;\n  }\n\n  var queue = [];\n\n  items.forEach( function( item ) {\n    // get x/y object from method\n    var position = this._getItemLayoutPosition( item );\n    // enqueue\n    position.item = item;\n    position.isInstant = isInstant || item.isLayoutInstant;\n    queue.push( position );\n  }, this );\n\n  this._processLayoutQueue( queue );\n};\n\n/**\n * get item layout position\n * @param {Outlayer.Item} item\n * @returns {Object} x and y position\n */\nproto._getItemLayoutPosition = function( /* item */ ) {\n  return {\n    x: 0,\n    y: 0\n  };\n};\n\n/**\n * iterate over array and position each item\n * Reason being - separating this logic prevents 'layout invalidation'\n * thx @paul_irish\n * @param {Array} queue\n */\nproto._processLayoutQueue = function( queue ) {\n  this.updateStagger();\n  queue.forEach( function( obj, i ) {\n    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );\n  }, this );\n};\n\n// set stagger from option in milliseconds number\nproto.updateStagger = function() {\n  var stagger = this.options.stagger;\n  if ( stagger === null || stagger === undefined ) {\n    this.stagger = 0;\n    return;\n  }\n  this.stagger = getMilliseconds( stagger );\n  return this.stagger;\n};\n\n/**\n * Sets position of item in DOM\n * @param {Outlayer.Item} item\n * @param {Number} x - horizontal position\n * @param {Number} y - vertical position\n * @param {Boolean} isInstant - disables transitions\n */\nproto._positionItem = function( item, x, y, isInstant, i ) {\n  if ( isInstant ) {\n    // if not transition, just set CSS\n    item.goTo( x, y );\n  } else {\n    item.stagger( i * this.stagger );\n    item.moveTo( x, y );\n  }\n};\n\n/**\n * Any logic you want to do after each layout,\n * i.e. size the container\n */\nproto._postLayout = function() {\n  this.resizeContainer();\n};\n\nproto.resizeContainer = function() {\n  var isResizingContainer = this._getOption('resizeContainer');\n  if ( !isResizingContainer ) {\n    return;\n  }\n  var size = this._getContainerSize();\n  if ( size ) {\n    this._setContainerMeasure( size.width, true );\n    this._setContainerMeasure( size.height, false );\n  }\n};\n\n/**\n * Sets width or height of container if returned\n * @returns {Object} size\n *   @param {Number} width\n *   @param {Number} height\n */\nproto._getContainerSize = noop;\n\n/**\n * @param {Number} measure - size of width or height\n * @param {Boolean} isWidth\n */\nproto._setContainerMeasure = function( measure, isWidth ) {\n  if ( measure === undefined ) {\n    return;\n  }\n\n  var elemSize = this.size;\n  // add padding and border width if border box\n  if ( elemSize.isBorderBox ) {\n    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +\n      elemSize.borderLeftWidth + elemSize.borderRightWidth :\n      elemSize.paddingBottom + elemSize.paddingTop +\n      elemSize.borderTopWidth + elemSize.borderBottomWidth;\n  }\n\n  measure = Math.max( measure, 0 );\n  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';\n};\n\n/**\n * emit eventComplete on a collection of items events\n * @param {String} eventName\n * @param {Array} items - Outlayer.Items\n */\nproto._emitCompleteOnItems = function( eventName, items ) {\n  var _this = this;\n  function onComplete() {\n    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );\n  }\n\n  var count = items.length;\n  if ( !items || !count ) {\n    onComplete();\n    return;\n  }\n\n  var doneCount = 0;\n  function tick() {\n    doneCount++;\n    if ( doneCount == count ) {\n      onComplete();\n    }\n  }\n\n  // bind callback\n  items.forEach( function( item ) {\n    item.once( eventName, tick );\n  });\n};\n\n/**\n * emits events via EvEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  // add original event to arguments\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery ) {\n    // set this.$element\n    this.$element = this.$element || jQuery( this.element );\n    if ( event ) {\n      // create jQuery event\n      var $event = jQuery.Event( event );\n      $event.type = type;\n      this.$element.trigger( $event, args );\n    } else {\n      // just trigger with type if no event available\n      this.$element.trigger( type, args );\n    }\n  }\n};\n\n// -------------------------- ignore & stamps -------------------------- //\n\n\n/**\n * keep item in collection, but do not lay it out\n * ignored items do not get skipped in layout\n * @param {Element} elem\n */\nproto.ignore = function( elem ) {\n  var item = this.getItem( elem );\n  if ( item ) {\n    item.isIgnored = true;\n  }\n};\n\n/**\n * return item to layout collection\n * @param {Element} elem\n */\nproto.unignore = function( elem ) {\n  var item = this.getItem( elem );\n  if ( item ) {\n    delete item.isIgnored;\n  }\n};\n\n/**\n * adds elements to stamps\n * @param {NodeList, Array, Element, or String} elems\n */\nproto.stamp = function( elems ) {\n  elems = this._find( elems );\n  if ( !elems ) {\n    return;\n  }\n\n  this.stamps = this.stamps.concat( elems );\n  // ignore\n  elems.forEach( this.ignore, this );\n};\n\n/**\n * removes elements to stamps\n * @param {NodeList, Array, or Element} elems\n */\nproto.unstamp = function( elems ) {\n  elems = this._find( elems );\n  if ( !elems ){\n    return;\n  }\n\n  elems.forEach( function( elem ) {\n    // filter out removed stamp elements\n    utils.removeFrom( this.stamps, elem );\n    this.unignore( elem );\n  }, this );\n};\n\n/**\n * finds child elements\n * @param {NodeList, Array, Element, or String} elems\n * @returns {Array} elems\n */\nproto._find = function( elems ) {\n  if ( !elems ) {\n    return;\n  }\n  // if string, use argument as selector string\n  if ( typeof elems == 'string' ) {\n    elems = this.element.querySelectorAll( elems );\n  }\n  elems = utils.makeArray( elems );\n  return elems;\n};\n\nproto._manageStamps = function() {\n  if ( !this.stamps || !this.stamps.length ) {\n    return;\n  }\n\n  this._getBoundingRect();\n\n  this.stamps.forEach( this._manageStamp, this );\n};\n\n// update boundingLeft / Top\nproto._getBoundingRect = function() {\n  // get bounding rect for container element\n  var boundingRect = this.element.getBoundingClientRect();\n  var size = this.size;\n  this._boundingRect = {\n    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,\n    top: boundingRect.top + size.paddingTop + size.borderTopWidth,\n    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),\n    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )\n  };\n};\n\n/**\n * @param {Element} stamp\n**/\nproto._manageStamp = noop;\n\n/**\n * get x/y position of element relative to container element\n * @param {Element} elem\n * @returns {Object} offset - has left, top, right, bottom\n */\nproto._getElementOffset = function( elem ) {\n  var boundingRect = elem.getBoundingClientRect();\n  var thisRect = this._boundingRect;\n  var size = getSize( elem );\n  var offset = {\n    left: boundingRect.left - thisRect.left - size.marginLeft,\n    top: boundingRect.top - thisRect.top - size.marginTop,\n    right: thisRect.right - boundingRect.right - size.marginRight,\n    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom\n  };\n  return offset;\n};\n\n// -------------------------- resize -------------------------- //\n\n// enable event handlers for listeners\n// i.e. resize -> onresize\nproto.handleEvent = utils.handleEvent;\n\n/**\n * Bind layout to window resizing\n */\nproto.bindResize = function() {\n  window.addEventListener( 'resize', this );\n  this.isResizeBound = true;\n};\n\n/**\n * Unbind layout to window resizing\n */\nproto.unbindResize = function() {\n  window.removeEventListener( 'resize', this );\n  this.isResizeBound = false;\n};\n\nproto.onresize = function() {\n  this.resize();\n};\n\nutils.debounceMethod( Outlayer, 'onresize', 100 );\n\nproto.resize = function() {\n  // don't trigger if size did not change\n  // or if resize was unbound. See #9\n  if ( !this.isResizeBound || !this.needsResizeLayout() ) {\n    return;\n  }\n\n  this.layout();\n};\n\n/**\n * check if layout is needed post layout\n * @returns Boolean\n */\nproto.needsResizeLayout = function() {\n  var size = getSize( this.element );\n  // check that this.size and size are there\n  // IE8 triggers resize on body size change, so they might not be\n  var hasSizes = this.size && size;\n  return hasSizes && size.innerWidth !== this.size.innerWidth;\n};\n\n// -------------------------- methods -------------------------- //\n\n/**\n * add items to Outlayer instance\n * @param {Array or NodeList or Element} elems\n * @returns {Array} items - Outlayer.Items\n**/\nproto.addItems = function( elems ) {\n  var items = this._itemize( elems );\n  // add items to collection\n  if ( items.length ) {\n    this.items = this.items.concat( items );\n  }\n  return items;\n};\n\n/**\n * Layout newly-appended item elements\n * @param {Array or NodeList or Element} elems\n */\nproto.appended = function( elems ) {\n  var items = this.addItems( elems );\n  if ( !items.length ) {\n    return;\n  }\n  // layout and reveal just the new items\n  this.layoutItems( items, true );\n  this.reveal( items );\n};\n\n/**\n * Layout prepended elements\n * @param {Array or NodeList or Element} elems\n */\nproto.prepended = function( elems ) {\n  var items = this._itemize( elems );\n  if ( !items.length ) {\n    return;\n  }\n  // add items to beginning of collection\n  var previousItems = this.items.slice(0);\n  this.items = items.concat( previousItems );\n  // start new layout\n  this._resetLayout();\n  this._manageStamps();\n  // layout new stuff without transition\n  this.layoutItems( items, true );\n  this.reveal( items );\n  // layout previous items\n  this.layoutItems( previousItems );\n};\n\n/**\n * reveal a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.reveal = function( items ) {\n  this._emitCompleteOnItems( 'reveal', items );\n  if ( !items || !items.length ) {\n    return;\n  }\n  var stagger = this.updateStagger();\n  items.forEach( function( item, i ) {\n    item.stagger( i * stagger );\n    item.reveal();\n  });\n};\n\n/**\n * hide a collection of items\n * @param {Array of Outlayer.Items} items\n */\nproto.hide = function( items ) {\n  this._emitCompleteOnItems( 'hide', items );\n  if ( !items || !items.length ) {\n    return;\n  }\n  var stagger = this.updateStagger();\n  items.forEach( function( item, i ) {\n    item.stagger( i * stagger );\n    item.hide();\n  });\n};\n\n/**\n * reveal item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.revealItemElements = function( elems ) {\n  var items = this.getItems( elems );\n  this.reveal( items );\n};\n\n/**\n * hide item elements\n * @param {Array}, {Element}, {NodeList} items\n */\nproto.hideItemElements = function( elems ) {\n  var items = this.getItems( elems );\n  this.hide( items );\n};\n\n/**\n * get Outlayer.Item, given an Element\n * @param {Element} elem\n * @param {Function} callback\n * @returns {Outlayer.Item} item\n */\nproto.getItem = function( elem ) {\n  // loop through items to get the one that matches\n  for ( var i=0; i < this.items.length; i++ ) {\n    var item = this.items[i];\n    if ( item.element == elem ) {\n      // return item\n      return item;\n    }\n  }\n};\n\n/**\n * get collection of Outlayer.Items, given Elements\n * @param {Array} elems\n * @returns {Array} items - Outlayer.Items\n */\nproto.getItems = function( elems ) {\n  elems = utils.makeArray( elems );\n  var items = [];\n  elems.forEach( function( elem ) {\n    var item = this.getItem( elem );\n    if ( item ) {\n      items.push( item );\n    }\n  }, this );\n\n  return items;\n};\n\n/**\n * remove element(s) from instance and DOM\n * @param {Array or NodeList or Element} elems\n */\nproto.remove = function( elems ) {\n  var removeItems = this.getItems( elems );\n\n  this._emitCompleteOnItems( 'remove', removeItems );\n\n  // bail if no items to remove\n  if ( !removeItems || !removeItems.length ) {\n    return;\n  }\n\n  removeItems.forEach( function( item ) {\n    item.remove();\n    // remove item from collection\n    utils.removeFrom( this.items, item );\n  }, this );\n};\n\n// ----- destroy ----- //\n\n// remove and disable Outlayer instance\nproto.destroy = function() {\n  // clean up dynamic styles\n  var style = this.element.style;\n  style.height = '';\n  style.position = '';\n  style.width = '';\n  // destroy items\n  this.items.forEach( function( item ) {\n    item.destroy();\n  });\n\n  this.unbindResize();\n\n  var id = this.element.outlayerGUID;\n  delete instances[ id ]; // remove reference to instance by id\n  delete this.element.outlayerGUID;\n  // remove data for jQuery\n  if ( jQuery ) {\n    jQuery.removeData( this.element, this.constructor.namespace );\n  }\n\n};\n\n// -------------------------- data -------------------------- //\n\n/**\n * get Outlayer instance from element\n * @param {Element} elem\n * @returns {Outlayer}\n */\nOutlayer.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.outlayerGUID;\n  return id && instances[ id ];\n};\n\n\n// -------------------------- create Outlayer class -------------------------- //\n\n/**\n * create a layout class\n * @param {String} namespace\n */\nOutlayer.create = function( namespace, options ) {\n  // sub-class Outlayer\n  var Layout = subclass( Outlayer );\n  // apply new options and compatOptions\n  Layout.defaults = utils.extend( {}, Outlayer.defaults );\n  utils.extend( Layout.defaults, options );\n  Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions  );\n\n  Layout.namespace = namespace;\n\n  Layout.data = Outlayer.data;\n\n  // sub-class Item\n  Layout.Item = subclass( Item );\n\n  // -------------------------- declarative -------------------------- //\n\n  utils.htmlInit( Layout, namespace );\n\n  // -------------------------- jQuery bridge -------------------------- //\n\n  // make into jQuery plugin\n  if ( jQuery && jQuery.bridget ) {\n    jQuery.bridget( namespace, Layout );\n  }\n\n  return Layout;\n};\n\nfunction subclass( Parent ) {\n  function SubClass() {\n    Parent.apply( this, arguments );\n  }\n\n  SubClass.prototype = Object.create( Parent.prototype );\n  SubClass.prototype.constructor = SubClass;\n\n  return SubClass;\n}\n\n// ----- helpers ----- //\n\n// how many milliseconds are in each unit\nvar msUnits = {\n  ms: 1,\n  s: 1000\n};\n\n// munge time-like parameter into millisecond number\n// '0.4s' -> 40\nfunction getMilliseconds( time ) {\n  if ( typeof time == 'number' ) {\n    return time;\n  }\n  var matches = time.match( /(^\\d*\\.?\\d*)(\\w*)/ );\n  var num = matches && matches[1];\n  var unit = matches && matches[2];\n  if ( !num.length ) {\n    return 0;\n  }\n  num = parseFloat( num );\n  var mult = msUnits[ unit ] || 1;\n  return num * mult;\n}\n\n// ----- fin ----- //\n\n// back in global\nOutlayer.Item = Item;\n\nreturn Outlayer;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvb3V0bGF5ZXIvb3V0bGF5ZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL291dGxheWVyL291dGxheWVyLmpzPzFmMmUiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBPdXRsYXllciB2Mi4xLjFcbiAqIHRoZSBicmFpbnMgYW5kIGd1dHMgb2YgYSBsYXlvdXQgbGlicmFyeVxuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTUQgLSBSZXF1aXJlSlNcbiAgICBkZWZpbmUoIFtcbiAgICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcicsXG4gICAgICAgICdnZXQtc2l6ZS9nZXQtc2l6ZScsXG4gICAgICAgICdmaXp6eS11aS11dGlscy91dGlscycsXG4gICAgICAgICcuL2l0ZW0nXG4gICAgICBdLFxuICAgICAgZnVuY3Rpb24oIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0gKSB7XG4gICAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0pO1xuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnZXYtZW1pdHRlcicpLFxuICAgICAgcmVxdWlyZSgnZ2V0LXNpemUnKSxcbiAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJyksXG4gICAgICByZXF1aXJlKCcuL2l0ZW0nKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuT3V0bGF5ZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkV2RW1pdHRlcixcbiAgICAgIHdpbmRvdy5nZXRTaXplLFxuICAgICAgd2luZG93LmZpenp5VUlVdGlscyxcbiAgICAgIHdpbmRvdy5PdXRsYXllci5JdGVtXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyLCBnZXRTaXplLCB1dGlscywgSXRlbSApIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0gdmFycyAtLS0tLSAvL1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xudmFyIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7XG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE91dGxheWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyc1xudmFyIEdVSUQgPSAwO1xuLy8gaW50ZXJuYWwgc3RvcmUgb2YgYWxsIE91dGxheWVyIGludGFuY2VzXG52YXIgaW5zdGFuY2VzID0ge307XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnQsIFN0cmluZ30gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBPdXRsYXllciggZWxlbWVudCwgb3B0aW9ucyApIHtcbiAgdmFyIHF1ZXJ5RWxlbWVudCA9IHV0aWxzLmdldFF1ZXJ5RWxlbWVudCggZWxlbWVudCApO1xuICBpZiAoICFxdWVyeUVsZW1lbnQgKSB7XG4gICAgaWYgKCBjb25zb2xlICkge1xuICAgICAgY29uc29sZS5lcnJvciggJ0JhZCBlbGVtZW50IGZvciAnICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lc3BhY2UgK1xuICAgICAgICAnOiAnICsgKCBxdWVyeUVsZW1lbnQgfHwgZWxlbWVudCApICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQgPSBxdWVyeUVsZW1lbnQ7XG4gIC8vIGFkZCBqUXVlcnlcbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGpRdWVyeSggdGhpcy5lbGVtZW50ICk7XG4gIH1cblxuICAvLyBvcHRpb25zXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmV4dGVuZCgge30sIHRoaXMuY29uc3RydWN0b3IuZGVmYXVsdHMgKTtcbiAgdGhpcy5vcHRpb24oIG9wdGlvbnMgKTtcblxuICAvLyBhZGQgaWQgZm9yIE91dGxheWVyLmdldEZyb21FbGVtZW50XG4gIHZhciBpZCA9ICsrR1VJRDtcbiAgdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRCA9IGlkOyAvLyBleHBhbmRvXG4gIGluc3RhbmNlc1sgaWQgXSA9IHRoaXM7IC8vIGFzc29jaWF0ZSB2aWEgaWRcblxuICAvLyBraWNrIGl0IG9mZlxuICB0aGlzLl9jcmVhdGUoKTtcblxuICB2YXIgaXNJbml0TGF5b3V0ID0gdGhpcy5fZ2V0T3B0aW9uKCdpbml0TGF5b3V0Jyk7XG4gIGlmICggaXNJbml0TGF5b3V0ICkge1xuICAgIHRoaXMubGF5b3V0KCk7XG4gIH1cbn1cblxuLy8gc2V0dGluZ3MgYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seVxuT3V0bGF5ZXIubmFtZXNwYWNlID0gJ291dGxheWVyJztcbk91dGxheWVyLkl0ZW0gPSBJdGVtO1xuXG4vLyBkZWZhdWx0IG9wdGlvbnNcbk91dGxheWVyLmRlZmF1bHRzID0ge1xuICBjb250YWluZXJTdHlsZToge1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gIH0sXG4gIGluaXRMYXlvdXQ6IHRydWUsXG4gIG9yaWdpbkxlZnQ6IHRydWUsXG4gIG9yaWdpblRvcDogdHJ1ZSxcbiAgcmVzaXplOiB0cnVlLFxuICByZXNpemVDb250YWluZXI6IHRydWUsXG4gIC8vIGl0ZW0gb3B0aW9uc1xuICB0cmFuc2l0aW9uRHVyYXRpb246ICcwLjRzJyxcbiAgaGlkZGVuU3R5bGU6IHtcbiAgICBvcGFjaXR5OiAwLFxuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuMDAxKSdcbiAgfSxcbiAgdmlzaWJsZVN0eWxlOiB7XG4gICAgb3BhY2l0eTogMSxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgfVxufTtcblxudmFyIHByb3RvID0gT3V0bGF5ZXIucHJvdG90eXBlO1xuLy8gaW5oZXJpdCBFdkVtaXR0ZXJcbnV0aWxzLmV4dGVuZCggcHJvdG8sIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxuLyoqXG4gKiBzZXQgb3B0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqL1xucHJvdG8ub3B0aW9uID0gZnVuY3Rpb24oIG9wdHMgKSB7XG4gIHV0aWxzLmV4dGVuZCggdGhpcy5vcHRpb25zLCBvcHRzICk7XG59O1xuXG4vKipcbiAqIGdldCBiYWNrd2FyZHMgY29tcGF0aWJsZSBvcHRpb24gdmFsdWUsIGNoZWNrIG9sZCBuYW1lXG4gKi9cbnByb3RvLl9nZXRPcHRpb24gPSBmdW5jdGlvbiggb3B0aW9uICkge1xuICB2YXIgb2xkT3B0aW9uID0gdGhpcy5jb25zdHJ1Y3Rvci5jb21wYXRPcHRpb25zWyBvcHRpb24gXTtcbiAgcmV0dXJuIG9sZE9wdGlvbiAmJiB0aGlzLm9wdGlvbnNbIG9sZE9wdGlvbiBdICE9PSB1bmRlZmluZWQgP1xuICAgIHRoaXMub3B0aW9uc1sgb2xkT3B0aW9uIF0gOiB0aGlzLm9wdGlvbnNbIG9wdGlvbiBdO1xufTtcblxuT3V0bGF5ZXIuY29tcGF0T3B0aW9ucyA9IHtcbiAgLy8gY3VycmVudE5hbWU6IG9sZE5hbWVcbiAgaW5pdExheW91dDogJ2lzSW5pdExheW91dCcsXG4gIGhvcml6b250YWw6ICdpc0hvcml6b250YWwnLFxuICBsYXlvdXRJbnN0YW50OiAnaXNMYXlvdXRJbnN0YW50JyxcbiAgb3JpZ2luTGVmdDogJ2lzT3JpZ2luTGVmdCcsXG4gIG9yaWdpblRvcDogJ2lzT3JpZ2luVG9wJyxcbiAgcmVzaXplOiAnaXNSZXNpemVCb3VuZCcsXG4gIHJlc2l6ZUNvbnRhaW5lcjogJ2lzUmVzaXppbmdDb250YWluZXInXG59O1xuXG5wcm90by5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGdldCBpdGVtcyBmcm9tIGNoaWxkcmVuXG4gIHRoaXMucmVsb2FkSXRlbXMoKTtcbiAgLy8gZWxlbWVudHMgdGhhdCBhZmZlY3QgbGF5b3V0LCBidXQgYXJlIG5vdCBsYWlkIG91dFxuICB0aGlzLnN0YW1wcyA9IFtdO1xuICB0aGlzLnN0YW1wKCB0aGlzLm9wdGlvbnMuc3RhbXAgKTtcbiAgLy8gc2V0IGNvbnRhaW5lciBzdHlsZVxuICB1dGlscy5leHRlbmQoIHRoaXMuZWxlbWVudC5zdHlsZSwgdGhpcy5vcHRpb25zLmNvbnRhaW5lclN0eWxlICk7XG5cbiAgLy8gYmluZCByZXNpemUgbWV0aG9kXG4gIHZhciBjYW5CaW5kUmVzaXplID0gdGhpcy5fZ2V0T3B0aW9uKCdyZXNpemUnKTtcbiAgaWYgKCBjYW5CaW5kUmVzaXplICkge1xuICAgIHRoaXMuYmluZFJlc2l6ZSgpO1xuICB9XG59O1xuXG4vLyBnb2VzIHRocm91Z2ggYWxsIGNoaWxkcmVuIGFnYWluIGFuZCBnZXRzIGJyaWNrcyBpbiBwcm9wZXIgb3JkZXJcbnByb3RvLnJlbG9hZEl0ZW1zID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICB0aGlzLml0ZW1zID0gdGhpcy5faXRlbWl6ZSggdGhpcy5lbGVtZW50LmNoaWxkcmVuICk7XG59O1xuXG5cbi8qKlxuICogdHVybiBlbGVtZW50cyBpbnRvIE91dGxheWVyLkl0ZW1zIHRvIGJlIHVzZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEhUTUxFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGNvbGxlY3Rpb24gb2YgbmV3IE91dGxheWVyIEl0ZW1zXG4gKi9cbnByb3RvLl9pdGVtaXplID0gZnVuY3Rpb24oIGVsZW1zICkge1xuXG4gIHZhciBpdGVtRWxlbXMgPSB0aGlzLl9maWx0ZXJGaW5kSXRlbUVsZW1lbnRzKCBlbGVtcyApO1xuICB2YXIgSXRlbSA9IHRoaXMuY29uc3RydWN0b3IuSXRlbTtcblxuICAvLyBjcmVhdGUgbmV3IE91dGxheWVyIEl0ZW1zIGZvciBjb2xsZWN0aW9uXG4gIHZhciBpdGVtcyA9IFtdO1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgaXRlbUVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBlbGVtID0gaXRlbUVsZW1zW2ldO1xuICAgIHZhciBpdGVtID0gbmV3IEl0ZW0oIGVsZW0sIHRoaXMgKTtcbiAgICBpdGVtcy5wdXNoKCBpdGVtICk7XG4gIH1cblxuICByZXR1cm4gaXRlbXM7XG59O1xuXG4vKipcbiAqIGdldCBpdGVtIGVsZW1lbnRzIHRvIGJlIHVzZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEhUTUxFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGl0ZW0gZWxlbWVudHNcbiAqL1xucHJvdG8uX2ZpbHRlckZpbmRJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHJldHVybiB1dGlscy5maWx0ZXJGaW5kRWxlbWVudHMoIGVsZW1zLCB0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yICk7XG59O1xuXG4vKipcbiAqIGdldHRlciBtZXRob2QgZm9yIGdldHRpbmcgaXRlbSBlbGVtZW50c1xuICogQHJldHVybnMge0FycmF5fSBlbGVtcyAtIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICovXG5wcm90by5nZXRJdGVtRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuaXRlbXMubWFwKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICByZXR1cm4gaXRlbS5lbGVtZW50O1xuICB9KTtcbn07XG5cbi8vIC0tLS0tIGluaXQgJiBsYXlvdXQgLS0tLS0gLy9cblxuLyoqXG4gKiBsYXlzIG91dCBhbGwgaXRlbXNcbiAqL1xucHJvdG8ubGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3Jlc2V0TGF5b3V0KCk7XG4gIHRoaXMuX21hbmFnZVN0YW1wcygpO1xuXG4gIC8vIGRvbid0IGFuaW1hdGUgZmlyc3QgbGF5b3V0XG4gIHZhciBsYXlvdXRJbnN0YW50ID0gdGhpcy5fZ2V0T3B0aW9uKCdsYXlvdXRJbnN0YW50Jyk7XG4gIHZhciBpc0luc3RhbnQgPSBsYXlvdXRJbnN0YW50ICE9PSB1bmRlZmluZWQgP1xuICAgIGxheW91dEluc3RhbnQgOiAhdGhpcy5faXNMYXlvdXRJbml0ZWQ7XG4gIHRoaXMubGF5b3V0SXRlbXMoIHRoaXMuaXRlbXMsIGlzSW5zdGFudCApO1xuXG4gIC8vIGZsYWcgZm9yIGluaXRhbGl6ZWRcbiAgdGhpcy5faXNMYXlvdXRJbml0ZWQgPSB0cnVlO1xufTtcblxuLy8gX2luaXQgaXMgYWxpYXMgZm9yIGxheW91dFxucHJvdG8uX2luaXQgPSBwcm90by5sYXlvdXQ7XG5cbi8qKlxuICogbG9naWMgYmVmb3JlIGFueSBuZXcgbGF5b3V0XG4gKi9cbnByb3RvLl9yZXNldExheW91dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmdldFNpemUoKTtcbn07XG5cblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbi8qKlxuICogZ2V0IG1lYXN1cmVtZW50IGZyb20gb3B0aW9uLCBmb3IgY29sdW1uV2lkdGgsIHJvd0hlaWdodCwgZ3V0dGVyXG4gKiBpZiBvcHRpb24gaXMgU3RyaW5nIC0+IGdldCBlbGVtZW50IGZyb20gc2VsZWN0b3Igc3RyaW5nLCAmIGdldCBzaXplIG9mIGVsZW1lbnRcbiAqIGlmIG9wdGlvbiBpcyBFbGVtZW50IC0+IGdldCBzaXplIG9mIGVsZW1lbnRcbiAqIGVsc2UgdXNlIG9wdGlvbiBhcyBhIG51bWJlclxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZWFzdXJlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNpemUgLSB3aWR0aCBvciBoZWlnaHRcbiAqIEBwcml2YXRlXG4gKi9cbnByb3RvLl9nZXRNZWFzdXJlbWVudCA9IGZ1bmN0aW9uKCBtZWFzdXJlbWVudCwgc2l6ZSApIHtcbiAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1sgbWVhc3VyZW1lbnQgXTtcbiAgdmFyIGVsZW07XG4gIGlmICggIW9wdGlvbiApIHtcbiAgICAvLyBkZWZhdWx0IHRvIDBcbiAgICB0aGlzWyBtZWFzdXJlbWVudCBdID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyB1c2Ugb3B0aW9uIGFzIGFuIGVsZW1lbnRcbiAgICBpZiAoIHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycgKSB7XG4gICAgICBlbGVtID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIG9wdGlvbiApO1xuICAgIH0gZWxzZSBpZiAoIG9wdGlvbiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICkge1xuICAgICAgZWxlbSA9IG9wdGlvbjtcbiAgICB9XG4gICAgLy8gdXNlIHNpemUgb2YgZWxlbWVudCwgaWYgZWxlbWVudFxuICAgIHRoaXNbIG1lYXN1cmVtZW50IF0gPSBlbGVtID8gZ2V0U2l6ZSggZWxlbSApWyBzaXplIF0gOiBvcHRpb247XG4gIH1cbn07XG5cbi8qKlxuICogbGF5b3V0IGEgY29sbGVjdGlvbiBvZiBpdGVtIGVsZW1lbnRzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5wcm90by5sYXlvdXRJdGVtcyA9IGZ1bmN0aW9uKCBpdGVtcywgaXNJbnN0YW50ICkge1xuICBpdGVtcyA9IHRoaXMuX2dldEl0ZW1zRm9yTGF5b3V0KCBpdGVtcyApO1xuXG4gIHRoaXMuX2xheW91dEl0ZW1zKCBpdGVtcywgaXNJbnN0YW50ICk7XG5cbiAgdGhpcy5fcG9zdExheW91dCgpO1xufTtcblxuLyoqXG4gKiBnZXQgdGhlIGl0ZW1zIHRvIGJlIGxhaWQgb3V0XG4gKiB5b3UgbWF5IHdhbnQgdG8gc2tpcCBvdmVyIHNvbWUgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXl9IGl0ZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zXG4gKi9cbnByb3RvLl9nZXRJdGVtc0ZvckxheW91dCA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgcmV0dXJuIGl0ZW1zLmZpbHRlciggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgcmV0dXJuICFpdGVtLmlzSWdub3JlZDtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGxheW91dCBpdGVtc1xuICogQHBhcmFtIHtBcnJheX0gaXRlbXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50XG4gKi9cbnByb3RvLl9sYXlvdXRJdGVtcyA9IGZ1bmN0aW9uKCBpdGVtcywgaXNJbnN0YW50ICkge1xuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAnbGF5b3V0JywgaXRlbXMgKTtcblxuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkge1xuICAgIC8vIG5vIGl0ZW1zLCBlbWl0IGV2ZW50IHdpdGggZW1wdHkgYXJyYXlcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcXVldWUgPSBbXTtcblxuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICAvLyBnZXQgeC95IG9iamVjdCBmcm9tIG1ldGhvZFxuICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuX2dldEl0ZW1MYXlvdXRQb3NpdGlvbiggaXRlbSApO1xuICAgIC8vIGVucXVldWVcbiAgICBwb3NpdGlvbi5pdGVtID0gaXRlbTtcbiAgICBwb3NpdGlvbi5pc0luc3RhbnQgPSBpc0luc3RhbnQgfHwgaXRlbS5pc0xheW91dEluc3RhbnQ7XG4gICAgcXVldWUucHVzaCggcG9zaXRpb24gKTtcbiAgfSwgdGhpcyApO1xuXG4gIHRoaXMuX3Byb2Nlc3NMYXlvdXRRdWV1ZSggcXVldWUgKTtcbn07XG5cbi8qKlxuICogZ2V0IGl0ZW0gbGF5b3V0IHBvc2l0aW9uXG4gKiBAcGFyYW0ge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqIEByZXR1cm5zIHtPYmplY3R9IHggYW5kIHkgcG9zaXRpb25cbiAqL1xucHJvdG8uX2dldEl0ZW1MYXlvdXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCAvKiBpdGVtICovICkge1xuICByZXR1cm4ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuLyoqXG4gKiBpdGVyYXRlIG92ZXIgYXJyYXkgYW5kIHBvc2l0aW9uIGVhY2ggaXRlbVxuICogUmVhc29uIGJlaW5nIC0gc2VwYXJhdGluZyB0aGlzIGxvZ2ljIHByZXZlbnRzICdsYXlvdXQgaW52YWxpZGF0aW9uJ1xuICogdGh4IEBwYXVsX2lyaXNoXG4gKiBAcGFyYW0ge0FycmF5fSBxdWV1ZVxuICovXG5wcm90by5fcHJvY2Vzc0xheW91dFF1ZXVlID0gZnVuY3Rpb24oIHF1ZXVlICkge1xuICB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgcXVldWUuZm9yRWFjaCggZnVuY3Rpb24oIG9iaiwgaSApIHtcbiAgICB0aGlzLl9wb3NpdGlvbkl0ZW0oIG9iai5pdGVtLCBvYmoueCwgb2JqLnksIG9iai5pc0luc3RhbnQsIGkgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuLy8gc2V0IHN0YWdnZXIgZnJvbSBvcHRpb24gaW4gbWlsbGlzZWNvbmRzIG51bWJlclxucHJvdG8udXBkYXRlU3RhZ2dlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhZ2dlciA9IHRoaXMub3B0aW9ucy5zdGFnZ2VyO1xuICBpZiAoIHN0YWdnZXIgPT09IG51bGwgfHwgc3RhZ2dlciA9PT0gdW5kZWZpbmVkICkge1xuICAgIHRoaXMuc3RhZ2dlciA9IDA7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc3RhZ2dlciA9IGdldE1pbGxpc2Vjb25kcyggc3RhZ2dlciApO1xuICByZXR1cm4gdGhpcy5zdGFnZ2VyO1xufTtcblxuLyoqXG4gKiBTZXRzIHBvc2l0aW9uIG9mIGl0ZW0gaW4gRE9NXG4gKiBAcGFyYW0ge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gaG9yaXpvbnRhbCBwb3NpdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHkgLSB2ZXJ0aWNhbCBwb3NpdGlvblxuICogQHBhcmFtIHtCb29sZWFufSBpc0luc3RhbnQgLSBkaXNhYmxlcyB0cmFuc2l0aW9uc1xuICovXG5wcm90by5fcG9zaXRpb25JdGVtID0gZnVuY3Rpb24oIGl0ZW0sIHgsIHksIGlzSW5zdGFudCwgaSApIHtcbiAgaWYgKCBpc0luc3RhbnQgKSB7XG4gICAgLy8gaWYgbm90IHRyYW5zaXRpb24sIGp1c3Qgc2V0IENTU1xuICAgIGl0ZW0uZ29UbyggeCwgeSApO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0uc3RhZ2dlciggaSAqIHRoaXMuc3RhZ2dlciApO1xuICAgIGl0ZW0ubW92ZVRvKCB4LCB5ICk7XG4gIH1cbn07XG5cbi8qKlxuICogQW55IGxvZ2ljIHlvdSB3YW50IHRvIGRvIGFmdGVyIGVhY2ggbGF5b3V0LFxuICogaS5lLiBzaXplIHRoZSBjb250YWluZXJcbiAqL1xucHJvdG8uX3Bvc3RMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZXNpemVDb250YWluZXIoKTtcbn07XG5cbnByb3RvLnJlc2l6ZUNvbnRhaW5lciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXNSZXNpemluZ0NvbnRhaW5lciA9IHRoaXMuX2dldE9wdGlvbigncmVzaXplQ29udGFpbmVyJyk7XG4gIGlmICggIWlzUmVzaXppbmdDb250YWluZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzaXplID0gdGhpcy5fZ2V0Q29udGFpbmVyU2l6ZSgpO1xuICBpZiAoIHNpemUgKSB7XG4gICAgdGhpcy5fc2V0Q29udGFpbmVyTWVhc3VyZSggc2l6ZS53aWR0aCwgdHJ1ZSApO1xuICAgIHRoaXMuX3NldENvbnRhaW5lck1lYXN1cmUoIHNpemUuaGVpZ2h0LCBmYWxzZSApO1xuICB9XG59O1xuXG4vKipcbiAqIFNldHMgd2lkdGggb3IgaGVpZ2h0IG9mIGNvbnRhaW5lciBpZiByZXR1cm5lZFxuICogQHJldHVybnMge09iamVjdH0gc2l6ZVxuICogICBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqICAgQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICovXG5wcm90by5fZ2V0Q29udGFpbmVyU2l6ZSA9IG5vb3A7XG5cbi8qKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1lYXN1cmUgLSBzaXplIG9mIHdpZHRoIG9yIGhlaWdodFxuICogQHBhcmFtIHtCb29sZWFufSBpc1dpZHRoXG4gKi9cbnByb3RvLl9zZXRDb250YWluZXJNZWFzdXJlID0gZnVuY3Rpb24oIG1lYXN1cmUsIGlzV2lkdGggKSB7XG4gIGlmICggbWVhc3VyZSA9PT0gdW5kZWZpbmVkICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBlbGVtU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgLy8gYWRkIHBhZGRpbmcgYW5kIGJvcmRlciB3aWR0aCBpZiBib3JkZXIgYm94XG4gIGlmICggZWxlbVNpemUuaXNCb3JkZXJCb3ggKSB7XG4gICAgbWVhc3VyZSArPSBpc1dpZHRoID8gZWxlbVNpemUucGFkZGluZ0xlZnQgKyBlbGVtU2l6ZS5wYWRkaW5nUmlnaHQgK1xuICAgICAgZWxlbVNpemUuYm9yZGVyTGVmdFdpZHRoICsgZWxlbVNpemUuYm9yZGVyUmlnaHRXaWR0aCA6XG4gICAgICBlbGVtU2l6ZS5wYWRkaW5nQm90dG9tICsgZWxlbVNpemUucGFkZGluZ1RvcCArXG4gICAgICBlbGVtU2l6ZS5ib3JkZXJUb3BXaWR0aCArIGVsZW1TaXplLmJvcmRlckJvdHRvbVdpZHRoO1xuICB9XG5cbiAgbWVhc3VyZSA9IE1hdGgubWF4KCBtZWFzdXJlLCAwICk7XG4gIHRoaXMuZWxlbWVudC5zdHlsZVsgaXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0JyBdID0gbWVhc3VyZSArICdweCc7XG59O1xuXG4vKipcbiAqIGVtaXQgZXZlbnRDb21wbGV0ZSBvbiBhIGNvbGxlY3Rpb24gb2YgaXRlbXMgZXZlbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4gKi9cbnByb3RvLl9lbWl0Q29tcGxldGVPbkl0ZW1zID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgaXRlbXMgKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIGZ1bmN0aW9uIG9uQ29tcGxldGUoKSB7XG4gICAgX3RoaXMuZGlzcGF0Y2hFdmVudCggZXZlbnROYW1lICsgJ0NvbXBsZXRlJywgbnVsbCwgWyBpdGVtcyBdICk7XG4gIH1cblxuICB2YXIgY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gIGlmICggIWl0ZW1zIHx8ICFjb3VudCApIHtcbiAgICBvbkNvbXBsZXRlKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRvbmVDb3VudCA9IDA7XG4gIGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgZG9uZUNvdW50Kys7XG4gICAgaWYgKCBkb25lQ291bnQgPT0gY291bnQgKSB7XG4gICAgICBvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYmluZCBjYWxsYmFja1xuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICBpdGVtLm9uY2UoIGV2ZW50TmFtZSwgdGljayApO1xuICB9KTtcbn07XG5cbi8qKlxuICogZW1pdHMgZXZlbnRzIHZpYSBFdkVtaXR0ZXIgYW5kIGpRdWVyeSBldmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gbmFtZSBvZiBldmVudFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBvcmlnaW5hbCBldmVudFxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIGV4dHJhIGFyZ3VtZW50c1xuICovXG5wcm90by5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oIHR5cGUsIGV2ZW50LCBhcmdzICkge1xuICAvLyBhZGQgb3JpZ2luYWwgZXZlbnQgdG8gYXJndW1lbnRzXG4gIHZhciBlbWl0QXJncyA9IGV2ZW50ID8gWyBldmVudCBdLmNvbmNhdCggYXJncyApIDogYXJncztcbiAgdGhpcy5lbWl0RXZlbnQoIHR5cGUsIGVtaXRBcmdzICk7XG5cbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgLy8gc2V0IHRoaXMuJGVsZW1lbnRcbiAgICB0aGlzLiRlbGVtZW50ID0gdGhpcy4kZWxlbWVudCB8fCBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICAgIGlmICggZXZlbnQgKSB7XG4gICAgICAvLyBjcmVhdGUgalF1ZXJ5IGV2ZW50XG4gICAgICB2YXIgJGV2ZW50ID0galF1ZXJ5LkV2ZW50KCBldmVudCApO1xuICAgICAgJGV2ZW50LnR5cGUgPSB0eXBlO1xuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCAkZXZlbnQsIGFyZ3MgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCB0cmlnZ2VyIHdpdGggdHlwZSBpZiBubyBldmVudCBhdmFpbGFibGVcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggdHlwZSwgYXJncyApO1xuICAgIH1cbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaWdub3JlICYgc3RhbXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cblxuLyoqXG4gKiBrZWVwIGl0ZW0gaW4gY29sbGVjdGlvbiwgYnV0IGRvIG5vdCBsYXkgaXQgb3V0XG4gKiBpZ25vcmVkIGl0ZW1zIGRvIG5vdCBnZXQgc2tpcHBlZCBpbiBsYXlvdXRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICovXG5wcm90by5pZ25vcmUgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0oIGVsZW0gKTtcbiAgaWYgKCBpdGVtICkge1xuICAgIGl0ZW0uaXNJZ25vcmVkID0gdHJ1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiByZXR1cm4gaXRlbSB0byBsYXlvdXQgY29sbGVjdGlvblxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKi9cbnByb3RvLnVuaWdub3JlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gIGlmICggaXRlbSApIHtcbiAgICBkZWxldGUgaXRlbS5pc0lnbm9yZWQ7XG4gIH1cbn07XG5cbi8qKlxuICogYWRkcyBlbGVtZW50cyB0byBzdGFtcHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBFbGVtZW50LCBvciBTdHJpbmd9IGVsZW1zXG4gKi9cbnByb3RvLnN0YW1wID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHRoaXMuX2ZpbmQoIGVsZW1zICk7XG4gIGlmICggIWVsZW1zICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuc3RhbXBzID0gdGhpcy5zdGFtcHMuY29uY2F0KCBlbGVtcyApO1xuICAvLyBpZ25vcmVcbiAgZWxlbXMuZm9yRWFjaCggdGhpcy5pZ25vcmUsIHRoaXMgKTtcbn07XG5cbi8qKlxuICogcmVtb3ZlcyBlbGVtZW50cyB0byBzdGFtcHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by51bnN0YW1wID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHRoaXMuX2ZpbmQoIGVsZW1zICk7XG4gIGlmICggIWVsZW1zICl7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gZmlsdGVyIG91dCByZW1vdmVkIHN0YW1wIGVsZW1lbnRzXG4gICAgdXRpbHMucmVtb3ZlRnJvbSggdGhpcy5zdGFtcHMsIGVsZW0gKTtcbiAgICB0aGlzLnVuaWdub3JlKCBlbGVtICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8qKlxuICogZmluZHMgY2hpbGQgZWxlbWVudHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBFbGVtZW50LCBvciBTdHJpbmd9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGVsZW1zXG4gKi9cbnByb3RvLl9maW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBpZiAoICFlbGVtcyApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gaWYgc3RyaW5nLCB1c2UgYXJndW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG4gIGlmICggdHlwZW9mIGVsZW1zID09ICdzdHJpbmcnICkge1xuICAgIGVsZW1zID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGVsZW1zICk7XG4gIH1cbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHJldHVybiBlbGVtcztcbn07XG5cbnByb3RvLl9tYW5hZ2VTdGFtcHMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5zdGFtcHMgfHwgIXRoaXMuc3RhbXBzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl9nZXRCb3VuZGluZ1JlY3QoKTtcblxuICB0aGlzLnN0YW1wcy5mb3JFYWNoKCB0aGlzLl9tYW5hZ2VTdGFtcCwgdGhpcyApO1xufTtcblxuLy8gdXBkYXRlIGJvdW5kaW5nTGVmdCAvIFRvcFxucHJvdG8uX2dldEJvdW5kaW5nUmVjdCA9IGZ1bmN0aW9uKCkge1xuICAvLyBnZXQgYm91bmRpbmcgcmVjdCBmb3IgY29udGFpbmVyIGVsZW1lbnRcbiAgdmFyIGJvdW5kaW5nUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gIHRoaXMuX2JvdW5kaW5nUmVjdCA9IHtcbiAgICBsZWZ0OiBib3VuZGluZ1JlY3QubGVmdCArIHNpemUucGFkZGluZ0xlZnQgKyBzaXplLmJvcmRlckxlZnRXaWR0aCxcbiAgICB0b3A6IGJvdW5kaW5nUmVjdC50b3AgKyBzaXplLnBhZGRpbmdUb3AgKyBzaXplLmJvcmRlclRvcFdpZHRoLFxuICAgIHJpZ2h0OiBib3VuZGluZ1JlY3QucmlnaHQgLSAoIHNpemUucGFkZGluZ1JpZ2h0ICsgc2l6ZS5ib3JkZXJSaWdodFdpZHRoICksXG4gICAgYm90dG9tOiBib3VuZGluZ1JlY3QuYm90dG9tIC0gKCBzaXplLnBhZGRpbmdCb3R0b20gKyBzaXplLmJvcmRlckJvdHRvbVdpZHRoIClcbiAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBzdGFtcFxuKiovXG5wcm90by5fbWFuYWdlU3RhbXAgPSBub29wO1xuXG4vKipcbiAqIGdldCB4L3kgcG9zaXRpb24gb2YgZWxlbWVudCByZWxhdGl2ZSB0byBjb250YWluZXIgZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBvZmZzZXQgLSBoYXMgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tXG4gKi9cbnByb3RvLl9nZXRFbGVtZW50T2Zmc2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBib3VuZGluZ1JlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgdGhpc1JlY3QgPSB0aGlzLl9ib3VuZGluZ1JlY3Q7XG4gIHZhciBzaXplID0gZ2V0U2l6ZSggZWxlbSApO1xuICB2YXIgb2Zmc2V0ID0ge1xuICAgIGxlZnQ6IGJvdW5kaW5nUmVjdC5sZWZ0IC0gdGhpc1JlY3QubGVmdCAtIHNpemUubWFyZ2luTGVmdCxcbiAgICB0b3A6IGJvdW5kaW5nUmVjdC50b3AgLSB0aGlzUmVjdC50b3AgLSBzaXplLm1hcmdpblRvcCxcbiAgICByaWdodDogdGhpc1JlY3QucmlnaHQgLSBib3VuZGluZ1JlY3QucmlnaHQgLSBzaXplLm1hcmdpblJpZ2h0LFxuICAgIGJvdHRvbTogdGhpc1JlY3QuYm90dG9tIC0gYm91bmRpbmdSZWN0LmJvdHRvbSAtIHNpemUubWFyZ2luQm90dG9tXG4gIH07XG4gIHJldHVybiBvZmZzZXQ7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZW5hYmxlIGV2ZW50IGhhbmRsZXJzIGZvciBsaXN0ZW5lcnNcbi8vIGkuZS4gcmVzaXplIC0+IG9ucmVzaXplXG5wcm90by5oYW5kbGVFdmVudCA9IHV0aWxzLmhhbmRsZUV2ZW50O1xuXG4vKipcbiAqIEJpbmQgbGF5b3V0IHRvIHdpbmRvdyByZXNpemluZ1xuICovXG5wcm90by5iaW5kUmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB0aGlzLmlzUmVzaXplQm91bmQgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBVbmJpbmQgbGF5b3V0IHRvIHdpbmRvdyByZXNpemluZ1xuICovXG5wcm90by51bmJpbmRSZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB0aGlzICk7XG4gIHRoaXMuaXNSZXNpemVCb3VuZCA9IGZhbHNlO1xufTtcblxucHJvdG8ub25yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZXNpemUoKTtcbn07XG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kKCBPdXRsYXllciwgJ29ucmVzaXplJywgMTAwICk7XG5cbnByb3RvLnJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBkb24ndCB0cmlnZ2VyIGlmIHNpemUgZGlkIG5vdCBjaGFuZ2VcbiAgLy8gb3IgaWYgcmVzaXplIHdhcyB1bmJvdW5kLiBTZWUgIzlcbiAgaWYgKCAhdGhpcy5pc1Jlc2l6ZUJvdW5kIHx8ICF0aGlzLm5lZWRzUmVzaXplTGF5b3V0KCkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5sYXlvdXQoKTtcbn07XG5cbi8qKlxuICogY2hlY2sgaWYgbGF5b3V0IGlzIG5lZWRlZCBwb3N0IGxheW91dFxuICogQHJldHVybnMgQm9vbGVhblxuICovXG5wcm90by5uZWVkc1Jlc2l6ZUxheW91dCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xuICAvLyBjaGVjayB0aGF0IHRoaXMuc2l6ZSBhbmQgc2l6ZSBhcmUgdGhlcmVcbiAgLy8gSUU4IHRyaWdnZXJzIHJlc2l6ZSBvbiBib2R5IHNpemUgY2hhbmdlLCBzbyB0aGV5IG1pZ2h0IG5vdCBiZVxuICB2YXIgaGFzU2l6ZXMgPSB0aGlzLnNpemUgJiYgc2l6ZTtcbiAgcmV0dXJuIGhhc1NpemVzICYmIHNpemUuaW5uZXJXaWR0aCAhPT0gdGhpcy5zaXplLmlubmVyV2lkdGg7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogYWRkIGl0ZW1zIHRvIE91dGxheWVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gT3V0bGF5ZXIuSXRlbXNcbioqL1xucHJvdG8uYWRkSXRlbXMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1pemUoIGVsZW1zICk7XG4gIC8vIGFkZCBpdGVtcyB0byBjb2xsZWN0aW9uXG4gIGlmICggaXRlbXMubGVuZ3RoICkge1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmNvbmNhdCggaXRlbXMgKTtcbiAgfVxuICByZXR1cm4gaXRlbXM7XG59O1xuXG4vKipcbiAqIExheW91dCBuZXdseS1hcHBlbmRlZCBpdGVtIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKi9cbnByb3RvLmFwcGVuZGVkID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLmFkZEl0ZW1zKCBlbGVtcyApO1xuICBpZiAoICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGxheW91dCBhbmQgcmV2ZWFsIGp1c3QgdGhlIG5ldyBpdGVtc1xuICB0aGlzLmxheW91dEl0ZW1zKCBpdGVtcywgdHJ1ZSApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogTGF5b3V0IHByZXBlbmRlZCBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by5wcmVwZW5kZWQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1pemUoIGVsZW1zICk7XG4gIGlmICggIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYWRkIGl0ZW1zIHRvIGJlZ2lubmluZyBvZiBjb2xsZWN0aW9uXG4gIHZhciBwcmV2aW91c0l0ZW1zID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcbiAgdGhpcy5pdGVtcyA9IGl0ZW1zLmNvbmNhdCggcHJldmlvdXNJdGVtcyApO1xuICAvLyBzdGFydCBuZXcgbGF5b3V0XG4gIHRoaXMuX3Jlc2V0TGF5b3V0KCk7XG4gIHRoaXMuX21hbmFnZVN0YW1wcygpO1xuICAvLyBsYXlvdXQgbmV3IHN0dWZmIHdpdGhvdXQgdHJhbnNpdGlvblxuICB0aGlzLmxheW91dEl0ZW1zKCBpdGVtcywgdHJ1ZSApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbiAgLy8gbGF5b3V0IHByZXZpb3VzIGl0ZW1zXG4gIHRoaXMubGF5b3V0SXRlbXMoIHByZXZpb3VzSXRlbXMgKTtcbn07XG5cbi8qKlxuICogcmV2ZWFsIGEgY29sbGVjdGlvbiBvZiBpdGVtc1xuICogQHBhcmFtIHtBcnJheSBvZiBPdXRsYXllci5JdGVtc30gaXRlbXNcbiAqL1xucHJvdG8ucmV2ZWFsID0gZnVuY3Rpb24oIGl0ZW1zICkge1xuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAncmV2ZWFsJywgaXRlbXMgKTtcbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHN0YWdnZXIgPSB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0sIGkgKSB7XG4gICAgaXRlbS5zdGFnZ2VyKCBpICogc3RhZ2dlciApO1xuICAgIGl0ZW0ucmV2ZWFsKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBoaWRlIGEgY29sbGVjdGlvbiBvZiBpdGVtc1xuICogQHBhcmFtIHtBcnJheSBvZiBPdXRsYXllci5JdGVtc30gaXRlbXNcbiAqL1xucHJvdG8uaGlkZSA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ2hpZGUnLCBpdGVtcyApO1xuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc3RhZ2dlciA9IHRoaXMudXBkYXRlU3RhZ2dlcigpO1xuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSwgaSApIHtcbiAgICBpdGVtLnN0YWdnZXIoIGkgKiBzdGFnZ2VyICk7XG4gICAgaXRlbS5oaWRlKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiByZXZlYWwgaXRlbSBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheX0sIHtFbGVtZW50fSwge05vZGVMaXN0fSBpdGVtc1xuICovXG5wcm90by5yZXZlYWxJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoIGVsZW1zICk7XG4gIHRoaXMucmV2ZWFsKCBpdGVtcyApO1xufTtcblxuLyoqXG4gKiBoaWRlIGl0ZW0gZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9LCB7RWxlbWVudH0sIHtOb2RlTGlzdH0gaXRlbXNcbiAqL1xucHJvdG8uaGlkZUl0ZW1FbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5nZXRJdGVtcyggZWxlbXMgKTtcbiAgdGhpcy5oaWRlKCBpdGVtcyApO1xufTtcblxuLyoqXG4gKiBnZXQgT3V0bGF5ZXIuSXRlbSwgZ2l2ZW4gYW4gRWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqL1xucHJvdG8uZ2V0SXRlbSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAvLyBsb29wIHRocm91Z2ggaXRlbXMgdG8gZ2V0IHRoZSBvbmUgdGhhdCBtYXRjaGVzXG4gIGZvciAoIHZhciBpPTA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICBpZiAoIGl0ZW0uZWxlbWVudCA9PSBlbGVtICkge1xuICAgICAgLy8gcmV0dXJuIGl0ZW1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBnZXQgY29sbGVjdGlvbiBvZiBPdXRsYXllci5JdGVtcywgZ2l2ZW4gRWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gT3V0bGF5ZXIuSXRlbXNcbiAqL1xucHJvdG8uZ2V0SXRlbXMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICB2YXIgaXRlbXMgPSBbXTtcbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0oIGVsZW0gKTtcbiAgICBpZiAoIGl0ZW0gKSB7XG4gICAgICBpdGVtcy5wdXNoKCBpdGVtICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG5cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiByZW1vdmUgZWxlbWVudChzKSBmcm9tIGluc3RhbmNlIGFuZCBET01cbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgcmVtb3ZlSXRlbXMgPSB0aGlzLmdldEl0ZW1zKCBlbGVtcyApO1xuXG4gIHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoICdyZW1vdmUnLCByZW1vdmVJdGVtcyApO1xuXG4gIC8vIGJhaWwgaWYgbm8gaXRlbXMgdG8gcmVtb3ZlXG4gIGlmICggIXJlbW92ZUl0ZW1zIHx8ICFyZW1vdmVJdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVtb3ZlSXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5yZW1vdmUoKTtcbiAgICAvLyByZW1vdmUgaXRlbSBmcm9tIGNvbGxlY3Rpb25cbiAgICB1dGlscy5yZW1vdmVGcm9tKCB0aGlzLml0ZW1zLCBpdGVtICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8vIC0tLS0tIGRlc3Ryb3kgLS0tLS0gLy9cblxuLy8gcmVtb3ZlIGFuZCBkaXNhYmxlIE91dGxheWVyIGluc3RhbmNlXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNsZWFuIHVwIGR5bmFtaWMgc3R5bGVzXG4gIHZhciBzdHlsZSA9IHRoaXMuZWxlbWVudC5zdHlsZTtcbiAgc3R5bGUuaGVpZ2h0ID0gJyc7XG4gIHN0eWxlLnBvc2l0aW9uID0gJyc7XG4gIHN0eWxlLndpZHRoID0gJyc7XG4gIC8vIGRlc3Ryb3kgaXRlbXNcbiAgdGhpcy5pdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICBpdGVtLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgdGhpcy51bmJpbmRSZXNpemUoKTtcblxuICB2YXIgaWQgPSB0aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlEO1xuICBkZWxldGUgaW5zdGFuY2VzWyBpZCBdOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIGluc3RhbmNlIGJ5IGlkXG4gIGRlbGV0ZSB0aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlEO1xuICAvLyByZW1vdmUgZGF0YSBmb3IgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIGpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLmVsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IubmFtZXNwYWNlICk7XG4gIH1cblxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGdldCBPdXRsYXllciBpbnN0YW5jZSBmcm9tIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge091dGxheWVyfVxuICovXG5PdXRsYXllci5kYXRhID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIGVsZW0gPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW0gKTtcbiAgdmFyIGlkID0gZWxlbSAmJiBlbGVtLm91dGxheWVyR1VJRDtcbiAgcmV0dXJuIGlkICYmIGluc3RhbmNlc1sgaWQgXTtcbn07XG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3JlYXRlIE91dGxheWVyIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogY3JlYXRlIGEgbGF5b3V0IGNsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKi9cbk91dGxheWVyLmNyZWF0ZSA9IGZ1bmN0aW9uKCBuYW1lc3BhY2UsIG9wdGlvbnMgKSB7XG4gIC8vIHN1Yi1jbGFzcyBPdXRsYXllclxuICB2YXIgTGF5b3V0ID0gc3ViY2xhc3MoIE91dGxheWVyICk7XG4gIC8vIGFwcGx5IG5ldyBvcHRpb25zIGFuZCBjb21wYXRPcHRpb25zXG4gIExheW91dC5kZWZhdWx0cyA9IHV0aWxzLmV4dGVuZCgge30sIE91dGxheWVyLmRlZmF1bHRzICk7XG4gIHV0aWxzLmV4dGVuZCggTGF5b3V0LmRlZmF1bHRzLCBvcHRpb25zICk7XG4gIExheW91dC5jb21wYXRPcHRpb25zID0gdXRpbHMuZXh0ZW5kKCB7fSwgT3V0bGF5ZXIuY29tcGF0T3B0aW9ucyAgKTtcblxuICBMYXlvdXQubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXG4gIExheW91dC5kYXRhID0gT3V0bGF5ZXIuZGF0YTtcblxuICAvLyBzdWItY2xhc3MgSXRlbVxuICBMYXlvdXQuSXRlbSA9IHN1YmNsYXNzKCBJdGVtICk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVjbGFyYXRpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICB1dGlscy5odG1sSW5pdCggTGF5b3V0LCBuYW1lc3BhY2UgKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBqUXVlcnkgYnJpZGdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLy8gbWFrZSBpbnRvIGpRdWVyeSBwbHVnaW5cbiAgaWYgKCBqUXVlcnkgJiYgalF1ZXJ5LmJyaWRnZXQgKSB7XG4gICAgalF1ZXJ5LmJyaWRnZXQoIG5hbWVzcGFjZSwgTGF5b3V0ICk7XG4gIH1cblxuICByZXR1cm4gTGF5b3V0O1xufTtcblxuZnVuY3Rpb24gc3ViY2xhc3MoIFBhcmVudCApIHtcbiAgZnVuY3Rpb24gU3ViQ2xhc3MoKSB7XG4gICAgUGFyZW50LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcbiAgfVxuXG4gIFN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBhcmVudC5wcm90b3R5cGUgKTtcbiAgU3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViQ2xhc3M7XG5cbiAgcmV0dXJuIFN1YkNsYXNzO1xufVxuXG4vLyAtLS0tLSBoZWxwZXJzIC0tLS0tIC8vXG5cbi8vIGhvdyBtYW55IG1pbGxpc2Vjb25kcyBhcmUgaW4gZWFjaCB1bml0XG52YXIgbXNVbml0cyA9IHtcbiAgbXM6IDEsXG4gIHM6IDEwMDBcbn07XG5cbi8vIG11bmdlIHRpbWUtbGlrZSBwYXJhbWV0ZXIgaW50byBtaWxsaXNlY29uZCBudW1iZXJcbi8vICcwLjRzJyAtPiA0MFxuZnVuY3Rpb24gZ2V0TWlsbGlzZWNvbmRzKCB0aW1lICkge1xuICBpZiAoIHR5cGVvZiB0aW1lID09ICdudW1iZXInICkge1xuICAgIHJldHVybiB0aW1lO1xuICB9XG4gIHZhciBtYXRjaGVzID0gdGltZS5tYXRjaCggLyheXFxkKlxcLj9cXGQqKShcXHcqKS8gKTtcbiAgdmFyIG51bSA9IG1hdGNoZXMgJiYgbWF0Y2hlc1sxXTtcbiAgdmFyIHVuaXQgPSBtYXRjaGVzICYmIG1hdGNoZXNbMl07XG4gIGlmICggIW51bS5sZW5ndGggKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbnVtID0gcGFyc2VGbG9hdCggbnVtICk7XG4gIHZhciBtdWx0ID0gbXNVbml0c1sgdW5pdCBdIHx8IDE7XG4gIHJldHVybiBudW0gKiBtdWx0O1xufVxuXG4vLyAtLS0tLSBmaW4gLS0tLS0gLy9cblxuLy8gYmFjayBpbiBnbG9iYWxcbk91dGxheWVyLkl0ZW0gPSBJdGVtO1xuXG5yZXR1cm4gT3V0bGF5ZXI7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFBO0FBQ0EsV0FrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/outlayer/outlayer.js\n");

/***/ }),

/***/ "./node_modules/reframe.js/dist/reframe.es.js":
/*!****************************************************!*\
  !*** ./node_modules/reframe.js/dist/reframe.es.js ***!
  \****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction reframe(target, cName) {\n  var frames = typeof target === 'string' ? document.querySelectorAll(target) : target;\n  var c = cName || 'js-reframe';\n  if (!('length' in frames)) frames = [frames];\n  for (var i = 0; i < frames.length; i += 1) {\n    var frame = frames[i];\n    var hasClass = frame.className.split(' ').indexOf(c) !== -1;\n    if (hasClass || frame.style.width.indexOf('%') > -1) continue;\n    var h = frame.getAttribute('height') || frame.offsetHeight;\n    var w = frame.getAttribute('width') || frame.offsetWidth;\n    var padding = h / w * 100;\n    var div = document.createElement('div');\n    div.className = c;\n    var divStyles = div.style;\n    divStyles.position = 'relative';\n    divStyles.width = '100%';\n    divStyles.paddingTop = padding + \"%\";\n    var frameStyle = frame.style;\n    frameStyle.position = 'absolute';\n    frameStyle.width = '100%';\n    frameStyle.height = '100%';\n    frameStyle.left = '0';\n    frameStyle.top = '0';\n    frame.parentNode.insertBefore(div, frame);\n    frame.parentNode.removeChild(frame);\n    div.appendChild(frame);\n  }\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (reframe);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVmcmFtZS5qcy9kaXN0L3JlZnJhbWUuZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL3JlZnJhbWUuanMvZGlzdC9yZWZyYW1lLmVzLmpzP2IzNjkiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gcmVmcmFtZSh0YXJnZXQsIGNOYW1lKSB7XG4gIHZhciBmcmFtZXMgPSB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0KSA6IHRhcmdldDtcbiAgdmFyIGMgPSBjTmFtZSB8fCAnanMtcmVmcmFtZSc7XG4gIGlmICghKCdsZW5ndGgnIGluIGZyYW1lcykpIGZyYW1lcyA9IFtmcmFtZXNdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBmcmFtZSA9IGZyYW1lc1tpXTtcbiAgICB2YXIgaGFzQ2xhc3MgPSBmcmFtZS5jbGFzc05hbWUuc3BsaXQoJyAnKS5pbmRleE9mKGMpICE9PSAtMTtcbiAgICBpZiAoaGFzQ2xhc3MgfHwgZnJhbWUuc3R5bGUud2lkdGguaW5kZXhPZignJScpID4gLTEpIGNvbnRpbnVlO1xuICAgIHZhciBoID0gZnJhbWUuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSB8fCBmcmFtZS5vZmZzZXRIZWlnaHQ7XG4gICAgdmFyIHcgPSBmcmFtZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykgfHwgZnJhbWUub2Zmc2V0V2lkdGg7XG4gICAgdmFyIHBhZGRpbmcgPSBoIC8gdyAqIDEwMDtcbiAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9IGM7XG4gICAgdmFyIGRpdlN0eWxlcyA9IGRpdi5zdHlsZTtcbiAgICBkaXZTdHlsZXMucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIGRpdlN0eWxlcy53aWR0aCA9ICcxMDAlJztcbiAgICBkaXZTdHlsZXMucGFkZGluZ1RvcCA9IHBhZGRpbmcgKyBcIiVcIjtcbiAgICB2YXIgZnJhbWVTdHlsZSA9IGZyYW1lLnN0eWxlO1xuICAgIGZyYW1lU3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGZyYW1lU3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgZnJhbWVTdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgZnJhbWVTdHlsZS5sZWZ0ID0gJzAnO1xuICAgIGZyYW1lU3R5bGUudG9wID0gJzAnO1xuICAgIGZyYW1lLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgZnJhbWUpO1xuICAgIGZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZnJhbWUpO1xuICAgIGRpdi5hcHBlbmRDaGlsZChmcmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVmcmFtZTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/reframe.js/dist/reframe.es.js\n");

/***/ }),

/***/ "./node_modules/scriptjs/dist/script.js":
/*!**********************************************!*\
  !*** ./node_modules/scriptjs/dist/script.js ***!
  \**********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n  * $script.js JS loader & dependency manager\n  * https://github.com/ded/script.js\n  * (c) Dustin Diaz 2014 | License MIT\n  */\n\n(function (name, definition) {\n  if ( true && module.exports) module.exports = definition()\n  else if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n  else {}\n})('$script', function () {\n  var doc = document\n    , head = doc.getElementsByTagName('head')[0]\n    , s = 'string'\n    , f = false\n    , push = 'push'\n    , readyState = 'readyState'\n    , onreadystatechange = 'onreadystatechange'\n    , list = {}\n    , ids = {}\n    , delay = {}\n    , scripts = {}\n    , scriptpath\n    , urlArgs\n\n  function every(ar, fn) {\n    for (var i = 0, j = ar.length; i < j; ++i) if (!fn(ar[i])) return f\n    return 1\n  }\n  function each(ar, fn) {\n    every(ar, function (el) {\n      fn(el)\n      return 1\n    })\n  }\n\n  function $script(paths, idOrDone, optDone) {\n    paths = paths[push] ? paths : [paths]\n    var idOrDoneIsDone = idOrDone && idOrDone.call\n      , done = idOrDoneIsDone ? idOrDone : optDone\n      , id = idOrDoneIsDone ? paths.join('') : idOrDone\n      , queue = paths.length\n    function loopFn(item) {\n      return item.call ? item() : list[item]\n    }\n    function callback() {\n      if (!--queue) {\n        list[id] = 1\n        done && done()\n        for (var dset in delay) {\n          every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = [])\n        }\n      }\n    }\n    setTimeout(function () {\n      each(paths, function loading(path, force) {\n        if (path === null) return callback()\n        \n        if (!force && !/^https?:\\/\\//.test(path) && scriptpath) {\n          path = (path.indexOf('.js') === -1) ? scriptpath + path + '.js' : scriptpath + path;\n        }\n        \n        if (scripts[path]) {\n          if (id) ids[id] = 1\n          return (scripts[path] == 2) ? callback() : setTimeout(function () { loading(path, true) }, 0)\n        }\n\n        scripts[path] = 1\n        if (id) ids[id] = 1\n        create(path, callback)\n      })\n    }, 0)\n    return $script\n  }\n\n  function create(path, fn) {\n    var el = doc.createElement('script'), loaded\n    el.onload = el.onerror = el[onreadystatechange] = function () {\n      if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) return;\n      el.onload = el[onreadystatechange] = null\n      loaded = 1\n      scripts[path] = 2\n      fn()\n    }\n    el.async = 1\n    el.src = urlArgs ? path + (path.indexOf('?') === -1 ? '?' : '&') + urlArgs : path;\n    head.insertBefore(el, head.lastChild)\n  }\n\n  $script.get = create\n\n  $script.order = function (scripts, id, done) {\n    (function callback(s) {\n      s = scripts.shift()\n      !scripts.length ? $script(s, id, done) : $script(s, callback)\n    }())\n  }\n\n  $script.path = function (p) {\n    scriptpath = p\n  }\n  $script.urlArgs = function (str) {\n    urlArgs = str;\n  }\n  $script.ready = function (deps, ready, req) {\n    deps = deps[push] ? deps : [deps]\n    var missing = [];\n    !each(deps, function (dep) {\n      list[dep] || missing[push](dep);\n    }) && every(deps, function (dep) {return list[dep]}) ?\n      ready() : !function (key) {\n      delay[key] = delay[key] || []\n      delay[key][push](ready)\n      req && req(missing)\n    }(deps.join('|'))\n    return $script\n  }\n\n  $script.done = function (idOrDone) {\n    $script([null], idOrDone)\n  }\n\n  return $script\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2NyaXB0anMvZGlzdC9zY3JpcHQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkLy4vbm9kZV9tb2R1bGVzL3NjcmlwdGpzL2Rpc3Qvc2NyaXB0LmpzP2EyM2MiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gICogJHNjcmlwdC5qcyBKUyBsb2FkZXIgJiBkZXBlbmRlbmN5IG1hbmFnZXJcbiAgKiBodHRwczovL2dpdGh1Yi5jb20vZGVkL3NjcmlwdC5qc1xuICAqIChjKSBEdXN0aW4gRGlheiAyMDE0IHwgTGljZW5zZSBNSVRcbiAgKi9cblxuKGZ1bmN0aW9uIChuYW1lLCBkZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKVxuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgZGVmaW5lKGRlZmluaXRpb24pXG4gIGVsc2UgdGhpc1tuYW1lXSA9IGRlZmluaXRpb24oKVxufSkoJyRzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBkb2MgPSBkb2N1bWVudFxuICAgICwgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gICAgLCBzID0gJ3N0cmluZydcbiAgICAsIGYgPSBmYWxzZVxuICAgICwgcHVzaCA9ICdwdXNoJ1xuICAgICwgcmVhZHlTdGF0ZSA9ICdyZWFkeVN0YXRlJ1xuICAgICwgb25yZWFkeXN0YXRlY2hhbmdlID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgICAsIGxpc3QgPSB7fVxuICAgICwgaWRzID0ge31cbiAgICAsIGRlbGF5ID0ge31cbiAgICAsIHNjcmlwdHMgPSB7fVxuICAgICwgc2NyaXB0cGF0aFxuICAgICwgdXJsQXJnc1xuXG4gIGZ1bmN0aW9uIGV2ZXJ5KGFyLCBmbikge1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXIubGVuZ3RoOyBpIDwgajsgKytpKSBpZiAoIWZuKGFyW2ldKSkgcmV0dXJuIGZcbiAgICByZXR1cm4gMVxuICB9XG4gIGZ1bmN0aW9uIGVhY2goYXIsIGZuKSB7XG4gICAgZXZlcnkoYXIsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgZm4oZWwpXG4gICAgICByZXR1cm4gMVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiAkc2NyaXB0KHBhdGhzLCBpZE9yRG9uZSwgb3B0RG9uZSkge1xuICAgIHBhdGhzID0gcGF0aHNbcHVzaF0gPyBwYXRocyA6IFtwYXRoc11cbiAgICB2YXIgaWRPckRvbmVJc0RvbmUgPSBpZE9yRG9uZSAmJiBpZE9yRG9uZS5jYWxsXG4gICAgICAsIGRvbmUgPSBpZE9yRG9uZUlzRG9uZSA/IGlkT3JEb25lIDogb3B0RG9uZVxuICAgICAgLCBpZCA9IGlkT3JEb25lSXNEb25lID8gcGF0aHMuam9pbignJykgOiBpZE9yRG9uZVxuICAgICAgLCBxdWV1ZSA9IHBhdGhzLmxlbmd0aFxuICAgIGZ1bmN0aW9uIGxvb3BGbihpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5jYWxsID8gaXRlbSgpIDogbGlzdFtpdGVtXVxuICAgIH1cbiAgICBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIGlmICghLS1xdWV1ZSkge1xuICAgICAgICBsaXN0W2lkXSA9IDFcbiAgICAgICAgZG9uZSAmJiBkb25lKClcbiAgICAgICAgZm9yICh2YXIgZHNldCBpbiBkZWxheSkge1xuICAgICAgICAgIGV2ZXJ5KGRzZXQuc3BsaXQoJ3wnKSwgbG9vcEZuKSAmJiAhZWFjaChkZWxheVtkc2V0XSwgbG9vcEZuKSAmJiAoZGVsYXlbZHNldF0gPSBbXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGVhY2gocGF0aHMsIGZ1bmN0aW9uIGxvYWRpbmcocGF0aCwgZm9yY2UpIHtcbiAgICAgICAgaWYgKHBhdGggPT09IG51bGwpIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIFxuICAgICAgICBpZiAoIWZvcmNlICYmICEvXmh0dHBzPzpcXC9cXC8vLnRlc3QocGF0aCkgJiYgc2NyaXB0cGF0aCkge1xuICAgICAgICAgIHBhdGggPSAocGF0aC5pbmRleE9mKCcuanMnKSA9PT0gLTEpID8gc2NyaXB0cGF0aCArIHBhdGggKyAnLmpzJyA6IHNjcmlwdHBhdGggKyBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoc2NyaXB0c1twYXRoXSkge1xuICAgICAgICAgIGlmIChpZCkgaWRzW2lkXSA9IDFcbiAgICAgICAgICByZXR1cm4gKHNjcmlwdHNbcGF0aF0gPT0gMikgPyBjYWxsYmFjaygpIDogc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGxvYWRpbmcocGF0aCwgdHJ1ZSkgfSwgMClcbiAgICAgICAgfVxuXG4gICAgICAgIHNjcmlwdHNbcGF0aF0gPSAxXG4gICAgICAgIGlmIChpZCkgaWRzW2lkXSA9IDFcbiAgICAgICAgY3JlYXRlKHBhdGgsIGNhbGxiYWNrKVxuICAgICAgfSlcbiAgICB9LCAwKVxuICAgIHJldHVybiAkc2NyaXB0XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGUocGF0aCwgZm4pIHtcbiAgICB2YXIgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksIGxvYWRlZFxuICAgIGVsLm9ubG9hZCA9IGVsLm9uZXJyb3IgPSBlbFtvbnJlYWR5c3RhdGVjaGFuZ2VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKChlbFtyZWFkeVN0YXRlXSAmJiAhKC9eY3xsb2FkZS8udGVzdChlbFtyZWFkeVN0YXRlXSkpKSB8fCBsb2FkZWQpIHJldHVybjtcbiAgICAgIGVsLm9ubG9hZCA9IGVsW29ucmVhZHlzdGF0ZWNoYW5nZV0gPSBudWxsXG4gICAgICBsb2FkZWQgPSAxXG4gICAgICBzY3JpcHRzW3BhdGhdID0gMlxuICAgICAgZm4oKVxuICAgIH1cbiAgICBlbC5hc3luYyA9IDFcbiAgICBlbC5zcmMgPSB1cmxBcmdzID8gcGF0aCArIChwYXRoLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgdXJsQXJncyA6IHBhdGg7XG4gICAgaGVhZC5pbnNlcnRCZWZvcmUoZWwsIGhlYWQubGFzdENoaWxkKVxuICB9XG5cbiAgJHNjcmlwdC5nZXQgPSBjcmVhdGVcblxuICAkc2NyaXB0Lm9yZGVyID0gZnVuY3Rpb24gKHNjcmlwdHMsIGlkLCBkb25lKSB7XG4gICAgKGZ1bmN0aW9uIGNhbGxiYWNrKHMpIHtcbiAgICAgIHMgPSBzY3JpcHRzLnNoaWZ0KClcbiAgICAgICFzY3JpcHRzLmxlbmd0aCA/ICRzY3JpcHQocywgaWQsIGRvbmUpIDogJHNjcmlwdChzLCBjYWxsYmFjaylcbiAgICB9KCkpXG4gIH1cblxuICAkc2NyaXB0LnBhdGggPSBmdW5jdGlvbiAocCkge1xuICAgIHNjcmlwdHBhdGggPSBwXG4gIH1cbiAgJHNjcmlwdC51cmxBcmdzID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHVybEFyZ3MgPSBzdHI7XG4gIH1cbiAgJHNjcmlwdC5yZWFkeSA9IGZ1bmN0aW9uIChkZXBzLCByZWFkeSwgcmVxKSB7XG4gICAgZGVwcyA9IGRlcHNbcHVzaF0gPyBkZXBzIDogW2RlcHNdXG4gICAgdmFyIG1pc3NpbmcgPSBbXTtcbiAgICAhZWFjaChkZXBzLCBmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBsaXN0W2RlcF0gfHwgbWlzc2luZ1twdXNoXShkZXApO1xuICAgIH0pICYmIGV2ZXJ5KGRlcHMsIGZ1bmN0aW9uIChkZXApIHtyZXR1cm4gbGlzdFtkZXBdfSkgP1xuICAgICAgcmVhZHkoKSA6ICFmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWxheVtrZXldID0gZGVsYXlba2V5XSB8fCBbXVxuICAgICAgZGVsYXlba2V5XVtwdXNoXShyZWFkeSlcbiAgICAgIHJlcSAmJiByZXEobWlzc2luZylcbiAgICB9KGRlcHMuam9pbignfCcpKVxuICAgIHJldHVybiAkc2NyaXB0XG4gIH1cblxuICAkc2NyaXB0LmRvbmUgPSBmdW5jdGlvbiAoaWRPckRvbmUpIHtcbiAgICAkc2NyaXB0KFtudWxsXSwgaWRPckRvbmUpXG4gIH1cblxuICByZXR1cm4gJHNjcmlwdFxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/scriptjs/dist/script.js\n");

/***/ }),

/***/ "./node_modules/scroll-lock/dist/scroll-lock.js":
/*!******************************************************!*\
  !*** ./node_modules/scroll-lock/dist/scroll-lock.js ***!
  \******************************************************/
/***/ (function(module) {

eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_543__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__nested_webpack_require_543__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__nested_webpack_require_543__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__nested_webpack_require_543__.d = function(exports, name, getter) {\n/******/ \t\tif(!__nested_webpack_require_543__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__nested_webpack_require_543__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__nested_webpack_require_543__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __nested_webpack_require_543__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__nested_webpack_require_543__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_543__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__nested_webpack_require_543__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__nested_webpack_require_543__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__nested_webpack_require_543__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __nested_webpack_require_543__(__nested_webpack_require_543__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __nested_webpack_require_4019__) {\n\n\"use strict\";\n__nested_webpack_require_4019__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n  return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n  return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n  return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n  if (nodeList && callback) {\n    nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n    for (var i = 0; i < nodeList.length; i++) {\n      if (callback(nodeList[i], i, nodeList.length) === true) {\n        break;\n      }\n    }\n  }\n};\nvar throwError = function throwError(message) {\n  return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n  if (Array.isArray(array)) {\n    var selector = array.join(', ');\n    return selector;\n  }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n  var nodes = [];\n  eachNode(nodeList, function (node) {\n    return nodes.push(node);\n  });\n  return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n  var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n  if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n    return $el;\n  }\n\n  while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n    ;\n  }\n\n  return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n  var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n  var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n  return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n  if ($el) {\n    var computedStyle = getComputedStyle($el);\n    var overflowIsHidden = computedStyle.overflow === 'hidden';\n    return overflowIsHidden;\n  }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    return scrollTop <= 0;\n  }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    var scrollHeight = $el.scrollHeight;\n    var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n    return scrollTopWithHeight >= scrollHeight;\n  }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    return scrollLeft <= 0;\n  }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    var scrollWidth = $el.scrollWidth;\n    var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n    return scrollLeftWithWidth >= scrollWidth;\n  }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n  var selector = 'textarea, [contenteditable=\"true\"]';\n  return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n  var selector = 'input[type=\"range\"]';\n  return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n  scroll: true,\n  queue: 0,\n  scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n  lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n  fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n  fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n  //\n  startTouchY: 0,\n  startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n  if (state.queue <= 0) {\n    state.scroll = false;\n    scroll_lock_hideLockableOverflow();\n    fillGaps();\n  }\n\n  scroll_lock_addScrollableTarget(target);\n  state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n  state.queue > 0 && state.queue--;\n\n  if (state.queue <= 0) {\n    state.scroll = true;\n    scroll_lock_showLockableOverflow();\n    unfillGaps();\n  }\n\n  scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n  return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n  state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n  var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var currentOverflowYProperty = $target.style.overflowY;\n\n    if (onlyExists) {\n      if (!getScrollState()) {\n        $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n      }\n    } else {\n      $target.style.overflowY = 'scroll';\n    }\n\n    var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n    $target.style.overflowY = currentOverflowYProperty;\n    return width;\n  } else {\n    return 0;\n  }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n  if (isElement($target)) {\n    if ($target === document.body) {\n      var documentWidth = document.documentElement.clientWidth;\n      var windowWidth = window.innerWidth;\n      var currentWidth = windowWidth - documentWidth;\n      return currentWidth;\n    } else {\n      var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n      var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n      $target.style.borderLeftWidth = '0px';\n      $target.style.borderRightWidth = '0px';\n\n      var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n      $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n      $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n      return _currentWidth;\n    }\n  } else {\n    return 0;\n  }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n  var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n  return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n  return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-scrollable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-scrollable');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors.push(selector);\n    });\n  }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n        return sSelector !== selector;\n      });\n    });\n  }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-lockable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n  }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.lockableSelectors.push(selector);\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n\n    scroll_lock_addFillGapSelector(selector);\n  }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n  if (method) {\n    if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n      state.fillGapMethod = method;\n      refillGaps();\n    } else {\n      var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n      throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n    }\n  }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n          if (!state.scroll) {\n            scroll_lock_fillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-fill-gap');\n\n          if (!state.scroll) {\n            scroll_lock_unfillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      if (state.fillGapSelectors.indexOf(selector) === -1) {\n        state.fillGapSelectors.push(selector);\n\n        if (!state.scroll) {\n          scroll_lock_fillGapSelector(selector);\n        }\n      }\n    });\n  }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n        return fSelector !== selector;\n      });\n\n      if (!state.scroll) {\n        scroll_lock_unfillGapSelector(selector);\n      }\n    });\n  }\n};\nvar refillGaps = function refillGaps() {\n  if (!state.scroll) {\n    fillGaps();\n  }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_hideLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_showLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n    $target.style.overflow = 'hidden';\n    $target.setAttribute('data-scroll-lock-locked', 'true');\n  }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n    $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-locked');\n  }\n};\n\nvar fillGaps = function fillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_fillGapSelector(selector);\n  });\n};\n\nvar unfillGaps = function unfillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_unfillGapSelector(selector);\n  });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n  eachNode($targets, function ($target) {\n    scroll_lock_fillGapTarget($target, isLockable);\n  });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n  var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var scrollBarWidth;\n\n    if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n    } else {\n      var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n    }\n\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      scroll_lock_unfillGapTarget($target);\n    }\n\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n    $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n    if (state.fillGapMethod === 'margin') {\n      var currentMargin = parseFloat(computedStyle.marginRight);\n      $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n    } else if (state.fillGapMethod === 'width') {\n      $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'max-width') {\n      $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'padding') {\n      var currentPadding = parseFloat(computedStyle.paddingRight);\n      $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n    }\n  }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_unfillGapTarget($target);\n  });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n  if (isElement($target)) {\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n      $target.removeAttribute('data-scroll-lock-filled-gap');\n      $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n      if (currentFillGapMethod === 'margin') {\n        $target.style.marginRight = \"\";\n      } else if (currentFillGapMethod === 'width') {\n        $target.style.width = \"\";\n      } else if (currentFillGapMethod === 'max-width') {\n        $target.style.maxWidth = \"\";\n      } else if (currentFillGapMethod === 'padding') {\n        $target.style.paddingRight = \"\";\n      }\n    }\n  }\n};\n\nvar onResize = function onResize(e) {\n  refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n  if (!state.scroll) {\n    state.startTouchY = e.touches[0].clientY;\n    state.startTouchX = e.touches[0].clientX;\n  }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n  if (!state.scroll) {\n    var startTouchY = state.startTouchY,\n        startTouchX = state.startTouchX;\n    var currentClientY = e.touches[0].clientY;\n    var currentClientX = e.touches[0].clientX;\n\n    if (e.touches.length < 2) {\n      var selector = arrayAsSelector(state.scrollableSelectors);\n      var direction = {\n        up: startTouchY < currentClientY,\n        down: startTouchY > currentClientY,\n        left: startTouchX < currentClientX,\n        right: startTouchX > currentClientX\n      };\n      var directionWithOffset = {\n        up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n        down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n        left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n        right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n      };\n\n      var handle = function handle($el) {\n        var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n        if ($el) {\n          var parentScrollableEl = findParentBySelector($el, selector, false);\n\n          if (elementIsInputRange($el)) {\n            return false;\n          }\n\n          if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n            var prevent = false;\n\n            if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n              if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n              if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n              prevent = true;\n            }\n\n            if (prevent) {\n              if (parentScrollableEl) {\n                handle(parentScrollableEl, true);\n              } else {\n                if (e.cancelable) {\n                  e.preventDefault();\n                }\n              }\n            }\n          } else {\n            handle(parentScrollableEl);\n          }\n        } else {\n          if (e.cancelable) {\n            e.preventDefault();\n          }\n        }\n      };\n\n      handle(e.target);\n    }\n  }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n  if (!state.scroll) {\n    state.startTouchY = 0;\n    state.startTouchX = 0;\n  }\n};\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n  document.addEventListener('touchstart', onTouchStart);\n  document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n    passive: false\n  });\n  document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n  hide: function hide(target) {\n    throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n    disablePageScroll(target);\n  },\n  show: function show(target) {\n    throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n    enablePageScroll(target);\n  },\n  toggle: function toggle(target) {\n    throwError('\"toggle\" is deprecated! Do not use it.');\n\n    if (getScrollState()) {\n      disablePageScroll();\n    } else {\n      enablePageScroll(target);\n    }\n  },\n  getState: function getState() {\n    throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n    return getScrollState();\n  },\n  getWidth: function getWidth() {\n    throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n    return getPageScrollBarWidth();\n  },\n  getCurrentWidth: function getCurrentWidth() {\n    throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n    return getCurrentPageScrollBarWidth();\n  },\n  setScrollableTargets: function setScrollableTargets(target) {\n    throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n    scroll_lock_addScrollableTarget(target);\n  },\n  setFillGapSelectors: function setFillGapSelectors(selector) {\n    throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n    scroll_lock_addFillGapSelector(selector);\n  },\n  setFillGapTargets: function setFillGapTargets(target) {\n    throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n    scroll_lock_addFillGapTarget(target);\n  },\n  clearQueue: function clearQueue() {\n    throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n    clearQueueScrollLocks();\n  }\n};\n\nvar scrollLock = _objectSpread({\n  disablePageScroll: disablePageScroll,\n  enablePageScroll: enablePageScroll,\n  getScrollState: getScrollState,\n  clearQueueScrollLocks: clearQueueScrollLocks,\n  getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n  getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n  getPageScrollBarWidth: getPageScrollBarWidth,\n  getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n  addScrollableSelector: scroll_lock_addScrollableSelector,\n  removeScrollableSelector: scroll_lock_removeScrollableSelector,\n  addScrollableTarget: scroll_lock_addScrollableTarget,\n  removeScrollableTarget: scroll_lock_removeScrollableTarget,\n  addLockableSelector: scroll_lock_addLockableSelector,\n  addLockableTarget: scroll_lock_addLockableTarget,\n  addFillGapSelector: scroll_lock_addFillGapSelector,\n  removeFillGapSelector: scroll_lock_removeFillGapSelector,\n  addFillGapTarget: scroll_lock_addFillGapTarget,\n  removeFillGapTarget: scroll_lock_removeFillGapTarget,\n  setFillGapMethod: scroll_lock_setFillGapMethod,\n  refillGaps: refillGaps,\n  _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })\n/******/ ])[\"default\"];\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2Nyb2xsLWxvY2svZGlzdC9zY3JvbGwtbG9jay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL2dyaWQvLi9ub2RlX21vZHVsZXMvc2Nyb2xsLWxvY2svZGlzdC9zY3JvbGwtbG9jay5qcz8zMjUxIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInNjcm9sbExvY2tcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wic2Nyb2xsTG9ja1wiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy90b29scy5qc1xudmFyIGFyZ3VtZW50QXNBcnJheSA9IGZ1bmN0aW9uIGFyZ3VtZW50QXNBcnJheShhcmd1bWVudCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmd1bWVudCkgPyBhcmd1bWVudCA6IFthcmd1bWVudF07XG59O1xudmFyIGlzRWxlbWVudCA9IGZ1bmN0aW9uIGlzRWxlbWVudCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIE5vZGU7XG59O1xudmFyIGlzRWxlbWVudExpc3QgPSBmdW5jdGlvbiBpc0VsZW1lbnRMaXN0KG5vZGVMaXN0KSB7XG4gIHJldHVybiBub2RlTGlzdCBpbnN0YW5jZW9mIE5vZGVMaXN0O1xufTtcbnZhciBlYWNoTm9kZSA9IGZ1bmN0aW9uIGVhY2hOb2RlKG5vZGVMaXN0LCBjYWxsYmFjaykge1xuICBpZiAobm9kZUxpc3QgJiYgY2FsbGJhY2spIHtcbiAgICBub2RlTGlzdCA9IGlzRWxlbWVudExpc3Qobm9kZUxpc3QpID8gbm9kZUxpc3QgOiBbbm9kZUxpc3RdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNhbGxiYWNrKG5vZGVMaXN0W2ldLCBpLCBub2RlTGlzdC5sZW5ndGgpID09PSB0cnVlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbnZhciB0aHJvd0Vycm9yID0gZnVuY3Rpb24gdGhyb3dFcnJvcihtZXNzYWdlKSB7XG4gIHJldHVybiBjb25zb2xlLmVycm9yKFwiW3Njcm9sbC1sb2NrXSBcIi5jb25jYXQobWVzc2FnZSkpO1xufTtcbnZhciBhcnJheUFzU2VsZWN0b3IgPSBmdW5jdGlvbiBhcnJheUFzU2VsZWN0b3IoYXJyYXkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gYXJyYXkuam9pbignLCAnKTtcbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cbn07XG52YXIgbm9kZUxpc3RBc0FycmF5ID0gZnVuY3Rpb24gbm9kZUxpc3RBc0FycmF5KG5vZGVMaXN0KSB7XG4gIHZhciBub2RlcyA9IFtdO1xuICBlYWNoTm9kZShub2RlTGlzdCwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZXMucHVzaChub2RlKTtcbiAgfSk7XG4gIHJldHVybiBub2Rlcztcbn07XG52YXIgZmluZFBhcmVudEJ5U2VsZWN0b3IgPSBmdW5jdGlvbiBmaW5kUGFyZW50QnlTZWxlY3RvcigkZWwsIHNlbGVjdG9yKSB7XG4gIHZhciBzZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICB2YXIgJHJvb3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGRvY3VtZW50O1xuXG4gIGlmIChzZWxmICYmIG5vZGVMaXN0QXNBcnJheSgkcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuaW5kZXhPZigkZWwpICE9PSAtMSkge1xuICAgIHJldHVybiAkZWw7XG4gIH1cblxuICB3aGlsZSAoKCRlbCA9ICRlbC5wYXJlbnRFbGVtZW50KSAmJiBub2RlTGlzdEFzQXJyYXkoJHJvb3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpLmluZGV4T2YoJGVsKSA9PT0gLTEpIHtcbiAgICA7XG4gIH1cblxuICByZXR1cm4gJGVsO1xufTtcbnZhciBlbGVtZW50SGFzU2VsZWN0b3IgPSBmdW5jdGlvbiBlbGVtZW50SGFzU2VsZWN0b3IoJGVsLCBzZWxlY3Rvcikge1xuICB2YXIgJHJvb3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGRvY3VtZW50O1xuICB2YXIgaGFzID0gbm9kZUxpc3RBc0FycmF5KCRyb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5pbmRleE9mKCRlbCkgIT09IC0xO1xuICByZXR1cm4gaGFzO1xufTtcbnZhciBlbGVtZW50SGFzT3ZlcmZsb3dIaWRkZW4gPSBmdW5jdGlvbiBlbGVtZW50SGFzT3ZlcmZsb3dIaWRkZW4oJGVsKSB7XG4gIGlmICgkZWwpIHtcbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoJGVsKTtcbiAgICB2YXIgb3ZlcmZsb3dJc0hpZGRlbiA9IGNvbXB1dGVkU3R5bGUub3ZlcmZsb3cgPT09ICdoaWRkZW4nO1xuICAgIHJldHVybiBvdmVyZmxvd0lzSGlkZGVuO1xuICB9XG59O1xudmFyIGVsZW1lbnRTY3JvbGxUb3BPblN0YXJ0ID0gZnVuY3Rpb24gZWxlbWVudFNjcm9sbFRvcE9uU3RhcnQoJGVsKSB7XG4gIGlmICgkZWwpIHtcbiAgICBpZiAoZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzY3JvbGxUb3AgPSAkZWwuc2Nyb2xsVG9wO1xuICAgIHJldHVybiBzY3JvbGxUb3AgPD0gMDtcbiAgfVxufTtcbnZhciBlbGVtZW50U2Nyb2xsVG9wT25FbmQgPSBmdW5jdGlvbiBlbGVtZW50U2Nyb2xsVG9wT25FbmQoJGVsKSB7XG4gIGlmICgkZWwpIHtcbiAgICBpZiAoZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzY3JvbGxUb3AgPSAkZWwuc2Nyb2xsVG9wO1xuICAgIHZhciBzY3JvbGxIZWlnaHQgPSAkZWwuc2Nyb2xsSGVpZ2h0O1xuICAgIHZhciBzY3JvbGxUb3BXaXRoSGVpZ2h0ID0gc2Nyb2xsVG9wICsgJGVsLm9mZnNldEhlaWdodDtcbiAgICByZXR1cm4gc2Nyb2xsVG9wV2l0aEhlaWdodCA+PSBzY3JvbGxIZWlnaHQ7XG4gIH1cbn07XG52YXIgZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0ID0gZnVuY3Rpb24gZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0KCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsTGVmdCA9ICRlbC5zY3JvbGxMZWZ0O1xuICAgIHJldHVybiBzY3JvbGxMZWZ0IDw9IDA7XG4gIH1cbn07XG52YXIgZWxlbWVudFNjcm9sbExlZnRPbkVuZCA9IGZ1bmN0aW9uIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQoJGVsKSB7XG4gIGlmICgkZWwpIHtcbiAgICBpZiAoZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzY3JvbGxMZWZ0ID0gJGVsLnNjcm9sbExlZnQ7XG4gICAgdmFyIHNjcm9sbFdpZHRoID0gJGVsLnNjcm9sbFdpZHRoO1xuICAgIHZhciBzY3JvbGxMZWZ0V2l0aFdpZHRoID0gc2Nyb2xsTGVmdCArICRlbC5vZmZzZXRXaWR0aDtcbiAgICByZXR1cm4gc2Nyb2xsTGVmdFdpdGhXaWR0aCA+PSBzY3JvbGxXaWR0aDtcbiAgfVxufTtcbnZhciBlbGVtZW50SXNTY3JvbGxhYmxlRmllbGQgPSBmdW5jdGlvbiBlbGVtZW50SXNTY3JvbGxhYmxlRmllbGQoJGVsKSB7XG4gIHZhciBzZWxlY3RvciA9ICd0ZXh0YXJlYSwgW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nO1xuICByZXR1cm4gZWxlbWVudEhhc1NlbGVjdG9yKCRlbCwgc2VsZWN0b3IpO1xufTtcbnZhciBlbGVtZW50SXNJbnB1dFJhbmdlID0gZnVuY3Rpb24gZWxlbWVudElzSW5wdXRSYW5nZSgkZWwpIHtcbiAgdmFyIHNlbGVjdG9yID0gJ2lucHV0W3R5cGU9XCJyYW5nZVwiXSc7XG4gIHJldHVybiBlbGVtZW50SGFzU2VsZWN0b3IoJGVsLCBzZWxlY3Rvcik7XG59O1xuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2Nyb2xsLWxvY2suanNcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJkaXNhYmxlUGFnZVNjcm9sbFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGRpc2FibGVQYWdlU2Nyb2xsOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJlbmFibGVQYWdlU2Nyb2xsXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZW5hYmxlUGFnZVNjcm9sbDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0U2Nyb2xsU3RhdGVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRTY3JvbGxTdGF0ZTsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY2xlYXJRdWV1ZVNjcm9sbExvY2tzXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gY2xlYXJRdWV1ZVNjcm9sbExvY2tzOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJnZXRUYXJnZXRTY3JvbGxCYXJXaWR0aFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJnZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19nZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGg7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImdldFBhZ2VTY3JvbGxCYXJXaWR0aFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGdldFBhZ2VTY3JvbGxCYXJXaWR0aDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGg7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZFNjcm9sbGFibGVUYXJnZXRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVTY3JvbGxhYmxlVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkU2Nyb2xsYWJsZVNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3I7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZExvY2thYmxlVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVUYXJnZXQ7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZExvY2thYmxlU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRMb2NrYWJsZVNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJzZXRGaWxsR2FwTWV0aG9kXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfc2V0RmlsbEdhcE1ldGhvZDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkRmlsbEdhcFRhcmdldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBUYXJnZXQ7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInJlbW92ZUZpbGxHYXBUYXJnZXRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRGaWxsR2FwU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRGaWxsR2FwU2VsZWN0b3I7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInJlbW92ZUZpbGxHYXBTZWxlY3RvclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBTZWxlY3RvcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVmaWxsR2Fwc1wiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHJlZmlsbEdhcHM7IH0pO1xuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5cbnZhciBGSUxMX0dBUF9BVkFJTEFCTEVfTUVUSE9EUyA9IFsncGFkZGluZycsICdtYXJnaW4nLCAnd2lkdGgnLCAnbWF4LXdpZHRoJywgJ25vbmUnXTtcbnZhciBUT1VDSF9ESVJFQ1RJT05fREVURUNUX09GRlNFVCA9IDM7XG52YXIgc3RhdGUgPSB7XG4gIHNjcm9sbDogdHJ1ZSxcbiAgcXVldWU6IDAsXG4gIHNjcm9sbGFibGVTZWxlY3RvcnM6IFsnW2RhdGEtc2Nyb2xsLWxvY2stc2Nyb2xsYWJsZV0nXSxcbiAgbG9ja2FibGVTZWxlY3RvcnM6IFsnYm9keScsICdbZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZV0nXSxcbiAgZmlsbEdhcFNlbGVjdG9yczogWydib2R5JywgJ1tkYXRhLXNjcm9sbC1sb2NrLWZpbGwtZ2FwXScsICdbZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZV0nXSxcbiAgZmlsbEdhcE1ldGhvZDogRklMTF9HQVBfQVZBSUxBQkxFX01FVEhPRFNbMF0sXG4gIC8vXG4gIHN0YXJ0VG91Y2hZOiAwLFxuICBzdGFydFRvdWNoWDogMFxufTtcbnZhciBkaXNhYmxlUGFnZVNjcm9sbCA9IGZ1bmN0aW9uIGRpc2FibGVQYWdlU2Nyb2xsKHRhcmdldCkge1xuICBpZiAoc3RhdGUucXVldWUgPD0gMCkge1xuICAgIHN0YXRlLnNjcm9sbCA9IGZhbHNlO1xuICAgIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93KCk7XG4gICAgZmlsbEdhcHMoKTtcbiAgfVxuXG4gIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVUYXJnZXQodGFyZ2V0KTtcbiAgc3RhdGUucXVldWUrKztcbn07XG52YXIgZW5hYmxlUGFnZVNjcm9sbCA9IGZ1bmN0aW9uIGVuYWJsZVBhZ2VTY3JvbGwodGFyZ2V0KSB7XG4gIHN0YXRlLnF1ZXVlID4gMCAmJiBzdGF0ZS5xdWV1ZS0tO1xuXG4gIGlmIChzdGF0ZS5xdWV1ZSA8PSAwKSB7XG4gICAgc3RhdGUuc2Nyb2xsID0gdHJ1ZTtcbiAgICBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvdygpO1xuICAgIHVuZmlsbEdhcHMoKTtcbiAgfVxuXG4gIHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVUYXJnZXQodGFyZ2V0KTtcbn07XG52YXIgZ2V0U2Nyb2xsU3RhdGUgPSBmdW5jdGlvbiBnZXRTY3JvbGxTdGF0ZSgpIHtcbiAgcmV0dXJuIHN0YXRlLnNjcm9sbDtcbn07XG52YXIgY2xlYXJRdWV1ZVNjcm9sbExvY2tzID0gZnVuY3Rpb24gY2xlYXJRdWV1ZVNjcm9sbExvY2tzKCkge1xuICBzdGF0ZS5xdWV1ZSA9IDA7XG59O1xudmFyIHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGgoJHRhcmdldCkge1xuICB2YXIgb25seUV4aXN0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgIHZhciBjdXJyZW50T3ZlcmZsb3dZUHJvcGVydHkgPSAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WTtcblxuICAgIGlmIChvbmx5RXhpc3RzKSB7XG4gICAgICBpZiAoIWdldFNjcm9sbFN0YXRlKCkpIHtcbiAgICAgICAgJHRhcmdldC5zdHlsZS5vdmVyZmxvd1kgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1vdmVyZmxvdy15LXByb3BlcnR5Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZID0gJ3Njcm9sbCc7XG4gICAgfVxuXG4gICAgdmFyIHdpZHRoID0gc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQpO1xuICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZID0gY3VycmVudE92ZXJmbG93WVByb3BlcnR5O1xuICAgIHJldHVybiB3aWR0aDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19nZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGggPSBmdW5jdGlvbiBnZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGgoJHRhcmdldCkge1xuICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgaWYgKCR0YXJnZXQgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIHZhciBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgdmFyIHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICB2YXIgY3VycmVudFdpZHRoID0gd2luZG93V2lkdGggLSBkb2N1bWVudFdpZHRoO1xuICAgICAgcmV0dXJuIGN1cnJlbnRXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJvcmRlckxlZnRXaWR0aEN1cnJlbnRQcm9wZXJ0eSA9ICR0YXJnZXQuc3R5bGUuYm9yZGVyTGVmdFdpZHRoO1xuICAgICAgdmFyIGJvcmRlclJpZ2h0V2lkdGhDdXJyZW50UHJvcGVydHkgPSAkdGFyZ2V0LnN0eWxlLmJvcmRlclJpZ2h0V2lkdGg7XG4gICAgICAkdGFyZ2V0LnN0eWxlLmJvcmRlckxlZnRXaWR0aCA9ICcwcHgnO1xuICAgICAgJHRhcmdldC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gJzBweCc7XG5cbiAgICAgIHZhciBfY3VycmVudFdpZHRoID0gJHRhcmdldC5vZmZzZXRXaWR0aCAtICR0YXJnZXQuY2xpZW50V2lkdGg7XG5cbiAgICAgICR0YXJnZXQuc3R5bGUuYm9yZGVyTGVmdFdpZHRoID0gYm9yZGVyTGVmdFdpZHRoQ3VycmVudFByb3BlcnR5O1xuICAgICAgJHRhcmdldC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gYm9yZGVyUmlnaHRXaWR0aEN1cnJlbnRQcm9wZXJ0eTtcbiAgICAgIHJldHVybiBfY3VycmVudFdpZHRoO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBnZXRQYWdlU2Nyb2xsQmFyV2lkdGggPSBmdW5jdGlvbiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGgoKSB7XG4gIHZhciBvbmx5RXhpc3RzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgcmV0dXJuIHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoKGRvY3VtZW50LmJvZHksIG9ubHlFeGlzdHMpO1xufTtcbnZhciBnZXRDdXJyZW50UGFnZVNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCgpIHtcbiAgcmV0dXJuIHNjcm9sbF9sb2NrX2dldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aChkb2N1bWVudC5ib2R5KTtcbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldCA9IGZ1bmN0aW9uIGFkZFNjcm9sbGFibGVUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGFyZ3VtZW50QXNBcnJheSh0YXJnZXQpO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uICgkdGFyZ2V0cykge1xuICAgICAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICAgICAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zY3JvbGxhYmxlJywgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVUYXJnZXQgPSBmdW5jdGlvbiByZW1vdmVTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldHMgPSBhcmd1bWVudEFzQXJyYXkodGFyZ2V0KTtcbiAgICB0YXJnZXRzLm1hcChmdW5jdGlvbiAoJHRhcmdldHMpIHtcbiAgICAgIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgICAgICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2Nyb2xsYWJsZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVTZWxlY3RvciA9IGZ1bmN0aW9uIGFkZFNjcm9sbGFibGVTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgc3RhdGUuc2Nyb2xsYWJsZVNlbGVjdG9ycy5wdXNoKHNlbGVjdG9yKTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3IgPSBmdW5jdGlvbiByZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIHN0YXRlLnNjcm9sbGFibGVTZWxlY3RvcnMgPSBzdGF0ZS5zY3JvbGxhYmxlU2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbiAoc1NlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBzU2VsZWN0b3IgIT09IHNlbGVjdG9yO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVUYXJnZXQgPSBmdW5jdGlvbiBhZGRMb2NrYWJsZVRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWxvY2thYmxlJywgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKCFnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdygpO1xuICAgIH1cbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRMb2NrYWJsZVNlbGVjdG9yID0gZnVuY3Rpb24gYWRkTG9ja2FibGVTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgc3RhdGUubG9ja2FibGVTZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG4gICAgfSk7XG5cbiAgICBpZiAoIWdldFNjcm9sbFN0YXRlKCkpIHtcbiAgICAgIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93KCk7XG4gICAgfVxuXG4gICAgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19zZXRGaWxsR2FwTWV0aG9kID0gZnVuY3Rpb24gc2V0RmlsbEdhcE1ldGhvZChtZXRob2QpIHtcbiAgaWYgKG1ldGhvZCkge1xuICAgIGlmIChGSUxMX0dBUF9BVkFJTEFCTEVfTUVUSE9EUy5pbmRleE9mKG1ldGhvZCkgIT09IC0xKSB7XG4gICAgICBzdGF0ZS5maWxsR2FwTWV0aG9kID0gbWV0aG9kO1xuICAgICAgcmVmaWxsR2FwcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWV0aG9kcyA9IEZJTExfR0FQX0FWQUlMQUJMRV9NRVRIT0RTLmpvaW4oJywgJyk7XG4gICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdChtZXRob2QsIFwiXFxcIiBtZXRob2QgaXMgbm90IGF2YWlsYWJsZSFcXG5BdmFpbGFibGUgZmlsbCBnYXAgbWV0aG9kczogXCIpLmNvbmNhdChtZXRob2RzLCBcIi5cIikpO1xuICAgIH1cbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRGaWxsR2FwVGFyZ2V0ID0gZnVuY3Rpb24gYWRkRmlsbEdhcFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGwtZ2FwJywgJycpO1xuXG4gICAgICAgICAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICAgICAgICAgIHNjcm9sbF9sb2NrX2ZpbGxHYXBUYXJnZXQoJHRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBUYXJnZXQgPSBmdW5jdGlvbiByZW1vdmVGaWxsR2FwVGFyZ2V0KHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldHMgPSBhcmd1bWVudEFzQXJyYXkodGFyZ2V0KTtcbiAgICB0YXJnZXRzLm1hcChmdW5jdGlvbiAoJHRhcmdldHMpIHtcbiAgICAgIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgICAgICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbC1nYXAnKTtcblxuICAgICAgICAgIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgICAgICAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQoJHRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoXCJcXFwiXCIuY29uY2F0KCR0YXJnZXQsIFwiXFxcIiBpcyBub3QgYSBFbGVtZW50LlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIGFkZEZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgaWYgKHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMuaW5kZXhPZihzZWxlY3RvcikgPT09IC0xKSB7XG4gICAgICAgIHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICAgICAgICBzY3JvbGxfbG9ja19maWxsR2FwU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfcmVtb3ZlRmlsbEdhcFNlbGVjdG9yID0gZnVuY3Rpb24gcmVtb3ZlRmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIGlmIChzZWxlY3Rvcikge1xuICAgIHZhciBzZWxlY3RvcnMgPSBhcmd1bWVudEFzQXJyYXkoc2VsZWN0b3IpO1xuICAgIHNlbGVjdG9ycy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICBzdGF0ZS5maWxsR2FwU2VsZWN0b3JzID0gc3RhdGUuZmlsbEdhcFNlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24gKGZTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZlNlbGVjdG9yICE9PSBzZWxlY3RvcjtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgICAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG52YXIgcmVmaWxsR2FwcyA9IGZ1bmN0aW9uIHJlZmlsbEdhcHMoKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgZmlsbEdhcHMoKTtcbiAgfVxufTtcblxudmFyIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93ID0gZnVuY3Rpb24gaGlkZUxvY2thYmxlT3ZlcmZsb3coKSB7XG4gIHZhciBzZWxlY3RvciA9IGFycmF5QXNTZWxlY3RvcihzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycyk7XG4gIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3Ioc2VsZWN0b3IpO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93ID0gZnVuY3Rpb24gc2hvd0xvY2thYmxlT3ZlcmZsb3coKSB7XG4gIHZhciBzZWxlY3RvciA9IGFycmF5QXNTZWxlY3RvcihzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycyk7XG4gIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3Ioc2VsZWN0b3IpO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX2hpZGVMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3IgPSBmdW5jdGlvbiBoaWRlTG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfc2hvd0xvY2thYmxlT3ZlcmZsb3dTZWxlY3RvciA9IGZ1bmN0aW9uIHNob3dMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgdmFyICR0YXJnZXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93VGFyZ2V0KCR0YXJnZXQpO1xuICB9KTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1RhcmdldCA9IGZ1bmN0aW9uIGhpZGVMb2NrYWJsZU92ZXJmbG93VGFyZ2V0KCR0YXJnZXQpIHtcbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSAmJiAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrZWQnKSAhPT0gJ3RydWUnKSB7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSgkdGFyZ2V0KTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1vdmVyZmxvdy15LXByb3BlcnR5JywgY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1kpO1xuICAgICR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLWlubGluZS1vdmVyZmxvdy1wcm9wZXJ0eScsICR0YXJnZXQuc3R5bGUub3ZlcmZsb3cpO1xuICAgICR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLWlubGluZS1vdmVyZmxvdy15LXByb3BlcnR5JywgJHRhcmdldC5zdHlsZS5vdmVyZmxvd1kpO1xuICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrZWQnLCAndHJ1ZScpO1xuICB9XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfc2hvd0xvY2thYmxlT3ZlcmZsb3dUYXJnZXQgPSBmdW5jdGlvbiBzaG93TG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KSB7XG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkgJiYgJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2VkJykgPT09ICd0cnVlJykge1xuICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3cgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3ctcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WSA9ICR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLWlubGluZS1vdmVyZmxvdy15LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtb3ZlcmZsb3ctcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3ctcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3cteS1wcm9wZXJ0eScpO1xuICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWxvY2tlZCcpO1xuICB9XG59O1xuXG52YXIgZmlsbEdhcHMgPSBmdW5jdGlvbiBmaWxsR2FwcygpIHtcbiAgc3RhdGUuZmlsbEdhcFNlbGVjdG9ycy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgc2Nyb2xsX2xvY2tfZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfSk7XG59O1xuXG52YXIgdW5maWxsR2FwcyA9IGZ1bmN0aW9uIHVuZmlsbEdhcHMoKSB7XG4gIHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHNjcm9sbF9sb2NrX3VuZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfZmlsbEdhcFNlbGVjdG9yID0gZnVuY3Rpb24gZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB2YXIgaXNMb2NrYWJsZSA9IHN0YXRlLmxvY2thYmxlU2VsZWN0b3JzLmluZGV4T2Yoc2VsZWN0b3IpICE9PSAtMTtcbiAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgc2Nyb2xsX2xvY2tfZmlsbEdhcFRhcmdldCgkdGFyZ2V0LCBpc0xvY2thYmxlKTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfZmlsbEdhcFRhcmdldCA9IGZ1bmN0aW9uIGZpbGxHYXBUYXJnZXQoJHRhcmdldCkge1xuICB2YXIgaXNMb2NrYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgIHZhciBzY3JvbGxCYXJXaWR0aDtcblxuICAgIGlmICgkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZScpID09PSAnJyB8fCBpc0xvY2thYmxlKSB7XG4gICAgICBzY3JvbGxCYXJXaWR0aCA9IHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgJGxvY2thYmxlUGFyZW50ID0gZmluZFBhcmVudEJ5U2VsZWN0b3IoJHRhcmdldCwgYXJyYXlBc1NlbGVjdG9yKHN0YXRlLmxvY2thYmxlU2VsZWN0b3JzKSk7XG4gICAgICBzY3JvbGxCYXJXaWR0aCA9IHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoKCRsb2NrYWJsZVBhcmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGxlZC1nYXAnKSA9PT0gJ3RydWUnKSB7XG4gICAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQoJHRhcmdldCk7XG4gICAgfVxuXG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSgkdGFyZ2V0KTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsZWQtZ2FwJywgJ3RydWUnKTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1jdXJyZW50LWZpbGwtZ2FwLW1ldGhvZCcsIHN0YXRlLmZpbGxHYXBNZXRob2QpO1xuXG4gICAgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICdtYXJnaW4nKSB7XG4gICAgICB2YXIgY3VycmVudE1hcmdpbiA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCk7XG4gICAgICAkdGFyZ2V0LnN0eWxlLm1hcmdpblJpZ2h0ID0gXCJcIi5jb25jYXQoY3VycmVudE1hcmdpbiArIHNjcm9sbEJhcldpZHRoLCBcInB4XCIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZmlsbEdhcE1ldGhvZCA9PT0gJ3dpZHRoJykge1xuICAgICAgJHRhcmdldC5zdHlsZS53aWR0aCA9IFwiY2FsYygxMDAlIC0gXCIuY29uY2F0KHNjcm9sbEJhcldpZHRoLCBcInB4KVwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICdtYXgtd2lkdGgnKSB7XG4gICAgICAkdGFyZ2V0LnN0eWxlLm1heFdpZHRoID0gXCJjYWxjKDEwMCUgLSBcIi5jb25jYXQoc2Nyb2xsQmFyV2lkdGgsIFwicHgpXCIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZmlsbEdhcE1ldGhvZCA9PT0gJ3BhZGRpbmcnKSB7XG4gICAgICB2YXIgY3VycmVudFBhZGRpbmcgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1JpZ2h0KTtcbiAgICAgICR0YXJnZXQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gXCJcIi5jb25jYXQoY3VycmVudFBhZGRpbmcgKyBzY3JvbGxCYXJXaWR0aCwgXCJweFwiKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBzY3JvbGxfbG9ja191bmZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIHVuZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQoJHRhcmdldCk7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX3VuZmlsbEdhcFRhcmdldCA9IGZ1bmN0aW9uIHVuZmlsbEdhcFRhcmdldCgkdGFyZ2V0KSB7XG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICBpZiAoJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbGVkLWdhcCcpID09PSAndHJ1ZScpIHtcbiAgICAgIHZhciBjdXJyZW50RmlsbEdhcE1ldGhvZCA9ICR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWN1cnJlbnQtZmlsbC1nYXAtbWV0aG9kJyk7XG4gICAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsZWQtZ2FwJyk7XG4gICAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1jdXJyZW50LWZpbGwtZ2FwLW1ldGhvZCcpO1xuXG4gICAgICBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICdtYXJnaW4nKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUubWFyZ2luUmlnaHQgPSBcIlwiO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50RmlsbEdhcE1ldGhvZCA9PT0gJ3dpZHRoJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLndpZHRoID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICdtYXgtd2lkdGgnKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUubWF4V2lkdGggPSBcIlwiO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50RmlsbEdhcE1ldGhvZCA9PT0gJ3BhZGRpbmcnKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciBvblJlc2l6ZSA9IGZ1bmN0aW9uIG9uUmVzaXplKGUpIHtcbiAgcmVmaWxsR2FwcygpO1xufTtcblxudmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICBzdGF0ZS5zdGFydFRvdWNoWCA9IGUudG91Y2hlc1swXS5jbGllbnRYO1xuICB9XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfb25Ub3VjaE1vdmUgPSBmdW5jdGlvbiBvblRvdWNoTW92ZShlKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgdmFyIHN0YXJ0VG91Y2hZID0gc3RhdGUuc3RhcnRUb3VjaFksXG4gICAgICAgIHN0YXJ0VG91Y2hYID0gc3RhdGUuc3RhcnRUb3VjaFg7XG4gICAgdmFyIGN1cnJlbnRDbGllbnRZID0gZS50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgdmFyIGN1cnJlbnRDbGllbnRYID0gZS50b3VjaGVzWzBdLmNsaWVudFg7XG5cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFycmF5QXNTZWxlY3RvcihzdGF0ZS5zY3JvbGxhYmxlU2VsZWN0b3JzKTtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSB7XG4gICAgICAgIHVwOiBzdGFydFRvdWNoWSA8IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBkb3duOiBzdGFydFRvdWNoWSA+IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBsZWZ0OiBzdGFydFRvdWNoWCA8IGN1cnJlbnRDbGllbnRYLFxuICAgICAgICByaWdodDogc3RhcnRUb3VjaFggPiBjdXJyZW50Q2xpZW50WFxuICAgICAgfTtcbiAgICAgIHZhciBkaXJlY3Rpb25XaXRoT2Zmc2V0ID0ge1xuICAgICAgICB1cDogc3RhcnRUb3VjaFkgKyBUT1VDSF9ESVJFQ1RJT05fREVURUNUX09GRlNFVCA8IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBkb3duOiBzdGFydFRvdWNoWSAtIFRPVUNIX0RJUkVDVElPTl9ERVRFQ1RfT0ZGU0VUID4gY3VycmVudENsaWVudFksXG4gICAgICAgIGxlZnQ6IHN0YXJ0VG91Y2hYICsgVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPCBjdXJyZW50Q2xpZW50WCxcbiAgICAgICAgcmlnaHQ6IHN0YXJ0VG91Y2hYIC0gVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPiBjdXJyZW50Q2xpZW50WFxuICAgICAgfTtcblxuICAgICAgdmFyIGhhbmRsZSA9IGZ1bmN0aW9uIGhhbmRsZSgkZWwpIHtcbiAgICAgICAgdmFyIHNraXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gICAgICAgIGlmICgkZWwpIHtcbiAgICAgICAgICB2YXIgcGFyZW50U2Nyb2xsYWJsZUVsID0gZmluZFBhcmVudEJ5U2VsZWN0b3IoJGVsLCBzZWxlY3RvciwgZmFsc2UpO1xuXG4gICAgICAgICAgaWYgKGVsZW1lbnRJc0lucHV0UmFuZ2UoJGVsKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChza2lwIHx8IGVsZW1lbnRJc1Njcm9sbGFibGVGaWVsZCgkZWwpICYmIGZpbmRQYXJlbnRCeVNlbGVjdG9yKCRlbCwgc2VsZWN0b3IpIHx8IGVsZW1lbnRIYXNTZWxlY3RvcigkZWwsIHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgdmFyIHByZXZlbnQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCgkZWwpICYmIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQoJGVsKSkge1xuICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uLnVwICYmIGVsZW1lbnRTY3JvbGxUb3BPblN0YXJ0KCRlbCkgfHwgZGlyZWN0aW9uLmRvd24gJiYgZWxlbWVudFNjcm9sbFRvcE9uRW5kKCRlbCkpIHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50U2Nyb2xsVG9wT25TdGFydCgkZWwpICYmIGVsZW1lbnRTY3JvbGxUb3BPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24ubGVmdCAmJiBlbGVtZW50U2Nyb2xsTGVmdE9uU3RhcnQoJGVsKSB8fCBkaXJlY3Rpb24ucmlnaHQgJiYgZWxlbWVudFNjcm9sbExlZnRPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgICAgcHJldmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uV2l0aE9mZnNldC51cCAmJiBlbGVtZW50U2Nyb2xsVG9wT25TdGFydCgkZWwpIHx8IGRpcmVjdGlvbldpdGhPZmZzZXQuZG93biAmJiBlbGVtZW50U2Nyb2xsVG9wT25FbmQoJGVsKSB8fCBkaXJlY3Rpb25XaXRoT2Zmc2V0LmxlZnQgJiYgZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0KCRlbCkgfHwgZGlyZWN0aW9uV2l0aE9mZnNldC5yaWdodCAmJiBlbGVtZW50U2Nyb2xsTGVmdE9uRW5kKCRlbCkpIHtcbiAgICAgICAgICAgICAgcHJldmVudCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcmV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmIChwYXJlbnRTY3JvbGxhYmxlRWwpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUocGFyZW50U2Nyb2xsYWJsZUVsLCB0cnVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZShwYXJlbnRTY3JvbGxhYmxlRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGUoZS50YXJnZXQpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIG9uVG91Y2hFbmQgPSBmdW5jdGlvbiBvblRvdWNoRW5kKGUpIHtcbiAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICBzdGF0ZS5zdGFydFRvdWNoWSA9IDA7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFggPSAwO1xuICB9XG59O1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplKTtcbn1cblxuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNjcm9sbF9sb2NrX29uVG91Y2hNb3ZlLCB7XG4gICAgcGFzc2l2ZTogZmFsc2VcbiAgfSk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG59XG5cbnZhciBkZXByZWNhdGVkTWV0aG9kcyA9IHtcbiAgaGlkZTogZnVuY3Rpb24gaGlkZSh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcImhpZGVcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJkaXNhYmxlUGFnZVNjcm9sbFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNkaXNhYmxlcGFnZXNjcm9sbHNjcm9sbGFibGV0YXJnZXQnKTtcbiAgICBkaXNhYmxlUGFnZVNjcm9sbCh0YXJnZXQpO1xuICB9LFxuICBzaG93OiBmdW5jdGlvbiBzaG93KHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1wic2hvd1wiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImVuYWJsZVBhZ2VTY3JvbGxcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjZW5hYmxlcGFnZXNjcm9sbHNjcm9sbGFibGV0YXJnZXQnKTtcbiAgICBlbmFibGVQYWdlU2Nyb2xsKHRhcmdldCk7XG4gIH0sXG4gIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1widG9nZ2xlXCIgaXMgZGVwcmVjYXRlZCEgRG8gbm90IHVzZSBpdC4nKTtcblxuICAgIGlmIChnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICBkaXNhYmxlUGFnZVNjcm9sbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmFibGVQYWdlU2Nyb2xsKHRhcmdldCk7XG4gICAgfVxuICB9LFxuICBnZXRTdGF0ZTogZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgdGhyb3dFcnJvcignXCJnZXRTdGF0ZVwiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImdldFNjcm9sbFN0YXRlXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2dldHNjcm9sbHN0YXRlJyk7XG4gICAgcmV0dXJuIGdldFNjcm9sbFN0YXRlKCk7XG4gIH0sXG4gIGdldFdpZHRoOiBmdW5jdGlvbiBnZXRXaWR0aCgpIHtcbiAgICB0aHJvd0Vycm9yKCdcImdldFdpZHRoXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiZ2V0UGFnZVNjcm9sbEJhcldpZHRoXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2dldHBhZ2VzY3JvbGxiYXJ3aWR0aCcpO1xuICAgIHJldHVybiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGgoKTtcbiAgfSxcbiAgZ2V0Q3VycmVudFdpZHRoOiBmdW5jdGlvbiBnZXRDdXJyZW50V2lkdGgoKSB7XG4gICAgdGhyb3dFcnJvcignXCJnZXRDdXJyZW50V2lkdGhcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJnZXRDdXJyZW50UGFnZVNjcm9sbEJhcldpZHRoXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2dldGN1cnJlbnRwYWdlc2Nyb2xsYmFyd2lkdGgnKTtcbiAgICByZXR1cm4gZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCgpO1xuICB9LFxuICBzZXRTY3JvbGxhYmxlVGFyZ2V0czogZnVuY3Rpb24gc2V0U2Nyb2xsYWJsZVRhcmdldHModGFyZ2V0KSB7XG4gICAgdGhyb3dFcnJvcignXCJzZXRTY3JvbGxhYmxlVGFyZ2V0c1wiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImFkZFNjcm9sbGFibGVUYXJnZXRcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjYWRkc2Nyb2xsYWJsZXRhcmdldHNjcm9sbGFibGV0YXJnZXQnKTtcbiAgICBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCk7XG4gIH0sXG4gIHNldEZpbGxHYXBTZWxlY3RvcnM6IGZ1bmN0aW9uIHNldEZpbGxHYXBTZWxlY3RvcnMoc2VsZWN0b3IpIHtcbiAgICB0aHJvd0Vycm9yKCdcInNldEZpbGxHYXBTZWxlY3RvcnNcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJhZGRGaWxsR2FwU2VsZWN0b3JcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjYWRkZmlsbGdhcHNlbGVjdG9yZmlsbGdhcHNlbGVjdG9yJyk7XG4gICAgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfSxcbiAgc2V0RmlsbEdhcFRhcmdldHM6IGZ1bmN0aW9uIHNldEZpbGxHYXBUYXJnZXRzKHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1wic2V0RmlsbEdhcFRhcmdldHNcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJhZGRGaWxsR2FwVGFyZ2V0XCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2FkZGZpbGxnYXB0YXJnZXRmaWxsZ2FwdGFyZ2V0Jyk7XG4gICAgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFRhcmdldCh0YXJnZXQpO1xuICB9LFxuICBjbGVhclF1ZXVlOiBmdW5jdGlvbiBjbGVhclF1ZXVlKCkge1xuICAgIHRocm93RXJyb3IoJ1wiY2xlYXJRdWV1ZVwiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImNsZWFyUXVldWVTY3JvbGxMb2Nrc1wiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNjbGVhcnF1ZXVlc2Nyb2xsbG9ja3MnKTtcbiAgICBjbGVhclF1ZXVlU2Nyb2xsTG9ja3MoKTtcbiAgfVxufTtcblxudmFyIHNjcm9sbExvY2sgPSBfb2JqZWN0U3ByZWFkKHtcbiAgZGlzYWJsZVBhZ2VTY3JvbGw6IGRpc2FibGVQYWdlU2Nyb2xsLFxuICBlbmFibGVQYWdlU2Nyb2xsOiBlbmFibGVQYWdlU2Nyb2xsLFxuICBnZXRTY3JvbGxTdGF0ZTogZ2V0U2Nyb2xsU3RhdGUsXG4gIGNsZWFyUXVldWVTY3JvbGxMb2NrczogY2xlYXJRdWV1ZVNjcm9sbExvY2tzLFxuICBnZXRUYXJnZXRTY3JvbGxCYXJXaWR0aDogc2Nyb2xsX2xvY2tfZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGgsXG4gIGdldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aDogc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoLFxuICBnZXRQYWdlU2Nyb2xsQmFyV2lkdGg6IGdldFBhZ2VTY3JvbGxCYXJXaWR0aCxcbiAgZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aDogZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCxcbiAgYWRkU2Nyb2xsYWJsZVNlbGVjdG9yOiBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlU2VsZWN0b3IsXG4gIHJlbW92ZVNjcm9sbGFibGVTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yLFxuICBhZGRTY3JvbGxhYmxlVGFyZ2V0OiBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0LFxuICByZW1vdmVTY3JvbGxhYmxlVGFyZ2V0OiBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlVGFyZ2V0LFxuICBhZGRMb2NrYWJsZVNlbGVjdG9yOiBzY3JvbGxfbG9ja19hZGRMb2NrYWJsZVNlbGVjdG9yLFxuICBhZGRMb2NrYWJsZVRhcmdldDogc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVUYXJnZXQsXG4gIGFkZEZpbGxHYXBTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yLFxuICByZW1vdmVGaWxsR2FwU2VsZWN0b3I6IHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBTZWxlY3RvcixcbiAgYWRkRmlsbEdhcFRhcmdldDogc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFRhcmdldCxcbiAgcmVtb3ZlRmlsbEdhcFRhcmdldDogc2Nyb2xsX2xvY2tfcmVtb3ZlRmlsbEdhcFRhcmdldCxcbiAgc2V0RmlsbEdhcE1ldGhvZDogc2Nyb2xsX2xvY2tfc2V0RmlsbEdhcE1ldGhvZCxcbiAgcmVmaWxsR2FwczogcmVmaWxsR2FwcyxcbiAgX3N0YXRlOiBzdGF0ZVxufSwgZGVwcmVjYXRlZE1ldGhvZHMpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzY3JvbGxfbG9jayA9IF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHNjcm9sbExvY2spO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSlbXCJkZWZhdWx0XCJdO1xufSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSxRQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/scroll-lock/dist/scroll-lock.js\n");

/***/ }),

/***/ "./node_modules/unidragger/unidragger.js":
/*!***********************************************!*\
  !*** ./node_modules/unidragger/unidragger.js ***!
  \***********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Unidragger v2.3.1\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! unipointer/unipointer */ \"./node_modules/unipointer/unipointer.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Unipointer ) {\n      return factory( window, Unipointer );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n  this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n  // munge isAdd, default to true\n  isAdd = isAdd === undefined ? true : isAdd;\n  // bind each handle\n  var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n  var touchAction = isAdd ? this._touchActionValue : '';\n  for ( var i=0; i < this.handles.length; i++ ) {\n    var handle = this.handles[i];\n    this._bindStartEvent( handle, isAdd );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) {\n      handle.style.touchAction = touchAction;\n    }\n  }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  var isOkay = this.okayPointerDown( event );\n  if ( !isOkay ) {\n    return;\n  }\n  // track start event position\n  // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n\n  event.preventDefault();\n  this.pointerDownBlur();\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n  TEXTAREA: true,\n  INPUT: true,\n  SELECT: true,\n  OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n  radio: true,\n  checkbox: true,\n  button: true,\n  submit: true,\n  image: true,\n  file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n  var isCursorNode = cursorNodes[ event.target.nodeName ];\n  var isClickType = clickTypes[ event.target.type ];\n  var isOkay = !isCursorNode || isClickType;\n  if ( !isOkay ) {\n    this._pointerReset();\n  }\n  return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n  var focused = document.activeElement;\n  // do not blur body for IE10, metafizzy/flickity#117\n  var canBlur = focused && focused.blur && focused != document.body;\n  if ( canBlur ) {\n    focused.blur();\n  }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n  var moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY\n  };\n  // start drag if pointer has moved far enough to start drag\n  if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n    this._dragStart( event, pointer );\n  }\n  return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n  if ( this.isDragging ) {\n    this._dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this._staticClick( event, pointer );\n  }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  // prevent clicks\n  this.isPreventingClicks = true;\n  this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n  // do not drag if not dragging yet\n  if ( !this.isDragging ) {\n    return;\n  }\n\n  this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  event.preventDefault();\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n  // set flags\n  this.isDragging = false;\n  // re-enable clicking async\n  setTimeout( function() {\n    delete this.isPreventingClicks;\n  }.bind( this ) );\n\n  this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) {\n    event.preventDefault();\n  }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n    return;\n  }\n\n  this.staticClick( event, pointer );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( event.type != 'mouseup' ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 300ms\n    setTimeout( function() {\n      delete this.isIgnoringMouseUp;\n    }.bind( this ), 400 );\n  }\n};\n\nproto.staticClick = function( event, pointer ) {\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// -----  ----- //\n\nreturn Unidragger;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdW5pZHJhZ2dlci91bmlkcmFnZ2VyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy91bmlkcmFnZ2VyL3VuaWRyYWdnZXIuanM/ZWY2MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIFVuaWRyYWdnZXIgdjIuMy4xXG4gKiBEcmFnZ2FibGUgYmFzZSBjbGFzc1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bnVzZWQ6IHRydWUsIHVuZGVmOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ3VuaXBvaW50ZXIvdW5pcG9pbnRlcidcbiAgICBdLCBmdW5jdGlvbiggVW5pcG9pbnRlciApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIFVuaXBvaW50ZXIgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ3VuaXBvaW50ZXInKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuVW5pZHJhZ2dlciA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuVW5pcG9pbnRlclxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIFVuaXBvaW50ZXIgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVW5pZHJhZ2dlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBVbmlkcmFnZ2VyKCkge31cblxuLy8gaW5oZXJpdCBVbmlwb2ludGVyICYgRXZFbWl0dGVyXG52YXIgcHJvdG8gPSBVbmlkcmFnZ2VyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFVuaXBvaW50ZXIucHJvdG90eXBlICk7XG5cbi8vIC0tLS0tIGJpbmQgc3RhcnQgLS0tLS0gLy9cblxucHJvdG8uYmluZEhhbmRsZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fYmluZEhhbmRsZXMoIHRydWUgKTtcbn07XG5cbnByb3RvLnVuYmluZEhhbmRsZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fYmluZEhhbmRsZXMoIGZhbHNlICk7XG59O1xuXG4vKipcbiAqIEFkZCBvciByZW1vdmUgc3RhcnQgZXZlbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBZGRcbiAqL1xucHJvdG8uX2JpbmRIYW5kbGVzID0gZnVuY3Rpb24oIGlzQWRkICkge1xuICAvLyBtdW5nZSBpc0FkZCwgZGVmYXVsdCB0byB0cnVlXG4gIGlzQWRkID0gaXNBZGQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBpc0FkZDtcbiAgLy8gYmluZCBlYWNoIGhhbmRsZVxuICB2YXIgYmluZE1ldGhvZCA9IGlzQWRkID8gJ2FkZEV2ZW50TGlzdGVuZXInIDogJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuICB2YXIgdG91Y2hBY3Rpb24gPSBpc0FkZCA/IHRoaXMuX3RvdWNoQWN0aW9uVmFsdWUgOiAnJztcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRoaXMuaGFuZGxlcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgaGFuZGxlID0gdGhpcy5oYW5kbGVzW2ldO1xuICAgIHRoaXMuX2JpbmRTdGFydEV2ZW50KCBoYW5kbGUsIGlzQWRkICk7XG4gICAgaGFuZGxlWyBiaW5kTWV0aG9kIF0oICdjbGljaycsIHRoaXMgKTtcbiAgICAvLyB0b3VjaC1hY3Rpb246IG5vbmUgdG8gb3ZlcnJpZGUgYnJvd3NlciB0b3VjaCBnZXN0dXJlcy4gbWV0YWZpenp5L2ZsaWNraXR5IzU0MFxuICAgIGlmICggd2luZG93LlBvaW50ZXJFdmVudCApIHtcbiAgICAgIGhhbmRsZS5zdHlsZS50b3VjaEFjdGlvbiA9IHRvdWNoQWN0aW9uO1xuICAgIH1cbiAgfVxufTtcblxuLy8gcHJvdG90eXBlIHNvIGl0IGNhbiBiZSBvdmVyd3JpdGVhYmxlIGJ5IEZsaWNraXR5XG5wcm90by5fdG91Y2hBY3Rpb25WYWx1ZSA9ICdub25lJztcblxuLy8gLS0tLS0gc3RhcnQgZXZlbnQgLS0tLS0gLy9cblxuLyoqXG4gKiBwb2ludGVyIHN0YXJ0XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyRG93biA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIGlzT2theSA9IHRoaXMub2theVBvaW50ZXJEb3duKCBldmVudCApO1xuICBpZiAoICFpc09rYXkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHRyYWNrIHN0YXJ0IGV2ZW50IHBvc2l0aW9uXG4gIC8vIFNhZmFyaSA5IG92ZXJyaWRlcyBwYWdlWCBhbmQgcGFnZVkuIFRoZXNlIHZhbHVlcyBuZWVkcyB0byBiZSBjb3BpZWQuIGZsaWNraXR5Izg0MlxuICB0aGlzLnBvaW50ZXJEb3duUG9pbnRlciA9IHtcbiAgICBwYWdlWDogcG9pbnRlci5wYWdlWCxcbiAgICBwYWdlWTogcG9pbnRlci5wYWdlWSxcbiAgfTtcblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB0aGlzLnBvaW50ZXJEb3duQmx1cigpO1xuICAvLyBiaW5kIG1vdmUgYW5kIGVuZCBldmVudHNcbiAgdGhpcy5fYmluZFBvc3RTdGFydEV2ZW50cyggZXZlbnQgKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyRG93bicsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gbm9kZXMgdGhhdCBoYXZlIHRleHQgZmllbGRzXG52YXIgY3Vyc29yTm9kZXMgPSB7XG4gIFRFWFRBUkVBOiB0cnVlLFxuICBJTlBVVDogdHJ1ZSxcbiAgU0VMRUNUOiB0cnVlLFxuICBPUFRJT046IHRydWUsXG59O1xuXG4vLyBpbnB1dCB0eXBlcyB0aGF0IGRvIG5vdCBoYXZlIHRleHQgZmllbGRzXG52YXIgY2xpY2tUeXBlcyA9IHtcbiAgcmFkaW86IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBidXR0b246IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGZpbGU6IHRydWUsXG59O1xuXG4vLyBkaXNtaXNzIGlucHV0cyB3aXRoIHRleHQgZmllbGRzLiBmbGlja2l0eSM0MDMsIGZsaWNraXR5IzQwNFxucHJvdG8ub2theVBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgaXNDdXJzb3JOb2RlID0gY3Vyc29yTm9kZXNbIGV2ZW50LnRhcmdldC5ub2RlTmFtZSBdO1xuICB2YXIgaXNDbGlja1R5cGUgPSBjbGlja1R5cGVzWyBldmVudC50YXJnZXQudHlwZSBdO1xuICB2YXIgaXNPa2F5ID0gIWlzQ3Vyc29yTm9kZSB8fCBpc0NsaWNrVHlwZTtcbiAgaWYgKCAhaXNPa2F5ICkge1xuICAgIHRoaXMuX3BvaW50ZXJSZXNldCgpO1xuICB9XG4gIHJldHVybiBpc09rYXk7XG59O1xuXG4vLyBrbHVkZ2UgdG8gYmx1ciBwcmV2aW91c2x5IGZvY3VzZWQgaW5wdXRcbnByb3RvLnBvaW50ZXJEb3duQmx1ciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIC8vIGRvIG5vdCBibHVyIGJvZHkgZm9yIElFMTAsIG1ldGFmaXp6eS9mbGlja2l0eSMxMTdcbiAgdmFyIGNhbkJsdXIgPSBmb2N1c2VkICYmIGZvY3VzZWQuYmx1ciAmJiBmb2N1c2VkICE9IGRvY3VtZW50LmJvZHk7XG4gIGlmICggY2FuQmx1ciApIHtcbiAgICBmb2N1c2VkLmJsdXIoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gbW92ZSBldmVudCAtLS0tLSAvL1xuXG4vKipcbiAqIGRyYWcgbW92ZVxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqL1xucHJvdG8ucG9pbnRlck1vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHZhciBtb3ZlVmVjdG9yID0gdGhpcy5fZHJhZ1BvaW50ZXJNb3ZlKCBldmVudCwgcG9pbnRlciApO1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJNb3ZlJywgWyBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG4gIHRoaXMuX2RyYWdNb3ZlKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApO1xufTtcblxuLy8gYmFzZSBwb2ludGVyIG1vdmUgbG9naWNcbnByb3RvLl9kcmFnUG9pbnRlck1vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHZhciBtb3ZlVmVjdG9yID0ge1xuICAgIHg6IHBvaW50ZXIucGFnZVggLSB0aGlzLnBvaW50ZXJEb3duUG9pbnRlci5wYWdlWCxcbiAgICB5OiBwb2ludGVyLnBhZ2VZIC0gdGhpcy5wb2ludGVyRG93blBvaW50ZXIucGFnZVlcbiAgfTtcbiAgLy8gc3RhcnQgZHJhZyBpZiBwb2ludGVyIGhhcyBtb3ZlZCBmYXIgZW5vdWdoIHRvIHN0YXJ0IGRyYWdcbiAgaWYgKCAhdGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuaGFzRHJhZ1N0YXJ0ZWQoIG1vdmVWZWN0b3IgKSApIHtcbiAgICB0aGlzLl9kcmFnU3RhcnQoIGV2ZW50LCBwb2ludGVyICk7XG4gIH1cbiAgcmV0dXJuIG1vdmVWZWN0b3I7XG59O1xuXG4vLyBjb25kaXRpb24gaWYgcG9pbnRlciBoYXMgbW92ZWQgZmFyIGVub3VnaCB0byBzdGFydCBkcmFnXG5wcm90by5oYXNEcmFnU3RhcnRlZCA9IGZ1bmN0aW9uKCBtb3ZlVmVjdG9yICkge1xuICByZXR1cm4gTWF0aC5hYnMoIG1vdmVWZWN0b3IueCApID4gMyB8fCBNYXRoLmFicyggbW92ZVZlY3Rvci55ICkgPiAzO1xufTtcblxuLy8gLS0tLS0gZW5kIGV2ZW50IC0tLS0tIC8vXG5cbi8qKlxuICogcG9pbnRlciB1cFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqL1xucHJvdG8ucG9pbnRlclVwID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJVcCcsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xuICB0aGlzLl9kcmFnUG9pbnRlclVwKCBldmVudCwgcG9pbnRlciApO1xufTtcblxucHJvdG8uX2RyYWdQb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggdGhpcy5pc0RyYWdnaW5nICkge1xuICAgIHRoaXMuX2RyYWdFbmQoIGV2ZW50LCBwb2ludGVyICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcG9pbnRlciBkaWRuJ3QgbW92ZSBlbm91Z2ggZm9yIGRyYWcgdG8gc3RhcnRcbiAgICB0aGlzLl9zdGF0aWNDbGljayggZXZlbnQsIHBvaW50ZXIgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZHJhZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBkcmFnU3RhcnRcbnByb3RvLl9kcmFnU3RhcnQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gIC8vIHByZXZlbnQgY2xpY2tzXG4gIHRoaXMuaXNQcmV2ZW50aW5nQ2xpY2tzID0gdHJ1ZTtcbiAgdGhpcy5kcmFnU3RhcnQoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5kcmFnU3RhcnQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAnZHJhZ1N0YXJ0JywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyBkcmFnTW92ZVxucHJvdG8uX2RyYWdNb3ZlID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICkge1xuICAvLyBkbyBub3QgZHJhZyBpZiBub3QgZHJhZ2dpbmcgeWV0XG4gIGlmICggIXRoaXMuaXNEcmFnZ2luZyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmRyYWdNb3ZlKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApO1xufTtcblxucHJvdG8uZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHRoaXMuZW1pdEV2ZW50KCAnZHJhZ01vdmUnLCBbIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yIF0gKTtcbn07XG5cbi8vIGRyYWdFbmRcbnByb3RvLl9kcmFnRW5kID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBzZXQgZmxhZ3NcbiAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gIC8vIHJlLWVuYWJsZSBjbGlja2luZyBhc3luY1xuICBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICBkZWxldGUgdGhpcy5pc1ByZXZlbnRpbmdDbGlja3M7XG4gIH0uYmluZCggdGhpcyApICk7XG5cbiAgdGhpcy5kcmFnRW5kKCBldmVudCwgcG9pbnRlciApO1xufTtcblxucHJvdG8uZHJhZ0VuZCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdkcmFnRW5kJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSBvbmNsaWNrIC0tLS0tIC8vXG5cbi8vIGhhbmRsZSBhbGwgY2xpY2tzIGFuZCBwcmV2ZW50IGNsaWNrcyB3aGVuIGRyYWdnaW5nXG5wcm90by5vbmNsaWNrID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICBpZiAoIHRoaXMuaXNQcmV2ZW50aW5nQ2xpY2tzICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIHN0YXRpY0NsaWNrIC0tLS0tIC8vXG5cbi8vIHRyaWdnZXJlZCBhZnRlciBwb2ludGVyIGRvd24gJiB1cCB3aXRoIG5vL3RpbnkgbW92ZW1lbnRcbnByb3RvLl9zdGF0aWNDbGljayA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgLy8gaWdub3JlIGVtdWxhdGVkIG1vdXNlIHVwIGNsaWNrc1xuICBpZiAoIHRoaXMuaXNJZ25vcmluZ01vdXNlVXAgJiYgZXZlbnQudHlwZSA9PSAnbW91c2V1cCcgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5zdGF0aWNDbGljayggZXZlbnQsIHBvaW50ZXIgKTtcblxuICAvLyBzZXQgZmxhZyBmb3IgZW11bGF0ZWQgY2xpY2tzIDMwMG1zIGFmdGVyIHRvdWNoZW5kXG4gIGlmICggZXZlbnQudHlwZSAhPSAnbW91c2V1cCcgKSB7XG4gICAgdGhpcy5pc0lnbm9yaW5nTW91c2VVcCA9IHRydWU7XG4gICAgLy8gcmVzZXQgZmxhZyBhZnRlciAzMDBtc1xuICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgZGVsZXRlIHRoaXMuaXNJZ25vcmluZ01vdXNlVXA7XG4gICAgfS5iaW5kKCB0aGlzICksIDQwMCApO1xuICB9XG59O1xuXG5wcm90by5zdGF0aWNDbGljayA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdzdGF0aWNDbGljaycsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xufTtcblxuLy8gLS0tLS0gdXRpbHMgLS0tLS0gLy9cblxuVW5pZHJhZ2dlci5nZXRQb2ludGVyUG9pbnQgPSBVbmlwb2ludGVyLmdldFBvaW50ZXJQb2ludDtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBVbmlkcmFnZ2VyO1xuXG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxXQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/unidragger/unidragger.js\n");

/***/ }),

/***/ "./node_modules/unipointer/unipointer.js":
/*!***********************************************!*\
  !*** ./node_modules/unipointer/unipointer.js ***!
  \***********************************************/
/***/ ((module, exports, __webpack_require__) => {

eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Unipointer v2.3.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*global define, module, require */\n  if ( true ) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n      __webpack_require__(/*! ev-emitter/ev-emitter */ \"./node_modules/ev-emitter/ev-emitter.js\")\n    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter ) {\n      return factory( window, EvEmitter );\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {}\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n  // munge isAdd, default to true\n  isAdd = isAdd === undefined ? true : isAdd;\n  var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n  // default to mouse events\n  var startEvent = 'mousedown';\n  if ( window.PointerEvent ) {\n    // Pointer Events\n    startEvent = 'pointerdown';\n  } else if ( 'ontouchstart' in window ) {\n    // Touch Events. iOS Safari\n    startEvent = 'touchstart';\n  }\n  elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n  for ( var i=0; i < touches.length; i++ ) {\n    var touch = touches[i];\n    if ( touch.identifier == this.pointerIdentifier ) {\n      return touch;\n    }\n  }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  // dismiss clicks from right or middle buttons\n  var button = event.button;\n  if ( button && ( button !== 0 && button !== 1 ) ) {\n    return;\n  }\n  this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n  // dismiss right click and other pointers\n  // button = 0 is okay, 1-4 not\n  if ( event.button || this.isPointerDown ) {\n    return;\n  }\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n\n  this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n  mousedown: [ 'mousemove', 'mouseup' ],\n  touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n  pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n  if ( !event ) {\n    return;\n  }\n  // get proper events to match start event\n  var events = postStartEvents[ event.type ];\n  // bind events to node\n  events.forEach( function( eventName ) {\n    window.addEventListener( eventName, this );\n  }, this );\n  // save these arguments\n  this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n  // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n  if ( !this._boundPointerEvents ) {\n    return;\n  }\n  this._boundPointerEvents.forEach( function( eventName ) {\n    window.removeEventListener( eventName, this );\n  }, this );\n\n  delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n  this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerMove( event, event );\n  }\n};\n\nproto.ontouchmove = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerMove( event, touch );\n  }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n  this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n  this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n  this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerUp( event, event );\n  }\n};\n\nproto.ontouchend = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerUp( event, touch );\n  }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n  this._pointerReset();\n  this._unbindPostStartEvents();\n  this.pointerDone();\n};\n\nproto._pointerReset = function() {\n  // reset properties\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerCancel( event, event );\n  }\n};\n\nproto.ontouchcancel = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerCancel( event, touch );\n  }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// -----  ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n  return {\n    x: pointer.pageX,\n    y: pointer.pageY\n  };\n};\n\n// -----  ----- //\n\nreturn Unipointer;\n\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdW5pcG9pbnRlci91bmlwb2ludGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZC8uL25vZGVfbW9kdWxlcy91bmlwb2ludGVyL3VuaXBvaW50ZXIuanM/ZTBmNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIFVuaXBvaW50ZXIgdjIuMy4wXG4gKiBiYXNlIGNsYXNzIGZvciBkb2luZyBvbmUgdGhpbmcgd2l0aCBwb2ludGVyIGV2ZW50XG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qanNoaW50IGJyb3dzZXI6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUsIHN0cmljdDogdHJ1ZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbCBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcidcbiAgICBdLCBmdW5jdGlvbiggRXZFbWl0dGVyICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LlVuaXBvaW50ZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkV2RW1pdHRlclxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gVW5pcG9pbnRlcigpIHt9XG5cbi8vIGluaGVyaXQgRXZFbWl0dGVyXG52YXIgcHJvdG8gPSBVbmlwb2ludGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxucHJvdG8uYmluZFN0YXJ0RXZlbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGVsZW0sIHRydWUgKTtcbn07XG5cbnByb3RvLnVuYmluZFN0YXJ0RXZlbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGVsZW0sIGZhbHNlICk7XG59O1xuXG4vKipcbiAqIEFkZCBvciByZW1vdmUgc3RhcnQgZXZlbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBZGQgLSByZW1vdmUgaWYgZmFsc2V5XG4gKi9cbnByb3RvLl9iaW5kU3RhcnRFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCBpc0FkZCApIHtcbiAgLy8gbXVuZ2UgaXNBZGQsIGRlZmF1bHQgdG8gdHJ1ZVxuICBpc0FkZCA9IGlzQWRkID09PSB1bmRlZmluZWQgPyB0cnVlIDogaXNBZGQ7XG4gIHZhciBiaW5kTWV0aG9kID0gaXNBZGQgPyAnYWRkRXZlbnRMaXN0ZW5lcicgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG5cbiAgLy8gZGVmYXVsdCB0byBtb3VzZSBldmVudHNcbiAgdmFyIHN0YXJ0RXZlbnQgPSAnbW91c2Vkb3duJztcbiAgaWYgKCB3aW5kb3cuUG9pbnRlckV2ZW50ICkge1xuICAgIC8vIFBvaW50ZXIgRXZlbnRzXG4gICAgc3RhcnRFdmVudCA9ICdwb2ludGVyZG93bic7XG4gIH0gZWxzZSBpZiAoICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyApIHtcbiAgICAvLyBUb3VjaCBFdmVudHMuIGlPUyBTYWZhcmlcbiAgICBzdGFydEV2ZW50ID0gJ3RvdWNoc3RhcnQnO1xuICB9XG4gIGVsZW1bIGJpbmRNZXRob2QgXSggc3RhcnRFdmVudCwgdGhpcyApO1xufTtcblxuLy8gdHJpZ2dlciBoYW5kbGVyIG1ldGhvZHMgZm9yIGV2ZW50c1xucHJvdG8uaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gcmV0dXJucyB0aGUgdG91Y2ggdGhhdCB3ZSdyZSBrZWVwaW5nIHRyYWNrIG9mXG5wcm90by5nZXRUb3VjaCA9IGZ1bmN0aW9uKCB0b3VjaGVzICkge1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgdG91Y2ggPSB0b3VjaGVzW2ldO1xuICAgIGlmICggdG91Y2guaWRlbnRpZmllciA9PSB0aGlzLnBvaW50ZXJJZGVudGlmaWVyICkge1xuICAgICAgcmV0dXJuIHRvdWNoO1xuICAgIH1cbiAgfVxufTtcblxuLy8gLS0tLS0gc3RhcnQgZXZlbnQgLS0tLS0gLy9cblxucHJvdG8ub25tb3VzZWRvd24gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIC8vIGRpc21pc3MgY2xpY2tzIGZyb20gcmlnaHQgb3IgbWlkZGxlIGJ1dHRvbnNcbiAgdmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcbiAgaWYgKCBidXR0b24gJiYgKCBidXR0b24gIT09IDAgJiYgYnV0dG9uICE9PSAxICkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuX3BvaW50ZXJEb3duKCBldmVudCwgZXZlbnQgKTtcbn07XG5cbnByb3RvLm9udG91Y2hzdGFydCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlckRvd24oIGV2ZW50LCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSApO1xufTtcblxucHJvdG8ub25wb2ludGVyZG93biA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlckRvd24oIGV2ZW50LCBldmVudCApO1xufTtcblxuLyoqXG4gKiBwb2ludGVyIHN0YXJ0XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5fcG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIGRpc21pc3MgcmlnaHQgY2xpY2sgYW5kIG90aGVyIHBvaW50ZXJzXG4gIC8vIGJ1dHRvbiA9IDAgaXMgb2theSwgMS00IG5vdFxuICBpZiAoIGV2ZW50LmJ1dHRvbiB8fCB0aGlzLmlzUG9pbnRlckRvd24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5pc1BvaW50ZXJEb3duID0gdHJ1ZTtcbiAgLy8gc2F2ZSBwb2ludGVyIGlkZW50aWZpZXIgdG8gbWF0Y2ggdXAgdG91Y2ggZXZlbnRzXG4gIHRoaXMucG9pbnRlcklkZW50aWZpZXIgPSBwb2ludGVyLnBvaW50ZXJJZCAhPT0gdW5kZWZpbmVkID9cbiAgICAvLyBwb2ludGVySWQgZm9yIHBvaW50ZXIgZXZlbnRzLCB0b3VjaC5pbmRlbnRpZmllciBmb3IgdG91Y2ggZXZlbnRzXG4gICAgcG9pbnRlci5wb2ludGVySWQgOiBwb2ludGVyLmlkZW50aWZpZXI7XG5cbiAgdGhpcy5wb2ludGVyRG93biggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLnBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJEb3duJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyBoYXNoIG9mIGV2ZW50cyB0byBiZSBib3VuZCBhZnRlciBzdGFydCBldmVudFxudmFyIHBvc3RTdGFydEV2ZW50cyA9IHtcbiAgbW91c2Vkb3duOiBbICdtb3VzZW1vdmUnLCAnbW91c2V1cCcgXSxcbiAgdG91Y2hzdGFydDogWyAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJywgJ3RvdWNoY2FuY2VsJyBdLFxuICBwb2ludGVyZG93bjogWyAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJywgJ3BvaW50ZXJjYW5jZWwnIF0sXG59O1xuXG5wcm90by5fYmluZFBvc3RTdGFydEV2ZW50cyA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCAhZXZlbnQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGdldCBwcm9wZXIgZXZlbnRzIHRvIG1hdGNoIHN0YXJ0IGV2ZW50XG4gIHZhciBldmVudHMgPSBwb3N0U3RhcnRFdmVudHNbIGV2ZW50LnR5cGUgXTtcbiAgLy8gYmluZCBldmVudHMgdG8gbm9kZVxuICBldmVudHMuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50TmFtZSApIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCB0aGlzICk7XG4gIH0sIHRoaXMgKTtcbiAgLy8gc2F2ZSB0aGVzZSBhcmd1bWVudHNcbiAgdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzID0gZXZlbnRzO1xufTtcblxucHJvdG8uX3VuYmluZFBvc3RTdGFydEV2ZW50cyA9IGZ1bmN0aW9uKCkge1xuICAvLyBjaGVjayBmb3IgX2JvdW5kRXZlbnRzLCBpbiBjYXNlIGRyYWdFbmQgdHJpZ2dlcmVkIHR3aWNlIChvbGQgSUU4IGJ1ZylcbiAgaWYgKCAhdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9ib3VuZFBvaW50ZXJFdmVudHMuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50TmFtZSApIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCB0aGlzICk7XG4gIH0sIHRoaXMgKTtcblxuICBkZWxldGUgdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzO1xufTtcblxuLy8gLS0tLS0gbW92ZSBldmVudCAtLS0tLSAvL1xuXG5wcm90by5vbm1vdXNlbW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlck1vdmUoIGV2ZW50LCBldmVudCApO1xufTtcblxucHJvdG8ub25wb2ludGVybW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5wb2ludGVySWQgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICB0aGlzLl9wb2ludGVyTW92ZSggZXZlbnQsIGV2ZW50ICk7XG4gIH1cbn07XG5cbnByb3RvLm9udG91Y2htb3ZlID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJNb3ZlKCBldmVudCwgdG91Y2ggKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwb2ludGVyIG1vdmVcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50IG9yIFRvdWNofSBwb2ludGVyXG4gKiBAcHJpdmF0ZVxuICovXG5wcm90by5fcG9pbnRlck1vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMucG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG4vLyBwdWJsaWNcbnByb3RvLnBvaW50ZXJNb3ZlID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJNb3ZlJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSBlbmQgZXZlbnQgLS0tLS0gLy9cblxuXG5wcm90by5vbm1vdXNldXAgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJVcCggZXZlbnQsIGV2ZW50ICk7XG59O1xuXG5wcm90by5vbnBvaW50ZXJ1cCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5wb2ludGVySWQgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICB0aGlzLl9wb2ludGVyVXAoIGV2ZW50LCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5vbnRvdWNoZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJVcCggZXZlbnQsIHRvdWNoICk7XG4gIH1cbn07XG5cbi8qKlxuICogcG9pbnRlciB1cFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqIEBwcml2YXRlXG4gKi9cbnByb3RvLl9wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb25lKCk7XG4gIHRoaXMucG9pbnRlclVwKCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gcHVibGljXG5wcm90by5wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlclVwJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSBwb2ludGVyIGRvbmUgLS0tLS0gLy9cblxuLy8gdHJpZ2dlcmVkIG9uIHBvaW50ZXIgdXAgJiBwb2ludGVyIGNhbmNlbFxucHJvdG8uX3BvaW50ZXJEb25lID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3BvaW50ZXJSZXNldCgpO1xuICB0aGlzLl91bmJpbmRQb3N0U3RhcnRFdmVudHMoKTtcbiAgdGhpcy5wb2ludGVyRG9uZSgpO1xufTtcblxucHJvdG8uX3BvaW50ZXJSZXNldCA9IGZ1bmN0aW9uKCkge1xuICAvLyByZXNldCBwcm9wZXJ0aWVzXG4gIHRoaXMuaXNQb2ludGVyRG93biA9IGZhbHNlO1xuICBkZWxldGUgdGhpcy5wb2ludGVySWRlbnRpZmllcjtcbn07XG5cbnByb3RvLnBvaW50ZXJEb25lID0gbm9vcDtcblxuLy8gLS0tLS0gcG9pbnRlciBjYW5jZWwgLS0tLS0gLy9cblxucHJvdG8ub25wb2ludGVyY2FuY2VsID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50LnBvaW50ZXJJZCA9PSB0aGlzLnBvaW50ZXJJZGVudGlmaWVyICkge1xuICAgIHRoaXMuX3BvaW50ZXJDYW5jZWwoIGV2ZW50LCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5vbnRvdWNoY2FuY2VsID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJDYW5jZWwoIGV2ZW50LCB0b3VjaCApO1xuICB9XG59O1xuXG4vKipcbiAqIHBvaW50ZXIgY2FuY2VsXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICogQHByaXZhdGVcbiAqL1xucHJvdG8uX3BvaW50ZXJDYW5jZWwgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb25lKCk7XG4gIHRoaXMucG9pbnRlckNhbmNlbCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbi8vIHB1YmxpY1xucHJvdG8ucG9pbnRlckNhbmNlbCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyQ2FuY2VsJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuLy8gdXRpbGl0eSBmdW5jdGlvbiBmb3IgZ2V0dGluZyB4L3kgY29vcmRzIGZyb20gZXZlbnRcblVuaXBvaW50ZXIuZ2V0UG9pbnRlclBvaW50ID0gZnVuY3Rpb24oIHBvaW50ZXIgKSB7XG4gIHJldHVybiB7XG4gICAgeDogcG9pbnRlci5wYWdlWCxcbiAgICB5OiBwb2ludGVyLnBhZ2VZXG4gIH07XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIFVuaXBvaW50ZXI7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSxXQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/unipointer/unipointer.js\n");

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		if(__webpack_module_cache__[moduleId]) {
/******/ 			return __webpack_module_cache__[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/compat get default export */
/******/ 	(() => {
/******/ 		// getDefaultExport function for compatibility with non-harmony modules
/******/ 		__webpack_require__.n = (module) => {
/******/ 			var getter = module && module.__esModule ?
/******/ 				() => (module['default']) :
/******/ 				() => (module);
/******/ 			__webpack_require__.d(getter, { a: getter });
/******/ 			return getter;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/global */
/******/ 	(() => {
/******/ 		__webpack_require__.g = (function() {
/******/ 			if (typeof globalThis === 'object') return globalThis;
/******/ 			try {
/******/ 				return this || new Function('return this')();
/******/ 			} catch (e) {
/******/ 				if (typeof window === 'object') return window;
/******/ 			}
/******/ 		})();
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/************************************************************************/
/******/ 	// startup
/******/ 	// Load entry module
/******/ 	__webpack_require__("./source/scripts/grid.js");
/******/ 	// This entry module used 'exports' so it can't be inlined
/******/ })()
;