PageSourceSearch

https://www.zingaro.fr/wp-content/themes/yagami-adveris/web/dist/js/app.js

js zingaro.fr collected 2026-10-02 20:38:41 UTC 1,083,271 bytes, 26,510 lines download raw bytes

vendor: 3,594 bytes, lines 1-88
1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// The module cache
3/******/ 	var installedModules = {};
4/******/
5/******/ 	// The require function
6/******/ 	function __webpack_require__(moduleId) {
7/******/
8/******/ 		// Check if module is in cache
9/******/ 		if(installedModules[moduleId]) {
10/******/ 			return installedModules[moduleId].exports;
11/******/ 		}
12/******/ 		// Create a new module (and put it into the cache)
13/******/ 		var module = installedModules[moduleId] = {
14/******/ 			i: moduleId,
15/******/ 			l: false,
16/******/ 			exports: {}
17/******/ 		};
18/******/
19/******/ 		// Execute the module function
20/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21/******/
22/******/ 		// Flag the module as loaded
23/******/ 		module.l = true;
24/******/
25/******/ 		// Return the exports of the module
26/******/ 		return module.exports;
27/******/ 	}
28/******/
29/******/
30/******/ 	// expose the modules object (__webpack_modules__)
31/******/ 	__webpack_require__.m = modules;
32/******/
33/******/ 	// expose the module cache
34/******/ 	__webpack_require__.c = installedModules;
35/******/
36/******/ 	// define getter function for harmony exports
37/******/ 	__webpack_require__.d = function(exports, name, getter) {
38/******/ 		if(!__webpack_require__.o(exports, name)) {
39/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
40/******/ 		}
41/******/ 	};
42/******/
43/******/ 	// define __esModule on exports
44/******/ 	__webpack_require__.r = function(exports) {
45/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
47/******/ 		}
48/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
49/******/ 	};
50/******/
51/******/ 	// create a fake namespace object
52/******/ 	// mode & 1: value is a module id, require it
53/******/ 	// mode & 2: merge all properties of value into the ns
54/******/ 	// mode & 4: return value when already ns object
55/******/ 	// mode & 8|1: behave like require
56/******/ 	__webpack_require__.t = function(value, mode) {
57/******/ 		if(mode & 1) value = __webpack_require__(value);
58/******/ 		if(mode & 8) return value;
59/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60/******/ 		var ns = Object.create(null);
61/******/ 		__webpack_require__.r(ns);
62/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
64/******/ 		return ns;
65/******/ 	};
66/******/
67/******/ 	// getDefaultExport function for compatibility with non-harmony modules
68/******/ 	__webpack_require__.n = function(module) {
69/******/ 		var getter = module && module.__esModule ?
70/******/ 			function getDefault() { return module['default']; } :
71/******/ 			function getModuleExports() { return module; };
72/******/ 		__webpack_require__.d(getter, 'a', getter);
73/******/ 		return getter;
74/******/ 	};
75/******/
76/******/ 	// Object.prototype.hasOwnProperty.call
77/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
78/******/
79/******/ 	// __webpack_public_path__
80/******/ 	__webpack_require__.p = "";
81/******/
82/******/
83/******/ 	// Load entry module and return exports
84/******/ 	return __webpack_require__(__webpack_require__.s = 0);
85/******/ })
86/************************************************************************/
87/******/ ({
88
vendor: 69,943 bytes, lines 89-1488
89/***/ "./node_modules/gsap/CSSPlugin.js":
90/*!****************************************!*\
91  !*** ./node_modules/gsap/CSSPlugin.js ***!
92  \****************************************/
93/*! exports provided: CSSPlugin, default, _getBBox, _createElement, checkPrefix */
94/***/ (function(module, __webpack_exports__, __webpack_require__) {
95
96"use strict";
97__webpack_require__.r(__webpack_exports__);
98/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CSSPlugin", function() { return CSSPlugin; });
99/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CSSPlugin; });
100/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getBBox", function() { return _getBBox; });
101/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_createElement", function() { return _createElement; });
102/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkPrefix", function() { return _checkPropPrefix; });
103/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/gsap/gsap-core.js");
104/*** IMPORTS FROM imports-loader ***/
105var define = false;
106
107/*!
108 * CSSPlugin 3.12.7
109 * https://gsap.com
110 *
111 * Copyright 2008-2025, GreenSock. All rights reserved.
112 * Subject to the terms at https://gsap.com/standard-license or for
113 * Club GSAP members, the agreement issued with that membership.
114 * @author: Jack Doyle, [email protected]
115*/
116
117/* eslint-disable */
118
119var _win,
120  _doc,
121  _docElement,
122  _pluginInitted,
123  _tempDiv,
124  _tempDivStyler,
125  _recentSetterPlugin,
126  _reverting,
127  _windowExists = function _windowExists() {
128    return typeof window !== "undefined";
129  },
130  _transformProps = {},
131  _RAD2DEG = 180 / Math.PI,
132  _DEG2RAD = Math.PI / 180,
133  _atan2 = Math.atan2,
134  _bigNum = 1e8,
135  _capsExp = /([A-Z])/g,
136  _horizontalExp = /(left|right|width|margin|padding|x)/i,
137  _complexExp = /[\s,\(]\S/,
138  _propertyAliases = {
139    autoAlpha: "opacity,visibility",
140    scale: "scaleX,scaleY",
141    alpha: "opacity"
142  },
143  _renderCSSProp = function _renderCSSProp(ratio, data) {
144    return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);
145  },
146  _renderPropWithEnd = function _renderPropWithEnd(ratio, data) {
147    return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);
148  },
149  _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) {
150    return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);
151  },
152  //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)
153  _renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) {
154    var value = data.s + data.c * ratio;
155    data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);
156  },
157  _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) {
158    return data.set(data.t, data.p, ratio ? data.e : data.b, data);
159  },
160  _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) {
161    return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data);
162  },
163  _setterCSSStyle = function _setterCSSStyle(target, property, value) {
164    return target.style[property] = value;
165  },
166  _setterCSSProp = function _setterCSSProp(target, property, value) {
167    return target.style.setProperty(property, value);
168  },
169  _setterTransform = function _setterTransform(target, property, value) {
170    return target._gsap[property] = value;
171  },
172  _setterScale = function _setterScale(target, property, value) {
173    return target._gsap.scaleX = target._gsap.scaleY = value;
174  },
175  _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) {
176    var cache = target._gsap;
177    cache.scaleX = cache.scaleY = value;
178    cache.renderTransform(ratio, cache);
179  },
180  _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) {
181    var cache = target._gsap;
182    cache[property] = value;
183    cache.renderTransform(ratio, cache);
184  },
185  _transformProp = "transform",
186  _transformOriginProp = _transformProp + "Origin",
187  _saveStyle = function _saveStyle(property, isNotCSS) {
188    var _this = this;
189    var target = this.target,
190      style = target.style,
191      cache = target._gsap;
192    if (property in _transformProps && style) {
193      this.tfm = this.tfm || {};
194      if (property !== "transform") {
195        property = _propertyAliases[property] || property;
196        ~property.indexOf(",") ? property.split(",").forEach(function (a) {
197          return _this.tfm[a] = _get(target, a);
198        }) : this.tfm[property] = cache.x ? cache[property] : _get(target, property); // note: scale would map to "scaleX,scaleY", thus we loop and apply them both.
199
200        property === _transformOriginProp && (this.tfm.zOrigin = cache.zOrigin);
201      } else {
202        return _propertyAliases.transform.split(",").forEach(function (p) {
203          return _saveStyle.call(_this, p, isNotCSS);
204        });
205      }
206      if (this.props.indexOf(_transformProp) >= 0) {
207        return;
208      }
209      if (cache.svg) {
210        this.svgo = target.getAttribute("data-svg-origin");
211        this.props.push(_transformOriginProp, isNotCSS, "");
212      }
213      property = _transformProp;
214    }
215    (style || isNotCSS) && this.props.push(property, isNotCSS, style[property]);
216  },
217  _removeIndependentTransforms = function _removeIndependentTransforms(style) {
218    if (style.translate) {
219      style.removeProperty("translate");
220      style.removeProperty("scale");
221      style.removeProperty("rotate");
222    }
223  },
224  _revertStyle = function _revertStyle() {
225    var props = this.props,
226      target = this.target,
227      style = target.style,
228      cache = target._gsap,
229      i,
230      p;
231    for (i = 0; i < props.length; i += 3) {
232      // stored like this: property, isNotCSS, value
233      if (!props[i + 1]) {
234        props[i + 2] ? style[props[i]] = props[i + 2] : style.removeProperty(props[i].substr(0, 2) === "--" ? props[i] : props[i].replace(_capsExp, "-$1").toLowerCase());
235      } else if (props[i + 1] === 2) {
236        // non-CSS value (function-based)
237        target[props[i]](props[i + 2]);
238      } else {
239        // non-CSS value (not function-based)
240        target[props[i]] = props[i + 2];
241      }
242    }
243    if (this.tfm) {
244      for (p in this.tfm) {
245        cache[p] = this.tfm[p];
246      }
247      if (cache.svg) {
248        cache.renderTransform();
249        target.setAttribute("data-svg-origin", this.svgo || "");
250      }
251      i = _reverting();
252      if ((!i || !i.isStart) && !style[_transformProp]) {
253        _removeIndependentTransforms(style);
254        if (cache.zOrigin && style[_transformOriginProp]) {
255          style[_transformOriginProp] += " " + cache.zOrigin + "px"; // since we're uncaching, we must put the zOrigin back into the transformOrigin so that we can pull it out accurately when we parse again. Otherwise, we'd lose the z portion of the origin since we extract it to protect from Safari bugs.
256
257          cache.zOrigin = 0;
258          cache.renderTransform();
259        }
260        cache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization.
261      }
262    }
263  },
264  _getStyleSaver = function _getStyleSaver(target, properties) {
265    var saver = {
266      target: target,
267      props: [],
268      revert: _revertStyle,
269      save: _saveStyle
270    };
271    target._gsap || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].core.getCache(target); // just make sure there's a _gsap cache defined because we read from it in _saveStyle() and it's more efficient to just check it here once.
272
273    properties && target.style && target.nodeType && properties.split(",").forEach(function (p) {
274      return saver.save(p);
275    }); // make sure it's a DOM node too.
276
277    return saver;
278  },
279  _supports3D,
280  _createElement = function _createElement(type, ns) {
281    var e = _doc.createElementNS ? _doc.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making "style" inaccessible.
282
283    return e && e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://gsap.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).
284  },
285  _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) {
286    var cs = getComputedStyle(target);
287    return cs[property] || cs.getPropertyValue(property.replace(_capsExp, "-$1").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || ""; //css variables may not need caps swapped out for dashes and lowercase.
288  },
289  _prefixes = "O,Moz,ms,Ms,Webkit".split(","),
290  _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) {
291    var e = element || _tempDiv,
292      s = e.style,
293      i = 5;
294    if (property in s && !preferPrefix) {
295      return property;
296    }
297    property = property.charAt(0).toUpperCase() + property.substr(1);
298    while (i-- && !(_prefixes[i] + property in s)) {}
299    return i < 0 ? null : (i === 3 ? "ms" : i >= 0 ? _prefixes[i] : "") + property;
300  },
301  _initCore = function _initCore() {
302    if (_windowExists() && window.document) {
303      _win = window;
304      _doc = _win.document;
305      _docElement = _doc.documentElement;
306      _tempDiv = _createElement("div") || {
307        style: {}
308      };
309      _tempDivStyler = _createElement("div");
310      _transformProp = _checkPropPrefix(_transformProp);
311      _transformOriginProp = _transformProp + "Origin";
312      _tempDiv.style.cssText = "border-width:0;line-height:0;position:absolute;padding:0"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets.
313
314      _supports3D = !!_checkPropPrefix("perspective");
315      _reverting = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].core.reverting;
316      _pluginInitted = 1;
317    }
318  },
319  _getReparentedCloneBBox = function _getReparentedCloneBBox(target) {
320    //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).
321    var owner = target.ownerSVGElement,
322      svg = _createElement("svg", owner && owner.getAttribute("xmlns") || "http://www.w3.org/2000/svg"),
323      clone = target.cloneNode(true),
324      bbox;
325    clone.style.display = "block";
326    svg.appendChild(clone);
327    _docElement.appendChild(svg);
328    try {
329      bbox = clone.getBBox();
330    } catch (e) {}
331    svg.removeChild(clone);
332    _docElement.removeChild(svg);
333    return bbox;
334  },
335  _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) {
336    var i = attributesArray.length;
337    while (i--) {
338      if (target.hasAttribute(attributesArray[i])) {
339        return target.getAttribute(attributesArray[i]);
340      }
341    }
342  },
343  _getBBox = function _getBBox(target) {
344    var bounds, cloned;
345    try {
346      bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118
347    } catch (error) {
348      bounds = _getReparentedCloneBBox(target);
349      cloned = 1;
350    }
351    bounds && (bounds.width || bounds.height) || cloned || (bounds = _getReparentedCloneBBox(target)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.
352
353    return bounds && !bounds.width && !bounds.x && !bounds.y ? {
354      x: +_getAttributeFallbacks(target, ["x", "cx", "x1"]) || 0,
355      y: +_getAttributeFallbacks(target, ["y", "cy", "y1"]) || 0,
356      width: 0,
357      height: 0
358    } : bounds;
359  },
360  _isSVG = function _isSVG(e) {
361    return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));
362  },
363  //reports if the element is an SVG on which getBBox() actually works
364  _removeProperty = function _removeProperty(target, property) {
365    if (property) {
366      var style = target.style,
367        first2Chars;
368      if (property in _transformProps && property !== _transformOriginProp) {
369        property = _transformProp;
370      }
371      if (style.removeProperty) {
372        first2Chars = property.substr(0, 2);
373        if (first2Chars === "ms" || property.substr(0, 6) === "webkit") {
374          //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example)
375          property = "-" + property;
376        }
377        style.removeProperty(first2Chars === "--" ? property : property.replace(_capsExp, "-$1").toLowerCase());
378      } else {
379        //note: old versions of IE use "removeAttribute()" instead of "removeProperty()"
380        style.removeAttribute(property);
381      }
382    }
383  },
384  _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) {
385    var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);
386    plugin._pt = pt;
387    pt.b = beginning;
388    pt.e = end;
389    plugin._props.push(property);
390    return pt;
391  },
392  _nonConvertibleUnits = {
393    deg: 1,
394    rad: 1,
395    turn: 1
396  },
397  _nonStandardLayouts = {
398    grid: 1,
399    flex: 1
400  },
401  //takes a single value like 20px and converts it to the unit specified, like "%", returning only the numeric amount.
402  _convertToUnit = function _convertToUnit(target, property, value, unit) {
403    var curValue = parseFloat(value) || 0,
404      curUnit = (value + "").trim().substr((curValue + "").length) || "px",
405      // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim()
406      style = _tempDiv.style,
407      horizontal = _horizontalExp.test(property),
408      isRootSVG = target.tagName.toLowerCase() === "svg",
409      measureProperty = (isRootSVG ? "client" : "offset") + (horizontal ? "Width" : "Height"),
410      amount = 100,
411      toPixels = unit === "px",
412      toPercent = unit === "%",
413      px,
414      parent,
415      cache,
416      isSVG;
417    if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {
418      return curValue;
419    }
420    curUnit !== "px" && !toPixels && (curValue = _convertToUnit(target, property, value, "px"));
421    isSVG = target.getCTM && _isSVG(target);
422    if ((toPercent || curUnit === "%") && (_transformProps[property] || ~property.indexOf("adius"))) {
423      px = isSVG ? target.getBBox()[horizontal ? "width" : "height"] : target[measureProperty];
424      return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(toPercent ? curValue / px * amount : curValue / 100 * px);
425    }
426    style[horizontal ? "width" : "height"] = amount + (toPixels ? curUnit : unit);
427    parent = unit !== "rem" && ~property.indexOf("adius") || unit === "em" && target.appendChild && !isRootSVG ? target : target.parentNode;
428    if (isSVG) {
429      parent = (target.ownerSVGElement || {}).parentNode;
430    }
431    if (!parent || parent === _doc || !parent.appendChild) {
432      parent = _doc.body;
433    }
434    cache = parent._gsap;
435    if (cache && toPercent && cache.width && horizontal && cache.time === _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_ticker"].time && !cache.uncache) {
436      return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(curValue / cache.width * amount);
437    } else {
438      if (toPercent && (property === "height" || property === "width")) {
439        // if we're dealing with width/height that's inside a container with padding and/or it's a flexbox/grid container, we must apply it to the target itself rather than the _tempDiv in order to ensure complete accuracy, factoring in the parent's padding.
440        var v = target.style[property];
441        target.style[property] = amount + unit;
442        px = target[measureProperty];
443        v ? target.style[property] = v : _removeProperty(target, property);
444      } else {
445        (toPercent || curUnit === "%") && !_nonStandardLayouts[_getComputedProperty(parent, "display")] && (style.position = _getComputedProperty(target, "position"));
446        parent === target && (style.position = "static"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that.
447
448        parent.appendChild(_tempDiv);
449        px = _tempDiv[measureProperty];
450        parent.removeChild(_tempDiv);
451        style.position = "absolute";
452      }
453      if (horizontal && toPercent) {
454        cache = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getCache"])(parent);
455        cache.time = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_ticker"].time;
456        cache.width = parent[measureProperty];
457      }
458    }
459    return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);
460  },
461  _get = function _get(target, property, unit, uncache) {
462    var value;
463    _pluginInitted || _initCore();
464    if (property in _propertyAliases && property !== "transform") {
465      property = _propertyAliases[property];
466      if (~property.indexOf(",")) {
467        property = property.split(",")[0];
468      }
469    }
470    if (_transformProps[property] && property !== "transform") {
471      value = _parseTransform(target, uncache);
472      value = property !== "transformOrigin" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + " " + value.zOrigin + "px";
473    } else {
474      value = target.style[property];
475      if (!value || value === "auto" || uncache || ~(value + "").indexOf("calc(")) {
476        value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getProperty"])(target, property) || (property === "opacity" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like  borderTopLeftRadius
477      }
478    }
479    return unit && !~(value + "").trim().indexOf(" ") ? _convertToUnit(target, property, value, unit) + unit : value;
480  },
481  _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) {
482    // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
483    if (!start || start === "none") {
484      // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style ("clipPath" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as "none" whereas WebkitClipPath reports accurately like "ellipse(100% 0% at 50% 0%)", so in this case we must SWITCH to using the prefixed property instead. See https://gsap.com/forums/topic/18310-clippath-doesnt-work-on-ios/
485      var p = _checkPropPrefix(prop, target, 1),
486        s = p && _getComputedProperty(target, p, 1);
487      if (s && s !== start) {
488        prop = p;
489        start = s;
490      } else if (prop === "borderColor") {
491        start = _getComputedProperty(target, "borderTopColor"); // Firefox bug: always reports "borderColor" as "", so we must fall back to borderTopColor. See https://gsap.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/
492      }
493    }
494    var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, target.style, prop, 0, 1, _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_renderComplexString"]),
495      index = 0,
496      matchIndex = 0,
497      a,
498      result,
499      startValues,
500      startNum,
501      color,
502      startValue,
503      endValue,
504      endNum,
505      chunk,
506      endUnit,
507      startUnit,
508      endValues;
509    pt.b = start;
510    pt.e = end;
511    start += ""; // ensure values are strings
512
513    end += "";
514    if (end === "auto") {
515      startValue = target.style[prop];
516      target.style[prop] = end;
517      end = _getComputedProperty(target, prop) || end;
518      startValue ? target.style[prop] = startValue : _removeProperty(target, prop);
519    }
520    a = [start, end];
521    Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorStringFilter"])(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow().
522
523    start = a[0];
524    end = a[1];
525    startValues = start.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"]) || [];
526    endValues = end.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"]) || [];
527    if (endValues.length) {
528      while (result = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"].exec(end)) {
529        endValue = result[0];
530        chunk = end.substring(index, result.index);
531        if (color) {
532          color = (color + 1) % 5;
533        } else if (chunk.substr(-5) === "rgba(" || chunk.substr(-5) === "hsla(") {
534          color = 1;
535        }
536        if (endValue !== (startValue = startValues[matchIndex++] || "")) {
537          startNum = parseFloat(startValue) || 0;
538          startUnit = startValue.substr((startNum + "").length);
539          endValue.charAt(1) === "=" && (endValue = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_parseRelative"])(startNum, endValue) + startUnit);
540          endNum = parseFloat(endValue);
541          endUnit = endValue.substr((endNum + "").length);
542          index = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numWithUnitExp"].lastIndex - endUnit.length;
543          if (!endUnit) {
544            //if something like "perspective:300" is passed in and we must add a unit to the end
545            endUnit = endUnit || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[prop] || startUnit;
546            if (index === end.length) {
547              end += endUnit;
548              pt.e += endUnit;
549            }
550          }
551          if (startUnit !== endUnit) {
552            startNum = _convertToUnit(target, prop, startValue, endUnit) || 0;
553          } // these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.
554
555          pt._pt = {
556            _next: pt._pt,
557            p: chunk || matchIndex === 1 ? chunk : ",",
558            //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.
559            s: startNum,
560            c: endNum - startNum,
561            m: color && color < 4 || prop === "zIndex" ? Math.round : 0
562          };
563        }
564      }
565      pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number)
566    } else {
567      pt.r = prop === "display" && end === "none" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;
568    }
569    _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_relExp"].test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).
570
571    this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus "this" would refer to the plugin.
572
573    return pt;
574  },
575  _keywordToPercent = {
576    top: "0%",
577    bottom: "100%",
578    left: "0%",
579    right: "100%",
580    center: "50%"
581  },
582  _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) {
583    var split = value.split(" "),
584      x = split[0],
585      y = split[1] || "50%";
586    if (x === "top" || x === "bottom" || y === "left" || y === "right") {
587      //the user provided them in the wrong order, so flip them
588      value = x;
589      x = y;
590      y = value;
591    }
592    split[0] = _keywordToPercent[x] || x;
593    split[1] = _keywordToPercent[y] || y;
594    return split.join(" ");
595  },
596  _renderClearProps = function _renderClearProps(ratio, data) {
597    if (data.tween && data.tween._time === data.tween._dur) {
598      var target = data.t,
599        style = target.style,
600        props = data.u,
601        cache = target._gsap,
602        prop,
603        clearTransforms,
604        i;
605      if (props === "all" || props === true) {
606        style.cssText = "";
607        clearTransforms = 1;
608      } else {
609        props = props.split(",");
610        i = props.length;
611        while (--i > -1) {
612          prop = props[i];
613          if (_transformProps[prop]) {
614            clearTransforms = 1;
615            prop = prop === "transformOrigin" ? _transformOriginProp : _transformProp;
616          }
617          _removeProperty(target, prop);
618        }
619      }
620      if (clearTransforms) {
621        _removeProperty(target, _transformProp);
622        if (cache) {
623          cache.svg && target.removeAttribute("transform");
624          style.scale = style.rotate = style.translate = "none";
625          _parseTransform(target, 1); // force all the cached values back to "normal"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values.
626
627          cache.uncache = 1;
628          _removeIndependentTransforms(style);
629        }
630      }
631    }
632  },
633  // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list.
634  _specialProps = {
635    clearProps: function clearProps(plugin, target, property, endValue, tween) {
636      if (tween.data !== "isFromStart") {
637        var pt = plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, 0, 0, _renderClearProps);
638        pt.u = endValue;
639        pt.pr = -10;
640        pt.tween = tween;
641        plugin._props.push(property);
642        return 1;
643      }
644    }
645    /* className feature (about 0.4kb gzipped).
646    , className(plugin, target, property, endValue, tween) {
647    	let _renderClassName = (ratio, data) => {
648    			data.css.render(ratio, data.css);
649    			if (!ratio || ratio === 1) {
650    				let inline = data.rmv,
651    					target = data.t,
652    					p;
653    				target.setAttribute("class", ratio ? data.e : data.b);
654    				for (p in inline) {
655    					_removeProperty(target, p);
656    				}
657    			}
658    		},
659    		_getAllStyles = (target) => {
660    			let styles = {},
661    				computed = getComputedStyle(target),
662    				p;
663    			for (p in computed) {
664    				if (isNaN(p) && p !== "cssText" && p !== "length") {
665    					styles[p] = computed[p];
666    				}
667    			}
668    			_setDefaults(styles, _parseTransform(target, 1));
669    			return styles;
670    		},
671    		startClassList = target.getAttribute("class"),
672    		style = target.style,
673    		cssText = style.cssText,
674    		cache = target._gsap,
675    		classPT = cache.classPT,
676    		inlineToRemoveAtEnd = {},
677    		data = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== "=") ? endValue : startClassList.replace(new RegExp("(?:\\s|^)" + endValue.substr(2) + "(?![\\w-])"), "") + ((endValue.charAt(0) === "+") ? " " + endValue.substr(2) : "")},
678    		changingVars = {},
679    		startVars = _getAllStyles(target),
680    		transformRelated = /(transform|perspective)/i,
681    		endVars, p;
682    	if (classPT) {
683    		classPT.r(1, classPT.d);
684    		_removeLinkedListItem(classPT.d.plugin, classPT, "_pt");
685    	}
686    	target.setAttribute("class", data.e);
687    	endVars = _getAllStyles(target, true);
688    	target.setAttribute("class", startClassList);
689    	for (p in endVars) {
690    		if (endVars[p] !== startVars[p] && !transformRelated.test(p)) {
691    			changingVars[p] = endVars[p];
692    			if (!style[p] && style[p] !== "0") {
693    				inlineToRemoveAtEnd[p] = 1;
694    			}
695    		}
696    	}
697    	cache.classPT = plugin._pt = new PropTween(plugin._pt, target, "className", 0, 0, _renderClassName, data, 0, -11);
698    	if (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://gsap.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/.
699    		style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).
700    	}
701    	_parseTransform(target, true); //to clear the caching of transforms
702    	data.css = new gsap.plugins.css();
703    	data.css.init(target, changingVars, tween);
704    	plugin._props.push(...data.css._props);
705    	return 1;
706    }
707    */
708  },
709  /*
710   * --------------------------------------------------------------------------------------
711   * TRANSFORMS
712   * --------------------------------------------------------------------------------------
713   */
714  _identity2DMatrix = [1, 0, 0, 1, 0, 0],
715  _rotationalProperties = {},
716  _isNullTransform = function _isNullTransform(value) {
717    return value === "matrix(1, 0, 0, 1, 0, 0)" || value === "none" || !value;
718  },
719  _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) {
720    var matrixString = _getComputedProperty(target, _transformProp);
721    return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_numExp"]).map(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"]);
722  },
723  _getMatrix = function _getMatrix(target, force2D) {
724    var cache = target._gsap || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getCache"])(target),
725      style = target.style,
726      matrix = _getComputedTransformMatrixAsArray(target),
727      parent,
728      nextSibling,
729      temp,
730      addedToDOM;
731    if (cache.svg && target.getAttribute("transform")) {
732      temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like "translate(50,60) rotate(135,0,0)" are parsed because it mashes it into a matrix.
733
734      matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];
735      return matrix.join(",") === "1,0,0,1,0,0" ? _identity2DMatrix : matrix;
736    } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) {
737      //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397
738      //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not "none". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).
739      temp = style.display;
740      style.display = "block";
741      parent = target.parentNode;
742      if (!parent || !target.offsetParent && !target.getBoundingClientRect().width) {
743        // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375. Note: position: fixed elements report a null offsetParent but they could also be invisible because they're in an ancestor with display: none, so we check getBoundingClientRect(). We only want to alter the DOM if we absolutely have to because it can cause iframe content to reload, like a Vimeo video.
744        addedToDOM = 1; //flag
745
746        nextSibling = target.nextElementSibling;
747        _docElement.appendChild(target); //we must add it to the DOM in order to get values properly
748      }
749      matrix = _getComputedTransformMatrixAsArray(target);
750      temp ? style.display = temp : _removeProperty(target, "display");
751      if (addedToDOM) {
752        nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);
753      }
754    }
755    return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;
756  },
757  _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) {
758    var cache = target._gsap,
759      matrix = matrixArray || _getMatrix(target, true),
760      xOriginOld = cache.xOrigin || 0,
761      yOriginOld = cache.yOrigin || 0,
762      xOffsetOld = cache.xOffset || 0,
763      yOffsetOld = cache.yOffset || 0,
764      a = matrix[0],
765      b = matrix[1],
766      c = matrix[2],
767      d = matrix[3],
768      tx = matrix[4],
769      ty = matrix[5],
770      originSplit = origin.split(" "),
771      xOrigin = parseFloat(originSplit[0]) || 0,
772      yOrigin = parseFloat(originSplit[1]) || 0,
773      bounds,
774      determinant,
775      x,
776      y;
777    if (!originIsAbsolute) {
778      bounds = _getBBox(target);
779      xOrigin = bounds.x + (~originSplit[0].indexOf("%") ? xOrigin / 100 * bounds.width : xOrigin);
780      yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf("%") ? yOrigin / 100 * bounds.height : yOrigin); // if (!("xOrigin" in cache) && (xOrigin || yOrigin)) { // added in 3.12.3, reverted in 3.12.4; requires more exploration
781      // 	xOrigin -= bounds.x;
782      // 	yOrigin -= bounds.y;
783      // }
784    } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) {
785      //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.
786      x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;
787      y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;
788      xOrigin = x;
789      yOrigin = y; // theory: we only had to do this for smoothing and it assumes that the previous one was not originIsAbsolute.
790    }
791    if (smooth || smooth !== false && cache.smooth) {
792      tx = xOrigin - xOriginOld;
793      ty = yOrigin - yOriginOld;
794      cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;
795      cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;
796    } else {
797      cache.xOffset = cache.yOffset = 0;
798    }
799    cache.xOrigin = xOrigin;
800    cache.yOrigin = yOrigin;
801    cache.smooth = !!smooth;
802    cache.origin = origin;
803    cache.originIsAbsolute = !!originIsAbsolute;
804    target.style[_transformOriginProp] = "0px 0px"; //otherwise, if someone sets  an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value).
805
806    if (pluginToAddPropTweensTo) {
807      _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOrigin", xOriginOld, xOrigin);
808      _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOrigin", yOriginOld, yOrigin);
809      _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOffset", xOffsetOld, cache.xOffset);
810      _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOffset", yOffsetOld, cache.yOffset);
811    }
812    target.setAttribute("data-svg-origin", xOrigin + " " + yOrigin);
813  },
814  _parseTransform = function _parseTransform(target, uncache) {
815    var cache = target._gsap || new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["GSCache"](target);
816    if ("x" in cache && !uncache && !cache.uncache) {
817      return cache;
818    }
819    var style = target.style,
820      invertedScaleX = cache.scaleX < 0,
821      px = "px",
822      deg = "deg",
823      cs = getComputedStyle(target),
824      origin = _getComputedProperty(target, _transformOriginProp) || "0",
825      x,
826      y,
827      z,
828      scaleX,
829      scaleY,
830      rotation,
831      rotationX,
832      rotationY,
833      skewX,
834      skewY,
835      perspective,
836      xOrigin,
837      yOrigin,
838      matrix,
839      angle,
840      cos,
841      sin,
842      a,
843      b,
844      c,
845      d,
846      a12,
847      a22,
848      t1,
849      t2,
850      t3,
851      a13,
852      a23,
853      a33,
854      a42,
855      a43,
856      a32;
857    x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;
858    scaleX = scaleY = 1;
859    cache.svg = !!(target.getCTM && _isSVG(target));
860    if (cs.translate) {
861      // accommodate independent transforms by combining them into normal ones.
862      if (cs.translate !== "none" || cs.scale !== "none" || cs.rotate !== "none") {
863        style[_transformProp] = (cs.translate !== "none" ? "translate3d(" + (cs.translate + " 0 0").split(" ").slice(0, 3).join(", ") + ") " : "") + (cs.rotate !== "none" ? "rotate(" + cs.rotate + ") " : "") + (cs.scale !== "none" ? "scale(" + cs.scale.split(" ").join(",") + ") " : "") + (cs[_transformProp] !== "none" ? cs[_transformProp] : "");
864      }
865      style.scale = style.rotate = style.translate = "none";
866    }
867    matrix = _getMatrix(target, cache.svg);
868    if (cache.svg) {
869      if (cache.uncache) {
870        // if cache.uncache is true (and maybe if origin is 0,0), we need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + "px " + (cache.yOrigin - bbox.y) + "px". Previously we let the data-svg-origin stay instead, but when introducing revert(), it complicated things.
871        t2 = target.getBBox();
872        origin = cache.xOrigin - t2.x + "px " + (cache.yOrigin - t2.y) + "px";
873        t1 = "";
874      } else {
875        t1 = !uncache && target.getAttribute("data-svg-origin"); //  Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly.
876      }
877      _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);
878    }
879    xOrigin = cache.xOrigin || 0;
880    yOrigin = cache.yOrigin || 0;
881    if (matrix !== _identity2DMatrix) {
882      a = matrix[0]; //a11
883
884      b = matrix[1]; //a21
885
886      c = matrix[2]; //a31
887
888      d = matrix[3]; //a41
889
890      x = a12 = matrix[4];
891      y = a22 = matrix[5]; //2D matrix
892
893      if (matrix.length === 6) {
894        scaleX = Math.sqrt(a * a + b * b);
895        scaleY = Math.sqrt(d * d + c * c);
896        rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).
897
898        skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0;
899        skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));
900        if (cache.svg) {
901          x -= xOrigin - (xOrigin * a + yOrigin * c);
902          y -= yOrigin - (xOrigin * b + yOrigin * d);
903        } //3D matrix
904      } else {
905        a32 = matrix[6];
906        a42 = matrix[7];
907        a13 = matrix[8];
908        a23 = matrix[9];
909        a33 = matrix[10];
910        a43 = matrix[11];
911        x = matrix[12];
912        y = matrix[13];
913        z = matrix[14];
914        angle = _atan2(a32, a33);
915        rotationX = angle * _RAD2DEG; //rotationX
916
917        if (angle) {
918          cos = Math.cos(-angle);
919          sin = Math.sin(-angle);
920          t1 = a12 * cos + a13 * sin;
921          t2 = a22 * cos + a23 * sin;
922          t3 = a32 * cos + a33 * sin;
923          a13 = a12 * -sin + a13 * cos;
924          a23 = a22 * -sin + a23 * cos;
925          a33 = a32 * -sin + a33 * cos;
926          a43 = a42 * -sin + a43 * cos;
927          a12 = t1;
928          a22 = t2;
929          a32 = t3;
930        } //rotationY
931
932        angle = _atan2(-c, a33);
933        rotationY = angle * _RAD2DEG;
934        if (angle) {
935          cos = Math.cos(-angle);
936          sin = Math.sin(-angle);
937          t1 = a * cos - a13 * sin;
938          t2 = b * cos - a23 * sin;
939          t3 = c * cos - a33 * sin;
940          a43 = d * sin + a43 * cos;
941          a = t1;
942          b = t2;
943          c = t3;
944        } //rotationZ
945
946        angle = _atan2(b, a);
947        rotation = angle * _RAD2DEG;
948        if (angle) {
949          cos = Math.cos(angle);
950          sin = Math.sin(angle);
951          t1 = a * cos + b * sin;
952          t2 = a12 * cos + a22 * sin;
953          b = b * cos - a * sin;
954          a22 = a22 * cos - a12 * sin;
955          a = t1;
956          a12 = t2;
957        }
958        if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) {
959          //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.
960          rotationX = rotation = 0;
961          rotationY = 180 - rotationY;
962        }
963        scaleX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(Math.sqrt(a * a + b * b + c * c));
964        scaleY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(Math.sqrt(a22 * a22 + a32 * a32));
965        angle = _atan2(a12, a22);
966        skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0;
967        perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;
968      }
969      if (cache.svg) {
970        //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline).
971        t1 = target.getAttribute("transform");
972        cache.forceCSS = target.setAttribute("transform", "") || !_isNullTransform(_getComputedProperty(target, _transformProp));
973        t1 && target.setAttribute("transform", t1);
974      }
975    }
976    if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {
977      if (invertedScaleX) {
978        scaleX *= -1;
979        skewX += rotation <= 0 ? 180 : -180;
980        rotation += rotation <= 0 ? 180 : -180;
981      } else {
982        scaleY *= -1;
983        skewX += skewX <= 0 ? 180 : -180;
984      }
985    }
986    uncache = uncache || cache.uncache;
987    cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;
988    cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;
989    cache.z = z + px;
990    cache.scaleX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(scaleX);
991    cache.scaleY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(scaleY);
992    cache.rotation = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotation) + deg;
993    cache.rotationX = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotationX) + deg;
994    cache.rotationY = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(rotationY) + deg;
995    cache.skewX = skewX + deg;
996    cache.skewY = skewY + deg;
997    cache.transformPerspective = perspective + px;
998    if (cache.zOrigin = parseFloat(origin.split(" ")[2]) || !uncache && cache.zOrigin || 0) {
999      style[_transformOriginProp] = _firstTwoOnly(origin);
1000    }
1001    cache.xOffset = cache.yOffset = 0;
1002    cache.force3D = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].force3D;
1003    cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;
1004    cache.uncache = 0;
1005    return cache;
1006  },
1007  _firstTwoOnly = function _firstTwoOnly(value) {
1008    return (value = value.split(" "))[0] + " " + value[1];
1009  },
1010  //for handling transformOrigin values, stripping out the 3rd dimension
1011  _addPxTranslate = function _addPxTranslate(target, start, value) {
1012    var unit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(start);
1013    return Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(parseFloat(start) + parseFloat(_convertToUnit(target, "x", value + "px", unit))) + unit;
1014  },
1015  _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) {
1016    cache.z = "0px";
1017    cache.rotationY = cache.rotationX = "0deg";
1018    cache.force3D = 0;
1019    _renderCSSTransforms(ratio, cache);
1020  },
1021  _zeroDeg = "0deg",
1022  _zeroPx = "0px",
1023  _endParenthesis = ") ",
1024  _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) {
1025    var _ref = cache || this,
1026      xPercent = _ref.xPercent,
1027      yPercent = _ref.yPercent,
1028      x = _ref.x,
1029      y = _ref.y,
1030      z = _ref.z,
1031      rotation = _ref.rotation,
1032      rotationY = _ref.rotationY,
1033      rotationX = _ref.rotationX,
1034      skewX = _ref.skewX,
1035      skewY = _ref.skewY,
1036      scaleX = _ref.scaleX,
1037      scaleY = _ref.scaleY,
1038      transformPerspective = _ref.transformPerspective,
1039      force3D = _ref.force3D,
1040      target = _ref.target,
1041      zOrigin = _ref.zOrigin,
1042      transforms = "",
1043      use3D = force3D === "auto" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually)
1044
1045    if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {
1046      var angle = parseFloat(rotationY) * _DEG2RAD,
1047        a13 = Math.sin(angle),
1048        a33 = Math.cos(angle),
1049        cos;
1050      angle = parseFloat(rotationX) * _DEG2RAD;
1051      cos = Math.cos(angle);
1052      x = _addPxTranslate(target, x, a13 * cos * -zOrigin);
1053      y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);
1054      z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);
1055    }
1056    if (transformPerspective !== _zeroPx) {
1057      transforms += "perspective(" + transformPerspective + _endParenthesis;
1058    }
1059    if (xPercent || yPercent) {
1060      transforms += "translate(" + xPercent + "%, " + yPercent + "%) ";
1061    }
1062    if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {
1063      transforms += z !== _zeroPx || use3D ? "translate3d(" + x + ", " + y + ", " + z + ") " : "translate(" + x + ", " + y + _endParenthesis;
1064    }
1065    if (rotation !== _zeroDeg) {
1066      transforms += "rotate(" + rotation + _endParenthesis;
1067    }
1068    if (rotationY !== _zeroDeg) {
1069      transforms += "rotateY(" + rotationY + _endParenthesis;
1070    }
1071    if (rotationX !== _zeroDeg) {
1072      transforms += "rotateX(" + rotationX + _endParenthesis;
1073    }
1074    if (skewX !== _zeroDeg || skewY !== _zeroDeg) {
1075      transforms += "skew(" + skewX + ", " + skewY + _endParenthesis;
1076    }
1077    if (scaleX !== 1 || scaleY !== 1) {
1078      transforms += "scale(" + scaleX + ", " + scaleY + _endParenthesis;
1079    }
1080    target.style[_transformProp] = transforms || "translate(0, 0)";
1081  },
1082  _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) {
1083    var _ref2 = cache || this,
1084      xPercent = _ref2.xPercent,
1085      yPercent = _ref2.yPercent,
1086      x = _ref2.x,
1087      y = _ref2.y,
1088      rotation = _ref2.rotation,
1089      skewX = _ref2.skewX,
1090      skewY = _ref2.skewY,
1091      scaleX = _ref2.scaleX,
1092      scaleY = _ref2.scaleY,
1093      target = _ref2.target,
1094      xOrigin = _ref2.xOrigin,
1095      yOrigin = _ref2.yOrigin,
1096      xOffset = _ref2.xOffset,
1097      yOffset = _ref2.yOffset,
1098      forceCSS = _ref2.forceCSS,
1099      tx = parseFloat(x),
1100      ty = parseFloat(y),
1101      a11,
1102      a21,
1103      a12,
1104      a22,
1105      temp;
1106    rotation = parseFloat(rotation);
1107    skewX = parseFloat(skewX);
1108    skewY = parseFloat(skewY);
1109    if (skewY) {
1110      //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.
1111      skewY = parseFloat(skewY);
1112      skewX += skewY;
1113      rotation += skewY;
1114    }
1115    if (rotation || skewX) {
1116      rotation *= _DEG2RAD;
1117      skewX *= _DEG2RAD;
1118      a11 = Math.cos(rotation) * scaleX;
1119      a21 = Math.sin(rotation) * scaleX;
1120      a12 = Math.sin(rotation - skewX) * -scaleY;
1121      a22 = Math.cos(rotation - skewX) * scaleY;
1122      if (skewX) {
1123        skewY *= _DEG2RAD;
1124        temp = Math.tan(skewX - skewY);
1125        temp = Math.sqrt(1 + temp * temp);
1126        a12 *= temp;
1127        a22 *= temp;
1128        if (skewY) {
1129          temp = Math.tan(skewY);
1130          temp = Math.sqrt(1 + temp * temp);
1131          a11 *= temp;
1132          a21 *= temp;
1133        }
1134      }
1135      a11 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a11);
1136      a21 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a21);
1137      a12 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a12);
1138      a22 = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(a22);
1139    } else {
1140      a11 = scaleX;
1141      a22 = scaleY;
1142      a21 = a12 = 0;
1143    }
1144    if (tx && !~(x + "").indexOf("px") || ty && !~(y + "").indexOf("px")) {
1145      tx = _convertToUnit(target, "x", x, "px");
1146      ty = _convertToUnit(target, "y", y, "px");
1147    }
1148    if (xOrigin || yOrigin || xOffset || yOffset) {
1149      tx = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);
1150      ty = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);
1151    }
1152    if (xPercent || yPercent) {
1153      //The SVG spec doesn't support percentage-based translation in the "transform" attribute, so we merge it into the translation to simulate it.
1154      temp = target.getBBox();
1155      tx = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(tx + xPercent / 100 * temp.width);
1156      ty = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_round"])(ty + yPercent / 100 * temp.height);
1157    }
1158    temp = "matrix(" + a11 + "," + a21 + "," + a12 + "," + a22 + "," + tx + "," + ty + ")";
1159    target.setAttribute("transform", temp);
1160    forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!)
1161  },
1162  _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) {
1163    var cap = 360,
1164      isString = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isString"])(endValue),
1165      endNum = parseFloat(endValue) * (isString && ~endValue.indexOf("rad") ? _RAD2DEG : 1),
1166      change = endNum - startNum,
1167      finalValue = startNum + change + "deg",
1168      direction,
1169      pt;
1170    if (isString) {
1171      direction = endValue.split("_")[1];
1172      if (direction === "short") {
1173        change %= cap;
1174        if (change !== change % (cap / 2)) {
1175          change += change < 0 ? cap : -cap;
1176        }
1177      }
1178      if (direction === "cw" && change < 0) {
1179        change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap;
1180      } else if (direction === "ccw" && change > 0) {
1181        change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap;
1182      }
1183    }
1184    plugin._pt = pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, target, property, startNum, change, _renderPropWithEnd);
1185    pt.e = finalValue;
1186    pt.u = "deg";
1187    plugin._props.push(property);
1188    return pt;
1189  },
1190  _assign = function _assign(target, source) {
1191    // Internet Explorer doesn't have Object.assign(), so we recreate it here.
1192    for (var p in source) {
1193      target[p] = source[p];
1194    }
1195    return target;
1196  },
1197  _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) {
1198    //for handling cases where someone passes in a whole transform string, like transform: "scale(2, 3) rotate(20deg) translateY(30em)"
1199    var startCache = _assign({}, target._gsap),
1200      exclude = "perspective,force3D,transformOrigin,svgOrigin",
1201      style = target.style,
1202      endCache,
1203      p,
1204      startValue,
1205      endValue,
1206      startNum,
1207      endNum,
1208      startUnit,
1209      endUnit;
1210    if (startCache.svg) {
1211      startValue = target.getAttribute("transform");
1212      target.setAttribute("transform", "");
1213      style[_transformProp] = transforms;
1214      endCache = _parseTransform(target, 1);
1215      _removeProperty(target, _transformProp);
1216      target.setAttribute("transform", startValue);
1217    } else {
1218      startValue = getComputedStyle(target)[_transformProp];
1219      style[_transformProp] = transforms;
1220      endCache = _parseTransform(target, 1);
1221      style[_transformProp] = startValue;
1222    }
1223    for (p in _transformProps) {
1224      startValue = startCache[p];
1225      endValue = endCache[p];
1226      if (startValue !== endValue && exclude.indexOf(p) < 0) {
1227        //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.
1228        startUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue);
1229        endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue);
1230        startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);
1231        endNum = parseFloat(endValue);
1232        plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);
1233        plugin._pt.u = endUnit || 0;
1234        plugin._props.push(p);
1235      }
1236    }
1237    _assign(endCache, startCache);
1238  }; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc.
1239
1240Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])("padding,margin,Width,Radius", function (name, index) {
1241  var t = "Top",
1242    r = "Right",
1243    b = "Bottom",
1244    l = "Left",
1245    props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) {
1246      return index < 2 ? name + side : "border" + side + name;
1247    });
1248  _specialProps[index > 1 ? "border" + name : name] = function (plugin, target, property, endValue, tween) {
1249    var a, vars;
1250    if (arguments.length < 4) {
1251      // getter, passed target, property, and unit (from _get())
1252      a = props.map(function (prop) {
1253        return _get(plugin, prop, property);
1254      });
1255      vars = a.join(" ");
1256      return vars.split(a[0]).length === 5 ? a[0] : vars;
1257    }
1258    a = (endValue + "").split(" ");
1259    vars = {};
1260    props.forEach(function (prop, i) {
1261      return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0];
1262    });
1263    plugin.init(target, vars, tween);
1264  };
1265});
1266var CSSPlugin = {
1267  name: "css",
1268  register: _initCore,
1269  targetTest: function targetTest(target) {
1270    return target.style && target.nodeType;
1271  },
1272  init: function init(target, vars, tween, index, targets) {
1273    var props = this._props,
1274      style = target.style,
1275      startAt = tween.vars.startAt,
1276      startValue,
1277      endValue,
1278      endNum,
1279      startNum,
1280      type,
1281      specialProp,
1282      p,
1283      startUnit,
1284      endUnit,
1285      relative,
1286      isTransformRelated,
1287      transformPropTween,
1288      cache,
1289      smooth,
1290      hasPriority,
1291      inlineProps;
1292    _pluginInitted || _initCore(); // we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps
1293
1294    this.styles = this.styles || _getStyleSaver(target);
1295    inlineProps = this.styles.props;
1296    this.tween = tween;
1297    for (p in vars) {
1298      if (p === "autoRound") {
1299        continue;
1300      }
1301      endValue = vars[p];
1302      if (_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_plugins"][p] && Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_checkPlugin"])(p, vars, tween, index, target, targets)) {
1303        // plugins
1304        continue;
1305      }
1306      type = typeof endValue;
1307      specialProp = _specialProps[p];
1308      if (type === "function") {
1309        endValue = endValue.call(tween, index, target, targets);
1310        type = typeof endValue;
1311      }
1312      if (type === "string" && ~endValue.indexOf("random(")) {
1313        endValue = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_replaceRandom"])(endValue);
1314      }
1315      if (specialProp) {
1316        specialProp(this, target, p, endValue, tween) && (hasPriority = 1);
1317      } else if (p.substr(0, 2) === "--") {
1318        //CSS variable
1319        startValue = (getComputedStyle(target).getPropertyValue(p) + "").trim();
1320        endValue += "";
1321        _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorExp"].lastIndex = 0;
1322        if (!_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_colorExp"].test(startValue)) {
1323          // colors don't have units
1324          startUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue);
1325          endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue);
1326        }
1327        endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);
1328        this.add(style, "setProperty", startValue, endValue, index, targets, 0, 0, p);
1329        props.push(p);
1330        inlineProps.push(p, 0, style[p]);
1331      } else if (type !== "undefined") {
1332        if (startAt && p in startAt) {
1333          // in case someone hard-codes a complex value as the start, like top: "calc(2vh / 2)". Without this, it'd use the computed value (always in px)
1334          startValue = typeof startAt[p] === "function" ? startAt[p].call(tween, index, target, targets) : startAt[p];
1335          Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isString"])(startValue) && ~startValue.indexOf("random(") && (startValue = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_replaceRandom"])(startValue));
1336          Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(startValue + "") || startValue === "auto" || (startValue += _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[p] || Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(_get(target, p)) || ""); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work.
1337
1338          (startValue + "").charAt(1) === "=" && (startValue = _get(target, p)); // can't work with relative values
1339        } else {
1340          startValue = _get(target, p);
1341        }
1342        startNum = parseFloat(startValue);
1343        relative = type === "string" && endValue.charAt(1) === "=" && endValue.substr(0, 2);
1344        relative && (endValue = endValue.substr(2));
1345        endNum = parseFloat(endValue);
1346        if (p in _propertyAliases) {
1347          if (p === "autoAlpha") {
1348            //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened.
1349            if (startNum === 1 && _get(target, "visibility") === "hidden" && endNum) {
1350              //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience)
1351              startNum = 0;
1352            }
1353            inlineProps.push("visibility", 0, style.visibility);
1354            _addNonTweeningPT(this, style, "visibility", startNum ? "inherit" : "hidden", endNum ? "inherit" : "hidden", !endNum);
1355          }
1356          if (p !== "scale" && p !== "transform") {
1357            p = _propertyAliases[p];
1358            ~p.indexOf(",") && (p = p.split(",")[0]);
1359          }
1360        }
1361        isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED ---
1362
1363        if (isTransformRelated) {
1364          this.styles.save(p);
1365          if (!transformPropTween) {
1366            cache = target._gsap;
1367            cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:"translateX(50vw)"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here.
1368
1369            smooth = vars.smoothOrigin !== false && cache.smooth;
1370            transformPropTween = this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning)
1371
1372            transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween.
1373          }
1374          if (p === "scale") {
1375            this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, cache, "scaleY", cache.scaleY, (relative ? Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_parseRelative"])(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp);
1376            this._pt.u = 0;
1377            props.push("scaleY", p);
1378            p += "X";
1379          } else if (p === "transformOrigin") {
1380            inlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]);
1381            endValue = _convertKeywordsToPercentages(endValue); //in case something like "left top" or "bottom right" is passed in. Convert to percentages.
1382
1383            if (cache.svg) {
1384              _applySVGOrigin(target, endValue, 0, smooth, 0, this);
1385            } else {
1386              endUnit = parseFloat(endValue.split(" ")[2]) || 0; //handle the zOrigin separately!
1387
1388              endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, "zOrigin", cache.zOrigin, endUnit);
1389              _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));
1390            }
1391            continue;
1392          } else if (p === "svgOrigin") {
1393            _applySVGOrigin(target, endValue, 1, smooth, 0, this);
1394            continue;
1395          } else if (p in _rotationalProperties) {
1396            _addRotationalPropTween(this, cache, p, startNum, relative ? Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_parseRelative"])(startNum, relative + endValue) : endValue);
1397            continue;
1398          } else if (p === "smoothOrigin") {
1399            _addNonTweeningPT(this, cache, "smooth", cache.smooth, endValue);
1400            continue;
1401          } else if (p === "force3D") {
1402            cache[p] = endValue;
1403            continue;
1404          } else if (p === "transform") {
1405            _addRawTransformPTs(this, endValue, target);
1406            continue;
1407          }
1408        } else if (!(p in style)) {
1409          p = _checkPropPrefix(p) || p;
1410        }
1411        if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) {
1412          startUnit = (startValue + "").substr((startNum + "").length);
1413          endNum || (endNum = 0); // protect against NaN
1414
1415          endUnit = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["getUnit"])(endValue) || (p in _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units ? _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[p] : startUnit);
1416          startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));
1417          this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["PropTween"](this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_parseRelative"])(startNum, relative + endNum) : endNum) - startNum, !isTransformRelated && (endUnit === "px" || p === "zIndex") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp);
1418          this._pt.u = endUnit || 0;
1419          if (startUnit !== endUnit && endUnit !== "%") {
1420            //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a "b" (beginning) property and point to a render method that handles that. (performance optimization)
1421            this._pt.b = startValue;
1422            this._pt.r = _renderCSSPropWithBeginning;
1423          }
1424        } else if (!(p in style)) {
1425          if (p in target) {
1426            //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that.
1427            this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets);
1428          } else if (p !== "parseTransform") {
1429            Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_missingPlugin"])(p, endValue);
1430            continue;
1431          }
1432        } else {
1433          _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue);
1434        }
1435        isTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : typeof target[p] === "function" ? inlineProps.push(p, 2, target[p]()) : inlineProps.push(p, 1, startValue || target[p]));
1436        props.push(p);
1437      }
1438    }
1439    hasPriority && Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_sortPropTweensByPriority"])(this);
1440  },
1441  render: function render(ratio, data) {
1442    if (data.tween._time || !_reverting()) {
1443      var pt = data._pt;
1444      while (pt) {
1445        pt.r(ratio, pt.d);
1446        pt = pt._next;
1447      }
1448    } else {
1449      data.styles.revert();
1450    }
1451  },
1452  get: _get,
1453  aliases: _propertyAliases,
1454  getSetter: function getSetter(target, property, plugin) {
1455    //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like "x" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer.
1456    var p = _propertyAliases[property];
1457    p && p.indexOf(",") < 0 && (property = p);
1458    return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, "x")) ? plugin && _recentSetterPlugin === plugin ? property === "scale" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === "scale" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_isUndefined"])(target.style[property]) ? _setterCSSStyle : ~property.indexOf("-") ? _setterCSSProp : Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_getSetter"])(target, property);
1459  },
1460  core: {
1461    _removeProperty: _removeProperty,
1462    _getMatrix: _getMatrix
1463  }
1464};
1465_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].utils.checkPrefix = _checkPropPrefix;
1466_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].core.getStyleSaver = _getStyleSaver;
1467(function (positionAndScale, rotation, others, aliases) {
1468  var all = Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(positionAndScale + "," + rotation + "," + others, function (name) {
1469    _transformProps[name] = 1;
1470  });
1471  Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(rotation, function (name) {
1472    _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[name] = "deg";
1473    _rotationalProperties[name] = 1;
1474  });
1475  _propertyAliases[all[13]] = positionAndScale + "," + rotation;
1476  Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])(aliases, function (name) {
1477    var split = name.split(":");
1478    _propertyAliases[split[1]] = all[split[0]];
1479  });
1480})("x,y,z,scale,scaleX,scaleY,xPercent,yPercent", "rotation,rotationX,rotationY,skewX,skewY", "transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective", "0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY");
1481Object(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_forEachName"])("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective", function (name) {
1482  _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["_config"].units[name] = "px";
1483});
1484_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].registerPlugin(CSSPlugin);
1485
1486
1487/***/ }),
1488
vendor: 9,921 bytes, lines 1489-1755
1489/***/ "./node_modules/gsap/ScrollToPlugin.js":
1490/*!*********************************************!*\
1491  !*** ./node_modules/gsap/ScrollToPlugin.js ***!
1492  \*********************************************/
1493/*! exports provided: ScrollToPlugin, default */
1494/***/ (function(module, __webpack_exports__, __webpack_require__) {
1495
1496"use strict";
1497__webpack_require__.r(__webpack_exports__);
1498/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScrollToPlugin", function() { return ScrollToPlugin; });
1499/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ScrollToPlugin; });
1500/*** IMPORTS FROM imports-loader ***/
1501var define = false;
1502
1503/*!
1504 * ScrollToPlugin 3.12.7
1505 * https://gsap.com
1506 *
1507 * @license Copyright 2008-2025, GreenSock. All rights reserved.
1508 * Subject to the terms at https://gsap.com/standard-license or for
1509 * Club GSAP members, the agreement issued with that membership.
1510 * @author: Jack Doyle, [email protected]
1511*/
1512
1513/* eslint-disable */
1514var gsap,
1515  _coreInitted,
1516  _window,
1517  _docEl,
1518  _body,
1519  _toArray,
1520  _config,
1521  ScrollTrigger,
1522  _windowExists = function _windowExists() {
1523    return typeof window !== "undefined";
1524  },
1525  _getGSAP = function _getGSAP() {
1526    return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap;
1527  },
1528  _isString = function _isString(value) {
1529    return typeof value === "string";
1530  },
1531  _isFunction = function _isFunction(value) {
1532    return typeof value === "function";
1533  },
1534  _max = function _max(element, axis) {
1535    var dim = axis === "x" ? "Width" : "Height",
1536      scroll = "scroll" + dim,
1537      client = "client" + dim;
1538    return element === _window || element === _docEl || element === _body ? Math.max(_docEl[scroll], _body[scroll]) - (_window["inner" + dim] || _docEl[client] || _body[client]) : element[scroll] - element["offset" + dim];
1539  },
1540  _buildGetter = function _buildGetter(e, axis) {
1541    //pass in an element and an axis ("x" or "y") and it'll return a getter function for the scroll position of that element (like scrollTop or scrollLeft, although if the element is the window, it'll use the pageXOffset/pageYOffset or the documentElement's scrollTop/scrollLeft or document.body's. Basically this streamlines things and makes a very fast getter across browsers.
1542    var p = "scroll" + (axis === "x" ? "Left" : "Top");
1543    if (e === _window) {
1544      if (e.pageXOffset != null) {
1545        p = "page" + axis.toUpperCase() + "Offset";
1546      } else {
1547        e = _docEl[p] != null ? _docEl : _body;
1548      }
1549    }
1550    return function () {
1551      return e[p];
1552    };
1553  },
1554  _clean = function _clean(value, index, target, targets) {
1555    _isFunction(value) && (value = value(index, target, targets));
1556    if (typeof value !== "object") {
1557      return _isString(value) && value !== "max" && value.charAt(1) !== "=" ? {
1558        x: value,
1559        y: value
1560      } : {
1561        y: value
1562      }; //if we don't receive an object as the parameter, assume the user intends "y".
1563    } else if (value.nodeType) {
1564      return {
1565        y: value,
1566        x: value
1567      };
1568    } else {
1569      var result = {},
1570        p;
1571      for (p in value) {
1572        result[p] = p !== "onAutoKill" && _isFunction(value[p]) ? value[p](index, target, targets) : value[p];
1573      }
1574      return result;
1575    }
1576  },
1577  _getOffset = function _getOffset(element, container) {
1578    element = _toArray(element)[0];
1579    if (!element || !element.getBoundingClientRect) {
1580      return console.warn("scrollTo target doesn't exist. Using 0") || {
1581        x: 0,
1582        y: 0
1583      };
1584    }
1585    var rect = element.getBoundingClientRect(),
1586      isRoot = !container || container === _window || container === _body,
1587      cRect = isRoot ? {
1588        top: _docEl.clientTop - (_window.pageYOffset || _docEl.scrollTop || _body.scrollTop || 0),
1589        left: _docEl.clientLeft - (_window.pageXOffset || _docEl.scrollLeft || _body.scrollLeft || 0)
1590      } : container.getBoundingClientRect(),
1591      offsets = {
1592        x: rect.left - cRect.left,
1593        y: rect.top - cRect.top
1594      };
1595    if (!isRoot && container) {
1596      //only add the current scroll position if it's not the window/body.
1597      offsets.x += _buildGetter(container, "x")();
1598      offsets.y += _buildGetter(container, "y")();
1599    }
1600    return offsets;
1601  },
1602  _parseVal = function _parseVal(value, target, axis, currentVal, offset) {
1603    return !isNaN(value) && typeof value !== "object" ? parseFloat(value) - offset : _isString(value) && value.charAt(1) === "=" ? parseFloat(value.substr(2)) * (value.charAt(0) === "-" ? -1 : 1) + currentVal - offset : value === "max" ? _max(target, axis) - offset : Math.min(_max(target, axis), _getOffset(value, target)[axis] - offset);
1604  },
1605  _initCore = function _initCore() {
1606    gsap = _getGSAP();
1607    if (_windowExists() && gsap && typeof document !== "undefined" && document.body) {
1608      _window = window;
1609      _body = document.body;
1610      _docEl = document.documentElement;
1611      _toArray = gsap.utils.toArray;
1612      gsap.config({
1613        autoKillThreshold: 7
1614      });
1615      _config = gsap.config();
1616      _coreInitted = 1;
1617    }
1618  };
1619var ScrollToPlugin = {
1620  version: "3.12.7",
1621  name: "scrollTo",
1622  rawVars: 1,
1623  register: function register(core) {
1624    gsap = core;
1625    _initCore();
1626  },
1627  init: function init(target, value, tween, index, targets) {
1628    _coreInitted || _initCore();
1629    var data = this,
1630      snapType = gsap.getProperty(target, "scrollSnapType");
1631    data.isWin = target === _window;
1632    data.target = target;
1633    data.tween = tween;
1634    value = _clean(value, index, target, targets);
1635    data.vars = value;
1636    data.autoKill = !!("autoKill" in value ? value : _config).autoKill;
1637    data.getX = _buildGetter(target, "x");
1638    data.getY = _buildGetter(target, "y");
1639    data.x = data.xPrev = data.getX();
1640    data.y = data.yPrev = data.getY();
1641    ScrollTrigger || (ScrollTrigger = gsap.core.globals().ScrollTrigger);
1642    gsap.getProperty(target, "scrollBehavior") === "smooth" && gsap.set(target, {
1643      scrollBehavior: "auto"
1644    });
1645    if (snapType && snapType !== "none") {
1646      // disable scroll snapping to avoid strange behavior
1647      data.snap = 1;
1648      data.snapInline = target.style.scrollSnapType;
1649      target.style.scrollSnapType = "none";
1650    }
1651    if (value.x != null) {
1652      data.add(data, "x", data.x, _parseVal(value.x, target, "x", data.x, value.offsetX || 0), index, targets);
1653      data._props.push("scrollTo_x");
1654    } else {
1655      data.skipX = 1;
1656    }
1657    if (value.y != null) {
1658      data.add(data, "y", data.y, _parseVal(value.y, target, "y", data.y, value.offsetY || 0), index, targets);
1659      data._props.push("scrollTo_y");
1660    } else {
1661      data.skipY = 1;
1662    }
1663  },
1664  render: function render(ratio, data) {
1665    var pt = data._pt,
1666      target = data.target,
1667      tween = data.tween,
1668      autoKill = data.autoKill,
1669      xPrev = data.xPrev,
1670      yPrev = data.yPrev,
1671      isWin = data.isWin,
1672      snap = data.snap,
1673      snapInline = data.snapInline,
1674      x,
1675      y,
1676      yDif,
1677      xDif,
1678      threshold;
1679    while (pt) {
1680      pt.r(ratio, pt.d);
1681      pt = pt._next;
1682    }
1683    x = isWin || !data.skipX ? data.getX() : xPrev;
1684    y = isWin || !data.skipY ? data.getY() : yPrev;
1685    yDif = y - yPrev;
1686    xDif = x - xPrev;
1687    threshold = _config.autoKillThreshold;
1688    if (data.x < 0) {
1689      //can't scroll to a position less than 0! Might happen if someone uses a Back.easeOut or Elastic.easeOut when scrolling back to the top of the page (for example)
1690      data.x = 0;
1691    }
1692    if (data.y < 0) {
1693      data.y = 0;
1694    }
1695    if (autoKill) {
1696      //note: iOS has a bug that throws off the scroll by several pixels, so we need to check if it's within 7 pixels of the previous one that we set instead of just looking for an exact match.
1697      if (!data.skipX && (xDif > threshold || xDif < -threshold) && x < _max(target, "x")) {
1698        data.skipX = 1; //if the user scrolls separately, we should stop tweening!
1699      }
1700      if (!data.skipY && (yDif > threshold || yDif < -threshold) && y < _max(target, "y")) {
1701        data.skipY = 1; //if the user scrolls separately, we should stop tweening!
1702      }
1703      if (data.skipX && data.skipY) {
1704        tween.kill();
1705        data.vars.onAutoKill && data.vars.onAutoKill.apply(tween, data.vars.onAutoKillParams || []);
1706      }
1707    }
1708    if (isWin) {
1709      _window.scrollTo(!data.skipX ? data.x : x, !data.skipY ? data.y : y);
1710    } else {
1711      data.skipY || (target.scrollTop = data.y);
1712      data.skipX || (target.scrollLeft = data.x);
1713    }
1714    if (snap && (ratio === 1 || ratio === 0)) {
1715      y = target.scrollTop;
1716      x = target.scrollLeft;
1717      snapInline ? target.style.scrollSnapType = snapInline : target.style.removeProperty("scroll-snap-type");
1718      target.scrollTop = y + 1; // bug in Safari causes the element to totally reset its scroll position when scroll-snap-type changes, so we need to set it to a slightly different value and then back again to work around this bug.
1719
1720      target.scrollLeft = x + 1;
1721      target.scrollTop = y;
1722      target.scrollLeft = x;
1723    }
1724    data.xPrev = data.x;
1725    data.yPrev = data.y;
1726    ScrollTrigger && ScrollTrigger.update();
1727  },
1728  kill: function kill(property) {
1729    var both = property === "scrollTo",
1730      i = this._props.indexOf(property);
1731    if (both || property === "scrollTo_x") {
1732      this.skipX = 1;
1733    }
1734    if (both || property === "scrollTo_y") {
1735      this.skipY = 1;
1736    }
1737    i > -1 && this._props.splice(i, 1);
1738    return !this._props.length;
1739  }
1740};
1741ScrollToPlugin.max = _max;
1742ScrollToPlugin.getOffset = _getOffset;
1743ScrollToPlugin.buildGetter = _buildGetter;
1744ScrollToPlugin.config = function (vars) {
1745  _config || _initCore() || (_config = gsap.config()); // in case the window hasn't been defined yet.
1746
1747  for (var p in vars) {
1748    _config[p] = vars[p];
1749  }
1750};
1751_getGSAP() && gsap.registerPlugin(ScrollToPlugin);
1752
1753
1754/***/ }),
1755
vendor: 182,503 bytes, lines 1756-5690
1756/***/ "./node_modules/gsap/gsap-core.js":
1757/*!****************************************!*\
1758  !*** ./node_modules/gsap/gsap-core.js ***!
1759  \****************************************/
1760/*! exports provided: GSCache, Animation, Timeline, Tween, PropTween, gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenMax, TweenLite, TimelineMax, TimelineLite, default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, selector, mapRange, pipe, unitize, interpolate, shuffle, _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative */
1761/***/ (function(module, __webpack_exports__, __webpack_require__) {
1762
1763"use strict";
1764__webpack_require__.r(__webpack_exports__);
1765/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GSCache", function() { return GSCache; });
1766/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Animation", function() { return Animation; });
1767/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timeline", function() { return Timeline; });
1768/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tween", function() { return Tween; });
1769/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropTween", function() { return PropTween; });
1770/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gsap", function() { return gsap; });
1771/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power0", function() { return Power0; });
1772/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power1", function() { return Power1; });
1773/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power2", function() { return Power2; });
1774/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power3", function() { return Power3; });
1775/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Power4", function() { return Power4; });
1776/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Linear", function() { return Linear; });
1777/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quad", function() { return Quad; });
1778/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cubic", function() { return Cubic; });
1779/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quart", function() { return Quart; });
1780/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Quint", function() { return Quint; });
1781/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Strong", function() { return Strong; });
1782/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Elastic", function() { return Elastic; });
1783/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Back", function() { return Back; });
1784/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SteppedEase", function() { return SteppedEase; });
1785/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Bounce", function() { return Bounce; });
1786/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sine", function() { return Sine; });
1787/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Expo", function() { return Expo; });
1788/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Circ", function() { return Circ; });
1789/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenMax", function() { return Tween; });
1790/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenLite", function() { return Tween; });
1791/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineMax", function() { return Timeline; });
1792/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimelineLite", function() { return Timeline; });
1793/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return gsap; });
1794/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; });
1795/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrapYoyo", function() { return wrapYoyo; });
1796/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distribute", function() { return distribute; });
1797/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "random", function() { return random; });
1798/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "snap", function() { return snap; });
1799/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; });
1800/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUnit", function() { return getUnit; });
1801/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clamp", function() { return clamp; });
1802/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitColor", function() { return splitColor; });
1803/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; });
1804/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "selector", function() { return selector; });
1805/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapRange", function() { return mapRange; });
1806/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; });
1807/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unitize", function() { return unitize; });
1808/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolate", function() { return interpolate; });
1809/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return shuffle; });
1810/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getProperty", function() { return _getProperty; });
1811/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_numExp", function() { return _numExp; });
1812/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_numWithUnitExp", function() { return _numWithUnitExp; });
1813/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isString", function() { return _isString; });
1814/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isUndefined", function() { return _isUndefined; });
1815/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_renderComplexString", function() { return _renderComplexString; });
1816/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_relExp", function() { return _relExp; });
1817/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_setDefaults", function() { return _setDefaults; });
1818/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_removeLinkedListItem", function() { return _removeLinkedListItem; });
1819/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_forEachName", function() { return _forEachName; });
1820/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_sortPropTweensByPriority", function() { return _sortPropTweensByPriority; });
1821/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_colorStringFilter", function() { return _colorStringFilter; });
1822/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_replaceRandom", function() { return _replaceRandom; });
1823/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_checkPlugin", function() { return _checkPlugin; });
1824/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_plugins", function() { return _plugins; });
1825/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ticker", function() { return _ticker; });
1826/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_config", function() { return _config; });
1827/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_roundModifier", function() { return _roundModifier; });
1828/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_round", function() { return _round; });
1829/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_missingPlugin", function() { return _missingPlugin; });
1830/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getSetter", function() { return _getSetter; });
1831/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getCache", function() { return _getCache; });
1832/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_colorExp", function() { return _colorExp; });
1833/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_parseRelative", function() { return _parseRelative; });
1834/*** IMPORTS FROM imports-loader ***/
1835var define = false;
1836function _assertThisInitialized(self) {
1837  if (self === void 0) {
1838    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
1839  }
1840  return self;
1841}
1842function _inheritsLoose(subClass, superClass) {
1843  subClass.prototype = Object.create(superClass.prototype);
1844  subClass.prototype.constructor = subClass;
1845  subClass.__proto__ = superClass;
1846}
1847
1848/*!
1849 * GSAP 3.12.7
1850 * https://gsap.com
1851 *
1852 * @license Copyright 2008-2025, GreenSock. All rights reserved.
1853 * Subject to the terms at https://gsap.com/standard-license or for
1854 * Club GSAP members, the agreement issued with that membership.
1855 * @author: Jack Doyle, [email protected]
1856*/
1857
1858/* eslint-disable */
1859var _config = {
1860    autoSleep: 120,
1861    force3D: "auto",
1862    nullTargetWarn: 1,
1863    units: {
1864      lineHeight: ""
1865    }
1866  },
1867  _defaults = {
1868    duration: .5,
1869    overwrite: false,
1870    delay: 0
1871  },
1872  _suppressOverwrites,
1873  _reverting,
1874  _context,
1875  _bigNum = 1e8,
1876  _tinyNum = 1 / _bigNum,
1877  _2PI = Math.PI * 2,
1878  _HALF_PI = _2PI / 4,
1879  _gsID = 0,
1880  _sqrt = Math.sqrt,
1881  _cos = Math.cos,
1882  _sin = Math.sin,
1883  _isString = function _isString(value) {
1884    return typeof value === "string";
1885  },
1886  _isFunction = function _isFunction(value) {
1887    return typeof value === "function";
1888  },
1889  _isNumber = function _isNumber(value) {
1890    return typeof value === "number";
1891  },
1892  _isUndefined = function _isUndefined(value) {
1893    return typeof value === "undefined";
1894  },
1895  _isObject = function _isObject(value) {
1896    return typeof value === "object";
1897  },
1898  _isNotFalse = function _isNotFalse(value) {
1899    return value !== false;
1900  },
1901  _windowExists = function _windowExists() {
1902    return typeof window !== "undefined";
1903  },
1904  _isFuncOrString = function _isFuncOrString(value) {
1905    return _isFunction(value) || _isString(value);
1906  },
1907  _isTypedArray = typeof ArrayBuffer === "function" && ArrayBuffer.isView || function () {},
1908  // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView().
1909  _isArray = Array.isArray,
1910  _strictNumExp = /(?:-?\.?\d|\.)+/gi,
1911  //only numbers (including negatives and decimals) but NOT relative values.
1912  _numExp = /[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/g,
1913  //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.
1914  _numWithUnitExp = /[-+=.]*\d+[.e-]*\d*[a-z%]*/g,
1915  _complexStringNumExp = /[-+=.]*\d+\.?\d*(?:e-|e\+)?\d*/gi,
1916  //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too.
1917  _relExp = /[+-]=-?[.\d]+/,
1918  _delimitedValueExp = /[^,'"\[\]\s]+/gi,
1919  // previously /[#\-+.]*\b[a-z\d\-=+%.]+/gi but didn't catch special characters.
1920  _unitExp = /^[+\-=e\s\d]*\d+[.\d]*([a-z]*|%)\s*$/i,
1921  _globalTimeline,
1922  _win,
1923  _coreInitted,
1924  _doc,
1925  _globals = {},
1926  _installScope = {},
1927  _coreReady,
1928  _install = function _install(scope) {
1929    return (_installScope = _merge(scope, _globals)) && gsap;
1930  },
1931  _missingPlugin = function _missingPlugin(property, value) {
1932    return console.warn("Invalid property", property, "set to", value, "Missing plugin? gsap.registerPlugin()");
1933  },
1934  _warn = function _warn(message, suppress) {
1935    return !suppress && console.warn(message);
1936  },
1937  _addGlobal = function _addGlobal(name, obj) {
1938    return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals;
1939  },
1940  _emptyFunc = function _emptyFunc() {
1941    return 0;
1942  },
1943  _startAtRevertConfig = {
1944    suppressEvents: true,
1945    isStart: true,
1946    kill: false
1947  },
1948  _revertConfigNoKill = {
1949    suppressEvents: true,
1950    kill: false
1951  },
1952  _revertConfig = {
1953    suppressEvents: true
1954  },
1955  _reservedProps = {},
1956  _lazyTweens = [],
1957  _lazyLookup = {},
1958  _lastRenderedFrame,
1959  _plugins = {},
1960  _effects = {},
1961  _nextGCFrame = 30,
1962  _harnessPlugins = [],
1963  _callbackNames = "",
1964  _harness = function _harness(targets) {
1965    var target = targets[0],
1966      harnessPlugin,
1967      i;
1968    _isObject(target) || _isFunction(target) || (targets = [targets]);
1969    if (!(harnessPlugin = (target._gsap || {}).harness)) {
1970      // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization)
1971      i = _harnessPlugins.length;
1972      while (i-- && !_harnessPlugins[i].targetTest(target)) {}
1973      harnessPlugin = _harnessPlugins[i];
1974    }
1975    i = targets.length;
1976    while (i--) {
1977      targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1);
1978    }
1979    return targets;
1980  },
1981  _getCache = function _getCache(target) {
1982    return target._gsap || _harness(toArray(target))[0]._gsap;
1983  },
1984  _getProperty = function _getProperty(target, property, v) {
1985    return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v;
1986  },
1987  _forEachName = function _forEachName(names, func) {
1988    return (names = names.split(",")).forEach(func) || names;
1989  },
1990  //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code).
1991  _round = function _round(value) {
1992    return Math.round(value * 100000) / 100000 || 0;
1993  },
1994  _roundPrecise = function _roundPrecise(value) {
1995    return Math.round(value * 10000000) / 10000000 || 0;
1996  },
1997  // increased precision mostly for timing values.
1998  _parseRelative = function _parseRelative(start, value) {
1999    var operator = value.charAt(0),
2000      end = parseFloat(value.substr(2));
2001    start = parseFloat(start);
2002    return operator === "+" ? start + end : operator === "-" ? start - end : operator === "*" ? start * end : start / end;
2003  },
2004  _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) {
2005    //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search.
2006    var l = toFind.length,
2007      i = 0;
2008    for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {}
2009    return i < l;
2010  },
2011  _lazyRender = function _lazyRender() {
2012    var l = _lazyTweens.length,
2013      a = _lazyTweens.slice(0),
2014      i,
2015      tween;
2016    _lazyLookup = {};
2017    _lazyTweens.length = 0;
2018    for (i = 0; i < l; i++) {
2019      tween = a[i];
2020      tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);
2021    }
2022  },
2023  _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) {
2024    _lazyTweens.length && !_reverting && _lazyRender();
2025    animation.render(time, suppressEvents, force || _reverting && time < 0 && (animation._initted || animation._startAt));
2026    _lazyTweens.length && !_reverting && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.
2027  },
2028  _numericIfPossible = function _numericIfPossible(value) {
2029    var n = parseFloat(value);
2030    return (n || n === 0) && (value + "").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;
2031  },
2032  _passThrough = function _passThrough(p) {
2033    return p;
2034  },
2035  _setDefaults = function _setDefaults(obj, defaults) {
2036    for (var p in defaults) {
2037      p in obj || (obj[p] = defaults[p]);
2038    }
2039    return obj;
2040  },
2041  _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) {
2042    return function (obj, defaults) {
2043      for (var p in defaults) {
2044        p in obj || p === "duration" && excludeDuration || p === "ease" || (obj[p] = defaults[p]);
2045      }
2046    };
2047  },
2048  _merge = function _merge(base, toMerge) {
2049    for (var p in toMerge) {
2050      base[p] = toMerge[p];
2051    }
2052    return base;
2053  },
2054  _mergeDeep = function _mergeDeep(base, toMerge) {
2055    for (var p in toMerge) {
2056      p !== "__proto__" && p !== "constructor" && p !== "prototype" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);
2057    }
2058    return base;
2059  },
2060  _copyExcluding = function _copyExcluding(obj, excluding) {
2061    var copy = {},
2062      p;
2063    for (p in obj) {
2064      p in excluding || (copy[p] = obj[p]);
2065    }
2066    return copy;
2067  },
2068  _inheritDefaults = function _inheritDefaults(vars) {
2069    var parent = vars.parent || _globalTimeline,
2070      func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults;
2071    if (_isNotFalse(vars.inherit)) {
2072      while (parent) {
2073        func(vars, parent.vars.defaults);
2074        parent = parent.parent || parent._dp;
2075      }
2076    }
2077    return vars;
2078  },
2079  _arraysMatch = function _arraysMatch(a1, a2) {
2080    var i = a1.length,
2081      match = i === a2.length;
2082    while (match && i-- && a1[i] === a2[i]) {}
2083    return i < 0;
2084  },
2085  _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) {
2086    if (firstProp === void 0) {
2087      firstProp = "_first";
2088    }
2089    if (lastProp === void 0) {
2090      lastProp = "_last";
2091    }
2092    var prev = parent[lastProp],
2093      t;
2094    if (sortBy) {
2095      t = child[sortBy];
2096      while (prev && prev[sortBy] > t) {
2097        prev = prev._prev;
2098      }
2099    }
2100    if (prev) {
2101      child._next = prev._next;
2102      prev._next = child;
2103    } else {
2104      child._next = parent[firstProp];
2105      parent[firstProp] = child;
2106    }
2107    if (child._next) {
2108      child._next._prev = child;
2109    } else {
2110      parent[lastProp] = child;
2111    }
2112    child._prev = prev;
2113    child.parent = child._dp = parent;
2114    return child;
2115  },
2116  _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) {
2117    if (firstProp === void 0) {
2118      firstProp = "_first";
2119    }
2120    if (lastProp === void 0) {
2121      lastProp = "_last";
2122    }
2123    var prev = child._prev,
2124      next = child._next;
2125    if (prev) {
2126      prev._next = next;
2127    } else if (parent[firstProp] === child) {
2128      parent[firstProp] = next;
2129    }
2130    if (next) {
2131      next._prev = prev;
2132    } else if (parent[lastProp] === child) {
2133      parent[lastProp] = prev;
2134    }
2135    child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list.
2136  },
2137  _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) {
2138    child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child);
2139    child._act = 0;
2140  },
2141  _uncache = function _uncache(animation, child) {
2142    if (animation && (!child || child._end > animation._dur || child._start < 0)) {
2143      // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end)
2144      var a = animation;
2145      while (a) {
2146        a._dirty = 1;
2147        a = a.parent;
2148      }
2149    }
2150    return animation;
2151  },
2152  _recacheAncestors = function _recacheAncestors(animation) {
2153    var parent = animation.parent;
2154    while (parent && parent.parent) {
2155      //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.
2156      parent._dirty = 1;
2157      parent.totalDuration();
2158      parent = parent.parent;
2159    }
2160    return animation;
2161  },
2162  _rewindStartAt = function _rewindStartAt(tween, totalTime, suppressEvents, force) {
2163    return tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween.vars.immediateRender && !tween.vars.autoRevert || tween._startAt.render(totalTime, true, force));
2164  },
2165  _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) {
2166    return !animation || animation._ts && _hasNoPausedAncestors(animation.parent);
2167  },
2168  _elapsedCycleDuration = function _elapsedCycleDuration(animation) {
2169    return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0;
2170  },
2171  // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle.
2172  _animationCycle = function _animationCycle(tTime, cycleDuration) {
2173    var whole = Math.floor(tTime = _roundPrecise(tTime / cycleDuration));
2174    return tTime && whole === tTime ? whole - 1 : whole;
2175  },
2176  _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) {
2177    return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur);
2178  },
2179  _setEnd = function _setEnd(animation) {
2180    return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0));
2181  },
2182  _alignPlayhead = function _alignPlayhead(animation, totalTime) {
2183    // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for.
2184    var parent = animation._dp;
2185    if (parent && parent.smoothChildTiming && animation._ts) {
2186      animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));
2187      _setEnd(animation);
2188      parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.
2189    }
2190    return animation;
2191  },
2192  /*
2193  _totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => {
2194  	let cycleDuration = duration + repeatDelay,
2195  		time = _round(clampedTotalTime % cycleDuration);
2196  	if (time > duration) {
2197  		time = duration;
2198  	}
2199  	return (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time;
2200  },
2201  */
2202  _postAddChecks = function _postAddChecks(timeline, child) {
2203    var t;
2204    if (child._time || !child._dur && child._initted || child._start < timeline._time && (child._dur || !child.add)) {
2205      // in case, for example, the _start is moved on a tween that has already rendered, or if it's being inserted into a timeline BEFORE where the playhead is currently. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning. Special case: if it's a timeline (has .add() method) and no duration, we can skip rendering because the user may be populating it AFTER adding it to a parent timeline (unconventional, but possible, and we wouldn't want it to get removed if the parent's autoRemoveChildren is true).
2206      t = _parentToChildTotalTime(timeline.rawTime(), child);
2207      if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {
2208        child.render(t, true);
2209      }
2210    } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.
2211
2212    if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {
2213      //in case any of the ancestors had completed but should now be enabled...
2214      if (timeline._dur < timeline.duration()) {
2215        t = timeline;
2216        while (t._dp) {
2217          t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead.
2218
2219          t = t._dp;
2220        }
2221      }
2222      timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order.
2223    }
2224  },
2225  _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) {
2226    child.parent && _removeFromParent(child);
2227    child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay);
2228    child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0));
2229    _addLinkedListItem(timeline, child, "_first", "_last", timeline._sort ? "_start" : 0);
2230    _isFromOrFromStart(child) || (timeline._recent = child);
2231    skipChecks || _postAddChecks(timeline, child);
2232    timeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime); // if the timeline is reversed and the new child makes it longer, we may need to adjust the parent's _start (push it back)
2233
2234    return timeline;
2235  },
2236  _scrollTrigger = function _scrollTrigger(animation, trigger) {
2237    return (_globals.ScrollTrigger || _missingPlugin("scrollTrigger", trigger)) && _globals.ScrollTrigger.create(trigger, animation);
2238  },
2239  _attemptInitTween = function _attemptInitTween(tween, time, force, suppressEvents, tTime) {
2240    _initTween(tween, time, tTime);
2241    if (!tween._initted) {
2242      return 1;
2243    }
2244    if (!force && tween._pt && !_reverting && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) {
2245      _lazyTweens.push(tween);
2246      tween._lazy = [tTime, suppressEvents];
2247      return 1;
2248    }
2249  },
2250  _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) {
2251    var parent = _ref.parent;
2252    return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent));
2253  },
2254  // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0
2255  _isFromOrFromStart = function _isFromOrFromStart(_ref2) {
2256    var data = _ref2.data;
2257    return data === "isFromStart" || data === "isStart";
2258  },
2259  _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) {
2260    var prevRatio = tween.ratio,
2261      ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1,
2262      // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the "startAt" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any "from" and "fromTo" startAt tweens are rendered the first time at a ratio of 1.
2263      repeatDelay = tween._rDelay,
2264      tTime = 0,
2265      pt,
2266      iteration,
2267      prevIteration;
2268    if (repeatDelay && tween._repeat) {
2269      // in case there's a zero-duration tween that has a repeat with a repeatDelay
2270      tTime = _clamp(0, tween._tDur, totalTime);
2271      iteration = _animationCycle(tTime, repeatDelay);
2272      tween._yoyo && iteration & 1 && (ratio = 1 - ratio);
2273      if (iteration !== _animationCycle(tween._tTime, repeatDelay)) {
2274        // if iteration changed
2275        prevRatio = 1 - ratio;
2276        tween.vars.repeatRefresh && tween._initted && tween.invalidate();
2277      }
2278    }
2279    if (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) {
2280      if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) {
2281        // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.
2282        return;
2283      }
2284      prevIteration = tween._zTime;
2285      tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.
2286
2287      suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates.
2288
2289      tween.ratio = ratio;
2290      tween._from && (ratio = 1 - ratio);
2291      tween._time = 0;
2292      tween._tTime = tTime;
2293      pt = tween._pt;
2294      while (pt) {
2295        pt.r(ratio, pt.d);
2296        pt = pt._next;
2297      }
2298      totalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true);
2299      tween._onUpdate && !suppressEvents && _callback(tween, "onUpdate");
2300      tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, "onRepeat");
2301      if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {
2302        ratio && _removeFromParent(tween, 1);
2303        if (!suppressEvents && !_reverting) {
2304          _callback(tween, ratio ? "onComplete" : "onReverseComplete", true);
2305          tween._prom && tween._prom();
2306        }
2307      }
2308    } else if (!tween._zTime) {
2309      tween._zTime = totalTime;
2310    }
2311  },
2312  _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) {
2313    var child;
2314    if (time > prevTime) {
2315      child = animation._first;
2316      while (child && child._start <= time) {
2317        if (child.data === "isPause" && child._start > prevTime) {
2318          return child;
2319        }
2320        child = child._next;
2321      }
2322    } else {
2323      child = animation._last;
2324      while (child && child._start >= time) {
2325        if (child.data === "isPause" && child._start < prevTime) {
2326          return child;
2327        }
2328        child = child._prev;
2329      }
2330    }
2331  },
2332  _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) {
2333    var repeat = animation._repeat,
2334      dur = _roundPrecise(duration) || 0,
2335      totalProgress = animation._tTime / animation._tDur;
2336    totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);
2337    animation._dur = dur;
2338    animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat);
2339    totalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress);
2340    animation.parent && _setEnd(animation);
2341    skipUncache || _uncache(animation.parent, animation);
2342    return animation;
2343  },
2344  _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) {
2345    return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur);
2346  },
2347  _zeroPosition = {
2348    _start: 0,
2349    endTime: _emptyFunc,
2350    totalDuration: _emptyFunc
2351  },
2352  _parsePosition = function _parsePosition(animation, position, percentAnimation) {
2353    var labels = animation.labels,
2354      recent = animation._recent || _zeroPosition,
2355      clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur,
2356      //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.
2357      i,
2358      offset,
2359      isPercent;
2360    if (_isString(position) && (isNaN(position) || position in labels)) {
2361      //if the string is a number like "1", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).
2362      offset = position.charAt(0);
2363      isPercent = position.substr(-1) === "%";
2364      i = position.indexOf("=");
2365      if (offset === "<" || offset === ">") {
2366        i >= 0 && (position = position.replace(/=/, ""));
2367        return (offset === "<" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1);
2368      }
2369      if (i < 0) {
2370        position in labels || (labels[position] = clippedDuration);
2371        return labels[position];
2372      }
2373      offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1));
2374      if (isPercent && percentAnimation) {
2375        offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration();
2376      }
2377      return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset;
2378    }
2379    return position == null ? clippedDuration : +position;
2380  },
2381  _createTweenType = function _createTweenType(type, params, timeline) {
2382    var isLegacy = _isNumber(params[1]),
2383      varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),
2384      vars = params[varsIndex],
2385      irVars,
2386      parent;
2387    isLegacy && (vars.duration = params[1]);
2388    vars.parent = timeline;
2389    if (type) {
2390      irVars = vars;
2391      parent = timeline;
2392      while (parent && !("immediateRender" in irVars)) {
2393        // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed.
2394        irVars = parent.vars.defaults || {};
2395        parent = _isNotFalse(parent.vars.inherit) && parent.parent;
2396      }
2397      vars.immediateRender = _isNotFalse(irVars.immediateRender);
2398      type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // "from" vars
2399    }
2400    return new Tween(params[0], vars, params[varsIndex + 1]);
2401  },
2402  _conditionalReturn = function _conditionalReturn(value, func) {
2403    return value || value === 0 ? func(value) : func;
2404  },
2405  _clamp = function _clamp(min, max, value) {
2406    return value < min ? min : value > max ? max : value;
2407  },
2408  getUnit = function getUnit(value, v) {
2409    return !_isString(value) || !(v = _unitExp.exec(value)) ? "" : v[1];
2410  },
2411  // note: protect against padded numbers as strings, like "100.100". That shouldn't return "00" as the unit. If it's numeric, return no unit.
2412  clamp = function clamp(min, max, value) {
2413    return _conditionalReturn(value, function (v) {
2414      return _clamp(min, max, v);
2415    });
2416  },
2417  _slice = [].slice,
2418  _isArrayLike = function _isArrayLike(value, nonEmpty) {
2419    return value && _isObject(value) && "length" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win;
2420  },
2421  _flatten = function _flatten(ar, leaveStrings, accumulator) {
2422    if (accumulator === void 0) {
2423      accumulator = [];
2424    }
2425    return ar.forEach(function (value) {
2426      var _accumulator;
2427      return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value);
2428    }) || accumulator;
2429  },
2430  //takes any value and returns an array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects.
2431  toArray = function toArray(value, scope, leaveStrings) {
2432    return _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [];
2433  },
2434  selector = function selector(value) {
2435    value = toArray(value)[0] || _warn("Invalid scope") || {};
2436    return function (v) {
2437      var el = value.current || value.nativeElement || value;
2438      return toArray(v, el.querySelectorAll ? el : el === value ? _warn("Invalid scope") || _doc.createElement("div") : value);
2439    };
2440  },
2441  shuffle = function shuffle(a) {
2442    return a.sort(function () {
2443      return .5 - Math.random();
2444    });
2445  },
2446  // alternative that's a bit faster and more reliably diverse but bigger:   for (let j, v, i = a.length; i; j = (Math.random() * i) | 0, v = a[--i], a[i] = a[j], a[j] = v); return a;
2447  //for distributing values across an array. Can accept a number, a function or (most commonly) a function which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array. Recognizes the following
2448  distribute = function distribute(v) {
2449    if (_isFunction(v)) {
2450      return v;
2451    }
2452    var vars = _isObject(v) ? v : {
2453        each: v
2454      },
2455      //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total "amount" that's chunked out among them all.
2456      ease = _parseEase(vars.ease),
2457      from = vars.from || 0,
2458      base = parseFloat(vars.base) || 0,
2459      cache = {},
2460      isDecimal = from > 0 && from < 1,
2461      ratios = isNaN(from) || isDecimal,
2462      axis = vars.axis,
2463      ratioX = from,
2464      ratioY = from;
2465    if (_isString(from)) {
2466      ratioX = ratioY = {
2467        center: .5,
2468        edges: .5,
2469        end: 1
2470      }[from] || 0;
2471    } else if (!isDecimal && ratios) {
2472      ratioX = from[0];
2473      ratioY = from[1];
2474    }
2475    return function (i, target, a) {
2476      var l = (a || vars).length,
2477        distances = cache[l],
2478        originX,
2479        originY,
2480        x,
2481        y,
2482        d,
2483        j,
2484        max,
2485        min,
2486        wrapAt;
2487      if (!distances) {
2488        wrapAt = vars.grid === "auto" ? 0 : (vars.grid || [1, _bigNum])[1];
2489        if (!wrapAt) {
2490          max = -_bigNum;
2491          while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {}
2492          wrapAt < l && wrapAt--;
2493        }
2494        distances = cache[l] = [];
2495        originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt;
2496        originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0;
2497        max = 0;
2498        min = _bigNum;
2499        for (j = 0; j < l; j++) {
2500          x = j % wrapAt - originX;
2501          y = originY - (j / wrapAt | 0);
2502          distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === "y" ? y : x);
2503          d > max && (max = d);
2504          d < min && (min = d);
2505        }
2506        from === "random" && shuffle(distances);
2507        distances.max = max - min;
2508        distances.min = min;
2509        distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === "y" ? l / wrapAt : wrapAt) || 0) * (from === "edges" ? -1 : 1);
2510        distances.b = l < 0 ? base - l : base;
2511        distances.u = getUnit(vars.amount || vars.each) || 0; //unit
2512
2513        ease = ease && l < 0 ? _invertEase(ease) : ease;
2514      }
2515      l = (distances[i] - distances.min) / distances.max || 0;
2516      return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors
2517    };
2518  },
2519  _roundModifier = function _roundModifier(v) {
2520    //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc.
2521    var p = Math.pow(10, ((v + "").split(".")[1] || "").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed())
2522
2523    return function (raw) {
2524      var n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p);
2525      return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151!
2526    };
2527  },
2528  snap = function snap(snapTo, value) {
2529    var isArray = _isArray(snapTo),
2530      radius,
2531      is2D;
2532    if (!isArray && _isObject(snapTo)) {
2533      radius = isArray = snapTo.radius || _bigNum;
2534      if (snapTo.values) {
2535        snapTo = toArray(snapTo.values);
2536        if (is2D = !_isNumber(snapTo[0])) {
2537          radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop.
2538        }
2539      } else {
2540        snapTo = _roundModifier(snapTo.increment);
2541      }
2542    }
2543    return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) {
2544      is2D = snapTo(raw);
2545      return Math.abs(is2D - raw) <= radius ? is2D : raw;
2546    } : function (raw) {
2547      var x = parseFloat(is2D ? raw.x : raw),
2548        y = parseFloat(is2D ? raw.y : 0),
2549        min = _bigNum,
2550        closest = 0,
2551        i = snapTo.length,
2552        dx,
2553        dy;
2554      while (i--) {
2555        if (is2D) {
2556          dx = snapTo[i].x - x;
2557          dy = snapTo[i].y - y;
2558          dx = dx * dx + dy * dy;
2559        } else {
2560          dx = Math.abs(snapTo[i] - x);
2561        }
2562        if (dx < min) {
2563          min = dx;
2564          closest = i;
2565        }
2566      }
2567      closest = !radius || min <= radius ? snapTo[closest] : raw;
2568      return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw);
2569    });
2570  },
2571  random = function random(min, max, roundingIncrement, returnFunction) {
2572    return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () {
2573      return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + "").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction;
2574    });
2575  },
2576  pipe = function pipe() {
2577    for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) {
2578      functions[_key] = arguments[_key];
2579    }
2580    return function (value) {
2581      return functions.reduce(function (v, f) {
2582        return f(v);
2583      }, value);
2584    };
2585  },
2586  unitize = function unitize(func, unit) {
2587    return function (value) {
2588      return func(parseFloat(value)) + (unit || getUnit(value));
2589    };
2590  },
2591  normalize = function normalize(min, max, value) {
2592    return mapRange(min, max, 0, 1, value);
2593  },
2594  _wrapArray = function _wrapArray(a, wrapper, value) {
2595    return _conditionalReturn(value, function (index) {
2596      return a[~~wrapper(index)];
2597    });
2598  },
2599  wrap = function wrap(min, max, value) {
2600    // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP).
2601    var range = max - min;
2602    return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) {
2603      return (range + (value - min) % range) % range + min;
2604    });
2605  },
2606  wrapYoyo = function wrapYoyo(min, max, value) {
2607    var range = max - min,
2608      total = range * 2;
2609    return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) {
2610      value = (total + (value - min) % total) % total || 0;
2611      return min + (value > range ? total - value : value);
2612    });
2613  },
2614  _replaceRandom = function _replaceRandom(value) {
2615    //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500])
2616    var prev = 0,
2617      s = "",
2618      i,
2619      nums,
2620      end,
2621      isArray;
2622    while (~(i = value.indexOf("random(", prev))) {
2623      end = value.indexOf(")", i);
2624      isArray = value.charAt(i + 7) === "[";
2625      nums = value.substr(i + 7, end - i - 7).match(isArray ? _delimitedValueExp : _strictNumExp);
2626      s += value.substr(prev, i - prev) + random(isArray ? nums : +nums[0], isArray ? 0 : +nums[1], +nums[2] || 1e-5);
2627      prev = end + 1;
2628    }
2629    return s + value.substr(prev, value.length - prev);
2630  },
2631  mapRange = function mapRange(inMin, inMax, outMin, outMax, value) {
2632    var inRange = inMax - inMin,
2633      outRange = outMax - outMin;
2634    return _conditionalReturn(value, function (value) {
2635      return outMin + ((value - inMin) / inRange * outRange || 0);
2636    });
2637  },
2638  interpolate = function interpolate(start, end, progress, mutate) {
2639    var func = isNaN(start + end) ? 0 : function (p) {
2640      return (1 - p) * start + p * end;
2641    };
2642    if (!func) {
2643      var isString = _isString(start),
2644        master = {},
2645        p,
2646        i,
2647        interpolators,
2648        l,
2649        il;
2650      progress === true && (mutate = 1) && (progress = null);
2651      if (isString) {
2652        start = {
2653          p: start
2654        };
2655        end = {
2656          p: end
2657        };
2658      } else if (_isArray(start) && !_isArray(end)) {
2659        interpolators = [];
2660        l = start.length;
2661        il = l - 2;
2662        for (i = 1; i < l; i++) {
2663          interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them.
2664        }
2665        l--;
2666        func = function func(p) {
2667          p *= l;
2668          var i = Math.min(il, ~~p);
2669          return interpolators[i](p - i);
2670        };
2671        progress = end;
2672      } else if (!mutate) {
2673        start = _merge(_isArray(start) ? [] : {}, start);
2674      }
2675      if (!interpolators) {
2676        for (p in end) {
2677          _addPropTween.call(master, start, p, "get", end[p]);
2678        }
2679        func = function func(p) {
2680          return _renderPropTweens(p, master) || (isString ? start.p : start);
2681        };
2682      }
2683    }
2684    return _conditionalReturn(progress, func);
2685  },
2686  _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) {
2687    //used for nextLabel() and previousLabel()
2688    var labels = timeline.labels,
2689      min = _bigNum,
2690      p,
2691      distance,
2692      label;
2693    for (p in labels) {
2694      distance = labels[p] - fromTime;
2695      if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) {
2696        label = p;
2697        min = distance;
2698      }
2699    }
2700    return label;
2701  },
2702  _callback = function _callback(animation, type, executeLazyFirst) {
2703    var v = animation.vars,
2704      callback = v[type],
2705      prevContext = _context,
2706      context = animation._ctx,
2707      params,
2708      scope,
2709      result;
2710    if (!callback) {
2711      return;
2712    }
2713    params = v[type + "Params"];
2714    scope = v.callbackScope || animation;
2715    executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.
2716
2717    context && (_context = context);
2718    result = params ? callback.apply(scope, params) : callback.call(scope);
2719    _context = prevContext;
2720    return result;
2721  },
2722  _interrupt = function _interrupt(animation) {
2723    _removeFromParent(animation);
2724    animation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting);
2725    animation.progress() < 1 && _callback(animation, "onInterrupt");
2726    return animation;
2727  },
2728  _quickTween,
2729  _registerPluginQueue = [],
2730  _createPlugin = function _createPlugin(config) {
2731    if (!config) return;
2732    config = !config.name && config["default"] || config; // UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}.
2733
2734    if (_windowExists() || config.headless) {
2735      // edge case: some build tools may pass in a null/undefined value
2736      var name = config.name,
2737        isFunc = _isFunction(config),
2738        Plugin = name && !isFunc && config.init ? function () {
2739          this._props = [];
2740        } : config,
2741        //in case someone passes in an object that's not a plugin, like CustomEase
2742        instanceDefaults = {
2743          init: _emptyFunc,
2744          render: _renderPropTweens,
2745          add: _addPropTween,
2746          kill: _killPropTweensOf,
2747          modifier: _addPluginModifier,
2748          rawVars: 0
2749        },
2750        statics = {
2751          targetTest: 0,
2752          get: 0,
2753          getSetter: _getSetter,
2754          aliases: {},
2755          register: 0
2756        };
2757      _wake();
2758      if (config !== Plugin) {
2759        if (_plugins[name]) {
2760          return;
2761        }
2762        _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods
2763
2764        _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods
2765
2766        _plugins[Plugin.prop = name] = Plugin;
2767        if (config.targetTest) {
2768          _harnessPlugins.push(Plugin);
2769          _reservedProps[name] = 1;
2770        }
2771        name = (name === "css" ? "CSS" : name.charAt(0).toUpperCase() + name.substr(1)) + "Plugin"; //for the global name. "motionPath" should become MotionPathPlugin
2772      }
2773      _addGlobal(name, Plugin);
2774      config.register && config.register(gsap, Plugin, PropTween);
2775    } else {
2776      _registerPluginQueue.push(config);
2777    }
2778  },
2779  /*
2780   * --------------------------------------------------------------------------------------
2781   * COLORS
2782   * --------------------------------------------------------------------------------------
2783   */
2784  _255 = 255,
2785  _colorLookup = {
2786    aqua: [0, _255, _255],
2787    lime: [0, _255, 0],
2788    silver: [192, 192, 192],
2789    black: [0, 0, 0],
2790    maroon: [128, 0, 0],
2791    teal: [0, 128, 128],
2792    blue: [0, 0, _255],
2793    navy: [0, 0, 128],
2794    white: [_255, _255, _255],
2795    olive: [128, 128, 0],
2796    yellow: [_255, _255, 0],
2797    orange: [_255, 165, 0],
2798    gray: [128, 128, 128],
2799    purple: [128, 0, 128],
2800    green: [0, 128, 0],
2801    red: [_255, 0, 0],
2802    pink: [_255, 192, 203],
2803    cyan: [0, _255, _255],
2804    transparent: [_255, _255, _255, 0]
2805  },
2806  // possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc:
2807  // let ctx = _doc.createElement("canvas").getContext("2d");
2808  // _forEachName("aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)});
2809  _hue = function _hue(h, m1, m2) {
2810    h += h < 0 ? 1 : h > 1 ? -1 : 0;
2811    return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0;
2812  },
2813  splitColor = function splitColor(v, toHSL, forceAlpha) {
2814    var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0,
2815      r,
2816      g,
2817      b,
2818      h,
2819      s,
2820      l,
2821      max,
2822      min,
2823      d,
2824      wasHSL;
2825    if (!a) {
2826      if (v.substr(-1) === ",") {
2827        //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)" - in this example "blue," has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.
2828        v = v.substr(0, v.length - 1);
2829      }
2830      if (_colorLookup[v]) {
2831        a = _colorLookup[v];
2832      } else if (v.charAt(0) === "#") {
2833        if (v.length < 6) {
2834          //for shorthand like #9F0 or #9F0F (could have alpha)
2835          r = v.charAt(1);
2836          g = v.charAt(2);
2837          b = v.charAt(3);
2838          v = "#" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : "");
2839        }
2840        if (v.length === 9) {
2841          // hex with alpha, like #fd5e53ff
2842          a = parseInt(v.substr(1, 6), 16);
2843          return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255];
2844        }
2845        v = parseInt(v.substr(1), 16);
2846        a = [v >> 16, v >> 8 & _255, v & _255];
2847      } else if (v.substr(0, 3) === "hsl") {
2848        a = wasHSL = v.match(_strictNumExp);
2849        if (!toHSL) {
2850          h = +a[0] % 360 / 360;
2851          s = +a[1] / 100;
2852          l = +a[2] / 100;
2853          g = l <= .5 ? l * (s + 1) : l + s - l * s;
2854          r = l * 2 - g;
2855          a.length > 3 && (a[3] *= 1); //cast as number
2856
2857          a[0] = _hue(h + 1 / 3, r, g);
2858          a[1] = _hue(h, r, g);
2859          a[2] = _hue(h - 1 / 3, r, g);
2860        } else if (~v.indexOf("=")) {
2861          //if relative values are found, just return the raw strings with the relative prefixes in place.
2862          a = v.match(_numExp);
2863          forceAlpha && a.length < 4 && (a[3] = 1);
2864          return a;
2865        }
2866      } else {
2867        a = v.match(_strictNumExp) || _colorLookup.transparent;
2868      }
2869      a = a.map(Number);
2870    }
2871    if (toHSL && !wasHSL) {
2872      r = a[0] / _255;
2873      g = a[1] / _255;
2874      b = a[2] / _255;
2875      max = Math.max(r, g, b);
2876      min = Math.min(r, g, b);
2877      l = (max + min) / 2;
2878      if (max === min) {
2879        h = s = 0;
2880      } else {
2881        d = max - min;
2882        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
2883        h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;
2884        h *= 60;
2885      }
2886      a[0] = ~~(h + .5);
2887      a[1] = ~~(s * 100 + .5);
2888      a[2] = ~~(l * 100 + .5);
2889    }
2890    forceAlpha && a.length < 4 && (a[3] = 1);
2891    return a;
2892  },
2893  _colorOrderData = function _colorOrderData(v) {
2894    // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a "c" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors()
2895    var values = [],
2896      c = [],
2897      i = -1;
2898    v.split(_colorExp).forEach(function (v) {
2899      var a = v.match(_numWithUnitExp) || [];
2900      values.push.apply(values, a);
2901      c.push(i += a.length + 1);
2902    });
2903    values.c = c;
2904    return values;
2905  },
2906  _formatColors = function _formatColors(s, toHSL, orderMatchData) {
2907    var result = "",
2908      colors = (s + result).match(_colorExp),
2909      type = toHSL ? "hsla(" : "rgba(",
2910      i = 0,
2911      c,
2912      shell,
2913      d,
2914      l;
2915    if (!colors) {
2916      return s;
2917    }
2918    colors = colors.map(function (color) {
2919      return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + "," + color[1] + "%," + color[2] + "%," + color[3] : color.join(",")) + ")";
2920    });
2921    if (orderMatchData) {
2922      d = _colorOrderData(s);
2923      c = orderMatchData.c;
2924      if (c.join(result) !== d.c.join(result)) {
2925        shell = s.replace(_colorExp, "1").split(_numWithUnitExp);
2926        l = shell.length - 1;
2927        for (; i < l; i++) {
2928          result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + "0,0,0,0)" : (d.length ? d : colors.length ? colors : orderMatchData).shift());
2929        }
2930      }
2931    }
2932    if (!shell) {
2933      shell = s.split(_colorExp);
2934      l = shell.length - 1;
2935      for (; i < l; i++) {
2936        result += shell[i] + colors[i];
2937      }
2938    }
2939    return result + shell[l];
2940  },
2941  _colorExp = function () {
2942    var s = "(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#(?:[0-9a-f]{3,4}){1,2}\\b",
2943      //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.,
2944      p;
2945    for (p in _colorLookup) {
2946      s += "|" + p + "\\b";
2947    }
2948    return new RegExp(s + ")", "gi");
2949  }(),
2950  _hslExp = /hsl[a]?\(/,
2951  _colorStringFilter = function _colorStringFilter(a) {
2952    var combined = a.join(" "),
2953      toHSL;
2954    _colorExp.lastIndex = 0;
2955    if (_colorExp.test(combined)) {
2956      toHSL = _hslExp.test(combined);
2957      a[1] = _formatColors(a[1], toHSL);
2958      a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value.
2959
2960      return true;
2961    }
2962  },
2963  /*
2964   * --------------------------------------------------------------------------------------
2965   * TICKER
2966   * --------------------------------------------------------------------------------------
2967   */
2968  _tickerActive,
2969  _ticker = function () {
2970    var _getTime = Date.now,
2971      _lagThreshold = 500,
2972      _adjustedLag = 33,
2973      _startTime = _getTime(),
2974      _lastUpdate = _startTime,
2975      _gap = 1000 / 240,
2976      _nextTime = _gap,
2977      _listeners = [],
2978      _id,
2979      _req,
2980      _raf,
2981      _self,
2982      _delta,
2983      _i,
2984      _tick = function _tick(v) {
2985        var elapsed = _getTime() - _lastUpdate,
2986          manual = v === true,
2987          overlap,
2988          dispatch,
2989          time,
2990          frame;
2991        (elapsed > _lagThreshold || elapsed < 0) && (_startTime += elapsed - _adjustedLag);
2992        _lastUpdate += elapsed;
2993        time = _lastUpdate - _startTime;
2994        overlap = time - _nextTime;
2995        if (overlap > 0 || manual) {
2996          frame = ++_self.frame;
2997          _delta = time - _self.time * 1000;
2998          _self.time = time = time / 1000;
2999          _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);
3000          dispatch = 1;
3001        }
3002        manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the "tick" event so that timing is maintained. Otherwise, if processing the "tick" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.
3003
3004        if (dispatch) {
3005          for (_i = 0; _i < _listeners.length; _i++) {
3006            // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop.
3007            _listeners[_i](time, _delta, frame, v);
3008          }
3009        }
3010      };
3011    _self = {
3012      time: 0,
3013      frame: 0,
3014      tick: function tick() {
3015        _tick(true);
3016      },
3017      deltaRatio: function deltaRatio(fps) {
3018        return _delta / (1000 / (fps || 60));
3019      },
3020      wake: function wake() {
3021        if (_coreReady) {
3022          if (!_coreInitted && _windowExists()) {
3023            _win = _coreInitted = window;
3024            _doc = _win.document || {};
3025            _globals.gsap = gsap;
3026            (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);
3027            _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {});
3028            _registerPluginQueue.forEach(_createPlugin);
3029          }
3030          _raf = typeof requestAnimationFrame !== "undefined" && requestAnimationFrame;
3031          _id && _self.sleep();
3032          _req = _raf || function (f) {
3033            return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0);
3034          };
3035          _tickerActive = 1;
3036          _tick(2);
3037        }
3038      },
3039      sleep: function sleep() {
3040        (_raf ? cancelAnimationFrame : clearTimeout)(_id);
3041        _tickerActive = 0;
3042        _req = _emptyFunc;
3043      },
3044      lagSmoothing: function lagSmoothing(threshold, adjustedLag) {
3045        _lagThreshold = threshold || Infinity; // zero should be interpreted as basically unlimited
3046
3047        _adjustedLag = Math.min(adjustedLag || 33, _lagThreshold);
3048      },
3049      fps: function fps(_fps) {
3050        _gap = 1000 / (_fps || 240);
3051        _nextTime = _self.time * 1000 + _gap;
3052      },
3053      add: function add(callback, once, prioritize) {
3054        var func = once ? function (t, d, f, v) {
3055          callback(t, d, f, v);
3056          _self.remove(func);
3057        } : callback;
3058        _self.remove(callback);
3059        _listeners[prioritize ? "unshift" : "push"](func);
3060        _wake();
3061        return func;
3062      },
3063      remove: function remove(callback, i) {
3064        ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;
3065      },
3066      _listeners: _listeners
3067    };
3068    return _self;
3069  }(),
3070  _wake = function _wake() {
3071    return !_tickerActive && _ticker.wake();
3072  },
3073  //also ensures the core classes are initialized.
3074
3075  /*
3076  * -------------------------------------------------
3077  * EASING
3078  * -------------------------------------------------
3079  */
3080  _easeMap = {},
3081  _customEaseExp = /^[\d.\-M][\d.\-,\s]/,
3082  _quotesExp = /["']/g,
3083  _parseObjectInString = function _parseObjectInString(value) {
3084    //takes a string like "{wiggles:10, type:anticipate})" and turns it into a real object. Notice it ends in ")" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability.
3085    var obj = {},
3086      split = value.substr(1, value.length - 3).split(":"),
3087      key = split[0],
3088      i = 1,
3089      l = split.length,
3090      index,
3091      val,
3092      parsedVal;
3093    for (; i < l; i++) {
3094      val = split[i];
3095      index = i !== l - 1 ? val.lastIndexOf(",") : val.length;
3096      parsedVal = val.substr(0, index);
3097      obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, "").trim() : +parsedVal;
3098      key = val.substr(index + 1).trim();
3099    }
3100    return obj;
3101  },
3102  _valueInParentheses = function _valueInParentheses(value) {
3103    var open = value.indexOf("(") + 1,
3104      close = value.indexOf(")"),
3105      nested = value.indexOf("(", open);
3106    return value.substring(open, ~nested && nested < close ? value.indexOf(")", close + 1) : close);
3107  },
3108  _configEaseFromString = function _configEaseFromString(name) {
3109    //name can be a string like "elastic.out(1,0.5)", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE).
3110    var split = (name + "").split("("),
3111      ease = _easeMap[split[0]];
3112    return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf("{") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(",").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE("", name) : ease;
3113  },
3114  _invertEase = function _invertEase(ease) {
3115    return function (p) {
3116      return 1 - ease(1 - p);
3117    };
3118  },
3119  // allow yoyoEase to be set in children and have those affected when the parent/ancestor timeline yoyos.
3120  _propagateYoyoEase = function _propagateYoyoEase(timeline, isYoyo) {
3121    var child = timeline._first,
3122      ease;
3123    while (child) {
3124      if (child instanceof Timeline) {
3125        _propagateYoyoEase(child, isYoyo);
3126      } else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) {
3127        if (child.timeline) {
3128          _propagateYoyoEase(child.timeline, isYoyo);
3129        } else {
3130          ease = child._ease;
3131          child._ease = child._yEase;
3132          child._yEase = ease;
3133          child._yoyo = isYoyo;
3134        }
3135      }
3136      child = child._next;
3137    }
3138  },
3139  _parseEase = function _parseEase(ease, defaultEase) {
3140    return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase;
3141  },
3142  _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) {
3143    if (easeOut === void 0) {
3144      easeOut = function easeOut(p) {
3145        return 1 - easeIn(1 - p);
3146      };
3147    }
3148    if (easeInOut === void 0) {
3149      easeInOut = function easeInOut(p) {
3150        return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2;
3151      };
3152    }
3153    var ease = {
3154        easeIn: easeIn,
3155        easeOut: easeOut,
3156        easeInOut: easeInOut
3157      },
3158      lowercaseName;
3159    _forEachName(names, function (name) {
3160      _easeMap[name] = _globals[name] = ease;
3161      _easeMap[lowercaseName = name.toLowerCase()] = easeOut;
3162      for (var p in ease) {
3163        _easeMap[lowercaseName + (p === "easeIn" ? ".in" : p === "easeOut" ? ".out" : ".inOut")] = _easeMap[name + "." + p] = ease[p];
3164      }
3165    });
3166    return ease;
3167  },
3168  _easeInOutFromOut = function _easeInOutFromOut(easeOut) {
3169    return function (p) {
3170      return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2;
3171    };
3172  },
3173  _configElastic = function _configElastic(type, amplitude, period) {
3174    var p1 = amplitude >= 1 ? amplitude : 1,
3175      //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.
3176      p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),
3177      p3 = p2 / _2PI * (Math.asin(1 / p1) || 0),
3178      easeOut = function easeOut(p) {
3179        return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1;
3180      },
3181      ease = type === "out" ? easeOut : type === "in" ? function (p) {
3182        return 1 - easeOut(1 - p);
3183      } : _easeInOutFromOut(easeOut);
3184    p2 = _2PI / p2; //precalculate to optimize
3185
3186    ease.config = function (amplitude, period) {
3187      return _configElastic(type, amplitude, period);
3188    };
3189    return ease;
3190  },
3191  _configBack = function _configBack(type, overshoot) {
3192    if (overshoot === void 0) {
3193      overshoot = 1.70158;
3194    }
3195    var easeOut = function easeOut(p) {
3196        return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0;
3197      },
3198      ease = type === "out" ? easeOut : type === "in" ? function (p) {
3199        return 1 - easeOut(1 - p);
3200      } : _easeInOutFromOut(easeOut);
3201    ease.config = function (overshoot) {
3202      return _configBack(type, overshoot);
3203    };
3204    return ease;
3205  }; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.
3206// _weightedEase = ratio => {
3207// 	let y = 0.5 + ratio / 2;
3208// 	return p => (2 * (1 - p) * p * y + p * p);
3209// },
3210// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.
3211// _weightedEaseStrong = ratio => {
3212// 	ratio = .5 + ratio / 2;
3213// 	let o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio),
3214// 		b = ratio - o,
3215// 		c = ratio + o;
3216// 	return p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p;
3217// };
3218
3219_forEachName("Linear,Quad,Cubic,Quart,Quint,Strong", function (name, i) {
3220  var power = i < 5 ? i + 1 : i;
3221  _insertEase(name + ",Power" + (power - 1), i ? function (p) {
3222    return Math.pow(p, power);
3223  } : function (p) {
3224    return p;
3225  }, function (p) {
3226    return 1 - Math.pow(1 - p, power);
3227  }, function (p) {
3228    return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2;
3229  });
3230});
3231_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;
3232_insertEase("Elastic", _configElastic("in"), _configElastic("out"), _configElastic());
3233(function (n, c) {
3234  var n1 = 1 / c,
3235    n2 = 2 * n1,
3236    n3 = 2.5 * n1,
3237    easeOut = function easeOut(p) {
3238      return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375;
3239    };
3240  _insertEase("Bounce", function (p) {
3241    return 1 - easeOut(1 - p);
3242  }, easeOut);
3243})(7.5625, 2.75);
3244_insertEase("Expo", function (p) {
3245  return Math.pow(2, 10 * (p - 1)) * p + p * p * p * p * p * p * (1 - p);
3246}); // previously 2 ** (10 * (p - 1)) but that doesn't end up with the value quite at the right spot so we do a blended ease to ensure it lands where it should perfectly.
3247
3248_insertEase("Circ", function (p) {
3249  return -(_sqrt(1 - p * p) - 1);
3250});
3251_insertEase("Sine", function (p) {
3252  return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1;
3253});
3254_insertEase("Back", _configBack("in"), _configBack("out"), _configBack());
3255_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {
3256  config: function config(steps, immediateStart) {
3257    if (steps === void 0) {
3258      steps = 1;
3259    }
3260    var p1 = 1 / steps,
3261      p2 = steps + (immediateStart ? 0 : 1),
3262      p3 = immediateStart ? 1 : 0,
3263      max = 1 - _tinyNum;
3264    return function (p) {
3265      return ((p2 * _clamp(0, max, p) | 0) + p3) * p1;
3266    };
3267  }
3268};
3269_defaults.ease = _easeMap["quad.out"];
3270_forEachName("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt", function (name) {
3271  return _callbackNames += name + "," + name + "Params,";
3272});
3273/*
3274 * --------------------------------------------------------------------------------------
3275 * CACHE
3276 * --------------------------------------------------------------------------------------
3277 */
3278
3279var GSCache = function GSCache(target, harness) {
3280  this.id = _gsID++;
3281  target._gsap = this;
3282  this.target = target;
3283  this.harness = harness;
3284  this.get = harness ? harness.get : _getProperty;
3285  this.set = harness ? harness.getSetter : _getSetter;
3286};
3287/*
3288 * --------------------------------------------------------------------------------------
3289 * ANIMATION
3290 * --------------------------------------------------------------------------------------
3291 */
3292
3293var Animation = /*#__PURE__*/function () {
3294  function Animation(vars) {
3295    this.vars = vars;
3296    this._delay = +vars.delay || 0;
3297    if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) {
3298      // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start.
3299      this._rDelay = vars.repeatDelay || 0;
3300      this._yoyo = !!vars.yoyo || !!vars.yoyoEase;
3301    }
3302    this._ts = 1;
3303    _setDuration(this, +vars.duration, 1, 1);
3304    this.data = vars.data;
3305    if (_context) {
3306      this._ctx = _context;
3307      _context.data.push(this);
3308    }
3309    _tickerActive || _ticker.wake();
3310  }
3311  var _proto = Animation.prototype;
3312  _proto.delay = function delay(value) {
3313    if (value || value === 0) {
3314      this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay);
3315      this._delay = value;
3316      return this;
3317    }
3318    return this._delay;
3319  };
3320  _proto.duration = function duration(value) {
3321    return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;
3322  };
3323  _proto.totalDuration = function totalDuration(value) {
3324    if (!arguments.length) {
3325      return this._tDur;
3326    }
3327    this._dirty = 0;
3328    return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1));
3329  };
3330  _proto.totalTime = function totalTime(_totalTime, suppressEvents) {
3331    _wake();
3332    if (!arguments.length) {
3333      return this._tTime;
3334    }
3335    var parent = this._dp;
3336    if (parent && parent.smoothChildTiming && this._ts) {
3337      _alignPlayhead(this, _totalTime);
3338      !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent.
3339      //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed.
3340
3341      while (parent && parent.parent) {
3342        if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {
3343          parent.totalTime(parent._tTime, true);
3344        }
3345        parent = parent.parent;
3346      }
3347      if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) {
3348        //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in.
3349        _addToTimeline(this._dp, this, this._start - this._delay);
3350      }
3351    }
3352    if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !_totalTime && !this._initted && (this.add || this._ptLookup)) {
3353      // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional)
3354      this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause
3355      //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit)
3356      //   this._lock = 1;
3357
3358      _lazySafeRender(this, _totalTime, suppressEvents); //   this._lock = 0;
3359      //}
3360    }
3361    return this;
3362  };
3363  _proto.time = function time(value, suppressEvents) {
3364    return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START!
3365  };
3366  _proto.totalProgress = function totalProgress(value, suppressEvents) {
3367    return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() >= 0 && this._initted ? 1 : 0;
3368  };
3369  _proto.progress = function progress(value, suppressEvents) {
3370    return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0;
3371  };
3372  _proto.iteration = function iteration(value, suppressEvents) {
3373    var cycleDuration = this.duration() + this._rDelay;
3374    return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;
3375  } // potential future addition:
3376  // isPlayingBackwards() {
3377  // 	let animation = this,
3378  // 		orientation = 1; // 1 = forward, -1 = backward
3379  // 	while (animation) {
3380  // 		orientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1;
3381  // 		animation = animation.parent;
3382  // 	}
3383  // 	return orientation < 0;
3384  // }
3385  ;
3386  _proto.timeScale = function timeScale(value, suppressEvents) {
3387    if (!arguments.length) {
3388      return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed.
3389    }
3390    if (this._rts === value) {
3391      return this;
3392    }
3393    var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation.
3394    // future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called.
3395    //(+value < 0 && this._rts >= 0) && _callback(this, "onReverse", true);
3396    // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes.
3397
3398    this._rts = +value || 0;
3399    this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused.
3400
3401    this.totalTime(_clamp(-Math.abs(this._delay), this._tDur, tTime), suppressEvents !== false);
3402    _setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here.
3403
3404    return _recacheAncestors(this);
3405  };
3406  _proto.paused = function paused(value) {
3407    if (!arguments.length) {
3408      return this._ps;
3409    } // possible future addition - if an animation is removed from its parent and then .restart() or .play() or .resume() is called, perhaps we should force it back into the globalTimeline but be careful because what if it's already at its end? We don't want it to just persist forever and not get released for GC.
3410    // !this.parent && !value && this._tTime < this._tDur && this !== _globalTimeline && _globalTimeline.add(this);
3411
3412    if (this._ps !== value) {
3413      this._ps = value;
3414      if (value) {
3415        this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming.
3416
3417        this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the "real" timeScale as _rts (recorded time scale)
3418      } else {
3419        _wake();
3420        this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated.
3421
3422        this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise.
3423      }
3424    }
3425    return this;
3426  };
3427  _proto.startTime = function startTime(value) {
3428    if (arguments.length) {
3429      this._start = value;
3430      var parent = this.parent || this._dp;
3431      parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, value - this._delay);
3432      return this;
3433    }
3434    return this._start;
3435  };
3436  _proto.endTime = function endTime(includeRepeats) {
3437    return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1);
3438  };
3439  _proto.rawTime = function rawTime(wrapRepeats) {
3440    var parent = this.parent || this._dp; // _dp = detached parent
3441
3442    return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);
3443  };
3444  _proto.revert = function revert(config) {
3445    if (config === void 0) {
3446      config = _revertConfig;
3447    }
3448    var prevIsReverting = _reverting;
3449    _reverting = config;
3450    if (this._initted || this._startAt) {
3451      this.timeline && this.timeline.revert(config);
3452      this.totalTime(-0.01, config.suppressEvents);
3453    }
3454    this.data !== "nested" && config.kill !== false && this.kill();
3455    _reverting = prevIsReverting;
3456    return this;
3457  };
3458  _proto.globalTime = function globalTime(rawTime) {
3459    var animation = this,
3460      time = arguments.length ? rawTime : animation.rawTime();
3461    while (animation) {
3462      time = animation._start + time / (Math.abs(animation._ts) || 1);
3463      animation = animation._dp;
3464    }
3465    return !this.parent && this._sat ? this._sat.globalTime(rawTime) : time; // the _startAt tweens for .fromTo() and .from() that have immediateRender should always be FIRST in the timeline (important for context.revert()). "_sat" stands for _startAtTween, referring to the parent tween that created the _startAt. We must discern if that tween had immediateRender so that we can know whether or not to prioritize it in revert().
3466  };
3467  _proto.repeat = function repeat(value) {
3468    if (arguments.length) {
3469      this._repeat = value === Infinity ? -2 : value;
3470      return _onUpdateTotalDuration(this);
3471    }
3472    return this._repeat === -2 ? Infinity : this._repeat;
3473  };
3474  _proto.repeatDelay = function repeatDelay(value) {
3475    if (arguments.length) {
3476      var time = this._time;
3477      this._rDelay = value;
3478      _onUpdateTotalDuration(this);
3479      return time ? this.time(time) : this;
3480    }
3481    return this._rDelay;
3482  };
3483  _proto.yoyo = function yoyo(value) {
3484    if (arguments.length) {
3485      this._yoyo = value;
3486      return this;
3487    }
3488    return this._yoyo;
3489  };
3490  _proto.seek = function seek(position, suppressEvents) {
3491    return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));
3492  };
3493  _proto.restart = function restart(includeDelay, suppressEvents) {
3494    this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));
3495    this._dur || (this._zTime = -_tinyNum); // ensures onComplete fires on a zero-duration animation that gets restarted.
3496
3497    return this;
3498  };
3499  _proto.play = function play(from, suppressEvents) {
3500    from != null && this.seek(from, suppressEvents);
3501    return this.reversed(false).paused(false);
3502  };
3503  _proto.reverse = function reverse(from, suppressEvents) {
3504    from != null && this.seek(from || this.totalDuration(), suppressEvents);
3505    return this.reversed(true).paused(false);
3506  };
3507  _proto.pause = function pause(atTime, suppressEvents) {
3508    atTime != null && this.seek(atTime, suppressEvents);
3509    return this.paused(true);
3510  };
3511  _proto.resume = function resume() {
3512    return this.paused(false);
3513  };
3514  _proto.reversed = function reversed(value) {
3515    if (arguments.length) {
3516      !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum.
3517
3518      return this;
3519    }
3520    return this._rts < 0;
3521  };
3522  _proto.invalidate = function invalidate() {
3523    this._initted = this._act = 0;
3524    this._zTime = -_tinyNum;
3525    return this;
3526  };
3527  _proto.isActive = function isActive() {
3528    var parent = this.parent || this._dp,
3529      start = this._start,
3530      rawTime;
3531    return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum);
3532  };
3533  _proto.eventCallback = function eventCallback(type, callback, params) {
3534    var vars = this.vars;
3535    if (arguments.length > 1) {
3536      if (!callback) {
3537        delete vars[type];
3538      } else {
3539        vars[type] = callback;
3540        params && (vars[type + "Params"] = params);
3541        type === "onUpdate" && (this._onUpdate = callback);
3542      }
3543      return this;
3544    }
3545    return vars[type];
3546  };
3547  _proto.then = function then(onFulfilled) {
3548    var self = this;
3549    return new Promise(function (resolve) {
3550      var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,
3551        _resolve = function _resolve() {
3552          var _then = self.then;
3553          self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322)
3554
3555          _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);
3556          resolve(f);
3557          self.then = _then;
3558        };
3559      if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) {
3560        _resolve();
3561      } else {
3562        self._prom = _resolve;
3563      }
3564    });
3565  };
3566  _proto.kill = function kill() {
3567    _interrupt(this);
3568  };
3569  return Animation;
3570}();
3571_setDefaults(Animation.prototype, {
3572  _time: 0,
3573  _start: 0,
3574  _end: 0,
3575  _tTime: 0,
3576  _tDur: 0,
3577  _dirty: 0,
3578  _repeat: 0,
3579  _yoyo: false,
3580  parent: null,
3581  _initted: false,
3582  _rDelay: 0,
3583  _ts: 1,
3584  _dp: 0,
3585  ratio: 0,
3586  _zTime: -_tinyNum,
3587  _prom: 0,
3588  _ps: false,
3589  _rts: 1
3590});
3591/*
3592 * -------------------------------------------------
3593 * TIMELINE
3594 * -------------------------------------------------
3595 */
3596
3597var Timeline = /*#__PURE__*/function (_Animation) {
3598  _inheritsLoose(Timeline, _Animation);
3599  function Timeline(vars, position) {
3600    var _this;
3601    if (vars === void 0) {
3602      vars = {};
3603    }
3604    _this = _Animation.call(this, vars) || this;
3605    _this.labels = {};
3606    _this.smoothChildTiming = !!vars.smoothChildTiming;
3607    _this.autoRemoveChildren = !!vars.autoRemoveChildren;
3608    _this._sort = _isNotFalse(vars.sortChildren);
3609    _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position);
3610    vars.reversed && _this.reverse();
3611    vars.paused && _this.paused(true);
3612    vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger);
3613    return _this;
3614  }
3615  var _proto2 = Timeline.prototype;
3616  _proto2.to = function to(targets, vars, position) {
3617    _createTweenType(0, arguments, this);
3618    return this;
3619  };
3620  _proto2.from = function from(targets, vars, position) {
3621    _createTweenType(1, arguments, this);
3622    return this;
3623  };
3624  _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) {
3625    _createTweenType(2, arguments, this);
3626    return this;
3627  };
3628  _proto2.set = function set(targets, vars, position) {
3629    vars.duration = 0;
3630    vars.parent = this;
3631    _inheritDefaults(vars).repeatDelay || (vars.repeat = 0);
3632    vars.immediateRender = !!vars.immediateRender;
3633    new Tween(targets, vars, _parsePosition(this, position), 1);
3634    return this;
3635  };
3636  _proto2.call = function call(callback, params, position) {
3637    return _addToTimeline(this, Tween.delayedCall(0, callback, params), position);
3638  } //ONLY for backward compatibility! Maybe delete?
3639  ;
3640  _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {
3641    vars.duration = duration;
3642    vars.stagger = vars.stagger || stagger;
3643    vars.onComplete = onCompleteAll;
3644    vars.onCompleteParams = onCompleteAllParams;
3645    vars.parent = this;
3646    new Tween(targets, vars, _parsePosition(this, position));
3647    return this;
3648  };
3649  _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {
3650    vars.runBackwards = 1;
3651    _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);
3652    return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);
3653  };
3654  _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {
3655    toVars.startAt = fromVars;
3656    _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);
3657    return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);
3658  };
3659  _proto2.render = function render(totalTime, suppressEvents, force) {
3660    var prevTime = this._time,
3661      tDur = this._dirty ? this.totalDuration() : this._tDur,
3662      dur = this._dur,
3663      tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime),
3664      // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example.
3665      crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur),
3666      time,
3667      child,
3668      next,
3669      iteration,
3670      cycleDuration,
3671      prevPaused,
3672      pauseTween,
3673      timeScale,
3674      prevStart,
3675      prevIteration,
3676      yoyo,
3677      isYoyo;
3678    this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur);
3679    if (tTime !== this._tTime || force || crossingStart) {
3680      if (prevTime !== this._time && dur) {
3681        //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).
3682        tTime += this._time - prevTime;
3683        totalTime += this._time - prevTime;
3684      }
3685      time = tTime;
3686      prevStart = this._start;
3687      timeScale = this._ts;
3688      prevPaused = !timeScale;
3689      if (crossingStart) {
3690        dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.
3691
3692        (totalTime || !suppressEvents) && (this._zTime = totalTime);
3693      }
3694      if (this._repeat) {
3695        //adjust the time for repeats and yoyos
3696        yoyo = this._yoyo;
3697        cycleDuration = dur + this._rDelay;
3698        if (this._repeat < -1 && totalTime < 0) {
3699          return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);
3700        }
3701        time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)
3702
3703        if (tTime === tDur) {
3704          // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)
3705          iteration = this._repeat;
3706          time = dur;
3707        } else {
3708          prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)
3709
3710          iteration = ~~prevIteration;
3711          if (iteration && iteration === prevIteration) {
3712            time = dur;
3713            iteration--;
3714          }
3715          time > dur && (time = dur);
3716        }
3717        prevIteration = _animationCycle(this._tTime, cycleDuration);
3718        !prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://gsap.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 also, this._tTime - prevIteration * cycleDuration - this._dur <= 0 just checks to make sure it wasn't previously in the "repeatDelay" portion
3719
3720        if (yoyo && iteration & 1) {
3721          time = dur - time;
3722          isYoyo = 1;
3723        }
3724        /*
3725        make sure children at the end/beginning of the timeline are rendered properly. If, for example,
3726        a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which
3727        would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there
3728        could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So
3729        we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must
3730        ensure that zero-duration tweens at the very beginning or end of the Timeline work.
3731        */
3732
3733        if (iteration !== prevIteration && !this._lock) {
3734          var rewinding = yoyo && prevIteration & 1,
3735            doesWrap = rewinding === (yoyo && iteration & 1);
3736          iteration < prevIteration && (rewinding = !rewinding);
3737          prevTime = rewinding ? 0 : tTime % dur ? dur : tTime; // if the playhead is landing exactly at the end of an iteration, use that totalTime rather than only the duration, otherwise it'll skip the 2nd render since it's effectively at the same time.
3738
3739          this._lock = 1;
3740          this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;
3741          this._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate.
3742
3743          !suppressEvents && this.parent && _callback(this, "onRepeat");
3744          this.vars.repeatRefresh && !isYoyo && (this.invalidate()._lock = 1);
3745          if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) {
3746            // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well.
3747            return this;
3748          }
3749          dur = this._dur; // in case the duration changed in the onRepeat
3750
3751          tDur = this._tDur;
3752          if (doesWrap) {
3753            this._lock = 2;
3754            prevTime = rewinding ? dur : -0.0001;
3755            this.render(prevTime, true);
3756            this.vars.repeatRefresh && !isYoyo && this.invalidate();
3757          }
3758          this._lock = 0;
3759          if (!this._ts && !prevPaused) {
3760            return this;
3761          } //in order for yoyoEase to work properly when there's a stagger, we must swap out the ease in each sub-tween.
3762
3763          _propagateYoyoEase(this, isYoyo);
3764        }
3765      }
3766      if (this._hasPause && !this._forcing && this._lock < 2) {
3767        pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time));
3768        if (pauseTween) {
3769          tTime -= time - (time = pauseTween._start);
3770        }
3771      }
3772      this._tTime = tTime;
3773      this._time = time;
3774      this._act = !timeScale; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.
3775
3776      if (!this._initted) {
3777        this._onUpdate = this.vars.onUpdate;
3778        this._initted = 1;
3779        this._zTime = totalTime;
3780        prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}).
3781      }
3782      if (!prevTime && time && !suppressEvents && !iteration) {
3783        _callback(this, "onStart");
3784        if (this._tTime !== tTime) {
3785          // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.
3786          return this;
3787        }
3788      }
3789      if (time >= prevTime && totalTime >= 0) {
3790        child = this._first;
3791        while (child) {
3792          next = child._next;
3793          if ((child._act || time >= child._start) && child._ts && pauseTween !== child) {
3794            if (child.parent !== this) {
3795              // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.
3796              return this.render(totalTime, suppressEvents, force);
3797            }
3798            child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);
3799            if (time !== this._time || !this._ts && !prevPaused) {
3800              //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
3801              pauseTween = 0;
3802              next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that the next time render() is called it'll be forced (to render any remaining children)
3803
3804              break;
3805            }
3806          }
3807          child = next;
3808        }
3809      } else {
3810        child = this._last;
3811        var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values.
3812
3813        while (child) {
3814          next = child._prev;
3815          if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {
3816            if (child.parent !== this) {
3817              // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.
3818              return this.render(totalTime, suppressEvents, force);
3819            }
3820            child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || _reverting && (child._initted || child._startAt)); // if reverting, we should always force renders of initted tweens (but remember that .fromTo() or .from() may have a _startAt but not _initted yet). If, for example, a .fromTo() tween with a stagger (which creates an internal timeline) gets reverted BEFORE some of its child tweens render for the first time, it may not properly trigger them to revert.
3821
3822            if (time !== this._time || !this._ts && !prevPaused) {
3823              //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
3824              pauseTween = 0;
3825              next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children)
3826
3827              break;
3828            }
3829          }
3830          child = next;
3831        }
3832      }
3833      if (pauseTween && !suppressEvents) {
3834        this.pause();
3835        pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;
3836        if (this._ts) {
3837          //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened).
3838          this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift.
3839
3840          _setEnd(this);
3841          return this.render(totalTime, suppressEvents, force);
3842        }
3843      }
3844      this._onUpdate && !suppressEvents && _callback(this, "onUpdate", true);
3845      if (tTime === tDur && this._tTime >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) {
3846        // remember, a child's callback may alter this timeline's playhead or timeScale which is why we need to add some of these checks.
3847        (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.
3848
3849        if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) {
3850          _callback(this, tTime === tDur && totalTime >= 0 ? "onComplete" : "onReverseComplete", true);
3851          this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();
3852        }
3853      }
3854    }
3855    return this;
3856  };
3857  _proto2.add = function add(child, position) {
3858    var _this2 = this;
3859    _isNumber(position) || (position = _parsePosition(this, position, child));
3860    if (!(child instanceof Animation)) {
3861      if (_isArray(child)) {
3862        child.forEach(function (obj) {
3863          return _this2.add(obj, position);
3864        });
3865        return this;
3866      }
3867      if (_isString(child)) {
3868        return this.addLabel(child, position);
3869      }
3870      if (_isFunction(child)) {
3871        child = Tween.delayedCall(0, child);
3872      } else {
3873        return this;
3874      }
3875    }
3876    return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child!
3877  };
3878  _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) {
3879    if (nested === void 0) {
3880      nested = true;
3881    }
3882    if (tweens === void 0) {
3883      tweens = true;
3884    }
3885    if (timelines === void 0) {
3886      timelines = true;
3887    }
3888    if (ignoreBeforeTime === void 0) {
3889      ignoreBeforeTime = -_bigNum;
3890    }
3891    var a = [],
3892      child = this._first;
3893    while (child) {
3894      if (child._start >= ignoreBeforeTime) {
3895        if (child instanceof Tween) {
3896          tweens && a.push(child);
3897        } else {
3898          timelines && a.push(child);
3899          nested && a.push.apply(a, child.getChildren(true, tweens, timelines));
3900        }
3901      }
3902      child = child._next;
3903    }
3904    return a;
3905  };
3906  _proto2.getById = function getById(id) {
3907    var animations = this.getChildren(1, 1, 1),
3908      i = animations.length;
3909    while (i--) {
3910      if (animations[i].vars.id === id) {
3911        return animations[i];
3912      }
3913    }
3914  };
3915  _proto2.remove = function remove(child) {
3916    if (_isString(child)) {
3917      return this.removeLabel(child);
3918    }
3919    if (_isFunction(child)) {
3920      return this.killTweensOf(child);
3921    }
3922    child.parent === this && _removeLinkedListItem(this, child);
3923    if (child === this._recent) {
3924      this._recent = this._last;
3925    }
3926    return _uncache(this);
3927  };
3928  _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) {
3929    if (!arguments.length) {
3930      return this._tTime;
3931    }
3932    this._forcing = 1;
3933    if (!this._dp && this._ts) {
3934      //special case for the global timeline (or any other that has no parent or detached parent).
3935      this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts));
3936    }
3937    _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents);
3938    this._forcing = 0;
3939    return this;
3940  };
3941  _proto2.addLabel = function addLabel(label, position) {
3942    this.labels[label] = _parsePosition(this, position);
3943    return this;
3944  };
3945  _proto2.removeLabel = function removeLabel(label) {
3946    delete this.labels[label];
3947    return this;
3948  };
3949  _proto2.addPause = function addPause(position, callback, params) {
3950    var t = Tween.delayedCall(0, callback || _emptyFunc, params);
3951    t.data = "isPause";
3952    this._hasPause = 1;
3953    return _addToTimeline(this, t, _parsePosition(this, position));
3954  };
3955  _proto2.removePause = function removePause(position) {
3956    var child = this._first;
3957    position = _parsePosition(this, position);
3958    while (child) {
3959      if (child._start === position && child.data === "isPause") {
3960        _removeFromParent(child);
3961      }
3962      child = child._next;
3963    }
3964  };
3965  _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) {
3966    var tweens = this.getTweensOf(targets, onlyActive),
3967      i = tweens.length;
3968    while (i--) {
3969      _overwritingTween !== tweens[i] && tweens[i].kill(targets, props);
3970    }
3971    return this;
3972  };
3973  _proto2.getTweensOf = function getTweensOf(targets, onlyActive) {
3974    var a = [],
3975      parsedTargets = toArray(targets),
3976      child = this._first,
3977      isGlobalTime = _isNumber(onlyActive),
3978      // a number is interpreted as a global time. If the animation spans
3979      children;
3980    while (child) {
3981      if (child instanceof Tween) {
3982        if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) {
3983          // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted.
3984          a.push(child);
3985        }
3986      } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {
3987        a.push.apply(a, children);
3988      }
3989      child = child._next;
3990    }
3991    return a;
3992  } // potential future feature - targets() on timelines
3993  // targets() {
3994  // 	let result = [];
3995  // 	this.getChildren(true, true, false).forEach(t => result.push(...t.targets()));
3996  // 	return result.filter((v, i) => result.indexOf(v) === i);
3997  // }
3998  ;
3999  _proto2.tweenTo = function tweenTo(position, vars) {
4000    vars = vars || {};
4001    var tl = this,
4002      endTime = _parsePosition(tl, position),
4003      _vars = vars,
4004      startAt = _vars.startAt,
4005      _onStart = _vars.onStart,
4006      onStartParams = _vars.onStartParams,
4007      immediateRender = _vars.immediateRender,
4008      initted,
4009      tween = Tween.to(tl, _setDefaults({
4010        ease: vars.ease || "none",
4011        lazy: false,
4012        immediateRender: false,
4013        time: endTime,
4014        overwrite: "auto",
4015        duration: vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum,
4016        onStart: function onStart() {
4017          tl.pause();
4018          if (!initted) {
4019            var duration = vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale());
4020            tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);
4021            initted = 1;
4022          }
4023          _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it.
4024        }
4025      }, vars));
4026    return immediateRender ? tween.render(0) : tween;
4027  };
4028  _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) {
4029    return this.tweenTo(toPosition, _setDefaults({
4030      startAt: {
4031        time: _parsePosition(this, fromPosition)
4032      }
4033    }, vars));
4034  };
4035  _proto2.recent = function recent() {
4036    return this._recent;
4037  };
4038  _proto2.nextLabel = function nextLabel(afterTime) {
4039    if (afterTime === void 0) {
4040      afterTime = this._time;
4041    }
4042    return _getLabelInDirection(this, _parsePosition(this, afterTime));
4043  };
4044  _proto2.previousLabel = function previousLabel(beforeTime) {
4045    if (beforeTime === void 0) {
4046      beforeTime = this._time;
4047    }
4048    return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);
4049  };
4050  _proto2.currentLabel = function currentLabel(value) {
4051    return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);
4052  };
4053  _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) {
4054    if (ignoreBeforeTime === void 0) {
4055      ignoreBeforeTime = 0;
4056    }
4057    var child = this._first,
4058      labels = this.labels,
4059      p;
4060    while (child) {
4061      if (child._start >= ignoreBeforeTime) {
4062        child._start += amount;
4063        child._end += amount;
4064      }
4065      child = child._next;
4066    }
4067    if (adjustLabels) {
4068      for (p in labels) {
4069        if (labels[p] >= ignoreBeforeTime) {
4070          labels[p] += amount;
4071        }
4072      }
4073    }
4074    return _uncache(this);
4075  };
4076  _proto2.invalidate = function invalidate(soft) {
4077    var child = this._first;
4078    this._lock = 0;
4079    while (child) {
4080      child.invalidate(soft);
4081      child = child._next;
4082    }
4083    return _Animation.prototype.invalidate.call(this, soft);
4084  };
4085  _proto2.clear = function clear(includeLabels) {
4086    if (includeLabels === void 0) {
4087      includeLabels = true;
4088    }
4089    var child = this._first,
4090      next;
4091    while (child) {
4092      next = child._next;
4093      this.remove(child);
4094      child = next;
4095    }
4096    this._dp && (this._time = this._tTime = this._pTime = 0);
4097    includeLabels && (this.labels = {});
4098    return _uncache(this);
4099  };
4100  _proto2.totalDuration = function totalDuration(value) {
4101    var max = 0,
4102      self = this,
4103      child = self._last,
4104      prevStart = _bigNum,
4105      prev,
4106      start,
4107      parent;
4108    if (arguments.length) {
4109      return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));
4110    }
4111    if (self._dirty) {
4112      parent = self.parent;
4113      while (child) {
4114        prev = child._prev; //record it here in case the tween changes position in the sequence...
4115
4116        child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it.
4117
4118        start = child._start;
4119        if (start > prevStart && self._sort && child._ts && !self._lock) {
4120          //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence
4121          self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add().
4122
4123          _addToTimeline(self, child, start - child._delay, 1)._lock = 0;
4124        } else {
4125          prevStart = start;
4126        }
4127        if (start < 0 && child._ts) {
4128          //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.
4129          max -= start;
4130          if (!parent && !self._dp || parent && parent.smoothChildTiming) {
4131            self._start += start / self._ts;
4132            self._time -= start;
4133            self._tTime -= start;
4134          }
4135          self.shiftChildren(-start, false, -1e999);
4136          prevStart = 0;
4137        }
4138        child._end > max && child._ts && (max = child._end);
4139        child = prev;
4140      }
4141      _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1);
4142      self._dirty = 0;
4143    }
4144    return self._tDur;
4145  };
4146  Timeline.updateRoot = function updateRoot(time) {
4147    if (_globalTimeline._ts) {
4148      _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));
4149      _lastRenderedFrame = _ticker.frame;
4150    }
4151    if (_ticker.frame >= _nextGCFrame) {
4152      _nextGCFrame += _config.autoSleep || 120;
4153      var child = _globalTimeline._first;
4154      if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {
4155        while (child && !child._ts) {
4156          child = child._next;
4157        }
4158        child || _ticker.sleep();
4159      }
4160    }
4161  };
4162  return Timeline;
4163}(Animation);
4164_setDefaults(Timeline.prototype, {
4165  _lock: 0,
4166  _hasPause: 0,
4167  _forcing: 0
4168});
4169var _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) {
4170    //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
4171    var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),
4172      index = 0,
4173      matchIndex = 0,
4174      result,
4175      startNums,
4176      color,
4177      endNum,
4178      chunk,
4179      startNum,
4180      hasRandom,
4181      a;
4182    pt.b = start;
4183    pt.e = end;
4184    start += ""; //ensure values are strings
4185
4186    end += "";
4187    if (hasRandom = ~end.indexOf("random(")) {
4188      end = _replaceRandom(end);
4189    }
4190    if (stringFilter) {
4191      a = [start, end];
4192      stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.
4193
4194      start = a[0];
4195      end = a[1];
4196    }
4197    startNums = start.match(_complexStringNumExp) || [];
4198    while (result = _complexStringNumExp.exec(end)) {
4199      endNum = result[0];
4200      chunk = end.substring(index, result.index);
4201      if (color) {
4202        color = (color + 1) % 5;
4203      } else if (chunk.substr(-5) === "rgba(") {
4204        color = 1;
4205      }
4206      if (endNum !== startNums[matchIndex++]) {
4207        startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.
4208
4209        pt._pt = {
4210          _next: pt._pt,
4211          p: chunk || matchIndex === 1 ? chunk : ",",
4212          //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.
4213          s: startNum,
4214          c: endNum.charAt(1) === "=" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum,
4215          m: color && color < 4 ? Math.round : 0
4216        };
4217        index = _complexStringNumExp.lastIndex;
4218      }
4219    }
4220    pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number)
4221
4222    pt.fp = funcParam;
4223    if (_relExp.test(end) || hasRandom) {
4224      pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).
4225    }
4226    this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin.
4227
4228    return pt;
4229  },
4230  _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) {
4231    _isFunction(end) && (end = end(index || 0, target, targets));
4232    var currentValue = target[prop],
4233      parsedStart = start !== "get" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf("set") || !_isFunction(target["get" + prop.substr(3)]) ? prop : "get" + prop.substr(3)](funcParam) : target[prop](),
4234      setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,
4235      pt;
4236    if (_isString(end)) {
4237      if (~end.indexOf("random(")) {
4238        end = _replaceRandom(end);
4239      }
4240      if (end.charAt(1) === "=") {
4241        pt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0);
4242        if (pt || pt === 0) {
4243          // to avoid isNaN, like if someone passes in a value like "!= whatever"
4244          end = pt;
4245        }
4246      }
4247    }
4248    if (!optional || parsedStart !== end || _forceAllPropTweens) {
4249      if (!isNaN(parsedStart * end) && end !== "") {
4250        // fun fact: any number multiplied by "" is evaluated as the number 0!
4251        pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === "boolean" ? _renderBoolean : _renderPlain, 0, setter);
4252        funcParam && (pt.fp = funcParam);
4253        modifier && pt.modifier(modifier, this, target);
4254        return this._pt = pt;
4255      }
4256      !currentValue && !(prop in target) && _missingPlugin(prop, end);
4257      return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);
4258    }
4259  },
4260  //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with "random()" in them. It does NOT process relative values.
4261  _processVars = function _processVars(vars, index, target, targets, tween) {
4262    _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));
4263    if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) {
4264      return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;
4265    }
4266    var copy = {},
4267      p;
4268    for (p in vars) {
4269      copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);
4270    }
4271    return copy;
4272  },
4273  _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) {
4274    var plugin, pt, ptLookup, i;
4275    if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {
4276      tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);
4277      if (tween !== _quickTween) {
4278        ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger.
4279
4280        i = plugin._props.length;
4281        while (i--) {
4282          ptLookup[plugin._props[i]] = pt;
4283        }
4284      }
4285    }
4286    return plugin;
4287  },
4288  _overwritingTween,
4289  //store a reference temporarily so we can avoid overwriting itself.
4290  _forceAllPropTweens,
4291  _initTween = function _initTween(tween, time, tTime) {
4292    var vars = tween.vars,
4293      ease = vars.ease,
4294      startAt = vars.startAt,
4295      immediateRender = vars.immediateRender,
4296      lazy = vars.lazy,
4297      onUpdate = vars.onUpdate,
4298      runBackwards = vars.runBackwards,
4299      yoyoEase = vars.yoyoEase,
4300      keyframes = vars.keyframes,
4301      autoRevert = vars.autoRevert,
4302      dur = tween._dur,
4303      prevStartAt = tween._startAt,
4304      targets = tween._targets,
4305      parent = tween.parent,
4306      fullTargets = parent && parent.data === "nested" ? parent.vars.targets : targets,
4307      autoOverwrite = tween._overwrite === "auto" && !_suppressOverwrites,
4308      tl = tween.timeline,
4309      cleanVars,
4310      i,
4311      p,
4312      pt,
4313      target,
4314      hasPriority,
4315      gsData,
4316      harness,
4317      plugin,
4318      ptLookup,
4319      index,
4320      harnessVars,
4321      overwritten;
4322    tl && (!keyframes || !ease) && (ease = "none");
4323    tween._ease = _parseEase(ease, _defaults.ease);
4324    tween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0;
4325    if (yoyoEase && tween._yoyo && !tween._repeat) {
4326      //there must have been a parent timeline with yoyo:true that is currently in its yoyo phase, so flip the eases.
4327      yoyoEase = tween._yEase;
4328      tween._yEase = tween._ease;
4329      tween._ease = yoyoEase;
4330    }
4331    tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens.
4332
4333    if (!tl || keyframes && !vars.stagger) {
4334      //if there's an internal timeline, skip all the parsing because we passed that task down the chain.
4335      harness = targets[0] ? _getCache(targets[0]).harness : 0;
4336      harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an "x" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example.
4337
4338      cleanVars = _copyExcluding(vars, _reservedProps);
4339      if (prevStartAt) {
4340        prevStartAt._zTime < 0 && prevStartAt.progress(1); // in case it's a lazy startAt that hasn't rendered yet.
4341
4342        time < 0 && runBackwards && immediateRender && !autoRevert ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig); // if it's a "startAt" (not "from()" or runBackwards: true), we only need to do a shallow revert (keep transforms cached in CSSPlugin)
4343        // don't just _removeFromParent(prevStartAt.render(-1, true)) because that'll leave inline styles. We're creating a new _startAt for "startAt" tweens that re-capture things to ensure that if the pre-tween values changed since the tween was created, they're recorded.
4344
4345        prevStartAt._lazy = 0;
4346      }
4347      if (startAt) {
4348        _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({
4349          data: "isStart",
4350          overwrite: false,
4351          parent: parent,
4352          immediateRender: true,
4353          lazy: !prevStartAt && _isNotFalse(lazy),
4354          startAt: null,
4355          delay: 0,
4356          onUpdate: onUpdate && function () {
4357            return _callback(tween, "onUpdate");
4358          },
4359          stagger: 0
4360        }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from);
4361
4362        tween._startAt._dp = 0; // don't allow it to get put back into root timeline! Like when revert() is called and totalTime() gets set.
4363
4364        tween._startAt._sat = tween; // used in globalTime(). _sat stands for _startAtTween
4365
4366        time < 0 && (_reverting || !immediateRender && !autoRevert) && tween._startAt.revert(_revertConfigNoKill); // rare edge case, like if a render is forced in the negative direction of a non-initted tween.
4367
4368        if (immediateRender) {
4369          if (dur && time <= 0 && tTime <= 0) {
4370            // check tTime here because in the case of a yoyo tween whose playhead gets pushed to the end like tween.progress(1), we should allow it through so that the onComplete gets fired properly.
4371            time && (tween._zTime = time);
4372            return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.
4373          }
4374        }
4375      } else if (runBackwards && dur) {
4376        //from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)
4377        if (!prevStartAt) {
4378          time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0
4379
4380          p = _setDefaults({
4381            overwrite: false,
4382            data: "isFromStart",
4383            //we tag the tween with as "isFromStart" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a "from()" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.
4384            lazy: immediateRender && !prevStartAt && _isNotFalse(lazy),
4385            immediateRender: immediateRender,
4386            //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)
4387            stagger: 0,
4388            parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(".class", {y: gsap.utils.wrap([-100,100]), stagger: 0.5})
4389          }, cleanVars);
4390          harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}})
4391
4392          _removeFromParent(tween._startAt = Tween.set(targets, p));
4393          tween._startAt._dp = 0; // don't allow it to get put back into root timeline!
4394
4395          tween._startAt._sat = tween; // used in globalTime()
4396
4397          time < 0 && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true));
4398          tween._zTime = time;
4399          if (!immediateRender) {
4400            _initTween(tween._startAt, _tinyNum, _tinyNum); //ensures that the initial values are recorded
4401          } else if (!time) {
4402            return;
4403          }
4404        }
4405      }
4406      tween._pt = tween._ptCache = 0;
4407      lazy = dur && _isNotFalse(lazy) || lazy && !dur;
4408      for (i = 0; i < targets.length; i++) {
4409        target = targets[i];
4410        gsData = target._gsap || _harness(targets)[i]._gsap;
4411        tween._ptLookup[i] = ptLookup = {};
4412        _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)
4413
4414        index = fullTargets === targets ? i : fullTargets.indexOf(target);
4415        if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {
4416          tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);
4417          plugin._props.forEach(function (name) {
4418            ptLookup[name] = pt;
4419          });
4420          plugin.priority && (hasPriority = 1);
4421        }
4422        if (!harness || harnessVars) {
4423          for (p in cleanVars) {
4424            if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {
4425              plugin.priority && (hasPriority = 1);
4426            } else {
4427              ptLookup[p] = pt = _addPropTween.call(tween, target, p, "get", cleanVars[p], index, fullTargets, 0, vars.stringFilter);
4428            }
4429          }
4430        }
4431        tween._op && tween._op[i] && tween.kill(target, tween._op[i]);
4432        if (autoOverwrite && tween._pt) {
4433          _overwritingTween = tween;
4434          _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!!
4435
4436          overwritten = !tween.parent;
4437          _overwritingTween = 0;
4438        }
4439        tween._pt && lazy && (_lazyLookup[gsData.id] = 1);
4440      }
4441      hasPriority && _sortPropTweensByPriority(tween);
4442      tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down.
4443    }
4444    tween._onUpdate = onUpdate;
4445    tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick.
4446
4447    keyframes && time <= 0 && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the "before" state for any staggered/delayed animations thus when the following tween initializes, it'll use the "before" state instead of the "after" state as the initial values.
4448  },
4449  _updatePropTweens = function _updatePropTweens(tween, property, value, start, startIsRelative, ratio, time, skipRecursion) {
4450    var ptCache = (tween._pt && tween._ptCache || (tween._ptCache = {}))[property],
4451      pt,
4452      rootPT,
4453      lookup,
4454      i;
4455    if (!ptCache) {
4456      ptCache = tween._ptCache[property] = [];
4457      lookup = tween._ptLookup;
4458      i = tween._targets.length;
4459      while (i--) {
4460        pt = lookup[i][property];
4461        if (pt && pt.d && pt.d._pt) {
4462          // it's a plugin, so find the nested PropTween
4463          pt = pt.d._pt;
4464          while (pt && pt.p !== property && pt.fp !== property) {
4465            // "fp" is functionParam for things like setting CSS variables which require .setProperty("--var-name", value)
4466            pt = pt._next;
4467          }
4468        }
4469        if (!pt) {
4470          // there is no PropTween associated with that property, so we must FORCE one to be created and ditch out of this
4471          // if the tween has other properties that already rendered at new positions, we'd normally have to rewind to put them back like tween.render(0, true) before forcing an _initTween(), but that can create another edge case like tweening a timeline's progress would trigger onUpdates to fire which could move other things around. It's better to just inform users that .resetTo() should ONLY be used for tweens that already have that property. For example, you can't gsap.to(...{ y: 0 }) and then tween.restTo("x", 200) for example.
4472          _forceAllPropTweens = 1; // otherwise, when we _addPropTween() and it finds no change between the start and end values, it skips creating a PropTween (for efficiency...why tween when there's no difference?) but in this case we NEED that PropTween created so we can edit it.
4473
4474          tween.vars[property] = "+=0";
4475          _initTween(tween, time);
4476          _forceAllPropTweens = 0;
4477          return skipRecursion ? _warn(property + " not eligible for reset") : 1; // if someone tries to do a quickTo() on a special property like borderRadius which must get split into 4 different properties, that's not eligible for .resetTo().
4478        }
4479        ptCache.push(pt);
4480      }
4481    }
4482    i = ptCache.length;
4483    while (i--) {
4484      rootPT = ptCache[i];
4485      pt = rootPT._pt || rootPT; // complex values may have nested PropTweens. We only accommodate the FIRST value.
4486
4487      pt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c;
4488      pt.c = value - pt.s;
4489      rootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e)); // mainly for CSSPlugin (end value)
4490
4491      rootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b)); // (beginning value)
4492    }
4493  },
4494  _addAliasesToVars = function _addAliasesToVars(targets, vars) {
4495    var harness = targets[0] ? _getCache(targets[0]).harness : 0,
4496      propertyAliases = harness && harness.aliases,
4497      copy,
4498      p,
4499      i,
4500      aliases;
4501    if (!propertyAliases) {
4502      return vars;
4503    }
4504    copy = _merge({}, vars);
4505    for (p in propertyAliases) {
4506      if (p in copy) {
4507        aliases = propertyAliases[p].split(",");
4508        i = aliases.length;
4509        while (i--) {
4510          copy[aliases[i]] = copy[p];
4511        }
4512      }
4513    }
4514    return copy;
4515  },
4516  // parses multiple formats, like {"0%": {x: 100}, {"50%": {x: -20}} and { x: {"0%": 100, "50%": -20} }, and an "ease" can be set on any object. We populate an "allProps" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a "t" (time), "v", (value), and "e" (ease) property. This allows us to piece together a timeline later.
4517  _parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) {
4518    var ease = obj.ease || easeEach || "power1.inOut",
4519      p,
4520      a;
4521    if (_isArray(obj)) {
4522      a = allProps[prop] || (allProps[prop] = []); // t = time (out of 100), v = value, e = ease
4523
4524      obj.forEach(function (value, i) {
4525        return a.push({
4526          t: i / (obj.length - 1) * 100,
4527          v: value,
4528          e: ease
4529        });
4530      });
4531    } else {
4532      for (p in obj) {
4533        a = allProps[p] || (allProps[p] = []);
4534        p === "ease" || a.push({
4535          t: parseFloat(prop),
4536          v: obj[p],
4537          e: ease
4538        });
4539      }
4540    }
4541  },
4542  _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) {
4543    return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf("random(") ? _replaceRandom(value) : value;
4544  },
4545  _staggerTweenProps = _callbackNames + "repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert",
4546  _staggerPropsToSkip = {};
4547_forEachName(_staggerTweenProps + ",id,stagger,delay,duration,paused,scrollTrigger", function (name) {
4548  return _staggerPropsToSkip[name] = 1;
4549});
4550/*
4551 * --------------------------------------------------------------------------------------
4552 * TWEEN
4553 * --------------------------------------------------------------------------------------
4554 */
4555
4556var Tween = /*#__PURE__*/function (_Animation2) {
4557  _inheritsLoose(Tween, _Animation2);
4558  function Tween(targets, vars, position, skipInherit) {
4559    var _this3;
4560    if (typeof vars === "number") {
4561      position.duration = vars;
4562      vars = position;
4563      position = null;
4564    }
4565    _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this;
4566    var _this3$vars = _this3.vars,
4567      duration = _this3$vars.duration,
4568      delay = _this3$vars.delay,
4569      immediateRender = _this3$vars.immediateRender,
4570      stagger = _this3$vars.stagger,
4571      overwrite = _this3$vars.overwrite,
4572      keyframes = _this3$vars.keyframes,
4573      defaults = _this3$vars.defaults,
4574      scrollTrigger = _this3$vars.scrollTrigger,
4575      yoyoEase = _this3$vars.yoyoEase,
4576      parent = vars.parent || _globalTimeline,
4577      parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : "length" in vars) ? [targets] : toArray(targets),
4578      tl,
4579      i,
4580      copy,
4581      l,
4582      p,
4583      curTarget,
4584      staggerFunc,
4585      staggerVarsToMerge;
4586    _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn("GSAP target " + targets + " not found. https://gsap.com", !_config.nullTargetWarn) || [];
4587    _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property
4588
4589    _this3._overwrite = overwrite;
4590    if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {
4591      vars = _this3.vars;
4592      tl = _this3.timeline = new Timeline({
4593        data: "nested",
4594        defaults: defaults || {},
4595        targets: parent && parent.data === "nested" ? parent.vars.targets : parsedTargets
4596      }); // we need to store the targets because for staggers and keyframes, we end up creating an individual tween for each but function-based values need to know the index and the whole Array of targets.
4597
4598      tl.kill();
4599      tl.parent = tl._dp = _assertThisInitialized(_this3);
4600      tl._start = 0;
4601      if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {
4602        l = parsedTargets.length;
4603        staggerFunc = stagger && distribute(stagger);
4604        if (_isObject(stagger)) {
4605          //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween.
4606          for (p in stagger) {
4607            if (~_staggerTweenProps.indexOf(p)) {
4608              staggerVarsToMerge || (staggerVarsToMerge = {});
4609              staggerVarsToMerge[p] = stagger[p];
4610            }
4611          }
4612        }
4613        for (i = 0; i < l; i++) {
4614          copy = _copyExcluding(vars, _staggerPropsToSkip);
4615          copy.stagger = 0;
4616          yoyoEase && (copy.yoyoEase = yoyoEase);
4617          staggerVarsToMerge && _merge(copy, staggerVarsToMerge);
4618          curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0.
4619
4620          copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets);
4621          copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay;
4622          if (!stagger && l === 1 && copy.delay) {
4623            // if someone does delay:"random(1, 5)", repeat:-1, for example, the delay shouldn't be inside the repeat.
4624            _this3._delay = delay = copy.delay;
4625            _this3._start += delay;
4626            copy.delay = 0;
4627          }
4628          tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0);
4629          tl._ease = _easeMap.none;
4630        }
4631        tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally!
4632      } else if (keyframes) {
4633        _inheritDefaults(_setDefaults(tl.vars.defaults, {
4634          ease: "none"
4635        }));
4636        tl._ease = _parseEase(keyframes.ease || vars.ease || "none");
4637        var time = 0,
4638          a,
4639          kf,
4640          v;
4641        if (_isArray(keyframes)) {
4642          keyframes.forEach(function (frame) {
4643            return tl.to(parsedTargets, frame, ">");
4644          });
4645          tl.duration(); // to ensure tl._dur is cached because we tap into it for performance purposes in the render() method.
4646        } else {
4647          copy = {};
4648          for (p in keyframes) {
4649            p === "ease" || p === "easeEach" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach);
4650          }
4651          for (p in copy) {
4652            a = copy[p].sort(function (a, b) {
4653              return a.t - b.t;
4654            });
4655            time = 0;
4656            for (i = 0; i < a.length; i++) {
4657              kf = a[i];
4658              v = {
4659                ease: kf.e,
4660                duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration
4661              };
4662              v[p] = kf.v;
4663              tl.to(parsedTargets, v, time);
4664              time += v.duration;
4665            }
4666          }
4667          tl.duration() < duration && tl.to({}, {
4668            duration: duration - tl.duration()
4669          }); // in case keyframes didn't go to 100%
4670        }
4671      }
4672      duration || _this3.duration(duration = tl.duration());
4673    } else {
4674      _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain)
4675    }
4676    if (overwrite === true && !_suppressOverwrites) {
4677      _overwritingTween = _assertThisInitialized(_this3);
4678      _globalTimeline.killTweensOf(parsedTargets);
4679      _overwritingTween = 0;
4680    }
4681    _addToTimeline(parent, _assertThisInitialized(_this3), position);
4682    vars.reversed && _this3.reverse();
4683    vars.paused && _this3.paused(true);
4684    if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== "nested") {
4685      _this3._tTime = -_tinyNum; //forces a render without having to set the render() "force" parameter to true because we want to allow lazying by default (using the "force" parameter always forces an immediate full render)
4686
4687      _this3.render(Math.max(0, -delay) || 0); //in case delay is negative
4688    }
4689    scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger);
4690    return _this3;
4691  }
4692  var _proto3 = Tween.prototype;
4693  _proto3.render = function render(totalTime, suppressEvents, force) {
4694    var prevTime = this._time,
4695      tDur = this._tDur,
4696      dur = this._dur,
4697      isNegative = totalTime < 0,
4698      tTime = totalTime > tDur - _tinyNum && !isNegative ? tDur : totalTime < _tinyNum ? 0 : totalTime,
4699      time,
4700      pt,
4701      iteration,
4702      cycleDuration,
4703      prevIteration,
4704      isYoyo,
4705      ratio,
4706      timeline,
4707      yoyoEase;
4708    if (!dur) {
4709      _renderZeroDurationTween(this, totalTime, suppressEvents, force);
4710    } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== isNegative || this._lazy) {
4711      // this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0)
4712      time = tTime;
4713      timeline = this.timeline;
4714      if (this._repeat) {
4715        //adjust the time for repeats and yoyos
4716        cycleDuration = dur + this._rDelay;
4717        if (this._repeat < -1 && isNegative) {
4718          return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);
4719        }
4720        time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)
4721
4722        if (tTime === tDur) {
4723          // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)
4724          iteration = this._repeat;
4725          time = dur;
4726        } else {
4727          prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)
4728
4729          iteration = ~~prevIteration;
4730          if (iteration && iteration === prevIteration) {
4731            time = dur;
4732            iteration--;
4733          } else if (time > dur) {
4734            time = dur;
4735          }
4736        }
4737        isYoyo = this._yoyo && iteration & 1;
4738        if (isYoyo) {
4739          yoyoEase = this._yEase;
4740          time = dur - time;
4741        }
4742        prevIteration = _animationCycle(this._tTime, cycleDuration);
4743        if (time === prevTime && !force && this._initted && iteration === prevIteration) {
4744          //could be during the repeatDelay part. No need to render and fire callbacks.
4745          this._tTime = tTime;
4746          return this;
4747        }
4748        if (iteration !== prevIteration) {
4749          timeline && this._yEase && _propagateYoyoEase(timeline, isYoyo); //repeatRefresh functionality
4750
4751          if (this.vars.repeatRefresh && !isYoyo && !this._lock && time !== cycleDuration && this._initted) {
4752            // this._time will === cycleDuration when we render at EXACTLY the end of an iteration. Without this condition, it'd often do the repeatRefresh render TWICE (again on the very next tick).
4753            this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick.
4754
4755            this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0;
4756          }
4757        }
4758      }
4759      if (!this._initted) {
4760        if (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) {
4761          this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number.
4762
4763          return this;
4764        }
4765        if (prevTime !== this._time && !(force && this.vars.repeatRefresh && iteration !== prevIteration)) {
4766          // rare edge case - during initialization, an onUpdate in the _startAt (.fromTo()) might force this tween to render at a different spot in which case we should ditch this render() call so that it doesn't revert the values. But we also don't want to dump if we're doing a repeatRefresh render!
4767          return this;
4768        }
4769        if (dur !== this._dur) {
4770          // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should.
4771          return this.render(totalTime, suppressEvents, force);
4772        }
4773      }
4774      this._tTime = tTime;
4775      this._time = time;
4776      if (!this._act && this._ts) {
4777        this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.
4778
4779        this._lazy = 0;
4780      }
4781      this.ratio = ratio = (yoyoEase || this._ease)(time / dur);
4782      if (this._from) {
4783        this.ratio = ratio = 1 - ratio;
4784      }
4785      if (time && !prevTime && !suppressEvents && !iteration) {
4786        _callback(this, "onStart");
4787        if (this._tTime !== tTime) {
4788          // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.
4789          return this;
4790        }
4791      }
4792      pt = this._pt;
4793      while (pt) {
4794        pt.r(ratio, pt.d);
4795        pt = pt._next;
4796      }
4797      timeline && timeline.render(totalTime < 0 ? totalTime : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime);
4798      if (this._onUpdate && !suppressEvents) {
4799        isNegative && _rewindStartAt(this, totalTime, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.
4800
4801        _callback(this, "onUpdate");
4802      }
4803      this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, "onRepeat");
4804      if ((tTime === this._tDur || !tTime) && this._tTime === tTime) {
4805        isNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true);
4806        (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.
4807
4808        if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) {
4809          // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play();
4810          _callback(this, tTime === tDur ? "onComplete" : "onReverseComplete", true);
4811          this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();
4812        }
4813      }
4814    }
4815    return this;
4816  };
4817  _proto3.targets = function targets() {
4818    return this._targets;
4819  };
4820  _proto3.invalidate = function invalidate(soft) {
4821    // "soft" gives us a way to clear out everything EXCEPT the recorded pre-"from" portion of from() tweens. Otherwise, for example, if you tween.progress(1).render(0, true true).invalidate(), the "from" values would persist and then on the next render, the from() tweens would initialize and the current value would match the "from" values, thus animate from the same value to the same value (no animation). We tap into this in ScrollTrigger's refresh() where we must push a tween to completion and then back again but honor its init state in case the tween is dependent on another tween further up on the page.
4822    (!soft || !this.vars.runBackwards) && (this._startAt = 0);
4823    this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0;
4824    this._ptLookup = [];
4825    this.timeline && this.timeline.invalidate(soft);
4826    return _Animation2.prototype.invalidate.call(this, soft);
4827  };
4828  _proto3.resetTo = function resetTo(property, value, start, startIsRelative, skipRecursion) {
4829    _tickerActive || _ticker.wake();
4830    this._ts || this.play();
4831    var time = Math.min(this._dur, (this._dp._time - this._start) * this._ts),
4832      ratio;
4833    this._initted || _initTween(this, time);
4834    ratio = this._ease(time / this._dur); // don't just get tween.ratio because it may not have rendered yet.
4835    // possible future addition to allow an object with multiple values to update, like tween.resetTo({x: 100, y: 200}); At this point, it doesn't seem worth the added kb given the fact that most users will likely opt for the convenient gsap.quickTo() way of interacting with this method.
4836    // if (_isObject(property)) { // performance optimization
4837    // 	for (p in property) {
4838    // 		if (_updatePropTweens(this, p, property[p], value ? value[p] : null, start, ratio, time)) {
4839    // 			return this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.
4840    // 		}
4841    // 	}
4842    // } else {
4843
4844    if (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time, skipRecursion)) {
4845      return this.resetTo(property, value, start, startIsRelative, 1); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.
4846    } //}
4847
4848    _alignPlayhead(this, 0);
4849    this.parent || _addLinkedListItem(this._dp, this, "_first", "_last", this._dp._sort ? "_start" : 0);
4850    return this.render(0);
4851  };
4852  _proto3.kill = function kill(targets, vars) {
4853    if (vars === void 0) {
4854      vars = "all";
4855    }
4856    if (!targets && (!vars || vars === "all")) {
4857      this._lazy = this._pt = 0;
4858      this.parent ? _interrupt(this) : this.scrollTrigger && this.scrollTrigger.kill(!!_reverting);
4859      return this;
4860    }
4861    if (this.timeline) {
4862      var tDur = this.timeline.totalDuration();
4863      this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt.
4864
4865      this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to.
4866
4867      return this;
4868    }
4869    var parsedTargets = this._targets,
4870      killingTargets = targets ? toArray(targets) : parsedTargets,
4871      propTweenLookup = this._ptLookup,
4872      firstPT = this._pt,
4873      overwrittenProps,
4874      curLookup,
4875      curOverwriteProps,
4876      props,
4877      p,
4878      pt,
4879      i;
4880    if ((!vars || vars === "all") && _arraysMatch(parsedTargets, killingTargets)) {
4881      vars === "all" && (this._pt = 0);
4882      return _interrupt(this);
4883    }
4884    overwrittenProps = this._op = this._op || [];
4885    if (vars !== "all") {
4886      //so people can pass in a comma-delimited list of property names
4887      if (_isString(vars)) {
4888        p = {};
4889        _forEachName(vars, function (name) {
4890          return p[name] = 1;
4891        });
4892        vars = p;
4893      }
4894      vars = _addAliasesToVars(parsedTargets, vars);
4895    }
4896    i = parsedTargets.length;
4897    while (i--) {
4898      if (~killingTargets.indexOf(parsedTargets[i])) {
4899        curLookup = propTweenLookup[i];
4900        if (vars === "all") {
4901          overwrittenProps[i] = vars;
4902          props = curLookup;
4903          curOverwriteProps = {};
4904        } else {
4905          curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};
4906          props = vars;
4907        }
4908        for (p in props) {
4909          pt = curLookup && curLookup[p];
4910          if (pt) {
4911            if (!("kill" in pt.d) || pt.d.kill(p) === true) {
4912              _removeLinkedListItem(this, pt, "_pt");
4913            }
4914            delete curLookup[p];
4915          }
4916          if (curOverwriteProps !== "all") {
4917            curOverwriteProps[p] = 1;
4918          }
4919        }
4920      }
4921    }
4922    this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.
4923
4924    return this;
4925  };
4926  Tween.to = function to(targets, vars) {
4927    return new Tween(targets, vars, arguments[2]);
4928  };
4929  Tween.from = function from(targets, vars) {
4930    return _createTweenType(1, arguments);
4931  };
4932  Tween.delayedCall = function delayedCall(delay, callback, params, scope) {
4933    return new Tween(callback, 0, {
4934      immediateRender: false,
4935      lazy: false,
4936      overwrite: false,
4937      delay: delay,
4938      onComplete: callback,
4939      onReverseComplete: callback,
4940      onCompleteParams: params,
4941      onReverseCompleteParams: params,
4942      callbackScope: scope
4943    }); // we must use onReverseComplete too for things like timeline.add(() => {...}) which should be triggered in BOTH directions (forward and reverse)
4944  };
4945  Tween.fromTo = function fromTo(targets, fromVars, toVars) {
4946    return _createTweenType(2, arguments);
4947  };
4948  Tween.set = function set(targets, vars) {
4949    vars.duration = 0;
4950    vars.repeatDelay || (vars.repeat = 0);
4951    return new Tween(targets, vars);
4952  };
4953  Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) {
4954    return _globalTimeline.killTweensOf(targets, props, onlyActive);
4955  };
4956  return Tween;
4957}(Animation);
4958_setDefaults(Tween.prototype, {
4959  _targets: [],
4960  _lazy: 0,
4961  _startAt: 0,
4962  _op: 0,
4963  _onInit: 0
4964}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners)
4965// _forEachName("to,from,fromTo,set,call,add,addLabel,addPause", name => {
4966// 	Tween.prototype[name] = function() {
4967// 		let tl = new Timeline();
4968// 		return _addToTimeline(tl, this)[name].apply(tl, toArray(arguments));
4969// 	}
4970// });
4971//for backward compatibility. Leverage the timeline calls.
4972
4973_forEachName("staggerTo,staggerFrom,staggerFromTo", function (name) {
4974  Tween[name] = function () {
4975    var tl = new Timeline(),
4976      params = _slice.call(arguments, 0);
4977    params.splice(name === "staggerFromTo" ? 5 : 4, 0, 0);
4978    return tl[name].apply(tl, params);
4979  };
4980});
4981/*
4982 * --------------------------------------------------------------------------------------
4983 * PROPTWEEN
4984 * --------------------------------------------------------------------------------------
4985 */
4986
4987var _setterPlain = function _setterPlain(target, property, value) {
4988    return target[property] = value;
4989  },
4990  _setterFunc = function _setterFunc(target, property, value) {
4991    return target[property](value);
4992  },
4993  _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) {
4994    return target[property](data.fp, value);
4995  },
4996  _setterAttribute = function _setterAttribute(target, property, value) {
4997    return target.setAttribute(property, value);
4998  },
4999  _getSetter = function _getSetter(target, property) {
5000    return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain;
5001  },
5002  _renderPlain = function _renderPlain(ratio, data) {
5003    return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data);
5004  },
5005  _renderBoolean = function _renderBoolean(ratio, data) {
5006    return data.set(data.t, data.p, !!(data.s + data.c * ratio), data);
5007  },
5008  _renderComplexString = function _renderComplexString(ratio, data) {
5009    var pt = data._pt,
5010      s = "";
5011    if (!ratio && data.b) {
5012      //b = beginning string
5013      s = data.b;
5014    } else if (ratio === 1 && data.e) {
5015      //e = ending string
5016      s = data.e;
5017    } else {
5018      while (pt) {
5019        s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the "p" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors.
5020
5021        pt = pt._next;
5022      }
5023      s += data.c; //we use the "c" of the PropTween to store the final chunk of non-numeric text.
5024    }
5025    data.set(data.t, data.p, s, data);
5026  },
5027  _renderPropTweens = function _renderPropTweens(ratio, data) {
5028    var pt = data._pt;
5029    while (pt) {
5030      pt.r(ratio, pt.d);
5031      pt = pt._next;
5032    }
5033  },
5034  _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) {
5035    var pt = this._pt,
5036      next;
5037    while (pt) {
5038      next = pt._next;
5039      pt.p === property && pt.modifier(modifier, tween, target);
5040      pt = next;
5041    }
5042  },
5043  _killPropTweensOf = function _killPropTweensOf(property) {
5044    var pt = this._pt,
5045      hasNonDependentRemaining,
5046      next;
5047    while (pt) {
5048      next = pt._next;
5049      if (pt.p === property && !pt.op || pt.op === property) {
5050        _removeLinkedListItem(this, pt, "_pt");
5051      } else if (!pt.dep) {
5052        hasNonDependentRemaining = 1;
5053      }
5054      pt = next;
5055    }
5056    return !hasNonDependentRemaining;
5057  },
5058  _setterWithModifier = function _setterWithModifier(target, property, value, data) {
5059    data.mSet(target, property, data.m.call(data.tween, value, data.mt), data);
5060  },
5061  _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) {
5062    var pt = parent._pt,
5063      next,
5064      pt2,
5065      first,
5066      last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin)
5067
5068    while (pt) {
5069      next = pt._next;
5070      pt2 = first;
5071      while (pt2 && pt2.pr > pt.pr) {
5072        pt2 = pt2._next;
5073      }
5074      if (pt._prev = pt2 ? pt2._prev : last) {
5075        pt._prev._next = pt;
5076      } else {
5077        first = pt;
5078      }
5079      if (pt._next = pt2) {
5080        pt2._prev = pt;
5081      } else {
5082        last = pt;
5083      }
5084      pt = next;
5085    }
5086    parent._pt = first;
5087  }; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added)
5088
5089var PropTween = /*#__PURE__*/function () {
5090  function PropTween(next, target, prop, start, change, renderer, data, setter, priority) {
5091    this.t = target;
5092    this.s = start;
5093    this.c = change;
5094    this.p = prop;
5095    this.r = renderer || _renderPlain;
5096    this.d = data || this;
5097    this.set = setter || _setterPlain;
5098    this.pr = priority || 0;
5099    this._next = next;
5100    if (next) {
5101      next._prev = this;
5102    }
5103  }
5104  var _proto4 = PropTween.prototype;
5105  _proto4.modifier = function modifier(func, tween, target) {
5106    this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier)
5107
5108    this.set = _setterWithModifier;
5109    this.m = func;
5110    this.mt = target; //modifier target
5111
5112    this.tween = tween;
5113  };
5114  return PropTween;
5115}(); //Initialization tasks
5116
5117_forEachName(_callbackNames + "parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger", function (name) {
5118  return _reservedProps[name] = 1;
5119});
5120_globals.TweenMax = _globals.TweenLite = Tween;
5121_globals.TimelineLite = _globals.TimelineMax = Timeline;
5122_globalTimeline = new Timeline({
5123  sortChildren: false,
5124  defaults: _defaults,
5125  autoRemoveChildren: true,
5126  id: "root",
5127  smoothChildTiming: true
5128});
5129_config.stringFilter = _colorStringFilter;
5130var _media = [],
5131  _listeners = {},
5132  _emptyArray = [],
5133  _lastMediaTime = 0,
5134  _contextID = 0,
5135  _dispatch = function _dispatch(type) {
5136    return (_listeners[type] || _emptyArray).map(function (f) {
5137      return f();
5138    });
5139  },
5140  _onMediaChange = function _onMediaChange() {
5141    var time = Date.now(),
5142      matches = [];
5143    if (time - _lastMediaTime > 2) {
5144      _dispatch("matchMediaInit");
5145      _media.forEach(function (c) {
5146        var queries = c.queries,
5147          conditions = c.conditions,
5148          match,
5149          p,
5150          anyMatch,
5151          toggled;
5152        for (p in queries) {
5153          match = _win.matchMedia(queries[p]).matches; // Firefox doesn't update the "matches" property of the MediaQueryList object correctly - it only does so as it calls its change handler - so we must re-create a media query here to ensure it's accurate.
5154
5155          match && (anyMatch = 1);
5156          if (match !== conditions[p]) {
5157            conditions[p] = match;
5158            toggled = 1;
5159          }
5160        }
5161        if (toggled) {
5162          c.revert();
5163          anyMatch && matches.push(c);
5164        }
5165      });
5166      _dispatch("matchMediaRevert");
5167      matches.forEach(function (c) {
5168        return c.onMatch(c, function (func) {
5169          return c.add(null, func);
5170        });
5171      });
5172      _lastMediaTime = time;
5173      _dispatch("matchMedia");
5174    }
5175  };
5176var Context = /*#__PURE__*/function () {
5177  function Context(func, scope) {
5178    this.selector = scope && selector(scope);
5179    this.data = [];
5180    this._r = []; // returned/cleanup functions
5181
5182    this.isReverted = false;
5183    this.id = _contextID++; // to work around issues that frameworks like Vue cause by making things into Proxies which make it impossible to do something like _media.indexOf(this) because "this" would no longer refer to the Context instance itself - it'd refer to a Proxy! We needed a way to identify the context uniquely
5184
5185    func && this.add(func);
5186  }
5187  var _proto5 = Context.prototype;
5188  _proto5.add = function add(name, func, scope) {
5189    // possible future addition if we need the ability to add() an animation to a context and for whatever reason cannot create that animation inside of a context.add(() => {...}) function.
5190    // if (name && _isFunction(name.revert)) {
5191    // 	this.data.push(name);
5192    // 	return (name._ctx = this);
5193    // }
5194    if (_isFunction(name)) {
5195      scope = func;
5196      func = name;
5197      name = _isFunction;
5198    }
5199    var self = this,
5200      f = function f() {
5201        var prev = _context,
5202          prevSelector = self.selector,
5203          result;
5204        prev && prev !== self && prev.data.push(self);
5205        scope && (self.selector = selector(scope));
5206        _context = self;
5207        result = func.apply(self, arguments);
5208        _isFunction(result) && self._r.push(result);
5209        _context = prev;
5210        self.selector = prevSelector;
5211        self.isReverted = false;
5212        return result;
5213      };
5214    self.last = f;
5215    return name === _isFunction ? f(self, function (func) {
5216      return self.add(null, func);
5217    }) : name ? self[name] = f : f;
5218  };
5219  _proto5.ignore = function ignore(func) {
5220    var prev = _context;
5221    _context = null;
5222    func(this);
5223    _context = prev;
5224  };
5225  _proto5.getTweens = function getTweens() {
5226    var a = [];
5227    this.data.forEach(function (e) {
5228      return e instanceof Context ? a.push.apply(a, e.getTweens()) : e instanceof Tween && !(e.parent && e.parent.data === "nested") && a.push(e);
5229    });
5230    return a;
5231  };
5232  _proto5.clear = function clear() {
5233    this._r.length = this.data.length = 0;
5234  };
5235  _proto5.kill = function kill(revert, matchMedia) {
5236    var _this4 = this;
5237    if (revert) {
5238      (function () {
5239        var tweens = _this4.getTweens(),
5240          i = _this4.data.length,
5241          t;
5242        while (i--) {
5243          // Flip plugin tweens are very different in that they should actually be pushed to their end. The plugin replaces the timeline's .revert() method to do exactly that. But we also need to remove any of those nested tweens inside the flip timeline so that they don't get individually reverted.
5244          t = _this4.data[i];
5245          if (t.data === "isFlip") {
5246            t.revert();
5247            t.getChildren(true, true, false).forEach(function (tween) {
5248              return tweens.splice(tweens.indexOf(tween), 1);
5249            });
5250          }
5251        } // save as an object so that we can cache the globalTime for each tween to optimize performance during the sort
5252
5253        tweens.map(function (t) {
5254          return {
5255            g: t._dur || t._delay || t._sat && !t._sat.vars.immediateRender ? t.globalTime(0) : -Infinity,
5256            t: t
5257          };
5258        }).sort(function (a, b) {
5259          return b.g - a.g || -Infinity;
5260        }).forEach(function (o) {
5261          return o.t.revert(revert);
5262        }); // note: all of the _startAt tweens should be reverted in reverse order that they were created, and they'll all have the same globalTime (-1) so the " || -1" in the sort keeps the order properly.
5263
5264        i = _this4.data.length;
5265        while (i--) {
5266          // make sure we loop backwards so that, for example, SplitTexts that were created later on the same element get reverted first
5267          t = _this4.data[i];
5268          if (t instanceof Timeline) {
5269            if (t.data !== "nested") {
5270              t.scrollTrigger && t.scrollTrigger.revert();
5271              t.kill(); // don't revert() the timeline because that's duplicating efforts since we already reverted all the tweens
5272            }
5273          } else {
5274            !(t instanceof Tween) && t.revert && t.revert(revert);
5275          }
5276        }
5277        _this4._r.forEach(function (f) {
5278          return f(revert, _this4);
5279        });
5280        _this4.isReverted = true;
5281      })();
5282    } else {
5283      this.data.forEach(function (e) {
5284        return e.kill && e.kill();
5285      });
5286    }
5287    this.clear();
5288    if (matchMedia) {
5289      var i = _media.length;
5290      while (i--) {
5291        // previously, we checked _media.indexOf(this), but some frameworks like Vue enforce Proxy objects that make it impossible to get the proper result that way, so we must use a unique ID number instead.
5292        _media[i].id === this.id && _media.splice(i, 1);
5293      }
5294    }
5295  } // killWithCleanup() {
5296  // 	this.kill();
5297  // 	this._r.forEach(f => f(false, this));
5298  // }
5299  ;
5300  _proto5.revert = function revert(config) {
5301    this.kill(config || {});
5302  };
5303  return Context;
5304}();
5305var MatchMedia = /*#__PURE__*/function () {
5306  function MatchMedia(scope) {
5307    this.contexts = [];
5308    this.scope = scope;
5309    _context && _context.data.push(this);
5310  }
5311  var _proto6 = MatchMedia.prototype;
5312  _proto6.add = function add(conditions, func, scope) {
5313    _isObject(conditions) || (conditions = {
5314      matches: conditions
5315    });
5316    var context = new Context(0, scope || this.scope),
5317      cond = context.conditions = {},
5318      mq,
5319      p,
5320      active;
5321    _context && !context.selector && (context.selector = _context.selector); // in case a context is created inside a context. Like a gsap.matchMedia() that's inside a scoped gsap.context()
5322
5323    this.contexts.push(context);
5324    func = context.add("onMatch", func);
5325    context.queries = conditions;
5326    for (p in conditions) {
5327      if (p === "all") {
5328        active = 1;
5329      } else {
5330        mq = _win.matchMedia(conditions[p]);
5331        if (mq) {
5332          _media.indexOf(context) < 0 && _media.push(context);
5333          (cond[p] = mq.matches) && (active = 1);
5334          mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener("change", _onMediaChange);
5335        }
5336      }
5337    }
5338    active && func(context, function (f) {
5339      return context.add(null, f);
5340    });
5341    return this;
5342  } // refresh() {
5343  // 	let time = _lastMediaTime,
5344  // 		media = _media;
5345  // 	_lastMediaTime = -1;
5346  // 	_media = this.contexts;
5347  // 	_onMediaChange();
5348  // 	_lastMediaTime = time;
5349  // 	_media = media;
5350  // }
5351  ;
5352  _proto6.revert = function revert(config) {
5353    this.kill(config || {});
5354  };
5355  _proto6.kill = function kill(revert) {
5356    this.contexts.forEach(function (c) {
5357      return c.kill(revert, true);
5358    });
5359  };
5360  return MatchMedia;
5361}();
5362/*
5363 * --------------------------------------------------------------------------------------
5364 * GSAP
5365 * --------------------------------------------------------------------------------------
5366 */
5367
5368var _gsap = {
5369  registerPlugin: function registerPlugin() {
5370    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
5371      args[_key2] = arguments[_key2];
5372    }
5373    args.forEach(function (config) {
5374      return _createPlugin(config);
5375    });
5376  },
5377  timeline: function timeline(vars) {
5378    return new Timeline(vars);
5379  },
5380  getTweensOf: function getTweensOf(targets, onlyActive) {
5381    return _globalTimeline.getTweensOf(targets, onlyActive);
5382  },
5383  getProperty: function getProperty(target, property, unit, uncache) {
5384    _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in
5385
5386    var getter = _getCache(target || {}).get,
5387      format = unit ? _passThrough : _numericIfPossible;
5388    unit === "native" && (unit = "");
5389    return !target ? target : !property ? function (property, unit, uncache) {
5390      return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));
5391    } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));
5392  },
5393  quickSetter: function quickSetter(target, property, unit) {
5394    target = toArray(target);
5395    if (target.length > 1) {
5396      var setters = target.map(function (t) {
5397          return gsap.quickSetter(t, property, unit);
5398        }),
5399        l = setters.length;
5400      return function (value) {
5401        var i = l;
5402        while (i--) {
5403          setters[i](value);
5404        }
5405      };
5406    }
5407    target = target[0] || {};
5408    var Plugin = _plugins[property],
5409      cache = _getCache(target),
5410      p = cache.harness && (cache.harness.aliases || {})[property] || property,
5411      // in case it's an alias, like "rotate" for "rotation".
5412      setter = Plugin ? function (value) {
5413        var p = new Plugin();
5414        _quickTween._pt = 0;
5415        p.init(target, unit ? value + unit : value, _quickTween, 0, [target]);
5416        p.render(1, p);
5417        _quickTween._pt && _renderPropTweens(1, _quickTween);
5418      } : cache.set(target, p);
5419    return Plugin ? setter : function (value) {
5420      return setter(target, p, unit ? value + unit : value, cache, 1);
5421    };
5422  },
5423  quickTo: function quickTo(target, property, vars) {
5424    var _setDefaults2;
5425    var tween = gsap.to(target, _setDefaults((_setDefaults2 = {}, _setDefaults2[property] = "+=0.1", _setDefaults2.paused = true, _setDefaults2.stagger = 0, _setDefaults2), vars || {})),
5426      func = function func(value, start, startIsRelative) {
5427        return tween.resetTo(property, value, start, startIsRelative);
5428      };
5429    func.tween = tween;
5430    return func;
5431  },
5432  isTweening: function isTweening(targets) {
5433    return _globalTimeline.getTweensOf(targets, true).length > 0;
5434  },
5435  defaults: function defaults(value) {
5436    value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));
5437    return _mergeDeep(_defaults, value || {});
5438  },
5439  config: function config(value) {
5440    return _mergeDeep(_config, value || {});
5441  },
5442  registerEffect: function registerEffect(_ref3) {
5443    var name = _ref3.name,
5444      effect = _ref3.effect,
5445      plugins = _ref3.plugins,
5446      defaults = _ref3.defaults,
5447      extendTimeline = _ref3.extendTimeline;
5448    (plugins || "").split(",").forEach(function (pluginName) {
5449      return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + " effect requires " + pluginName + " plugin.");
5450    });
5451    _effects[name] = function (targets, vars, tl) {
5452      return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);
5453    };
5454    if (extendTimeline) {
5455      Timeline.prototype[name] = function (targets, vars, position) {
5456        return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);
5457      };
5458    }
5459  },
5460  registerEase: function registerEase(name, ease) {
5461    _easeMap[name] = _parseEase(ease);
5462  },
5463  parseEase: function parseEase(ease, defaultEase) {
5464    return arguments.length ? _parseEase(ease, defaultEase) : _easeMap;
5465  },
5466  getById: function getById(id) {
5467    return _globalTimeline.getById(id);
5468  },
5469  exportRoot: function exportRoot(vars, includeDelayedCalls) {
5470    if (vars === void 0) {
5471      vars = {};
5472    }
5473    var tl = new Timeline(vars),
5474      child,
5475      next;
5476    tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);
5477    _globalTimeline.remove(tl);
5478    tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself).
5479
5480    tl._time = tl._tTime = _globalTimeline._time;
5481    child = _globalTimeline._first;
5482    while (child) {
5483      next = child._next;
5484      if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {
5485        _addToTimeline(tl, child, child._start - child._delay);
5486      }
5487      child = next;
5488    }
5489    _addToTimeline(_globalTimeline, tl, 0);
5490    return tl;
5491  },
5492  context: function context(func, scope) {
5493    return func ? new Context(func, scope) : _context;
5494  },
5495  matchMedia: function matchMedia(scope) {
5496    return new MatchMedia(scope);
5497  },
5498  matchMediaRefresh: function matchMediaRefresh() {
5499    return _media.forEach(function (c) {
5500      var cond = c.conditions,
5501        found,
5502        p;
5503      for (p in cond) {
5504        if (cond[p]) {
5505          cond[p] = false;
5506          found = 1;
5507        }
5508      }
5509      found && c.revert();
5510    }) || _onMediaChange();
5511  },
5512  addEventListener: function addEventListener(type, callback) {
5513    var a = _listeners[type] || (_listeners[type] = []);
5514    ~a.indexOf(callback) || a.push(callback);
5515  },
5516  removeEventListener: function removeEventListener(type, callback) {
5517    var a = _listeners[type],
5518      i = a && a.indexOf(callback);
5519    i >= 0 && a.splice(i, 1);
5520  },
5521  utils: {
5522    wrap: wrap,
5523    wrapYoyo: wrapYoyo,
5524    distribute: distribute,
5525    random: random,
5526    snap: snap,
5527    normalize: normalize,
5528    getUnit: getUnit,
5529    clamp: clamp,
5530    splitColor: splitColor,
5531    toArray: toArray,
5532    selector: selector,
5533    mapRange: mapRange,
5534    pipe: pipe,
5535    unitize: unitize,
5536    interpolate: interpolate,
5537    shuffle: shuffle
5538  },
5539  install: _install,
5540  effects: _effects,
5541  ticker: _ticker,
5542  updateRoot: Timeline.updateRoot,
5543  plugins: _plugins,
5544  globalTimeline: _globalTimeline,
5545  core: {
5546    PropTween: PropTween,
5547    globals: _addGlobal,
5548    Tween: Tween,
5549    Timeline: Timeline,
5550    Animation: Animation,
5551    getCache: _getCache,
5552    _removeLinkedListItem: _removeLinkedListItem,
5553    reverting: function reverting() {
5554      return _reverting;
5555    },
5556    context: function context(toAdd) {
5557      if (toAdd && _context) {
5558        _context.data.push(toAdd);
5559        toAdd._ctx = _context;
5560      }
5561      return _context;
5562    },
5563    suppressOverwrites: function suppressOverwrites(value) {
5564      return _suppressOverwrites = value;
5565    }
5566  }
5567};
5568_forEachName("to,from,fromTo,delayedCall,set,killTweensOf", function (name) {
5569  return _gsap[name] = Tween[name];
5570});
5571_ticker.add(Timeline.updateRoot);
5572_quickTween = _gsap.to({}, {
5573  duration: 0
5574}); // ---- EXTRA PLUGINS --------------------------------------------------------
5575
5576var _getPluginPropTween = function _getPluginPropTween(plugin, prop) {
5577    var pt = plugin._pt;
5578    while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {
5579      pt = pt._next;
5580    }
5581    return pt;
5582  },
5583  _addModifiers = function _addModifiers(tween, modifiers) {
5584    var targets = tween._targets,
5585      p,
5586      i,
5587      pt;
5588    for (p in modifiers) {
5589      i = targets.length;
5590      while (i--) {
5591        pt = tween._ptLookup[i][p];
5592        if (pt && (pt = pt.d)) {
5593          if (pt._pt) {
5594            // is a plugin
5595            pt = _getPluginPropTween(pt, p);
5596          }
5597          pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);
5598        }
5599      }
5600    }
5601  },
5602  _buildModifierPlugin = function _buildModifierPlugin(name, modifier) {
5603    return {
5604      name: name,
5605      rawVars: 1,
5606      //don't pre-process function-based values or "random()" strings.
5607      init: function init(target, vars, tween) {
5608        tween._onInit = function (tween) {
5609          var temp, p;
5610          if (_isString(vars)) {
5611            temp = {};
5612            _forEachName(vars, function (name) {
5613              return temp[name] = 1;
5614            }); //if the user passes in a comma-delimited list of property names to roundProps, like "x,y", we round to whole numbers.
5615
5616            vars = temp;
5617          }
5618          if (modifier) {
5619            temp = {};
5620            for (p in vars) {
5621              temp[p] = modifier(vars[p]);
5622            }
5623            vars = temp;
5624          }
5625          _addModifiers(tween, vars);
5626        };
5627      }
5628    };
5629  }; //register core plugins
5630
5631var gsap = _gsap.registerPlugin({
5632  name: "attr",
5633  init: function init(target, vars, tween, index, targets) {
5634    var p, pt, v;
5635    this.tween = tween;
5636    for (p in vars) {
5637      v = target.getAttribute(p) || "";
5638      pt = this.add(target, "setAttribute", (v || 0) + "", vars[p], index, targets, 0, 0, p);
5639      pt.op = p;
5640      pt.b = v; // record the beginning value so we can revert()
5641
5642      this._props.push(p);
5643    }
5644  },
5645  render: function render(ratio, data) {
5646    var pt = data._pt;
5647    while (pt) {
5648      _reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d); // if reverting, go back to the original (pt.b)
5649
5650      pt = pt._next;
5651    }
5652  }
5653}, {
5654  name: "endArray",
5655  init: function init(target, value) {
5656    var i = value.length;
5657    while (i--) {
5658      this.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1);
5659    }
5660  }
5661}, _buildModifierPlugin("roundProps", _roundModifier), _buildModifierPlugin("modifiers"), _buildModifierPlugin("snap", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way.
5662
5663Tween.version = Timeline.version = gsap.version = "3.12.7";
5664_coreReady = 1;
5665_windowExists() && _wake();
5666var Power0 = _easeMap.Power0,
5667  Power1 = _easeMap.Power1,
5668  Power2 = _easeMap.Power2,
5669  Power3 = _easeMap.Power3,
5670  Power4 = _easeMap.Power4,
5671  Linear = _easeMap.Linear,
5672  Quad = _easeMap.Quad,
5673  Cubic = _easeMap.Cubic,
5674  Quart = _easeMap.Quart,
5675  Quint = _easeMap.Quint,
5676  Strong = _easeMap.Strong,
5677  Elastic = _easeMap.Elastic,
5678  Back = _easeMap.Back,
5679  SteppedEase = _easeMap.SteppedEase,
5680  Bounce = _easeMap.Bounce,
5681  Sine = _easeMap.Sine,
5682  Expo = _easeMap.Expo,
5683  Circ = _easeMap.Circ;
5684
5685 //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it.
5686
5687
5688
5689/***/ }),
5690
vendor: 5,122 bytes, lines 5691-5759
5691/***/ "./node_modules/gsap/index.js":
5692/*!************************************!*\
5693  !*** ./node_modules/gsap/index.js ***!
5694  \************************************/
5695/*! exports provided: gsap, default, CSSPlugin, TweenMax, TweenLite, TimelineMax, TimelineLite, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ */
5696/***/ (function(module, __webpack_exports__, __webpack_require__) {
5697
5698"use strict";
5699__webpack_require__.r(__webpack_exports__);
5700/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gsap", function() { return gsapWithCSS; });
5701/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return gsapWithCSS; });
5702/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TweenMax", function() { return TweenMaxWithCSS; });
5703/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/gsap/gsap-core.js");
5704/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TweenLite", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TweenLite"]; });
5705
5706/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimelineMax", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TimelineMax"]; });
5707
5708/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimelineLite", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["TimelineLite"]; });
5709
5710/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power0", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power0"]; });
5711
5712/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power1", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power1"]; });
5713
5714/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power2", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power2"]; });
5715
5716/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power3", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power3"]; });
5717
5718/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Power4", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Power4"]; });
5719
5720/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Linear", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Linear"]; });
5721
5722/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quad", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quad"]; });
5723
5724/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cubic", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Cubic"]; });
5725
5726/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quart", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quart"]; });
5727
5728/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Quint", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Quint"]; });
5729
5730/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Strong", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Strong"]; });
5731
5732/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Elastic", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Elastic"]; });
5733
5734/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Back", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Back"]; });
5735
5736/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SteppedEase", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["SteppedEase"]; });
5737
5738/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Bounce", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Bounce"]; });
5739
5740/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sine", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Sine"]; });
5741
5742/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Expo", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Expo"]; });
5743
5744/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Circ", function() { return _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["Circ"]; });
5745
5746/* harmony import */ var _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CSSPlugin.js */ "./node_modules/gsap/CSSPlugin.js");
5747/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CSSPlugin", function() { return _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__["CSSPlugin"]; });
5748
5749/*** IMPORTS FROM imports-loader ***/
5750var define = false;
5751
5752
5753var gsapWithCSS = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"].registerPlugin(_CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__["CSSPlugin"]) || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__["gsap"],
5754  // to protect from tree shaking
5755  TweenMaxWithCSS = gsapWithCSS.core.Tween;
5756
5757
5758/***/ }),
5759
vendor: 315,455 bytes, lines 5760-14771
5760/***/ "./node_modules/jquery/dist/jquery.js":
5761/*!********************************************!*\
5762  !*** ./node_modules/jquery/dist/jquery.js ***!
5763  \********************************************/
5764/*! no static exports found */
5765/***/ (function(module, exports, __webpack_require__) {
5766
5767/*** IMPORTS FROM imports-loader ***/
5768var define = false;
5769
5770/*!
5771 * jQuery JavaScript Library v3.7.1
5772 * https://jquery.com/
5773 *
5774 * Copyright OpenJS Foundation and other contributors
5775 * Released under the MIT license
5776 * https://jquery.org/license
5777 *
5778 * Date: 2023-08-28T13:37Z
5779 */
5780(function (global, factory) {
5781  "use strict";
5782
5783  if ( true && typeof module.exports === "object") {
5784    // For CommonJS and CommonJS-like environments where a proper `window`
5785    // is present, execute the factory and get jQuery.
5786    // For environments that do not have a `window` with a `document`
5787    // (such as Node.js), expose a factory as module.exports.
5788    // This accentuates the need for the creation of a real `window`.
5789    // e.g. var jQuery = require("jquery")(window);
5790    // See ticket trac-14549 for more info.
5791    module.exports = global.document ? factory(global, true) : function (w) {
5792      if (!w.document) {
5793        throw new Error("jQuery requires a window with a document");
5794      }
5795      return factory(w);
5796    };
5797  } else {
5798    factory(global);
5799  }
5800
5801  // Pass this if window is not defined yet
5802})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
5803  // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
5804  // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
5805  // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
5806  // enough that all such attempts are guarded in a try block.
5807  "use strict";
5808
5809  var arr = [];
5810  var getProto = Object.getPrototypeOf;
5811  var slice = arr.slice;
5812  var flat = arr.flat ? function (array) {
5813    return arr.flat.call(array);
5814  } : function (array) {
5815    return arr.concat.apply([], array);
5816  };
5817  var push = arr.push;
5818  var indexOf = arr.indexOf;
5819  var class2type = {};
5820  var toString = class2type.toString;
5821  var hasOwn = class2type.hasOwnProperty;
5822  var fnToString = hasOwn.toString;
5823  var ObjectFunctionString = fnToString.call(Object);
5824  var support = {};
5825  var isFunction = function isFunction(obj) {
5826    // Support: Chrome <=57, Firefox <=52
5827    // In some browsers, typeof returns "function" for HTML <object> elements
5828    // (i.e., `typeof document.createElement( "object" ) === "function"`).
5829    // We don't want to classify *any* DOM node as a function.
5830    // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
5831    // Plus for old WebKit, typeof returns "function" for HTML collections
5832    // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
5833    return typeof obj === "function" && typeof obj.nodeType !== "number" && typeof obj.item !== "function";
5834  };
5835  var isWindow = function isWindow(obj) {
5836    return obj != null && obj === obj.window;
5837  };
5838  var document = window.document;
5839  var preservedScriptAttributes = {
5840    type: true,
5841    src: true,
5842    nonce: true,
5843    noModule: true
5844  };
5845  function DOMEval(code, node, doc) {
5846    doc = doc || document;
5847    var i,
5848      val,
5849      script = doc.createElement("script");
5850    script.text = code;
5851    if (node) {
5852      for (i in preservedScriptAttributes) {
5853        // Support: Firefox 64+, Edge 18+
5854        // Some browsers don't support the "nonce" property on scripts.
5855        // On the other hand, just using `getAttribute` is not enough as
5856        // the `nonce` attribute is reset to an empty string whenever it
5857        // becomes browsing-context connected.
5858        // See https://github.com/whatwg/html/issues/2369
5859        // See https://html.spec.whatwg.org/#nonce-attributes
5860        // The `node.getAttribute` check was added for the sake of
5861        // `jQuery.globalEval` so that it can fake a nonce-containing node
5862        // via an object.
5863        val = node[i] || node.getAttribute && node.getAttribute(i);
5864        if (val) {
5865          script.setAttribute(i, val);
5866        }
5867      }
5868    }
5869    doc.head.appendChild(script).parentNode.removeChild(script);
5870  }
5871  function toType(obj) {
5872    if (obj == null) {
5873      return obj + "";
5874    }
5875
5876    // Support: Android <=2.3 only (functionish RegExp)
5877    return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj;
5878  }
5879  /* global Symbol */
5880  // Defining this global in .eslintrc.json would create a danger of using the global
5881  // unguarded in another place, it seems safer to define global only for this module
5882
5883  var version = "3.7.1",
5884    rhtmlSuffix = /HTML$/i,
5885    // Define a local copy of jQuery
5886    jQuery = function (selector, context) {
5887      // The jQuery object is actually just the init constructor 'enhanced'
5888      // Need init if jQuery is called (just allow error to be thrown if not included)
5889      return new jQuery.fn.init(selector, context);
5890    };
5891  jQuery.fn = jQuery.prototype = {
5892    // The current version of jQuery being used
5893    jquery: version,
5894    constructor: jQuery,
5895    // The default length of a jQuery object is 0
5896    length: 0,
5897    toArray: function () {
5898      return slice.call(this);
5899    },
5900    // Get the Nth element in the matched element set OR
5901    // Get the whole matched element set as a clean array
5902    get: function (num) {
5903      // Return all the elements in a clean array
5904      if (num == null) {
5905        return slice.call(this);
5906      }
5907
5908      // Return just the one element from the set
5909      return num < 0 ? this[num + this.length] : this[num];
5910    },
5911    // Take an array of elements and push it onto the stack
5912    // (returning the new matched element set)
5913    pushStack: function (elems) {
5914      // Build a new jQuery matched element set
5915      var ret = jQuery.merge(this.constructor(), elems);
5916
5917      // Add the old object onto the stack (as a reference)
5918      ret.prevObject = this;
5919
5920      // Return the newly-formed element set
5921      return ret;
5922    },
5923    // Execute a callback for every element in the matched set.
5924    each: function (callback) {
5925      return jQuery.each(this, callback);
5926    },
5927    map: function (callback) {
5928      return this.pushStack(jQuery.map(this, function (elem, i) {
5929        return callback.call(elem, i, elem);
5930      }));
5931    },
5932    slice: function () {
5933      return this.pushStack(slice.apply(this, arguments));
5934    },
5935    first: function () {
5936      return this.eq(0);
5937    },
5938    last: function () {
5939      return this.eq(-1);
5940    },
5941    even: function () {
5942      return this.pushStack(jQuery.grep(this, function (_elem, i) {
5943        return (i + 1) % 2;
5944      }));
5945    },
5946    odd: function () {
5947      return this.pushStack(jQuery.grep(this, function (_elem, i) {
5948        return i % 2;
5949      }));
5950    },
5951    eq: function (i) {
5952      var len = this.length,
5953        j = +i + (i < 0 ? len : 0);
5954      return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
5955    },
5956    end: function () {
5957      return this.prevObject || this.constructor();
5958    },
5959    // For internal use only.
5960    // Behaves like an Array's method, not like a jQuery method.
5961    push: push,
5962    sort: arr.sort,
5963    splice: arr.splice
5964  };
5965  jQuery.extend = jQuery.fn.extend = function () {
5966    var options,
5967      name,
5968      src,
5969      copy,
5970      copyIsArray,
5971      clone,
5972      target = arguments[0] || {},
5973      i = 1,
5974      length = arguments.length,
5975      deep = false;
5976
5977    // Handle a deep copy situation
5978    if (typeof target === "boolean") {
5979      deep = target;
5980
5981      // Skip the boolean and the target
5982      target = arguments[i] || {};
5983      i++;
5984    }
5985
5986    // Handle case when target is a string or something (possible in deep copy)
5987    if (typeof target !== "object" && !isFunction(target)) {
5988      target = {};
5989    }
5990
5991    // Extend jQuery itself if only one argument is passed
5992    if (i === length) {
5993      target = this;
5994      i--;
5995    }
5996    for (; i < length; i++) {
5997      // Only deal with non-null/undefined values
5998      if ((options = arguments[i]) != null) {
5999        // Extend the base object
6000        for (name in options) {
6001          copy = options[name];
6002
6003          // Prevent Object.prototype pollution
6004          // Prevent never-ending loop
6005          if (name === "__proto__" || target === copy) {
6006            continue;
6007          }
6008
6009          // Recurse if we're merging plain objects or arrays
6010          if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
6011            src = target[name];
6012
6013            // Ensure proper type for the source value
6014            if (copyIsArray && !Array.isArray(src)) {
6015              clone = [];
6016            } else if (!copyIsArray && !jQuery.isPlainObject(src)) {
6017              clone = {};
6018            } else {
6019              clone = src;
6020            }
6021            copyIsArray = false;
6022
6023            // Never move original objects, clone them
6024            target[name] = jQuery.extend(deep, clone, copy);
6025
6026            // Don't bring in undefined values
6027          } else if (copy !== undefined) {
6028            target[name] = copy;
6029          }
6030        }
6031      }
6032    }
6033
6034    // Return the modified object
6035    return target;
6036  };
6037  jQuery.extend({
6038    // Unique for each copy of jQuery on the page
6039    expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
6040    // Assume jQuery is ready without the ready module
6041    isReady: true,
6042    error: function (msg) {
6043      throw new Error(msg);
6044    },
6045    noop: function () {},
6046    isPlainObject: function (obj) {
6047      var proto, Ctor;
6048
6049      // Detect obvious negatives
6050      // Use toString instead of jQuery.type to catch host objects
6051      if (!obj || toString.call(obj) !== "[object Object]") {
6052        return false;
6053      }
6054      proto = getProto(obj);
6055
6056      // Objects with no prototype (e.g., `Object.create( null )`) are plain
6057      if (!proto) {
6058        return true;
6059      }
6060
6061      // Objects with prototype are plain iff they were constructed by a global Object function
6062      Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
6063      return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
6064    },
6065    isEmptyObject: function (obj) {
6066      var name;
6067      for (name in obj) {
6068        return false;
6069      }
6070      return true;
6071    },
6072    // Evaluates a script in a provided context; falls back to the global one
6073    // if not specified.
6074    globalEval: function (code, options, doc) {
6075      DOMEval(code, {
6076        nonce: options && options.nonce
6077      }, doc);
6078    },
6079    each: function (obj, callback) {
6080      var length,
6081        i = 0;
6082      if (isArrayLike(obj)) {
6083        length = obj.length;
6084        for (; i < length; i++) {
6085          if (callback.call(obj[i], i, obj[i]) === false) {
6086            break;
6087          }
6088        }
6089      } else {
6090        for (i in obj) {
6091          if (callback.call(obj[i], i, obj[i]) === false) {
6092            break;
6093          }
6094        }
6095      }
6096      return obj;
6097    },
6098    // Retrieve the text value of an array of DOM nodes
6099    text: function (elem) {
6100      var node,
6101        ret = "",
6102        i = 0,
6103        nodeType = elem.nodeType;
6104      if (!nodeType) {
6105        // If no nodeType, this is expected to be an array
6106        while (node = elem[i++]) {
6107          // Do not traverse comment nodes
6108          ret += jQuery.text(node);
6109        }
6110      }
6111      if (nodeType === 1 || nodeType === 11) {
6112        return elem.textContent;
6113      }
6114      if (nodeType === 9) {
6115        return elem.documentElement.textContent;
6116      }
6117      if (nodeType === 3 || nodeType === 4) {
6118        return elem.nodeValue;
6119      }
6120
6121      // Do not include comment or processing instruction nodes
6122
6123      return ret;
6124    },
6125    // results is for internal usage only
6126    makeArray: function (arr, results) {
6127      var ret = results || [];
6128      if (arr != null) {
6129        if (isArrayLike(Object(arr))) {
6130          jQuery.merge(ret, typeof arr === "string" ? [arr] : arr);
6131        } else {
6132          push.call(ret, arr);
6133        }
6134      }
6135      return ret;
6136    },
6137    inArray: function (elem, arr, i) {
6138      return arr == null ? -1 : indexOf.call(arr, elem, i);
6139    },
6140    isXMLDoc: function (elem) {
6141      var namespace = elem && elem.namespaceURI,
6142        docElem = elem && (elem.ownerDocument || elem).documentElement;
6143
6144      // Assume HTML when documentElement doesn't yet exist, such as inside
6145      // document fragments.
6146      return !rhtmlSuffix.test(namespace || docElem && docElem.nodeName || "HTML");
6147    },
6148    // Support: Android <=4.0 only, PhantomJS 1 only
6149    // push.apply(_, arraylike) throws on ancient WebKit
6150    merge: function (first, second) {
6151      var len = +second.length,
6152        j = 0,
6153        i = first.length;
6154      for (; j < len; j++) {
6155        first[i++] = second[j];
6156      }
6157      first.length = i;
6158      return first;
6159    },
6160    grep: function (elems, callback, invert) {
6161      var callbackInverse,
6162        matches = [],
6163        i = 0,
6164        length = elems.length,
6165        callbackExpect = !invert;
6166
6167      // Go through the array, only saving the items
6168      // that pass the validator function
6169      for (; i < length; i++) {
6170        callbackInverse = !callback(elems[i], i);
6171        if (callbackInverse !== callbackExpect) {
6172          matches.push(elems[i]);
6173        }
6174      }
6175      return matches;
6176    },
6177    // arg is for internal usage only
6178    map: function (elems, callback, arg) {
6179      var length,
6180        value,
6181        i = 0,
6182        ret = [];
6183
6184      // Go through the array, translating each of the items to their new values
6185      if (isArrayLike(elems)) {
6186        length = elems.length;
6187        for (; i < length; i++) {
6188          value = callback(elems[i], i, arg);
6189          if (value != null) {
6190            ret.push(value);
6191          }
6192        }
6193
6194        // Go through every key on the object,
6195      } else {
6196        for (i in elems) {
6197          value = callback(elems[i], i, arg);
6198          if (value != null) {
6199            ret.push(value);
6200          }
6201        }
6202      }
6203
6204      // Flatten any nested arrays
6205      return flat(ret);
6206    },
6207    // A global GUID counter for objects
6208    guid: 1,
6209    // jQuery.support is not used in Core but other projects attach their
6210    // properties to it so it needs to exist.
6211    support: support
6212  });
6213  if (typeof Symbol === "function") {
6214    jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
6215  }
6216
6217  // Populate the class2type map
6218  jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (_i, name) {
6219    class2type["[object " + name + "]"] = name.toLowerCase();
6220  });
6221  function isArrayLike(obj) {
6222    // Support: real iOS 8.2 only (not reproducible in simulator)
6223    // `in` check used to prevent JIT error (gh-2145)
6224    // hasOwn isn't used here due to false negatives
6225    // regarding Nodelist length in IE
6226    var length = !!obj && "length" in obj && obj.length,
6227      type = toType(obj);
6228    if (isFunction(obj) || isWindow(obj)) {
6229      return false;
6230    }
6231    return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
6232  }
6233  function nodeName(elem, name) {
6234    return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
6235  }
6236  var pop = arr.pop;
6237  var sort = arr.sort;
6238  var splice = arr.splice;
6239  var whitespace = "[\\x20\\t\\r\\n\\f]";
6240  var rtrimCSS = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g");
6241
6242  // Note: an element does not contain itself
6243  jQuery.contains = function (a, b) {
6244    var bup = b && b.parentNode;
6245    return a === bup || !!(bup && bup.nodeType === 1 && (
6246    // Support: IE 9 - 11+
6247    // IE doesn't have `contains` on SVG.
6248    a.contains ? a.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
6249  };
6250
6251  // CSS string/identifier serialization
6252  // https://drafts.csswg.org/cssom/#common-serializing-idioms
6253  var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
6254  function fcssescape(ch, asCodePoint) {
6255    if (asCodePoint) {
6256      // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
6257      if (ch === "\0") {
6258        return "\uFFFD";
6259      }
6260
6261      // Control characters and (dependent upon position) numbers get escaped as code points
6262      return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
6263    }
6264
6265    // Other potentially-special ASCII characters get backslash-escaped
6266    return "\\" + ch;
6267  }
6268  jQuery.escapeSelector = function (sel) {
6269    return (sel + "").replace(rcssescape, fcssescape);
6270  };
6271  var preferredDoc = document,
6272    pushNative = push;
6273  (function () {
6274    var i,
6275      Expr,
6276      outermostContext,
6277      sortInput,
6278      hasDuplicate,
6279      push = pushNative,
6280      // Local document vars
6281      document,
6282      documentElement,
6283      documentIsHTML,
6284      rbuggyQSA,
6285      matches,
6286      // Instance-specific data
6287      expando = jQuery.expando,
6288      dirruns = 0,
6289      done = 0,
6290      classCache = createCache(),
6291      tokenCache = createCache(),
6292      compilerCache = createCache(),
6293      nonnativeSelectorCache = createCache(),
6294      sortOrder = function (a, b) {
6295        if (a === b) {
6296          hasDuplicate = true;
6297        }
6298        return 0;
6299      },
6300      booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + "loop|multiple|open|readonly|required|scoped",
6301      // Regular expressions
6302
6303      // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
6304      identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
6305      // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
6306      attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
6307      // Operator (capture 2)
6308      "*([*^$|!~]?=)" + whitespace +
6309      // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
6310      "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]",
6311      pseudos = ":(" + identifier + ")(?:\\((" +
6312      // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
6313      // 1. quoted (capture 3; capture 4 or capture 5)
6314      "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
6315      // 2. simple (capture 6)
6316      "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
6317      // 3. anything else (capture 2)
6318      ".*" + ")\\)|)",
6319      // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
6320      rwhitespace = new RegExp(whitespace + "+", "g"),
6321      rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
6322      rleadingCombinator = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
6323      rdescend = new RegExp(whitespace + "|>"),
6324      rpseudo = new RegExp(pseudos),
6325      ridentifier = new RegExp("^" + identifier + "$"),
6326      matchExpr = {
6327        ID: new RegExp("^#(" + identifier + ")"),
6328        CLASS: new RegExp("^\\.(" + identifier + ")"),
6329        TAG: new RegExp("^(" + identifier + "|[*])"),
6330        ATTR: new RegExp("^" + attributes),
6331        PSEUDO: new RegExp("^" + pseudos),
6332        CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
6333        bool: new RegExp("^(?:" + booleans + ")$", "i"),
6334        // For use in libraries implementing .is()
6335        // We use this for POS matching in `select`
6336        needsContext: new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
6337      },
6338      rinputs = /^(?:input|select|textarea|button)$/i,
6339      rheader = /^h\d$/i,
6340      // Easily-parseable/retrievable ID or TAG or CLASS selectors
6341      rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
6342      rsibling = /[+~]/,
6343      // CSS escapes
6344      // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
6345      runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"),
6346      funescape = function (escape, nonHex) {
6347        var high = "0x" + escape.slice(1) - 0x10000;
6348        if (nonHex) {
6349          // Strip the backslash prefix from a non-hex escape sequence
6350          return nonHex;
6351        }
6352
6353        // Replace a hexadecimal escape sequence with the encoded Unicode code point
6354        // Support: IE <=11+
6355        // For values outside the Basic Multilingual Plane (BMP), manually construct a
6356        // surrogate pair
6357        return high < 0 ? String.fromCharCode(high + 0x10000) : String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
6358      },
6359      // Used for iframes; see `setDocument`.
6360      // Support: IE 9 - 11+, Edge 12 - 18+
6361      // Removing the function wrapper causes a "Permission Denied"
6362      // error in IE/Edge.
6363      unloadHandler = function () {
6364        setDocument();
6365      },
6366      inDisabledFieldset = addCombinator(function (elem) {
6367        return elem.disabled === true && nodeName(elem, "fieldset");
6368      }, {
6369        dir: "parentNode",
6370        next: "legend"
6371      });
6372
6373    // Support: IE <=9 only
6374    // Accessing document.activeElement can throw unexpectedly
6375    // https://bugs.jquery.com/ticket/13393
6376    function safeActiveElement() {
6377      try {
6378        return document.activeElement;
6379      } catch (err) {}
6380    }
6381
6382    // Optimize for push.apply( _, NodeList )
6383    try {
6384      push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);
6385
6386      // Support: Android <=4.0
6387      // Detect silently failing push.apply
6388      // eslint-disable-next-line no-unused-expressions
6389      arr[preferredDoc.childNodes.length].nodeType;
6390    } catch (e) {
6391      push = {
6392        apply: function (target, els) {
6393          pushNative.apply(target, slice.call(els));
6394        },
6395        call: function (target) {
6396          pushNative.apply(target, slice.call(arguments, 1));
6397        }
6398      };
6399    }
6400    function find(selector, context, results, seed) {
6401      var m,
6402        i,
6403        elem,
6404        nid,
6405        match,
6406        groups,
6407        newSelector,
6408        newContext = context && context.ownerDocument,
6409        // nodeType defaults to 9, since context defaults to document
6410        nodeType = context ? context.nodeType : 9;
6411      results = results || [];
6412
6413      // Return early from calls with invalid selector or context
6414      if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
6415        return results;
6416      }
6417
6418      // Try to shortcut find operations (as opposed to filters) in HTML documents
6419      if (!seed) {
6420        setDocument(context);
6421        context = context || document;
6422        if (documentIsHTML) {
6423          // If the selector is sufficiently simple, try using a "get*By*" DOM method
6424          // (excepting DocumentFragment context, where the methods don't exist)
6425          if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {
6426            // ID selector
6427            if (m = match[1]) {
6428              // Document context
6429              if (nodeType === 9) {
6430                if (elem = context.getElementById(m)) {
6431                  // Support: IE 9 only
6432                  // getElementById can match elements by name instead of ID
6433                  if (elem.id === m) {
6434                    push.call(results, elem);
6435                    return results;
6436                  }
6437                } else {
6438                  return results;
6439                }
6440
6441                // Element context
6442              } else {
6443                // Support: IE 9 only
6444                // getElementById can match elements by name instead of ID
6445                if (newContext && (elem = newContext.getElementById(m)) && find.contains(context, elem) && elem.id === m) {
6446                  push.call(results, elem);
6447                  return results;
6448                }
6449              }
6450
6451              // Type selector
6452            } else if (match[2]) {
6453              push.apply(results, context.getElementsByTagName(selector));
6454              return results;
6455
6456              // Class selector
6457            } else if ((m = match[3]) && context.getElementsByClassName) {
6458              push.apply(results, context.getElementsByClassName(m));
6459              return results;
6460            }
6461          }
6462
6463          // Take advantage of querySelectorAll
6464          if (!nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
6465            newSelector = selector;
6466            newContext = context;
6467
6468            // qSA considers elements outside a scoping root when evaluating child or
6469            // descendant combinators, which is not what we want.
6470            // In such cases, we work around the behavior by prefixing every selector in the
6471            // list with an ID selector referencing the scope context.
6472            // The technique has to be used as well when a leading combinator is used
6473            // as such selectors are not recognized by querySelectorAll.
6474            // Thanks to Andrew Dupont for this technique.
6475            if (nodeType === 1 && (rdescend.test(selector) || rleadingCombinator.test(selector))) {
6476              // Expand context for sibling selectors
6477              newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
6478
6479              // We can use :scope instead of the ID hack if the browser
6480              // supports it & if we're not changing the context.
6481              // Support: IE 11+, Edge 17 - 18+
6482              // IE/Edge sometimes throw a "Permission denied" error when
6483              // strict-comparing two documents; shallow comparisons work.
6484              // eslint-disable-next-line eqeqeq
6485              if (newContext != context || !support.scope) {
6486                // Capture the context ID, setting it first if necessary
6487                if (nid = context.getAttribute("id")) {
6488                  nid = jQuery.escapeSelector(nid);
6489                } else {
6490                  context.setAttribute("id", nid = expando);
6491                }
6492              }
6493
6494              // Prefix every selector in the list
6495              groups = tokenize(selector);
6496              i = groups.length;
6497              while (i--) {
6498                groups[i] = (nid ? "#" + nid : ":scope") + " " + toSelector(groups[i]);
6499              }
6500              newSelector = groups.join(",");
6501            }
6502            try {
6503              push.apply(results, newContext.querySelectorAll(newSelector));
6504              return results;
6505            } catch (qsaError) {
6506              nonnativeSelectorCache(selector, true);
6507            } finally {
6508              if (nid === expando) {
6509                context.removeAttribute("id");
6510              }
6511            }
6512          }
6513        }
6514      }
6515
6516      // All others
6517      return select(selector.replace(rtrimCSS, "$1"), context, results, seed);
6518    }
6519
6520    /**
6521     * Create key-value caches of limited size
6522     * @returns {function(string, object)} Returns the Object data after storing it on itself with
6523     *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
6524     *	deleting the oldest entry
6525     */
6526    function createCache() {
6527      var keys = [];
6528      function cache(key, value) {
6529        // Use (key + " ") to avoid collision with native prototype properties
6530        // (see https://github.com/jquery/sizzle/issues/157)
6531        if (keys.push(key + " ") > Expr.cacheLength) {
6532          // Only keep the most recent entries
6533          delete cache[keys.shift()];
6534        }
6535        return cache[key + " "] = value;
6536      }
6537      return cache;
6538    }
6539
6540    /**
6541     * Mark a function for special use by jQuery selector module
6542     * @param {Function} fn The function to mark
6543     */
6544    function markFunction(fn) {
6545      fn[expando] = true;
6546      return fn;
6547    }
6548
6549    /**
6550     * Support testing using an element
6551     * @param {Function} fn Passed the created element and returns a boolean result
6552     */
6553    function assert(fn) {
6554      var el = document.createElement("fieldset");
6555      try {
6556        return !!fn(el);
6557      } catch (e) {
6558        return false;
6559      } finally {
6560        // Remove from its parent by default
6561        if (el.parentNode) {
6562          el.parentNode.removeChild(el);
6563        }
6564
6565        // release memory in IE
6566        el = null;
6567      }
6568    }
6569
6570    /**
6571     * Returns a function to use in pseudos for input types
6572     * @param {String} type
6573     */
6574    function createInputPseudo(type) {
6575      return function (elem) {
6576        return nodeName(elem, "input") && elem.type === type;
6577      };
6578    }
6579
6580    /**
6581     * Returns a function to use in pseudos for buttons
6582     * @param {String} type
6583     */
6584    function createButtonPseudo(type) {
6585      return function (elem) {
6586        return (nodeName(elem, "input") || nodeName(elem, "button")) && elem.type === type;
6587      };
6588    }
6589
6590    /**
6591     * Returns a function to use in pseudos for :enabled/:disabled
6592     * @param {Boolean} disabled true for :disabled; false for :enabled
6593     */
6594    function createDisabledPseudo(disabled) {
6595      // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
6596      return function (elem) {
6597        // Only certain elements can match :enabled or :disabled
6598        // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
6599        // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
6600        if ("form" in elem) {
6601          // Check for inherited disabledness on relevant non-disabled elements:
6602          // * listed form-associated elements in a disabled fieldset
6603          //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
6604          //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
6605          // * option elements in a disabled optgroup
6606          //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
6607          // All such elements have a "form" property.
6608          if (elem.parentNode && elem.disabled === false) {
6609            // Option elements defer to a parent optgroup if present
6610            if ("label" in elem) {
6611              if ("label" in elem.parentNode) {
6612                return elem.parentNode.disabled === disabled;
6613              } else {
6614                return elem.disabled === disabled;
6615              }
6616            }
6617
6618            // Support: IE 6 - 11+
6619            // Use the isDisabled shortcut property to check for disabled fieldset ancestors
6620            return elem.isDisabled === disabled ||
6621            // Where there is no isDisabled, check manually
6622            elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled;
6623          }
6624          return elem.disabled === disabled;
6625
6626          // Try to winnow out elements that can't be disabled before trusting the disabled property.
6627          // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
6628          // even exist on them, let alone have a boolean value.
6629        } else if ("label" in elem) {
6630          return elem.disabled === disabled;
6631        }
6632
6633        // Remaining elements are neither :enabled nor :disabled
6634        return false;
6635      };
6636    }
6637
6638    /**
6639     * Returns a function to use in pseudos for positionals
6640     * @param {Function} fn
6641     */
6642    function createPositionalPseudo(fn) {
6643      return markFunction(function (argument) {
6644        argument = +argument;
6645        return markFunction(function (seed, matches) {
6646          var j,
6647            matchIndexes = fn([], seed.length, argument),
6648            i = matchIndexes.length;
6649
6650          // Match elements found at the specified indexes
6651          while (i--) {
6652            if (seed[j = matchIndexes[i]]) {
6653              seed[j] = !(matches[j] = seed[j]);
6654            }
6655          }
6656        });
6657      });
6658    }
6659
6660    /**
6661     * Checks a node for validity as a jQuery selector context
6662     * @param {Element|Object=} context
6663     * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
6664     */
6665    function testContext(context) {
6666      return context && typeof context.getElementsByTagName !== "undefined" && context;
6667    }
6668
6669    /**
6670     * Sets document-related variables once based on the current document
6671     * @param {Element|Object} [node] An element or document object to use to set the document
6672     * @returns {Object} Returns the current document
6673     */
6674    function setDocument(node) {
6675      var subWindow,
6676        doc = node ? node.ownerDocument || node : preferredDoc;
6677
6678      // Return early if doc is invalid or already selected
6679      // Support: IE 11+, Edge 17 - 18+
6680      // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
6681      // two documents; shallow comparisons work.
6682      // eslint-disable-next-line eqeqeq
6683      if (doc == document || doc.nodeType !== 9 || !doc.documentElement) {
6684        return document;
6685      }
6686
6687      // Update global variables
6688      document = doc;
6689      documentElement = document.documentElement;
6690      documentIsHTML = !jQuery.isXMLDoc(document);
6691
6692      // Support: iOS 7 only, IE 9 - 11+
6693      // Older browsers didn't support unprefixed `matches`.
6694      matches = documentElement.matches || documentElement.webkitMatchesSelector || documentElement.msMatchesSelector;
6695
6696      // Support: IE 9 - 11+, Edge 12 - 18+
6697      // Accessing iframe documents after unload throws "permission denied" errors
6698      // (see trac-13936).
6699      // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,
6700      // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.
6701      if (documentElement.msMatchesSelector &&
6702      // Support: IE 11+, Edge 17 - 18+
6703      // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
6704      // two documents; shallow comparisons work.
6705      // eslint-disable-next-line eqeqeq
6706      preferredDoc != document && (subWindow = document.defaultView) && subWindow.top !== subWindow) {
6707        // Support: IE 9 - 11+, Edge 12 - 18+
6708        subWindow.addEventListener("unload", unloadHandler);
6709      }
6710
6711      // Support: IE <10
6712      // Check if getElementById returns elements by name
6713      // The broken getElementById methods don't pick up programmatically-set names,
6714      // so use a roundabout getElementsByName test
6715      support.getById = assert(function (el) {
6716        documentElement.appendChild(el).id = jQuery.expando;
6717        return !document.getElementsByName || !document.getElementsByName(jQuery.expando).length;
6718      });
6719
6720      // Support: IE 9 only
6721      // Check to see if it's possible to do matchesSelector
6722      // on a disconnected node.
6723      support.disconnectedMatch = assert(function (el) {
6724        return matches.call(el, "*");
6725      });
6726
6727      // Support: IE 9 - 11+, Edge 12 - 18+
6728      // IE/Edge don't support the :scope pseudo-class.
6729      support.scope = assert(function () {
6730        return document.querySelectorAll(":scope");
6731      });
6732
6733      // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
6734      // Make sure the `:has()` argument is parsed unforgivingly.
6735      // We include `*` in the test to detect buggy implementations that are
6736      // _selectively_ forgiving (specifically when the list includes at least
6737      // one valid selector).
6738      // Note that we treat complete lack of support for `:has()` as if it were
6739      // spec-compliant support, which is fine because use of `:has()` in such
6740      // environments will fail in the qSA path and fall back to jQuery traversal
6741      // anyway.
6742      support.cssHas = assert(function () {
6743        try {
6744          document.querySelector(":has(*,:jqfake)");
6745          return false;
6746        } catch (e) {
6747          return true;
6748        }
6749      });
6750
6751      // ID filter and find
6752      if (support.getById) {
6753        Expr.filter.ID = function (id) {
6754          var attrId = id.replace(runescape, funescape);
6755          return function (elem) {
6756            return elem.getAttribute("id") === attrId;
6757          };
6758        };
6759        Expr.find.ID = function (id, context) {
6760          if (typeof context.getElementById !== "undefined" && documentIsHTML) {
6761            var elem = context.getElementById(id);
6762            return elem ? [elem] : [];
6763          }
6764        };
6765      } else {
6766        Expr.filter.ID = function (id) {
6767          var attrId = id.replace(runescape, funescape);
6768          return function (elem) {
6769            var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
6770            return node && node.value === attrId;
6771          };
6772        };
6773
6774        // Support: IE 6 - 7 only
6775        // getElementById is not reliable as a find shortcut
6776        Expr.find.ID = function (id, context) {
6777          if (typeof context.getElementById !== "undefined" && documentIsHTML) {
6778            var node,
6779              i,
6780              elems,
6781              elem = context.getElementById(id);
6782            if (elem) {
6783              // Verify the id attribute
6784              node = elem.getAttributeNode("id");
6785              if (node && node.value === id) {
6786                return [elem];
6787              }
6788
6789              // Fall back on getElementsByName
6790              elems = context.getElementsByName(id);
6791              i = 0;
6792              while (elem = elems[i++]) {
6793                node = elem.getAttributeNode("id");
6794                if (node && node.value === id) {
6795                  return [elem];
6796                }
6797              }
6798            }
6799            return [];
6800          }
6801        };
6802      }
6803
6804      // Tag
6805      Expr.find.TAG = function (tag, context) {
6806        if (typeof context.getElementsByTagName !== "undefined") {
6807          return context.getElementsByTagName(tag);
6808
6809          // DocumentFragment nodes don't have gEBTN
6810        } else {
6811          return context.querySelectorAll(tag);
6812        }
6813      };
6814
6815      // Class
6816      Expr.find.CLASS = function (className, context) {
6817        if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
6818          return context.getElementsByClassName(className);
6819        }
6820      };
6821
6822      /* QSA/matchesSelector
6823      ---------------------------------------------------------------------- */
6824
6825      // QSA and matchesSelector support
6826
6827      rbuggyQSA = [];
6828
6829      // Build QSA regex
6830      // Regex strategy adopted from Diego Perini
6831      assert(function (el) {
6832        var input;
6833        documentElement.appendChild(el).innerHTML = "<a id='" + expando + "' href='' disabled='disabled'></a>" + "<select id='" + expando + "-\r\\' disabled='disabled'>" + "<option selected=''></option></select>";
6834
6835        // Support: iOS <=7 - 8 only
6836        // Boolean attributes and "value" are not treated correctly in some XML documents
6837        if (!el.querySelectorAll("[selected]").length) {
6838          rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
6839        }
6840
6841        // Support: iOS <=7 - 8 only
6842        if (!el.querySelectorAll("[id~=" + expando + "-]").length) {
6843          rbuggyQSA.push("~=");
6844        }
6845
6846        // Support: iOS 8 only
6847        // https://bugs.webkit.org/show_bug.cgi?id=136851
6848        // In-page `selector#id sibling-combinator selector` fails
6849        if (!el.querySelectorAll("a#" + expando + "+*").length) {
6850          rbuggyQSA.push(".#.+[+~]");
6851        }
6852
6853        // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
6854        // In some of the document kinds, these selectors wouldn't work natively.
6855        // This is probably OK but for backwards compatibility we want to maintain
6856        // handling them through jQuery traversal in jQuery 3.x.
6857        if (!el.querySelectorAll(":checked").length) {
6858          rbuggyQSA.push(":checked");
6859        }
6860
6861        // Support: Windows 8 Native Apps
6862        // The type and name attributes are restricted during .innerHTML assignment
6863        input = document.createElement("input");
6864        input.setAttribute("type", "hidden");
6865        el.appendChild(input).setAttribute("name", "D");
6866
6867        // Support: IE 9 - 11+
6868        // IE's :disabled selector does not pick up the children of disabled fieldsets
6869        // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
6870        // In some of the document kinds, these selectors wouldn't work natively.
6871        // This is probably OK but for backwards compatibility we want to maintain
6872        // handling them through jQuery traversal in jQuery 3.x.
6873        documentElement.appendChild(el).disabled = true;
6874        if (el.querySelectorAll(":disabled").length !== 2) {
6875          rbuggyQSA.push(":enabled", ":disabled");
6876        }
6877
6878        // Support: IE 11+, Edge 15 - 18+
6879        // IE 11/Edge don't find elements on a `[name='']` query in some cases.
6880        // Adding a temporary attribute to the document before the selection works
6881        // around the issue.
6882        // Interestingly, IE 10 & older don't seem to have the issue.
6883        input = document.createElement("input");
6884        input.setAttribute("name", "");
6885        el.appendChild(input);
6886        if (!el.querySelectorAll("[name='']").length) {
6887          rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")");
6888        }
6889      });
6890      if (!support.cssHas) {
6891        // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
6892        // Our regular `try-catch` mechanism fails to detect natively-unsupported
6893        // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
6894        // in browsers that parse the `:has()` argument as a forgiving selector list.
6895        // https://drafts.csswg.org/selectors/#relational now requires the argument
6896        // to be parsed unforgivingly, but browsers have not yet fully adjusted.
6897        rbuggyQSA.push(":has");
6898      }
6899      rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
6900
6901      /* Sorting
6902      ---------------------------------------------------------------------- */
6903
6904      // Document order sorting
6905      sortOrder = function (a, b) {
6906        // Flag for duplicate removal
6907        if (a === b) {
6908          hasDuplicate = true;
6909          return 0;
6910        }
6911
6912        // Sort on method existence if only one input has compareDocumentPosition
6913        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
6914        if (compare) {
6915          return compare;
6916        }
6917
6918        // Calculate position if both inputs belong to the same document
6919        // Support: IE 11+, Edge 17 - 18+
6920        // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
6921        // two documents; shallow comparisons work.
6922        // eslint-disable-next-line eqeqeq
6923        compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) :
6924        // Otherwise we know they are disconnected
6925        1;
6926
6927        // Disconnected nodes
6928        if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {
6929          // Choose the first element that is related to our preferred document
6930          // Support: IE 11+, Edge 17 - 18+
6931          // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
6932          // two documents; shallow comparisons work.
6933          // eslint-disable-next-line eqeqeq
6934          if (a === document || a.ownerDocument == preferredDoc && find.contains(preferredDoc, a)) {
6935            return -1;
6936          }
6937
6938          // Support: IE 11+, Edge 17 - 18+
6939          // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
6940          // two documents; shallow comparisons work.
6941          // eslint-disable-next-line eqeqeq
6942          if (b === document || b.ownerDocument == preferredDoc && find.contains(preferredDoc, b)) {
6943            return 1;
6944          }
6945
6946          // Maintain original order
6947          return sortInput ? indexOf.call(sortInput, a) - indexOf.call(sortInput, b) : 0;
6948        }
6949        return compare & 4 ? -1 : 1;
6950      };
6951      return document;
6952    }
6953    find.matches = function (expr, elements) {
6954      return find(expr, null, null, elements);
6955    };
6956    find.matchesSelector = function (elem, expr) {
6957      setDocument(elem);
6958      if (documentIsHTML && !nonnativeSelectorCache[expr + " "] && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
6959        try {
6960          var ret = matches.call(elem, expr);
6961
6962          // IE 9's matchesSelector returns false on disconnected nodes
6963          if (ret || support.disconnectedMatch ||
6964          // As well, disconnected nodes are said to be in a document
6965          // fragment in IE 9
6966          elem.document && elem.document.nodeType !== 11) {
6967            return ret;
6968          }
6969        } catch (e) {
6970          nonnativeSelectorCache(expr, true);
6971        }
6972      }
6973      return find(expr, document, null, [elem]).length > 0;
6974    };
6975    find.contains = function (context, elem) {
6976      // Set document vars if needed
6977      // Support: IE 11+, Edge 17 - 18+
6978      // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
6979      // two documents; shallow comparisons work.
6980      // eslint-disable-next-line eqeqeq
6981      if ((context.ownerDocument || context) != document) {
6982        setDocument(context);
6983      }
6984      return jQuery.contains(context, elem);
6985    };
6986    find.attr = function (elem, name) {
6987      // Set document vars if needed
6988      // Support: IE 11+, Edge 17 - 18+
6989      // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
6990      // two documents; shallow comparisons work.
6991      // eslint-disable-next-line eqeqeq
6992      if ((elem.ownerDocument || elem) != document) {
6993        setDocument(elem);
6994      }
6995      var fn = Expr.attrHandle[name.toLowerCase()],
6996        // Don't get fooled by Object.prototype properties (see trac-13807)
6997        val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;
6998      if (val !== undefined) {
6999        return val;
7000      }
7001      return elem.getAttribute(name);
7002    };
7003    find.error = function (msg) {
7004      throw new Error("Syntax error, unrecognized expression: " + msg);
7005    };
7006
7007    /**
7008     * Document sorting and removing duplicates
7009     * @param {ArrayLike} results
7010     */
7011    jQuery.uniqueSort = function (results) {
7012      var elem,
7013        duplicates = [],
7014        j = 0,
7015        i = 0;
7016
7017      // Unless we *know* we can detect duplicates, assume their presence
7018      //
7019      // Support: Android <=4.0+
7020      // Testing for detecting duplicates is unpredictable so instead assume we can't
7021      // depend on duplicate detection in all browsers without a stable sort.
7022      hasDuplicate = !support.sortStable;
7023      sortInput = !support.sortStable && slice.call(results, 0);
7024      sort.call(results, sortOrder);
7025      if (hasDuplicate) {
7026        while (elem = results[i++]) {
7027          if (elem === results[i]) {
7028            j = duplicates.push(i);
7029          }
7030        }
7031        while (j--) {
7032          splice.call(results, duplicates[j], 1);
7033        }
7034      }
7035
7036      // Clear input after sorting to release objects
7037      // See https://github.com/jquery/sizzle/pull/225
7038      sortInput = null;
7039      return results;
7040    };
7041    jQuery.fn.uniqueSort = function () {
7042      return this.pushStack(jQuery.uniqueSort(slice.apply(this)));
7043    };
7044    Expr = jQuery.expr = {
7045      // Can be adjusted by the user
7046      cacheLength: 50,
7047      createPseudo: markFunction,
7048      match: matchExpr,
7049      attrHandle: {},
7050      find: {},
7051      relative: {
7052        ">": {
7053          dir: "parentNode",
7054          first: true
7055        },
7056        " ": {
7057          dir: "parentNode"
7058        },
7059        "+": {
7060          dir: "previousSibling",
7061          first: true
7062        },
7063        "~": {
7064          dir: "previousSibling"
7065        }
7066      },
7067      preFilter: {
7068        ATTR: function (match) {
7069          match[1] = match[1].replace(runescape, funescape);
7070
7071          // Move the given value to match[3] whether quoted or unquoted
7072          match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
7073          if (match[2] === "~=") {
7074            match[3] = " " + match[3] + " ";
7075          }
7076          return match.slice(0, 4);
7077        },
7078        CHILD: function (match) {
7079          /* matches from matchExpr["CHILD"]
7080          	1 type (only|nth|...)
7081          	2 what (child|of-type)
7082          	3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
7083          	4 xn-component of xn+y argument ([+-]?\d*n|)
7084          	5 sign of xn-component
7085          	6 x of xn-component
7086          	7 sign of y-component
7087          	8 y of y-component
7088          */
7089          match[1] = match[1].toLowerCase();
7090          if (match[1].slice(0, 3) === "nth") {
7091            // nth-* requires argument
7092            if (!match[3]) {
7093              find.error(match[0]);
7094            }
7095
7096            // numeric x and y parameters for Expr.filter.CHILD
7097            // remember that false/true cast respectively to 0/1
7098            match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
7099            match[5] = +(match[7] + match[8] || match[3] === "odd");
7100
7101            // other types prohibit arguments
7102          } else if (match[3]) {
7103            find.error(match[0]);
7104          }
7105          return match;
7106        },
7107        PSEUDO: function (match) {
7108          var excess,
7109            unquoted = !match[6] && match[2];
7110          if (matchExpr.CHILD.test(match[0])) {
7111            return null;
7112          }
7113
7114          // Accept quoted arguments as-is
7115          if (match[3]) {
7116            match[2] = match[4] || match[5] || "";
7117
7118            // Strip excess characters from unquoted arguments
7119          } else if (unquoted && rpseudo.test(unquoted) && (
7120          // Get excess from tokenize (recursively)
7121          excess = tokenize(unquoted, true)) && (
7122          // advance to the next closing parenthesis
7123          excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
7124            // excess is a negative index
7125            match[0] = match[0].slice(0, excess);
7126            match[2] = unquoted.slice(0, excess);
7127          }
7128
7129          // Return only captures needed by the pseudo filter method (type and argument)
7130          return match.slice(0, 3);
7131        }
7132      },
7133      filter: {
7134        TAG: function (nodeNameSelector) {
7135          var expectedNodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
7136          return nodeNameSelector === "*" ? function () {
7137            return true;
7138          } : function (elem) {
7139            return nodeName(elem, expectedNodeName);
7140          };
7141        },
7142        CLASS: function (className) {
7143          var pattern = classCache[className + " "];
7144          return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) {
7145            return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
7146          });
7147        },
7148        ATTR: function (name, operator, check) {
7149          return function (elem) {
7150            var result = find.attr(elem, name);
7151            if (result == null) {
7152              return operator === "!=";
7153            }
7154            if (!operator) {
7155              return true;
7156            }
7157            result += "";
7158            if (operator === "=") {
7159              return result === check;
7160            }
7161            if (operator === "!=") {
7162              return result !== check;
7163            }
7164            if (operator === "^=") {
7165              return check && result.indexOf(check) === 0;
7166            }
7167            if (operator === "*=") {
7168              return check && result.indexOf(check) > -1;
7169            }
7170            if (operator === "$=") {
7171              return check && result.slice(-check.length) === check;
7172            }
7173            if (operator === "~=") {
7174              return (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1;
7175            }
7176            if (operator === "|=") {
7177              return result === check || result.slice(0, check.length + 1) === check + "-";
7178            }
7179            return false;
7180          };
7181        },
7182        CHILD: function (type, what, _argument, first, last) {
7183          var simple = type.slice(0, 3) !== "nth",
7184            forward = type.slice(-4) !== "last",
7185            ofType = what === "of-type";
7186          return first === 1 && last === 0 ?
7187          // Shortcut for :nth-*(n)
7188          function (elem) {
7189            return !!elem.parentNode;
7190          } : function (elem, _context, xml) {
7191            var cache,
7192              outerCache,
7193              node,
7194              nodeIndex,
7195              start,
7196              dir = simple !== forward ? "nextSibling" : "previousSibling",
7197              parent = elem.parentNode,
7198              name = ofType && elem.nodeName.toLowerCase(),
7199              useCache = !xml && !ofType,
7200              diff = false;
7201            if (parent) {
7202              // :(first|last|only)-(child|of-type)
7203              if (simple) {
7204                while (dir) {
7205                  node = elem;
7206                  while (node = node[dir]) {
7207                    if (ofType ? nodeName(node, name) : node.nodeType === 1) {
7208                      return false;
7209                    }
7210                  }
7211
7212                  // Reverse direction for :only-* (if we haven't yet done so)
7213                  start = dir = type === "only" && !start && "nextSibling";
7214                }
7215                return true;
7216              }
7217              start = [forward ? parent.firstChild : parent.lastChild];
7218
7219              // non-xml :nth-child(...) stores cache data on `parent`
7220              if (forward && useCache) {
7221                // Seek `elem` from a previously-cached index
7222                outerCache = parent[expando] || (parent[expando] = {});
7223                cache = outerCache[type] || [];
7224                nodeIndex = cache[0] === dirruns && cache[1];
7225                diff = nodeIndex && cache[2];
7226                node = nodeIndex && parent.childNodes[nodeIndex];
7227                while (node = ++nodeIndex && node && node[dir] || (
7228                // Fallback to seeking `elem` from the start
7229                diff = nodeIndex = 0) || start.pop()) {
7230                  // When found, cache indexes on `parent` and break
7231                  if (node.nodeType === 1 && ++diff && node === elem) {
7232                    outerCache[type] = [dirruns, nodeIndex, diff];
7233                    break;
7234                  }
7235                }
7236              } else {
7237                // Use previously-cached element index if available
7238                if (useCache) {
7239                  outerCache = elem[expando] || (elem[expando] = {});
7240                  cache = outerCache[type] || [];
7241                  nodeIndex = cache[0] === dirruns && cache[1];
7242                  diff = nodeIndex;
7243                }
7244
7245                // xml :nth-child(...)
7246                // or :nth-last-child(...) or :nth(-last)?-of-type(...)
7247                if (diff === false) {
7248                  // Use the same loop as above to seek `elem` from the start
7249                  while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {
7250                    if ((ofType ? nodeName(node, name) : node.nodeType === 1) && ++diff) {
7251                      // Cache the index of each encountered element
7252                      if (useCache) {
7253                        outerCache = node[expando] || (node[expando] = {});
7254                        outerCache[type] = [dirruns, diff];
7255                      }
7256                      if (node === elem) {
7257                        break;
7258                      }
7259                    }
7260                  }
7261                }
7262              }
7263
7264              // Incorporate the offset, then check against cycle size
7265              diff -= last;
7266              return diff === first || diff % first === 0 && diff / first >= 0;
7267            }
7268          };
7269        },
7270        PSEUDO: function (pseudo, argument) {
7271          // pseudo-class names are case-insensitive
7272          // https://www.w3.org/TR/selectors/#pseudo-classes
7273          // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
7274          // Remember that setFilters inherits from pseudos
7275          var args,
7276            fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || find.error("unsupported pseudo: " + pseudo);
7277
7278          // The user may use createPseudo to indicate that
7279          // arguments are needed to create the filter function
7280          // just as jQuery does
7281          if (fn[expando]) {
7282            return fn(argument);
7283          }
7284
7285          // But maintain support for old signatures
7286          if (fn.length > 1) {
7287            args = [pseudo, pseudo, "", argument];
7288            return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {
7289              var idx,
7290                matched = fn(seed, argument),
7291                i = matched.length;
7292              while (i--) {
7293                idx = indexOf.call(seed, matched[i]);
7294                seed[idx] = !(matches[idx] = matched[i]);
7295              }
7296            }) : function (elem) {
7297              return fn(elem, 0, args);
7298            };
7299          }
7300          return fn;
7301        }
7302      },
7303      pseudos: {
7304        // Potentially complex pseudos
7305        not: markFunction(function (selector) {
7306          // Trim the selector passed to compile
7307          // to avoid treating leading and trailing
7308          // spaces as combinators
7309          var input = [],
7310            results = [],
7311            matcher = compile(selector.replace(rtrimCSS, "$1"));
7312          return matcher[expando] ? markFunction(function (seed, matches, _context, xml) {
7313            var elem,
7314              unmatched = matcher(seed, null, xml, []),
7315              i = seed.length;
7316
7317            // Match elements unmatched by `matcher`
7318            while (i--) {
7319              if (elem = unmatched[i]) {
7320                seed[i] = !(matches[i] = elem);
7321              }
7322            }
7323          }) : function (elem, _context, xml) {
7324            input[0] = elem;
7325            matcher(input, null, xml, results);
7326
7327            // Don't keep the element
7328            // (see https://github.com/jquery/sizzle/issues/299)
7329            input[0] = null;
7330            return !results.pop();
7331          };
7332        }),
7333        has: markFunction(function (selector) {
7334          return function (elem) {
7335            return find(selector, elem).length > 0;
7336          };
7337        }),
7338        contains: markFunction(function (text) {
7339          text = text.replace(runescape, funescape);
7340          return function (elem) {
7341            return (elem.textContent || jQuery.text(elem)).indexOf(text) > -1;
7342          };
7343        }),
7344        // "Whether an element is represented by a :lang() selector
7345        // is based solely on the element's language value
7346        // being equal to the identifier C,
7347        // or beginning with the identifier C immediately followed by "-".
7348        // The matching of C against the element's language value is performed case-insensitively.
7349        // The identifier C does not have to be a valid language name."
7350        // https://www.w3.org/TR/selectors/#lang-pseudo
7351        lang: markFunction(function (lang) {
7352          // lang value must be a valid identifier
7353          if (!ridentifier.test(lang || "")) {
7354            find.error("unsupported lang: " + lang);
7355          }
7356          lang = lang.replace(runescape, funescape).toLowerCase();
7357          return function (elem) {
7358            var elemLang;
7359            do {
7360              if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {
7361                elemLang = elemLang.toLowerCase();
7362                return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
7363              }
7364            } while ((elem = elem.parentNode) && elem.nodeType === 1);
7365            return false;
7366          };
7367        }),
7368        // Miscellaneous
7369        target: function (elem) {
7370          var hash = window.location && window.location.hash;
7371          return hash && hash.slice(1) === elem.id;
7372        },
7373        root: function (elem) {
7374          return elem === documentElement;
7375        },
7376        focus: function (elem) {
7377          return elem === safeActiveElement() && document.hasFocus() && !!(elem.type || elem.href || ~elem.tabIndex);
7378        },
7379        // Boolean properties
7380        enabled: createDisabledPseudo(false),
7381        disabled: createDisabledPseudo(true),
7382        checked: function (elem) {
7383          // In CSS3, :checked should return both checked and selected elements
7384          // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
7385          return nodeName(elem, "input") && !!elem.checked || nodeName(elem, "option") && !!elem.selected;
7386        },
7387        selected: function (elem) {
7388          // Support: IE <=11+
7389          // Accessing the selectedIndex property
7390          // forces the browser to treat the default option as
7391          // selected when in an optgroup.
7392          if (elem.parentNode) {
7393            // eslint-disable-next-line no-unused-expressions
7394            elem.parentNode.selectedIndex;
7395          }
7396          return elem.selected === true;
7397        },
7398        // Contents
7399        empty: function (elem) {
7400          // https://www.w3.org/TR/selectors/#empty-pseudo
7401          // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
7402          //   but not by others (comment: 8; processing instruction: 7; etc.)
7403          // nodeType < 6 works because attributes (2) do not appear as children
7404          for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
7405            if (elem.nodeType < 6) {
7406              return false;
7407            }
7408          }
7409          return true;
7410        },
7411        parent: function (elem) {
7412          return !Expr.pseudos.empty(elem);
7413        },
7414        // Element/input types
7415        header: function (elem) {
7416          return rheader.test(elem.nodeName);
7417        },
7418        input: function (elem) {
7419          return rinputs.test(elem.nodeName);
7420        },
7421        button: function (elem) {
7422          return nodeName(elem, "input") && elem.type === "button" || nodeName(elem, "button");
7423        },
7424        text: function (elem) {
7425          var attr;
7426          return nodeName(elem, "input") && elem.type === "text" && (
7427          // Support: IE <10 only
7428          // New HTML5 attribute values (e.g., "search") appear
7429          // with elem.type === "text"
7430          (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
7431        },
7432        // Position-in-collection
7433        first: createPositionalPseudo(function () {
7434          return [0];
7435        }),
7436        last: createPositionalPseudo(function (_matchIndexes, length) {
7437          return [length - 1];
7438        }),
7439        eq: createPositionalPseudo(function (_matchIndexes, length, argument) {
7440          return [argument < 0 ? argument + length : argument];
7441        }),
7442        even: createPositionalPseudo(function (matchIndexes, length) {
7443          var i = 0;
7444          for (; i < length; i += 2) {
7445            matchIndexes.push(i);
7446          }
7447          return matchIndexes;
7448        }),
7449        odd: createPositionalPseudo(function (matchIndexes, length) {
7450          var i = 1;
7451          for (; i < length; i += 2) {
7452            matchIndexes.push(i);
7453          }
7454          return matchIndexes;
7455        }),
7456        lt: createPositionalPseudo(function (matchIndexes, length, argument) {
7457          var i;
7458          if (argument < 0) {
7459            i = argument + length;
7460          } else if (argument > length) {
7461            i = length;
7462          } else {
7463            i = argument;
7464          }
7465          for (; --i >= 0;) {
7466            matchIndexes.push(i);
7467          }
7468          return matchIndexes;
7469        }),
7470        gt: createPositionalPseudo(function (matchIndexes, length, argument) {
7471          var i = argument < 0 ? argument + length : argument;
7472          for (; ++i < length;) {
7473            matchIndexes.push(i);
7474          }
7475          return matchIndexes;
7476        })
7477      }
7478    };
7479    Expr.pseudos.nth = Expr.pseudos.eq;
7480
7481    // Add button/input type pseudos
7482    for (i in {
7483      radio: true,
7484      checkbox: true,
7485      file: true,
7486      password: true,
7487      image: true
7488    }) {
7489      Expr.pseudos[i] = createInputPseudo(i);
7490    }
7491    for (i in {
7492      submit: true,
7493      reset: true
7494    }) {
7495      Expr.pseudos[i] = createButtonPseudo(i);
7496    }
7497
7498    // Easy API for creating new setFilters
7499    function setFilters() {}
7500    setFilters.prototype = Expr.filters = Expr.pseudos;
7501    Expr.setFilters = new setFilters();
7502    function tokenize(selector, parseOnly) {
7503      var matched,
7504        match,
7505        tokens,
7506        type,
7507        soFar,
7508        groups,
7509        preFilters,
7510        cached = tokenCache[selector + " "];
7511      if (cached) {
7512        return parseOnly ? 0 : cached.slice(0);
7513      }
7514      soFar = selector;
7515      groups = [];
7516      preFilters = Expr.preFilter;
7517      while (soFar) {
7518        // Comma and first run
7519        if (!matched || (match = rcomma.exec(soFar))) {
7520          if (match) {
7521            // Don't consume trailing commas as valid
7522            soFar = soFar.slice(match[0].length) || soFar;
7523          }
7524          groups.push(tokens = []);
7525        }
7526        matched = false;
7527
7528        // Combinators
7529        if (match = rleadingCombinator.exec(soFar)) {
7530          matched = match.shift();
7531          tokens.push({
7532            value: matched,
7533            // Cast descendant combinators to space
7534            type: match[0].replace(rtrimCSS, " ")
7535          });
7536          soFar = soFar.slice(matched.length);
7537        }
7538
7539        // Filters
7540        for (type in Expr.filter) {
7541          if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
7542            matched = match.shift();
7543            tokens.push({
7544              value: matched,
7545              type: type,
7546              matches: match
7547            });
7548            soFar = soFar.slice(matched.length);
7549          }
7550        }
7551        if (!matched) {
7552          break;
7553        }
7554      }
7555
7556      // Return the length of the invalid excess
7557      // if we're just parsing
7558      // Otherwise, throw an error or return tokens
7559      if (parseOnly) {
7560        return soFar.length;
7561      }
7562      return soFar ? find.error(selector) :
7563      // Cache the tokens
7564      tokenCache(selector, groups).slice(0);
7565    }
7566    function toSelector(tokens) {
7567      var i = 0,
7568        len = tokens.length,
7569        selector = "";
7570      for (; i < len; i++) {
7571        selector += tokens[i].value;
7572      }
7573      return selector;
7574    }
7575    function addCombinator(matcher, combinator, base) {
7576      var dir = combinator.dir,
7577        skip = combinator.next,
7578        key = skip || dir,
7579        checkNonElements = base && key === "parentNode",
7580        doneName = done++;
7581      return combinator.first ?
7582      // Check against closest ancestor/preceding element
7583      function (elem, context, xml) {
7584        while (elem = elem[dir]) {
7585          if (elem.nodeType === 1 || checkNonElements) {
7586            return matcher(elem, context, xml);
7587          }
7588        }
7589        return false;
7590      } :
7591      // Check against all ancestor/preceding elements
7592      function (elem, context, xml) {
7593        var oldCache,
7594          outerCache,
7595          newCache = [dirruns, doneName];
7596
7597        // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
7598        if (xml) {
7599          while (elem = elem[dir]) {
7600            if (elem.nodeType === 1 || checkNonElements) {
7601              if (matcher(elem, context, xml)) {
7602                return true;
7603              }
7604            }
7605          }
7606        } else {
7607          while (elem = elem[dir]) {
7608            if (elem.nodeType === 1 || checkNonElements) {
7609              outerCache = elem[expando] || (elem[expando] = {});
7610              if (skip && nodeName(elem, skip)) {
7611                elem = elem[dir] || elem;
7612              } else if ((oldCache = outerCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) {
7613                // Assign to newCache so results back-propagate to previous elements
7614                return newCache[2] = oldCache[2];
7615              } else {
7616                // Reuse newcache so results back-propagate to previous elements
7617                outerCache[key] = newCache;
7618
7619                // A match means we're done; a fail means we have to keep checking
7620                if (newCache[2] = matcher(elem, context, xml)) {
7621                  return true;
7622                }
7623              }
7624            }
7625          }
7626        }
7627        return false;
7628      };
7629    }
7630    function elementMatcher(matchers) {
7631      return matchers.length > 1 ? function (elem, context, xml) {
7632        var i = matchers.length;
7633        while (i--) {
7634          if (!matchers[i](elem, context, xml)) {
7635            return false;
7636          }
7637        }
7638        return true;
7639      } : matchers[0];
7640    }
7641    function multipleContexts(selector, contexts, results) {
7642      var i = 0,
7643        len = contexts.length;
7644      for (; i < len; i++) {
7645        find(selector, contexts[i], results);
7646      }
7647      return results;
7648    }
7649    function condense(unmatched, map, filter, context, xml) {
7650      var elem,
7651        newUnmatched = [],
7652        i = 0,
7653        len = unmatched.length,
7654        mapped = map != null;
7655      for (; i < len; i++) {
7656        if (elem = unmatched[i]) {
7657          if (!filter || filter(elem, context, xml)) {
7658            newUnmatched.push(elem);
7659            if (mapped) {
7660              map.push(i);
7661            }
7662          }
7663        }
7664      }
7665      return newUnmatched;
7666    }
7667    function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
7668      if (postFilter && !postFilter[expando]) {
7669        postFilter = setMatcher(postFilter);
7670      }
7671      if (postFinder && !postFinder[expando]) {
7672        postFinder = setMatcher(postFinder, postSelector);
7673      }
7674      return markFunction(function (seed, results, context, xml) {
7675        var temp,
7676          i,
7677          elem,
7678          matcherOut,
7679          preMap = [],
7680          postMap = [],
7681          preexisting = results.length,
7682          // Get initial elements from seed or context
7683          elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),
7684          // Prefilter to get matcher input, preserving a map for seed-results synchronization
7685          matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems;
7686        if (matcher) {
7687          // If we have a postFinder, or filtered seed, or non-seed postFilter
7688          // or preexisting results,
7689          matcherOut = postFinder || (seed ? preFilter : preexisting || postFilter) ?
7690          // ...intermediate processing is necessary
7691          [] :
7692          // ...otherwise use results directly
7693          results;
7694
7695          // Find primary matches
7696          matcher(matcherIn, matcherOut, context, xml);
7697        } else {
7698          matcherOut = matcherIn;
7699        }
7700
7701        // Apply postFilter
7702        if (postFilter) {
7703          temp = condense(matcherOut, postMap);
7704          postFilter(temp, [], context, xml);
7705
7706          // Un-match failing elements by moving them back to matcherIn
7707          i = temp.length;
7708          while (i--) {
7709            if (elem = temp[i]) {
7710              matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
7711            }
7712          }
7713        }
7714        if (seed) {
7715          if (postFinder || preFilter) {
7716            if (postFinder) {
7717              // Get the final matcherOut by condensing this intermediate into postFinder contexts
7718              temp = [];
7719              i = matcherOut.length;
7720              while (i--) {
7721                if (elem = matcherOut[i]) {
7722                  // Restore matcherIn since elem is not yet a final match
7723                  temp.push(matcherIn[i] = elem);
7724                }
7725              }
7726              postFinder(null, matcherOut = [], temp, xml);
7727            }
7728
7729            // Move matched elements from seed to results to keep them synchronized
7730            i = matcherOut.length;
7731            while (i--) {
7732              if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1) {
7733                seed[temp] = !(results[temp] = elem);
7734              }
7735            }
7736          }
7737
7738          // Add elements to results, through postFinder if defined
7739        } else {
7740          matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
7741          if (postFinder) {
7742            postFinder(null, results, matcherOut, xml);
7743          } else {
7744            push.apply(results, matcherOut);
7745          }
7746        }
7747      });
7748    }
7749    function matcherFromTokens(tokens) {
7750      var checkContext,
7751        matcher,
7752        j,
7753        len = tokens.length,
7754        leadingRelative = Expr.relative[tokens[0].type],
7755        implicitRelative = leadingRelative || Expr.relative[" "],
7756        i = leadingRelative ? 1 : 0,
7757        // The foundational matcher ensures that elements are reachable from top-level context(s)
7758        matchContext = addCombinator(function (elem) {
7759          return elem === checkContext;
7760        }, implicitRelative, true),
7761        matchAnyContext = addCombinator(function (elem) {
7762          return indexOf.call(checkContext, elem) > -1;
7763        }, implicitRelative, true),
7764        matchers = [function (elem, context, xml) {
7765          // Support: IE 11+, Edge 17 - 18+
7766          // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7767          // two documents; shallow comparisons work.
7768          // eslint-disable-next-line eqeqeq
7769          var ret = !leadingRelative && (xml || context != outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
7770
7771          // Avoid hanging onto element
7772          // (see https://github.com/jquery/sizzle/issues/299)
7773          checkContext = null;
7774          return ret;
7775        }];
7776      for (; i < len; i++) {
7777        if (matcher = Expr.relative[tokens[i].type]) {
7778          matchers = [addCombinator(elementMatcher(matchers), matcher)];
7779        } else {
7780          matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);
7781
7782          // Return special upon seeing a positional matcher
7783          if (matcher[expando]) {
7784            // Find the next relative operator (if any) for proper handling
7785            j = ++i;
7786            for (; j < len; j++) {
7787              if (Expr.relative[tokens[j].type]) {
7788                break;
7789              }
7790            }
7791            return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(
7792            // If the preceding token was a descendant combinator, insert an implicit any-element `*`
7793            tokens.slice(0, i - 1).concat({
7794              value: tokens[i - 2].type === " " ? "*" : ""
7795            })).replace(rtrimCSS, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
7796          }
7797          matchers.push(matcher);
7798        }
7799      }
7800      return elementMatcher(matchers);
7801    }
7802    function matcherFromGroupMatchers(elementMatchers, setMatchers) {
7803      var bySet = setMatchers.length > 0,
7804        byElement = elementMatchers.length > 0,
7805        superMatcher = function (seed, context, xml, results, outermost) {
7806          var elem,
7807            j,
7808            matcher,
7809            matchedCount = 0,
7810            i = "0",
7811            unmatched = seed && [],
7812            setMatched = [],
7813            contextBackup = outermostContext,
7814            // We must always have either seed elements or outermost context
7815            elems = seed || byElement && Expr.find.TAG("*", outermost),
7816            // Use integer dirruns iff this is the outermost matcher
7817            dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,
7818            len = elems.length;
7819          if (outermost) {
7820            // Support: IE 11+, Edge 17 - 18+
7821            // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7822            // two documents; shallow comparisons work.
7823            // eslint-disable-next-line eqeqeq
7824            outermostContext = context == document || context || outermost;
7825          }
7826
7827          // Add elements passing elementMatchers directly to results
7828          // Support: iOS <=7 - 9 only
7829          // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
7830          // elements by id. (see trac-14142)
7831          for (; i !== len && (elem = elems[i]) != null; i++) {
7832            if (byElement && elem) {
7833              j = 0;
7834
7835              // Support: IE 11+, Edge 17 - 18+
7836              // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
7837              // two documents; shallow comparisons work.
7838              // eslint-disable-next-line eqeqeq
7839              if (!context && elem.ownerDocument != document) {
7840                setDocument(elem);
7841                xml = !documentIsHTML;
7842              }
7843              while (matcher = elementMatchers[j++]) {
7844                if (matcher(elem, context || document, xml)) {
7845                  push.call(results, elem);
7846                  break;
7847                }
7848              }
7849              if (outermost) {
7850                dirruns = dirrunsUnique;
7851              }
7852            }
7853
7854            // Track unmatched elements for set filters
7855            if (bySet) {
7856              // They will have gone through all possible matchers
7857              if (elem = !matcher && elem) {
7858                matchedCount--;
7859              }
7860
7861              // Lengthen the array for every element, matched or not
7862              if (seed) {
7863                unmatched.push(elem);
7864              }
7865            }
7866          }
7867
7868          // `i` is now the count of elements visited above, and adding it to `matchedCount`
7869          // makes the latter nonnegative.
7870          matchedCount += i;
7871
7872          // Apply set filters to unmatched elements
7873          // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
7874          // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
7875          // no element matchers and no seed.
7876          // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
7877          // case, which will result in a "00" `matchedCount` that differs from `i` but is also
7878          // numerically zero.
7879          if (bySet && i !== matchedCount) {
7880            j = 0;
7881            while (matcher = setMatchers[j++]) {
7882              matcher(unmatched, setMatched, context, xml);
7883            }
7884            if (seed) {
7885              // Reintegrate element matches to eliminate the need for sorting
7886              if (matchedCount > 0) {
7887                while (i--) {
7888                  if (!(unmatched[i] || setMatched[i])) {
7889                    setMatched[i] = pop.call(results);
7890                  }
7891                }
7892              }
7893
7894              // Discard index placeholder values to get only actual matches
7895              setMatched = condense(setMatched);
7896            }
7897
7898            // Add matches to results
7899            push.apply(results, setMatched);
7900
7901            // Seedless set matches succeeding multiple successful matchers stipulate sorting
7902            if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
7903              jQuery.uniqueSort(results);
7904            }
7905          }
7906
7907          // Override manipulation of globals by nested matchers
7908          if (outermost) {
7909            dirruns = dirrunsUnique;
7910            outermostContext = contextBackup;
7911          }
7912          return unmatched;
7913        };
7914      return bySet ? markFunction(superMatcher) : superMatcher;
7915    }
7916    function compile(selector, match /* Internal Use Only */) {
7917      var i,
7918        setMatchers = [],
7919        elementMatchers = [],
7920        cached = compilerCache[selector + " "];
7921      if (!cached) {
7922        // Generate a function of recursive functions that can be used to check each element
7923        if (!match) {
7924          match = tokenize(selector);
7925        }
7926        i = match.length;
7927        while (i--) {
7928          cached = matcherFromTokens(match[i]);
7929          if (cached[expando]) {
7930            setMatchers.push(cached);
7931          } else {
7932            elementMatchers.push(cached);
7933          }
7934        }
7935
7936        // Cache the compiled function
7937        cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));
7938
7939        // Save selector and tokenization
7940        cached.selector = selector;
7941      }
7942      return cached;
7943    }
7944
7945    /**
7946     * A low-level selection function that works with jQuery's compiled
7947     *  selector functions
7948     * @param {String|Function} selector A selector or a pre-compiled
7949     *  selector function built with jQuery selector compile
7950     * @param {Element} context
7951     * @param {Array} [results]
7952     * @param {Array} [seed] A set of elements to match against
7953     */
7954    function select(selector, context, results, seed) {
7955      var i,
7956        tokens,
7957        token,
7958        type,
7959        find,
7960        compiled = typeof selector === "function" && selector,
7961        match = !seed && tokenize(selector = compiled.selector || selector);
7962      results = results || [];
7963
7964      // Try to minimize operations if there is only one selector in the list and no seed
7965      // (the latter of which guarantees us context)
7966      if (match.length === 1) {
7967        // Reduce context if the leading compound selector is an ID
7968        tokens = match[0] = match[0].slice(0);
7969        if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
7970          context = (Expr.find.ID(token.matches[0].replace(runescape, funescape), context) || [])[0];
7971          if (!context) {
7972            return results;
7973
7974            // Precompiled matchers will still verify ancestry, so step up a level
7975          } else if (compiled) {
7976            context = context.parentNode;
7977          }
7978          selector = selector.slice(tokens.shift().value.length);
7979        }
7980
7981        // Fetch a seed set for right-to-left matching
7982        i = matchExpr.needsContext.test(selector) ? 0 : tokens.length;
7983        while (i--) {
7984          token = tokens[i];
7985
7986          // Abort if we hit a combinator
7987          if (Expr.relative[type = token.type]) {
7988            break;
7989          }
7990          if (find = Expr.find[type]) {
7991            // Search, expanding context for leading sibling combinators
7992            if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {
7993              // If seed is empty or no tokens remain, we can return early
7994              tokens.splice(i, 1);
7995              selector = seed.length && toSelector(tokens);
7996              if (!selector) {
7997                push.apply(results, seed);
7998                return results;
7999              }
8000              break;
8001            }
8002          }
8003        }
8004      }
8005
8006      // Compile and execute a filtering function if one is not provided
8007      // Provide `match` to avoid retokenization if we modified the selector above
8008      (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);
8009      return results;
8010    }
8011
8012    // One-time assignments
8013
8014    // Support: Android <=4.0 - 4.1+
8015    // Sort stability
8016    support.sortStable = expando.split("").sort(sortOrder).join("") === expando;
8017
8018    // Initialize against the default document
8019    setDocument();
8020
8021    // Support: Android <=4.0 - 4.1+
8022    // Detached nodes confoundingly follow *each other*
8023    support.sortDetached = assert(function (el) {
8024      // Should return 1, but returns 4 (following)
8025      return el.compareDocumentPosition(document.createElement("fieldset")) & 1;
8026    });
8027    jQuery.find = find;
8028
8029    // Deprecated
8030    jQuery.expr[":"] = jQuery.expr.pseudos;
8031    jQuery.unique = jQuery.uniqueSort;
8032
8033    // These have always been private, but they used to be documented as part of
8034    // Sizzle so let's maintain them for now for backwards compatibility purposes.
8035    find.compile = compile;
8036    find.select = select;
8037    find.setDocument = setDocument;
8038    find.tokenize = tokenize;
8039    find.escape = jQuery.escapeSelector;
8040    find.getText = jQuery.text;
8041    find.isXML = jQuery.isXMLDoc;
8042    find.selectors = jQuery.expr;
8043    find.support = jQuery.support;
8044    find.uniqueSort = jQuery.uniqueSort;
8045
8046    /* eslint-enable */
8047  })();
8048  var dir = function (elem, dir, until) {
8049    var matched = [],
8050      truncate = until !== undefined;
8051    while ((elem = elem[dir]) && elem.nodeType !== 9) {
8052      if (elem.nodeType === 1) {
8053        if (truncate && jQuery(elem).is(until)) {
8054          break;
8055        }
8056        matched.push(elem);
8057      }
8058    }
8059    return matched;
8060  };
8061  var siblings = function (n, elem) {
8062    var matched = [];
8063    for (; n; n = n.nextSibling) {
8064      if (n.nodeType === 1 && n !== elem) {
8065        matched.push(n);
8066      }
8067    }
8068    return matched;
8069  };
8070  var rneedsContext = jQuery.expr.match.needsContext;
8071  var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;
8072
8073  // Implement the identical functionality for filter and not
8074  function winnow(elements, qualifier, not) {
8075    if (isFunction(qualifier)) {
8076      return jQuery.grep(elements, function (elem, i) {
8077        return !!qualifier.call(elem, i, elem) !== not;
8078      });
8079    }
8080
8081    // Single element
8082    if (qualifier.nodeType) {
8083      return jQuery.grep(elements, function (elem) {
8084        return elem === qualifier !== not;
8085      });
8086    }
8087
8088    // Arraylike of elements (jQuery, arguments, Array)
8089    if (typeof qualifier !== "string") {
8090      return jQuery.grep(elements, function (elem) {
8091        return indexOf.call(qualifier, elem) > -1 !== not;
8092      });
8093    }
8094
8095    // Filtered directly for both simple and complex selectors
8096    return jQuery.filter(qualifier, elements, not);
8097  }
8098  jQuery.filter = function (expr, elems, not) {
8099    var elem = elems[0];
8100    if (not) {
8101      expr = ":not(" + expr + ")";
8102    }
8103    if (elems.length === 1 && elem.nodeType === 1) {
8104      return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];
8105    }
8106    return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
8107      return elem.nodeType === 1;
8108    }));
8109  };
8110  jQuery.fn.extend({
8111    find: function (selector) {
8112      var i,
8113        ret,
8114        len = this.length,
8115        self = this;
8116      if (typeof selector !== "string") {
8117        return this.pushStack(jQuery(selector).filter(function () {
8118          for (i = 0; i < len; i++) {
8119            if (jQuery.contains(self[i], this)) {
8120              return true;
8121            }
8122          }
8123        }));
8124      }
8125      ret = this.pushStack([]);
8126      for (i = 0; i < len; i++) {
8127        jQuery.find(selector, self[i], ret);
8128      }
8129      return len > 1 ? jQuery.uniqueSort(ret) : ret;
8130    },
8131    filter: function (selector) {
8132      return this.pushStack(winnow(this, selector || [], false));
8133    },
8134    not: function (selector) {
8135      return this.pushStack(winnow(this, selector || [], true));
8136    },
8137    is: function (selector) {
8138      return !!winnow(this,
8139      // If this is a positional/relative selector, check membership in the returned set
8140      // so $("p:first").is("p:last") won't return true for a doc with two "p".
8141      typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
8142    }
8143  });
8144
8145  // Initialize a jQuery object
8146
8147  // A central reference to the root jQuery(document)
8148  var rootjQuery,
8149    // A simple way to check for HTML strings
8150    // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
8151    // Strict HTML recognition (trac-11290: must start with <)
8152    // Shortcut simple #id case for speed
8153    rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
8154    init = jQuery.fn.init = function (selector, context, root) {
8155      var match, elem;
8156
8157      // HANDLE: $(""), $(null), $(undefined), $(false)
8158      if (!selector) {
8159        return this;
8160      }
8161
8162      // Method init() accepts an alternate rootjQuery
8163      // so migrate can support jQuery.sub (gh-2101)
8164      root = root || rootjQuery;
8165
8166      // Handle HTML strings
8167      if (typeof selector === "string") {
8168        if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {
8169          // Assume that strings that start and end with <> are HTML and skip the regex check
8170          match = [null, selector, null];
8171        } else {
8172          match = rquickExpr.exec(selector);
8173        }
8174
8175        // Match html or make sure no context is specified for #id
8176        if (match && (match[1] || !context)) {
8177          // HANDLE: $(html) -> $(array)
8178          if (match[1]) {
8179            context = context instanceof jQuery ? context[0] : context;
8180
8181            // Option to run scripts is true for back-compat
8182            // Intentionally let the error be thrown if parseHTML is not present
8183            jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true));
8184
8185            // HANDLE: $(html, props)
8186            if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
8187              for (match in context) {
8188                // Properties of context are called as methods if possible
8189                if (isFunction(this[match])) {
8190                  this[match](context[match]);
8191
8192                  // ...and otherwise set as attributes
8193                } else {
8194                  this.attr(match, context[match]);
8195                }
8196              }
8197            }
8198            return this;
8199
8200            // HANDLE: $(#id)
8201          } else {
8202            elem = document.getElementById(match[2]);
8203            if (elem) {
8204              // Inject the element directly into the jQuery object
8205              this[0] = elem;
8206              this.length = 1;
8207            }
8208            return this;
8209          }
8210
8211          // HANDLE: $(expr, $(...))
8212        } else if (!context || context.jquery) {
8213          return (context || root).find(selector);
8214
8215          // HANDLE: $(expr, context)
8216          // (which is just equivalent to: $(context).find(expr)
8217        } else {
8218          return this.constructor(context).find(selector);
8219        }
8220
8221        // HANDLE: $(DOMElement)
8222      } else if (selector.nodeType) {
8223        this[0] = selector;
8224        this.length = 1;
8225        return this;
8226
8227        // HANDLE: $(function)
8228        // Shortcut for document ready
8229      } else if (isFunction(selector)) {
8230        return root.ready !== undefined ? root.ready(selector) :
8231        // Execute immediately if ready is not present
8232        selector(jQuery);
8233      }
8234      return jQuery.makeArray(selector, this);
8235    };
8236
8237  // Give the init function the jQuery prototype for later instantiation
8238  init.prototype = jQuery.fn;
8239
8240  // Initialize central reference
8241  rootjQuery = jQuery(document);
8242  var rparentsprev = /^(?:parents|prev(?:Until|All))/,
8243    // Methods guaranteed to produce a unique set when starting from a unique set
8244    guaranteedUnique = {
8245      children: true,
8246      contents: true,
8247      next: true,
8248      prev: true
8249    };
8250  jQuery.fn.extend({
8251    has: function (target) {
8252      var targets = jQuery(target, this),
8253        l = targets.length;
8254      return this.filter(function () {
8255        var i = 0;
8256        for (; i < l; i++) {
8257          if (jQuery.contains(this, targets[i])) {
8258            return true;
8259          }
8260        }
8261      });
8262    },
8263    closest: function (selectors, context) {
8264      var cur,
8265        i = 0,
8266        l = this.length,
8267        matched = [],
8268        targets = typeof selectors !== "string" && jQuery(selectors);
8269
8270      // Positional selectors never match, since there's no _selection_ context
8271      if (!rneedsContext.test(selectors)) {
8272        for (; i < l; i++) {
8273          for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
8274            // Always skip document fragments
8275            if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 :
8276            // Don't pass non-elements to jQuery#find
8277            cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {
8278              matched.push(cur);
8279              break;
8280            }
8281          }
8282        }
8283      }
8284      return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
8285    },
8286    // Determine the position of an element within the set
8287    index: function (elem) {
8288      // No argument, return index in parent
8289      if (!elem) {
8290        return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
8291      }
8292
8293      // Index in selector
8294      if (typeof elem === "string") {
8295        return indexOf.call(jQuery(elem), this[0]);
8296      }
8297
8298      // Locate the position of the desired element
8299      return indexOf.call(this,
8300      // If it receives a jQuery object, the first element is used
8301      elem.jquery ? elem[0] : elem);
8302    },
8303    add: function (selector, context) {
8304      return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));
8305    },
8306    addBack: function (selector) {
8307      return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
8308    }
8309  });
8310  function sibling(cur, dir) {
8311    while ((cur = cur[dir]) && cur.nodeType !== 1) {}
8312    return cur;
8313  }
8314  jQuery.each({
8315    parent: function (elem) {
8316      var parent = elem.parentNode;
8317      return parent && parent.nodeType !== 11 ? parent : null;
8318    },
8319    parents: function (elem) {
8320      return dir(elem, "parentNode");
8321    },
8322    parentsUntil: function (elem, _i, until) {
8323      return dir(elem, "parentNode", until);
8324    },
8325    next: function (elem) {
8326      return sibling(elem, "nextSibling");
8327    },
8328    prev: function (elem) {
8329      return sibling(elem, "previousSibling");
8330    },
8331    nextAll: function (elem) {
8332      return dir(elem, "nextSibling");
8333    },
8334    prevAll: function (elem) {
8335      return dir(elem, "previousSibling");
8336    },
8337    nextUntil: function (elem, _i, until) {
8338      return dir(elem, "nextSibling", until);
8339    },
8340    prevUntil: function (elem, _i, until) {
8341      return dir(elem, "previousSibling", until);
8342    },
8343    siblings: function (elem) {
8344      return siblings((elem.parentNode || {}).firstChild, elem);
8345    },
8346    children: function (elem) {
8347      return siblings(elem.firstChild);
8348    },
8349    contents: function (elem) {
8350      if (elem.contentDocument != null &&
8351      // Support: IE 11+
8352      // <object> elements with no `data` attribute has an object
8353      // `contentDocument` with a `null` prototype.
8354      getProto(elem.contentDocument)) {
8355        return elem.contentDocument;
8356      }
8357
8358      // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
8359      // Treat the template element as a regular one in browsers that
8360      // don't support it.
8361      if (nodeName(elem, "template")) {
8362        elem = elem.content || elem;
8363      }
8364      return jQuery.merge([], elem.childNodes);
8365    }
8366  }, function (name, fn) {
8367    jQuery.fn[name] = function (until, selector) {
8368      var matched = jQuery.map(this, fn, until);
8369      if (name.slice(-5) !== "Until") {
8370        selector = until;
8371      }
8372      if (selector && typeof selector === "string") {
8373        matched = jQuery.filter(selector, matched);
8374      }
8375      if (this.length > 1) {
8376        // Remove duplicates
8377        if (!guaranteedUnique[name]) {
8378          jQuery.uniqueSort(matched);
8379        }
8380
8381        // Reverse order for parents* and prev-derivatives
8382        if (rparentsprev.test(name)) {
8383          matched.reverse();
8384        }
8385      }
8386      return this.pushStack(matched);
8387    };
8388  });
8389  var rnothtmlwhite = /[^\x20\t\r\n\f]+/g;
8390
8391  // Convert String-formatted options into Object-formatted ones
8392  function createOptions(options) {
8393    var object = {};
8394    jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) {
8395      object[flag] = true;
8396    });
8397    return object;
8398  }
8399
8400  /*
8401   * Create a callback list using the following parameters:
8402   *
8403   *	options: an optional list of space-separated options that will change how
8404   *			the callback list behaves or a more traditional option object
8405   *
8406   * By default a callback list will act like an event callback list and can be
8407   * "fired" multiple times.
8408   *
8409   * Possible options:
8410   *
8411   *	once:			will ensure the callback list can only be fired once (like a Deferred)
8412   *
8413   *	memory:			will keep track of previous values and will call any callback added
8414   *					after the list has been fired right away with the latest "memorized"
8415   *					values (like a Deferred)
8416   *
8417   *	unique:			will ensure a callback can only be added once (no duplicate in the list)
8418   *
8419   *	stopOnFalse:	interrupt callings when a callback returns false
8420   *
8421   */
8422  jQuery.Callbacks = function (options) {
8423    // Convert options from String-formatted to Object-formatted if needed
8424    // (we check in cache first)
8425    options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);
8426    var
8427      // Flag to know if list is currently firing
8428      firing,
8429      // Last fire value for non-forgettable lists
8430      memory,
8431      // Flag to know if list was already fired
8432      fired,
8433      // Flag to prevent firing
8434      locked,
8435      // Actual callback list
8436      list = [],
8437      // Queue of execution data for repeatable lists
8438      queue = [],
8439      // Index of currently firing callback (modified by add/remove as needed)
8440      firingIndex = -1,
8441      // Fire callbacks
8442      fire = function () {
8443        // Enforce single-firing
8444        locked = locked || options.once;
8445
8446        // Execute callbacks for all pending executions,
8447        // respecting firingIndex overrides and runtime changes
8448        fired = firing = true;
8449        for (; queue.length; firingIndex = -1) {
8450          memory = queue.shift();
8451          while (++firingIndex < list.length) {
8452            // Run callback and check for early termination
8453            if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {
8454              // Jump to end and forget the data so .add doesn't re-fire
8455              firingIndex = list.length;
8456              memory = false;
8457            }
8458          }
8459        }
8460
8461        // Forget the data if we're done with it
8462        if (!options.memory) {
8463          memory = false;
8464        }
8465        firing = false;
8466
8467        // Clean up if we're done firing for good
8468        if (locked) {
8469          // Keep an empty list if we have data for future add calls
8470          if (memory) {
8471            list = [];
8472
8473            // Otherwise, this object is spent
8474          } else {
8475            list = "";
8476          }
8477        }
8478      },
8479      // Actual Callbacks object
8480      self = {
8481        // Add a callback or a collection of callbacks to the list
8482        add: function () {
8483          if (list) {
8484            // If we have memory from a past run, we should fire after adding
8485            if (memory && !firing) {
8486              firingIndex = list.length - 1;
8487              queue.push(memory);
8488            }
8489            (function add(args) {
8490              jQuery.each(args, function (_, arg) {
8491                if (isFunction(arg)) {
8492                  if (!options.unique || !self.has(arg)) {
8493                    list.push(arg);
8494                  }
8495                } else if (arg && arg.length && toType(arg) !== "string") {
8496                  // Inspect recursively
8497                  add(arg);
8498                }
8499              });
8500            })(arguments);
8501            if (memory && !firing) {
8502              fire();
8503            }
8504          }
8505          return this;
8506        },
8507        // Remove a callback from the list
8508        remove: function () {
8509          jQuery.each(arguments, function (_, arg) {
8510            var index;
8511            while ((index = jQuery.inArray(arg, list, index)) > -1) {
8512              list.splice(index, 1);
8513
8514              // Handle firing indexes
8515              if (index <= firingIndex) {
8516                firingIndex--;
8517              }
8518            }
8519          });
8520          return this;
8521        },
8522        // Check if a given callback is in the list.
8523        // If no argument is given, return whether or not list has callbacks attached.
8524        has: function (fn) {
8525          return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;
8526        },
8527        // Remove all callbacks from the list
8528        empty: function () {
8529          if (list) {
8530            list = [];
8531          }
8532          return this;
8533        },
8534        // Disable .fire and .add
8535        // Abort any current/pending executions
8536        // Clear all callbacks and values
8537        disable: function () {
8538          locked = queue = [];
8539          list = memory = "";
8540          return this;
8541        },
8542        disabled: function () {
8543          return !list;
8544        },
8545        // Disable .fire
8546        // Also disable .add unless we have memory (since it would have no effect)
8547        // Abort any pending executions
8548        lock: function () {
8549          locked = queue = [];
8550          if (!memory && !firing) {
8551            list = memory = "";
8552          }
8553          return this;
8554        },
8555        locked: function () {
8556          return !!locked;
8557        },
8558        // Call all callbacks with the given context and arguments
8559        fireWith: function (context, args) {
8560          if (!locked) {
8561            args = args || [];
8562            args = [context, args.slice ? args.slice() : args];
8563            queue.push(args);
8564            if (!firing) {
8565              fire();
8566            }
8567          }
8568          return this;
8569        },
8570        // Call all the callbacks with the given arguments
8571        fire: function () {
8572          self.fireWith(this, arguments);
8573          return this;
8574        },
8575        // To know if the callbacks have already been called at least once
8576        fired: function () {
8577          return !!fired;
8578        }
8579      };
8580    return self;
8581  };
8582  function Identity(v) {
8583    return v;
8584  }
8585  function Thrower(ex) {
8586    throw ex;
8587  }
8588  function adoptValue(value, resolve, reject, noValue) {
8589    var method;
8590    try {
8591      // Check for promise aspect first to privilege synchronous behavior
8592      if (value && isFunction(method = value.promise)) {
8593        method.call(value).done(resolve).fail(reject);
8594
8595        // Other thenables
8596      } else if (value && isFunction(method = value.then)) {
8597        method.call(value, resolve, reject);
8598
8599        // Other non-thenables
8600      } else {
8601        // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
8602        // * false: [ value ].slice( 0 ) => resolve( value )
8603        // * true: [ value ].slice( 1 ) => resolve()
8604        resolve.apply(undefined, [value].slice(noValue));
8605      }
8606
8607      // For Promises/A+, convert exceptions into rejections
8608      // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
8609      // Deferred#then to conditionally suppress rejection.
8610    } catch (value) {
8611      // Support: Android 4.0 only
8612      // Strict mode functions invoked without .call/.apply get global-object context
8613      reject.apply(undefined, [value]);
8614    }
8615  }
8616  jQuery.extend({
8617    Deferred: function (func) {
8618      var tuples = [
8619        // action, add listener, callbacks,
8620        // ... .then handlers, argument index, [final state]
8621        ["notify", "progress", jQuery.Callbacks("memory"), jQuery.Callbacks("memory"), 2], ["resolve", "done", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), jQuery.Callbacks("once memory"), 1, "rejected"]],
8622        state = "pending",
8623        promise = {
8624          state: function () {
8625            return state;
8626          },
8627          always: function () {
8628            deferred.done(arguments).fail(arguments);
8629            return this;
8630          },
8631          "catch": function (fn) {
8632            return promise.then(null, fn);
8633          },
8634          // Keep pipe for back-compat
8635          pipe: function /* fnDone, fnFail, fnProgress */
8636          () {
8637            var fns = arguments;
8638            return jQuery.Deferred(function (newDefer) {
8639              jQuery.each(tuples, function (_i, tuple) {
8640                // Map tuples (progress, done, fail) to arguments (done, fail, progress)
8641                var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]];
8642
8643                // deferred.progress(function() { bind to newDefer or newDefer.notify })
8644                // deferred.done(function() { bind to newDefer or newDefer.resolve })
8645                // deferred.fail(function() { bind to newDefer or newDefer.reject })
8646                deferred[tuple[1]](function () {
8647                  var returned = fn && fn.apply(this, arguments);
8648                  if (returned && isFunction(returned.promise)) {
8649                    returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
8650                  } else {
8651                    newDefer[tuple[0] + "With"](this, fn ? [returned] : arguments);
8652                  }
8653                });
8654              });
8655              fns = null;
8656            }).promise();
8657          },
8658          then: function (onFulfilled, onRejected, onProgress) {
8659            var maxDepth = 0;
8660            function resolve(depth, deferred, handler, special) {
8661              return function () {
8662                var that = this,
8663                  args = arguments,
8664                  mightThrow = function () {
8665                    var returned, then;
8666
8667                    // Support: Promises/A+ section 2.3.3.3.3
8668                    // https://promisesaplus.com/#point-59
8669                    // Ignore double-resolution attempts
8670                    if (depth < maxDepth) {
8671                      return;
8672                    }
8673                    returned = handler.apply(that, args);
8674
8675                    // Support: Promises/A+ section 2.3.1
8676                    // https://promisesaplus.com/#point-48
8677                    if (returned === deferred.promise()) {
8678                      throw new TypeError("Thenable self-resolution");
8679                    }
8680
8681                    // Support: Promises/A+ sections 2.3.3.1, 3.5
8682                    // https://promisesaplus.com/#point-54
8683                    // https://promisesaplus.com/#point-75
8684                    // Retrieve `then` only once
8685                    then = returned && (
8686                    // Support: Promises/A+ section 2.3.4
8687                    // https://promisesaplus.com/#point-64
8688                    // Only check objects and functions for thenability
8689                    typeof returned === "object" || typeof returned === "function") && returned.then;
8690
8691                    // Handle a returned thenable
8692                    if (isFunction(then)) {
8693                      // Special processors (notify) just wait for resolution
8694                      if (special) {
8695                        then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special));
8696
8697                        // Normal processors (resolve) also hook into progress
8698                      } else {
8699                        // ...and disregard older resolution values
8700                        maxDepth++;
8701                        then.call(returned, resolve(maxDepth, deferred, Identity, special), resolve(maxDepth, deferred, Thrower, special), resolve(maxDepth, deferred, Identity, deferred.notifyWith));
8702                      }
8703
8704                      // Handle all other returned values
8705                    } else {
8706                      // Only substitute handlers pass on context
8707                      // and multiple values (non-spec behavior)
8708                      if (handler !== Identity) {
8709                        that = undefined;
8710                        args = [returned];
8711                      }
8712
8713                      // Process the value(s)
8714                      // Default process is resolve
8715                      (special || deferred.resolveWith)(that, args);
8716                    }
8717                  },
8718                  // Only normal processors (resolve) catch and reject exceptions
8719                  process = special ? mightThrow : function () {
8720                    try {
8721                      mightThrow();
8722                    } catch (e) {
8723                      if (jQuery.Deferred.exceptionHook) {
8724                        jQuery.Deferred.exceptionHook(e, process.error);
8725                      }
8726
8727                      // Support: Promises/A+ section 2.3.3.3.4.1
8728                      // https://promisesaplus.com/#point-61
8729                      // Ignore post-resolution exceptions
8730                      if (depth + 1 >= maxDepth) {
8731                        // Only substitute handlers pass on context
8732                        // and multiple values (non-spec behavior)
8733                        if (handler !== Thrower) {
8734                          that = undefined;
8735                          args = [e];
8736                        }
8737                        deferred.rejectWith(that, args);
8738                      }
8739                    }
8740                  };
8741
8742                // Support: Promises/A+ section 2.3.3.3.1
8743                // https://promisesaplus.com/#point-57
8744                // Re-resolve promises immediately to dodge false rejection from
8745                // subsequent errors
8746                if (depth) {
8747                  process();
8748                } else {
8749                  // Call an optional hook to record the error, in case of exception
8750                  // since it's otherwise lost when execution goes async
8751                  if (jQuery.Deferred.getErrorHook) {
8752                    process.error = jQuery.Deferred.getErrorHook();
8753
8754                    // The deprecated alias of the above. While the name suggests
8755                    // returning the stack, not an error instance, jQuery just passes
8756                    // it directly to `console.warn` so both will work; an instance
8757                    // just better cooperates with source maps.
8758                  } else if (jQuery.Deferred.getStackHook) {
8759                    process.error = jQuery.Deferred.getStackHook();
8760                  }
8761                  window.setTimeout(process);
8762                }
8763              };
8764            }
8765            return jQuery.Deferred(function (newDefer) {
8766              // progress_handlers.add( ... )
8767              tuples[0][3].add(resolve(0, newDefer, isFunction(onProgress) ? onProgress : Identity, newDefer.notifyWith));
8768
8769              // fulfilled_handlers.add( ... )
8770              tuples[1][3].add(resolve(0, newDefer, isFunction(onFulfilled) ? onFulfilled : Identity));
8771
8772              // rejected_handlers.add( ... )
8773              tuples[2][3].add(resolve(0, newDefer, isFunction(onRejected) ? onRejected : Thrower));
8774            }).promise();
8775          },
8776          // Get a promise for this deferred
8777          // If obj is provided, the promise aspect is added to the object
8778          promise: function (obj) {
8779            return obj != null ? jQuery.extend(obj, promise) : promise;
8780          }
8781        },
8782        deferred = {};
8783
8784      // Add list-specific methods
8785      jQuery.each(tuples, function (i, tuple) {
8786        var list = tuple[2],
8787          stateString = tuple[5];
8788
8789        // promise.progress = list.add
8790        // promise.done = list.add
8791        // promise.fail = list.add
8792        promise[tuple[1]] = list.add;
8793
8794        // Handle state
8795        if (stateString) {
8796          list.add(function () {
8797            // state = "resolved" (i.e., fulfilled)
8798            // state = "rejected"
8799            state = stateString;
8800          },
8801          // rejected_callbacks.disable
8802          // fulfilled_callbacks.disable
8803          tuples[3 - i][2].disable,
8804          // rejected_handlers.disable
8805          // fulfilled_handlers.disable
8806          tuples[3 - i][3].disable,
8807          // progress_callbacks.lock
8808          tuples[0][2].lock,
8809          // progress_handlers.lock
8810          tuples[0][3].lock);
8811        }
8812
8813        // progress_handlers.fire
8814        // fulfilled_handlers.fire
8815        // rejected_handlers.fire
8816        list.add(tuple[3].fire);
8817
8818        // deferred.notify = function() { deferred.notifyWith(...) }
8819        // deferred.resolve = function() { deferred.resolveWith(...) }
8820        // deferred.reject = function() { deferred.rejectWith(...) }
8821        deferred[tuple[0]] = function () {
8822          deferred[tuple[0] + "With"](this === deferred ? undefined : this, arguments);
8823          return this;
8824        };
8825
8826        // deferred.notifyWith = list.fireWith
8827        // deferred.resolveWith = list.fireWith
8828        // deferred.rejectWith = list.fireWith
8829        deferred[tuple[0] + "With"] = list.fireWith;
8830      });
8831
8832      // Make the deferred a promise
8833      promise.promise(deferred);
8834
8835      // Call given func if any
8836      if (func) {
8837        func.call(deferred, deferred);
8838      }
8839
8840      // All done!
8841      return deferred;
8842    },
8843    // Deferred helper
8844    when: function (singleValue) {
8845      var
8846        // count of uncompleted subordinates
8847        remaining = arguments.length,
8848        // count of unprocessed arguments
8849        i = remaining,
8850        // subordinate fulfillment data
8851        resolveContexts = Array(i),
8852        resolveValues = slice.call(arguments),
8853        // the primary Deferred
8854        primary = jQuery.Deferred(),
8855        // subordinate callback factory
8856        updateFunc = function (i) {
8857          return function (value) {
8858            resolveContexts[i] = this;
8859            resolveValues[i] = arguments.length > 1 ? slice.call(arguments) : value;
8860            if (! --remaining) {
8861              primary.resolveWith(resolveContexts, resolveValues);
8862            }
8863          };
8864        };
8865
8866      // Single- and empty arguments are adopted like Promise.resolve
8867      if (remaining <= 1) {
8868        adoptValue(singleValue, primary.done(updateFunc(i)).resolve, primary.reject, !remaining);
8869
8870        // Use .then() to unwrap secondary thenables (cf. gh-3000)
8871        if (primary.state() === "pending" || isFunction(resolveValues[i] && resolveValues[i].then)) {
8872          return primary.then();
8873        }
8874      }
8875
8876      // Multiple arguments are aggregated like Promise.all array elements
8877      while (i--) {
8878        adoptValue(resolveValues[i], updateFunc(i), primary.reject);
8879      }
8880      return primary.promise();
8881    }
8882  });
8883
8884  // These usually indicate a programmer mistake during development,
8885  // warn about them ASAP rather than swallowing them by default.
8886  var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
8887
8888  // If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
8889  // captured before the async barrier to get the original error cause
8890  // which may otherwise be hidden.
8891  jQuery.Deferred.exceptionHook = function (error, asyncError) {
8892    // Support: IE 8 - 9 only
8893    // Console exists when dev tools are open, which can happen at any time
8894    if (window.console && window.console.warn && error && rerrorNames.test(error.name)) {
8895      window.console.warn("jQuery.Deferred exception: " + error.message, error.stack, asyncError);
8896    }
8897  };
8898  jQuery.readyException = function (error) {
8899    window.setTimeout(function () {
8900      throw error;
8901    });
8902  };
8903
8904  // The deferred used on DOM ready
8905  var readyList = jQuery.Deferred();
8906  jQuery.fn.ready = function (fn) {
8907    readyList.then(fn)
8908
8909    // Wrap jQuery.readyException in a function so that the lookup
8910    // happens at the time of error handling instead of callback
8911    // registration.
8912    .catch(function (error) {
8913      jQuery.readyException(error);
8914    });
8915    return this;
8916  };
8917  jQuery.extend({
8918    // Is the DOM ready to be used? Set to true once it occurs.
8919    isReady: false,
8920    // A counter to track how many items to wait for before
8921    // the ready event fires. See trac-6781
8922    readyWait: 1,
8923    // Handle when the DOM is ready
8924    ready: function (wait) {
8925      // Abort if there are pending holds or we're already ready
8926      if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
8927        return;
8928      }
8929
8930      // Remember that the DOM is ready
8931      jQuery.isReady = true;
8932
8933      // If a normal DOM Ready event fired, decrement, and wait if need be
8934      if (wait !== true && --jQuery.readyWait > 0) {
8935        return;
8936      }
8937
8938      // If there are functions bound, to execute
8939      readyList.resolveWith(document, [jQuery]);
8940    }
8941  });
8942  jQuery.ready.then = readyList.then;
8943
8944  // The ready event handler and self cleanup method
8945  function completed() {
8946    document.removeEventListener("DOMContentLoaded", completed);
8947    window.removeEventListener("load", completed);
8948    jQuery.ready();
8949  }
8950
8951  // Catch cases where $(document).ready() is called
8952  // after the browser event has already occurred.
8953  // Support: IE <=9 - 10 only
8954  // Older IE sometimes signals "interactive" too soon
8955  if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) {
8956    // Handle it asynchronously to allow scripts the opportunity to delay ready
8957    window.setTimeout(jQuery.ready);
8958  } else {
8959    // Use the handy event callback
8960    document.addEventListener("DOMContentLoaded", completed);
8961
8962    // A fallback to window.onload, that will always work
8963    window.addEventListener("load", completed);
8964  }
8965
8966  // Multifunctional method to get and set values of a collection
8967  // The value/s can optionally be executed if it's a function
8968  var access = function (elems, fn, key, value, chainable, emptyGet, raw) {
8969    var i = 0,
8970      len = elems.length,
8971      bulk = key == null;
8972
8973    // Sets many values
8974    if (toType(key) === "object") {
8975      chainable = true;
8976      for (i in key) {
8977        access(elems, fn, i, key[i], true, emptyGet, raw);
8978      }
8979
8980      // Sets one value
8981    } else if (value !== undefined) {
8982      chainable = true;
8983      if (!isFunction(value)) {
8984        raw = true;
8985      }
8986      if (bulk) {
8987        // Bulk operations run against the entire set
8988        if (raw) {
8989          fn.call(elems, value);
8990          fn = null;
8991
8992          // ...except when executing function values
8993        } else {
8994          bulk = fn;
8995          fn = function (elem, _key, value) {
8996            return bulk.call(jQuery(elem), value);
8997          };
8998        }
8999      }
9000      if (fn) {
9001        for (; i < len; i++) {
9002          fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
9003        }
9004      }
9005    }
9006    if (chainable) {
9007      return elems;
9008    }
9009
9010    // Gets
9011    if (bulk) {
9012      return fn.call(elems);
9013    }
9014    return len ? fn(elems[0], key) : emptyGet;
9015  };
9016
9017  // Matches dashed string for camelizing
9018  var rmsPrefix = /^-ms-/,
9019    rdashAlpha = /-([a-z])/g;
9020
9021  // Used by camelCase as callback to replace()
9022  function fcamelCase(_all, letter) {
9023    return letter.toUpperCase();
9024  }
9025
9026  // Convert dashed to camelCase; used by the css and data modules
9027  // Support: IE <=9 - 11, Edge 12 - 15
9028  // Microsoft forgot to hump their vendor prefix (trac-9572)
9029  function camelCase(string) {
9030    return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
9031  }
9032  var acceptData = function (owner) {
9033    // Accepts only:
9034    //  - Node
9035    //    - Node.ELEMENT_NODE
9036    //    - Node.DOCUMENT_NODE
9037    //  - Object
9038    //    - Any
9039    return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;
9040  };
9041  function Data() {
9042    this.expando = jQuery.expando + Data.uid++;
9043  }
9044  Data.uid = 1;
9045  Data.prototype = {
9046    cache: function (owner) {
9047      // Check if the owner object already has a cache
9048      var value = owner[this.expando];
9049
9050      // If not, create one
9051      if (!value) {
9052        value = {};
9053
9054        // We can accept data for non-element nodes in modern browsers,
9055        // but we should not, see trac-8335.
9056        // Always return an empty object.
9057        if (acceptData(owner)) {
9058          // If it is a node unlikely to be stringify-ed or looped over
9059          // use plain assignment
9060          if (owner.nodeType) {
9061            owner[this.expando] = value;
9062
9063            // Otherwise secure it in a non-enumerable property
9064            // configurable must be true to allow the property to be
9065            // deleted when data is removed
9066          } else {
9067            Object.defineProperty(owner, this.expando, {
9068              value: value,
9069              configurable: true
9070            });
9071          }
9072        }
9073      }
9074      return value;
9075    },
9076    set: function (owner, data, value) {
9077      var prop,
9078        cache = this.cache(owner);
9079
9080      // Handle: [ owner, key, value ] args
9081      // Always use camelCase key (gh-2257)
9082      if (typeof data === "string") {
9083        cache[camelCase(data)] = value;
9084
9085        // Handle: [ owner, { properties } ] args
9086      } else {
9087        // Copy the properties one-by-one to the cache object
9088        for (prop in data) {
9089          cache[camelCase(prop)] = data[prop];
9090        }
9091      }
9092      return cache;
9093    },
9094    get: function (owner, key) {
9095      return key === undefined ? this.cache(owner) :
9096      // Always use camelCase key (gh-2257)
9097      owner[this.expando] && owner[this.expando][camelCase(key)];
9098    },
9099    access: function (owner, key, value) {
9100      // In cases where either:
9101      //
9102      //   1. No key was specified
9103      //   2. A string key was specified, but no value provided
9104      //
9105      // Take the "read" path and allow the get method to determine
9106      // which value to return, respectively either:
9107      //
9108      //   1. The entire cache object
9109      //   2. The data stored at the key
9110      //
9111      if (key === undefined || key && typeof key === "string" && value === undefined) {
9112        return this.get(owner, key);
9113      }
9114
9115      // When the key is not a string, or both a key and value
9116      // are specified, set or extend (existing objects) with either:
9117      //
9118      //   1. An object of properties
9119      //   2. A key and value
9120      //
9121      this.set(owner, key, value);
9122
9123      // Since the "set" path can have two possible entry points
9124      // return the expected data based on which path was taken[*]
9125      return value !== undefined ? value : key;
9126    },
9127    remove: function (owner, key) {
9128      var i,
9129        cache = owner[this.expando];
9130      if (cache === undefined) {
9131        return;
9132      }
9133      if (key !== undefined) {
9134        // Support array or space separated string of keys
9135        if (Array.isArray(key)) {
9136          // If key is an array of keys...
9137          // We always set camelCase keys, so remove that.
9138          key = key.map(camelCase);
9139        } else {
9140          key = camelCase(key);
9141
9142          // If a key with the spaces exists, use it.
9143          // Otherwise, create an array by matching non-whitespace
9144          key = key in cache ? [key] : key.match(rnothtmlwhite) || [];
9145        }
9146        i = key.length;
9147        while (i--) {
9148          delete cache[key[i]];
9149        }
9150      }
9151
9152      // Remove the expando if there's no more data
9153      if (key === undefined || jQuery.isEmptyObject(cache)) {
9154        // Support: Chrome <=35 - 45
9155        // Webkit & Blink performance suffers when deleting properties
9156        // from DOM nodes, so set to undefined instead
9157        // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
9158        if (owner.nodeType) {
9159          owner[this.expando] = undefined;
9160        } else {
9161          delete owner[this.expando];
9162        }
9163      }
9164    },
9165    hasData: function (owner) {
9166      var cache = owner[this.expando];
9167      return cache !== undefined && !jQuery.isEmptyObject(cache);
9168    }
9169  };
9170  var dataPriv = new Data();
9171  var dataUser = new Data();
9172
9173  //	Implementation Summary
9174  //
9175  //	1. Enforce API surface and semantic compatibility with 1.9.x branch
9176  //	2. Improve the module's maintainability by reducing the storage
9177  //		paths to a single mechanism.
9178  //	3. Use the same single mechanism to support "private" and "user" data.
9179  //	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
9180  //	5. Avoid exposing implementation details on user objects (eg. expando properties)
9181  //	6. Provide a clear path for implementation upgrade to WeakMap in 2014
9182
9183  var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
9184    rmultiDash = /[A-Z]/g;
9185  function getData(data) {
9186    if (data === "true") {
9187      return true;
9188    }
9189    if (data === "false") {
9190      return false;
9191    }
9192    if (data === "null") {
9193      return null;
9194    }
9195
9196    // Only convert to a number if it doesn't change the string
9197    if (data === +data + "") {
9198      return +data;
9199    }
9200    if (rbrace.test(data)) {
9201      return JSON.parse(data);
9202    }
9203    return data;
9204  }
9205  function dataAttr(elem, key, data) {
9206    var name;
9207
9208    // If nothing was found internally, try to fetch any
9209    // data from the HTML5 data-* attribute
9210    if (data === undefined && elem.nodeType === 1) {
9211      name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
9212      data = elem.getAttribute(name);
9213      if (typeof data === "string") {
9214        try {
9215          data = getData(data);
9216        } catch (e) {}
9217
9218        // Make sure we set the data so it isn't changed later
9219        dataUser.set(elem, key, data);
9220      } else {
9221        data = undefined;
9222      }
9223    }
9224    return data;
9225  }
9226  jQuery.extend({
9227    hasData: function (elem) {
9228      return dataUser.hasData(elem) || dataPriv.hasData(elem);
9229    },
9230    data: function (elem, name, data) {
9231      return dataUser.access(elem, name, data);
9232    },
9233    removeData: function (elem, name) {
9234      dataUser.remove(elem, name);
9235    },
9236    // TODO: Now that all calls to _data and _removeData have been replaced
9237    // with direct calls to dataPriv methods, these can be deprecated.
9238    _data: function (elem, name, data) {
9239      return dataPriv.access(elem, name, data);
9240    },
9241    _removeData: function (elem, name) {
9242      dataPriv.remove(elem, name);
9243    }
9244  });
9245  jQuery.fn.extend({
9246    data: function (key, value) {
9247      var i,
9248        name,
9249        data,
9250        elem = this[0],
9251        attrs = elem && elem.attributes;
9252
9253      // Gets all values
9254      if (key === undefined) {
9255        if (this.length) {
9256          data = dataUser.get(elem);
9257          if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
9258            i = attrs.length;
9259            while (i--) {
9260              // Support: IE 11 only
9261              // The attrs elements can be null (trac-14894)
9262              if (attrs[i]) {
9263                name = attrs[i].name;
9264                if (name.indexOf("data-") === 0) {
9265                  name = camelCase(name.slice(5));
9266                  dataAttr(elem, name, data[name]);
9267                }
9268              }
9269            }
9270            dataPriv.set(elem, "hasDataAttrs", true);
9271          }
9272        }
9273        return data;
9274      }
9275
9276      // Sets multiple values
9277      if (typeof key === "object") {
9278        return this.each(function () {
9279          dataUser.set(this, key);
9280        });
9281      }
9282      return access(this, function (value) {
9283        var data;
9284
9285        // The calling jQuery object (element matches) is not empty
9286        // (and therefore has an element appears at this[ 0 ]) and the
9287        // `value` parameter was not undefined. An empty jQuery object
9288        // will result in `undefined` for elem = this[ 0 ] which will
9289        // throw an exception if an attempt to read a data cache is made.
9290        if (elem && value === undefined) {
9291          // Attempt to get data from the cache
9292          // The key will always be camelCased in Data
9293          data = dataUser.get(elem, key);
9294          if (data !== undefined) {
9295            return data;
9296          }
9297
9298          // Attempt to "discover" the data in
9299          // HTML5 custom data-* attrs
9300          data = dataAttr(elem, key);
9301          if (data !== undefined) {
9302            return data;
9303          }
9304
9305          // We tried really hard, but the data doesn't exist.
9306          return;
9307        }
9308
9309        // Set the data...
9310        this.each(function () {
9311          // We always store the camelCased key
9312          dataUser.set(this, key, value);
9313        });
9314      }, null, value, arguments.length > 1, null, true);
9315    },
9316    removeData: function (key) {
9317      return this.each(function () {
9318        dataUser.remove(this, key);
9319      });
9320    }
9321  });
9322  jQuery.extend({
9323    queue: function (elem, type, data) {
9324      var queue;
9325      if (elem) {
9326        type = (type || "fx") + "queue";
9327        queue = dataPriv.get(elem, type);
9328
9329        // Speed up dequeue by getting out quickly if this is just a lookup
9330        if (data) {
9331          if (!queue || Array.isArray(data)) {
9332            queue = dataPriv.access(elem, type, jQuery.makeArray(data));
9333          } else {
9334            queue.push(data);
9335          }
9336        }
9337        return queue || [];
9338      }
9339    },
9340    dequeue: function (elem, type) {
9341      type = type || "fx";
9342      var queue = jQuery.queue(elem, type),
9343        startLength = queue.length,
9344        fn = queue.shift(),
9345        hooks = jQuery._queueHooks(elem, type),
9346        next = function () {
9347          jQuery.dequeue(elem, type);
9348        };
9349
9350      // If the fx queue is dequeued, always remove the progress sentinel
9351      if (fn === "inprogress") {
9352        fn = queue.shift();
9353        startLength--;
9354      }
9355      if (fn) {
9356        // Add a progress sentinel to prevent the fx queue from being
9357        // automatically dequeued
9358        if (type === "fx") {
9359          queue.unshift("inprogress");
9360        }
9361
9362        // Clear up the last queue stop function
9363        delete hooks.stop;
9364        fn.call(elem, next, hooks);
9365      }
9366      if (!startLength && hooks) {
9367        hooks.empty.fire();
9368      }
9369    },
9370    // Not public - generate a queueHooks object, or return the current one
9371    _queueHooks: function (elem, type) {
9372      var key = type + "queueHooks";
9373      return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
9374        empty: jQuery.Callbacks("once memory").add(function () {
9375          dataPriv.remove(elem, [type + "queue", key]);
9376        })
9377      });
9378    }
9379  });
9380  jQuery.fn.extend({
9381    queue: function (type, data) {
9382      var setter = 2;
9383      if (typeof type !== "string") {
9384        data = type;
9385        type = "fx";
9386        setter--;
9387      }
9388      if (arguments.length < setter) {
9389        return jQuery.queue(this[0], type);
9390      }
9391      return data === undefined ? this : this.each(function () {
9392        var queue = jQuery.queue(this, type, data);
9393
9394        // Ensure a hooks for this queue
9395        jQuery._queueHooks(this, type);
9396        if (type === "fx" && queue[0] !== "inprogress") {
9397          jQuery.dequeue(this, type);
9398        }
9399      });
9400    },
9401    dequeue: function (type) {
9402      return this.each(function () {
9403        jQuery.dequeue(this, type);
9404      });
9405    },
9406    clearQueue: function (type) {
9407      return this.queue(type || "fx", []);
9408    },
9409    // Get a promise resolved when queues of a certain type
9410    // are emptied (fx is the type by default)
9411    promise: function (type, obj) {
9412      var tmp,
9413        count = 1,
9414        defer = jQuery.Deferred(),
9415        elements = this,
9416        i = this.length,
9417        resolve = function () {
9418          if (! --count) {
9419            defer.resolveWith(elements, [elements]);
9420          }
9421        };
9422      if (typeof type !== "string") {
9423        obj = type;
9424        type = undefined;
9425      }
9426      type = type || "fx";
9427      while (i--) {
9428        tmp = dataPriv.get(elements[i], type + "queueHooks");
9429        if (tmp && tmp.empty) {
9430          count++;
9431          tmp.empty.add(resolve);
9432        }
9433      }
9434      resolve();
9435      return defer.promise(obj);
9436    }
9437  });
9438  var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
9439  var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
9440  var cssExpand = ["Top", "Right", "Bottom", "Left"];
9441  var documentElement = document.documentElement;
9442  var isAttached = function (elem) {
9443      return jQuery.contains(elem.ownerDocument, elem);
9444    },
9445    composed = {
9446      composed: true
9447    };
9448
9449  // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
9450  // Check attachment across shadow DOM boundaries when possible (gh-3504)
9451  // Support: iOS 10.0-10.2 only
9452  // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
9453  // leading to errors. We need to check for `getRootNode`.
9454  if (documentElement.getRootNode) {
9455    isAttached = function (elem) {
9456      return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument;
9457    };
9458  }
9459  var isHiddenWithinTree = function (elem, el) {
9460    // isHiddenWithinTree might be called from jQuery#filter function;
9461    // in that case, element will be second argument
9462    elem = el || elem;
9463
9464    // Inline style trumps all
9465    return elem.style.display === "none" || elem.style.display === "" &&
9466    // Otherwise, check computed style
9467    // Support: Firefox <=43 - 45
9468    // Disconnected elements can have computed display: none, so first confirm that elem is
9469    // in the document.
9470    isAttached(elem) && jQuery.css(elem, "display") === "none";
9471  };
9472  function adjustCSS(elem, prop, valueParts, tween) {
9473    var adjusted,
9474      scale,
9475      maxIterations = 20,
9476      currentValue = tween ? function () {
9477        return tween.cur();
9478      } : function () {
9479        return jQuery.css(elem, prop, "");
9480      },
9481      initial = currentValue(),
9482      unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),
9483      // Starting value computation is required for potential unit mismatches
9484      initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));
9485    if (initialInUnit && initialInUnit[3] !== unit) {
9486      // Support: Firefox <=54
9487      // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
9488      initial = initial / 2;
9489
9490      // Trust units reported by jQuery.css
9491      unit = unit || initialInUnit[3];
9492
9493      // Iteratively approximate from a nonzero starting point
9494      initialInUnit = +initial || 1;
9495      while (maxIterations--) {
9496        // Evaluate and update our best guess (doubling guesses that zero out).
9497        // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
9498        jQuery.style(elem, prop, initialInUnit + unit);
9499        if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {
9500          maxIterations = 0;
9501        }
9502        initialInUnit = initialInUnit / scale;
9503      }
9504      initialInUnit = initialInUnit * 2;
9505      jQuery.style(elem, prop, initialInUnit + unit);
9506
9507      // Make sure we update the tween properties later on
9508      valueParts = valueParts || [];
9509    }
9510    if (valueParts) {
9511      initialInUnit = +initialInUnit || +initial || 0;
9512
9513      // Apply relative offset (+=/-=) if specified
9514      adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
9515      if (tween) {
9516        tween.unit = unit;
9517        tween.start = initialInUnit;
9518        tween.end = adjusted;
9519      }
9520    }
9521    return adjusted;
9522  }
9523  var defaultDisplayMap = {};
9524  function getDefaultDisplay(elem) {
9525    var temp,
9526      doc = elem.ownerDocument,
9527      nodeName = elem.nodeName,
9528      display = defaultDisplayMap[nodeName];
9529    if (display) {
9530      return display;
9531    }
9532    temp = doc.body.appendChild(doc.createElement(nodeName));
9533    display = jQuery.css(temp, "display");
9534    temp.parentNode.removeChild(temp);
9535    if (display === "none") {
9536      display = "block";
9537    }
9538    defaultDisplayMap[nodeName] = display;
9539    return display;
9540  }
9541  function showHide(elements, show) {
9542    var display,
9543      elem,
9544      values = [],
9545      index = 0,
9546      length = elements.length;
9547
9548    // Determine new display value for elements that need to change
9549    for (; index < length; index++) {
9550      elem = elements[index];
9551      if (!elem.style) {
9552        continue;
9553      }
9554      display = elem.style.display;
9555      if (show) {
9556        // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
9557        // check is required in this first loop unless we have a nonempty display value (either
9558        // inline or about-to-be-restored)
9559        if (display === "none") {
9560          values[index] = dataPriv.get(elem, "display") || null;
9561          if (!values[index]) {
9562            elem.style.display = "";
9563          }
9564        }
9565        if (elem.style.display === "" && isHiddenWithinTree(elem)) {
9566          values[index] = getDefaultDisplay(elem);
9567        }
9568      } else {
9569        if (display !== "none") {
9570          values[index] = "none";
9571
9572          // Remember what we're overwriting
9573          dataPriv.set(elem, "display", display);
9574        }
9575      }
9576    }
9577
9578    // Set the display of the elements in a second loop to avoid constant reflow
9579    for (index = 0; index < length; index++) {
9580      if (values[index] != null) {
9581        elements[index].style.display = values[index];
9582      }
9583    }
9584    return elements;
9585  }
9586  jQuery.fn.extend({
9587    show: function () {
9588      return showHide(this, true);
9589    },
9590    hide: function () {
9591      return showHide(this);
9592    },
9593    toggle: function (state) {
9594      if (typeof state === "boolean") {
9595        return state ? this.show() : this.hide();
9596      }
9597      return this.each(function () {
9598        if (isHiddenWithinTree(this)) {
9599          jQuery(this).show();
9600        } else {
9601          jQuery(this).hide();
9602        }
9603      });
9604    }
9605  });
9606  var rcheckableType = /^(?:checkbox|radio)$/i;
9607  var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i;
9608  var rscriptType = /^$|^module$|\/(?:java|ecma)script/i;
9609  (function () {
9610    var fragment = document.createDocumentFragment(),
9611      div = fragment.appendChild(document.createElement("div")),
9612      input = document.createElement("input");
9613
9614    // Support: Android 4.0 - 4.3 only
9615    // Check state lost if the name is set (trac-11217)
9616    // Support: Windows Web Apps (WWA)
9617    // `name` and `type` must use .setAttribute for WWA (trac-14901)
9618    input.setAttribute("type", "radio");
9619    input.setAttribute("checked", "checked");
9620    input.setAttribute("name", "t");
9621    div.appendChild(input);
9622
9623    // Support: Android <=4.1 only
9624    // Older WebKit doesn't clone checked state correctly in fragments
9625    support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;
9626
9627    // Support: IE <=11 only
9628    // Make sure textarea (and checkbox) defaultValue is properly cloned
9629    div.innerHTML = "<textarea>x</textarea>";
9630    support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
9631
9632    // Support: IE <=9 only
9633    // IE <=9 replaces <option> tags with their contents when inserted outside of
9634    // the select element.
9635    div.innerHTML = "<option></option>";
9636    support.option = !!div.lastChild;
9637  })();
9638
9639  // We have to close these tags to support XHTML (trac-13200)
9640  var wrapMap = {
9641    // XHTML parsers do not magically insert elements in the
9642    // same way that tag soup parsers do. So we cannot shorten
9643    // this by omitting <tbody> or other required elements.
9644    thead: [1, "<table>", "</table>"],
9645    col: [2, "<table><colgroup>", "</colgroup></table>"],
9646    tr: [2, "<table><tbody>", "</tbody></table>"],
9647    td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
9648    _default: [0, "", ""]
9649  };
9650  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
9651  wrapMap.th = wrapMap.td;
9652
9653  // Support: IE <=9 only
9654  if (!support.option) {
9655    wrapMap.optgroup = wrapMap.option = [1, "<select multiple='multiple'>", "</select>"];
9656  }
9657  function getAll(context, tag) {
9658    // Support: IE <=9 - 11 only
9659    // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
9660    var ret;
9661    if (typeof context.getElementsByTagName !== "undefined") {
9662      ret = context.getElementsByTagName(tag || "*");
9663    } else if (typeof context.querySelectorAll !== "undefined") {
9664      ret = context.querySelectorAll(tag || "*");
9665    } else {
9666      ret = [];
9667    }
9668    if (tag === undefined || tag && nodeName(context, tag)) {
9669      return jQuery.merge([context], ret);
9670    }
9671    return ret;
9672  }
9673
9674  // Mark scripts as having already been evaluated
9675  function setGlobalEval(elems, refElements) {
9676    var i = 0,
9677      l = elems.length;
9678    for (; i < l; i++) {
9679      dataPriv.set(elems[i], "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval"));
9680    }
9681  }
9682  var rhtml = /<|&#?\w+;/;
9683  function buildFragment(elems, context, scripts, selection, ignored) {
9684    var elem,
9685      tmp,
9686      tag,
9687      wrap,
9688      attached,
9689      j,
9690      fragment = context.createDocumentFragment(),
9691      nodes = [],
9692      i = 0,
9693      l = elems.length;
9694    for (; i < l; i++) {
9695      elem = elems[i];
9696      if (elem || elem === 0) {
9697        // Add nodes directly
9698        if (toType(elem) === "object") {
9699          // Support: Android <=4.0 only, PhantomJS 1 only
9700          // push.apply(_, arraylike) throws on ancient WebKit
9701          jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
9702
9703          // Convert non-html into a text node
9704        } else if (!rhtml.test(elem)) {
9705          nodes.push(context.createTextNode(elem));
9706
9707          // Convert html into DOM nodes
9708        } else {
9709          tmp = tmp || fragment.appendChild(context.createElement("div"));
9710
9711          // Deserialize a standard representation
9712          tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
9713          wrap = wrapMap[tag] || wrapMap._default;
9714          tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];
9715
9716          // Descend through wrappers to the right content
9717          j = wrap[0];
9718          while (j--) {
9719            tmp = tmp.lastChild;
9720          }
9721
9722          // Support: Android <=4.0 only, PhantomJS 1 only
9723          // push.apply(_, arraylike) throws on ancient WebKit
9724          jQuery.merge(nodes, tmp.childNodes);
9725
9726          // Remember the top-level container
9727          tmp = fragment.firstChild;
9728
9729          // Ensure the created nodes are orphaned (trac-12392)
9730          tmp.textContent = "";
9731        }
9732      }
9733    }
9734
9735    // Remove wrapper from fragment
9736    fragment.textContent = "";
9737    i = 0;
9738    while (elem = nodes[i++]) {
9739      // Skip elements already in the context collection (trac-4087)
9740      if (selection && jQuery.inArray(elem, selection) > -1) {
9741        if (ignored) {
9742          ignored.push(elem);
9743        }
9744        continue;
9745      }
9746      attached = isAttached(elem);
9747
9748      // Append to fragment
9749      tmp = getAll(fragment.appendChild(elem), "script");
9750
9751      // Preserve script evaluation history
9752      if (attached) {
9753        setGlobalEval(tmp);
9754      }
9755
9756      // Capture executables
9757      if (scripts) {
9758        j = 0;
9759        while (elem = tmp[j++]) {
9760          if (rscriptType.test(elem.type || "")) {
9761            scripts.push(elem);
9762          }
9763        }
9764      }
9765    }
9766    return fragment;
9767  }
9768  var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
9769  function returnTrue() {
9770    return true;
9771  }
9772  function returnFalse() {
9773    return false;
9774  }
9775  function on(elem, types, selector, data, fn, one) {
9776    var origFn, type;
9777
9778    // Types can be a map of types/handlers
9779    if (typeof types === "object") {
9780      // ( types-Object, selector, data )
9781      if (typeof selector !== "string") {
9782        // ( types-Object, data )
9783        data = data || selector;
9784        selector = undefined;
9785      }
9786      for (type in types) {
9787        on(elem, type, selector, data, types[type], one);
9788      }
9789      return elem;
9790    }
9791    if (data == null && fn == null) {
9792      // ( types, fn )
9793      fn = selector;
9794      data = selector = undefined;
9795    } else if (fn == null) {
9796      if (typeof selector === "string") {
9797        // ( types, selector, fn )
9798        fn = data;
9799        data = undefined;
9800      } else {
9801        // ( types, data, fn )
9802        fn = data;
9803        data = selector;
9804        selector = undefined;
9805      }
9806    }
9807    if (fn === false) {
9808      fn = returnFalse;
9809    } else if (!fn) {
9810      return elem;
9811    }
9812    if (one === 1) {
9813      origFn = fn;
9814      fn = function (event) {
9815        // Can use an empty set, since event contains the info
9816        jQuery().off(event);
9817        return origFn.apply(this, arguments);
9818      };
9819
9820      // Use same guid so caller can remove using origFn
9821      fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
9822    }
9823    return elem.each(function () {
9824      jQuery.event.add(this, types, fn, data, selector);
9825    });
9826  }
9827
9828  /*
9829   * Helper functions for managing events -- not part of the public interface.
9830   * Props to Dean Edwards' addEvent library for many of the ideas.
9831   */
9832  jQuery.event = {
9833    global: {},
9834    add: function (elem, types, handler, data, selector) {
9835      var handleObjIn,
9836        eventHandle,
9837        tmp,
9838        events,
9839        t,
9840        handleObj,
9841        special,
9842        handlers,
9843        type,
9844        namespaces,
9845        origType,
9846        elemData = dataPriv.get(elem);
9847
9848      // Only attach events to objects that accept data
9849      if (!acceptData(elem)) {
9850        return;
9851      }
9852
9853      // Caller can pass in an object of custom data in lieu of the handler
9854      if (handler.handler) {
9855        handleObjIn = handler;
9856        handler = handleObjIn.handler;
9857        selector = handleObjIn.selector;
9858      }
9859
9860      // Ensure that invalid selectors throw exceptions at attach time
9861      // Evaluate against documentElement in case elem is a non-element node (e.g., document)
9862      if (selector) {
9863        jQuery.find.matchesSelector(documentElement, selector);
9864      }
9865
9866      // Make sure that the handler has a unique ID, used to find/remove it later
9867      if (!handler.guid) {
9868        handler.guid = jQuery.guid++;
9869      }
9870
9871      // Init the element's event structure and main handler, if this is the first
9872      if (!(events = elemData.events)) {
9873        events = elemData.events = Object.create(null);
9874      }
9875      if (!(eventHandle = elemData.handle)) {
9876        eventHandle = elemData.handle = function (e) {
9877          // Discard the second event of a jQuery.event.trigger() and
9878          // when an event is called after a page has unloaded
9879          return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined;
9880        };
9881      }
9882
9883      // Handle multiple events separated by a space
9884      types = (types || "").match(rnothtmlwhite) || [""];
9885      t = types.length;
9886      while (t--) {
9887        tmp = rtypenamespace.exec(types[t]) || [];
9888        type = origType = tmp[1];
9889        namespaces = (tmp[2] || "").split(".").sort();
9890
9891        // There *must* be a type, no attaching namespace-only handlers
9892        if (!type) {
9893          continue;
9894        }
9895
9896        // If event changes its type, use the special event handlers for the changed type
9897        special = jQuery.event.special[type] || {};
9898
9899        // If selector defined, determine special event api type, otherwise given type
9900        type = (selector ? special.delegateType : special.bindType) || type;
9901
9902        // Update special based on newly reset type
9903        special = jQuery.event.special[type] || {};
9904
9905        // handleObj is passed to all event handlers
9906        handleObj = jQuery.extend({
9907          type: type,
9908          origType: origType,
9909          data: data,
9910          handler: handler,
9911          guid: handler.guid,
9912          selector: selector,
9913          needsContext: selector && jQuery.expr.match.needsContext.test(selector),
9914          namespace: namespaces.join(".")
9915        }, handleObjIn);
9916
9917        // Init the event handler queue if we're the first
9918        if (!(handlers = events[type])) {
9919          handlers = events[type] = [];
9920          handlers.delegateCount = 0;
9921
9922          // Only use addEventListener if the special events handler returns false
9923          if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
9924            if (elem.addEventListener) {
9925              elem.addEventListener(type, eventHandle);
9926            }
9927          }
9928        }
9929        if (special.add) {
9930          special.add.call(elem, handleObj);
9931          if (!handleObj.handler.guid) {
9932            handleObj.handler.guid = handler.guid;
9933          }
9934        }
9935
9936        // Add to the element's handler list, delegates in front
9937        if (selector) {
9938          handlers.splice(handlers.delegateCount++, 0, handleObj);
9939        } else {
9940          handlers.push(handleObj);
9941        }
9942
9943        // Keep track of which events have ever been used, for event optimization
9944        jQuery.event.global[type] = true;
9945      }
9946    },
9947    // Detach an event or set of events from an element
9948    remove: function (elem, types, handler, selector, mappedTypes) {
9949      var j,
9950        origCount,
9951        tmp,
9952        events,
9953        t,
9954        handleObj,
9955        special,
9956        handlers,
9957        type,
9958        namespaces,
9959        origType,
9960        elemData = dataPriv.hasData(elem) && dataPriv.get(elem);
9961      if (!elemData || !(events = elemData.events)) {
9962        return;
9963      }
9964
9965      // Once for each type.namespace in types; type may be omitted
9966      types = (types || "").match(rnothtmlwhite) || [""];
9967      t = types.length;
9968      while (t--) {
9969        tmp = rtypenamespace.exec(types[t]) || [];
9970        type = origType = tmp[1];
9971        namespaces = (tmp[2] || "").split(".").sort();
9972
9973        // Unbind all events (on this namespace, if provided) for the element
9974        if (!type) {
9975          for (type in events) {
9976            jQuery.event.remove(elem, type + types[t], handler, selector, true);
9977          }
9978          continue;
9979        }
9980        special = jQuery.event.special[type] || {};
9981        type = (selector ? special.delegateType : special.bindType) || type;
9982        handlers = events[type] || [];
9983        tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
9984
9985        // Remove matching events
9986        origCount = j = handlers.length;
9987        while (j--) {
9988          handleObj = handlers[j];
9989          if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
9990            handlers.splice(j, 1);
9991            if (handleObj.selector) {
9992              handlers.delegateCount--;
9993            }
9994            if (special.remove) {
9995              special.remove.call(elem, handleObj);
9996            }
9997          }
9998        }
9999
10000        // Remove generic event handler if we removed something and no more handlers exist
10001        // (avoids potential for endless recursion during removal of special event handlers)
10002        if (origCount && !handlers.length) {
10003          if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
10004            jQuery.removeEvent(elem, type, elemData.handle);
10005          }
10006          delete events[type];
10007        }
10008      }
10009
10010      // Remove data and the expando if it's no longer used
10011      if (jQuery.isEmptyObject(events)) {
10012        dataPriv.remove(elem, "handle events");
10013      }
10014    },
10015    dispatch: function (nativeEvent) {
10016      var i,
10017        j,
10018        ret,
10019        matched,
10020        handleObj,
10021        handlerQueue,
10022        args = new Array(arguments.length),
10023        // Make a writable jQuery.Event from the native event object
10024        event = jQuery.event.fix(nativeEvent),
10025        handlers = (dataPriv.get(this, "events") || Object.create(null))[event.type] || [],
10026        special = jQuery.event.special[event.type] || {};
10027
10028      // Use the fix-ed jQuery.Event rather than the (read-only) native event
10029      args[0] = event;
10030      for (i = 1; i < arguments.length; i++) {
10031        args[i] = arguments[i];
10032      }
10033      event.delegateTarget = this;
10034
10035      // Call the preDispatch hook for the mapped type, and let it bail if desired
10036      if (special.preDispatch && special.preDispatch.call(this, event) === false) {
10037        return;
10038      }
10039
10040      // Determine handlers
10041      handlerQueue = jQuery.event.handlers.call(this, event, handlers);
10042
10043      // Run delegates first; they may want to stop propagation beneath us
10044      i = 0;
10045      while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
10046        event.currentTarget = matched.elem;
10047        j = 0;
10048        while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {
10049          // If the event is namespaced, then each handler is only invoked if it is
10050          // specially universal or its namespaces are a superset of the event's.
10051          if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) {
10052            event.handleObj = handleObj;
10053            event.data = handleObj.data;
10054            ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
10055            if (ret !== undefined) {
10056              if ((event.result = ret) === false) {
10057                event.preventDefault();
10058                event.stopPropagation();
10059              }
10060            }
10061          }
10062        }
10063      }
10064
10065      // Call the postDispatch hook for the mapped type
10066      if (special.postDispatch) {
10067        special.postDispatch.call(this, event);
10068      }
10069      return event.result;
10070    },
10071    handlers: function (event, handlers) {
10072      var i,
10073        handleObj,
10074        sel,
10075        matchedHandlers,
10076        matchedSelectors,
10077        handlerQueue = [],
10078        delegateCount = handlers.delegateCount,
10079        cur = event.target;
10080
10081      // Find delegate handlers
10082      if (delegateCount &&
10083      // Support: IE <=9
10084      // Black-hole SVG <use> instance trees (trac-13180)
10085      cur.nodeType &&
10086      // Support: Firefox <=42
10087      // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
10088      // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
10089      // Support: IE 11 only
10090      // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
10091      !(event.type === "click" && event.button >= 1)) {
10092        for (; cur !== this; cur = cur.parentNode || this) {
10093          // Don't check non-elements (trac-13208)
10094          // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
10095          if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) {
10096            matchedHandlers = [];
10097            matchedSelectors = {};
10098            for (i = 0; i < delegateCount; i++) {
10099              handleObj = handlers[i];
10100
10101              // Don't conflict with Object.prototype properties (trac-13203)
10102              sel = handleObj.selector + " ";
10103              if (matchedSelectors[sel] === undefined) {
10104                matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
10105              }
10106              if (matchedSelectors[sel]) {
10107                matchedHandlers.push(handleObj);
10108              }
10109            }
10110            if (matchedHandlers.length) {
10111              handlerQueue.push({
10112                elem: cur,
10113                handlers: matchedHandlers
10114              });
10115            }
10116          }
10117        }
10118      }
10119
10120      // Add the remaining (directly-bound) handlers
10121      cur = this;
10122      if (delegateCount < handlers.length) {
10123        handlerQueue.push({
10124          elem: cur,
10125          handlers: handlers.slice(delegateCount)
10126        });
10127      }
10128      return handlerQueue;
10129    },
10130    addProp: function (name, hook) {
10131      Object.defineProperty(jQuery.Event.prototype, name, {
10132        enumerable: true,
10133        configurable: true,
10134        get: isFunction(hook) ? function () {
10135          if (this.originalEvent) {
10136            return hook(this.originalEvent);
10137          }
10138        } : function () {
10139          if (this.originalEvent) {
10140            return this.originalEvent[name];
10141          }
10142        },
10143        set: function (value) {
10144          Object.defineProperty(this, name, {
10145            enumerable: true,
10146            configurable: true,
10147            writable: true,
10148            value: value
10149          });
10150        }
10151      });
10152    },
10153    fix: function (originalEvent) {
10154      return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent);
10155    },
10156    special: {
10157      load: {
10158        // Prevent triggered image.load events from bubbling to window.load
10159        noBubble: true
10160      },
10161      click: {
10162        // Utilize native event to ensure correct state for checkable inputs
10163        setup: function (data) {
10164          // For mutual compressibility with _default, replace `this` access with a local var.
10165          // `|| data` is dead code meant only to preserve the variable through minification.
10166          var el = this || data;
10167
10168          // Claim the first handler
10169          if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {
10170            // dataPriv.set( el, "click", ... )
10171            leverageNative(el, "click", true);
10172          }
10173
10174          // Return false to allow normal processing in the caller
10175          return false;
10176        },
10177        trigger: function (data) {
10178          // For mutual compressibility with _default, replace `this` access with a local var.
10179          // `|| data` is dead code meant only to preserve the variable through minification.
10180          var el = this || data;
10181
10182          // Force setup before triggering a click
10183          if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {
10184            leverageNative(el, "click");
10185          }
10186
10187          // Return non-false to allow normal event-path propagation
10188          return true;
10189        },
10190        // For cross-browser consistency, suppress native .click() on links
10191        // Also prevent it if we're currently inside a leveraged native-event stack
10192        _default: function (event) {
10193          var target = event.target;
10194          return rcheckableType.test(target.type) && target.click && nodeName(target, "input") && dataPriv.get(target, "click") || nodeName(target, "a");
10195        }
10196      },
10197      beforeunload: {
10198        postDispatch: function (event) {
10199          // Support: Firefox 20+
10200          // Firefox doesn't alert if the returnValue field is not set.
10201          if (event.result !== undefined && event.originalEvent) {
10202            event.originalEvent.returnValue = event.result;
10203          }
10204        }
10205      }
10206    }
10207  };
10208
10209  // Ensure the presence of an event listener that handles manually-triggered
10210  // synthetic events by interrupting progress until reinvoked in response to
10211  // *native* events that it fires directly, ensuring that state changes have
10212  // already occurred before other listeners are invoked.
10213  function leverageNative(el, type, isSetup) {
10214    // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
10215    if (!isSetup) {
10216      if (dataPriv.get(el, type) === undefined) {
10217        jQuery.event.add(el, type, returnTrue);
10218      }
10219      return;
10220    }
10221
10222    // Register the controller as a special universal handler for all event namespaces
10223    dataPriv.set(el, type, false);
10224    jQuery.event.add(el, type, {
10225      namespace: false,
10226      handler: function (event) {
10227        var result,
10228          saved = dataPriv.get(this, type);
10229        if (event.isTrigger & 1 && this[type]) {
10230          // Interrupt processing of the outer synthetic .trigger()ed event
10231          if (!saved) {
10232            // Store arguments for use when handling the inner native event
10233            // There will always be at least one argument (an event object), so this array
10234            // will not be confused with a leftover capture object.
10235            saved = slice.call(arguments);
10236            dataPriv.set(this, type, saved);
10237
10238            // Trigger the native event and capture its result
10239            this[type]();
10240            result = dataPriv.get(this, type);
10241            dataPriv.set(this, type, false);
10242            if (saved !== result) {
10243              // Cancel the outer synthetic event
10244              event.stopImmediatePropagation();
10245              event.preventDefault();
10246              return result;
10247            }
10248
10249            // If this is an inner synthetic event for an event with a bubbling surrogate
10250            // (focus or blur), assume that the surrogate already propagated from triggering
10251            // the native event and prevent that from happening again here.
10252            // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
10253            // bubbling surrogate propagates *after* the non-bubbling base), but that seems
10254            // less bad than duplication.
10255          } else if ((jQuery.event.special[type] || {}).delegateType) {
10256            event.stopPropagation();
10257          }
10258
10259          // If this is a native event triggered above, everything is now in order
10260          // Fire an inner synthetic event with the original arguments
10261        } else if (saved) {
10262          // ...and capture the result
10263          dataPriv.set(this, type, jQuery.event.trigger(saved[0], saved.slice(1), this));
10264
10265          // Abort handling of the native event by all jQuery handlers while allowing
10266          // native handlers on the same element to run. On target, this is achieved
10267          // by stopping immediate propagation just on the jQuery event. However,
10268          // the native event is re-wrapped by a jQuery one on each level of the
10269          // propagation so the only way to stop it for jQuery is to stop it for
10270          // everyone via native `stopPropagation()`. This is not a problem for
10271          // focus/blur which don't bubble, but it does also stop click on checkboxes
10272          // and radios. We accept this limitation.
10273          event.stopPropagation();
10274          event.isImmediatePropagationStopped = returnTrue;
10275        }
10276      }
10277    });
10278  }
10279  jQuery.removeEvent = function (elem, type, handle) {
10280    // This "if" is needed for plain objects
10281    if (elem.removeEventListener) {
10282      elem.removeEventListener(type, handle);
10283    }
10284  };
10285  jQuery.Event = function (src, props) {
10286    // Allow instantiation without the 'new' keyword
10287    if (!(this instanceof jQuery.Event)) {
10288      return new jQuery.Event(src, props);
10289    }
10290
10291    // Event object
10292    if (src && src.type) {
10293      this.originalEvent = src;
10294      this.type = src.type;
10295
10296      // Events bubbling up the document may have been marked as prevented
10297      // by a handler lower down the tree; reflect the correct value.
10298      this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined &&
10299      // Support: Android <=2.3 only
10300      src.returnValue === false ? returnTrue : returnFalse;
10301
10302      // Create target properties
10303      // Support: Safari <=6 - 7 only
10304      // Target should not be a text node (trac-504, trac-13143)
10305      this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target;
10306      this.currentTarget = src.currentTarget;
10307      this.relatedTarget = src.relatedTarget;
10308
10309      // Event type
10310    } else {
10311      this.type = src;
10312    }
10313
10314    // Put explicitly provided properties onto the event object
10315    if (props) {
10316      jQuery.extend(this, props);
10317    }
10318
10319    // Create a timestamp if incoming event doesn't have one
10320    this.timeStamp = src && src.timeStamp || Date.now();
10321
10322    // Mark it as fixed
10323    this[jQuery.expando] = true;
10324  };
10325
10326  // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
10327  // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
10328  jQuery.Event.prototype = {
10329    constructor: jQuery.Event,
10330    isDefaultPrevented: returnFalse,
10331    isPropagationStopped: returnFalse,
10332    isImmediatePropagationStopped: returnFalse,
10333    isSimulated: false,
10334    preventDefault: function () {
10335      var e = this.originalEvent;
10336      this.isDefaultPrevented = returnTrue;
10337      if (e && !this.isSimulated) {
10338        e.preventDefault();
10339      }
10340    },
10341    stopPropagation: function () {
10342      var e = this.originalEvent;
10343      this.isPropagationStopped = returnTrue;
10344      if (e && !this.isSimulated) {
10345        e.stopPropagation();
10346      }
10347    },
10348    stopImmediatePropagation: function () {
10349      var e = this.originalEvent;
10350      this.isImmediatePropagationStopped = returnTrue;
10351      if (e && !this.isSimulated) {
10352        e.stopImmediatePropagation();
10353      }
10354      this.stopPropagation();
10355    }
10356  };
10357
10358  // Includes all common event props including KeyEvent and MouseEvent specific props
10359  jQuery.each({
10360    altKey: true,
10361    bubbles: true,
10362    cancelable: true,
10363    changedTouches: true,
10364    ctrlKey: true,
10365    detail: true,
10366    eventPhase: true,
10367    metaKey: true,
10368    pageX: true,
10369    pageY: true,
10370    shiftKey: true,
10371    view: true,
10372    "char": true,
10373    code: true,
10374    charCode: true,
10375    key: true,
10376    keyCode: true,
10377    button: true,
10378    buttons: true,
10379    clientX: true,
10380    clientY: true,
10381    offsetX: true,
10382    offsetY: true,
10383    pointerId: true,
10384    pointerType: true,
10385    screenX: true,
10386    screenY: true,
10387    targetTouches: true,
10388    toElement: true,
10389    touches: true,
10390    which: true
10391  }, jQuery.event.addProp);
10392  jQuery.each({
10393    focus: "focusin",
10394    blur: "focusout"
10395  }, function (type, delegateType) {
10396    function focusMappedHandler(nativeEvent) {
10397      if (document.documentMode) {
10398        // Support: IE 11+
10399        // Attach a single focusin/focusout handler on the document while someone wants
10400        // focus/blur. This is because the former are synchronous in IE while the latter
10401        // are async. In other browsers, all those handlers are invoked synchronously.
10402
10403        // `handle` from private data would already wrap the event, but we need
10404        // to change the `type` here.
10405        var handle = dataPriv.get(this, "handle"),
10406          event = jQuery.event.fix(nativeEvent);
10407        event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
10408        event.isSimulated = true;
10409
10410        // First, handle focusin/focusout
10411        handle(nativeEvent);
10412
10413        // ...then, handle focus/blur
10414        //
10415        // focus/blur don't bubble while focusin/focusout do; simulate the former by only
10416        // invoking the handler at the lower level.
10417        if (event.target === event.currentTarget) {
10418          // The setup part calls `leverageNative`, which, in turn, calls
10419          // `jQuery.event.add`, so event handle will already have been set
10420          // by this point.
10421          handle(event);
10422        }
10423      } else {
10424        // For non-IE browsers, attach a single capturing handler on the document
10425        // while someone wants focusin/focusout.
10426        jQuery.event.simulate(delegateType, nativeEvent.target, jQuery.event.fix(nativeEvent));
10427      }
10428    }
10429    jQuery.event.special[type] = {
10430      // Utilize native event if possible so blur/focus sequence is correct
10431      setup: function () {
10432        var attaches;
10433
10434        // Claim the first handler
10435        // dataPriv.set( this, "focus", ... )
10436        // dataPriv.set( this, "blur", ... )
10437        leverageNative(this, type, true);
10438        if (document.documentMode) {
10439          // Support: IE 9 - 11+
10440          // We use the same native handler for focusin & focus (and focusout & blur)
10441          // so we need to coordinate setup & teardown parts between those events.
10442          // Use `delegateType` as the key as `type` is already used by `leverageNative`.
10443          attaches = dataPriv.get(this, delegateType);
10444          if (!attaches) {
10445            this.addEventListener(delegateType, focusMappedHandler);
10446          }
10447          dataPriv.set(this, delegateType, (attaches || 0) + 1);
10448        } else {
10449          // Return false to allow normal processing in the caller
10450          return false;
10451        }
10452      },
10453      trigger: function () {
10454        // Force setup before trigger
10455        leverageNative(this, type);
10456
10457        // Return non-false to allow normal event-path propagation
10458        return true;
10459      },
10460      teardown: function () {
10461        var attaches;
10462        if (document.documentMode) {
10463          attaches = dataPriv.get(this, delegateType) - 1;
10464          if (!attaches) {
10465            this.removeEventListener(delegateType, focusMappedHandler);
10466            dataPriv.remove(this, delegateType);
10467          } else {
10468            dataPriv.set(this, delegateType, attaches);
10469          }
10470        } else {
10471          // Return false to indicate standard teardown should be applied
10472          return false;
10473        }
10474      },
10475      // Suppress native focus or blur if we're currently inside
10476      // a leveraged native-event stack
10477      _default: function (event) {
10478        return dataPriv.get(event.target, type);
10479      },
10480      delegateType: delegateType
10481    };
10482
10483    // Support: Firefox <=44
10484    // Firefox doesn't have focus(in | out) events
10485    // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
10486    //
10487    // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
10488    // focus(in | out) events fire after focus & blur events,
10489    // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
10490    // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
10491    //
10492    // Support: IE 9 - 11+
10493    // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
10494    // attach a single handler for both events in IE.
10495    jQuery.event.special[delegateType] = {
10496      setup: function () {
10497        // Handle: regular nodes (via `this.ownerDocument`), window
10498        // (via `this.document`) & document (via `this`).
10499        var doc = this.ownerDocument || this.document || this,
10500          dataHolder = document.documentMode ? this : doc,
10501          attaches = dataPriv.get(dataHolder, delegateType);
10502
10503        // Support: IE 9 - 11+
10504        // We use the same native handler for focusin & focus (and focusout & blur)
10505        // so we need to coordinate setup & teardown parts between those events.
10506        // Use `delegateType` as the key as `type` is already used by `leverageNative`.
10507        if (!attaches) {
10508          if (document.documentMode) {
10509            this.addEventListener(delegateType, focusMappedHandler);
10510          } else {
10511            doc.addEventListener(type, focusMappedHandler, true);
10512          }
10513        }
10514        dataPriv.set(dataHolder, delegateType, (attaches || 0) + 1);
10515      },
10516      teardown: function () {
10517        var doc = this.ownerDocument || this.document || this,
10518          dataHolder = document.documentMode ? this : doc,
10519          attaches = dataPriv.get(dataHolder, delegateType) - 1;
10520        if (!attaches) {
10521          if (document.documentMode) {
10522            this.removeEventListener(delegateType, focusMappedHandler);
10523          } else {
10524            doc.removeEventListener(type, focusMappedHandler, true);
10525          }
10526          dataPriv.remove(dataHolder, delegateType);
10527        } else {
10528          dataPriv.set(dataHolder, delegateType, attaches);
10529        }
10530      }
10531    };
10532  });
10533
10534  // Create mouseenter/leave events using mouseover/out and event-time checks
10535  // so that event delegation works in jQuery.
10536  // Do the same for pointerenter/pointerleave and pointerover/pointerout
10537  //
10538  // Support: Safari 7 only
10539  // Safari sends mouseenter too often; see:
10540  // https://bugs.chromium.org/p/chromium/issues/detail?id=470258
10541  // for the description of the bug (it existed in older Chrome versions as well).
10542  jQuery.each({
10543    mouseenter: "mouseover",
10544    mouseleave: "mouseout",
10545    pointerenter: "pointerover",
10546    pointerleave: "pointerout"
10547  }, function (orig, fix) {
10548    jQuery.event.special[orig] = {
10549      delegateType: fix,
10550      bindType: fix,
10551      handle: function (event) {
10552        var ret,
10553          target = this,
10554          related = event.relatedTarget,
10555          handleObj = event.handleObj;
10556
10557        // For mouseenter/leave call the handler if related is outside the target.
10558        // NB: No relatedTarget if the mouse left/entered the browser window
10559        if (!related || related !== target && !jQuery.contains(target, related)) {
10560          event.type = handleObj.origType;
10561          ret = handleObj.handler.apply(this, arguments);
10562          event.type = fix;
10563        }
10564        return ret;
10565      }
10566    };
10567  });
10568  jQuery.fn.extend({
10569    on: function (types, selector, data, fn) {
10570      return on(this, types, selector, data, fn);
10571    },
10572    one: function (types, selector, data, fn) {
10573      return on(this, types, selector, data, fn, 1);
10574    },
10575    off: function (types, selector, fn) {
10576      var handleObj, type;
10577      if (types && types.preventDefault && types.handleObj) {
10578        // ( event )  dispatched jQuery.Event
10579        handleObj = types.handleObj;
10580        jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
10581        return this;
10582      }
10583      if (typeof types === "object") {
10584        // ( types-object [, selector] )
10585        for (type in types) {
10586          this.off(type, selector, types[type]);
10587        }
10588        return this;
10589      }
10590      if (selector === false || typeof selector === "function") {
10591        // ( types [, fn] )
10592        fn = selector;
10593        selector = undefined;
10594      }
10595      if (fn === false) {
10596        fn = returnFalse;
10597      }
10598      return this.each(function () {
10599        jQuery.event.remove(this, types, fn, selector);
10600      });
10601    }
10602  });
10603  var
10604    // Support: IE <=10 - 11, Edge 12 - 13 only
10605    // In IE/Edge using regex groups here causes severe slowdowns.
10606    // See https://connect.microsoft.com/IE/feedback/details/1736512/
10607    rnoInnerhtml = /<script|<style|<link/i,
10608    // checked="checked" or checked
10609    rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
10610    rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
10611
10612  // Prefer a tbody over its parent table for containing new rows
10613  function manipulationTarget(elem, content) {
10614    if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) {
10615      return jQuery(elem).children("tbody")[0] || elem;
10616    }
10617    return elem;
10618  }
10619
10620  // Replace/restore the type attribute of script elements for safe DOM manipulation
10621  function disableScript(elem) {
10622    elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
10623    return elem;
10624  }
10625  function restoreScript(elem) {
10626    if ((elem.type || "").slice(0, 5) === "true/") {
10627      elem.type = elem.type.slice(5);
10628    } else {
10629      elem.removeAttribute("type");
10630    }
10631    return elem;
10632  }
10633  function cloneCopyEvent(src, dest) {
10634    var i, l, type, pdataOld, udataOld, udataCur, events;
10635    if (dest.nodeType !== 1) {
10636      return;
10637    }
10638
10639    // 1. Copy private data: events, handlers, etc.
10640    if (dataPriv.hasData(src)) {
10641      pdataOld = dataPriv.get(src);
10642      events = pdataOld.events;
10643      if (events) {
10644        dataPriv.remove(dest, "handle events");
10645        for (type in events) {
10646          for (i = 0, l = events[type].length; i < l; i++) {
10647            jQuery.event.add(dest, type, events[type][i]);
10648          }
10649        }
10650      }
10651    }
10652
10653    // 2. Copy user data
10654    if (dataUser.hasData(src)) {
10655      udataOld = dataUser.access(src);
10656      udataCur = jQuery.extend({}, udataOld);
10657      dataUser.set(dest, udataCur);
10658    }
10659  }
10660
10661  // Fix IE bugs, see support tests
10662  function fixInput(src, dest) {
10663    var nodeName = dest.nodeName.toLowerCase();
10664
10665    // Fails to persist the checked state of a cloned checkbox or radio button.
10666    if (nodeName === "input" && rcheckableType.test(src.type)) {
10667      dest.checked = src.checked;
10668
10669      // Fails to return the selected option to the default selected state when cloning options
10670    } else if (nodeName === "input" || nodeName === "textarea") {
10671      dest.defaultValue = src.defaultValue;
10672    }
10673  }
10674  function domManip(collection, args, callback, ignored) {
10675    // Flatten any nested arrays
10676    args = flat(args);
10677    var fragment,
10678      first,
10679      scripts,
10680      hasScripts,
10681      node,
10682      doc,
10683      i = 0,
10684      l = collection.length,
10685      iNoClone = l - 1,
10686      value = args[0],
10687      valueIsFunction = isFunction(value);
10688
10689    // We can't cloneNode fragments that contain checked, in WebKit
10690    if (valueIsFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
10691      return collection.each(function (index) {
10692        var self = collection.eq(index);
10693        if (valueIsFunction) {
10694          args[0] = value.call(this, index, self.html());
10695        }
10696        domManip(self, args, callback, ignored);
10697      });
10698    }
10699    if (l) {
10700      fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
10701      first = fragment.firstChild;
10702      if (fragment.childNodes.length === 1) {
10703        fragment = first;
10704      }
10705
10706      // Require either new content or an interest in ignored elements to invoke the callback
10707      if (first || ignored) {
10708        scripts = jQuery.map(getAll(fragment, "script"), disableScript);
10709        hasScripts = scripts.length;
10710
10711        // Use the original fragment for the last item
10712        // instead of the first because it can end up
10713        // being emptied incorrectly in certain situations (trac-8070).
10714        for (; i < l; i++) {
10715          node = fragment;
10716          if (i !== iNoClone) {
10717            node = jQuery.clone(node, true, true);
10718
10719            // Keep references to cloned scripts for later restoration
10720            if (hasScripts) {
10721              // Support: Android <=4.0 only, PhantomJS 1 only
10722              // push.apply(_, arraylike) throws on ancient WebKit
10723              jQuery.merge(scripts, getAll(node, "script"));
10724            }
10725          }
10726          callback.call(collection[i], node, i);
10727        }
10728        if (hasScripts) {
10729          doc = scripts[scripts.length - 1].ownerDocument;
10730
10731          // Re-enable scripts
10732          jQuery.map(scripts, restoreScript);
10733
10734          // Evaluate executable scripts on first document insertion
10735          for (i = 0; i < hasScripts; i++) {
10736            node = scripts[i];
10737            if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc, node)) {
10738              if (node.src && (node.type || "").toLowerCase() !== "module") {
10739                // Optional AJAX dependency, but won't run scripts if not present
10740                if (jQuery._evalUrl && !node.noModule) {
10741                  jQuery._evalUrl(node.src, {
10742                    nonce: node.nonce || node.getAttribute("nonce")
10743                  }, doc);
10744                }
10745              } else {
10746                // Unwrap a CDATA section containing script contents. This shouldn't be
10747                // needed as in XML documents they're already not visible when
10748                // inspecting element contents and in HTML documents they have no
10749                // meaning but we're preserving that logic for backwards compatibility.
10750                // This will be removed completely in 4.0. See gh-4904.
10751                DOMEval(node.textContent.replace(rcleanScript, ""), node, doc);
10752              }
10753            }
10754          }
10755        }
10756      }
10757    }
10758    return collection;
10759  }
10760  function remove(elem, selector, keepData) {
10761    var node,
10762      nodes = selector ? jQuery.filter(selector, elem) : elem,
10763      i = 0;
10764    for (; (node = nodes[i]) != null; i++) {
10765      if (!keepData && node.nodeType === 1) {
10766        jQuery.cleanData(getAll(node));
10767      }
10768      if (node.parentNode) {
10769        if (keepData && isAttached(node)) {
10770          setGlobalEval(getAll(node, "script"));
10771        }
10772        node.parentNode.removeChild(node);
10773      }
10774    }
10775    return elem;
10776  }
10777  jQuery.extend({
10778    htmlPrefilter: function (html) {
10779      return html;
10780    },
10781    clone: function (elem, dataAndEvents, deepDataAndEvents) {
10782      var i,
10783        l,
10784        srcElements,
10785        destElements,
10786        clone = elem.cloneNode(true),
10787        inPage = isAttached(elem);
10788
10789      // Fix IE cloning issues
10790      if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
10791        // We eschew jQuery#find here for performance reasons:
10792        // https://jsperf.com/getall-vs-sizzle/2
10793        destElements = getAll(clone);
10794        srcElements = getAll(elem);
10795        for (i = 0, l = srcElements.length; i < l; i++) {
10796          fixInput(srcElements[i], destElements[i]);
10797        }
10798      }
10799
10800      // Copy the events from the original to the clone
10801      if (dataAndEvents) {
10802        if (deepDataAndEvents) {
10803          srcElements = srcElements || getAll(elem);
10804          destElements = destElements || getAll(clone);
10805          for (i = 0, l = srcElements.length; i < l; i++) {
10806            cloneCopyEvent(srcElements[i], destElements[i]);
10807          }
10808        } else {
10809          cloneCopyEvent(elem, clone);
10810        }
10811      }
10812
10813      // Preserve script evaluation history
10814      destElements = getAll(clone, "script");
10815      if (destElements.length > 0) {
10816        setGlobalEval(destElements, !inPage && getAll(elem, "script"));
10817      }
10818
10819      // Return the cloned set
10820      return clone;
10821    },
10822    cleanData: function (elems) {
10823      var data,
10824        elem,
10825        type,
10826        special = jQuery.event.special,
10827        i = 0;
10828      for (; (elem = elems[i]) !== undefined; i++) {
10829        if (acceptData(elem)) {
10830          if (data = elem[dataPriv.expando]) {
10831            if (data.events) {
10832              for (type in data.events) {
10833                if (special[type]) {
10834                  jQuery.event.remove(elem, type);
10835
10836                  // This is a shortcut to avoid jQuery.event.remove's overhead
10837                } else {
10838                  jQuery.removeEvent(elem, type, data.handle);
10839                }
10840              }
10841            }
10842
10843            // Support: Chrome <=35 - 45+
10844            // Assign undefined instead of using delete, see Data#remove
10845            elem[dataPriv.expando] = undefined;
10846          }
10847          if (elem[dataUser.expando]) {
10848            // Support: Chrome <=35 - 45+
10849            // Assign undefined instead of using delete, see Data#remove
10850            elem[dataUser.expando] = undefined;
10851          }
10852        }
10853      }
10854    }
10855  });
10856  jQuery.fn.extend({
10857    detach: function (selector) {
10858      return remove(this, selector, true);
10859    },
10860    remove: function (selector) {
10861      return remove(this, selector);
10862    },
10863    text: function (value) {
10864      return access(this, function (value) {
10865        return value === undefined ? jQuery.text(this) : this.empty().each(function () {
10866          if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
10867            this.textContent = value;
10868          }
10869        });
10870      }, null, value, arguments.length);
10871    },
10872    append: function () {
10873      return domManip(this, arguments, function (elem) {
10874        if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
10875          var target = manipulationTarget(this, elem);
10876          target.appendChild(elem);
10877        }
10878      });
10879    },
10880    prepend: function () {
10881      return domManip(this, arguments, function (elem) {
10882        if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
10883          var target = manipulationTarget(this, elem);
10884          target.insertBefore(elem, target.firstChild);
10885        }
10886      });
10887    },
10888    before: function () {
10889      return domManip(this, arguments, function (elem) {
10890        if (this.parentNode) {
10891          this.parentNode.insertBefore(elem, this);
10892        }
10893      });
10894    },
10895    after: function () {
10896      return domManip(this, arguments, function (elem) {
10897        if (this.parentNode) {
10898          this.parentNode.insertBefore(elem, this.nextSibling);
10899        }
10900      });
10901    },
10902    empty: function () {
10903      var elem,
10904        i = 0;
10905      for (; (elem = this[i]) != null; i++) {
10906        if (elem.nodeType === 1) {
10907          // Prevent memory leaks
10908          jQuery.cleanData(getAll(elem, false));
10909
10910          // Remove any remaining nodes
10911          elem.textContent = "";
10912        }
10913      }
10914      return this;
10915    },
10916    clone: function (dataAndEvents, deepDataAndEvents) {
10917      dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
10918      deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
10919      return this.map(function () {
10920        return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
10921      });
10922    },
10923    html: function (value) {
10924      return access(this, function (value) {
10925        var elem = this[0] || {},
10926          i = 0,
10927          l = this.length;
10928        if (value === undefined && elem.nodeType === 1) {
10929          return elem.innerHTML;
10930        }
10931
10932        // See if we can take a shortcut and just use innerHTML
10933        if (typeof value === "string" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
10934          value = jQuery.htmlPrefilter(value);
10935          try {
10936            for (; i < l; i++) {
10937              elem = this[i] || {};
10938
10939              // Remove element nodes and prevent memory leaks
10940              if (elem.nodeType === 1) {
10941                jQuery.cleanData(getAll(elem, false));
10942                elem.innerHTML = value;
10943              }
10944            }
10945            elem = 0;
10946
10947            // If using innerHTML throws an exception, use the fallback method
10948          } catch (e) {}
10949        }
10950        if (elem) {
10951          this.empty().append(value);
10952        }
10953      }, null, value, arguments.length);
10954    },
10955    replaceWith: function () {
10956      var ignored = [];
10957
10958      // Make the changes, replacing each non-ignored context element with the new content
10959      return domManip(this, arguments, function (elem) {
10960        var parent = this.parentNode;
10961        if (jQuery.inArray(this, ignored) < 0) {
10962          jQuery.cleanData(getAll(this));
10963          if (parent) {
10964            parent.replaceChild(elem, this);
10965          }
10966        }
10967
10968        // Force callback invocation
10969      }, ignored);
10970    }
10971  });
10972  jQuery.each({
10973    appendTo: "append",
10974    prependTo: "prepend",
10975    insertBefore: "before",
10976    insertAfter: "after",
10977    replaceAll: "replaceWith"
10978  }, function (name, original) {
10979    jQuery.fn[name] = function (selector) {
10980      var elems,
10981        ret = [],
10982        insert = jQuery(selector),
10983        last = insert.length - 1,
10984        i = 0;
10985      for (; i <= last; i++) {
10986        elems = i === last ? this : this.clone(true);
10987        jQuery(insert[i])[original](elems);
10988
10989        // Support: Android <=4.0 only, PhantomJS 1 only
10990        // .get() because push.apply(_, arraylike) throws on ancient WebKit
10991        push.apply(ret, elems.get());
10992      }
10993      return this.pushStack(ret);
10994    };
10995  });
10996  var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
10997  var rcustomProp = /^--/;
10998  var getStyles = function (elem) {
10999    // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
11000    // IE throws on elements created in popups
11001    // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
11002    var view = elem.ownerDocument.defaultView;
11003    if (!view || !view.opener) {
11004      view = window;
11005    }
11006    return view.getComputedStyle(elem);
11007  };
11008  var swap = function (elem, options, callback) {
11009    var ret,
11010      name,
11011      old = {};
11012
11013    // Remember the old values, and insert the new ones
11014    for (name in options) {
11015      old[name] = elem.style[name];
11016      elem.style[name] = options[name];
11017    }
11018    ret = callback.call(elem);
11019
11020    // Revert the old values
11021    for (name in options) {
11022      elem.style[name] = old[name];
11023    }
11024    return ret;
11025  };
11026  var rboxStyle = new RegExp(cssExpand.join("|"), "i");
11027  (function () {
11028    // Executing both pixelPosition & boxSizingReliable tests require only one layout
11029    // so they're executed at the same time to save the second computation.
11030    function computeStyleTests() {
11031      // This is a singleton, we need to execute it only once
11032      if (!div) {
11033        return;
11034      }
11035      container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0";
11036      div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%";
11037      documentElement.appendChild(container).appendChild(div);
11038      var divStyle = window.getComputedStyle(div);
11039      pixelPositionVal = divStyle.top !== "1%";
11040
11041      // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
11042      reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12;
11043
11044      // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
11045      // Some styles come back with percentage values, even though they shouldn't
11046      div.style.right = "60%";
11047      pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36;
11048
11049      // Support: IE 9 - 11 only
11050      // Detect misreporting of content dimensions for box-sizing:border-box elements
11051      boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36;
11052
11053      // Support: IE 9 only
11054      // Detect overflow:scroll screwiness (gh-3699)
11055      // Support: Chrome <=64
11056      // Don't get tricked when zoom affects offsetWidth (gh-4029)
11057      div.style.position = "absolute";
11058      scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12;
11059      documentElement.removeChild(container);
11060
11061      // Nullify the div so it wouldn't be stored in the memory and
11062      // it will also be a sign that checks already performed
11063      div = null;
11064    }
11065    function roundPixelMeasures(measure) {
11066      return Math.round(parseFloat(measure));
11067    }
11068    var pixelPositionVal,
11069      boxSizingReliableVal,
11070      scrollboxSizeVal,
11071      pixelBoxStylesVal,
11072      reliableTrDimensionsVal,
11073      reliableMarginLeftVal,
11074      container = document.createElement("div"),
11075      div = document.createElement("div");
11076
11077    // Finish early in limited (non-browser) environments
11078    if (!div.style) {
11079      return;
11080    }
11081
11082    // Support: IE <=9 - 11 only
11083    // Style of cloned element affects source element cloned (trac-8908)
11084    div.style.backgroundClip = "content-box";
11085    div.cloneNode(true).style.backgroundClip = "";
11086    support.clearCloneStyle = div.style.backgroundClip === "content-box";
11087    jQuery.extend(support, {
11088      boxSizingReliable: function () {
11089        computeStyleTests();
11090        return boxSizingReliableVal;
11091      },
11092      pixelBoxStyles: function () {
11093        computeStyleTests();
11094        return pixelBoxStylesVal;
11095      },
11096      pixelPosition: function () {
11097        computeStyleTests();
11098        return pixelPositionVal;
11099      },
11100      reliableMarginLeft: function () {
11101        computeStyleTests();
11102        return reliableMarginLeftVal;
11103      },
11104      scrollboxSize: function () {
11105        computeStyleTests();
11106        return scrollboxSizeVal;
11107      },
11108      // Support: IE 9 - 11+, Edge 15 - 18+
11109      // IE/Edge misreport `getComputedStyle` of table rows with width/height
11110      // set in CSS while `offset*` properties report correct values.
11111      // Behavior in IE 9 is more subtle than in newer versions & it passes
11112      // some versions of this test; make sure not to make it pass there!
11113      //
11114      // Support: Firefox 70+
11115      // Only Firefox includes border widths
11116      // in computed dimensions. (gh-4529)
11117      reliableTrDimensions: function () {
11118        var table, tr, trChild, trStyle;
11119        if (reliableTrDimensionsVal == null) {
11120          table = document.createElement("table");
11121          tr = document.createElement("tr");
11122          trChild = document.createElement("div");
11123          table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
11124          tr.style.cssText = "box-sizing:content-box;border:1px solid";
11125
11126          // Support: Chrome 86+
11127          // Height set through cssText does not get applied.
11128          // Computed height then comes back as 0.
11129          tr.style.height = "1px";
11130          trChild.style.height = "9px";
11131
11132          // Support: Android 8 Chrome 86+
11133          // In our bodyBackground.html iframe,
11134          // display for all div elements is set to "inline",
11135          // which causes a problem only in Android 8 Chrome 86.
11136          // Ensuring the div is `display: block`
11137          // gets around this issue.
11138          trChild.style.display = "block";
11139          documentElement.appendChild(table).appendChild(tr).appendChild(trChild);
11140          trStyle = window.getComputedStyle(tr);
11141          reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight;
11142          documentElement.removeChild(table);
11143        }
11144        return reliableTrDimensionsVal;
11145      }
11146    });
11147  })();
11148  function curCSS(elem, name, computed) {
11149    var width,
11150      minWidth,
11151      maxWidth,
11152      ret,
11153      isCustomProp = rcustomProp.test(name),
11154      // Support: Firefox 51+
11155      // Retrieving style before computed somehow
11156      // fixes an issue with getting wrong values
11157      // on detached elements
11158      style = elem.style;
11159    computed = computed || getStyles(elem);
11160
11161    // getPropertyValue is needed for:
11162    //   .css('filter') (IE 9 only, trac-12537)
11163    //   .css('--customProperty) (gh-3144)
11164    if (computed) {
11165      // Support: IE <=9 - 11+
11166      // IE only supports `"float"` in `getPropertyValue`; in computed styles
11167      // it's only available as `"cssFloat"`. We no longer modify properties
11168      // sent to `.css()` apart from camelCasing, so we need to check both.
11169      // Normally, this would create difference in behavior: if
11170      // `getPropertyValue` returns an empty string, the value returned
11171      // by `.css()` would be `undefined`. This is usually the case for
11172      // disconnected elements. However, in IE even disconnected elements
11173      // with no styles return `"none"` for `getPropertyValue( "float" )`
11174      ret = computed.getPropertyValue(name) || computed[name];
11175      if (isCustomProp && ret) {
11176        // Support: Firefox 105+, Chrome <=105+
11177        // Spec requires trimming whitespace for custom properties (gh-4926).
11178        // Firefox only trims leading whitespace. Chrome just collapses
11179        // both leading & trailing whitespace to a single space.
11180        //
11181        // Fall back to `undefined` if empty string returned.
11182        // This collapses a missing definition with property defined
11183        // and set to an empty string but there's no standard API
11184        // allowing us to differentiate them without a performance penalty
11185        // and returning `undefined` aligns with older jQuery.
11186        //
11187        // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
11188        // as whitespace while CSS does not, but this is not a problem
11189        // because CSS preprocessing replaces them with U+000A LINE FEED
11190        // (which *is* CSS whitespace)
11191        // https://www.w3.org/TR/css-syntax-3/#input-preprocessing
11192        ret = ret.replace(rtrimCSS, "$1") || undefined;
11193      }
11194      if (ret === "" && !isAttached(elem)) {
11195        ret = jQuery.style(elem, name);
11196      }
11197
11198      // A tribute to the "awesome hack by Dean Edwards"
11199      // Android Browser returns percentage for some values,
11200      // but width seems to be reliably pixels.
11201      // This is against the CSSOM draft spec:
11202      // https://drafts.csswg.org/cssom/#resolved-values
11203      if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {
11204        // Remember the original values
11205        width = style.width;
11206        minWidth = style.minWidth;
11207        maxWidth = style.maxWidth;
11208
11209        // Put in the new values to get a computed value out
11210        style.minWidth = style.maxWidth = style.width = ret;
11211        ret = computed.width;
11212
11213        // Revert the changed values
11214        style.width = width;
11215        style.minWidth = minWidth;
11216        style.maxWidth = maxWidth;
11217      }
11218    }
11219    return ret !== undefined ?
11220    // Support: IE <=9 - 11 only
11221    // IE returns zIndex value as an integer.
11222    ret + "" : ret;
11223  }
11224  function addGetHookIf(conditionFn, hookFn) {
11225    // Define the hook, we'll check on the first run if it's really needed.
11226    return {
11227      get: function () {
11228        if (conditionFn()) {
11229          // Hook not needed (or it's not possible to use it due
11230          // to missing dependency), remove it.
11231          delete this.get;
11232          return;
11233        }
11234
11235        // Hook needed; redefine it so that the support test is not executed again.
11236        return (this.get = hookFn).apply(this, arguments);
11237      }
11238    };
11239  }
11240  var cssPrefixes = ["Webkit", "Moz", "ms"],
11241    emptyStyle = document.createElement("div").style,
11242    vendorProps = {};
11243
11244  // Return a vendor-prefixed property or undefined
11245  function vendorPropName(name) {
11246    // Check for vendor prefixed names
11247    var capName = name[0].toUpperCase() + name.slice(1),
11248      i = cssPrefixes.length;
11249    while (i--) {
11250      name = cssPrefixes[i] + capName;
11251      if (name in emptyStyle) {
11252        return name;
11253      }
11254    }
11255  }
11256
11257  // Return a potentially-mapped jQuery.cssProps or vendor prefixed property
11258  function finalPropName(name) {
11259    var final = jQuery.cssProps[name] || vendorProps[name];
11260    if (final) {
11261      return final;
11262    }
11263    if (name in emptyStyle) {
11264      return name;
11265    }
11266    return vendorProps[name] = vendorPropName(name) || name;
11267  }
11268  var
11269    // Swappable if display is none or starts with table
11270    // except "table", "table-cell", or "table-caption"
11271    // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
11272    rdisplayswap = /^(none|table(?!-c[ea]).+)/,
11273    cssShow = {
11274      position: "absolute",
11275      visibility: "hidden",
11276      display: "block"
11277    },
11278    cssNormalTransform = {
11279      letterSpacing: "0",
11280      fontWeight: "400"
11281    };
11282  function setPositiveNumber(_elem, value, subtract) {
11283    // Any relative (+/-) values have already been
11284    // normalized at this point
11285    var matches = rcssNum.exec(value);
11286    return matches ?
11287    // Guard against undefined "subtract", e.g., when used as in cssHooks
11288    Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value;
11289  }
11290  function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {
11291    var i = dimension === "width" ? 1 : 0,
11292      extra = 0,
11293      delta = 0,
11294      marginDelta = 0;
11295
11296    // Adjustment may not be necessary
11297    if (box === (isBorderBox ? "border" : "content")) {
11298      return 0;
11299    }
11300    for (; i < 4; i += 2) {
11301      // Both box models exclude margin
11302      // Count margin delta separately to only add it after scroll gutter adjustment.
11303      // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
11304      if (box === "margin") {
11305        marginDelta += jQuery.css(elem, box + cssExpand[i], true, styles);
11306      }
11307
11308      // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
11309      if (!isBorderBox) {
11310        // Add padding
11311        delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
11312
11313        // For "border" or "margin", add border
11314        if (box !== "padding") {
11315          delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
11316
11317          // But still keep track of it otherwise
11318        } else {
11319          extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
11320        }
11321
11322        // If we get here with a border-box (content + padding + border), we're seeking "content" or
11323        // "padding" or "margin"
11324      } else {
11325        // For "content", subtract padding
11326        if (box === "content") {
11327          delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
11328        }
11329
11330        // For "content" or "padding", subtract border
11331        if (box !== "margin") {
11332          delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
11333        }
11334      }
11335    }
11336
11337    // Account for positive content-box scroll gutter when requested by providing computedVal
11338    if (!isBorderBox && computedVal >= 0) {
11339      // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
11340      // Assuming integer scroll gutter, subtract the rest and round down
11341      delta += Math.max(0, Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5
11342
11343      // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
11344      // Use an explicit zero to avoid NaN (gh-3964)
11345      )) || 0;
11346    }
11347    return delta + marginDelta;
11348  }
11349  function getWidthOrHeight(elem, dimension, extra) {
11350    // Start with computed style
11351    var styles = getStyles(elem),
11352      // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
11353      // Fake content-box until we know it's needed to know the true value.
11354      boxSizingNeeded = !support.boxSizingReliable() || extra,
11355      isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box",
11356      valueIsBorderBox = isBorderBox,
11357      val = curCSS(elem, dimension, styles),
11358      offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1);
11359
11360    // Support: Firefox <=54
11361    // Return a confounding non-pixel value or feign ignorance, as appropriate.
11362    if (rnumnonpx.test(val)) {
11363      if (!extra) {
11364        return val;
11365      }
11366      val = "auto";
11367    }
11368
11369    // Support: IE 9 - 11 only
11370    // Use offsetWidth/offsetHeight for when box sizing is unreliable.
11371    // In those cases, the computed value can be trusted to be border-box.
11372    if ((!support.boxSizingReliable() && isBorderBox ||
11373    // Support: IE 10 - 11+, Edge 15 - 18+
11374    // IE/Edge misreport `getComputedStyle` of table rows with width/height
11375    // set in CSS while `offset*` properties report correct values.
11376    // Interestingly, in some cases IE 9 doesn't suffer from this issue.
11377    !support.reliableTrDimensions() && nodeName(elem, "tr") ||
11378    // Fall back to offsetWidth/offsetHeight when value is "auto"
11379    // This happens for inline elements with no explicit setting (gh-3571)
11380    val === "auto" ||
11381    // Support: Android <=4.1 - 4.3 only
11382    // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
11383    !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") &&
11384    // Make sure the element is visible & connected
11385    elem.getClientRects().length) {
11386      isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";
11387
11388      // Where available, offsetWidth/offsetHeight approximate border box dimensions.
11389      // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
11390      // retrieved value as a content box dimension.
11391      valueIsBorderBox = offsetProp in elem;
11392      if (valueIsBorderBox) {
11393        val = elem[offsetProp];
11394      }
11395    }
11396
11397    // Normalize "" and auto
11398    val = parseFloat(val) || 0;
11399
11400    // Adjust for the element's box model
11401    return val + boxModelAdjustment(elem, dimension, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles,
11402    // Provide the current computed size to request scroll gutter calculation (gh-3589)
11403    val) + "px";
11404  }
11405  jQuery.extend({
11406    // Add in style property hooks for overriding the default
11407    // behavior of getting and setting a style property
11408    cssHooks: {
11409      opacity: {
11410        get: function (elem, computed) {
11411          if (computed) {
11412            // We should always get a number back from opacity
11413            var ret = curCSS(elem, "opacity");
11414            return ret === "" ? "1" : ret;
11415          }
11416        }
11417      }
11418    },
11419    // Don't automatically add "px" to these possibly-unitless properties
11420    cssNumber: {
11421      animationIterationCount: true,
11422      aspectRatio: true,
11423      borderImageSlice: true,
11424      columnCount: true,
11425      flexGrow: true,
11426      flexShrink: true,
11427      fontWeight: true,
11428      gridArea: true,
11429      gridColumn: true,
11430      gridColumnEnd: true,
11431      gridColumnStart: true,
11432      gridRow: true,
11433      gridRowEnd: true,
11434      gridRowStart: true,
11435      lineHeight: true,
11436      opacity: true,
11437      order: true,
11438      orphans: true,
11439      scale: true,
11440      widows: true,
11441      zIndex: true,
11442      zoom: true,
11443      // SVG-related
11444      fillOpacity: true,
11445      floodOpacity: true,
11446      stopOpacity: true,
11447      strokeMiterlimit: true,
11448      strokeOpacity: true
11449    },
11450    // Add in properties whose names you wish to fix before
11451    // setting or getting the value
11452    cssProps: {},
11453    // Get and set the style property on a DOM Node
11454    style: function (elem, name, value, extra) {
11455      // Don't set styles on text and comment nodes
11456      if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
11457        return;
11458      }
11459
11460      // Make sure that we're working with the right name
11461      var ret,
11462        type,
11463        hooks,
11464        origName = camelCase(name),
11465        isCustomProp = rcustomProp.test(name),
11466        style = elem.style;
11467
11468      // Make sure that we're working with the right name. We don't
11469      // want to query the value if it is a CSS custom property
11470      // since they are user-defined.
11471      if (!isCustomProp) {
11472        name = finalPropName(origName);
11473      }
11474
11475      // Gets hook for the prefixed version, then unprefixed version
11476      hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
11477
11478      // Check if we're setting a value
11479      if (value !== undefined) {
11480        type = typeof value;
11481
11482        // Convert "+=" or "-=" to relative numbers (trac-7345)
11483        if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
11484          value = adjustCSS(elem, name, ret);
11485
11486          // Fixes bug trac-9237
11487          type = "number";
11488        }
11489
11490        // Make sure that null and NaN values aren't set (trac-7116)
11491        if (value == null || value !== value) {
11492          return;
11493        }
11494
11495        // If a number was passed in, add the unit (except for certain CSS properties)
11496        // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
11497        // "px" to a few hardcoded values.
11498        if (type === "number" && !isCustomProp) {
11499          value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
11500        }
11501
11502        // background-* props affect original clone's values
11503        if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
11504          style[name] = "inherit";
11505        }
11506
11507        // If a hook was provided, use that value, otherwise just set the specified value
11508        if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {
11509          if (isCustomProp) {
11510            style.setProperty(name, value);
11511          } else {
11512            style[name] = value;
11513          }
11514        }
11515      } else {
11516        // If a hook was provided get the non-computed value from there
11517        if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {
11518          return ret;
11519        }
11520
11521        // Otherwise just get the value from the style object
11522        return style[name];
11523      }
11524    },
11525    css: function (elem, name, extra, styles) {
11526      var val,
11527        num,
11528        hooks,
11529        origName = camelCase(name),
11530        isCustomProp = rcustomProp.test(name);
11531
11532      // Make sure that we're working with the right name. We don't
11533      // want to modify the value if it is a CSS custom property
11534      // since they are user-defined.
11535      if (!isCustomProp) {
11536        name = finalPropName(origName);
11537      }
11538
11539      // Try prefixed name followed by the unprefixed name
11540      hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
11541
11542      // If a hook was provided get the computed value from there
11543      if (hooks && "get" in hooks) {
11544        val = hooks.get(elem, true, extra);
11545      }
11546
11547      // Otherwise, if a way to get the computed value exists, use that
11548      if (val === undefined) {
11549        val = curCSS(elem, name, styles);
11550      }
11551
11552      // Convert "normal" to computed value
11553      if (val === "normal" && name in cssNormalTransform) {
11554        val = cssNormalTransform[name];
11555      }
11556
11557      // Make numeric if forced or a qualifier was provided and val looks numeric
11558      if (extra === "" || extra) {
11559        num = parseFloat(val);
11560        return extra === true || isFinite(num) ? num || 0 : val;
11561      }
11562      return val;
11563    }
11564  });
11565  jQuery.each(["height", "width"], function (_i, dimension) {
11566    jQuery.cssHooks[dimension] = {
11567      get: function (elem, computed, extra) {
11568        if (computed) {
11569          // Certain elements can have dimension info if we invisibly show them
11570          // but it must have a current display style that would benefit
11571          return rdisplayswap.test(jQuery.css(elem, "display")) && (
11572          // Support: Safari 8+
11573          // Table columns in Safari have non-zero offsetWidth & zero
11574          // getBoundingClientRect().width unless display is changed.
11575          // Support: IE <=11 only
11576          // Running getBoundingClientRect on a disconnected node
11577          // in IE throws an error.
11578          !elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function () {
11579            return getWidthOrHeight(elem, dimension, extra);
11580          }) : getWidthOrHeight(elem, dimension, extra);
11581        }
11582      },
11583      set: function (elem, value, extra) {
11584        var matches,
11585          styles = getStyles(elem),
11586          // Only read styles.position if the test has a chance to fail
11587          // to avoid forcing a reflow.
11588          scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute",
11589          // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
11590          boxSizingNeeded = scrollboxSizeBuggy || extra,
11591          isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box",
11592          subtract = extra ? boxModelAdjustment(elem, dimension, extra, isBorderBox, styles) : 0;
11593
11594        // Account for unreliable border-box dimensions by comparing offset* to computed and
11595        // faking a content-box to get border and padding (gh-3699)
11596        if (isBorderBox && scrollboxSizeBuggy) {
11597          subtract -= Math.ceil(elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles) - 0.5);
11598        }
11599
11600        // Convert to pixels if value adjustment is needed
11601        if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") {
11602          elem.style[dimension] = value;
11603          value = jQuery.css(elem, dimension);
11604        }
11605        return setPositiveNumber(elem, value, subtract);
11606      }
11607    };
11608  });
11609  jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {
11610    if (computed) {
11611      return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, {
11612        marginLeft: 0
11613      }, function () {
11614        return elem.getBoundingClientRect().left;
11615      })) + "px";
11616    }
11617  });
11618
11619  // These hooks are used by animate to expand properties
11620  jQuery.each({
11621    margin: "",
11622    padding: "",
11623    border: "Width"
11624  }, function (prefix, suffix) {
11625    jQuery.cssHooks[prefix + suffix] = {
11626      expand: function (value) {
11627        var i = 0,
11628          expanded = {},
11629          // Assumes a single number if not a string
11630          parts = typeof value === "string" ? value.split(" ") : [value];
11631        for (; i < 4; i++) {
11632          expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
11633        }
11634        return expanded;
11635      }
11636    };
11637    if (prefix !== "margin") {
11638      jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
11639    }
11640  });
11641  jQuery.fn.extend({
11642    css: function (name, value) {
11643      return access(this, function (elem, name, value) {
11644        var styles,
11645          len,
11646          map = {},
11647          i = 0;
11648        if (Array.isArray(name)) {
11649          styles = getStyles(elem);
11650          len = name.length;
11651          for (; i < len; i++) {
11652            map[name[i]] = jQuery.css(elem, name[i], false, styles);
11653          }
11654          return map;
11655        }
11656        return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
11657      }, name, value, arguments.length > 1);
11658    }
11659  });
11660  function Tween(elem, options, prop, end, easing) {
11661    return new Tween.prototype.init(elem, options, prop, end, easing);
11662  }
11663  jQuery.Tween = Tween;
11664  Tween.prototype = {
11665    constructor: Tween,
11666    init: function (elem, options, prop, end, easing, unit) {
11667      this.elem = elem;
11668      this.prop = prop;
11669      this.easing = easing || jQuery.easing._default;
11670      this.options = options;
11671      this.start = this.now = this.cur();
11672      this.end = end;
11673      this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
11674    },
11675    cur: function () {
11676      var hooks = Tween.propHooks[this.prop];
11677      return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
11678    },
11679    run: function (percent) {
11680      var eased,
11681        hooks = Tween.propHooks[this.prop];
11682      if (this.options.duration) {
11683        this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
11684      } else {
11685        this.pos = eased = percent;
11686      }
11687      this.now = (this.end - this.start) * eased + this.start;
11688      if (this.options.step) {
11689        this.options.step.call(this.elem, this.now, this);
11690      }
11691      if (hooks && hooks.set) {
11692        hooks.set(this);
11693      } else {
11694        Tween.propHooks._default.set(this);
11695      }
11696      return this;
11697    }
11698  };
11699  Tween.prototype.init.prototype = Tween.prototype;
11700  Tween.propHooks = {
11701    _default: {
11702      get: function (tween) {
11703        var result;
11704
11705        // Use a property on the element directly when it is not a DOM element,
11706        // or when there is no matching style property that exists.
11707        if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
11708          return tween.elem[tween.prop];
11709        }
11710
11711        // Passing an empty string as a 3rd parameter to .css will automatically
11712        // attempt a parseFloat and fallback to a string if the parse fails.
11713        // Simple values such as "10px" are parsed to Float;
11714        // complex values such as "rotate(1rad)" are returned as-is.
11715        result = jQuery.css(tween.elem, tween.prop, "");
11716
11717        // Empty strings, null, undefined and "auto" are converted to 0.
11718        return !result || result === "auto" ? 0 : result;
11719      },
11720      set: function (tween) {
11721        // Use step hook for back compat.
11722        // Use cssHook if its there.
11723        // Use .style if available and use plain properties where available.
11724        if (jQuery.fx.step[tween.prop]) {
11725          jQuery.fx.step[tween.prop](tween);
11726        } else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) {
11727          jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
11728        } else {
11729          tween.elem[tween.prop] = tween.now;
11730        }
11731      }
11732    }
11733  };
11734
11735  // Support: IE <=9 only
11736  // Panic based approach to setting things on disconnected nodes
11737  Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
11738    set: function (tween) {
11739      if (tween.elem.nodeType && tween.elem.parentNode) {
11740        tween.elem[tween.prop] = tween.now;
11741      }
11742    }
11743  };
11744  jQuery.easing = {
11745    linear: function (p) {
11746      return p;
11747    },
11748    swing: function (p) {
11749      return 0.5 - Math.cos(p * Math.PI) / 2;
11750    },
11751    _default: "swing"
11752  };
11753  jQuery.fx = Tween.prototype.init;
11754
11755  // Back compat <1.8 extension point
11756  jQuery.fx.step = {};
11757  var fxNow,
11758    inProgress,
11759    rfxtypes = /^(?:toggle|show|hide)$/,
11760    rrun = /queueHooks$/;
11761  function schedule() {
11762    if (inProgress) {
11763      if (document.hidden === false && window.requestAnimationFrame) {
11764        window.requestAnimationFrame(schedule);
11765      } else {
11766        window.setTimeout(schedule, jQuery.fx.interval);
11767      }
11768      jQuery.fx.tick();
11769    }
11770  }
11771
11772  // Animations created synchronously will run synchronously
11773  function createFxNow() {
11774    window.setTimeout(function () {
11775      fxNow = undefined;
11776    });
11777    return fxNow = Date.now();
11778  }
11779
11780  // Generate parameters to create a standard animation
11781  function genFx(type, includeWidth) {
11782    var which,
11783      i = 0,
11784      attrs = {
11785        height: type
11786      };
11787
11788    // If we include width, step value is 1 to do all cssExpand values,
11789    // otherwise step value is 2 to skip over Left and Right
11790    includeWidth = includeWidth ? 1 : 0;
11791    for (; i < 4; i += 2 - includeWidth) {
11792      which = cssExpand[i];
11793      attrs["margin" + which] = attrs["padding" + which] = type;
11794    }
11795    if (includeWidth) {
11796      attrs.opacity = attrs.width = type;
11797    }
11798    return attrs;
11799  }
11800  function createTween(value, prop, animation) {
11801    var tween,
11802      collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
11803      index = 0,
11804      length = collection.length;
11805    for (; index < length; index++) {
11806      if (tween = collection[index].call(animation, prop, value)) {
11807        // We're done with this property
11808        return tween;
11809      }
11810    }
11811  }
11812  function defaultPrefilter(elem, props, opts) {
11813    var prop,
11814      value,
11815      toggle,
11816      hooks,
11817      oldfire,
11818      propTween,
11819      restoreDisplay,
11820      display,
11821      isBox = "width" in props || "height" in props,
11822      anim = this,
11823      orig = {},
11824      style = elem.style,
11825      hidden = elem.nodeType && isHiddenWithinTree(elem),
11826      dataShow = dataPriv.get(elem, "fxshow");
11827
11828    // Queue-skipping animations hijack the fx hooks
11829    if (!opts.queue) {
11830      hooks = jQuery._queueHooks(elem, "fx");
11831      if (hooks.unqueued == null) {
11832        hooks.unqueued = 0;
11833        oldfire = hooks.empty.fire;
11834        hooks.empty.fire = function () {
11835          if (!hooks.unqueued) {
11836            oldfire();
11837          }
11838        };
11839      }
11840      hooks.unqueued++;
11841      anim.always(function () {
11842        // Ensure the complete handler is called before this completes
11843        anim.always(function () {
11844          hooks.unqueued--;
11845          if (!jQuery.queue(elem, "fx").length) {
11846            hooks.empty.fire();
11847          }
11848        });
11849      });
11850    }
11851
11852    // Detect show/hide animations
11853    for (prop in props) {
11854      value = props[prop];
11855      if (rfxtypes.test(value)) {
11856        delete props[prop];
11857        toggle = toggle || value === "toggle";
11858        if (value === (hidden ? "hide" : "show")) {
11859          // Pretend to be hidden if this is a "show" and
11860          // there is still data from a stopped show/hide
11861          if (value === "show" && dataShow && dataShow[prop] !== undefined) {
11862            hidden = true;
11863
11864            // Ignore all other no-op show/hide data
11865          } else {
11866            continue;
11867          }
11868        }
11869        orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
11870      }
11871    }
11872
11873    // Bail out if this is a no-op like .hide().hide()
11874    propTween = !jQuery.isEmptyObject(props);
11875    if (!propTween && jQuery.isEmptyObject(orig)) {
11876      return;
11877    }
11878
11879    // Restrict "overflow" and "display" styles during box animations
11880    if (isBox && elem.nodeType === 1) {
11881      // Support: IE <=9 - 11, Edge 12 - 15
11882      // Record all 3 overflow attributes because IE does not infer the shorthand
11883      // from identically-valued overflowX and overflowY and Edge just mirrors
11884      // the overflowX value there.
11885      opts.overflow = [style.overflow, style.overflowX, style.overflowY];
11886
11887      // Identify a display type, preferring old show/hide data over the CSS cascade
11888      restoreDisplay = dataShow && dataShow.display;
11889      if (restoreDisplay == null) {
11890        restoreDisplay = dataPriv.get(elem, "display");
11891      }
11892      display = jQuery.css(elem, "display");
11893      if (display === "none") {
11894        if (restoreDisplay) {
11895          display = restoreDisplay;
11896        } else {
11897          // Get nonempty value(s) by temporarily forcing visibility
11898          showHide([elem], true);
11899          restoreDisplay = elem.style.display || restoreDisplay;
11900          display = jQuery.css(elem, "display");
11901          showHide([elem]);
11902        }
11903      }
11904
11905      // Animate inline elements as inline-block
11906      if (display === "inline" || display === "inline-block" && restoreDisplay != null) {
11907        if (jQuery.css(elem, "float") === "none") {
11908          // Restore the original display value at the end of pure show/hide animations
11909          if (!propTween) {
11910            anim.done(function () {
11911              style.display = restoreDisplay;
11912            });
11913            if (restoreDisplay == null) {
11914              display = style.display;
11915              restoreDisplay = display === "none" ? "" : display;
11916            }
11917          }
11918          style.display = "inline-block";
11919        }
11920      }
11921    }
11922    if (opts.overflow) {
11923      style.overflow = "hidden";
11924      anim.always(function () {
11925        style.overflow = opts.overflow[0];
11926        style.overflowX = opts.overflow[1];
11927        style.overflowY = opts.overflow[2];
11928      });
11929    }
11930
11931    // Implement show/hide animations
11932    propTween = false;
11933    for (prop in orig) {
11934      // General show/hide setup for this element animation
11935      if (!propTween) {
11936        if (dataShow) {
11937          if ("hidden" in dataShow) {
11938            hidden = dataShow.hidden;
11939          }
11940        } else {
11941          dataShow = dataPriv.access(elem, "fxshow", {
11942            display: restoreDisplay
11943          });
11944        }
11945
11946        // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
11947        if (toggle) {
11948          dataShow.hidden = !hidden;
11949        }
11950
11951        // Show elements before animating them
11952        if (hidden) {
11953          showHide([elem], true);
11954        }
11955
11956        /* eslint-disable no-loop-func */
11957
11958        anim.done(function () {
11959          /* eslint-enable no-loop-func */
11960
11961          // The final step of a "hide" animation is actually hiding the element
11962          if (!hidden) {
11963            showHide([elem]);
11964          }
11965          dataPriv.remove(elem, "fxshow");
11966          for (prop in orig) {
11967            jQuery.style(elem, prop, orig[prop]);
11968          }
11969        });
11970      }
11971
11972      // Per-property setup
11973      propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
11974      if (!(prop in dataShow)) {
11975        dataShow[prop] = propTween.start;
11976        if (hidden) {
11977          propTween.end = propTween.start;
11978          propTween.start = 0;
11979        }
11980      }
11981    }
11982  }
11983  function propFilter(props, specialEasing) {
11984    var index, name, easing, value, hooks;
11985
11986    // camelCase, specialEasing and expand cssHook pass
11987    for (index in props) {
11988      name = camelCase(index);
11989      easing = specialEasing[name];
11990      value = props[index];
11991      if (Array.isArray(value)) {
11992        easing = value[1];
11993        value = props[index] = value[0];
11994      }
11995      if (index !== name) {
11996        props[name] = value;
11997        delete props[index];
11998      }
11999      hooks = jQuery.cssHooks[name];
12000      if (hooks && "expand" in hooks) {
12001        value = hooks.expand(value);
12002        delete props[name];
12003
12004        // Not quite $.extend, this won't overwrite existing keys.
12005        // Reusing 'index' because we have the correct "name"
12006        for (index in value) {
12007          if (!(index in props)) {
12008            props[index] = value[index];
12009            specialEasing[index] = easing;
12010          }
12011        }
12012      } else {
12013        specialEasing[name] = easing;
12014      }
12015    }
12016  }
12017  function Animation(elem, properties, options) {
12018    var result,
12019      stopped,
12020      index = 0,
12021      length = Animation.prefilters.length,
12022      deferred = jQuery.Deferred().always(function () {
12023        // Don't match elem in the :animated selector
12024        delete tick.elem;
12025      }),
12026      tick = function () {
12027        if (stopped) {
12028          return false;
12029        }
12030        var currentTime = fxNow || createFxNow(),
12031          remaining = Math.max(0, animation.startTime + animation.duration - currentTime),
12032          // Support: Android 2.3 only
12033          // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
12034          temp = remaining / animation.duration || 0,
12035          percent = 1 - temp,
12036          index = 0,
12037          length = animation.tweens.length;
12038        for (; index < length; index++) {
12039          animation.tweens[index].run(percent);
12040        }
12041        deferred.notifyWith(elem, [animation, percent, remaining]);
12042
12043        // If there's more to do, yield
12044        if (percent < 1 && length) {
12045          return remaining;
12046        }
12047
12048        // If this was an empty animation, synthesize a final progress notification
12049        if (!length) {
12050          deferred.notifyWith(elem, [animation, 1, 0]);
12051        }
12052
12053        // Resolve the animation and report its conclusion
12054        deferred.resolveWith(elem, [animation]);
12055        return false;
12056      },
12057      animation = deferred.promise({
12058        elem: elem,
12059        props: jQuery.extend({}, properties),
12060        opts: jQuery.extend(true, {
12061          specialEasing: {},
12062          easing: jQuery.easing._default
12063        }, options),
12064        originalProperties: properties,
12065        originalOptions: options,
12066        startTime: fxNow || createFxNow(),
12067        duration: options.duration,
12068        tweens: [],
12069        createTween: function (prop, end) {
12070          var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
12071          animation.tweens.push(tween);
12072          return tween;
12073        },
12074        stop: function (gotoEnd) {
12075          var index = 0,
12076            // If we are going to the end, we want to run all the tweens
12077            // otherwise we skip this part
12078            length = gotoEnd ? animation.tweens.length : 0;
12079          if (stopped) {
12080            return this;
12081          }
12082          stopped = true;
12083          for (; index < length; index++) {
12084            animation.tweens[index].run(1);
12085          }
12086
12087          // Resolve when we played the last frame; otherwise, reject
12088          if (gotoEnd) {
12089            deferred.notifyWith(elem, [animation, 1, 0]);
12090            deferred.resolveWith(elem, [animation, gotoEnd]);
12091          } else {
12092            deferred.rejectWith(elem, [animation, gotoEnd]);
12093          }
12094          return this;
12095        }
12096      }),
12097      props = animation.props;
12098    propFilter(props, animation.opts.specialEasing);
12099    for (; index < length; index++) {
12100      result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
12101      if (result) {
12102        if (isFunction(result.stop)) {
12103          jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result);
12104        }
12105        return result;
12106      }
12107    }
12108    jQuery.map(props, createTween, animation);
12109    if (isFunction(animation.opts.start)) {
12110      animation.opts.start.call(elem, animation);
12111    }
12112
12113    // Attach callbacks from options
12114    animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
12115    jQuery.fx.timer(jQuery.extend(tick, {
12116      elem: elem,
12117      anim: animation,
12118      queue: animation.opts.queue
12119    }));
12120    return animation;
12121  }
12122  jQuery.Animation = jQuery.extend(Animation, {
12123    tweeners: {
12124      "*": [function (prop, value) {
12125        var tween = this.createTween(prop, value);
12126        adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
12127        return tween;
12128      }]
12129    },
12130    tweener: function (props, callback) {
12131      if (isFunction(props)) {
12132        callback = props;
12133        props = ["*"];
12134      } else {
12135        props = props.match(rnothtmlwhite);
12136      }
12137      var prop,
12138        index = 0,
12139        length = props.length;
12140      for (; index < length; index++) {
12141        prop = props[index];
12142        Animation.tweeners[prop] = Animation.tweeners[prop] || [];
12143        Animation.tweeners[prop].unshift(callback);
12144      }
12145    },
12146    prefilters: [defaultPrefilter],
12147    prefilter: function (callback, prepend) {
12148      if (prepend) {
12149        Animation.prefilters.unshift(callback);
12150      } else {
12151        Animation.prefilters.push(callback);
12152      }
12153    }
12154  });
12155  jQuery.speed = function (speed, easing, fn) {
12156    var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
12157      complete: fn || !fn && easing || isFunction(speed) && speed,
12158      duration: speed,
12159      easing: fn && easing || easing && !isFunction(easing) && easing
12160    };
12161
12162    // Go to the end state if fx are off
12163    if (jQuery.fx.off) {
12164      opt.duration = 0;
12165    } else {
12166      if (typeof opt.duration !== "number") {
12167        if (opt.duration in jQuery.fx.speeds) {
12168          opt.duration = jQuery.fx.speeds[opt.duration];
12169        } else {
12170          opt.duration = jQuery.fx.speeds._default;
12171        }
12172      }
12173    }
12174
12175    // Normalize opt.queue - true/undefined/null -> "fx"
12176    if (opt.queue == null || opt.queue === true) {
12177      opt.queue = "fx";
12178    }
12179
12180    // Queueing
12181    opt.old = opt.complete;
12182    opt.complete = function () {
12183      if (isFunction(opt.old)) {
12184        opt.old.call(this);
12185      }
12186      if (opt.queue) {
12187        jQuery.dequeue(this, opt.queue);
12188      }
12189    };
12190    return opt;
12191  };
12192  jQuery.fn.extend({
12193    fadeTo: function (speed, to, easing, callback) {
12194      // Show any hidden elements after setting opacity to 0
12195      return this.filter(isHiddenWithinTree).css("opacity", 0).show()
12196
12197      // Animate to the value specified
12198      .end().animate({
12199        opacity: to
12200      }, speed, easing, callback);
12201    },
12202    animate: function (prop, speed, easing, callback) {
12203      var empty = jQuery.isEmptyObject(prop),
12204        optall = jQuery.speed(speed, easing, callback),
12205        doAnimation = function () {
12206          // Operate on a copy of prop so per-property easing won't be lost
12207          var anim = Animation(this, jQuery.extend({}, prop), optall);
12208
12209          // Empty animations, or finishing resolves immediately
12210          if (empty || dataPriv.get(this, "finish")) {
12211            anim.stop(true);
12212          }
12213        };
12214      doAnimation.finish = doAnimation;
12215      return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
12216    },
12217    stop: function (type, clearQueue, gotoEnd) {
12218      var stopQueue = function (hooks) {
12219        var stop = hooks.stop;
12220        delete hooks.stop;
12221        stop(gotoEnd);
12222      };
12223      if (typeof type !== "string") {
12224        gotoEnd = clearQueue;
12225        clearQueue = type;
12226        type = undefined;
12227      }
12228      if (clearQueue) {
12229        this.queue(type || "fx", []);
12230      }
12231      return this.each(function () {
12232        var dequeue = true,
12233          index = type != null && type + "queueHooks",
12234          timers = jQuery.timers,
12235          data = dataPriv.get(this);
12236        if (index) {
12237          if (data[index] && data[index].stop) {
12238            stopQueue(data[index]);
12239          }
12240        } else {
12241          for (index in data) {
12242            if (data[index] && data[index].stop && rrun.test(index)) {
12243              stopQueue(data[index]);
12244            }
12245          }
12246        }
12247        for (index = timers.length; index--;) {
12248          if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
12249            timers[index].anim.stop(gotoEnd);
12250            dequeue = false;
12251            timers.splice(index, 1);
12252          }
12253        }
12254
12255        // Start the next in the queue if the last step wasn't forced.
12256        // Timers currently will call their complete callbacks, which
12257        // will dequeue but only if they were gotoEnd.
12258        if (dequeue || !gotoEnd) {
12259          jQuery.dequeue(this, type);
12260        }
12261      });
12262    },
12263    finish: function (type) {
12264      if (type !== false) {
12265        type = type || "fx";
12266      }
12267      return this.each(function () {
12268        var index,
12269          data = dataPriv.get(this),
12270          queue = data[type + "queue"],
12271          hooks = data[type + "queueHooks"],
12272          timers = jQuery.timers,
12273          length = queue ? queue.length : 0;
12274
12275        // Enable finishing flag on private data
12276        data.finish = true;
12277
12278        // Empty the queue first
12279        jQuery.queue(this, type, []);
12280        if (hooks && hooks.stop) {
12281          hooks.stop.call(this, true);
12282        }
12283
12284        // Look for any active animations, and finish them
12285        for (index = timers.length; index--;) {
12286          if (timers[index].elem === this && timers[index].queue === type) {
12287            timers[index].anim.stop(true);
12288            timers.splice(index, 1);
12289          }
12290        }
12291
12292        // Look for any animations in the old queue and finish them
12293        for (index = 0; index < length; index++) {
12294          if (queue[index] && queue[index].finish) {
12295            queue[index].finish.call(this);
12296          }
12297        }
12298
12299        // Turn off finishing flag
12300        delete data.finish;
12301      });
12302    }
12303  });
12304  jQuery.each(["toggle", "show", "hide"], function (_i, name) {
12305    var cssFn = jQuery.fn[name];
12306    jQuery.fn[name] = function (speed, easing, callback) {
12307      return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
12308    };
12309  });
12310
12311  // Generate shortcuts for custom animations
12312  jQuery.each({
12313    slideDown: genFx("show"),
12314    slideUp: genFx("hide"),
12315    slideToggle: genFx("toggle"),
12316    fadeIn: {
12317      opacity: "show"
12318    },
12319    fadeOut: {
12320      opacity: "hide"
12321    },
12322    fadeToggle: {
12323      opacity: "toggle"
12324    }
12325  }, function (name, props) {
12326    jQuery.fn[name] = function (speed, easing, callback) {
12327      return this.animate(props, speed, easing, callback);
12328    };
12329  });
12330  jQuery.timers = [];
12331  jQuery.fx.tick = function () {
12332    var timer,
12333      i = 0,
12334      timers = jQuery.timers;
12335    fxNow = Date.now();
12336    for (; i < timers.length; i++) {
12337      timer = timers[i];
12338
12339      // Run the timer and safely remove it when done (allowing for external removal)
12340      if (!timer() && timers[i] === timer) {
12341        timers.splice(i--, 1);
12342      }
12343    }
12344    if (!timers.length) {
12345      jQuery.fx.stop();
12346    }
12347    fxNow = undefined;
12348  };
12349  jQuery.fx.timer = function (timer) {
12350    jQuery.timers.push(timer);
12351    jQuery.fx.start();
12352  };
12353  jQuery.fx.interval = 13;
12354  jQuery.fx.start = function () {
12355    if (inProgress) {
12356      return;
12357    }
12358    inProgress = true;
12359    schedule();
12360  };
12361  jQuery.fx.stop = function () {
12362    inProgress = null;
12363  };
12364  jQuery.fx.speeds = {
12365    slow: 600,
12366    fast: 200,
12367    // Default speed
12368    _default: 400
12369  };
12370
12371  // Based off of the plugin by Clint Helfers, with permission.
12372  jQuery.fn.delay = function (time, type) {
12373    time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
12374    type = type || "fx";
12375    return this.queue(type, function (next, hooks) {
12376      var timeout = window.setTimeout(next, time);
12377      hooks.stop = function () {
12378        window.clearTimeout(timeout);
12379      };
12380    });
12381  };
12382  (function () {
12383    var input = document.createElement("input"),
12384      select = document.createElement("select"),
12385      opt = select.appendChild(document.createElement("option"));
12386    input.type = "checkbox";
12387
12388    // Support: Android <=4.3 only
12389    // Default value for a checkbox should be "on"
12390    support.checkOn = input.value !== "";
12391
12392    // Support: IE <=11 only
12393    // Must access selectedIndex to make default options select
12394    support.optSelected = opt.selected;
12395
12396    // Support: IE <=11 only
12397    // An input loses its value after becoming a radio
12398    input = document.createElement("input");
12399    input.value = "t";
12400    input.type = "radio";
12401    support.radioValue = input.value === "t";
12402  })();
12403  var boolHook,
12404    attrHandle = jQuery.expr.attrHandle;
12405  jQuery.fn.extend({
12406    attr: function (name, value) {
12407      return access(this, jQuery.attr, name, value, arguments.length > 1);
12408    },
12409    removeAttr: function (name) {
12410      return this.each(function () {
12411        jQuery.removeAttr(this, name);
12412      });
12413    }
12414  });
12415  jQuery.extend({
12416    attr: function (elem, name, value) {
12417      var ret,
12418        hooks,
12419        nType = elem.nodeType;
12420
12421      // Don't get/set attributes on text, comment and attribute nodes
12422      if (nType === 3 || nType === 8 || nType === 2) {
12423        return;
12424      }
12425
12426      // Fallback to prop when attributes are not supported
12427      if (typeof elem.getAttribute === "undefined") {
12428        return jQuery.prop(elem, name, value);
12429      }
12430
12431      // Attribute hooks are determined by the lowercase version
12432      // Grab necessary hook if one is defined
12433      if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
12434        hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined);
12435      }
12436      if (value !== undefined) {
12437        if (value === null) {
12438          jQuery.removeAttr(elem, name);
12439          return;
12440        }
12441        if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
12442          return ret;
12443        }
12444        elem.setAttribute(name, value + "");
12445        return value;
12446      }
12447      if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
12448        return ret;
12449      }
12450      ret = jQuery.find.attr(elem, name);
12451
12452      // Non-existent attributes return null, we normalize to undefined
12453      return ret == null ? undefined : ret;
12454    },
12455    attrHooks: {
12456      type: {
12457        set: function (elem, value) {
12458          if (!support.radioValue && value === "radio" && nodeName(elem, "input")) {
12459            var val = elem.value;
12460            elem.setAttribute("type", value);
12461            if (val) {
12462              elem.value = val;
12463            }
12464            return value;
12465          }
12466        }
12467      }
12468    },
12469    removeAttr: function (elem, value) {
12470      var name,
12471        i = 0,
12472        // Attribute names can contain non-HTML whitespace characters
12473        // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
12474        attrNames = value && value.match(rnothtmlwhite);
12475      if (attrNames && elem.nodeType === 1) {
12476        while (name = attrNames[i++]) {
12477          elem.removeAttribute(name);
12478        }
12479      }
12480    }
12481  });
12482
12483  // Hooks for boolean attributes
12484  boolHook = {
12485    set: function (elem, value, name) {
12486      if (value === false) {
12487        // Remove boolean attributes when set to false
12488        jQuery.removeAttr(elem, name);
12489      } else {
12490        elem.setAttribute(name, name);
12491      }
12492      return name;
12493    }
12494  };
12495  jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (_i, name) {
12496    var getter = attrHandle[name] || jQuery.find.attr;
12497    attrHandle[name] = function (elem, name, isXML) {
12498      var ret,
12499        handle,
12500        lowercaseName = name.toLowerCase();
12501      if (!isXML) {
12502        // Avoid an infinite loop by temporarily removing this function from the getter
12503        handle = attrHandle[lowercaseName];
12504        attrHandle[lowercaseName] = ret;
12505        ret = getter(elem, name, isXML) != null ? lowercaseName : null;
12506        attrHandle[lowercaseName] = handle;
12507      }
12508      return ret;
12509    };
12510  });
12511  var rfocusable = /^(?:input|select|textarea|button)$/i,
12512    rclickable = /^(?:a|area)$/i;
12513  jQuery.fn.extend({
12514    prop: function (name, value) {
12515      return access(this, jQuery.prop, name, value, arguments.length > 1);
12516    },
12517    removeProp: function (name) {
12518      return this.each(function () {
12519        delete this[jQuery.propFix[name] || name];
12520      });
12521    }
12522  });
12523  jQuery.extend({
12524    prop: function (elem, name, value) {
12525      var ret,
12526        hooks,
12527        nType = elem.nodeType;
12528
12529      // Don't get/set properties on text, comment and attribute nodes
12530      if (nType === 3 || nType === 8 || nType === 2) {
12531        return;
12532      }
12533      if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
12534        // Fix name and attach hooks
12535        name = jQuery.propFix[name] || name;
12536        hooks = jQuery.propHooks[name];
12537      }
12538      if (value !== undefined) {
12539        if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
12540          return ret;
12541        }
12542        return elem[name] = value;
12543      }
12544      if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
12545        return ret;
12546      }
12547      return elem[name];
12548    },
12549    propHooks: {
12550      tabIndex: {
12551        get: function (elem) {
12552          // Support: IE <=9 - 11 only
12553          // elem.tabIndex doesn't always return the
12554          // correct value when it hasn't been explicitly set
12555          // Use proper attribute retrieval (trac-12072)
12556          var tabindex = jQuery.find.attr(elem, "tabindex");
12557          if (tabindex) {
12558            return parseInt(tabindex, 10);
12559          }
12560          if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) {
12561            return 0;
12562          }
12563          return -1;
12564        }
12565      }
12566    },
12567    propFix: {
12568      "for": "htmlFor",
12569      "class": "className"
12570    }
12571  });
12572
12573  // Support: IE <=11 only
12574  // Accessing the selectedIndex property
12575  // forces the browser to respect setting selected
12576  // on the option
12577  // The getter ensures a default option is selected
12578  // when in an optgroup
12579  // eslint rule "no-unused-expressions" is disabled for this code
12580  // since it considers such accessions noop
12581  if (!support.optSelected) {
12582    jQuery.propHooks.selected = {
12583      get: function (elem) {
12584        /* eslint no-unused-expressions: "off" */
12585
12586        var parent = elem.parentNode;
12587        if (parent && parent.parentNode) {
12588          parent.parentNode.selectedIndex;
12589        }
12590        return null;
12591      },
12592      set: function (elem) {
12593        /* eslint no-unused-expressions: "off" */
12594
12595        var parent = elem.parentNode;
12596        if (parent) {
12597          parent.selectedIndex;
12598          if (parent.parentNode) {
12599            parent.parentNode.selectedIndex;
12600          }
12601        }
12602      }
12603    };
12604  }
12605  jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () {
12606    jQuery.propFix[this.toLowerCase()] = this;
12607  });
12608
12609  // Strip and collapse whitespace according to HTML spec
12610  // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
12611  function stripAndCollapse(value) {
12612    var tokens = value.match(rnothtmlwhite) || [];
12613    return tokens.join(" ");
12614  }
12615  function getClass(elem) {
12616    return elem.getAttribute && elem.getAttribute("class") || "";
12617  }
12618  function classesToArray(value) {
12619    if (Array.isArray(value)) {
12620      return value;
12621    }
12622    if (typeof value === "string") {
12623      return value.match(rnothtmlwhite) || [];
12624    }
12625    return [];
12626  }
12627  jQuery.fn.extend({
12628    addClass: function (value) {
12629      var classNames, cur, curValue, className, i, finalValue;
12630      if (isFunction(value)) {
12631        return this.each(function (j) {
12632          jQuery(this).addClass(value.call(this, j, getClass(this)));
12633        });
12634      }
12635      classNames = classesToArray(value);
12636      if (classNames.length) {
12637        return this.each(function () {
12638          curValue = getClass(this);
12639          cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
12640          if (cur) {
12641            for (i = 0; i < classNames.length; i++) {
12642              className = classNames[i];
12643              if (cur.indexOf(" " + className + " ") < 0) {
12644                cur += className + " ";
12645              }
12646            }
12647
12648            // Only assign if different to avoid unneeded rendering.
12649            finalValue = stripAndCollapse(cur);
12650            if (curValue !== finalValue) {
12651              this.setAttribute("class", finalValue);
12652            }
12653          }
12654        });
12655      }
12656      return this;
12657    },
12658    removeClass: function (value) {
12659      var classNames, cur, curValue, className, i, finalValue;
12660      if (isFunction(value)) {
12661        return this.each(function (j) {
12662          jQuery(this).removeClass(value.call(this, j, getClass(this)));
12663        });
12664      }
12665      if (!arguments.length) {
12666        return this.attr("class", "");
12667      }
12668      classNames = classesToArray(value);
12669      if (classNames.length) {
12670        return this.each(function () {
12671          curValue = getClass(this);
12672
12673          // This expression is here for better compressibility (see addClass)
12674          cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
12675          if (cur) {
12676            for (i = 0; i < classNames.length; i++) {
12677              className = classNames[i];
12678
12679              // Remove *all* instances
12680              while (cur.indexOf(" " + className + " ") > -1) {
12681                cur = cur.replace(" " + className + " ", " ");
12682              }
12683            }
12684
12685            // Only assign if different to avoid unneeded rendering.
12686            finalValue = stripAndCollapse(cur);
12687            if (curValue !== finalValue) {
12688              this.setAttribute("class", finalValue);
12689            }
12690          }
12691        });
12692      }
12693      return this;
12694    },
12695    toggleClass: function (value, stateVal) {
12696      var classNames,
12697        className,
12698        i,
12699        self,
12700        type = typeof value,
12701        isValidValue = type === "string" || Array.isArray(value);
12702      if (isFunction(value)) {
12703        return this.each(function (i) {
12704          jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);
12705        });
12706      }
12707      if (typeof stateVal === "boolean" && isValidValue) {
12708        return stateVal ? this.addClass(value) : this.removeClass(value);
12709      }
12710      classNames = classesToArray(value);
12711      return this.each(function () {
12712        if (isValidValue) {
12713          // Toggle individual class names
12714          self = jQuery(this);
12715          for (i = 0; i < classNames.length; i++) {
12716            className = classNames[i];
12717
12718            // Check each className given, space separated list
12719            if (self.hasClass(className)) {
12720              self.removeClass(className);
12721            } else {
12722              self.addClass(className);
12723            }
12724          }
12725
12726          // Toggle whole class name
12727        } else if (value === undefined || type === "boolean") {
12728          className = getClass(this);
12729          if (className) {
12730            // Store className if set
12731            dataPriv.set(this, "__className__", className);
12732          }
12733
12734          // If the element has a class name or if we're passed `false`,
12735          // then remove the whole classname (if there was one, the above saved it).
12736          // Otherwise bring back whatever was previously saved (if anything),
12737          // falling back to the empty string if nothing was stored.
12738          if (this.setAttribute) {
12739            this.setAttribute("class", className || value === false ? "" : dataPriv.get(this, "__className__") || "");
12740          }
12741        }
12742      });
12743    },
12744    hasClass: function (selector) {
12745      var className,
12746        elem,
12747        i = 0;
12748      className = " " + selector + " ";
12749      while (elem = this[i++]) {
12750        if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) {
12751          return true;
12752        }
12753      }
12754      return false;
12755    }
12756  });
12757  var rreturn = /\r/g;
12758  jQuery.fn.extend({
12759    val: function (value) {
12760      var hooks,
12761        ret,
12762        valueIsFunction,
12763        elem = this[0];
12764      if (!arguments.length) {
12765        if (elem) {
12766          hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
12767          if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
12768            return ret;
12769          }
12770          ret = elem.value;
12771
12772          // Handle most common string cases
12773          if (typeof ret === "string") {
12774            return ret.replace(rreturn, "");
12775          }
12776
12777          // Handle cases where value is null/undef or number
12778          return ret == null ? "" : ret;
12779        }
12780        return;
12781      }
12782      valueIsFunction = isFunction(value);
12783      return this.each(function (i) {
12784        var val;
12785        if (this.nodeType !== 1) {
12786          return;
12787        }
12788        if (valueIsFunction) {
12789          val = value.call(this, i, jQuery(this).val());
12790        } else {
12791          val = value;
12792        }
12793
12794        // Treat null/undefined as ""; convert numbers to string
12795        if (val == null) {
12796          val = "";
12797        } else if (typeof val === "number") {
12798          val += "";
12799        } else if (Array.isArray(val)) {
12800          val = jQuery.map(val, function (value) {
12801            return value == null ? "" : value + "";
12802          });
12803        }
12804        hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
12805
12806        // If set returns undefined, fall back to normal setting
12807        if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
12808          this.value = val;
12809        }
12810      });
12811    }
12812  });
12813  jQuery.extend({
12814    valHooks: {
12815      option: {
12816        get: function (elem) {
12817          var val = jQuery.find.attr(elem, "value");
12818          return val != null ? val :
12819          // Support: IE <=10 - 11 only
12820          // option.text throws exceptions (trac-14686, trac-14858)
12821          // Strip and collapse whitespace
12822          // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
12823          stripAndCollapse(jQuery.text(elem));
12824        }
12825      },
12826      select: {
12827        get: function (elem) {
12828          var value,
12829            option,
12830            i,
12831            options = elem.options,
12832            index = elem.selectedIndex,
12833            one = elem.type === "select-one",
12834            values = one ? null : [],
12835            max = one ? index + 1 : options.length;
12836          if (index < 0) {
12837            i = max;
12838          } else {
12839            i = one ? index : 0;
12840          }
12841
12842          // Loop through all the selected options
12843          for (; i < max; i++) {
12844            option = options[i];
12845
12846            // Support: IE <=9 only
12847            // IE8-9 doesn't update selected after form reset (trac-2551)
12848            if ((option.selected || i === index) &&
12849            // Don't return options that are disabled or in a disabled optgroup
12850            !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) {
12851              // Get the specific value for the option
12852              value = jQuery(option).val();
12853
12854              // We don't need an array for one selects
12855              if (one) {
12856                return value;
12857              }
12858
12859              // Multi-Selects return an array
12860              values.push(value);
12861            }
12862          }
12863          return values;
12864        },
12865        set: function (elem, value) {
12866          var optionSet,
12867            option,
12868            options = elem.options,
12869            values = jQuery.makeArray(value),
12870            i = options.length;
12871          while (i--) {
12872            option = options[i];
12873
12874            /* eslint-disable no-cond-assign */
12875
12876            if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
12877              optionSet = true;
12878            }
12879
12880            /* eslint-enable no-cond-assign */
12881          }
12882
12883          // Force browsers to behave consistently when non-matching value is set
12884          if (!optionSet) {
12885            elem.selectedIndex = -1;
12886          }
12887          return values;
12888        }
12889      }
12890    }
12891  });
12892
12893  // Radios and checkboxes getter/setter
12894  jQuery.each(["radio", "checkbox"], function () {
12895    jQuery.valHooks[this] = {
12896      set: function (elem, value) {
12897        if (Array.isArray(value)) {
12898          return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
12899        }
12900      }
12901    };
12902    if (!support.checkOn) {
12903      jQuery.valHooks[this].get = function (elem) {
12904        return elem.getAttribute("value") === null ? "on" : elem.value;
12905      };
12906    }
12907  });
12908
12909  // Return jQuery for attributes-only inclusion
12910  var location = window.location;
12911  var nonce = {
12912    guid: Date.now()
12913  };
12914  var rquery = /\?/;
12915
12916  // Cross-browser xml parsing
12917  jQuery.parseXML = function (data) {
12918    var xml, parserErrorElem;
12919    if (!data || typeof data !== "string") {
12920      return null;
12921    }
12922
12923    // Support: IE 9 - 11 only
12924    // IE throws on parseFromString with invalid input.
12925    try {
12926      xml = new window.DOMParser().parseFromString(data, "text/xml");
12927    } catch (e) {}
12928    parserErrorElem = xml && xml.getElementsByTagName("parsererror")[0];
12929    if (!xml || parserErrorElem) {
12930      jQuery.error("Invalid XML: " + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function (el) {
12931        return el.textContent;
12932      }).join("\n") : data));
12933    }
12934    return xml;
12935  };
12936  var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
12937    stopPropagationCallback = function (e) {
12938      e.stopPropagation();
12939    };
12940  jQuery.extend(jQuery.event, {
12941    trigger: function (event, data, elem, onlyHandlers) {
12942      var i,
12943        cur,
12944        tmp,
12945        bubbleType,
12946        ontype,
12947        handle,
12948        special,
12949        lastElement,
12950        eventPath = [elem || document],
12951        type = hasOwn.call(event, "type") ? event.type : event,
12952        namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
12953      cur = lastElement = tmp = elem = elem || document;
12954
12955      // Don't do events on text and comment nodes
12956      if (elem.nodeType === 3 || elem.nodeType === 8) {
12957        return;
12958      }
12959
12960      // focus/blur morphs to focusin/out; ensure we're not firing them right now
12961      if (rfocusMorph.test(type + jQuery.event.triggered)) {
12962        return;
12963      }
12964      if (type.indexOf(".") > -1) {
12965        // Namespaced trigger; create a regexp to match event type in handle()
12966        namespaces = type.split(".");
12967        type = namespaces.shift();
12968        namespaces.sort();
12969      }
12970      ontype = type.indexOf(":") < 0 && "on" + type;
12971
12972      // Caller can pass in a jQuery.Event object, Object, or just an event type string
12973      event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event);
12974
12975      // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
12976      event.isTrigger = onlyHandlers ? 2 : 3;
12977      event.namespace = namespaces.join(".");
12978      event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
12979
12980      // Clean up the event in case it is being reused
12981      event.result = undefined;
12982      if (!event.target) {
12983        event.target = elem;
12984      }
12985
12986      // Clone any incoming data and prepend the event, creating the handler arg list
12987      data = data == null ? [event] : jQuery.makeArray(data, [event]);
12988
12989      // Allow special events to draw outside the lines
12990      special = jQuery.event.special[type] || {};
12991      if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
12992        return;
12993      }
12994
12995      // Determine event propagation path in advance, per W3C events spec (trac-9951)
12996      // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
12997      if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {
12998        bubbleType = special.delegateType || type;
12999        if (!rfocusMorph.test(bubbleType + type)) {
13000          cur = cur.parentNode;
13001        }
13002        for (; cur; cur = cur.parentNode) {
13003          eventPath.push(cur);
13004          tmp = cur;
13005        }
13006
13007        // Only add window if we got to document (e.g., not plain obj or detached DOM)
13008        if (tmp === (elem.ownerDocument || document)) {
13009          eventPath.push(tmp.defaultView || tmp.parentWindow || window);
13010        }
13011      }
13012
13013      // Fire handlers on the event path
13014      i = 0;
13015      while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
13016        lastElement = cur;
13017        event.type = i > 1 ? bubbleType : special.bindType || type;
13018
13019        // jQuery handler
13020        handle = (dataPriv.get(cur, "events") || Object.create(null))[event.type] && dataPriv.get(cur, "handle");
13021        if (handle) {
13022          handle.apply(cur, data);
13023        }
13024
13025        // Native handler
13026        handle = ontype && cur[ontype];
13027        if (handle && handle.apply && acceptData(cur)) {
13028          event.result = handle.apply(cur, data);
13029          if (event.result === false) {
13030            event.preventDefault();
13031          }
13032        }
13033      }
13034      event.type = type;
13035
13036      // If nobody prevented the default action, do it now
13037      if (!onlyHandlers && !event.isDefaultPrevented()) {
13038        if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {
13039          // Call a native DOM method on the target with the same name as the event.
13040          // Don't do default actions on window, that's where global variables be (trac-6170)
13041          if (ontype && isFunction(elem[type]) && !isWindow(elem)) {
13042            // Don't re-trigger an onFOO event when we call its FOO() method
13043            tmp = elem[ontype];
13044            if (tmp) {
13045              elem[ontype] = null;
13046            }
13047
13048            // Prevent re-triggering of the same event, since we already bubbled it above
13049            jQuery.event.triggered = type;
13050            if (event.isPropagationStopped()) {
13051              lastElement.addEventListener(type, stopPropagationCallback);
13052            }
13053            elem[type]();
13054            if (event.isPropagationStopped()) {
13055              lastElement.removeEventListener(type, stopPropagationCallback);
13056            }
13057            jQuery.event.triggered = undefined;
13058            if (tmp) {
13059              elem[ontype] = tmp;
13060            }
13061          }
13062        }
13063      }
13064      return event.result;
13065    },
13066    // Piggyback on a donor event to simulate a different one
13067    // Used only for `focus(in | out)` events
13068    simulate: function (type, elem, event) {
13069      var e = jQuery.extend(new jQuery.Event(), event, {
13070        type: type,
13071        isSimulated: true
13072      });
13073      jQuery.event.trigger(e, null, elem);
13074    }
13075  });
13076  jQuery.fn.extend({
13077    trigger: function (type, data) {
13078      return this.each(function () {
13079        jQuery.event.trigger(type, data, this);
13080      });
13081    },
13082    triggerHandler: function (type, data) {
13083      var elem = this[0];
13084      if (elem) {
13085        return jQuery.event.trigger(type, data, elem, true);
13086      }
13087    }
13088  });
13089  var rbracket = /\[\]$/,
13090    rCRLF = /\r?\n/g,
13091    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
13092    rsubmittable = /^(?:input|select|textarea|keygen)/i;
13093  function buildParams(prefix, obj, traditional, add) {
13094    var name;
13095    if (Array.isArray(obj)) {
13096      // Serialize array item.
13097      jQuery.each(obj, function (i, v) {
13098        if (traditional || rbracket.test(prefix)) {
13099          // Treat each array item as a scalar.
13100          add(prefix, v);
13101        } else {
13102          // Item is non-scalar (array or object), encode its numeric index.
13103          buildParams(prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", v, traditional, add);
13104        }
13105      });
13106    } else if (!traditional && toType(obj) === "object") {
13107      // Serialize object item.
13108      for (name in obj) {
13109        buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
13110      }
13111    } else {
13112      // Serialize scalar item.
13113      add(prefix, obj);
13114    }
13115  }
13116
13117  // Serialize an array of form elements or a set of
13118  // key/values into a query string
13119  jQuery.param = function (a, traditional) {
13120    var prefix,
13121      s = [],
13122      add = function (key, valueOrFunction) {
13123        // If value is a function, invoke it and use its return value
13124        var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction;
13125        s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value);
13126      };
13127    if (a == null) {
13128      return "";
13129    }
13130
13131    // If an array was passed in, assume that it is an array of form elements.
13132    if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
13133      // Serialize the form elements
13134      jQuery.each(a, function () {
13135        add(this.name, this.value);
13136      });
13137    } else {
13138      // If traditional, encode the "old" way (the way 1.3.2 or older
13139      // did it), otherwise encode params recursively.
13140      for (prefix in a) {
13141        buildParams(prefix, a[prefix], traditional, add);
13142      }
13143    }
13144
13145    // Return the resulting serialization
13146    return s.join("&");
13147  };
13148  jQuery.fn.extend({
13149    serialize: function () {
13150      return jQuery.param(this.serializeArray());
13151    },
13152    serializeArray: function () {
13153      return this.map(function () {
13154        // Can add propHook for "elements" to filter or add form elements
13155        var elements = jQuery.prop(this, "elements");
13156        return elements ? jQuery.makeArray(elements) : this;
13157      }).filter(function () {
13158        var type = this.type;
13159
13160        // Use .is( ":disabled" ) so that fieldset[disabled] works
13161        return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
13162      }).map(function (_i, elem) {
13163        var val = jQuery(this).val();
13164        if (val == null) {
13165          return null;
13166        }
13167        if (Array.isArray(val)) {
13168          return jQuery.map(val, function (val) {
13169            return {
13170              name: elem.name,
13171              value: val.replace(rCRLF, "\r\n")
13172            };
13173          });
13174        }
13175        return {
13176          name: elem.name,
13177          value: val.replace(rCRLF, "\r\n")
13178        };
13179      }).get();
13180    }
13181  });
13182  var r20 = /%20/g,
13183    rhash = /#.*$/,
13184    rantiCache = /([?&])_=[^&]*/,
13185    rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
13186    // trac-7653, trac-8125, trac-8152: local protocol detection
13187    rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
13188    rnoContent = /^(?:GET|HEAD)$/,
13189    rprotocol = /^\/\//,
13190    /* Prefilters
13191     * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
13192     * 2) These are called:
13193     *    - BEFORE asking for a transport
13194     *    - AFTER param serialization (s.data is a string if s.processData is true)
13195     * 3) key is the dataType
13196     * 4) the catchall symbol "*" can be used
13197     * 5) execution will start with transport dataType and THEN continue down to "*" if needed
13198     */
13199    prefilters = {},
13200    /* Transports bindings
13201     * 1) key is the dataType
13202     * 2) the catchall symbol "*" can be used
13203     * 3) selection will start with transport dataType and THEN go to "*" if needed
13204     */
13205    transports = {},
13206    // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
13207    allTypes = "*/".concat("*"),
13208    // Anchor tag for parsing the document origin
13209    originAnchor = document.createElement("a");
13210  originAnchor.href = location.href;
13211
13212  // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
13213  function addToPrefiltersOrTransports(structure) {
13214    // dataTypeExpression is optional and defaults to "*"
13215    return function (dataTypeExpression, func) {
13216      if (typeof dataTypeExpression !== "string") {
13217        func = dataTypeExpression;
13218        dataTypeExpression = "*";
13219      }
13220      var dataType,
13221        i = 0,
13222        dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];
13223      if (isFunction(func)) {
13224        // For each dataType in the dataTypeExpression
13225        while (dataType = dataTypes[i++]) {
13226          // Prepend if requested
13227          if (dataType[0] === "+") {
13228            dataType = dataType.slice(1) || "*";
13229            (structure[dataType] = structure[dataType] || []).unshift(func);
13230
13231            // Otherwise append
13232          } else {
13233            (structure[dataType] = structure[dataType] || []).push(func);
13234          }
13235        }
13236      }
13237    };
13238  }
13239
13240  // Base inspection function for prefilters and transports
13241  function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
13242    var inspected = {},
13243      seekingTransport = structure === transports;
13244    function inspect(dataType) {
13245      var selected;
13246      inspected[dataType] = true;
13247      jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
13248        var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
13249        if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {
13250          options.dataTypes.unshift(dataTypeOrTransport);
13251          inspect(dataTypeOrTransport);
13252          return false;
13253        } else if (seekingTransport) {
13254          return !(selected = dataTypeOrTransport);
13255        }
13256      });
13257      return selected;
13258    }
13259    return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
13260  }
13261
13262  // A special extend for ajax options
13263  // that takes "flat" options (not to be deep extended)
13264  // Fixes trac-9887
13265  function ajaxExtend(target, src) {
13266    var key,
13267      deep,
13268      flatOptions = jQuery.ajaxSettings.flatOptions || {};
13269    for (key in src) {
13270      if (src[key] !== undefined) {
13271        (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
13272      }
13273    }
13274    if (deep) {
13275      jQuery.extend(true, target, deep);
13276    }
13277    return target;
13278  }
13279
13280  /* Handles responses to an ajax request:
13281   * - finds the right dataType (mediates between content-type and expected dataType)
13282   * - returns the corresponding response
13283   */
13284  function ajaxHandleResponses(s, jqXHR, responses) {
13285    var ct,
13286      type,
13287      finalDataType,
13288      firstDataType,
13289      contents = s.contents,
13290      dataTypes = s.dataTypes;
13291
13292    // Remove auto dataType and get content-type in the process
13293    while (dataTypes[0] === "*") {
13294      dataTypes.shift();
13295      if (ct === undefined) {
13296        ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
13297      }
13298    }
13299
13300    // Check if we're dealing with a known content-type
13301    if (ct) {
13302      for (type in contents) {
13303        if (contents[type] && contents[type].test(ct)) {
13304          dataTypes.unshift(type);
13305          break;
13306        }
13307      }
13308    }
13309
13310    // Check to see if we have a response for the expected dataType
13311    if (dataTypes[0] in responses) {
13312      finalDataType = dataTypes[0];
13313    } else {
13314      // Try convertible dataTypes
13315      for (type in responses) {
13316        if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
13317          finalDataType = type;
13318          break;
13319        }
13320        if (!firstDataType) {
13321          firstDataType = type;
13322        }
13323      }
13324
13325      // Or just use first one
13326      finalDataType = finalDataType || firstDataType;
13327    }
13328
13329    // If we found a dataType
13330    // We add the dataType to the list if needed
13331    // and return the corresponding response
13332    if (finalDataType) {
13333      if (finalDataType !== dataTypes[0]) {
13334        dataTypes.unshift(finalDataType);
13335      }
13336      return responses[finalDataType];
13337    }
13338  }
13339
13340  /* Chain conversions given the request and the original response
13341   * Also sets the responseXXX fields on the jqXHR instance
13342   */
13343  function ajaxConvert(s, response, jqXHR, isSuccess) {
13344    var conv2,
13345      current,
13346      conv,
13347      tmp,
13348      prev,
13349      converters = {},
13350      // Work with a copy of dataTypes in case we need to modify it for conversion
13351      dataTypes = s.dataTypes.slice();
13352
13353    // Create converters map with lowercased keys
13354    if (dataTypes[1]) {
13355      for (conv in s.converters) {
13356        converters[conv.toLowerCase()] = s.converters[conv];
13357      }
13358    }
13359    current = dataTypes.shift();
13360
13361    // Convert to each sequential dataType
13362    while (current) {
13363      if (s.responseFields[current]) {
13364        jqXHR[s.responseFields[current]] = response;
13365      }
13366
13367      // Apply the dataFilter if provided
13368      if (!prev && isSuccess && s.dataFilter) {
13369        response = s.dataFilter(response, s.dataType);
13370      }
13371      prev = current;
13372      current = dataTypes.shift();
13373      if (current) {
13374        // There's only work to do if current dataType is non-auto
13375        if (current === "*") {
13376          current = prev;
13377
13378          // Convert response if prev dataType is non-auto and differs from current
13379        } else if (prev !== "*" && prev !== current) {
13380          // Seek a direct converter
13381          conv = converters[prev + " " + current] || converters["* " + current];
13382
13383          // If none found, seek a pair
13384          if (!conv) {
13385            for (conv2 in converters) {
13386              // If conv2 outputs current
13387              tmp = conv2.split(" ");
13388              if (tmp[1] === current) {
13389                // If prev can be converted to accepted input
13390                conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
13391                if (conv) {
13392                  // Condense equivalence converters
13393                  if (conv === true) {
13394                    conv = converters[conv2];
13395
13396                    // Otherwise, insert the intermediate dataType
13397                  } else if (converters[conv2] !== true) {
13398                    current = tmp[0];
13399                    dataTypes.unshift(tmp[1]);
13400                  }
13401                  break;
13402                }
13403              }
13404            }
13405          }
13406
13407          // Apply converter (if not an equivalence)
13408          if (conv !== true) {
13409            // Unless errors are allowed to bubble, catch and return them
13410            if (conv && s.throws) {
13411              response = conv(response);
13412            } else {
13413              try {
13414                response = conv(response);
13415              } catch (e) {
13416                return {
13417                  state: "parsererror",
13418                  error: conv ? e : "No conversion from " + prev + " to " + current
13419                };
13420              }
13421            }
13422          }
13423        }
13424      }
13425    }
13426    return {
13427      state: "success",
13428      data: response
13429    };
13430  }
13431  jQuery.extend({
13432    // Counter for holding the number of active queries
13433    active: 0,
13434    // Last-Modified header cache for next request
13435    lastModified: {},
13436    etag: {},
13437    ajaxSettings: {
13438      url: location.href,
13439      type: "GET",
13440      isLocal: rlocalProtocol.test(location.protocol),
13441      global: true,
13442      processData: true,
13443      async: true,
13444      contentType: "application/x-www-form-urlencoded; charset=UTF-8",
13445      /*
13446      timeout: 0,
13447      data: null,
13448      dataType: null,
13449      username: null,
13450      password: null,
13451      cache: null,
13452      throws: false,
13453      traditional: false,
13454      headers: {},
13455      */
13456
13457      accepts: {
13458        "*": allTypes,
13459        text: "text/plain",
13460        html: "text/html",
13461        xml: "application/xml, text/xml",
13462        json: "application/json, text/javascript"
13463      },
13464      contents: {
13465        xml: /\bxml\b/,
13466        html: /\bhtml/,
13467        json: /\bjson\b/
13468      },
13469      responseFields: {
13470        xml: "responseXML",
13471        text: "responseText",
13472        json: "responseJSON"
13473      },
13474      // Data converters
13475      // Keys separate source (or catchall "*") and destination types with a single space
13476      converters: {
13477        // Convert anything to text
13478        "* text": String,
13479        // Text to html (true = no transformation)
13480        "text html": true,
13481        // Evaluate text as a json expression
13482        "text json": JSON.parse,
13483        // Parse text as xml
13484        "text xml": jQuery.parseXML
13485      },
13486      // For options that shouldn't be deep extended:
13487      // you can add your own custom options here if
13488      // and when you create one that shouldn't be
13489      // deep extended (see ajaxExtend)
13490      flatOptions: {
13491        url: true,
13492        context: true
13493      }
13494    },
13495    // Creates a full fledged settings object into target
13496    // with both ajaxSettings and settings fields.
13497    // If target is omitted, writes into ajaxSettings.
13498    ajaxSetup: function (target, settings) {
13499      return settings ?
13500      // Building a settings object
13501      ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :
13502      // Extending ajaxSettings
13503      ajaxExtend(jQuery.ajaxSettings, target);
13504    },
13505    ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
13506    ajaxTransport: addToPrefiltersOrTransports(transports),
13507    // Main method
13508    ajax: function (url, options) {
13509      // If url is an object, simulate pre-1.5 signature
13510      if (typeof url === "object") {
13511        options = url;
13512        url = undefined;
13513      }
13514
13515      // Force options to be an object
13516      options = options || {};
13517      var transport,
13518        // URL without anti-cache param
13519        cacheURL,
13520        // Response headers
13521        responseHeadersString,
13522        responseHeaders,
13523        // timeout handle
13524        timeoutTimer,
13525        // Url cleanup var
13526        urlAnchor,
13527        // Request state (becomes false upon send and true upon completion)
13528        completed,
13529        // To know if global events are to be dispatched
13530        fireGlobals,
13531        // Loop variable
13532        i,
13533        // uncached part of the url
13534        uncached,
13535        // Create the final options object
13536        s = jQuery.ajaxSetup({}, options),
13537        // Callbacks context
13538        callbackContext = s.context || s,
13539        // Context for global events is callbackContext if it is a DOM node or jQuery collection
13540        globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,
13541        // Deferreds
13542        deferred = jQuery.Deferred(),
13543        completeDeferred = jQuery.Callbacks("once memory"),
13544        // Status-dependent callbacks
13545        statusCode = s.statusCode || {},
13546        // Headers (they are sent all at once)
13547        requestHeaders = {},
13548        requestHeadersNames = {},
13549        // Default abort message
13550        strAbort = "canceled",
13551        // Fake xhr
13552        jqXHR = {
13553          readyState: 0,
13554          // Builds headers hashtable if needed
13555          getResponseHeader: function (key) {
13556            var match;
13557            if (completed) {
13558              if (!responseHeaders) {
13559                responseHeaders = {};
13560                while (match = rheaders.exec(responseHeadersString)) {
13561                  responseHeaders[match[1].toLowerCase() + " "] = (responseHeaders[match[1].toLowerCase() + " "] || []).concat(match[2]);
13562                }
13563              }
13564              match = responseHeaders[key.toLowerCase() + " "];
13565            }
13566            return match == null ? null : match.join(", ");
13567          },
13568          // Raw string
13569          getAllResponseHeaders: function () {
13570            return completed ? responseHeadersString : null;
13571          },
13572          // Caches the header
13573          setRequestHeader: function (name, value) {
13574            if (completed == null) {
13575              name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name;
13576              requestHeaders[name] = value;
13577            }
13578            return this;
13579          },
13580          // Overrides response content-type header
13581          overrideMimeType: function (type) {
13582            if (completed == null) {
13583              s.mimeType = type;
13584            }
13585            return this;
13586          },
13587          // Status-dependent callbacks
13588          statusCode: function (map) {
13589            var code;
13590            if (map) {
13591              if (completed) {
13592                // Execute the appropriate callbacks
13593                jqXHR.always(map[jqXHR.status]);
13594              } else {
13595                // Lazy-add the new callbacks in a way that preserves old ones
13596                for (code in map) {
13597                  statusCode[code] = [statusCode[code], map[code]];
13598                }
13599              }
13600            }
13601            return this;
13602          },
13603          // Cancel the request
13604          abort: function (statusText) {
13605            var finalText = statusText || strAbort;
13606            if (transport) {
13607              transport.abort(finalText);
13608            }
13609            done(0, finalText);
13610            return this;
13611          }
13612        };
13613
13614      // Attach deferreds
13615      deferred.promise(jqXHR);
13616
13617      // Add protocol if not provided (prefilters might expect it)
13618      // Handle falsy url in the settings object (trac-10093: consistency with old signature)
13619      // We also use the url parameter if available
13620      s.url = ((url || s.url || location.href) + "").replace(rprotocol, location.protocol + "//");
13621
13622      // Alias method option to type as per ticket trac-12004
13623      s.type = options.method || options.type || s.method || s.type;
13624
13625      // Extract dataTypes list
13626      s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""];
13627
13628      // A cross-domain request is in order when the origin doesn't match the current origin.
13629      if (s.crossDomain == null) {
13630        urlAnchor = document.createElement("a");
13631
13632        // Support: IE <=8 - 11, Edge 12 - 15
13633        // IE throws exception on accessing the href property if url is malformed,
13634        // e.g. http://example.com:80x/
13635        try {
13636          urlAnchor.href = s.url;
13637
13638          // Support: IE <=8 - 11 only
13639          // Anchor's host property isn't correctly set when s.url is relative
13640          urlAnchor.href = urlAnchor.href;
13641          s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host;
13642        } catch (e) {
13643          // If there is an error parsing the URL, assume it is crossDomain,
13644          // it can be rejected by the transport if it is invalid
13645          s.crossDomain = true;
13646        }
13647      }
13648
13649      // Convert data if not already a string
13650      if (s.data && s.processData && typeof s.data !== "string") {
13651        s.data = jQuery.param(s.data, s.traditional);
13652      }
13653
13654      // Apply prefilters
13655      inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
13656
13657      // If request was aborted inside a prefilter, stop there
13658      if (completed) {
13659        return jqXHR;
13660      }
13661
13662      // We can fire global events as of now if asked to
13663      // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
13664      fireGlobals = jQuery.event && s.global;
13665
13666      // Watch for a new set of requests
13667      if (fireGlobals && jQuery.active++ === 0) {
13668        jQuery.event.trigger("ajaxStart");
13669      }
13670
13671      // Uppercase the type
13672      s.type = s.type.toUpperCase();
13673
13674      // Determine if request has content
13675      s.hasContent = !rnoContent.test(s.type);
13676
13677      // Save the URL in case we're toying with the If-Modified-Since
13678      // and/or If-None-Match header later on
13679      // Remove hash to simplify url manipulation
13680      cacheURL = s.url.replace(rhash, "");
13681
13682      // More options handling for requests with no content
13683      if (!s.hasContent) {
13684        // Remember the hash so we can put it back
13685        uncached = s.url.slice(cacheURL.length);
13686
13687        // If data is available and should be processed, append data to url
13688        if (s.data && (s.processData || typeof s.data === "string")) {
13689          cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data;
13690
13691          // trac-9682: remove data so that it's not used in an eventual retry
13692          delete s.data;
13693        }
13694
13695        // Add or update anti-cache param if needed
13696        if (s.cache === false) {
13697          cacheURL = cacheURL.replace(rantiCache, "$1");
13698          uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce.guid++ + uncached;
13699        }
13700
13701        // Put hash and anti-cache on the URL that will be requested (gh-1732)
13702        s.url = cacheURL + uncached;
13703
13704        // Change '%20' to '+' if this is encoded form body content (gh-2658)
13705      } else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) {
13706        s.data = s.data.replace(r20, "+");
13707      }
13708
13709      // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
13710      if (s.ifModified) {
13711        if (jQuery.lastModified[cacheURL]) {
13712          jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
13713        }
13714        if (jQuery.etag[cacheURL]) {
13715          jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
13716        }
13717      }
13718
13719      // Set the correct header, if data is being sent
13720      if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
13721        jqXHR.setRequestHeader("Content-Type", s.contentType);
13722      }
13723
13724      // Set the Accepts header for the server, depending on the dataType
13725      jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]);
13726
13727      // Check for headers option
13728      for (i in s.headers) {
13729        jqXHR.setRequestHeader(i, s.headers[i]);
13730      }
13731
13732      // Allow custom headers/mimetypes and early abort
13733      if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) {
13734        // Abort if not done already and return
13735        return jqXHR.abort();
13736      }
13737
13738      // Aborting is no longer a cancellation
13739      strAbort = "abort";
13740
13741      // Install callbacks on deferreds
13742      completeDeferred.add(s.complete);
13743      jqXHR.done(s.success);
13744      jqXHR.fail(s.error);
13745
13746      // Get transport
13747      transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);
13748
13749      // If no transport, we auto-abort
13750      if (!transport) {
13751        done(-1, "No Transport");
13752      } else {
13753        jqXHR.readyState = 1;
13754
13755        // Send global event
13756        if (fireGlobals) {
13757          globalEventContext.trigger("ajaxSend", [jqXHR, s]);
13758        }
13759
13760        // If request was aborted inside ajaxSend, stop there
13761        if (completed) {
13762          return jqXHR;
13763        }
13764
13765        // Timeout
13766        if (s.async && s.timeout > 0) {
13767          timeoutTimer = window.setTimeout(function () {
13768            jqXHR.abort("timeout");
13769          }, s.timeout);
13770        }
13771        try {
13772          completed = false;
13773          transport.send(requestHeaders, done);
13774        } catch (e) {
13775          // Rethrow post-completion exceptions
13776          if (completed) {
13777            throw e;
13778          }
13779
13780          // Propagate others as results
13781          done(-1, e);
13782        }
13783      }
13784
13785      // Callback for when everything is done
13786      function done(status, nativeStatusText, responses, headers) {
13787        var isSuccess,
13788          success,
13789          error,
13790          response,
13791          modified,
13792          statusText = nativeStatusText;
13793
13794        // Ignore repeat invocations
13795        if (completed) {
13796          return;
13797        }
13798        completed = true;
13799
13800        // Clear timeout if it exists
13801        if (timeoutTimer) {
13802          window.clearTimeout(timeoutTimer);
13803        }
13804
13805        // Dereference transport for early garbage collection
13806        // (no matter how long the jqXHR object will be used)
13807        transport = undefined;
13808
13809        // Cache response headers
13810        responseHeadersString = headers || "";
13811
13812        // Set readyState
13813        jqXHR.readyState = status > 0 ? 4 : 0;
13814
13815        // Determine if successful
13816        isSuccess = status >= 200 && status < 300 || status === 304;
13817
13818        // Get response data
13819        if (responses) {
13820          response = ajaxHandleResponses(s, jqXHR, responses);
13821        }
13822
13823        // Use a noop converter for missing script but not if jsonp
13824        if (!isSuccess && jQuery.inArray("script", s.dataTypes) > -1 && jQuery.inArray("json", s.dataTypes) < 0) {
13825          s.converters["text script"] = function () {};
13826        }
13827
13828        // Convert no matter what (that way responseXXX fields are always set)
13829        response = ajaxConvert(s, response, jqXHR, isSuccess);
13830
13831        // If successful, handle type chaining
13832        if (isSuccess) {
13833          // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
13834          if (s.ifModified) {
13835            modified = jqXHR.getResponseHeader("Last-Modified");
13836            if (modified) {
13837              jQuery.lastModified[cacheURL] = modified;
13838            }
13839            modified = jqXHR.getResponseHeader("etag");
13840            if (modified) {
13841              jQuery.etag[cacheURL] = modified;
13842            }
13843          }
13844
13845          // if no content
13846          if (status === 204 || s.type === "HEAD") {
13847            statusText = "nocontent";
13848
13849            // if not modified
13850          } else if (status === 304) {
13851            statusText = "notmodified";
13852
13853            // If we have data, let's convert it
13854          } else {
13855            statusText = response.state;
13856            success = response.data;
13857            error = response.error;
13858            isSuccess = !error;
13859          }
13860        } else {
13861          // Extract error from statusText and normalize for non-aborts
13862          error = statusText;
13863          if (status || !statusText) {
13864            statusText = "error";
13865            if (status < 0) {
13866              status = 0;
13867            }
13868          }
13869        }
13870
13871        // Set data for the fake xhr object
13872        jqXHR.status = status;
13873        jqXHR.statusText = (nativeStatusText || statusText) + "";
13874
13875        // Success/Error
13876        if (isSuccess) {
13877          deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
13878        } else {
13879          deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
13880        }
13881
13882        // Status-dependent callbacks
13883        jqXHR.statusCode(statusCode);
13884        statusCode = undefined;
13885        if (fireGlobals) {
13886          globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
13887        }
13888
13889        // Complete
13890        completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
13891        if (fireGlobals) {
13892          globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
13893
13894          // Handle the global AJAX counter
13895          if (! --jQuery.active) {
13896            jQuery.event.trigger("ajaxStop");
13897          }
13898        }
13899      }
13900      return jqXHR;
13901    },
13902    getJSON: function (url, data, callback) {
13903      return jQuery.get(url, data, callback, "json");
13904    },
13905    getScript: function (url, callback) {
13906      return jQuery.get(url, undefined, callback, "script");
13907    }
13908  });
13909  jQuery.each(["get", "post"], function (_i, method) {
13910    jQuery[method] = function (url, data, callback, type) {
13911      // Shift arguments if data argument was omitted
13912      if (isFunction(data)) {
13913        type = type || callback;
13914        callback = data;
13915        data = undefined;
13916      }
13917
13918      // The url can be an options object (which then must have .url)
13919      return jQuery.ajax(jQuery.extend({
13920        url: url,
13921        type: method,
13922        dataType: type,
13923        data: data,
13924        success: callback
13925      }, jQuery.isPlainObject(url) && url));
13926    };
13927  });
13928  jQuery.ajaxPrefilter(function (s) {
13929    var i;
13930    for (i in s.headers) {
13931      if (i.toLowerCase() === "content-type") {
13932        s.contentType = s.headers[i] || "";
13933      }
13934    }
13935  });
13936  jQuery._evalUrl = function (url, options, doc) {
13937    return jQuery.ajax({
13938      url: url,
13939      // Make this explicit, since user can override this through ajaxSetup (trac-11264)
13940      type: "GET",
13941      dataType: "script",
13942      cache: true,
13943      async: false,
13944      global: false,
13945      // Only evaluate the response if it is successful (gh-4126)
13946      // dataFilter is not invoked for failure responses, so using it instead
13947      // of the default converter is kludgy but it works.
13948      converters: {
13949        "text script": function () {}
13950      },
13951      dataFilter: function (response) {
13952        jQuery.globalEval(response, options, doc);
13953      }
13954    });
13955  };
13956  jQuery.fn.extend({
13957    wrapAll: function (html) {
13958      var wrap;
13959      if (this[0]) {
13960        if (isFunction(html)) {
13961          html = html.call(this[0]);
13962        }
13963
13964        // The elements to wrap the target around
13965        wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
13966        if (this[0].parentNode) {
13967          wrap.insertBefore(this[0]);
13968        }
13969        wrap.map(function () {
13970          var elem = this;
13971          while (elem.firstElementChild) {
13972            elem = elem.firstElementChild;
13973          }
13974          return elem;
13975        }).append(this);
13976      }
13977      return this;
13978    },
13979    wrapInner: function (html) {
13980      if (isFunction(html)) {
13981        return this.each(function (i) {
13982          jQuery(this).wrapInner(html.call(this, i));
13983        });
13984      }
13985      return this.each(function () {
13986        var self = jQuery(this),
13987          contents = self.contents();
13988        if (contents.length) {
13989          contents.wrapAll(html);
13990        } else {
13991          self.append(html);
13992        }
13993      });
13994    },
13995    wrap: function (html) {
13996      var htmlIsFunction = isFunction(html);
13997      return this.each(function (i) {
13998        jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);
13999      });
14000    },
14001    unwrap: function (selector) {
14002      this.parent(selector).not("body").each(function () {
14003        jQuery(this).replaceWith(this.childNodes);
14004      });
14005      return this;
14006    }
14007  });
14008  jQuery.expr.pseudos.hidden = function (elem) {
14009    return !jQuery.expr.pseudos.visible(elem);
14010  };
14011  jQuery.expr.pseudos.visible = function (elem) {
14012    return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
14013  };
14014  jQuery.ajaxSettings.xhr = function () {
14015    try {
14016      return new window.XMLHttpRequest();
14017    } catch (e) {}
14018  };
14019  var xhrSuccessStatus = {
14020      // File protocol always yields status code 0, assume 200
14021      0: 200,
14022      // Support: IE <=9 only
14023      // trac-1450: sometimes IE returns 1223 when it should be 204
14024      1223: 204
14025    },
14026    xhrSupported = jQuery.ajaxSettings.xhr();
14027  support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
14028  support.ajax = xhrSupported = !!xhrSupported;
14029  jQuery.ajaxTransport(function (options) {
14030    var callback, errorCallback;
14031
14032    // Cross domain only allowed if supported through XMLHttpRequest
14033    if (support.cors || xhrSupported && !options.crossDomain) {
14034      return {
14035        send: function (headers, complete) {
14036          var i,
14037            xhr = options.xhr();
14038          xhr.open(options.type, options.url, options.async, options.username, options.password);
14039
14040          // Apply custom fields if provided
14041          if (options.xhrFields) {
14042            for (i in options.xhrFields) {
14043              xhr[i] = options.xhrFields[i];
14044            }
14045          }
14046
14047          // Override mime type if needed
14048          if (options.mimeType && xhr.overrideMimeType) {
14049            xhr.overrideMimeType(options.mimeType);
14050          }
14051
14052          // X-Requested-With header
14053          // For cross-domain requests, seeing as conditions for a preflight are
14054          // akin to a jigsaw puzzle, we simply never set it to be sure.
14055          // (it can always be set on a per-request basis or even using ajaxSetup)
14056          // For same-domain requests, won't change header if already provided.
14057          if (!options.crossDomain && !headers["X-Requested-With"]) {
14058            headers["X-Requested-With"] = "XMLHttpRequest";
14059          }
14060
14061          // Set headers
14062          for (i in headers) {
14063            xhr.setRequestHeader(i, headers[i]);
14064          }
14065
14066          // Callback
14067          callback = function (type) {
14068            return function () {
14069              if (callback) {
14070                callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null;
14071                if (type === "abort") {
14072                  xhr.abort();
14073                } else if (type === "error") {
14074                  // Support: IE <=9 only
14075                  // On a manual native abort, IE9 throws
14076                  // errors on any property access that is not readyState
14077                  if (typeof xhr.status !== "number") {
14078                    complete(0, "error");
14079                  } else {
14080                    complete(
14081                    // File: protocol always yields status 0; see trac-8605, trac-14207
14082                    xhr.status, xhr.statusText);
14083                  }
14084                } else {
14085                  complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText,
14086                  // Support: IE <=9 only
14087                  // IE9 has no XHR2 but throws on binary (trac-11426)
14088                  // For XHR2 non-text, let the caller handle it (gh-2498)
14089                  (xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? {
14090                    binary: xhr.response
14091                  } : {
14092                    text: xhr.responseText
14093                  }, xhr.getAllResponseHeaders());
14094                }
14095              }
14096            };
14097          };
14098
14099          // Listen to events
14100          xhr.onload = callback();
14101          errorCallback = xhr.onerror = xhr.ontimeout = callback("error");
14102
14103          // Support: IE 9 only
14104          // Use onreadystatechange to replace onabort
14105          // to handle uncaught aborts
14106          if (xhr.onabort !== undefined) {
14107            xhr.onabort = errorCallback;
14108          } else {
14109            xhr.onreadystatechange = function () {
14110              // Check readyState before timeout as it changes
14111              if (xhr.readyState === 4) {
14112                // Allow onerror to be called first,
14113                // but that will not handle a native abort
14114                // Also, save errorCallback to a variable
14115                // as xhr.onerror cannot be accessed
14116                window.setTimeout(function () {
14117                  if (callback) {
14118                    errorCallback();
14119                  }
14120                });
14121              }
14122            };
14123          }
14124
14125          // Create the abort callback
14126          callback = callback("abort");
14127          try {
14128            // Do send the request (this may raise an exception)
14129            xhr.send(options.hasContent && options.data || null);
14130          } catch (e) {
14131            // trac-14683: Only rethrow if this hasn't been notified as an error yet
14132            if (callback) {
14133              throw e;
14134            }
14135          }
14136        },
14137        abort: function () {
14138          if (callback) {
14139            callback();
14140          }
14141        }
14142      };
14143    }
14144  });
14145
14146  // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
14147  jQuery.ajaxPrefilter(function (s) {
14148    if (s.crossDomain) {
14149      s.contents.script = false;
14150    }
14151  });
14152
14153  // Install script dataType
14154  jQuery.ajaxSetup({
14155    accepts: {
14156      script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript"
14157    },
14158    contents: {
14159      script: /\b(?:java|ecma)script\b/
14160    },
14161    converters: {
14162      "text script": function (text) {
14163        jQuery.globalEval(text);
14164        return text;
14165      }
14166    }
14167  });
14168
14169  // Handle cache's special case and crossDomain
14170  jQuery.ajaxPrefilter("script", function (s) {
14171    if (s.cache === undefined) {
14172      s.cache = false;
14173    }
14174    if (s.crossDomain) {
14175      s.type = "GET";
14176    }
14177  });
14178
14179  // Bind script tag hack transport
14180  jQuery.ajaxTransport("script", function (s) {
14181    // This transport only deals with cross domain or forced-by-attrs requests
14182    if (s.crossDomain || s.scriptAttrs) {
14183      var script, callback;
14184      return {
14185        send: function (_, complete) {
14186          script = jQuery("<script>").attr(s.scriptAttrs || {}).prop({
14187            charset: s.scriptCharset,
14188            src: s.url
14189          }).on("load error", callback = function (evt) {
14190            script.remove();
14191            callback = null;
14192            if (evt) {
14193              complete(evt.type === "error" ? 404 : 200, evt.type);
14194            }
14195          });
14196
14197          // Use native DOM manipulation to avoid our domManip AJAX trickery
14198          document.head.appendChild(script[0]);
14199        },
14200        abort: function () {
14201          if (callback) {
14202            callback();
14203          }
14204        }
14205      };
14206    }
14207  });
14208  var oldCallbacks = [],
14209    rjsonp = /(=)\?(?=&|$)|\?\?/;
14210
14211  // Default jsonp settings
14212  jQuery.ajaxSetup({
14213    jsonp: "callback",
14214    jsonpCallback: function () {
14215      var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce.guid++;
14216      this[callback] = true;
14217      return callback;
14218    }
14219  });
14220
14221  // Detect, normalize options and install callbacks for jsonp requests
14222  jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {
14223    var callbackName,
14224      overwritten,
14225      responseContainer,
14226      jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");
14227
14228    // Handle iff the expected data type is "jsonp" or we have a parameter to set
14229    if (jsonProp || s.dataTypes[0] === "jsonp") {
14230      // Get callback name, remembering preexisting value associated with it
14231      callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;
14232
14233      // Insert callback into url or form data
14234      if (jsonProp) {
14235        s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
14236      } else if (s.jsonp !== false) {
14237        s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
14238      }
14239
14240      // Use data converter to retrieve json after script execution
14241      s.converters["script json"] = function () {
14242        if (!responseContainer) {
14243          jQuery.error(callbackName + " was not called");
14244        }
14245        return responseContainer[0];
14246      };
14247
14248      // Force json dataType
14249      s.dataTypes[0] = "json";
14250
14251      // Install callback
14252      overwritten = window[callbackName];
14253      window[callbackName] = function () {
14254        responseContainer = arguments;
14255      };
14256
14257      // Clean-up function (fires after converters)
14258      jqXHR.always(function () {
14259        // If previous value didn't exist - remove it
14260        if (overwritten === undefined) {
14261          jQuery(window).removeProp(callbackName);
14262
14263          // Otherwise restore preexisting value
14264        } else {
14265          window[callbackName] = overwritten;
14266        }
14267
14268        // Save back as free
14269        if (s[callbackName]) {
14270          // Make sure that re-using the options doesn't screw things around
14271          s.jsonpCallback = originalSettings.jsonpCallback;
14272
14273          // Save the callback name for future use
14274          oldCallbacks.push(callbackName);
14275        }
14276
14277        // Call if it was a function and we have a response
14278        if (responseContainer && isFunction(overwritten)) {
14279          overwritten(responseContainer[0]);
14280        }
14281        responseContainer = overwritten = undefined;
14282      });
14283
14284      // Delegate to script
14285      return "script";
14286    }
14287  });
14288
14289  // Support: Safari 8 only
14290  // In Safari 8 documents created via document.implementation.createHTMLDocument
14291  // collapse sibling forms: the second one becomes a child of the first one.
14292  // Because of that, this security measure has to be disabled in Safari 8.
14293  // https://bugs.webkit.org/show_bug.cgi?id=137337
14294  support.createHTMLDocument = function () {
14295    var body = document.implementation.createHTMLDocument("").body;
14296    body.innerHTML = "<form></form><form></form>";
14297    return body.childNodes.length === 2;
14298  }();
14299
14300  // Argument "data" should be string of html
14301  // context (optional): If specified, the fragment will be created in this context,
14302  // defaults to document
14303  // keepScripts (optional): If true, will include scripts passed in the html string
14304  jQuery.parseHTML = function (data, context, keepScripts) {
14305    if (typeof data !== "string") {
14306      return [];
14307    }
14308    if (typeof context === "boolean") {
14309      keepScripts = context;
14310      context = false;
14311    }
14312    var base, parsed, scripts;
14313    if (!context) {
14314      // Stop scripts or inline event handlers from being executed immediately
14315      // by using document.implementation
14316      if (support.createHTMLDocument) {
14317        context = document.implementation.createHTMLDocument("");
14318
14319        // Set the base href for the created document
14320        // so any parsed elements with URLs
14321        // are based on the document's URL (gh-2965)
14322        base = context.createElement("base");
14323        base.href = document.location.href;
14324        context.head.appendChild(base);
14325      } else {
14326        context = document;
14327      }
14328    }
14329    parsed = rsingleTag.exec(data);
14330    scripts = !keepScripts && [];
14331
14332    // Single tag
14333    if (parsed) {
14334      return [context.createElement(parsed[1])];
14335    }
14336    parsed = buildFragment([data], context, scripts);
14337    if (scripts && scripts.length) {
14338      jQuery(scripts).remove();
14339    }
14340    return jQuery.merge([], parsed.childNodes);
14341  };
14342
14343  /**
14344   * Load a url into a page
14345   */
14346  jQuery.fn.load = function (url, params, callback) {
14347    var selector,
14348      type,
14349      response,
14350      self = this,
14351      off = url.indexOf(" ");
14352    if (off > -1) {
14353      selector = stripAndCollapse(url.slice(off));
14354      url = url.slice(0, off);
14355    }
14356
14357    // If it's a function
14358    if (isFunction(params)) {
14359      // We assume that it's the callback
14360      callback = params;
14361      params = undefined;
14362
14363      // Otherwise, build a param string
14364    } else if (params && typeof params === "object") {
14365      type = "POST";
14366    }
14367
14368    // If we have elements to modify, make the request
14369    if (self.length > 0) {
14370      jQuery.ajax({
14371        url: url,
14372        // If "type" variable is undefined, then "GET" method will be used.
14373        // Make value of this field explicit since
14374        // user can override it through ajaxSetup method
14375        type: type || "GET",
14376        dataType: "html",
14377        data: params
14378      }).done(function (responseText) {
14379        // Save response for use in complete callback
14380        response = arguments;
14381        self.html(selector ?
14382        // If a selector was specified, locate the right elements in a dummy div
14383        // Exclude scripts to avoid IE 'Permission Denied' errors
14384        jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :
14385        // Otherwise use the full result
14386        responseText);
14387
14388        // If the request succeeds, this function gets "data", "status", "jqXHR"
14389        // but they are ignored because response was set above.
14390        // If it fails, this function gets "jqXHR", "status", "error"
14391      }).always(callback && function (jqXHR, status) {
14392        self.each(function () {
14393          callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
14394        });
14395      });
14396    }
14397    return this;
14398  };
14399  jQuery.expr.pseudos.animated = function (elem) {
14400    return jQuery.grep(jQuery.timers, function (fn) {
14401      return elem === fn.elem;
14402    }).length;
14403  };
14404  jQuery.offset = {
14405    setOffset: function (elem, options, i) {
14406      var curPosition,
14407        curLeft,
14408        curCSSTop,
14409        curTop,
14410        curOffset,
14411        curCSSLeft,
14412        calculatePosition,
14413        position = jQuery.css(elem, "position"),
14414        curElem = jQuery(elem),
14415        props = {};
14416
14417      // Set position first, in-case top/left are set even on static elem
14418      if (position === "static") {
14419        elem.style.position = "relative";
14420      }
14421      curOffset = curElem.offset();
14422      curCSSTop = jQuery.css(elem, "top");
14423      curCSSLeft = jQuery.css(elem, "left");
14424      calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1;
14425
14426      // Need to be able to calculate position if either
14427      // top or left is auto and position is either absolute or fixed
14428      if (calculatePosition) {
14429        curPosition = curElem.position();
14430        curTop = curPosition.top;
14431        curLeft = curPosition.left;
14432      } else {
14433        curTop = parseFloat(curCSSTop) || 0;
14434        curLeft = parseFloat(curCSSLeft) || 0;
14435      }
14436      if (isFunction(options)) {
14437        // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
14438        options = options.call(elem, i, jQuery.extend({}, curOffset));
14439      }
14440      if (options.top != null) {
14441        props.top = options.top - curOffset.top + curTop;
14442      }
14443      if (options.left != null) {
14444        props.left = options.left - curOffset.left + curLeft;
14445      }
14446      if ("using" in options) {
14447        options.using.call(elem, props);
14448      } else {
14449        curElem.css(props);
14450      }
14451    }
14452  };
14453  jQuery.fn.extend({
14454    // offset() relates an element's border box to the document origin
14455    offset: function (options) {
14456      // Preserve chaining for setter
14457      if (arguments.length) {
14458        return options === undefined ? this : this.each(function (i) {
14459          jQuery.offset.setOffset(this, options, i);
14460        });
14461      }
14462      var rect,
14463        win,
14464        elem = this[0];
14465      if (!elem) {
14466        return;
14467      }
14468
14469      // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
14470      // Support: IE <=11 only
14471      // Running getBoundingClientRect on a
14472      // disconnected node in IE throws an error
14473      if (!elem.getClientRects().length) {
14474        return {
14475          top: 0,
14476          left: 0
14477        };
14478      }
14479
14480      // Get document-relative position by adding viewport scroll to viewport-relative gBCR
14481      rect = elem.getBoundingClientRect();
14482      win = elem.ownerDocument.defaultView;
14483      return {
14484        top: rect.top + win.pageYOffset,
14485        left: rect.left + win.pageXOffset
14486      };
14487    },
14488    // position() relates an element's margin box to its offset parent's padding box
14489    // This corresponds to the behavior of CSS absolute positioning
14490    position: function () {
14491      if (!this[0]) {
14492        return;
14493      }
14494      var offsetParent,
14495        offset,
14496        doc,
14497        elem = this[0],
14498        parentOffset = {
14499          top: 0,
14500          left: 0
14501        };
14502
14503      // position:fixed elements are offset from the viewport, which itself always has zero offset
14504      if (jQuery.css(elem, "position") === "fixed") {
14505        // Assume position:fixed implies availability of getBoundingClientRect
14506        offset = elem.getBoundingClientRect();
14507      } else {
14508        offset = this.offset();
14509
14510        // Account for the *real* offset parent, which can be the document or its root element
14511        // when a statically positioned element is identified
14512        doc = elem.ownerDocument;
14513        offsetParent = elem.offsetParent || doc.documentElement;
14514        while (offsetParent && (offsetParent === doc.body || offsetParent === doc.documentElement) && jQuery.css(offsetParent, "position") === "static") {
14515          offsetParent = offsetParent.parentNode;
14516        }
14517        if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {
14518          // Incorporate borders into its offset, since they are outside its content origin
14519          parentOffset = jQuery(offsetParent).offset();
14520          parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true);
14521          parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true);
14522        }
14523      }
14524
14525      // Subtract parent offsets and element margins
14526      return {
14527        top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
14528        left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
14529      };
14530    },
14531    // This method will return documentElement in the following cases:
14532    // 1) For the element inside the iframe without offsetParent, this method will return
14533    //    documentElement of the parent window
14534    // 2) For the hidden or detached element
14535    // 3) For body or html element, i.e. in case of the html node - it will return itself
14536    //
14537    // but those exceptions were never presented as a real life use-cases
14538    // and might be considered as more preferable results.
14539    //
14540    // This logic, however, is not guaranteed and can change at any point in the future
14541    offsetParent: function () {
14542      return this.map(function () {
14543        var offsetParent = this.offsetParent;
14544        while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
14545          offsetParent = offsetParent.offsetParent;
14546        }
14547        return offsetParent || documentElement;
14548      });
14549    }
14550  });
14551
14552  // Create scrollLeft and scrollTop methods
14553  jQuery.each({
14554    scrollLeft: "pageXOffset",
14555    scrollTop: "pageYOffset"
14556  }, function (method, prop) {
14557    var top = "pageYOffset" === prop;
14558    jQuery.fn[method] = function (val) {
14559      return access(this, function (elem, method, val) {
14560        // Coalesce documents and windows
14561        var win;
14562        if (isWindow(elem)) {
14563          win = elem;
14564        } else if (elem.nodeType === 9) {
14565          win = elem.defaultView;
14566        }
14567        if (val === undefined) {
14568          return win ? win[prop] : elem[method];
14569        }
14570        if (win) {
14571          win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset);
14572        } else {
14573          elem[method] = val;
14574        }
14575      }, method, val, arguments.length);
14576    };
14577  });
14578
14579  // Support: Safari <=7 - 9.1, Chrome <=37 - 49
14580  // Add the top/left cssHooks using jQuery.fn.position
14581  // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
14582  // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
14583  // getComputedStyle returns percent when specified for top/left/bottom/right;
14584  // rather than make the css module depend on the offset module, just check for it here
14585  jQuery.each(["top", "left"], function (_i, prop) {
14586    jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {
14587      if (computed) {
14588        computed = curCSS(elem, prop);
14589
14590        // If curCSS returns percentage, fallback to offset
14591        return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
14592      }
14593    });
14594  });
14595
14596  // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
14597  jQuery.each({
14598    Height: "height",
14599    Width: "width"
14600  }, function (name, type) {
14601    jQuery.each({
14602      padding: "inner" + name,
14603      content: type,
14604      "": "outer" + name
14605    }, function (defaultExtra, funcName) {
14606      // Margin is only for outerHeight, outerWidth
14607      jQuery.fn[funcName] = function (margin, value) {
14608        var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
14609          extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
14610        return access(this, function (elem, type, value) {
14611          var doc;
14612          if (isWindow(elem)) {
14613            // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
14614            return funcName.indexOf("outer") === 0 ? elem["inner" + name] : elem.document.documentElement["client" + name];
14615          }
14616
14617          // Get document width or height
14618          if (elem.nodeType === 9) {
14619            doc = elem.documentElement;
14620
14621            // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
14622            // whichever is greatest
14623            return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
14624          }
14625          return value === undefined ?
14626          // Get width or height on the element, requesting but not forcing parseFloat
14627          jQuery.css(elem, type, extra) :
14628          // Set width or height on the element
14629          jQuery.style(elem, type, value, extra);
14630        }, type, chainable ? margin : undefined, chainable);
14631      };
14632    });
14633  });
14634  jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (_i, type) {
14635    jQuery.fn[type] = function (fn) {
14636      return this.on(type, fn);
14637    };
14638  });
14639  jQuery.fn.extend({
14640    bind: function (types, data, fn) {
14641      return this.on(types, null, data, fn);
14642    },
14643    unbind: function (types, fn) {
14644      return this.off(types, null, fn);
14645    },
14646    delegate: function (selector, types, data, fn) {
14647      return this.on(types, selector, data, fn);
14648    },
14649    undelegate: function (selector, types, fn) {
14650      // ( namespace ) or ( selector, types [, fn] )
14651      return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
14652    },
14653    hover: function (fnOver, fnOut) {
14654      return this.on("mouseenter", fnOver).on("mouseleave", fnOut || fnOver);
14655    }
14656  });
14657  jQuery.each(("blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu").split(" "), function (_i, name) {
14658    // Handle event binding
14659    jQuery.fn[name] = function (data, fn) {
14660      return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
14661    };
14662  });
14663
14664  // Support: Android <=4.0 only
14665  // Make sure we trim BOM and NBSP
14666  // Require that the "whitespace run" starts from a non-whitespace
14667  // to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
14668  var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
14669
14670  // Bind a function to a context, optionally partially applying any
14671  // arguments.
14672  // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
14673  // However, it is not slated for removal any time soon
14674  jQuery.proxy = function (fn, context) {
14675    var tmp, args, proxy;
14676    if (typeof context === "string") {
14677      tmp = fn[context];
14678      context = fn;
14679      fn = tmp;
14680    }
14681
14682    // Quick check to determine if target is callable, in the spec
14683    // this throws a TypeError, but we will just return undefined.
14684    if (!isFunction(fn)) {
14685      return undefined;
14686    }
14687
14688    // Simulated bind
14689    args = slice.call(arguments, 2);
14690    proxy = function () {
14691      return fn.apply(context || this, args.concat(slice.call(arguments)));
14692    };
14693
14694    // Set the guid of unique handler to the same of original handler, so it can be removed
14695    proxy.guid = fn.guid = fn.guid || jQuery.guid++;
14696    return proxy;
14697  };
14698  jQuery.holdReady = function (hold) {
14699    if (hold) {
14700      jQuery.readyWait++;
14701    } else {
14702      jQuery.ready(true);
14703    }
14704  };
14705  jQuery.isArray = Array.isArray;
14706  jQuery.parseJSON = JSON.parse;
14707  jQuery.nodeName = nodeName;
14708  jQuery.isFunction = isFunction;
14709  jQuery.isWindow = isWindow;
14710  jQuery.camelCase = camelCase;
14711  jQuery.type = toType;
14712  jQuery.now = Date.now;
14713  jQuery.isNumeric = function (obj) {
14714    // As of jQuery 3.0, isNumeric is limited to
14715    // strings and numbers (primitives or objects)
14716    // that can be coerced to finite numbers (gh-2662)
14717    var type = jQuery.type(obj);
14718    return (type === "number" || type === "string") &&
14719    // parseFloat NaNs numeric-cast false positives ("")
14720    // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
14721    // subtraction forces infinities to NaN
14722    !isNaN(obj - parseFloat(obj));
14723  };
14724  jQuery.trim = function (text) {
14725    return text == null ? "" : (text + "").replace(rtrim, "$1");
14726  };
14727
14728  // Register as a named AMD module, since jQuery can be concatenated with other
14729  // files that may use define, but not via a proper concatenation script that
14730  // understands anonymous AMD modules. A named AMD is safest and most robust
14731  // way to register. Lowercase jquery is used because AMD module names are
14732  // derived from file names, and jQuery is normally delivered in a lowercase
14733  // file name. Do this after creating the global so that if an AMD module wants
14734  // to call noConflict to hide this version of jQuery, it will work.
14735
14736  // Note that for maximum portability, libraries that are not jQuery should
14737  // declare themselves as anonymous modules, and avoid setting a global if an
14738  // AMD loader is present. jQuery is a special case. For more information, see
14739  // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
14740
14741  if (typeof define === "function" && define.amd) {
14742    define("jquery", [], function () {
14743      return jQuery;
14744    });
14745  }
14746  var
14747    // Map over jQuery in case of overwrite
14748    _jQuery = window.jQuery,
14749    // Map over the $ in case of overwrite
14750    _$ = window.$;
14751  jQuery.noConflict = function (deep) {
14752    if (window.$ === jQuery) {
14753      window.$ = _$;
14754    }
14755    if (deep && window.jQuery === jQuery) {
14756      window.jQuery = _jQuery;
14757    }
14758    return jQuery;
14759  };
14760
14761  // Expose jQuery and $ identifiers, even in AMD
14762  // (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
14763  // and CommonJS for browser emulators (trac-13566)
14764  if (typeof noGlobal === "undefined") {
14765    window.jQuery = window.$ = jQuery;
14766  }
14767  return jQuery;
14768});
14769
14770/***/ }),
14771
vendor: 115,521 bytes, lines 14772-17568
14772/***/ "./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js":
14773/*!**************************************************************************!*\
14774  !*** ./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js ***!
14775  \**************************************************************************/
14776/*! no static exports found */
14777/***/ (function(module, exports, __webpack_require__) {
14778
14779/*** IMPORTS FROM imports-loader ***/
14780var define = false;
14781
14782/*!
14783 * ScrollMagic v2.0.8 (2020-08-14)
14784 * The javascript library for magical scroll interactions.
14785 * (c) 2020 Jan Paepke (@janpaepke)
14786 * Project Website: http://scrollmagic.io
14787 * 
14788 * @version 2.0.8
14789 * @license Dual licensed under MIT license and GPL.
14790 * @author Jan Paepke - [email protected]
14791 *
14792 * @file ScrollMagic main library.
14793 */
14794/**
14795 * @namespace ScrollMagic
14796 */
14797(function (root, factory) {
14798  if (typeof define === 'function' && define.amd) {
14799    // AMD. Register as an anonymous module.
14800    define(factory);
14801  } else if (true) {
14802    // CommonJS
14803    module.exports = factory();
14804  } else {}
14805})(this, function () {
14806  "use strict";
14807
14808  var ScrollMagic = function () {
14809    _util.log(2, '(COMPATIBILITY NOTICE) -> As of ScrollMagic 2.0.0 you need to use \'new ScrollMagic.Controller()\' to create a new controller instance. Use \'new ScrollMagic.Scene()\' to instance a scene.');
14810  };
14811  ScrollMagic.version = "2.0.8";
14812
14813  // TODO: temporary workaround for chrome's scroll jitter bug
14814  if (typeof window !== 'undefined') {
14815    window.addEventListener("mousewheel", void 0);
14816  }
14817
14818  // global const
14819  var PIN_SPACER_ATTRIBUTE = "data-scrollmagic-pin-spacer";
14820
14821  /**
14822   * The main class that is needed once per scroll container.
14823   *
14824   * @class
14825   *
14826   * @example
14827   * // basic initialization
14828   * var controller = new ScrollMagic.Controller();
14829   *
14830   * // passing options
14831   * var controller = new ScrollMagic.Controller({container: "#myContainer", loglevel: 3});
14832   *
14833   * @param {object} [options] - An object containing one or more options for the controller.
14834   * @param {(string|object)} [options.container=window] - A selector, DOM object that references the main container for scrolling.
14835   * @param {boolean} [options.vertical=true] - Sets the scroll mode to vertical (`true`) or horizontal (`false`) scrolling.
14836   * @param {object} [options.globalSceneOptions={}] - These options will be passed to every Scene that is added to the controller using the addScene method. For more information on Scene options see {@link ScrollMagic.Scene}.
14837   * @param {number} [options.loglevel=2] Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic.
14838  										 ** `0` => silent
14839  										 ** `1` => errors
14840  										 ** `2` => errors, warnings
14841  										 ** `3` => errors, warnings, debuginfo
14842   * @param {boolean} [options.refreshInterval=100] - Some changes don't call events by default, like changing the container size or moving a scene trigger element.  
14843   																										 This interval polls these parameters to fire the necessary events.  
14844   																										 If you don't use custom containers, trigger elements or have static layouts, where the positions of the trigger elements don't change, you can set this to 0 disable interval checking and improve performance.
14845   *
14846   */
14847  ScrollMagic.Controller = function (options) {
14848    /*
14849     * ----------------------------------------------------------------
14850     * settings
14851     * ----------------------------------------------------------------
14852     */
14853    var NAMESPACE = 'ScrollMagic.Controller',
14854      SCROLL_DIRECTION_FORWARD = 'FORWARD',
14855      SCROLL_DIRECTION_REVERSE = 'REVERSE',
14856      SCROLL_DIRECTION_PAUSED = 'PAUSED',
14857      DEFAULT_OPTIONS = CONTROLLER_OPTIONS.defaults;
14858
14859    /*
14860     * ----------------------------------------------------------------
14861     * private vars
14862     * ----------------------------------------------------------------
14863     */
14864    var Controller = this,
14865      _options = _util.extend({}, DEFAULT_OPTIONS, options),
14866      _sceneObjects = [],
14867      _updateScenesOnNextCycle = false,
14868      // can be boolean (true => all scenes) or an array of scenes to be updated
14869      _scrollPos = 0,
14870      _scrollDirection = SCROLL_DIRECTION_PAUSED,
14871      _isDocument = true,
14872      _viewPortSize = 0,
14873      _enabled = true,
14874      _updateTimeout,
14875      _refreshTimeout;
14876
14877    /*
14878     * ----------------------------------------------------------------
14879     * private functions
14880     * ----------------------------------------------------------------
14881     */
14882
14883    /**
14884     * Internal constructor function of the ScrollMagic Controller
14885     * @private
14886     */
14887    var construct = function () {
14888      for (var key in _options) {
14889        if (!DEFAULT_OPTIONS.hasOwnProperty(key)) {
14890          log(2, "WARNING: Unknown option \"" + key + "\"");
14891          delete _options[key];
14892        }
14893      }
14894      _options.container = _util.get.elements(_options.container)[0];
14895      // check ScrollContainer
14896      if (!_options.container) {
14897        log(1, "ERROR creating object " + NAMESPACE + ": No valid scroll container supplied");
14898        throw NAMESPACE + " init failed."; // cancel
14899      }
14900      _isDocument = _options.container === window || _options.container === document.body || !document.body.contains(_options.container);
14901      // normalize to window
14902      if (_isDocument) {
14903        _options.container = window;
14904      }
14905      // update container size immediately
14906      _viewPortSize = getViewportSize();
14907      // set event handlers
14908      _options.container.addEventListener("resize", onChange);
14909      _options.container.addEventListener("scroll", onChange);
14910      var ri = parseInt(_options.refreshInterval, 10);
14911      _options.refreshInterval = _util.type.Number(ri) ? ri : DEFAULT_OPTIONS.refreshInterval;
14912      scheduleRefresh();
14913      log(3, "added new " + NAMESPACE + " controller (v" + ScrollMagic.version + ")");
14914    };
14915
14916    /**
14917     * Schedule the next execution of the refresh function
14918     * @private
14919     */
14920    var scheduleRefresh = function () {
14921      if (_options.refreshInterval > 0) {
14922        _refreshTimeout = window.setTimeout(refresh, _options.refreshInterval);
14923      }
14924    };
14925
14926    /**
14927     * Default function to get scroll pos - overwriteable using `Controller.scrollPos(newFunction)`
14928     * @private
14929     */
14930    var getScrollPos = function () {
14931      return _options.vertical ? _util.get.scrollTop(_options.container) : _util.get.scrollLeft(_options.container);
14932    };
14933
14934    /**
14935     * Returns the current viewport Size (width vor horizontal, height for vertical)
14936     * @private
14937     */
14938    var getViewportSize = function () {
14939      return _options.vertical ? _util.get.height(_options.container) : _util.get.width(_options.container);
14940    };
14941
14942    /**
14943     * Default function to set scroll pos - overwriteable using `Controller.scrollTo(newFunction)`
14944     * Make available publicly for pinned mousewheel workaround.
14945     * @private
14946     */
14947    var setScrollPos = this._setScrollPos = function (pos) {
14948      if (_options.vertical) {
14949        if (_isDocument) {
14950          window.scrollTo(_util.get.scrollLeft(), pos);
14951        } else {
14952          _options.container.scrollTop = pos;
14953        }
14954      } else {
14955        if (_isDocument) {
14956          window.scrollTo(pos, _util.get.scrollTop());
14957        } else {
14958          _options.container.scrollLeft = pos;
14959        }
14960      }
14961    };
14962
14963    /**
14964     * Handle updates in cycles instead of on scroll (performance)
14965     * @private
14966     */
14967    var updateScenes = function () {
14968      if (_enabled && _updateScenesOnNextCycle) {
14969        // determine scenes to update
14970        var scenesToUpdate = _util.type.Array(_updateScenesOnNextCycle) ? _updateScenesOnNextCycle : _sceneObjects.slice(0);
14971        // reset scenes
14972        _updateScenesOnNextCycle = false;
14973        var oldScrollPos = _scrollPos;
14974        // update scroll pos now instead of onChange, as it might have changed since scheduling (i.e. in-browser smooth scroll)
14975        _scrollPos = Controller.scrollPos();
14976        var deltaScroll = _scrollPos - oldScrollPos;
14977        if (deltaScroll !== 0) {
14978          // scroll position changed?
14979          _scrollDirection = deltaScroll > 0 ? SCROLL_DIRECTION_FORWARD : SCROLL_DIRECTION_REVERSE;
14980        }
14981        // reverse order of scenes if scrolling reverse
14982        if (_scrollDirection === SCROLL_DIRECTION_REVERSE) {
14983          scenesToUpdate.reverse();
14984        }
14985        // update scenes
14986        scenesToUpdate.forEach(function (scene, index) {
14987          log(3, "updating Scene " + (index + 1) + "/" + scenesToUpdate.length + " (" + _sceneObjects.length + " total)");
14988          scene.update(true);
14989        });
14990        if (scenesToUpdate.length === 0 && _options.loglevel >= 3) {
14991          log(3, "updating 0 Scenes (nothing added to controller)");
14992        }
14993      }
14994    };
14995
14996    /**
14997     * Initializes rAF callback
14998     * @private
14999     */
15000    var debounceUpdate = function () {
15001      _updateTimeout = _util.rAF(updateScenes);
15002    };
15003
15004    /**
15005     * Handles Container changes
15006     * @private
15007     */
15008    var onChange = function (e) {
15009      log(3, "event fired causing an update:", e.type);
15010      if (e.type == "resize") {
15011        // resize
15012        _viewPortSize = getViewportSize();
15013        _scrollDirection = SCROLL_DIRECTION_PAUSED;
15014      }
15015      // schedule update
15016      if (_updateScenesOnNextCycle !== true) {
15017        _updateScenesOnNextCycle = true;
15018        debounceUpdate();
15019      }
15020    };
15021    var refresh = function () {
15022      if (!_isDocument) {
15023        // simulate resize event. Only works for viewport relevant param (performance)
15024        if (_viewPortSize != getViewportSize()) {
15025          var resizeEvent;
15026          try {
15027            resizeEvent = new Event('resize', {
15028              bubbles: false,
15029              cancelable: false
15030            });
15031          } catch (e) {
15032            // stupid IE
15033            resizeEvent = document.createEvent("Event");
15034            resizeEvent.initEvent("resize", false, false);
15035          }
15036          _options.container.dispatchEvent(resizeEvent);
15037        }
15038      }
15039      _sceneObjects.forEach(function (scene, index) {
15040        // refresh all scenes
15041        scene.refresh();
15042      });
15043      scheduleRefresh();
15044    };
15045
15046    /**
15047     * Send a debug message to the console.
15048     * provided publicly with _log for plugins
15049     * @private
15050     *
15051     * @param {number} loglevel - The loglevel required to initiate output for the message.
15052     * @param {...mixed} output - One or more variables that should be passed to the console.
15053     */
15054    var log = this._log = function (loglevel, output) {
15055      if (_options.loglevel >= loglevel) {
15056        Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ") ->");
15057        _util.log.apply(window, arguments);
15058      }
15059    };
15060    // for scenes we have getters for each option, but for the controller we don't, so we need to make it available externally for plugins
15061    this._options = _options;
15062
15063    /**
15064     * Sort scenes in ascending order of their start offset.
15065     * @private
15066     *
15067     * @param {array} ScenesArray - an array of ScrollMagic Scenes that should be sorted
15068     * @return {array} The sorted array of Scenes.
15069     */
15070    var sortScenes = function (ScenesArray) {
15071      if (ScenesArray.length <= 1) {
15072        return ScenesArray;
15073      } else {
15074        var scenes = ScenesArray.slice(0);
15075        scenes.sort(function (a, b) {
15076          return a.scrollOffset() > b.scrollOffset() ? 1 : -1;
15077        });
15078        return scenes;
15079      }
15080    };
15081
15082    /**
15083     * ----------------------------------------------------------------
15084     * public functions
15085     * ----------------------------------------------------------------
15086     */
15087
15088    /**
15089     * Add one ore more scene(s) to the controller.  
15090     * This is the equivalent to `Scene.addTo(controller)`.
15091     * @public
15092     * @example
15093     * // with a previously defined scene
15094     * controller.addScene(scene);
15095     *
15096     * // with a newly created scene.
15097     * controller.addScene(new ScrollMagic.Scene({duration : 0}));
15098     *
15099     * // adding multiple scenes
15100     * controller.addScene([scene, scene2, new ScrollMagic.Scene({duration : 0})]);
15101     *
15102     * @param {(ScrollMagic.Scene|array)} newScene - ScrollMagic Scene or Array of Scenes to be added to the controller.
15103     * @return {Controller} Parent object for chaining.
15104     */
15105    this.addScene = function (newScene) {
15106      if (_util.type.Array(newScene)) {
15107        newScene.forEach(function (scene, index) {
15108          Controller.addScene(scene);
15109        });
15110      } else if (newScene instanceof ScrollMagic.Scene) {
15111        if (newScene.controller() !== Controller) {
15112          newScene.addTo(Controller);
15113        } else if (_sceneObjects.indexOf(newScene) < 0) {
15114          // new scene
15115          _sceneObjects.push(newScene); // add to array
15116          _sceneObjects = sortScenes(_sceneObjects); // sort
15117          newScene.on("shift.controller_sort", function () {
15118            // resort whenever scene moves
15119            _sceneObjects = sortScenes(_sceneObjects);
15120          });
15121          // insert Global defaults.
15122          for (var key in _options.globalSceneOptions) {
15123            if (newScene[key]) {
15124              newScene[key].call(newScene, _options.globalSceneOptions[key]);
15125            }
15126          }
15127          log(3, "adding Scene (now " + _sceneObjects.length + " total)");
15128        }
15129      } else {
15130        log(1, "ERROR: invalid argument supplied for '.addScene()'");
15131      }
15132      return Controller;
15133    };
15134
15135    /**
15136     * Remove one ore more scene(s) from the controller.  
15137     * This is the equivalent to `Scene.remove()`.
15138     * @public
15139     * @example
15140     * // remove a scene from the controller
15141     * controller.removeScene(scene);
15142     *
15143     * // remove multiple scenes from the controller
15144     * controller.removeScene([scene, scene2, scene3]);
15145     *
15146     * @param {(ScrollMagic.Scene|array)} Scene - ScrollMagic Scene or Array of Scenes to be removed from the controller.
15147     * @returns {Controller} Parent object for chaining.
15148     */
15149    this.removeScene = function (Scene) {
15150      if (_util.type.Array(Scene)) {
15151        Scene.forEach(function (scene, index) {
15152          Controller.removeScene(scene);
15153        });
15154      } else {
15155        var index = _sceneObjects.indexOf(Scene);
15156        if (index > -1) {
15157          Scene.off("shift.controller_sort");
15158          _sceneObjects.splice(index, 1);
15159          log(3, "removing Scene (now " + _sceneObjects.length + " left)");
15160          Scene.remove();
15161        }
15162      }
15163      return Controller;
15164    };
15165
15166    /**
15167    * Update one ore more scene(s) according to the scroll position of the container.  
15168    * This is the equivalent to `Scene.update()`.  
15169    * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container.  
15170    * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress.  
15171    * _**Note:** This method gets called constantly whenever Controller detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._
15172    * @public
15173    * @example
15174    * // update a specific scene on next cycle
15175     * controller.updateScene(scene);
15176     *
15177    * // update a specific scene immediately
15178    * controller.updateScene(scene, true);
15179     *
15180    * // update multiple scenes scene on next cycle
15181    * controller.updateScene([scene1, scene2, scene3]);
15182    *
15183    * @param {ScrollMagic.Scene} Scene - ScrollMagic Scene or Array of Scenes that is/are supposed to be updated.
15184    * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle.  
15185    										  This is useful when changing multiple properties of the scene - this way it will only be updated once all new properties are set (updateScenes).
15186    * @return {Controller} Parent object for chaining.
15187    */
15188    this.updateScene = function (Scene, immediately) {
15189      if (_util.type.Array(Scene)) {
15190        Scene.forEach(function (scene, index) {
15191          Controller.updateScene(scene, immediately);
15192        });
15193      } else {
15194        if (immediately) {
15195          Scene.update(true);
15196        } else if (_updateScenesOnNextCycle !== true && Scene instanceof ScrollMagic.Scene) {
15197          // if _updateScenesOnNextCycle is true, all connected scenes are already scheduled for update
15198          // prep array for next update cycle
15199          _updateScenesOnNextCycle = _updateScenesOnNextCycle || [];
15200          if (_updateScenesOnNextCycle.indexOf(Scene) == -1) {
15201            _updateScenesOnNextCycle.push(Scene);
15202          }
15203          _updateScenesOnNextCycle = sortScenes(_updateScenesOnNextCycle); // sort
15204          debounceUpdate();
15205        }
15206      }
15207      return Controller;
15208    };
15209
15210    /**
15211     * Updates the controller params and calls updateScene on every scene, that is attached to the controller.  
15212     * See `Controller.updateScene()` for more information about what this means.  
15213     * In most cases you will not need this function, as it is called constantly, whenever ScrollMagic detects a state change event, like resize or scroll.  
15214     * The only application for this method is when ScrollMagic fails to detect these events.  
15215     * One application is with some external scroll libraries (like iScroll) that move an internal container to a negative offset instead of actually scrolling. In this case the update on the controller needs to be called whenever the child container's position changes.
15216     * For this case there will also be the need to provide a custom function to calculate the correct scroll position. See `Controller.scrollPos()` for details.
15217     * @public
15218     * @example
15219     * // update the controller on next cycle (saves performance due to elimination of redundant updates)
15220     * controller.update();
15221     *
15222     * // update the controller immediately
15223     * controller.update(true);
15224     *
15225     * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance)
15226     * @return {Controller} Parent object for chaining.
15227     */
15228    this.update = function (immediately) {
15229      onChange({
15230        type: "resize"
15231      }); // will update size and set _updateScenesOnNextCycle to true
15232      if (immediately) {
15233        updateScenes();
15234      }
15235      return Controller;
15236    };
15237
15238    /**
15239     * Scroll to a numeric scroll offset, a DOM element, the start of a scene or provide an alternate method for scrolling.  
15240     * For vertical controllers it will change the top scroll offset and for horizontal applications it will change the left offset.
15241     * @public
15242     *
15243     * @since 1.1.0
15244     * @example
15245     * // scroll to an offset of 100
15246     * controller.scrollTo(100);
15247     *
15248     * // scroll to a DOM element
15249     * controller.scrollTo("#anchor");
15250     *
15251     * // scroll to the beginning of a scene
15252     * var scene = new ScrollMagic.Scene({offset: 200});
15253     * controller.scrollTo(scene);
15254     *
15255     * // define a new scroll position modification function (jQuery animate instead of jump)
15256     * controller.scrollTo(function (newScrollPos) {
15257     *	$("html, body").animate({scrollTop: newScrollPos});
15258     * });
15259     * controller.scrollTo(100); // call as usual, but the new function will be used instead
15260     *
15261     * // define a new scroll function with an additional parameter
15262     * controller.scrollTo(function (newScrollPos, message) {
15263     *  console.log(message);
15264     *	$(this).animate({scrollTop: newScrollPos});
15265     * });
15266     * // call as usual, but supply an extra parameter to the defined custom function
15267     * controller.scrollTo(100, "my message");
15268     *
15269     * // define a new scroll function with an additional parameter containing multiple variables
15270     * controller.scrollTo(function (newScrollPos, options) {
15271     *  someGlobalVar = options.a + options.b;
15272     *	$(this).animate({scrollTop: newScrollPos});
15273     * });
15274     * // call as usual, but supply an extra parameter containing multiple options
15275     * controller.scrollTo(100, {a: 1, b: 2});
15276     *
15277     * // define a new scroll function with a callback supplied as an additional parameter
15278     * controller.scrollTo(function (newScrollPos, callback) {
15279     *	$(this).animate({scrollTop: newScrollPos}, 400, "swing", callback);
15280     * });
15281     * // call as usual, but supply an extra parameter, which is used as a callback in the previously defined custom scroll function
15282     * controller.scrollTo(100, function() {
15283     *	console.log("scroll has finished.");
15284     * });
15285     *
15286     * @param {mixed} scrollTarget - The supplied argument can be one of these types:
15287     * 1. `number` -> The container will scroll to this new scroll offset.
15288     * 2. `string` or `object` -> Can be a selector or a DOM object.  
15289     *  The container will scroll to the position of this element.
15290     * 3. `ScrollMagic Scene` -> The container will scroll to the start of this scene.
15291     * 4. `function` -> This function will be used for future scroll position modifications.  
15292     *  This provides a way for you to change the behaviour of scrolling and adding new behaviour like animation. The function receives the new scroll position as a parameter and a reference to the container element using `this`.  
15293     *  It may also optionally receive an optional additional parameter (see below)  
15294     *  _**NOTE:**  
15295     *  All other options will still work as expected, using the new function to scroll._
15296     * @param {mixed} [additionalParameter] - If a custom scroll function was defined (see above 4.), you may want to supply additional parameters to it, when calling it. You can do this using this parameter – see examples for details. Please note, that this parameter will have no effect, if you use the default scrolling function.
15297     * @returns {Controller} Parent object for chaining.
15298     */
15299    this.scrollTo = function (scrollTarget, additionalParameter) {
15300      if (_util.type.Number(scrollTarget)) {
15301        // excecute
15302        setScrollPos.call(_options.container, scrollTarget, additionalParameter);
15303      } else if (scrollTarget instanceof ScrollMagic.Scene) {
15304        // scroll to scene
15305        if (scrollTarget.controller() === Controller) {
15306          // check if the controller is associated with this scene
15307          Controller.scrollTo(scrollTarget.scrollOffset(), additionalParameter);
15308        } else {
15309          log(2, "scrollTo(): The supplied scene does not belong to this controller. Scroll cancelled.", scrollTarget);
15310        }
15311      } else if (_util.type.Function(scrollTarget)) {
15312        // assign new scroll function
15313        setScrollPos = scrollTarget;
15314      } else {
15315        // scroll to element
15316        var elem = _util.get.elements(scrollTarget)[0];
15317        if (elem) {
15318          // if parent is pin spacer, use spacer position instead so correct start position is returned for pinned elements.
15319          while (elem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
15320            elem = elem.parentNode;
15321          }
15322          var param = _options.vertical ? "top" : "left",
15323            // which param is of interest ?
15324            containerOffset = _util.get.offset(_options.container),
15325            // container position is needed because element offset is returned in relation to document, not in relation to container.
15326            elementOffset = _util.get.offset(elem);
15327          if (!_isDocument) {
15328            // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent
15329            containerOffset[param] -= Controller.scrollPos();
15330          }
15331          Controller.scrollTo(elementOffset[param] - containerOffset[param], additionalParameter);
15332        } else {
15333          log(2, "scrollTo(): The supplied argument is invalid. Scroll cancelled.", scrollTarget);
15334        }
15335      }
15336      return Controller;
15337    };
15338
15339    /**
15340     * **Get** the current scrollPosition or **Set** a new method to calculate it.  
15341     * -> **GET**:
15342     * When used as a getter this function will return the current scroll position.  
15343     * To get a cached value use Controller.info("scrollPos"), which will be updated in the update cycle.  
15344     * For vertical controllers it will return the top scroll offset and for horizontal applications it will return the left offset.
15345     *
15346     * -> **SET**:
15347     * When used as a setter this method prodes a way to permanently overwrite the controller's scroll position calculation.  
15348     * A typical usecase is when the scroll position is not reflected by the containers scrollTop or scrollLeft values, but for example by the inner offset of a child container.  
15349     * Moving a child container inside a parent is a commonly used method for several scrolling frameworks, including iScroll.  
15350     * By providing an alternate calculation function you can make sure ScrollMagic receives the correct scroll position.  
15351     * Please also bear in mind that your function should return y values for vertical scrolls an x for horizontals.
15352     *
15353     * To change the current scroll position please use `Controller.scrollTo()`.
15354     * @public
15355     *
15356     * @example
15357     * // get the current scroll Position
15358     * var scrollPos = controller.scrollPos();
15359     *
15360     * // set a new scroll position calculation method
15361     * controller.scrollPos(function () {
15362     *	return this.info("vertical") ? -mychildcontainer.y : -mychildcontainer.x
15363     * });
15364     *
15365     * @param {function} [scrollPosMethod] - The function to be used for the scroll position calculation of the container.
15366     * @returns {(number|Controller)} Current scroll position or parent object for chaining.
15367     */
15368    this.scrollPos = function (scrollPosMethod) {
15369      if (!arguments.length) {
15370        // get
15371        return getScrollPos.call(Controller);
15372      } else {
15373        // set
15374        if (_util.type.Function(scrollPosMethod)) {
15375          getScrollPos = scrollPosMethod;
15376        } else {
15377          log(2, "Provided value for method 'scrollPos' is not a function. To change the current scroll position use 'scrollTo()'.");
15378        }
15379      }
15380      return Controller;
15381    };
15382
15383    /**
15384     * **Get** all infos or one in particular about the controller.
15385     * @public
15386     * @example
15387     * // returns the current scroll position (number)
15388     * var scrollPos = controller.info("scrollPos");
15389     *
15390     * // returns all infos as an object
15391     * var infos = controller.info();
15392     *
15393     * @param {string} [about] - If passed only this info will be returned instead of an object containing all.  
15394     							 Valid options are:
15395     							 ** `"size"` => the current viewport size of the container
15396     							 ** `"vertical"` => true if vertical scrolling, otherwise false
15397     							 ** `"scrollPos"` => the current scroll position
15398     							 ** `"scrollDirection"` => the last known direction of the scroll
15399     							 ** `"container"` => the container element
15400     							 ** `"isDocument"` => true if container element is the document.
15401     * @returns {(mixed|object)} The requested info(s).
15402     */
15403    this.info = function (about) {
15404      var values = {
15405        size: _viewPortSize,
15406        // contains height or width (in regard to orientation);
15407        vertical: _options.vertical,
15408        scrollPos: _scrollPos,
15409        scrollDirection: _scrollDirection,
15410        container: _options.container,
15411        isDocument: _isDocument
15412      };
15413      if (!arguments.length) {
15414        // get all as an object
15415        return values;
15416      } else if (values[about] !== undefined) {
15417        return values[about];
15418      } else {
15419        log(1, "ERROR: option \"" + about + "\" is not available");
15420        return;
15421      }
15422    };
15423
15424    /**
15425     * **Get** or **Set** the current loglevel option value.
15426     * @public
15427     *
15428     * @example
15429     * // get the current value
15430     * var loglevel = controller.loglevel();
15431     *
15432     * // set a new value
15433     * controller.loglevel(3);
15434     *
15435     * @param {number} [newLoglevel] - The new loglevel setting of the Controller. `[0-3]`
15436     * @returns {(number|Controller)} Current loglevel or parent object for chaining.
15437     */
15438    this.loglevel = function (newLoglevel) {
15439      if (!arguments.length) {
15440        // get
15441        return _options.loglevel;
15442      } else if (_options.loglevel != newLoglevel) {
15443        // set
15444        _options.loglevel = newLoglevel;
15445      }
15446      return Controller;
15447    };
15448
15449    /**
15450     * **Get** or **Set** the current enabled state of the controller.  
15451     * This can be used to disable all Scenes connected to the controller without destroying or removing them.
15452     * @public
15453     *
15454     * @example
15455     * // get the current value
15456     * var enabled = controller.enabled();
15457     *
15458     * // disable the controller
15459     * controller.enabled(false);
15460     *
15461     * @param {boolean} [newState] - The new enabled state of the controller `true` or `false`.
15462     * @returns {(boolean|Controller)} Current enabled state or parent object for chaining.
15463     */
15464    this.enabled = function (newState) {
15465      if (!arguments.length) {
15466        // get
15467        return _enabled;
15468      } else if (_enabled != newState) {
15469        // set
15470        _enabled = !!newState;
15471        Controller.updateScene(_sceneObjects, true);
15472      }
15473      return Controller;
15474    };
15475
15476    /**
15477     * Destroy the Controller, all Scenes and everything.
15478     * @public
15479     *
15480     * @example
15481     * // without resetting the scenes
15482     * controller = controller.destroy();
15483     *
15484     * // with scene reset
15485     * controller = controller.destroy(true);
15486     *
15487     * @param {boolean} [resetScenes=false] - If `true` the pins and tweens (if existent) of all scenes will be reset.
15488     * @returns {null} Null to unset handler variables.
15489     */
15490    this.destroy = function (resetScenes) {
15491      window.clearTimeout(_refreshTimeout);
15492      var i = _sceneObjects.length;
15493      while (i--) {
15494        _sceneObjects[i].destroy(resetScenes);
15495      }
15496      _options.container.removeEventListener("resize", onChange);
15497      _options.container.removeEventListener("scroll", onChange);
15498      _util.cAF(_updateTimeout);
15499      log(3, "destroyed " + NAMESPACE + " (reset: " + (resetScenes ? "true" : "false") + ")");
15500      return null;
15501    };
15502
15503    // INIT
15504    construct();
15505    return Controller;
15506  };
15507
15508  // store pagewide controller options
15509  var CONTROLLER_OPTIONS = {
15510    defaults: {
15511      container: window,
15512      vertical: true,
15513      globalSceneOptions: {},
15514      loglevel: 2,
15515      refreshInterval: 100
15516    }
15517  };
15518  /*
15519   * method used to add an option to ScrollMagic Scenes.
15520   */
15521  ScrollMagic.Controller.addOption = function (name, defaultValue) {
15522    CONTROLLER_OPTIONS.defaults[name] = defaultValue;
15523  };
15524  // instance extension function for plugins
15525  ScrollMagic.Controller.extend = function (extension) {
15526    var oldClass = this;
15527    ScrollMagic.Controller = function () {
15528      oldClass.apply(this, arguments);
15529      this.$super = _util.extend({}, this); // copy parent state
15530      return extension.apply(this, arguments) || this;
15531    };
15532    _util.extend(ScrollMagic.Controller, oldClass); // copy properties
15533    ScrollMagic.Controller.prototype = oldClass.prototype; // copy prototype
15534    ScrollMagic.Controller.prototype.constructor = ScrollMagic.Controller; // restore constructor
15535  };
15536
15537  /**
15538   * A Scene defines where the controller should react and how.
15539   *
15540   * @class
15541   *
15542   * @example
15543   * // create a standard scene and add it to a controller
15544   * new ScrollMagic.Scene()
15545   *		.addTo(controller);
15546   *
15547   * // create a scene with custom options and assign a handler to it.
15548   * var scene = new ScrollMagic.Scene({
15549   * 		duration: 100,
15550   *		offset: 200,
15551   *		triggerHook: "onEnter",
15552   *		reverse: false
15553   * });
15554   *
15555   * @param {object} [options] - Options for the Scene. The options can be updated at any time.  
15556   							   Instead of setting the options for each scene individually you can also set them globally in the controller as the controllers `globalSceneOptions` option. The object accepts the same properties as the ones below.  
15557   							   When a scene is added to the controller the options defined using the Scene constructor will be overwritten by those set in `globalSceneOptions`.
15558   * @param {(number|string|function)} [options.duration=0] - The duration of the scene. 
15559   					Please see `Scene.duration()` for details.
15560   * @param {number} [options.offset=0] - Offset Value for the Trigger Position. If no triggerElement is defined this will be the scroll distance from the start of the page, after which the scene will start.
15561   * @param {(string|object)} [options.triggerElement=null] - Selector or DOM object that defines the start of the scene. If undefined the scene will start right at the start of the page (unless an offset is set).
15562   * @param {(number|string)} [options.triggerHook="onCenter"] - Can be a number between 0 and 1 defining the position of the trigger Hook in relation to the viewport.  
15563   															  Can also be defined using a string:
15564   															  ** `"onEnter"` => `1`
15565   															  ** `"onCenter"` => `0.5`
15566   															  ** `"onLeave"` => `0`
15567   * @param {boolean} [options.reverse=true] - Should the scene reverse, when scrolling up?
15568   * @param {number} [options.loglevel=2] - Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic.
15569   										  ** `0` => silent
15570   										  ** `1` => errors
15571   										  ** `2` => errors, warnings
15572   										  ** `3` => errors, warnings, debuginfo
15573   * 
15574   */
15575  ScrollMagic.Scene = function (options) {
15576    /*
15577     * ----------------------------------------------------------------
15578     * settings
15579     * ----------------------------------------------------------------
15580     */
15581
15582    var NAMESPACE = 'ScrollMagic.Scene',
15583      SCENE_STATE_BEFORE = 'BEFORE',
15584      SCENE_STATE_DURING = 'DURING',
15585      SCENE_STATE_AFTER = 'AFTER',
15586      DEFAULT_OPTIONS = SCENE_OPTIONS.defaults;
15587
15588    /*
15589     * ----------------------------------------------------------------
15590     * private vars
15591     * ----------------------------------------------------------------
15592     */
15593
15594    var Scene = this,
15595      _options = _util.extend({}, DEFAULT_OPTIONS, options),
15596      _state = SCENE_STATE_BEFORE,
15597      _progress = 0,
15598      _scrollOffset = {
15599        start: 0,
15600        end: 0
15601      },
15602      // reflects the controllers's scroll position for the start and end of the scene respectively
15603      _triggerPos = 0,
15604      _enabled = true,
15605      _durationUpdateMethod,
15606      _controller;
15607
15608    /**
15609     * Internal constructor function of the ScrollMagic Scene
15610     * @private
15611     */
15612    var construct = function () {
15613      for (var key in _options) {
15614        // check supplied options
15615        if (!DEFAULT_OPTIONS.hasOwnProperty(key)) {
15616          log(2, "WARNING: Unknown option \"" + key + "\"");
15617          delete _options[key];
15618        }
15619      }
15620      // add getters/setters for all possible options
15621      for (var optionName in DEFAULT_OPTIONS) {
15622        addSceneOption(optionName);
15623      }
15624      // validate all options
15625      validateOption();
15626    };
15627
15628    /*
15629     * ----------------------------------------------------------------
15630     * Event Management
15631     * ----------------------------------------------------------------
15632     */
15633
15634    var _listeners = {};
15635    /**
15636     * Scene start event.  
15637     * Fires whenever the scroll position its the starting point of the scene.  
15638     * It will also fire when scrolling back up going over the start position of the scene. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback.
15639     *
15640     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
15641     *
15642     * @event ScrollMagic.Scene#start
15643     *
15644     * @example
15645     * scene.on("start", function (event) {
15646     * 	console.log("Hit start point of scene.");
15647     * });
15648     *
15649     * @property {object} event - The event Object passed to each callback
15650     * @property {string} event.type - The name of the event
15651     * @property {Scene} event.target - The Scene object that triggered this event
15652     * @property {number} event.progress - Reflects the current progress of the scene
15653     * @property {string} event.state - The current state of the scene `"BEFORE"` or `"DURING"`
15654     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
15655     */
15656    /**
15657     * Scene end event.  
15658     * Fires whenever the scroll position its the ending point of the scene.  
15659     * It will also fire when scrolling back up from after the scene and going over its end position. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback.
15660     *
15661     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
15662     *
15663     * @event ScrollMagic.Scene#end
15664     *
15665     * @example
15666     * scene.on("end", function (event) {
15667     * 	console.log("Hit end point of scene.");
15668     * });
15669     *
15670     * @property {object} event - The event Object passed to each callback
15671     * @property {string} event.type - The name of the event
15672     * @property {Scene} event.target - The Scene object that triggered this event
15673     * @property {number} event.progress - Reflects the current progress of the scene
15674     * @property {string} event.state - The current state of the scene `"DURING"` or `"AFTER"`
15675     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
15676     */
15677    /**
15678     * Scene enter event.  
15679     * Fires whenever the scene enters the "DURING" state.  
15680     * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene enters its active scroll timeframe, regardless of the scroll-direction.
15681     *
15682     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
15683     *
15684     * @event ScrollMagic.Scene#enter
15685     *
15686     * @example
15687     * scene.on("enter", function (event) {
15688     * 	console.log("Scene entered.");
15689     * });
15690     *
15691     * @property {object} event - The event Object passed to each callback
15692     * @property {string} event.type - The name of the event
15693     * @property {Scene} event.target - The Scene object that triggered this event
15694     * @property {number} event.progress - Reflects the current progress of the scene
15695     * @property {string} event.state - The current state of the scene - always `"DURING"`
15696     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
15697     */
15698    /**
15699     * Scene leave event.  
15700     * Fires whenever the scene's state goes from "DURING" to either "BEFORE" or "AFTER".  
15701     * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene leaves its active scroll timeframe, regardless of the scroll-direction.
15702     *
15703     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
15704     *
15705     * @event ScrollMagic.Scene#leave
15706     *
15707     * @example
15708     * scene.on("leave", function (event) {
15709     * 	console.log("Scene left.");
15710     * });
15711     *
15712     * @property {object} event - The event Object passed to each callback
15713     * @property {string} event.type - The name of the event
15714     * @property {Scene} event.target - The Scene object that triggered this event
15715     * @property {number} event.progress - Reflects the current progress of the scene
15716     * @property {string} event.state - The current state of the scene `"BEFORE"` or `"AFTER"`
15717     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
15718     */
15719    /**
15720     * Scene update event.  
15721     * Fires whenever the scene is updated (but not necessarily changes the progress).
15722     *
15723     * @event ScrollMagic.Scene#update
15724     *
15725     * @example
15726     * scene.on("update", function (event) {
15727     * 	console.log("Scene updated.");
15728     * });
15729     *
15730     * @property {object} event - The event Object passed to each callback
15731     * @property {string} event.type - The name of the event
15732     * @property {Scene} event.target - The Scene object that triggered this event
15733     * @property {number} event.startPos - The starting position of the scene (in relation to the conainer)
15734     * @property {number} event.endPos - The ending position of the scene (in relation to the conainer)
15735     * @property {number} event.scrollPos - The current scroll position of the container
15736     */
15737    /**
15738     * Scene progress event.  
15739     * Fires whenever the progress of the scene changes.
15740     *
15741     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
15742     *
15743     * @event ScrollMagic.Scene#progress
15744     *
15745     * @example
15746     * scene.on("progress", function (event) {
15747     * 	console.log("Scene progress changed to " + event.progress);
15748     * });
15749     *
15750     * @property {object} event - The event Object passed to each callback
15751     * @property {string} event.type - The name of the event
15752     * @property {Scene} event.target - The Scene object that triggered this event
15753     * @property {number} event.progress - Reflects the current progress of the scene
15754     * @property {string} event.state - The current state of the scene `"BEFORE"`, `"DURING"` or `"AFTER"`
15755     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
15756     */
15757    /**
15758     * Scene change event.  
15759     * Fires whenvever a property of the scene is changed.
15760     *
15761     * @event ScrollMagic.Scene#change
15762     *
15763     * @example
15764     * scene.on("change", function (event) {
15765     * 	console.log("Scene Property \"" + event.what + "\" changed to " + event.newval);
15766     * });
15767     *
15768     * @property {object} event - The event Object passed to each callback
15769     * @property {string} event.type - The name of the event
15770     * @property {Scene} event.target - The Scene object that triggered this event
15771     * @property {string} event.what - Indicates what value has been changed
15772     * @property {mixed} event.newval - The new value of the changed property
15773     */
15774    /**
15775     * Scene shift event.  
15776     * Fires whenvever the start or end **scroll offset** of the scene change.
15777     * This happens explicitely, when one of these values change: `offset`, `duration` or `triggerHook`.
15778     * It will fire implicitly when the `triggerElement` changes, if the new element has a different position (most cases).
15779     * It will also fire implicitly when the size of the container changes and the triggerHook is anything other than `onLeave`.
15780     *
15781     * @event ScrollMagic.Scene#shift
15782     * @since 1.1.0
15783     *
15784     * @example
15785     * scene.on("shift", function (event) {
15786     * 	console.log("Scene moved, because the " + event.reason + " has changed.)");
15787     * });
15788     *
15789     * @property {object} event - The event Object passed to each callback
15790     * @property {string} event.type - The name of the event
15791     * @property {Scene} event.target - The Scene object that triggered this event
15792     * @property {string} event.reason - Indicates why the scene has shifted
15793     */
15794    /**
15795     * Scene destroy event.  
15796     * Fires whenvever the scene is destroyed.
15797     * This can be used to tidy up custom behaviour used in events.
15798     *
15799     * @event ScrollMagic.Scene#destroy
15800     * @since 1.1.0
15801     *
15802     * @example
15803     * scene.on("enter", function (event) {
15804     *        // add custom action
15805     *        $("#my-elem").left("200");
15806     *      })
15807     *      .on("destroy", function (event) {
15808     *        // reset my element to start position
15809     *        if (event.reset) {
15810     *          $("#my-elem").left("0");
15811     *        }
15812     *      });
15813     *
15814     * @property {object} event - The event Object passed to each callback
15815     * @property {string} event.type - The name of the event
15816     * @property {Scene} event.target - The Scene object that triggered this event
15817     * @property {boolean} event.reset - Indicates if the destroy method was called with reset `true` or `false`.
15818     */
15819    /**
15820     * Scene add event.  
15821     * Fires when the scene is added to a controller.
15822     * This is mostly used by plugins to know that change might be due.
15823     *
15824     * @event ScrollMagic.Scene#add
15825     * @since 2.0.0
15826     *
15827     * @example
15828     * scene.on("add", function (event) {
15829     * 	console.log('Scene was added to a new controller.');
15830     * });
15831     *
15832     * @property {object} event - The event Object passed to each callback
15833     * @property {string} event.type - The name of the event
15834     * @property {Scene} event.target - The Scene object that triggered this event
15835     * @property {boolean} event.controller - The controller object the scene was added to.
15836     */
15837    /**
15838     * Scene remove event.  
15839     * Fires when the scene is removed from a controller.
15840     * This is mostly used by plugins to know that change might be due.
15841     *
15842     * @event ScrollMagic.Scene#remove
15843     * @since 2.0.0
15844     *
15845     * @example
15846     * scene.on("remove", function (event) {
15847     * 	console.log('Scene was removed from its controller.');
15848     * });
15849     *
15850     * @property {object} event - The event Object passed to each callback
15851     * @property {string} event.type - The name of the event
15852     * @property {Scene} event.target - The Scene object that triggered this event
15853     */
15854
15855    /**
15856     * Add one ore more event listener.  
15857     * The callback function will be fired at the respective event, and an object containing relevant data will be passed to the callback.
15858     * @method ScrollMagic.Scene#on
15859     *
15860     * @example
15861     * function callback (event) {
15862     * 		console.log("Event fired! (" + event.type + ")");
15863     * }
15864     * // add listeners
15865     * scene.on("change update progress start end enter leave", callback);
15866     *
15867     * @param {string} names - The name or names of the event the callback should be attached to.
15868     * @param {function} callback - A function that should be executed, when the event is dispatched. An event object will be passed to the callback.
15869     * @returns {Scene} Parent object for chaining.
15870     */
15871    this.on = function (names, callback) {
15872      if (_util.type.Function(callback)) {
15873        names = names.trim().split(' ');
15874        names.forEach(function (fullname) {
15875          var nameparts = fullname.split('.'),
15876            eventname = nameparts[0],
15877            namespace = nameparts[1];
15878          if (eventname != "*") {
15879            // disallow wildcards
15880            if (!_listeners[eventname]) {
15881              _listeners[eventname] = [];
15882            }
15883            _listeners[eventname].push({
15884              namespace: namespace || '',
15885              callback: callback
15886            });
15887          }
15888        });
15889      } else {
15890        log(1, "ERROR when calling '.on()': Supplied callback for '" + names + "' is not a valid function!");
15891      }
15892      return Scene;
15893    };
15894
15895    /**
15896     * Remove one or more event listener.
15897     * @method ScrollMagic.Scene#off
15898     *
15899     * @example
15900     * function callback (event) {
15901     * 		console.log("Event fired! (" + event.type + ")");
15902     * }
15903     * // add listeners
15904     * scene.on("change update", callback);
15905     * // remove listeners
15906     * scene.off("change update", callback);
15907     *
15908     * @param {string} names - The name or names of the event that should be removed.
15909     * @param {function} [callback] - A specific callback function that should be removed. If none is passed all callbacks to the event listener will be removed.
15910     * @returns {Scene} Parent object for chaining.
15911     */
15912    this.off = function (names, callback) {
15913      if (!names) {
15914        log(1, "ERROR: Invalid event name supplied.");
15915        return Scene;
15916      }
15917      names = names.trim().split(' ');
15918      names.forEach(function (fullname, key) {
15919        var nameparts = fullname.split('.'),
15920          eventname = nameparts[0],
15921          namespace = nameparts[1] || '',
15922          removeList = eventname === '*' ? Object.keys(_listeners) : [eventname];
15923        removeList.forEach(function (remove) {
15924          var list = _listeners[remove] || [],
15925            i = list.length;
15926          while (i--) {
15927            var listener = list[i];
15928            if (listener && (namespace === listener.namespace || namespace === '*') && (!callback || callback == listener.callback)) {
15929              list.splice(i, 1);
15930            }
15931          }
15932          if (!list.length) {
15933            delete _listeners[remove];
15934          }
15935        });
15936      });
15937      return Scene;
15938    };
15939
15940    /**
15941     * Trigger an event.
15942     * @method ScrollMagic.Scene#trigger
15943     *
15944     * @example
15945     * this.trigger("change");
15946     *
15947     * @param {string} name - The name of the event that should be triggered.
15948     * @param {object} [vars] - An object containing info that should be passed to the callback.
15949     * @returns {Scene} Parent object for chaining.
15950     */
15951    this.trigger = function (name, vars) {
15952      if (name) {
15953        var nameparts = name.trim().split('.'),
15954          eventname = nameparts[0],
15955          namespace = nameparts[1],
15956          listeners = _listeners[eventname];
15957        log(3, 'event fired:', eventname, vars ? "->" : '', vars || '');
15958        if (listeners) {
15959          listeners.forEach(function (listener, key) {
15960            if (!namespace || namespace === listener.namespace) {
15961              listener.callback.call(Scene, new ScrollMagic.Event(eventname, listener.namespace, Scene, vars));
15962            }
15963          });
15964        }
15965      } else {
15966        log(1, "ERROR: Invalid event name supplied.");
15967      }
15968      return Scene;
15969    };
15970
15971    // set event listeners
15972    Scene.on("change.internal", function (e) {
15973      if (e.what !== "loglevel" && e.what !== "tweenChanges") {
15974        // no need for a scene update scene with these options...
15975        if (e.what === "triggerElement") {
15976          updateTriggerElementPosition();
15977        } else if (e.what === "reverse") {
15978          // the only property left that may have an impact on the current scene state. Everything else is handled by the shift event.
15979          Scene.update();
15980        }
15981      }
15982    }).on("shift.internal", function (e) {
15983      updateScrollOffset();
15984      Scene.update(); // update scene to reflect new position
15985    });
15986
15987    /**
15988     * Send a debug message to the console.
15989     * @private
15990     * but provided publicly with _log for plugins
15991     *
15992     * @param {number} loglevel - The loglevel required to initiate output for the message.
15993     * @param {...mixed} output - One or more variables that should be passed to the console.
15994     */
15995    var log = this._log = function (loglevel, output) {
15996      if (_options.loglevel >= loglevel) {
15997        Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ") ->");
15998        _util.log.apply(window, arguments);
15999      }
16000    };
16001
16002    /**
16003     * Add the scene to a controller.  
16004     * This is the equivalent to `Controller.addScene(scene)`.
16005     * @method ScrollMagic.Scene#addTo
16006     *
16007     * @example
16008     * // add a scene to a ScrollMagic Controller
16009     * scene.addTo(controller);
16010     *
16011     * @param {ScrollMagic.Controller} controller - The controller to which the scene should be added.
16012     * @returns {Scene} Parent object for chaining.
16013     */
16014    this.addTo = function (controller) {
16015      if (!(controller instanceof ScrollMagic.Controller)) {
16016        log(1, "ERROR: supplied argument of 'addTo()' is not a valid ScrollMagic Controller");
16017      } else if (_controller != controller) {
16018        // new controller
16019        if (_controller) {
16020          // was associated to a different controller before, so remove it...
16021          _controller.removeScene(Scene);
16022        }
16023        _controller = controller;
16024        validateOption();
16025        updateDuration(true);
16026        updateTriggerElementPosition(true);
16027        updateScrollOffset();
16028        _controller.info("container").addEventListener('resize', onContainerResize);
16029        controller.addScene(Scene);
16030        Scene.trigger("add", {
16031          controller: _controller
16032        });
16033        log(3, "added " + NAMESPACE + " to controller");
16034        Scene.update();
16035      }
16036      return Scene;
16037    };
16038
16039    /**
16040     * **Get** or **Set** the current enabled state of the scene.  
16041     * This can be used to disable this scene without removing or destroying it.
16042     * @method ScrollMagic.Scene#enabled
16043     *
16044     * @example
16045     * // get the current value
16046     * var enabled = scene.enabled();
16047     *
16048     * // disable the scene
16049     * scene.enabled(false);
16050     *
16051     * @param {boolean} [newState] - The new enabled state of the scene `true` or `false`.
16052     * @returns {(boolean|Scene)} Current enabled state or parent object for chaining.
16053     */
16054    this.enabled = function (newState) {
16055      if (!arguments.length) {
16056        // get
16057        return _enabled;
16058      } else if (_enabled != newState) {
16059        // set
16060        _enabled = !!newState;
16061        Scene.update(true);
16062      }
16063      return Scene;
16064    };
16065
16066    /**
16067     * Remove the scene from the controller.  
16068     * This is the equivalent to `Controller.removeScene(scene)`.
16069     * The scene will not be updated anymore until you readd it to a controller.
16070     * To remove the pin or the tween you need to call removeTween() or removePin() respectively.
16071     * @method ScrollMagic.Scene#remove
16072     * @example
16073     * // remove the scene from its controller
16074     * scene.remove();
16075     *
16076     * @returns {Scene} Parent object for chaining.
16077     */
16078    this.remove = function () {
16079      if (_controller) {
16080        _controller.info("container").removeEventListener('resize', onContainerResize);
16081        var tmpParent = _controller;
16082        _controller = undefined;
16083        tmpParent.removeScene(Scene);
16084        Scene.trigger("remove");
16085        log(3, "removed " + NAMESPACE + " from controller");
16086      }
16087      return Scene;
16088    };
16089
16090    /**
16091     * Destroy the scene and everything.
16092     * @method ScrollMagic.Scene#destroy
16093     * @example
16094     * // destroy the scene without resetting the pin and tween to their initial positions
16095     * scene = scene.destroy();
16096     *
16097     * // destroy the scene and reset the pin and tween
16098     * scene = scene.destroy(true);
16099     *
16100     * @param {boolean} [reset=false] - If `true` the pin and tween (if existent) will be reset.
16101     * @returns {null} Null to unset handler variables.
16102     */
16103    this.destroy = function (reset) {
16104      Scene.trigger("destroy", {
16105        reset: reset
16106      });
16107      Scene.remove();
16108      Scene.off("*.*");
16109      log(3, "destroyed " + NAMESPACE + " (reset: " + (reset ? "true" : "false") + ")");
16110      return null;
16111    };
16112
16113    /**
16114     * Updates the Scene to reflect the current state.  
16115     * This is the equivalent to `Controller.updateScene(scene, immediately)`.  
16116     * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container.  
16117     * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress.
16118     * This means an update doesn't necessarily result in a progress change. The `progress` event will be fired if the progress has indeed changed between this update and the last.  
16119     * _**NOTE:** This method gets called constantly whenever ScrollMagic detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._
16120     * @method ScrollMagic.Scene#update
16121     * @example
16122     * // update the scene on next tick
16123     * scene.update();
16124     *
16125     * // update the scene immediately
16126     * scene.update(true);
16127     *
16128     * @fires Scene.update
16129     *
16130     * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance).
16131     * @returns {Scene} Parent object for chaining.
16132     */
16133    this.update = function (immediately) {
16134      if (_controller) {
16135        if (immediately) {
16136          if (_controller.enabled() && _enabled) {
16137            var scrollPos = _controller.info("scrollPos"),
16138              newProgress;
16139            if (_options.duration > 0) {
16140              newProgress = (scrollPos - _scrollOffset.start) / (_scrollOffset.end - _scrollOffset.start);
16141            } else {
16142              newProgress = scrollPos >= _scrollOffset.start ? 1 : 0;
16143            }
16144            Scene.trigger("update", {
16145              startPos: _scrollOffset.start,
16146              endPos: _scrollOffset.end,
16147              scrollPos: scrollPos
16148            });
16149            Scene.progress(newProgress);
16150          } else if (_pin && _state === SCENE_STATE_DURING) {
16151            updatePinState(true); // unpin in position
16152          }
16153        } else {
16154          _controller.updateScene(Scene, false);
16155        }
16156      }
16157      return Scene;
16158    };
16159
16160    /**
16161     * Updates dynamic scene variables like the trigger element position or the duration.
16162     * This method is automatically called in regular intervals from the controller. See {@link ScrollMagic.Controller} option `refreshInterval`.
16163     * 
16164     * You can call it to minimize lag, for example when you intentionally change the position of the triggerElement.
16165     * If you don't it will simply be updated in the next refresh interval of the container, which is usually sufficient.
16166     *
16167     * @method ScrollMagic.Scene#refresh
16168     * @since 1.1.0
16169     * @example
16170     * scene = new ScrollMagic.Scene({triggerElement: "#trigger"});
16171     * 
16172     * // change the position of the trigger
16173     * $("#trigger").css("top", 500);
16174     * // immediately let the scene know of this change
16175     * scene.refresh();
16176     *
16177     * @fires {@link Scene.shift}, if the trigger element position or the duration changed
16178     * @fires {@link Scene.change}, if the duration changed
16179     *
16180     * @returns {Scene} Parent object for chaining.
16181     */
16182    this.refresh = function () {
16183      updateDuration();
16184      updateTriggerElementPosition();
16185      // update trigger element position
16186      return Scene;
16187    };
16188
16189    /**
16190     * **Get** or **Set** the scene's progress.  
16191     * Usually it shouldn't be necessary to use this as a setter, as it is set automatically by scene.update().  
16192     * The order in which the events are fired depends on the duration of the scene:
16193     *  1. Scenes with `duration == 0`:  
16194     *  Scenes that have no duration by definition have no ending. Thus the `end` event will never be fired.  
16195     *  When the trigger position of the scene is passed the events are always fired in this order:  
16196     *  `enter`, `start`, `progress` when scrolling forward  
16197     *  and  
16198     *  `progress`, `start`, `leave` when scrolling in reverse
16199     *  2. Scenes with `duration > 0`:  
16200     *  Scenes with a set duration have a defined start and end point.  
16201     *  When scrolling past the start position of the scene it will fire these events in this order:  
16202     *  `enter`, `start`, `progress`  
16203     *  When continuing to scroll and passing the end point it will fire these events:  
16204     *  `progress`, `end`, `leave`  
16205     *  When reversing through the end point these events are fired:  
16206     *  `enter`, `end`, `progress`  
16207     *  And when continuing to scroll past the start position in reverse it will fire:  
16208     *  `progress`, `start`, `leave`  
16209     *  In between start and end the `progress` event will be called constantly, whenever the progress changes.
16210     * 
16211     * In short:  
16212     * `enter` events will always trigger **before** the progress update and `leave` envents will trigger **after** the progress update.  
16213     * `start` and `end` will always trigger at their respective position.
16214     * 
16215     * Please review the event descriptions for details on the events and the event object that is passed to the callback.
16216     * 
16217     * @method ScrollMagic.Scene#progress
16218     * @example
16219     * // get the current scene progress
16220     * var progress = scene.progress();
16221     *
16222     * // set new scene progress
16223     * scene.progress(0.3);
16224     *
16225     * @fires {@link Scene.enter}, when used as setter
16226     * @fires {@link Scene.start}, when used as setter
16227     * @fires {@link Scene.progress}, when used as setter
16228     * @fires {@link Scene.end}, when used as setter
16229     * @fires {@link Scene.leave}, when used as setter
16230     *
16231     * @param {number} [progress] - The new progress value of the scene `[0-1]`.
16232     * @returns {number} `get` -  Current scene progress.
16233     * @returns {Scene} `set` -  Parent object for chaining.
16234     */
16235    this.progress = function (progress) {
16236      if (!arguments.length) {
16237        // get
16238        return _progress;
16239      } else {
16240        // set
16241        var doUpdate = false,
16242          oldState = _state,
16243          scrollDirection = _controller ? _controller.info("scrollDirection") : 'PAUSED',
16244          reverseOrForward = _options.reverse || progress >= _progress;
16245        if (_options.duration === 0) {
16246          // zero duration scenes
16247          doUpdate = _progress != progress;
16248          _progress = progress < 1 && reverseOrForward ? 0 : 1;
16249          _state = _progress === 0 ? SCENE_STATE_BEFORE : SCENE_STATE_DURING;
16250        } else {
16251          // scenes with start and end
16252          if (progress < 0 && _state !== SCENE_STATE_BEFORE && reverseOrForward) {
16253            // go back to initial state
16254            _progress = 0;
16255            _state = SCENE_STATE_BEFORE;
16256            doUpdate = true;
16257          } else if (progress >= 0 && progress < 1 && reverseOrForward) {
16258            _progress = progress;
16259            _state = SCENE_STATE_DURING;
16260            doUpdate = true;
16261          } else if (progress >= 1 && _state !== SCENE_STATE_AFTER) {
16262            _progress = 1;
16263            _state = SCENE_STATE_AFTER;
16264            doUpdate = true;
16265          } else if (_state === SCENE_STATE_DURING && !reverseOrForward) {
16266            updatePinState(); // in case we scrolled backwards mid-scene and reverse is disabled => update the pin position, so it doesn't move back as well.
16267          }
16268        }
16269        if (doUpdate) {
16270          // fire events
16271          var eventVars = {
16272              progress: _progress,
16273              state: _state,
16274              scrollDirection: scrollDirection
16275            },
16276            stateChanged = _state != oldState;
16277          var trigger = function (eventName) {
16278            // tmp helper to simplify code
16279            Scene.trigger(eventName, eventVars);
16280          };
16281          if (stateChanged) {
16282            // enter events
16283            if (oldState !== SCENE_STATE_DURING) {
16284              trigger("enter");
16285              trigger(oldState === SCENE_STATE_BEFORE ? "start" : "end");
16286            }
16287          }
16288          trigger("progress");
16289          if (stateChanged) {
16290            // leave events
16291            if (_state !== SCENE_STATE_DURING) {
16292              trigger(_state === SCENE_STATE_BEFORE ? "start" : "end");
16293              trigger("leave");
16294            }
16295          }
16296        }
16297        return Scene;
16298      }
16299    };
16300
16301    /**
16302     * Update the start and end scrollOffset of the container.
16303     * The positions reflect what the controller's scroll position will be at the start and end respectively.
16304     * Is called, when:
16305     *   - Scene event "change" is called with: offset, triggerHook, duration 
16306     *   - scroll container event "resize" is called
16307     *   - the position of the triggerElement changes
16308     *   - the controller changes -> addTo()
16309     * @private
16310     */
16311    var updateScrollOffset = function () {
16312      _scrollOffset = {
16313        start: _triggerPos + _options.offset
16314      };
16315      if (_controller && _options.triggerElement) {
16316        // take away triggerHook portion to get relative to top
16317        _scrollOffset.start -= _controller.info("size") * _options.triggerHook;
16318      }
16319      _scrollOffset.end = _scrollOffset.start + _options.duration;
16320    };
16321
16322    /**
16323     * Updates the duration if set to a dynamic function.
16324     * This method is called when the scene is added to a controller and in regular intervals from the controller through scene.refresh().
16325     * 
16326     * @fires {@link Scene.change}, if the duration changed
16327     * @fires {@link Scene.shift}, if the duration changed
16328     *
16329     * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed.
16330     * @private
16331     */
16332    var updateDuration = function (suppressEvents) {
16333      // update duration
16334      if (_durationUpdateMethod) {
16335        var varname = "duration";
16336        if (changeOption(varname, _durationUpdateMethod.call(Scene)) && !suppressEvents) {
16337          // set
16338          Scene.trigger("change", {
16339            what: varname,
16340            newval: _options[varname]
16341          });
16342          Scene.trigger("shift", {
16343            reason: varname
16344          });
16345        }
16346      }
16347    };
16348
16349    /**
16350     * Updates the position of the triggerElement, if present.
16351     * This method is called ...
16352     *  - ... when the triggerElement is changed
16353     *  - ... when the scene is added to a (new) controller
16354     *  - ... in regular intervals from the controller through scene.refresh().
16355     * 
16356     * @fires {@link Scene.shift}, if the position changed
16357     *
16358     * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed.
16359     * @private
16360     */
16361    var updateTriggerElementPosition = function (suppressEvents) {
16362      var elementPos = 0,
16363        telem = _options.triggerElement;
16364      if (_controller && (telem || _triggerPos > 0)) {
16365        // either an element exists or was removed and the triggerPos is still > 0
16366        if (telem) {
16367          // there currently a triggerElement set
16368          if (telem.parentNode) {
16369            // check if element is still attached to DOM
16370            var controllerInfo = _controller.info(),
16371              containerOffset = _util.get.offset(controllerInfo.container),
16372              // container position is needed because element offset is returned in relation to document, not in relation to container.
16373              param = controllerInfo.vertical ? "top" : "left"; // which param is of interest ?
16374
16375            // if parent is spacer, use spacer position instead so correct start position is returned for pinned elements.
16376            while (telem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
16377              telem = telem.parentNode;
16378            }
16379            var elementOffset = _util.get.offset(telem);
16380            if (!controllerInfo.isDocument) {
16381              // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent
16382              containerOffset[param] -= _controller.scrollPos();
16383            }
16384            elementPos = elementOffset[param] - containerOffset[param];
16385          } else {
16386            // there was an element, but it was removed from DOM
16387            log(2, "WARNING: triggerElement was removed from DOM and will be reset to", undefined);
16388            Scene.triggerElement(undefined); // unset, so a change event is triggered
16389          }
16390        }
16391        var changed = elementPos != _triggerPos;
16392        _triggerPos = elementPos;
16393        if (changed && !suppressEvents) {
16394          Scene.trigger("shift", {
16395            reason: "triggerElementPosition"
16396          });
16397        }
16398      }
16399    };
16400
16401    /**
16402     * Trigger a shift event, when the container is resized and the triggerHook is > 1.
16403     * @private
16404     */
16405    var onContainerResize = function (e) {
16406      if (_options.triggerHook > 0) {
16407        Scene.trigger("shift", {
16408          reason: "containerResize"
16409        });
16410      }
16411    };
16412    var _validate = _util.extend(SCENE_OPTIONS.validate, {
16413      // validation for duration handled internally for reference to private var _durationMethod
16414      duration: function (val) {
16415        if (_util.type.String(val) && val.match(/^(\.|\d)*\d+%$/)) {
16416          // percentage value
16417          var perc = parseFloat(val) / 100;
16418          val = function () {
16419            return _controller ? _controller.info("size") * perc : 0;
16420          };
16421        }
16422        if (_util.type.Function(val)) {
16423          // function
16424          _durationUpdateMethod = val;
16425          try {
16426            val = parseFloat(_durationUpdateMethod.call(Scene));
16427          } catch (e) {
16428            val = -1; // will cause error below
16429          }
16430        }
16431        // val has to be float
16432        val = parseFloat(val);
16433        if (!_util.type.Number(val) || val < 0) {
16434          if (_durationUpdateMethod) {
16435            _durationUpdateMethod = undefined;
16436            throw ["Invalid return value of supplied function for option \"duration\":", val];
16437          } else {
16438            throw ["Invalid value for option \"duration\":", val];
16439          }
16440        }
16441        return val;
16442      }
16443    });
16444
16445    /**
16446     * Checks the validity of a specific or all options and reset to default if neccessary.
16447     * @private
16448     */
16449    var validateOption = function (check) {
16450      check = arguments.length ? [check] : Object.keys(_validate);
16451      check.forEach(function (optionName, key) {
16452        var value;
16453        if (_validate[optionName]) {
16454          // there is a validation method for this option
16455          try {
16456            // validate value
16457            value = _validate[optionName](_options[optionName]);
16458          } catch (e) {
16459            // validation failed -> reset to default
16460            value = DEFAULT_OPTIONS[optionName];
16461            var logMSG = _util.type.String(e) ? [e] : e;
16462            if (_util.type.Array(logMSG)) {
16463              logMSG[0] = "ERROR: " + logMSG[0];
16464              logMSG.unshift(1); // loglevel 1 for error msg
16465              log.apply(this, logMSG);
16466            } else {
16467              log(1, "ERROR: Problem executing validation callback for option '" + optionName + "':", e.message);
16468            }
16469          } finally {
16470            _options[optionName] = value;
16471          }
16472        }
16473      });
16474    };
16475
16476    /**
16477     * Helper used by the setter/getters for scene options
16478     * @private
16479     */
16480    var changeOption = function (varname, newval) {
16481      var changed = false,
16482        oldval = _options[varname];
16483      if (_options[varname] != newval) {
16484        _options[varname] = newval;
16485        validateOption(varname); // resets to default if necessary
16486        changed = oldval != _options[varname];
16487      }
16488      return changed;
16489    };
16490
16491    // generate getters/setters for all options
16492    var addSceneOption = function (optionName) {
16493      if (!Scene[optionName]) {
16494        Scene[optionName] = function (newVal) {
16495          if (!arguments.length) {
16496            // get
16497            return _options[optionName];
16498          } else {
16499            if (optionName === "duration") {
16500              // new duration is set, so any previously set function must be unset
16501              _durationUpdateMethod = undefined;
16502            }
16503            if (changeOption(optionName, newVal)) {
16504              // set
16505              Scene.trigger("change", {
16506                what: optionName,
16507                newval: _options[optionName]
16508              });
16509              if (SCENE_OPTIONS.shifts.indexOf(optionName) > -1) {
16510                Scene.trigger("shift", {
16511                  reason: optionName
16512                });
16513              }
16514            }
16515          }
16516          return Scene;
16517        };
16518      }
16519    };
16520
16521    /**
16522     * **Get** or **Set** the duration option value.
16523     *
16524     * As a **setter** it accepts three types of parameters:
16525     * 1. `number`: Sets the duration of the scene to exactly this amount of pixels.  
16526     *   This means the scene will last for exactly this amount of pixels scrolled. Sub-Pixels are also valid.
16527     *   A value of `0` means that the scene is 'open end' and no end will be triggered. Pins will never unpin and animations will play independently of scroll progress.
16528     * 2. `string`: Always updates the duration relative to parent scroll container.  
16529     *   For example `"100%"` will keep the duration always exactly at the inner height of the scroll container.
16530     *   When scrolling vertically the width is used for reference respectively.
16531     * 3. `function`: The supplied function will be called to return the scene duration.
16532     *   This is useful in setups where the duration depends on other elements who might change size. By supplying a function you can return a value instead of updating potentially multiple scene durations.  
16533     *   The scene can be referenced inside the callback using `this`.
16534     *   _**WARNING:** This is an easy way to kill performance, as the callback will be executed every time `Scene.refresh()` is called, which happens a lot. The interval is defined by the controller (see ScrollMagic.Controller option `refreshInterval`).  
16535     *   It's recomended to avoid calculations within the function and use cached variables as return values.  
16536     *   This counts double if you use the same function for multiple scenes._
16537     *
16538     * @method ScrollMagic.Scene#duration
16539     * @example
16540     * // get the current duration value
16541     * var duration = scene.duration();
16542     *
16543     * // set a new duration
16544     * scene.duration(300);
16545     *
16546     * // set duration responsively to container size
16547     * scene.duration("100%");
16548     *
16549     * // use a function to randomize the duration for some reason.
16550     * var durationValueCache;
16551     * function durationCallback () {
16552     *   return durationValueCache;
16553     * }
16554     * function updateDuration () {
16555     *   durationValueCache = Math.random() * 100;
16556     * }
16557     * updateDuration(); // set to initial value
16558     * scene.duration(durationCallback); // set duration callback
16559     *
16560     * @fires {@link Scene.change}, when used as setter
16561     * @fires {@link Scene.shift}, when used as setter
16562     * @param {(number|string|function)} [newDuration] - The new duration setting for the scene.
16563     * @returns {number} `get` -  Current scene duration.
16564     * @returns {Scene} `set` -  Parent object for chaining.
16565     */
16566
16567    /**
16568     * **Get** or **Set** the offset option value.
16569     * @method ScrollMagic.Scene#offset
16570     * @example
16571     * // get the current offset
16572     * var offset = scene.offset();
16573     *
16574     * // set a new offset
16575     * scene.offset(100);
16576     *
16577     * @fires {@link Scene.change}, when used as setter
16578     * @fires {@link Scene.shift}, when used as setter
16579     * @param {number} [newOffset] - The new offset of the scene.
16580     * @returns {number} `get` -  Current scene offset.
16581     * @returns {Scene} `set` -  Parent object for chaining.
16582     */
16583
16584    /**
16585     * **Get** or **Set** the triggerElement option value.
16586     * Does **not** fire `Scene.shift`, because changing the trigger Element doesn't necessarily mean the start position changes. This will be determined in `Scene.refresh()`, which is automatically triggered.
16587     * @method ScrollMagic.Scene#triggerElement
16588     * @example
16589     * // get the current triggerElement
16590     * var triggerElement = scene.triggerElement();
16591     *
16592     * // set a new triggerElement using a selector
16593     * scene.triggerElement("#trigger");
16594     * // set a new triggerElement using a DOM object
16595     * scene.triggerElement(document.getElementById("trigger"));
16596     *
16597     * @fires {@link Scene.change}, when used as setter
16598     * @param {(string|object)} [newTriggerElement] - The new trigger element for the scene.
16599     * @returns {(string|object)} `get` -  Current triggerElement.
16600     * @returns {Scene} `set` -  Parent object for chaining.
16601     */
16602
16603    /**
16604     * **Get** or **Set** the triggerHook option value.
16605     * @method ScrollMagic.Scene#triggerHook
16606     * @example
16607     * // get the current triggerHook value
16608     * var triggerHook = scene.triggerHook();
16609     *
16610     * // set a new triggerHook using a string
16611     * scene.triggerHook("onLeave");
16612     * // set a new triggerHook using a number
16613     * scene.triggerHook(0.7);
16614     *
16615     * @fires {@link Scene.change}, when used as setter
16616     * @fires {@link Scene.shift}, when used as setter
16617     * @param {(number|string)} [newTriggerHook] - The new triggerHook of the scene. See {@link Scene} parameter description for value options.
16618     * @returns {number} `get` -  Current triggerHook (ALWAYS numerical).
16619     * @returns {Scene} `set` -  Parent object for chaining.
16620     */
16621
16622    /**
16623     * **Get** or **Set** the reverse option value.
16624     * @method ScrollMagic.Scene#reverse
16625     * @example
16626     * // get the current reverse option
16627     * var reverse = scene.reverse();
16628     *
16629     * // set new reverse option
16630     * scene.reverse(false);
16631     *
16632     * @fires {@link Scene.change}, when used as setter
16633     * @param {boolean} [newReverse] - The new reverse setting of the scene.
16634     * @returns {boolean} `get` -  Current reverse option value.
16635     * @returns {Scene} `set` -  Parent object for chaining.
16636     */
16637
16638    /**
16639     * **Get** or **Set** the loglevel option value.
16640     * @method ScrollMagic.Scene#loglevel
16641     * @example
16642     * // get the current loglevel
16643     * var loglevel = scene.loglevel();
16644     *
16645     * // set new loglevel
16646     * scene.loglevel(3);
16647     *
16648     * @fires {@link Scene.change}, when used as setter
16649     * @param {number} [newLoglevel] - The new loglevel setting of the scene. `[0-3]`
16650     * @returns {number} `get` -  Current loglevel.
16651     * @returns {Scene} `set` -  Parent object for chaining.
16652     */
16653
16654    /**
16655     * **Get** the associated controller.
16656     * @method ScrollMagic.Scene#controller
16657     * @example
16658     * // get the controller of a scene
16659     * var controller = scene.controller();
16660     *
16661     * @returns {ScrollMagic.Controller} Parent controller or `undefined`
16662     */
16663    this.controller = function () {
16664      return _controller;
16665    };
16666
16667    /**
16668     * **Get** the current state.
16669     * @method ScrollMagic.Scene#state
16670     * @example
16671     * // get the current state
16672     * var state = scene.state();
16673     *
16674     * @returns {string} `"BEFORE"`, `"DURING"` or `"AFTER"`
16675     */
16676    this.state = function () {
16677      return _state;
16678    };
16679
16680    /**
16681     * **Get** the current scroll offset for the start of the scene.  
16682     * Mind, that the scrollOffset is related to the size of the container, if `triggerHook` is bigger than `0` (or `"onLeave"`).  
16683     * This means, that resizing the container or changing the `triggerHook` will influence the scene's start offset.
16684     * @method ScrollMagic.Scene#scrollOffset
16685     * @example
16686     * // get the current scroll offset for the start and end of the scene.
16687     * var start = scene.scrollOffset();
16688     * var end = scene.scrollOffset() + scene.duration();
16689     * console.log("the scene starts at", start, "and ends at", end);
16690     *
16691     * @returns {number} The scroll offset (of the container) at which the scene will trigger. Y value for vertical and X value for horizontal scrolls.
16692     */
16693    this.scrollOffset = function () {
16694      return _scrollOffset.start;
16695    };
16696
16697    /**
16698     * **Get** the trigger position of the scene (including the value of the `offset` option).  
16699     * @method ScrollMagic.Scene#triggerPosition
16700     * @example
16701     * // get the scene's trigger position
16702     * var triggerPosition = scene.triggerPosition();
16703     *
16704     * @returns {number} Start position of the scene. Top position value for vertical and left position value for horizontal scrolls.
16705     */
16706    this.triggerPosition = function () {
16707      var pos = _options.offset; // the offset is the basis
16708      if (_controller) {
16709        // get the trigger position
16710        if (_options.triggerElement) {
16711          // Element as trigger
16712          pos += _triggerPos;
16713        } else {
16714          // return the height of the triggerHook to start at the beginning
16715          pos += _controller.info("size") * Scene.triggerHook();
16716        }
16717      }
16718      return pos;
16719    };
16720    var _pin, _pinOptions;
16721    Scene.on("shift.internal", function (e) {
16722      var durationChanged = e.reason === "duration";
16723      if (_state === SCENE_STATE_AFTER && durationChanged || _state === SCENE_STATE_DURING && _options.duration === 0) {
16724        // if [duration changed after a scene (inside scene progress updates pin position)] or [duration is 0, we are in pin phase and some other value changed].
16725        updatePinState();
16726      }
16727      if (durationChanged) {
16728        updatePinDimensions();
16729      }
16730    }).on("progress.internal", function (e) {
16731      updatePinState();
16732    }).on("add.internal", function (e) {
16733      updatePinDimensions();
16734    }).on("destroy.internal", function (e) {
16735      Scene.removePin(e.reset);
16736    });
16737    /**
16738     * Update the pin state.
16739     * @private
16740     */
16741    var updatePinState = function (forceUnpin) {
16742      if (_pin && _controller) {
16743        var containerInfo = _controller.info(),
16744          pinTarget = _pinOptions.spacer.firstChild; // may be pin element or another spacer, if cascading pins
16745
16746        if (!forceUnpin && _state === SCENE_STATE_DURING) {
16747          // during scene or if duration is 0 and we are past the trigger
16748          // pinned state
16749          if (_util.css(pinTarget, "position") != "fixed") {
16750            // change state before updating pin spacer (position changes due to fixed collapsing might occur.)
16751            _util.css(pinTarget, {
16752              "position": "fixed"
16753            });
16754            // update pin spacer
16755            updatePinDimensions();
16756          }
16757          var fixedPos = _util.get.offset(_pinOptions.spacer, true),
16758            // get viewport position of spacer
16759            scrollDistance = _options.reverse || _options.duration === 0 ? containerInfo.scrollPos - _scrollOffset.start // quicker
16760            : Math.round(_progress * _options.duration * 10) / 10; // if no reverse and during pin the position needs to be recalculated using the progress
16761
16762          // add scrollDistance
16763          fixedPos[containerInfo.vertical ? "top" : "left"] += scrollDistance;
16764
16765          // set new values
16766          _util.css(_pinOptions.spacer.firstChild, {
16767            top: fixedPos.top,
16768            left: fixedPos.left
16769          });
16770        } else {
16771          // unpinned state
16772          var newCSS = {
16773              position: _pinOptions.inFlow ? "relative" : "absolute",
16774              top: 0,
16775              left: 0
16776            },
16777            change = _util.css(pinTarget, "position") != newCSS.position;
16778          if (!_pinOptions.pushFollowers) {
16779            newCSS[containerInfo.vertical ? "top" : "left"] = _options.duration * _progress;
16780          } else if (_options.duration > 0) {
16781            // only concerns scenes with duration
16782            if (_state === SCENE_STATE_AFTER && parseFloat(_util.css(_pinOptions.spacer, "padding-top")) === 0) {
16783              change = true; // if in after state but havent updated spacer yet (jumped past pin)
16784            } else if (_state === SCENE_STATE_BEFORE && parseFloat(_util.css(_pinOptions.spacer, "padding-bottom")) === 0) {
16785              // before
16786              change = true; // jumped past fixed state upward direction
16787            }
16788          }
16789          // set new values
16790          _util.css(pinTarget, newCSS);
16791          if (change) {
16792            // update pin spacer if state changed
16793            updatePinDimensions();
16794          }
16795        }
16796      }
16797    };
16798
16799    /**
16800     * Update the pin spacer and/or element size.
16801     * The size of the spacer needs to be updated whenever the duration of the scene changes, if it is to push down following elements.
16802     * @private
16803     */
16804    var updatePinDimensions = function () {
16805      if (_pin && _controller && _pinOptions.inFlow) {
16806        // no spacerresize, if original position is absolute
16807        var after = _state === SCENE_STATE_AFTER,
16808          before = _state === SCENE_STATE_BEFORE,
16809          during = _state === SCENE_STATE_DURING,
16810          vertical = _controller.info("vertical"),
16811          pinTarget = _pinOptions.spacer.firstChild,
16812          // usually the pined element but can also be another spacer (cascaded pins)
16813          marginCollapse = _util.isMarginCollapseType(_util.css(_pinOptions.spacer, "display")),
16814          css = {};
16815
16816        // set new size
16817        // if relsize: spacer -> pin | else: pin -> spacer
16818        if (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) {
16819          if (during) {
16820            _util.css(_pin, {
16821              "width": _util.get.width(_pinOptions.spacer)
16822            });
16823          } else {
16824            _util.css(_pin, {
16825              "width": "100%"
16826            });
16827          }
16828        } else {
16829          // minwidth is needed for cascaded pins.
16830          css["min-width"] = _util.get.width(vertical ? _pin : pinTarget, true, true);
16831          css.width = during ? css["min-width"] : "auto";
16832        }
16833        if (_pinOptions.relSize.height) {
16834          if (during) {
16835            // the only padding the spacer should ever include is the duration (if pushFollowers = true), so we need to substract that.
16836            _util.css(_pin, {
16837              "height": _util.get.height(_pinOptions.spacer) - (_pinOptions.pushFollowers ? _options.duration : 0)
16838            });
16839          } else {
16840            _util.css(_pin, {
16841              "height": "100%"
16842            });
16843          }
16844        } else {
16845          // margin is only included if it's a cascaded pin to resolve an IE9 bug
16846          css["min-height"] = _util.get.height(vertical ? pinTarget : _pin, true, !marginCollapse); // needed for cascading pins
16847          css.height = during ? css["min-height"] : "auto";
16848        }
16849
16850        // add space for duration if pushFollowers is true
16851        if (_pinOptions.pushFollowers) {
16852          css["padding" + (vertical ? "Top" : "Left")] = _options.duration * _progress;
16853          css["padding" + (vertical ? "Bottom" : "Right")] = _options.duration * (1 - _progress);
16854        }
16855        _util.css(_pinOptions.spacer, css);
16856      }
16857    };
16858
16859    /**
16860     * Updates the Pin state (in certain scenarios)
16861     * If the controller container is not the document and we are mid-pin-phase scrolling or resizing the main document can result to wrong pin positions.
16862     * So this function is called on resize and scroll of the document.
16863     * @private
16864     */
16865    var updatePinInContainer = function () {
16866      if (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info("isDocument")) {
16867        updatePinState();
16868      }
16869    };
16870
16871    /**
16872     * Updates the Pin spacer size state (in certain scenarios)
16873     * If container is resized during pin and relatively sized the size of the pin might need to be updated...
16874     * So this function is called on resize of the container.
16875     * @private
16876     */
16877    var updateRelativePinSpacer = function () {
16878      if (_controller && _pin &&
16879      // well, duh
16880      _state === SCENE_STATE_DURING && (
16881      // element in pinned state?
16882      // is width or height relatively sized, but not in relation to body? then we need to recalc.
16883      (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) && _util.get.width(window) != _util.get.width(_pinOptions.spacer.parentNode) || _pinOptions.relSize.height && _util.get.height(window) != _util.get.height(_pinOptions.spacer.parentNode))) {
16884        updatePinDimensions();
16885      }
16886    };
16887
16888    /**
16889     * Is called, when the mousewhel is used while over a pinned element inside a div container.
16890     * If the scene is in fixed state scroll events would be counted towards the body. This forwards the event to the scroll container.
16891     * @private
16892     */
16893    var onMousewheelOverPin = function (e) {
16894      if (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info("isDocument")) {
16895        // in pin state
16896        e.preventDefault();
16897        _controller._setScrollPos(_controller.info("scrollPos") - ((e.wheelDelta || e[_controller.info("vertical") ? "wheelDeltaY" : "wheelDeltaX"]) / 3 || -e.detail * 30));
16898      }
16899    };
16900
16901    /**
16902     * Pin an element for the duration of the scene.
16903     * If the scene duration is 0 the element will only be unpinned, if the user scrolls back past the start position.  
16904     * Make sure only one pin is applied to an element at the same time.
16905     * An element can be pinned multiple times, but only successively.
16906     * _**NOTE:** The option `pushFollowers` has no effect, when the scene duration is 0._
16907     * @method ScrollMagic.Scene#setPin
16908     * @example
16909     * // pin element and push all following elements down by the amount of the pin duration.
16910     * scene.setPin("#pin");
16911     *
16912     * // pin element and keeping all following elements in their place. The pinned element will move past them.
16913     * scene.setPin("#pin", {pushFollowers: false});
16914     *
16915     * @param {(string|object)} element - A Selector targeting an element or a DOM object that is supposed to be pinned.
16916     * @param {object} [settings] - settings for the pin
16917     * @param {boolean} [settings.pushFollowers=true] - If `true` following elements will be "pushed" down for the duration of the pin, if `false` the pinned element will just scroll past them.  
16918     												   Ignored, when duration is `0`.
16919     * @param {string} [settings.spacerClass="scrollmagic-pin-spacer"] - Classname of the pin spacer element, which is used to replace the element.
16920     *
16921     * @returns {Scene} Parent object for chaining.
16922     */
16923    this.setPin = function (element, settings) {
16924      var defaultSettings = {
16925        pushFollowers: true,
16926        spacerClass: "scrollmagic-pin-spacer"
16927      };
16928      var pushFollowersActivelySet = settings && settings.hasOwnProperty('pushFollowers');
16929      settings = _util.extend({}, defaultSettings, settings);
16930
16931      // validate Element
16932      element = _util.get.elements(element)[0];
16933      if (!element) {
16934        log(1, "ERROR calling method 'setPin()': Invalid pin element supplied.");
16935        return Scene; // cancel
16936      } else if (_util.css(element, "position") === "fixed") {
16937        log(1, "ERROR calling method 'setPin()': Pin does not work with elements that are positioned 'fixed'.");
16938        return Scene; // cancel
16939      }
16940      if (_pin) {
16941        // preexisting pin?
16942        if (_pin === element) {
16943          // same pin we already have -> do nothing
16944          return Scene; // cancel
16945        } else {
16946          // kill old pin
16947          Scene.removePin();
16948        }
16949      }
16950      _pin = element;
16951      var parentDisplay = _pin.parentNode.style.display,
16952        boundsParams = ["top", "left", "bottom", "right", "margin", "marginLeft", "marginRight", "marginTop", "marginBottom"];
16953      _pin.parentNode.style.display = 'none'; // hack start to force css to return stylesheet values instead of calculated px values.
16954      var inFlow = _util.css(_pin, "position") != "absolute",
16955        pinCSS = _util.css(_pin, boundsParams.concat(["display"])),
16956        sizeCSS = _util.css(_pin, ["width", "height"]);
16957      _pin.parentNode.style.display = parentDisplay; // hack end.
16958
16959      if (!inFlow && settings.pushFollowers) {
16960        log(2, "WARNING: If the pinned element is positioned absolutely pushFollowers will be disabled.");
16961        settings.pushFollowers = false;
16962      }
16963      window.setTimeout(function () {
16964        // wait until all finished, because with responsive duration it will only be set after scene is added to controller
16965        if (_pin && _options.duration === 0 && pushFollowersActivelySet && settings.pushFollowers) {
16966          log(2, "WARNING: pushFollowers =", true, "has no effect, when scene duration is 0.");
16967        }
16968      }, 0);
16969
16970      // create spacer and insert
16971      var spacer = _pin.parentNode.insertBefore(document.createElement('div'), _pin),
16972        spacerCSS = _util.extend(pinCSS, {
16973          position: inFlow ? "relative" : "absolute",
16974          boxSizing: "content-box",
16975          mozBoxSizing: "content-box",
16976          webkitBoxSizing: "content-box"
16977        });
16978      if (!inFlow) {
16979        // copy size if positioned absolutely, to work for bottom/right positioned elements.
16980        _util.extend(spacerCSS, _util.css(_pin, ["width", "height"]));
16981      }
16982      _util.css(spacer, spacerCSS);
16983      spacer.setAttribute(PIN_SPACER_ATTRIBUTE, "");
16984      _util.addClass(spacer, settings.spacerClass);
16985
16986      // set the pin Options
16987      _pinOptions = {
16988        spacer: spacer,
16989        relSize: {
16990          // save if size is defined using % values. if so, handle spacer resize differently...
16991          width: sizeCSS.width.slice(-1) === "%",
16992          height: sizeCSS.height.slice(-1) === "%",
16993          autoFullWidth: sizeCSS.width === "auto" && inFlow && _util.isMarginCollapseType(pinCSS.display)
16994        },
16995        pushFollowers: settings.pushFollowers,
16996        inFlow: inFlow // stores if the element takes up space in the document flow
16997      };
16998      if (!_pin.___origStyle) {
16999        _pin.___origStyle = {};
17000        var pinInlineCSS = _pin.style,
17001          copyStyles = boundsParams.concat(["width", "height", "position", "boxSizing", "mozBoxSizing", "webkitBoxSizing"]);
17002        copyStyles.forEach(function (val) {
17003          _pin.___origStyle[val] = pinInlineCSS[val] || "";
17004        });
17005      }
17006
17007      // if relative size, transfer it to spacer and make pin calculate it...
17008      if (_pinOptions.relSize.width) {
17009        _util.css(spacer, {
17010          width: sizeCSS.width
17011        });
17012      }
17013      if (_pinOptions.relSize.height) {
17014        _util.css(spacer, {
17015          height: sizeCSS.height
17016        });
17017      }
17018
17019      // now place the pin element inside the spacer	
17020      spacer.appendChild(_pin);
17021      // and set new css
17022      _util.css(_pin, {
17023        position: inFlow ? "relative" : "absolute",
17024        margin: "auto",
17025        top: "auto",
17026        left: "auto",
17027        bottom: "auto",
17028        right: "auto"
17029      });
17030      if (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) {
17031        _util.css(_pin, {
17032          boxSizing: "border-box",
17033          mozBoxSizing: "border-box",
17034          webkitBoxSizing: "border-box"
17035        });
17036      }
17037
17038      // add listener to document to update pin position in case controller is not the document.
17039      window.addEventListener('scroll', updatePinInContainer);
17040      window.addEventListener('resize', updatePinInContainer);
17041      window.addEventListener('resize', updateRelativePinSpacer);
17042      // add mousewheel listener to catch scrolls over fixed elements
17043      _pin.addEventListener("mousewheel", onMousewheelOverPin);
17044      _pin.addEventListener("DOMMouseScroll", onMousewheelOverPin);
17045      log(3, "added pin");
17046
17047      // finally update the pin to init
17048      updatePinState();
17049      return Scene;
17050    };
17051
17052    /**
17053     * Remove the pin from the scene.
17054     * @method ScrollMagic.Scene#removePin
17055     * @example
17056     * // remove the pin from the scene without resetting it (the spacer is not removed)
17057     * scene.removePin();
17058     *
17059     * // remove the pin from the scene and reset the pin element to its initial position (spacer is removed)
17060     * scene.removePin(true);
17061     *
17062     * @param {boolean} [reset=false] - If `false` the spacer will not be removed and the element's position will not be reset.
17063     * @returns {Scene} Parent object for chaining.
17064     */
17065    this.removePin = function (reset) {
17066      if (_pin) {
17067        if (_state === SCENE_STATE_DURING) {
17068          updatePinState(true); // force unpin at position
17069        }
17070        if (reset || !_controller) {
17071          // if there's no controller no progress was made anyway...
17072          var pinTarget = _pinOptions.spacer.firstChild; // usually the pin element, but may be another spacer (cascaded pins)...
17073          if (pinTarget.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
17074            // copy margins to child spacer
17075            var style = _pinOptions.spacer.style,
17076              values = ["margin", "marginLeft", "marginRight", "marginTop", "marginBottom"],
17077              margins = {};
17078            values.forEach(function (val) {
17079              margins[val] = style[val] || "";
17080            });
17081            _util.css(pinTarget, margins);
17082          }
17083          _pinOptions.spacer.parentNode.insertBefore(pinTarget, _pinOptions.spacer);
17084          _pinOptions.spacer.parentNode.removeChild(_pinOptions.spacer);
17085          if (!_pin.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
17086            // if it's the last pin for this element -> restore inline styles
17087            // TODO: only correctly set for first pin (when cascading) - how to fix?
17088            _util.css(_pin, _pin.___origStyle);
17089            delete _pin.___origStyle;
17090          }
17091        }
17092        window.removeEventListener('scroll', updatePinInContainer);
17093        window.removeEventListener('resize', updatePinInContainer);
17094        window.removeEventListener('resize', updateRelativePinSpacer);
17095        _pin.removeEventListener("mousewheel", onMousewheelOverPin);
17096        _pin.removeEventListener("DOMMouseScroll", onMousewheelOverPin);
17097        _pin = undefined;
17098        log(3, "removed pin (reset: " + (reset ? "true" : "false") + ")");
17099      }
17100      return Scene;
17101    };
17102    var _cssClasses,
17103      _cssClassElems = [];
17104    Scene.on("destroy.internal", function (e) {
17105      Scene.removeClassToggle(e.reset);
17106    });
17107    /**
17108     * Define a css class modification while the scene is active.  
17109     * When the scene triggers the classes will be added to the supplied element and removed, when the scene is over.
17110     * If the scene duration is 0 the classes will only be removed if the user scrolls back past the start position.
17111     * @method ScrollMagic.Scene#setClassToggle
17112     * @example
17113     * // add the class 'myclass' to the element with the id 'my-elem' for the duration of the scene
17114     * scene.setClassToggle("#my-elem", "myclass");
17115     *
17116     * // add multiple classes to multiple elements defined by the selector '.classChange'
17117     * scene.setClassToggle(".classChange", "class1 class2 class3");
17118     *
17119     * @param {(string|object)} element - A Selector targeting one or more elements or a DOM object that is supposed to be modified.
17120     * @param {string} classes - One or more Classnames (separated by space) that should be added to the element during the scene.
17121     *
17122     * @returns {Scene} Parent object for chaining.
17123     */
17124    this.setClassToggle = function (element, classes) {
17125      var elems = _util.get.elements(element);
17126      if (elems.length === 0 || !_util.type.String(classes)) {
17127        log(1, "ERROR calling method 'setClassToggle()': Invalid " + (elems.length === 0 ? "element" : "classes") + " supplied.");
17128        return Scene;
17129      }
17130      if (_cssClassElems.length > 0) {
17131        // remove old ones
17132        Scene.removeClassToggle();
17133      }
17134      _cssClasses = classes;
17135      _cssClassElems = elems;
17136      Scene.on("enter.internal_class leave.internal_class", function (e) {
17137        var toggle = e.type === "enter" ? _util.addClass : _util.removeClass;
17138        _cssClassElems.forEach(function (elem, key) {
17139          toggle(elem, _cssClasses);
17140        });
17141      });
17142      return Scene;
17143    };
17144
17145    /**
17146     * Remove the class binding from the scene.
17147     * @method ScrollMagic.Scene#removeClassToggle
17148     * @example
17149     * // remove class binding from the scene without reset
17150     * scene.removeClassToggle();
17151     *
17152     * // remove class binding and remove the changes it caused
17153     * scene.removeClassToggle(true);
17154     *
17155     * @param {boolean} [reset=false] - If `false` and the classes are currently active, they will remain on the element. If `true` they will be removed.
17156     * @returns {Scene} Parent object for chaining.
17157     */
17158    this.removeClassToggle = function (reset) {
17159      if (reset) {
17160        _cssClassElems.forEach(function (elem, key) {
17161          _util.removeClass(elem, _cssClasses);
17162        });
17163      }
17164      Scene.off("start.internal_class end.internal_class");
17165      _cssClasses = undefined;
17166      _cssClassElems = [];
17167      return Scene;
17168    };
17169
17170    // INIT
17171    construct();
17172    return Scene;
17173  };
17174
17175  // store pagewide scene options
17176  var SCENE_OPTIONS = {
17177    defaults: {
17178      duration: 0,
17179      offset: 0,
17180      triggerElement: undefined,
17181      triggerHook: 0.5,
17182      reverse: true,
17183      loglevel: 2
17184    },
17185    validate: {
17186      offset: function (val) {
17187        val = parseFloat(val);
17188        if (!_util.type.Number(val)) {
17189          throw ["Invalid value for option \"offset\":", val];
17190        }
17191        return val;
17192      },
17193      triggerElement: function (val) {
17194        val = val || undefined;
17195        if (val) {
17196          var elem = _util.get.elements(val)[0];
17197          if (elem && elem.parentNode) {
17198            val = elem;
17199          } else {
17200            throw ["Element defined in option \"triggerElement\" was not found:", val];
17201          }
17202        }
17203        return val;
17204      },
17205      triggerHook: function (val) {
17206        var translate = {
17207          "onCenter": 0.5,
17208          "onEnter": 1,
17209          "onLeave": 0
17210        };
17211        if (_util.type.Number(val)) {
17212          val = Math.max(0, Math.min(parseFloat(val), 1)); //  make sure its betweeen 0 and 1
17213        } else if (val in translate) {
17214          val = translate[val];
17215        } else {
17216          throw ["Invalid value for option \"triggerHook\": ", val];
17217        }
17218        return val;
17219      },
17220      reverse: function (val) {
17221        return !!val; // force boolean
17222      },
17223      loglevel: function (val) {
17224        val = parseInt(val);
17225        if (!_util.type.Number(val) || val < 0 || val > 3) {
17226          throw ["Invalid value for option \"loglevel\":", val];
17227        }
17228        return val;
17229      }
17230    },
17231    // holder for  validation methods. duration validation is handled in 'getters-setters.js'
17232    shifts: ["duration", "offset", "triggerHook"] // list of options that trigger a `shift` event
17233  };
17234  /*
17235   * method used to add an option to ScrollMagic Scenes.
17236   * TODO: DOC (private for dev)
17237   */
17238  ScrollMagic.Scene.addOption = function (name, defaultValue, validationCallback, shifts) {
17239    if (!(name in SCENE_OPTIONS.defaults)) {
17240      SCENE_OPTIONS.defaults[name] = defaultValue;
17241      SCENE_OPTIONS.validate[name] = validationCallback;
17242      if (shifts) {
17243        SCENE_OPTIONS.shifts.push(name);
17244      }
17245    } else {
17246      ScrollMagic._util.log(1, "[static] ScrollMagic.Scene -> Cannot add Scene option '" + name + "', because it already exists.");
17247    }
17248  };
17249  // instance extension function for plugins
17250  // TODO: DOC (private for dev)
17251  ScrollMagic.Scene.extend = function (extension) {
17252    var oldClass = this;
17253    ScrollMagic.Scene = function () {
17254      oldClass.apply(this, arguments);
17255      this.$super = _util.extend({}, this); // copy parent state
17256      return extension.apply(this, arguments) || this;
17257    };
17258    _util.extend(ScrollMagic.Scene, oldClass); // copy properties
17259    ScrollMagic.Scene.prototype = oldClass.prototype; // copy prototype
17260    ScrollMagic.Scene.prototype.constructor = ScrollMagic.Scene; // restore constructor
17261  };
17262
17263  /**
17264   * TODO: DOCS (private for dev)
17265   * @class
17266   * @private
17267   */
17268
17269  ScrollMagic.Event = function (type, namespace, target, vars) {
17270    vars = vars || {};
17271    for (var key in vars) {
17272      this[key] = vars[key];
17273    }
17274    this.type = type;
17275    this.target = this.currentTarget = target;
17276    this.namespace = namespace || '';
17277    this.timeStamp = this.timestamp = Date.now();
17278    return this;
17279  };
17280
17281  /*
17282   * TODO: DOCS (private for dev)
17283   */
17284
17285  var _util = ScrollMagic._util = function (window) {
17286    var U = {},
17287      i;
17288
17289    /**
17290     * ------------------------------
17291     * internal helpers
17292     * ------------------------------
17293     */
17294
17295    // parse float and fall back to 0.
17296    var floatval = function (number) {
17297      return parseFloat(number) || 0;
17298    };
17299    // get current style IE safe (otherwise IE would return calculated values for 'auto')
17300    var _getComputedStyle = function (elem) {
17301      return elem.currentStyle ? elem.currentStyle : window.getComputedStyle(elem);
17302    };
17303
17304    // get element dimension (width or height)
17305    var _dimension = function (which, elem, outer, includeMargin) {
17306      elem = elem === document ? window : elem;
17307      if (elem === window) {
17308        includeMargin = false;
17309      } else if (!_type.DomElement(elem)) {
17310        return 0;
17311      }
17312      which = which.charAt(0).toUpperCase() + which.substr(1).toLowerCase();
17313      var dimension = (outer ? elem['offset' + which] || elem['outer' + which] : elem['client' + which] || elem['inner' + which]) || 0;
17314      if (outer && includeMargin) {
17315        var style = _getComputedStyle(elem);
17316        dimension += which === 'Height' ? floatval(style.marginTop) + floatval(style.marginBottom) : floatval(style.marginLeft) + floatval(style.marginRight);
17317      }
17318      return dimension;
17319    };
17320    // converts 'margin-top' into 'marginTop'
17321    var _camelCase = function (str) {
17322      return str.replace(/^[^a-z]+([a-z])/g, '$1').replace(/-([a-z])/g, function (g) {
17323        return g[1].toUpperCase();
17324      });
17325    };
17326
17327    /**
17328     * ------------------------------
17329     * external helpers
17330     * ------------------------------
17331     */
17332
17333    // extend obj – same as jQuery.extend({}, objA, objB)
17334    U.extend = function (obj) {
17335      obj = obj || {};
17336      for (i = 1; i < arguments.length; i++) {
17337        if (!arguments[i]) {
17338          continue;
17339        }
17340        for (var key in arguments[i]) {
17341          if (arguments[i].hasOwnProperty(key)) {
17342            obj[key] = arguments[i][key];
17343          }
17344        }
17345      }
17346      return obj;
17347    };
17348
17349    // check if a css display type results in margin-collapse or not
17350    U.isMarginCollapseType = function (str) {
17351      return ["block", "flex", "list-item", "table", "-webkit-box"].indexOf(str) > -1;
17352    };
17353
17354    // implementation of requestAnimationFrame
17355    // based on https://gist.github.com/paulirish/1579671
17356    var lastTime = 0,
17357      vendors = ['ms', 'moz', 'webkit', 'o'];
17358    var _requestAnimationFrame = window.requestAnimationFrame;
17359    var _cancelAnimationFrame = window.cancelAnimationFrame;
17360    // try vendor prefixes if the above doesn't work
17361    for (i = 0; !_requestAnimationFrame && i < vendors.length; ++i) {
17362      _requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame'];
17363      _cancelAnimationFrame = window[vendors[i] + 'CancelAnimationFrame'] || window[vendors[i] + 'CancelRequestAnimationFrame'];
17364    }
17365
17366    // fallbacks
17367    if (!_requestAnimationFrame) {
17368      _requestAnimationFrame = function (callback) {
17369        var currTime = new Date().getTime(),
17370          timeToCall = Math.max(0, 16 - (currTime - lastTime)),
17371          id = window.setTimeout(function () {
17372            callback(currTime + timeToCall);
17373          }, timeToCall);
17374        lastTime = currTime + timeToCall;
17375        return id;
17376      };
17377    }
17378    if (!_cancelAnimationFrame) {
17379      _cancelAnimationFrame = function (id) {
17380        window.clearTimeout(id);
17381      };
17382    }
17383    U.rAF = _requestAnimationFrame.bind(window);
17384    U.cAF = _cancelAnimationFrame.bind(window);
17385    var loglevels = ["error", "warn", "log"],
17386      console = window.console || {};
17387    console.log = console.log || function () {}; // no console log, well - do nothing then...
17388    // make sure methods for all levels exist.
17389    for (i = 0; i < loglevels.length; i++) {
17390      var method = loglevels[i];
17391      if (!console[method]) {
17392        console[method] = console.log; // prefer .log over nothing
17393      }
17394    }
17395    U.log = function (loglevel) {
17396      if (loglevel > loglevels.length || loglevel <= 0) loglevel = loglevels.length;
17397      var now = new Date(),
17398        time = ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2) + ":" + ("0" + now.getSeconds()).slice(-2) + ":" + ("00" + now.getMilliseconds()).slice(-3),
17399        method = loglevels[loglevel - 1],
17400        args = Array.prototype.splice.call(arguments, 1),
17401        func = Function.prototype.bind.call(console[method], console);
17402      args.unshift(time);
17403      func.apply(console, args);
17404    };
17405
17406    /**
17407     * ------------------------------
17408     * type testing
17409     * ------------------------------
17410     */
17411
17412    var _type = U.type = function (v) {
17413      return Object.prototype.toString.call(v).replace(/^\[object (.+)\]$/, "$1").toLowerCase();
17414    };
17415    _type.String = function (v) {
17416      return _type(v) === 'string';
17417    };
17418    _type.Function = function (v) {
17419      return _type(v) === 'function';
17420    };
17421    _type.Array = function (v) {
17422      return Array.isArray(v);
17423    };
17424    _type.Number = function (v) {
17425      return !_type.Array(v) && v - parseFloat(v) + 1 >= 0;
17426    };
17427    _type.DomElement = function (o) {
17428      return typeof HTMLElement === "object" || typeof HTMLElement === "function" ? o instanceof HTMLElement || o instanceof SVGElement :
17429      //DOM2
17430      o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string";
17431    };
17432
17433    /**
17434     * ------------------------------
17435     * DOM Element info
17436     * ------------------------------
17437     */
17438    // always returns a list of matching DOM elements, from a selector, a DOM element or an list of elements or even an array of selectors
17439    var _get = U.get = {};
17440    _get.elements = function (selector) {
17441      var arr = [];
17442      if (_type.String(selector)) {
17443        try {
17444          selector = document.querySelectorAll(selector);
17445        } catch (e) {
17446          // invalid selector
17447          return arr;
17448        }
17449      }
17450      if (_type(selector) === 'nodelist' || _type.Array(selector) || selector instanceof NodeList) {
17451        for (var i = 0, ref = arr.length = selector.length; i < ref; i++) {
17452          // list of elements
17453          var elem = selector[i];
17454          arr[i] = _type.DomElement(elem) ? elem : _get.elements(elem); // if not an element, try to resolve recursively
17455        }
17456      } else if (_type.DomElement(selector) || selector === document || selector === window) {
17457        arr = [selector]; // only the element
17458      }
17459      return arr;
17460    };
17461    // get scroll top value
17462    _get.scrollTop = function (elem) {
17463      return elem && typeof elem.scrollTop === 'number' ? elem.scrollTop : window.pageYOffset || 0;
17464    };
17465    // get scroll left value
17466    _get.scrollLeft = function (elem) {
17467      return elem && typeof elem.scrollLeft === 'number' ? elem.scrollLeft : window.pageXOffset || 0;
17468    };
17469    // get element height
17470    _get.width = function (elem, outer, includeMargin) {
17471      return _dimension('width', elem, outer, includeMargin);
17472    };
17473    // get element width
17474    _get.height = function (elem, outer, includeMargin) {
17475      return _dimension('height', elem, outer, includeMargin);
17476    };
17477
17478    // get element position (optionally relative to viewport)
17479    _get.offset = function (elem, relativeToViewport) {
17480      var offset = {
17481        top: 0,
17482        left: 0
17483      };
17484      if (elem && elem.getBoundingClientRect) {
17485        // check if available
17486        var rect = elem.getBoundingClientRect();
17487        offset.top = rect.top;
17488        offset.left = rect.left;
17489        if (!relativeToViewport) {
17490          // clientRect is by default relative to viewport...
17491          offset.top += _get.scrollTop();
17492          offset.left += _get.scrollLeft();
17493        }
17494      }
17495      return offset;
17496    };
17497
17498    /**
17499     * ------------------------------
17500     * DOM Element manipulation
17501     * ------------------------------
17502     */
17503
17504    U.addClass = function (elem, classname) {
17505      if (classname) {
17506        if (elem.classList) elem.classList.add(classname);else elem.className += ' ' + classname;
17507      }
17508    };
17509    U.removeClass = function (elem, classname) {
17510      if (classname) {
17511        if (elem.classList) elem.classList.remove(classname);else elem.className = elem.className.replace(new RegExp('(^|\\b)' + classname.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
17512      }
17513    };
17514    // if options is string -> returns css value
17515    // if options is array -> returns object with css value pairs
17516    // if options is object -> set new css values
17517    U.css = function (elem, options) {
17518      if (_type.String(options)) {
17519        return _getComputedStyle(elem)[_camelCase(options)];
17520      } else if (_type.Array(options)) {
17521        var obj = {},
17522          style = _getComputedStyle(elem);
17523        options.forEach(function (option, key) {
17524          obj[option] = style[_camelCase(option)];
17525        });
17526        return obj;
17527      } else {
17528        for (var option in options) {
17529          var val = options[option];
17530          if (val == parseFloat(val)) {
17531            // assume pixel for seemingly numerical values
17532            val += 'px';
17533          }
17534          elem.style[_camelCase(option)] = val;
17535        }
17536      }
17537    };
17538    return U;
17539  }(window || {});
17540  ScrollMagic.Scene.prototype.addIndicators = function () {
17541    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling addIndicators() due to missing Plugin \'debug.addIndicators\'. Please make sure to include plugins/debug.addIndicators.js');
17542    return this;
17543  };
17544  ScrollMagic.Scene.prototype.removeIndicators = function () {
17545    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeIndicators() due to missing Plugin \'debug.addIndicators\'. Please make sure to include plugins/debug.addIndicators.js');
17546    return this;
17547  };
17548  ScrollMagic.Scene.prototype.setTween = function () {
17549    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setTween() due to missing Plugin \'animation.gsap\'. Please make sure to include plugins/animation.gsap.js');
17550    return this;
17551  };
17552  ScrollMagic.Scene.prototype.removeTween = function () {
17553    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeTween() due to missing Plugin \'animation.gsap\'. Please make sure to include plugins/animation.gsap.js');
17554    return this;
17555  };
17556  ScrollMagic.Scene.prototype.setVelocity = function () {
17557    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setVelocity() due to missing Plugin \'animation.velocity\'. Please make sure to include plugins/animation.velocity.js');
17558    return this;
17559  };
17560  ScrollMagic.Scene.prototype.removeVelocity = function () {
17561    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeVelocity() due to missing Plugin \'animation.velocity\'. Please make sure to include plugins/animation.velocity.js');
17562    return this;
17563  };
17564  return ScrollMagic;
17565});
17566
17567/***/ }),
17568
vendor: 25,752 bytes, lines 17569-18233
17569/***/ "./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators.js":
17570/*!******************************************************************************************!*\
17571  !*** ./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators.js ***!
17572  \******************************************************************************************/
17573/*! no static exports found */
17574/***/ (function(module, exports, __webpack_require__) {
17575
17576/*** IMPORTS FROM imports-loader ***/
17577var define = false;
17578
17579/*!
17580 * ScrollMagic v2.0.8 (2020-08-14)
17581 * The javascript library for magical scroll interactions.
17582 * (c) 2020 Jan Paepke (@janpaepke)
17583 * Project Website: http://scrollmagic.io
17584 * 
17585 * @version 2.0.8
17586 * @license Dual licensed under MIT license and GPL.
17587 * @author Jan Paepke - [email protected]
17588 *
17589 * @file Debug Extension for ScrollMagic.
17590 */
17591/**
17592 * This plugin was formerly known as the ScrollMagic debug extension.
17593 *
17594 * It enables you to add visual indicators to your page, to be able to see exactly when a scene is triggered.
17595 *
17596 * To have access to this extension, please include `plugins/debug.addIndicators.js`.
17597 * @mixin debug.addIndicators
17598 */
17599(function (root, factory) {
17600  if (typeof define === 'function' && define.amd) {
17601    // AMD. Register as an anonymous module.
17602    define(['ScrollMagic'], factory);
17603  } else if (true) {
17604    // CommonJS
17605    factory(__webpack_require__(/*! scrollmagic */ "./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js"));
17606  } else {}
17607})(this, function (ScrollMagic) {
17608  "use strict";
17609
17610  var NAMESPACE = "debug.addIndicators";
17611  var console = window.console || {},
17612    err = Function.prototype.bind.call(console.error || console.log || function () {}, console);
17613  if (!ScrollMagic) {
17614    err("(" + NAMESPACE + ") -> ERROR: The ScrollMagic main module could not be found. Please make sure it's loaded before this plugin or use an asynchronous loader like requirejs.");
17615  }
17616
17617  // plugin settings
17618  var FONT_SIZE = "0.85em",
17619    ZINDEX = "9999",
17620    EDGE_OFFSET = 15; // minimum edge distance, added to indentation
17621
17622  // overall vars
17623  var _util = ScrollMagic._util,
17624    _autoindex = 0;
17625  ScrollMagic.Scene.extend(function () {
17626    var Scene = this,
17627      _indicator;
17628    var log = function () {
17629      if (Scene._log) {
17630        // not available, when main source minified
17631        Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ")", "->");
17632        Scene._log.apply(this, arguments);
17633      }
17634    };
17635
17636    /**
17637     * Add visual indicators for a ScrollMagic.Scene.  
17638     * @memberof! debug.addIndicators#
17639     *
17640     * @example
17641     * // add basic indicators
17642     * scene.addIndicators()
17643     *
17644     * // passing options
17645     * scene.addIndicators({name: "pin scene", colorEnd: "#FFFFFF"});
17646     *
17647     * @param {object} [options] - An object containing one or more options for the indicators.
17648     * @param {(string|object)} [options.parent] - A selector, DOM Object or a jQuery object that the indicators should be added to.  
17649     														 														 If undefined, the controller's container will be used.
17650     * @param {number} [options.name=""] - This string will be displayed at the start and end indicators of the scene for identification purposes. If no name is supplied an automatic index will be used.
17651     * @param {number} [options.indent=0] - Additional position offset for the indicators (useful, when having multiple scenes starting at the same position).
17652     * @param {string} [options.colorStart=green] - CSS color definition for the start indicator.
17653     * @param {string} [options.colorEnd=red] - CSS color definition for the end indicator.
17654     * @param {string} [options.colorTrigger=blue] - CSS color definition for the trigger indicator.
17655     */
17656    Scene.addIndicators = function (options) {
17657      if (!_indicator) {
17658        var DEFAULT_OPTIONS = {
17659          name: "",
17660          indent: 0,
17661          parent: undefined,
17662          colorStart: "green",
17663          colorEnd: "red",
17664          colorTrigger: "blue"
17665        };
17666        options = _util.extend({}, DEFAULT_OPTIONS, options);
17667        _autoindex++;
17668        _indicator = new Indicator(Scene, options);
17669        Scene.on("add.plugin_addIndicators", _indicator.add);
17670        Scene.on("remove.plugin_addIndicators", _indicator.remove);
17671        Scene.on("destroy.plugin_addIndicators", Scene.removeIndicators);
17672
17673        // it the scene already has a controller we can start right away.
17674        if (Scene.controller()) {
17675          _indicator.add();
17676        }
17677      }
17678      return Scene;
17679    };
17680
17681    /**
17682     * Removes visual indicators from a ScrollMagic.Scene.
17683     * @memberof! debug.addIndicators#
17684     *
17685     * @example
17686     * // remove previously added indicators
17687     * scene.removeIndicators()
17688     *
17689     */
17690    Scene.removeIndicators = function () {
17691      if (_indicator) {
17692        _indicator.remove();
17693        this.off("*.plugin_addIndicators");
17694        _indicator = undefined;
17695      }
17696      return Scene;
17697    };
17698  });
17699
17700  /*
17701   * ----------------------------------------------------------------
17702   * Extension for controller to store and update related indicators
17703   * ----------------------------------------------------------------
17704   */
17705  // add option to globally auto-add indicators to scenes
17706  /**
17707   * Every ScrollMagic.Controller instance now accepts an additional option.  
17708   * See {@link ScrollMagic.Controller} for a complete list of the standard options.
17709   * @memberof! debug.addIndicators#
17710   * @method new ScrollMagic.Controller(options)
17711   * @example
17712   * // make a controller and add indicators to all scenes attached
17713   * var controller = new ScrollMagic.Controller({addIndicators: true});
17714   * // this scene will automatically have indicators added to it
17715   * new ScrollMagic.Scene()
17716   *                .addTo(controller);
17717   *
17718   * @param {object} [options] - Options for the Controller.
17719   * @param {boolean} [options.addIndicators=false] - If set to `true` every scene that is added to the controller will automatically get indicators added to it.
17720   */
17721  ScrollMagic.Controller.addOption("addIndicators", false);
17722  // extend Controller
17723  ScrollMagic.Controller.extend(function () {
17724    var Controller = this,
17725      _info = Controller.info(),
17726      _container = _info.container,
17727      _isDocument = _info.isDocument,
17728      _vertical = _info.vertical,
17729      _indicators = {
17730        // container for all indicators and methods
17731        groups: []
17732      };
17733    var log = function () {
17734      if (Controller._log) {
17735        // not available, when main source minified
17736        Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ")", "->");
17737        Controller._log.apply(this, arguments);
17738      }
17739    };
17740    if (Controller._indicators) {
17741      log(2, "WARNING: Scene already has a property '_indicators', which will be overwritten by plugin.");
17742    }
17743
17744    // add indicators container
17745    this._indicators = _indicators;
17746    /*
17747    	needed updates:
17748    	+++++++++++++++
17749    	start/end position on scene shift (handled in Indicator class)
17750    	trigger parameters on triggerHook value change (handled in Indicator class)
17751    	bounds position on container scroll or resize (to keep alignment to bottom/right)
17752    	trigger position on container resize, window resize (if container isn't document) and window scroll (if container isn't document)
17753    */
17754
17755    // event handler for when associated bounds markers need to be repositioned
17756    var handleBoundsPositionChange = function () {
17757      _indicators.updateBoundsPositions();
17758    };
17759
17760    // event handler for when associated trigger groups need to be repositioned
17761    var handleTriggerPositionChange = function () {
17762      _indicators.updateTriggerGroupPositions();
17763    };
17764    _container.addEventListener("resize", handleTriggerPositionChange);
17765    if (!_isDocument) {
17766      window.addEventListener("resize", handleTriggerPositionChange);
17767      window.addEventListener("scroll", handleTriggerPositionChange);
17768    }
17769    // update all related bounds containers
17770    _container.addEventListener("resize", handleBoundsPositionChange);
17771    _container.addEventListener("scroll", handleBoundsPositionChange);
17772
17773    // updates the position of the bounds container to aligned to the right for vertical containers and to the bottom for horizontal
17774    this._indicators.updateBoundsPositions = function (specificIndicator) {
17775      var
17776        // constant for all bounds
17777        groups = specificIndicator ? [_util.extend({}, specificIndicator.triggerGroup, {
17778          members: [specificIndicator]
17779        })] :
17780        // create a group with only one element
17781        _indicators.groups,
17782        // use all
17783        g = groups.length,
17784        css = {},
17785        paramPos = _vertical ? "left" : "top",
17786        paramDimension = _vertical ? "width" : "height",
17787        edge = _vertical ? _util.get.scrollLeft(_container) + _util.get.width(_container) - EDGE_OFFSET : _util.get.scrollTop(_container) + _util.get.height(_container) - EDGE_OFFSET,
17788        b,
17789        triggerSize,
17790        group;
17791      while (g--) {
17792        // group loop
17793        group = groups[g];
17794        b = group.members.length;
17795        triggerSize = _util.get[paramDimension](group.element.firstChild);
17796        while (b--) {
17797          // indicators loop
17798          css[paramPos] = edge - triggerSize;
17799          _util.css(group.members[b].bounds, css);
17800        }
17801      }
17802    };
17803
17804    // updates the positions of all trigger groups attached to a controller or a specific one, if provided
17805    this._indicators.updateTriggerGroupPositions = function (specificGroup) {
17806      var
17807        // constant vars
17808        groups = specificGroup ? [specificGroup] : _indicators.groups,
17809        i = groups.length,
17810        container = _isDocument ? document.body : _container,
17811        containerOffset = _isDocument ? {
17812          top: 0,
17813          left: 0
17814        } : _util.get.offset(container, true),
17815        edge = _vertical ? _util.get.width(_container) - EDGE_OFFSET : _util.get.height(_container) - EDGE_OFFSET,
17816        paramDimension = _vertical ? "width" : "height",
17817        paramTransform = _vertical ? "Y" : "X";
17818      var
17819        // changing vars
17820        group, elem, pos, elemSize, transform;
17821      while (i--) {
17822        group = groups[i];
17823        elem = group.element;
17824        pos = group.triggerHook * Controller.info("size");
17825        elemSize = _util.get[paramDimension](elem.firstChild.firstChild);
17826        transform = pos > elemSize ? "translate" + paramTransform + "(-100%)" : "";
17827        _util.css(elem, {
17828          top: containerOffset.top + (_vertical ? pos : edge - group.members[0].options.indent),
17829          left: containerOffset.left + (_vertical ? edge - group.members[0].options.indent : pos)
17830        });
17831        _util.css(elem.firstChild.firstChild, {
17832          "-ms-transform": transform,
17833          "-webkit-transform": transform,
17834          "transform": transform
17835        });
17836      }
17837    };
17838
17839    // updates the label for the group to contain the name, if it only has one member
17840    this._indicators.updateTriggerGroupLabel = function (group) {
17841      var text = "trigger" + (group.members.length > 1 ? "" : " " + group.members[0].options.name),
17842        elem = group.element.firstChild.firstChild,
17843        doUpdate = elem.textContent !== text;
17844      if (doUpdate) {
17845        elem.textContent = text;
17846        if (_vertical) {
17847          // bounds position is dependent on text length, so update
17848          _indicators.updateBoundsPositions();
17849        }
17850      }
17851    };
17852
17853    // add indicators if global option is set
17854    this.addScene = function (newScene) {
17855      if (this._options.addIndicators && newScene instanceof ScrollMagic.Scene && newScene.controller() === Controller) {
17856        newScene.addIndicators();
17857      }
17858      // call original destroy method
17859      this.$super.addScene.apply(this, arguments);
17860    };
17861
17862    // remove all previously set listeners on destroy
17863    this.destroy = function () {
17864      _container.removeEventListener("resize", handleTriggerPositionChange);
17865      if (!_isDocument) {
17866        window.removeEventListener("resize", handleTriggerPositionChange);
17867        window.removeEventListener("scroll", handleTriggerPositionChange);
17868      }
17869      _container.removeEventListener("resize", handleBoundsPositionChange);
17870      _container.removeEventListener("scroll", handleBoundsPositionChange);
17871      // call original destroy method
17872      this.$super.destroy.apply(this, arguments);
17873    };
17874    return Controller;
17875  });
17876
17877  /*
17878   * ----------------------------------------------------------------
17879   * Internal class for the construction of Indicators
17880   * ----------------------------------------------------------------
17881   */
17882  var Indicator = function (Scene, options) {
17883    var Indicator = this,
17884      _elemBounds = TPL.bounds(),
17885      _elemStart = TPL.start(options.colorStart),
17886      _elemEnd = TPL.end(options.colorEnd),
17887      _boundsContainer = options.parent && _util.get.elements(options.parent)[0],
17888      _vertical,
17889      _ctrl;
17890    var log = function () {
17891      if (Scene._log) {
17892        // not available, when main source minified
17893        Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ")", "->");
17894        Scene._log.apply(this, arguments);
17895      }
17896    };
17897    options.name = options.name || _autoindex;
17898
17899    // prepare bounds elements
17900    _elemStart.firstChild.textContent += " " + options.name;
17901    _elemEnd.textContent += " " + options.name;
17902    _elemBounds.appendChild(_elemStart);
17903    _elemBounds.appendChild(_elemEnd);
17904
17905    // set public variables
17906    Indicator.options = options;
17907    Indicator.bounds = _elemBounds;
17908    // will be set later
17909    Indicator.triggerGroup = undefined;
17910
17911    // add indicators to DOM
17912    this.add = function () {
17913      _ctrl = Scene.controller();
17914      _vertical = _ctrl.info("vertical");
17915      var isDocument = _ctrl.info("isDocument");
17916      if (!_boundsContainer) {
17917        // no parent supplied or doesnt exist
17918        _boundsContainer = isDocument ? document.body : _ctrl.info("container"); // check if window/document (then use body)
17919      }
17920      if (!isDocument && _util.css(_boundsContainer, "position") === 'static') {
17921        // position mode needed for correct positioning of indicators
17922        _util.css(_boundsContainer, {
17923          position: "relative"
17924        });
17925      }
17926
17927      // add listeners for updates
17928      Scene.on("change.plugin_addIndicators", handleTriggerParamsChange);
17929      Scene.on("shift.plugin_addIndicators", handleBoundsParamsChange);
17930
17931      // updates trigger & bounds (will add elements if needed)
17932      updateTriggerGroup();
17933      updateBounds();
17934      setTimeout(function () {
17935        // do after all execution is finished otherwise sometimes size calculations are off
17936        _ctrl._indicators.updateBoundsPositions(Indicator);
17937      }, 0);
17938      log(3, "added indicators");
17939    };
17940
17941    // remove indicators from DOM
17942    this.remove = function () {
17943      if (Indicator.triggerGroup) {
17944        // if not set there's nothing to remove
17945        Scene.off("change.plugin_addIndicators", handleTriggerParamsChange);
17946        Scene.off("shift.plugin_addIndicators", handleBoundsParamsChange);
17947        if (Indicator.triggerGroup.members.length > 1) {
17948          // just remove from memberlist of old group
17949          var group = Indicator.triggerGroup;
17950          group.members.splice(group.members.indexOf(Indicator), 1);
17951          _ctrl._indicators.updateTriggerGroupLabel(group);
17952          _ctrl._indicators.updateTriggerGroupPositions(group);
17953          Indicator.triggerGroup = undefined;
17954        } else {
17955          // remove complete group
17956          removeTriggerGroup();
17957        }
17958        removeBounds();
17959        log(3, "removed indicators");
17960      }
17961    };
17962
17963    /*
17964     * ----------------------------------------------------------------
17965     * internal Event Handlers
17966     * ----------------------------------------------------------------
17967     */
17968
17969    // event handler for when bounds params change
17970    var handleBoundsParamsChange = function () {
17971      updateBounds();
17972    };
17973
17974    // event handler for when trigger params change
17975    var handleTriggerParamsChange = function (e) {
17976      if (e.what === "triggerHook") {
17977        updateTriggerGroup();
17978      }
17979    };
17980
17981    /*
17982     * ----------------------------------------------------------------
17983     * Bounds (start / stop) management
17984     * ----------------------------------------------------------------
17985     */
17986
17987    // adds an new bounds elements to the array and to the DOM
17988    var addBounds = function () {
17989      var v = _ctrl.info("vertical");
17990      // apply stuff we didn't know before...
17991      _util.css(_elemStart.firstChild, {
17992        "border-bottom-width": v ? 1 : 0,
17993        "border-right-width": v ? 0 : 1,
17994        "bottom": v ? -1 : options.indent,
17995        "right": v ? options.indent : -1,
17996        "padding": v ? "0 8px" : "2px 4px"
17997      });
17998      _util.css(_elemEnd, {
17999        "border-top-width": v ? 1 : 0,
18000        "border-left-width": v ? 0 : 1,
18001        "top": v ? "100%" : "",
18002        "right": v ? options.indent : "",
18003        "bottom": v ? "" : options.indent,
18004        "left": v ? "" : "100%",
18005        "padding": v ? "0 8px" : "2px 4px"
18006      });
18007      // append
18008      _boundsContainer.appendChild(_elemBounds);
18009    };
18010
18011    // remove bounds from list and DOM
18012    var removeBounds = function () {
18013      _elemBounds.parentNode.removeChild(_elemBounds);
18014    };
18015
18016    // update the start and end positions of the scene
18017    var updateBounds = function () {
18018      if (_elemBounds.parentNode !== _boundsContainer) {
18019        addBounds(); // Add Bounds elements (start/end)
18020      }
18021      var css = {};
18022      css[_vertical ? "top" : "left"] = Scene.triggerPosition();
18023      css[_vertical ? "height" : "width"] = Scene.duration();
18024      _util.css(_elemBounds, css);
18025      _util.css(_elemEnd, {
18026        display: Scene.duration() > 0 ? "" : "none"
18027      });
18028    };
18029
18030    /*
18031     * ----------------------------------------------------------------
18032     * trigger and trigger group management
18033     * ----------------------------------------------------------------
18034     */
18035
18036    // adds an new trigger group to the array and to the DOM
18037    var addTriggerGroup = function () {
18038      var triggerElem = TPL.trigger(options.colorTrigger); // new trigger element
18039      var css = {};
18040      css[_vertical ? "right" : "bottom"] = 0;
18041      css[_vertical ? "border-top-width" : "border-left-width"] = 1;
18042      _util.css(triggerElem.firstChild, css);
18043      _util.css(triggerElem.firstChild.firstChild, {
18044        padding: _vertical ? "0 8px 3px 8px" : "3px 4px"
18045      });
18046      document.body.appendChild(triggerElem); // directly add to body
18047      var newGroup = {
18048        triggerHook: Scene.triggerHook(),
18049        element: triggerElem,
18050        members: [Indicator]
18051      };
18052      _ctrl._indicators.groups.push(newGroup);
18053      Indicator.triggerGroup = newGroup;
18054      // update right away
18055      _ctrl._indicators.updateTriggerGroupLabel(newGroup);
18056      _ctrl._indicators.updateTriggerGroupPositions(newGroup);
18057    };
18058    var removeTriggerGroup = function () {
18059      _ctrl._indicators.groups.splice(_ctrl._indicators.groups.indexOf(Indicator.triggerGroup), 1);
18060      Indicator.triggerGroup.element.parentNode.removeChild(Indicator.triggerGroup.element);
18061      Indicator.triggerGroup = undefined;
18062    };
18063
18064    // updates the trigger group -> either join existing or add new one
18065    /*	
18066     * Logic:
18067     * 1 if a trigger group exist, check if it's in sync with Scene settings – if so, nothing else needs to happen
18068     * 2 try to find an existing one that matches Scene parameters
18069     * 	 2.1 If a match is found check if already assigned to an existing group
18070     *			 If so:
18071     *       A: it was the last member of existing group -> kill whole group
18072     *       B: the existing group has other members -> just remove from member list
18073     *	 2.2 Assign to matching group
18074     * 3 if no new match could be found, check if assigned to existing group
18075     *   A: yes, and it's the only member -> just update parameters and positions and keep using this group
18076     *   B: yes but there are other members -> remove from member list and create a new one
18077     *   C: no, so create a new one
18078     */
18079    var updateTriggerGroup = function () {
18080      var triggerHook = Scene.triggerHook(),
18081        closeEnough = 0.0001;
18082
18083      // Have a group, check if it still matches
18084      if (Indicator.triggerGroup) {
18085        if (Math.abs(Indicator.triggerGroup.triggerHook - triggerHook) < closeEnough) {
18086          // _util.log(0, "trigger", options.name, "->", "no need to change, still in sync");
18087          return; // all good
18088        }
18089      }
18090      // Don't have a group, check if a matching one exists
18091      // _util.log(0, "trigger", options.name, "->", "out of sync!");
18092      var groups = _ctrl._indicators.groups,
18093        group,
18094        i = groups.length;
18095      while (i--) {
18096        group = groups[i];
18097        if (Math.abs(group.triggerHook - triggerHook) < closeEnough) {
18098          // found a match!
18099          // _util.log(0, "trigger", options.name, "->", "found match");
18100          if (Indicator.triggerGroup) {
18101            // do I have an old group that is out of sync?
18102            if (Indicator.triggerGroup.members.length === 1) {
18103              // is it the only remaining group?
18104              // _util.log(0, "trigger", options.name, "->", "kill");
18105              // was the last member, remove the whole group
18106              removeTriggerGroup();
18107            } else {
18108              Indicator.triggerGroup.members.splice(Indicator.triggerGroup.members.indexOf(Indicator), 1); // just remove from memberlist of old group
18109              _ctrl._indicators.updateTriggerGroupLabel(Indicator.triggerGroup);
18110              _ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup);
18111              // _util.log(0, "trigger", options.name, "->", "removing from previous member list");
18112            }
18113          }
18114          // join new group
18115          group.members.push(Indicator);
18116          Indicator.triggerGroup = group;
18117          _ctrl._indicators.updateTriggerGroupLabel(group);
18118          return;
18119        }
18120      }
18121
18122      // at this point I am obviously out of sync and don't match any other group
18123      if (Indicator.triggerGroup) {
18124        if (Indicator.triggerGroup.members.length === 1) {
18125          // _util.log(0, "trigger", options.name, "->", "updating existing");
18126          // out of sync but i'm the only member => just change and update
18127          Indicator.triggerGroup.triggerHook = triggerHook;
18128          _ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup);
18129          return;
18130        } else {
18131          // _util.log(0, "trigger", options.name, "->", "removing from previous member list");
18132          Indicator.triggerGroup.members.splice(Indicator.triggerGroup.members.indexOf(Indicator), 1); // just remove from memberlist of old group
18133          _ctrl._indicators.updateTriggerGroupLabel(Indicator.triggerGroup);
18134          _ctrl._indicators.updateTriggerGroupPositions(Indicator.triggerGroup);
18135          Indicator.triggerGroup = undefined; // need a brand new group...
18136        }
18137      }
18138      // _util.log(0, "trigger", options.name, "->", "add a new one");
18139      // did not find any match, make new trigger group
18140      addTriggerGroup();
18141    };
18142  };
18143
18144  /*
18145   * ----------------------------------------------------------------
18146   * Templates for the indicators
18147   * ----------------------------------------------------------------
18148   */
18149  var TPL = {
18150    start: function (color) {
18151      // inner element (for bottom offset -1, while keeping top position 0)
18152      var inner = document.createElement("div");
18153      inner.textContent = "start";
18154      _util.css(inner, {
18155        position: "absolute",
18156        overflow: "visible",
18157        "border-width": 0,
18158        "border-style": "solid",
18159        color: color,
18160        "border-color": color
18161      });
18162      var e = document.createElement('div');
18163      // wrapper
18164      _util.css(e, {
18165        position: "absolute",
18166        overflow: "visible",
18167        width: 0,
18168        height: 0
18169      });
18170      e.appendChild(inner);
18171      return e;
18172    },
18173    end: function (color) {
18174      var e = document.createElement('div');
18175      e.textContent = "end";
18176      _util.css(e, {
18177        position: "absolute",
18178        overflow: "visible",
18179        "border-width": 0,
18180        "border-style": "solid",
18181        color: color,
18182        "border-color": color
18183      });
18184      return e;
18185    },
18186    bounds: function () {
18187      var e = document.createElement('div');
18188      _util.css(e, {
18189        position: "absolute",
18190        overflow: "visible",
18191        "white-space": "nowrap",
18192        "pointer-events": "none",
18193        "font-size": FONT_SIZE
18194      });
18195      e.style.zIndex = ZINDEX;
18196      return e;
18197    },
18198    trigger: function (color) {
18199      // inner to be above or below line but keep position
18200      var inner = document.createElement('div');
18201      inner.textContent = "trigger";
18202      _util.css(inner, {
18203        position: "relative"
18204      });
18205      // inner wrapper for right: 0 and main element has no size
18206      var w = document.createElement('div');
18207      _util.css(w, {
18208        position: "absolute",
18209        overflow: "visible",
18210        "border-width": 0,
18211        "border-style": "solid",
18212        color: color,
18213        "border-color": color
18214      });
18215      w.appendChild(inner);
18216      // wrapper
18217      var e = document.createElement('div');
18218      _util.css(e, {
18219        position: "fixed",
18220        overflow: "visible",
18221        "white-space": "nowrap",
18222        "pointer-events": "none",
18223        "font-size": FONT_SIZE
18224      });
18225      e.style.zIndex = ZINDEX;
18226      e.appendChild(w);
18227      return e;
18228    }
18229  };
18230});
18231
18232/***/ }),
18233
vendor: 3,339 bytes, lines 18234-18309
18234/***/ "./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic.js":
18235/*!*****************************************************************************************!*\
18236  !*** ./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic.js ***!
18237  \*****************************************************************************************/
18238/*! no static exports found */
18239/***/ (function(module, exports, __webpack_require__) {
18240
18241/*** IMPORTS FROM imports-loader ***/
18242var define = false;
18243
18244/*!
18245 * ScrollMagic v2.0.8 (2020-08-14)
18246 * The javascript library for magical scroll interactions.
18247 * (c) 2020 Jan Paepke (@janpaepke)
18248 * Project Website: http://scrollmagic.io
18249 * 
18250 * @version 2.0.8
18251 * @license Dual licensed under MIT license and GPL.
18252 * @author Jan Paepke - [email protected]
18253 *
18254 * @file ScrollMagic jQuery plugin.
18255 *
18256 * requires: jQuery >=1.11
18257 */
18258/**
18259 * This plugin is meant to be used in conjunction with jQuery.  
18260 * It enables ScrollMagic to make use of jQuery's advanced selector engine (sizzle) for all elements supplied to ScrollMagic objects, like scroll containers or trigger elements.  
18261 * ScrollMagic also accepts jQuery elements for all methods that expect references to DOM elements. Please note, that in most cases the first element of the matched set will be used.
18262 * 
18263 * Additionally it provides the ScrollMagic object within the jQuery namespace, so it can be accessed using `$.ScrollMagic`.
18264 *
18265 * In contrast to most other plugins it does not offer new API additions for ScrollMagic.
18266 *
18267 * To have access to this extension, please include `plugins/jquery.ScrollMagic.js`.
18268 * @example
18269 * // create a new scene making use of jQuery's advanced selector engine
18270 * var scene = new $.ScrollMagic.Scene({
18271 *   triggerElement: "#parent div.trigger[attr='thisone']:not(.notthisone)"
18272 * });
18273 * @requires {@link http://jquery.com/|jQuery >=1.11}
18274 * @mixin framework.jQuery
18275 */
18276(function (root, factory) {
18277  if (typeof define === 'function' && define.amd) {
18278    // AMD. Register as an anonymous module.
18279    define(['ScrollMagic', 'jquery'], factory);
18280  } else if (true) {
18281    // CommonJS
18282    factory(__webpack_require__(/*! scrollmagic */ "./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js"), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"));
18283  } else {}
18284})(this, function (ScrollMagic, $) {
18285  "use strict";
18286
18287  var NAMESPACE = "jquery.ScrollMagic";
18288  var console = window.console || {},
18289    err = Function.prototype.bind.call(console.error || console.log || function () {}, console);
18290  if (!ScrollMagic) {
18291    err("(" + NAMESPACE + ") -> ERROR: The ScrollMagic main module could not be found. Please make sure it's loaded before this plugin or use an asynchronous loader like requirejs.");
18292  }
18293  if (!$) {
18294    err("(" + NAMESPACE + ") -> ERROR: jQuery could not be found. Please make sure it's loaded before ScrollMagic or use an asynchronous loader like requirejs.");
18295  }
18296  ScrollMagic._util.get.elements = function (selector) {
18297    return $(selector).toArray();
18298  };
18299  ScrollMagic._util.addClass = function (elem, classname) {
18300    $(elem).addClass(classname);
18301  };
18302  ScrollMagic._util.removeClass = function (elem, classname) {
18303    $(elem).removeClass(classname);
18304  };
18305  $.ScrollMagic = ScrollMagic;
18306});
18307
18308/***/ }),
18309
vendor: 351 bytes, lines 18310-18320
18310/***/ "./node_modules/swiper/css/swiper.min.css":
18311/*!************************************************!*\
18312  !*** ./node_modules/swiper/css/swiper.min.css ***!
18313  \************************************************/
18314/*! no static exports found */
18315/***/ (function(module, exports, __webpack_require__) {
18316
18317// extracted by mini-css-extract-plugin
18318
18319/***/ }),
18320
vendor: 197,040 bytes, lines 18321-22350
18321/***/ "./node_modules/swiper/js/swiper.min.js":
18322/*!**********************************************!*\
18323  !*** ./node_modules/swiper/js/swiper.min.js ***!
18324  \**********************************************/
18325/*! no static exports found */
18326/***/ (function(module, exports, __webpack_require__) {
18327
18328/*** IMPORTS FROM imports-loader ***/
18329var define = false;
18330
18331/**
18332 * Swiper 5.4.5
18333 * Most modern mobile touch slider and framework with hardware accelerated transitions
18334 * http://swiperjs.com
18335 *
18336 * Copyright 2014-2020 Vladimir Kharlampidi
18337 *
18338 * Released under the MIT License
18339 *
18340 * Released on: June 16, 2020
18341 */
18342
18343!function (e, t) {
18344   true ? module.exports = t() : undefined;
18345}(this, function () {
18346  "use strict";
18347
18348  function e(e) {
18349    return null !== e && "object" == typeof e && "constructor" in e && e.constructor === Object;
18350  }
18351  function t(i, s) {
18352    void 0 === i && (i = {}), void 0 === s && (s = {}), Object.keys(s).forEach(function (a) {
18353      void 0 === i[a] ? i[a] = s[a] : e(s[a]) && e(i[a]) && Object.keys(s[a]).length > 0 && t(i[a], s[a]);
18354    });
18355  }
18356  var i = "undefined" != typeof document ? document : {},
18357    s = {
18358      body: {},
18359      addEventListener: function () {},
18360      removeEventListener: function () {},
18361      activeElement: {
18362        blur: function () {},
18363        nodeName: ""
18364      },
18365      querySelector: function () {
18366        return null;
18367      },
18368      querySelectorAll: function () {
18369        return [];
18370      },
18371      getElementById: function () {
18372        return null;
18373      },
18374      createEvent: function () {
18375        return {
18376          initEvent: function () {}
18377        };
18378      },
18379      createElement: function () {
18380        return {
18381          children: [],
18382          childNodes: [],
18383          style: {},
18384          setAttribute: function () {},
18385          getElementsByTagName: function () {
18386            return [];
18387          }
18388        };
18389      },
18390      createElementNS: function () {
18391        return {};
18392      },
18393      importNode: function () {
18394        return null;
18395      },
18396      location: {
18397        hash: "",
18398        host: "",
18399        hostname: "",
18400        href: "",
18401        origin: "",
18402        pathname: "",
18403        protocol: "",
18404        search: ""
18405      }
18406    };
18407  t(i, s);
18408  var a = "undefined" != typeof window ? window : {};
18409  t(a, {
18410    document: s,
18411    navigator: {
18412      userAgent: ""
18413    },
18414    location: {
18415      hash: "",
18416      host: "",
18417      hostname: "",
18418      href: "",
18419      origin: "",
18420      pathname: "",
18421      protocol: "",
18422      search: ""
18423    },
18424    history: {
18425      replaceState: function () {},
18426      pushState: function () {},
18427      go: function () {},
18428      back: function () {}
18429    },
18430    CustomEvent: function () {
18431      return this;
18432    },
18433    addEventListener: function () {},
18434    removeEventListener: function () {},
18435    getComputedStyle: function () {
18436      return {
18437        getPropertyValue: function () {
18438          return "";
18439        }
18440      };
18441    },
18442    Image: function () {},
18443    Date: function () {},
18444    screen: {},
18445    setTimeout: function () {},
18446    clearTimeout: function () {},
18447    matchMedia: function () {
18448      return {};
18449    }
18450  });
18451  var r = function (e) {
18452    for (var t = 0; t < e.length; t += 1) this[t] = e[t];
18453    return this.length = e.length, this;
18454  };
18455  function n(e, t) {
18456    var s = [],
18457      n = 0;
18458    if (e && !t && e instanceof r) return e;
18459    if (e) if ("string" == typeof e) {
18460      var o,
18461        l,
18462        d = e.trim();
18463      if (d.indexOf("<") >= 0 && d.indexOf(">") >= 0) {
18464        var h = "div";
18465        for (0 === d.indexOf("<li") && (h = "ul"), 0 === d.indexOf("<tr") && (h = "tbody"), 0 !== d.indexOf("<td") && 0 !== d.indexOf("<th") || (h = "tr"), 0 === d.indexOf("<tbody") && (h = "table"), 0 === d.indexOf("<option") && (h = "select"), (l = i.createElement(h)).innerHTML = d, n = 0; n < l.childNodes.length; n += 1) s.push(l.childNodes[n]);
18466      } else for (o = t || "#" !== e[0] || e.match(/[ .<>:~]/) ? (t || i).querySelectorAll(e.trim()) : [i.getElementById(e.trim().split("#")[1])], n = 0; n < o.length; n += 1) o[n] && s.push(o[n]);
18467    } else if (e.nodeType || e === a || e === i) s.push(e);else if (e.length > 0 && e[0].nodeType) for (n = 0; n < e.length; n += 1) s.push(e[n]);
18468    return new r(s);
18469  }
18470  function o(e) {
18471    for (var t = [], i = 0; i < e.length; i += 1) -1 === t.indexOf(e[i]) && t.push(e[i]);
18472    return t;
18473  }
18474  n.fn = r.prototype, n.Class = r, n.Dom7 = r;
18475  var l = {
18476    addClass: function (e) {
18477      if (void 0 === e) return this;
18478      for (var t = e.split(" "), i = 0; i < t.length; i += 1) for (var s = 0; s < this.length; s += 1) void 0 !== this[s] && void 0 !== this[s].classList && this[s].classList.add(t[i]);
18479      return this;
18480    },
18481    removeClass: function (e) {
18482      for (var t = e.split(" "), i = 0; i < t.length; i += 1) for (var s = 0; s < this.length; s += 1) void 0 !== this[s] && void 0 !== this[s].classList && this[s].classList.remove(t[i]);
18483      return this;
18484    },
18485    hasClass: function (e) {
18486      return !!this[0] && this[0].classList.contains(e);
18487    },
18488    toggleClass: function (e) {
18489      for (var t = e.split(" "), i = 0; i < t.length; i += 1) for (var s = 0; s < this.length; s += 1) void 0 !== this[s] && void 0 !== this[s].classList && this[s].classList.toggle(t[i]);
18490      return this;
18491    },
18492    attr: function (e, t) {
18493      var i = arguments;
18494      if (1 === arguments.length && "string" == typeof e) return this[0] ? this[0].getAttribute(e) : void 0;
18495      for (var s = 0; s < this.length; s += 1) if (2 === i.length) this[s].setAttribute(e, t);else for (var a in e) this[s][a] = e[a], this[s].setAttribute(a, e[a]);
18496      return this;
18497    },
18498    removeAttr: function (e) {
18499      for (var t = 0; t < this.length; t += 1) this[t].removeAttribute(e);
18500      return this;
18501    },
18502    data: function (e, t) {
18503      var i;
18504      if (void 0 !== t) {
18505        for (var s = 0; s < this.length; s += 1) (i = this[s]).dom7ElementDataStorage || (i.dom7ElementDataStorage = {}), i.dom7ElementDataStorage[e] = t;
18506        return this;
18507      }
18508      if (i = this[0]) {
18509        if (i.dom7ElementDataStorage && e in i.dom7ElementDataStorage) return i.dom7ElementDataStorage[e];
18510        var a = i.getAttribute("data-" + e);
18511        return a || void 0;
18512      }
18513    },
18514    transform: function (e) {
18515      for (var t = 0; t < this.length; t += 1) {
18516        var i = this[t].style;
18517        i.webkitTransform = e, i.transform = e;
18518      }
18519      return this;
18520    },
18521    transition: function (e) {
18522      "string" != typeof e && (e += "ms");
18523      for (var t = 0; t < this.length; t += 1) {
18524        var i = this[t].style;
18525        i.webkitTransitionDuration = e, i.transitionDuration = e;
18526      }
18527      return this;
18528    },
18529    on: function () {
18530      for (var e, t = [], i = arguments.length; i--;) t[i] = arguments[i];
18531      var s = t[0],
18532        a = t[1],
18533        r = t[2],
18534        o = t[3];
18535      function l(e) {
18536        var t = e.target;
18537        if (t) {
18538          var i = e.target.dom7EventData || [];
18539          if (i.indexOf(e) < 0 && i.unshift(e), n(t).is(a)) r.apply(t, i);else for (var s = n(t).parents(), o = 0; o < s.length; o += 1) n(s[o]).is(a) && r.apply(s[o], i);
18540        }
18541      }
18542      function d(e) {
18543        var t = e && e.target && e.target.dom7EventData || [];
18544        t.indexOf(e) < 0 && t.unshift(e), r.apply(this, t);
18545      }
18546      "function" == typeof t[1] && (s = (e = t)[0], r = e[1], o = e[2], a = void 0), o || (o = !1);
18547      for (var h, p = s.split(" "), c = 0; c < this.length; c += 1) {
18548        var u = this[c];
18549        if (a) for (h = 0; h < p.length; h += 1) {
18550          var v = p[h];
18551          u.dom7LiveListeners || (u.dom7LiveListeners = {}), u.dom7LiveListeners[v] || (u.dom7LiveListeners[v] = []), u.dom7LiveListeners[v].push({
18552            listener: r,
18553            proxyListener: l
18554          }), u.addEventListener(v, l, o);
18555        } else for (h = 0; h < p.length; h += 1) {
18556          var f = p[h];
18557          u.dom7Listeners || (u.dom7Listeners = {}), u.dom7Listeners[f] || (u.dom7Listeners[f] = []), u.dom7Listeners[f].push({
18558            listener: r,
18559            proxyListener: d
18560          }), u.addEventListener(f, d, o);
18561        }
18562      }
18563      return this;
18564    },
18565    off: function () {
18566      for (var e, t = [], i = arguments.length; i--;) t[i] = arguments[i];
18567      var s = t[0],
18568        a = t[1],
18569        r = t[2],
18570        n = t[3];
18571      "function" == typeof t[1] && (s = (e = t)[0], r = e[1], n = e[2], a = void 0), n || (n = !1);
18572      for (var o = s.split(" "), l = 0; l < o.length; l += 1) for (var d = o[l], h = 0; h < this.length; h += 1) {
18573        var p = this[h],
18574          c = void 0;
18575        if (!a && p.dom7Listeners ? c = p.dom7Listeners[d] : a && p.dom7LiveListeners && (c = p.dom7LiveListeners[d]), c && c.length) for (var u = c.length - 1; u >= 0; u -= 1) {
18576          var v = c[u];
18577          r && v.listener === r || r && v.listener && v.listener.dom7proxy && v.listener.dom7proxy === r ? (p.removeEventListener(d, v.proxyListener, n), c.splice(u, 1)) : r || (p.removeEventListener(d, v.proxyListener, n), c.splice(u, 1));
18578        }
18579      }
18580      return this;
18581    },
18582    trigger: function () {
18583      for (var e = [], t = arguments.length; t--;) e[t] = arguments[t];
18584      for (var s = e[0].split(" "), r = e[1], n = 0; n < s.length; n += 1) for (var o = s[n], l = 0; l < this.length; l += 1) {
18585        var d = this[l],
18586          h = void 0;
18587        try {
18588          h = new a.CustomEvent(o, {
18589            detail: r,
18590            bubbles: !0,
18591            cancelable: !0
18592          });
18593        } catch (e) {
18594          (h = i.createEvent("Event")).initEvent(o, !0, !0), h.detail = r;
18595        }
18596        d.dom7EventData = e.filter(function (e, t) {
18597          return t > 0;
18598        }), d.dispatchEvent(h), d.dom7EventData = [], delete d.dom7EventData;
18599      }
18600      return this;
18601    },
18602    transitionEnd: function (e) {
18603      var t,
18604        i = ["webkitTransitionEnd", "transitionend"],
18605        s = this;
18606      function a(r) {
18607        if (r.target === this) for (e.call(this, r), t = 0; t < i.length; t += 1) s.off(i[t], a);
18608      }
18609      if (e) for (t = 0; t < i.length; t += 1) s.on(i[t], a);
18610      return this;
18611    },
18612    outerWidth: function (e) {
18613      if (this.length > 0) {
18614        if (e) {
18615          var t = this.styles();
18616          return this[0].offsetWidth + parseFloat(t.getPropertyValue("margin-right")) + parseFloat(t.getPropertyValue("margin-left"));
18617        }
18618        return this[0].offsetWidth;
18619      }
18620      return null;
18621    },
18622    outerHeight: function (e) {
18623      if (this.length > 0) {
18624        if (e) {
18625          var t = this.styles();
18626          return this[0].offsetHeight + parseFloat(t.getPropertyValue("margin-top")) + parseFloat(t.getPropertyValue("margin-bottom"));
18627        }
18628        return this[0].offsetHeight;
18629      }
18630      return null;
18631    },
18632    offset: function () {
18633      if (this.length > 0) {
18634        var e = this[0],
18635          t = e.getBoundingClientRect(),
18636          s = i.body,
18637          r = e.clientTop || s.clientTop || 0,
18638          n = e.clientLeft || s.clientLeft || 0,
18639          o = e === a ? a.scrollY : e.scrollTop,
18640          l = e === a ? a.scrollX : e.scrollLeft;
18641        return {
18642          top: t.top + o - r,
18643          left: t.left + l - n
18644        };
18645      }
18646      return null;
18647    },
18648    css: function (e, t) {
18649      var i;
18650      if (1 === arguments.length) {
18651        if ("string" != typeof e) {
18652          for (i = 0; i < this.length; i += 1) for (var s in e) this[i].style[s] = e[s];
18653          return this;
18654        }
18655        if (this[0]) return a.getComputedStyle(this[0], null).getPropertyValue(e);
18656      }
18657      if (2 === arguments.length && "string" == typeof e) {
18658        for (i = 0; i < this.length; i += 1) this[i].style[e] = t;
18659        return this;
18660      }
18661      return this;
18662    },
18663    each: function (e) {
18664      if (!e) return this;
18665      for (var t = 0; t < this.length; t += 1) if (!1 === e.call(this[t], t, this[t])) return this;
18666      return this;
18667    },
18668    html: function (e) {
18669      if (void 0 === e) return this[0] ? this[0].innerHTML : void 0;
18670      for (var t = 0; t < this.length; t += 1) this[t].innerHTML = e;
18671      return this;
18672    },
18673    text: function (e) {
18674      if (void 0 === e) return this[0] ? this[0].textContent.trim() : null;
18675      for (var t = 0; t < this.length; t += 1) this[t].textContent = e;
18676      return this;
18677    },
18678    is: function (e) {
18679      var t,
18680        s,
18681        o = this[0];
18682      if (!o || void 0 === e) return !1;
18683      if ("string" == typeof e) {
18684        if (o.matches) return o.matches(e);
18685        if (o.webkitMatchesSelector) return o.webkitMatchesSelector(e);
18686        if (o.msMatchesSelector) return o.msMatchesSelector(e);
18687        for (t = n(e), s = 0; s < t.length; s += 1) if (t[s] === o) return !0;
18688        return !1;
18689      }
18690      if (e === i) return o === i;
18691      if (e === a) return o === a;
18692      if (e.nodeType || e instanceof r) {
18693        for (t = e.nodeType ? [e] : e, s = 0; s < t.length; s += 1) if (t[s] === o) return !0;
18694        return !1;
18695      }
18696      return !1;
18697    },
18698    index: function () {
18699      var e,
18700        t = this[0];
18701      if (t) {
18702        for (e = 0; null !== (t = t.previousSibling);) 1 === t.nodeType && (e += 1);
18703        return e;
18704      }
18705    },
18706    eq: function (e) {
18707      if (void 0 === e) return this;
18708      var t,
18709        i = this.length;
18710      return new r(e > i - 1 ? [] : e < 0 ? (t = i + e) < 0 ? [] : [this[t]] : [this[e]]);
18711    },
18712    append: function () {
18713      for (var e, t = [], s = arguments.length; s--;) t[s] = arguments[s];
18714      for (var a = 0; a < t.length; a += 1) {
18715        e = t[a];
18716        for (var n = 0; n < this.length; n += 1) if ("string" == typeof e) {
18717          var o = i.createElement("div");
18718          for (o.innerHTML = e; o.firstChild;) this[n].appendChild(o.firstChild);
18719        } else if (e instanceof r) for (var l = 0; l < e.length; l += 1) this[n].appendChild(e[l]);else this[n].appendChild(e);
18720      }
18721      return this;
18722    },
18723    prepend: function (e) {
18724      var t, s;
18725      for (t = 0; t < this.length; t += 1) if ("string" == typeof e) {
18726        var a = i.createElement("div");
18727        for (a.innerHTML = e, s = a.childNodes.length - 1; s >= 0; s -= 1) this[t].insertBefore(a.childNodes[s], this[t].childNodes[0]);
18728      } else if (e instanceof r) for (s = 0; s < e.length; s += 1) this[t].insertBefore(e[s], this[t].childNodes[0]);else this[t].insertBefore(e, this[t].childNodes[0]);
18729      return this;
18730    },
18731    next: function (e) {
18732      return this.length > 0 ? e ? this[0].nextElementSibling && n(this[0].nextElementSibling).is(e) ? new r([this[0].nextElementSibling]) : new r([]) : this[0].nextElementSibling ? new r([this[0].nextElementSibling]) : new r([]) : new r([]);
18733    },
18734    nextAll: function (e) {
18735      var t = [],
18736        i = this[0];
18737      if (!i) return new r([]);
18738      for (; i.nextElementSibling;) {
18739        var s = i.nextElementSibling;
18740        e ? n(s).is(e) && t.push(s) : t.push(s), i = s;
18741      }
18742      return new r(t);
18743    },
18744    prev: function (e) {
18745      if (this.length > 0) {
18746        var t = this[0];
18747        return e ? t.previousElementSibling && n(t.previousElementSibling).is(e) ? new r([t.previousElementSibling]) : new r([]) : t.previousElementSibling ? new r([t.previousElementSibling]) : new r([]);
18748      }
18749      return new r([]);
18750    },
18751    prevAll: function (e) {
18752      var t = [],
18753        i = this[0];
18754      if (!i) return new r([]);
18755      for (; i.previousElementSibling;) {
18756        var s = i.previousElementSibling;
18757        e ? n(s).is(e) && t.push(s) : t.push(s), i = s;
18758      }
18759      return new r(t);
18760    },
18761    parent: function (e) {
18762      for (var t = [], i = 0; i < this.length; i += 1) null !== this[i].parentNode && (e ? n(this[i].parentNode).is(e) && t.push(this[i].parentNode) : t.push(this[i].parentNode));
18763      return n(o(t));
18764    },
18765    parents: function (e) {
18766      for (var t = [], i = 0; i < this.length; i += 1) for (var s = this[i].parentNode; s;) e ? n(s).is(e) && t.push(s) : t.push(s), s = s.parentNode;
18767      return n(o(t));
18768    },
18769    closest: function (e) {
18770      var t = this;
18771      return void 0 === e ? new r([]) : (t.is(e) || (t = t.parents(e).eq(0)), t);
18772    },
18773    find: function (e) {
18774      for (var t = [], i = 0; i < this.length; i += 1) for (var s = this[i].querySelectorAll(e), a = 0; a < s.length; a += 1) t.push(s[a]);
18775      return new r(t);
18776    },
18777    children: function (e) {
18778      for (var t = [], i = 0; i < this.length; i += 1) for (var s = this[i].childNodes, a = 0; a < s.length; a += 1) e ? 1 === s[a].nodeType && n(s[a]).is(e) && t.push(s[a]) : 1 === s[a].nodeType && t.push(s[a]);
18779      return new r(o(t));
18780    },
18781    filter: function (e) {
18782      for (var t = [], i = 0; i < this.length; i += 1) e.call(this[i], i, this[i]) && t.push(this[i]);
18783      return new r(t);
18784    },
18785    remove: function () {
18786      for (var e = 0; e < this.length; e += 1) this[e].parentNode && this[e].parentNode.removeChild(this[e]);
18787      return this;
18788    },
18789    add: function () {
18790      for (var e = [], t = arguments.length; t--;) e[t] = arguments[t];
18791      var i,
18792        s,
18793        a = this;
18794      for (i = 0; i < e.length; i += 1) {
18795        var r = n(e[i]);
18796        for (s = 0; s < r.length; s += 1) a[a.length] = r[s], a.length += 1;
18797      }
18798      return a;
18799    },
18800    styles: function () {
18801      return this[0] ? a.getComputedStyle(this[0], null) : {};
18802    }
18803  };
18804  Object.keys(l).forEach(function (e) {
18805    n.fn[e] = n.fn[e] || l[e];
18806  });
18807  var d = {
18808      deleteProps: function (e) {
18809        var t = e;
18810        Object.keys(t).forEach(function (e) {
18811          try {
18812            t[e] = null;
18813          } catch (e) {}
18814          try {
18815            delete t[e];
18816          } catch (e) {}
18817        });
18818      },
18819      nextTick: function (e, t) {
18820        return void 0 === t && (t = 0), setTimeout(e, t);
18821      },
18822      now: function () {
18823        return Date.now();
18824      },
18825      getTranslate: function (e, t) {
18826        var i, s, r;
18827        void 0 === t && (t = "x");
18828        var n = a.getComputedStyle(e, null);
18829        return a.WebKitCSSMatrix ? ((s = n.transform || n.webkitTransform).split(",").length > 6 && (s = s.split(", ").map(function (e) {
18830          return e.replace(",", ".");
18831        }).join(", ")), r = new a.WebKitCSSMatrix("none" === s ? "" : s)) : i = (r = n.MozTransform || n.OTransform || n.MsTransform || n.msTransform || n.transform || n.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,")).toString().split(","), "x" === t && (s = a.WebKitCSSMatrix ? r.m41 : 16 === i.length ? parseFloat(i[12]) : parseFloat(i[4])), "y" === t && (s = a.WebKitCSSMatrix ? r.m42 : 16 === i.length ? parseFloat(i[13]) : parseFloat(i[5])), s || 0;
18832      },
18833      parseUrlQuery: function (e) {
18834        var t,
18835          i,
18836          s,
18837          r,
18838          n = {},
18839          o = e || a.location.href;
18840        if ("string" == typeof o && o.length) for (r = (i = (o = o.indexOf("?") > -1 ? o.replace(/\S*\?/, "") : "").split("&").filter(function (e) {
18841          return "" !== e;
18842        })).length, t = 0; t < r; t += 1) s = i[t].replace(/#\S+/g, "").split("="), n[decodeURIComponent(s[0])] = void 0 === s[1] ? void 0 : decodeURIComponent(s[1]) || "";
18843        return n;
18844      },
18845      isObject: function (e) {
18846        return "object" == typeof e && null !== e && e.constructor && e.constructor === Object;
18847      },
18848      extend: function () {
18849        for (var e = [], t = arguments.length; t--;) e[t] = arguments[t];
18850        for (var i = Object(e[0]), s = 1; s < e.length; s += 1) {
18851          var a = e[s];
18852          if (null != a) for (var r = Object.keys(Object(a)), n = 0, o = r.length; n < o; n += 1) {
18853            var l = r[n],
18854              h = Object.getOwnPropertyDescriptor(a, l);
18855            void 0 !== h && h.enumerable && (d.isObject(i[l]) && d.isObject(a[l]) ? d.extend(i[l], a[l]) : !d.isObject(i[l]) && d.isObject(a[l]) ? (i[l] = {}, d.extend(i[l], a[l])) : i[l] = a[l]);
18856          }
18857        }
18858        return i;
18859      }
18860    },
18861    h = {
18862      touch: !!("ontouchstart" in a || a.DocumentTouch && i instanceof a.DocumentTouch),
18863      pointerEvents: !!a.PointerEvent && "maxTouchPoints" in a.navigator && a.navigator.maxTouchPoints >= 0,
18864      observer: "MutationObserver" in a || "WebkitMutationObserver" in a,
18865      passiveListener: function () {
18866        var e = !1;
18867        try {
18868          var t = Object.defineProperty({}, "passive", {
18869            get: function () {
18870              e = !0;
18871            }
18872          });
18873          a.addEventListener("testPassiveListener", null, t);
18874        } catch (e) {}
18875        return e;
18876      }(),
18877      gestures: "ongesturestart" in a
18878    },
18879    p = function (e) {
18880      void 0 === e && (e = {});
18881      var t = this;
18882      t.params = e, t.eventsListeners = {}, t.params && t.params.on && Object.keys(t.params.on).forEach(function (e) {
18883        t.on(e, t.params.on[e]);
18884      });
18885    },
18886    c = {
18887      components: {
18888        configurable: !0
18889      }
18890    };
18891  p.prototype.on = function (e, t, i) {
18892    var s = this;
18893    if ("function" != typeof t) return s;
18894    var a = i ? "unshift" : "push";
18895    return e.split(" ").forEach(function (e) {
18896      s.eventsListeners[e] || (s.eventsListeners[e] = []), s.eventsListeners[e][a](t);
18897    }), s;
18898  }, p.prototype.once = function (e, t, i) {
18899    var s = this;
18900    if ("function" != typeof t) return s;
18901    function a() {
18902      for (var i = [], r = arguments.length; r--;) i[r] = arguments[r];
18903      s.off(e, a), a.f7proxy && delete a.f7proxy, t.apply(s, i);
18904    }
18905    return a.f7proxy = t, s.on(e, a, i);
18906  }, p.prototype.off = function (e, t) {
18907    var i = this;
18908    return i.eventsListeners ? (e.split(" ").forEach(function (e) {
18909      void 0 === t ? i.eventsListeners[e] = [] : i.eventsListeners[e] && i.eventsListeners[e].length && i.eventsListeners[e].forEach(function (s, a) {
18910        (s === t || s.f7proxy && s.f7proxy === t) && i.eventsListeners[e].splice(a, 1);
18911      });
18912    }), i) : i;
18913  }, p.prototype.emit = function () {
18914    for (var e = [], t = arguments.length; t--;) e[t] = arguments[t];
18915    var i,
18916      s,
18917      a,
18918      r = this;
18919    if (!r.eventsListeners) return r;
18920    "string" == typeof e[0] || Array.isArray(e[0]) ? (i = e[0], s = e.slice(1, e.length), a = r) : (i = e[0].events, s = e[0].data, a = e[0].context || r);
18921    var n = Array.isArray(i) ? i : i.split(" ");
18922    return n.forEach(function (e) {
18923      if (r.eventsListeners && r.eventsListeners[e]) {
18924        var t = [];
18925        r.eventsListeners[e].forEach(function (e) {
18926          t.push(e);
18927        }), t.forEach(function (e) {
18928          e.apply(a, s);
18929        });
18930      }
18931    }), r;
18932  }, p.prototype.useModulesParams = function (e) {
18933    var t = this;
18934    t.modules && Object.keys(t.modules).forEach(function (i) {
18935      var s = t.modules[i];
18936      s.params && d.extend(e, s.params);
18937    });
18938  }, p.prototype.useModules = function (e) {
18939    void 0 === e && (e = {});
18940    var t = this;
18941    t.modules && Object.keys(t.modules).forEach(function (i) {
18942      var s = t.modules[i],
18943        a = e[i] || {};
18944      s.instance && Object.keys(s.instance).forEach(function (e) {
18945        var i = s.instance[e];
18946        t[e] = "function" == typeof i ? i.bind(t) : i;
18947      }), s.on && t.on && Object.keys(s.on).forEach(function (e) {
18948        t.on(e, s.on[e]);
18949      }), s.create && s.create.bind(t)(a);
18950    });
18951  }, c.components.set = function (e) {
18952    this.use && this.use(e);
18953  }, p.installModule = function (e) {
18954    for (var t = [], i = arguments.length - 1; i-- > 0;) t[i] = arguments[i + 1];
18955    var s = this;
18956    s.prototype.modules || (s.prototype.modules = {});
18957    var a = e.name || Object.keys(s.prototype.modules).length + "_" + d.now();
18958    return s.prototype.modules[a] = e, e.proto && Object.keys(e.proto).forEach(function (t) {
18959      s.prototype[t] = e.proto[t];
18960    }), e.static && Object.keys(e.static).forEach(function (t) {
18961      s[t] = e.static[t];
18962    }), e.install && e.install.apply(s, t), s;
18963  }, p.use = function (e) {
18964    for (var t = [], i = arguments.length - 1; i-- > 0;) t[i] = arguments[i + 1];
18965    var s = this;
18966    return Array.isArray(e) ? (e.forEach(function (e) {
18967      return s.installModule(e);
18968    }), s) : s.installModule.apply(s, [e].concat(t));
18969  }, Object.defineProperties(p, c);
18970  var u = {
18971    updateSize: function () {
18972      var e,
18973        t,
18974        i = this.$el;
18975      e = void 0 !== this.params.width ? this.params.width : i[0].clientWidth, t = void 0 !== this.params.height ? this.params.height : i[0].clientHeight, 0 === e && this.isHorizontal() || 0 === t && this.isVertical() || (e = e - parseInt(i.css("padding-left"), 10) - parseInt(i.css("padding-right"), 10), t = t - parseInt(i.css("padding-top"), 10) - parseInt(i.css("padding-bottom"), 10), d.extend(this, {
18976        width: e,
18977        height: t,
18978        size: this.isHorizontal() ? e : t
18979      }));
18980    },
18981    updateSlides: function () {
18982      var e = this.params,
18983        t = this.$wrapperEl,
18984        i = this.size,
18985        s = this.rtlTranslate,
18986        r = this.wrongRTL,
18987        n = this.virtual && e.virtual.enabled,
18988        o = n ? this.virtual.slides.length : this.slides.length,
18989        l = t.children("." + this.params.slideClass),
18990        h = n ? this.virtual.slides.length : l.length,
18991        p = [],
18992        c = [],
18993        u = [];
18994      function v(t) {
18995        return !e.cssMode || t !== l.length - 1;
18996      }
18997      var f = e.slidesOffsetBefore;
18998      "function" == typeof f && (f = e.slidesOffsetBefore.call(this));
18999      var m = e.slidesOffsetAfter;
19000      "function" == typeof m && (m = e.slidesOffsetAfter.call(this));
19001      var g = this.snapGrid.length,
19002        b = this.snapGrid.length,
19003        w = e.spaceBetween,
19004        y = -f,
19005        x = 0,
19006        E = 0;
19007      if (void 0 !== i) {
19008        var T, S;
19009        "string" == typeof w && w.indexOf("%") >= 0 && (w = parseFloat(w.replace("%", "")) / 100 * i), this.virtualSize = -w, s ? l.css({
19010          marginLeft: "",
19011          marginTop: ""
19012        }) : l.css({
19013          marginRight: "",
19014          marginBottom: ""
19015        }), e.slidesPerColumn > 1 && (T = Math.floor(h / e.slidesPerColumn) === h / this.params.slidesPerColumn ? h : Math.ceil(h / e.slidesPerColumn) * e.slidesPerColumn, "auto" !== e.slidesPerView && "row" === e.slidesPerColumnFill && (T = Math.max(T, e.slidesPerView * e.slidesPerColumn)));
19016        for (var C, M = e.slidesPerColumn, P = T / M, z = Math.floor(h / e.slidesPerColumn), k = 0; k < h; k += 1) {
19017          S = 0;
19018          var $ = l.eq(k);
19019          if (e.slidesPerColumn > 1) {
19020            var L = void 0,
19021              I = void 0,
19022              D = void 0;
19023            if ("row" === e.slidesPerColumnFill && e.slidesPerGroup > 1) {
19024              var O = Math.floor(k / (e.slidesPerGroup * e.slidesPerColumn)),
19025                A = k - e.slidesPerColumn * e.slidesPerGroup * O,
19026                G = 0 === O ? e.slidesPerGroup : Math.min(Math.ceil((h - O * M * e.slidesPerGroup) / M), e.slidesPerGroup);
19027              L = (I = A - (D = Math.floor(A / G)) * G + O * e.slidesPerGroup) + D * T / M, $.css({
19028                "-webkit-box-ordinal-group": L,
19029                "-moz-box-ordinal-group": L,
19030                "-ms-flex-order": L,
19031                "-webkit-order": L,
19032                order: L
19033              });
19034            } else "column" === e.slidesPerColumnFill ? (D = k - (I = Math.floor(k / M)) * M, (I > z || I === z && D === M - 1) && (D += 1) >= M && (D = 0, I += 1)) : I = k - (D = Math.floor(k / P)) * P;
19035            $.css("margin-" + (this.isHorizontal() ? "top" : "left"), 0 !== D && e.spaceBetween && e.spaceBetween + "px");
19036          }
19037          if ("none" !== $.css("display")) {
19038            if ("auto" === e.slidesPerView) {
19039              var H = a.getComputedStyle($[0], null),
19040                B = $[0].style.transform,
19041                N = $[0].style.webkitTransform;
19042              if (B && ($[0].style.transform = "none"), N && ($[0].style.webkitTransform = "none"), e.roundLengths) S = this.isHorizontal() ? $.outerWidth(!0) : $.outerHeight(!0);else if (this.isHorizontal()) {
19043                var X = parseFloat(H.getPropertyValue("width")),
19044                  V = parseFloat(H.getPropertyValue("padding-left")),
19045                  Y = parseFloat(H.getPropertyValue("padding-right")),
19046                  F = parseFloat(H.getPropertyValue("margin-left")),
19047                  W = parseFloat(H.getPropertyValue("margin-right")),
19048                  R = H.getPropertyValue("box-sizing");
19049                S = R && "border-box" === R ? X + F + W : X + V + Y + F + W;
19050              } else {
19051                var q = parseFloat(H.getPropertyValue("height")),
19052                  j = parseFloat(H.getPropertyValue("padding-top")),
19053                  K = parseFloat(H.getPropertyValue("padding-bottom")),
19054                  U = parseFloat(H.getPropertyValue("margin-top")),
19055                  _ = parseFloat(H.getPropertyValue("margin-bottom")),
19056                  Z = H.getPropertyValue("box-sizing");
19057                S = Z && "border-box" === Z ? q + U + _ : q + j + K + U + _;
19058              }
19059              B && ($[0].style.transform = B), N && ($[0].style.webkitTransform = N), e.roundLengths && (S = Math.floor(S));
19060            } else S = (i - (e.slidesPerView - 1) * w) / e.slidesPerView, e.roundLengths && (S = Math.floor(S)), l[k] && (this.isHorizontal() ? l[k].style.width = S + "px" : l[k].style.height = S + "px");
19061            l[k] && (l[k].swiperSlideSize = S), u.push(S), e.centeredSlides ? (y = y + S / 2 + x / 2 + w, 0 === x && 0 !== k && (y = y - i / 2 - w), 0 === k && (y = y - i / 2 - w), Math.abs(y) < .001 && (y = 0), e.roundLengths && (y = Math.floor(y)), E % e.slidesPerGroup == 0 && p.push(y), c.push(y)) : (e.roundLengths && (y = Math.floor(y)), (E - Math.min(this.params.slidesPerGroupSkip, E)) % this.params.slidesPerGroup == 0 && p.push(y), c.push(y), y = y + S + w), this.virtualSize += S + w, x = S, E += 1;
19062          }
19063        }
19064        if (this.virtualSize = Math.max(this.virtualSize, i) + m, s && r && ("slide" === e.effect || "coverflow" === e.effect) && t.css({
19065          width: this.virtualSize + e.spaceBetween + "px"
19066        }), e.setWrapperSize && (this.isHorizontal() ? t.css({
19067          width: this.virtualSize + e.spaceBetween + "px"
19068        }) : t.css({
19069          height: this.virtualSize + e.spaceBetween + "px"
19070        })), e.slidesPerColumn > 1 && (this.virtualSize = (S + e.spaceBetween) * T, this.virtualSize = Math.ceil(this.virtualSize / e.slidesPerColumn) - e.spaceBetween, this.isHorizontal() ? t.css({
19071          width: this.virtualSize + e.spaceBetween + "px"
19072        }) : t.css({
19073          height: this.virtualSize + e.spaceBetween + "px"
19074        }), e.centeredSlides)) {
19075          C = [];
19076          for (var Q = 0; Q < p.length; Q += 1) {
19077            var J = p[Q];
19078            e.roundLengths && (J = Math.floor(J)), p[Q] < this.virtualSize + p[0] && C.push(J);
19079          }
19080          p = C;
19081        }
19082        if (!e.centeredSlides) {
19083          C = [];
19084          for (var ee = 0; ee < p.length; ee += 1) {
19085            var te = p[ee];
19086            e.roundLengths && (te = Math.floor(te)), p[ee] <= this.virtualSize - i && C.push(te);
19087          }
19088          p = C, Math.floor(this.virtualSize - i) - Math.floor(p[p.length - 1]) > 1 && p.push(this.virtualSize - i);
19089        }
19090        if (0 === p.length && (p = [0]), 0 !== e.spaceBetween && (this.isHorizontal() ? s ? l.filter(v).css({
19091          marginLeft: w + "px"
19092        }) : l.filter(v).css({
19093          marginRight: w + "px"
19094        }) : l.filter(v).css({
19095          marginBottom: w + "px"
19096        })), e.centeredSlides && e.centeredSlidesBounds) {
19097          var ie = 0;
19098          u.forEach(function (t) {
19099            ie += t + (e.spaceBetween ? e.spaceBetween : 0);
19100          });
19101          var se = (ie -= e.spaceBetween) - i;
19102          p = p.map(function (e) {
19103            return e < 0 ? -f : e > se ? se + m : e;
19104          });
19105        }
19106        if (e.centerInsufficientSlides) {
19107          var ae = 0;
19108          if (u.forEach(function (t) {
19109            ae += t + (e.spaceBetween ? e.spaceBetween : 0);
19110          }), (ae -= e.spaceBetween) < i) {
19111            var re = (i - ae) / 2;
19112            p.forEach(function (e, t) {
19113              p[t] = e - re;
19114            }), c.forEach(function (e, t) {
19115              c[t] = e + re;
19116            });
19117          }
19118        }
19119        d.extend(this, {
19120          slides: l,
19121          snapGrid: p,
19122          slidesGrid: c,
19123          slidesSizesGrid: u
19124        }), h !== o && this.emit("slidesLengthChange"), p.length !== g && (this.params.watchOverflow && this.checkOverflow(), this.emit("snapGridLengthChange")), c.length !== b && this.emit("slidesGridLengthChange"), (e.watchSlidesProgress || e.watchSlidesVisibility) && this.updateSlidesOffset();
19125      }
19126    },
19127    updateAutoHeight: function (e) {
19128      var t,
19129        i = [],
19130        s = 0;
19131      if ("number" == typeof e ? this.setTransition(e) : !0 === e && this.setTransition(this.params.speed), "auto" !== this.params.slidesPerView && this.params.slidesPerView > 1) {
19132        if (this.params.centeredSlides) this.visibleSlides.each(function (e, t) {
19133          i.push(t);
19134        });else for (t = 0; t < Math.ceil(this.params.slidesPerView); t += 1) {
19135          var a = this.activeIndex + t;
19136          if (a > this.slides.length) break;
19137          i.push(this.slides.eq(a)[0]);
19138        }
19139      } else i.push(this.slides.eq(this.activeIndex)[0]);
19140      for (t = 0; t < i.length; t += 1) if (void 0 !== i[t]) {
19141        var r = i[t].offsetHeight;
19142        s = r > s ? r : s;
19143      }
19144      s && this.$wrapperEl.css("height", s + "px");
19145    },
19146    updateSlidesOffset: function () {
19147      for (var e = this.slides, t = 0; t < e.length; t += 1) e[t].swiperSlideOffset = this.isHorizontal() ? e[t].offsetLeft : e[t].offsetTop;
19148    },
19149    updateSlidesProgress: function (e) {
19150      void 0 === e && (e = this && this.translate || 0);
19151      var t = this.params,
19152        i = this.slides,
19153        s = this.rtlTranslate;
19154      if (0 !== i.length) {
19155        void 0 === i[0].swiperSlideOffset && this.updateSlidesOffset();
19156        var a = -e;
19157        s && (a = e), i.removeClass(t.slideVisibleClass), this.visibleSlidesIndexes = [], this.visibleSlides = [];
19158        for (var r = 0; r < i.length; r += 1) {
19159          var o = i[r],
19160            l = (a + (t.centeredSlides ? this.minTranslate() : 0) - o.swiperSlideOffset) / (o.swiperSlideSize + t.spaceBetween);
19161          if (t.watchSlidesVisibility || t.centeredSlides && t.autoHeight) {
19162            var d = -(a - o.swiperSlideOffset),
19163              h = d + this.slidesSizesGrid[r];
19164            (d >= 0 && d < this.size - 1 || h > 1 && h <= this.size || d <= 0 && h >= this.size) && (this.visibleSlides.push(o), this.visibleSlidesIndexes.push(r), i.eq(r).addClass(t.slideVisibleClass));
19165          }
19166          o.progress = s ? -l : l;
19167        }
19168        this.visibleSlides = n(this.visibleSlides);
19169      }
19170    },
19171    updateProgress: function (e) {
19172      if (void 0 === e) {
19173        var t = this.rtlTranslate ? -1 : 1;
19174        e = this && this.translate && this.translate * t || 0;
19175      }
19176      var i = this.params,
19177        s = this.maxTranslate() - this.minTranslate(),
19178        a = this.progress,
19179        r = this.isBeginning,
19180        n = this.isEnd,
19181        o = r,
19182        l = n;
19183      0 === s ? (a = 0, r = !0, n = !0) : (r = (a = (e - this.minTranslate()) / s) <= 0, n = a >= 1), d.extend(this, {
19184        progress: a,
19185        isBeginning: r,
19186        isEnd: n
19187      }), (i.watchSlidesProgress || i.watchSlidesVisibility || i.centeredSlides && i.autoHeight) && this.updateSlidesProgress(e), r && !o && this.emit("reachBeginning toEdge"), n && !l && this.emit("reachEnd toEdge"), (o && !r || l && !n) && this.emit("fromEdge"), this.emit("progress", a);
19188    },
19189    updateSlidesClasses: function () {
19190      var e,
19191        t = this.slides,
19192        i = this.params,
19193        s = this.$wrapperEl,
19194        a = this.activeIndex,
19195        r = this.realIndex,
19196        n = this.virtual && i.virtual.enabled;
19197      t.removeClass(i.slideActiveClass + " " + i.slideNextClass + " " + i.slidePrevClass + " " + i.slideDuplicateActiveClass + " " + i.slideDuplicateNextClass + " " + i.slideDuplicatePrevClass), (e = n ? this.$wrapperEl.find("." + i.slideClass + '[data-swiper-slide-index="' + a + '"]') : t.eq(a)).addClass(i.slideActiveClass), i.loop && (e.hasClass(i.slideDuplicateClass) ? s.children("." + i.slideClass + ":not(." + i.slideDuplicateClass + ')[data-swiper-slide-index="' + r + '"]').addClass(i.slideDuplicateActiveClass) : s.children("." + i.slideClass + "." + i.slideDuplicateClass + '[data-swiper-slide-index="' + r + '"]').addClass(i.slideDuplicateActiveClass));
19198      var o = e.nextAll("." + i.slideClass).eq(0).addClass(i.slideNextClass);
19199      i.loop && 0 === o.length && (o = t.eq(0)).addClass(i.slideNextClass);
19200      var l = e.prevAll("." + i.slideClass).eq(0).addClass(i.slidePrevClass);
19201      i.loop && 0 === l.length && (l = t.eq(-1)).addClass(i.slidePrevClass), i.loop && (o.hasClass(i.slideDuplicateClass) ? s.children("." + i.slideClass + ":not(." + i.slideDuplicateClass + ')[data-swiper-slide-index="' + o.attr("data-swiper-slide-index") + '"]').addClass(i.slideDuplicateNextClass) : s.children("." + i.slideClass + "." + i.slideDuplicateClass + '[data-swiper-slide-index="' + o.attr("data-swiper-slide-index") + '"]').addClass(i.slideDuplicateNextClass), l.hasClass(i.slideDuplicateClass) ? s.children("." + i.slideClass + ":not(." + i.slideDuplicateClass + ')[data-swiper-slide-index="' + l.attr("data-swiper-slide-index") + '"]').addClass(i.slideDuplicatePrevClass) : s.children("." + i.slideClass + "." + i.slideDuplicateClass + '[data-swiper-slide-index="' + l.attr("data-swiper-slide-index") + '"]').addClass(i.slideDuplicatePrevClass));
19202    },
19203    updateActiveIndex: function (e) {
19204      var t,
19205        i = this.rtlTranslate ? this.translate : -this.translate,
19206        s = this.slidesGrid,
19207        a = this.snapGrid,
19208        r = this.params,
19209        n = this.activeIndex,
19210        o = this.realIndex,
19211        l = this.snapIndex,
19212        h = e;
19213      if (void 0 === h) {
19214        for (var p = 0; p < s.length; p += 1) void 0 !== s[p + 1] ? i >= s[p] && i < s[p + 1] - (s[p + 1] - s[p]) / 2 ? h = p : i >= s[p] && i < s[p + 1] && (h = p + 1) : i >= s[p] && (h = p);
19215        r.normalizeSlideIndex && (h < 0 || void 0 === h) && (h = 0);
19216      }
19217      if (a.indexOf(i) >= 0) t = a.indexOf(i);else {
19218        var c = Math.min(r.slidesPerGroupSkip, h);
19219        t = c + Math.floor((h - c) / r.slidesPerGroup);
19220      }
19221      if (t >= a.length && (t = a.length - 1), h !== n) {
19222        var u = parseInt(this.slides.eq(h).attr("data-swiper-slide-index") || h, 10);
19223        d.extend(this, {
19224          snapIndex: t,
19225          realIndex: u,
19226          previousIndex: n,
19227          activeIndex: h
19228        }), this.emit("activeIndexChange"), this.emit("snapIndexChange"), o !== u && this.emit("realIndexChange"), (this.initialized || this.params.runCallbacksOnInit) && this.emit("slideChange");
19229      } else t !== l && (this.snapIndex = t, this.emit("snapIndexChange"));
19230    },
19231    updateClickedSlide: function (e) {
19232      var t = this.params,
19233        i = n(e.target).closest("." + t.slideClass)[0],
19234        s = !1;
19235      if (i) for (var a = 0; a < this.slides.length; a += 1) this.slides[a] === i && (s = !0);
19236      if (!i || !s) return this.clickedSlide = void 0, void (this.clickedIndex = void 0);
19237      this.clickedSlide = i, this.virtual && this.params.virtual.enabled ? this.clickedIndex = parseInt(n(i).attr("data-swiper-slide-index"), 10) : this.clickedIndex = n(i).index(), t.slideToClickedSlide && void 0 !== this.clickedIndex && this.clickedIndex !== this.activeIndex && this.slideToClickedSlide();
19238    }
19239  };
19240  var v = {
19241    getTranslate: function (e) {
19242      void 0 === e && (e = this.isHorizontal() ? "x" : "y");
19243      var t = this.params,
19244        i = this.rtlTranslate,
19245        s = this.translate,
19246        a = this.$wrapperEl;
19247      if (t.virtualTranslate) return i ? -s : s;
19248      if (t.cssMode) return s;
19249      var r = d.getTranslate(a[0], e);
19250      return i && (r = -r), r || 0;
19251    },
19252    setTranslate: function (e, t) {
19253      var i = this.rtlTranslate,
19254        s = this.params,
19255        a = this.$wrapperEl,
19256        r = this.wrapperEl,
19257        n = this.progress,
19258        o = 0,
19259        l = 0;
19260      this.isHorizontal() ? o = i ? -e : e : l = e, s.roundLengths && (o = Math.floor(o), l = Math.floor(l)), s.cssMode ? r[this.isHorizontal() ? "scrollLeft" : "scrollTop"] = this.isHorizontal() ? -o : -l : s.virtualTranslate || a.transform("translate3d(" + o + "px, " + l + "px, 0px)"), this.previousTranslate = this.translate, this.translate = this.isHorizontal() ? o : l;
19261      var d = this.maxTranslate() - this.minTranslate();
19262      (0 === d ? 0 : (e - this.minTranslate()) / d) !== n && this.updateProgress(e), this.emit("setTranslate", this.translate, t);
19263    },
19264    minTranslate: function () {
19265      return -this.snapGrid[0];
19266    },
19267    maxTranslate: function () {
19268      return -this.snapGrid[this.snapGrid.length - 1];
19269    },
19270    translateTo: function (e, t, i, s, a) {
19271      var r;
19272      void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === i && (i = !0), void 0 === s && (s = !0);
19273      var n = this,
19274        o = n.params,
19275        l = n.wrapperEl;
19276      if (n.animating && o.preventInteractionOnTransition) return !1;
19277      var d,
19278        h = n.minTranslate(),
19279        p = n.maxTranslate();
19280      if (d = s && e > h ? h : s && e < p ? p : e, n.updateProgress(d), o.cssMode) {
19281        var c = n.isHorizontal();
19282        return 0 === t ? l[c ? "scrollLeft" : "scrollTop"] = -d : l.scrollTo ? l.scrollTo(((r = {})[c ? "left" : "top"] = -d, r.behavior = "smooth", r)) : l[c ? "scrollLeft" : "scrollTop"] = -d, !0;
19283      }
19284      return 0 === t ? (n.setTransition(0), n.setTranslate(d), i && (n.emit("beforeTransitionStart", t, a), n.emit("transitionEnd"))) : (n.setTransition(t), n.setTranslate(d), i && (n.emit("beforeTransitionStart", t, a), n.emit("transitionStart")), n.animating || (n.animating = !0, n.onTranslateToWrapperTransitionEnd || (n.onTranslateToWrapperTransitionEnd = function (e) {
19285        n && !n.destroyed && e.target === this && (n.$wrapperEl[0].removeEventListener("transitionend", n.onTranslateToWrapperTransitionEnd), n.$wrapperEl[0].removeEventListener("webkitTransitionEnd", n.onTranslateToWrapperTransitionEnd), n.onTranslateToWrapperTransitionEnd = null, delete n.onTranslateToWrapperTransitionEnd, i && n.emit("transitionEnd"));
19286      }), n.$wrapperEl[0].addEventListener("transitionend", n.onTranslateToWrapperTransitionEnd), n.$wrapperEl[0].addEventListener("webkitTransitionEnd", n.onTranslateToWrapperTransitionEnd))), !0;
19287    }
19288  };
19289  var f = {
19290    setTransition: function (e, t) {
19291      this.params.cssMode || this.$wrapperEl.transition(e), this.emit("setTransition", e, t);
19292    },
19293    transitionStart: function (e, t) {
19294      void 0 === e && (e = !0);
19295      var i = this.activeIndex,
19296        s = this.params,
19297        a = this.previousIndex;
19298      if (!s.cssMode) {
19299        s.autoHeight && this.updateAutoHeight();
19300        var r = t;
19301        if (r || (r = i > a ? "next" : i < a ? "prev" : "reset"), this.emit("transitionStart"), e && i !== a) {
19302          if ("reset" === r) return void this.emit("slideResetTransitionStart");
19303          this.emit("slideChangeTransitionStart"), "next" === r ? this.emit("slideNextTransitionStart") : this.emit("slidePrevTransitionStart");
19304        }
19305      }
19306    },
19307    transitionEnd: function (e, t) {
19308      void 0 === e && (e = !0);
19309      var i = this.activeIndex,
19310        s = this.previousIndex,
19311        a = this.params;
19312      if (this.animating = !1, !a.cssMode) {
19313        this.setTransition(0);
19314        var r = t;
19315        if (r || (r = i > s ? "next" : i < s ? "prev" : "reset"), this.emit("transitionEnd"), e && i !== s) {
19316          if ("reset" === r) return void this.emit("slideResetTransitionEnd");
19317          this.emit("slideChangeTransitionEnd"), "next" === r ? this.emit("slideNextTransitionEnd") : this.emit("slidePrevTransitionEnd");
19318        }
19319      }
19320    }
19321  };
19322  var m = {
19323    slideTo: function (e, t, i, s) {
19324      var a;
19325      void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === i && (i = !0);
19326      var r = this,
19327        n = e;
19328      n < 0 && (n = 0);
19329      var o = r.params,
19330        l = r.snapGrid,
19331        d = r.slidesGrid,
19332        h = r.previousIndex,
19333        p = r.activeIndex,
19334        c = r.rtlTranslate,
19335        u = r.wrapperEl;
19336      if (r.animating && o.preventInteractionOnTransition) return !1;
19337      var v = Math.min(r.params.slidesPerGroupSkip, n),
19338        f = v + Math.floor((n - v) / r.params.slidesPerGroup);
19339      f >= l.length && (f = l.length - 1), (p || o.initialSlide || 0) === (h || 0) && i && r.emit("beforeSlideChangeStart");
19340      var m,
19341        g = -l[f];
19342      if (r.updateProgress(g), o.normalizeSlideIndex) for (var b = 0; b < d.length; b += 1) -Math.floor(100 * g) >= Math.floor(100 * d[b]) && (n = b);
19343      if (r.initialized && n !== p) {
19344        if (!r.allowSlideNext && g < r.translate && g < r.minTranslate()) return !1;
19345        if (!r.allowSlidePrev && g > r.translate && g > r.maxTranslate() && (p || 0) !== n) return !1;
19346      }
19347      if (m = n > p ? "next" : n < p ? "prev" : "reset", c && -g === r.translate || !c && g === r.translate) return r.updateActiveIndex(n), o.autoHeight && r.updateAutoHeight(), r.updateSlidesClasses(), "slide" !== o.effect && r.setTranslate(g), "reset" !== m && (r.transitionStart(i, m), r.transitionEnd(i, m)), !1;
19348      if (o.cssMode) {
19349        var w = r.isHorizontal(),
19350          y = -g;
19351        return c && (y = u.scrollWidth - u.offsetWidth - y), 0 === t ? u[w ? "scrollLeft" : "scrollTop"] = y : u.scrollTo ? u.scrollTo(((a = {})[w ? "left" : "top"] = y, a.behavior = "smooth", a)) : u[w ? "scrollLeft" : "scrollTop"] = y, !0;
19352      }
19353      return 0 === t ? (r.setTransition(0), r.setTranslate(g), r.updateActiveIndex(n), r.updateSlidesClasses(), r.emit("beforeTransitionStart", t, s), r.transitionStart(i, m), r.transitionEnd(i, m)) : (r.setTransition(t), r.setTranslate(g), r.updateActiveIndex(n), r.updateSlidesClasses(), r.emit("beforeTransitionStart", t, s), r.transitionStart(i, m), r.animating || (r.animating = !0, r.onSlideToWrapperTransitionEnd || (r.onSlideToWrapperTransitionEnd = function (e) {
19354        r && !r.destroyed && e.target === this && (r.$wrapperEl[0].removeEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.$wrapperEl[0].removeEventListener("webkitTransitionEnd", r.onSlideToWrapperTransitionEnd), r.onSlideToWrapperTransitionEnd = null, delete r.onSlideToWrapperTransitionEnd, r.transitionEnd(i, m));
19355      }), r.$wrapperEl[0].addEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.$wrapperEl[0].addEventListener("webkitTransitionEnd", r.onSlideToWrapperTransitionEnd))), !0;
19356    },
19357    slideToLoop: function (e, t, i, s) {
19358      void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === i && (i = !0);
19359      var a = e;
19360      return this.params.loop && (a += this.loopedSlides), this.slideTo(a, t, i, s);
19361    },
19362    slideNext: function (e, t, i) {
19363      void 0 === e && (e = this.params.speed), void 0 === t && (t = !0);
19364      var s = this.params,
19365        a = this.animating,
19366        r = this.activeIndex < s.slidesPerGroupSkip ? 1 : s.slidesPerGroup;
19367      if (s.loop) {
19368        if (a) return !1;
19369        this.loopFix(), this._clientLeft = this.$wrapperEl[0].clientLeft;
19370      }
19371      return this.slideTo(this.activeIndex + r, e, t, i);
19372    },
19373    slidePrev: function (e, t, i) {
19374      void 0 === e && (e = this.params.speed), void 0 === t && (t = !0);
19375      var s = this.params,
19376        a = this.animating,
19377        r = this.snapGrid,
19378        n = this.slidesGrid,
19379        o = this.rtlTranslate;
19380      if (s.loop) {
19381        if (a) return !1;
19382        this.loopFix(), this._clientLeft = this.$wrapperEl[0].clientLeft;
19383      }
19384      function l(e) {
19385        return e < 0 ? -Math.floor(Math.abs(e)) : Math.floor(e);
19386      }
19387      var d,
19388        h = l(o ? this.translate : -this.translate),
19389        p = r.map(function (e) {
19390          return l(e);
19391        }),
19392        c = (n.map(function (e) {
19393          return l(e);
19394        }), r[p.indexOf(h)], r[p.indexOf(h) - 1]);
19395      return void 0 === c && s.cssMode && r.forEach(function (e) {
19396        !c && h >= e && (c = e);
19397      }), void 0 !== c && (d = n.indexOf(c)) < 0 && (d = this.activeIndex - 1), this.slideTo(d, e, t, i);
19398    },
19399    slideReset: function (e, t, i) {
19400      return void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), this.slideTo(this.activeIndex, e, t, i);
19401    },
19402    slideToClosest: function (e, t, i, s) {
19403      void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), void 0 === s && (s = .5);
19404      var a = this.activeIndex,
19405        r = Math.min(this.params.slidesPerGroupSkip, a),
19406        n = r + Math.floor((a - r) / this.params.slidesPerGroup),
19407        o = this.rtlTranslate ? this.translate : -this.translate;
19408      if (o >= this.snapGrid[n]) {
19409        var l = this.snapGrid[n];
19410        o - l > (this.snapGrid[n + 1] - l) * s && (a += this.params.slidesPerGroup);
19411      } else {
19412        var d = this.snapGrid[n - 1];
19413        o - d <= (this.snapGrid[n] - d) * s && (a -= this.params.slidesPerGroup);
19414      }
19415      return a = Math.max(a, 0), a = Math.min(a, this.slidesGrid.length - 1), this.slideTo(a, e, t, i);
19416    },
19417    slideToClickedSlide: function () {
19418      var e,
19419        t = this,
19420        i = t.params,
19421        s = t.$wrapperEl,
19422        a = "auto" === i.slidesPerView ? t.slidesPerViewDynamic() : i.slidesPerView,
19423        r = t.clickedIndex;
19424      if (i.loop) {
19425        if (t.animating) return;
19426        e = parseInt(n(t.clickedSlide).attr("data-swiper-slide-index"), 10), i.centeredSlides ? r < t.loopedSlides - a / 2 || r > t.slides.length - t.loopedSlides + a / 2 ? (t.loopFix(), r = s.children("." + i.slideClass + '[data-swiper-slide-index="' + e + '"]:not(.' + i.slideDuplicateClass + ")").eq(0).index(), d.nextTick(function () {
19427          t.slideTo(r);
19428        })) : t.slideTo(r) : r > t.slides.length - a ? (t.loopFix(), r = s.children("." + i.slideClass + '[data-swiper-slide-index="' + e + '"]:not(.' + i.slideDuplicateClass + ")").eq(0).index(), d.nextTick(function () {
19429          t.slideTo(r);
19430        })) : t.slideTo(r);
19431      } else t.slideTo(r);
19432    }
19433  };
19434  var g = {
19435    loopCreate: function () {
19436      var e = this,
19437        t = e.params,
19438        s = e.$wrapperEl;
19439      s.children("." + t.slideClass + "." + t.slideDuplicateClass).remove();
19440      var a = s.children("." + t.slideClass);
19441      if (t.loopFillGroupWithBlank) {
19442        var r = t.slidesPerGroup - a.length % t.slidesPerGroup;
19443        if (r !== t.slidesPerGroup) {
19444          for (var o = 0; o < r; o += 1) {
19445            var l = n(i.createElement("div")).addClass(t.slideClass + " " + t.slideBlankClass);
19446            s.append(l);
19447          }
19448          a = s.children("." + t.slideClass);
19449        }
19450      }
19451      "auto" !== t.slidesPerView || t.loopedSlides || (t.loopedSlides = a.length), e.loopedSlides = Math.ceil(parseFloat(t.loopedSlides || t.slidesPerView, 10)), e.loopedSlides += t.loopAdditionalSlides, e.loopedSlides > a.length && (e.loopedSlides = a.length);
19452      var d = [],
19453        h = [];
19454      a.each(function (t, i) {
19455        var s = n(i);
19456        t < e.loopedSlides && h.push(i), t < a.length && t >= a.length - e.loopedSlides && d.push(i), s.attr("data-swiper-slide-index", t);
19457      });
19458      for (var p = 0; p < h.length; p += 1) s.append(n(h[p].cloneNode(!0)).addClass(t.slideDuplicateClass));
19459      for (var c = d.length - 1; c >= 0; c -= 1) s.prepend(n(d[c].cloneNode(!0)).addClass(t.slideDuplicateClass));
19460    },
19461    loopFix: function () {
19462      this.emit("beforeLoopFix");
19463      var e,
19464        t = this.activeIndex,
19465        i = this.slides,
19466        s = this.loopedSlides,
19467        a = this.allowSlidePrev,
19468        r = this.allowSlideNext,
19469        n = this.snapGrid,
19470        o = this.rtlTranslate;
19471      this.allowSlidePrev = !0, this.allowSlideNext = !0;
19472      var l = -n[t] - this.getTranslate();
19473      if (t < s) e = i.length - 3 * s + t, e += s, this.slideTo(e, 0, !1, !0) && 0 !== l && this.setTranslate((o ? -this.translate : this.translate) - l);else if (t >= i.length - s) {
19474        e = -i.length + t + s, e += s, this.slideTo(e, 0, !1, !0) && 0 !== l && this.setTranslate((o ? -this.translate : this.translate) - l);
19475      }
19476      this.allowSlidePrev = a, this.allowSlideNext = r, this.emit("loopFix");
19477    },
19478    loopDestroy: function () {
19479      var e = this.$wrapperEl,
19480        t = this.params,
19481        i = this.slides;
19482      e.children("." + t.slideClass + "." + t.slideDuplicateClass + ",." + t.slideClass + "." + t.slideBlankClass).remove(), i.removeAttr("data-swiper-slide-index");
19483    }
19484  };
19485  var b = {
19486    setGrabCursor: function (e) {
19487      if (!(h.touch || !this.params.simulateTouch || this.params.watchOverflow && this.isLocked || this.params.cssMode)) {
19488        var t = this.el;
19489        t.style.cursor = "move", t.style.cursor = e ? "-webkit-grabbing" : "-webkit-grab", t.style.cursor = e ? "-moz-grabbin" : "-moz-grab", t.style.cursor = e ? "grabbing" : "grab";
19490      }
19491    },
19492    unsetGrabCursor: function () {
19493      h.touch || this.params.watchOverflow && this.isLocked || this.params.cssMode || (this.el.style.cursor = "");
19494    }
19495  };
19496  var w,
19497    y,
19498    x,
19499    E,
19500    T,
19501    S,
19502    C,
19503    M,
19504    P,
19505    z,
19506    k,
19507    $,
19508    L,
19509    I,
19510    D,
19511    O = {
19512      appendSlide: function (e) {
19513        var t = this.$wrapperEl,
19514          i = this.params;
19515        if (i.loop && this.loopDestroy(), "object" == typeof e && "length" in e) for (var s = 0; s < e.length; s += 1) e[s] && t.append(e[s]);else t.append(e);
19516        i.loop && this.loopCreate(), i.observer && h.observer || this.update();
19517      },
19518      prependSlide: function (e) {
19519        var t = this.params,
19520          i = this.$wrapperEl,
19521          s = this.activeIndex;
19522        t.loop && this.loopDestroy();
19523        var a = s + 1;
19524        if ("object" == typeof e && "length" in e) {
19525          for (var r = 0; r < e.length; r += 1) e[r] && i.prepend(e[r]);
19526          a = s + e.length;
19527        } else i.prepend(e);
19528        t.loop && this.loopCreate(), t.observer && h.observer || this.update(), this.slideTo(a, 0, !1);
19529      },
19530      addSlide: function (e, t) {
19531        var i = this.$wrapperEl,
19532          s = this.params,
19533          a = this.activeIndex;
19534        s.loop && (a -= this.loopedSlides, this.loopDestroy(), this.slides = i.children("." + s.slideClass));
19535        var r = this.slides.length;
19536        if (e <= 0) this.prependSlide(t);else if (e >= r) this.appendSlide(t);else {
19537          for (var n = a > e ? a + 1 : a, o = [], l = r - 1; l >= e; l -= 1) {
19538            var d = this.slides.eq(l);
19539            d.remove(), o.unshift(d);
19540          }
19541          if ("object" == typeof t && "length" in t) {
19542            for (var p = 0; p < t.length; p += 1) t[p] && i.append(t[p]);
19543            n = a > e ? a + t.length : a;
19544          } else i.append(t);
19545          for (var c = 0; c < o.length; c += 1) i.append(o[c]);
19546          s.loop && this.loopCreate(), s.observer && h.observer || this.update(), s.loop ? this.slideTo(n + this.loopedSlides, 0, !1) : this.slideTo(n, 0, !1);
19547        }
19548      },
19549      removeSlide: function (e) {
19550        var t = this.params,
19551          i = this.$wrapperEl,
19552          s = this.activeIndex;
19553        t.loop && (s -= this.loopedSlides, this.loopDestroy(), this.slides = i.children("." + t.slideClass));
19554        var a,
19555          r = s;
19556        if ("object" == typeof e && "length" in e) {
19557          for (var n = 0; n < e.length; n += 1) a = e[n], this.slides[a] && this.slides.eq(a).remove(), a < r && (r -= 1);
19558          r = Math.max(r, 0);
19559        } else a = e, this.slides[a] && this.slides.eq(a).remove(), a < r && (r -= 1), r = Math.max(r, 0);
19560        t.loop && this.loopCreate(), t.observer && h.observer || this.update(), t.loop ? this.slideTo(r + this.loopedSlides, 0, !1) : this.slideTo(r, 0, !1);
19561      },
19562      removeAllSlides: function () {
19563        for (var e = [], t = 0; t < this.slides.length; t += 1) e.push(t);
19564        this.removeSlide(e);
19565      }
19566    },
19567    A = (w = a.navigator.platform, y = a.navigator.userAgent, x = {
19568      ios: !1,
19569      android: !1,
19570      androidChrome: !1,
19571      desktop: !1,
19572      iphone: !1,
19573      ipod: !1,
19574      ipad: !1,
19575      edge: !1,
19576      ie: !1,
19577      firefox: !1,
19578      macos: !1,
19579      windows: !1,
19580      cordova: !(!a.cordova && !a.phonegap),
19581      phonegap: !(!a.cordova && !a.phonegap),
19582      electron: !1
19583    }, E = a.screen.width, T = a.screen.height, S = y.match(/(Android);?[\s\/]+([\d.]+)?/), C = y.match(/(iPad).*OS\s([\d_]+)/), M = y.match(/(iPod)(.*OS\s([\d_]+))?/), P = !C && y.match(/(iPhone\sOS|iOS)\s([\d_]+)/), z = y.indexOf("MSIE ") >= 0 || y.indexOf("Trident/") >= 0, k = y.indexOf("Edge/") >= 0, $ = y.indexOf("Gecko/") >= 0 && y.indexOf("Firefox/") >= 0, L = "Win32" === w, I = y.toLowerCase().indexOf("electron") >= 0, D = "MacIntel" === w, !C && D && h.touch && (1024 === E && 1366 === T || 834 === E && 1194 === T || 834 === E && 1112 === T || 768 === E && 1024 === T) && (C = y.match(/(Version)\/([\d.]+)/), D = !1), x.ie = z, x.edge = k, x.firefox = $, S && !L && (x.os = "android", x.osVersion = S[2], x.android = !0, x.androidChrome = y.toLowerCase().indexOf("chrome") >= 0), (C || P || M) && (x.os = "ios", x.ios = !0), P && !M && (x.osVersion = P[2].replace(/_/g, "."), x.iphone = !0), C && (x.osVersion = C[2].replace(/_/g, "."), x.ipad = !0), M && (x.osVersion = M[3] ? M[3].replace(/_/g, ".") : null, x.ipod = !0), x.ios && x.osVersion && y.indexOf("Version/") >= 0 && "10" === x.osVersion.split(".")[0] && (x.osVersion = y.toLowerCase().split("version/")[1].split(" ")[0]), x.webView = !(!(P || C || M) || !y.match(/.*AppleWebKit(?!.*Safari)/i) && !a.navigator.standalone) || a.matchMedia && a.matchMedia("(display-mode: standalone)").matches, x.webview = x.webView, x.standalone = x.webView, x.desktop = !(x.ios || x.android) || I, x.desktop && (x.electron = I, x.macos = D, x.windows = L, x.macos && (x.os = "macos"), x.windows && (x.os = "windows")), x.pixelRatio = a.devicePixelRatio || 1, x);
19584  function G(e) {
19585    var t = this.touchEventsData,
19586      s = this.params,
19587      r = this.touches;
19588    if (!this.animating || !s.preventInteractionOnTransition) {
19589      var o = e;
19590      o.originalEvent && (o = o.originalEvent);
19591      var l = n(o.target);
19592      if (("wrapper" !== s.touchEventsTarget || l.closest(this.wrapperEl).length) && (t.isTouchEvent = "touchstart" === o.type, (t.isTouchEvent || !("which" in o) || 3 !== o.which) && !(!t.isTouchEvent && "button" in o && o.button > 0 || t.isTouched && t.isMoved))) if (s.noSwiping && l.closest(s.noSwipingSelector ? s.noSwipingSelector : "." + s.noSwipingClass)[0]) this.allowClick = !0;else if (!s.swipeHandler || l.closest(s.swipeHandler)[0]) {
19593        r.currentX = "touchstart" === o.type ? o.targetTouches[0].pageX : o.pageX, r.currentY = "touchstart" === o.type ? o.targetTouches[0].pageY : o.pageY;
19594        var h = r.currentX,
19595          p = r.currentY,
19596          c = s.edgeSwipeDetection || s.iOSEdgeSwipeDetection,
19597          u = s.edgeSwipeThreshold || s.iOSEdgeSwipeThreshold;
19598        if (!c || !(h <= u || h >= a.screen.width - u)) {
19599          if (d.extend(t, {
19600            isTouched: !0,
19601            isMoved: !1,
19602            allowTouchCallbacks: !0,
19603            isScrolling: void 0,
19604            startMoving: void 0
19605          }), r.startX = h, r.startY = p, t.touchStartTime = d.now(), this.allowClick = !0, this.updateSize(), this.swipeDirection = void 0, s.threshold > 0 && (t.allowThresholdMove = !1), "touchstart" !== o.type) {
19606            var v = !0;
19607            l.is(t.formElements) && (v = !1), i.activeElement && n(i.activeElement).is(t.formElements) && i.activeElement !== l[0] && i.activeElement.blur();
19608            var f = v && this.allowTouchMove && s.touchStartPreventDefault;
19609            (s.touchStartForcePreventDefault || f) && o.preventDefault();
19610          }
19611          this.emit("touchStart", o);
19612        }
19613      }
19614    }
19615  }
19616  function H(e) {
19617    var t = this.touchEventsData,
19618      s = this.params,
19619      a = this.touches,
19620      r = this.rtlTranslate,
19621      o = e;
19622    if (o.originalEvent && (o = o.originalEvent), t.isTouched) {
19623      if (!t.isTouchEvent || "touchmove" === o.type) {
19624        var l = "touchmove" === o.type && o.targetTouches && (o.targetTouches[0] || o.changedTouches[0]),
19625          h = "touchmove" === o.type ? l.pageX : o.pageX,
19626          p = "touchmove" === o.type ? l.pageY : o.pageY;
19627        if (o.preventedByNestedSwiper) return a.startX = h, void (a.startY = p);
19628        if (!this.allowTouchMove) return this.allowClick = !1, void (t.isTouched && (d.extend(a, {
19629          startX: h,
19630          startY: p,
19631          currentX: h,
19632          currentY: p
19633        }), t.touchStartTime = d.now()));
19634        if (t.isTouchEvent && s.touchReleaseOnEdges && !s.loop) if (this.isVertical()) {
19635          if (p < a.startY && this.translate <= this.maxTranslate() || p > a.startY && this.translate >= this.minTranslate()) return t.isTouched = !1, void (t.isMoved = !1);
19636        } else if (h < a.startX && this.translate <= this.maxTranslate() || h > a.startX && this.translate >= this.minTranslate()) return;
19637        if (t.isTouchEvent && i.activeElement && o.target === i.activeElement && n(o.target).is(t.formElements)) return t.isMoved = !0, void (this.allowClick = !1);
19638        if (t.allowTouchCallbacks && this.emit("touchMove", o), !(o.targetTouches && o.targetTouches.length > 1)) {
19639          a.currentX = h, a.currentY = p;
19640          var c = a.currentX - a.startX,
19641            u = a.currentY - a.startY;
19642          if (!(this.params.threshold && Math.sqrt(Math.pow(c, 2) + Math.pow(u, 2)) < this.params.threshold)) {
19643            var v;
19644            if (void 0 === t.isScrolling) this.isHorizontal() && a.currentY === a.startY || this.isVertical() && a.currentX === a.startX ? t.isScrolling = !1 : c * c + u * u >= 25 && (v = 180 * Math.atan2(Math.abs(u), Math.abs(c)) / Math.PI, t.isScrolling = this.isHorizontal() ? v > s.touchAngle : 90 - v > s.touchAngle);
19645            if (t.isScrolling && this.emit("touchMoveOpposite", o), void 0 === t.startMoving && (a.currentX === a.startX && a.currentY === a.startY || (t.startMoving = !0)), t.isScrolling) t.isTouched = !1;else if (t.startMoving) {
19646              this.allowClick = !1, !s.cssMode && o.cancelable && o.preventDefault(), s.touchMoveStopPropagation && !s.nested && o.stopPropagation(), t.isMoved || (s.loop && this.loopFix(), t.startTranslate = this.getTranslate(), this.setTransition(0), this.animating && this.$wrapperEl.trigger("webkitTransitionEnd transitionend"), t.allowMomentumBounce = !1, !s.grabCursor || !0 !== this.allowSlideNext && !0 !== this.allowSlidePrev || this.setGrabCursor(!0), this.emit("sliderFirstMove", o)), this.emit("sliderMove", o), t.isMoved = !0;
19647              var f = this.isHorizontal() ? c : u;
19648              a.diff = f, f *= s.touchRatio, r && (f = -f), this.swipeDirection = f > 0 ? "prev" : "next", t.currentTranslate = f + t.startTranslate;
19649              var m = !0,
19650                g = s.resistanceRatio;
19651              if (s.touchReleaseOnEdges && (g = 0), f > 0 && t.currentTranslate > this.minTranslate() ? (m = !1, s.resistance && (t.currentTranslate = this.minTranslate() - 1 + Math.pow(-this.minTranslate() + t.startTranslate + f, g))) : f < 0 && t.currentTranslate < this.maxTranslate() && (m = !1, s.resistance && (t.currentTranslate = this.maxTranslate() + 1 - Math.pow(this.maxTranslate() - t.startTranslate - f, g))), m && (o.preventedByNestedSwiper = !0), !this.allowSlideNext && "next" === this.swipeDirection && t.currentTranslate < t.startTranslate && (t.currentTranslate = t.startTranslate), !this.allowSlidePrev && "prev" === this.swipeDirection && t.currentTranslate > t.startTranslate && (t.currentTranslate = t.startTranslate), s.threshold > 0) {
19652                if (!(Math.abs(f) > s.threshold || t.allowThresholdMove)) return void (t.currentTranslate = t.startTranslate);
19653                if (!t.allowThresholdMove) return t.allowThresholdMove = !0, a.startX = a.currentX, a.startY = a.currentY, t.currentTranslate = t.startTranslate, void (a.diff = this.isHorizontal() ? a.currentX - a.startX : a.currentY - a.startY);
19654              }
19655              s.followFinger && !s.cssMode && ((s.freeMode || s.watchSlidesProgress || s.watchSlidesVisibility) && (this.updateActiveIndex(), this.updateSlidesClasses()), s.freeMode && (0 === t.velocities.length && t.velocities.push({
19656                position: a[this.isHorizontal() ? "startX" : "startY"],
19657                time: t.touchStartTime
19658              }), t.velocities.push({
19659                position: a[this.isHorizontal() ? "currentX" : "currentY"],
19660                time: d.now()
19661              })), this.updateProgress(t.currentTranslate), this.setTranslate(t.currentTranslate));
19662            }
19663          }
19664        }
19665      }
19666    } else t.startMoving && t.isScrolling && this.emit("touchMoveOpposite", o);
19667  }
19668  function B(e) {
19669    var t = this,
19670      i = t.touchEventsData,
19671      s = t.params,
19672      a = t.touches,
19673      r = t.rtlTranslate,
19674      n = t.$wrapperEl,
19675      o = t.slidesGrid,
19676      l = t.snapGrid,
19677      h = e;
19678    if (h.originalEvent && (h = h.originalEvent), i.allowTouchCallbacks && t.emit("touchEnd", h), i.allowTouchCallbacks = !1, !i.isTouched) return i.isMoved && s.grabCursor && t.setGrabCursor(!1), i.isMoved = !1, void (i.startMoving = !1);
19679    s.grabCursor && i.isMoved && i.isTouched && (!0 === t.allowSlideNext || !0 === t.allowSlidePrev) && t.setGrabCursor(!1);
19680    var p,
19681      c = d.now(),
19682      u = c - i.touchStartTime;
19683    if (t.allowClick && (t.updateClickedSlide(h), t.emit("tap click", h), u < 300 && c - i.lastClickTime < 300 && t.emit("doubleTap doubleClick", h)), i.lastClickTime = d.now(), d.nextTick(function () {
19684      t.destroyed || (t.allowClick = !0);
19685    }), !i.isTouched || !i.isMoved || !t.swipeDirection || 0 === a.diff || i.currentTranslate === i.startTranslate) return i.isTouched = !1, i.isMoved = !1, void (i.startMoving = !1);
19686    if (i.isTouched = !1, i.isMoved = !1, i.startMoving = !1, p = s.followFinger ? r ? t.translate : -t.translate : -i.currentTranslate, !s.cssMode) if (s.freeMode) {
19687      if (p < -t.minTranslate()) return void t.slideTo(t.activeIndex);
19688      if (p > -t.maxTranslate()) return void (t.slides.length < l.length ? t.slideTo(l.length - 1) : t.slideTo(t.slides.length - 1));
19689      if (s.freeModeMomentum) {
19690        if (i.velocities.length > 1) {
19691          var v = i.velocities.pop(),
19692            f = i.velocities.pop(),
19693            m = v.position - f.position,
19694            g = v.time - f.time;
19695          t.velocity = m / g, t.velocity /= 2, Math.abs(t.velocity) < s.freeModeMinimumVelocity && (t.velocity = 0), (g > 150 || d.now() - v.time > 300) && (t.velocity = 0);
19696        } else t.velocity = 0;
19697        t.velocity *= s.freeModeMomentumVelocityRatio, i.velocities.length = 0;
19698        var b = 1e3 * s.freeModeMomentumRatio,
19699          w = t.velocity * b,
19700          y = t.translate + w;
19701        r && (y = -y);
19702        var x,
19703          E,
19704          T = !1,
19705          S = 20 * Math.abs(t.velocity) * s.freeModeMomentumBounceRatio;
19706        if (y < t.maxTranslate()) s.freeModeMomentumBounce ? (y + t.maxTranslate() < -S && (y = t.maxTranslate() - S), x = t.maxTranslate(), T = !0, i.allowMomentumBounce = !0) : y = t.maxTranslate(), s.loop && s.centeredSlides && (E = !0);else if (y > t.minTranslate()) s.freeModeMomentumBounce ? (y - t.minTranslate() > S && (y = t.minTranslate() + S), x = t.minTranslate(), T = !0, i.allowMomentumBounce = !0) : y = t.minTranslate(), s.loop && s.centeredSlides && (E = !0);else if (s.freeModeSticky) {
19707          for (var C, M = 0; M < l.length; M += 1) if (l[M] > -y) {
19708            C = M;
19709            break;
19710          }
19711          y = -(y = Math.abs(l[C] - y) < Math.abs(l[C - 1] - y) || "next" === t.swipeDirection ? l[C] : l[C - 1]);
19712        }
19713        if (E && t.once("transitionEnd", function () {
19714          t.loopFix();
19715        }), 0 !== t.velocity) {
19716          if (b = r ? Math.abs((-y - t.translate) / t.velocity) : Math.abs((y - t.translate) / t.velocity), s.freeModeSticky) {
19717            var P = Math.abs((r ? -y : y) - t.translate),
19718              z = t.slidesSizesGrid[t.activeIndex];
19719            b = P < z ? s.speed : P < 2 * z ? 1.5 * s.speed : 2.5 * s.speed;
19720          }
19721        } else if (s.freeModeSticky) return void t.slideToClosest();
19722        s.freeModeMomentumBounce && T ? (t.updateProgress(x), t.setTransition(b), t.setTranslate(y), t.transitionStart(!0, t.swipeDirection), t.animating = !0, n.transitionEnd(function () {
19723          t && !t.destroyed && i.allowMomentumBounce && (t.emit("momentumBounce"), t.setTransition(s.speed), setTimeout(function () {
19724            t.setTranslate(x), n.transitionEnd(function () {
19725              t && !t.destroyed && t.transitionEnd();
19726            });
19727          }, 0));
19728        })) : t.velocity ? (t.updateProgress(y), t.setTransition(b), t.setTranslate(y), t.transitionStart(!0, t.swipeDirection), t.animating || (t.animating = !0, n.transitionEnd(function () {
19729          t && !t.destroyed && t.transitionEnd();
19730        }))) : t.updateProgress(y), t.updateActiveIndex(), t.updateSlidesClasses();
19731      } else if (s.freeModeSticky) return void t.slideToClosest();
19732      (!s.freeModeMomentum || u >= s.longSwipesMs) && (t.updateProgress(), t.updateActiveIndex(), t.updateSlidesClasses());
19733    } else {
19734      for (var k = 0, $ = t.slidesSizesGrid[0], L = 0; L < o.length; L += L < s.slidesPerGroupSkip ? 1 : s.slidesPerGroup) {
19735        var I = L < s.slidesPerGroupSkip - 1 ? 1 : s.slidesPerGroup;
19736        void 0 !== o[L + I] ? p >= o[L] && p < o[L + I] && (k = L, $ = o[L + I] - o[L]) : p >= o[L] && (k = L, $ = o[o.length - 1] - o[o.length - 2]);
19737      }
19738      var D = (p - o[k]) / $,
19739        O = k < s.slidesPerGroupSkip - 1 ? 1 : s.slidesPerGroup;
19740      if (u > s.longSwipesMs) {
19741        if (!s.longSwipes) return void t.slideTo(t.activeIndex);
19742        "next" === t.swipeDirection && (D >= s.longSwipesRatio ? t.slideTo(k + O) : t.slideTo(k)), "prev" === t.swipeDirection && (D > 1 - s.longSwipesRatio ? t.slideTo(k + O) : t.slideTo(k));
19743      } else {
19744        if (!s.shortSwipes) return void t.slideTo(t.activeIndex);
19745        t.navigation && (h.target === t.navigation.nextEl || h.target === t.navigation.prevEl) ? h.target === t.navigation.nextEl ? t.slideTo(k + O) : t.slideTo(k) : ("next" === t.swipeDirection && t.slideTo(k + O), "prev" === t.swipeDirection && t.slideTo(k));
19746      }
19747    }
19748  }
19749  function N() {
19750    var e = this.params,
19751      t = this.el;
19752    if (!t || 0 !== t.offsetWidth) {
19753      e.breakpoints && this.setBreakpoint();
19754      var i = this.allowSlideNext,
19755        s = this.allowSlidePrev,
19756        a = this.snapGrid;
19757      this.allowSlideNext = !0, this.allowSlidePrev = !0, this.updateSize(), this.updateSlides(), this.updateSlidesClasses(), ("auto" === e.slidesPerView || e.slidesPerView > 1) && this.isEnd && !this.isBeginning && !this.params.centeredSlides ? this.slideTo(this.slides.length - 1, 0, !1, !0) : this.slideTo(this.activeIndex, 0, !1, !0), this.autoplay && this.autoplay.running && this.autoplay.paused && this.autoplay.run(), this.allowSlidePrev = s, this.allowSlideNext = i, this.params.watchOverflow && a !== this.snapGrid && this.checkOverflow();
19758    }
19759  }
19760  function X(e) {
19761    this.allowClick || (this.params.preventClicks && e.preventDefault(), this.params.preventClicksPropagation && this.animating && (e.stopPropagation(), e.stopImmediatePropagation()));
19762  }
19763  function V() {
19764    var e = this.wrapperEl,
19765      t = this.rtlTranslate;
19766    this.previousTranslate = this.translate, this.isHorizontal() ? this.translate = t ? e.scrollWidth - e.offsetWidth - e.scrollLeft : -e.scrollLeft : this.translate = -e.scrollTop, -0 === this.translate && (this.translate = 0), this.updateActiveIndex(), this.updateSlidesClasses();
19767    var i = this.maxTranslate() - this.minTranslate();
19768    (0 === i ? 0 : (this.translate - this.minTranslate()) / i) !== this.progress && this.updateProgress(t ? -this.translate : this.translate), this.emit("setTranslate", this.translate, !1);
19769  }
19770  var Y = !1;
19771  function F() {}
19772  var W = {
19773      init: !0,
19774      direction: "horizontal",
19775      touchEventsTarget: "container",
19776      initialSlide: 0,
19777      speed: 300,
19778      cssMode: !1,
19779      updateOnWindowResize: !0,
19780      preventInteractionOnTransition: !1,
19781      edgeSwipeDetection: !1,
19782      edgeSwipeThreshold: 20,
19783      freeMode: !1,
19784      freeModeMomentum: !0,
19785      freeModeMomentumRatio: 1,
19786      freeModeMomentumBounce: !0,
19787      freeModeMomentumBounceRatio: 1,
19788      freeModeMomentumVelocityRatio: 1,
19789      freeModeSticky: !1,
19790      freeModeMinimumVelocity: .02,
19791      autoHeight: !1,
19792      setWrapperSize: !1,
19793      virtualTranslate: !1,
19794      effect: "slide",
19795      breakpoints: void 0,
19796      spaceBetween: 0,
19797      slidesPerView: 1,
19798      slidesPerColumn: 1,
19799      slidesPerColumnFill: "column",
19800      slidesPerGroup: 1,
19801      slidesPerGroupSkip: 0,
19802      centeredSlides: !1,
19803      centeredSlidesBounds: !1,
19804      slidesOffsetBefore: 0,
19805      slidesOffsetAfter: 0,
19806      normalizeSlideIndex: !0,
19807      centerInsufficientSlides: !1,
19808      watchOverflow: !1,
19809      roundLengths: !1,
19810      touchRatio: 1,
19811      touchAngle: 45,
19812      simulateTouch: !0,
19813      shortSwipes: !0,
19814      longSwipes: !0,
19815      longSwipesRatio: .5,
19816      longSwipesMs: 300,
19817      followFinger: !0,
19818      allowTouchMove: !0,
19819      threshold: 0,
19820      touchMoveStopPropagation: !1,
19821      touchStartPreventDefault: !0,
19822      touchStartForcePreventDefault: !1,
19823      touchReleaseOnEdges: !1,
19824      uniqueNavElements: !0,
19825      resistance: !0,
19826      resistanceRatio: .85,
19827      watchSlidesProgress: !1,
19828      watchSlidesVisibility: !1,
19829      grabCursor: !1,
19830      preventClicks: !0,
19831      preventClicksPropagation: !0,
19832      slideToClickedSlide: !1,
19833      preloadImages: !0,
19834      updateOnImagesReady: !0,
19835      loop: !1,
19836      loopAdditionalSlides: 0,
19837      loopedSlides: null,
19838      loopFillGroupWithBlank: !1,
19839      allowSlidePrev: !0,
19840      allowSlideNext: !0,
19841      swipeHandler: null,
19842      noSwiping: !0,
19843      noSwipingClass: "swiper-no-swiping",
19844      noSwipingSelector: null,
19845      passiveListeners: !0,
19846      containerModifierClass: "swiper-container-",
19847      slideClass: "swiper-slide",
19848      slideBlankClass: "swiper-slide-invisible-blank",
19849      slideActiveClass: "swiper-slide-active",
19850      slideDuplicateActiveClass: "swiper-slide-duplicate-active",
19851      slideVisibleClass: "swiper-slide-visible",
19852      slideDuplicateClass: "swiper-slide-duplicate",
19853      slideNextClass: "swiper-slide-next",
19854      slideDuplicateNextClass: "swiper-slide-duplicate-next",
19855      slidePrevClass: "swiper-slide-prev",
19856      slideDuplicatePrevClass: "swiper-slide-duplicate-prev",
19857      wrapperClass: "swiper-wrapper",
19858      runCallbacksOnInit: !0
19859    },
19860    R = {
19861      update: u,
19862      translate: v,
19863      transition: f,
19864      slide: m,
19865      loop: g,
19866      grabCursor: b,
19867      manipulation: O,
19868      events: {
19869        attachEvents: function () {
19870          var e = this.params,
19871            t = this.touchEvents,
19872            s = this.el,
19873            a = this.wrapperEl;
19874          this.onTouchStart = G.bind(this), this.onTouchMove = H.bind(this), this.onTouchEnd = B.bind(this), e.cssMode && (this.onScroll = V.bind(this)), this.onClick = X.bind(this);
19875          var r = !!e.nested;
19876          if (!h.touch && h.pointerEvents) s.addEventListener(t.start, this.onTouchStart, !1), i.addEventListener(t.move, this.onTouchMove, r), i.addEventListener(t.end, this.onTouchEnd, !1);else {
19877            if (h.touch) {
19878              var n = !("touchstart" !== t.start || !h.passiveListener || !e.passiveListeners) && {
19879                passive: !0,
19880                capture: !1
19881              };
19882              s.addEventListener(t.start, this.onTouchStart, n), s.addEventListener(t.move, this.onTouchMove, h.passiveListener ? {
19883                passive: !1,
19884                capture: r
19885              } : r), s.addEventListener(t.end, this.onTouchEnd, n), t.cancel && s.addEventListener(t.cancel, this.onTouchEnd, n), Y || (i.addEventListener("touchstart", F), Y = !0);
19886            }
19887            (e.simulateTouch && !A.ios && !A.android || e.simulateTouch && !h.touch && A.ios) && (s.addEventListener("mousedown", this.onTouchStart, !1), i.addEventListener("mousemove", this.onTouchMove, r), i.addEventListener("mouseup", this.onTouchEnd, !1));
19888          }
19889          (e.preventClicks || e.preventClicksPropagation) && s.addEventListener("click", this.onClick, !0), e.cssMode && a.addEventListener("scroll", this.onScroll), e.updateOnWindowResize ? this.on(A.ios || A.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", N, !0) : this.on("observerUpdate", N, !0);
19890        },
19891        detachEvents: function () {
19892          var e = this.params,
19893            t = this.touchEvents,
19894            s = this.el,
19895            a = this.wrapperEl,
19896            r = !!e.nested;
19897          if (!h.touch && h.pointerEvents) s.removeEventListener(t.start, this.onTouchStart, !1), i.removeEventListener(t.move, this.onTouchMove, r), i.removeEventListener(t.end, this.onTouchEnd, !1);else {
19898            if (h.touch) {
19899              var n = !("onTouchStart" !== t.start || !h.passiveListener || !e.passiveListeners) && {
19900                passive: !0,
19901                capture: !1
19902              };
19903              s.removeEventListener(t.start, this.onTouchStart, n), s.removeEventListener(t.move, this.onTouchMove, r), s.removeEventListener(t.end, this.onTouchEnd, n), t.cancel && s.removeEventListener(t.cancel, this.onTouchEnd, n);
19904            }
19905            (e.simulateTouch && !A.ios && !A.android || e.simulateTouch && !h.touch && A.ios) && (s.removeEventListener("mousedown", this.onTouchStart, !1), i.removeEventListener("mousemove", this.onTouchMove, r), i.removeEventListener("mouseup", this.onTouchEnd, !1));
19906          }
19907          (e.preventClicks || e.preventClicksPropagation) && s.removeEventListener("click", this.onClick, !0), e.cssMode && a.removeEventListener("scroll", this.onScroll), this.off(A.ios || A.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", N);
19908        }
19909      },
19910      breakpoints: {
19911        setBreakpoint: function () {
19912          var e = this.activeIndex,
19913            t = this.initialized,
19914            i = this.loopedSlides;
19915          void 0 === i && (i = 0);
19916          var s = this.params,
19917            a = this.$el,
19918            r = s.breakpoints;
19919          if (r && (!r || 0 !== Object.keys(r).length)) {
19920            var n = this.getBreakpoint(r);
19921            if (n && this.currentBreakpoint !== n) {
19922              var o = n in r ? r[n] : void 0;
19923              o && ["slidesPerView", "spaceBetween", "slidesPerGroup", "slidesPerGroupSkip", "slidesPerColumn"].forEach(function (e) {
19924                var t = o[e];
19925                void 0 !== t && (o[e] = "slidesPerView" !== e || "AUTO" !== t && "auto" !== t ? "slidesPerView" === e ? parseFloat(t) : parseInt(t, 10) : "auto");
19926              });
19927              var l = o || this.originalParams,
19928                h = s.slidesPerColumn > 1,
19929                p = l.slidesPerColumn > 1;
19930              h && !p ? a.removeClass(s.containerModifierClass + "multirow " + s.containerModifierClass + "multirow-column") : !h && p && (a.addClass(s.containerModifierClass + "multirow"), "column" === l.slidesPerColumnFill && a.addClass(s.containerModifierClass + "multirow-column"));
19931              var c = l.direction && l.direction !== s.direction,
19932                u = s.loop && (l.slidesPerView !== s.slidesPerView || c);
19933              c && t && this.changeDirection(), d.extend(this.params, l), d.extend(this, {
19934                allowTouchMove: this.params.allowTouchMove,
19935                allowSlideNext: this.params.allowSlideNext,
19936                allowSlidePrev: this.params.allowSlidePrev
19937              }), this.currentBreakpoint = n, u && t && (this.loopDestroy(), this.loopCreate(), this.updateSlides(), this.slideTo(e - i + this.loopedSlides, 0, !1)), this.emit("breakpoint", l);
19938            }
19939          }
19940        },
19941        getBreakpoint: function (e) {
19942          if (e) {
19943            var t = !1,
19944              i = Object.keys(e).map(function (e) {
19945                if ("string" == typeof e && 0 === e.indexOf("@")) {
19946                  var t = parseFloat(e.substr(1));
19947                  return {
19948                    value: a.innerHeight * t,
19949                    point: e
19950                  };
19951                }
19952                return {
19953                  value: e,
19954                  point: e
19955                };
19956              });
19957            i.sort(function (e, t) {
19958              return parseInt(e.value, 10) - parseInt(t.value, 10);
19959            });
19960            for (var s = 0; s < i.length; s += 1) {
19961              var r = i[s],
19962                n = r.point;
19963              r.value <= a.innerWidth && (t = n);
19964            }
19965            return t || "max";
19966          }
19967        }
19968      },
19969      checkOverflow: {
19970        checkOverflow: function () {
19971          var e = this.params,
19972            t = this.isLocked,
19973            i = this.slides.length > 0 && e.slidesOffsetBefore + e.spaceBetween * (this.slides.length - 1) + this.slides[0].offsetWidth * this.slides.length;
19974          e.slidesOffsetBefore && e.slidesOffsetAfter && i ? this.isLocked = i <= this.size : this.isLocked = 1 === this.snapGrid.length, this.allowSlideNext = !this.isLocked, this.allowSlidePrev = !this.isLocked, t !== this.isLocked && this.emit(this.isLocked ? "lock" : "unlock"), t && t !== this.isLocked && (this.isEnd = !1, this.navigation && this.navigation.update());
19975        }
19976      },
19977      classes: {
19978        addClasses: function () {
19979          var e = this.classNames,
19980            t = this.params,
19981            i = this.rtl,
19982            s = this.$el,
19983            a = [];
19984          a.push("initialized"), a.push(t.direction), t.freeMode && a.push("free-mode"), t.autoHeight && a.push("autoheight"), i && a.push("rtl"), t.slidesPerColumn > 1 && (a.push("multirow"), "column" === t.slidesPerColumnFill && a.push("multirow-column")), A.android && a.push("android"), A.ios && a.push("ios"), t.cssMode && a.push("css-mode"), a.forEach(function (i) {
19985            e.push(t.containerModifierClass + i);
19986          }), s.addClass(e.join(" "));
19987        },
19988        removeClasses: function () {
19989          var e = this.$el,
19990            t = this.classNames;
19991          e.removeClass(t.join(" "));
19992        }
19993      },
19994      images: {
19995        loadImage: function (e, t, i, s, r, o) {
19996          var l;
19997          function d() {
19998            o && o();
19999          }
20000          n(e).parent("picture")[0] || e.complete && r ? d() : t ? ((l = new a.Image()).onload = d, l.onerror = d, s && (l.sizes = s), i && (l.srcset = i), t && (l.src = t)) : d();
20001        },
20002        preloadImages: function () {
20003          var e = this;
20004          function t() {
20005            null != e && e && !e.destroyed && (void 0 !== e.imagesLoaded && (e.imagesLoaded += 1), e.imagesLoaded === e.imagesToLoad.length && (e.params.updateOnImagesReady && e.update(), e.emit("imagesReady")));
20006          }
20007          e.imagesToLoad = e.$el.find("img");
20008          for (var i = 0; i < e.imagesToLoad.length; i += 1) {
20009            var s = e.imagesToLoad[i];
20010            e.loadImage(s, s.currentSrc || s.getAttribute("src"), s.srcset || s.getAttribute("srcset"), s.sizes || s.getAttribute("sizes"), !0, t);
20011          }
20012        }
20013      }
20014    },
20015    q = {},
20016    j = function (e) {
20017      function t() {
20018        for (var i, s, a, r = [], o = arguments.length; o--;) r[o] = arguments[o];
20019        1 === r.length && r[0].constructor && r[0].constructor === Object ? a = r[0] : (s = (i = r)[0], a = i[1]), a || (a = {}), a = d.extend({}, a), s && !a.el && (a.el = s), e.call(this, a), Object.keys(R).forEach(function (e) {
20020          Object.keys(R[e]).forEach(function (i) {
20021            t.prototype[i] || (t.prototype[i] = R[e][i]);
20022          });
20023        });
20024        var l = this;
20025        void 0 === l.modules && (l.modules = {}), Object.keys(l.modules).forEach(function (e) {
20026          var t = l.modules[e];
20027          if (t.params) {
20028            var i = Object.keys(t.params)[0],
20029              s = t.params[i];
20030            if ("object" != typeof s || null === s) return;
20031            if (!(i in a) || !("enabled" in s)) return;
20032            !0 === a[i] && (a[i] = {
20033              enabled: !0
20034            }), "object" != typeof a[i] || "enabled" in a[i] || (a[i].enabled = !0), a[i] || (a[i] = {
20035              enabled: !1
20036            });
20037          }
20038        });
20039        var p = d.extend({}, W);
20040        l.useModulesParams(p), l.params = d.extend({}, p, q, a), l.originalParams = d.extend({}, l.params), l.passedParams = d.extend({}, a), l.$ = n;
20041        var c = n(l.params.el);
20042        if (s = c[0]) {
20043          if (c.length > 1) {
20044            var u = [];
20045            return c.each(function (e, i) {
20046              var s = d.extend({}, a, {
20047                el: i
20048              });
20049              u.push(new t(s));
20050            }), u;
20051          }
20052          var v, f, m;
20053          return s.swiper = l, c.data("swiper", l), s && s.shadowRoot && s.shadowRoot.querySelector ? (v = n(s.shadowRoot.querySelector("." + l.params.wrapperClass))).children = function (e) {
20054            return c.children(e);
20055          } : v = c.children("." + l.params.wrapperClass), d.extend(l, {
20056            $el: c,
20057            el: s,
20058            $wrapperEl: v,
20059            wrapperEl: v[0],
20060            classNames: [],
20061            slides: n(),
20062            slidesGrid: [],
20063            snapGrid: [],
20064            slidesSizesGrid: [],
20065            isHorizontal: function () {
20066              return "horizontal" === l.params.direction;
20067            },
20068            isVertical: function () {
20069              return "vertical" === l.params.direction;
20070            },
20071            rtl: "rtl" === s.dir.toLowerCase() || "rtl" === c.css("direction"),
20072            rtlTranslate: "horizontal" === l.params.direction && ("rtl" === s.dir.toLowerCase() || "rtl" === c.css("direction")),
20073            wrongRTL: "-webkit-box" === v.css("display"),
20074            activeIndex: 0,
20075            realIndex: 0,
20076            isBeginning: !0,
20077            isEnd: !1,
20078            translate: 0,
20079            previousTranslate: 0,
20080            progress: 0,
20081            velocity: 0,
20082            animating: !1,
20083            allowSlideNext: l.params.allowSlideNext,
20084            allowSlidePrev: l.params.allowSlidePrev,
20085            touchEvents: (f = ["touchstart", "touchmove", "touchend", "touchcancel"], m = ["mousedown", "mousemove", "mouseup"], h.pointerEvents && (m = ["pointerdown", "pointermove", "pointerup"]), l.touchEventsTouch = {
20086              start: f[0],
20087              move: f[1],
20088              end: f[2],
20089              cancel: f[3]
20090            }, l.touchEventsDesktop = {
20091              start: m[0],
20092              move: m[1],
20093              end: m[2]
20094            }, h.touch || !l.params.simulateTouch ? l.touchEventsTouch : l.touchEventsDesktop),
20095            touchEventsData: {
20096              isTouched: void 0,
20097              isMoved: void 0,
20098              allowTouchCallbacks: void 0,
20099              touchStartTime: void 0,
20100              isScrolling: void 0,
20101              currentTranslate: void 0,
20102              startTranslate: void 0,
20103              allowThresholdMove: void 0,
20104              formElements: "input, select, option, textarea, button, video, label",
20105              lastClickTime: d.now(),
20106              clickTimeout: void 0,
20107              velocities: [],
20108              allowMomentumBounce: void 0,
20109              isTouchEvent: void 0,
20110              startMoving: void 0
20111            },
20112            allowClick: !0,
20113            allowTouchMove: l.params.allowTouchMove,
20114            touches: {
20115              startX: 0,
20116              startY: 0,
20117              currentX: 0,
20118              currentY: 0,
20119              diff: 0
20120            },
20121            imagesToLoad: [],
20122            imagesLoaded: 0
20123          }), l.useModules(), l.params.init && l.init(), l;
20124        }
20125      }
20126      e && (t.__proto__ = e), t.prototype = Object.create(e && e.prototype), t.prototype.constructor = t;
20127      var i = {
20128        extendedDefaults: {
20129          configurable: !0
20130        },
20131        defaults: {
20132          configurable: !0
20133        },
20134        Class: {
20135          configurable: !0
20136        },
20137        $: {
20138          configurable: !0
20139        }
20140      };
20141      return t.prototype.slidesPerViewDynamic = function () {
20142        var e = this.params,
20143          t = this.slides,
20144          i = this.slidesGrid,
20145          s = this.size,
20146          a = this.activeIndex,
20147          r = 1;
20148        if (e.centeredSlides) {
20149          for (var n, o = t[a].swiperSlideSize, l = a + 1; l < t.length; l += 1) t[l] && !n && (r += 1, (o += t[l].swiperSlideSize) > s && (n = !0));
20150          for (var d = a - 1; d >= 0; d -= 1) t[d] && !n && (r += 1, (o += t[d].swiperSlideSize) > s && (n = !0));
20151        } else for (var h = a + 1; h < t.length; h += 1) i[h] - i[a] < s && (r += 1);
20152        return r;
20153      }, t.prototype.update = function () {
20154        var e = this;
20155        if (e && !e.destroyed) {
20156          var t = e.snapGrid,
20157            i = e.params;
20158          i.breakpoints && e.setBreakpoint(), e.updateSize(), e.updateSlides(), e.updateProgress(), e.updateSlidesClasses(), e.params.freeMode ? (s(), e.params.autoHeight && e.updateAutoHeight()) : (("auto" === e.params.slidesPerView || e.params.slidesPerView > 1) && e.isEnd && !e.params.centeredSlides ? e.slideTo(e.slides.length - 1, 0, !1, !0) : e.slideTo(e.activeIndex, 0, !1, !0)) || s(), i.watchOverflow && t !== e.snapGrid && e.checkOverflow(), e.emit("update");
20159        }
20160        function s() {
20161          var t = e.rtlTranslate ? -1 * e.translate : e.translate,
20162            i = Math.min(Math.max(t, e.maxTranslate()), e.minTranslate());
20163          e.setTranslate(i), e.updateActiveIndex(), e.updateSlidesClasses();
20164        }
20165      }, t.prototype.changeDirection = function (e, t) {
20166        void 0 === t && (t = !0);
20167        var i = this.params.direction;
20168        return e || (e = "horizontal" === i ? "vertical" : "horizontal"), e === i || "horizontal" !== e && "vertical" !== e || (this.$el.removeClass("" + this.params.containerModifierClass + i).addClass("" + this.params.containerModifierClass + e), this.params.direction = e, this.slides.each(function (t, i) {
20169          "vertical" === e ? i.style.width = "" : i.style.height = "";
20170        }), this.emit("changeDirection"), t && this.update()), this;
20171      }, t.prototype.init = function () {
20172        this.initialized || (this.emit("beforeInit"), this.params.breakpoints && this.setBreakpoint(), this.addClasses(), this.params.loop && this.loopCreate(), this.updateSize(), this.updateSlides(), this.params.watchOverflow && this.checkOverflow(), this.params.grabCursor && this.setGrabCursor(), this.params.preloadImages && this.preloadImages(), this.params.loop ? this.slideTo(this.params.initialSlide + this.loopedSlides, 0, this.params.runCallbacksOnInit) : this.slideTo(this.params.initialSlide, 0, this.params.runCallbacksOnInit), this.attachEvents(), this.initialized = !0, this.emit("init"));
20173      }, t.prototype.destroy = function (e, t) {
20174        void 0 === e && (e = !0), void 0 === t && (t = !0);
20175        var i = this,
20176          s = i.params,
20177          a = i.$el,
20178          r = i.$wrapperEl,
20179          n = i.slides;
20180        return void 0 === i.params || i.destroyed || (i.emit("beforeDestroy"), i.initialized = !1, i.detachEvents(), s.loop && i.loopDestroy(), t && (i.removeClasses(), a.removeAttr("style"), r.removeAttr("style"), n && n.length && n.removeClass([s.slideVisibleClass, s.slideActiveClass, s.slideNextClass, s.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")), i.emit("destroy"), Object.keys(i.eventsListeners).forEach(function (e) {
20181          i.off(e);
20182        }), !1 !== e && (i.$el[0].swiper = null, i.$el.data("swiper", null), d.deleteProps(i)), i.destroyed = !0), null;
20183      }, t.extendDefaults = function (e) {
20184        d.extend(q, e);
20185      }, i.extendedDefaults.get = function () {
20186        return q;
20187      }, i.defaults.get = function () {
20188        return W;
20189      }, i.Class.get = function () {
20190        return e;
20191      }, i.$.get = function () {
20192        return n;
20193      }, Object.defineProperties(t, i), t;
20194    }(p),
20195    K = {
20196      name: "device",
20197      proto: {
20198        device: A
20199      },
20200      static: {
20201        device: A
20202      }
20203    },
20204    U = {
20205      name: "support",
20206      proto: {
20207        support: h
20208      },
20209      static: {
20210        support: h
20211      }
20212    },
20213    _ = {
20214      isEdge: !!a.navigator.userAgent.match(/Edge/g),
20215      isSafari: function () {
20216        var e = a.navigator.userAgent.toLowerCase();
20217        return e.indexOf("safari") >= 0 && e.indexOf("chrome") < 0 && e.indexOf("android") < 0;
20218      }(),
20219      isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(a.navigator.userAgent)
20220    },
20221    Z = {
20222      name: "browser",
20223      proto: {
20224        browser: _
20225      },
20226      static: {
20227        browser: _
20228      }
20229    },
20230    Q = {
20231      name: "resize",
20232      create: function () {
20233        var e = this;
20234        d.extend(e, {
20235          resize: {
20236            resizeHandler: function () {
20237              e && !e.destroyed && e.initialized && (e.emit("beforeResize"), e.emit("resize"));
20238            },
20239            orientationChangeHandler: function () {
20240              e && !e.destroyed && e.initialized && e.emit("orientationchange");
20241            }
20242          }
20243        });
20244      },
20245      on: {
20246        init: function () {
20247          a.addEventListener("resize", this.resize.resizeHandler), a.addEventListener("orientationchange", this.resize.orientationChangeHandler);
20248        },
20249        destroy: function () {
20250          a.removeEventListener("resize", this.resize.resizeHandler), a.removeEventListener("orientationchange", this.resize.orientationChangeHandler);
20251        }
20252      }
20253    },
20254    J = {
20255      func: a.MutationObserver || a.WebkitMutationObserver,
20256      attach: function (e, t) {
20257        void 0 === t && (t = {});
20258        var i = this,
20259          s = new (0, J.func)(function (e) {
20260            if (1 !== e.length) {
20261              var t = function () {
20262                i.emit("observerUpdate", e[0]);
20263              };
20264              a.requestAnimationFrame ? a.requestAnimationFrame(t) : a.setTimeout(t, 0);
20265            } else i.emit("observerUpdate", e[0]);
20266          });
20267        s.observe(e, {
20268          attributes: void 0 === t.attributes || t.attributes,
20269          childList: void 0 === t.childList || t.childList,
20270          characterData: void 0 === t.characterData || t.characterData
20271        }), i.observer.observers.push(s);
20272      },
20273      init: function () {
20274        if (h.observer && this.params.observer) {
20275          if (this.params.observeParents) for (var e = this.$el.parents(), t = 0; t < e.length; t += 1) this.observer.attach(e[t]);
20276          this.observer.attach(this.$el[0], {
20277            childList: this.params.observeSlideChildren
20278          }), this.observer.attach(this.$wrapperEl[0], {
20279            attributes: !1
20280          });
20281        }
20282      },
20283      destroy: function () {
20284        this.observer.observers.forEach(function (e) {
20285          e.disconnect();
20286        }), this.observer.observers = [];
20287      }
20288    },
20289    ee = {
20290      name: "observer",
20291      params: {
20292        observer: !1,
20293        observeParents: !1,
20294        observeSlideChildren: !1
20295      },
20296      create: function () {
20297        d.extend(this, {
20298          observer: {
20299            init: J.init.bind(this),
20300            attach: J.attach.bind(this),
20301            destroy: J.destroy.bind(this),
20302            observers: []
20303          }
20304        });
20305      },
20306      on: {
20307        init: function () {
20308          this.observer.init();
20309        },
20310        destroy: function () {
20311          this.observer.destroy();
20312        }
20313      }
20314    },
20315    te = {
20316      update: function (e) {
20317        var t = this,
20318          i = t.params,
20319          s = i.slidesPerView,
20320          a = i.slidesPerGroup,
20321          r = i.centeredSlides,
20322          n = t.params.virtual,
20323          o = n.addSlidesBefore,
20324          l = n.addSlidesAfter,
20325          h = t.virtual,
20326          p = h.from,
20327          c = h.to,
20328          u = h.slides,
20329          v = h.slidesGrid,
20330          f = h.renderSlide,
20331          m = h.offset;
20332        t.updateActiveIndex();
20333        var g,
20334          b,
20335          w,
20336          y = t.activeIndex || 0;
20337        g = t.rtlTranslate ? "right" : t.isHorizontal() ? "left" : "top", r ? (b = Math.floor(s / 2) + a + o, w = Math.floor(s / 2) + a + l) : (b = s + (a - 1) + o, w = a + l);
20338        var x = Math.max((y || 0) - w, 0),
20339          E = Math.min((y || 0) + b, u.length - 1),
20340          T = (t.slidesGrid[x] || 0) - (t.slidesGrid[0] || 0);
20341        function S() {
20342          t.updateSlides(), t.updateProgress(), t.updateSlidesClasses(), t.lazy && t.params.lazy.enabled && t.lazy.load();
20343        }
20344        if (d.extend(t.virtual, {
20345          from: x,
20346          to: E,
20347          offset: T,
20348          slidesGrid: t.slidesGrid
20349        }), p === x && c === E && !e) return t.slidesGrid !== v && T !== m && t.slides.css(g, T + "px"), void t.updateProgress();
20350        if (t.params.virtual.renderExternal) return t.params.virtual.renderExternal.call(t, {
20351          offset: T,
20352          from: x,
20353          to: E,
20354          slides: function () {
20355            for (var e = [], t = x; t <= E; t += 1) e.push(u[t]);
20356            return e;
20357          }()
20358        }), void S();
20359        var C = [],
20360          M = [];
20361        if (e) t.$wrapperEl.find("." + t.params.slideClass).remove();else for (var P = p; P <= c; P += 1) (P < x || P > E) && t.$wrapperEl.find("." + t.params.slideClass + '[data-swiper-slide-index="' + P + '"]').remove();
20362        for (var z = 0; z < u.length; z += 1) z >= x && z <= E && (void 0 === c || e ? M.push(z) : (z > c && M.push(z), z < p && C.push(z)));
20363        M.forEach(function (e) {
20364          t.$wrapperEl.append(f(u[e], e));
20365        }), C.sort(function (e, t) {
20366          return t - e;
20367        }).forEach(function (e) {
20368          t.$wrapperEl.prepend(f(u[e], e));
20369        }), t.$wrapperEl.children(".swiper-slide").css(g, T + "px"), S();
20370      },
20371      renderSlide: function (e, t) {
20372        var i = this.params.virtual;
20373        if (i.cache && this.virtual.cache[t]) return this.virtual.cache[t];
20374        var s = i.renderSlide ? n(i.renderSlide.call(this, e, t)) : n('<div class="' + this.params.slideClass + '" data-swiper-slide-index="' + t + '">' + e + "</div>");
20375        return s.attr("data-swiper-slide-index") || s.attr("data-swiper-slide-index", t), i.cache && (this.virtual.cache[t] = s), s;
20376      },
20377      appendSlide: function (e) {
20378        if ("object" == typeof e && "length" in e) for (var t = 0; t < e.length; t += 1) e[t] && this.virtual.slides.push(e[t]);else this.virtual.slides.push(e);
20379        this.virtual.update(!0);
20380      },
20381      prependSlide: function (e) {
20382        var t = this.activeIndex,
20383          i = t + 1,
20384          s = 1;
20385        if (Array.isArray(e)) {
20386          for (var a = 0; a < e.length; a += 1) e[a] && this.virtual.slides.unshift(e[a]);
20387          i = t + e.length, s = e.length;
20388        } else this.virtual.slides.unshift(e);
20389        if (this.params.virtual.cache) {
20390          var r = this.virtual.cache,
20391            n = {};
20392          Object.keys(r).forEach(function (e) {
20393            var t = r[e],
20394              i = t.attr("data-swiper-slide-index");
20395            i && t.attr("data-swiper-slide-index", parseInt(i, 10) + 1), n[parseInt(e, 10) + s] = t;
20396          }), this.virtual.cache = n;
20397        }
20398        this.virtual.update(!0), this.slideTo(i, 0);
20399      },
20400      removeSlide: function (e) {
20401        if (null != e) {
20402          var t = this.activeIndex;
20403          if (Array.isArray(e)) for (var i = e.length - 1; i >= 0; i -= 1) this.virtual.slides.splice(e[i], 1), this.params.virtual.cache && delete this.virtual.cache[e[i]], e[i] < t && (t -= 1), t = Math.max(t, 0);else this.virtual.slides.splice(e, 1), this.params.virtual.cache && delete this.virtual.cache[e], e < t && (t -= 1), t = Math.max(t, 0);
20404          this.virtual.update(!0), this.slideTo(t, 0);
20405        }
20406      },
20407      removeAllSlides: function () {
20408        this.virtual.slides = [], this.params.virtual.cache && (this.virtual.cache = {}), this.virtual.update(!0), this.slideTo(0, 0);
20409      }
20410    },
20411    ie = {
20412      name: "virtual",
20413      params: {
20414        virtual: {
20415          enabled: !1,
20416          slides: [],
20417          cache: !0,
20418          renderSlide: null,
20419          renderExternal: null,
20420          addSlidesBefore: 0,
20421          addSlidesAfter: 0
20422        }
20423      },
20424      create: function () {
20425        d.extend(this, {
20426          virtual: {
20427            update: te.update.bind(this),
20428            appendSlide: te.appendSlide.bind(this),
20429            prependSlide: te.prependSlide.bind(this),
20430            removeSlide: te.removeSlide.bind(this),
20431            removeAllSlides: te.removeAllSlides.bind(this),
20432            renderSlide: te.renderSlide.bind(this),
20433            slides: this.params.virtual.slides,
20434            cache: {}
20435          }
20436        });
20437      },
20438      on: {
20439        beforeInit: function () {
20440          if (this.params.virtual.enabled) {
20441            this.classNames.push(this.params.containerModifierClass + "virtual");
20442            var e = {
20443              watchSlidesProgress: !0
20444            };
20445            d.extend(this.params, e), d.extend(this.originalParams, e), this.params.initialSlide || this.virtual.update();
20446          }
20447        },
20448        setTranslate: function () {
20449          this.params.virtual.enabled && this.virtual.update();
20450        }
20451      }
20452    },
20453    se = {
20454      handle: function (e) {
20455        var t = this.rtlTranslate,
20456          s = e;
20457        s.originalEvent && (s = s.originalEvent);
20458        var r = s.keyCode || s.charCode,
20459          n = this.params.keyboard.pageUpDown,
20460          o = n && 33 === r,
20461          l = n && 34 === r,
20462          d = 37 === r,
20463          h = 39 === r,
20464          p = 38 === r,
20465          c = 40 === r;
20466        if (!this.allowSlideNext && (this.isHorizontal() && h || this.isVertical() && c || l)) return !1;
20467        if (!this.allowSlidePrev && (this.isHorizontal() && d || this.isVertical() && p || o)) return !1;
20468        if (!(s.shiftKey || s.altKey || s.ctrlKey || s.metaKey || i.activeElement && i.activeElement.nodeName && ("input" === i.activeElement.nodeName.toLowerCase() || "textarea" === i.activeElement.nodeName.toLowerCase()))) {
20469          if (this.params.keyboard.onlyInViewport && (o || l || d || h || p || c)) {
20470            var u = !1;
20471            if (this.$el.parents("." + this.params.slideClass).length > 0 && 0 === this.$el.parents("." + this.params.slideActiveClass).length) return;
20472            var v = a.innerWidth,
20473              f = a.innerHeight,
20474              m = this.$el.offset();
20475            t && (m.left -= this.$el[0].scrollLeft);
20476            for (var g = [[m.left, m.top], [m.left + this.width, m.top], [m.left, m.top + this.height], [m.left + this.width, m.top + this.height]], b = 0; b < g.length; b += 1) {
20477              var w = g[b];
20478              w[0] >= 0 && w[0] <= v && w[1] >= 0 && w[1] <= f && (u = !0);
20479            }
20480            if (!u) return;
20481          }
20482          this.isHorizontal() ? ((o || l || d || h) && (s.preventDefault ? s.preventDefault() : s.returnValue = !1), ((l || h) && !t || (o || d) && t) && this.slideNext(), ((o || d) && !t || (l || h) && t) && this.slidePrev()) : ((o || l || p || c) && (s.preventDefault ? s.preventDefault() : s.returnValue = !1), (l || c) && this.slideNext(), (o || p) && this.slidePrev()), this.emit("keyPress", r);
20483        }
20484      },
20485      enable: function () {
20486        this.keyboard.enabled || (n(i).on("keydown", this.keyboard.handle), this.keyboard.enabled = !0);
20487      },
20488      disable: function () {
20489        this.keyboard.enabled && (n(i).off("keydown", this.keyboard.handle), this.keyboard.enabled = !1);
20490      }
20491    },
20492    ae = {
20493      name: "keyboard",
20494      params: {
20495        keyboard: {
20496          enabled: !1,
20497          onlyInViewport: !0,
20498          pageUpDown: !0
20499        }
20500      },
20501      create: function () {
20502        d.extend(this, {
20503          keyboard: {
20504            enabled: !1,
20505            enable: se.enable.bind(this),
20506            disable: se.disable.bind(this),
20507            handle: se.handle.bind(this)
20508          }
20509        });
20510      },
20511      on: {
20512        init: function () {
20513          this.params.keyboard.enabled && this.keyboard.enable();
20514        },
20515        destroy: function () {
20516          this.keyboard.enabled && this.keyboard.disable();
20517        }
20518      }
20519    };
20520  var re = {
20521      lastScrollTime: d.now(),
20522      lastEventBeforeSnap: void 0,
20523      recentWheelEvents: [],
20524      event: function () {
20525        return a.navigator.userAgent.indexOf("firefox") > -1 ? "DOMMouseScroll" : function () {
20526          var e = "onwheel" in i;
20527          if (!e) {
20528            var t = i.createElement("div");
20529            t.setAttribute("onwheel", "return;"), e = "function" == typeof t.onwheel;
20530          }
20531          return !e && i.implementation && i.implementation.hasFeature && !0 !== i.implementation.hasFeature("", "") && (e = i.implementation.hasFeature("Events.wheel", "3.0")), e;
20532        }() ? "wheel" : "mousewheel";
20533      },
20534      normalize: function (e) {
20535        var t = 0,
20536          i = 0,
20537          s = 0,
20538          a = 0;
20539        return "detail" in e && (i = e.detail), "wheelDelta" in e && (i = -e.wheelDelta / 120), "wheelDeltaY" in e && (i = -e.wheelDeltaY / 120), "wheelDeltaX" in e && (t = -e.wheelDeltaX / 120), "axis" in e && e.axis === e.HORIZONTAL_AXIS && (t = i, i = 0), s = 10 * t, a = 10 * i, "deltaY" in e && (a = e.deltaY), "deltaX" in e && (s = e.deltaX), e.shiftKey && !s && (s = a, a = 0), (s || a) && e.deltaMode && (1 === e.deltaMode ? (s *= 40, a *= 40) : (s *= 800, a *= 800)), s && !t && (t = s < 1 ? -1 : 1), a && !i && (i = a < 1 ? -1 : 1), {
20540          spinX: t,
20541          spinY: i,
20542          pixelX: s,
20543          pixelY: a
20544        };
20545      },
20546      handleMouseEnter: function () {
20547        this.mouseEntered = !0;
20548      },
20549      handleMouseLeave: function () {
20550        this.mouseEntered = !1;
20551      },
20552      handle: function (e) {
20553        var t = e,
20554          i = this,
20555          s = i.params.mousewheel;
20556        i.params.cssMode && t.preventDefault();
20557        var a = i.$el;
20558        if ("container" !== i.params.mousewheel.eventsTarged && (a = n(i.params.mousewheel.eventsTarged)), !i.mouseEntered && !a[0].contains(t.target) && !s.releaseOnEdges) return !0;
20559        t.originalEvent && (t = t.originalEvent);
20560        var r = 0,
20561          o = i.rtlTranslate ? -1 : 1,
20562          l = re.normalize(t);
20563        if (s.forceToAxis) {
20564          if (i.isHorizontal()) {
20565            if (!(Math.abs(l.pixelX) > Math.abs(l.pixelY))) return !0;
20566            r = -l.pixelX * o;
20567          } else {
20568            if (!(Math.abs(l.pixelY) > Math.abs(l.pixelX))) return !0;
20569            r = -l.pixelY;
20570          }
20571        } else r = Math.abs(l.pixelX) > Math.abs(l.pixelY) ? -l.pixelX * o : -l.pixelY;
20572        if (0 === r) return !0;
20573        if (s.invert && (r = -r), i.params.freeMode) {
20574          var h = {
20575              time: d.now(),
20576              delta: Math.abs(r),
20577              direction: Math.sign(r)
20578            },
20579            p = i.mousewheel.lastEventBeforeSnap,
20580            c = p && h.time < p.time + 500 && h.delta <= p.delta && h.direction === p.direction;
20581          if (!c) {
20582            i.mousewheel.lastEventBeforeSnap = void 0, i.params.loop && i.loopFix();
20583            var u = i.getTranslate() + r * s.sensitivity,
20584              v = i.isBeginning,
20585              f = i.isEnd;
20586            if (u >= i.minTranslate() && (u = i.minTranslate()), u <= i.maxTranslate() && (u = i.maxTranslate()), i.setTransition(0), i.setTranslate(u), i.updateProgress(), i.updateActiveIndex(), i.updateSlidesClasses(), (!v && i.isBeginning || !f && i.isEnd) && i.updateSlidesClasses(), i.params.freeModeSticky) {
20587              clearTimeout(i.mousewheel.timeout), i.mousewheel.timeout = void 0;
20588              var m = i.mousewheel.recentWheelEvents;
20589              m.length >= 15 && m.shift();
20590              var g = m.length ? m[m.length - 1] : void 0,
20591                b = m[0];
20592              if (m.push(h), g && (h.delta > g.delta || h.direction !== g.direction)) m.splice(0);else if (m.length >= 15 && h.time - b.time < 500 && b.delta - h.delta >= 1 && h.delta <= 6) {
20593                var w = r > 0 ? .8 : .2;
20594                i.mousewheel.lastEventBeforeSnap = h, m.splice(0), i.mousewheel.timeout = d.nextTick(function () {
20595                  i.slideToClosest(i.params.speed, !0, void 0, w);
20596                }, 0);
20597              }
20598              i.mousewheel.timeout || (i.mousewheel.timeout = d.nextTick(function () {
20599                i.mousewheel.lastEventBeforeSnap = h, m.splice(0), i.slideToClosest(i.params.speed, !0, void 0, .5);
20600              }, 500));
20601            }
20602            if (c || i.emit("scroll", t), i.params.autoplay && i.params.autoplayDisableOnInteraction && i.autoplay.stop(), u === i.minTranslate() || u === i.maxTranslate()) return !0;
20603          }
20604        } else {
20605          var y = {
20606              time: d.now(),
20607              delta: Math.abs(r),
20608              direction: Math.sign(r),
20609              raw: e
20610            },
20611            x = i.mousewheel.recentWheelEvents;
20612          x.length >= 2 && x.shift();
20613          var E = x.length ? x[x.length - 1] : void 0;
20614          if (x.push(y), E ? (y.direction !== E.direction || y.delta > E.delta || y.time > E.time + 150) && i.mousewheel.animateSlider(y) : i.mousewheel.animateSlider(y), i.mousewheel.releaseScroll(y)) return !0;
20615        }
20616        return t.preventDefault ? t.preventDefault() : t.returnValue = !1, !1;
20617      },
20618      animateSlider: function (e) {
20619        return e.delta >= 6 && d.now() - this.mousewheel.lastScrollTime < 60 || (e.direction < 0 ? this.isEnd && !this.params.loop || this.animating || (this.slideNext(), this.emit("scroll", e.raw)) : this.isBeginning && !this.params.loop || this.animating || (this.slidePrev(), this.emit("scroll", e.raw)), this.mousewheel.lastScrollTime = new a.Date().getTime(), !1);
20620      },
20621      releaseScroll: function (e) {
20622        var t = this.params.mousewheel;
20623        if (e.direction < 0) {
20624          if (this.isEnd && !this.params.loop && t.releaseOnEdges) return !0;
20625        } else if (this.isBeginning && !this.params.loop && t.releaseOnEdges) return !0;
20626        return !1;
20627      },
20628      enable: function () {
20629        var e = re.event();
20630        if (this.params.cssMode) return this.wrapperEl.removeEventListener(e, this.mousewheel.handle), !0;
20631        if (!e) return !1;
20632        if (this.mousewheel.enabled) return !1;
20633        var t = this.$el;
20634        return "container" !== this.params.mousewheel.eventsTarged && (t = n(this.params.mousewheel.eventsTarged)), t.on("mouseenter", this.mousewheel.handleMouseEnter), t.on("mouseleave", this.mousewheel.handleMouseLeave), t.on(e, this.mousewheel.handle), this.mousewheel.enabled = !0, !0;
20635      },
20636      disable: function () {
20637        var e = re.event();
20638        if (this.params.cssMode) return this.wrapperEl.addEventListener(e, this.mousewheel.handle), !0;
20639        if (!e) return !1;
20640        if (!this.mousewheel.enabled) return !1;
20641        var t = this.$el;
20642        return "container" !== this.params.mousewheel.eventsTarged && (t = n(this.params.mousewheel.eventsTarged)), t.off(e, this.mousewheel.handle), this.mousewheel.enabled = !1, !0;
20643      }
20644    },
20645    ne = {
20646      update: function () {
20647        var e = this.params.navigation;
20648        if (!this.params.loop) {
20649          var t = this.navigation,
20650            i = t.$nextEl,
20651            s = t.$prevEl;
20652          s && s.length > 0 && (this.isBeginning ? s.addClass(e.disabledClass) : s.removeClass(e.disabledClass), s[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](e.lockClass)), i && i.length > 0 && (this.isEnd ? i.addClass(e.disabledClass) : i.removeClass(e.disabledClass), i[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](e.lockClass));
20653        }
20654      },
20655      onPrevClick: function (e) {
20656        e.preventDefault(), this.isBeginning && !this.params.loop || this.slidePrev();
20657      },
20658      onNextClick: function (e) {
20659        e.preventDefault(), this.isEnd && !this.params.loop || this.slideNext();
20660      },
20661      init: function () {
20662        var e,
20663          t,
20664          i = this.params.navigation;
20665        (i.nextEl || i.prevEl) && (i.nextEl && (e = n(i.nextEl), this.params.uniqueNavElements && "string" == typeof i.nextEl && e.length > 1 && 1 === this.$el.find(i.nextEl).length && (e = this.$el.find(i.nextEl))), i.prevEl && (t = n(i.prevEl), this.params.uniqueNavElements && "string" == typeof i.prevEl && t.length > 1 && 1 === this.$el.find(i.prevEl).length && (t = this.$el.find(i.prevEl))), e && e.length > 0 && e.on("click", this.navigation.onNextClick), t && t.length > 0 && t.on("click", this.navigation.onPrevClick), d.extend(this.navigation, {
20666          $nextEl: e,
20667          nextEl: e && e[0],
20668          $prevEl: t,
20669          prevEl: t && t[0]
20670        }));
20671      },
20672      destroy: function () {
20673        var e = this.navigation,
20674          t = e.$nextEl,
20675          i = e.$prevEl;
20676        t && t.length && (t.off("click", this.navigation.onNextClick), t.removeClass(this.params.navigation.disabledClass)), i && i.length && (i.off("click", this.navigation.onPrevClick), i.removeClass(this.params.navigation.disabledClass));
20677      }
20678    },
20679    oe = {
20680      update: function () {
20681        var e = this.rtl,
20682          t = this.params.pagination;
20683        if (t.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length) {
20684          var i,
20685            s = this.virtual && this.params.virtual.enabled ? this.virtual.slides.length : this.slides.length,
20686            a = this.pagination.$el,
20687            r = this.params.loop ? Math.ceil((s - 2 * this.loopedSlides) / this.params.slidesPerGroup) : this.snapGrid.length;
20688          if (this.params.loop ? ((i = Math.ceil((this.activeIndex - this.loopedSlides) / this.params.slidesPerGroup)) > s - 1 - 2 * this.loopedSlides && (i -= s - 2 * this.loopedSlides), i > r - 1 && (i -= r), i < 0 && "bullets" !== this.params.paginationType && (i = r + i)) : i = void 0 !== this.snapIndex ? this.snapIndex : this.activeIndex || 0, "bullets" === t.type && this.pagination.bullets && this.pagination.bullets.length > 0) {
20689            var o,
20690              l,
20691              d,
20692              h = this.pagination.bullets;
20693            if (t.dynamicBullets && (this.pagination.bulletSize = h.eq(0)[this.isHorizontal() ? "outerWidth" : "outerHeight"](!0), a.css(this.isHorizontal() ? "width" : "height", this.pagination.bulletSize * (t.dynamicMainBullets + 4) + "px"), t.dynamicMainBullets > 1 && void 0 !== this.previousIndex && (this.pagination.dynamicBulletIndex += i - this.previousIndex, this.pagination.dynamicBulletIndex > t.dynamicMainBullets - 1 ? this.pagination.dynamicBulletIndex = t.dynamicMainBullets - 1 : this.pagination.dynamicBulletIndex < 0 && (this.pagination.dynamicBulletIndex = 0)), o = i - this.pagination.dynamicBulletIndex, d = ((l = o + (Math.min(h.length, t.dynamicMainBullets) - 1)) + o) / 2), h.removeClass(t.bulletActiveClass + " " + t.bulletActiveClass + "-next " + t.bulletActiveClass + "-next-next " + t.bulletActiveClass + "-prev " + t.bulletActiveClass + "-prev-prev " + t.bulletActiveClass + "-main"), a.length > 1) h.each(function (e, s) {
20694              var a = n(s),
20695                r = a.index();
20696              r === i && a.addClass(t.bulletActiveClass), t.dynamicBullets && (r >= o && r <= l && a.addClass(t.bulletActiveClass + "-main"), r === o && a.prev().addClass(t.bulletActiveClass + "-prev").prev().addClass(t.bulletActiveClass + "-prev-prev"), r === l && a.next().addClass(t.bulletActiveClass + "-next").next().addClass(t.bulletActiveClass + "-next-next"));
20697            });else {
20698              var p = h.eq(i),
20699                c = p.index();
20700              if (p.addClass(t.bulletActiveClass), t.dynamicBullets) {
20701                for (var u = h.eq(o), v = h.eq(l), f = o; f <= l; f += 1) h.eq(f).addClass(t.bulletActiveClass + "-main");
20702                if (this.params.loop) {
20703                  if (c >= h.length - t.dynamicMainBullets) {
20704                    for (var m = t.dynamicMainBullets; m >= 0; m -= 1) h.eq(h.length - m).addClass(t.bulletActiveClass + "-main");
20705                    h.eq(h.length - t.dynamicMainBullets - 1).addClass(t.bulletActiveClass + "-prev");
20706                  } else u.prev().addClass(t.bulletActiveClass + "-prev").prev().addClass(t.bulletActiveClass + "-prev-prev"), v.next().addClass(t.bulletActiveClass + "-next").next().addClass(t.bulletActiveClass + "-next-next");
20707                } else u.prev().addClass(t.bulletActiveClass + "-prev").prev().addClass(t.bulletActiveClass + "-prev-prev"), v.next().addClass(t.bulletActiveClass + "-next").next().addClass(t.bulletActiveClass + "-next-next");
20708              }
20709            }
20710            if (t.dynamicBullets) {
20711              var g = Math.min(h.length, t.dynamicMainBullets + 4),
20712                b = (this.pagination.bulletSize * g - this.pagination.bulletSize) / 2 - d * this.pagination.bulletSize,
20713                w = e ? "right" : "left";
20714              h.css(this.isHorizontal() ? w : "top", b + "px");
20715            }
20716          }
20717          if ("fraction" === t.type && (a.find("." + t.currentClass).text(t.formatFractionCurrent(i + 1)), a.find("." + t.totalClass).text(t.formatFractionTotal(r))), "progressbar" === t.type) {
20718            var y;
20719            y = t.progressbarOpposite ? this.isHorizontal() ? "vertical" : "horizontal" : this.isHorizontal() ? "horizontal" : "vertical";
20720            var x = (i + 1) / r,
20721              E = 1,
20722              T = 1;
20723            "horizontal" === y ? E = x : T = x, a.find("." + t.progressbarFillClass).transform("translate3d(0,0,0) scaleX(" + E + ") scaleY(" + T + ")").transition(this.params.speed);
20724          }
20725          "custom" === t.type && t.renderCustom ? (a.html(t.renderCustom(this, i + 1, r)), this.emit("paginationRender", this, a[0])) : this.emit("paginationUpdate", this, a[0]), a[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](t.lockClass);
20726        }
20727      },
20728      render: function () {
20729        var e = this.params.pagination;
20730        if (e.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length) {
20731          var t = this.virtual && this.params.virtual.enabled ? this.virtual.slides.length : this.slides.length,
20732            i = this.pagination.$el,
20733            s = "";
20734          if ("bullets" === e.type) {
20735            for (var a = this.params.loop ? Math.ceil((t - 2 * this.loopedSlides) / this.params.slidesPerGroup) : this.snapGrid.length, r = 0; r < a; r += 1) e.renderBullet ? s += e.renderBullet.call(this, r, e.bulletClass) : s += "<" + e.bulletElement + ' class="' + e.bulletClass + '"></' + e.bulletElement + ">";
20736            i.html(s), this.pagination.bullets = i.find("." + e.bulletClass);
20737          }
20738          "fraction" === e.type && (s = e.renderFraction ? e.renderFraction.call(this, e.currentClass, e.totalClass) : '<span class="' + e.currentClass + '"></span> / <span class="' + e.totalClass + '"></span>', i.html(s)), "progressbar" === e.type && (s = e.renderProgressbar ? e.renderProgressbar.call(this, e.progressbarFillClass) : '<span class="' + e.progressbarFillClass + '"></span>', i.html(s)), "custom" !== e.type && this.emit("paginationRender", this.pagination.$el[0]);
20739        }
20740      },
20741      init: function () {
20742        var e = this,
20743          t = e.params.pagination;
20744        if (t.el) {
20745          var i = n(t.el);
20746          0 !== i.length && (e.params.uniqueNavElements && "string" == typeof t.el && i.length > 1 && (i = e.$el.find(t.el)), "bullets" === t.type && t.clickable && i.addClass(t.clickableClass), i.addClass(t.modifierClass + t.type), "bullets" === t.type && t.dynamicBullets && (i.addClass("" + t.modifierClass + t.type + "-dynamic"), e.pagination.dynamicBulletIndex = 0, t.dynamicMainBullets < 1 && (t.dynamicMainBullets = 1)), "progressbar" === t.type && t.progressbarOpposite && i.addClass(t.progressbarOppositeClass), t.clickable && i.on("click", "." + t.bulletClass, function (t) {
20747            t.preventDefault();
20748            var i = n(this).index() * e.params.slidesPerGroup;
20749            e.params.loop && (i += e.loopedSlides), e.slideTo(i);
20750          }), d.extend(e.pagination, {
20751            $el: i,
20752            el: i[0]
20753          }));
20754        }
20755      },
20756      destroy: function () {
20757        var e = this.params.pagination;
20758        if (e.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length) {
20759          var t = this.pagination.$el;
20760          t.removeClass(e.hiddenClass), t.removeClass(e.modifierClass + e.type), this.pagination.bullets && this.pagination.bullets.removeClass(e.bulletActiveClass), e.clickable && t.off("click", "." + e.bulletClass);
20761        }
20762      }
20763    },
20764    le = {
20765      setTranslate: function () {
20766        if (this.params.scrollbar.el && this.scrollbar.el) {
20767          var e = this.scrollbar,
20768            t = this.rtlTranslate,
20769            i = this.progress,
20770            s = e.dragSize,
20771            a = e.trackSize,
20772            r = e.$dragEl,
20773            n = e.$el,
20774            o = this.params.scrollbar,
20775            l = s,
20776            d = (a - s) * i;
20777          t ? (d = -d) > 0 ? (l = s - d, d = 0) : -d + s > a && (l = a + d) : d < 0 ? (l = s + d, d = 0) : d + s > a && (l = a - d), this.isHorizontal() ? (r.transform("translate3d(" + d + "px, 0, 0)"), r[0].style.width = l + "px") : (r.transform("translate3d(0px, " + d + "px, 0)"), r[0].style.height = l + "px"), o.hide && (clearTimeout(this.scrollbar.timeout), n[0].style.opacity = 1, this.scrollbar.timeout = setTimeout(function () {
20778            n[0].style.opacity = 0, n.transition(400);
20779          }, 1e3));
20780        }
20781      },
20782      setTransition: function (e) {
20783        this.params.scrollbar.el && this.scrollbar.el && this.scrollbar.$dragEl.transition(e);
20784      },
20785      updateSize: function () {
20786        if (this.params.scrollbar.el && this.scrollbar.el) {
20787          var e = this.scrollbar,
20788            t = e.$dragEl,
20789            i = e.$el;
20790          t[0].style.width = "", t[0].style.height = "";
20791          var s,
20792            a = this.isHorizontal() ? i[0].offsetWidth : i[0].offsetHeight,
20793            r = this.size / this.virtualSize,
20794            n = r * (a / this.size);
20795          s = "auto" === this.params.scrollbar.dragSize ? a * r : parseInt(this.params.scrollbar.dragSize, 10), this.isHorizontal() ? t[0].style.width = s + "px" : t[0].style.height = s + "px", i[0].style.display = r >= 1 ? "none" : "", this.params.scrollbar.hide && (i[0].style.opacity = 0), d.extend(e, {
20796            trackSize: a,
20797            divider: r,
20798            moveDivider: n,
20799            dragSize: s
20800          }), e.$el[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](this.params.scrollbar.lockClass);
20801        }
20802      },
20803      getPointerPosition: function (e) {
20804        return this.isHorizontal() ? "touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0].clientX : e.clientX : "touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0].clientY : e.clientY;
20805      },
20806      setDragPosition: function (e) {
20807        var t,
20808          i = this.scrollbar,
20809          s = this.rtlTranslate,
20810          a = i.$el,
20811          r = i.dragSize,
20812          n = i.trackSize,
20813          o = i.dragStartPos;
20814        t = (i.getPointerPosition(e) - a.offset()[this.isHorizontal() ? "left" : "top"] - (null !== o ? o : r / 2)) / (n - r), t = Math.max(Math.min(t, 1), 0), s && (t = 1 - t);
20815        var l = this.minTranslate() + (this.maxTranslate() - this.minTranslate()) * t;
20816        this.updateProgress(l), this.setTranslate(l), this.updateActiveIndex(), this.updateSlidesClasses();
20817      },
20818      onDragStart: function (e) {
20819        var t = this.params.scrollbar,
20820          i = this.scrollbar,
20821          s = this.$wrapperEl,
20822          a = i.$el,
20823          r = i.$dragEl;
20824        this.scrollbar.isTouched = !0, this.scrollbar.dragStartPos = e.target === r[0] || e.target === r ? i.getPointerPosition(e) - e.target.getBoundingClientRect()[this.isHorizontal() ? "left" : "top"] : null, e.preventDefault(), e.stopPropagation(), s.transition(100), r.transition(100), i.setDragPosition(e), clearTimeout(this.scrollbar.dragTimeout), a.transition(0), t.hide && a.css("opacity", 1), this.params.cssMode && this.$wrapperEl.css("scroll-snap-type", "none"), this.emit("scrollbarDragStart", e);
20825      },
20826      onDragMove: function (e) {
20827        var t = this.scrollbar,
20828          i = this.$wrapperEl,
20829          s = t.$el,
20830          a = t.$dragEl;
20831        this.scrollbar.isTouched && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, t.setDragPosition(e), i.transition(0), s.transition(0), a.transition(0), this.emit("scrollbarDragMove", e));
20832      },
20833      onDragEnd: function (e) {
20834        var t = this.params.scrollbar,
20835          i = this.scrollbar,
20836          s = this.$wrapperEl,
20837          a = i.$el;
20838        this.scrollbar.isTouched && (this.scrollbar.isTouched = !1, this.params.cssMode && (this.$wrapperEl.css("scroll-snap-type", ""), s.transition("")), t.hide && (clearTimeout(this.scrollbar.dragTimeout), this.scrollbar.dragTimeout = d.nextTick(function () {
20839          a.css("opacity", 0), a.transition(400);
20840        }, 1e3)), this.emit("scrollbarDragEnd", e), t.snapOnRelease && this.slideToClosest());
20841      },
20842      enableDraggable: function () {
20843        if (this.params.scrollbar.el) {
20844          var e = this.scrollbar,
20845            t = this.touchEventsTouch,
20846            s = this.touchEventsDesktop,
20847            a = this.params,
20848            r = e.$el[0],
20849            n = !(!h.passiveListener || !a.passiveListeners) && {
20850              passive: !1,
20851              capture: !1
20852            },
20853            o = !(!h.passiveListener || !a.passiveListeners) && {
20854              passive: !0,
20855              capture: !1
20856            };
20857          h.touch ? (r.addEventListener(t.start, this.scrollbar.onDragStart, n), r.addEventListener(t.move, this.scrollbar.onDragMove, n), r.addEventListener(t.end, this.scrollbar.onDragEnd, o)) : (r.addEventListener(s.start, this.scrollbar.onDragStart, n), i.addEventListener(s.move, this.scrollbar.onDragMove, n), i.addEventListener(s.end, this.scrollbar.onDragEnd, o));
20858        }
20859      },
20860      disableDraggable: function () {
20861        if (this.params.scrollbar.el) {
20862          var e = this.scrollbar,
20863            t = this.touchEventsTouch,
20864            s = this.touchEventsDesktop,
20865            a = this.params,
20866            r = e.$el[0],
20867            n = !(!h.passiveListener || !a.passiveListeners) && {
20868              passive: !1,
20869              capture: !1
20870            },
20871            o = !(!h.passiveListener || !a.passiveListeners) && {
20872              passive: !0,
20873              capture: !1
20874            };
20875          h.touch ? (r.removeEventListener(t.start, this.scrollbar.onDragStart, n), r.removeEventListener(t.move, this.scrollbar.onDragMove, n), r.removeEventListener(t.end, this.scrollbar.onDragEnd, o)) : (r.removeEventListener(s.start, this.scrollbar.onDragStart, n), i.removeEventListener(s.move, this.scrollbar.onDragMove, n), i.removeEventListener(s.end, this.scrollbar.onDragEnd, o));
20876        }
20877      },
20878      init: function () {
20879        if (this.params.scrollbar.el) {
20880          var e = this.scrollbar,
20881            t = this.$el,
20882            i = this.params.scrollbar,
20883            s = n(i.el);
20884          this.params.uniqueNavElements && "string" == typeof i.el && s.length > 1 && 1 === t.find(i.el).length && (s = t.find(i.el));
20885          var a = s.find("." + this.params.scrollbar.dragClass);
20886          0 === a.length && (a = n('<div class="' + this.params.scrollbar.dragClass + '"></div>'), s.append(a)), d.extend(e, {
20887            $el: s,
20888            el: s[0],
20889            $dragEl: a,
20890            dragEl: a[0]
20891          }), i.draggable && e.enableDraggable();
20892        }
20893      },
20894      destroy: function () {
20895        this.scrollbar.disableDraggable();
20896      }
20897    },
20898    de = {
20899      setTransform: function (e, t) {
20900        var i = this.rtl,
20901          s = n(e),
20902          a = i ? -1 : 1,
20903          r = s.attr("data-swiper-parallax") || "0",
20904          o = s.attr("data-swiper-parallax-x"),
20905          l = s.attr("data-swiper-parallax-y"),
20906          d = s.attr("data-swiper-parallax-scale"),
20907          h = s.attr("data-swiper-parallax-opacity");
20908        if (o || l ? (o = o || "0", l = l || "0") : this.isHorizontal() ? (o = r, l = "0") : (l = r, o = "0"), o = o.indexOf("%") >= 0 ? parseInt(o, 10) * t * a + "%" : o * t * a + "px", l = l.indexOf("%") >= 0 ? parseInt(l, 10) * t + "%" : l * t + "px", null != h) {
20909          var p = h - (h - 1) * (1 - Math.abs(t));
20910          s[0].style.opacity = p;
20911        }
20912        if (null == d) s.transform("translate3d(" + o + ", " + l + ", 0px)");else {
20913          var c = d - (d - 1) * (1 - Math.abs(t));
20914          s.transform("translate3d(" + o + ", " + l + ", 0px) scale(" + c + ")");
20915        }
20916      },
20917      setTranslate: function () {
20918        var e = this,
20919          t = e.$el,
20920          i = e.slides,
20921          s = e.progress,
20922          a = e.snapGrid;
20923        t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (t, i) {
20924          e.parallax.setTransform(i, s);
20925        }), i.each(function (t, i) {
20926          var r = i.progress;
20927          e.params.slidesPerGroup > 1 && "auto" !== e.params.slidesPerView && (r += Math.ceil(t / 2) - s * (a.length - 1)), r = Math.min(Math.max(r, -1), 1), n(i).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (t, i) {
20928            e.parallax.setTransform(i, r);
20929          });
20930        });
20931      },
20932      setTransition: function (e) {
20933        void 0 === e && (e = this.params.speed);
20934        this.$el.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (t, i) {
20935          var s = n(i),
20936            a = parseInt(s.attr("data-swiper-parallax-duration"), 10) || e;
20937          0 === e && (a = 0), s.transition(a);
20938        });
20939      }
20940    },
20941    he = {
20942      getDistanceBetweenTouches: function (e) {
20943        if (e.targetTouches.length < 2) return 1;
20944        var t = e.targetTouches[0].pageX,
20945          i = e.targetTouches[0].pageY,
20946          s = e.targetTouches[1].pageX,
20947          a = e.targetTouches[1].pageY;
20948        return Math.sqrt(Math.pow(s - t, 2) + Math.pow(a - i, 2));
20949      },
20950      onGestureStart: function (e) {
20951        var t = this.params.zoom,
20952          i = this.zoom,
20953          s = i.gesture;
20954        if (i.fakeGestureTouched = !1, i.fakeGestureMoved = !1, !h.gestures) {
20955          if ("touchstart" !== e.type || "touchstart" === e.type && e.targetTouches.length < 2) return;
20956          i.fakeGestureTouched = !0, s.scaleStart = he.getDistanceBetweenTouches(e);
20957        }
20958        s.$slideEl && s.$slideEl.length || (s.$slideEl = n(e.target).closest("." + this.params.slideClass), 0 === s.$slideEl.length && (s.$slideEl = this.slides.eq(this.activeIndex)), s.$imageEl = s.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"), s.$imageWrapEl = s.$imageEl.parent("." + t.containerClass), s.maxRatio = s.$imageWrapEl.attr("data-swiper-zoom") || t.maxRatio, 0 !== s.$imageWrapEl.length) ? (s.$imageEl && s.$imageEl.transition(0), this.zoom.isScaling = !0) : s.$imageEl = void 0;
20959      },
20960      onGestureChange: function (e) {
20961        var t = this.params.zoom,
20962          i = this.zoom,
20963          s = i.gesture;
20964        if (!h.gestures) {
20965          if ("touchmove" !== e.type || "touchmove" === e.type && e.targetTouches.length < 2) return;
20966          i.fakeGestureMoved = !0, s.scaleMove = he.getDistanceBetweenTouches(e);
20967        }
20968        s.$imageEl && 0 !== s.$imageEl.length && (i.scale = h.gestures ? e.scale * i.currentScale : s.scaleMove / s.scaleStart * i.currentScale, i.scale > s.maxRatio && (i.scale = s.maxRatio - 1 + Math.pow(i.scale - s.maxRatio + 1, .5)), i.scale < t.minRatio && (i.scale = t.minRatio + 1 - Math.pow(t.minRatio - i.scale + 1, .5)), s.$imageEl.transform("translate3d(0,0,0) scale(" + i.scale + ")"));
20969      },
20970      onGestureEnd: function (e) {
20971        var t = this.params.zoom,
20972          i = this.zoom,
20973          s = i.gesture;
20974        if (!h.gestures) {
20975          if (!i.fakeGestureTouched || !i.fakeGestureMoved) return;
20976          if ("touchend" !== e.type || "touchend" === e.type && e.changedTouches.length < 2 && !A.android) return;
20977          i.fakeGestureTouched = !1, i.fakeGestureMoved = !1;
20978        }
20979        s.$imageEl && 0 !== s.$imageEl.length && (i.scale = Math.max(Math.min(i.scale, s.maxRatio), t.minRatio), s.$imageEl.transition(this.params.speed).transform("translate3d(0,0,0) scale(" + i.scale + ")"), i.currentScale = i.scale, i.isScaling = !1, 1 === i.scale && (s.$slideEl = void 0));
20980      },
20981      onTouchStart: function (e) {
20982        var t = this.zoom,
20983          i = t.gesture,
20984          s = t.image;
20985        i.$imageEl && 0 !== i.$imageEl.length && (s.isTouched || (A.android && e.cancelable && e.preventDefault(), s.isTouched = !0, s.touchesStart.x = "touchstart" === e.type ? e.targetTouches[0].pageX : e.pageX, s.touchesStart.y = "touchstart" === e.type ? e.targetTouches[0].pageY : e.pageY));
20986      },
20987      onTouchMove: function (e) {
20988        var t = this.zoom,
20989          i = t.gesture,
20990          s = t.image,
20991          a = t.velocity;
20992        if (i.$imageEl && 0 !== i.$imageEl.length && (this.allowClick = !1, s.isTouched && i.$slideEl)) {
20993          s.isMoved || (s.width = i.$imageEl[0].offsetWidth, s.height = i.$imageEl[0].offsetHeight, s.startX = d.getTranslate(i.$imageWrapEl[0], "x") || 0, s.startY = d.getTranslate(i.$imageWrapEl[0], "y") || 0, i.slideWidth = i.$slideEl[0].offsetWidth, i.slideHeight = i.$slideEl[0].offsetHeight, i.$imageWrapEl.transition(0), this.rtl && (s.startX = -s.startX, s.startY = -s.startY));
20994          var r = s.width * t.scale,
20995            n = s.height * t.scale;
20996          if (!(r < i.slideWidth && n < i.slideHeight)) {
20997            if (s.minX = Math.min(i.slideWidth / 2 - r / 2, 0), s.maxX = -s.minX, s.minY = Math.min(i.slideHeight / 2 - n / 2, 0), s.maxY = -s.minY, s.touchesCurrent.x = "touchmove" === e.type ? e.targetTouches[0].pageX : e.pageX, s.touchesCurrent.y = "touchmove" === e.type ? e.targetTouches[0].pageY : e.pageY, !s.isMoved && !t.isScaling) {
20998              if (this.isHorizontal() && (Math.floor(s.minX) === Math.floor(s.startX) && s.touchesCurrent.x < s.touchesStart.x || Math.floor(s.maxX) === Math.floor(s.startX) && s.touchesCurrent.x > s.touchesStart.x)) return void (s.isTouched = !1);
20999              if (!this.isHorizontal() && (Math.floor(s.minY) === Math.floor(s.startY) && s.touchesCurrent.y < s.touchesStart.y || Math.floor(s.maxY) === Math.floor(s.startY) && s.touchesCurrent.y > s.touchesStart.y)) return void (s.isTouched = !1);
21000            }
21001            e.cancelable && e.preventDefault(), e.stopPropagation(), s.isMoved = !0, s.currentX = s.touchesCurrent.x - s.touchesStart.x + s.startX, s.currentY = s.touchesCurrent.y - s.touchesStart.y + s.startY, s.currentX < s.minX && (s.currentX = s.minX + 1 - Math.pow(s.minX - s.currentX + 1, .8)), s.currentX > s.maxX && (s.currentX = s.maxX - 1 + Math.pow(s.currentX - s.maxX + 1, .8)), s.currentY < s.minY && (s.currentY = s.minY + 1 - Math.pow(s.minY - s.currentY + 1, .8)), s.currentY > s.maxY && (s.currentY = s.maxY - 1 + Math.pow(s.currentY - s.maxY + 1, .8)), a.prevPositionX || (a.prevPositionX = s.touchesCurrent.x), a.prevPositionY || (a.prevPositionY = s.touchesCurrent.y), a.prevTime || (a.prevTime = Date.now()), a.x = (s.touchesCurrent.x - a.prevPositionX) / (Date.now() - a.prevTime) / 2, a.y = (s.touchesCurrent.y - a.prevPositionY) / (Date.now() - a.prevTime) / 2, Math.abs(s.touchesCurrent.x - a.prevPositionX) < 2 && (a.x = 0), Math.abs(s.touchesCurrent.y - a.prevPositionY) < 2 && (a.y = 0), a.prevPositionX = s.touchesCurrent.x, a.prevPositionY = s.touchesCurrent.y, a.prevTime = Date.now(), i.$imageWrapEl.transform("translate3d(" + s.currentX + "px, " + s.currentY + "px,0)");
21002          }
21003        }
21004      },
21005      onTouchEnd: function () {
21006        var e = this.zoom,
21007          t = e.gesture,
21008          i = e.image,
21009          s = e.velocity;
21010        if (t.$imageEl && 0 !== t.$imageEl.length) {
21011          if (!i.isTouched || !i.isMoved) return i.isTouched = !1, void (i.isMoved = !1);
21012          i.isTouched = !1, i.isMoved = !1;
21013          var a = 300,
21014            r = 300,
21015            n = s.x * a,
21016            o = i.currentX + n,
21017            l = s.y * r,
21018            d = i.currentY + l;
21019          0 !== s.x && (a = Math.abs((o - i.currentX) / s.x)), 0 !== s.y && (r = Math.abs((d - i.currentY) / s.y));
21020          var h = Math.max(a, r);
21021          i.currentX = o, i.currentY = d;
21022          var p = i.width * e.scale,
21023            c = i.height * e.scale;
21024          i.minX = Math.min(t.slideWidth / 2 - p / 2, 0), i.maxX = -i.minX, i.minY = Math.min(t.slideHeight / 2 - c / 2, 0), i.maxY = -i.minY, i.currentX = Math.max(Math.min(i.currentX, i.maxX), i.minX), i.currentY = Math.max(Math.min(i.currentY, i.maxY), i.minY), t.$imageWrapEl.transition(h).transform("translate3d(" + i.currentX + "px, " + i.currentY + "px,0)");
21025        }
21026      },
21027      onTransitionEnd: function () {
21028        var e = this.zoom,
21029          t = e.gesture;
21030        t.$slideEl && this.previousIndex !== this.activeIndex && (t.$imageEl && t.$imageEl.transform("translate3d(0,0,0) scale(1)"), t.$imageWrapEl && t.$imageWrapEl.transform("translate3d(0,0,0)"), e.scale = 1, e.currentScale = 1, t.$slideEl = void 0, t.$imageEl = void 0, t.$imageWrapEl = void 0);
21031      },
21032      toggle: function (e) {
21033        var t = this.zoom;
21034        t.scale && 1 !== t.scale ? t.out() : t.in(e);
21035      },
21036      in: function (e) {
21037        var t,
21038          i,
21039          s,
21040          a,
21041          r,
21042          n,
21043          o,
21044          l,
21045          d,
21046          h,
21047          p,
21048          c,
21049          u,
21050          v,
21051          f,
21052          m,
21053          g = this.zoom,
21054          b = this.params.zoom,
21055          w = g.gesture,
21056          y = g.image;
21057        (w.$slideEl || (this.params.virtual && this.params.virtual.enabled && this.virtual ? w.$slideEl = this.$wrapperEl.children("." + this.params.slideActiveClass) : w.$slideEl = this.slides.eq(this.activeIndex), w.$imageEl = w.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"), w.$imageWrapEl = w.$imageEl.parent("." + b.containerClass)), w.$imageEl && 0 !== w.$imageEl.length) && (w.$slideEl.addClass("" + b.zoomedSlideClass), void 0 === y.touchesStart.x && e ? (t = "touchend" === e.type ? e.changedTouches[0].pageX : e.pageX, i = "touchend" === e.type ? e.changedTouches[0].pageY : e.pageY) : (t = y.touchesStart.x, i = y.touchesStart.y), g.scale = w.$imageWrapEl.attr("data-swiper-zoom") || b.maxRatio, g.currentScale = w.$imageWrapEl.attr("data-swiper-zoom") || b.maxRatio, e ? (f = w.$slideEl[0].offsetWidth, m = w.$slideEl[0].offsetHeight, s = w.$slideEl.offset().left + f / 2 - t, a = w.$slideEl.offset().top + m / 2 - i, o = w.$imageEl[0].offsetWidth, l = w.$imageEl[0].offsetHeight, d = o * g.scale, h = l * g.scale, u = -(p = Math.min(f / 2 - d / 2, 0)), v = -(c = Math.min(m / 2 - h / 2, 0)), (r = s * g.scale) < p && (r = p), r > u && (r = u), (n = a * g.scale) < c && (n = c), n > v && (n = v)) : (r = 0, n = 0), w.$imageWrapEl.transition(300).transform("translate3d(" + r + "px, " + n + "px,0)"), w.$imageEl.transition(300).transform("translate3d(0,0,0) scale(" + g.scale + ")"));
21058      },
21059      out: function () {
21060        var e = this.zoom,
21061          t = this.params.zoom,
21062          i = e.gesture;
21063        i.$slideEl || (this.params.virtual && this.params.virtual.enabled && this.virtual ? i.$slideEl = this.$wrapperEl.children("." + this.params.slideActiveClass) : i.$slideEl = this.slides.eq(this.activeIndex), i.$imageEl = i.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"), i.$imageWrapEl = i.$imageEl.parent("." + t.containerClass)), i.$imageEl && 0 !== i.$imageEl.length && (e.scale = 1, e.currentScale = 1, i.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"), i.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"), i.$slideEl.removeClass("" + t.zoomedSlideClass), i.$slideEl = void 0);
21064      },
21065      enable: function () {
21066        var e = this.zoom;
21067        if (!e.enabled) {
21068          e.enabled = !0;
21069          var t = !("touchstart" !== this.touchEvents.start || !h.passiveListener || !this.params.passiveListeners) && {
21070              passive: !0,
21071              capture: !1
21072            },
21073            i = !h.passiveListener || {
21074              passive: !1,
21075              capture: !0
21076            },
21077            s = "." + this.params.slideClass;
21078          h.gestures ? (this.$wrapperEl.on("gesturestart", s, e.onGestureStart, t), this.$wrapperEl.on("gesturechange", s, e.onGestureChange, t), this.$wrapperEl.on("gestureend", s, e.onGestureEnd, t)) : "touchstart" === this.touchEvents.start && (this.$wrapperEl.on(this.touchEvents.start, s, e.onGestureStart, t), this.$wrapperEl.on(this.touchEvents.move, s, e.onGestureChange, i), this.$wrapperEl.on(this.touchEvents.end, s, e.onGestureEnd, t), this.touchEvents.cancel && this.$wrapperEl.on(this.touchEvents.cancel, s, e.onGestureEnd, t)), this.$wrapperEl.on(this.touchEvents.move, "." + this.params.zoom.containerClass, e.onTouchMove, i);
21079        }
21080      },
21081      disable: function () {
21082        var e = this.zoom;
21083        if (e.enabled) {
21084          this.zoom.enabled = !1;
21085          var t = !("touchstart" !== this.touchEvents.start || !h.passiveListener || !this.params.passiveListeners) && {
21086              passive: !0,
21087              capture: !1
21088            },
21089            i = !h.passiveListener || {
21090              passive: !1,
21091              capture: !0
21092            },
21093            s = "." + this.params.slideClass;
21094          h.gestures ? (this.$wrapperEl.off("gesturestart", s, e.onGestureStart, t), this.$wrapperEl.off("gesturechange", s, e.onGestureChange, t), this.$wrapperEl.off("gestureend", s, e.onGestureEnd, t)) : "touchstart" === this.touchEvents.start && (this.$wrapperEl.off(this.touchEvents.start, s, e.onGestureStart, t), this.$wrapperEl.off(this.touchEvents.move, s, e.onGestureChange, i), this.$wrapperEl.off(this.touchEvents.end, s, e.onGestureEnd, t), this.touchEvents.cancel && this.$wrapperEl.off(this.touchEvents.cancel, s, e.onGestureEnd, t)), this.$wrapperEl.off(this.touchEvents.move, "." + this.params.zoom.containerClass, e.onTouchMove, i);
21095        }
21096      }
21097    },
21098    pe = {
21099      loadInSlide: function (e, t) {
21100        void 0 === t && (t = !0);
21101        var i = this,
21102          s = i.params.lazy;
21103        if (void 0 !== e && 0 !== i.slides.length) {
21104          var a = i.virtual && i.params.virtual.enabled ? i.$wrapperEl.children("." + i.params.slideClass + '[data-swiper-slide-index="' + e + '"]') : i.slides.eq(e),
21105            r = a.find("." + s.elementClass + ":not(." + s.loadedClass + "):not(." + s.loadingClass + ")");
21106          !a.hasClass(s.elementClass) || a.hasClass(s.loadedClass) || a.hasClass(s.loadingClass) || (r = r.add(a[0])), 0 !== r.length && r.each(function (e, r) {
21107            var o = n(r);
21108            o.addClass(s.loadingClass);
21109            var l = o.attr("data-background"),
21110              d = o.attr("data-src"),
21111              h = o.attr("data-srcset"),
21112              p = o.attr("data-sizes"),
21113              c = o.parent("picture");
21114            i.loadImage(o[0], d || l, h, p, !1, function () {
21115              if (null != i && i && (!i || i.params) && !i.destroyed) {
21116                if (l ? (o.css("background-image", 'url("' + l + '")'), o.removeAttr("data-background")) : (h && (o.attr("srcset", h), o.removeAttr("data-srcset")), p && (o.attr("sizes", p), o.removeAttr("data-sizes")), c.length && c.children("source").each(function (e, t) {
21117                  var i = n(t);
21118                  i.attr("data-srcset") && (i.attr("srcset", i.attr("data-srcset")), i.removeAttr("data-srcset"));
21119                }), d && (o.attr("src", d), o.removeAttr("data-src"))), o.addClass(s.loadedClass).removeClass(s.loadingClass), a.find("." + s.preloaderClass).remove(), i.params.loop && t) {
21120                  var e = a.attr("data-swiper-slide-index");
21121                  if (a.hasClass(i.params.slideDuplicateClass)) {
21122                    var r = i.$wrapperEl.children('[data-swiper-slide-index="' + e + '"]:not(.' + i.params.slideDuplicateClass + ")");
21123                    i.lazy.loadInSlide(r.index(), !1);
21124                  } else {
21125                    var u = i.$wrapperEl.children("." + i.params.slideDuplicateClass + '[data-swiper-slide-index="' + e + '"]');
21126                    i.lazy.loadInSlide(u.index(), !1);
21127                  }
21128                }
21129                i.emit("lazyImageReady", a[0], o[0]), i.params.autoHeight && i.updateAutoHeight();
21130              }
21131            }), i.emit("lazyImageLoad", a[0], o[0]);
21132          });
21133        }
21134      },
21135      load: function () {
21136        var e = this,
21137          t = e.$wrapperEl,
21138          i = e.params,
21139          s = e.slides,
21140          a = e.activeIndex,
21141          r = e.virtual && i.virtual.enabled,
21142          o = i.lazy,
21143          l = i.slidesPerView;
21144        function d(e) {
21145          if (r) {
21146            if (t.children("." + i.slideClass + '[data-swiper-slide-index="' + e + '"]').length) return !0;
21147          } else if (s[e]) return !0;
21148          return !1;
21149        }
21150        function h(e) {
21151          return r ? n(e).attr("data-swiper-slide-index") : n(e).index();
21152        }
21153        if ("auto" === l && (l = 0), e.lazy.initialImageLoaded || (e.lazy.initialImageLoaded = !0), e.params.watchSlidesVisibility) t.children("." + i.slideVisibleClass).each(function (t, i) {
21154          var s = r ? n(i).attr("data-swiper-slide-index") : n(i).index();
21155          e.lazy.loadInSlide(s);
21156        });else if (l > 1) for (var p = a; p < a + l; p += 1) d(p) && e.lazy.loadInSlide(p);else e.lazy.loadInSlide(a);
21157        if (o.loadPrevNext) if (l > 1 || o.loadPrevNextAmount && o.loadPrevNextAmount > 1) {
21158          for (var c = o.loadPrevNextAmount, u = l, v = Math.min(a + u + Math.max(c, u), s.length), f = Math.max(a - Math.max(u, c), 0), m = a + l; m < v; m += 1) d(m) && e.lazy.loadInSlide(m);
21159          for (var g = f; g < a; g += 1) d(g) && e.lazy.loadInSlide(g);
21160        } else {
21161          var b = t.children("." + i.slideNextClass);
21162          b.length > 0 && e.lazy.loadInSlide(h(b));
21163          var w = t.children("." + i.slidePrevClass);
21164          w.length > 0 && e.lazy.loadInSlide(h(w));
21165        }
21166      }
21167    },
21168    ce = {
21169      LinearSpline: function (e, t) {
21170        var i,
21171          s,
21172          a,
21173          r,
21174          n,
21175          o = function (e, t) {
21176            for (s = -1, i = e.length; i - s > 1;) e[a = i + s >> 1] <= t ? s = a : i = a;
21177            return i;
21178          };
21179        return this.x = e, this.y = t, this.lastIndex = e.length - 1, this.interpolate = function (e) {
21180          return e ? (n = o(this.x, e), r = n - 1, (e - this.x[r]) * (this.y[n] - this.y[r]) / (this.x[n] - this.x[r]) + this.y[r]) : 0;
21181        }, this;
21182      },
21183      getInterpolateFunction: function (e) {
21184        this.controller.spline || (this.controller.spline = this.params.loop ? new ce.LinearSpline(this.slidesGrid, e.slidesGrid) : new ce.LinearSpline(this.snapGrid, e.snapGrid));
21185      },
21186      setTranslate: function (e, t) {
21187        var i,
21188          s,
21189          a = this,
21190          r = a.controller.control;
21191        function n(e) {
21192          var t = a.rtlTranslate ? -a.translate : a.translate;
21193          "slide" === a.params.controller.by && (a.controller.getInterpolateFunction(e), s = -a.controller.spline.interpolate(-t)), s && "container" !== a.params.controller.by || (i = (e.maxTranslate() - e.minTranslate()) / (a.maxTranslate() - a.minTranslate()), s = (t - a.minTranslate()) * i + e.minTranslate()), a.params.controller.inverse && (s = e.maxTranslate() - s), e.updateProgress(s), e.setTranslate(s, a), e.updateActiveIndex(), e.updateSlidesClasses();
21194        }
21195        if (Array.isArray(r)) for (var o = 0; o < r.length; o += 1) r[o] !== t && r[o] instanceof j && n(r[o]);else r instanceof j && t !== r && n(r);
21196      },
21197      setTransition: function (e, t) {
21198        var i,
21199          s = this,
21200          a = s.controller.control;
21201        function r(t) {
21202          t.setTransition(e, s), 0 !== e && (t.transitionStart(), t.params.autoHeight && d.nextTick(function () {
21203            t.updateAutoHeight();
21204          }), t.$wrapperEl.transitionEnd(function () {
21205            a && (t.params.loop && "slide" === s.params.controller.by && t.loopFix(), t.transitionEnd());
21206          }));
21207        }
21208        if (Array.isArray(a)) for (i = 0; i < a.length; i += 1) a[i] !== t && a[i] instanceof j && r(a[i]);else a instanceof j && t !== a && r(a);
21209      }
21210    },
21211    ue = {
21212      makeElFocusable: function (e) {
21213        return e.attr("tabIndex", "0"), e;
21214      },
21215      makeElNotFocusable: function (e) {
21216        return e.attr("tabIndex", "-1"), e;
21217      },
21218      addElRole: function (e, t) {
21219        return e.attr("role", t), e;
21220      },
21221      addElLabel: function (e, t) {
21222        return e.attr("aria-label", t), e;
21223      },
21224      disableEl: function (e) {
21225        return e.attr("aria-disabled", !0), e;
21226      },
21227      enableEl: function (e) {
21228        return e.attr("aria-disabled", !1), e;
21229      },
21230      onEnterKey: function (e) {
21231        var t = this.params.a11y;
21232        if (13 === e.keyCode) {
21233          var i = n(e.target);
21234          this.navigation && this.navigation.$nextEl && i.is(this.navigation.$nextEl) && (this.isEnd && !this.params.loop || this.slideNext(), this.isEnd ? this.a11y.notify(t.lastSlideMessage) : this.a11y.notify(t.nextSlideMessage)), this.navigation && this.navigation.$prevEl && i.is(this.navigation.$prevEl) && (this.isBeginning && !this.params.loop || this.slidePrev(), this.isBeginning ? this.a11y.notify(t.firstSlideMessage) : this.a11y.notify(t.prevSlideMessage)), this.pagination && i.is("." + this.params.pagination.bulletClass) && i[0].click();
21235        }
21236      },
21237      notify: function (e) {
21238        var t = this.a11y.liveRegion;
21239        0 !== t.length && (t.html(""), t.html(e));
21240      },
21241      updateNavigation: function () {
21242        if (!this.params.loop && this.navigation) {
21243          var e = this.navigation,
21244            t = e.$nextEl,
21245            i = e.$prevEl;
21246          i && i.length > 0 && (this.isBeginning ? (this.a11y.disableEl(i), this.a11y.makeElNotFocusable(i)) : (this.a11y.enableEl(i), this.a11y.makeElFocusable(i))), t && t.length > 0 && (this.isEnd ? (this.a11y.disableEl(t), this.a11y.makeElNotFocusable(t)) : (this.a11y.enableEl(t), this.a11y.makeElFocusable(t)));
21247        }
21248      },
21249      updatePagination: function () {
21250        var e = this,
21251          t = e.params.a11y;
21252        e.pagination && e.params.pagination.clickable && e.pagination.bullets && e.pagination.bullets.length && e.pagination.bullets.each(function (i, s) {
21253          var a = n(s);
21254          e.a11y.makeElFocusable(a), e.a11y.addElRole(a, "button"), e.a11y.addElLabel(a, t.paginationBulletMessage.replace(/\{\{index\}\}/, a.index() + 1));
21255        });
21256      },
21257      init: function () {
21258        this.$el.append(this.a11y.liveRegion);
21259        var e,
21260          t,
21261          i = this.params.a11y;
21262        this.navigation && this.navigation.$nextEl && (e = this.navigation.$nextEl), this.navigation && this.navigation.$prevEl && (t = this.navigation.$prevEl), e && (this.a11y.makeElFocusable(e), this.a11y.addElRole(e, "button"), this.a11y.addElLabel(e, i.nextSlideMessage), e.on("keydown", this.a11y.onEnterKey)), t && (this.a11y.makeElFocusable(t), this.a11y.addElRole(t, "button"), this.a11y.addElLabel(t, i.prevSlideMessage), t.on("keydown", this.a11y.onEnterKey)), this.pagination && this.params.pagination.clickable && this.pagination.bullets && this.pagination.bullets.length && this.pagination.$el.on("keydown", "." + this.params.pagination.bulletClass, this.a11y.onEnterKey);
21263      },
21264      destroy: function () {
21265        var e, t;
21266        this.a11y.liveRegion && this.a11y.liveRegion.length > 0 && this.a11y.liveRegion.remove(), this.navigation && this.navigation.$nextEl && (e = this.navigation.$nextEl), this.navigation && this.navigation.$prevEl && (t = this.navigation.$prevEl), e && e.off("keydown", this.a11y.onEnterKey), t && t.off("keydown", this.a11y.onEnterKey), this.pagination && this.params.pagination.clickable && this.pagination.bullets && this.pagination.bullets.length && this.pagination.$el.off("keydown", "." + this.params.pagination.bulletClass, this.a11y.onEnterKey);
21267      }
21268    },
21269    ve = {
21270      init: function () {
21271        if (this.params.history) {
21272          if (!a.history || !a.history.pushState) return this.params.history.enabled = !1, void (this.params.hashNavigation.enabled = !0);
21273          var e = this.history;
21274          e.initialized = !0, e.paths = ve.getPathValues(), (e.paths.key || e.paths.value) && (e.scrollToSlide(0, e.paths.value, this.params.runCallbacksOnInit), this.params.history.replaceState || a.addEventListener("popstate", this.history.setHistoryPopState));
21275        }
21276      },
21277      destroy: function () {
21278        this.params.history.replaceState || a.removeEventListener("popstate", this.history.setHistoryPopState);
21279      },
21280      setHistoryPopState: function () {
21281        this.history.paths = ve.getPathValues(), this.history.scrollToSlide(this.params.speed, this.history.paths.value, !1);
21282      },
21283      getPathValues: function () {
21284        var e = a.location.pathname.slice(1).split("/").filter(function (e) {
21285            return "" !== e;
21286          }),
21287          t = e.length;
21288        return {
21289          key: e[t - 2],
21290          value: e[t - 1]
21291        };
21292      },
21293      setHistory: function (e, t) {
21294        if (this.history.initialized && this.params.history.enabled) {
21295          var i = this.slides.eq(t),
21296            s = ve.slugify(i.attr("data-history"));
21297          a.location.pathname.includes(e) || (s = e + "/" + s);
21298          var r = a.history.state;
21299          r && r.value === s || (this.params.history.replaceState ? a.history.replaceState({
21300            value: s
21301          }, null, s) : a.history.pushState({
21302            value: s
21303          }, null, s));
21304        }
21305      },
21306      slugify: function (e) {
21307        return e.toString().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+/, "").replace(/-+$/, "");
21308      },
21309      scrollToSlide: function (e, t, i) {
21310        if (t) for (var s = 0, a = this.slides.length; s < a; s += 1) {
21311          var r = this.slides.eq(s);
21312          if (ve.slugify(r.attr("data-history")) === t && !r.hasClass(this.params.slideDuplicateClass)) {
21313            var n = r.index();
21314            this.slideTo(n, e, i);
21315          }
21316        } else this.slideTo(0, e, i);
21317      }
21318    },
21319    fe = {
21320      onHashCange: function () {
21321        this.emit("hashChange");
21322        var e = i.location.hash.replace("#", "");
21323        if (e !== this.slides.eq(this.activeIndex).attr("data-hash")) {
21324          var t = this.$wrapperEl.children("." + this.params.slideClass + '[data-hash="' + e + '"]').index();
21325          if (void 0 === t) return;
21326          this.slideTo(t);
21327        }
21328      },
21329      setHash: function () {
21330        if (this.hashNavigation.initialized && this.params.hashNavigation.enabled) if (this.params.hashNavigation.replaceState && a.history && a.history.replaceState) a.history.replaceState(null, null, "#" + this.slides.eq(this.activeIndex).attr("data-hash") || false), this.emit("hashSet");else {
21331          var e = this.slides.eq(this.activeIndex),
21332            t = e.attr("data-hash") || e.attr("data-history");
21333          i.location.hash = t || "", this.emit("hashSet");
21334        }
21335      },
21336      init: function () {
21337        if (!(!this.params.hashNavigation.enabled || this.params.history && this.params.history.enabled)) {
21338          this.hashNavigation.initialized = !0;
21339          var e = i.location.hash.replace("#", "");
21340          if (e) for (var t = 0, s = this.slides.length; t < s; t += 1) {
21341            var r = this.slides.eq(t);
21342            if ((r.attr("data-hash") || r.attr("data-history")) === e && !r.hasClass(this.params.slideDuplicateClass)) {
21343              var o = r.index();
21344              this.slideTo(o, 0, this.params.runCallbacksOnInit, !0);
21345            }
21346          }
21347          this.params.hashNavigation.watchState && n(a).on("hashchange", this.hashNavigation.onHashCange);
21348        }
21349      },
21350      destroy: function () {
21351        this.params.hashNavigation.watchState && n(a).off("hashchange", this.hashNavigation.onHashCange);
21352      }
21353    },
21354    me = {
21355      run: function () {
21356        var e = this,
21357          t = e.slides.eq(e.activeIndex),
21358          i = e.params.autoplay.delay;
21359        t.attr("data-swiper-autoplay") && (i = t.attr("data-swiper-autoplay") || e.params.autoplay.delay), clearTimeout(e.autoplay.timeout), e.autoplay.timeout = d.nextTick(function () {
21360          e.params.autoplay.reverseDirection ? e.params.loop ? (e.loopFix(), e.slidePrev(e.params.speed, !0, !0), e.emit("autoplay")) : e.isBeginning ? e.params.autoplay.stopOnLastSlide ? e.autoplay.stop() : (e.slideTo(e.slides.length - 1, e.params.speed, !0, !0), e.emit("autoplay")) : (e.slidePrev(e.params.speed, !0, !0), e.emit("autoplay")) : e.params.loop ? (e.loopFix(), e.slideNext(e.params.speed, !0, !0), e.emit("autoplay")) : e.isEnd ? e.params.autoplay.stopOnLastSlide ? e.autoplay.stop() : (e.slideTo(0, e.params.speed, !0, !0), e.emit("autoplay")) : (e.slideNext(e.params.speed, !0, !0), e.emit("autoplay")), e.params.cssMode && e.autoplay.running && e.autoplay.run();
21361        }, i);
21362      },
21363      start: function () {
21364        return void 0 === this.autoplay.timeout && !this.autoplay.running && (this.autoplay.running = !0, this.emit("autoplayStart"), this.autoplay.run(), !0);
21365      },
21366      stop: function () {
21367        return !!this.autoplay.running && void 0 !== this.autoplay.timeout && (this.autoplay.timeout && (clearTimeout(this.autoplay.timeout), this.autoplay.timeout = void 0), this.autoplay.running = !1, this.emit("autoplayStop"), !0);
21368      },
21369      pause: function (e) {
21370        this.autoplay.running && (this.autoplay.paused || (this.autoplay.timeout && clearTimeout(this.autoplay.timeout), this.autoplay.paused = !0, 0 !== e && this.params.autoplay.waitForTransition ? (this.$wrapperEl[0].addEventListener("transitionend", this.autoplay.onTransitionEnd), this.$wrapperEl[0].addEventListener("webkitTransitionEnd", this.autoplay.onTransitionEnd)) : (this.autoplay.paused = !1, this.autoplay.run())));
21371      }
21372    },
21373    ge = {
21374      setTranslate: function () {
21375        for (var e = this.slides, t = 0; t < e.length; t += 1) {
21376          var i = this.slides.eq(t),
21377            s = -i[0].swiperSlideOffset;
21378          this.params.virtualTranslate || (s -= this.translate);
21379          var a = 0;
21380          this.isHorizontal() || (a = s, s = 0);
21381          var r = this.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(i[0].progress), 0) : 1 + Math.min(Math.max(i[0].progress, -1), 0);
21382          i.css({
21383            opacity: r
21384          }).transform("translate3d(" + s + "px, " + a + "px, 0px)");
21385        }
21386      },
21387      setTransition: function (e) {
21388        var t = this,
21389          i = t.slides,
21390          s = t.$wrapperEl;
21391        if (i.transition(e), t.params.virtualTranslate && 0 !== e) {
21392          var a = !1;
21393          i.transitionEnd(function () {
21394            if (!a && t && !t.destroyed) {
21395              a = !0, t.animating = !1;
21396              for (var e = ["webkitTransitionEnd", "transitionend"], i = 0; i < e.length; i += 1) s.trigger(e[i]);
21397            }
21398          });
21399        }
21400      }
21401    },
21402    be = {
21403      setTranslate: function () {
21404        var e,
21405          t = this.$el,
21406          i = this.$wrapperEl,
21407          s = this.slides,
21408          a = this.width,
21409          r = this.height,
21410          o = this.rtlTranslate,
21411          l = this.size,
21412          d = this.params.cubeEffect,
21413          h = this.isHorizontal(),
21414          p = this.virtual && this.params.virtual.enabled,
21415          c = 0;
21416        d.shadow && (h ? (0 === (e = i.find(".swiper-cube-shadow")).length && (e = n('<div class="swiper-cube-shadow"></div>'), i.append(e)), e.css({
21417          height: a + "px"
21418        })) : 0 === (e = t.find(".swiper-cube-shadow")).length && (e = n('<div class="swiper-cube-shadow"></div>'), t.append(e)));
21419        for (var u = 0; u < s.length; u += 1) {
21420          var v = s.eq(u),
21421            f = u;
21422          p && (f = parseInt(v.attr("data-swiper-slide-index"), 10));
21423          var m = 90 * f,
21424            g = Math.floor(m / 360);
21425          o && (m = -m, g = Math.floor(-m / 360));
21426          var b = Math.max(Math.min(v[0].progress, 1), -1),
21427            w = 0,
21428            y = 0,
21429            x = 0;
21430          f % 4 == 0 ? (w = 4 * -g * l, x = 0) : (f - 1) % 4 == 0 ? (w = 0, x = 4 * -g * l) : (f - 2) % 4 == 0 ? (w = l + 4 * g * l, x = l) : (f - 3) % 4 == 0 && (w = -l, x = 3 * l + 4 * l * g), o && (w = -w), h || (y = w, w = 0);
21431          var E = "rotateX(" + (h ? 0 : -m) + "deg) rotateY(" + (h ? m : 0) + "deg) translate3d(" + w + "px, " + y + "px, " + x + "px)";
21432          if (b <= 1 && b > -1 && (c = 90 * f + 90 * b, o && (c = 90 * -f - 90 * b)), v.transform(E), d.slideShadows) {
21433            var T = h ? v.find(".swiper-slide-shadow-left") : v.find(".swiper-slide-shadow-top"),
21434              S = h ? v.find(".swiper-slide-shadow-right") : v.find(".swiper-slide-shadow-bottom");
21435            0 === T.length && (T = n('<div class="swiper-slide-shadow-' + (h ? "left" : "top") + '"></div>'), v.append(T)), 0 === S.length && (S = n('<div class="swiper-slide-shadow-' + (h ? "right" : "bottom") + '"></div>'), v.append(S)), T.length && (T[0].style.opacity = Math.max(-b, 0)), S.length && (S[0].style.opacity = Math.max(b, 0));
21436          }
21437        }
21438        if (i.css({
21439          "-webkit-transform-origin": "50% 50% -" + l / 2 + "px",
21440          "-moz-transform-origin": "50% 50% -" + l / 2 + "px",
21441          "-ms-transform-origin": "50% 50% -" + l / 2 + "px",
21442          "transform-origin": "50% 50% -" + l / 2 + "px"
21443        }), d.shadow) if (h) e.transform("translate3d(0px, " + (a / 2 + d.shadowOffset) + "px, " + -a / 2 + "px) rotateX(90deg) rotateZ(0deg) scale(" + d.shadowScale + ")");else {
21444          var C = Math.abs(c) - 90 * Math.floor(Math.abs(c) / 90),
21445            M = 1.5 - (Math.sin(2 * C * Math.PI / 360) / 2 + Math.cos(2 * C * Math.PI / 360) / 2),
21446            P = d.shadowScale,
21447            z = d.shadowScale / M,
21448            k = d.shadowOffset;
21449          e.transform("scale3d(" + P + ", 1, " + z + ") translate3d(0px, " + (r / 2 + k) + "px, " + -r / 2 / z + "px) rotateX(-90deg)");
21450        }
21451        var $ = _.isSafari || _.isWebView ? -l / 2 : 0;
21452        i.transform("translate3d(0px,0," + $ + "px) rotateX(" + (this.isHorizontal() ? 0 : c) + "deg) rotateY(" + (this.isHorizontal() ? -c : 0) + "deg)");
21453      },
21454      setTransition: function (e) {
21455        var t = this.$el;
21456        this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), this.params.cubeEffect.shadow && !this.isHorizontal() && t.find(".swiper-cube-shadow").transition(e);
21457      }
21458    },
21459    we = {
21460      setTranslate: function () {
21461        for (var e = this.slides, t = this.rtlTranslate, i = 0; i < e.length; i += 1) {
21462          var s = e.eq(i),
21463            a = s[0].progress;
21464          this.params.flipEffect.limitRotation && (a = Math.max(Math.min(s[0].progress, 1), -1));
21465          var r = -180 * a,
21466            o = 0,
21467            l = -s[0].swiperSlideOffset,
21468            d = 0;
21469          if (this.isHorizontal() ? t && (r = -r) : (d = l, l = 0, o = -r, r = 0), s[0].style.zIndex = -Math.abs(Math.round(a)) + e.length, this.params.flipEffect.slideShadows) {
21470            var h = this.isHorizontal() ? s.find(".swiper-slide-shadow-left") : s.find(".swiper-slide-shadow-top"),
21471              p = this.isHorizontal() ? s.find(".swiper-slide-shadow-right") : s.find(".swiper-slide-shadow-bottom");
21472            0 === h.length && (h = n('<div class="swiper-slide-shadow-' + (this.isHorizontal() ? "left" : "top") + '"></div>'), s.append(h)), 0 === p.length && (p = n('<div class="swiper-slide-shadow-' + (this.isHorizontal() ? "right" : "bottom") + '"></div>'), s.append(p)), h.length && (h[0].style.opacity = Math.max(-a, 0)), p.length && (p[0].style.opacity = Math.max(a, 0));
21473          }
21474          s.transform("translate3d(" + l + "px, " + d + "px, 0px) rotateX(" + o + "deg) rotateY(" + r + "deg)");
21475        }
21476      },
21477      setTransition: function (e) {
21478        var t = this,
21479          i = t.slides,
21480          s = t.activeIndex,
21481          a = t.$wrapperEl;
21482        if (i.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), t.params.virtualTranslate && 0 !== e) {
21483          var r = !1;
21484          i.eq(s).transitionEnd(function () {
21485            if (!r && t && !t.destroyed) {
21486              r = !0, t.animating = !1;
21487              for (var e = ["webkitTransitionEnd", "transitionend"], i = 0; i < e.length; i += 1) a.trigger(e[i]);
21488            }
21489          });
21490        }
21491      }
21492    },
21493    ye = {
21494      setTranslate: function () {
21495        for (var e = this.width, t = this.height, i = this.slides, s = this.$wrapperEl, a = this.slidesSizesGrid, r = this.params.coverflowEffect, o = this.isHorizontal(), l = this.translate, d = o ? e / 2 - l : t / 2 - l, p = o ? r.rotate : -r.rotate, c = r.depth, u = 0, v = i.length; u < v; u += 1) {
21496          var f = i.eq(u),
21497            m = a[u],
21498            g = (d - f[0].swiperSlideOffset - m / 2) / m * r.modifier,
21499            b = o ? p * g : 0,
21500            w = o ? 0 : p * g,
21501            y = -c * Math.abs(g),
21502            x = r.stretch;
21503          "string" == typeof x && -1 !== x.indexOf("%") && (x = parseFloat(r.stretch) / 100 * m);
21504          var E = o ? 0 : x * g,
21505            T = o ? x * g : 0,
21506            S = 1 - (1 - r.scale) * Math.abs(g);
21507          Math.abs(T) < .001 && (T = 0), Math.abs(E) < .001 && (E = 0), Math.abs(y) < .001 && (y = 0), Math.abs(b) < .001 && (b = 0), Math.abs(w) < .001 && (w = 0), Math.abs(S) < .001 && (S = 0);
21508          var C = "translate3d(" + T + "px," + E + "px," + y + "px)  rotateX(" + w + "deg) rotateY(" + b + "deg) scale(" + S + ")";
21509          if (f.transform(C), f[0].style.zIndex = 1 - Math.abs(Math.round(g)), r.slideShadows) {
21510            var M = o ? f.find(".swiper-slide-shadow-left") : f.find(".swiper-slide-shadow-top"),
21511              P = o ? f.find(".swiper-slide-shadow-right") : f.find(".swiper-slide-shadow-bottom");
21512            0 === M.length && (M = n('<div class="swiper-slide-shadow-' + (o ? "left" : "top") + '"></div>'), f.append(M)), 0 === P.length && (P = n('<div class="swiper-slide-shadow-' + (o ? "right" : "bottom") + '"></div>'), f.append(P)), M.length && (M[0].style.opacity = g > 0 ? g : 0), P.length && (P[0].style.opacity = -g > 0 ? -g : 0);
21513          }
21514        }
21515        (h.pointerEvents || h.prefixedPointerEvents) && (s[0].style.perspectiveOrigin = d + "px 50%");
21516      },
21517      setTransition: function (e) {
21518        this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e);
21519      }
21520    },
21521    xe = {
21522      init: function () {
21523        var e = this.params.thumbs,
21524          t = this.constructor;
21525        e.swiper instanceof t ? (this.thumbs.swiper = e.swiper, d.extend(this.thumbs.swiper.originalParams, {
21526          watchSlidesProgress: !0,
21527          slideToClickedSlide: !1
21528        }), d.extend(this.thumbs.swiper.params, {
21529          watchSlidesProgress: !0,
21530          slideToClickedSlide: !1
21531        })) : d.isObject(e.swiper) && (this.thumbs.swiper = new t(d.extend({}, e.swiper, {
21532          watchSlidesVisibility: !0,
21533          watchSlidesProgress: !0,
21534          slideToClickedSlide: !1
21535        })), this.thumbs.swiperCreated = !0), this.thumbs.swiper.$el.addClass(this.params.thumbs.thumbsContainerClass), this.thumbs.swiper.on("tap", this.thumbs.onThumbClick);
21536      },
21537      onThumbClick: function () {
21538        var e = this.thumbs.swiper;
21539        if (e) {
21540          var t = e.clickedIndex,
21541            i = e.clickedSlide;
21542          if (!(i && n(i).hasClass(this.params.thumbs.slideThumbActiveClass) || null == t)) {
21543            var s;
21544            if (s = e.params.loop ? parseInt(n(e.clickedSlide).attr("data-swiper-slide-index"), 10) : t, this.params.loop) {
21545              var a = this.activeIndex;
21546              this.slides.eq(a).hasClass(this.params.slideDuplicateClass) && (this.loopFix(), this._clientLeft = this.$wrapperEl[0].clientLeft, a = this.activeIndex);
21547              var r = this.slides.eq(a).prevAll('[data-swiper-slide-index="' + s + '"]').eq(0).index(),
21548                o = this.slides.eq(a).nextAll('[data-swiper-slide-index="' + s + '"]').eq(0).index();
21549              s = void 0 === r ? o : void 0 === o ? r : o - a < a - r ? o : r;
21550            }
21551            this.slideTo(s);
21552          }
21553        }
21554      },
21555      update: function (e) {
21556        var t = this.thumbs.swiper;
21557        if (t) {
21558          var i = "auto" === t.params.slidesPerView ? t.slidesPerViewDynamic() : t.params.slidesPerView,
21559            s = this.params.thumbs.autoScrollOffset,
21560            a = s && !t.params.loop;
21561          if (this.realIndex !== t.realIndex || a) {
21562            var r,
21563              n,
21564              o = t.activeIndex;
21565            if (t.params.loop) {
21566              t.slides.eq(o).hasClass(t.params.slideDuplicateClass) && (t.loopFix(), t._clientLeft = t.$wrapperEl[0].clientLeft, o = t.activeIndex);
21567              var l = t.slides.eq(o).prevAll('[data-swiper-slide-index="' + this.realIndex + '"]').eq(0).index(),
21568                d = t.slides.eq(o).nextAll('[data-swiper-slide-index="' + this.realIndex + '"]').eq(0).index();
21569              r = void 0 === l ? d : void 0 === d ? l : d - o == o - l ? o : d - o < o - l ? d : l, n = this.activeIndex > this.previousIndex ? "next" : "prev";
21570            } else n = (r = this.realIndex) > this.previousIndex ? "next" : "prev";
21571            a && (r += "next" === n ? s : -1 * s), t.visibleSlidesIndexes && t.visibleSlidesIndexes.indexOf(r) < 0 && (t.params.centeredSlides ? r = r > o ? r - Math.floor(i / 2) + 1 : r + Math.floor(i / 2) - 1 : r > o && (r = r - i + 1), t.slideTo(r, e ? 0 : void 0));
21572          }
21573          var h = 1,
21574            p = this.params.thumbs.slideThumbActiveClass;
21575          if (this.params.slidesPerView > 1 && !this.params.centeredSlides && (h = this.params.slidesPerView), this.params.thumbs.multipleActiveThumbs || (h = 1), h = Math.floor(h), t.slides.removeClass(p), t.params.loop || t.params.virtual && t.params.virtual.enabled) for (var c = 0; c < h; c += 1) t.$wrapperEl.children('[data-swiper-slide-index="' + (this.realIndex + c) + '"]').addClass(p);else for (var u = 0; u < h; u += 1) t.slides.eq(this.realIndex + u).addClass(p);
21576        }
21577      }
21578    },
21579    Ee = [K, U, Z, Q, ee, ie, ae, {
21580      name: "mousewheel",
21581      params: {
21582        mousewheel: {
21583          enabled: !1,
21584          releaseOnEdges: !1,
21585          invert: !1,
21586          forceToAxis: !1,
21587          sensitivity: 1,
21588          eventsTarged: "container"
21589        }
21590      },
21591      create: function () {
21592        d.extend(this, {
21593          mousewheel: {
21594            enabled: !1,
21595            enable: re.enable.bind(this),
21596            disable: re.disable.bind(this),
21597            handle: re.handle.bind(this),
21598            handleMouseEnter: re.handleMouseEnter.bind(this),
21599            handleMouseLeave: re.handleMouseLeave.bind(this),
21600            animateSlider: re.animateSlider.bind(this),
21601            releaseScroll: re.releaseScroll.bind(this),
21602            lastScrollTime: d.now(),
21603            lastEventBeforeSnap: void 0,
21604            recentWheelEvents: []
21605          }
21606        });
21607      },
21608      on: {
21609        init: function () {
21610          !this.params.mousewheel.enabled && this.params.cssMode && this.mousewheel.disable(), this.params.mousewheel.enabled && this.mousewheel.enable();
21611        },
21612        destroy: function () {
21613          this.params.cssMode && this.mousewheel.enable(), this.mousewheel.enabled && this.mousewheel.disable();
21614        }
21615      }
21616    }, {
21617      name: "navigation",
21618      params: {
21619        navigation: {
21620          nextEl: null,
21621          prevEl: null,
21622          hideOnClick: !1,
21623          disabledClass: "swiper-button-disabled",
21624          hiddenClass: "swiper-button-hidden",
21625          lockClass: "swiper-button-lock"
21626        }
21627      },
21628      create: function () {
21629        d.extend(this, {
21630          navigation: {
21631            init: ne.init.bind(this),
21632            update: ne.update.bind(this),
21633            destroy: ne.destroy.bind(this),
21634            onNextClick: ne.onNextClick.bind(this),
21635            onPrevClick: ne.onPrevClick.bind(this)
21636          }
21637        });
21638      },
21639      on: {
21640        init: function () {
21641          this.navigation.init(), this.navigation.update();
21642        },
21643        toEdge: function () {
21644          this.navigation.update();
21645        },
21646        fromEdge: function () {
21647          this.navigation.update();
21648        },
21649        destroy: function () {
21650          this.navigation.destroy();
21651        },
21652        click: function (e) {
21653          var t,
21654            i = this.navigation,
21655            s = i.$nextEl,
21656            a = i.$prevEl;
21657          !this.params.navigation.hideOnClick || n(e.target).is(a) || n(e.target).is(s) || (s ? t = s.hasClass(this.params.navigation.hiddenClass) : a && (t = a.hasClass(this.params.navigation.hiddenClass)), !0 === t ? this.emit("navigationShow", this) : this.emit("navigationHide", this), s && s.toggleClass(this.params.navigation.hiddenClass), a && a.toggleClass(this.params.navigation.hiddenClass));
21658        }
21659      }
21660    }, {
21661      name: "pagination",
21662      params: {
21663        pagination: {
21664          el: null,
21665          bulletElement: "span",
21666          clickable: !1,
21667          hideOnClick: !1,
21668          renderBullet: null,
21669          renderProgressbar: null,
21670          renderFraction: null,
21671          renderCustom: null,
21672          progressbarOpposite: !1,
21673          type: "bullets",
21674          dynamicBullets: !1,
21675          dynamicMainBullets: 1,
21676          formatFractionCurrent: function (e) {
21677            return e;
21678          },
21679          formatFractionTotal: function (e) {
21680            return e;
21681          },
21682          bulletClass: "swiper-pagination-bullet",
21683          bulletActiveClass: "swiper-pagination-bullet-active",
21684          modifierClass: "swiper-pagination-",
21685          currentClass: "swiper-pagination-current",
21686          totalClass: "swiper-pagination-total",
21687          hiddenClass: "swiper-pagination-hidden",
21688          progressbarFillClass: "swiper-pagination-progressbar-fill",
21689          progressbarOppositeClass: "swiper-pagination-progressbar-opposite",
21690          clickableClass: "swiper-pagination-clickable",
21691          lockClass: "swiper-pagination-lock"
21692        }
21693      },
21694      create: function () {
21695        d.extend(this, {
21696          pagination: {
21697            init: oe.init.bind(this),
21698            render: oe.render.bind(this),
21699            update: oe.update.bind(this),
21700            destroy: oe.destroy.bind(this),
21701            dynamicBulletIndex: 0
21702          }
21703        });
21704      },
21705      on: {
21706        init: function () {
21707          this.pagination.init(), this.pagination.render(), this.pagination.update();
21708        },
21709        activeIndexChange: function () {
21710          (this.params.loop || void 0 === this.snapIndex) && this.pagination.update();
21711        },
21712        snapIndexChange: function () {
21713          this.params.loop || this.pagination.update();
21714        },
21715        slidesLengthChange: function () {
21716          this.params.loop && (this.pagination.render(), this.pagination.update());
21717        },
21718        snapGridLengthChange: function () {
21719          this.params.loop || (this.pagination.render(), this.pagination.update());
21720        },
21721        destroy: function () {
21722          this.pagination.destroy();
21723        },
21724        click: function (e) {
21725          this.params.pagination.el && this.params.pagination.hideOnClick && this.pagination.$el.length > 0 && !n(e.target).hasClass(this.params.pagination.bulletClass) && (!0 === this.pagination.$el.hasClass(this.params.pagination.hiddenClass) ? this.emit("paginationShow", this) : this.emit("paginationHide", this), this.pagination.$el.toggleClass(this.params.pagination.hiddenClass));
21726        }
21727      }
21728    }, {
21729      name: "scrollbar",
21730      params: {
21731        scrollbar: {
21732          el: null,
21733          dragSize: "auto",
21734          hide: !1,
21735          draggable: !1,
21736          snapOnRelease: !0,
21737          lockClass: "swiper-scrollbar-lock",
21738          dragClass: "swiper-scrollbar-drag"
21739        }
21740      },
21741      create: function () {
21742        d.extend(this, {
21743          scrollbar: {
21744            init: le.init.bind(this),
21745            destroy: le.destroy.bind(this),
21746            updateSize: le.updateSize.bind(this),
21747            setTranslate: le.setTranslate.bind(this),
21748            setTransition: le.setTransition.bind(this),
21749            enableDraggable: le.enableDraggable.bind(this),
21750            disableDraggable: le.disableDraggable.bind(this),
21751            setDragPosition: le.setDragPosition.bind(this),
21752            getPointerPosition: le.getPointerPosition.bind(this),
21753            onDragStart: le.onDragStart.bind(this),
21754            onDragMove: le.onDragMove.bind(this),
21755            onDragEnd: le.onDragEnd.bind(this),
21756            isTouched: !1,
21757            timeout: null,
21758            dragTimeout: null
21759          }
21760        });
21761      },
21762      on: {
21763        init: function () {
21764          this.scrollbar.init(), this.scrollbar.updateSize(), this.scrollbar.setTranslate();
21765        },
21766        update: function () {
21767          this.scrollbar.updateSize();
21768        },
21769        resize: function () {
21770          this.scrollbar.updateSize();
21771        },
21772        observerUpdate: function () {
21773          this.scrollbar.updateSize();
21774        },
21775        setTranslate: function () {
21776          this.scrollbar.setTranslate();
21777        },
21778        setTransition: function (e) {
21779          this.scrollbar.setTransition(e);
21780        },
21781        destroy: function () {
21782          this.scrollbar.destroy();
21783        }
21784      }
21785    }, {
21786      name: "parallax",
21787      params: {
21788        parallax: {
21789          enabled: !1
21790        }
21791      },
21792      create: function () {
21793        d.extend(this, {
21794          parallax: {
21795            setTransform: de.setTransform.bind(this),
21796            setTranslate: de.setTranslate.bind(this),
21797            setTransition: de.setTransition.bind(this)
21798          }
21799        });
21800      },
21801      on: {
21802        beforeInit: function () {
21803          this.params.parallax.enabled && (this.params.watchSlidesProgress = !0, this.originalParams.watchSlidesProgress = !0);
21804        },
21805        init: function () {
21806          this.params.parallax.enabled && this.parallax.setTranslate();
21807        },
21808        setTranslate: function () {
21809          this.params.parallax.enabled && this.parallax.setTranslate();
21810        },
21811        setTransition: function (e) {
21812          this.params.parallax.enabled && this.parallax.setTransition(e);
21813        }
21814      }
21815    }, {
21816      name: "zoom",
21817      params: {
21818        zoom: {
21819          enabled: !1,
21820          maxRatio: 3,
21821          minRatio: 1,
21822          toggle: !0,
21823          containerClass: "swiper-zoom-container",
21824          zoomedSlideClass: "swiper-slide-zoomed"
21825        }
21826      },
21827      create: function () {
21828        var e = this,
21829          t = {
21830            enabled: !1,
21831            scale: 1,
21832            currentScale: 1,
21833            isScaling: !1,
21834            gesture: {
21835              $slideEl: void 0,
21836              slideWidth: void 0,
21837              slideHeight: void 0,
21838              $imageEl: void 0,
21839              $imageWrapEl: void 0,
21840              maxRatio: 3
21841            },
21842            image: {
21843              isTouched: void 0,
21844              isMoved: void 0,
21845              currentX: void 0,
21846              currentY: void 0,
21847              minX: void 0,
21848              minY: void 0,
21849              maxX: void 0,
21850              maxY: void 0,
21851              width: void 0,
21852              height: void 0,
21853              startX: void 0,
21854              startY: void 0,
21855              touchesStart: {},
21856              touchesCurrent: {}
21857            },
21858            velocity: {
21859              x: void 0,
21860              y: void 0,
21861              prevPositionX: void 0,
21862              prevPositionY: void 0,
21863              prevTime: void 0
21864            }
21865          };
21866        "onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out".split(" ").forEach(function (i) {
21867          t[i] = he[i].bind(e);
21868        }), d.extend(e, {
21869          zoom: t
21870        });
21871        var i = 1;
21872        Object.defineProperty(e.zoom, "scale", {
21873          get: function () {
21874            return i;
21875          },
21876          set: function (t) {
21877            if (i !== t) {
21878              var s = e.zoom.gesture.$imageEl ? e.zoom.gesture.$imageEl[0] : void 0,
21879                a = e.zoom.gesture.$slideEl ? e.zoom.gesture.$slideEl[0] : void 0;
21880              e.emit("zoomChange", t, s, a);
21881            }
21882            i = t;
21883          }
21884        });
21885      },
21886      on: {
21887        init: function () {
21888          this.params.zoom.enabled && this.zoom.enable();
21889        },
21890        destroy: function () {
21891          this.zoom.disable();
21892        },
21893        touchStart: function (e) {
21894          this.zoom.enabled && this.zoom.onTouchStart(e);
21895        },
21896        touchEnd: function (e) {
21897          this.zoom.enabled && this.zoom.onTouchEnd(e);
21898        },
21899        doubleTap: function (e) {
21900          this.params.zoom.enabled && this.zoom.enabled && this.params.zoom.toggle && this.zoom.toggle(e);
21901        },
21902        transitionEnd: function () {
21903          this.zoom.enabled && this.params.zoom.enabled && this.zoom.onTransitionEnd();
21904        },
21905        slideChange: function () {
21906          this.zoom.enabled && this.params.zoom.enabled && this.params.cssMode && this.zoom.onTransitionEnd();
21907        }
21908      }
21909    }, {
21910      name: "lazy",
21911      params: {
21912        lazy: {
21913          enabled: !1,
21914          loadPrevNext: !1,
21915          loadPrevNextAmount: 1,
21916          loadOnTransitionStart: !1,
21917          elementClass: "swiper-lazy",
21918          loadingClass: "swiper-lazy-loading",
21919          loadedClass: "swiper-lazy-loaded",
21920          preloaderClass: "swiper-lazy-preloader"
21921        }
21922      },
21923      create: function () {
21924        d.extend(this, {
21925          lazy: {
21926            initialImageLoaded: !1,
21927            load: pe.load.bind(this),
21928            loadInSlide: pe.loadInSlide.bind(this)
21929          }
21930        });
21931      },
21932      on: {
21933        beforeInit: function () {
21934          this.params.lazy.enabled && this.params.preloadImages && (this.params.preloadImages = !1);
21935        },
21936        init: function () {
21937          this.params.lazy.enabled && !this.params.loop && 0 === this.params.initialSlide && this.lazy.load();
21938        },
21939        scroll: function () {
21940          this.params.freeMode && !this.params.freeModeSticky && this.lazy.load();
21941        },
21942        resize: function () {
21943          this.params.lazy.enabled && this.lazy.load();
21944        },
21945        scrollbarDragMove: function () {
21946          this.params.lazy.enabled && this.lazy.load();
21947        },
21948        transitionStart: function () {
21949          this.params.lazy.enabled && (this.params.lazy.loadOnTransitionStart || !this.params.lazy.loadOnTransitionStart && !this.lazy.initialImageLoaded) && this.lazy.load();
21950        },
21951        transitionEnd: function () {
21952          this.params.lazy.enabled && !this.params.lazy.loadOnTransitionStart && this.lazy.load();
21953        },
21954        slideChange: function () {
21955          this.params.lazy.enabled && this.params.cssMode && this.lazy.load();
21956        }
21957      }
21958    }, {
21959      name: "controller",
21960      params: {
21961        controller: {
21962          control: void 0,
21963          inverse: !1,
21964          by: "slide"
21965        }
21966      },
21967      create: function () {
21968        d.extend(this, {
21969          controller: {
21970            control: this.params.controller.control,
21971            getInterpolateFunction: ce.getInterpolateFunction.bind(this),
21972            setTranslate: ce.setTranslate.bind(this),
21973            setTransition: ce.setTransition.bind(this)
21974          }
21975        });
21976      },
21977      on: {
21978        update: function () {
21979          this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline);
21980        },
21981        resize: function () {
21982          this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline);
21983        },
21984        observerUpdate: function () {
21985          this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline);
21986        },
21987        setTranslate: function (e, t) {
21988          this.controller.control && this.controller.setTranslate(e, t);
21989        },
21990        setTransition: function (e, t) {
21991          this.controller.control && this.controller.setTransition(e, t);
21992        }
21993      }
21994    }, {
21995      name: "a11y",
21996      params: {
21997        a11y: {
21998          enabled: !0,
21999          notificationClass: "swiper-notification",
22000          prevSlideMessage: "Previous slide",
22001          nextSlideMessage: "Next slide",
22002          firstSlideMessage: "This is the first slide",
22003          lastSlideMessage: "This is the last slide",
22004          paginationBulletMessage: "Go to slide {{index}}"
22005        }
22006      },
22007      create: function () {
22008        var e = this;
22009        d.extend(e, {
22010          a11y: {
22011            liveRegion: n('<span class="' + e.params.a11y.notificationClass + '" aria-live="assertive" aria-atomic="true"></span>')
22012          }
22013        }), Object.keys(ue).forEach(function (t) {
22014          e.a11y[t] = ue[t].bind(e);
22015        });
22016      },
22017      on: {
22018        init: function () {
22019          this.params.a11y.enabled && (this.a11y.init(), this.a11y.updateNavigation());
22020        },
22021        toEdge: function () {
22022          this.params.a11y.enabled && this.a11y.updateNavigation();
22023        },
22024        fromEdge: function () {
22025          this.params.a11y.enabled && this.a11y.updateNavigation();
22026        },
22027        paginationUpdate: function () {
22028          this.params.a11y.enabled && this.a11y.updatePagination();
22029        },
22030        destroy: function () {
22031          this.params.a11y.enabled && this.a11y.destroy();
22032        }
22033      }
22034    }, {
22035      name: "history",
22036      params: {
22037        history: {
22038          enabled: !1,
22039          replaceState: !1,
22040          key: "slides"
22041        }
22042      },
22043      create: function () {
22044        d.extend(this, {
22045          history: {
22046            init: ve.init.bind(this),
22047            setHistory: ve.setHistory.bind(this),
22048            setHistoryPopState: ve.setHistoryPopState.bind(this),
22049            scrollToSlide: ve.scrollToSlide.bind(this),
22050            destroy: ve.destroy.bind(this)
22051          }
22052        });
22053      },
22054      on: {
22055        init: function () {
22056          this.params.history.enabled && this.history.init();
22057        },
22058        destroy: function () {
22059          this.params.history.enabled && this.history.destroy();
22060        },
22061        transitionEnd: function () {
22062          this.history.initialized && this.history.setHistory(this.params.history.key, this.activeIndex);
22063        },
22064        slideChange: function () {
22065          this.history.initialized && this.params.cssMode && this.history.setHistory(this.params.history.key, this.activeIndex);
22066        }
22067      }
22068    }, {
22069      name: "hash-navigation",
22070      params: {
22071        hashNavigation: {
22072          enabled: !1,
22073          replaceState: !1,
22074          watchState: !1
22075        }
22076      },
22077      create: function () {
22078        d.extend(this, {
22079          hashNavigation: {
22080            initialized: !1,
22081            init: fe.init.bind(this),
22082            destroy: fe.destroy.bind(this),
22083            setHash: fe.setHash.bind(this),
22084            onHashCange: fe.onHashCange.bind(this)
22085          }
22086        });
22087      },
22088      on: {
22089        init: function () {
22090          this.params.hashNavigation.enabled && this.hashNavigation.init();
22091        },
22092        destroy: function () {
22093          this.params.hashNavigation.enabled && this.hashNavigation.destroy();
22094        },
22095        transitionEnd: function () {
22096          this.hashNavigation.initialized && this.hashNavigation.setHash();
22097        },
22098        slideChange: function () {
22099          this.hashNavigation.initialized && this.params.cssMode && this.hashNavigation.setHash();
22100        }
22101      }
22102    }, {
22103      name: "autoplay",
22104      params: {
22105        autoplay: {
22106          enabled: !1,
22107          delay: 3e3,
22108          waitForTransition: !0,
22109          disableOnInteraction: !0,
22110          stopOnLastSlide: !1,
22111          reverseDirection: !1
22112        }
22113      },
22114      create: function () {
22115        var e = this;
22116        d.extend(e, {
22117          autoplay: {
22118            running: !1,
22119            paused: !1,
22120            run: me.run.bind(e),
22121            start: me.start.bind(e),
22122            stop: me.stop.bind(e),
22123            pause: me.pause.bind(e),
22124            onVisibilityChange: function () {
22125              "hidden" === document.visibilityState && e.autoplay.running && e.autoplay.pause(), "visible" === document.visibilityState && e.autoplay.paused && (e.autoplay.run(), e.autoplay.paused = !1);
22126            },
22127            onTransitionEnd: function (t) {
22128              e && !e.destroyed && e.$wrapperEl && t.target === this && (e.$wrapperEl[0].removeEventListener("transitionend", e.autoplay.onTransitionEnd), e.$wrapperEl[0].removeEventListener("webkitTransitionEnd", e.autoplay.onTransitionEnd), e.autoplay.paused = !1, e.autoplay.running ? e.autoplay.run() : e.autoplay.stop());
22129            }
22130          }
22131        });
22132      },
22133      on: {
22134        init: function () {
22135          this.params.autoplay.enabled && (this.autoplay.start(), document.addEventListener("visibilitychange", this.autoplay.onVisibilityChange));
22136        },
22137        beforeTransitionStart: function (e, t) {
22138          this.autoplay.running && (t || !this.params.autoplay.disableOnInteraction ? this.autoplay.pause(e) : this.autoplay.stop());
22139        },
22140        sliderFirstMove: function () {
22141          this.autoplay.running && (this.params.autoplay.disableOnInteraction ? this.autoplay.stop() : this.autoplay.pause());
22142        },
22143        touchEnd: function () {
22144          this.params.cssMode && this.autoplay.paused && !this.params.autoplay.disableOnInteraction && this.autoplay.run();
22145        },
22146        destroy: function () {
22147          this.autoplay.running && this.autoplay.stop(), document.removeEventListener("visibilitychange", this.autoplay.onVisibilityChange);
22148        }
22149      }
22150    }, {
22151      name: "effect-fade",
22152      params: {
22153        fadeEffect: {
22154          crossFade: !1
22155        }
22156      },
22157      create: function () {
22158        d.extend(this, {
22159          fadeEffect: {
22160            setTranslate: ge.setTranslate.bind(this),
22161            setTransition: ge.setTransition.bind(this)
22162          }
22163        });
22164      },
22165      on: {
22166        beforeInit: function () {
22167          if ("fade" === this.params.effect) {
22168            this.classNames.push(this.params.containerModifierClass + "fade");
22169            var e = {
22170              slidesPerView: 1,
22171              slidesPerColumn: 1,
22172              slidesPerGroup: 1,
22173              watchSlidesProgress: !0,
22174              spaceBetween: 0,
22175              virtualTranslate: !0
22176            };
22177            d.extend(this.params, e), d.extend(this.originalParams, e);
22178          }
22179        },
22180        setTranslate: function () {
22181          "fade" === this.params.effect && this.fadeEffect.setTranslate();
22182        },
22183        setTransition: function (e) {
22184          "fade" === this.params.effect && this.fadeEffect.setTransition(e);
22185        }
22186      }
22187    }, {
22188      name: "effect-cube",
22189      params: {
22190        cubeEffect: {
22191          slideShadows: !0,
22192          shadow: !0,
22193          shadowOffset: 20,
22194          shadowScale: .94
22195        }
22196      },
22197      create: function () {
22198        d.extend(this, {
22199          cubeEffect: {
22200            setTranslate: be.setTranslate.bind(this),
22201            setTransition: be.setTransition.bind(this)
22202          }
22203        });
22204      },
22205      on: {
22206        beforeInit: function () {
22207          if ("cube" === this.params.effect) {
22208            this.classNames.push(this.params.containerModifierClass + "cube"), this.classNames.push(this.params.containerModifierClass + "3d");
22209            var e = {
22210              slidesPerView: 1,
22211              slidesPerColumn: 1,
22212              slidesPerGroup: 1,
22213              watchSlidesProgress: !0,
22214              resistanceRatio: 0,
22215              spaceBetween: 0,
22216              centeredSlides: !1,
22217              virtualTranslate: !0
22218            };
22219            d.extend(this.params, e), d.extend(this.originalParams, e);
22220          }
22221        },
22222        setTranslate: function () {
22223          "cube" === this.params.effect && this.cubeEffect.setTranslate();
22224        },
22225        setTransition: function (e) {
22226          "cube" === this.params.effect && this.cubeEffect.setTransition(e);
22227        }
22228      }
22229    }, {
22230      name: "effect-flip",
22231      params: {
22232        flipEffect: {
22233          slideShadows: !0,
22234          limitRotation: !0
22235        }
22236      },
22237      create: function () {
22238        d.extend(this, {
22239          flipEffect: {
22240            setTranslate: we.setTranslate.bind(this),
22241            setTransition: we.setTransition.bind(this)
22242          }
22243        });
22244      },
22245      on: {
22246        beforeInit: function () {
22247          if ("flip" === this.params.effect) {
22248            this.classNames.push(this.params.containerModifierClass + "flip"), this.classNames.push(this.params.containerModifierClass + "3d");
22249            var e = {
22250              slidesPerView: 1,
22251              slidesPerColumn: 1,
22252              slidesPerGroup: 1,
22253              watchSlidesProgress: !0,
22254              spaceBetween: 0,
22255              virtualTranslate: !0
22256            };
22257            d.extend(this.params, e), d.extend(this.originalParams, e);
22258          }
22259        },
22260        setTranslate: function () {
22261          "flip" === this.params.effect && this.flipEffect.setTranslate();
22262        },
22263        setTransition: function (e) {
22264          "flip" === this.params.effect && this.flipEffect.setTransition(e);
22265        }
22266      }
22267    }, {
22268      name: "effect-coverflow",
22269      params: {
22270        coverflowEffect: {
22271          rotate: 50,
22272          stretch: 0,
22273          depth: 100,
22274          scale: 1,
22275          modifier: 1,
22276          slideShadows: !0
22277        }
22278      },
22279      create: function () {
22280        d.extend(this, {
22281          coverflowEffect: {
22282            setTranslate: ye.setTranslate.bind(this),
22283            setTransition: ye.setTransition.bind(this)
22284          }
22285        });
22286      },
22287      on: {
22288        beforeInit: function () {
22289          "coverflow" === this.params.effect && (this.classNames.push(this.params.containerModifierClass + "coverflow"), this.classNames.push(this.params.containerModifierClass + "3d"), this.params.watchSlidesProgress = !0, this.originalParams.watchSlidesProgress = !0);
22290        },
22291        setTranslate: function () {
22292          "coverflow" === this.params.effect && this.coverflowEffect.setTranslate();
22293        },
22294        setTransition: function (e) {
22295          "coverflow" === this.params.effect && this.coverflowEffect.setTransition(e);
22296        }
22297      }
22298    }, {
22299      name: "thumbs",
22300      params: {
22301        thumbs: {
22302          swiper: null,
22303          multipleActiveThumbs: !0,
22304          autoScrollOffset: 0,
22305          slideThumbActiveClass: "swiper-slide-thumb-active",
22306          thumbsContainerClass: "swiper-container-thumbs"
22307        }
22308      },
22309      create: function () {
22310        d.extend(this, {
22311          thumbs: {
22312            swiper: null,
22313            init: xe.init.bind(this),
22314            update: xe.update.bind(this),
22315            onThumbClick: xe.onThumbClick.bind(this)
22316          }
22317        });
22318      },
22319      on: {
22320        beforeInit: function () {
22321          var e = this.params.thumbs;
22322          e && e.swiper && (this.thumbs.init(), this.thumbs.update(!0));
22323        },
22324        slideChange: function () {
22325          this.thumbs.swiper && this.thumbs.update();
22326        },
22327        update: function () {
22328          this.thumbs.swiper && this.thumbs.update();
22329        },
22330        resize: function () {
22331          this.thumbs.swiper && this.thumbs.update();
22332        },
22333        observerUpdate: function () {
22334          this.thumbs.swiper && this.thumbs.update();
22335        },
22336        setTransition: function (e) {
22337          var t = this.thumbs.swiper;
22338          t && t.setTransition(e);
22339        },
22340        beforeDestroy: function () {
22341          var e = this.thumbs.swiper;
22342          e && this.thumbs.swiperCreated && e && e.destroy();
22343        }
22344      }
22345    }];
22346  return void 0 === j.use && (j.use = j.Class.use, j.installModule = j.Class.installModule), j.use(Ee), j;
22347});
22348
22349/***/ }),
22350
vendor: 784 bytes, lines 22351-22381
22351/***/ "./node_modules/webpack/buildin/global.js":
22352/*!***********************************!*\
22353  !*** (webpack)/buildin/global.js ***!
22354  \***********************************/
22355/*! no static exports found */
22356/***/ (function(module, exports) {
22357
22358/*** IMPORTS FROM imports-loader ***/
22359var define = false;
22360var g;
22361
22362// This works in non-strict mode
22363g = function () {
22364  return this;
22365}();
22366try {
22367  // This works if eval is allowed (see CSP)
22368  g = g || new Function("return this")();
22369} catch (e) {
22370  // This works if the window reference is available
22371  if (typeof window === "object") g = window;
22372}
22373
22374// g can still be undefined, but nothing to do about it...
22375// We return undefined, instead of nothing here, so it's
22376// easier to handle this case. if(!global) { ...}
22377
22378module.exports = g;
22379
22380/***/ }),
22381
vendor: 857 bytes, lines 22382-22415
22382/***/ "./node_modules/webpack/buildin/module.js":
22383/*!***********************************!*\
22384  !*** (webpack)/buildin/module.js ***!
22385  \***********************************/
22386/*! no static exports found */
22387/***/ (function(module, exports) {
22388
22389/*** IMPORTS FROM imports-loader ***/
22390var define = false;
22391module.exports = function (module) {
22392  if (!module.webpackPolyfill) {
22393    module.deprecate = function () {};
22394    module.paths = [];
22395    // module.parent = undefined by default
22396    if (!module.children) module.children = [];
22397    Object.defineProperty(module, "loaded", {
22398      enumerable: true,
22399      get: function () {
22400        return module.l;
22401      }
22402    });
22403    Object.defineProperty(module, "id", {
22404      enumerable: true,
22405      get: function () {
22406        return module.i;
22407      }
22408    });
22409    module.webpackPolyfill = 1;
22410  }
22411  return module;
22412};
22413
22414/***/ }),
22415
22416/***/ "./src/js/app.js":
22417/*!***********************!*\
22418  !*** ./src/js/app.js ***!
22419  \***********************/
22420/*! no exports provided */
22421/***/ (function(module, __webpack_exports__, __webpack_require__) {
22422
22423"use strict";
22424__webpack_require__.r(__webpack_exports__);
22425/* WEBPACK VAR INJECTION */(function($, jQuery) {/* harmony import */ var swiper_js_swiper_min__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! swiper/js/swiper.min */ "./node_modules/swiper/js/swiper.min.js");
22426/* harmony import */ var swiper_js_swiper_min__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(swiper_js_swiper_min__WEBPACK_IMPORTED_MODULE_0__);
22427/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js");
22428/* harmony import */ var gsap_ScrollToPlugin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gsap/ScrollToPlugin */ "./node_modules/gsap/ScrollToPlugin.js");
22429/* harmony import */ var _lib_gsap_pro_SplitText_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/gsap-pro/SplitText.js */ "./src/lib/gsap-pro/SplitText.js");
22430/* harmony import */ var _lib_gsap_pro_SplitText_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lib_gsap_pro_SplitText_js__WEBPACK_IMPORTED_MODULE_3__);
22431/* harmony import */ var scrollmagic__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! scrollmagic */ "./node_modules/scrollmagic/scrollmagic/uncompressed/ScrollMagic.js");
22432/* harmony import */ var scrollmagic__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scrollmagic__WEBPACK_IMPORTED_MODULE_4__);
22433/* harmony import */ var scrollmagic_scrollmagic_uncompressed_plugins_debug_addIndicators__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators */ "./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators.js");
22434/* harmony import */ var scrollmagic_scrollmagic_uncompressed_plugins_debug_addIndicators__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(scrollmagic_scrollmagic_uncompressed_plugins_debug_addIndicators__WEBPACK_IMPORTED_MODULE_5__);
22435/* harmony import */ var scrollmagic_scrollmagic_uncompressed_plugins_jquery_ScrollMagic__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic */ "./node_modules/scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic.js");
22436/* harmony import */ var scrollmagic_scrollmagic_uncompressed_plugins_jquery_ScrollMagic__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(scrollmagic_scrollmagic_uncompressed_plugins_jquery_ScrollMagic__WEBPACK_IMPORTED_MODULE_6__);
22437/* harmony import */ var _components_cookie_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @components/cookie-manager */ "./src/js/components/cookie-manager.js");
22438/* harmony import */ var _components_custom_google_map_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @components/custom-google-map.js */ "./src/js/components/custom-google-map.js");
22439/* harmony import */ var _components_materialize_form_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @components/materialize-form.js */ "./src/js/components/materialize-form.js");
22440/* harmony import */ var _components_kira_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @components/kira.js */ "./src/js/components/kira.js");
22441/* harmony import */ var _components_menu_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @components/menu.js */ "./src/js/components/menu.js");
22442/* harmony import */ var _utils_router_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @utils/router.js */ "./src/js/utils/router.js");
22443/* harmony import */ var _components_global_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @components/global.js */ "./src/js/components/global.js");
22444/* harmony import */ var _pages_main_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @pages/main.js */ "./src/js/pages/main.js");
22445/* harmony import */ var _pages_news_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @pages/news.js */ "./src/js/pages/news.js");
22446/* harmony import */ var _pages_animations_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @pages/animations.js */ "./src/js/pages/animations.js");
22447/* harmony import */ var _pages_sample_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @pages/sample.js */ "./src/js/pages/sample.js");
22448/* harmony import */ var _pages_contact_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @pages/contact.js */ "./src/js/pages/contact.js");
22449/*** IMPORTS FROM imports-loader ***/
22450var define = false;
22451
22452// src/js/app.js
22453
22454
22455__webpack_require__(/*! @lib/iziModal/js/iziModal.js */ "./src/lib/iziModal/js/iziModal.js")($);
22456
22457
22458
22459gsap__WEBPACK_IMPORTED_MODULE_1__["gsap"].registerPlugin(gsap_ScrollToPlugin__WEBPACK_IMPORTED_MODULE_2__["ScrollToPlugin"], _lib_gsap_pro_SplitText_js__WEBPACK_IMPORTED_MODULE_3___default.a);
22460
22461// IMPORT de ScrollMagic (plus via window)
22462
22463
22464
22465
22466
22467
22468
22469
22470
22471
22472
22473
22474
22475
22476
22477var routes = new _utils_router_js__WEBPACK_IMPORTED_MODULE_12__["default"]([{
22478  file: _pages_animations_js__WEBPACK_IMPORTED_MODULE_16__["default"],
22479  dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__, _components_menu_js__WEBPACK_IMPORTED_MODULE_11__["default"], _components_kira_js__WEBPACK_IMPORTED_MODULE_10__["default"], scrollmagic__WEBPACK_IMPORTED_MODULE_4___default.a, gsap__WEBPACK_IMPORTED_MODULE_1__["gsap"]]
22480}, {
22481  file: _pages_main_js__WEBPACK_IMPORTED_MODULE_14__["default"],
22482  dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__, _components_cookie_manager__WEBPACK_IMPORTED_MODULE_7__["default"], swiper_js_swiper_min__WEBPACK_IMPORTED_MODULE_0___default.a]
22483}, {
22484  file: _pages_news_js__WEBPACK_IMPORTED_MODULE_15__["default"],
22485  dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__],
22486  resolve: '#page-news-archive'
22487}, {
22488  file: _pages_sample_js__WEBPACK_IMPORTED_MODULE_17__["default"],
22489  dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__],
22490  resolve: '#page-sample'
22491}, {
22492  file: _pages_contact_js__WEBPACK_IMPORTED_MODULE_18__["default"],
22493  dependencies: [_components_global_js__WEBPACK_IMPORTED_MODULE_13__, _components_materialize_form_js__WEBPACK_IMPORTED_MODULE_9__["default"], _components_custom_google_map_js__WEBPACK_IMPORTED_MODULE_8__["default"]],
22494  resolve: '#page-contact'
22495}]);
22496(function ($) {
22497  routes.load();
22498})(jQuery);
22499/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
22500
22501/***/ }),
22502
22503/***/ "./src/js/components/cookie-manager.js":
22504/*!*********************************************!*\
22505  !*** ./src/js/components/cookie-manager.js ***!
22506  \*********************************************/
22507/*! exports provided: default */
22508/***/ (function(module, __webpack_exports__, __webpack_require__) {
22509
22510"use strict";
22511__webpack_require__.r(__webpack_exports__);
22512/* WEBPACK VAR INJECTION */(function($) {function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
22513function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
22514function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
22515function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
22516function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
22517function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
22518function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
22519function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
22520function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
22521/*** IMPORTS FROM imports-loader ***/
22522var define = false;
22523
22524/*
22525|--------------------------------------------------------------------------------
22526|                              CookieManager
22527|--------------------------------------------------------------------------------
22528|
22529| CookieManager handles simple cookie banners
22530|
22531*/
22532
22533/*
22534|
22535| Class
22536|--------
22537|
22538*/
22539var CookieManager = /*#__PURE__*/function () {
22540  /*
22541  |
22542  | Constructor
22543  |--------------
22544  */
22545  function CookieManager($banner) {
22546    var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
22547    _classCallCheck(this, CookieManager);
22548    this.banner = $banner;
22549    this.params = this.initParams(params);
22550    this.cookies;
22551    this.init();
22552  }
22553
22554  /*
22555  |
22556  | initParams
22557  |--------------
22558  */
22559  return _createClass(CookieManager, [{
22560    key: "initParams",
22561    value: function initParams(params) {
22562      var name = params.name,
22563        value = params.value,
22564        duration = params.duration,
22565        buttons = params.buttons,
22566        onAccept = params.onAccept,
22567        onRefuse = params.onRefuse;
22568      var paramsObj = {
22569        'name': this.isDefined(name) ? name : 'adveris_cookie_accepted',
22570        'duration': this.isDefined(duration) ? duration : 30,
22571        'onAccept': this.isDefined(onAccept) ? onAccept : null,
22572        'onRefuse': this.isDefined(onRefuse) ? onRefuse : null
22573      };
22574      if (this.isDefined(buttons)) {
22575        var accept = buttons.accept,
22576          refuse = buttons.refuse,
22577          close = buttons.close;
22578        var buttonsParams = {
22579          accept: this.isDefined(accept) ? accept : this.banner.find('.item-cookie-banner-accept'),
22580          refuse: this.isDefined(refuse) ? refuse : this.banner.find('.item-cookie-banner-refuse'),
22581          close: this.isDefined(close) ? close : this.banner.find('.item-cookie-banner-close')
22582        };
22583        paramsObj = _objectSpread(_objectSpread({}, paramsObj), {}, {
22584          buttons: buttonsParams
22585        });
22586      }
22587      return paramsObj;
22588    }
22589
22590    /**
22591    |
22592    | Init
22593    |-------
22594    */
22595  }, {
22596    key: "init",
22597    value: function init() {
22598      if (this.cookieBannerDefined() && this.cookieBannerExist()) {
22599        this.storeCookies();
22600        this.handleCookieBanner();
22601      }
22602    }
22603
22604    /**
22605    |
22606    | handleCookieBanner
22607    |---------------------
22608    */
22609  }, {
22610    key: "handleCookieBanner",
22611    value: function handleCookieBanner() {
22612      this.handleShow();
22613      this.handleActions();
22614    }
22615
22616    /**
22617    |
22618    | handleShow
22619    |--------------
22620    */
22621  }, {
22622    key: "handleShow",
22623    value: function handleShow() {
22624      var name = this.params.name;
22625      if (typeof this.cookies[name] === 'undefined') {
22626        this.banner.show();
22627      }
22628    }
22629
22630    /**
22631    |
22632    | handleActions
22633    |----------------
22634    */
22635  }, {
22636    key: "handleActions",
22637    value: function handleActions() {
22638      var _this = this;
22639      var _this$params = this.params,
22640        name = _this$params.name,
22641        duration = _this$params.duration,
22642        buttons = _this$params.buttons;
22643      var accept = buttons.accept,
22644        refuse = buttons.refuse,
22645        close = buttons.close;
22646      var $banner = this.banner;
22647      close.on('click', function (e) {
22648        e.preventDefault();
22649        $banner.fadeOut();
22650      });
22651      accept.on('click', function (e) {
22652        return _this.closeCookieBanner(e);
22653      });
22654      close.on('click', function (e) {
22655        return _this.closeCookieBanner(e);
22656      });
22657      refuse.on('click', function (e) {
22658        return _this.closeCookieBanner(e, false);
22659      });
22660    }
22661
22662    /**
22663    |
22664    | storeCookies
22665    |---------------
22666    */
22667  }, {
22668    key: "closeCookieBanner",
22669    value: function closeCookieBanner(e) {
22670      var _this2 = this;
22671      var accept = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
22672      e.preventDefault();
22673      var _this$params2 = this.params,
22674        name = _this$params2.name,
22675        duration = _this$params2.duration;
22676      var $banner = this.banner;
22677      $banner.fadeOut(400, function () {
22678        $banner.remove();
22679        _this2.setCookie(name, accept, duration);
22680      });
22681    }
22682
22683    /**
22684    |
22685    | storeCookies
22686    |---------------
22687    */
22688  }, {
22689    key: "storeCookies",
22690    value: function storeCookies() {
22691      var decodedCookie = decodeURIComponent(document.cookie);
22692      var objCookies = decodedCookie.split(';');
22693      var obj = {};
22694      $.each(objCookies, function (k, v) {
22695        var cookie_name = v.split(/=(.+)/)[0].replace(' ', '');
22696        var cookie_value = v.split(/=(.+)/)[1];
22697        obj[cookie_name] = cookie_value;
22698      });
22699      this.cookies = obj;
22700    }
22701
22702    /**
22703    |
22704    | setCookie
22705    |------------
22706    */
22707  }, {
22708    key: "setCookie",
22709    value: function setCookie(name, value, nbDays) {
22710      var _this$params3 = this.params,
22711        onAccept = _this$params3.onAccept,
22712        onRefuse = _this$params3.onRefuse;
22713      var date = new Date();
22714      date.setTime(date.getTime() + nbDays * 24 * 60 * 60 * 1000);
22715      var expires = "expires=" + date.toUTCString();
22716      document.cookie = name + "=" + value + ";" + expires + ";path=/";
22717      if (value == false) {
22718        if (onRefuse !== null) {
22719          onRefuse();
22720        }
22721      } else {
22722        if (onAccept !== null) {
22723          onAccept();
22724        }
22725      }
22726    }
22727
22728    /**
22729    |
22730    | cookieBannerDefined
22731    |-------------------
22732    */
22733  }, {
22734    key: "cookieBannerDefined",
22735    value: function cookieBannerDefined() {
22736      return this.control(this.isDefined(this.banner), this.getMessage('cookieBannerDefined'));
22737    }
22738
22739    /**
22740    |
22741    | cookieBannerExist
22742    |-------------------
22743    */
22744  }, {
22745    key: "cookieBannerExist",
22746    value: function cookieBannerExist() {
22747      return this.control(this.exist(this.banner), this.getMessage('cookieBannerExist'), this.banner);
22748    }
22749
22750    /**
22751    |
22752    | Helper: isDefined
22753    |--------------------
22754    |
22755    */
22756  }, {
22757    key: "isDefined",
22758    value: function isDefined(item) {
22759      return typeof item !== 'undefined';
22760    }
22761
22762    /**
22763    |
22764    | Helper: exist
22765    |----------------
22766    */
22767  }, {
22768    key: "exist",
22769    value: function exist($item) {
22770      return $item.length;
22771    }
22772
22773    /**
22774    |
22775    | Helper: control
22776    |------------------
22777    */
22778  }, {
22779    key: "control",
22780    value: function control(condition, message) {
22781      var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
22782      if (!condition) {
22783        if (selector === null) {
22784          console.error(message);
22785        } else {
22786          console.error(message, selector);
22787        }
22788      }
22789      return condition;
22790    }
22791
22792    /**
22793    |
22794    | Helper: getMessage
22795    |---------------------
22796    */
22797  }, {
22798    key: "getMessage",
22799    value: function getMessage(messageKey) {
22800      var var1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
22801      var var2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
22802      var messages = {
22803        'cookieBannerDefined': 'No cookie banner specified as 1st parameter',
22804        'cookieBannerExist': 'The cookie banner (specified as 1st parameter) does not exist:'
22805      };
22806      return 'Cookie Manager: ' + messages[messageKey];
22807    }
22808  }]);
22809}();
22810/* harmony default export */ __webpack_exports__["default"] = (CookieManager);
22811/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
22812
22813/***/ }),
22814
22815/***/ "./src/js/components/custom-google-map.js":
22816/*!************************************************!*\
22817  !*** ./src/js/components/custom-google-map.js ***!
22818  \************************************************/
22819/*! exports provided: default */
22820/***/ (function(module, __webpack_exports__, __webpack_require__) {
22821
22822"use strict";
22823__webpack_require__.r(__webpack_exports__);
22824/* WEBPACK VAR INJECTION */(function($) {function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
22825function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
22826function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
22827function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
22828function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
22829function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
22830/*** IMPORTS FROM imports-loader ***/
22831var define = false;
22832
22833/*
22834|--------------------------------------------------------------------------------
22835|                                  Custom Google Map
22836|--------------------------------------------------------------------------------
22837|
22838| Scroller is a lightweight library to manage "animated & looped" sliding contents
22839| It uses Greensock as main dependency
22840|
22841*/
22842
22843/*
22844|
22845| Class
22846|--------
22847|
22848*/
22849var customGoogleMap = /*#__PURE__*/function () {
22850  /*
22851  |
22852  | Constructor
22853  |--------------
22854  */
22855  function customGoogleMap($map, params) {
22856    _classCallCheck(this, customGoogleMap);
22857    this.map = $map;
22858    this.params = params;
22859    this.init();
22860  }
22861
22862  /*
22863  |
22864  | init
22865  |-------
22866  */
22867  return _createClass(customGoogleMap, [{
22868    key: "init",
22869    value: function init() {
22870      var _this = this;
22871      var map = new google.maps.Map(_this.map[0], {
22872        zoom: 1,
22873        scrollwheel: false,
22874        center: new google.maps.LatLng(0, 0),
22875        mapTypeId: google.maps.MapTypeId.ROADMAP,
22876        styles: this.getCustomization()
22877      });
22878      map.markers = [];
22879      $.each(this.params.markers, function () {
22880        _this.add_marker($(this), map);
22881      });
22882      _this.center_map(map);
22883      return map;
22884    }
22885
22886    /*
22887    |
22888    | add_marker
22889    |-------------
22890    */
22891  }, {
22892    key: "add_marker",
22893    value: function add_marker($marker, map) {
22894      var latlng = new google.maps.LatLng($marker.data('lat'), $marker.data('lng'));
22895      var icon = {
22896        url: $marker.data('icon'),
22897        scaledSize: new google.maps.Size(60, 60),
22898        origin: new google.maps.Point(0, 0),
22899        anchor: new google.maps.Point(0, 0)
22900      };
22901      var marker = new google.maps.Marker({
22902        position: latlng,
22903        map: map,
22904        icon: icon
22905      });
22906      map.markers.push(marker);
22907      if ($marker.html()) {
22908        var infowindow = new google.maps.InfoWindow({
22909          content: '<div class="map-card">' + $marker.html() + '</div>'
22910        });
22911        google.maps.event.addListener(marker, 'click', function () {
22912          infowindow.open(map, marker);
22913        });
22914      }
22915    }
22916
22917    /*
22918    |
22919    | center_map
22920    |-------------
22921    */
22922  }, {
22923    key: "center_map",
22924    value: function center_map(map) {
22925      var bounds = new google.maps.LatLngBounds();
22926      $.each(map.markers, function (i, marker) {
22927        var latlng = new google.maps.LatLng(marker.position.lat(), marker.position.lng());
22928        bounds.extend(latlng);
22929      });
22930      if (map.markers.length == 1) {
22931        map.setCenter(bounds.getCenter());
22932        map.setZoom(this.params.zoom);
22933      } else {
22934        map.fitBounds(bounds);
22935      }
22936    }
22937
22938    /*
22939    |
22940    | getCustomization
22941    |-------------------
22942    */
22943  }, {
22944    key: "getCustomization",
22945    value: function getCustomization() {
22946      return [{
22947        "elementType": "geometry",
22948        "stylers": [{
22949          "color": "#f5f5f5"
22950        }]
22951      }, {
22952        "elementType": "labels.icon",
22953        "stylers": [{
22954          "visibility": "off"
22955        }]
22956      }, {
22957        "elementType": "labels.text.fill",
22958        "stylers": [{
22959          "color": "#616161"
22960        }]
22961      }, {
22962        "elementType": "labels.text.stroke",
22963        "stylers": [{
22964          "color": "#f5f5f5"
22965        }]
22966      }, {
22967        "featureType": "administrative.land_parcel",
22968        "elementType": "labels.text.fill",
22969        "stylers": [{
22970          "color": "#bdbdbd"
22971        }]
22972      }, {
22973        "featureType": "poi",
22974        "elementType": "geometry",
22975        "stylers": [{
22976          "color": "#eeeeee"
22977        }]
22978      }, {
22979        "featureType": "poi",
22980        "elementType": "labels.text.fill",
22981        "stylers": [{
22982          "color": "#757575"
22983        }]
22984      }, {
22985        "featureType": "poi.park",
22986        "elementType": "geometry",
22987        "stylers": [{
22988          "color": "#e5e5e5"
22989        }]
22990      }, {
22991        "featureType": "poi.park",
22992        "elementType": "labels.text.fill",
22993        "stylers": [{
22994          "color": "#9e9e9e"
22995        }]
22996      }, {
22997        "featureType": "road",
22998        "elementType": "geometry",
22999        "stylers": [{
23000          "color": "#ffffff"
23001        }]
23002      }, {
23003        "featureType": "road.arterial",
23004        "elementType": "labels.text.fill",
23005        "stylers": [{
23006          "color": "#757575"
23007        }]
23008      }, {
23009        "featureType": "road.highway",
23010        "elementType": "geometry",
23011        "stylers": [{
23012          "color": "#dadada"
23013        }]
23014      }, {
23015        "featureType": "road.highway",
23016        "elementType": "labels.text.fill",
23017        "stylers": [{
23018          "color": "#616161"
23019        }]
23020      }, {
23021        "featureType": "road.local",
23022        "elementType": "labels.text.fill",
23023        "stylers": [{
23024          "color": "#9e9e9e"
23025        }]
23026      }, {
23027        "featureType": "transit.line",
23028        "elementType": "geometry",
23029        "stylers": [{
23030          "color": "#e5e5e5"
23031        }]
23032      }, {
23033        "featureType": "transit.station",
23034        "elementType": "geometry",
23035        "stylers": [{
23036          "color": "#eeeeee"
23037        }]
23038      }, {
23039        "featureType": "water",
23040        "elementType": "geometry",
23041        "stylers": [{
23042          "color": "#c9c9c9"
23043        }]
23044      }, {
23045        "featureType": "water",
23046        "elementType": "labels.text.fill",
23047        "stylers": [{
23048          "color": "#9e9e9e"
23049        }]
23050      }];
23051    }
23052  }]);
23053}();
23054/* harmony default export */ __webpack_exports__["default"] = (customGoogleMap);
23055/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
23056
23057/***/ }),
23058
23059/***/ "./src/js/components/global.js":
23060/*!*************************************!*\
23061  !*** ./src/js/components/global.js ***!
23062  \*************************************/
23063/*! exports provided: dump, dispachEvent, isDefined, exist, isValidEmail, setCookie, getCookie, deleteCookie */
23064/***/ (function(module, __webpack_exports__, __webpack_require__) {
23065
23066"use strict";
23067__webpack_require__.r(__webpack_exports__);
23068/* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dump", function() { return dump; });
23069/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispachEvent", function() { return dispachEvent; });
23070/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDefined", function() { return isDefined; });
23071/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exist", function() { return exist; });
23072/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isValidEmail", function() { return isValidEmail; });
23073/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCookie", function() { return setCookie; });
23074/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCookie", function() { return getCookie; });
23075/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deleteCookie", function() { return deleteCookie; });
23076function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
23077function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23078function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
23079function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
23080function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
23081function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
23082/*** IMPORTS FROM imports-loader ***/
23083var define = false;
23084
23085/*
23086|
23087| JQuery replaceClass
23088|----------------------
23089*/
23090$.fn.replaceClass = function (oldClasses, newClasses) {
23091  return this.each(function () {
23092    $(this).removeClass(oldClasses).addClass(newClasses);
23093  });
23094};
23095
23096/*
23097|
23098| Dump
23099|--------
23100*/
23101function dump(value) {
23102  console.log(value);
23103}
23104
23105/*
23106|
23107| Dispatch event
23108|-----------------
23109*/
23110function dispachEvent($element, eventName) {
23111  var datas = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
23112  var event = $.Event(eventName);
23113  if (datas !== null) {
23114    for (var _i = 0, _Object$entries = Object.entries(datas); _i < _Object$entries.length; _i++) {
23115      var _ref = _Object$entries[_i];
23116      var _ref2 = _slicedToArray(_ref, 2);
23117      var key = _ref2[0];
23118      var value = _ref2[1];
23119      event[key] = value;
23120    }
23121  }
23122  $element.trigger(event);
23123}
23124
23125/*
23126|
23127| Check defined
23128|----------------
23129*/
23130function isDefined(item) {
23131  return typeof item !== 'undefined';
23132}
23133
23134/*
23135|
23136| Check exist
23137|-------------------
23138*/
23139function exist(element) {
23140  return element.length;
23141}
23142
23143/*
23144|
23145| Email validation
23146|-------------------
23147*/
23148function isValidEmail(email) {
23149  var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
23150  return re.test(String(email).toLowerCase());
23151}
23152
23153/*
23154|
23155| Set cookie 
23156|------------
23157*/
23158function setCookie(name, value, nbDays) {
23159  var date = new Date();
23160  date.setTime(date.getTime() + nbDays * 24 * 60 * 60 * 1000);
23161  var expires = "expires=" + date.toUTCString();
23162  document.cookie = name + "=" + value + ";" + expires + ";path=/";
23163}
23164
23165/*
23166|
23167| Get cookie
23168|-------------------
23169*/
23170function getCookie(cname) {
23171  var name = cname + "=";
23172  var decodedCookie = decodeURIComponent(document.cookie);
23173  var ca = decodedCookie.split(';');
23174  for (var i = 0; i < ca.length; i++) {
23175    var c = ca[i];
23176    while (c.charAt(0) == ' ') {
23177      c = c.substring(1);
23178    }
23179    if (c.indexOf(name) == 0) {
23180      return c.substring(name.length, c.length);
23181    }
23182  }
23183  return null;
23184}
23185function deleteCookie(name) {
23186  document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
23187}
23188/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
23189
23190/***/ }),
23191
23192/***/ "./src/js/components/kira.js":
23193/*!***********************************!*\
23194  !*** ./src/js/components/kira.js ***!
23195  \***********************************/
23196/*! exports provided: default */
23197/***/ (function(module, __webpack_exports__, __webpack_require__) {
23198
23199"use strict";
23200__webpack_require__.r(__webpack_exports__);
23201/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js");
23202function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
23203function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23204function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
23205function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
23206function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
23207function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
23208function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
23209function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
23210function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
23211/*** IMPORTS FROM imports-loader ***/
23212var define = false;
23213
23214// src/js/kira.js
23215
23216
23217var Kira = /*#__PURE__*/function () {
23218  function Kira(scrollmagic) {
23219    var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
23220    _classCallCheck(this, Kira);
23221    this.scrollmagic = scrollmagic;
23222    this.defaults = this.initDefaults();
23223    this.params = this.initParams(params);
23224    this.timelines = {};
23225    this.scenes = {};
23226    this.tweens = {};
23227    this.scrollMagicController = null;
23228  }
23229  return _createClass(Kira, [{
23230    key: "initDefaults",
23231    value: function initDefaults() {
23232      return {
23233        debug: false,
23234        loadEvent: {
23235          domElement: null,
23236          eventName: null
23237        },
23238        optimize: false,
23239        options: {
23240          start: "-=0.4",
23241          triggerHook: "onCenter",
23242          reverse: true
23243        },
23244        selectors: {
23245          onLoadWrappers: {
23246            element: $("[data-kira-timeline-onload]"),
23247            data: "kira-timeline-onload"
23248          },
23249          onScrollWrappers: {
23250            element: $("[data-kira-timeline]"),
23251            data: "kira-timeline"
23252          },
23253          item: {
23254            element: $("[data-kira-item]"),
23255            data: "kira-item"
23256          }
23257        }
23258      };
23259    }
23260  }, {
23261    key: "initParams",
23262    value: function initParams(params) {
23263      var paramsObj = _objectSpread({}, this.defaults);
23264      var debug = params.debug,
23265        loadEvent = params.loadEvent,
23266        optimize = params.optimize,
23267        options = params.options;
23268      if (this.isDefined(debug)) paramsObj.debug = debug;
23269      if (this.isDefined(loadEvent)) paramsObj.loadEvent = _objectSpread(_objectSpread({}, paramsObj.loadEvent), loadEvent);
23270      if (this.isDefined(optimize)) paramsObj.optimize = optimize;
23271      if (this.isDefined(options)) paramsObj.options = _objectSpread(_objectSpread({}, paramsObj.options), options);
23272      return paramsObj;
23273    }
23274  }, {
23275    key: "init",
23276    value: function init() {
23277      if (this.scrollMagicIsDefined()) {
23278        this.runOnloadAnimations();
23279        this.runOnScrollAnimations();
23280      }
23281    }
23282  }, {
23283    key: "setTimeline",
23284    value: function setTimeline(timelineName, paused, $selector) {
23285      var _this = this;
23286      var timeline = gsap__WEBPACK_IMPORTED_MODULE_0__["gsap"].timeline({
23287        paused: paused,
23288        onStart: function onStart() {
23289          _this.dispachEvent($selector, "kira:timelineStart", {
23290            timeline: this
23291          });
23292        },
23293        onUpdate: function onUpdate() {
23294          _this.dispachEvent($selector, "kira:timelineUpdate", {
23295            timeline: this
23296          });
23297        },
23298        onComplete: function onComplete() {
23299          _this.dispachEvent($selector, "kira:timelineComplete", {
23300            timeline: this
23301          });
23302        }
23303      });
23304      _this.registerTimeline(timelineName, timeline);
23305      return timeline;
23306    }
23307  }, {
23308    key: "registerTimeline",
23309    value: function registerTimeline(timelineName, timeline) {
23310      if (this.isDefined(timelineName)) {
23311        this.timelines[String(timelineName)] = timeline;
23312      }
23313    }
23314  }, {
23315    key: "runOnloadAnimations",
23316    value: function runOnloadAnimations() {
23317      var _this2 = this;
23318      var _this$params$loadEven = this.params.loadEvent,
23319        domElement = _this$params$loadEven.domElement,
23320        eventName = _this$params$loadEven.eventName;
23321      if (domElement && eventName) {
23322        domElement.on(eventName, function () {
23323          return _this2.initTimelines("onLoadWrappers");
23324        });
23325      } else {
23326        this.initTimelines("onLoadWrappers");
23327      }
23328    }
23329  }, {
23330    key: "initTimelines",
23331    value: function initTimelines(selectorKey) {
23332      var _this3 = this;
23333      var paused = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
23334      var autoplay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
23335      var selector = this.params.selectors[selectorKey];
23336      var $elements = selector.element;
23337      var dataAttr = selector.data;
23338      $elements.each(function (_, el) {
23339        var $el = $(el);
23340        if (_this3.isValidTimeline($el)) {
23341          var name = $el.data(dataAttr);
23342          var timeline = _this3.setTimeline(name, paused, $el);
23343          _this3.generateTimelineTweens({
23344            selector: $el,
23345            timeline: timeline,
23346            timelineName: name
23347          });
23348          autoplay && timeline.play();
23349        }
23350      });
23351    }
23352  }, {
23353    key: "runOnScrollAnimations",
23354    value: function runOnScrollAnimations() {
23355      var _this4 = this;
23356      var controller = this.getScrollMagicController(this.scrollmagic);
23357      var sel = this.params.selectors.onScrollWrappers;
23358      var scenes = [];
23359      sel.element.each(function (_, el) {
23360        scenes.push(_this4.createScene($(el), sel.data));
23361      });
23362      controller.addScene(scenes);
23363    }
23364  }, {
23365    key: "getScrollMagicController",
23366    value: function getScrollMagicController(ScrollMagic) {
23367      if (!this.scrollMagicController) {
23368        this.scrollMagicController = new ScrollMagic.Controller();
23369      }
23370      return this.scrollMagicController;
23371    }
23372  }, {
23373    key: "createScene",
23374    value: function createScene($selector, dataName) {
23375      var scene = null;
23376      if (this.isValidTimeline($selector)) {
23377        var timelineName = $selector.data(dataName);
23378        var timeline = this.setTimeline(timelineName, false, $selector);
23379        var options = this.getSceneOptions($selector);
23380        this.generateTimelineTweens({
23381          selector: $selector,
23382          timeline: timeline,
23383          timelineName: timelineName
23384        });
23385        scene = new this.scrollmagic.Scene(options).setTween(timeline);
23386        this.params.debug && scene.addIndicators();
23387        this.registerScene(timelineName, scene);
23388      }
23389      return scene;
23390    }
23391  }, {
23392    key: "registerScene",
23393    value: function registerScene(timelineName, scene) {
23394      this.scenes[timelineName] = scene;
23395    }
23396  }, {
23397    key: "getSceneOptions",
23398    value: function getSceneOptions($selector) {
23399      var _$selector$data = $selector.data(),
23400        triggerHook = _$selector$data.triggerHook,
23401        reverse = _$selector$data.reverse;
23402      var def = this.params.options;
23403      return {
23404        triggerElement: $selector,
23405        triggerHook: this.isDefined(triggerHook) ? triggerHook : def.triggerHook,
23406        reverse: this.isDefined(reverse) ? reverse : def.reverse
23407      };
23408    }
23409  }, {
23410    key: "generateTimelineTweens",
23411    value: function generateTimelineTweens(_ref) {
23412      var _this5 = this;
23413      var $selector = _ref.selector,
23414        timeline = _ref.timeline;
23415      var itemSel = this.params.selectors.item;
23416      $selector.find(itemSel.element).each(function (i, el) {
23417        var _$item$data, _this5$tweens$key, _this5$tweens;
23418        var $item = $(el);
23419        var key = $item.data(itemSel.data);
23420        var start = (_$item$data = $item.data("start")) !== null && _$item$data !== void 0 ? _$item$data : i === 0 ? "start" : _this5.params.options.start;
23421        (_this5$tweens$key = (_this5$tweens = _this5.tweens)[key]) === null || _this5$tweens$key === void 0 || _this5$tweens$key.c
23421all(_this5$tweens, $item, timeline, start);
23422      });
23423    }
23424  }, {
23425    key: "add",
23426    value: function add(index, callback) {
23427      this.tweens[index] = callback;
23428    }
23429  }, {
23430    key: "isValidTimeline",
23431    value: function isValidTimeline($selector) {
23432      var name = $selector.data("kira-timeline");
23433      var ok = true,
23434        msg;
23435      if (name && this.timelines[name]) {
23436        ok = false;
23437        msg = this.getMessage("isValidTimelineDuplicate", name);
23438      }
23439      return this.control(ok, msg, $selector);
23440    }
23441  }, {
23442    key: "scrollMagicIsDefined",
23443    value: function scrollMagicIsDefined() {
23444      return this.control(this.isDefined(this.scrollmagic), this.getMessage("scrollMagicIsDefined"));
23445    }
23446  }, {
23447    key: "dispachEvent",
23448    value: function dispachEvent($el, eventName) {
23449      var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
23450      var e = $.Event(eventName);
23451      if (data) $.each(data, function (k, v) {
23452        return e[k] = v;
23453      });
23454      $el.trigger(e);
23455    }
23456  }, {
23457    key: "isDefined",
23458    value: function isDefined(v) {
23459      return typeof v !== "undefined";
23460    }
23461  }, {
23462    key: "control",
23463    value: function control(condition, message) {
23464      var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
23465      if (!condition) {
23466        selector ? console.error(message, selector) : console.error(message);
23467      }
23468      return condition;
23469    }
23470  }, {
23471    key: "getMessage",
23472    value: function getMessage(key) {
23473      var var1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
23474      var msgs = {
23475        scrollMagicIsDefined: "ScrollMagic is required to init Kira.",
23476        isValidTimelineDuplicate: "You already have a timeline called " + var1 + ", rename it."
23477      };
23478      return "Kira: " + (msgs[key] || "");
23479    }
23480  }]);
23481}();
23482/* harmony default export */ __webpack_exports__["default"] = (Kira);
23483/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
23484
23485/***/ }),
23486
23487/***/ "./src/js/components/materialize-form.js":
23488/*!***********************************************!*\
23489  !*** ./src/js/components/materialize-form.js ***!
23490  \***********************************************/
23491/*! exports provided: default */
23492/***/ (function(module, __webpack_exports__, __webpack_require__) {
23493
23494"use strict";
23495__webpack_require__.r(__webpack_exports__);
23496/* WEBPACK VAR INJECTION */(function($) {function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
23497function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
23498function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
23499function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
23500function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
23501function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
23502/*** IMPORTS FROM imports-loader ***/
23503var define = false;
23504
23505/*
23506|--------------------------------------------------------------------------------
23507|                              Materialize Form
23508|--------------------------------------------------------------------------------
23509|
23510| Materialize Form allows to easily implement materialize form effects
23511|
23512*/
23513
23514/*
23515|
23516| Class
23517|--------
23518|
23519*/
23520var MaterializeForm = /*#__PURE__*/function () {
23521  /*
23522  |
23523  | Constructor
23524  |--------------
23525  */
23526  function MaterializeForm($formWrapper) {
23527    var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
23528    _classCallCheck(this, MaterializeForm);
23529    this.formWrapper = $formWrapper;
23530    this.params = this.initParams(params);
23531    this.init();
23532  }
23533
23534  /*
23535  |
23536  | initParams
23537  |--------------
23538  */
23539  return _createClass(MaterializeForm, [{
23540    key: "initParams",
23541    value: function initParams(params) {
23542      var selectors = params.selectors,
23543        labelEffect = params.labelEffect;
23544      var group = selectors.group,
23545        label = selectors.label,
23546        input = selectors.input;
23547      var duration = labelEffect.duration,
23548        scale = labelEffect.scale,
23549        y = labelEffect.y,
23550        ease = labelEffect.ease;
23551      return {
23552        'selectors': {
23553          'group': this.isDefined(group) ? group : 'form-group',
23554          'label': this.isDefined(label) ? label : 'label',
23555          'input': this.isDefined(input) ? input : 'input'
23556        },
23557        'labelEffect': {
23558          'duration': this.isDefined(duration) ? duration : 0.3,
23559          'scale': this.isDefined(scale) ? scale : 0.7,
23560          'y': this.isDefined(y) ? y : -10,
23561          'ease': this.isDefined(ease) ? ease : Power1.easeOut
23562        },
23563        'focusedClasses': {
23564          'group': 'materialize-group-focused',
23565          'label': 'materialize-label-focused',
23566          'input': 'materialize-input-focused'
23567        }
23568      };
23569    }
23570
23571    /*
23572    |
23573    | initTimeline
23574    |---------------
23575    */
23576  }, {
23577    key: "initTimeline",
23578    value: function initTimeline() {
23579      return new TimelineMax({
23580        paused: true,
23581        onComplete: this.handleComplete,
23582        onReverseComplete: this.handleReverseComplete
23583      });
23584    }
23585
23586    /**
23587    |
23588    | Init
23589    |-------
23590    */
23591  }, {
23592    key: "init",
23593    value: function init() {
23594      if (this.formWrapperExist()) {
23595        this.handleToggleInputs();
23596      }
23597    }
23598
23599    /**
23600    |
23601    | handleToggleInputs
23602    |---------------------
23603    */
23604  }, {
23605    key: "handleToggleInputs",
23606    value: function handleToggleInputs() {
23607      var _this = this;
23608      var $formWraper = this.formWrapper;
23609      var _this$params$selector = this.params.selectors,
23610        group = _this$params$selector.group,
23611        input = _this$params$selector.input;
23612      var $input = $formWraper.find(group + ' ' + input);
23613      $.each($input, function () {
23614        var $input = $(this),
23615          $group = $input.closest(group),
23616          $label = $group.find('label');
23617        if ($input.val() != '') {
23618          _this.animateFocus($label);
23619        }
23620      });
23621      $input.on('blur focus', function (e) {
23622        console.log('error');
23623        var event = e.type,
23624          $input = $(this),
23625          $group = $input.closest(group),
23626          $label = $group.find('label');
23627        event === 'focus' && _this.handleFocus($group, $label);
23628        event === 'blur' && _this.handleBlur($group, $label, $input);
23629      });
23630    }
23631
23632    /**
23633    |
23634    | handleFocus
23635    |--------------
23636    */
23637  }, {
23638    key: "handleFocus",
23639    value: function handleFocus($group, $label) {
23640      var _this$params$focusedC = this.params.focusedClasses,
23641        group = _this$params$focusedC.group,
23642        label = _this$params$focusedC.label;
23643      $group.addClass(group);
23644      $label.addClass(label);
23645      this.animateFocus($label);
23646    }
23647
23648    /**
23649    |
23650    | animateFocus
23651    |--------------
23652    */
23653  }, {
23654    key: "animateFocus",
23655    value: function animateFocus($label) {
23656      var _this$params$labelEff = this.params.labelEffect,
23657        duration = _this$params$labelEff.duration,
23658        scale = _this$params$labelEff.scale,
23659        y = _this$params$labelEff.y,
23660        ease = _this$params$labelEff.ease;
23661      TweenMax.to($label, duration, {
23662        scale: scale,
23663        y: y,
23664        transformOrigin: 'left top',
23665        ease: ease
23666      });
23667    }
23668
23669    /**
23670    |
23671    | handleFocus
23672    |--------------
23673    */
23674  }, {
23675    key: "handleBlur",
23676    value: function handleBlur($group, $label, $input) {
23677      var _this$params$focusedC2 = this.params.focusedClasses,
23678        group = _this$params$focusedC2.group,
23679        label = _this$params$focusedC2.label;
23680      if ($input.val() === '') {
23681        $group.removeClass(group);
23682        $label.removeClass(label);
23683        this.animateBlur($label);
23684      }
23685    }
23686
23687    /**
23688    |
23689    | animateBlur
23690    |--------------
23691    */
23692  }, {
23693    key: "animateBlur",
23694    value: function animateBlur($label) {
23695      var _this$params$labelEff2 = this.params.labelEffect,
23696        duration = _this$params$labelEff2.duration,
23697        ease = _this$params$labelEff2.ease;
23698      TweenMax.to($label, duration, {
23699        scale: 1,
23700        y: 0,
23701        transformOrigin: 'left top',
23702        ease: ease
23703      });
23704    }
23705
23706    /**
23707    |
23708    | formWrapperExist
23709    |-------------------
23710    */
23711  }, {
23712    key: "formWrapperExist",
23713    value: function formWrapperExist() {
23714      return this.control(this.exist(this.formWrapper), this.getMessage('formWrapperExist'), this.formWrapper);
23715    }
23716
23717    /**
23718    |
23719    | Helper: isDefined
23720    |--------------------
23721    |
23722    */
23723  }, {
23724    key: "isDefined",
23725    value: function isDefined(item) {
23726      return typeof item !== 'undefined';
23727    }
23728
23729    /**
23730    |
23731    | Helper: exist
23732    |----------------
23733    */
23734  }, {
23735    key: "exist",
23736    value: function exist($item) {
23737      return $item.length;
23738    }
23739
23740    /**
23741    |
23742    | Helper: control
23743    |------------------
23744    */
23745  }, {
23746    key: "control",
23747    value: function control(condition, message) {
23748      var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
23749      if (!condition) {
23750        if (selector === null) {
23751          console.error(message);
23752        } else {
23753          console.error(message, selector);
23754        }
23755      }
23756      return condition;
23757    }
23758
23759    /**
23760    |
23761    | Helper: getMessage
23762    |---------------------
23763    */
23764  }, {
23765    key: "getMessage",
23766    value: function getMessage(messageKey) {
23767      var var1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
23768      var var2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
23769      var messages = {
23770        'formWrapperExist': 'The form wrapper (specified as 1st parameter) does not exist:'
23771      };
23772      return 'Materialize form: ' + messages[messageKey];
23773    }
23774  }]);
23775}();
23776/* harmony default export */ __webpack_exports__["default"] = (MaterializeForm);
23777/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
23778
23779/***/ }),
23780
23781/***/ "./src/js/components/menu.js":
23782/*!***********************************!*\
23783  !*** ./src/js/components/menu.js ***!
23784  \***********************************/
23785/*! exports provided: default */
23786/***/ (function(module, __webpack_exports__, __webpack_require__) {
23787
23788"use strict";
23789__webpack_require__.r(__webpack_exports__);
23790/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! gsap */ "./node_modules/gsap/index.js");
23791function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
23792function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
23793function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
23794function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
23795function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
23796function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
23797/*** IMPORTS FROM imports-loader ***/
23798var define = false;
23799
23800// src/js/components/menu.js
23801
23802
23803var Menu = /*#__PURE__*/function () {
23804  function Menu($menuWrapper, $menuButton) {
23805    var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
23806    _classCallCheck(this, Menu);
23807    this.bindMethods();
23808    this.handleSubmenus();
23809    this.menuWrapper = $menuWrapper;
23810    this.menuButton = $menuButton;
23811    this.menuTimeline = this.initTimeline();
23812    this.params = this.initParams(params);
23813  }
23814  return _createClass(Menu, [{
23815    key: "bindMethods",
23816    value: function bindMethods() {
23817      this.handleComplete = this.handleComplete.bind(this);
23818      this.handleReverseComplete = this.handleReverseComplete.bind(this);
23819    }
23820  }, {
23821    key: "initParams",
23822    value: function initParams(params) {
23823      var activeClass = params.activeClass,
23824        reverseTimeScale = params.reverseTimeScale;
23825      return {
23826        activeClass: activeClass != null ? activeClass : 'menu-active',
23827        reverseTimeScale: reverseTimeScale != null ? reverseTimeScale : 1
23828      };
23829    }
23830  }, {
23831    key: "initTimeline",
23832    value: function initTimeline() {
23833      return gsap__WEBPACK_IMPORTED_MODULE_0__["gsap"].timeline({
23834        paused: true,
23835        onComplete: this.handleComplete,
23836        onReverseComplete: this.handleReverseComplete
23837      });
23838    }
23839  }, {
23840    key: "init",
23841    value: function init() {
23842      if (this.menuWrapperExist() && this.menuButtonExist()) {
23843        this.handleToggleMenu();
23844      }
23845    }
23846  }, {
23847    key: "handleToggleMenu",
23848    value: function handleToggleMenu() {
23849      var _this = this;
23850      this.menuButton.on('click', function () {
23851        if (_this.menuIsActive()) {
23852          _this.close();
23853        } else {
23854          _this.open();
23855        }
23856      });
23857    }
23858  }, {
23859    key: "handleComplete",
23860    value: function handleComplete() {
23861      this.dispachEvent(this.menuWrapper, 'menu:opened');
23862    }
23863  }, {
23864    key: "handleReverseComplete",
23865    value: function handleReverseComplete() {
23866      this.dispachEvent(this.menuWrapper, 'menu:closed');
23867    }
23868  }, {
23869    key: "open",
23870    value: function open() {
23871      this.menuTimeline.timeScale(1).play();
23872      this.dispachEvent(this.menuWrapper, 'menu:open');
23873    }
23874  }, {
23875    key: "close",
23876    value: function close() {
23877      this.menuTimeline.timeScale(this.params.reverseTimeScale).reverse();
23878      this.dispachEvent(this.menuWrapper, 'menu:close');
23879    }
23880  }, {
23881    key: "menuIsActive",
23882    value: function menuIsActive() {
23883      return this.menuTimeline.totalProgress() !== 0;
23884    }
23885  }, {
23886    key: "menuWrapperExist",
23887    value: function menuWrapperExist() {
23888      return this.control(this.exist(this.menuWrapper), this.getMessage('menuWrapperExist'));
23889    }
23890  }, {
23891    key: "menuButtonExist",
23892    value: function menuButtonExist() {
23893      return this.control(this.exist(this.menuButton), this.getMessage('menuButtonExist'));
23894    }
23895  }, {
23896    key: "isDefined",
23897    value: function isDefined(item) {
23898      return typeof item !== 'undefined';
23899    }
23900  }, {
23901    key: "exist",
23902    value: function exist($item) {
23903      return $item.length > 0;
23904    }
23905  }, {
23906    key: "control",
23907    value: function control(condition, message) {
23908      var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
23909      if (!condition) {
23910        console.error(message, selector || '');
23911      }
23912      return condition;
23913    }
23914  }, {
23915    key: "dispachEvent",
23916    value: function dispachEvent($element, eventName) {
23917      var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
23918      var event = $.Event(eventName);
23919      if (data) {
23920        Object.keys(data).forEach(function (key) {
23921          event[key] = data[key];
23922        });
23923      }
23924      $element.trigger(event);
23925    }
23926  }, {
23927    key: "getMessage",
23928    value: function getMessage(key) {
23929      var messages = {
23930        menuWrapperExist: 'The menu wrapper (specified as 1st parameter) does not exist',
23931        menuButtonExist: 'The button menu (specified as 2nd parameter) does not exist'
23932      };
23933      return "Menu: ".concat(messages[key]);
23934    }
23935  }, {
23936    key: "handleSubmenus",
23937    value: function handleSubmenus() {
23938      var $toggles = $('[data-toggle-submenu]');
23939      var $overlay = $('.submenu-overlay');
23940      $('nav .item-menu a').on('click', function (e) {
23941        if (this.getAttribute('href') === '#') {
23942          e.preventDefault();
23943        }
23944      });
23945      $toggles.on('click', function (e) {
23946        var $this = $(this);
23947        var isOpen = $this.hasClass('submenu-open');
23948        $('[data-toggle-submenu]').removeClass('submenu-open');
23949        $overlay.removeClass('visible');
23950        if (!isOpen) {
23951          $this.addClass('submenu-open');
23952          $overlay.addClass('visible');
23953        }
23954      });
23955      $overlay.on('click', function () {
23956        $('[data-toggle-submenu]').removeClass('submenu-open');
23957        $overlay.removeClass('visible');
23958      });
23959    }
23960  }]);
23961}();
23962/* harmony default export */ __webpack_exports__["default"] = (Menu);
23963/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
23964
23965/***/ }),
23966
23967/***/ "./src/js/pages/animations.js":
23968/*!************************************!*\
23969  !*** ./src/js/pages/animations.js ***!
23970  \************************************/
23971/*! exports provided: default */
23972/***/ (function(module, __webpack_exports__, __webpack_require__) {
23973
23974"use strict";
23975__webpack_require__.r(__webpack_exports__);
23976/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var _lib_gsap_pro_SplitText__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lib/gsap-pro/SplitText */ "./src/lib/gsap-pro/SplitText.js");
23977/* harmony import */ var _lib_gsap_pro_SplitText__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lib_gsap_pro_SplitText__WEBPACK_IMPORTED_MODULE_0__);
23978/*** IMPORTS FROM imports-loader ***/
23979var define = false;
23980
23981// src/js/pages/animations.js
23982
23983/* harmony default export */ __webpack_exports__["default"] = ({
23984  init: function init(app, Menu, Kira, ScrollMagic, gsap) {
23985    var $body = $('body'),
23986      $pageLoader = $('.page-loader'),
23987      scrollAreas = document.querySelectorAll('.scroll-area'),
23988      $splitItems = $body.find('[data-splittext]'),
23989      $menuWrapper = $('#mobile-menu'),
23990      $menuButton = $('#header .btn-menu'),
23991      $menuBars = $menuButton.find('.item-burger > span'),
23992      $menuClose = $menuWrapper.find('.item-close'),
23993      $menuStaggerItems = $menuWrapper.find('[data-stagger-item]');
23994    $splitItems.each(function () {
23995      var $item = $(this);
23996      var split = new _lib_gsap_pro_SplitText__WEBPACK_IMPORTED_MODULE_0___default.a($item, {
23997        type: $item.data('splittext') || 'words, chars',
23998        linesClass: 'item-line',
23999        wordsClass: 'item-word',
24000        charsClass: 'item-char'
24001      });
24002      $item[0].split = split;
24003    });
24004    $body.on('loaderEnd', function () {
24005      $splitItems.addClass('split-ready');
24006    });
24007    scrollAreas.forEach(function (el) {
24008      return Scrollbar.init(el);
24009    });
24010    var loaderTl = gsap.timeline({
24011      paused: true
24012    });
24013    loaderTl.to($pageLoader.find('.item-loadbar-inner'), {
24014      duration: 0.4,
24015      scaleX: 1,
24016      ease: 'none'
24017    }, 'start').to($pageLoader.find('.item-content'), {
24018      duration: 0.8,
24019      autoAlpha: 0,
24020      ease: 'power1.out'
24021    }, 'start').call(function () {
24022      app.dispachEvent($body, 'loaderEnd');
24023    }).to($pageLoader, {
24024      duration: 0.8,
24025      autoAlpha: 0,
24026      ease: 'power1.out'
24027    });
24028    $(window).on('load', function () {
24029      return loaderTl.play();
24030    });
24031    var menu = new Menu($menuWrapper, $menuButton, {
24032      reverseTimeScale: 2
24033    });
24034    menu.menuTimeline.to($menuBars.eq(1), {
24035      duration: 0.3,
24036      autoAlpha: 0
24037    }, 'start').to($menuBars.eq(0), {
24038      duration: 0.5,
24039      x: 0,
24040      y: 8,
24041      rotation: 45,
24042      ease: 'power1.out'
24043    }, 'start').to($menuBars.eq(2), {
24044      duration: 0.5,
24045      x: 0,
24046      y: -8,
24047      rotation: -45,
24048      ease: 'power1.out'
24049    }, 'start').to($menuWrapper, {
24050      duration: 0.5,
24051      autoAlpha: 1,
24052      ease: 'power1.out'
24053    }, 'start+=0.3').staggerFrom($menuStaggerItems, 0.6, {
24054      autoAlpha: 0,
24055      x: 20,
24056      ease: 'power1.out'
24057    }, 0.1, 'start+=0.3');
24058    menu.init();
24059    var kira = new Kira(ScrollMagic, {
24060      debug: false,
24061      loadEvent: {
24062        domElement: $body,
24063        eventName: 'loaderEnd'
24064      },
24065      optimize: true,
24066      options: {
24067        start: '-=0.6',
24068        triggerHook: 'onEnter'
24069      }
24070    });
24071    kira.add('fadeInUp', function ($item, timeline, start) {
24072      timeline.fromTo($item, {
24073        y: 50
24074      }, {
24075        y: 0,
24076        autoAlpha: 1,
24077        duration: 1.3,
24078        ease: 'power1.out'
24079      }, start);
24080    });
24081    kira.add('fadeInUp.parallax', function ($item, timeline, start) {
24082      timeline.fromTo($item, {
24083        y: 100
24084      }, {
24085        y: 0,
24086        autoAlpha: 1,
24087        duration: 0.8,
24088        ease: 'sine.out'
24089      }, start);
24090    });
24091    kira.add('splitline', function ($item, timeline, start) {
24092      $item.find('.item-line').each(function () {
24093        timeline.from($(this).children(), {
24094          y: '101%',
24095          duration: 1.35,
24096          ease: 'power1.out'
24097        }, start);
24098      });
24099    });
24100    kira.add('splittext.long', function ($item, timeline, start) {
24101      timeline.staggerFrom($item[0].split.chars, 0.8, {
24102        y: 5,
24103        opacity: 0,
24104        ease: 'sine.out'
24105      }, $item.data('delay') || 0.01, start);
24106    });
24107    kira.add('fadeInLeft.stagger.sm', function ($item, timeline, start) {
24108      timeline.staggerFromTo($item.find('[data-stagger-item]'), 0.6, {
24109        x: 20
24110      }, {
24111        autoAlpha: 1,
24112        x: 0,
24113        ease: 'power1.out'
24114      }, 0.1, start);
24115    });
24116    kira.add('fadeInUp.stagger.sm', function ($item, timeline, start) {
24117      timeline.staggerFromTo($item.find('[data-stagger-item]'), 0.6, {
24118        y: 20
24119      }, {
24120        autoAlpha: 1,
24121        y: 0,
24122        ease: 'power1.out'
24123      }, 0.1, start);
24124    });
24125    kira.add('scaleX', function ($item, timeline, start) {
24126      timeline.from($item, {
24127        scaleX: 0,
24128        transformOrigin: 'left top',
24129        duration: 1,
24130        ease: 'expo.inOut'
24131      }, start);
24132    });
24133    kira.init();
24134  }
24135});
24136/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
24137
24138/***/ }),
24139
24140/***/ "./src/js/pages/contact.js":
24141/*!*********************************!*\
24142  !*** ./src/js/pages/contact.js ***!
24143  \*********************************/
24144/*! exports provided: default */
24145/***/ (function(module, __webpack_exports__, __webpack_require__) {
24146
24147"use strict";
24148__webpack_require__.r(__webpack_exports__);
24149/* WEBPACK VAR INJECTION */(function($) {/*** IMPORTS FROM imports-loader ***/
24150var define = false;
24151/* harmony default export */ __webpack_exports__["default"] = ({
24152  init: function init(app, MaterializeForm, customGoogleMap) {
24153    /*
24154    |
24155    | Constants
24156    |------------
24157    */
24158    var $map = $('#map'),
24159      $contactForm = $('.contact-form');
24160
24161    /*
24162    |
24163    | initGoogleMap
24164    |----------------
24165    |
24166    */
24167    $.each($map, function () {
24168      var $map = $(this);
24169      var map = new customGoogleMap($map, {
24170        'markers': $map.find('.marker'),
24171        'zoom': 16
24172      });
24173    });
24174
24175    /*
24176    |
24177    | Materialize form
24178    |-------------------
24179    |
24180    */
24181    new MaterializeForm($contactForm, {
24182      selectors: {
24183        group: '.gfield',
24184        label: '.gfield_label',
24185        input: '.ginput_container_text input, .ginput_container_email input'
24186      },
24187      labelEffect: {
24188        duration: 0.3,
24189        ease: Power2.easeOut
24190      }
24191    });
24192  }
24193});
24194/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
24195
24196/***/ }),
24197
24198/***/ "./src/js/pages/main.js":
24199/*!******************************!*\
24200  !*** ./src/js/pages/main.js ***!
24201  \******************************/
24202/*! exports provided: default */
24203/***/ (function(module, __webpack_exports__, __webpack_require__) {
24204
24205"use strict";
24206__webpack_require__.r(__webpack_exports__);
24207/* WEBPACK VAR INJECTION */(function($, jQuery) {/*** IMPORTS FROM imports-loader ***/
24208var define = false;
24209/* harmony default export */ __webpack_exports__["default"] = ({
24210  init: function init(app, CookieManager, Swiper) {
24211    /*
24212    |
24213    | Constants
24214    |-----------
24215    */
24216    var $body = $('body'),
24217      $cookieBanner = $('.cookie-banner'),
24218      $cookieClose = $cookieBanner.find('.item-close'),
24219      $cookieAccept = $cookieBanner.find('.item-accept'),
24220      $cookieRefuse = $cookieBanner.find('.item-refuse');
24221
24222    /*
24223    |
24224    | Cookie Manager
24225    |-----------------
24226    */
24227    new CookieManager($cookieBanner, {
24228      name: 'adveris_cookie_use',
24229      duration: 30,
24230      buttons: {
24231        accept: $cookieAccept,
24232        refuse: $cookieRefuse,
24233        close: $cookieClose
24234      },
24235      onAccept: function onAccept() {
24236        console.log('accpeted');
24237      },
24238      onRefuse: function onRefuse() {
24239        console.log('refused');
24240      }
24241    });
24242
24243    /*
24244    |
24245    | Slider flex
24246    |-----------------
24247    */
24248    var swipergallery = new Swiper('.swiper-gallery', {
24249      loop: true,
24250      autoplay: {
24251        delay: 5000
24252      },
24253      speed: 1000,
24254      slidesPerView: 1,
24255      loopedSlides: 50,
24256      navigation: {
24257        nextEl: ".swiper-button-next",
24258        prevEl: ".swiper-button-prev"
24259      }
24260    });
24261
24262    /*
24263    |
24264    | Slider logo
24265    |-----------------
24266    */
24267    var swiperslider = new Swiper('.swiper-logo', {
24268      navigation: {
24269        nextEl: ".swiper-button-next",
24270        prevEl: ".swiper-button-prev"
24271      },
24272      loop: true,
24273      speed: 1000,
24274      slidesPerView: 1,
24275      breakpoints: {
24276        480: {
24277          slidesPerView: 1,
24278          spaceBetween: 30
24279        },
24280        768: {
24281          slidesPerView: 2,
24282          spaceBetween: 30
24283        },
24284        992: {
24285          slidesPerView: 3,
24286          spaceBetween: 40
24287        },
24288        1200: {
24289          slidesPerView: 4,
24290          spaceBetween: 40
24291        }
24292      }
24293    });
24294
24295    /*
24296    |
24297    | Slider flex
24298    |-----------------
24299    */
24300    // var swipercontainer = new Swiper('#swiper-container', {
24301    //     loop: true,
24302    //     autoplay: {
24303    //         delay: 5000,
24304    //     },
24305    //     speed: 1000,
24306    //     slidesPerView: 1,
24307    //     spaceBetween: 15,
24308    //     loopedSlides: 50,
24309    //     navigation: {
24310    //         nextEl: ".swiper-button-next",
24311    //         prevEl: ".swiper-button-prev"
24312    //     }
24313    // });
24314
24315    /*
24316    |
24317    | Slider actus
24318    |-----------------
24319    */
24320    var swiperactus = new Swiper('.swiper-actus', {
24321      loop: true,
24322      autoplay: {
24323        delay: 5000
24324      },
24325      speed: 1000,
24326      slidesPerView: 1,
24327      spaceBetween: 15,
24328      loopedSlides: 50,
24329      navigation: {
24330        nextEl: ".swiper-button-next",
24331        prevEl: ".swiper-button-prev"
24332      }
24333    });
24334
24335    /*
24336    |
24337    | Slider home
24338    |-----------------
24339    */
24340    var swiperhome = new Swiper('.swiper-home', {
24341      autoHeight: true,
24342      //enable auto height
24343      loop: true,
24344      slidesPerView: 1,
24345      loopedSlides: 50,
24346      navigation: {
24347        nextEl: ".swiper-button-next",
24348        prevEl: ".swiper-button-prev"
24349      }
24350    });
24351
24352    /*
24353    |
24354    | Slider chrono
24355    |-----------------
24356    */
24357    var chronoThumbs = new Swiper('.chrono-thumbs', {
24358      spaceBetween: 10,
24359      centeredSlides: true,
24360      touchRatio: 0.2,
24361      slideToClickedSlide: true,
24362      slidesPerView: 5,
24363      speed: 1000,
24364      navigation: {
24365        nextEl: '.swiper-chrono-prev',
24366        prevEl: '.swiper-chrono-next'
24367      },
24368      breakpoints: {
24369        0: {
24370          slidesPerView: 1
24371        },
24372        480: {
24373          slidesPerView: 1
24374        },
24375        768: {
24376          slidesPerView: 3
24377        },
24378        992: {
24379          slidesPerView: 3
24380        },
24381        1200: {
24382          slidesPerView: 5
24383        }
24384      }
24385    });
24386    var chronoContent = new Swiper('.chrono-content', {
24387      autoHeight: true //enable auto height
24388    });
24389    var chronoGalerie = new Swiper('.chrono-galerie', {
24390      autoHeight: true,
24391      //enable auto height
24392      loop: true,
24393      speed: 1000,
24394      slidesPerView: 1,
24395      loopedSlides: 50,
24396      navigation: {
24397        nextEl: ".swiper-button-next",
24398        prevEl: ".swiper-button-prev"
24399      }
24400    });
24401    if (document.getElementsByClassName('chrono-thumbs').length) {
24402      chronoContent.controller.control = chronoThumbs;
24403      chronoThumbs.controller.control = chronoContent;
24404    }
24405
24406    /*
24407    |
24408    | Menu home
24409    |-----------------
24410    */
24411    jQuery('.menu-sites a').on("mouseover", function () {
24412      var bgimg = jQuery(this).data("image");
24413      jQuery(this).parent().css("background-image", 'url(' + bgimg + ')');
24414    });
24415
24416    /*
24417    |
24418    | Menu scroll
24419    |-----------------
24420    */
24421    var lastScrollTop = 0;
24422    $(window).scroll(function () {
24423      var st = $(this).scrollTop();
24424      var banner = $('#header');
24425      if ($(this).scrollTop() > 5) {
24426        banner.addClass('active');
24427      } else {
24428        banner.removeClass('active');
24429      }
24430    });
24431
24432    /*
24433    |
24434    | top-banner
24435    |-----------------
24436    */
24437    var banner = document.querySelector('.top-banner');
24438    var closeBtn = banner === null || banner === void 0 ? void 0 : banner.querySelector('.close');
24439    var menu = document.querySelector('.sticky-menu');
24440    if (banner && closeBtn) {
24441      if (document.cookie.includes('bannerClosed=true')) {
24442        banner.classList.add('closed');
24443        menu.style.marginTop = '0';
24444      }
24445      closeBtn.addEventListener('click', function () {
24446        banner.classList.add('closed');
24447        menu.style.marginTop = '0';
24448        var d = new Date();
24449        d.setTime(d.getTime() + 7 * 24 * 60 * 60 * 1000);
24450        document.cookie = 'bannerClosed=true; expires=' + d.toUTCString() + '; path=/';
24451      });
24452    }
24453
24454    // $body.on('loaderEnd', () => console.log('ended'))
24455  }
24456});
24457/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
24458
24459/***/ }),
24460
24461/***/ "./src/js/pages/news.js":
24462/*!******************************!*\
24463  !*** ./src/js/pages/news.js ***!
24464  \******************************/
24465/*! exports provided: default */
24466/***/ (function(module, __webpack_exports__, __webpack_require__) {
24467
24468"use strict";
24469__webpack_require__.r(__webpack_exports__);
24470/* WEBPACK VAR INJECTION */(function($) {/*** IMPORTS FROM imports-loader ***/
24471var define = false;
24472/* harmony default export */ __webpack_exports__["default"] = ({
24473  init: function init(app) {
24474    /*
24475    |
24476    | Constants
24477    |------------
24478    */
24479    var $loadMoreBtn = $('.load-more-btn'),
24480      $postsContainer = $('.loaded-posts'),
24481      $loadMoreContainer = $('.load-more-container'),
24482      $loadMore = $('.load-more'),
24483      $loaderContainer = $('.loader-container');
24484    var xhr = null;
24485
24486    /*
24487    |
24488    | Load more ajax
24489    |--------------
24490    */
24491    $loadMoreBtn.on('click', function (e) {
24492      e.preventDefault();
24493      abort(xhr);
24494      var offset = $postsContainer.find('.custom-card').length;
24495      var url = "/ajax/posts/".concat(offset, "/");
24496      xhr = $.ajax({
24497        url: url,
24498        type: 'GET',
24499        method: 'GET',
24500        dataType: 'json',
24501        beforeSend: function beforeSend() {
24502          TweenMax.to($loadMore, 0.5, {
24503            autoAlpha: 0,
24504            y: 30,
24505            display: "none",
24506            ease: Power1.easeOut,
24507            onComplete: function onComplete() {
24508              TweenMax.fromTo($loaderContainer, 0.5, {
24509                autoAlpha: 0,
24510                y: 30,
24511                display: "none"
24512              }, {
24513                autoAlpha: 1,
24514                y: 0,
24515                display: "block",
24516                ease: Power1.easeOut
24517              });
24518            }
24519          });
24520        },
24521        success: function success(response, status) {
24522          $postsContainer.append(response);
24523          TweenMax.to($loaderContainer, 0.5, {
24524            autoAlpha: 0,
24525            y: 50,
24526            display: "none",
24527            ease: Power1.easeOut
24528          });
24529          if ($(response).find('.no-more-post').length) {
24530            $loadMoreContainer.remove();
24531          } else {
24532            TweenMax.to($loadMore, 0.5, {
24533              autoAlpha: 1,
24534              y: 0,
24535              display: "block",
24536              ease: Power1.easeOut
24537            });
24538          }
24539          xhr = null;
24540        },
24541        error: function error(response, status, _error) {
24542          console.log(_error);
24543        }
24544      });
24545    });
24546
24547    /*
24548    | HELPER
24549    |
24550    | abort ajax request
24551    |------------
24552    */
24553    function abort(xhrVar) {
24554      var $list = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
24555      if (xhrVar !== null) {
24556        xhrVar.abort();
24557      }
24558      if ($list !== null) {
24559        $list.find('.loading--ajax').hide();
24560      }
24561    }
24562  }
24563});
24564/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
24565
24566/***/ }),
24567
24568/***/ "./src/js/pages/sample.js":
24569/*!********************************!*\
24570  !*** ./src/js/pages/sample.js ***!
24571  \********************************/
24572/*! exports provided: default */
24573/***/ (function(module, __webpack_exports__, __webpack_require__) {
24574
24575"use strict";
24576__webpack_require__.r(__webpack_exports__);
24577/* WEBPACK VAR INJECTION */(function($) {/*** IMPORTS FROM imports-loader ***/
24578var define = false;
24579/* harmony default export */ __webpack_exports__["default"] = ({
24580  init: function init(app) {
24581    app.dump('sample.js');
24582
24583    /*
24584    |
24585    | Constants
24586    |-----------
24587    */
24588    var $loadedPostsContainer = $('.loaded-posts');
24589
24590    /*
24591    |
24592    | Ajax Sample
24593    |--------------
24594    */
24595    $('[data-ajax-url]').on('click', function (e) {
24596      e.preventDefault();
24597      $.ajax({
24598        url: $(this).data('ajax-url'),
24599        type: 'GET',
24600        dataType: 'json',
24601        success: function success(response, status) {
24602          $loadedPostsContainer.append(response);
24603        },
24604        error: function error(response, status, _error) {
24605          console.log(response, status, _error);
24606        }
24607      });
24608    });
24609  }
24610});
24611/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
24612
24613/***/ }),
24614
24615/***/ "./src/js/utils/router.js":
24616/*!********************************!*\
24617  !*** ./src/js/utils/router.js ***!
24618  \********************************/
24619/*! exports provided: default */
24620/***/ (function(module, __webpack_exports__, __webpack_require__) {
24621
24622"use strict";
24623__webpack_require__.r(__webpack_exports__);
24624function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
24625function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
24626function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
24627function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
24628function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
24629function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
24630/*** IMPORTS FROM imports-loader ***/
24631var define = false;
24632var Router = /*#__PURE__*/function () {
24633  function Router(routes) {
24634    _classCallCheck(this, Router);
24635    this.routes = routes;
24636  }
24637  return _createClass(Router, [{
24638    key: "load",
24639    value: function load() {
24640      var _this = this;
24641      var routes = this.routes;
24642      routes.map(function (route) {
24643        var resolve = route.resolve;
24644        if (typeof route.resolve !== 'undefined') {
24645          document.querySelectorAll(resolve).length && _this.runInitialization(route);
24646        } else {
24647          _this.runInitialization(route);
24648        }
24649      });
24650    }
24651  }, {
24652    key: "runInitialization",
24653    value: function runInitialization(route) {
24654      route.file.init.apply(null, route.dependencies);
24655    }
24656  }]);
24657}();
24658/* harmony default export */ __webpack_exports__["default"] = (Router);
24659
24660/***/ }),
24661
24662/***/ "./src/lib/gsap-pro/SplitText.js":
24663/*!***************************************!*\
24664  !*** ./src/lib/gsap-pro/SplitText.js ***!
24665  \***************************************/
24666/*! no static exports found */
24667/***/ (function(module, exports, __webpack_require__) {
24668
24669/* WEBPACK VAR INJECTION */(function(global) {/*** IMPORTS FROM imports-loader ***/
24670var define = false;
24671
24672/*!
24673 * VERSION: 0.5.8
24674 * DATE: 2017-08-22
24675 * UPDATES AND DOCS AT: http://greensock.com
24676 *
24677 * @license Copyright (c) 2008-2017, GreenSock. All rights reserved.
24678 * SplitText is a Club GreenSock membership benefit; You must have a valid membership to use
24679 * this code without violating the terms of use. Visit http://greensock.com/club/ to sign up or get more details.
24680 * This work is subject to the software agreement that was issued with your membership.
24681 * 
24682 * @author: Jack Doyle, [email protected]
24683 */
24684var _gsScope =  true && module.exports && typeof global !== "undefined" ? global : this || window; //helps ensure compatibility with AMD/RequireJS and CommonJS/Node
24685(function (window) {
24686  "use strict";
24687
24688  var _globals = window.GreenSockGlobals || window,
24689    _namespace = function _namespace(ns) {
24690      var a = ns.split("."),
24691        p = _globals,
24692        i;
24693      for (i = 0; i < a.length; i++) {
24694        p[a[i]] = p = p[a[i]] || {};
24695      }
24696      return p;
24697    },
24698    pkg = _namespace("com.greensock.utils"),
24699    _getText2 = function _getText(e) {
24700      var type = e.nodeType,
24701        result = "";
24702      if (type === 1 || type === 9 || type === 11) {
24703        if (typeof e.textContent === "string") {
24704          return e.textContent;
24705        } else {
24706          for (e = e.firstChild; e; e = e.nextSibling) {
24707            result += _getText2(e);
24708          }
24709        }
24710      } else if (type === 3 || type === 4) {
24711        return e.nodeValue;
24712      }
24713      return result;
24714    },
24715    _doc = document,
24716    _getComputedStyle = _doc.defaultView ? _doc.defaultView.getComputedStyle : function () {},
24717    _capsExp = /([A-Z])/g,
24718    _getStyle = function _getStyle(t, p, cs, str) {
24719      var result;
24720      if (cs = cs || _getComputedStyle(t, null)) {
24721        t = cs.getPropertyValue(p.replace(_capsExp, "-$1").toLowerCase());
24722        result = t || cs.length ? t : cs[p]; //Opera behaves VERY strangely - length is usually 0 and cs[p] is the only way to get accurate results EXCEPT when checking for -o-transform which only works with cs.getPropertyValue()!
24723      } else if (t.currentStyle) {
24724        cs = t.currentStyle;
24725        result = cs[p];
24726      }
24727      return str ? result : parseInt(result, 10) || 0;
24728    },
24729    _isArrayLike = function _isArrayLike(e) {
24730      return e.length && e[0] && (e[0].nodeType && e[0].style && !e.nodeType || e[0].length && e[0][0]) ? true : false; //could be an array of jQuery objects too, so accommodate that.
24731    },
24732    _flattenArray = function _flattenArray(a) {
24733      var result = [],
24734        l = a.length,
24735        i,
24736        e,
24737        j;
24738      for (i = 0; i < l; i++) {
24739        e = a[i];
24740        if (_isArrayLike(e)) {
24741          j = e.length;
24742          for (j = 0; j < e.length; j++) {
24743            result.push(e[j]);
24744          }
24745        } else {
24746          result.push(e);
24747        }
24748      }
24749      return result;
24750    },
24751    _stripExp = /(?:\r|\n|\t\t)/g,
24752    //find carriage returns, new line feeds and double-tabs.
24753    _multipleSpacesExp = /(?:\s\s+)/g,
24754    _emojiStart = 0xD800,
24755    _emojiEnd = 0xDBFF,
24756    _emojiLowStart = 0xDC00,
24757    _emojiRegionStart = 0x1F1E6,
24758    _emojiRegionEnd = 0x1F1FF,
24759    _emojiModStart = 0x1f3fb,
24760    _emojiModEnd = 0x1f3ff,
24761    _emojiPairCode = function _emojiPairCode(s) {
24762      return (s.charCodeAt(0) - _emojiStart << 10) + (s.charCodeAt(1) - _emojiLowStart) + 0x10000;
24763    },
24764    _isOldIE = _doc.all && !_doc.addEventListener,
24765    _divStart = " style='position:relative;display:inline-block;" + (_isOldIE ? "*display:inline;*zoom:1;'" : "'"),
24766    //note: we must use both display:inline-block and *display:inline for IE8 and earlier, otherwise it won't flow correctly (and if we only use display:inline, IE won't render most of the property tweens - very odd).
24767    _cssClassFunc = function _cssClassFunc(cssClass, tag) {
24768      cssClass = cssClass || "";
24769      var iterate = cssClass.indexOf("++") !== -1,
24770        num = 1;
24771      if (iterate) {
24772        cssClass = cssClass.split("++").join("");
24773      }
24774      return function () {
24775        return "<" + tag + _divStart + (cssClass ? " class='" + cssClass + (iterate ? num++ : "") + "'>" : ">");
24776      };
24777    },
24778    SplitText = pkg.SplitText = _globals.SplitText = function (element, vars) {
24779      if (typeof element === "string") {
24780        element = SplitText.selector(element);
24781      }
24782      if (!element) {
24783        throw "cannot split a null element.";
24784      }
24785      this.elements = _isArrayLike(element) ? _flattenArray(element) : [element];
24786      this.chars = [];
24787      this.words = [];
24788      this.lines = [];
24789      this._originals = [];
24790      this.vars = vars || {};
24791      this.split(vars);
24792    },
24793    _swapText2 = function _swapText(element, oldText, newText) {
24794      var type = element.nodeType;
24795      if (type === 1 || type === 9 || type === 11) {
24796        for (element = element.firstChild; element; element = element.nextSibling) {
24797          _swapText2(element, oldText, newText);
24798        }
24799      } else if (type === 3 || type === 4) {
24800        element.nodeValue = element.nodeValue.split(oldText).join(newText);
24801      }
24802    },
24803    _pushReversed = function _pushReversed(a, merge) {
24804      var i = merge.length;
24805      while (--i > -1) {
24806        a.push(merge[i]);
24807      }
24808    },
24809    _slice = function _slice(a) {
24810      //don't use Array.prototype.slice.call(target, 0) because that doesn't work in IE8 with a NodeList that's returned by querySelectorAll()
24811      var b = [],
24812        l = a.length,
24813        i;
24814      for (i = 0; i !== l; b.push(a[i++])) {}
24815      return b;
24816    },
24817    _isBeforeWordDelimiter = function _isBeforeWordDelimiter(e, root, wordDelimiter) {
24818      var next;
24819      while (e && e !== root) {
24820        next = e._next || e.nextSibling;
24821        if (next) {
24822          return next.textContent.charAt(0) === wordDelimiter;
24823        }
24824        e = e.parentNode || e._parent;
24825      }
24826      return false;
24827    },
24828    _deWordify2 = function _deWordify(e) {
24829      var children = _slice(e.childNodes),
24830        l = children.length,
24831        i,
24832        child;
24833      for (i = 0; i < l; i++) {
24834        child = children[i];
24835        if (child._isSplit) {
24836          _deWordify2(child);
24837        } else {
24838          if (i && child.previousSibling.nodeType === 3) {
24839            child.previousSibling.nodeValue += child.nodeType === 3 ? child.nodeValue : child.firstChild.nodeValue;
24840          } else if (child.nodeType !== 3) {
24841            e.insertBefore(child.firstChild, child);
24842          }
24843          e.removeChild(child);
24844        }
24845      }
24846    },
24847    _setPositionsAfterSplit = function _setPositionsAfterSplit(element, vars, allChars, allWords, allLines, origWidth, origHeight) {
24848      var cs = _getComputedStyle(element),
24849        paddingLeft = _getStyle(element, "paddingLeft", cs),
24850        lineOffsetY = -999,
24851        borderTopAndBottom = _getStyle(element, "borderBottomWidth", cs) + _getStyle(element, "borderTopWidth", cs),
24852        borderLeftAndRight = _getStyle(element, "borderLeftWidth", cs) + _getStyle(element, "borderRightWidth", cs),
24853        padTopAndBottom = _getStyle(element, "paddingTop", cs) + _getStyle(element, "paddingBottom", cs),
24854        padLeftAndRight = _getStyle(element, "paddingLeft", cs) + _getStyle(element, "paddingRight", cs),
24855        lineThreshold = _getStyle(element, "fontSize") * 0.2,
24856        textAlign = _getStyle(element, "textAlign", cs, true),
24857        charArray = [],
24858        wordArray = [],
24859        lineArray = [],
24860        wordDelimiter = vars.wordDelimiter || " ",
24861        tag = vars.span ? "span" : "div",
24862        types = vars.type || vars.split || "chars,words,lines",
24863        lines = allLines && types.indexOf("lines") !== -1 ? [] : null,
24864        words = types.indexOf("words") !== -1,
24865        chars = types.indexOf("chars") !== -1,
24866        absolute = vars.position === "absolute" || vars.absolute === true,
24867        linesClass = vars.linesClass,
24868        iterateLine = (linesClass || "").indexOf("++") !== -1,
24869        spaceNodesToRemove = [],
24870        i,
24871        j,
24872        l,
24873        node,
24874        nodes,
24875        isChild,
24876        curLine,
24877        addWordSpaces,
24878        style,
24879        lineNode,
24880        lineWidth,
24881        offset;
24882      if (lines && element.children.length === 1 && element.children[0]._isSplit) {
24883        //lines are always split on the main element (not inside nested elements), so if there's only one child, bust apart lines inside that rather than forcing it all into one big line. Like <div><div>lots of stuff</div></div> - if they split the outer one, it'd all be in one line.
24884        element = element.children[0];
24885      }
24886      if (iterateLine) {
24887        linesClass = linesClass.split("++").join("");
24888      }
24889
24890      //copy all the descendant nodes into an array (we can't use a regular nodeList because it's live and we may need to renest things)
24891      j = element.getElementsByTagName("*");
24892      l = j.length;
24893      nodes = [];
24894      for (i = 0; i < l; i++) {
24895        nodes[i] = j[i];
24896      }
24897
24898      //for absolute positioning, we need to record the x/y offsets and width/height for every <div>. And even if we're not positioning things absolutely, in order to accommodate lines, we must figure out where the y offset changes so that we can sense where the lines break, and we populate the lines array.
24899      if (lines || absolute) {
24900        for (i = 0; i < l; i++) {
24901          node = nodes[i];
24902          isChild = node.parentNode === element;
24903          if (isChild || absolute || chars && !words) {
24904            offset = node.offsetTop;
24905            if (lines && isChild && Math.abs(offset - lineOffsetY) > lineThreshold && (node.nodeName !== "BR" || i === 0)) {
24906              //we found some rare occasions where a certain character like &#8209; could cause the offsetTop to be off by 1 pixel, so we build in a threshold.
24907              curLine = [];
24908              lines.push(curLine);
24909              lineOffsetY = offset;
24910            }
24911            if (absolute) {
24912              //record offset x and y, as well as width and height so that we can access them later for positioning. Grabbing them at once ensures we don't trigger a browser paint & we maximize performance.
24913              node._x = node.offsetLeft;
24914              node._y = offset;
24915              node._w = node.offsetWidth;
24916              node._h = node.offsetHeight;
24917            }
24918            if (lines) {
24919              if (node._isSplit && isChild || !chars && isChild || words && isChild || !words && node.parentNode.parentNode === element && !node.parentNode._isSplit) {
24920                curLine.push(node);
24921                node._x -= paddingLeft;
24922                if (_isBeforeWordDelimiter(node, element, wordDelimiter)) {
24923                  node._wordEnd = true;
24924                }
24925              }
24926              if (node.nodeName === "BR" && (node.nextSibling && node.nextSibling.nodeName === "BR" || i === 0)) {
24927                //two consecutive <br> tags signify a new [empty] line. Also, if the entire block of content STARTS with a <br>, add a line.
24928                lines.push([]);
24929              }
24930            }
24931          }
24932        }
24933      }
24934      for (i = 0; i < l; i++) {
24935        node = nodes[i];
24936        isChild = node.parentNode === element;
24937        if (node.nodeName === "BR") {
24938          if (lines || absolute) {
24939            if (node.parentNode) {
24940              node.parentNode.removeChild(node);
24941            }
24942            nodes.splice(i--, 1);
24943            l--;
24944          } else if (!words) {
24945            element.appendChild(node);
24946          }
24947          continue;
24948        }
24949        if (absolute) {
24950          style = node.style;
24951          if (!words && !isChild) {
24952            node._x += node.parentNode._x;
24953            node._y += node.parentNode._y;
24954          }
24955          style.left = node._x + "px";
24956          style.top = node._y + "px";
24957          style.position = "absolute";
24958          style.display = "block";
24959          //if we don't set the width/height, things collapse in older versions of IE and the origin for transforms is thrown off in all browsers.
24960          style.width = node._w + 1 + "px"; //IE is 1px short sometimes. Avoid wrapping
24961          style.height = node._h + "px";
24962        }
24963        if (!words && chars) {
24964          //we always start out wrapping words in their own <div> so that line breaks happen correctly, but here we'll remove those <
24964div> tags if necessary and renest the characters directly into the element rather than inside the word <div>
24965          if (node._isSplit) {
24966            node._next = node.nextSibling;
24967            node.parentNode.appendChild(node); //put it at the end to keep the order correct.
24968          } else if (node.parentNode._isSplit) {
24969            node._parent = node.parentNode;
24970            if (!node.previousSibling && node.firstChild) {
24971              node.firstChild._isFirst = true;
24972            }
24973            if (node.nextSibling && node.nextSibling.textContent === " " && !node.nextSibling.nextSibling) {
24974              //if the last node inside a nested element is just a space (like T<span>nested </span>), remove it otherwise it'll get placed in the wrong order. Don't remove it right away, though, because we need to sense when words/characters are before a space like _isBeforeWordDelimiter(). Removing it now would make that a false negative.
24975              spaceNodesToRemove.push(node.nextSibling);
24976            }
24977            node._next = node.nextSibling && node.nextSibling._isFirst ? null : node.nextSibling;
24978            node.parentNode.removeChild(node);
24979            nodes.splice(i--, 1);
24980            l--;
24981          } else if (!isChild) {
24982            offset = !node.nextSibling && _isBeforeWordDelimiter(node.parentNode, element, wordDelimiter); //if this is the last letter in the word (and we're not breaking by lines and not positioning things absolutely), we need to add a space afterwards so that the characters don't just mash together
24983            if (node.parentNode._parent) {
24984              node.parentNode._parent.appendChild(node);
24985            }
24986            if (offset) {
24987              node.parentNode.appendChild(_doc.createTextNode(" "));
24988            }
24989            if (vars.span) {
24990              node.style.display = "inline"; //so that word breaks are honored properly.
24991            }
24992            charArray.push(node);
24993          }
24994        } else if (node.parentNode._isSplit && !node._isSplit && node.innerHTML !== "") {
24995          wordArray.push(node);
24996        } else if (chars && !node._isSplit) {
24997          if (vars.span) {
24998            node.style.display = "inline";
24999          }
25000          charArray.push(node);
25001        }
25002      }
25003      i = spaceNodesToRemove.length;
25004      while (--i > -1) {
25005        spaceNodesToRemove[i].parentNode.removeChild(spaceNodesToRemove[i]);
25006      }
25007      if (lines) {
25008        //the next 7 lines just give us the line width in the most reliable way and figure out the left offset (if position isn't relative or absolute). We must set the width along with text-align to ensure everything works properly for various alignments.
25009        if (absolute) {
25010          lineNode = _doc.createElement(tag);
25011          element.appendChild(lineNode);
25012          lineWidth = lineNode.offsetWidth + "px";
25013          offset = lineNode.offsetParent === element ? 0 : element.offsetLeft;
25014          element.removeChild(lineNode);
25015        }
25016        style = element.style.cssText;
25017        element.style.cssText = "display:none;"; //to improve performance, set display:none on the element so that the browser doesn't have to worry about reflowing or rendering while we're renesting things. We'll revert the cssText later.
25018        //we can't use element.innerHTML = "" because that causes IE to literally delete all the nodes and their content even though we've stored them in an array! So we must loop through the children and remove them.
25019        while (element.firstChild) {
25020          element.removeChild(element.firstChild);
25021        }
25022        addWordSpaces = wordDelimiter === " " && (!absolute || !words && !c
25022hars);
25023        for (i = 0; i < lines.length; i++) {
25024          curLine = lines[i];
25025          lineNode = _doc.createElement(tag);
25026          lineNode.style.cssText = "display:block;text-align:" + textAlign + ";position:" + (absolute ? "absolute;" : "relative;");
25027          if (linesClass) {
25028            lineNode.className = linesClass + (iterateLine ? i + 1 : "");
25029          }
25030          lineArray.push(lineNode);
25031          l = curLine.length;
25032          for (j = 0; j < l; j++) {
25033            if (curLine[j].nodeName !== "BR") {
25034              node = curLine[j];
25035              lineNode.appendChild(node);
25036              if (addWordSpaces && node._wordEnd) {
25037                lineNode.appendChild(_doc.createTextNode(" "));
25038              }
25039              if (absolute) {
25040                if (j === 0) {
25041                  lineNode.style.top = node._y + "px";
25042                  lineNode.style.left = paddingLeft + offset + "px";
25043                }
25044                node.style.top = "0px";
25045                if (offset) {
25046                  node.style.left = node._x - offset + "px";
25047                }
25048              }
25049            }
25050          }
25051          if (l === 0) {
25052            //if there are no nodes in the line (typically meaning there were two consecutive <br> tags, just add a non-breaking space so that things display properly.
25053            lineNode.innerHTML = "&nbsp;";
25054          } else if (!words && !chars) {
25055            _deWordify2(lineNode);
25056            _swapText2(lineNode, String.fromCharCode(160), " ");
25057          }
25058          if (absolute) {
25059            lineNode.style.width = lineWidth;
25060            lineNode.style.height = node._h + "px";
25061          }
25062          element.appendChild(lineNode);
25063        }
25064        element.style.cssText = style;
25065      }
25066
25067      //if everything shifts to being position:absolute, the container can collapse in terms of height or width, so fix that here.
25068      if (absolute) {
25069        if (origHeight > element.clientHeight) {
25070          element.style.height = origHeight - padTopAndBottom + "px";
25071          if (element.clientHeight < origHeight) {
25072            //IE8 and earlier use a different box model - we must include padding and borders
25073            element.style.height = origHeight + borderTopAndBottom + "px";
25074          }
25075        }
25076        if (origWidth > element.clientWidth) {
25077          element.style.width = origWidth - padLeftAndRight + "px";
25078          if (element.clientWidth < origWidth) {
25079            //IE8 and earlier use a different box model - we must include padding and borders
25080            element.style.width = origWidth + borderLeftAndRight + "px";
25081          }
25082        }
25083      }
25084      _pushReversed(allChars, charArray);
25085      _pushReversed(allWords, wordArray);
25086      _pushReversed(allLines, lineArray);
25087    },
25088    _splitRawText = function _splitRawText(element, vars, wordStart, charStart) {
25089      var tag = vars.span ? "span" : "div",
25090        types = vars.type || vars.split || "chars,words,lines",
25091        //words = (types.indexOf("words") !== -1),
25092        chars = types.indexOf("chars") !== -1,
25093        absolute = vars.position === "absolute" || vars.absolute === true,
25094        wordDelimiter = vars.wordDelimiter || " ",
25095        space = wordDelimiter !== " " ? "" : absolute ? "&#173; " : " ",
25096        wordEnd = vars.span ? "</span>" : "</div>",
25097        wordIsOpen = true,
25098        text,
25099        splitText,
25100        i,
25101        j,
25102        l,
25103        character,
25104        hasTagStart,
25105        emojiPair1,
25106        emojiPair2,
25107        container = _doc.createElement("div"),
25108        parent = element.parentNode;
25109      parent.insertBefore(container, element);
25110      container.textContent = element.nodeValue;
25111      parent.removeChild(element);
25112      element = container;
25113      text = _getText2(element);
25114      hasTagStart = text.indexOf("<") !== -1;
25115      if (vars.reduceWhiteSpace !== false) {
25116        text = text.replace(_multipleSpacesExp, " ").replace(_stripExp, "");
25117      }
25118      if (hasTagStart) {
25119        text = text.split("<").join("{{LT}}"); //we can't leave "<" in the string, or when we set the innerHTML, it can be interpreted as a node
25120      }
25121      l = text.length;
25122      splitText = (text.charAt(0) === " " ? space : "") + wordStart();
25123      for (i = 0; i < l; i++) {
25124        character = text.charAt(i);
25125        if (character === wordDelimiter && text.charAt(i - 1) !== wordDelimiter && i) {
25126          splitText += wordIsOpen ? wordEnd : "";
25127          wordIsOpen = false;
25128          while (text.charAt(i + 1) === wordDelimiter) {
25129            //skip over empty spaces (to avoid making them words)
25130            splitText += space;
25131            i++;
25132          }
25133          if (i === l - 1) {
25134            splitText += space;
25135          } else if (text.charAt(i + 1) !== ")") {
25136            splitText += space + wordStart();
25137            wordIsOpen = true;
25138          }
25139        } else if (character === "{" && text.substr(i, 6) === "{{LT}}") {
25140          splitText += chars ? charStart() + "{{LT}}" + "</" + tag + ">" : "{{LT}}";
25141          i += 5;
25142        } else if (character.charCodeAt(0) >= _emojiStart && character.charCodeAt(0) <= _emojiEnd || text.charCodeAt(i + 1) >= 0xFE00 && text.charCodeAt(i + 1) <= 0xFE0F) {
25143          //special emoji characters use 2 or 4 unicode characters that we must keep together.
25144          emojiPair1 = _emojiPairCode(text.substr(i, 2));
25145          emojiPair2 = _emojiPairCode(text.substr(i + 2, 2));
25146          j = emojiPair1 >= _emojiRegionStart && emojiPair1 <= _emojiRegionEnd && emojiPair2 >= _emojiRegionStart && emojiPair2 <= _emojiRegionEnd || emojiPair2 >= _emojiModStart && emojiPair2 <= _emojiModEnd ? 4 : 2;
25147          splitText += chars && character !== " " ? charStart() + text.substr(i, j) + "</" + tag + ">" : text.substr(i, j);
25148          i += j - 1;
25149        } else {
25150          splitText += chars && character !== " " ? charStart() + character + "</" + tag + ">" : character;
25151        }
25152      }
25153      element.outerHTML = splitText + (wordIsOpen ? wordEnd : "");
25154      if (hasTagStart) {
25155        _swapText2(parent, "{{LT}}", "<"); //note: don't perform this on "element" because that gets replaced with all new elements when we set element.outerHTML.
25156      }
25157    },
25158    _split2 = function _split(element, vars, wordStart, charStart) {
25159      var children = _slice(element.childNodes),
25160        l = children.length,
25161        absolute = vars.position === "absolute" || vars.absolute === true,
25162        i,
25163        child;
25164      if (element.nodeType !== 3 || l > 1) {
25165        vars.absolute = false;
25166        for (i = 0; i < l; i++) {
25167          child = children[i];
25168          if (child.nodeType !== 3 || /\S+/.test(child.nodeValue)) {
25169            if (absolute && child.nodeType !== 3 && _getStyle(child, "display", null, true) === "inline") {
25170              //if there's a child node that's display:inline, switch it to inline-block so that absolute positioning works properly (most browsers don't report offsetTop/offsetLeft properly inside a <span> for example)
25171              child.style.display = "inline-block";
25172              child.style.position = "relative";
25173            }
25174            child._isSplit = true;
25175            _split2(child, vars, wordStart, charStart); //don't split lines on child elements
25176          }
25177        }
25178        vars.absolute = absolute;
25179        element._isSplit = true;
25180        return;
25181      }
25182      _splitRawText(element, vars, wordStart, charStart);
25183    },
25184    p = SplitText.prototype;
25185  p.split = function (vars) {
25186    if (this.isSplit) {
25187      this.revert();
25188    }
25189    this.vars = vars = vars || this.vars;
25190    this._originals.length = this.chars.length = this.words.length = this.lines.length = 0;
25191    var i = this.elements.length,
25192      tag = vars.span ? "span" : "div",
25193      wordStart = _cssClassFunc(vars.wordsClass, tag),
25194      charStart = _cssClassFunc(vars.charsClass, tag),
25195      origHeight,
25196      origWidth,
25197      e;
25198    //we split in reversed order so that if/when we position:absolute elements, they don't affect the position of the ones after them in the document flow (shifting them up as they're taken out of the document flow).
25199    while (--i > -1) {
25200      e = this.elements[i];
25201      this._originals[i] = e.innerHTML;
25202      origHeight = e.clientHeight;
25203      origWidth = e.clientWidth;
25204      _split2(e, vars, wordStart, charStart);
25205      _setPositionsAfterSplit(e, vars, this.chars, this.words, this.lines, origWidth, origHeight);
25206    }
25207    this.chars.reverse();
25208    this.words.reverse();
25209    this.lines.reverse();
25210    this.isSplit = true;
25211    return this;
25212  };
25213  p.revert = function () {
25214    if (!this._originals) {
25215      throw "revert() call wasn't scoped properly.";
25216    }
25217    var i = this._originals.length;
25218    while (--i > -1) {
25219      this.elements[i].innerHTML = this._originals[i];
25220    }
25221    this.chars = [];
25222    this.words = [];
25223    this.lines = [];
25224    this.isSplit = false;
25225    return this;
25226  };
25227  SplitText.selector = window.$ || window.jQuery || function (e) {
25228    var selector = window.$ || window.jQuery;
25229    if (selector) {
25230      SplitText.selector = selector;
25231      return selector(e);
25232    }
25233    return typeof document === "undefined" ? e : document.querySelectorAll ? document.querySelectorAll(e) : document.getElementById(e.charAt(0) === "#" ? e.substr(1) : e);
25234  };
25235  SplitText.version = "0.5.8";
25236})(_gsScope);
25237
25238//export to AMD/RequireJS and CommonJS/Node (precursor to full modular build system coming at a later date)
25239(function (name) {
25240  "use strict";
25241
25242  var getGlobal = function getGlobal() {
25243    return (_gsScope.GreenSockGlobals || _gsScope)[name];
25244  };
25245  if ( true && module.exports) {
25246    //node
25247    module.exports = getGlobal();
25248  } else if (typeof define === "function" && define.amd) {
25249    //AMD
25250    define([], getGlobal);
25251  }
25252})("SplitText");
25253/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
25254
25255/***/ }),
25256
25257/***/ "./src/lib/iziModal/css/iziModal.min.css":
25258/*!***********************************************!*\
25259  !*** ./src/lib/iziModal/css/iziModal.min.css ***!
25260  \***********************************************/
25261/*! no static exports found */
25262/***/ (function(module, exports, __webpack_require__) {
25263
25264// extracted by mini-css-extract-plugin
25265
25266/***/ }),
25267
25268/***/ "./src/lib/iziModal/js/iziModal.js":
25269/*!*****************************************!*\
25270  !*** ./src/lib/iziModal/js/iziModal.js ***!
25271  \*****************************************/
25272/*! no static exports found */
25273/***/ (function(module, exports, __webpack_require__) {
25274
25275/* WEBPACK VAR INJECTION */(function(module, jQuery) {function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
25276/*** IMPORTS FROM imports-loader ***/
25277var define = false;
25278
25279/*
25280* iziModal | v1.6.0
25281* http://izimodal.marcelodolce.com
25282* by Marcelo Dolce.
25283*/
25284(function (factory) {
25285  if (typeof define === 'function' && define.amd) {
25286    define(['jquery'], factory);
25287  } else if (( false ? undefined : _typeof(module)) === 'object' && module.exports) {
25288    module.exports = function (root, jQuery) {
25289      if (jQuery === undefined) {
25290        if (typeof window !== 'undefined') {
25291          jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
25292        } else {
25293          jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")(root);
25294        }
25295      }
25296      factory(jQuery);
25297      return jQuery;
25298    };
25299  } else {
25300    factory(jQuery);
25301  }
25302})(function ($) {
25303  var $window = $(window),
25304    $document = $(document),
25305    PLUGIN_NAME = 'iziModal',
25306    STATES = {
25307      CLOSING: 'closing',
25308      CLOSED: 'closed',
25309      OPENING: 'opening',
25310      OPENED: 'opened',
25311      DESTROYED: 'destroyed'
25312    };
25313  function whichAnimationEvent() {
25314    var t,
25315      el = document.createElement('fakeelement'),
25316      animations = {
25317        'animation': 'animationend',
25318        'OAnimation': 'oAnimationEnd',
25319        'MozAnimation': 'animationend',
25320        'WebkitAnimation': 'webkitAnimationEnd'
25321      };
25322    for (t in animations) {
25323      if (el.style[t] !== undefined) {
25324        return animations[t];
25325      }
25326    }
25327  }
25328  function isIE(version) {
25329    if (version === 9) {
25330      return navigator.appVersion.indexOf('MSIE 9.') !== -1;
25331    } else {
25332      userAgent = navigator.userAgent;
25333      return userAgent.indexOf('MSIE ') > -1 || userAgent.indexOf('Trident/') > -1;
25334    }
25335  }
25336  function clearValue(value) {
25337    var separators = /%|px|em|cm|vh|vw/;
25338    return parseInt(String(value).split(separators)[0]);
25339  }
25340  function changeHashWithoutScrolling(hash) {
25341    var id = hash.replace(/^.*#/, ''),
25342      $elem = $(hash);
25343    $elem.attr('id', id + '-tmp');
25344    window.location.hash = hash;
25345    $elem.attr('id', id);
25346  }
25347  var animationEvent = whichAnimationEvent(),
25348    isMobile = /Mobi/.test(navigator.userAgent) ? true : false;
25349  window.$iziModal = {};
25350  window.$iziModal.autoOpen = 0;
25351  window.$iziModal.history = false;
25352  var iziModal = function iziModal(element, options) {
25353    this.init(element, options);
25354  };
25355  iziModal.prototype = {
25356    constructor: iziModal,
25357    init: function init(element, options) {
25358      var that = this;
25359      this.$element = $(element);
25360      if (this.$element[0].id !== undefined && this.$element[0].id !== '') {
25361        this.id = this.$element[0].id;
25362      } else {
25363        this.id = PLUGIN_NAME + Math.floor(Math.random() * 10000000 + 1);
25364        this.$element.attr('id', this.id);
25365      }
25366      this.classes = this.$element.attr('class') !== undefined ? this.$element.attr('class') : '';
25367      this.content = this.$element.html();
25368      this.state = STATES.CLOSED;
25369      this.options = options;
25370      this.width = 0;
25371      this.timer = null;
25372      this.timerTimeout = null;
25373      this.progressBar = null;
25374      this.isPaused = false;
25375      this.isFullscreen = false;
25376      this.headerHeight = 0;
25377      this.modalHeight = 0;
25378      this.$overlay = $('<div class="' + PLUGIN_NAME + '-overlay" style="background-color:' + options.overlayColor + '"></div>');
25379      this.$navigate = $('<div class="' + PLUGIN_NAME + '-navigate"><div class="' + PLUGIN_NAME + '-navigate-caption">Use</div><button class="' + PLUGIN_NAME + '-navigate-prev"></button><button class="' + PLUGIN_NAME + '-navigate-next"></button></div>');
25380      this.group = {
25381        name: this.$element.attr('data-' + PLUGIN_NAME + '-group'),
25382        index: null,
25383        ids: []
25384      };
25385      this.$element.attr('aria-hidden', 'true');
25386      this.$element.attr('aria-labelledby', this.id);
25387      this.$element.attr('role', 'dialog');
25388      if (!this.$element.hasClass('iziModal')) {
25389        this.$element.addClass('iziModal');
25390      }
25391      if (this.group.name === undefined && options.group !== '') {
25392        this.group.name = options.group;
25393        this.$element.attr('data-' + PLUGIN_NAME + '-group', options.group);
25394      }
25395      if (this.options.loop === true) {
25396        this.$element.attr('data-' + PLUGIN_NAME + '-loop', true);
25397      }
25398      $.each(this.options, function (index, val) {
25399        var attr = that.$element.attr('data-' + PLUGIN_NAME + '-' + index);
25400        try {
25401          if (_typeof(attr) !== ( true ? "undefined" : undefined)) {
25402            if (attr === '' || attr == 'true') {
25403              options[index] = true;
25404            } else if (attr == 'false') {
25405              options[index] = false;
25406            } else if (typeof val == 'function') {
25407              options[index] = new Function(attr);
25408            } else {
25409              options[index] = attr;
25410            }
25411          }
25412        } catch (exc) {}
25413      });
25414      if (options.appendTo !== false) {
25415        this.$element.appendTo(options.appendTo);
25416      }
25417      if (options.iframe === true) {
25418        this.$element.html('<div class="' + PLUGIN_NAME + '-wrap"><div class="' + PLUGIN_NAME + '-content"><iframe class="' + PLUGIN_NAME + '-iframe"></iframe>' + this.content + "</div></div>");
25419        if (options.iframeHeight !== null) {
25420          this.$element.find('.' + PLUGIN_NAME + '-iframe').css('height', options.iframeHeight);
25421        }
25422      } else {
25423        this.$element.html('<div class="' + PLUGIN_NAME + '-wrap"><div class="' + PLUGIN_NAME + '-content">' + this.content + '</div></div>');
25424      }
25425      if (this.options.background !== null) {
25426        this.$element.css('background', this.options.background);
25427      }
25428      this.$wrap = this.$element.find('.' + PLUGIN_NAME + '-wrap');
25429      if (options.zindex !== null && !isNaN(parseInt(options.zindex))) {
25430        this.$element.css('z-index', options.zindex);
25431        this.$navigate.css('z-index', options.zindex - 1);
25432        this.$overlay.css('z-index', options.zindex - 2);
25433      }
25434      if (options.radius !== '') {
25435        this.$element.css('border-radius', options.radius);
25436      }
25437      if (options.padding !== '') {
25438        this.$element.find('.' + PLUGIN_NAME + '-content').css('padding', options.padding);
25439      }
25440      if (options.theme !== '') {
25441        if (options.theme === 'light') {
25442          this.$element.addClass(PLUGIN_NAME + '-light');
25443        } else {
25444          this.$element.addClass(options.theme);
25445        }
25446      }
25447      if (options.rtl === true) {
25448        this.$element.addClass(PLUGIN_NAME + '-rtl');
25449      }
25450      if (options.openFullscreen === true) {
25451        this.isFullscreen = true;
25452        this.$element.addClass('isFullscreen');
25453      }
25454      this.createHeader();
25455      this.recalcWidth();
25456      this.recalcVerticalPos();
25457      if (that.options.afterRender && (typeof that.options.afterRender === 'function' || _typeof(that.options.afterRender) === 'object')) {
25458        that.options.afterRender(that);
25459      }
25460    },
25461    createHeader: function createHeader() {
25462      this.$header = $('<div class="' + PLUGIN_NAME + '-header"><h2 class="' + PLUGIN_NAME + '-header-title">' + this.options.title + '</h2><p class="' + PLUGIN_NAME + '-header-subtitle">' + this.options.subtitle + '</p><div class="' + PLUGIN_NAME + '-header-buttons"></div></div>');
25463      if (this.options.closeButton === true) {
25464        this.$header.find('.' + PLUGIN_NAME + '-header-buttons').append('<a href="javascript:void(0)" class="' + PLUGIN_NAME + '-button ' + PLUGIN_NAME + '-button-close" data-' + PLUGIN_NAME + '-close></a>');
25465      }
25466      if (this.options.fullscreen === true) {
25467        this.$header.find('.' + PLUGIN_NAME + '-header-buttons').append('<a href="javascript:void(0)" class="' + PLUGIN_NAME + '-button ' + PLUGIN_NAME + '-button-fullscreen" data-' + PLUGIN_NAME + '-fullscreen></a>');
25468      }
25469
25470      //if (this.options.timeoutProgressbar === true && !isNaN(parseInt(this.options.timeout)) && this.options.timeout !== false && this.options.timeout !== 0) {
25471      if (this.options.timeoutProgressbar === true) {
25472        this.$header.prepend('<div class="' + PLUGIN_NAME + '-progressbar"><div style="background-color:' + this.options.timeoutProgressbarColor + '"></div></div>');
25473      }
25474      if (this.options.subtitle === '') {
25475        this.$header.addClass(PLUGIN_NAME + '-noSubtitle');
25476      }
25477      if (this.options.title !== '') {
25478        if (this.options.headerColor !== null) {
25479          if (this.options.borderBottom === true) {
25480            this.$element.css('border-bottom', '3px solid ' + this.options.headerColor + '');
25481          }
25482          this.$header.css('background', this.options.headerColor);
25483        }
25484        if (this.options.icon !== null || this.options.iconText !== null) {
25485          this.$header.prepend('<i class="' + PLUGIN_NAME + '-header-icon"></i>');
25486          if (this.options.icon !== null) {
25487            this.$header.find('.' + PLUGIN_NAME + '-header-icon').addClass(this.options.icon).css('color', this.options.iconColor);
25488          }
25489          if (this.options.iconText !== null) {
25490            this.$header.find('.' + PLUGIN_NAME + '-header-icon').html(this.options.iconText);
25491          }
25492        }
25493        this.$element.css('overflow', 'hidden').prepend(this.$header);
25494      }
25495    },
25496    setGroup: function setGroup(groupName) {
25497      var that = this,
25498        group = this.group.name || groupName;
25499      this.group.ids = [];
25500      if (groupName !== undefined && groupName !== this.group.name) {
25501        group = groupName;
25502        this.group.name = group;
25503        this.$element.attr('data-' + PLUGIN_NAME + '-group', group);
25504      }
25505      if (group !== undefined && group !== '') {
25506        var count = 0;
25507        $.each($('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group=' + group + ']'), function (index, val) {
25508          that.group.ids.push($(this)[0].id);
25509          if (that.id == $(this)[0].id) {
25510            that.group.index = count;
25511          }
25512          count++;
25513        });
25514      }
25515    },
25516    toggle: function toggle() {
25517      if (this.state == STATES.OPENED) {
25518        this.close();
25519      }
25520      if (this.state == STATES.CLOSED) {
25521        this.open();
25522      }
25523    },
25524    startProgress: function startProgress(param) {
25525      var that = this;
25526      this.isPaused = false;
25527      clearTimeout(this.timerTimeout);
25528      if (this.options.timeoutProgressbar === true) {
25529        this.progressBar = {
25530          hideEta: null,
25531          maxHideTime: null,
25532          currentTime: new Date().getTime(),
25533          el: this.$element.find('.' + PLUGIN_NAME + '-progressbar > div'),
25534          updateProgress: function updateProgress() {
25535            if (!that.isPaused) {
25536              that.progressBar.currentTime = that.progressBar.currentTime + 10;
25537              var percentage = (that.progressBar.hideEta - that.progressBar.currentTime) / that.progressBar.maxHideTime * 100;
25538              that.progressBar.el.width(percentage + '%');
25539              if (percentage < 0) {
25540                that.close();
25541              }
25542            }
25543          }
25544        };
25545        if (param > 0) {
25546          this.progressBar.maxHideTime = parseFloat(param);
25547          this.progressBar.hideEta = new Date().getTime() + this.progressBar.maxHideTime;
25548          this.timerTimeout = setInterval(this.progressBar.updateProgress, 10);
25549        }
25550      } else {
25551        this.timerTimeout = setTimeout(function () {
25552          that.close();
25553        }, that.options.timeout);
25554      }
25555    },
25556    pauseProgress: function pauseProgress() {
25557      this.isPaused = true;
25558    },
25559    resumeProgress: function resumeProgress() {
25560      this.isPaused = false;
25561    },
25562    resetProgress: function resetProgress(param) {
25563      clearTimeout(this.timerTimeout);
25564      this.progressBar = {};
25565      this.$element.find('.' + PLUGIN_NAME + '-progressbar > div').width('100%');
25566    },
25567    open: function open(param) {
25568      var that = this;
25569      try {
25570        if (param !== undefined && param.preventClose === false) {
25571          $.each($('.' + PLUGIN_NAME), function (index, modal) {
25572            if ($(modal).data().iziModal !== undefined) {
25573              var state = $(modal).iziModal('getState');
25574              if (state == 'opened' || state == 'opening') {
25575                $(modal).iziModal('close');
25576              }
25577            }
25578          });
25579        }
25580      } catch (e) {/*console.warn(exc);*/}
25581      (function urlHash() {
25582        if (that.options.history) {
25583          var oldTitle = document.title;
25584          document.title = oldTitle + " - " + that.options.title;
25585          changeHashWithoutScrolling('#' + that.id);
25586          document.title = oldTitle;
25587          //history.pushState({}, that.options.title, "#"+that.id);
25588
25589          window.$iziModal.history = true;
25590        } else {
25591          window.$iziModal.history = false;
25592        }
25593      })();
25594      function opened() {
25595        // console.info('[ '+PLUGIN_NAME+' | '+that.id+' ] Opened.');
25596
25597        that.state = STATES.OPENED;
25598        that.$element.trigger(STATES.OPENED);
25599        if (that.options.onOpened && (typeof that.options.onOpened === "function" || _typeof(that.options.onOpened) === "object")) {
25600          that.options.onOpened(that);
25601        }
25602      }
25603      function bindEvents() {
25604        // Close when button pressed
25605        that.$element.off('click', '[data-' + PLUGIN_NAME + '-close]').on('click', '[data-' + PLUGIN_NAME + '-close]', function (e) {
25606          e.preventDefault();
25607          var transition = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-transitionOut');
25608          if (transition !== undefined) {
25609            that.close({
25610              transition: transition
25611            });
25612          } else {
25613            that.close();
25614          }
25615        });
25616
25617        // Expand when button pressed
25618        that.$element.off('click', '[data-' + PLUGIN_NAME + '-fullscreen]').on('click', '[data-' + PLUGIN_NAME + '-fullscreen]', function (e) {
25619          e.preventDefault();
25620          if (that.isFullscreen === true) {
25621            that.isFullscreen = false;
25622            that.$element.removeClass('isFullscreen');
25623          } else {
25624            that.isFullscreen = true;
25625            that.$element.addClass('isFullscreen');
25626          }
25627          if (that.options.onFullscreen && typeof that.options.onFullscreen === "function") {
25628            that.options.onFullscreen(that);
25629          }
25630          that.$element.trigger('fullscreen', that);
25631        });
25632
25633        // Next modal
25634        that.$navigate.off('click', '.' + PLUGIN_NAME + '-navigate-next').on('click', '.' + PLUGIN_NAME + '-navigate-next', function (e) {
25635          that.next(e);
25636        });
25637        that.$element.off('click', '[data-' + PLUGIN_NAME + '-next]').on('click', '[data-' + PLUGIN_NAME + '-next]', function (e) {
25638          that.next(e);
25639        });
25640
25641        // Previous modal
25642        that.$navigate.off('click', '.' + PLUGIN_NAME + '-navigate-prev').on('click', '.' + PLUGIN_NAME + '-navigate-prev', function (e) {
25643          that.prev(e);
25644        });
25645        that.$element.off('click', '[data-' + PLUGIN_NAME + '-prev]').on('click', '[data-' + PLUGIN_NAME + '-prev]', function (e) {
25646          that.prev(e);
25647        });
25648      }
25649      if (this.state == STATES.CLOSED) {
25650        bindEvents();
25651        this.setGroup();
25652        this.state = STATES.OPENING;
25653        this.$element.trigger(STATES.OPENING);
25654        this.$element.attr('aria-hidden', 'false');
25655
25656        // console.info('[ '+PLUGIN_NAME+' | '+this.id+' ] Opening...');
25657
25658        if (this.options.timeoutProgressbar === true) {
25659          this.$element.find('.' + PLUGIN_NAME + '-progressbar > div').width('100%');
25660        }
25661        if (this.options.iframe === true) {
25662          this.$element.find('.' + PLUGIN_NAME + '-content').addClass(PLUGIN_NAME + '-content-loader');
25663          this.$element.find('.' + PLUGIN_NAME + '-iframe').on('load', function () {
25664            $(this).parent().removeClass(PLUGIN_NAME + '-content-loader');
25665          });
25666          var href = null;
25667          try {
25668            href = $(param.currentTarget).attr('href') !== '' ? $(param.currentTarget).attr('href') : null;
25669          } catch (e) {/* console.warn(exc); */}
25670          if (this.options.iframeURL !== null && (href === null || href === undefined)) {
25671            href = this.options.iframeURL;
25672          }
25673          if (href === null || href === undefined) {
25674            throw new Error('Failed to find iframe URL');
25675          }
25676          this.$element.find('.' + PLUGIN_NAME + '-iframe').attr('src', href);
25677        }
25678        if (this.options.bodyOverflow || isMobile) {
25679          $('html').addClass(PLUGIN_NAME + '-isOverflow');
25680          if (isMobile) {
25681            $('body').css('overflow', 'hidden');
25682          }
25683        }
25684        if (this.options.onOpening && typeof this.options.onOpening === 'function') {
25685          this.options.onOpening(this);
25686        }
25687        (function open() {
25688          if (that.group.ids.length > 1) {
25689            that.$navigate.appendTo('body');
25690            that.$navigate.addClass('fadeIn');
25691            if (that.options.navigateCaption === true) {
25692              that.$navigate.find('.' + PLUGIN_NAME + '-navigate-caption').show();
25693            }
25694            var modalWidth = that.$element.outerWidth();
25695            if (that.options.navigateArrows !== false) {
25696              if (that.options.navigateArrows === 'closeScreenEdge') {
25697                that.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').css('left', 0).show();
25698                that.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').css('right', 0).show();
25699              } else {
25700                that.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').css('margin-left', -(modalWidth / 2 + 84)).show();
25701                that.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').css('margin-right', -(modalWidth / 2 + 84)).show();
25702              }
25703            } else {
25704              that.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').hide();
25705              that.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').hide();
25706            }
25707            var loop;
25708            if (that.group.index === 0) {
25709              loop = $('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group="' + that.group.name + '"][data-' + PLUGIN_NAME + '-loop]').length;
25710              if (loop === 0 && that.options.loop === false) that.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').hide();
25711            }
25712            if (that.group.index + 1 === that.group.ids.length) {
25713              loop = $('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group="' + that.group.name + '"][data-' + PLUGIN_NAME + '-loop]').length;
25714              if (loop === 0 && that.options.loop === false) that.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').hide();
25715            }
25716          }
25717          if (that.options.overlay === true) {
25718            if (that.options.appendToOverlay === false) {
25719              that.$overlay.appendTo('body');
25720            } else {
25721              that.$overlay.appendTo(that.options.appendToOverlay);
25722            }
25723          }
25724          if (that.options.transitionInOverlay) {
25725            that.$overlay.addClass(that.options.transitionInOverlay);
25726          }
25727          var transitionIn = that.options.transitionIn;
25728          if (_typeof(param) == 'object') {
25729            if (param.transition !== undefined || param.transitionIn !== undefined) {
25730              transitionIn = param.transition || param.transitionIn;
25731            }
25732            if (param.zindex !== undefined) {
25733              that.setZindex(param.zindex);
25734            }
25735          }
25736          if (transitionIn !== '' && animationEvent !== undefined) {
25737            that.$element.addClass('transitionIn ' + transitionIn).show();
25738            that.$wrap.one(animationEvent, function () {
25739              that.$element.removeClass(transitionIn + ' transitionIn');
25740              that.$overlay.removeClass(that.options.transitionInOverlay);
25741              that.$navigate.removeClass('fadeIn');
25742              opened();
25743            });
25744          } else {
25745            that.$element.show();
25746            opened();
25747          }
25748          if (that.options.pauseOnHover === true && that.options.pauseOnHover === true && that.options.timeout !== false && !isNaN(parseInt(that.options.timeout)) && that.options.timeout !== false && that.options.timeout !== 0) {
25749            that.$element.off('mouseenter').on('mouseenter', function (event) {
25750              event.preventDefault();
25751              that.isPaused = true;
25752            });
25753            that.$element.off('mouseleave').on('mouseleave', function (event) {
25754              event.preventDefault();
25755              that.isPaused = false;
25756            });
25757          }
25758        })();
25759        if (this.options.timeout !== false && !isNaN(parseInt(this.options.timeout)) && this.options.timeout !== false && this.options.timeout !== 0) {
25760          that.startProgress(this.options.timeout);
25761        }
25762
25763        // Close on overlay click
25764        if (this.options.overlayClose && !this.$element.hasClass(this.options.transitionOut)) {
25765          this.$overlay.click(function () {
25766            that.close();
25767          });
25768        }
25769        if (this.options.focusInput) {
25770          this.$element.find(':input:not(button):enabled:visible:first').focus(); // Focus on the first field
25771        }
25772        (function updateTimer() {
25773          that.recalcLayout();
25774          that.timer = setTimeout(updateTimer, 300);
25775        })();
25776
25777        // Close when the Escape key is pressed
25778        $document.on('keydown.' + PLUGIN_NAME, function (e) {
25779          if (that.options.closeOnEscape && e.keyCode === 27) {
25780            that.close();
25781          }
25782        });
25783      }
25784    },
25785    close: function close(param) {
25786      var that = this;
25787      function closed() {
25788        // console.info('[ '+PLUGIN_NAME+' | '+that.id+' ] Closed.');
25789
25790        that.state = STATES.CLOSED;
25791        that.$element.trigger(STATES.CLOSED);
25792        if (that.options.iframe === true) {
25793          that.$element.find('.' + PLUGIN_NAME + '-iframe').attr('src', '');
25794        }
25795        if (that.options.bodyOverflow || isMobile) {
25796          $('html').removeClass(PLUGIN_NAME + '-isOverflow');
25797          if (isMobile) {
25798            $('body').css('overflow', 'auto');
25799          }
25800        }
25801        if (that.options.onClosed && typeof that.options.onClosed === 'function') {
25802          that.options.onClosed(that);
25803        }
25804        if (that.options.restoreDefaultContent === true) {
25805          that.$element.find('.' + PLUGIN_NAME + '-content').html(that.content);
25806        }
25807        if ($('.' + PLUGIN_NAME + ':visible').length === 0) {
25808          $('html').removeClass(PLUGIN_NAME + '-isAttached');
25809        }
25810      }
25811      if (this.state == STATES.OPENED || this.state == STATES.OPENING) {
25812        $document.off('keydown.' + PLUGIN_NAME);
25813        this.state = STATES.CLOSING;
25814        this.$element.trigger(STATES.CLOSING);
25815        this.$element.attr('aria-hidden', 'true');
25816
25817        // console.info('[ '+PLUGIN_NAME+' | '+this.id+' ] Closing...');
25818
25819        clearTimeout(this.timer);
25820        clearTimeout(this.timerTimeout);
25821        if (that.options.onClosing && typeof that.options.onClosing === "function") {
25822          that.options.onClosing(this);
25823        }
25824        var transitionOut = this.options.transitionOut;
25825        if (_typeof(param) == 'object') {
25826          if (param.transition !== undefined || param.transitionOut !== undefined) {
25827            transitionOut = param.transition || param.transitionOut;
25828          }
25829        }
25830        if (transitionOut === false || transitionOut === '' || animationEvent === undefined) {
25831          this.$element.hide();
25832          this.$overlay.remove();
25833          this.$navigate.remove();
25834          closed();
25835        } else {
25836          this.$element.attr('class', [this.classes, PLUGIN_NAME, transitionOut, this.options.theme == 'light' ? PLUGIN_NAME + '-light' : this.options.theme, this.isFullscreen === true ? 'isFullscreen' : '', this.options.rtl ? PLUGIN_NAME + '-rtl' : ''].join(' '));
25837          this.$overlay.attr('class', PLUGIN_NAME + '-overlay ' + this.options.transitionOutOverlay);
25838          if (that.options.navigateArrows !== false && !isMobile) {
25839            this.$navigate.attr('class', PLUGIN_NAME + '-navigate fadeOut');
25840          }
25841          this.$element.one(animationEvent, function () {
25842            if (that.$element.hasClass(transitionOut)) {
25843              that.$element.removeClass(transitionOut + ' transitionOut').hide();
25844            }
25845            that.$overlay.removeClass(that.options.transitionOutOverlay).remove();
25846            that.$navigate.removeClass('fadeOut').remove();
25847            closed();
25848          });
25849        }
25850      }
25851    },
25852    next: function next(e) {
25853      var that = this;
25854      var transitionIn = 'fadeInRight';
25855      var transitionOut = 'fadeOutLeft';
25856      var modal = $('.' + PLUGIN_NAME + ':visible');
25857      var modals = {};
25858      modals.out = this;
25859      if (e !== undefined && _typeof(e) !== 'object') {
25860        e.preventDefault();
25861        modal = $(e.currentTarget);
25862        transitionIn = modal.attr('data-' + PLUGIN_NAME + '-transitionIn');
25863        transitionOut = modal.attr('data-' + PLUGIN_NAME + '-transitionOut');
25864      } else if (e !== undefined) {
25865        if (e.transitionIn !== undefined) {
25866          transitionIn = e.transitionIn;
25867        }
25868        if (e.transitionOut !== undefined) {
25869          transitionOut = e.transitionOut;
25870        }
25871      }
25872      this.close({
25873        transition: transitionOut
25874      });
25875      setTimeout(function () {
25876        var loop = $('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group="' + that.group.name + '"][data-' + PLUGIN_NAME + '-loop]').length;
25877        for (var i = that.group.index + 1; i <= that.group.ids.length; i++) {
25878          try {
25879            modals["in"] = $("#" + that.group.ids[i]).data().iziModal;
25880          } catch (log) {
25881            // console.info('[ '+PLUGIN_NAME+' ] No next modal.');
25882          }
25883          if (typeof modals["in"] !== 'undefined') {
25884            $('#' + that.group.ids[i]).iziModal('open', {
25885              transition: transitionIn
25886            });
25887            break;
25888          } else {
25889            if (i == that.group.ids.length && loop > 0 || that.options.loop === true) {
25890              for (var index = 0; index <= that.group.ids.length; index++) {
25891                modals["in"] = $('#' + that.group.ids[index]).data().iziModal;
25892                if (typeof modals["in"] !== 'undefined') {
25893                  $('#' + that.group.ids[index]).iziModal('open', {
25894                    transition: transitionIn
25895                  });
25896                  break;
25897                }
25898              }
25899            }
25900          }
25901        }
25902      }, 200);
25903      $(document).trigger(PLUGIN_NAME + '-group-change', modals);
25904    },
25905    prev: function prev(e) {
25906      var that = this;
25907      var transitionIn = 'fadeInLeft';
25908      var transitionOut = 'fadeOutRight';
25909      var modal = $('.' + PLUGIN_NAME + ':visible');
25910      var modals = {};
25911      modals.out = this;
25912      if (e !== undefined && _typeof(e) !== 'object') {
25913        e.preventDefault();
25914        modal = $(e.currentTarget);
25915        transitionIn = modal.attr('data-' + PLUGIN_NAME + '-transitionIn');
25916        transitionOut = modal.attr('data-' + PLUGIN_NAME + '-transitionOut');
25917      } else if (e !== undefined) {
25918        if (e.transitionIn !== undefined) {
25919          transitionIn = e.transitionIn;
25920        }
25921        if (e.transitionOut !== undefined) {
25922          transitionOut = e.transitionOut;
25923        }
25924      }
25925      this.close({
25926        transition: transitionOut
25927      });
25928      setTimeout(function () {
25929        var loop = $('.' + PLUGIN_NAME + '[data-' + PLUGIN_NAME + '-group="' + that.group.name + '"][data-' + PLUGIN_NAME + '-loop]').length;
25930        for (var i = that.group.index; i >= 0; i--) {
25931          try {
25932            modals["in"] = $('#' + that.group.ids[i - 1]).data().iziModal;
25933          } catch (log) {
25934            // console.info('[ '+PLUGIN_NAME+' ] No previous modal.');
25935          }
25936          if (typeof modals["in"] !== 'undefined') {
25937            $('#' + that.group.ids[i - 1]).iziModal('open', {
25938              transition: transitionIn
25939            });
25940            break;
25941          } else {
25942            if (i === 0 && loop > 0 || that.options.loop === true) {
25943              for (var index = that.group.ids.length - 1; index >= 0; index--) {
25944                modals["in"] = $('#' + that.group.ids[index]).data().iziModal;
25945                if (typeof modals["in"] !== 'undefined') {
25946                  $('#' + that.group.ids[index]).iziModal('open', {
25947                    transition: transitionIn
25948                  });
25949                  break;
25950                }
25951              }
25952            }
25953          }
25954        }
25955      }, 200);
25956      $(document).trigger(PLUGIN_NAME + '-group-change', modals);
25957    },
25958    destroy: function destroy() {
25959      var e = $.Event('destroy');
25960      this.$element.trigger(e);
25961      $document.off('keydown.' + PLUGIN_NAME);
25962      clearTimeout(this.timer);
25963      clearTimeout(this.timerTimeout);
25964      if (this.options.iframe === true) {
25965        this.$element.find('.' + PLUGIN_NAME + '-iframe').remove();
25966      }
25967      this.$element.html(this.$element.find('.' + PLUGIN_NAME + '-content').html());
25968      this.$element.off('click', '[data-' + PLUGIN_NAME + '-close]');
25969      this.$element.off('click', '[data-' + PLUGIN_NAME + '-fullscreen]');
25970      this.$element.off('.' + PLUGIN_NAME).removeData(PLUGIN_NAME).attr('style', '');
25971      this.$overlay.remove();
25972      this.$navigate.remove();
25973      this.$element.trigger(STATES.DESTROYED);
25974      this.$element = null;
25975    },
25976    getState: function getState() {
25977      return this.state;
25978    },
25979    getGroup: function getGroup() {
25980      return this.group;
25981    },
25982    setWidth: function setWidth(width) {
25983      this.options.width = width;
25984      this.recalcWidth();
25985      var modalWidth = this.$element.outerWidth();
25986      if (this.options.navigateArrows === true || this.options.navigateArrows == 'closeToModal') {
25987        this.$navigate.find('.' + PLUGIN_NAME + '-navigate-prev').css('margin-left', -(modalWidth / 2 + 84)).show();
25988        this.$navigate.find('.' + PLUGIN_NAME + '-navigate-next').css('margin-right', -(modalWidth / 2 + 84)).show();
25989      }
25990    },
25991    setTop: function setTop(top) {
25992      this.options.top = top;
25993      this.recalcVerticalPos(false);
25994    },
25995    setBottom: function setBottom(bottom) {
25996      this.options.bottom = bottom;
25997      this.recalcVerticalPos(false);
25998    },
25999    setHeader: function setHeader(status) {
26000      if (status) {
26001        this.$element.find('.' + PLUGIN_NAME + '-header').show();
26002      } else {
26003        this.headerHeight = 0;
26004        this.$element.find('.' + PLUGIN_NAME + '-header').hide();
26005      }
26006    },
26007    setTitle: function setTitle(title) {
26008      this.options.title = title;
26009      if (this.headerHeight === 0) {
26010        this.createHeader();
26011      }
26012      if (this.$header.find('.' + PLUGIN_NAME + '-header-title').length === 0) {
26013        this.$header.append('<h2 class="' + PLUGIN_NAME + '-header-title"></h2>');
26014      }
26015      this.$header.find('.' + PLUGIN_NAME + '-header-title').html(title);
26016    },
26017    setSubtitle: function setSubtitle(subtitle) {
26018      if (subtitle === '') {
26019        this.$header.find('.' + PLUGIN_NAME + '-header-subtitle').remove();
26020        this.$header.addClass(PLUGIN_NAME + '-noSubtitle');
26021      } else {
26022        if (this.$header.find('.' + PLUGIN_NAME + '-header-subtitle').length === 0) {
26023          this.$header.append('<p class="' + PLUGIN_NAME + '-header-subtitle"></p>');
26024        }
26025        this.$header.removeClass(PLUGIN_NAME + '-noSubtitle');
26026      }
26027      this.$header.find('.' + PLUGIN_NAME + '-header-subtitle').html(subtitle);
26028      this.options.subtitle = subtitle;
26029    },
26030    setIcon: function setIcon(icon) {
26031      if (this.$header.find('.' + PLUGIN_NAME + '-header-icon').length === 0) {
26032        this.$header.prepend('<i class="' + PLUGIN_NAME + '-header-icon"></i>');
26033      }
26034      this.$header.find('.' + PLUGIN_NAME + '-header-icon').attr('class', PLUGIN_NAME + '-header-icon ' + icon);
26035      this.options.icon = icon;
26036    },
26037    setIconText: function setIconText(iconText) {
26038      this.$header.find('.' + PLUGIN_NAME + '-header-icon').html(iconText);
26039      this.options.iconText = iconText;
26040    },
26041    setHeaderColor: function setHeaderColor(headerColor) {
26042      if (this.options.borderBottom === true) {
26043        this.$element.css('border-bottom', '3px solid ' + headerColor + '');
26044      }
26045      this.$header.css('background', headerColor);
26046      this.options.headerColor = headerColor;
26047    },
26048    setBackground: function setBackground(background) {
26049      if (background === false) {
26050        this.options.background = null;
26051        this.$element.css('background', '');
26052      } else {
26053        this.$element.css('background', background);
26054        this.options.background = background;
26055      }
26056    },
26057    setZindex: function setZindex(zindex) {
26058      if (!isNaN(parseInt(this.options.zindex))) {
26059        this.options.zindex = zindex;
26060        this.$element.css('z-index', zindex);
26061        this.$navigate.css('z-index', zindex - 1);
26062        this.$overlay.css('z-index', zindex - 2);
26063      }
26064    },
26065    setFullscreen: function setFullscreen(value) {
26066      if (value) {
26067        this.isFullscreen = true;
26068        this.$element.addClass('isFullscreen');
26069      } else {
26070        this.isFullscreen = false;
26071        this.$element.removeClass('isFullscreen');
26072      }
26073    },
26074    setContent: function setContent(content) {
26075      if (_typeof(content) == 'object') {
26076        var replace = content["default"] || false;
26077        if (replace === true) {
26078          this.content = content.content;
26079        }
26080        content = content.content;
26081      }
26082      if (this.options.iframe === false) {
26083        this.$element.find('.' + PLUGIN_NAME + '-content').html(content);
26084      }
26085    },
26086    setTransitionIn: function setTransitionIn(transition) {
26087      this.options.transitionIn = transition;
26088    },
26089    setTransitionOut: function setTransitionOut(transition) {
26090      this.options.transitionOut = transition;
26091    },
26092    setTimeout: function setTimeout(timeout) {
26093      this.options.timeout = timeout;
26094    },
26095    resetContent: function resetContent() {
26096      this.$element.find('.' + PLUGIN_NAME + '-content').html(this.content);
26097    },
26098    startLoading: function startLoading() {
26099      if (!this.$element.find('.' + PLUGIN_NAME + '-loader').length) {
26100        this.$element.append('<div class="' + PLUGIN_NAME + '-loader fadeIn"></div>');
26101      }
26102      this.$element.find('.' + PLUGIN_NAME + '-loader').css({
26103        top: this.headerHeight,
26104        borderRadius: this.options.radius
26105      });
26106    },
26107    stopLoading: function stopLoading() {
26108      var $loader = this.$element.find('.' + PLUGIN_NAME + '-loader');
26109      if (!$loader.length) {
26110        this.$element.prepend('<div class="' + PLUGIN_NAME + '-loader fadeIn"></div>');
26111        $loader = this.$element.find('.' + PLUGIN_NAME + '-loader').css('border-radius', this.options.radius);
26112      }
26113      $loader.removeClass('fadeIn').addClass('fadeOut');
26114      setTimeout(function () {
26115        $loader.remove();
26116      }, 600);
26117    },
26118    recalcWidth: function recalcWidth() {
26119      var that = this;
26120      this.$element.css('max-width', this.options.width);
26121      if (isIE()) {
26122        var modalWidth = that.options.width;
26123        if (modalWidth.toString().split('%').length > 1) {
26124          modalWidth = that.$element.outerWidth();
26125        }
26126        that.$element.css({
26127          left: '50%',
26128          marginLeft: -(modalWidth / 2)
26129        });
26130      }
26131    },
26132    recalcVerticalPos: function recalcVerticalPos(first) {
26133      if (this.options.top !== null && this.options.top !== false) {
26134        this.$element.css('margin-top', this.options.top);
26135        if (this.options.top === 0) {
26136          this.$element.css({
26137            borderTopRightRadius: 0,
26138            borderTopLeftRadius: 0
26139          });
26140        }
26141      } else {
26142        if (first === false) {
26143          this.$element.css({
26144            marginTop: '',
26145            borderRadius: this.options.radius
26146          });
26147        }
26148      }
26149      if (this.options.bottom !== null && this.options.bottom !== false) {
26150        this.$element.css('margin-bottom', this.options.bottom);
26151        if (this.options.bottom === 0) {
26152          this.$element.css({
26153            borderBottomRightRadius: 0,
26154            borderBottomLeftRadius: 0
26155          });
26156        }
26157      } else {
26158        if (first === false) {
26159          this.$element.css({
26160            marginBottom: '',
26161            borderRadius: this.options.radius
26162          });
26163        }
26164      }
26165    },
26166    recalcLayout: function recalcLayout() {
26167      var that = this,
26168        windowHeight = $window.height(),
26169        modalHeight = this.$element.outerHeight(),
26170        modalWidth = this.$element.outerWidth(),
26171        contentHeight = this.$element.find('.' + PLUGIN_NAME + '-content')[0].scrollHeight,
26172        outerHeight = contentHeight + this.headerHeight,
26173        wrapperHeight = this.$element.innerHeight() - this.headerHeight,
26174        modalMargin = parseInt(-((this.$element.innerHeight() + 1) / 2)) + 'px',
26175        scrollTop = this.$wrap.scrollTop(),
26176        borderSize = 0;
26177      if (isIE()) {
26178        if (modalWidth >= $window.width() || this.isFullscreen === true) {
26179          this.$element.css({
26180            left: '0',
26181            marginLeft: ''
26182          });
26183        } else {
26184          this.$element.css({
26185            left: '50%',
26186            marginLeft: -(modalWidth / 2)
26187          });
26188        }
26189      }
26190      if (this.options.borderBottom === true && this.options.title !== '') {
26191        borderSize = 3;
26192      }
26193      if (this.$element.find('.' + PLUGIN_NAME + '-header').length && this.$element.find('.' + PLUGIN_NAME + '-header').is(':visible')) {
26194        this.headerHeight = parseInt(this.$element.find('.' + PLUGIN_NAME + '-header').innerHeight());
26195        this.$element.css('overflow', 'hidden');
26196      } else {
26197        this.headerHeight = 0;
26198        this.$element.css('overflow', '');
26199      }
26200      if (this.$element.find('.' + PLUGIN_NAME + '-loader').length) {
26201        this.$element.find('.' + PLUGIN_NAME + '-loader').css('top', this.headerHeight);
26202      }
26203      if (modalHeight !== this.modalHeight) {
26204        this.modalHeight = modalHeight;
26205        if (this.options.onResize && typeof this.options.onResize === "function") {
26206          this.options.onResize(this);
26207        }
26208      }
26209      if (this.state == STATES.OPENED || this.state == STATES.OPENING) {
26210        if (this.options.iframe === true) {
26211          // If the height of the window is smaller than the modal with iframe
26212          if (windowHeight < this.options.iframeHeight + this.headerHeight + borderSize || this.isFullscreen === true) {
26213            this.$element.find('.' + PLUGIN_NAME + '-iframe').css('height', windowHeight - (this.headerHeight + borderSize));
26214          } else {
26215            this.$element.find('.' + PLUGIN_NAME + '-iframe').css('height', this.options.iframeHeight);
26216          }
26217        }
26218        if (modalHeight == windowHeight) {
26219          this.$element.addClass('isAttached');
26220        } else {
26221          this.$element.removeClass('isAttached');
26222        }
26223        if (this.isFullscreen === false && this.$element.width() >= $window.width()) {
26224          this.$element.find('.' + PLUGIN_NAME + '-button-fullscreen').hide();
26225        } else {
26226          this.$element.find('.' + PLUGIN_NAME + '-button-fullscreen').show();
26227        }
26228        this.recalcButtons();
26229        if (this.isFullscreen === false) {
26230          windowHeight = windowHeight - (clearValue(this.options.top) || 0) - (clearValue(this.options.bottom) || 0);
26231        }
26232        // If the modal is larger than the height of the window..
26233        if (outerHeight > windowHeight) {
26234          if (this.options.top > 0 && this.options.bottom === null && contentHeight < $window.height()) {
26235            this.$element.addClass('isAttachedBottom');
26236          }
26237          if (this.options.bottom > 0 && this.options.top === null && contentHeight < $window.height()) {
26238            this.$element.addClass('isAttachedTop');
26239          }
26240          if ($('.' + PLUGIN_NAME + ':visible').length === 1) {
26241            $('html').addClass(PLUGIN_NAME + '-isAttached');
26242          }
26243          this.$element.css('height', windowHeight);
26244        } else {
26245          this.$element.css('height', contentHeight + (this.headerHeight + borderSize));
26246          this.$element.removeClass('isAttachedTop isAttachedBottom');
26247          if ($('.' + PLUGIN_NAME + ':visible').length === 1) {
26248            $('html').removeClass(PLUGIN_NAME + '-isAttached');
26249          }
26250        }
26251        (function applyScroll() {
26252          if (contentHeight > wrapperHeight && outerHeight > windowHeight) {
26253            that.$element.addClass('hasScroll');
26254            that.$wrap.css('height', modalHeight - (that.headerHeight + borderSize));
26255          } else {
26256            that.$element.removeClass('hasScroll');
26257            that.$wrap.css('height', 'auto');
26258          }
26259        })();
26260        (function applyShadow() {
26261          if (wrapperHeight + scrollTop < contentHeight - 30) {
26262            that.$element.addClass('hasShadow');
26263          } else {
26264            that.$element.removeClass('hasShadow');
26265          }
26266        })();
26267      }
26268    },
26269    recalcButtons: function recalcButtons() {
26270      var widthButtons = this.$header.find('.' + PLUGIN_NAME + '-header-buttons').innerWidth() + 10;
26271      if (this.options.rtl === true) {
26272        this.$header.css('padding-left', widthButtons);
26273      } else {
26274        this.$header.css('padding-right', widthButtons);
26275      }
26276    }
26277  };
26278  $window.off('load.' + PLUGIN_NAME).on('load.' + PLUGIN_NAME, function (e) {
26279    var modalHash = document.location.hash;
26280    if (window.$iziModal.autoOpen === 0 && !$('.' + PLUGIN_NAME).is(':visible')) {
26281      try {
26282        var data = $(modalHash).data();
26283        if (typeof data !== 'undefined') {
26284          if (data.iziModal.options.autoOpen !== false) {
26285            $(modalHash).iziModal('open');
26286          }
26287        }
26288      } catch (exc) {/* console.warn(exc); */}
26289    }
26290  });
26291  $window.off('hashchange.' + PLUGIN_NAME).on('hashchange.' + PLUGIN_NAME, function (e) {
26292    var modalHash = document.location.hash;
26293    if (modalHash !== '') {
26294      try {
26295        var data = $(modalHash).data();
26296        if (typeof data !== 'undefined' && $(modalHash).iziModal('getState') !== 'opening') {
26297          setTimeout(function () {
26298            $(modalHash).iziModal('open', {
26299              preventClose: false
26300            });
26301          }, 200);
26302        }
26303      } catch (exc) {/* console.warn(exc); */}
26304    } else {
26305      if (window.$iziModal.history) {
26306        $.each($('.' + PLUGIN_NAME), function (index, modal) {
26307          if ($(modal).data().iziModal !== undefined) {
26308            var state = $(modal).iziModal('getState');
26309            if (state == 'opened' || state == 'opening') {
26310              $(modal).iziModal('close');
26311            }
26312          }
26313        });
26314      }
26315    }
26316  });
26317  $document.off('click', '[data-' + PLUGIN_NAME + '-open]').on('click', '[data-' + PLUGIN_NAME + '-open]', function (e) {
26318    e.preventDefault();
26319    var modal = $('.' + PLUGIN_NAME + ':visible');
26320    var openModal = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-open');
26321    var preventClose = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-preventClose');
26322    var transitionIn = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-transitionIn');
26323    var transitionOut = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-transitionOut');
26324    var zindex = $(e.currentTarget).attr('data-' + PLUGIN_NAME + '-zindex');
26325    if (zindex !== undefined) $(openModal).iziModal('setZindex', zindex);
26326    if (preventClose === undefined) {
26327      if (transitionOut !== undefined) {
26328        modal.iziModal('close', {
26329          transition: transitionOut
26330        });
26331      } else {
26332        modal.iziModal('close');
26333      }
26334    }
26335    setTimeout(function () {
26336      if (transitionIn !== undefined) {
26337        $(openModal).iziModal('open', {
26338          transition: transitionIn
26339        });
26340      } else {
26341        $(openModal).iziModal('open');
26342      }
26343    }, 200);
26344  });
26345  $document.off('keyup.' + PLUGIN_NAME).on('keyup.' + PLUGIN_NAME, function (event) {
26346    if ($('.' + PLUGIN_NAME + ':visible').length) {
26347      var modal = $('.' + PLUGIN_NAME + ':visible')[0].id,
26348        arrowKeys = $('#' + modal).data().iziModal.options.arrowKeys,
26349        group = $('#' + modal).iziModal('getGroup'),
26350        e = event || window.event,
26351        target = e.target || e.srcElement,
26352        modals = {};
26353      if (modal !== undefined && arrowKeys && group.name !== undefined && !e.ctrlKey && !e.metaKey && !e.altKey && target.tagName.toUpperCase() !== 'INPUT' && target.tagName.toUpperCase() != 'TEXTAREA') {
26354        //&& $(e.target).is('body')
26355
26356        if (e.keyCode === 37) {
26357          // left
26358          $('#' + modal).iziModal('prev', e);
26359        } else if (e.keyCode === 39) {
26360          // right
26361          $('#' + modal).iziModal('next', e);
26362        }
26363      }
26364    }
26365  });
26366  $.fn[PLUGIN_NAME] = function (option, args) {
26367    if (!$(this).length && _typeof(option) == 'object') {
26368      var newEL = {
26369        $el: document.createElement('div'),
26370        id: this.selector.split('#'),
26371        "class": this.selector.split('.')
26372      };
26373      if (newEL.id.length > 1) {
26374        try {
26375          newEL.$el = document.createElement(id[0]);
26376        } catch (exc) {}
26377        newEL.$el.id = this.selector.split('#')[1].trim();
26378      } else if (newEL["class"].length > 1) {
26379        try {
26380          newEL.$el = document.createElement(newEL["class"][0]);
26381        } catch (exc) {}
26382        for (var x = 1; x < newEL["class"].length; x++) {
26383          newEL.$el.classList.add(newEL["class"][x].trim());
26384        }
26385      }
26386      document.body.appendChild(newEL.$el);
26387      this.push($(this.selector));
26388    }
26389    var objs = this;
26390    for (var i = 0; i < objs.length; i++) {
26391      var $this = $(objs[i]);
26392      var data = $this.data(PLUGIN_NAME);
26393      var options = $.extend({}, $.fn[PLUGIN_NAME].defaults, $this.data(), _typeof(option) == 'object' && option);
26394      if (!data && (!option || _typeof(option) == 'object')) {
26395        $this.data(PLUGIN_NAME, data = new iziModal($this, options));
26396      } else if (typeof option == 'string' && typeof data != 'undefined') {
26397        return data[option].apply(data, [].concat(args));
26398      }
26399      if (options.autoOpen) {
26400        // Automatically open the modal if autoOpen setted true or ms
26401
26402        if (!isNaN(parseInt(options.autoOpen))) {
26403          setTimeout(function () {
26404            data.open();
26405          }, options.autoOpen);
26406        } else if (options.autoOpen === true) {
26407          data.open();
26408        }
26409        window.$iziModal.autoOpen++;
26410      }
26411    }
26412    return this;
26413  };
26414  $.fn[PLUGIN_NAME].defaults = {
26415    title: '',
26416    subtitle: '',
26417    headerColor: '#88A0B9',
26418    background: null,
26419    theme: '',
26420    // light
26421    icon: null,
26422    iconText: null,
26423    iconColor: '',
26424    rtl: false,
26425    width: 600,
26426    top: null,
26427    bottom: null,
26428    borderBottom: true,
26429    padding: 0,
26430    radius: 3,
26431    zindex: 999,
26432    iframe: false,
26433    iframeHeight: 400,
26434    iframeURL: null,
26435    focusInput: true,
26436    group: '',
26437    loop: false,
26438    arrowKeys: true,
26439    navigateCaption: true,
26440    navigateArrows: true,
26441    // Boolean, 'closeToModal', 'closeScreenEdge'
26442    history: false,
26443    restoreDefaultContent: false,
26444    autoOpen: 0,
26445    // Boolean, Number
26446    bodyOverflow: false,
26447    fullscreen: false,
26448    openFullscreen: false,
26449    closeOnEscape: true,
26450    closeButton: true,
26451    appendTo: 'body',
26452    // or false
26453    appendToOverlay: 'body',
26454    // or false
26455    overlay: true,
26456    overlayClose: true,
26457    overlayColor: 'rgba(0, 0, 0, 0.4)',
26458    timeout: false,
26459    timeoutProgressbar: false,
26460    pauseOnHover: false,
26461    timeoutProgressbarColor: 'rgba(255,255,255,0.5)',
26462    transitionIn: 'comingIn',
26463    // comingIn, bounceInDown, bounceInUp, fadeInDown, fadeInUp, fadeInLeft, fadeInRight, flipInX
26464    transitionOut: 'comingOut',
26465    // comingOut, bounceOutDown, bounceOutUp, fadeOutDown, fadeOutUp, , fadeOutLeft, fadeOutRight, flipOutX
26466    transitionInOverlay: 'fadeIn',
26467    transitionOutOverlay: 'fadeOut',
26468    onFullscreen: function onFullscreen() {},
26469    onResize: function onResize() {},
26470    onOpening: function onOpening() {},
26471    onOpened: function onOpened() {},
26472    onClosing: function onClosing() {},
26473    onClosed: function onClosed() {},
26474    afterRender: function afterRender() {}
26475  };
26476  $.fn[PLUGIN_NAME].Constructor = iziModal;
26477  return $.fn.iziModal;
26478});
26479/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))
26480
26481/***/ }),
26482
26483/***/ "./src/sass/app.scss":
26484/*!***************************!*\
26485  !*** ./src/sass/app.scss ***!
26486  \***************************/
26487/*! no static exports found */
26488/***/ (function(module, exports, __webpack_require__) {
26489
26490// extracted by mini-css-extract-plugin
26491
26492/***/ })
26492,
26493
26494/***/ 0:
26495/*!*******************************************************************************************************************!*\
26496  !*** multi swiper/css/swiper.min.css ./src/lib/iziModal/css/iziModal.min.css ./src/sass/app.scss ./src/js/app.js ***!
26497  \*******************************************************************************************************************/
26498/*! no static exports found */
26499/***/ (function(module, exports, __webpack_require__) {
26500
26501__webpack_require__(/*! swiper/css/swiper.min.css */"./node_modules/swiper/css/swiper.min.css");
26502__webpack_require__(/*! ./src/lib/iziModal/css/iziModal.min.css */"./src/lib/iziModal/css/iziModal.min.css");
26503__webpack_require__(/*! ./src/sass/app.scss */"./src/sass/app.scss");
26504module.exports = __webpack_require__(/*! ./src/js/app.js */"./src/js/app.js");
26505
26506
26507/***/ })
26508
26509/******/ });
26510//# sourceMappingURL=app.js.map

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