PageSourceSearch

https://sudoroom.org/wp-content/plugins/templategalaxy/assets/js/swiper-bundle.js?ver=7.1

js sudoroom.org collected 2026-09-24 18:36:37 UTC 334,647 bytes, 9,538 lines download raw bytes

vendor: 4,422 bytes, lines 1-210
1/**
2 * Swiper 11.0.5
3 * Most modern mobile touch slider and framework with hardware accelerated transitions
4 * https://swiperjs.com
5 *
6 * Copyright 2014-2023 Vladimir Kharlampidi
7 *
8 * Released under the MIT License
9 *
10 * Released on: November 22, 2023
11 */
12
13var Swiper = (function () {
14  'use strict';
15
16  /**
17   * SSR Window 4.0.2
18   * Better handling for window object in SSR environment
19   * https://github.com/nolimits4web/ssr-window
20   *
21   * Copyright 2021, Vladimir Kharlampidi
22   *
23   * Licensed under MIT
24   *
25   * Released on: December 13, 2021
26   */
27  /* eslint-disable no-param-reassign */
28  function isObject$1(obj) {
29    return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
30  }
31  function extend$1(target, src) {
32    if (target === void 0) {
33      target = {};
34    }
35    if (src === void 0) {
36      src = {};
37    }
38    Object.keys(src).forEach(key => {
39      if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject$1(src[key]) && isObject$1(target[key]) && Object.keys(src[key]).length > 0) {
40        extend$1(target[key], src[key]);
41      }
42    });
43  }
44  const ssrDocument = {
45    body: {},
46    addEventListener() {},
47    removeEventListener() {},
48    activeElement: {
49      blur() {},
50      nodeName: ''
51    },
52    querySelector() {
53      return null;
54    },
55    querySelectorAll() {
56      return [];
57    },
58    getElementById() {
59      return null;
60    },
61    createEvent() {
62      return {
63        initEvent() {}
64      };
65    },
66    createElement() {
67      return {
68        children: [],
69        childNodes: [],
70        style: {},
71        setAttribute() {},
72        getElementsByTagName() {
73          return [];
74        }
75      };
76    },
77    createElementNS() {
78      return {};
79    },
80    importNode() {
81      return null;
82    },
83    location: {
84      hash: '',
85      host: '',
86      hostname: '',
87      href: '',
88      origin: '',
89      pathname: '',
90      protocol: '',
91      search: ''
92    }
93  };
94  function getDocument() {
95    const doc = typeof document !== 'undefined' ? document : {};
96    extend$1(doc, ssrDocument);
97    return doc;
98  }
99  const ssrWindow = {
100    document: ssrDocument,
101    navigator: {
102      userAgent: ''
103    },
104    location: {
105      hash: '',
106      host: '',
107      hostname: '',
108      href: '',
109      origin: '',
110      pathname: '',
111      protocol: '',
112      search: ''
113    },
114    history: {
115      replaceState() {},
116      pushState() {},
117      go() {},
118      back() {}
119    },
120    CustomEvent: function CustomEvent() {
121      return this;
122    },
123    addEventListener() {},
124    removeEventListener() {},
125    getComputedStyle() {
126      return {
127        getPropertyValue() {
128          return '';
129        }
130      };
131    },
132    Image() {},
133    Date() {},
134    screen: {},
135    setTimeout() {},
136    clearTimeout() {},
137    matchMedia() {
138      return {};
139    },
140    requestAnimationFrame(callback) {
141      if (typeof setTimeout === 'undefined') {
142        callback();
143        return null;
144      }
145      return setTimeout(callback, 0);
146    },
147    cancelAnimationFrame(id) {
148      if (typeof setTimeout === 'undefined') {
149        return;
150      }
151      clearTimeout(id);
152    }
153  };
154  function getWindow() {
155    const win = typeof window !== 'undefined' ? window : {};
156    extend$1(win, ssrWindow);
157    return win;
158  }
159
160  function classesToTokens(classes) {
161    if (classes === void 0) {
162      classes = '';
163    }
164    return classes.trim().split(' ').filter(c => !!c.trim());
165  }
166
167  function deleteProps(obj) {
168    const object = obj;
169    Object.keys(object).forEach(key => {
170      try {
171        object[key] = null;
172      } catch (e) {
173        // no getter for object
174      }
175      try {
176        delete object[key];
177      } catch (e) {
178        // something got wrong
179      }
180    });
181  }
182  function nextTick(callback, delay) {
183    if (delay === void 0) {
184      delay = 0;
185    }
186    return setTimeout(callback, delay);
187  }
188  function now() {
189    return Date.now();
190  }
191  function getComputedStyle$1(el) {
192    const window = getWindow();
193    let style;
194    if (window.getComputedStyle) {
195      style = window.getComputedStyle(el, null);
196    }
197    if (!style && el.currentStyle) {
198      style = el.currentStyle;
199    }
200    if (!style) {
201      style = el.style;
202    }
203    return style;
204  }
205  function getTranslate(el, axis) {
206    if (axis === void 0) {
207      axis = 'x';
208    }
209    const window = getWindow();
210    let matrix;
vendor: 5,819 bytes, lines 211-358
211    let curTransform;
212    let transformMatrix;
213    const curStyle = getComputedStyle$1(el);
214    if (window.WebKitCSSMatrix) {
215      curTransform = curStyle.transform || curStyle.webkitTransform;
216      if (curTransform.split(',').length > 6) {
217        curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');
218      }
219      // Some old versions of Webkit choke when 'none' is passed; pass
220      // empty string instead in this case
221      transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
222    } else {
223      transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
224      matrix = transformMatrix.toString().split(',');
225    }
226    if (axis === 'x') {
227      // Latest Chrome and webkits Fix
228      if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;
229      // Crazy IE10 Matrix
230      else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);
231      // Normal Browsers
232      else curTransform = parseFloat(matrix[4]);
233    }
234    if (axis === 'y') {
235      // Latest Chrome and webkits Fix
236      if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;
237      // Crazy IE10 Matrix
238      else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);
239      // Normal Browsers
240      else curTransform = parseFloat(matrix[5]);
241    }
242    return curTransform || 0;
243  }
244  function isObject(o) {
245    return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
246  }
247  function isNode(node) {
248    // eslint-disable-next-line
249    if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {
250      return node instanceof HTMLElement;
251    }
252    return node && (node.nodeType === 1 || node.nodeType === 11);
253  }
254  function extend() {
255    const to = Object(arguments.length <= 0 ? undefined : arguments[0]);
256    const noExtend = ['__proto__', 'constructor', 'prototype'];
257    for (let i = 1; i < arguments.length; i += 1) {
258      const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
259      if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {
260        const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);
261        for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
262          const nextKey = keysArray[nextIndex];
263          const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
264          if (desc !== undefined && desc.enumerable) {
265            if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
266              if (nextSource[nextKey].__swiper__) {
267                to[nextKey] = nextSource[nextKey];
268              } else {
269                extend(to[nextKey], nextSource[nextKey]);
270              }
271            } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
272              to[nextKey] = {};
273              if (nextSource[nextKey].__swiper__) {
274                to[nextKey] = nextSource[nextKey];
275              } else {
276                extend(to[nextKey], nextSource[nextKey]);
277              }
278            } else {
279              to[nextKey] = nextSource[nextKey];
280            }
281          }
282        }
283      }
284    }
285    return to;
286  }
287  function setCSSProperty(el, varName, varValue) {
288    el.style.setProperty(varName, varValue);
289  }
290  function animateCSSModeScroll(_ref) {
291    let {
292      swiper,
293      targetPosition,
294      side
295    } = _ref;
296    const window = getWindow();
297    const startPosition = -swiper.translate;
298    let startTime = null;
299    let time;
300    const duration = swiper.params.speed;
301    swiper.wrapperEl.style.scrollSnapType = 'none';
302    window.cancelAnimationFrame(swiper.cssModeFrameID);
303    const dir = targetPosition > startPosition ? 'next' : 'prev';
304    const isOutOfBound = (current, target) => {
305      return dir === 'next' && current >= target || dir === 'prev' && current <= target;
306    };
307    const animate = () => {
308      time = new Date().getTime();
309      if (startTime === null) {
310        startTime = time;
311      }
312      const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
313      const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
314      let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
315      if (isOutOfBound(currentPosition, targetPosition)) {
316        currentPosition = targetPosition;
317      }
318      swiper.wrapperEl.scrollTo({
319        [side]: currentPosition
320      });
321      if (isOutOfBound(currentPosition, targetPosition)) {
322        swiper.wrapperEl.style.overflow = 'hidden';
323        swiper.wrapperEl.style.scrollSnapType = '';
324        setTimeout(() => {
325          swiper.wrapperEl.style.overflow = '';
326          swiper.wrapperEl.scrollTo({
327            [side]: currentPosition
328          });
329        });
330        window.cancelAnimationFrame(swiper.cssModeFrameID);
331        return;
332      }
333      swiper.cssModeFrameID = window.requestAnimationFrame(animate);
334    };
335    animate();
336  }
337  function getSlideTransformEl(slideEl) {
338    return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform') || slideEl;
339  }
340  function elementChildren(element, selector) {
341    if (selector === void 0) {
342      selector = '';
343    }
344    return [...element.children].filter(el => el.matches(selector));
345  }
346  function showWarning(text) {
347    try {
348      console.warn(text);
349      return;
350    } catch (err) {
351      // err
352    }
353  }
354  function createElement(tag, classes) {
355    if (classes === void 0) {
356      classes = [];
357    }
358    const el = document.createElement(tag);
vendor: 3,458 bytes, lines 359-466
359    el.classList.add(...(Array.isArray(classes) ? classes : classesToTokens(classes)));
360    return el;
361  }
362  function elementOffset(el) {
363    const window = getWindow();
364    const document = getDocument();
365    const box = el.getBoundingClientRect();
366    const body = document.body;
367    const clientTop = el.clientTop || body.clientTop || 0;
368    const clientLeft = el.clientLeft || body.clientLeft || 0;
369    const scrollTop = el === window ? window.scrollY : el.scrollTop;
370    const scrollLeft = el === window ? window.scrollX : el.scrollLeft;
371    return {
372      top: box.top + scrollTop - clientTop,
373      left: box.left + scrollLeft - clientLeft
374    };
375  }
376  function elementPrevAll(el, selector) {
377    const prevEls = [];
378    while (el.previousElementSibling) {
379      const prev = el.previousElementSibling; // eslint-disable-line
380      if (selector) {
381        if (prev.matches(selector)) prevEls.push(prev);
382      } else prevEls.push(prev);
383      el = prev;
384    }
385    return prevEls;
386  }
387  function elementNextAll(el, selector) {
388    const nextEls = [];
389    while (el.nextElementSibling) {
390      const next = el.nextElementSibling; // eslint-disable-line
391      if (selector) {
392        if (next.matches(selector)) nextEls.push(next);
393      } else nextEls.push(next);
394      el = next;
395    }
396    return nextEls;
397  }
398  function elementStyle(el, prop) {
399    const window = getWindow();
400    return window.getComputedStyle(el, null).getPropertyValue(prop);
401  }
402  function elementIndex(el) {
403    let child = el;
404    let i;
405    if (child) {
406      i = 0;
407      // eslint-disable-next-line
408      while ((child = child.previousSibling) !== null) {
409        if (child.nodeType === 1) i += 1;
410      }
411      return i;
412    }
413    return undefined;
414  }
415  function elementParents(el, selector) {
416    const parents = []; // eslint-disable-line
417    let parent = el.parentElement; // eslint-disable-line
418    while (parent) {
419      if (selector) {
420        if (parent.matches(selector)) parents.push(parent);
421      } else {
422        parents.push(parent);
423      }
424      parent = parent.parentElement;
425    }
426    return parents;
427  }
428  function elementTransitionEnd(el, callback) {
429    function fireCallBack(e) {
430      if (e.target !== el) return;
431      callback.call(el, e);
432      el.removeEventListener('transitionend', fireCallBack);
433    }
434    if (callback) {
435      el.addEventListener('transitionend', fireCallBack);
436    }
437  }
438  function elementOuterSize(el, size, includeMargins) {
439    const window = getWindow();
440    if (includeMargins) {
441      return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));
442    }
443    return el.offsetWidth;
444  }
445
446  let support;
447  function calcSupport() {
448    const window = getWindow();
449    const document = getDocument();
450    return {
451      smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,
452      touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)
453    };
454  }
455  function getSupport() {
456    if (!support) {
457      support = calcSupport();
458    }
459    return support;
460  }
461
462  let deviceCached;
463  function calcDevice(_temp) {
464    let {
465      userAgent
466    } = _temp === void 0 ? {} : _temp;
vendor: 6,614 bytes, lines 467-669
467    const support = getSupport();
468    const window = getWindow();
469    const platform = window.navigator.platform;
470    const ua = userAgent || window.navigator.userAgent;
471    const device = {
472      ios: false,
473      android: false
474    };
475    const screenWidth = window.screen.width;
476    const screenHeight = window.screen.height;
477    const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
478    let ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
479    const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
480    const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
481    const windows = platform === 'Win32';
482    let macos = platform === 'MacIntel';
483
484    // iPadOs 13 fix
485    const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
486    if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {
487      ipad = ua.match(/(Version)\/([\d.]+)/);
488      if (!ipad) ipad = [0, 1, '13_0_0'];
489      macos = false;
490    }
491
492    // Android
493    if (android && !windows) {
494      device.os = 'android';
495      device.android = true;
496    }
497    if (ipad || iphone || ipod) {
498      device.os = 'ios';
499      device.ios = true;
500    }
501
502    // Export object
503    return device;
504  }
505  function getDevice(overrides) {
506    if (overrides === void 0) {
507      overrides = {};
508    }
509    if (!deviceCached) {
510      deviceCached = calcDevice(overrides);
511    }
512    return deviceCached;
513  }
514
515  let browser;
516  function calcBrowser() {
517    const window = getWindow();
518    let needPerspectiveFix = false;
519    function isSafari() {
520      const ua = window.navigator.userAgent.toLowerCase();
521      return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;
522    }
523    if (isSafari()) {
524      const ua = String(window.navigator.userAgent);
525      if (ua.includes('Version/')) {
526        const [major, minor] = ua.split('Version/')[1].split(' ')[0].split('.').map(num => Number(num));
527        needPerspectiveFix = major < 16 || major === 16 && minor < 2;
528      }
529    }
530    return {
531      isSafari: needPerspectiveFix || isSafari(),
532      needPerspectiveFix,
533      isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)
534    };
535  }
536  function getBrowser() {
537    if (!browser) {
538      browser = calcBrowser();
539    }
540    return browser;
541  }
542
543  function Resize(_ref) {
544    let {
545      swiper,
546      on,
547      emit
548    } = _ref;
549    const window = getWindow();
550    let observer = null;
551    let animationFrame = null;
552    const resizeHandler = () => {
553      if (!swiper || swiper.destroyed || !swiper.initialized) return;
554      emit('beforeResize');
555      emit('resize');
556    };
557    const createObserver = () => {
558      if (!swiper || swiper.destroyed || !swiper.initialized) return;
559      observer = new ResizeObserver(entries => {
560        animationFrame = window.requestAnimationFrame(() => {
561          const {
562            width,
563            height
564          } = swiper;
565          let newWidth = width;
566          let newHeight = height;
567          entries.forEach(_ref2 => {
568            let {
569              contentBoxSize,
570              contentRect,
571              target
572            } = _ref2;
573            if (target && target !== swiper.el) return;
574            newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
575            newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
576          });
577          if (newWidth !== width || newHeight !== height) {
578            resizeHandler();
579          }
580        });
581      });
582      observer.observe(swiper.el);
583    };
584    const removeObserver = () => {
585      if (animationFrame) {
586        window.cancelAnimationFrame(animationFrame);
587      }
588      if (observer && observer.unobserve && swiper.el) {
589        observer.unobserve(swiper.el);
590        observer = null;
591      }
592    };
593    const orientationChangeHandler = () => {
594      if (!swiper || swiper.destroyed || !swiper.initialized) return;
595      emit('orientationchange');
596    };
597    on('init', () => {
598      if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {
599        createObserver();
600        return;
601      }
602      window.addEventListener('resize', resizeHandler);
603      window.addEventListener('orientationchange', orientationChangeHandler);
604    });
605    on('destroy', () => {
606      removeObserver();
607      window.removeEventListener('resize', resizeHandler);
608      window.removeEventListener('orientationchange', orientationChangeHandler);
609    });
610  }
611
612  function Observer(_ref) {
613    let {
614      swiper,
615      extendParams,
616      on,
617      emit
618    } = _ref;
619    const observers = [];
620    const window = getWindow();
621    const attach = function (target, options) {
622      if (options === void 0) {
623        options = {};
624      }
625      const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
626      const observer = new ObserverFunc(mutations => {
627        // The observerUpdate event should only be triggered
628        // once despite the number of mutations.  Additional
629        // triggers are redundant and are very costly
630        if (swiper.__preventObserver__) return;
631        if (mutations.length === 1) {
632          emit('observerUpdate', mutations[0]);
633          return;
634        }
635        const observerUpdate = function observerUpdate() {
636          emit('observerUpdate', mutations[0]);
637        };
638        if (window.requestAnimationFrame) {
639          window.requestAnimationFrame(observerUpdate);
640        } else {
641          window.setTimeout(observerUpdate, 0);
642        }
643      });
644      observer.observe(target, {
645        attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
646        childList: typeof options.childList === 'undefined' ? true : options.childList,
647        characterData: typeof options.characterData === 'undefined' ? true : options.characterData
648      });
649      observers.push(observer);
650    };
651    const init = () => {
652      if (!swiper.params.observer) return;
653      if (swiper.params.observeParents) {
654        const containerParents = elementParents(swiper.hostEl);
655        for (let i = 0; i < containerParents.length; i += 1) {
656          attach(containerParents[i]);
657        }
658      }
659      // Observe container
660      attach(swiper.hostEl, {
661        childList: swiper.params.observeSlideChildren
662      });
663
664      // Observe wrapper
665      attach(swiper.wrapperEl, {
666        attributes: false
667      });
668    };
669    const destroy = () => {
vendor: 4,990 bytes, lines 670-812
670      observers.forEach(observer => {
671        observer.disconnect();
672      });
673      observers.splice(0, observers.length);
674    };
675    extendParams({
676      observer: false,
677      observeParents: false,
678      observeSlideChildren: false
679    });
680    on('init', init);
681    on('destroy', destroy);
682  }
683
684  /* eslint-disable no-underscore-dangle */
685
686  var eventsEmitter = {
687    on(events, handler, priority) {
688      const self = this;
689      if (!self.eventsListeners || self.destroyed) return self;
690      if (typeof handler !== 'function') return self;
691      const method = priority ? 'unshift' : 'push';
692      events.split(' ').forEach(event => {
693        if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
694        self.eventsListeners[event][method](handler);
695      });
696      return self;
697    },
698    once(events, handler, priority) {
699      const self = this;
700      if (!self.eventsListeners || self.destroyed) return self;
701      if (typeof handler !== 'function') return self;
702      function onceHandler() {
703        self.off(events, onceHandler);
704        if (onceHandler.__emitterProxy) {
705          delete onceHandler.__emitterProxy;
706        }
707        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
708          args[_key] = arguments[_key];
709        }
710        handler.apply(self, args);
711      }
712      onceHandler.__emitterProxy = handler;
713      return self.on(events, onceHandler, priority);
714    },
715    onAny(handler, priority) {
716      const self = this;
717      if (!self.eventsListeners || self.destroyed) return self;
718      if (typeof handler !== 'function') return self;
719      const method = priority ? 'unshift' : 'push';
720      if (self.eventsAnyListeners.indexOf(handler) < 0) {
721        self.eventsAnyListeners[method](handler);
722      }
723      return self;
724    },
725    offAny(handler) {
726      const self = this;
727      if (!self.eventsListeners || self.destroyed) return self;
728      if (!self.eventsAnyListeners) return self;
729      const index = self.eventsAnyListeners.indexOf(handler);
730      if (index >= 0) {
731        self.eventsAnyListeners.splice(index, 1);
732      }
733      return self;
734    },
735    off(events, handler) {
736      const self = this;
737      if (!self.eventsListeners || self.destroyed) return self;
738      if (!self.eventsListeners) return self;
739      events.split(' ').forEach(event => {
740        if (typeof handler === 'undefined') {
741          self.eventsListeners[event] = [];
742        } else if (self.eventsListeners[event]) {
743          self.eventsListeners[event].forEach((eventHandler, index) => {
744            if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
745              self.eventsListeners[event].splice(index, 1);
746            }
747          });
748        }
749      });
750      return self;
751    },
752    emit() {
753      const self = this;
754      if (!self.eventsListeners || self.destroyed) return self;
755      if (!self.eventsListeners) return self;
756      let events;
757      let data;
758      let context;
759      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
760        args[_key2] = arguments[_key2];
761      }
762      if (typeof args[0] === 'string' || Array.isArray(args[0])) {
763        events = args[0];
764        data = args.slice(1, args.length);
765        context = self;
766      } else {
767        events = args[0].events;
768        data = args[0].data;
769        context = args[0].context || self;
770      }
771      data.unshift(context);
772      const eventsArray = Array.isArray(events) ? events : events.split(' ');
773      eventsArray.forEach(event => {
774        if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
775          self.eventsAnyListeners.forEach(eventHandler => {
776            eventHandler.apply(context, [event, ...data]);
777          });
778        }
779        if (self.eventsListeners && self.eventsListeners[event]) {
780          self.eventsListeners[event].forEach(eventHandler => {
781            eventHandler.apply(context, data);
782          });
783        }
784      });
785      return self;
786    }
787  };
788
789  function updateSize() {
790    const swiper = this;
791    let width;
792    let height;
793    const el = swiper.el;
794    if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {
795      width = swiper.params.width;
796    } else {
797      width = el.clientWidth;
798    }
799    if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {
800      height = swiper.params.height;
801    } else {
802      height = el.clientHeight;
803    }
804    if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
805      return;
806    }
807
808    // Subtract paddings
809    width = width - parseInt(elementStyle(el, 'padding-left') || 0, 10) - parseInt(elementStyle(el, 'padding-right') || 0, 10);
810    height = height - parseInt(elementStyle(el, 'padding-top') || 0, 10) - parseInt(elementStyle(el, 'padding-bottom') || 0, 10);
811    if (Number.isNaN(width)) width = 0;
812    if (Number.isNaN(height)) height = 0;
vendor: 8,689 bytes, lines 813-1022
813    Object.assign(swiper, {
814      width,
815      height,
816      size: swiper.isHorizontal() ? width : height
817    });
818  }
819
820  function updateSlides() {
821    const swiper = this;
822    function getDirectionPropertyValue(node, label) {
823      return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);
824    }
825    const params = swiper.params;
826    const {
827      wrapperEl,
828      slidesEl,
829      size: swiperSize,
830      rtlTranslate: rtl,
831      wrongRTL
832    } = swiper;
833    const isVirtual = swiper.virtual && params.virtual.enabled;
834    const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
835    const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);
836    const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
837    let snapGrid = [];
838    const slidesGrid = [];
839    const slidesSizesGrid = [];
840    let offsetBefore = params.slidesOffsetBefore;
841    if (typeof offsetBefore === 'function') {
842      offsetBefore = params.slidesOffsetBefore.call(swiper);
843    }
844    let offsetAfter = params.slidesOffsetAfter;
845    if (typeof offsetAfter === 'function') {
846      offsetAfter = params.slidesOffsetAfter.call(swiper);
847    }
848    const previousSnapGridLength = swiper.snapGrid.length;
849    const previousSlidesGridLength = swiper.slidesGrid.length;
850    let spaceBetween = params.spaceBetween;
851    let slidePosition = -offsetBefore;
852    let prevSlideSize = 0;
853    let index = 0;
854    if (typeof swiperSize === 'undefined') {
855      return;
856    }
857    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
858      spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;
859    } else if (typeof spaceBetween === 'string') {
860      spaceBetween = parseFloat(spaceBetween);
861    }
862    swiper.virtualSize = -spaceBetween;
863
864    // reset margins
865    slides.forEach(slideEl => {
866      if (rtl) {
867        slideEl.style.marginLeft = '';
868      } else {
869        slideEl.style.marginRight = '';
870      }
871      slideEl.style.marginBottom = '';
872      slideEl.style.marginTop = '';
873    });
874
875    // reset cssMode offsets
876    if (params.centeredSlides && params.cssMode) {
877      setCSSProperty(wrapperEl, '--swiper-centered-offset-before', '');
878      setCSSProperty(wrapperEl, '--swiper-centered-offset-after', '');
879    }
880    const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;
881    if (gridEnabled) {
882      swiper.grid.initSlides(slides);
883    } else if (swiper.grid) {
884      swiper.grid.unsetSlides();
885    }
886
887    // Calc slides
888    let slideSize;
889    const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {
890      return typeof params.breakpoints[key].slidesPerView !== 'undefined';
891    }).length > 0;
892    for (let i = 0; i < slidesLength; i += 1) {
893      slideSize = 0;
894      let slide;
895      if (slides[i]) slide = slides[i];
896      if (gridEnabled) {
897        swiper.grid.updateSlide(i, slide, slides);
898      }
899      if (slides[i] && elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line
900
901      if (params.slidesPerView === 'auto') {
902        if (shouldResetSlideSize) {
903          slides[i].style[swiper.getDirectionLabel('width')] = ``;
904        }
905        const slideStyles = getComputedStyle(slide);
906        const currentTransform = slide.style.transform;
907        const currentWebKitTransform = slide.style.webkitTransform;
908        if (currentTransform) {
909          slide.style.transform = 'none';
910        }
911        if (currentWebKitTransform) {
912          slide.style.webkitTransform = 'none';
913        }
914        if (params.roundLengths) {
915          slideSize = swiper.isHorizontal() ? elementOuterSize(slide, 'width', true) : elementOuterSize(slide, 'height', true);
916        } else {
917          // eslint-disable-next-line
918          const width = getDirectionPropertyValue(slideStyles, 'width');
919          const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');
920          const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');
921          const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');
922          const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');
923          const boxSizing = slideStyles.getPropertyValue('box-sizing');
924          if (boxSizing && boxSizing === 'border-box') {
925            slideSize = width + marginLeft + marginRight;
926          } else {
927            const {
928              clientWidth,
929              offsetWidth
930            } = slide;
931            slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
932          }
933        }
934        if (currentTransform) {
935          slide.style.transform = currentTransform;
936        }
937        if (currentWebKitTransform) {
938          slide.style.webkitTransform = currentWebKitTransform;
939        }
940        if (params.roundLengths) slideSize = Math.floor(slideSize);
941      } else {
942        slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
943        if (params.roundLengths) slideSize = Math.floor(slideSize);
944        if (slides[i]) {
945          slides[i].style[swiper.getDirectionLabel('width')] = `${slideSize}px`;
946        }
947      }
948      if (slides[i]) {
949        slides[i].swiperSlideSize = slideSize;
950      }
951      slidesSizesGrid.push(slideSize);
952      if (params.centeredSlides) {
953        slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
954        if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
955        if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
956        if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
957        if (params.roundLengths) slidePosition = Math.floor(slidePosition);
958        if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
959        slidesGrid.push(slidePosition);
960      } else {
961        if (params.roundLengths) slidePosition = Math.floor(slidePosition);
962        if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
963        slidesGrid.push(slidePosition);
964        slidePosition = slidePosition + slideSize + spaceBetween;
965      }
966      swiper.virtualSize += slideSize + spaceBetween;
967      prevSlideSize = slideSize;
968      index += 1;
969    }
970    swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
971    if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
972      wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;
973    }
974    if (params.setWrapperSize) {
975      wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;
976    }
977    if (gridEnabled) {
978      swiper.grid.updateWrapperSize(slideSize, snapGrid);
979    }
980
981    // Remove last grid elements depending on width
982    if (!params.centeredSlides) {
983      const newSlidesGrid = [];
984      for (let i = 0; i < snapGrid.length; i += 1) {
985        let slidesGridItem = snapGrid[i];
986        if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
987        if (snapGrid[i] <= swiper.virtualSize - swiperSize) {
988          newSlidesGrid.push(slidesGridItem);
989        }
990      }
991      snapGrid = newSlidesGrid;
992      if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
993        snapGrid.push(swiper.virtualSize - swiperSize);
994      }
995    }
996    if (isVirtual && params.loop) {
997      const size = slidesSizesGrid[0] + spaceBetween;
998      if (params.slidesPerGroup > 1) {
999        const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);
1000        const groupSize = size * params.slidesPerGroup;
1001        for (let i = 0; i < groups; i += 1) {
1002          snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);
1003        }
1004      }
1005      for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {
1006        if (params.slidesPerGroup === 1) {
1007          snapGrid.push(snapGrid[snapGrid.length - 1] + size);
1008        }
1009        slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);
1010        swiper.virtualSize += size;
1011      }
1012    }
1013    if (snapGrid.length === 0) snapGrid = [0];
1014    if (spaceBetween !== 0) {
1015      const key = swiper.isHorizontal() && rtl ? 'marginLeft' : swiper.getDirectionLabel('marginRight');
1016      slides.filter((_, slideIndex) => {
1017        if (!params.cssMode || params.loop) return true;
1018        if (slideIndex === slides.length - 1) {
1019          return false;
1020        }
1021        return true;
1022      }
vendor: 3,559 bytes, lines 1022-1113
1022).forEach(slideEl => {
1023        slideEl.style[key] = `${spaceBetween}px`;
1024      });
1025    }
1026    if (params.centeredSlides && params.centeredSlidesBounds) {
1027      let allSlidesSize = 0;
1028      slidesSizesGrid.forEach(slideSizeValue => {
1029        allSlidesSize += slideSizeValue + (spaceBetween || 0);
1030      });
1031      allSlidesSize -= spaceBetween;
1032      const maxSnap = allSlidesSize - swiperSize;
1033      snapGrid = snapGrid.map(snap => {
1034        if (snap <= 0) return -offsetBefore;
1035        if (snap > maxSnap) return maxSnap + offsetAfter;
1036        return snap;
1037      });
1038    }
1039    if (params.centerInsufficientSlides) {
1040      let allSlidesSize = 0;
1041      slidesSizesGrid.forEach(slideSizeValue => {
1042        allSlidesSize += slideSizeValue + (spaceBetween || 0);
1043      });
1044      allSlidesSize -= spaceBetween;
1045      if (allSlidesSize < swiperSize) {
1046        const allSlidesOffset = (swiperSize - allSlidesSize) / 2;
1047        snapGrid.forEach((snap, snapIndex) => {
1048          snapGrid[snapIndex] = snap - allSlidesOffset;
1049        });
1050        slidesGrid.forEach((snap, snapIndex) => {
1051          slidesGrid[snapIndex] = snap + allSlidesOffset;
1052        });
1053      }
1054    }
1055    Object.assign(swiper, {
1056      slides,
1057      snapGrid,
1058      slidesGrid,
1059      slidesSizesGrid
1060    });
1061    if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {
1062      setCSSProperty(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);
1063      setCSSProperty(wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);
1064      const addToSnapGrid = -swiper.snapGrid[0];
1065      const addToSlidesGrid = -swiper.slidesGrid[0];
1066      swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);
1067      swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);
1068    }
1069    if (slidesLength !== previousSlidesLength) {
1070      swiper.emit('slidesLengthChange');
1071    }
1072    if (snapGrid.length !== previousSnapGridLength) {
1073      if (swiper.params.watchOverflow) swiper.checkOverflow();
1074      swiper.emit('snapGridLengthChange');
1075    }
1076    if (slidesGrid.length !== previousSlidesGridLength) {
1077      swiper.emit('slidesGridLengthChange');
1078    }
1079    if (params.watchSlidesProgress) {
1080      swiper.updateSlidesOffset();
1081    }
1082    swiper.emit('slidesUpdated');
1083    if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {
1084      const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;
1085      const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);
1086      if (slidesLength <= params.maxBackfaceHiddenSlides) {
1087        if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);
1088      } else if (hasClassBackfaceClassAdded) {
1089        swiper.el.classList.remove(backFaceHiddenClass);
1090      }
1091    }
1092  }
1093
1094  function updateAutoHeight(speed) {
1095    const swiper = this;
1096    const activeSlides = [];
1097    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1098    let newHeight = 0;
1099    let i;
1100    if (typeof speed === 'number') {
1101      swiper.setTransition(speed);
1102    } else if (speed === true) {
1103      swiper.setTransition(swiper.params.speed);
1104    }
1105    const getSlideByIndex = index => {
1106      if (isVirtual) {
1107        return swiper.slides[swiper.getSlideIndexByData(index)];
1108      }
1109      return swiper.slides[index];
1110    };
1111    // Find slides currently in view
1112    if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
1113      if (swiper.params.centeredSlides) {
vendor: 1,816 bytes, lines 1114-1166
1114        (swiper.visibleSlides || []).forEach(slide => {
1115          activeSlides.push(slide);
1116        });
1117      } else {
1118        for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
1119          const index = swiper.activeIndex + i;
1120          if (index > swiper.slides.length && !isVirtual) break;
1121          activeSlides.push(getSlideByIndex(index));
1122        }
1123      }
1124    } else {
1125      activeSlides.push(getSlideByIndex(swiper.activeIndex));
1126    }
1127
1128    // Find new height from highest slide in view
1129    for (i = 0; i < activeSlides.length; i += 1) {
1130      if (typeof activeSlides[i] !== 'undefined') {
1131        const height = activeSlides[i].offsetHeight;
1132        newHeight = height > newHeight ? height : newHeight;
1133      }
1134    }
1135
1136    // Update Height
1137    if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;
1138  }
1139
1140  function updateSlidesOffset() {
1141    const swiper = this;
1142    const slides = swiper.slides;
1143    // eslint-disable-next-line
1144    const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;
1145    for (let i = 0; i < slides.length; i += 1) {
1146      slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();
1147    }
1148  }
1149
1150  function updateSlidesProgress(translate) {
1151    if (translate === void 0) {
1152      translate = this && this.translate || 0;
1153    }
1154    const swiper = this;
1155    const params = swiper.params;
1156    const {
1157      slides,
1158      rtlTranslate: rtl,
1159      snapGrid
1160    } = swiper;
1161    if (slides.length === 0) return;
1162    if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();
1163    let offsetCenter = -translate;
1164    if (rtl) offsetCenter = translate;
1165
1166    // Visible Slides
vendor: 4,685 bytes, lines 1167-1278
1167    slides.forEach(slideEl => {
1168      slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass);
1169    });
1170    swiper.visibleSlidesIndexes = [];
1171    swiper.visibleSlides = [];
1172    let spaceBetween = params.spaceBetween;
1173    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
1174      spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
1175    } else if (typeof spaceBetween === 'string') {
1176      spaceBetween = parseFloat(spaceBetween);
1177    }
1178    for (let i = 0; i < slides.length; i += 1) {
1179      const slide = slides[i];
1180      let slideOffset = slide.swiperSlideOffset;
1181      if (params.cssMode && params.centeredSlides) {
1182        slideOffset -= slides[0].swiperSlideOffset;
1183      }
1184      const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
1185      const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
1186      const slideBefore = -(offsetCenter - slideOffset);
1187      const slideAfter = slideBefore + swiper.slidesSizesGrid[i];
1188      const isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];
1189      const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
1190      if (isVisible) {
1191        swiper.visibleSlides.push(slide);
1192        swiper.visibleSlidesIndexes.push(i);
1193        slides[i].classList.add(params.slideVisibleClass);
1194      }
1195      if (isFullyVisible) {
1196        slides[i].classList.add(params.slideFullyVisibleClass);
1197      }
1198      slide.progress = rtl ? -slideProgress : slideProgress;
1199      slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;
1200    }
1201  }
1202
1203  function updateProgress(translate) {
1204    const swiper = this;
1205    if (typeof translate === 'undefined') {
1206      const multiplier = swiper.rtlTranslate ? -1 : 1;
1207      // eslint-disable-next-line
1208      translate = swiper && swiper.translate && swiper.translate * multiplier || 0;
1209    }
1210    const params = swiper.params;
1211    const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1212    let {
1213      progress,
1214      isBeginning,
1215      isEnd,
1216      progressLoop
1217    } = swiper;
1218    const wasBeginning = isBeginning;
1219    const wasEnd = isEnd;
1220    if (translatesDiff === 0) {
1221      progress = 0;
1222      isBeginning = true;
1223      isEnd = true;
1224    } else {
1225      progress = (translate - swiper.minTranslate()) / translatesDiff;
1226      const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;
1227      const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;
1228      isBeginning = isBeginningRounded || progress <= 0;
1229      isEnd = isEndRounded || progress >= 1;
1230      if (isBeginningRounded) progress = 0;
1231      if (isEndRounded) progress = 1;
1232    }
1233    if (params.loop) {
1234      const firstSlideIndex = swiper.getSlideIndexByData(0);
1235      const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);
1236      const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];
1237      const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];
1238      const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];
1239      const translateAbs = Math.abs(translate);
1240      if (translateAbs >= firstSlideTranslate) {
1241        progressLoop = (translateAbs - firstSlideTranslate) / translateMax;
1242      } else {
1243        progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;
1244      }
1245      if (progressLoop > 1) progressLoop -= 1;
1246    }
1247    Object.assign(swiper, {
1248      progress,
1249      progressLoop,
1250      isBeginning,
1251      isEnd
1252    });
1253    if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);
1254    if (isBeginning && !wasBeginning) {
1255      swiper.emit('reachBeginning toEdge');
1256    }
1257    if (isEnd && !wasEnd) {
1258      swiper.emit('reachEnd toEdge');
1259    }
1260    if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
1261      swiper.emit('fromEdge');
1262    }
1263    swiper.emit('progress', progress);
1264  }
1265
1266  function updateSlidesClasses() {
1267    const swiper = this;
1268    const {
1269      slides,
1270      params,
1271      slidesEl,
1272      activeIndex
1273    } = swiper;
1274    const isVirtual = swiper.virtual && params.virtual.enabled;
1275    const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
1276    const getFilteredSlide = selector => {
1277      return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];
1278    };
vendor: 8,839 bytes, lines 1279-1514
1279    slides.forEach(slideEl => {
1280      slideEl.classList.remove(params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
1281    });
1282    let activeSlide;
1283    let prevSlide;
1284    let nextSlide;
1285    if (isVirtual) {
1286      if (params.loop) {
1287        let slideIndex = activeIndex - swiper.virtual.slidesBefore;
1288        if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;
1289        if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;
1290        activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`);
1291      } else {
1292        activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`);
1293      }
1294    } else {
1295      if (gridEnabled) {
1296        activeSlide = slides.filter(slideEl => slideEl.column === activeIndex)[0];
1297        nextSlide = slides.filter(slideEl => slideEl.column === activeIndex + 1)[0];
1298        prevSlide = slides.filter(slideEl => slideEl.column === activeIndex - 1)[0];
1299      } else {
1300        activeSlide = slides[activeIndex];
1301      }
1302    }
1303    if (activeSlide) {
1304      // Active classes
1305      activeSlide.classList.add(params.slideActiveClass);
1306      if (gridEnabled) {
1307        if (nextSlide) {
1308          nextSlide.classList.add(params.slideNextClass);
1309        }
1310        if (prevSlide) {
1311          prevSlide.classList.add(params.slidePrevClass);
1312        }
1313      } else {
1314        // Next Slide
1315        nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1316        if (params.loop && !nextSlide) {
1317          nextSlide = slides[0];
1318        }
1319        if (nextSlide) {
1320          nextSlide.classList.add(params.slideNextClass);
1321        }
1322
1323        // Prev Slide
1324        prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1325        if (params.loop && !prevSlide === 0) {
1326          prevSlide = slides[slides.length - 1];
1327        }
1328        if (prevSlide) {
1329          prevSlide.classList.add(params.slidePrevClass);
1330        }
1331      }
1332    }
1333    swiper.emitSlidesClasses();
1334  }
1335
1336  const processLazyPreloader = (swiper, imageEl) => {
1337    if (!swiper || swiper.destroyed || !swiper.params) return;
1338    const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
1339    const slideEl = imageEl.closest(slideSelector());
1340    if (slideEl) {
1341      let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1342      if (!lazyEl && swiper.isElement) {
1343        if (slideEl.shadowRoot) {
1344          lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1345        } else {
1346          // init later
1347          requestAnimationFrame(() => {
1348            if (slideEl.shadowRoot) {
1349              lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1350              if (lazyEl) lazyEl.remove();
1351            }
1352          });
1353        }
1354      }
1355      if (lazyEl) lazyEl.remove();
1356    }
1357  };
1358  const unlazy = (swiper, index) => {
1359    if (!swiper.slides[index]) return;
1360    const imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
1361    if (imageEl) imageEl.removeAttribute('loading');
1362  };
1363  const preload = swiper => {
1364    if (!swiper || swiper.destroyed || !swiper.params) return;
1365    let amount = swiper.params.lazyPreloadPrevNext;
1366    const len = swiper.slides.length;
1367    if (!len || !amount || amount < 0) return;
1368    amount = Math.min(amount, len);
1369    const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
1370    const activeIndex = swiper.activeIndex;
1371    if (swiper.params.grid && swiper.params.grid.rows > 1) {
1372      const activeColumn = activeIndex;
1373      const preloadColumns = [activeColumn - amount];
1374      preloadColumns.push(...Array.from({
1375        length: amount
1376      }).map((_, i) => {
1377        return activeColumn + slidesPerView + i;
1378      }));
1379      swiper.slides.forEach((slideEl, i) => {
1380        if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);
1381      });
1382      return;
1383    }
1384    const slideIndexLastInView = activeIndex + slidesPerView - 1;
1385    if (swiper.params.rewind || swiper.params.loop) {
1386      for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
1387        const realIndex = (i % len + len) % len;
1388        if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);
1389      }
1390    } else {
1391      for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {
1392        if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {
1393          unlazy(swiper, i);
1394        }
1395      }
1396    }
1397  };
1398
1399  function getActiveIndexByTranslate(swiper) {
1400    const {
1401      slidesGrid,
1402      params
1403    } = swiper;
1404    const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1405    let activeIndex;
1406    for (let i = 0; i < slidesGrid.length; i += 1) {
1407      if (typeof slidesGrid[i + 1] !== 'undefined') {
1408        if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
1409          activeIndex = i;
1410        } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
1411          activeIndex = i + 1;
1412        }
1413      } else if (translate >= slidesGrid[i]) {
1414        activeIndex = i;
1415      }
1416    }
1417    // Normalize slideIndex
1418    if (params.normalizeSlideIndex) {
1419      if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
1420    }
1421    return activeIndex;
1422  }
1423  function updateActiveIndex(newActiveIndex) {
1424    const swiper = this;
1425    const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1426    const {
1427      snapGrid,
1428      params,
1429      activeIndex: previousIndex,
1430      realIndex: previousRealIndex,
1431      snapIndex: previousSnapIndex
1432    } = swiper;
1433    let activeIndex = newActiveIndex;
1434    let snapIndex;
1435    const getVirtualRealIndex = aIndex => {
1436      let realIndex = aIndex - swiper.virtual.slidesBefore;
1437      if (realIndex < 0) {
1438        realIndex = swiper.virtual.slides.length + realIndex;
1439      }
1440      if (realIndex >= swiper.virtual.slides.length) {
1441        realIndex -= swiper.virtual.slides.length;
1442      }
1443      return realIndex;
1444    };
1445    if (typeof activeIndex === 'undefined') {
1446      activeIndex = getActiveIndexByTranslate(swiper);
1447    }
1448    if (snapGrid.indexOf(translate) >= 0) {
1449      snapIndex = snapGrid.indexOf(translate);
1450    } else {
1451      const skip = Math.min(params.slidesPerGroupSkip, activeIndex);
1452      snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
1453    }
1454    if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
1455    if (activeIndex === previousIndex && !swiper.params.loop) {
1456      if (snapIndex !== previousSnapIndex) {
1457        swiper.snapIndex = snapIndex;
1458        swiper.emit('snapIndexChange');
1459      }
1460      return;
1461    }
1462    if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
1463      swiper.realIndex = getVirtualRealIndex(activeIndex);
1464      return;
1465    }
1466    const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
1467
1468    // Get real index
1469    let realIndex;
1470    if (swiper.virtual && params.virtual.enabled && params.loop) {
1471      realIndex = getVirtualRealIndex(activeIndex);
1472    } else if (gridEnabled) {
1473      const firstSlideInColumn = swiper.slides.filter(slideEl => slideEl.column === activeIndex)[0];
1474      let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute('data-swiper-slide-index'), 10);
1475      if (Number.isNaN(activeSlideIndex)) {
1476        activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);
1477      }
1478      realIndex = Math.floor(activeSlideIndex / params.grid.rows);
1479    } else if (swiper.slides[activeIndex]) {
1480      const slideIndex = swiper.slides[activeIndex].getAttribute('data-swiper-slide-index');
1481      if (slideIndex) {
1482        realIndex = parseInt(slideIndex, 10);
1483      } else {
1484        realIndex = activeIndex;
1485      }
1486    } else {
1487      realIndex = activeIndex;
1488    }
1489    Object.assign(swiper, {
1490      previousSnapIndex,
1491      snapIndex,
1492      previousRealIndex,
1493      realIndex,
1494      previousIndex,
1495      activeIndex
1496    });
1497    if (swiper.initialized) {
1498      preload(swiper);
1499    }
1500    swiper.emit('activeIndexChange');
1501    swiper.emit('snapIndexChange');
1502    if (swiper.initialized || swiper.params.runCallbacksOnInit) {
1503      if (previousRealIndex !== realIndex) {
1504        swiper.emit('realIndexChange');
1505      }
1506      swiper.emit('slideChange');
1507    }
1508  }
1509
1510  function updateClickedSlide(el, path) {
1511    const swiper = this;
1512    const params = swiper.params;
1513    let slide = el.closest(`.${params.slideClass}, swiper-slide`);
1514    if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) {
vendor: 29,715 bytes, lines 1515-2371
1515      [...path.slice(path.indexOf(el) + 1, path.length)].forEach(pathEl => {
1516        if (!slide && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {
1517          slide = pathEl;
1518        }
1519      });
1520    }
1521    let slideFound = false;
1522    let slideIndex;
1523    if (slide) {
1524      for (let i = 0; i < swiper.slides.length; i += 1) {
1525        if (swiper.slides[i] === slide) {
1526          slideFound = true;
1527          slideIndex = i;
1528          break;
1529        }
1530      }
1531    }
1532    if (slide && slideFound) {
1533      swiper.clickedSlide = slide;
1534      if (swiper.virtual && swiper.params.virtual.enabled) {
1535        swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);
1536      } else {
1537        swiper.clickedIndex = slideIndex;
1538      }
1539    } else {
1540      swiper.clickedSlide = undefined;
1541      swiper.clickedIndex = undefined;
1542      return;
1543    }
1544    if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
1545      swiper.slideToClickedSlide();
1546    }
1547  }
1548
1549  var update = {
1550    updateSize,
1551    updateSlides,
1552    updateAutoHeight,
1553    updateSlidesOffset,
1554    updateSlidesProgress,
1555    updateProgress,
1556    updateSlidesClasses,
1557    updateActiveIndex,
1558    updateClickedSlide
1559  };
1560
1561  function getSwiperTranslate(axis) {
1562    if (axis === void 0) {
1563      axis = this.isHorizontal() ? 'x' : 'y';
1564    }
1565    const swiper = this;
1566    const {
1567      params,
1568      rtlTranslate: rtl,
1569      translate,
1570      wrapperEl
1571    } = swiper;
1572    if (params.virtualTranslate) {
1573      return rtl ? -translate : translate;
1574    }
1575    if (params.cssMode) {
1576      return translate;
1577    }
1578    let currentTranslate = getTranslate(wrapperEl, axis);
1579    currentTranslate += swiper.cssOverflowAdjustment();
1580    if (rtl) currentTranslate = -currentTranslate;
1581    return currentTranslate || 0;
1582  }
1583
1584  function setTranslate(translate, byController) {
1585    const swiper = this;
1586    const {
1587      rtlTranslate: rtl,
1588      params,
1589      wrapperEl,
1590      progress
1591    } = swiper;
1592    let x = 0;
1593    let y = 0;
1594    const z = 0;
1595    if (swiper.isHorizontal()) {
1596      x = rtl ? -translate : translate;
1597    } else {
1598      y = translate;
1599    }
1600    if (params.roundLengths) {
1601      x = Math.floor(x);
1602      y = Math.floor(y);
1603    }
1604    swiper.previousTranslate = swiper.translate;
1605    swiper.translate = swiper.isHorizontal() ? x : y;
1606    if (params.cssMode) {
1607      wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
1608    } else if (!params.virtualTranslate) {
1609      if (swiper.isHorizontal()) {
1610        x -= swiper.cssOverflowAdjustment();
1611      } else {
1612        y -= swiper.cssOverflowAdjustment();
1613      }
1614      wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
1615    }
1616
1617    // Check if we need to update progress
1618    let newProgress;
1619    const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1620    if (translatesDiff === 0) {
1621      newProgress = 0;
1622    } else {
1623      newProgress = (translate - swiper.minTranslate()) / translatesDiff;
1624    }
1625    if (newProgress !== progress) {
1626      swiper.updateProgress(translate);
1627    }
1628    swiper.emit('setTranslate', swiper.translate, byController);
1629  }
1630
1631  function minTranslate() {
1632    return -this.snapGrid[0];
1633  }
1634
1635  function maxTranslate() {
1636    return -this.snapGrid[this.snapGrid.length - 1];
1637  }
1638
1639  function translateTo(translate, speed, runCallbacks, translateBounds, internal) {
1640    if (translate === void 0) {
1641      translate = 0;
1642    }
1643    if (speed === void 0) {
1644      speed = this.params.speed;
1645    }
1646    if (runCallbacks === void 0) {
1647      runCallbacks = true;
1648    }
1649    if (translateBounds === void 0) {
1650      translateBounds = true;
1651    }
1652    const swiper = this;
1653    const {
1654      params,
1655      wrapperEl
1656    } = swiper;
1657    if (swiper.animating && params.preventInteractionOnTransition) {
1658      return false;
1659    }
1660    const minTranslate = swiper.minTranslate();
1661    const maxTranslate = swiper.maxTranslate();
1662    let newTranslate;
1663    if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;
1664
1665    // Update progress
1666    swiper.updateProgress(newTranslate);
1667    if (params.cssMode) {
1668      const isH = swiper.isHorizontal();
1669      if (speed === 0) {
1670        wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
1671      } else {
1672        if (!swiper.support.smoothScroll) {
1673          animateCSSModeScroll({
1674            swiper,
1675            targetPosition: -newTranslate,
1676            side: isH ? 'left' : 'top'
1677          });
1678          return true;
1679        }
1680        wrapperEl.scrollTo({
1681          [isH ? 'left' : 'top']: -newTranslate,
1682          behavior: 'smooth'
1683        });
1684      }
1685      return true;
1686    }
1687    if (speed === 0) {
1688      swiper.setTransition(0);
1689      swiper.setTranslate(newTranslate);
1690      if (runCallbacks) {
1691        swiper.emit('beforeTransitionStart', speed, internal);
1692        swiper.emit('transitionEnd');
1693      }
1694    } else {
1695      swiper.setTransition(speed);
1696      swiper.setTranslate(newTranslate);
1697      if (runCallbacks) {
1698        swiper.emit('beforeTransitionStart', speed, internal);
1699        swiper.emit('transitionStart');
1700      }
1701      if (!swiper.animating) {
1702        swiper.animating = true;
1703        if (!swiper.onTranslateToWrapperTransitionEnd) {
1704          swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
1705            if (!swiper || swiper.destroyed) return;
1706            if (e.target !== this) return;
1707            swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1708            swiper.onTranslateToWrapperTransitionEnd = null;
1709            delete swiper.onTranslateToWrapperTransitionEnd;
1710            if (runCallbacks) {
1711              swiper.emit('transitionEnd');
1712            }
1713          };
1714        }
1715        swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1716      }
1717    }
1718    return true;
1719  }
1720
1721  var translate = {
1722    getTranslate: getSwiperTranslate,
1723    setTranslate,
1724    minTranslate,
1725    maxTranslate,
1726    translateTo
1727  };
1728
1729  function setTransition(duration, byController) {
1730    const swiper = this;
1731    if (!swiper.params.cssMode) {
1732      swiper.wrapperEl.style.transitionDuration = `${duration}ms`;
1733      swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : '';
1734    }
1735    swiper.emit('setTransition', duration, byController);
1736  }
1737
1738  function transitionEmit(_ref) {
1739    let {
1740      swiper,
1741      runCallbacks,
1742      direction,
1743      step
1744    } = _ref;
1745    const {
1746      activeIndex,
1747      previousIndex
1748    } = swiper;
1749    let dir = direction;
1750    if (!dir) {
1751      if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
1752    }
1753    swiper.emit(`transition${step}`);
1754    if (runCallbacks && activeIndex !== previousIndex) {
1755      if (dir === 'reset') {
1756        swiper.emit(`slideResetTransition${step}`);
1757        return;
1758      }
1759      swiper.emit(`slideChangeTransition${step}`);
1760      if (dir === 'next') {
1761        swiper.emit(`slideNextTransition${step}`);
1762      } else {
1763        swiper.emit(`slidePrevTransition${step}`);
1764      }
1765    }
1766  }
1767
1768  function transitionStart(runCallbacks, direction) {
1769    if (runCallbacks === void 0) {
1770      runCallbacks = true;
1771    }
1772    const swiper = this;
1773    const {
1774      params
1775    } = swiper;
1776    if (params.cssMode) return;
1777    if (params.autoHeight) {
1778      swiper.updateAutoHeight();
1779    }
1780    transitionEmit({
1781      swiper,
1782      runCallbacks,
1783      direction,
1784      step: 'Start'
1785    });
1786  }
1787
1788  function transitionEnd(runCallbacks, direction) {
1789    if (runCallbacks === void 0) {
1790      runCallbacks = true;
1791    }
1792    const swiper = this;
1793    const {
1794      params
1795    } = swiper;
1796    swiper.animating = false;
1797    if (params.cssMode) return;
1798    swiper.setTransition(0);
1799    transitionEmit({
1800      swiper,
1801      runCallbacks,
1802      direction,
1803      step: 'End'
1804    });
1805  }
1806
1807  var transition = {
1808    setTransition,
1809    transitionStart,
1810    transitionEnd
1811  };
1812
1813  function slideTo(index, speed, runCallbacks, internal, initial) {
1814    if (index === void 0) {
1815      index = 0;
1816    }
1817    if (speed === void 0) {
1818      speed = this.params.speed;
1819    }
1820    if (runCallbacks === void 0) {
1821      runCallbacks = true;
1822    }
1823    if (typeof index === 'string') {
1824      index = parseInt(index, 10);
1825    }
1826    const swiper = this;
1827    let slideIndex = index;
1828    if (slideIndex < 0) slideIndex = 0;
1829    const {
1830      params,
1831      snapGrid,
1832      slidesGrid,
1833      previousIndex,
1834      activeIndex,
1835      rtlTranslate: rtl,
1836      wrapperEl,
1837      enabled
1838    } = swiper;
1839    if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {
1840      return false;
1841    }
1842    const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
1843    let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
1844    if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
1845    const translate = -snapGrid[snapIndex];
1846    // Normalize slideIndex
1847    if (params.normalizeSlideIndex) {
1848      for (let i = 0; i < slidesGrid.length; i += 1) {
1849        const normalizedTranslate = -Math.floor(translate * 100);
1850        const normalizedGrid = Math.floor(slidesGrid[i] * 100);
1851        const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
1852        if (typeof slidesGrid[i + 1] !== 'undefined') {
1853          if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {
1854            slideIndex = i;
1855          } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {
1856            slideIndex = i + 1;
1857          }
1858        } else if (normalizedTranslate >= normalizedGrid) {
1859          slideIndex = i;
1860        }
1861      }
1862    }
1863    // Directions locks
1864    if (swiper.initialized && slideIndex !== activeIndex) {
1865      if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {
1866        return false;
1867      }
1868      if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
1869        if ((activeIndex || 0) !== slideIndex) {
1870          return false;
1871        }
1872      }
1873    }
1874    if (slideIndex !== (previousIndex || 0) && runCallbacks) {
1875      swiper.emit('beforeSlideChangeStart');
1876    }
1877
1878    // Update progress
1879    swiper.updateProgress(translate);
1880    let direction;
1881    if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';
1882
1883    // Update Index
1884    if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {
1885      swiper.updateActiveIndex(slideIndex);
1886      // Update Height
1887      if (params.autoHeight) {
1888        swiper.updateAutoHeight();
1889      }
1890      swiper.updateSlidesClasses();
1891      if (params.effect !== 'slide') {
1892        swiper.setTranslate(translate);
1893      }
1894      if (direction !== 'reset') {
1895        swiper.transitionStart(runCallbacks, direction);
1896        swiper.transitionEnd(runCallbacks, direction);
1897      }
1898      return false;
1899    }
1900    if (params.cssMode) {
1901      const isH = swiper.isHorizontal();
1902      const t = rtl ? translate : -translate;
1903      if (speed === 0) {
1904        const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1905        if (isVirtual) {
1906          swiper.wrapperEl.style.scrollSnapType = 'none';
1907          swiper._immediateVirtual = true;
1908        }
1909        if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {
1910          swiper._cssModeVirtualInitialSet = true;
1911          requestAnimationFrame(() => {
1912            wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
1913          });
1914        } else {
1915          wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
1916        }
1917        if (isVirtual) {
1918          requestAnimationFrame(() => {
1919            swiper.wrapperEl.style.scrollSnapType = '';
1920            swiper._immediateVirtual = false;
1921          });
1922        }
1923      } else {
1924        if (!swiper.support.smoothScroll) {
1925          animateCSSModeScroll({
1926            swiper,
1927            targetPosition: t,
1928            side: isH ? 'left' : 'top'
1929          });
1930          return true;
1931        }
1932        wrapperEl.scrollTo({
1933          [isH ? 'left' : 'top']: t,
1934          behavior: 'smooth'
1935        });
1936      }
1937      return true;
1938    }
1939    swiper.setTransition(speed);
1940    swiper.setTranslate(translate);
1941    swiper.updateActiveIndex(slideIndex);
1942    swiper.updateSlidesClasses();
1943    swiper.emit('beforeTransitionStart', speed, internal);
1944    swiper.transitionStart(runCallbacks, direction);
1945    if (speed === 0) {
1946      swiper.transitionEnd(runCallbacks, direction);
1947    } else if (!swiper.animating) {
1948      swiper.animating = true;
1949      if (!swiper.onSlideToWrapperTransitionEnd) {
1950        swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
1951          if (!swiper || swiper.destroyed) return;
1952          if (e.target !== this) return;
1953          swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
1954          swiper.onSlideToWrapperTransitionEnd = null;
1955          delete swiper.onSlideToWrapperTransitionEnd;
1956          swiper.transitionEnd(runCallbacks, direction);
1957        };
1958      }
1959      swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
1960    }
1961    return true;
1962  }
1963
1964  function slideToLoop(index, speed, runCallbacks, internal) {
1965    if (index === void 0) {
1966      index = 0;
1967    }
1968    if (speed === void 0) {
1969      speed = this.params.speed;
1970    }
1971    if (runCallbacks === void 0) {
1972      runCallbacks = true;
1973    }
1974    if (typeof index === 'string') {
1975      const indexAsNumber = parseInt(index, 10);
1976      index = indexAsNumber;
1977    }
1978    const swiper = this;
1979    const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
1980    let newIndex = index;
1981    if (swiper.params.loop) {
1982      if (swiper.virtual && swiper.params.virtual.enabled) {
1983        // eslint-disable-next-line
1984        newIndex = newIndex + swiper.virtual.slidesBefore;
1985      } else {
1986        let targetSlideIndex;
1987        if (gridEnabled) {
1988          const slideIndex = newIndex * swiper.params.grid.rows;
1989          targetSlideIndex = swiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex)[0].column;
1990        } else {
1991          targetSlideIndex = swiper.getSlideIndexByData(newIndex);
1992        }
1993        const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;
1994        const {
1995          centeredSlides
1996        } = swiper.params;
1997        let slidesPerView = swiper.params.slidesPerView;
1998        if (slidesPerView === 'auto') {
1999          slidesPerView = swiper.slidesPerViewDynamic();
2000        } else {
2001          slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
2002          if (centeredSlides && slidesPerView % 2 === 0) {
2003            slidesPerView = slidesPerView + 1;
2004          }
2005        }
2006        let needLoopFix = cols - targetSlideIndex < slidesPerView;
2007        if (centeredSlides) {
2008          needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
2009        }
2010        if (needLoopFix) {
2011          const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';
2012          swiper.loopFix({
2013            direction,
2014            slideTo: true,
2015            activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
2016            slideRealIndex: direction === 'next' ? swiper.realIndex : undefined
2017          });
2018        }
2019        if (gridEnabled) {
2020          const slideIndex = newIndex * swiper.params.grid.rows;
2021          newIndex = swiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex)[0].column;
2022        } else {
2023          newIndex = swiper.getSlideIndexByData(newIndex);
2024        }
2025      }
2026    }
2027    requestAnimationFrame(() => {
2028      swiper.slideTo(newIndex, speed, runCallbacks, internal);
2029    });
2030    return swiper;
2031  }
2032
2033  /* eslint no-unused-vars: "off" */
2034  function slideNext(speed, runCallbacks, internal) {
2035    if (speed === void 0) {
2036      speed = this.params.speed;
2037    }
2038    if (runCallbacks === void 0) {
2039      runCallbacks = true;
2040    }
2041    const swiper = this;
2042    const {
2043      enabled,
2044      params,
2045      animating
2046    } = swiper;
2047    if (!enabled) return swiper;
2048    let perGroup = params.slidesPerGroup;
2049    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
2050      perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);
2051    }
2052    const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
2053    const isVirtual = swiper.virtual && params.virtual.enabled;
2054    if (params.loop) {
2055      if (animating && !isVirtual && params.loopPreventsSliding) return false;
2056      swiper.loopFix({
2057        direction: 'next'
2058      });
2059      // eslint-disable-next-line
2060      swiper._clientLeft = swiper.wrapperEl.clientLeft;
2061      if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {
2062        requestAnimationFrame(() => {
2063          swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2064        });
2065        return true;
2066      }
2067    }
2068    if (params.rewind && swiper.isEnd) {
2069      return swiper.slideTo(0, speed, runCallbacks, internal);
2070    }
2071    return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2072  }
2073
2074  /* eslint no-unused-vars: "off" */
2075  function slidePrev(speed, runCallbacks, internal) {
2076    if (speed === void 0) {
2077      speed = this.params.speed;
2078    }
2079    if (runCallbacks === void 0) {
2080      runCallbacks = true;
2081    }
2082    const swiper = this;
2083    const {
2084      params,
2085      snapGrid,
2086      slidesGrid,
2087      rtlTranslate,
2088      enabled,
2089      animating
2090    } = swiper;
2091    if (!enabled) return swiper;
2092    const isVirtual = swiper.virtual && params.virtual.enabled;
2093    if (params.loop) {
2094      if (animating && !isVirtual && params.loopPreventsSliding) return false;
2095      swiper.loopFix({
2096        direction: 'prev'
2097      });
2098      // eslint-disable-next-line
2099      swiper._clientLeft = swiper.wrapperEl.clientLeft;
2100    }
2101    const translate = rtlTranslate ? swiper.translate : -swiper.translate;
2102    function normalize(val) {
2103      if (val < 0) return -Math.floor(Math.abs(val));
2104      return Math.floor(val);
2105    }
2106    const normalizedTranslate = normalize(translate);
2107    const normalizedSnapGrid = snapGrid.map(val => normalize(val));
2108    let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
2109    if (typeof prevSnap === 'undefined' && params.cssMode) {
2110      let prevSnapIndex;
2111      snapGrid.forEach((snap, snapIndex) => {
2112        if (normalizedTranslate >= snap) {
2113          // prevSnap = snap;
2114          prevSnapIndex = snapIndex;
2115        }
2116      });
2117      if (typeof prevSnapIndex !== 'undefined') {
2118        prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
2119      }
2120    }
2121    let prevIndex = 0;
2122    if (typeof prevSnap !== 'undefined') {
2123      prevIndex = slidesGrid.indexOf(prevSnap);
2124      if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
2125      if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
2126        prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;
2127        prevIndex = Math.max(prevIndex, 0);
2128      }
2129    }
2130    if (params.rewind && swiper.isBeginning) {
2131      const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
2132      return swiper.slideTo(lastIndex, speed, runCallbacks, internal);
2133    } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {
2134      requestAnimationFrame(() => {
2135        swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2136      });
2137      return true;
2138    }
2139    return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2140  }
2141
2142  /* eslint no-unused-vars: "off" */
2143  function slideReset(speed, runCallbacks, internal) {
2144    if (speed === void 0) {
2145      speed = this.params.speed;
2146    }
2147    if (runCallbacks === void 0) {
2148      runCallbacks = true;
2149    }
2150    const swiper = this;
2151    return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
2152  }
2153
2154  /* eslint no-unused-vars: "off" */
2155  function slideToClosest(speed, runCallbacks, internal, threshold) {
2156    if (speed === void 0) {
2157      speed = this.params.speed;
2158    }
2159    if (runCallbacks === void 0) {
2160      runCallbacks = true;
2161    }
2162    if (threshold === void 0) {
2163      threshold = 0.5;
2164    }
2165    const swiper = this;
2166    let index = swiper.activeIndex;
2167    const skip = Math.min(swiper.params.slidesPerGroupSkip, index);
2168    const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
2169    const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
2170    if (translate >= swiper.snapGrid[snapIndex]) {
2171      // The current translate is on or after the current snap index, so the choice
2172      // is between the current index and the one after it.
2173      const currentSnap = swiper.snapGrid[snapIndex];
2174      const nextSnap = swiper.snapGrid[snapIndex + 1];
2175      if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {
2176        index += swiper.params.slidesPerGroup;
2177      }
2178    } else {
2179      // The current translate is before the current snap index, so the choice
2180      // is between the current index and the one before it.
2181      const prevSnap = swiper.snapGrid[snapIndex - 1];
2182      const currentSnap = swiper.snapGrid[snapIndex];
2183      if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {
2184        index -= swiper.params.slidesPerGroup;
2185      }
2186    }
2187    index = Math.max(index, 0);
2188    index = Math.min(index, swiper.slidesGrid.length - 1);
2189    return swiper.slideTo(index, speed, runCallbacks, internal);
2190  }
2191
2192  function slideToClickedSlide() {
2193    const swiper = this;
2194    const {
2195      params,
2196      slidesEl
2197    } = swiper;
2198    const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
2199    let slideToIndex = swiper.clickedIndex;
2200    let realIndex;
2201    const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;
2202    if (params.loop) {
2203      if (swiper.animating) return;
2204      realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
2205      if (params.centeredSlides) {
2206        if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {
2207          swiper.loopFix();
2208          slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2209          nextTick(() => {
2210            swiper.slideTo(slideToIndex);
2211          });
2212        } else {
2213          swiper.slideTo(slideToIndex);
2214        }
2215      } else if (slideToIndex > swiper.slides.length - slidesPerView) {
2216        swiper.loopFix();
2217        slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2218        nextTick(() => {
2219          swiper.slideTo(slideToIndex);
2220        });
2221      } else {
2222        swiper.slideTo(slideToIndex);
2223      }
2224    } else {
2225      swiper.slideTo(slideToIndex);
2226    }
2227  }
2228
2229  var slide = {
2230    slideTo,
2231    slideToLoop,
2232    slideNext,
2233    slidePrev,
2234    slideReset,
2235    slideToClosest,
2236    slideToClickedSlide
2237  };
2238
2239  function loopCreate(slideRealIndex) {
2240    const swiper = this;
2241    const {
2242      params,
2243      slidesEl
2244    } = swiper;
2245    if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
2246    const initSlides = () => {
2247      const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
2248      slides.forEach((el, index) => {
2249        el.setAttribute('data-swiper-slide-index', index);
2250      });
2251    };
2252    const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
2253    const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);
2254    const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;
2255    const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;
2256    const addBlankSlides = amountOfSlides => {
2257      for (let i = 0; i < amountOfSlides; i += 1) {
2258        const slideEl = swiper.isElement ? createElement('swiper-slide', [params.slideBlankClass]) : createElement('div', [params.slideClass, params.slideBlankClass]);
2259        swiper.slidesEl.append(slideEl);
2260      }
2261    };
2262    if (shouldFillGroup) {
2263      if (params.loopAddBlankSlides) {
2264        const slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup;
2265        addBlankSlides(slidesToAdd);
2266        swiper.recalcSlides();
2267        swiper.updateSlides();
2268      } else {
2269        showWarning('Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');
2270      }
2271      initSlides();
2272    } else if (shouldFillGrid) {
2273      if (params.loopAddBlankSlides) {
2274        const slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows;
2275        addBlankSlides(slidesToAdd);
2276        swiper.recalcSlides();
2277        swiper.updateSlides();
2278      } else {
2279        showWarning('Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');
2280      }
2281      initSlides();
2282    } else {
2283      initSlides();
2284    }
2285    swiper.loopFix({
2286      slideRealIndex,
2287      direction: params.centeredSlides ? undefined : 'next'
2288    });
2289  }
2290
2291  function loopFix(_temp) {
2292    let {
2293      slideRealIndex,
2294      slideTo = true,
2295      direction,
2296      setTranslate,
2297      activeSlideIndex,
2298      byController,
2299      byMousewheel
2300    } = _temp === void 0 ? {} : _temp;
2301    const swiper = this;
2302    if (!swiper.params.loop) return;
2303    swiper.emit('beforeLoopFix');
2304    const {
2305      slides,
2306      allowSlidePrev,
2307      allowSlideNext,
2308      slidesEl,
2309      params
2310    } = swiper;
2311    const {
2312      centeredSlides
2313    } = params;
2314    swiper.allowSlidePrev = true;
2315    swiper.allowSlideNext = true;
2316    if (swiper.virtual && params.virtual.enabled) {
2317      if (slideTo) {
2318        if (!params.centeredSlides && swiper.snapIndex === 0) {
2319          swiper.slideTo(swiper.virtual.slides.length, 0, false, true);
2320        } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {
2321          swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);
2322        } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {
2323          swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);
2324        }
2325      }
2326      swiper.allowSlidePrev = allowSlidePrev;
2327      swiper.allowSlideNext = allowSlideNext;
2328      swiper.emit('loopFix');
2329      return;
2330    }
2331    let slidesPerView = params.slidesPerView;
2332    if (slidesPerView === 'auto') {
2333      slidesPerView = swiper.slidesPerViewDynamic();
2334    } else {
2335      slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));
2336      if (centeredSlides && slidesPerView % 2 === 0) {
2337        slidesPerView = slidesPerView + 1;
2338      }
2339    }
2340    const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;
2341    let loopedSlides = slidesPerGroup;
2342    if (loopedSlides % slidesPerGroup !== 0) {
2343      loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;
2344    }
2345    loopedSlides += params.loopAdditionalSlides;
2346    swiper.loopedSlides = loopedSlides;
2347    const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
2348    if (slides.length < slidesPerView + loopedSlides) {
2349      showWarning('Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled and not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters');
2350    } else if (gridEnabled && params.grid.fill === 'row') {
2351      showWarning('Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`');
2352    }
2353    const prependSlidesIndexes = [];
2354    const appendSlidesIndexes = [];
2355    let activeIndex = swiper.activeIndex;
2356    if (typeof activeSlideIndex === 'undefined') {
2357      activeSlideIndex = swiper.getSlideIndex(slides.filter(el => el.classList.contains(params.slideActiveClass))[0]);
2358    } else {
2359      activeIndex = activeSlideIndex;
2360    }
2361    const isNext = direction === 'next' || !direction;
2362    const isPrev = direction === 'prev' || !direction;
2363    let slidesPrepended = 0;
2364    let slidesAppended = 0;
2365    const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;
2366    const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;
2367    const activeColIndexWithShift = activeColIndex + (centeredSlides && typeof setTranslate === 'undefined' ? -slidesPerView / 2 + 0.5 : 0);
2368    // prepend last slides before start
2369    if (activeColIndexWithShift < loopedSlides) {
2370      slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);
2371      for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {
vendor: 10,937 bytes, lines 2372-2670
2372        const index = i - Math.floor(i / cols) * cols;
2373        if (gridEnabled) {
2374          const colIndexToPrepend = cols - index - 1;
2375          for (let i = slides.length - 1; i >= 0; i -= 1) {
2376            if (slides[i].column === colIndexToPrepend) prependSlidesIndexes.push(i);
2377          }
2378          // slides.forEach((slide, slideIndex) => {
2379          //   if (slide.column === colIndexToPrepend) prependSlidesIndexes.push(slideIndex);
2380          // });
2381        } else {
2382          prependSlidesIndexes.push(cols - index - 1);
2383        }
2384      }
2385    } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {
2386      slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);
2387      for (let i = 0; i < slidesAppended; i += 1) {
2388        const index = i - Math.floor(i / cols) * cols;
2389        if (gridEnabled) {
2390          slides.forEach((slide, slideIndex) => {
2391            if (slide.column === index) appendSlidesIndexes.push(slideIndex);
2392          });
2393        } else {
2394          appendSlidesIndexes.push(index);
2395        }
2396      }
2397    }
2398    swiper.__preventObserver__ = true;
2399    requestAnimationFrame(() => {
2400      swiper.__preventObserver__ = false;
2401    });
2402    if (isPrev) {
2403      prependSlidesIndexes.forEach(index => {
2404        slides[index].swiperLoopMoveDOM = true;
2405        slidesEl.prepend(slides[index]);
2406        slides[index].swiperLoopMoveDOM = false;
2407      });
2408    }
2409    if (isNext) {
2410      appendSlidesIndexes.forEach(index => {
2411        slides[index].swiperLoopMoveDOM = true;
2412        slidesEl.append(slides[index]);
2413        slides[index].swiperLoopMoveDOM = false;
2414      });
2415    }
2416    swiper.recalcSlides();
2417    if (params.slidesPerView === 'auto') {
2418      swiper.updateSlides();
2419    } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) {
2420      swiper.slides.forEach((slide, slideIndex) => {
2421        swiper.grid.updateSlide(slideIndex, slide, swiper.slides);
2422      });
2423    }
2424    if (params.watchSlidesProgress) {
2425      swiper.updateSlidesOffset();
2426    }
2427    if (slideTo) {
2428      if (prependSlidesIndexes.length > 0 && isPrev) {
2429        if (typeof slideRealIndex === 'undefined') {
2430          const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2431          const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];
2432          const diff = newSlideTranslate - currentSlideTranslate;
2433          if (byMousewheel) {
2434            swiper.setTranslate(swiper.translate - diff);
2435          } else {
2436            swiper.slideTo(activeIndex + slidesPrepended, 0, false, true);
2437            if (setTranslate) {
2438              swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
2439              swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
2440            }
2441          }
2442        } else {
2443          if (setTranslate) {
2444            const shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length;
2445            swiper.slideTo(swiper.activeIndex + shift, 0, false, true);
2446            swiper.touchEventsData.currentTranslate = swiper.translate;
2447          }
2448        }
2449      } else if (appendSlidesIndexes.length > 0 && isNext) {
2450        if (typeof slideRealIndex === 'undefined') {
2451          const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2452          const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];
2453          const diff = newSlideTranslate - currentSlideTranslate;
2454          if (byMousewheel) {
2455            swiper.setTranslate(swiper.translate - diff);
2456          } else {
2457            swiper.slideTo(activeIndex - slidesAppended, 0, false, true);
2458            if (setTranslate) {
2459              swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
2460              swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
2461            }
2462          }
2463        } else {
2464          const shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length;
2465          swiper.slideTo(swiper.activeIndex - shift, 0, false, true);
2466        }
2467      }
2468    }
2469    swiper.allowSlidePrev = allowSlidePrev;
2470    swiper.allowSlideNext = allowSlideNext;
2471    if (swiper.controller && swiper.controller.control && !byController) {
2472      const loopParams = {
2473        slideRealIndex,
2474        direction,
2475        setTranslate,
2476        activeSlideIndex,
2477        byController: true
2478      };
2479      if (Array.isArray(swiper.controller.control)) {
2480        swiper.controller.control.forEach(c => {
2481          if (!c.destroyed && c.params.loop) c.loopFix({
2482            ...loopParams,
2483            slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false
2484          });
2485        });
2486      } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {
2487        swiper.controller.control.loopFix({
2488          ...loopParams,
2489          slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false
2490        });
2491      }
2492    }
2493    swiper.emit('loopFix');
2494  }
2495
2496  function loopDestroy() {
2497    const swiper = this;
2498    const {
2499      params,
2500      slidesEl
2501    } = swiper;
2502    if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
2503    swiper.recalcSlides();
2504    const newSlidesOrder = [];
2505    swiper.slides.forEach(slideEl => {
2506      const index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;
2507      newSlidesOrder[index] = slideEl;
2508    });
2509    swiper.slides.forEach(slideEl => {
2510      slideEl.removeAttribute('data-swiper-slide-index');
2511    });
2512    newSlidesOrder.forEach(slideEl => {
2513      slidesEl.append(slideEl);
2514    });
2515    swiper.recalcSlides();
2516    swiper.slideTo(swiper.realIndex, 0);
2517  }
2518
2519  var loop = {
2520    loopCreate,
2521    loopFix,
2522    loopDestroy
2523  };
2524
2525  function setGrabCursor(moving) {
2526    const swiper = this;
2527    if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
2528    const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;
2529    if (swiper.isElement) {
2530      swiper.__preventObserver__ = true;
2531    }
2532    el.style.cursor = 'move';
2533    el.style.cursor = moving ? 'grabbing' : 'grab';
2534    if (swiper.isElement) {
2535      requestAnimationFrame(() => {
2536        swiper.__preventObserver__ = false;
2537      });
2538    }
2539  }
2540
2541  function unsetGrabCursor() {
2542    const swiper = this;
2543    if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
2544      return;
2545    }
2546    if (swiper.isElement) {
2547      swiper.__preventObserver__ = true;
2548    }
2549    swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';
2550    if (swiper.isElement) {
2551      requestAnimationFrame(() => {
2552        swiper.__preventObserver__ = false;
2553      });
2554    }
2555  }
2556
2557  var grabCursor = {
2558    setGrabCursor,
2559    unsetGrabCursor
2560  };
2561
2562  // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd
2563  function closestElement(selector, base) {
2564    if (base === void 0) {
2565      base = this;
2566    }
2567    function __closestFrom(el) {
2568      if (!el || el === getDocument() || el === getWindow()) return null;
2569      if (el.assignedSlot) el = el.assignedSlot;
2570      const found = el.closest(selector);
2571      if (!found && !el.getRootNode) {
2572        return null;
2573      }
2574      return found || __closestFrom(el.getRootNode().host);
2575    }
2576    return __closestFrom(base);
2577  }
2578  function preventEdgeSwipe(swiper, event, startX) {
2579    const window = getWindow();
2580    const {
2581      params
2582    } = swiper;
2583    const edgeSwipeDetection = params.edgeSwipeDetection;
2584    const edgeSwipeThreshold = params.edgeSwipeThreshold;
2585    if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
2586      if (edgeSwipeDetection === 'prevent') {
2587        event.preventDefault();
2588        return true;
2589      }
2590      return false;
2591    }
2592    return true;
2593  }
2594  function onTouchStart(event) {
2595    const swiper = this;
2596    const document = getDocument();
2597    let e = event;
2598    if (e.originalEvent) e = e.originalEvent;
2599    const data = swiper.touchEventsData;
2600    if (e.type === 'pointerdown') {
2601      if (data.pointerId !== null && data.pointerId !== e.pointerId) {
2602        return;
2603      }
2604      data.pointerId = e.pointerId;
2605    } else if (e.type === 'touchstart' && e.targetTouches.length === 1) {
2606      data.touchId = e.targetTouches[0].identifier;
2607    }
2608    if (e.type === 'touchstart') {
2609      // don't proceed touch event
2610      preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);
2611      return;
2612    }
2613    const {
2614      params,
2615      touches,
2616      enabled
2617    } = swiper;
2618    if (!enabled) return;
2619    if (!params.simulateTouch && e.pointerType === 'mouse') return;
2620    if (swiper.animating && params.preventInteractionOnTransition) {
2621      return;
2622    }
2623    if (!swiper.animating && params.cssMode && params.loop) {
2624      swiper.loopFix();
2625    }
2626    let targetEl = e.target;
2627    if (params.touchEventsTarget === 'wrapper') {
2628      if (!swiper.wrapperEl.contains(targetEl)) return;
2629    }
2630    if ('which' in e && e.which === 3) return;
2631    if ('button' in e && e.button > 0) return;
2632    if (data.isTouched && data.isMoved) return;
2633
2634    // change target el for shadow root component
2635    const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
2636    // eslint-disable-next-line
2637    const eventPath = e.composedPath ? e.composedPath() : e.path;
2638    if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
2639      targetEl = eventPath[0];
2640    }
2641    const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;
2642    const isTargetShadow = !!(e.target && e.target.shadowRoot);
2643
2644    // use closestElement for shadow root element to get the actual closest for nested shadow root element
2645    if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {
2646      swiper.allowClick = true;
2647      return;
2648    }
2649    if (params.swipeHandler) {
2650      if (!targetEl.closest(params.swipeHandler)) return;
2651    }
2652    touches.currentX = e.pageX;
2653    touches.currentY = e.pageY;
2654    const startX = touches.currentX;
2655    const startY = touches.currentY;
2656
2657    // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
2658
2659    if (!preventEdgeSwipe(swiper, e, startX)) {
2660      return;
2661    }
2662    Object.assign(data, {
2663      isTouched: true,
2664      isMoved: false,
2665      allowTouchCallbacks: true,
2666      isScrolling: undefined,
2667      startMoving: undefined
2668    });
2669    touches.startX = startX;
2670    touches.startY = startY;
vendor: 4,664 bytes, lines 2671-2800
2671    data.touchStartTime = now();
2672    swiper.allowClick = true;
2673    swiper.updateSize();
2674    swiper.swipeDirection = undefined;
2675    if (params.threshold > 0) data.allowThresholdMove = false;
2676    let preventDefault = true;
2677    if (targetEl.matches(data.focusableElements)) {
2678      preventDefault = false;
2679      if (targetEl.nodeName === 'SELECT') {
2680        data.isTouched = false;
2681      }
2682    }
2683    if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl) {
2684      document.activeElement.blur();
2685    }
2686    const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
2687    if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {
2688      e.preventDefault();
2689    }
2690    if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {
2691      swiper.freeMode.onTouchStart();
2692    }
2693    swiper.emit('touchStart', e);
2694  }
2695
2696  function onTouchMove(event) {
2697    const document = getDocument();
2698    const swiper = this;
2699    const data = swiper.touchEventsData;
2700    const {
2701      params,
2702      touches,
2703      rtlTranslate: rtl,
2704      enabled
2705    } = swiper;
2706    if (!enabled) return;
2707    if (!params.simulateTouch && event.pointerType === 'mouse') return;
2708    let e = event;
2709    if (e.originalEvent) e = e.originalEvent;
2710    if (e.type === 'pointermove') {
2711      if (data.touchId !== null) return; // return from pointer if we use touch
2712      const id = e.pointerId;
2713      if (id !== data.pointerId) return;
2714    }
2715    let targetTouch;
2716    if (e.type === 'touchmove') {
2717      targetTouch = [...e.changedTouches].filter(t => t.identifier === data.touchId)[0];
2718      if (!targetTouch || targetTouch.identifier !== data.touchId) return;
2719    } else {
2720      targetTouch = e;
2721    }
2722    if (!data.isTouched) {
2723      if (data.startMoving && data.isScrolling) {
2724        swiper.emit('touchMoveOpposite', e);
2725      }
2726      return;
2727    }
2728    const pageX = targetTouch.pageX;
2729    const pageY = targetTouch.pageY;
2730    if (e.preventedByNestedSwiper) {
2731      touches.startX = pageX;
2732      touches.startY = pageY;
2733      return;
2734    }
2735    if (!swiper.allowTouchMove) {
2736      if (!e.target.matches(data.focusableElements)) {
2737        swiper.allowClick = false;
2738      }
2739      if (data.isTouched) {
2740        Object.assign(touches, {
2741          startX: pageX,
2742          startY: pageY,
2743          currentX: pageX,
2744          currentY: pageY
2745        });
2746        data.touchStartTime = now();
2747      }
2748      return;
2749    }
2750    if (params.touchReleaseOnEdges && !params.loop) {
2751      if (swiper.isVertical()) {
2752        // Vertical
2753        if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
2754          data.isTouched = false;
2755          data.isMoved = false;
2756          return;
2757        }
2758      } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
2759        return;
2760      }
2761    }
2762    if (document.activeElement) {
2763      if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {
2764        data.isMoved = true;
2765        swiper.allowClick = false;
2766        return;
2767      }
2768    }
2769    if (data.allowTouchCallbacks) {
2770      swiper.emit('touchMove', e);
2771    }
2772    touches.previousX = touches.currentX;
2773    touches.previousY = touches.currentY;
2774    touches.currentX = pageX;
2775    touches.currentY = pageY;
2776    const diffX = touches.currentX - touches.startX;
2777    const diffY = touches.currentY - touches.startY;
2778    if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;
2779    if (typeof data.isScrolling === 'undefined') {
2780      let touchAngle;
2781      if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
2782        data.isScrolling = false;
2783      } else {
2784        // eslint-disable-next-line
2785        if (diffX * diffX + diffY * diffY >= 25) {
2786          touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
2787          data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
2788        }
2789      }
2790    }
2791    if (data.isScrolling) {
2792      swiper.emit('touchMoveOpposite', e);
2793    }
2794    if (typeof data.startMoving === 'undefined') {
2795      if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
2796        data.startMoving = true;
2797      }
2798    }
2799    if (data.isScrolling) {
2800      data.isTouched = false;
vendor: 7,161 bytes, lines 2801-2990
2801      return;
2802    }
2803    if (!data.startMoving) {
2804      return;
2805    }
2806    swiper.allowClick = false;
2807    if (!params.cssMode && e.cancelable) {
2808      e.preventDefault();
2809    }
2810    if (params.touchMoveStopPropagation && !params.nested) {
2811      e.stopPropagation();
2812    }
2813    let diff = swiper.isHorizontal() ? diffX : diffY;
2814    let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
2815    if (params.oneWayMovement) {
2816      diff = Math.abs(diff) * (rtl ? 1 : -1);
2817      touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
2818    }
2819    touches.diff = diff;
2820    diff *= params.touchRatio;
2821    if (rtl) {
2822      diff = -diff;
2823      touchesDiff = -touchesDiff;
2824    }
2825    const prevTouchesDirection = swiper.touchesDirection;
2826    swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
2827    swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';
2828    const isLoop = swiper.params.loop && !params.cssMode;
2829    const allowLoopFix = swiper.touchesDirection === 'next' && swiper.allowSlideNext || swiper.touchesDirection === 'prev' && swiper.allowSlidePrev;
2830    if (!data.isMoved) {
2831      if (isLoop && allowLoopFix) {
2832        swiper.loopFix({
2833          direction: swiper.swipeDirection
2834        });
2835      }
2836      data.startTranslate = swiper.getTranslate();
2837      swiper.setTransition(0);
2838      if (swiper.animating) {
2839        const evt = new window.CustomEvent('transitionend', {
2840          bubbles: true,
2841          cancelable: true
2842        });
2843        swiper.wrapperEl.dispatchEvent(evt);
2844      }
2845      data.allowMomentumBounce = false;
2846      // Grab Cursor
2847      if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2848        swiper.setGrabCursor(true);
2849      }
2850      swiper.emit('sliderFirstMove', e);
2851    }
2852    let loopFixed;
2853    new Date().getTime();
2854    if (data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {
2855      Object.assign(touches, {
2856        startX: pageX,
2857        startY: pageY,
2858        currentX: pageX,
2859        currentY: pageY,
2860        startTranslate: data.currentTranslate
2861      });
2862      data.loopSwapReset = true;
2863      data.startTranslate = data.currentTranslate;
2864      return;
2865    }
2866    swiper.emit('sliderMove', e);
2867    data.isMoved = true;
2868    data.currentTranslate = diff + data.startTranslate;
2869    let disableParentSwiper = true;
2870    let resistanceRatio = params.resistanceRatio;
2871    if (params.touchReleaseOnEdges) {
2872      resistanceRatio = 0;
2873    }
2874    if (diff > 0) {
2875      if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] : swiper.minTranslate())) {
2876        swiper.loopFix({
2877          direction: 'prev',
2878          setTranslate: true,
2879          activeSlideIndex: 0
2880        });
2881      }
2882      if (data.currentTranslate > swiper.minTranslate()) {
2883        disableParentSwiper = false;
2884        if (params.resistance) {
2885          data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
2886        }
2887      }
2888    } else if (diff < 0) {
2889      if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] : swiper.maxTranslate())) {
2890        swiper.loopFix({
2891          direction: 'next',
2892          setTranslate: true,
2893          activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
2894        });
2895      }
2896      if (data.currentTranslate < swiper.maxTranslate()) {
2897        disableParentSwiper = false;
2898        if (params.resistance) {
2899          data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
2900        }
2901      }
2902    }
2903    if (disableParentSwiper) {
2904      e.preventedByNestedSwiper = true;
2905    }
2906
2907    // Directions locks
2908    if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
2909      data.currentTranslate = data.startTranslate;
2910    }
2911    if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
2912      data.currentTranslate = data.startTranslate;
2913    }
2914    if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
2915      data.currentTranslate = data.startTranslate;
2916    }
2917
2918    // Threshold
2919    if (params.threshold > 0) {
2920      if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
2921        if (!data.allowThresholdMove) {
2922          data.allowThresholdMove = true;
2923          touches.startX = touches.currentX;
2924          touches.startY = touches.currentY;
2925          data.currentTranslate = data.startTranslate;
2926          touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
2927          return;
2928        }
2929      } else {
2930        data.currentTranslate = data.startTranslate;
2931        return;
2932      }
2933    }
2934    if (!params.followFinger || params.cssMode) return;
2935
2936    // Update active index in free mode
2937    if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
2938      swiper.updateActiveIndex();
2939      swiper.updateSlidesClasses();
2940    }
2941    if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
2942      swiper.freeMode.onTouchMove();
2943    }
2944    // Update progress
2945    swiper.updateProgress(data.currentTranslate);
2946    // Update translate
2947    swiper.setTranslate(data.currentTranslate);
2948  }
2949
2950  function onTouchEnd(event) {
2951    const swiper = this;
2952    const data = swiper.touchEventsData;
2953    let e = event;
2954    if (e.originalEvent) e = e.originalEvent;
2955    let targetTouch;
2956    const isTouchEvent = e.type === 'touchend' || e.type === 'touchcancel';
2957    if (!isTouchEvent) {
2958      if (data.touchId !== null) return; // return from pointer if we use touch
2959      if (e.pointerId !== data.pointerId) return;
2960      targetTouch = e;
2961    } else {
2962      targetTouch = [...e.changedTouches].filter(t => t.identifier === data.touchId)[0];
2963      if (!targetTouch || targetTouch.identifier !== data.touchId) return;
2964    }
2965    if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(e.type)) {
2966      const proceed = ['pointercancel', 'contextmenu'].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView);
2967      if (!proceed) {
2968        return;
2969      }
2970    }
2971    data.pointerId = null;
2972    data.touchId = null;
2973    const {
2974      params,
2975      touches,
2976      rtlTranslate: rtl,
2977      slidesGrid,
2978      enabled
2979    } = swiper;
2980    if (!enabled) return;
2981    if (!params.simulateTouch && e.pointerType === 'mouse') return;
2982    if (data.allowTouchCallbacks) {
2983      swiper.emit('touchEnd', e);
2984    }
2985    data.allowTouchCallbacks = false;
2986    if (!data.isTouched) {
2987      if (data.isMoved && params.grabCursor) {
2988        swiper.setGrabCursor(false);
2989      }
2990      data.isMoved = false;
vendor: 4,628 bytes, lines 2991-3117
2991      data.startMoving = false;
2992      return;
2993    }
2994
2995    // Return Grab Cursor
2996    if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2997      swiper.setGrabCursor(false);
2998    }
2999
3000    // Time diff
3001    const touchEndTime = now();
3002    const timeDiff = touchEndTime - data.touchStartTime;
3003
3004    // Tap, doubleTap, Click
3005    if (swiper.allowClick) {
3006      const pathTree = e.path || e.composedPath && e.composedPath();
3007      swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);
3008      swiper.emit('tap click', e);
3009      if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
3010        swiper.emit('doubleTap doubleClick', e);
3011      }
3012    }
3013    data.lastClickTime = now();
3014    nextTick(() => {
3015      if (!swiper.destroyed) swiper.allowClick = true;
3016    });
3017    if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) {
3018      data.isTouched = false;
3019      data.isMoved = false;
3020      data.startMoving = false;
3021      return;
3022    }
3023    data.isTouched = false;
3024    data.isMoved = false;
3025    data.startMoving = false;
3026    let currentPos;
3027    if (params.followFinger) {
3028      currentPos = rtl ? swiper.translate : -swiper.translate;
3029    } else {
3030      currentPos = -data.currentTranslate;
3031    }
3032    if (params.cssMode) {
3033      return;
3034    }
3035    if (params.freeMode && params.freeMode.enabled) {
3036      swiper.freeMode.onTouchEnd({
3037        currentPos
3038      });
3039      return;
3040    }
3041
3042    // Find current slide
3043    const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;
3044    let stopIndex = 0;
3045    let groupSize = swiper.slidesSizesGrid[0];
3046    for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
3047      const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
3048      if (typeof slidesGrid[i + increment] !== 'undefined') {
3049        if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {
3050          stopIndex = i;
3051          groupSize = slidesGrid[i + increment] - slidesGrid[i];
3052        }
3053      } else if (swipeToLast || currentPos >= slidesGrid[i]) {
3054        stopIndex = i;
3055        groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
3056      }
3057    }
3058    let rewindFirstIndex = null;
3059    let rewindLastIndex = null;
3060    if (params.rewind) {
3061      if (swiper.isBeginning) {
3062        rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
3063      } else if (swiper.isEnd) {
3064        rewindFirstIndex = 0;
3065      }
3066    }
3067    // Find current slide size
3068    const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
3069    const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
3070    if (timeDiff > params.longSwipesMs) {
3071      // Long touches
3072      if (!params.longSwipes) {
3073        swiper.slideTo(swiper.activeIndex);
3074        return;
3075      }
3076      if (swiper.swipeDirection === 'next') {
3077        if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);
3078      }
3079      if (swiper.swipeDirection === 'prev') {
3080        if (ratio > 1 - params.longSwipesRatio) {
3081          swiper.slideTo(stopIndex + increment);
3082        } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
3083          swiper.slideTo(rewindLastIndex);
3084        } else {
3085          swiper.slideTo(stopIndex);
3086        }
3087      }
3088    } else {
3089      // Short swipes
3090      if (!params.shortSwipes) {
3091        swiper.slideTo(swiper.activeIndex);
3092        return;
3093      }
3094      const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
3095      if (!isNavButtonTarget) {
3096        if (swiper.swipeDirection === 'next') {
3097          swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
3098        }
3099        if (swiper.swipeDirection === 'prev') {
3100          swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
3101        }
3102      } else if (e.target === swiper.navigation.nextEl) {
3103        swiper.slideTo(stopIndex + increment);
3104      } else {
3105        swiper.slideTo(stopIndex);
3106      }
3107    }
3108  }
3109
3110  function onResize() {
3111    const swiper = this;
3112    const {
3113      params,
3114      el
3115    } = swiper;
3116    if (el && el.offsetWidth === 0) return;
3117
vendor: 6,451 bytes, lines 3118-3336
3118    // Breakpoints
3119    if (params.breakpoints) {
3120      swiper.setBreakpoint();
3121    }
3122
3123    // Save locks
3124    const {
3125      allowSlideNext,
3126      allowSlidePrev,
3127      snapGrid
3128    } = swiper;
3129    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
3130
3131    // Disable locks on resize
3132    swiper.allowSlideNext = true;
3133    swiper.allowSlidePrev = true;
3134    swiper.updateSize();
3135    swiper.updateSlides();
3136    swiper.updateSlidesClasses();
3137    const isVirtualLoop = isVirtual && params.loop;
3138    if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {
3139      swiper.slideTo(swiper.slides.length - 1, 0, false, true);
3140    } else {
3141      if (swiper.params.loop && !isVirtual) {
3142        swiper.slideToLoop(swiper.realIndex, 0, false, true);
3143      } else {
3144        swiper.slideTo(swiper.activeIndex, 0, false, true);
3145      }
3146    }
3147    if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3148      clearTimeout(swiper.autoplay.resizeTimeout);
3149      swiper.autoplay.resizeTimeout = setTimeout(() => {
3150        if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3151          swiper.autoplay.resume();
3152        }
3153      }, 500);
3154    }
3155    // Return locks after resize
3156    swiper.allowSlidePrev = allowSlidePrev;
3157    swiper.allowSlideNext = allowSlideNext;
3158    if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
3159      swiper.checkOverflow();
3160    }
3161  }
3162
3163  function onClick(e) {
3164    const swiper = this;
3165    if (!swiper.enabled) return;
3166    if (!swiper.allowClick) {
3167      if (swiper.params.preventClicks) e.preventDefault();
3168      if (swiper.params.preventClicksPropagation && swiper.animating) {
3169        e.stopPropagation();
3170        e.stopImmediatePropagation();
3171      }
3172    }
3173  }
3174
3175  function onScroll() {
3176    const swiper = this;
3177    const {
3178      wrapperEl,
3179      rtlTranslate,
3180      enabled
3181    } = swiper;
3182    if (!enabled) return;
3183    swiper.previousTranslate = swiper.translate;
3184    if (swiper.isHorizontal()) {
3185      swiper.translate = -wrapperEl.scrollLeft;
3186    } else {
3187      swiper.translate = -wrapperEl.scrollTop;
3188    }
3189    // eslint-disable-next-line
3190    if (swiper.translate === 0) swiper.translate = 0;
3191    swiper.updateActiveIndex();
3192    swiper.updateSlidesClasses();
3193    let newProgress;
3194    const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
3195    if (translatesDiff === 0) {
3196      newProgress = 0;
3197    } else {
3198      newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
3199    }
3200    if (newProgress !== swiper.progress) {
3201      swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
3202    }
3203    swiper.emit('setTranslate', swiper.translate, false);
3204  }
3205
3206  function onLoad(e) {
3207    const swiper = this;
3208    processLazyPreloader(swiper, e.target);
3209    if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {
3210      return;
3211    }
3212    swiper.update();
3213  }
3214
3215  function onDocumentTouchStart() {
3216    const swiper = this;
3217    if (swiper.documentTouchHandlerProceeded) return;
3218    swiper.documentTouchHandlerProceeded = true;
3219    if (swiper.params.touchReleaseOnEdges) {
3220      swiper.el.style.touchAction = 'auto';
3221    }
3222  }
3223
3224  const events = (swiper, method) => {
3225    const document = getDocument();
3226    const {
3227      params,
3228      el,
3229      wrapperEl,
3230      device
3231    } = swiper;
3232    const capture = !!params.nested;
3233    const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
3234    const swiperMethod = method;
3235
3236    // Touch Events
3237    document[domMethod]('touchstart', swiper.onDocumentTouchStart, {
3238      passive: false,
3239      capture
3240    });
3241    el[domMethod]('touchstart', swiper.onTouchStart, {
3242      passive: false
3243    });
3244    el[domMethod]('pointerdown', swiper.onTouchStart, {
3245      passive: false
3246    });
3247    document[domMethod]('touchmove', swiper.onTouchMove, {
3248      passive: false,
3249      capture
3250    });
3251    document[domMethod]('pointermove', swiper.onTouchMove, {
3252      passive: false,
3253      capture
3254    });
3255    document[domMethod]('touchend', swiper.onTouchEnd, {
3256      passive: true
3257    });
3258    document[domMethod]('pointerup', swiper.onTouchEnd, {
3259      passive: true
3260    });
3261    document[domMethod]('pointercancel', swiper.onTouchEnd, {
3262      passive: true
3263    });
3264    document[domMethod]('touchcancel', swiper.onTouchEnd, {
3265      passive: true
3266    });
3267    document[domMethod]('pointerout', swiper.onTouchEnd, {
3268      passive: true
3269    });
3270    document[domMethod]('pointerleave', swiper.onTouchEnd, {
3271      passive: true
3272    });
3273    document[domMethod]('contextmenu', swiper.onTouchEnd, {
3274      passive: true
3275    });
3276
3277    // Prevent Links Clicks
3278    if (params.preventClicks || params.preventClicksPropagation) {
3279      el[domMethod]('click', swiper.onClick, true);
3280    }
3281    if (params.cssMode) {
3282      wrapperEl[domMethod]('scroll', swiper.onScroll);
3283    }
3284
3285    // Resize handler
3286    if (params.updateOnWindowResize) {
3287      swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);
3288    } else {
3289      swiper[swiperMethod]('observerUpdate', onResize, true);
3290    }
3291
3292    // Images loader
3293    el[domMethod]('load', swiper.onLoad, {
3294      capture: true
3295    });
3296  };
3297  function attachEvents() {
3298    const swiper = this;
3299    const {
3300      params
3301    } = swiper;
3302    swiper.onTouchStart = onTouchStart.bind(swiper);
3303    swiper.onTouchMove = onTouchMove.bind(swiper);
3304    swiper.onTouchEnd = onTouchEnd.bind(swiper);
3305    swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);
3306    if (params.cssMode) {
3307      swiper.onScroll = onScroll.bind(swiper);
3308    }
3309    swiper.onClick = onClick.bind(swiper);
3310    swiper.onLoad = onLoad.bind(swiper);
3311    events(swiper, 'on');
3312  }
3313  function detachEvents() {
3314    const swiper = this;
3315    events(swiper, 'off');
3316  }
3317  var events$1 = {
3318    attachEvents,
3319    detachEvents
3320  };
3321
3322  const isGridEnabled = (swiper, params) => {
3323    return swiper.grid && params.grid && params.grid.rows > 1;
3324  };
3325  function setBreakpoint() {
3326    const swiper = this;
3327    const {
3328      realIndex,
3329      initialized,
3330      params,
3331      el
3332    } = swiper;
3333    const breakpoints = params.breakpoints;
3334    if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;
3335
3336    // Get breakpoint for window width and update parameters
vendor: 4,093 bytes, lines 3337-3443
3337    const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);
3338    if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;
3339    const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
3340    const breakpointParams = breakpointOnlyParams || swiper.originalParams;
3341    const wasMultiRow = isGridEnabled(swiper, params);
3342    const isMultiRow = isGridEnabled(swiper, breakpointParams);
3343    const wasEnabled = params.enabled;
3344    if (wasMultiRow && !isMultiRow) {
3345      el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
3346      swiper.emitContainerClasses();
3347    } else if (!wasMultiRow && isMultiRow) {
3348      el.classList.add(`${params.containerModifierClass}grid`);
3349      if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {
3350        el.classList.add(`${params.containerModifierClass}grid-column`);
3351      }
3352      swiper.emitContainerClasses();
3353    }
3354
3355    // Toggle navigation, pagination, scrollbar
3356    ['navigation', 'pagination', 'scrollbar'].forEach(prop => {
3357      if (typeof breakpointParams[prop] === 'undefined') return;
3358      const wasModuleEnabled = params[prop] && params[prop].enabled;
3359      const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;
3360      if (wasModuleEnabled && !isModuleEnabled) {
3361        swiper[prop].disable();
3362      }
3363      if (!wasModuleEnabled && isModuleEnabled) {
3364        swiper[prop].enable();
3365      }
3366    });
3367    const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
3368    const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
3369    const wasLoop = params.loop;
3370    if (directionChanged && initialized) {
3371      swiper.changeDirection();
3372    }
3373    extend(swiper.params, breakpointParams);
3374    const isEnabled = swiper.params.enabled;
3375    const hasLoop = swiper.params.loop;
3376    Object.assign(swiper, {
3377      allowTouchMove: swiper.params.allowTouchMove,
3378      allowSlideNext: swiper.params.allowSlideNext,
3379      allowSlidePrev: swiper.params.allowSlidePrev
3380    });
3381    if (wasEnabled && !isEnabled) {
3382      swiper.disable();
3383    } else if (!wasEnabled && isEnabled) {
3384      swiper.enable();
3385    }
3386    swiper.currentBreakpoint = breakpoint;
3387    swiper.emit('_beforeBreakpoint', breakpointParams);
3388    if (initialized) {
3389      if (needsReLoop) {
3390        swiper.loopDestroy();
3391        swiper.loopCreate(realIndex);
3392        swiper.updateSlides();
3393      } else if (!wasLoop && hasLoop) {
3394        swiper.loopCreate(realIndex);
3395        swiper.updateSlides();
3396      } else if (wasLoop && !hasLoop) {
3397        swiper.loopDestroy();
3398      }
3399    }
3400    swiper.emit('breakpoint', breakpointParams);
3401  }
3402
3403  function getBreakpoint(breakpoints, base, containerEl) {
3404    if (base === void 0) {
3405      base = 'window';
3406    }
3407    if (!breakpoints || base === 'container' && !containerEl) return undefined;
3408    let breakpoint = false;
3409    const window = getWindow();
3410    const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;
3411    const points = Object.keys(breakpoints).map(point => {
3412      if (typeof point === 'string' && point.indexOf('@') === 0) {
3413        const minRatio = parseFloat(point.substr(1));
3414        const value = currentHeight * minRatio;
3415        return {
3416          value,
3417          point
3418        };
3419      }
3420      return {
3421        value: point,
3422        point
3423      };
3424    });
3425    points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));
3426    for (let i = 0; i < points.length; i += 1) {
3427      const {
3428        point,
3429        value
3430      } = points[i];
3431      if (base === 'window') {
3432        if (window.matchMedia(`(min-width: ${value}px)`).matches) {
3433          breakpoint = point;
3434        }
3435      } else if (value <= containerEl.clientWidth) {
3436        breakpoint = point;
3437      }
3438    }
3439    return breakpoint || 'max';
3440  }
3441
3442  var breakpoints = {
3443    setBreakpoint,
vendor: 1,127 bytes, lines 3444-3488
3444    getBreakpoint
3445  };
3446
3447  function prepareClasses(entries, prefix) {
3448    const resultClasses = [];
3449    entries.forEach(item => {
3450      if (typeof item === 'object') {
3451        Object.keys(item).forEach(classNames => {
3452          if (item[classNames]) {
3453            resultClasses.push(prefix + classNames);
3454          }
3455        });
3456      } else if (typeof item === 'string') {
3457        resultClasses.push(prefix + item);
3458      }
3459    });
3460    return resultClasses;
3461  }
3462  function addClasses() {
3463    const swiper = this;
3464    const {
3465      classNames,
3466      params,
3467      rtl,
3468      el,
3469      device
3470    } = swiper;
3471    // prettier-ignore
3472    const suffixes = prepareClasses(['initialized', params.direction, {
3473      'free-mode': swiper.params.freeMode && params.freeMode.enabled
3474    }, {
3475      'autoheight': params.autoHeight
3476    }, {
3477      'rtl': rtl
3478    }, {
3479      'grid': params.grid && params.grid.rows > 1
3480    }, {
3481      'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'
3482    }, {
3483      'android': device.android
3484    }, {
3485      'ios': device.ios
3486    }, {
3487      'css-mode': params.cssMode
3488    }, {
vendor: 2,418 bytes, lines 3489-3581
3489      'centered': params.cssMode && params.centeredSlides
3490    }, {
3491      'watch-progress': params.watchSlidesProgress
3492    }], params.containerModifierClass);
3493    classNames.push(...suffixes);
3494    el.classList.add(...classNames);
3495    swiper.emitContainerClasses();
3496  }
3497
3498  function removeClasses() {
3499    const swiper = this;
3500    const {
3501      el,
3502      classNames
3503    } = swiper;
3504    el.classList.remove(...classNames);
3505    swiper.emitContainerClasses();
3506  }
3507
3508  var classes = {
3509    addClasses,
3510    removeClasses
3511  };
3512
3513  function checkOverflow() {
3514    const swiper = this;
3515    const {
3516      isLocked: wasLocked,
3517      params
3518    } = swiper;
3519    const {
3520      slidesOffsetBefore
3521    } = params;
3522    if (slidesOffsetBefore) {
3523      const lastSlideIndex = swiper.slides.length - 1;
3524      const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;
3525      swiper.isLocked = swiper.size > lastSlideRightEdge;
3526    } else {
3527      swiper.isLocked = swiper.snapGrid.length === 1;
3528    }
3529    if (params.allowSlideNext === true) {
3530      swiper.allowSlideNext = !swiper.isLocked;
3531    }
3532    if (params.allowSlidePrev === true) {
3533      swiper.allowSlidePrev = !swiper.isLocked;
3534    }
3535    if (wasLocked && wasLocked !== swiper.isLocked) {
3536      swiper.isEnd = false;
3537    }
3538    if (wasLocked !== swiper.isLocked) {
3539      swiper.emit(swiper.isLocked ? 'lock' : 'unlock');
3540    }
3541  }
3542  var checkOverflow$1 = {
3543    checkOverflow
3544  };
3545
3546  var defaults = {
3547    init: true,
3548    direction: 'horizontal',
3549    oneWayMovement: false,
3550    touchEventsTarget: 'wrapper',
3551    initialSlide: 0,
3552    speed: 300,
3553    cssMode: false,
3554    updateOnWindowResize: true,
3555    resizeObserver: true,
3556    nested: false,
3557    createElements: false,
3558    eventsPrefix: 'swiper',
3559    enabled: true,
3560    focusableElements: 'input, select, option, textarea, button, video, label',
3561    // Overrides
3562    width: null,
3563    height: null,
3564    //
3565    preventInteractionOnTransition: false,
3566    // ssr
3567    userAgent: null,
3568    url: null,
3569    // To support iOS's swipe-to-go-back gesture (when being used in-app).
3570    edgeSwipeDetection: false,
3571    edgeSwipeThreshold: 20,
3572    // Autoheight
3573    autoHeight: false,
3574    // Set wrapper width
3575    setWrapperSize: false,
3576    // Virtual Translate
3577    virtualTranslate: false,
3578    // Effects
3579    effect: 'slide',
3580    // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
3581
vendor: 4,199 bytes, lines 3582-3725
3582    // Breakpoints
3583    breakpoints: undefined,
3584    breakpointsBase: 'window',
3585    // Slides grid
3586    spaceBetween: 0,
3587    slidesPerView: 1,
3588    slidesPerGroup: 1,
3589    slidesPerGroupSkip: 0,
3590    slidesPerGroupAuto: false,
3591    centeredSlides: false,
3592    centeredSlidesBounds: false,
3593    slidesOffsetBefore: 0,
3594    // in px
3595    slidesOffsetAfter: 0,
3596    // in px
3597    normalizeSlideIndex: true,
3598    centerInsufficientSlides: false,
3599    // Disable swiper and hide navigation when container not overflow
3600    watchOverflow: true,
3601    // Round length
3602    roundLengths: false,
3603    // Touches
3604    touchRatio: 1,
3605    touchAngle: 45,
3606    simulateTouch: true,
3607    shortSwipes: true,
3608    longSwipes: true,
3609    longSwipesRatio: 0.5,
3610    longSwipesMs: 300,
3611    followFinger: true,
3612    allowTouchMove: true,
3613    threshold: 5,
3614    touchMoveStopPropagation: false,
3615    touchStartPreventDefault: true,
3616    touchStartForcePreventDefault: false,
3617    touchReleaseOnEdges: false,
3618    // Unique Navigation Elements
3619    uniqueNavElements: true,
3620    // Resistance
3621    resistance: true,
3622    resistanceRatio: 0.85,
3623    // Progress
3624    watchSlidesProgress: false,
3625    // Cursor
3626    grabCursor: false,
3627    // Clicks
3628    preventClicks: true,
3629    preventClicksPropagation: true,
3630    slideToClickedSlide: false,
3631    // loop
3632    loop: false,
3633    loopAddBlankSlides: true,
3634    loopAdditionalSlides: 0,
3635    loopPreventsSliding: true,
3636    // rewind
3637    rewind: false,
3638    // Swiping/no swiping
3639    allowSlidePrev: true,
3640    allowSlideNext: true,
3641    swipeHandler: null,
3642    // '.swipe-handler',
3643    noSwiping: true,
3644    noSwipingClass: 'swiper-no-swiping',
3645    noSwipingSelector: null,
3646    // Passive Listeners
3647    passiveListeners: true,
3648    maxBackfaceHiddenSlides: 10,
3649    // NS
3650    containerModifierClass: 'swiper-',
3651    // NEW
3652    slideClass: 'swiper-slide',
3653    slideBlankClass: 'swiper-slide-blank',
3654    slideActiveClass: 'swiper-slide-active',
3655    slideVisibleClass: 'swiper-slide-visible',
3656    slideFullyVisibleClass: 'swiper-slide-fully-visible',
3657    slideNextClass: 'swiper-slide-next',
3658    slidePrevClass: 'swiper-slide-prev',
3659    wrapperClass: 'swiper-wrapper',
3660    lazyPreloaderClass: 'swiper-lazy-preloader',
3661    lazyPreloadPrevNext: 0,
3662    // Callbacks
3663    runCallbacksOnInit: true,
3664    // Internals
3665    _emitClasses: false
3666  };
3667
3668  function moduleExtendParams(params, allModulesParams) {
3669    return function extendParams(obj) {
3670      if (obj === void 0) {
3671        obj = {};
3672      }
3673      const moduleParamName = Object.keys(obj)[0];
3674      const moduleParams = obj[moduleParamName];
3675      if (typeof moduleParams !== 'object' || moduleParams === null) {
3676        extend(allModulesParams, obj);
3677        return;
3678      }
3679      if (params[moduleParamName] === true) {
3680        params[moduleParamName] = {
3681          enabled: true
3682        };
3683      }
3684      if (moduleParamName === 'navigation' && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {
3685        params[moduleParamName].auto = true;
3686      }
3687      if (['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {
3688        params[moduleParamName].auto = true;
3689      }
3690      if (!(moduleParamName in params && 'enabled' in moduleParams)) {
3691        extend(allModulesParams, obj);
3692        return;
3693      }
3694      if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {
3695        params[moduleParamName].enabled = true;
3696      }
3697      if (!params[moduleParamName]) params[moduleParamName] = {
3698        enabled: false
3699      };
3700      extend(allModulesParams, obj);
3701    };
3702  }
3703
3704  /* eslint no-param-reassign: "off" */
3705  const prototypes = {
3706    eventsEmitter,
3707    update,
3708    translate,
3709    transition,
3710    slide,
3711    loop,
3712    grabCursor,
3713    events: events$1,
3714    breakpoints,
3715    checkOverflow: checkOverflow$1,
3716    classes
3717  };
3718  const extendedDefaults = {};
3719  class Swiper {
3720    constructor() {
3721      let el;
3722      let params;
3723      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3724        args[_key] = arguments[_key];
3725      }
vendor: 7,462 bytes, lines 3726-3960
3726      if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {
3727        params = args[0];
3728      } else {
3729        [el, params] = args;
3730      }
3731      if (!params) params = {};
3732      params = extend({}, params);
3733      if (el && !params.el) params.el = el;
3734      const document = getDocument();
3735      if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {
3736        const swipers = [];
3737        document.querySelectorAll(params.el).forEach(containerEl => {
3738          const newParams = extend({}, params, {
3739            el: containerEl
3740          });
3741          swipers.push(new Swiper(newParams));
3742        });
3743        // eslint-disable-next-line no-constructor-return
3744        return swipers;
3745      }
3746
3747      // Swiper Instance
3748      const swiper = this;
3749      swiper.__swiper__ = true;
3750      swiper.support = getSupport();
3751      swiper.device = getDevice({
3752        userAgent: params.userAgent
3753      });
3754      swiper.browser = getBrowser();
3755      swiper.eventsListeners = {};
3756      swiper.eventsAnyListeners = [];
3757      swiper.modules = [...swiper.__modules__];
3758      if (params.modules && Array.isArray(params.modules)) {
3759        swiper.modules.push(...params.modules);
3760      }
3761      const allModulesParams = {};
3762      swiper.modules.forEach(mod => {
3763        mod({
3764          params,
3765          swiper,
3766          extendParams: moduleExtendParams(params, allModulesParams),
3767          on: swiper.on.bind(swiper),
3768          once: swiper.once.bind(swiper),
3769          off: swiper.off.bind(swiper),
3770          emit: swiper.emit.bind(swiper)
3771        });
3772      });
3773
3774      // Extend defaults with modules params
3775      const swiperParams = extend({}, defaults, allModulesParams);
3776
3777      // Extend defaults with passed params
3778      swiper.params = extend({}, swiperParams, extendedDefaults, params);
3779      swiper.originalParams = extend({}, swiper.params);
3780      swiper.passedParams = extend({}, params);
3781
3782      // add event listeners
3783      if (swiper.params && swiper.params.on) {
3784        Object.keys(swiper.params.on).forEach(eventName => {
3785          swiper.on(eventName, swiper.params.on[eventName]);
3786        });
3787      }
3788      if (swiper.params && swiper.params.onAny) {
3789        swiper.onAny(swiper.params.onAny);
3790      }
3791
3792      // Extend Swiper
3793      Object.assign(swiper, {
3794        enabled: swiper.params.enabled,
3795        el,
3796        // Classes
3797        classNames: [],
3798        // Slides
3799        slides: [],
3800        slidesGrid: [],
3801        snapGrid: [],
3802        slidesSizesGrid: [],
3803        // isDirection
3804        isHorizontal() {
3805          return swiper.params.direction === 'horizontal';
3806        },
3807        isVertical() {
3808          return swiper.params.direction === 'vertical';
3809        },
3810        // Indexes
3811        activeIndex: 0,
3812        realIndex: 0,
3813        //
3814        isBeginning: true,
3815        isEnd: false,
3816        // Props
3817        translate: 0,
3818        previousTranslate: 0,
3819        progress: 0,
3820        velocity: 0,
3821        animating: false,
3822        cssOverflowAdjustment() {
3823          // Returns 0 unless `translate` is > 2**23
3824          // Should be subtracted from css values to prevent overflow
3825          return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;
3826        },
3827        // Locks
3828        allowSlideNext: swiper.params.allowSlideNext,
3829        allowSlidePrev: swiper.params.allowSlidePrev,
3830        // Touch Events
3831        touchEventsData: {
3832          isTouched: undefined,
3833          isMoved: undefined,
3834          allowTouchCallbacks: undefined,
3835          touchStartTime: undefined,
3836          isScrolling: undefined,
3837          currentTranslate: undefined,
3838          startTranslate: undefined,
3839          allowThresholdMove: undefined,
3840          // Form elements to match
3841          focusableElements: swiper.params.focusableElements,
3842          // Last click time
3843          lastClickTime: 0,
3844          clickTimeout: undefined,
3845          // Velocities
3846          velocities: [],
3847          allowMomentumBounce: undefined,
3848          startMoving: undefined,
3849          pointerId: null,
3850          touchId: null
3851        },
3852        // Clicks
3853        allowClick: true,
3854        // Touches
3855        allowTouchMove: swiper.params.allowTouchMove,
3856        touches: {
3857          startX: 0,
3858          startY: 0,
3859          currentX: 0,
3860          currentY: 0,
3861          diff: 0
3862        },
3863        // Images
3864        imagesToLoad: [],
3865        imagesLoaded: 0
3866      });
3867      swiper.emit('_swiper');
3868
3869      // Init
3870      if (swiper.params.init) {
3871        swiper.init();
3872      }
3873
3874      // Return app instance
3875      // eslint-disable-next-line no-constructor-return
3876      return swiper;
3877    }
3878    getDirectionLabel(property) {
3879      if (this.isHorizontal()) {
3880        return property;
3881      }
3882      // prettier-ignore
3883      return {
3884        'width': 'height',
3885        'margin-top': 'margin-left',
3886        'margin-bottom ': 'margin-right',
3887        'margin-left': 'margin-top',
3888        'margin-right': 'margin-bottom',
3889        'padding-left': 'padding-top',
3890        'padding-right': 'padding-bottom',
3891        'marginRight': 'marginBottom'
3892      }[property];
3893    }
3894    getSlideIndex(slideEl) {
3895      const {
3896        slidesEl,
3897        params
3898      } = this;
3899      const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3900      const firstSlideIndex = elementIndex(slides[0]);
3901      return elementIndex(slideEl) - firstSlideIndex;
3902    }
3903    getSlideIndexByData(index) {
3904      return this.getSlideIndex(this.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === index)[0]);
3905    }
3906    recalcSlides() {
3907      const swiper = this;
3908      const {
3909        slidesEl,
3910        params
3911      } = swiper;
3912      swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3913    }
3914    enable() {
3915      const swiper = this;
3916      if (swiper.enabled) return;
3917      swiper.enabled = true;
3918      if (swiper.params.grabCursor) {
3919        swiper.setGrabCursor();
3920      }
3921      swiper.emit('enable');
3922    }
3923    disable() {
3924      const swiper = this;
3925      if (!swiper.enabled) return;
3926      swiper.enabled = false;
3927      if (swiper.params.grabCursor) {
3928        swiper.unsetGrabCursor();
3929      }
3930      swiper.emit('disable');
3931    }
3932    setProgress(progress, speed) {
3933      const swiper = this;
3934      progress = Math.min(Math.max(progress, 0), 1);
3935      const min = swiper.minTranslate();
3936      const max = swiper.maxTranslate();
3937      const current = (max - min) * progress + min;
3938      swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);
3939      swiper.updateActiveIndex();
3940      swiper.updateSlidesClasses();
3941    }
3942    emitContainerClasses() {
3943      const swiper = this;
3944      if (!swiper.params._emitClasses || !swiper.el) return;
3945      const cls = swiper.el.className.split(' ').filter(className => {
3946        return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
3947      });
3948      swiper.emit('_containerClasses', cls.join(' '));
3949    }
3950    getSlideClasses(slideEl) {
3951      const swiper = this;
3952      if (swiper.destroyed) return '';
3953      return slideEl.className.split(' ').filter(className => {
3954        return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;
3955      }).join(' ');
3956    }
3957    emitSlidesClasses() {
3958      const swiper = this;
3959      if (!swiper.params._emitClasses || !swiper.el) return;
3960      const updates = [];
vendor: 4,620 bytes, lines 3961-4092
3961      swiper.slides.forEach(slideEl => {
3962        const classNames = swiper.getSlideClasses(slideEl);
3963        updates.push({
3964          slideEl,
3965          classNames
3966        });
3967        swiper.emit('_slideClass', slideEl, classNames);
3968      });
3969      swiper.emit('_slideClasses', updates);
3970    }
3971    slidesPerViewDynamic(view, exact) {
3972      if (view === void 0) {
3973        view = 'current';
3974      }
3975      if (exact === void 0) {
3976        exact = false;
3977      }
3978      const swiper = this;
3979      const {
3980        params,
3981        slides,
3982        slidesGrid,
3983        slidesSizesGrid,
3984        size: swiperSize,
3985        activeIndex
3986      } = swiper;
3987      let spv = 1;
3988      if (typeof params.slidesPerView === 'number') return params.slidesPerView;
3989      if (params.centeredSlides) {
3990        let slideSize = slides[activeIndex] ? slides[activeIndex].swiperSlideSize : 0;
3991        let breakLoop;
3992        for (let i = activeIndex + 1; i < slides.length; i += 1) {
3993          if (slides[i] && !breakLoop) {
3994            slideSize += slides[i].swiperSlideSize;
3995            spv += 1;
3996            if (slideSize > swiperSize) breakLoop = true;
3997          }
3998        }
3999        for (let i = activeIndex - 1; i >= 0; i -= 1) {
4000          if (slides[i] && !breakLoop) {
4001            slideSize += slides[i].swiperSlideSize;
4002            spv += 1;
4003            if (slideSize > swiperSize) breakLoop = true;
4004          }
4005        }
4006      } else {
4007        // eslint-disable-next-line
4008        if (view === 'current') {
4009          for (let i = activeIndex + 1; i < slides.length; i += 1) {
4010            const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;
4011            if (slideInView) {
4012              spv += 1;
4013            }
4014          }
4015        } else {
4016          // previous
4017          for (let i = activeIndex - 1; i >= 0; i -= 1) {
4018            const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;
4019            if (slideInView) {
4020              spv += 1;
4021            }
4022          }
4023        }
4024      }
4025      return spv;
4026    }
4027    update() {
4028      const swiper = this;
4029      if (!swiper || swiper.destroyed) return;
4030      const {
4031        snapGrid,
4032        params
4033      } = swiper;
4034      // Breakpoints
4035      if (params.breakpoints) {
4036        swiper.setBreakpoint();
4037      }
4038      [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach(imageEl => {
4039        if (imageEl.complete) {
4040          processLazyPreloader(swiper, imageEl);
4041        }
4042      });
4043      swiper.updateSize();
4044      swiper.updateSlides();
4045      swiper.updateProgress();
4046      swiper.updateSlidesClasses();
4047      function setTranslate() {
4048        const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
4049        const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
4050        swiper.setTranslate(newTranslate);
4051        swiper.updateActiveIndex();
4052        swiper.updateSlidesClasses();
4053      }
4054      let translated;
4055      if (params.freeMode && params.freeMode.enabled && !params.cssMode) {
4056        setTranslate();
4057        if (params.autoHeight) {
4058          swiper.updateAutoHeight();
4059        }
4060      } else {
4061        if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {
4062          const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;
4063          translated = swiper.slideTo(slides.length - 1, 0, false, true);
4064        } else {
4065          translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
4066        }
4067        if (!translated) {
4068          setTranslate();
4069        }
4070      }
4071      if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
4072        swiper.checkOverflow();
4073      }
4074      swiper.emit('update');
4075    }
4076    changeDirection(newDirection, needUpdate) {
4077      if (needUpdate === void 0) {
4078        needUpdate = true;
4079      }
4080      const swiper = this;
4081      const currentDirection = swiper.params.direction;
4082      if (!newDirection) {
4083        // eslint-disable-next-line
4084        newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
4085      }
4086      if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {
4087        return swiper;
4088      }
4089      swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);
4090      swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);
4091      swiper.emitContainerClasses();
4092      swiper.params.direction = newDirection;
vendor: 2,060 bytes, lines 4093-4150
4093      swiper.slides.forEach(slideEl => {
4094        if (newDirection === 'vertical') {
4095          slideEl.style.width = '';
4096        } else {
4097          slideEl.style.height = '';
4098        }
4099      });
4100      swiper.emit('changeDirection');
4101      if (needUpdate) swiper.update();
4102      return swiper;
4103    }
4104    changeLanguageDirection(direction) {
4105      const swiper = this;
4106      if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;
4107      swiper.rtl = direction === 'rtl';
4108      swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;
4109      if (swiper.rtl) {
4110        swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);
4111        swiper.el.dir = 'rtl';
4112      } else {
4113        swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);
4114        swiper.el.dir = 'ltr';
4115      }
4116      swiper.update();
4117    }
4118    mount(element) {
4119      const swiper = this;
4120      if (swiper.mounted) return true;
4121
4122      // Find el
4123      let el = element || swiper.params.el;
4124      if (typeof el === 'string') {
4125        el = document.querySelector(el);
4126      }
4127      if (!el) {
4128        return false;
4129      }
4130      el.swiper = swiper;
4131      if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === 'SWIPER-CONTAINER') {
4132        swiper.isElement = true;
4133      }
4134      const getWrapperSelector = () => {
4135        return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;
4136      };
4137      const getWrapper = () => {
4138        if (el && el.shadowRoot && el.shadowRoot.querySelector) {
4139          const res = el.shadowRoot.querySelector(getWrapperSelector());
4140          // Children needs to return slot items
4141          return res;
4142        }
4143        return elementChildren(el, getWrapperSelector())[0];
4144      };
4145      // Find Wrapper
4146      let wrapperEl = getWrapper();
4147      if (!wrapperEl && swiper.params.createElements) {
4148        wrapperEl = createElement('div', swiper.params.wrapperClass);
4149        el.append(wrapperEl);
4150        elementChildren(el, `.${swiper.params.slideClass}
4150`).forEach(slideEl => {
4151          wrapperEl.append(slideEl);
4152        });
4153      }
4154      Object.assign(swiper, {
4155        el,
4156        wrapperEl,
4157        slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,
4158        hostEl: swiper.isElement ? el.parentNode.host : el,
4159        mounted: true,
4160        // RTL
4161        rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',
4162        rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),
4163        wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box'
4164      });
4165      return true;
4166    }
4167    init(el) {
4168      const swiper = this;
4169      if (swiper.initialized) return swiper;
4170      const mounted = swiper.mount(el);
4171      if (mounted === false) return swiper;
4172      swiper.emit('beforeInit');
4173
4174      // Set breakpoint
4175      if (swiper.params.breakpoints) {
4176        swiper.setBreakpoint();
4177      }
4178
4179      // Add Classes
4180      swiper.addClasses();
4181
4182      // Update size
4183      swiper.updateSize();
4184
4185      // Update slides
4186      swiper.updateSlides();
4187      if (swiper.params.watchOverflow) {
4188        swiper.checkOverflow();
4189      }
4190
4191      // Set Grab Cursor
4192      if (swiper.params.grabCursor && swiper.enabled) {
4193        swiper.setGrabCursor();
4194      }
4195
4196      // Slide To Initial Slide
4197      if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
4198        swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);
4199      } else {
4200        swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
4201      }
4202
4203      // Create loop
4204      if (swiper.params.loop) {
4205        swiper.loopCreate();
4206      }
4207
4208      // Attach events
4209      swiper.attachEvents();
4210      const lazyElements = [...swiper.el.querySelectorAll('[loading="lazy"]')];
4211      if (swiper.isElement) {
4212        lazyElements.push(...swiper.hostEl.querySelectorAll('[loading="lazy"]'));
4213      }
4214      lazyElements.forEach(imageEl => {
4215        if (imageEl.complete) {
4216          processLazyPreloader(swiper, imageEl);
4217        } else {
4218          imageEl.addEventListener('load', e => {
4219            processLazyPreloader(swiper, e.target);
4220          });
4221        }
4222      });
4223      preload(swiper);
4224
4225      // Init Flag
4226      swiper.initialized = true;
4227      preload(swiper);
4228
4229      // Emit
4230      swiper.emit('init');
4231      swiper.emit('afterInit');
4232      return swiper;
4233    }
4234    destroy(deleteInstance, cleanStyles) {
4235      if (deleteInstance === void 0) {
4236        deleteInstance = true;
4237      }
4238      if (cleanStyles === void 0) {
4239        cleanStyles = true;
4240      }
4241      const swiper = this;
4242      const {
4243        params,
4244        el,
4245        wrapperEl,
4246        slides
4247      } = swiper;
4248      if (typeof swiper.params === 'undefined' || swiper.destroyed) {
4249        return null;
4250      }
4251      swiper.emit('beforeDestroy');
4252
4253      // Init Flag
4254      swiper.initialized = false;
4255
4256      // Detach events
4257      swiper.detachEvents();
4258
4259      // Destroy loop
4260      if (params.loop) {
4261        swiper.loopDestroy();
4262      }
4263
4264      // Cleanup styles
4265      if (cleanStyles) {
4266        swiper.removeClasses();
4267        el.removeAttribute('style');
4268        wrapperEl.removeAttribute('style');
4269        if (slides && slides.length) {
vendor: 5,357 bytes, lines 4270-4441
4270          slides.forEach(slideEl => {
4271            slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
4272            slideEl.removeAttribute('style');
4273            slideEl.removeAttribute('data-swiper-slide-index');
4274          });
4275        }
4276      }
4277      swiper.emit('destroy');
4278
4279      // Detach emitter events
4280      Object.keys(swiper.eventsListeners).forEach(eventName => {
4281        swiper.off(eventName);
4282      });
4283      if (deleteInstance !== false) {
4284        swiper.el.swiper = null;
4285        deleteProps(swiper);
4286      }
4287      swiper.destroyed = true;
4288      return null;
4289    }
4290    static extendDefaults(newDefaults) {
4291      extend(extendedDefaults, newDefaults);
4292    }
4293    static get extendedDefaults() {
4294      return extendedDefaults;
4295    }
4296    static get defaults() {
4297      return defaults;
4298    }
4299    static installModule(mod) {
4300      if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];
4301      const modules = Swiper.prototype.__modules__;
4302      if (typeof mod === 'function' && modules.indexOf(mod) < 0) {
4303        modules.push(mod);
4304      }
4305    }
4306    static use(module) {
4307      if (Array.isArray(module)) {
4308        module.forEach(m => Swiper.installModule(m));
4309        return Swiper;
4310      }
4311      Swiper.installModule(module);
4312      return Swiper;
4313    }
4314  }
4315  Object.keys(prototypes).forEach(prototypeGroup => {
4316    Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {
4317      Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
4318    });
4319  });
4320  Swiper.use([Resize, Observer]);
4321
4322  function Virtual(_ref) {
4323    let {
4324      swiper,
4325      extendParams,
4326      on,
4327      emit
4328    } = _ref;
4329    extendParams({
4330      virtual: {
4331        enabled: false,
4332        slides: [],
4333        cache: true,
4334        renderSlide: null,
4335        renderExternal: null,
4336        renderExternalUpdate: true,
4337        addSlidesBefore: 0,
4338        addSlidesAfter: 0
4339      }
4340    });
4341    let cssModeTimeout;
4342    const document = getDocument();
4343    swiper.virtual = {
4344      cache: {},
4345      from: undefined,
4346      to: undefined,
4347      slides: [],
4348      offset: 0,
4349      slidesGrid: []
4350    };
4351    const tempDOM = document.createElement('div');
4352    function renderSlide(slide, index) {
4353      const params = swiper.params.virtual;
4354      if (params.cache && swiper.virtual.cache[index]) {
4355        return swiper.virtual.cache[index];
4356      }
4357      // eslint-disable-next-line
4358      let slideEl;
4359      if (params.renderSlide) {
4360        slideEl = params.renderSlide.call(swiper, slide, index);
4361        if (typeof slideEl === 'string') {
4362          tempDOM.innerHTML = slideEl;
4363          slideEl = tempDOM.children[0];
4364        }
4365      } else if (swiper.isElement) {
4366        slideEl = createElement('swiper-slide');
4367      } else {
4368        slideEl = createElement('div', swiper.params.slideClass);
4369      }
4370      slideEl.setAttribute('data-swiper-slide-index', index);
4371      if (!params.renderSlide) {
4372        slideEl.innerHTML = slide;
4373      }
4374      if (params.cache) {
4375        swiper.virtual.cache[index] = slideEl;
4376      }
4377      return slideEl;
4378    }
4379    function update(force) {
4380      const {
4381        slidesPerView,
4382        slidesPerGroup,
4383        centeredSlides,
4384        loop: isLoop
4385      } = swiper.params;
4386      const {
4387        addSlidesBefore,
4388        addSlidesAfter
4389      } = swiper.params.virtual;
4390      const {
4391        from: previousFrom,
4392        to: previousTo,
4393        slides,
4394        slidesGrid: previousSlidesGrid,
4395        offset: previousOffset
4396      } = swiper.virtual;
4397      if (!swiper.params.cssMode) {
4398        swiper.updateActiveIndex();
4399      }
4400      const activeIndex = swiper.activeIndex || 0;
4401      let offsetProp;
4402      if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';
4403      let slidesAfter;
4404      let slidesBefore;
4405      if (centeredSlides) {
4406        slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
4407        slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
4408      } else {
4409        slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;
4410        slidesBefore = (isLoop ? slidesPerView : slidesPerGroup) + addSlidesBefore;
4411      }
4412      let from = activeIndex - slidesBefore;
4413      let to = activeIndex + slidesAfter;
4414      if (!isLoop) {
4415        from = Math.max(from, 0);
4416        to = Math.min(to, slides.length - 1);
4417      }
4418      let offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
4419      if (isLoop && activeIndex >= slidesBefore) {
4420        from -= slidesBefore;
4421        if (!centeredSlides) offset += swiper.slidesGrid[0];
4422      } else if (isLoop && activeIndex < slidesBefore) {
4423        from = -slidesBefore;
4424        if (centeredSlides) offset += swiper.slidesGrid[0];
4425      }
4426      Object.assign(swiper.virtual, {
4427        from,
4428        to,
4429        offset,
4430        slidesGrid: swiper.slidesGrid,
4431        slidesBefore,
4432        slidesAfter
4433      });
4434      function onRendered() {
4435        swiper.updateSlides();
4436        swiper.updateProgress();
4437        swiper.updateSlidesClasses();
4438        emit('virtualUpdate');
4439      }
4440      if (previousFrom === from && previousTo === to && !force) {
4441        if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
vendor: 1,316 bytes, lines 4442-4483
4442          swiper.slides.forEach(slideEl => {
4443            slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;
4444          });
4445        }
4446        swiper.updateProgress();
4447        emit('virtualUpdate');
4448        return;
4449      }
4450      if (swiper.params.virtual.renderExternal) {
4451        swiper.params.virtual.renderExternal.call(swiper, {
4452          offset,
4453          from,
4454          to,
4455          slides: function getSlides() {
4456            const slidesToRender = [];
4457            for (let i = from; i <= to; i += 1) {
4458              slidesToRender.push(slides[i]);
4459            }
4460            return slidesToRender;
4461          }()
4462        });
4463        if (swiper.params.virtual.renderExternalUpdate) {
4464          onRendered();
4465        } else {
4466          emit('virtualUpdate');
4467        }
4468        return;
4469      }
4470      const prependIndexes = [];
4471      const appendIndexes = [];
4472      const getSlideIndex = index => {
4473        let slideIndex = index;
4474        if (index < 0) {
4475          slideIndex = slides.length + index;
4476        } else if (slideIndex >= slides.length) {
4477          // eslint-disable-next-line
4478          slideIndex = slideIndex - slides.length;
4479        }
4480        return slideIndex;
4481      };
4482      if (force) {
4483        swiper.slides.filter(el => el.matches(`.${swiper.params.slideClass}
4483, swiper-slide`)).forEach(slideEl => {
4484          slideEl.remove();
4485        });
4486      } else {
4487        for (let i = previousFrom; i <= previousTo; i += 1) {
4488          if (i < from || i > to) {
4489            const slideIndex = getSlideIndex(i);
4490            swiper.slides.filter(el => el.matches(`.${swiper.params.slideClass}[data-swiper-slide-index="${slideIndex}"], swiper-slide[data-swiper-slide-index="${slideIndex}"]`)).forEach(slideEl => {
4491              slideEl.remove();
4492            });
4493          }
4494        }
4495      }
4496      const loopFrom = isLoop ? -slides.length : 0;
4497      const loopTo = isLoop ? slides.length * 2 : slides.length;
4498      for (let i = loopFrom; i < loopTo; i += 1) {
4499        if (i >= from && i <= to) {
4500          const slideIndex = getSlideIndex(i);
4501          if (typeof previousTo === 'undefined' || force) {
4502            appendIndexes.push(slideIndex);
4503          } else {
4504            if (i > previousTo) appendIndexes.push(slideIndex);
4505            if (i < previousFrom) prependIndexes.push(slideIndex);
4506          }
4507        }
4508      }
4509      appendIndexes.forEach(index => {
4510        swiper.slidesEl.append(renderSlide(slides[index], index));
4511      });
4512      if (isLoop) {
4513        for (let i = prependIndexes.length - 1; i >= 0; i -= 1) {
4514          const index = prependIndexes[i];
4515          swiper.slidesEl.prepend(renderSlide(slides[index], index));
4516        }
4517      } else {
4518        prependIndexes.sort((a, b) => b - a);
4519        prependIndexes.forEach(index => {
4520          swiper.slidesEl.prepend(renderSlide(slides[index], index));
4521        });
4522      }
4523      elementChildren(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach(sli
vendor: 5,033 bytes, lines 4523-4653
4523deEl => {
4524        slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;
4525      });
4526      onRendered();
4527    }
4528    function appendSlide(slides) {
4529      if (typeof slides === 'object' && 'length' in slides) {
4530        for (let i = 0; i < slides.length; i += 1) {
4531          if (slides[i]) swiper.virtual.slides.push(slides[i]);
4532        }
4533      } else {
4534        swiper.virtual.slides.push(slides);
4535      }
4536      update(true);
4537    }
4538    function prependSlide(slides) {
4539      const activeIndex = swiper.activeIndex;
4540      let newActiveIndex = activeIndex + 1;
4541      let numberOfNewSlides = 1;
4542      if (Array.isArray(slides)) {
4543        for (let i = 0; i < slides.length; i += 1) {
4544          if (slides[i]) swiper.virtual.slides.unshift(slides[i]);
4545        }
4546        newActiveIndex = activeIndex + slides.length;
4547        numberOfNewSlides = slides.length;
4548      } else {
4549        swiper.virtual.slides.unshift(slides);
4550      }
4551      if (swiper.params.virtual.cache) {
4552        const cache = swiper.virtual.cache;
4553        const newCache = {};
4554        Object.keys(cache).forEach(cachedIndex => {
4555          const cachedEl = cache[cachedIndex];
4556          const cachedElIndex = cachedEl.getAttribute('data-swiper-slide-index');
4557          if (cachedElIndex) {
4558            cachedEl.setAttribute('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides);
4559          }
4560          newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cachedEl;
4561        });
4562        swiper.virtual.cache = newCache;
4563      }
4564      update(true);
4565      swiper.slideTo(newActiveIndex, 0);
4566    }
4567    function removeSlide(slidesIndexes) {
4568      if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;
4569      let activeIndex = swiper.activeIndex;
4570      if (Array.isArray(slidesIndexes)) {
4571        for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {
4572          if (swiper.params.virtual.cache) {
4573            delete swiper.virtual.cache[slidesIndexes[i]];
4574            // shift cache indexes
4575            Object.keys(swiper.virtual.cache).forEach(key => {
4576              if (key > slidesIndexes) {
4577                swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];
4578                swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);
4579                delete swiper.virtual.cache[key];
4580              }
4581            });
4582          }
4583          swiper.virtual.slides.splice(slidesIndexes[i], 1);
4584          if (slidesIndexes[i] < activeIndex) activeIndex -= 1;
4585          activeIndex = Math.max(activeIndex, 0);
4586        }
4587      } else {
4588        if (swiper.params.virtual.cache) {
4589          delete swiper.virtual.cache[slidesIndexes];
4590          // shift cache indexes
4591          Object.keys(swiper.virtual.cache).forEach(key => {
4592            if (key > slidesIndexes) {
4593              swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];
4594              swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);
4595              delete swiper.virtual.cache[key];
4596            }
4597          });
4598        }
4599        swiper.virtual.slides.splice(slidesIndexes, 1);
4600        if (slidesIndexes < activeIndex) activeIndex -= 1;
4601        activeIndex = Math.max(activeIndex, 0);
4602      }
4603      update(true);
4604      swiper.slideTo(activeIndex, 0);
4605    }
4606    function removeAllSlides() {
4607      swiper.virtual.slides = [];
4608      if (swiper.params.virtual.cache) {
4609        swiper.virtual.cache = {};
4610      }
4611      update(true);
4612      swiper.slideTo(0, 0);
4613    }
4614    on('beforeInit', () => {
4615      if (!swiper.params.virtual.enabled) return;
4616      let domSlidesAssigned;
4617      if (typeof swiper.passedParams.virtual.slides === 'undefined') {
4618        const slides = [...swiper.slidesEl.children].filter(el => el.matches(`.${swiper.params.slideClass}, swiper-slide`));
4619        if (slides && slides.length) {
4620          swiper.virtual.slides = [...slides];
4621          domSlidesAssigned = true;
4622          slides.forEach((slideEl, slideIndex) => {
4623            slideEl.setAttribute('data-swiper-slide-index', slideIndex);
4624            swiper.virtual.cache[slideIndex] = slideEl;
4625            slideEl.remove();
4626          });
4627        }
4628      }
4629      if (!domSlidesAssigned) {
4630        swiper.virtual.slides = swiper.params.virtual.slides;
4631      }
4632      swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);
4633      swiper.params.watchSlidesProgress = true;
4634      swiper.originalParams.watchSlidesProgress = true;
4635      update();
4636    });
4637    on('setTranslate', () => {
4638      if (!swiper.params.virtual.enabled) return;
4639      if (swiper.params.cssMode && !swiper._immediateVirtual) {
4640        clearTimeout(cssModeTimeout);
4641        cssModeTimeout = setTimeout(() => {
4642          update();
4643        }, 100);
4644      } else {
4645        update();
4646      }
4647    });
4648    on('init update resize', () => {
4649      if (!swiper.params.virtual.enabled) return;
4650      if (swiper.params.cssMode) {
4651        setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);
4652      }
4653    });
vendor: 4,242 bytes, lines 4654-4758
4654    Object.assign(swiper.virtual, {
4655      appendSlide,
4656      prependSlide,
4657      removeSlide,
4658      removeAllSlides,
4659      update
4660    });
4661  }
4662
4663  /* eslint-disable consistent-return */
4664  function Keyboard(_ref) {
4665    let {
4666      swiper,
4667      extendParams,
4668      on,
4669      emit
4670    } = _ref;
4671    const document = getDocument();
4672    const window = getWindow();
4673    swiper.keyboard = {
4674      enabled: false
4675    };
4676    extendParams({
4677      keyboard: {
4678        enabled: false,
4679        onlyInViewport: true,
4680        pageUpDown: true
4681      }
4682    });
4683    function handle(event) {
4684      if (!swiper.enabled) return;
4685      const {
4686        rtlTranslate: rtl
4687      } = swiper;
4688      let e = event;
4689      if (e.originalEvent) e = e.originalEvent; // jquery fix
4690      const kc = e.keyCode || e.charCode;
4691      const pageUpDown = swiper.params.keyboard.pageUpDown;
4692      const isPageUp = pageUpDown && kc === 33;
4693      const isPageDown = pageUpDown && kc === 34;
4694      const isArrowLeft = kc === 37;
4695      const isArrowRight = kc === 39;
4696      const isArrowUp = kc === 38;
4697      const isArrowDown = kc === 40;
4698      // Directions locks
4699      if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {
4700        return false;
4701      }
4702      if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {
4703        return false;
4704      }
4705      if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
4706        return undefined;
4707      }
4708      if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {
4709        return undefined;
4710      }
4711      if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {
4712        let inView = false;
4713        // Check that swiper should be inside of visible area of window
4714        if (elementParents(swiper.el, `.${swiper.params.slideClass}, swiper-slide`).length > 0 && elementParents(swiper.el, `.${swiper.params.slideActiveClass}`).length === 0) {
4715          return undefined;
4716        }
4717        const el = swiper.el;
4718        const swiperWidth = el.clientWidth;
4719        const swiperHeight = el.clientHeight;
4720        const windowWidth = window.innerWidth;
4721        const windowHeight = window.innerHeight;
4722        const swiperOffset = elementOffset(el);
4723        if (rtl) swiperOffset.left -= el.scrollLeft;
4724        const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];
4725        for (let i = 0; i < swiperCoord.length; i += 1) {
4726          const point = swiperCoord[i];
4727          if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {
4728            if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line
4729            inView = true;
4730          }
4731        }
4732        if (!inView) return undefined;
4733      }
4734      if (swiper.isHorizontal()) {
4735        if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {
4736          if (e.preventDefault) e.preventDefault();else e.returnValue = false;
4737        }
4738        if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext();
4739        if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev();
4740      } else {
4741        if (isPageUp || isPageDown || isArrowUp || isArrowDown) {
4742          if (e.preventDefault) e.preventDefault();else e.returnValue = false;
4743        }
4744        if (isPageDown || isArrowDown) swiper.slideNext();
4745        if (isPageUp || isArrowUp) swiper.slidePrev();
4746      }
4747      emit('keyPress', kc);
4748      return undefined;
4749    }
4750    function enable() {
4751      if (swiper.keyboard.enabled) return;
4752      document.addEventListener('keydown', handle);
4753      swiper.keyboard.enabled = true;
4754    }
4755    function disable() {
4756      if (!swiper.keyboard.enabled) return;
4757      document.removeEventListener('keydown', handle);
4758      swiper.keyboard.enabled = false;
vendor: 27,527 bytes, lines 4759-5501
4759    }
4760    on('init', () => {
4761      if (swiper.params.keyboard.enabled) {
4762        enable();
4763      }
4764    });
4765    on('destroy', () => {
4766      if (swiper.keyboard.enabled) {
4767        disable();
4768      }
4769    });
4770    Object.assign(swiper.keyboard, {
4771      enable,
4772      disable
4773    });
4774  }
4775
4776  /* eslint-disable consistent-return */
4777  function Mousewheel(_ref) {
4778    let {
4779      swiper,
4780      extendParams,
4781      on,
4782      emit
4783    } = _ref;
4784    const window = getWindow();
4785    extendParams({
4786      mousewheel: {
4787        enabled: false,
4788        releaseOnEdges: false,
4789        invert: false,
4790        forceToAxis: false,
4791        sensitivity: 1,
4792        eventsTarget: 'container',
4793        thresholdDelta: null,
4794        thresholdTime: null,
4795        noMousewheelClass: 'swiper-no-mousewheel'
4796      }
4797    });
4798    swiper.mousewheel = {
4799      enabled: false
4800    };
4801    let timeout;
4802    let lastScrollTime = now();
4803    let lastEventBeforeSnap;
4804    const recentWheelEvents = [];
4805    function normalize(e) {
4806      // Reasonable defaults
4807      const PIXEL_STEP = 10;
4808      const LINE_HEIGHT = 40;
4809      const PAGE_HEIGHT = 800;
4810      let sX = 0;
4811      let sY = 0; // spinX, spinY
4812      let pX = 0;
4813      let pY = 0; // pixelX, pixelY
4814
4815      // Legacy
4816      if ('detail' in e) {
4817        sY = e.detail;
4818      }
4819      if ('wheelDelta' in e) {
4820        sY = -e.wheelDelta / 120;
4821      }
4822      if ('wheelDeltaY' in e) {
4823        sY = -e.wheelDeltaY / 120;
4824      }
4825      if ('wheelDeltaX' in e) {
4826        sX = -e.wheelDeltaX / 120;
4827      }
4828
4829      // side scrolling on FF with DOMMouseScroll
4830      if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
4831        sX = sY;
4832        sY = 0;
4833      }
4834      pX = sX * PIXEL_STEP;
4835      pY = sY * PIXEL_STEP;
4836      if ('deltaY' in e) {
4837        pY = e.deltaY;
4838      }
4839      if ('deltaX' in e) {
4840        pX = e.deltaX;
4841      }
4842      if (e.shiftKey && !pX) {
4843        // if user scrolls with shift he wants horizontal scroll
4844        pX = pY;
4845        pY = 0;
4846      }
4847      if ((pX || pY) && e.deltaMode) {
4848        if (e.deltaMode === 1) {
4849          // delta in LINE units
4850          pX *= LINE_HEIGHT;
4851          pY *= LINE_HEIGHT;
4852        } else {
4853          // delta in PAGE units
4854          pX *= PAGE_HEIGHT;
4855          pY *= PAGE_HEIGHT;
4856        }
4857      }
4858
4859      // Fall-back if spin cannot be determined
4860      if (pX && !sX) {
4861        sX = pX < 1 ? -1 : 1;
4862      }
4863      if (pY && !sY) {
4864        sY = pY < 1 ? -1 : 1;
4865      }
4866      return {
4867        spinX: sX,
4868        spinY: sY,
4869        pixelX: pX,
4870        pixelY: pY
4871      };
4872    }
4873    function handleMouseEnter() {
4874      if (!swiper.enabled) return;
4875      swiper.mouseEntered = true;
4876    }
4877    function handleMouseLeave() {
4878      if (!swiper.enabled) return;
4879      swiper.mouseEntered = false;
4880    }
4881    function animateSlider(newEvent) {
4882      if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) {
4883        // Prevent if delta of wheel scroll delta is below configured threshold
4884        return false;
4885      }
4886      if (swiper.params.mousewheel.thresholdTime && now() - lastScrollTime < swiper.params.mousewheel.thresholdTime) {
4887        // Prevent if time between scrolls is below configured threshold
4888        return false;
4889      }
4890
4891      // If the movement is NOT big enough and
4892      // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
4893      //   Don't go any further (avoid insignificant scroll movement).
4894      if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {
4895        // Return false as a default
4896        return true;
4897      }
4898      // If user is scrolling towards the end:
4899      //   If the slider hasn't hit the latest slide or
4900      //   if the slider is a loop and
4901      //   if the slider isn't moving right now:
4902      //     Go to next slide and
4903      //     emit a scroll event.
4904      // Else (the user is scrolling towards the beginning) and
4905      // if the slider hasn't hit the first slide or
4906      // if the slider is a loop and
4907      // if the slider isn't moving right now:
4908      //   Go to prev slide and
4909      //   emit a scroll event.
4910      if (newEvent.direction < 0) {
4911        if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
4912          swiper.slideNext();
4913          emit('scroll', newEvent.raw);
4914        }
4915      } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
4916        swiper.slidePrev();
4917        emit('scroll', newEvent.raw);
4918      }
4919      // If you got here is because an animation has been triggered so store the current time
4920      lastScrollTime = new window.Date().getTime();
4921      // Return false as a default
4922      return false;
4923    }
4924    function releaseScroll(newEvent) {
4925      const params = swiper.params.mousewheel;
4926      if (newEvent.direction < 0) {
4927        if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
4928          // Return true to animate scroll on edges
4929          return true;
4930        }
4931      } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
4932        // Return true to animate scroll on edges
4933        return true;
4934      }
4935      return false;
4936    }
4937    function handle(event) {
4938      let e = event;
4939      let disableParentSwiper = true;
4940      if (!swiper.enabled) return;
4941
4942      // Ignore event if the target or its parents have the swiper-no-mousewheel class
4943      if (event.target.closest(`.${swiper.params.mousewheel.noMousewheelClass}`)) return;
4944      const params = swiper.params.mousewheel;
4945      if (swiper.params.cssMode) {
4946        e.preventDefault();
4947      }
4948      let targetEl = swiper.el;
4949      if (swiper.params.mousewheel.eventsTarget !== 'container') {
4950        targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);
4951      }
4952      const targetElContainsTarget = targetEl && targetEl.contains(e.target);
4953      if (!swiper.mouseEntered && !targetElContainsTarget && !params.releaseOnEdges) return true;
4954      if (e.originalEvent) e = e.originalEvent; // jquery fix
4955      let delta = 0;
4956      const rtlFactor = swiper.rtlTranslate ? -1 : 1;
4957      const data = normalize(e);
4958      if (params.forceToAxis) {
4959        if (swiper.isHorizontal()) {
4960          if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;
4961        } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;
4962      } else {
4963        delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
4964      }
4965      if (delta === 0) return true;
4966      if (params.invert) delta = -delta;
4967
4968      // Get the scroll positions
4969      let positions = swiper.getTranslate() + delta * params.sensitivity;
4970      if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();
4971      if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();
4972
4973      // When loop is true:
4974      //     the disableParentSwiper will be true.
4975      // When loop is false:
4976      //     if the scroll positions is not on edge,
4977      //     then the disableParentSwiper will be true.
4978      //     if the scroll on edge positions,
4979      //     then the disableParentSwiper will be false.
4980      disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());
4981      if (disableParentSwiper && swiper.params.nested) e.stopPropagation();
4982      if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {
4983        // Register the new event in a variable which stores the relevant data
4984        const newEvent = {
4985          time: now(),
4986          delta: Math.abs(delta),
4987          direction: Math.sign(delta),
4988          raw: event
4989        };
4990
4991        // Keep the most recent events
4992        if (recentWheelEvents.length >= 2) {
4993          recentWheelEvents.shift(); // only store the last N events
4994        }
4995
4996        const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
4997        recentWheelEvents.push(newEvent);
4998
4999        // If there is at least one previous recorded event:
5000        //   If direction has changed or
5001        //   if the scroll is quicker than the previous one:
5002        //     Animate the slider.
5003        // Else (this is the first time the wheel is moved):
5004        //     Animate the slider.
5005        if (prevEvent) {
5006          if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
5007            animateSlider(newEvent);
5008          }
5009        } else {
5010          animateSlider(newEvent);
5011        }
5012
5013        // If it's time to release the scroll:
5014        //   Return now so you don't hit the preventDefault.
5015        if (releaseScroll(newEvent)) {
5016          return true;
5017        }
5018      } else {
5019        // Freemode or scrollContainer:
5020
5021        // If we recently snapped after a momentum scroll, then ignore wheel events
5022        // to give time for the deceleration to finish. Stop ignoring after 500 msecs
5023        // or if it's a new scroll (larger delta or inverse sign as last event before
5024        // an end-of-momentum snap).
5025        const newEvent = {
5026          time: now(),
5027          delta: Math.abs(delta),
5028          direction: Math.sign(delta)
5029        };
5030        const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction;
5031        if (!ignoreWheelEvents) {
5032          lastEventBeforeSnap = undefined;
5033          let position = swiper.getTranslate() + delta * params.sensitivity;
5034          const wasBeginning = swiper.isBeginning;
5035          const wasEnd = swiper.isEnd;
5036          if (position >= swiper.minTranslate()) position = swiper.minTranslate();
5037          if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();
5038          swiper.setTransition(0);
5039          swiper.setTranslate(position);
5040          swiper.updateProgress();
5041          swiper.updateActiveIndex();
5042          swiper.updateSlidesClasses();
5043          if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {
5044            swiper.updateSlidesClasses();
5045          }
5046          if (swiper.params.loop) {
5047            swiper.loopFix({
5048              direction: newEvent.direction < 0 ? 'next' : 'prev',
5049              byMousewheel: true
5050            });
5051          }
5052          if (swiper.params.freeMode.sticky) {
5053            // When wheel scrolling starts with sticky (aka snap) enabled, then detect
5054            // the end of a momentum scroll by storing recent (N=15?) wheel events.
5055            // 1. do all N events have decreasing or same (absolute value) delta?
5056            // 2. did all N events arrive in the last M (M=500?) msecs?
5057            // 3. does the earliest event have an (absolute value) delta that's
5058            //    at least P (P=1?) larger than the most recent event's delta?
5059            // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
5060            // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration.
5061            // Snap immediately and ignore remaining wheel events in this scroll.
5062            // See comment above for "remaining wheel events in this scroll" determination.
5063            // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
5064            clearTimeout(timeout);
5065            timeout = undefined;
5066            if (recentWheelEvents.length >= 15) {
5067              recentWheelEvents.shift(); // only store the last N events
5068            }
5069
5070            const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
5071            const firstEvent = recentWheelEvents[0];
5072            recentWheelEvents.push(newEvent);
5073            if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) {
5074              // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
5075              recentWheelEvents.splice(0);
5076            } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) {
5077              // We're at the end of the deceleration of a momentum scroll, so there's no need
5078              // to wait for more events. Snap ASAP on the next tick.
5079              // Also, because there's some remaining momentum we'll bias the snap in the
5080              // direction of the ongoing scroll because it's better UX for the scroll to snap
5081              // in the same direction as the scroll instead of reversing to snap.  Therefore,
5082              // if it's already scrolled more than 20% in the current direction, keep going.
5083              const snapToThreshold = delta > 0 ? 0.8 : 0.2;
5084              lastEventBeforeSnap = newEvent;
5085              recentWheelEvents.splice(0);
5086              timeout = nextTick(() => {
5087                swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
5088              }, 0); // no delay; move on next tick
5089            }
5090
5091            if (!timeout) {
5092              // if we get here, then we haven't detected the end of a momentum scroll, so
5093              // we'll consider a scroll "complete" when there haven't been any wheel events
5094              // for 500ms.
5095              timeout = nextTick(() => {
5096                const snapToThreshold = 0.5;
5097                lastEventBeforeSnap = newEvent;
5098                recentWheelEvents.splice(0);
5099                swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
5100              }, 500);
5101            }
5102          }
5103
5104          // Emit event
5105          if (!ignoreWheelEvents) emit('scroll', e);
5106
5107          // Stop autoplay
5108          if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop();
5109          // Return page scroll on edge positions
5110          if (params.releaseOnEdges && (position === swiper.minTranslate() || position === swiper.maxTranslate())) {
5111            return true;
5112          }
5113        }
5114      }
5115      if (e.preventDefault) e.preventDefault();else e.returnValue = false;
5116      return false;
5117    }
5118    function events(method) {
5119      let targetEl = swiper.el;
5120      if (swiper.params.mousewheel.eventsTarget !== 'container') {
5121        targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);
5122      }
5123      targetEl[method]('mouseenter', handleMouseEnter);
5124      targetEl[method]('mouseleave', handleMouseLeave);
5125      targetEl[method]('wheel', handle);
5126    }
5127    function enable() {
5128      if (swiper.params.cssMode) {
5129        swiper.wrapperEl.removeEventListener('wheel', handle);
5130        return true;
5131      }
5132      if (swiper.mousewheel.enabled) return false;
5133      events('addEventListener');
5134      swiper.mousewheel.enabled = true;
5135      return true;
5136    }
5137    function disable() {
5138      if (swiper.params.cssMode) {
5139        swiper.wrapperEl.addEventListener(event, handle);
5140        return true;
5141      }
5142      if (!swiper.mousewheel.enabled) return false;
5143      events('removeEventListener');
5144      swiper.mousewheel.enabled = false;
5145      return true;
5146    }
5147    on('init', () => {
5148      if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
5149        disable();
5150      }
5151      if (swiper.params.mousewheel.enabled) enable();
5152    });
5153    on('destroy', () => {
5154      if (swiper.params.cssMode) {
5155        enable();
5156      }
5157      if (swiper.mousewheel.enabled) disable();
5158    });
5159    Object.assign(swiper.mousewheel, {
5160      enable,
5161      disable
5162    });
5163  }
5164
5165  function createElementIfNotDefined(swiper, originalParams, params, checkProps) {
5166    if (swiper.params.createElements) {
5167      Object.keys(checkProps).forEach(key => {
5168        if (!params[key] && params.auto === true) {
5169          let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];
5170          if (!element) {
5171            element = createElement('div', checkProps[key]);
5172            element.className = checkProps[key];
5173            swiper.el.append(element);
5174          }
5175          params[key] = element;
5176          originalParams[key] = element;
5177        }
5178      });
5179    }
5180    return params;
5181  }
5182
5183  function Navigation(_ref) {
5184    let {
5185      swiper,
5186      extendParams,
5187      on,
5188      emit
5189    } = _ref;
5190    extendParams({
5191      navigation: {
5192        nextEl: null,
5193        prevEl: null,
5194        hideOnClick: false,
5195        disabledClass: 'swiper-button-disabled',
5196        hiddenClass: 'swiper-button-hidden',
5197        lockClass: 'swiper-button-lock',
5198        navigationDisabledClass: 'swiper-navigation-disabled'
5199      }
5200    });
5201    swiper.navigation = {
5202      nextEl: null,
5203      prevEl: null
5204    };
5205    const makeElementsArray = el => (Array.isArray(el) ? el : [el]).filter(e => !!e);
5206    function getEl(el) {
5207      let res;
5208      if (el && typeof el === 'string' && swiper.isElement) {
5209        res = swiper.el.querySelector(el);
5210        if (res) return res;
5211      }
5212      if (el) {
5213        if (typeof el === 'string') res = [...document.querySelectorAll(el)];
5214        if (swiper.params.uniqueNavElements && typeof el === 'string' && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {
5215          res = swiper.el.querySelector(el);
5216        }
5217      }
5218      if (el && !res) return el;
5219      // if (Array.isArray(res) && res.length === 1) res = res[0];
5220      return res;
5221    }
5222    function toggleEl(el, disabled) {
5223      const params = swiper.params.navigation;
5224      el = makeElementsArray(el);
5225      el.forEach(subEl => {
5226        if (subEl) {
5227          subEl.classList[disabled ? 'add' : 'remove'](...params.disabledClass.split(' '));
5228          if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;
5229          if (swiper.params.watchOverflow && swiper.enabled) {
5230            subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
5231          }
5232        }
5233      });
5234    }
5235    function update() {
5236      // Update Navigation Buttons
5237      const {
5238        nextEl,
5239        prevEl
5240      } = swiper.navigation;
5241      if (swiper.params.loop) {
5242        toggleEl(prevEl, false);
5243        toggleEl(nextEl, false);
5244        return;
5245      }
5246      toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);
5247      toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);
5248    }
5249    function onPrevClick(e) {
5250      e.preventDefault();
5251      if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;
5252      swiper.slidePrev();
5253      emit('navigationPrev');
5254    }
5255    function onNextClick(e) {
5256      e.preventDefault();
5257      if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;
5258      swiper.slideNext();
5259      emit('navigationNext');
5260    }
5261    function init() {
5262      const params = swiper.params.navigation;
5263      swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {
5264        nextEl: 'swiper-button-next',
5265        prevEl: 'swiper-button-prev'
5266      });
5267      if (!(params.nextEl || params.prevEl)) return;
5268      let nextEl = getEl(params.nextEl);
5269      let prevEl = getEl(params.prevEl);
5270      Object.assign(swiper.navigation, {
5271        nextEl,
5272        prevEl
5273      });
5274      nextEl = makeElementsArray(nextEl);
5275      prevEl = makeElementsArray(prevEl);
5276      const initButton = (el, dir) => {
5277        if (el) {
5278          el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
5279        }
5280        if (!swiper.enabled && el) {
5281          el.classList.add(...params.lockClass.split(' '));
5282        }
5283      };
5284      nextEl.forEach(el => initButton(el, 'next'));
5285      prevEl.forEach(el => initButton(el, 'prev'));
5286    }
5287    function destroy() {
5288      let {
5289        nextEl,
5290        prevEl
5291      } = swiper.navigation;
5292      nextEl = makeElementsArray(nextEl);
5293      prevEl = makeElementsArray(prevEl);
5294      const destroyButton = (el, dir) => {
5295        el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
5296        el.classList.remove(...swiper.params.navigation.disabledClass.split(' '));
5297      };
5298      nextEl.forEach(el => destroyButton(el, 'next'));
5299      prevEl.forEach(el => destroyButton(el, 'prev'));
5300    }
5301    on('init', () => {
5302      if (swiper.params.navigation.enabled === false) {
5303        // eslint-disable-next-line
5304        disable();
5305      } else {
5306        init();
5307        update();
5308      }
5309    });
5310    on('toEdge fromEdge lock unlock', () => {
5311      update();
5312    });
5313    on('destroy', () => {
5314      destroy();
5315    });
5316    on('enable disable', () => {
5317      let {
5318        nextEl,
5319        prevEl
5320      } = swiper.navigation;
5321      nextEl = makeElementsArray(nextEl);
5322      prevEl = makeElementsArray(prevEl);
5323      if (swiper.enabled) {
5324        update();
5325        return;
5326      }
5327      [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.add(swiper.params.navigation.lockClass));
5328    });
5329    on('click', (_s, e) => {
5330      let {
5331        nextEl,
5332        prevEl
5333      } = swiper.navigation;
5334      nextEl = makeElementsArray(nextEl);
5335      prevEl = makeElementsArray(prevEl);
5336      const targetEl = e.target;
5337      if (swiper.params.navigation.hideOnClick && !prevEl.includes(targetEl) && !nextEl.includes(targetEl)) {
5338        if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;
5339        let isHidden;
5340        if (nextEl.length) {
5341          isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);
5342        } else if (prevEl.length) {
5343          isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);
5344        }
5345        if (isHidden === true) {
5346          emit('navigationShow');
5347        } else {
5348          emit('navigationHide');
5349        }
5350        [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.toggle(swiper.params.navigation.hiddenClass));
5351      }
5352    });
5353    const enable = () => {
5354      swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(' '));
5355      init();
5356      update();
5357    };
5358    const disable = () => {
5359      swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(' '));
5360      destroy();
5361    };
5362    Object.assign(swiper.navigation, {
5363      enable,
5364      disable,
5365      update,
5366      init,
5367      destroy
5368    });
5369  }
5370
5371  function classesToSelector(classes) {
5372    if (classes === void 0) {
5373      classes = '';
5374    }
5375    return `.${classes.trim().replace(/([\.:!+\/])/g, '\\$1') // eslint-disable-line
5376  .replace(/ /g, '.')}`;
5377  }
5378
5379  function Pagination(_ref) {
5380    let {
5381      swiper,
5382      extendParams,
5383      on,
5384      emit
5385    } = _ref;
5386    const pfx = 'swiper-pagination';
5387    extendParams({
5388      pagination: {
5389        el: null,
5390        bulletElement: 'span',
5391        clickable: false,
5392        hideOnClick: false,
5393        renderBullet: null,
5394        renderProgressbar: null,
5395        renderFraction: null,
5396        renderCustom: null,
5397        progressbarOpposite: false,
5398        type: 'bullets',
5399        // 'bullets' or 'progressbar' or 'fraction' or 'custom'
5400        dynamicBullets: false,
5401        dynamicMainBullets: 1,
5402        formatFractionCurrent: number => number,
5403        formatFractionTotal: number => number,
5404        bulletClass: `${pfx}-bullet`,
5405        bulletActiveClass: `${pfx}-bullet-active`,
5406        modifierClass: `${pfx}-`,
5407        currentClass: `${pfx}-current`,
5408        totalClass: `${pfx}-total`,
5409        hiddenClass: `${pfx}-hidden`,
5410        progressbarFillClass: `${pfx}-progressbar-fill`,
5411        progressbarOppositeClass: `${pfx}-progressbar-opposite`,
5412        clickableClass: `${pfx}-clickable`,
5413        lockClass: `${pfx}-lock`,
5414        horizontalClass: `${pfx}-horizontal`,
5415        verticalClass: `${pfx}-vertical`,
5416        paginationDisabledClass: `${pfx}-disabled`
5417      }
5418    });
5419    swiper.pagination = {
5420      el: null,
5421      bullets: []
5422    };
5423    let bulletSize;
5424    let dynamicBulletIndex = 0;
5425    const makeElementsArray = el => (Array.isArray(el) ? el : [el]).filter(e => !!e);
5426    function isPaginationDisabled() {
5427      return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0;
5428    }
5429    function setSideBullets(bulletEl, position) {
5430      const {
5431        bulletActiveClass
5432      } = swiper.params.pagination;
5433      if (!bulletEl) return;
5434      bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];
5435      if (bulletEl) {
5436        bulletEl.classList.add(`${bulletActiveClass}-${position}`);
5437        bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];
5438        if (bulletEl) {
5439          bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`);
5440        }
5441      }
5442    }
5443    function onBulletClick(e) {
5444      const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass));
5445      if (!bulletEl) {
5446        return;
5447      }
5448      e.preventDefault();
5449      const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup;
5450      if (swiper.params.loop) {
5451        if (swiper.realIndex === index) return;
5452        swiper.slideToLoop(index);
5453      } else {
5454        swiper.slideTo(index);
5455      }
5456    }
5457    function update() {
5458      // Render || Update Pagination bullets/items
5459      const rtl = swiper.rtl;
5460      const params = swiper.params.pagination;
5461      if (isPaginationDisabled()) return;
5462      let el = swiper.pagination.el;
5463      el = makeElementsArray(el);
5464      // Current/Total
5465      let current;
5466      let previousIndex;
5467      const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
5468      const total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
5469      if (swiper.params.loop) {
5470        previousIndex = swiper.previousRealIndex || 0;
5471        current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex;
5472      } else if (typeof swiper.snapIndex !== 'undefined') {
5473        current = swiper.snapIndex;
5474        previousIndex = swiper.previousSnapIndex;
5475      } else {
5476        previousIndex = swiper.previousIndex || 0;
5477        current = swiper.activeIndex || 0;
5478      }
5479      // Types
5480      if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
5481        const bullets = swiper.pagination.bullets;
5482        let firstIndex;
5483        let lastIndex;
5484        let midIndex;
5485        if (params.dynamicBullets) {
5486          bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? 'width' : 'height', true);
5487          el.forEach(subEl => {
5488            subEl.style[swiper.isHorizontal() ? 'width' : 'height'] = `${bulletSize * (params.dynamicMainBullets + 4)}px`;
5489          });
5490          if (params.dynamicMainBullets > 1 && previousIndex !== undefined) {
5491            dynamicBulletIndex += current - (previousIndex || 0);
5492            if (dynamicBulletIndex > params.dynamicMainBullets - 1) {
5493              dynamicBulletIndex = params.dynamicMainBullets - 1;
5494            } else if (dynamicBulletIndex < 0) {
5495              dynamicBulletIndex = 0;
5496            }
5497          }
5498          firstIndex = Math.max(current - dynamicBulletIndex, 0);
5499          lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
5500          midIndex = (lastIndex + firstIndex) / 2;
5501        }
vendor: 5,261 bytes, lines 5502-5612
5502        bullets.forEach(bulletEl => {
5503          const classesToRemove = [...['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`)].map(s => typeof s === 'string' && s.includes(' ') ? s.split(' ') : s).flat();
5504          bulletEl.classList.remove(...classesToRemove);
5505        });
5506        if (el.length > 1) {
5507          bullets.forEach(bullet => {
5508            const bulletIndex = elementIndex(bullet);
5509            if (bulletIndex === current) {
5510              bullet.classList.add(...params.bulletActiveClass.split(' '));
5511            } else if (swiper.isElement) {
5512              bullet.setAttribute('part', 'bullet');
5513            }
5514            if (params.dynamicBullets) {
5515              if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
5516                bullet.classList.add(...`${params.bulletActiveClass}-main`.split(' '));
5517              }
5518              if (bulletIndex === firstIndex) {
5519                setSideBullets(bullet, 'prev');
5520              }
5521              if (bulletIndex === lastIndex) {
5522                setSideBullets(bullet, 'next');
5523              }
5524            }
5525          });
5526        } else {
5527          const bullet = bullets[current];
5528          if (bullet) {
5529            bullet.classList.add(...params.bulletActiveClass.split(' '));
5530          }
5531          if (swiper.isElement) {
5532            bullets.forEach((bulletEl, bulletIndex) => {
5533              bulletEl.setAttribute('part', bulletIndex === current ? 'bullet-active' : 'bullet');
5534            });
5535          }
5536          if (params.dynamicBullets) {
5537            const firstDisplayedBullet = bullets[firstIndex];
5538            const lastDisplayedBullet = bullets[lastIndex];
5539            for (let i = firstIndex; i <= lastIndex; i += 1) {
5540              if (bullets[i]) {
5541                bullets[i].classList.add(...`${params.bulletActiveClass}-main`.split(' '));
5542              }
5543            }
5544            setSideBullets(firstDisplayedBullet, 'prev');
5545            setSideBullets(lastDisplayedBullet, 'next');
5546          }
5547        }
5548        if (params.dynamicBullets) {
5549          const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
5550          const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;
5551          const offsetProp = rtl ? 'right' : 'left';
5552          bullets.forEach(bullet => {
5553            bullet.style[swiper.isHorizontal() ? offsetProp : 'top'] = `${bulletsOffset}px`;
5554          });
5555        }
5556      }
5557      el.forEach((subEl, subElIndex) => {
5558        if (params.type === 'fraction') {
5559          subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach(fractionEl => {
5560            fractionEl.textContent = params.formatFractionCurrent(current + 1);
5561          });
5562          subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach(totalEl => {
5563            totalEl.textContent = params.formatFractionTotal(total);
5564          });
5565        }
5566        if (params.type === 'progressbar') {
5567          let progressbarDirection;
5568          if (params.progressbarOpposite) {
5569            progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
5570          } else {
5571            progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
5572          }
5573          const scale = (current + 1) / total;
5574          let scaleX = 1;
5575          let scaleY = 1;
5576          if (progressbarDirection === 'horizontal') {
5577            scaleX = scale;
5578          } else {
5579            scaleY = scale;
5580          }
5581          subEl.querySelectorAll(classesToSelector(params.progressbarFillClass)).forEach(progressEl => {
5582            progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`;
5583            progressEl.style.transitionDuration = `${swiper.params.speed}ms`;
5584          });
5585        }
5586        if (params.type === 'custom' && params.renderCustom) {
5587          subEl.innerHTML = params.renderCustom(swiper, current + 1, total);
5588          if (subElIndex === 0) emit('paginationRender', subEl);
5589        } else {
5590          if (subElIndex === 0) emit('paginationRender', subEl);
5591          emit('paginationUpdate', subEl);
5592        }
5593        if (swiper.params.watchOverflow && swiper.enabled) {
5594          subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
5595        }
5596      });
5597    }
5598    function render() {
5599      // Render Container
5600      const params = swiper.params.pagination;
5601      if (isPaginationDisabled()) return;
5602      const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.grid && swiper.params.grid.rows > 1 ? swiper.slides.length / Math.ceil(swiper.params.grid.rows) : swiper.slides.length;
5603      let el = swiper.pagination.el;
5604      el = makeElementsArray(el);
5605      let paginationHTML = '';
5606      if (params.type === 'bullets') {
5607        let numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
5608        if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) {
5609          numberOfBullets = slidesLength;
5610        }
5611        for (let i = 0; i < numberOfBullets; i += 1) {
5612          if (params.renderBullet) {
vendor: 96,760 bytes, lines 5613-8357
5613            paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
5614          } else {
5615            // prettier-ignore
5616            paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part="bullet"' : ''} class="${params.bulletClass}"></${params.bulletElement}>`;
5617          }
5618        }
5619      }
5620      if (params.type === 'fraction') {
5621        if (params.renderFraction) {
5622          paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
5623        } else {
5624          paginationHTML = `<span class="${params.currentClass}"></span>` + ' / ' + `<span class="${params.totalClass}"></span>`;
5625        }
5626      }
5627      if (params.type === 'progressbar') {
5628        if (params.renderProgressbar) {
5629          paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
5630        } else {
5631          paginationHTML = `<span class="${params.progressbarFillClass}"></span>`;
5632        }
5633      }
5634      swiper.pagination.bullets = [];
5635      el.forEach(subEl => {
5636        if (params.type !== 'custom') {
5637          subEl.innerHTML = paginationHTML || '';
5638        }
5639        if (params.type === 'bullets') {
5640          swiper.pagination.bullets.push(...subEl.querySelectorAll(classesToSelector(params.bulletClass)));
5641        }
5642      });
5643      if (params.type !== 'custom') {
5644        emit('paginationRender', el[0]);
5645      }
5646    }
5647    function init() {
5648      swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {
5649        el: 'swiper-pagination'
5650      });
5651      const params = swiper.params.pagination;
5652      if (!params.el) return;
5653      let el;
5654      if (typeof params.el === 'string' && swiper.isElement) {
5655        el = swiper.el.querySelector(params.el);
5656      }
5657      if (!el && typeof params.el === 'string') {
5658        el = [...document.querySelectorAll(params.el)];
5659      }
5660      if (!el) {
5661        el = params.el;
5662      }
5663      if (!el || el.length === 0) return;
5664      if (swiper.params.uniqueNavElements && typeof params.el === 'string' && Array.isArray(el) && el.length > 1) {
5665        el = [...swiper.el.querySelectorAll(params.el)];
5666        // check if it belongs to another nested Swiper
5667        if (el.length > 1) {
5668          el = el.filter(subEl => {
5669            if (elementParents(subEl, '.swiper')[0] !== swiper.el) return false;
5670            return true;
5671          })[0];
5672        }
5673      }
5674      if (Array.isArray(el) && el.length === 1) el = el[0];
5675      Object.assign(swiper.pagination, {
5676        el
5677      });
5678      el = makeElementsArray(el);
5679      el.forEach(subEl => {
5680        if (params.type === 'bullets' && params.clickable) {
5681          subEl.classList.add(...(params.clickableClass || '').split(' '));
5682        }
5683        subEl.classList.add(params.modifierClass + params.type);
5684        subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
5685        if (params.type === 'bullets' && params.dynamicBullets) {
5686          subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`);
5687          dynamicBulletIndex = 0;
5688          if (params.dynamicMainBullets < 1) {
5689            params.dynamicMainBullets = 1;
5690          }
5691        }
5692        if (params.type === 'progressbar' && params.progressbarOpposite) {
5693          subEl.classList.add(params.progressbarOppositeClass);
5694        }
5695        if (params.clickable) {
5696          subEl.addEventListener('click', onBulletClick);
5697        }
5698        if (!swiper.enabled) {
5699          subEl.classList.add(params.lockClass);
5700        }
5701      });
5702    }
5703    function destroy() {
5704      const params = swiper.params.pagination;
5705      if (isPaginationDisabled()) return;
5706      let el = swiper.pagination.el;
5707      if (el) {
5708        el = makeElementsArray(el);
5709        el.forEach(subEl => {
5710          subEl.classList.remove(params.hiddenClass);
5711          subEl.classList.remove(params.modifierClass + params.type);
5712          subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
5713          if (params.clickable) {
5714            subEl.classList.remove(...(params.clickableClass || '').split(' '));
5715            subEl.removeEventListener('click', onBulletClick);
5716          }
5717        });
5718      }
5719      if (swiper.pagination.bullets) swiper.pagination.bullets.forEach(subEl => subEl.classList.remove(...params.bulletActiveClass.split(' ')));
5720    }
5721    on('changeDirection', () => {
5722      if (!swiper.pagination || !swiper.pagination.el) return;
5723      const params = swiper.params.pagination;
5724      let {
5725        el
5726      } = swiper.pagination;
5727      el = makeElementsArray(el);
5728      el.forEach(subEl => {
5729        subEl.classList.remove(params.horizontalClass, params.verticalClass);
5730        subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
5731      });
5732    });
5733    on('init', () => {
5734      if (swiper.params.pagination.enabled === false) {
5735        // eslint-disable-next-line
5736        disable();
5737      } else {
5738        init();
5739        render();
5740        update();
5741      }
5742    });
5743    on('activeIndexChange', () => {
5744      if (typeof swiper.snapIndex === 'undefined') {
5745        update();
5746      }
5747    });
5748    on('snapIndexChange', () => {
5749      update();
5750    });
5751    on('snapGridLengthChange', () => {
5752      render();
5753      update();
5754    });
5755    on('destroy', () => {
5756      destroy();
5757    });
5758    on('enable disable', () => {
5759      let {
5760        el
5761      } = swiper.pagination;
5762      if (el) {
5763        el = makeElementsArray(el);
5764        el.forEach(subEl => subEl.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.pagination.lockClass));
5765      }
5766    });
5767    on('lock unlock', () => {
5768      update();
5769    });
5770    on('click', (_s, e) => {
5771      const targetEl = e.target;
5772      const el = makeElementsArray(swiper.pagination.el);
5773      if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) {
5774        if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;
5775        const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass);
5776        if (isHidden === true) {
5777          emit('paginationShow');
5778        } else {
5779          emit('paginationHide');
5780        }
5781        el.forEach(subEl => subEl.classList.toggle(swiper.params.pagination.hiddenClass));
5782      }
5783    });
5784    const enable = () => {
5785      swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass);
5786      let {
5787        el
5788      } = swiper.pagination;
5789      if (el) {
5790        el = makeElementsArray(el);
5791        el.forEach(subEl => subEl.classList.remove(swiper.params.pagination.paginationDisabledClass));
5792      }
5793      init();
5794      render();
5795      update();
5796    };
5797    const disable = () => {
5798      swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass);
5799      let {
5800        el
5801      } = swiper.pagination;
5802      if (el) {
5803        el = makeElementsArray(el);
5804        el.forEach(subEl => subEl.classList.add(swiper.params.pagination.paginationDisabledClass));
5805      }
5806      destroy();
5807    };
5808    Object.assign(swiper.pagination, {
5809      enable,
5810      disable,
5811      render,
5812      update,
5813      init,
5814      destroy
5815    });
5816  }
5817
5818  function Scrollbar(_ref) {
5819    let {
5820      swiper,
5821      extendParams,
5822      on,
5823      emit
5824    } = _ref;
5825    const document = getDocument();
5826    let isTouched = false;
5827    let timeout = null;
5828    let dragTimeout = null;
5829    let dragStartPos;
5830    let dragSize;
5831    let trackSize;
5832    let divider;
5833    extendParams({
5834      scrollbar: {
5835        el: null,
5836        dragSize: 'auto',
5837        hide: false,
5838        draggable: false,
5839        snapOnRelease: true,
5840        lockClass: 'swiper-scrollbar-lock',
5841        dragClass: 'swiper-scrollbar-drag',
5842        scrollbarDisabledClass: 'swiper-scrollbar-disabled',
5843        horizontalClass: `swiper-scrollbar-horizontal`,
5844        verticalClass: `swiper-scrollbar-vertical`
5845      }
5846    });
5847    swiper.scrollbar = {
5848      el: null,
5849      dragEl: null
5850    };
5851    function setTranslate() {
5852      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
5853      const {
5854        scrollbar,
5855        rtlTranslate: rtl
5856      } = swiper;
5857      const {
5858        dragEl,
5859        el
5860      } = scrollbar;
5861      const params = swiper.params.scrollbar;
5862      const progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;
5863      let newSize = dragSize;
5864      let newPos = (trackSize - dragSize) * progress;
5865      if (rtl) {
5866        newPos = -newPos;
5867        if (newPos > 0) {
5868          newSize = dragSize - newPos;
5869          newPos = 0;
5870        } else if (-newPos + dragSize > trackSize) {
5871          newSize = trackSize + newPos;
5872        }
5873      } else if (newPos < 0) {
5874        newSize = dragSize + newPos;
5875        newPos = 0;
5876      } else if (newPos + dragSize > trackSize) {
5877        newSize = trackSize - newPos;
5878      }
5879      if (swiper.isHorizontal()) {
5880        dragEl.style.transform = `translate3d(${newPos}px, 0, 0)`;
5881        dragEl.style.width = `${newSize}px`;
5882      } else {
5883        dragEl.style.transform = `translate3d(0px, ${newPos}px, 0)`;
5884        dragEl.style.height = `${newSize}px`;
5885      }
5886      if (params.hide) {
5887        clearTimeout(timeout);
5888        el.style.opacity = 1;
5889        timeout = setTimeout(() => {
5890          el.style.opacity = 0;
5891          el.style.transitionDuration = '400ms';
5892        }, 1000);
5893      }
5894    }
5895    function setTransition(duration) {
5896      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
5897      swiper.scrollbar.dragEl.style.transitionDuration = `${duration}ms`;
5898    }
5899    function updateSize() {
5900      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
5901      const {
5902        scrollbar
5903      } = swiper;
5904      const {
5905        dragEl,
5906        el
5907      } = scrollbar;
5908      dragEl.style.width = '';
5909      dragEl.style.height = '';
5910      trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;
5911      divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));
5912      if (swiper.params.scrollbar.dragSize === 'auto') {
5913        dragSize = trackSize * divider;
5914      } else {
5915        dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
5916      }
5917      if (swiper.isHorizontal()) {
5918        dragEl.style.width = `${dragSize}px`;
5919      } else {
5920        dragEl.style.height = `${dragSize}px`;
5921      }
5922      if (divider >= 1) {
5923        el.style.display = 'none';
5924      } else {
5925        el.style.display = '';
5926      }
5927      if (swiper.params.scrollbar.hide) {
5928        el.style.opacity = 0;
5929      }
5930      if (swiper.params.watchOverflow && swiper.enabled) {
5931        scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);
5932      }
5933    }
5934    function getPointerPosition(e) {
5935      return swiper.isHorizontal() ? e.clientX : e.clientY;
5936    }
5937    function setDragPosition(e) {
5938      const {
5939        scrollbar,
5940        rtlTranslate: rtl
5941      } = swiper;
5942      const {
5943        el
5944      } = scrollbar;
5945      let positionRatio;
5946      positionRatio = (getPointerPosition(e) - elementOffset(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
5947      positionRatio = Math.max(Math.min(positionRatio, 1), 0);
5948      if (rtl) {
5949        positionRatio = 1 - positionRatio;
5950      }
5951      const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;
5952      swiper.updateProgress(position);
5953      swiper.setTranslate(position);
5954      swiper.updateActiveIndex();
5955      swiper.updateSlidesClasses();
5956    }
5957    function onDragStart(e) {
5958      const params = swiper.params.scrollbar;
5959      const {
5960        scrollbar,
5961        wrapperEl
5962      } = swiper;
5963      const {
5964        el,
5965        dragEl
5966      } = scrollbar;
5967      isTouched = true;
5968      dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
5969      e.preventDefault();
5970      e.stopPropagation();
5971      wrapperEl.style.transitionDuration = '100ms';
5972      dragEl.style.transitionDuration = '100ms';
5973      setDragPosition(e);
5974      clearTimeout(dragTimeout);
5975      el.style.transitionDuration = '0ms';
5976      if (params.hide) {
5977        el.style.opacity = 1;
5978      }
5979      if (swiper.params.cssMode) {
5980        swiper.wrapperEl.style['scroll-snap-type'] = 'none';
5981      }
5982      emit('scrollbarDragStart', e);
5983    }
5984    function onDragMove(e) {
5985      const {
5986        scrollbar,
5987        wrapperEl
5988      } = swiper;
5989      const {
5990        el,
5991        dragEl
5992      } = scrollbar;
5993      if (!isTouched) return;
5994      if (e.preventDefault) e.preventDefault();else e.returnValue = false;
5995      setDragPosition(e);
5996      wrapperEl.style.transitionDuration = '0ms';
5997      el.style.transitionDuration = '0ms';
5998      dragEl.style.transitionDuration = '0ms';
5999      emit('scrollbarDragMove', e);
6000    }
6001    function onDragEnd(e) {
6002      const params = swiper.params.scrollbar;
6003      const {
6004        scrollbar,
6005        wrapperEl
6006      } = swiper;
6007      const {
6008        el
6009      } = scrollbar;
6010      if (!isTouched) return;
6011      isTouched = false;
6012      if (swiper.params.cssMode) {
6013        swiper.wrapperEl.style['scroll-snap-type'] = '';
6014        wrapperEl.style.transitionDuration = '';
6015      }
6016      if (params.hide) {
6017        clearTimeout(dragTimeout);
6018        dragTimeout = nextTick(() => {
6019          el.style.opacity = 0;
6020          el.style.transitionDuration = '400ms';
6021        }, 1000);
6022      }
6023      emit('scrollbarDragEnd', e);
6024      if (params.snapOnRelease) {
6025        swiper.slideToClosest();
6026      }
6027    }
6028    function events(method) {
6029      const {
6030        scrollbar,
6031        params
6032      } = swiper;
6033      const el = scrollbar.el;
6034      if (!el) return;
6035      const target = el;
6036      const activeListener = params.passiveListeners ? {
6037        passive: false,
6038        capture: false
6039      } : false;
6040      const passiveListener = params.passiveListeners ? {
6041        passive: true,
6042        capture: false
6043      } : false;
6044      if (!target) return;
6045      const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
6046      target[eventMethod]('pointerdown', onDragStart, activeListener);
6047      document[eventMethod]('pointermove', onDragMove, activeListener);
6048      document[eventMethod]('pointerup', onDragEnd, passiveListener);
6049    }
6050    function enableDraggable() {
6051      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
6052      events('on');
6053    }
6054    function disableDraggable() {
6055      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
6056      events('off');
6057    }
6058    function init() {
6059      const {
6060        scrollbar,
6061        el: swiperEl
6062      } = swiper;
6063      swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {
6064        el: 'swiper-scrollbar'
6065      });
6066      const params = swiper.params.scrollbar;
6067      if (!params.el) return;
6068      let el;
6069      if (typeof params.el === 'string' && swiper.isElement) {
6070        el = swiper.el.querySelector(params.el);
6071      }
6072      if (!el && typeof params.el === 'string') {
6073        el = document.querySelectorAll(params.el);
6074        if (!el.length) return;
6075      } else if (!el) {
6076        el = params.el;
6077      }
6078      if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) {
6079        el = swiperEl.querySelector(params.el);
6080      }
6081      if (el.length > 0) el = el[0];
6082      el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
6083      let dragEl;
6084      if (el) {
6085        dragEl = el.querySelector(classesToSelector(swiper.params.scrollbar.dragClass));
6086        if (!dragEl) {
6087          dragEl = createElement('div', swiper.params.scrollbar.dragClass);
6088          el.append(dragEl);
6089        }
6090      }
6091      Object.assign(scrollbar, {
6092        el,
6093        dragEl
6094      });
6095      if (params.draggable) {
6096        enableDraggable();
6097      }
6098      if (el) {
6099        el.classList[swiper.enabled ? 'remove' : 'add'](...classesToTokens(swiper.params.scrollbar.lockClass));
6100      }
6101    }
6102    function destroy() {
6103      const params = swiper.params.scrollbar;
6104      const el = swiper.scrollbar.el;
6105      if (el) {
6106        el.classList.remove(...classesToTokens(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass));
6107      }
6108      disableDraggable();
6109    }
6110    on('init', () => {
6111      if (swiper.params.scrollbar.enabled === false) {
6112        // eslint-disable-next-line
6113        disable();
6114      } else {
6115        init();
6116        updateSize();
6117        setTranslate();
6118      }
6119    });
6120    on('update resize observerUpdate lock unlock', () => {
6121      updateSize();
6122    });
6123    on('setTranslate', () => {
6124      setTranslate();
6125    });
6126    on('setTransition', (_s, duration) => {
6127      setTransition(duration);
6128    });
6129    on('enable disable', () => {
6130      const {
6131        el
6132      } = swiper.scrollbar;
6133      if (el) {
6134        el.classList[swiper.enabled ? 'remove' : 'add'](...classesToTokens(swiper.params.scrollbar.lockClass));
6135      }
6136    });
6137    on('destroy', () => {
6138      destroy();
6139    });
6140    const enable = () => {
6141      swiper.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));
6142      if (swiper.scrollbar.el) {
6143        swiper.scrollbar.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));
6144      }
6145      init();
6146      updateSize();
6147      setTranslate();
6148    };
6149    const disable = () => {
6150      swiper.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));
6151      if (swiper.scrollbar.el) {
6152        swiper.scrollbar.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));
6153      }
6154      destroy();
6155    };
6156    Object.assign(swiper.scrollbar, {
6157      enable,
6158      disable,
6159      updateSize,
6160      setTranslate,
6161      init,
6162      destroy
6163    });
6164  }
6165
6166  function Parallax(_ref) {
6167    let {
6168      swiper,
6169      extendParams,
6170      on
6171    } = _ref;
6172    extendParams({
6173      parallax: {
6174        enabled: false
6175      }
6176    });
6177    const elementsSelector = '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]';
6178    const setTransform = (el, progress) => {
6179      const {
6180        rtl
6181      } = swiper;
6182      const rtlFactor = rtl ? -1 : 1;
6183      const p = el.getAttribute('data-swiper-parallax') || '0';
6184      let x = el.getAttribute('data-swiper-parallax-x');
6185      let y = el.getAttribute('data-swiper-parallax-y');
6186      const scale = el.getAttribute('data-swiper-parallax-scale');
6187      const opacity = el.getAttribute('data-swiper-parallax-opacity');
6188      const rotate = el.getAttribute('data-swiper-parallax-rotate');
6189      if (x || y) {
6190        x = x || '0';
6191        y = y || '0';
6192      } else if (swiper.isHorizontal()) {
6193        x = p;
6194        y = '0';
6195      } else {
6196        y = p;
6197        x = '0';
6198      }
6199      if (x.indexOf('%') >= 0) {
6200        x = `${parseInt(x, 10) * progress * rtlFactor}%`;
6201      } else {
6202        x = `${x * progress * rtlFactor}px`;
6203      }
6204      if (y.indexOf('%') >= 0) {
6205        y = `${parseInt(y, 10) * progress}%`;
6206      } else {
6207        y = `${y * progress}px`;
6208      }
6209      if (typeof opacity !== 'undefined' && opacity !== null) {
6210        const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));
6211        el.style.opacity = currentOpacity;
6212      }
6213      let transform = `translate3d(${x}, ${y}, 0px)`;
6214      if (typeof scale !== 'undefined' && scale !== null) {
6215        const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));
6216        transform += ` scale(${currentScale})`;
6217      }
6218      if (rotate && typeof rotate !== 'undefined' && rotate !== null) {
6219        const currentRotate = rotate * progress * -1;
6220        transform += ` rotate(${currentRotate}deg)`;
6221      }
6222      el.style.transform = transform;
6223    };
6224    const setTranslate = () => {
6225      const {
6226        el,
6227        slides,
6228        progress,
6229        snapGrid,
6230        isElement
6231      } = swiper;
6232      const elements = elementChildren(el, elementsSelector);
6233      if (swiper.isElement) {
6234        elements.push(...elementChildren(swiper.hostEl, elementsSelector));
6235      }
6236      elements.forEach(subEl => {
6237        setTransform(subEl, progress);
6238      });
6239      slides.forEach((slideEl, slideIndex) => {
6240        let slideProgress = slideEl.progress;
6241        if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
6242          slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);
6243        }
6244        slideProgress = Math.min(Math.max(slideProgress, -1), 1);
6245        slideEl.querySelectorAll(`${elementsSelector}, [data-swiper-parallax-rotate]`).forEach(subEl => {
6246          setTransform(subEl, slideProgress);
6247        });
6248      });
6249    };
6250    const setTransition = function (duration) {
6251      if (duration === void 0) {
6252        duration = swiper.params.speed;
6253      }
6254      const {
6255        el,
6256        hostEl
6257      } = swiper;
6258      const elements = [...el.querySelectorAll(elementsSelector)];
6259      if (swiper.isElement) {
6260        elements.push(...hostEl.querySelectorAll(elementsSelector));
6261      }
6262      elements.forEach(parallaxEl => {
6263        let parallaxDuration = parseInt(parallaxEl.getAttribute('data-swiper-parallax-duration'), 10) || duration;
6264        if (duration === 0) parallaxDuration = 0;
6265        parallaxEl.style.transitionDuration = `${parallaxDuration}ms`;
6266      });
6267    };
6268    on('beforeInit', () => {
6269      if (!swiper.params.parallax.enabled) return;
6270      swiper.params.watchSlidesProgress = true;
6271      swiper.originalParams.watchSlidesProgress = true;
6272    });
6273    on('init', () => {
6274      if (!swiper.params.parallax.enabled) return;
6275      setTranslate();
6276    });
6277    on('setTranslate', () => {
6278      if (!swiper.params.parallax.enabled) return;
6279      setTranslate();
6280    });
6281    on('setTransition', (_swiper, duration) => {
6282      if (!swiper.params.parallax.enabled) return;
6283      setTransition(duration);
6284    });
6285  }
6286
6287  function Zoom(_ref) {
6288    let {
6289      swiper,
6290      extendParams,
6291      on,
6292      emit
6293    } = _ref;
6294    const window = getWindow();
6295    extendParams({
6296      zoom: {
6297        enabled: false,
6298        maxRatio: 3,
6299        minRatio: 1,
6300        toggle: true,
6301        containerClass: 'swiper-zoom-container',
6302        zoomedSlideClass: 'swiper-slide-zoomed'
6303      }
6304    });
6305    swiper.zoom = {
6306      enabled: false
6307    };
6308    let currentScale = 1;
6309    let isScaling = false;
6310    let fakeGestureTouched;
6311    let fakeGestureMoved;
6312    const evCache = [];
6313    const gesture = {
6314      originX: 0,
6315      originY: 0,
6316      slideEl: undefined,
6317      slideWidth: undefined,
6318      slideHeight: undefined,
6319      imageEl: undefined,
6320      imageWrapEl: undefined,
6321      maxRatio: 3
6322    };
6323    const image = {
6324      isTouched: undefined,
6325      isMoved: undefined,
6326      currentX: undefined,
6327      currentY: undefined,
6328      minX: undefined,
6329      minY: undefined,
6330      maxX: undefined,
6331      maxY: undefined,
6332      width: undefined,
6333      height: undefined,
6334      startX: undefined,
6335      startY: undefined,
6336      touchesStart: {},
6337      touchesCurrent: {}
6338    };
6339    const velocity = {
6340      x: undefined,
6341      y: undefined,
6342      prevPositionX: undefined,
6343      prevPositionY: undefined,
6344      prevTime: undefined
6345    };
6346    let scale = 1;
6347    Object.defineProperty(swiper.zoom, 'scale', {
6348      get() {
6349        return scale;
6350      },
6351      set(value) {
6352        if (scale !== value) {
6353          const imageEl = gesture.imageEl;
6354          const slideEl = gesture.slideEl;
6355          emit('zoomChange', value, imageEl, slideEl);
6356        }
6357        scale = value;
6358      }
6359    });
6360    function getDistanceBetweenTouches() {
6361      if (evCache.length < 2) return 1;
6362      const x1 = evCache[0].pageX;
6363      const y1 = evCache[0].pageY;
6364      const x2 = evCache[1].pageX;
6365      const y2 = evCache[1].pageY;
6366      const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
6367      return distance;
6368    }
6369    function getScaleOrigin() {
6370      if (evCache.length < 2) return {
6371        x: null,
6372        y: null
6373      };
6374      const box = gesture.imageEl.getBoundingClientRect();
6375      return [(evCache[0].pageX + (evCache[1].pageX - evCache[0].pageX) / 2 - box.x - window.scrollX) / currentScale, (evCache[0].pageY + (evCache[1].pageY - evCache[0].pageY) / 2 - box.y - window.scrollY) / currentScale];
6376    }
6377    function getSlideSelector() {
6378      return swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
6379    }
6380    function eventWithinSlide(e) {
6381      const slideSelector = getSlideSelector();
6382      if (e.target.matches(slideSelector)) return true;
6383      if (swiper.slides.filter(slideEl => slideEl.contains(e.target)).length > 0) return true;
6384      return false;
6385    }
6386    function eventWithinZoomContainer(e) {
6387      const selector = `.${swiper.params.zoom.containerClass}`;
6388      if (e.target.matches(selector)) return true;
6389      if ([...swiper.hostEl.querySelectorAll(selector)].filter(containerEl => containerEl.contains(e.target)).length > 0) return true;
6390      return false;
6391    }
6392
6393    // Events
6394    function onGestureStart(e) {
6395      if (e.pointerType === 'mouse') {
6396        evCache.splice(0, evCache.length);
6397      }
6398      if (!eventWithinSlide(e)) return;
6399      const params = swiper.params.zoom;
6400      fakeGestureTouched = false;
6401      fakeGestureMoved = false;
6402      evCache.push(e);
6403      if (evCache.length < 2) {
6404        return;
6405      }
6406      fakeGestureTouched = true;
6407      gesture.scaleStart = getDistanceBetweenTouches();
6408      if (!gesture.slideEl) {
6409        gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
6410        if (!gesture.slideEl) gesture.slideEl = swiper.slides[swiper.activeIndex];
6411        let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
6412        if (imageEl) {
6413          imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
6414        }
6415        gesture.imageEl = imageEl;
6416        if (imageEl) {
6417          gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
6418        } else {
6419          gesture.imageWrapEl = undefined;
6420        }
6421        if (!gesture.imageWrapEl) {
6422          gesture.imageEl = undefined;
6423          return;
6424        }
6425        gesture.maxRatio = gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;
6426      }
6427      if (gesture.imageEl) {
6428        const [originX, originY] = getScaleOrigin();
6429        gesture.originX = originX;
6430        gesture.originY = originY;
6431        gesture.imageEl.style.transitionDuration = '0ms';
6432      }
6433      isScaling = true;
6434    }
6435    function onGestureChange(e) {
6436      if (!eventWithinSlide(e)) return;
6437      const params = swiper.params.zoom;
6438      const zoom = swiper.zoom;
6439      const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
6440      if (pointerIndex >= 0) evCache[pointerIndex] = e;
6441      if (evCache.length < 2) {
6442        return;
6443      }
6444      fakeGestureMoved = true;
6445      gesture.scaleMove = getDistanceBetweenTouches();
6446      if (!gesture.imageEl) {
6447        return;
6448      }
6449      zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale;
6450      if (zoom.scale > gesture.maxRatio) {
6451        zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;
6452      }
6453      if (zoom.scale < params.minRatio) {
6454        zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;
6455      }
6456      gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
6457    }
6458    function onGestureEnd(e) {
6459      if (!eventWithinSlide(e)) return;
6460      if (e.pointerType === 'mouse' && e.type === 'pointerout') return;
6461      const params = swiper.params.zoom;
6462      const zoom = swiper.zoom;
6463      const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
6464      if (pointerIndex >= 0) evCache.splice(pointerIndex, 1);
6465      if (!fakeGestureTouched || !fakeGestureMoved) {
6466        return;
6467      }
6468      fakeGestureTouched = false;
6469      fakeGestureMoved = false;
6470      if (!gesture.imageEl) return;
6471      zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
6472      gesture.imageEl.style.transitionDuration = `${swiper.params.speed}ms`;
6473      gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
6474      currentScale = zoom.scale;
6475      isScaling = false;
6476      if (zoom.scale > 1 && gesture.slideEl) {
6477        gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);
6478      } else if (zoom.scale <= 1 && gesture.slideEl) {
6479        gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);
6480      }
6481      if (zoom.scale === 1) {
6482        gesture.originX = 0;
6483        gesture.originY = 0;
6484        gesture.slideEl = undefined;
6485      }
6486    }
6487    function onTouchStart(e) {
6488      const device = swiper.device;
6489      if (!gesture.imageEl) return;
6490      if (image.isTouched) return;
6491      if (device.android && e.cancelable) e.preventDefault();
6492      image.isTouched = true;
6493      const event = evCache.length > 0 ? evCache[0] : e;
6494      image.touchesStart.x = event.pageX;
6495      image.touchesStart.y = event.pageY;
6496    }
6497    function onTouchMove(e) {
6498      if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) return;
6499      const zoom = swiper.zoom;
6500      if (!gesture.imageEl) return;
6501      if (!image.isTouched || !gesture.slideEl) return;
6502      if (!image.isMoved) {
6503        image.width = gesture.imageEl.offsetWidth;
6504        image.height = gesture.imageEl.offsetHeight;
6505        image.startX = getTranslate(gesture.imageWrapEl, 'x') || 0;
6506        image.startY = getTranslate(gesture.imageWrapEl, 'y') || 0;
6507        gesture.slideWidth = gesture.slideEl.offsetWidth;
6508        gesture.slideHeight = gesture.slideEl.offsetHeight;
6509        gesture.imageWrapEl.style.transitionDuration = '0ms';
6510      }
6511      // Define if we need image drag
6512      const scaledWidth = image.width * zoom.scale;
6513      const scaledHeight = image.height * zoom.scale;
6514      if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;
6515      image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
6516      image.maxX = -image.minX;
6517      image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
6518      image.maxY = -image.minY;
6519      image.touchesCurrent.x = evCache.length > 0 ? evCache[0].pageX : e.pageX;
6520      image.touchesCurrent.y = evCache.length > 0 ? evCache[0].pageY : e.pageY;
6521      const touchesDiff = Math.max(Math.abs(image.touchesCurrent.x - image.touchesStart.x), Math.abs(image.touchesCurrent.y - image.touchesStart.y));
6522      if (touchesDiff > 5) {
6523        swiper.allowClick = false;
6524      }
6525      if (!image.isMoved && !isScaling) {
6526        if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {
6527          image.isTouched = false;
6528          return;
6529        }
6530        if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {
6531          image.isTouched = false;
6532          return;
6533        }
6534      }
6535      if (e.cancelable) {
6536        e.preventDefault();
6537      }
6538      e.stopPropagation();
6539      image.isMoved = true;
6540      const scaleRatio = (zoom.scale - currentScale) / (gesture.maxRatio - swiper.params.zoom.minRatio);
6541      const {
6542        originX,
6543        originY
6544      } = gesture;
6545      image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX + scaleRatio * (image.width - originX * 2);
6546      image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY + scaleRatio * (image.height - originY * 2);
6547      if (image.currentX < image.minX) {
6548        image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;
6549      }
6550      if (image.currentX > image.maxX) {
6551        image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;
6552      }
6553      if (image.currentY < image.minY) {
6554        image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;
6555      }
6556      if (image.currentY > image.maxY) {
6557        image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;
6558      }
6559
6560      // Velocity
6561      if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;
6562      if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;
6563      if (!velocity.prevTime) velocity.prevTime = Date.now();
6564      velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
6565      velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
6566      if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;
6567      if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;
6568      velocity.prevPositionX = image.touchesCurrent.x;
6569      velocity.prevPositionY = image.touchesCurrent.y;
6570      velocity.prevTime = Date.now();
6571      gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;
6572    }
6573    function onTouchEnd() {
6574      const zoom = swiper.zoom;
6575      if (!gesture.imageEl) return;
6576      if (!image.isTouched || !image.isMoved) {
6577        image.isTouched = false;
6578        image.isMoved = false;
6579        return;
6580      }
6581      image.isTouched = false;
6582      image.isMoved = false;
6583      let momentumDurationX = 300;
6584      let momentumDurationY = 300;
6585      const momentumDistanceX = velocity.x * momentumDurationX;
6586      const newPositionX = image.currentX + momentumDistanceX;
6587      const momentumDistanceY = velocity.y * momentumDurationY;
6588      const newPositionY = image.currentY + momentumDistanceY;
6589
6590      // Fix duration
6591      if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);
6592      if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);
6593      const momentumDuration = Math.max(momentumDurationX, momentumDurationY);
6594      image.currentX = newPositionX;
6595      image.currentY = newPositionY;
6596      // Define if we need image drag
6597      const scaledWidth = image.width * zoom.scale;
6598      const scaledHeight = image.height * zoom.scale;
6599      image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
6600      image.maxX = -image.minX;
6601      image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
6602      image.maxY = -image.minY;
6603      image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
6604      image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
6605      gesture.imageWrapEl.style.transitionDuration = `${momentumDuration}ms`;
6606      gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;
6607    }
6608    function onTransitionEnd() {
6609      const zoom = swiper.zoom;
6610      if (gesture.slideEl && swiper.activeIndex !== swiper.slides.indexOf(gesture.slideEl)) {
6611        if (gesture.imageEl) {
6612          gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';
6613        }
6614        if (gesture.imageWrapEl) {
6615          gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';
6616        }
6617        gesture.slideEl.classList.remove(`${swiper.params.zoom.zoomedSlideClass}`);
6618        zoom.scale = 1;
6619        currentScale = 1;
6620        gesture.slideEl = undefined;
6621        gesture.imageEl = undefined;
6622        gesture.imageWrapEl = undefined;
6623        gesture.originX = 0;
6624        gesture.originY = 0;
6625      }
6626    }
6627    function zoomIn(e) {
6628      const zoom = swiper.zoom;
6629      const params = swiper.params.zoom;
6630      if (!gesture.slideEl) {
6631        if (e && e.target) {
6632          gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
6633        }
6634        if (!gesture.slideEl) {
6635          if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
6636            gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];
6637          } else {
6638            gesture.slideEl = swiper.slides[swiper.activeIndex];
6639          }
6640        }
6641        let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
6642        if (imageEl) {
6643          imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
6644        }
6645        gesture.imageEl = imageEl;
6646        if (imageEl) {
6647          gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
6648        } else {
6649          gesture.imageWrapEl = undefined;
6650        }
6651      }
6652      if (!gesture.imageEl || !gesture.imageWrapEl) return;
6653      if (swiper.params.cssMode) {
6654        swiper.wrapperEl.style.overflow = 'hidden';
6655        swiper.wrapperEl.style.touchAction = 'none';
6656      }
6657      gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);
6658      let touchX;
6659      let touchY;
6660      let offsetX;
6661      let offsetY;
6662      let diffX;
6663      let diffY;
6664      let translateX;
6665      let translateY;
6666      let imageWidth;
6667      let imageHeight;
6668      let scaledWidth;
6669      let scaledHeight;
6670      let translateMinX;
6671      let translateMinY;
6672      let translateMaxX;
6673      let translateMaxY;
6674      let slideWidth;
6675      let slideHeight;
6676      if (typeof image.touchesStart.x === 'undefined' && e) {
6677        touchX = e.pageX;
6678        touchY = e.pageY;
6679      } else {
6680        touchX = image.touchesStart.x;
6681        touchY = image.touchesStart.y;
6682      }
6683      const forceZoomRatio = typeof e === 'number' ? e : null;
6684      if (currentScale === 1 && forceZoomRatio) {
6685        touchX = undefined;
6686        touchY = undefined;
6687      }
6688      zoom.scale = forceZoomRatio || gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;
6689      currentScale = forceZoomRatio || gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;
6690      if (e && !(currentScale === 1 && forceZoomRatio)) {
6691        slideWidth = gesture.slideEl.offsetWidth;
6692        slideHeight = gesture.slideEl.offsetHeight;
6693        offsetX = elementOffset(gesture.slideEl).left + window.scrollX;
6694        offsetY = elementOffset(gesture.slideEl).top + window.scrollY;
6695        diffX = offsetX + slideWidth / 2 - touchX;
6696        diffY = offsetY + slideHeight / 2 - touchY;
6697        imageWidth = gesture.imageEl.offsetWidth;
6698        imageHeight = gesture.imageEl.offsetHeight;
6699        scaledWidth = imageWidth * zoom.scale;
6700        scaledHeight = imageHeight * zoom.scale;
6701        translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);
6702        translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);
6703        translateMaxX = -translateMinX;
6704        translateMaxY = -translateMinY;
6705        translateX = diffX * zoom.scale;
6706        translateY = diffY * zoom.scale;
6707        if (translateX < translateMinX) {
6708          translateX = translateMinX;
6709        }
6710        if (translateX > translateMaxX) {
6711          translateX = translateMaxX;
6712        }
6713        if (translateY < translateMinY) {
6714          translateY = translateMinY;
6715        }
6716        if (translateY > translateMaxY) {
6717          translateY = translateMaxY;
6718        }
6719      } else {
6720        translateX = 0;
6721        translateY = 0;
6722      }
6723      if (forceZoomRatio && zoom.scale === 1) {
6724        gesture.originX = 0;
6725        gesture.originY = 0;
6726      }
6727      gesture.imageWrapEl.style.transitionDuration = '300ms';
6728      gesture.imageWrapEl.style.transform = `translate3d(${translateX}px, ${translateY}px,0)`;
6729      gesture.imageEl.style.transitionDuration = '300ms';
6730      gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
6731    }
6732    function zoomOut() {
6733      const zoom = swiper.zoom;
6734      const params = swiper.params.zoom;
6735      if (!gesture.slideEl) {
6736        if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
6737          gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];
6738        } else {
6739          gesture.slideEl = swiper.slides[swiper.activeIndex];
6740        }
6741        let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
6742        if (imageEl) {
6743          imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
6744        }
6745        gesture.imageEl = imageEl;
6746        if (imageEl) {
6747          gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
6748        } else {
6749          gesture.imageWrapEl = undefined;
6750        }
6751      }
6752      if (!gesture.imageEl || !gesture.imageWrapEl) return;
6753      if (swiper.params.cssMode) {
6754        swiper.wrapperEl.style.overflow = '';
6755        swiper.wrapperEl.style.touchAction = '';
6756      }
6757      zoom.scale = 1;
6758      currentScale = 1;
6759      gesture.imageWrapEl.style.transitionDuration = '300ms';
6760      gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';
6761      gesture.imageEl.style.transitionDuration = '300ms';
6762      gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';
6763      gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);
6764      gesture.slideEl = undefined;
6765      gesture.originX = 0;
6766      gesture.originY = 0;
6767    }
6768
6769    // Toggle Zoom
6770    function zoomToggle(e) {
6771      const zoom = swiper.zoom;
6772      if (zoom.scale && zoom.scale !== 1) {
6773        // Zoom Out
6774        zoomOut();
6775      } else {
6776        // Zoom In
6777        zoomIn(e);
6778      }
6779    }
6780    function getListeners() {
6781      const passiveListener = swiper.params.passiveListeners ? {
6782        passive: true,
6783        capture: false
6784      } : false;
6785      const activeListenerWithCapture = swiper.params.passiveListeners ? {
6786        passive: false,
6787        capture: true
6788      } : true;
6789      return {
6790        passiveListener,
6791        activeListenerWithCapture
6792      };
6793    }
6794
6795    // Attach/Detach Events
6796    function enable() {
6797      const zoom = swiper.zoom;
6798      if (zoom.enabled) return;
6799      zoom.enabled = true;
6800      const {
6801        passiveListener,
6802        activeListenerWithCapture
6803      } = getListeners();
6804
6805      // Scale image
6806      swiper.wrapperEl.addEventListener('pointerdown', onGestureStart, passiveListener);
6807      swiper.wrapperEl.addEventListener('pointermove', onGestureChange, activeListenerWithCapture);
6808      ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {
6809        swiper.wrapperEl.addEventListener(eventName, onGestureEnd, passiveListener);
6810      });
6811
6812      // Move image
6813      swiper.wrapperEl.addEventListener('pointermove', onTouchMove, activeListenerWithCapture);
6814    }
6815    function disable() {
6816      const zoom = swiper.zoom;
6817      if (!zoom.enabled) return;
6818      zoom.enabled = false;
6819      const {
6820        passiveListener,
6821        activeListenerWithCapture
6822      } = getListeners();
6823
6824      // Scale image
6825      swiper.wrapperEl.removeEventListener('pointerdown', onGestureStart, passiveListener);
6826      swiper.wrapperEl.removeEventListener('pointermove', onGestureChange, activeListenerWithCapture);
6827      ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {
6828        swiper.wrapperEl.removeEventListener(eventName, onGestureEnd, passiveListener);
6829      });
6830
6831      // Move image
6832      swiper.wrapperEl.removeEventListener('pointermove', onTouchMove, activeListenerWithCapture);
6833    }
6834    on('init', () => {
6835      if (swiper.params.zoom.enabled) {
6836        enable();
6837      }
6838    });
6839    on('destroy', () => {
6840      disable();
6841    });
6842    on('touchStart', (_s, e) => {
6843      if (!swiper.zoom.enabled) return;
6844      onTouchStart(e);
6845    });
6846    on('touchEnd', (_s, e) => {
6847      if (!swiper.zoom.enabled) return;
6848      onTouchEnd();
6849    });
6850    on('doubleTap', (_s, e) => {
6851      if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
6852        zoomToggle(e);
6853      }
6854    });
6855    on('transitionEnd', () => {
6856      if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
6857        onTransitionEnd();
6858      }
6859    });
6860    on('slideChange', () => {
6861      if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
6862        onTransitionEnd();
6863      }
6864    });
6865    Object.assign(swiper.zoom, {
6866      enable,
6867      disable,
6868      in: zoomIn,
6869      out: zoomOut,
6870      toggle: zoomToggle
6871    });
6872  }
6873
6874  /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
6875  function Controller(_ref) {
6876    let {
6877      swiper,
6878      extendParams,
6879      on
6880    } = _ref;
6881    extendParams({
6882      controller: {
6883        control: undefined,
6884        inverse: false,
6885        by: 'slide' // or 'container'
6886      }
6887    });
6888
6889    swiper.controller = {
6890      control: undefined
6891    };
6892    function LinearSpline(x, y) {
6893      const binarySearch = function search() {
6894        let maxIndex;
6895        let minIndex;
6896        let guess;
6897        return (array, val) => {
6898          minIndex = -1;
6899          maxIndex = array.length;
6900          while (maxIndex - minIndex > 1) {
6901            guess = maxIndex + minIndex >> 1;
6902            if (array[guess] <= val) {
6903              minIndex = guess;
6904            } else {
6905              maxIndex = guess;
6906            }
6907          }
6908          return maxIndex;
6909        };
6910      }();
6911      this.x = x;
6912      this.y = y;
6913      this.lastIndex = x.length - 1;
6914      // Given an x value (x2), return the expected y2 value:
6915      // (x1,y1) is the known point before given value,
6916      // (x3,y3) is the known point after given value.
6917      let i1;
6918      let i3;
6919      this.interpolate = function interpolate(x2) {
6920        if (!x2) return 0;
6921
6922        // Get the indexes of x1 and x3 (the array indexes before and after given x2):
6923        i3 = binarySearch(this.x, x2);
6924        i1 = i3 - 1;
6925
6926        // We have our indexes i1 & i3, so we can calculate already:
6927        // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
6928        return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];
6929      };
6930      return this;
6931    }
6932    function getInterpolateFunction(c) {
6933      swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid);
6934    }
6935    function setTranslate(_t, byController) {
6936      const controlled = swiper.controller.control;
6937      let multiplier;
6938      let controlledTranslate;
6939      const Swiper = swiper.constructor;
6940      function setControlledTranslate(c) {
6941        if (c.destroyed) return;
6942
6943        // this will create an Interpolate function based on the snapGrids
6944        // x is the Grid of the scrolled scroller and y will be the controlled scroller
6945        // it makes sense to create this only once and recall it for the interpolation
6946        // the function does a lot of value caching for performance
6947        const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
6948        if (swiper.params.controller.by === 'slide') {
6949          getInterpolateFunction(c);
6950          // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
6951          // but it did not work out
6952          controlledTranslate = -swiper.controller.spline.interpolate(-translate);
6953        }
6954        if (!controlledTranslate || swiper.params.controller.by === 'container') {
6955          multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
6956          if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) {
6957            multiplier = 1;
6958          }
6959          controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();
6960        }
6961        if (swiper.params.controller.inverse) {
6962          controlledTranslate = c.maxTranslate() - controlledTranslate;
6963        }
6964        c.updateProgress(controlledTranslate);
6965        c.setTranslate(controlledTranslate, swiper);
6966        c.updateActiveIndex();
6967        c.updateSlidesClasses();
6968      }
6969      if (Array.isArray(controlled)) {
6970        for (let i = 0; i < controlled.length; i += 1) {
6971          if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
6972            setControlledTranslate(controlled[i]);
6973          }
6974        }
6975      } else if (controlled instanceof Swiper && byController !== controlled) {
6976        setControlledTranslate(controlled);
6977      }
6978    }
6979    function setTransition(duration, byController) {
6980      const Swiper = swiper.constructor;
6981      const controlled = swiper.controller.control;
6982      let i;
6983      function setControlledTransition(c) {
6984        if (c.destroyed) return;
6985        c.setTransition(duration, swiper);
6986        if (duration !== 0) {
6987          c.transitionStart();
6988          if (c.params.autoHeight) {
6989            nextTick(() => {
6990              c.updateAutoHeight();
6991            });
6992          }
6993          elementTransitionEnd(c.wrapperEl, () => {
6994            if (!controlled) return;
6995            c.transitionEnd();
6996          });
6997        }
6998      }
6999      if (Array.isArray(controlled)) {
7000        for (i = 0; i < controlled.length; i += 1) {
7001          if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
7002            setControlledTransition(controlled[i]);
7003          }
7004        }
7005      } else if (controlled instanceof Swiper && byController !== controlled) {
7006        setControlledTransition(controlled);
7007      }
7008    }
7009    function removeSpline() {
7010      if (!swiper.controller.control) return;
7011      if (swiper.controller.spline) {
7012        swiper.controller.spline = undefined;
7013        delete swiper.controller.spline;
7014      }
7015    }
7016    on('beforeInit', () => {
7017      if (typeof window !== 'undefined' && (
7018      // eslint-disable-line
7019      typeof swiper.params.controller.control === 'string' || swiper.params.controller.control instanceof HTMLElement)) {
7020        const controlElement = document.querySelector(swiper.params.controller.control);
7021        if (controlElement && controlElement.swiper) {
7022          swiper.controller.control = controlElement.swiper;
7023        } else if (controlElement) {
7024          const onControllerSwiper = e => {
7025            swiper.controller.control = e.detail[0];
7026            swiper.update();
7027            controlElement.removeEventListener('init', onControllerSwiper);
7028          };
7029          controlElement.addEventListener('init', onControllerSwiper);
7030        }
7031        return;
7032      }
7033      swiper.controller.control = swiper.params.controller.control;
7034    });
7035    on('update', () => {
7036      removeSpline();
7037    });
7038    on('resize', () => {
7039      removeSpline();
7040    });
7041    on('observerUpdate', () => {
7042      removeSpline();
7043    });
7044    on('setTranslate', (_s, translate, byController) => {
7045      if (!swiper.controller.control || swiper.controller.control.destroyed) return;
7046      swiper.controller.setTranslate(translate, byController);
7047    });
7048    on('setTransition', (_s, duration, byController) => {
7049      if (!swiper.controller.control || swiper.controller.control.destroyed) return;
7050      swiper.controller.setTransition(duration, byController);
7051    });
7052    Object.assign(swiper.controller, {
7053      setTranslate,
7054      setTransition
7055    });
7056  }
7057
7058  function A11y(_ref) {
7059    let {
7060      swiper,
7061      extendParams,
7062      on
7063    } = _ref;
7064    extendParams({
7065      a11y: {
7066        enabled: true,
7067        notificationClass: 'swiper-notification',
7068        prevSlideMessage: 'Previous slide',
7069        nextSlideMessage: 'Next slide',
7070        firstSlideMessage: 'This is the first slide',
7071        lastSlideMessage: 'This is the last slide',
7072        paginationBulletMessage: 'Go to slide {{index}}',
7073        slideLabelMessage: '{{index}} / {{slidesLength}}',
7074        containerMessage: null,
7075        containerRoleDescriptionMessage: null,
7076        itemRoleDescriptionMessage: null,
7077        slideRole: 'group',
7078        id: null
7079      }
7080    });
7081    swiper.a11y = {
7082      clicked: false
7083    };
7084    let liveRegion = null;
7085    function notify(message) {
7086      const notification = liveRegion;
7087      if (notification.length === 0) return;
7088      notification.innerHTML = '';
7089      notification.innerHTML = message;
7090    }
7091    const makeElementsArray = el => (Array.isArray(el) ? el : [el]).filter(e => !!e);
7092    function getRandomNumber(size) {
7093      if (size === void 0) {
7094        size = 16;
7095      }
7096      const randomChar = () => Math.round(16 * Math.random()).toString(16);
7097      return 'x'.repeat(size).replace(/x/g, randomChar);
7098    }
7099    function makeElFocusable(el) {
7100      el = makeElementsArray(el);
7101      el.forEach(subEl => {
7102        subEl.setAttribute('tabIndex', '0');
7103      });
7104    }
7105    function makeElNotFocusable(el) {
7106      el = makeElementsArray(el);
7107      el.forEach(subEl => {
7108        subEl.setAttribute('tabIndex', '-1');
7109      });
7110    }
7111    function addElRole(el, role) {
7112      el = makeElementsArray(el);
7113      el.forEach(subEl => {
7114        subEl.setAttribute('role', role);
7115      });
7116    }
7117    function addElRoleDescription(el, description) {
7118      el = makeElementsArray(el);
7119      el.forEach(subEl => {
7120        subEl.setAttribute('aria-roledescription', description);
7121      });
7122    }
7123    function addElControls(el, controls) {
7124      el = makeElementsArray(el);
7125      el.forEach(subEl => {
7126        subEl.setAttribute('aria-controls', controls);
7127      });
7128    }
7129    function addElLabel(el, label) {
7130      el = makeElementsArray(el);
7131      el.forEach(subEl => {
7132        subEl.setAttribute('aria-label', label);
7133      });
7134    }
7135    function addElId(el, id) {
7136      el = makeElementsArray(el);
7137      el.forEach(subEl => {
7138        subEl.setAttribute('id', id);
7139      });
7140    }
7141    function addElLive(el, live) {
7142      el = makeElementsArray(el);
7143      el.forEach(subEl => {
7144        subEl.setAttribute('aria-live', live);
7145      });
7146    }
7147    function disableEl(el) {
7148      el = makeElementsArray(el);
7149      el.forEach(subEl => {
7150        subEl.setAttribute('aria-disabled', true);
7151      });
7152    }
7153    function enableEl(el) {
7154      el = makeElementsArray(el);
7155      el.forEach(subEl => {
7156        subEl.setAttribute('aria-disabled', false);
7157      });
7158    }
7159    function onEnterOrSpaceKey(e) {
7160      if (e.keyCode !== 13 && e.keyCode !== 32) return;
7161      const params = swiper.params.a11y;
7162      const targetEl = e.target;
7163      if (swiper.pagination && swiper.pagination.el && (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))) {
7164        if (!e.target.matches(classesToSelector(swiper.params.pagination.bulletClass))) return;
7165      }
7166      if (swiper.navigation && swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) {
7167        if (!(swiper.isEnd && !swiper.params.loop)) {
7168          swiper.slideNext();
7169        }
7170        if (swiper.isEnd) {
7171          notify(params.lastSlideMessage);
7172        } else {
7173          notify(params.nextSlideMessage);
7174        }
7175      }
7176      if (swiper.navigation && swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl) {
7177        if (!(swiper.isBeginning && !swiper.params.loop)) {
7178          swiper.slidePrev();
7179        }
7180        if (swiper.isBeginning) {
7181          notify(params.firstSlideMessage);
7182        } else {
7183          notify(params.prevSlideMessage);
7184        }
7185      }
7186      if (swiper.pagination && targetEl.matches(classesToSelector(swiper.params.pagination.bulletClass))) {
7187        targetEl.click();
7188      }
7189    }
7190    function updateNavigation() {
7191      if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;
7192      const {
7193        nextEl,
7194        prevEl
7195      } = swiper.navigation;
7196      if (prevEl) {
7197        if (swiper.isBeginning) {
7198          disableEl(prevEl);
7199          makeElNotFocusable(prevEl);
7200        } else {
7201          enableEl(prevEl);
7202          makeElFocusable(prevEl);
7203        }
7204      }
7205      if (nextEl) {
7206        if (swiper.isEnd) {
7207          disableEl(nextEl);
7208          makeElNotFocusable(nextEl);
7209        } else {
7210          enableEl(nextEl);
7211          makeElFocusable(nextEl);
7212        }
7213      }
7214    }
7215    function hasPagination() {
7216      return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;
7217    }
7218    function hasClickablePagination() {
7219      return hasPagination() && swiper.params.pagination.clickable;
7220    }
7221    function updatePagination() {
7222      const params = swiper.params.a11y;
7223      if (!hasPagination()) return;
7224      swiper.pagination.bullets.forEach(bulletEl => {
7225        if (swiper.params.pagination.clickable) {
7226          makeElFocusable(bulletEl);
7227          if (!swiper.params.pagination.renderBullet) {
7228            addElRole(bulletEl, 'button');
7229            addElLabel(bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, elementIndex(bulletEl) + 1));
7230          }
7231        }
7232        if (bulletEl.matches(classesToSelector(swiper.params.pagination.bulletActiveClass))) {
7233          bulletEl.setAttribute('aria-current', 'true');
7234        } else {
7235          bulletEl.removeAttribute('aria-current');
7236        }
7237      });
7238    }
7239    const initNavEl = (el, wrapperId, message) => {
7240      makeElFocusable(el);
7241      if (el.tagName !== 'BUTTON') {
7242        addElRole(el, 'button');
7243        el.addEventListener('keydown', onEnterOrSpaceKey);
7244      }
7245      addElLabel(el, message);
7246      addElControls(el, wrapperId);
7247    };
7248    const handlePointerDown = () => {
7249      swiper.a11y.clicked = true;
7250    };
7251    const handlePointerUp = () => {
7252      requestAnimationFrame(() => {
7253        requestAnimationFrame(() => {
7254          if (!swiper.destroyed) {
7255            swiper.a11y.clicked = false;
7256          }
7257        });
7258      });
7259    };
7260    const handleFocus = e => {
7261      if (swiper.a11y.clicked) return;
7262      const slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
7263      if (!slideEl || !swiper.slides.includes(slideEl)) return;
7264      const isActive = swiper.slides.indexOf(slideEl) === swiper.activeIndex;
7265      const isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl);
7266      if (isActive || isVisible) return;
7267      if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;
7268      if (swiper.isHorizontal()) {
7269        swiper.el.scrollLeft = 0;
7270      } else {
7271        swiper.el.scrollTop = 0;
7272      }
7273      swiper.slideTo(swiper.slides.indexOf(slideEl), 0);
7274    };
7275    const initSlides = () => {
7276      const params = swiper.params.a11y;
7277      if (params.itemRoleDescriptionMessage) {
7278        addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage);
7279      }
7280      if (params.slideRole) {
7281        addElRole(swiper.slides, params.slideRole);
7282      }
7283      const slidesLength = swiper.slides.length;
7284      if (params.slideLabelMessage) {
7285        swiper.slides.forEach((slideEl, index) => {
7286          const slideIndex = swiper.params.loop ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : index;
7287          const ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength);
7288          addElLabel(slideEl, ariaLabelMessage);
7289        });
7290      }
7291    };
7292    const init = () => {
7293      const params = swiper.params.a11y;
7294      swiper.el.append(liveRegion);
7295
7296      // Container
7297      const containerEl = swiper.el;
7298      if (params.containerRoleDescriptionMessage) {
7299        addElRoleDescription(containerEl, params.containerRoleDescriptionMessage);
7300      }
7301      if (params.containerMessage) {
7302        addElLabel(containerEl, params.containerMessage);
7303      }
7304
7305      // Wrapper
7306      const wrapperEl = swiper.wrapperEl;
7307      const wrapperId = params.id || wrapperEl.getAttribute('id') || `swiper-wrapper-${getRandomNumber(16)}`;
7308      const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';
7309      addElId(wrapperEl, wrapperId);
7310      addElLive(wrapperEl, live);
7311
7312      // Slide
7313      initSlides();
7314
7315      // Navigation
7316      let {
7317        nextEl,
7318        prevEl
7319      } = swiper.navigation ? swiper.navigation : {};
7320      nextEl = makeElementsArray(nextEl);
7321      prevEl = makeElementsArray(prevEl);
7322      if (nextEl) {
7323        nextEl.forEach(el => initNavEl(el, wrapperId, params.nextSlideMessage));
7324      }
7325      if (prevEl) {
7326        prevEl.forEach(el => initNavEl(el, wrapperId, params.prevSlideMessage));
7327      }
7328
7329      // Pagination
7330      if (hasClickablePagination()) {
7331        const paginationEl = makeElementsArray(swiper.pagination.el);
7332        paginationEl.forEach(el => {
7333          el.addEventListener('keydown', onEnterOrSpaceKey);
7334        });
7335      }
7336
7337      // Tab focus
7338      swiper.el.addEventListener('focus', handleFocus, true);
7339      swiper.el.addEventListener('pointerdown', handlePointerDown, true);
7340      swiper.el.addEventListener('pointerup', handlePointerUp, true);
7341    };
7342    function destroy() {
7343      if (liveRegion) liveRegion.remove();
7344      let {
7345        nextEl,
7346        prevEl
7347      } = swiper.navigation ? swiper.navigation : {};
7348      nextEl = makeElementsArray(nextEl);
7349      prevEl = makeElementsArray(prevEl);
7350      if (nextEl) {
7351        nextEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));
7352      }
7353      if (prevEl) {
7354        prevEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));
7355      }
7356
7357      // Pagination
7358      if (hasClickablePagination()) {
7359        const paginationEl = makeElementsArray(swiper.pagination.el);
7360        paginationEl.forEach(el => {
7361          el.removeEventListener('keydown', onEnterOrSpaceKey);
7362        });
7363      }
7364
7365      // Tab focus
7366      swiper.el.removeEventListener('focus', handleFocus, true);
7367      swiper.el.removeEventListener('pointerdown', handlePointerDown, true);
7368      swiper.el.removeEventListener('pointerup', handlePointerUp, true);
7369    }
7370    on('beforeInit', () => {
7371      liveRegion = createElement('span', swiper.params.a11y.notificationClass);
7372      liveRegion.setAttribute('aria-live', 'assertive');
7373      liveRegion.setAttribute('aria-atomic', 'true');
7374    });
7375    on('afterInit', () => {
7376      if (!swiper.params.a11y.enabled) return;
7377      init();
7378    });
7379    on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => {
7380      if (!swiper.params.a11y.enabled) return;
7381      initSlides();
7382    });
7383    on('fromEdge toEdge afterInit lock unlock', () => {
7384      if (!swiper.params.a11y.enabled) return;
7385      updateNavigation();
7386    });
7387    on('paginationUpdate', () => {
7388      if (!swiper.params.a11y.enabled) return;
7389      updatePagination();
7390    });
7391    on('destroy', () => {
7392      if (!swiper.params.a11y.enabled) return;
7393      destroy();
7394    });
7395  }
7396
7397  function History(_ref) {
7398    let {
7399      swiper,
7400      extendParams,
7401      on
7402    } = _ref;
7403    extendParams({
7404      history: {
7405        enabled: false,
7406        root: '',
7407        replaceState: false,
7408        key: 'slides',
7409        keepQuery: false
7410      }
7411    });
7412    let initialized = false;
7413    let paths = {};
7414    const slugify = text => {
7415      return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');
7416    };
7417    const getPathValues = urlOverride => {
7418      const window = getWindow();
7419      let location;
7420      if (urlOverride) {
7421        location = new URL(urlOverride);
7422      } else {
7423        location = window.location;
7424      }
7425      const pathArray = location.pathname.slice(1).split('/').filter(part => part !== '');
7426      const total = pathArray.length;
7427      const key = pathArray[total - 2];
7428      const value = pathArray[total - 1];
7429      return {
7430        key,
7431        value
7432      };
7433    };
7434    const setHistory = (key, index) => {
7435      const window = getWindow();
7436      if (!initialized || !swiper.params.history.enabled) return;
7437      let location;
7438      if (swiper.params.url) {
7439        location = new URL(swiper.params.url);
7440      } else {
7441        location = window.location;
7442      }
7443      const slide = swiper.slides[index];
7444      let value = slugify(slide.getAttribute('data-history'));
7445      if (swiper.params.history.root.length > 0) {
7446        let root = swiper.params.history.root;
7447        if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);
7448        value = `${root}/${key ? `${key}/` : ''}${value}`;
7449      } else if (!location.pathname.includes(key)) {
7450        value = `${key ? `${key}/` : ''}${value}`;
7451      }
7452      if (swiper.params.history.keepQuery) {
7453        value += location.search;
7454      }
7455      const currentState = window.history.state;
7456      if (currentState && currentState.value === value) {
7457        return;
7458      }
7459      if (swiper.params.history.replaceState) {
7460        window.history.replaceState({
7461          value
7462        }, null, value);
7463      } else {
7464        window.history.pushState({
7465          value
7466        }, null, value);
7467      }
7468    };
7469    const scrollToSlide = (speed, value, runCallbacks) => {
7470      if (value) {
7471        for (let i = 0, length = swiper.slides.length; i < length; i += 1) {
7472          const slide = swiper.slides[i];
7473          const slideHistory = slugify(slide.getAttribute('data-history'));
7474          if (slideHistory === value) {
7475            const index = swiper.getSlideIndex(slide);
7476            swiper.slideTo(index, speed, runCallbacks);
7477          }
7478        }
7479      } else {
7480        swiper.slideTo(0, speed, runCallbacks);
7481      }
7482    };
7483    const setHistoryPopState = () => {
7484      paths = getPathValues(swiper.params.url);
7485      scrollToSlide(swiper.params.speed, paths.value, false);
7486    };
7487    const init = () => {
7488      const window = getWindow();
7489      if (!swiper.params.history) return;
7490      if (!window.history || !window.history.pushState) {
7491        swiper.params.history.enabled = false;
7492        swiper.params.hashNavigation.enabled = true;
7493        return;
7494      }
7495      initialized = true;
7496      paths = getPathValues(swiper.params.url);
7497      if (!paths.key && !paths.value) {
7498        if (!swiper.params.history.replaceState) {
7499          window.addEventListener('popstate', setHistoryPopState);
7500        }
7501        return;
7502      }
7503      scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);
7504      if (!swiper.params.history.replaceState) {
7505        window.addEventListener('popstate', setHistoryPopState);
7506      }
7507    };
7508    const destroy = () => {
7509      const window = getWindow();
7510      if (!swiper.params.history.replaceState) {
7511        window.removeEventListener('popstate', setHistoryPopState);
7512      }
7513    };
7514    on('init', () => {
7515      if (swiper.params.history.enabled) {
7516        init();
7517      }
7518    });
7519    on('destroy', () => {
7520      if (swiper.params.history.enabled) {
7521        destroy();
7522      }
7523    });
7524    on('transitionEnd _freeModeNoMomentumRelease', () => {
7525      if (initialized) {
7526        setHistory(swiper.params.history.key, swiper.activeIndex);
7527      }
7528    });
7529    on('slideChange', () => {
7530      if (initialized && swiper.params.cssMode) {
7531        setHistory(swiper.params.history.key, swiper.activeIndex);
7532      }
7533    });
7534  }
7535
7536  function HashNavigation(_ref) {
7537    let {
7538      swiper,
7539      extendParams,
7540      emit,
7541      on
7542    } = _ref;
7543    let initialized = false;
7544    const document = getDocument();
7545    const window = getWindow();
7546    extendParams({
7547      hashNavigation: {
7548        enabled: false,
7549        replaceState: false,
7550        watchState: false,
7551        getSlideIndex(_s, hash) {
7552          if (swiper.virtual && swiper.params.virtual.enabled) {
7553            const slideWithHash = swiper.slides.filter(slideEl => slideEl.getAttribute('data-hash') === hash)[0];
7554            if (!slideWithHash) return 0;
7555            const index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10);
7556            return index;
7557          }
7558          return swiper.getSlideIndex(elementChildren(swiper.slidesEl, `.${swiper.params.slideClass}[data-hash="${hash}"], swiper-slide[data-hash="${hash}"]`)[0]);
7559        }
7560      }
7561    });
7562    const onHashChange = () => {
7563      emit('hashChange');
7564      const newHash = document.location.hash.replace('#', '');
7565      const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${swiper.activeIndex}"]`) : swiper.slides[swiper.activeIndex];
7566      const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : '';
7567      if (newHash !== activeSlideHash) {
7568        const newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash);
7569        if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return;
7570        swiper.slideTo(newIndex);
7571      }
7572    };
7573    const setHash = () => {
7574      if (!initialized || !swiper.params.hashNavigation.enabled) return;
7575      const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${swiper.activeIndex}"]`) : swiper.slides[swiper.activeIndex];
7576      const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history') : '';
7577      if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {
7578        window.history.replaceState(null, null, `#${activeSlideHash}` || '');
7579        emit('hashSet');
7580      } else {
7581        document.location.hash = activeSlideHash || '';
7582        emit('hashSet');
7583      }
7584    };
7585    const init = () => {
7586      if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;
7587      initialized = true;
7588      const hash = document.location.hash.replace('#', '');
7589      if (hash) {
7590        const speed = 0;
7591        const index = swiper.params.hashNavigation.getSlideIndex(swiper, hash);
7592        swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true);
7593      }
7594      if (swiper.params.hashNavigation.watchState) {
7595        window.addEventListener('hashchange', onHashChange);
7596      }
7597    };
7598    const destroy = () => {
7599      if (swiper.params.hashNavigation.watchState) {
7600        window.removeEventListener('hashchange', onHashChange);
7601      }
7602    };
7603    on('init', () => {
7604      if (swiper.params.hashNavigation.enabled) {
7605        init();
7606      }
7607    });
7608    on('destroy', () => {
7609      if (swiper.params.hashNavigation.enabled) {
7610        destroy();
7611      }
7612    });
7613    on('transitionEnd _freeModeNoMomentumRelease', () => {
7614      if (initialized) {
7615        setHash();
7616      }
7617    });
7618    on('slideChange', () => {
7619      if (initialized && swiper.params.cssMode) {
7620        setHash();
7621      }
7622    });
7623  }
7624
7625  /* eslint no-underscore-dangle: "off" */
7626  /* eslint no-use-before-define: "off" */
7627  function Autoplay(_ref) {
7628    let {
7629      swiper,
7630      extendParams,
7631      on,
7632      emit,
7633      params
7634    } = _ref;
7635    swiper.autoplay = {
7636      running: false,
7637      paused: false,
7638      timeLeft: 0
7639    };
7640    extendParams({
7641      autoplay: {
7642        enabled: false,
7643        delay: 3000,
7644        waitForTransition: true,
7645        disableOnInteraction: false,
7646        stopOnLastSlide: false,
7647        reverseDirection: false,
7648        pauseOnMouseEnter: false
7649      }
7650    });
7651    let timeout;
7652    let raf;
7653    let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000;
7654    let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000;
7655    let autoplayTimeLeft;
7656    let autoplayStartTime = new Date().getTime();
7657    let wasPaused;
7658    let isTouched;
7659    let pausedByTouch;
7660    let touchStartTimeout;
7661    let slideChanged;
7662    let pausedByInteraction;
7663    let pausedByPointerEnter;
7664    function onTransitionEnd(e) {
7665      if (!swiper || swiper.destroyed || !swiper.wrapperEl) return;
7666      if (e.target !== swiper.wrapperEl) return;
7667      swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd);
7668      if (pausedByPointerEnter) {
7669        return;
7670      }
7671      resume();
7672    }
7673    const calcTimeLeft = () => {
7674      if (swiper.destroyed || !swiper.autoplay.running) return;
7675      if (swiper.autoplay.paused) {
7676        wasPaused = true;
7677      } else if (wasPaused) {
7678        autoplayDelayCurrent = autoplayTimeLeft;
7679        wasPaused = false;
7680      }
7681      const timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - new Date().getTime();
7682      swiper.autoplay.timeLeft = timeLeft;
7683      emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal);
7684      raf = requestAnimationFrame(() => {
7685        calcTimeLeft();
7686      });
7687    };
7688    const getSlideDelay = () => {
7689      let activeSlideEl;
7690      if (swiper.virtual && swiper.params.virtual.enabled) {
7691        activeSlideEl = swiper.slides.filter(slideEl => slideEl.classList.contains('swiper-slide-active'))[0];
7692      } else {
7693        activeSlideEl = swiper.slides[swiper.activeIndex];
7694      }
7695      if (!activeSlideEl) return undefined;
7696      const currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10);
7697      return currentSlideDelay;
7698    };
7699    const run = delayForce => {
7700      if (swiper.destroyed || !swiper.autoplay.running) return;
7701      cancelAnimationFrame(raf);
7702      calcTimeLeft();
7703      let delay = typeof delayForce === 'undefined' ? swiper.params.autoplay.delay : delayForce;
7704      autoplayDelayTotal = swiper.params.autoplay.delay;
7705      autoplayDelayCurrent = swiper.params.autoplay.delay;
7706      const currentSlideDelay = getSlideDelay();
7707      if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0 && typeof delayForce === 'undefined') {
7708        delay = currentSlideDelay;
7709        autoplayDelayTotal = currentSlideDelay;
7710        autoplayDelayCurrent = currentSlideDelay;
7711      }
7712      autoplayTimeLeft = delay;
7713      const speed = swiper.params.speed;
7714      const proceed = () => {
7715        if (!swiper || swiper.destroyed) return;
7716        if (swiper.params.autoplay.reverseDirection) {
7717          if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {
7718            swiper.slidePrev(speed, true, true);
7719            emit('autoplay');
7720          } else if (!swiper.params.autoplay.stopOnLastSlide) {
7721            swiper.slideTo(swiper.slides.length - 1, speed, true, true);
7722            emit('autoplay');
7723          }
7724        } else {
7725          if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {
7726            swiper.slideNext(speed, true, true);
7727            emit('autoplay');
7728          } else if (!swiper.params.autoplay.stopOnLastSlide) {
7729            swiper.slideTo(0, speed, true, true);
7730            emit('autoplay');
7731          }
7732        }
7733        if (swiper.params.cssMode) {
7734          autoplayStartTime = new Date().getTime();
7735          requestAnimationFrame(() => {
7736            run();
7737          });
7738        }
7739      };
7740      if (delay > 0) {
7741        clearTimeout(timeout);
7742        timeout = setTimeout(() => {
7743          proceed();
7744        }, delay);
7745      } else {
7746        requestAnimationFrame(() => {
7747          proceed();
7748        });
7749      }
7750
7751      // eslint-disable-next-line
7752      return delay;
7753    };
7754    const start = () => {
7755      autoplayStartTime = new Date().getTime();
7756      swiper.autoplay.running = true;
7757      run();
7758      emit('autoplayStart');
7759    };
7760    const stop = () => {
7761      swiper.autoplay.running = false;
7762      clearTimeout(timeout);
7763      cancelAnimationFrame(raf);
7764      emit('autoplayStop');
7765    };
7766    const pause = (internal, reset) => {
7767      if (swiper.destroyed || !swiper.autoplay.running) return;
7768      clearTimeout(timeout);
7769      if (!internal) {
7770        pausedByInteraction = true;
7771      }
7772      const proceed = () => {
7773        emit('autoplayPause');
7774        if (swiper.params.autoplay.waitForTransition) {
7775          swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd);
7776        } else {
7777          resume();
7778        }
7779      };
7780      swiper.autoplay.paused = true;
7781      if (reset) {
7782        if (slideChanged) {
7783          autoplayTimeLeft = swiper.params.autoplay.delay;
7784        }
7785        slideChanged = false;
7786        proceed();
7787        return;
7788      }
7789      const delay = autoplayTimeLeft || swiper.params.autoplay.delay;
7790      autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime);
7791      if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return;
7792      if (autoplayTimeLeft < 0) autoplayTimeLeft = 0;
7793      proceed();
7794    };
7795    const resume = () => {
7796      if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) return;
7797      autoplayStartTime = new Date().getTime();
7798      if (pausedByInteraction) {
7799        pausedByInteraction = false;
7800        run(autoplayTimeLeft);
7801      } else {
7802        run();
7803      }
7804      swiper.autoplay.paused = false;
7805      emit('autoplayResume');
7806    };
7807    const onVisibilityChange = () => {
7808      if (swiper.destroyed || !swiper.autoplay.running) return;
7809      const document = getDocument();
7810      if (document.visibilityState === 'hidden') {
7811        pausedByInteraction = true;
7812        pause(true);
7813      }
7814      if (document.visibilityState === 'visible') {
7815        resume();
7816      }
7817    };
7818    const onPointerEnter = e => {
7819      if (e.pointerType !== 'mouse') return;
7820      pausedByInteraction = true;
7821      pausedByPointerEnter = true;
7822      if (swiper.animating || swiper.autoplay.paused) return;
7823      pause(true);
7824    };
7825    const onPointerLeave = e => {
7826      if (e.pointerType !== 'mouse') return;
7827      pausedByPointerEnter = false;
7828      if (swiper.autoplay.paused) {
7829        resume();
7830      }
7831    };
7832    const attachMouseEvents = () => {
7833      if (swiper.params.autoplay.pauseOnMouseEnter) {
7834        swiper.el.addEventListener('pointerenter', onPointerEnter);
7835        swiper.el.addEventListener('pointerleave', onPointerLeave);
7836      }
7837    };
7838    const detachMouseEvents = () => {
7839      swiper.el.removeEventListener('pointerenter', onPointerEnter);
7840      swiper.el.removeEventListener('pointerleave', onPointerLeave);
7841    };
7842    const attachDocumentEvents = () => {
7843      const document = getDocument();
7844      document.addEventListener('visibilitychange', onVisibilityChange);
7845    };
7846    const detachDocumentEvents = () => {
7847      const document = getDocument();
7848      document.removeEventListener('visibilitychange', onVisibilityChange);
7849    };
7850    on('init', () => {
7851      if (swiper.params.autoplay.enabled) {
7852        attachMouseEvents();
7853        attachDocumentEvents();
7854        start();
7855      }
7856    });
7857    on('destroy', () => {
7858      detachMouseEvents();
7859      detachDocumentEvents();
7860      if (swiper.autoplay.running) {
7861        stop();
7862      }
7863    });
7864    on('_freeModeStaticRelease', () => {
7865      if (pausedByTouch || pausedByInteraction) {
7866        resume();
7867      }
7868    });
7869    on('_freeModeNoMomentumRelease', () => {
7870      if (!swiper.params.autoplay.disableOnInteraction) {
7871        pause(true, true);
7872      } else {
7873        stop();
7874      }
7875    });
7876    on('beforeTransitionStart', (_s, speed, internal) => {
7877      if (swiper.destroyed || !swiper.autoplay.running) return;
7878      if (internal || !swiper.params.autoplay.disableOnInteraction) {
7879        pause(true, true);
7880      } else {
7881        stop();
7882      }
7883    });
7884    on('sliderFirstMove', () => {
7885      if (swiper.destroyed || !swiper.autoplay.running) return;
7886      if (swiper.params.autoplay.disableOnInteraction) {
7887        stop();
7888        return;
7889      }
7890      isTouched = true;
7891      pausedByTouch = false;
7892      pausedByInteraction = false;
7893      touchStartTimeout = setTimeout(() => {
7894        pausedByInteraction = true;
7895        pausedByTouch = true;
7896        pause(true);
7897      }, 200);
7898    });
7899    on('touchEnd', () => {
7900      if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return;
7901      clearTimeout(touchStartTimeout);
7902      clearTimeout(timeout);
7903      if (swiper.params.autoplay.disableOnInteraction) {
7904        pausedByTouch = false;
7905        isTouched = false;
7906        return;
7907      }
7908      if (pausedByTouch && swiper.params.cssMode) resume();
7909      pausedByTouch = false;
7910      isTouched = false;
7911    });
7912    on('slideChange', () => {
7913      if (swiper.destroyed || !swiper.autoplay.running) return;
7914      slideChanged = true;
7915    });
7916    Object.assign(swiper.autoplay, {
7917      start,
7918      stop,
7919      pause,
7920      resume
7921    });
7922  }
7923
7924  function Thumb(_ref) {
7925    let {
7926      swiper,
7927      extendParams,
7928      on
7929    } = _ref;
7930    extendParams({
7931      thumbs: {
7932        swiper: null,
7933        multipleActiveThumbs: true,
7934        autoScrollOffset: 0,
7935        slideThumbActiveClass: 'swiper-slide-thumb-active',
7936        thumbsContainerClass: 'swiper-thumbs'
7937      }
7938    });
7939    let initialized = false;
7940    let swiperCreated = false;
7941    swiper.thumbs = {
7942      swiper: null
7943    };
7944    function onThumbClick() {
7945      const thumbsSwiper = swiper.thumbs.swiper;
7946      if (!thumbsSwiper || thumbsSwiper.destroyed) return;
7947      const clickedIndex = thumbsSwiper.clickedIndex;
7948      const clickedSlide = thumbsSwiper.clickedSlide;
7949      if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass)) return;
7950      if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;
7951      let slideToIndex;
7952      if (thumbsSwiper.params.loop) {
7953        slideToIndex = parseInt(thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
7954      } else {
7955        slideToIndex = clickedIndex;
7956      }
7957      if (swiper.params.loop) {
7958        swiper.slideToLoop(slideToIndex);
7959      } else {
7960        swiper.slideTo(slideToIndex);
7961      }
7962    }
7963    function init() {
7964      const {
7965        thumbs: thumbsParams
7966      } = swiper.params;
7967      if (initialized) return false;
7968      initialized = true;
7969      const SwiperClass = swiper.constructor;
7970      if (thumbsParams.swiper instanceof SwiperClass) {
7971        swiper.thumbs.swiper = thumbsParams.swiper;
7972        Object.assign(swiper.thumbs.swiper.originalParams, {
7973          watchSlidesProgress: true,
7974          slideToClickedSlide: false
7975        });
7976        Object.assign(swiper.thumbs.swiper.params, {
7977          watchSlidesProgress: true,
7978          slideToClickedSlide: false
7979        });
7980        swiper.thumbs.swiper.update();
7981      } else if (isObject(thumbsParams.swiper)) {
7982        const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);
7983        Object.assign(thumbsSwiperParams, {
7984          watchSlidesProgress: true,
7985          slideToClickedSlide: false
7986        });
7987        swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);
7988        swiperCreated = true;
7989      }
7990      swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass);
7991      swiper.thumbs.swiper.on('tap', onThumbClick);
7992      return true;
7993    }
7994    function update(initial) {
7995      const thumbsSwiper = swiper.thumbs.swiper;
7996      if (!thumbsSwiper || thumbsSwiper.destroyed) return;
7997      const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;
7998
7999      // Activate thumbs
8000      let thumbsToActivate = 1;
8001      const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
8002      if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
8003        thumbsToActivate = swiper.params.slidesPerView;
8004      }
8005      if (!swiper.params.thumbs.multipleActiveThumbs) {
8006        thumbsToActivate = 1;
8007      }
8008      thumbsToActivate = Math.floor(thumbsToActivate);
8009      thumbsSwiper.slides.forEach(slideEl => slideEl.classList.remove(thumbActiveClass));
8010      if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {
8011        for (let i = 0; i < thumbsToActivate; i += 1) {
8012          elementChildren(thumbsSwiper.slidesEl, `[data-swiper-slide-index="${swiper.realIndex + i}"]`).forEach(slideEl => {
8013            slideEl.classList.add(thumbActiveClass);
8014          });
8015        }
8016      } else {
8017        for (let i = 0; i < thumbsToActivate; i += 1) {
8018          if (thumbsSwiper.slides[swiper.realIndex + i]) {
8019            thumbsSwiper.slides[swiper.realIndex + i].classList.add(thumbActiveClass);
8020          }
8021        }
8022      }
8023      const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
8024      const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
8025      if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
8026        const currentThumbsIndex = thumbsSwiper.activeIndex;
8027        let newThumbsIndex;
8028        let direction;
8029        if (thumbsSwiper.params.loop) {
8030          const newThumbsSlide = thumbsSwiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') === `${swiper.realIndex}`)[0];
8031          newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide);
8032          direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
8033        } else {
8034          newThumbsIndex = swiper.realIndex;
8035          direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
8036        }
8037        if (useOffset) {
8038          newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
8039        }
8040        if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
8041          if (thumbsSwiper.params.centeredSlides) {
8042            if (newThumbsIndex > currentThumbsIndex) {
8043              newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
8044            } else {
8045              newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
8046            }
8047          } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ;
8048          thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
8049        }
8050      }
8051    }
8052    on('beforeInit', () => {
8053      const {
8054        thumbs
8055      } = swiper.params;
8056      if (!thumbs || !thumbs.swiper) return;
8057      if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) {
8058        const document = getDocument();
8059        const getThumbsElementAndInit = () => {
8060          const thumbsElement = typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper;
8061          if (thumbsElement && thumbsElement.swiper) {
8062            thumbs.swiper = thumbsElement.swiper;
8063            init();
8064            update(true);
8065          } else if (thumbsElement) {
8066            const onThumbsSwiper = e => {
8067              thumbs.swiper = e.detail[0];
8068              thumbsElement.removeEventListener('init', onThumbsSwiper);
8069              init();
8070              update(true);
8071              thumbs.swiper.update();
8072              swiper.update();
8073            };
8074            thumbsElement.addEventListener('init', onThumbsSwiper);
8075          }
8076          return thumbsElement;
8077        };
8078        const watchForThumbsToAppear = () => {
8079          if (swiper.destroyed) return;
8080          const thumbsElement = getThumbsElementAndInit();
8081          if (!thumbsElement) {
8082            requestAnimationFrame(watchForThumbsToAppear);
8083          }
8084        };
8085        requestAnimationFrame(watchForThumbsToAppear);
8086      } else {
8087        init();
8088        update(true);
8089      }
8090    });
8091    on('slideChange update resize observerUpdate', () => {
8092      update();
8093    });
8094    on('setTransition', (_s, duration) => {
8095      const thumbsSwiper = swiper.thumbs.swiper;
8096      if (!thumbsSwiper || thumbsSwiper.destroyed) return;
8097      thumbsSwiper.setTransition(duration);
8098    });
8099    on('beforeDestroy', () => {
8100      const thumbsSwiper = swiper.thumbs.swiper;
8101      if (!thumbsSwiper || thumbsSwiper.destroyed) return;
8102      if (swiperCreated) {
8103        thumbsSwiper.destroy();
8104      }
8105    });
8106    Object.assign(swiper.thumbs, {
8107      init,
8108      update
8109    });
8110  }
8111
8112  function freeMode(_ref) {
8113    let {
8114      swiper,
8115      extendParams,
8116      emit,
8117      once
8118    } = _ref;
8119    extendParams({
8120      freeMode: {
8121        enabled: false,
8122        momentum: true,
8123        momentumRatio: 1,
8124        momentumBounce: true,
8125        momentumBounceRatio: 1,
8126        momentumVelocityRatio: 1,
8127        sticky: false,
8128        minimumVelocity: 0.02
8129      }
8130    });
8131    function onTouchStart() {
8132      if (swiper.params.cssMode) return;
8133      const translate = swiper.getTranslate();
8134      swiper.setTranslate(translate);
8135      swiper.setTransition(0);
8136      swiper.touchEventsData.velocities.length = 0;
8137      swiper.freeMode.onTouchEnd({
8138        currentPos: swiper.rtl ? swiper.translate : -swiper.translate
8139      });
8140    }
8141    function onTouchMove() {
8142      if (swiper.params.cssMode) return;
8143      const {
8144        touchEventsData: data,
8145        touches
8146      } = swiper;
8147      // Velocity
8148      if (data.velocities.length === 0) {
8149        data.velocities.push({
8150          position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
8151          time: data.touchStartTime
8152        });
8153      }
8154      data.velocities.push({
8155        position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
8156        time: now()
8157      });
8158    }
8159    function onTouchEnd(_ref2) {
8160      let {
8161        currentPos
8162      } = _ref2;
8163      if (swiper.params.cssMode) return;
8164      const {
8165        params,
8166        wrapperEl,
8167        rtlTranslate: rtl,
8168        snapGrid,
8169        touchEventsData: data
8170      } = swiper;
8171      // Time diff
8172      const touchEndTime = now();
8173      const timeDiff = touchEndTime - data.touchStartTime;
8174      if (currentPos < -swiper.minTranslate()) {
8175        swiper.slideTo(swiper.activeIndex);
8176        return;
8177      }
8178      if (currentPos > -swiper.maxTranslate()) {
8179        if (swiper.slides.length < snapGrid.length) {
8180          swiper.slideTo(snapGrid.length - 1);
8181        } else {
8182          swiper.slideTo(swiper.slides.length - 1);
8183        }
8184        return;
8185      }
8186      if (params.freeMode.momentum) {
8187        if (data.velocities.length > 1) {
8188          const lastMoveEvent = data.velocities.pop();
8189          const velocityEvent = data.velocities.pop();
8190          const distance = lastMoveEvent.position - velocityEvent.position;
8191          const time = lastMoveEvent.time - velocityEvent.time;
8192          swiper.velocity = distance / time;
8193          swiper.velocity /= 2;
8194          if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {
8195            swiper.velocity = 0;
8196          }
8197          // this implies that the user stopped moving a finger then released.
8198          // There would be no events with distance zero, so the last event is stale.
8199          if (time > 150 || now() - lastMoveEvent.time > 300) {
8200            swiper.velocity = 0;
8201          }
8202        } else {
8203          swiper.velocity = 0;
8204        }
8205        swiper.velocity *= params.freeMode.momentumVelocityRatio;
8206        data.velocities.length = 0;
8207        let momentumDuration = 1000 * params.freeMode.momentumRatio;
8208        const momentumDistance = swiper.velocity * momentumDuration;
8209        let newPosition = swiper.translate + momentumDistance;
8210        if (rtl) newPosition = -newPosition;
8211        let doBounce = false;
8212        let afterBouncePosition;
8213        const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;
8214        let needsLoopFix;
8215        if (newPosition < swiper.maxTranslate()) {
8216          if (params.freeMode.momentumBounce) {
8217            if (newPosition + swiper.maxTranslate() < -bounceAmount) {
8218              newPosition = swiper.maxTranslate() - bounceAmount;
8219            }
8220            afterBouncePosition = swiper.maxTranslate();
8221            doBounce = true;
8222            data.allowMomentumBounce = true;
8223          } else {
8224            newPosition = swiper.maxTranslate();
8225          }
8226          if (params.loop && params.centeredSlides) needsLoopFix = true;
8227        } else if (newPosition > swiper.minTranslate()) {
8228          if (params.freeMode.momentumBounce) {
8229            if (newPosition - swiper.minTranslate() > bounceAmount) {
8230              newPosition = swiper.minTranslate() + bounceAmount;
8231            }
8232            afterBouncePosition = swiper.minTranslate();
8233            doBounce = true;
8234            data.allowMomentumBounce = true;
8235          } else {
8236            newPosition = swiper.minTranslate();
8237          }
8238          if (params.loop && params.centeredSlides) needsLoopFix = true;
8239        } else if (params.freeMode.sticky) {
8240          let nextSlide;
8241          for (let j = 0; j < snapGrid.length; j += 1) {
8242            if (snapGrid[j] > -newPosition) {
8243              nextSlide = j;
8244              break;
8245            }
8246          }
8247          if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
8248            newPosition = snapGrid[nextSlide];
8249          } else {
8250            newPosition = snapGrid[nextSlide - 1];
8251          }
8252          newPosition = -newPosition;
8253        }
8254        if (needsLoopFix) {
8255          once('transitionEnd', () => {
8256            swiper.loopFix();
8257          });
8258        }
8259        // Fix duration
8260        if (swiper.velocity !== 0) {
8261          if (rtl) {
8262            momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
8263          } else {
8264            momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
8265          }
8266          if (params.freeMode.sticky) {
8267            // If freeMode.sticky is active and the user ends a swipe with a slow-velocity
8268            // event, then durations can be 20+ seconds to slide one (or zero!) slides.
8269            // It's easy to see this when simulating touch with mouse events. To fix this,
8270            // limit single-slide swipes to the default slide duration. This also has the
8271            // nice side effect of matching slide speed if the user stopped moving before
8272            // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
8273            // For faster swipes, also apply limits (albeit higher ones).
8274            const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
8275            const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
8276            if (moveDistance < currentSlideSize) {
8277              momentumDuration = params.speed;
8278            } else if (moveDistance < 2 * currentSlideSize) {
8279              momentumDuration = params.speed * 1.5;
8280            } else {
8281              momentumDuration = params.speed * 2.5;
8282            }
8283          }
8284        } else if (params.freeMode.sticky) {
8285          swiper.slideToClosest();
8286          return;
8287        }
8288        if (params.freeMode.momentumBounce && doBounce) {
8289          swiper.updateProgress(afterBouncePosition);
8290          swiper.setTransition(momentumDuration);
8291          swiper.setTranslate(newPosition);
8292          swiper.transitionStart(true, swiper.swipeDirection);
8293          swiper.animating = true;
8294          elementTransitionEnd(wrapperEl, () => {
8295            if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;
8296            emit('momentumBounce');
8297            swiper.setTransition(params.speed);
8298            setTimeout(() => {
8299              swiper.setTranslate(afterBouncePosition);
8300              elementTransitionEnd(wrapperEl, () => {
8301                if (!swiper || swiper.destroyed) return;
8302                swiper.transitionEnd();
8303              });
8304            }, 0);
8305          });
8306        } else if (swiper.velocity) {
8307          emit('_freeModeNoMomentumRelease');
8308          swiper.updateProgress(newPosition);
8309          swiper.setTransition(momentumDuration);
8310          swiper.setTranslate(newPosition);
8311          swiper.transitionStart(true, swiper.swipeDirection);
8312          if (!swiper.animating) {
8313            swiper.animating = true;
8314            elementTransitionEnd(wrapperEl, () => {
8315              if (!swiper || swiper.destroyed) return;
8316              swiper.transitionEnd();
8317            });
8318          }
8319        } else {
8320          swiper.updateProgress(newPosition);
8321        }
8322        swiper.updateActiveIndex();
8323        swiper.updateSlidesClasses();
8324      } else if (params.freeMode.sticky) {
8325        swiper.slideToClosest();
8326        return;
8327      } else if (params.freeMode) {
8328        emit('_freeModeNoMomentumRelease');
8329      }
8330      if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {
8331        emit('_freeModeStaticRelease');
8332        swiper.updateProgress();
8333        swiper.updateActiveIndex();
8334        swiper.updateSlidesClasses();
8335      }
8336    }
8337    Object.assign(swiper, {
8338      freeMode: {
8339        onTouchStart,
8340        onTouchMove,
8341        onTouchEnd
8342      }
8343    });
8344  }
8345
8346  function Grid(_ref) {
8347    let {
8348      swiper,
8349      extendParams,
8350      on
8351    } = _ref;
8352    extendParams({
8353      grid: {
8354        rows: 1,
8355        fill: 'column'
8356      }
8357    });
vendor: 1,326 bytes, lines 8358-8392
8358    let slidesNumberEvenToRows;
8359    let slidesPerRow;
8360    let numFullColumns;
8361    let wasMultiRow;
8362    const getSpaceBetween = () => {
8363      let spaceBetween = swiper.params.spaceBetween;
8364      if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
8365        spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
8366      } else if (typeof spaceBetween === 'string') {
8367        spaceBetween = parseFloat(spaceBetween);
8368      }
8369      return spaceBetween;
8370    };
8371    const initSlides = slides => {
8372      const {
8373        slidesPerView
8374      } = swiper.params;
8375      const {
8376        rows,
8377        fill
8378      } = swiper.params.grid;
8379      const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length;
8380      numFullColumns = Math.floor(slidesLength / rows);
8381      if (Math.floor(slidesLength / rows) === slidesLength / rows) {
8382        slidesNumberEvenToRows = slidesLength;
8383      } else {
8384        slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;
8385      }
8386      if (slidesPerView !== 'auto' && fill === 'row') {
8387        slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);
8388      }
8389      slidesPerRow = slidesNumberEvenToRows / rows;
8390    };
8391    const unsetSlides = () => {
8392      if (swiper.slides) {
vendor: 40,369 bytes, lines 8393-9538
8393        swiper.slides.forEach(slide => {
8394          if (slide.swiperSlideGridSet) {
8395            slide.style.height = '';
8396            slide.style[swiper.getDirectionLabel('margin-top')] = '';
8397          }
8398        });
8399      }
8400    };
8401    const updateSlide = (i, slide, slides) => {
8402      const {
8403        slidesPerGroup
8404      } = swiper.params;
8405      const spaceBetween = getSpaceBetween();
8406      const {
8407        rows,
8408        fill
8409      } = swiper.params.grid;
8410      const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length;
8411      // Set slides order
8412      let newSlideOrderIndex;
8413      let column;
8414      let row;
8415      if (fill === 'row' && slidesPerGroup > 1) {
8416        const groupIndex = Math.floor(i / (slidesPerGroup * rows));
8417        const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;
8418        const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup);
8419        row = Math.floor(slideIndexInGroup / columnsInGroup);
8420        column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;
8421        newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows;
8422        slide.style.order = newSlideOrderIndex;
8423      } else if (fill === 'column') {
8424        column = Math.floor(i / rows);
8425        row = i - column * rows;
8426        if (column > numFullColumns || column === numFullColumns && row === rows - 1) {
8427          row += 1;
8428          if (row >= rows) {
8429            row = 0;
8430            column += 1;
8431          }
8432        }
8433      } else {
8434        row = Math.floor(i / slidesPerRow);
8435        column = i - row * slidesPerRow;
8436      }
8437      slide.row = row;
8438      slide.column = column;
8439      slide.style.height = `calc((100% - ${(rows - 1) * spaceBetween}px) / ${rows})`;
8440      slide.style[swiper.getDirectionLabel('margin-top')] = row !== 0 ? spaceBetween && `${spaceBetween}px` : '';
8441      slide.swiperSlideGridSet = true;
8442    };
8443    const updateWrapperSize = (slideSize, snapGrid) => {
8444      const {
8445        centeredSlides,
8446        roundLengths
8447      } = swiper.params;
8448      const spaceBetween = getSpaceBetween();
8449      const {
8450        rows
8451      } = swiper.params.grid;
8452      swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;
8453      swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;
8454      if (!swiper.params.cssMode) {
8455        swiper.wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;
8456      }
8457      if (centeredSlides) {
8458        const newSlidesGrid = [];
8459        for (let i = 0; i < snapGrid.length; i += 1) {
8460          let slidesGridItem = snapGrid[i];
8461          if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);
8462          if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);
8463        }
8464        snapGrid.splice(0, snapGrid.length);
8465        snapGrid.push(...newSlidesGrid);
8466      }
8467    };
8468    const onInit = () => {
8469      wasMultiRow = swiper.params.grid && swiper.params.grid.rows > 1;
8470    };
8471    const onUpdate = () => {
8472      const {
8473        params,
8474        el
8475      } = swiper;
8476      const isMultiRow = params.grid && params.grid.rows > 1;
8477      if (wasMultiRow && !isMultiRow) {
8478        el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
8479        numFullColumns = 1;
8480        swiper.emitContainerClasses();
8481      } else if (!wasMultiRow && isMultiRow) {
8482        el.classList.add(`${params.containerModifierClass}grid`);
8483        if (params.grid.fill === 'column') {
8484          el.classList.add(`${params.containerModifierClass}grid-column`);
8485        }
8486        swiper.emitContainerClasses();
8487      }
8488      wasMultiRow = isMultiRow;
8489    };
8490    on('init', onInit);
8491    on('update', onUpdate);
8492    swiper.grid = {
8493      initSlides,
8494      unsetSlides,
8495      updateSlide,
8496      updateWrapperSize
8497    };
8498  }
8499
8500  function appendSlide(slides) {
8501    const swiper = this;
8502    const {
8503      params,
8504      slidesEl
8505    } = swiper;
8506    if (params.loop) {
8507      swiper.loopDestroy();
8508    }
8509    const appendElement = slideEl => {
8510      if (typeof slideEl === 'string') {
8511        const tempDOM = document.createElement('div');
8512        tempDOM.innerHTML = slideEl;
8513        slidesEl.append(tempDOM.children[0]);
8514        tempDOM.innerHTML = '';
8515      } else {
8516        slidesEl.append(slideEl);
8517      }
8518    };
8519    if (typeof slides === 'object' && 'length' in slides) {
8520      for (let i = 0; i < slides.length; i += 1) {
8521        if (slides[i]) appendElement(slides[i]);
8522      }
8523    } else {
8524      appendElement(slides);
8525    }
8526    swiper.recalcSlides();
8527    if (params.loop) {
8528      swiper.loopCreate();
8529    }
8530    if (!params.observer || swiper.isElement) {
8531      swiper.update();
8532    }
8533  }
8534
8535  function prependSlide(slides) {
8536    const swiper = this;
8537    const {
8538      params,
8539      activeIndex,
8540      slidesEl
8541    } = swiper;
8542    if (params.loop) {
8543      swiper.loopDestroy();
8544    }
8545    let newActiveIndex = activeIndex + 1;
8546    const prependElement = slideEl => {
8547      if (typeof slideEl === 'string') {
8548        const tempDOM = document.createElement('div');
8549        tempDOM.innerHTML = slideEl;
8550        slidesEl.prepend(tempDOM.children[0]);
8551        tempDOM.innerHTML = '';
8552      } else {
8553        slidesEl.prepend(slideEl);
8554      }
8555    };
8556    if (typeof slides === 'object' && 'length' in slides) {
8557      for (let i = 0; i < slides.length; i += 1) {
8558        if (slides[i]) prependElement(slides[i]);
8559      }
8560      newActiveIndex = activeIndex + slides.length;
8561    } else {
8562      prependElement(slides);
8563    }
8564    swiper.recalcSlides();
8565    if (params.loop) {
8566      swiper.loopCreate();
8567    }
8568    if (!params.observer || swiper.isElement) {
8569      swiper.update();
8570    }
8571    swiper.slideTo(newActiveIndex, 0, false);
8572  }
8573
8574  function addSlide(index, slides) {
8575    const swiper = this;
8576    const {
8577      params,
8578      activeIndex,
8579      slidesEl
8580    } = swiper;
8581    let activeIndexBuffer = activeIndex;
8582    if (params.loop) {
8583      activeIndexBuffer -= swiper.loopedSlides;
8584      swiper.loopDestroy();
8585      swiper.recalcSlides();
8586    }
8587    const baseLength = swiper.slides.length;
8588    if (index <= 0) {
8589      swiper.prependSlide(slides);
8590      return;
8591    }
8592    if (index >= baseLength) {
8593      swiper.appendSlide(slides);
8594      return;
8595    }
8596    let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
8597    const slidesBuffer = [];
8598    for (let i = baseLength - 1; i >= index; i -= 1) {
8599      const currentSlide = swiper.slides[i];
8600      currentSlide.remove();
8601      slidesBuffer.unshift(currentSlide);
8602    }
8603    if (typeof slides === 'object' && 'length' in slides) {
8604      for (let i = 0; i < slides.length; i += 1) {
8605        if (slides[i]) slidesEl.append(slides[i]);
8606      }
8607      newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
8608    } else {
8609      slidesEl.append(slides);
8610    }
8611    for (let i = 0; i < slidesBuffer.length; i += 1) {
8612      slidesEl.append(slidesBuffer[i]);
8613    }
8614    swiper.recalcSlides();
8615    if (params.loop) {
8616      swiper.loopCreate();
8617    }
8618    if (!params.observer || swiper.isElement) {
8619      swiper.update();
8620    }
8621    if (params.loop) {
8622      swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
8623    } else {
8624      swiper.slideTo(newActiveIndex, 0, false);
8625    }
8626  }
8627
8628  function removeSlide(slidesIndexes) {
8629    const swiper = this;
8630    const {
8631      params,
8632      activeIndex
8633    } = swiper;
8634    let activeIndexBuffer = activeIndex;
8635    if (params.loop) {
8636      activeIndexBuffer -= swiper.loopedSlides;
8637      swiper.loopDestroy();
8638    }
8639    let newActiveIndex = activeIndexBuffer;
8640    let indexToRemove;
8641    if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
8642      for (let i = 0; i < slidesIndexes.length; i += 1) {
8643        indexToRemove = slidesIndexes[i];
8644        if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();
8645        if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
8646      }
8647      newActiveIndex = Math.max(newActiveIndex, 0);
8648    } else {
8649      indexToRemove = slidesIndexes;
8650      if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();
8651      if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
8652      newActiveIndex = Math.max(newActiveIndex, 0);
8653    }
8654    swiper.recalcSlides();
8655    if (params.loop) {
8656      swiper.loopCreate();
8657    }
8658    if (!params.observer || swiper.isElement) {
8659      swiper.update();
8660    }
8661    if (params.loop) {
8662      swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
8663    } else {
8664      swiper.slideTo(newActiveIndex, 0, false);
8665    }
8666  }
8667
8668  function removeAllSlides() {
8669    const swiper = this;
8670    const slidesIndexes = [];
8671    for (let i = 0; i < swiper.slides.length; i += 1) {
8672      slidesIndexes.push(i);
8673    }
8674    swiper.removeSlide(slidesIndexes);
8675  }
8676
8677  function Manipulation(_ref) {
8678    let {
8679      swiper
8680    } = _ref;
8681    Object.assign(swiper, {
8682      appendSlide: appendSlide.bind(swiper),
8683      prependSlide: prependSlide.bind(swiper),
8684      addSlide: addSlide.bind(swiper),
8685      removeSlide: removeSlide.bind(swiper),
8686      removeAllSlides: removeAllSlides.bind(swiper)
8687    });
8688  }
8689
8690  function effectInit(params) {
8691    const {
8692      effect,
8693      swiper,
8694      on,
8695      setTranslate,
8696      setTransition,
8697      overwriteParams,
8698      perspective,
8699      recreateShadows,
8700      getEffectParams
8701    } = params;
8702    on('beforeInit', () => {
8703      if (swiper.params.effect !== effect) return;
8704      swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);
8705      if (perspective && perspective()) {
8706        swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);
8707      }
8708      const overwriteParamsResult = overwriteParams ? overwriteParams() : {};
8709      Object.assign(swiper.params, overwriteParamsResult);
8710      Object.assign(swiper.originalParams, overwriteParamsResult);
8711    });
8712    on('setTranslate', () => {
8713      if (swiper.params.effect !== effect) return;
8714      setTranslate();
8715    });
8716    on('setTransition', (_s, duration) => {
8717      if (swiper.params.effect !== effect) return;
8718      setTransition(duration);
8719    });
8720    on('transitionEnd', () => {
8721      if (swiper.params.effect !== effect) return;
8722      if (recreateShadows) {
8723        if (!getEffectParams || !getEffectParams().slideShadows) return;
8724        // remove shadows
8725        swiper.slides.forEach(slideEl => {
8726          slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => shadowEl.remove());
8727        });
8728        // create new one
8729        recreateShadows();
8730      }
8731    });
8732    let requireUpdateOnVirtual;
8733    on('virtualUpdate', () => {
8734      if (swiper.params.effect !== effect) return;
8735      if (!swiper.slides.length) {
8736        requireUpdateOnVirtual = true;
8737      }
8738      requestAnimationFrame(() => {
8739        if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) {
8740          setTranslate();
8741          requireUpdateOnVirtual = false;
8742        }
8743      });
8744    });
8745  }
8746
8747  function effectTarget(effectParams, slideEl) {
8748    const transformEl = getSlideTransformEl(slideEl);
8749    if (transformEl !== slideEl) {
8750      transformEl.style.backfaceVisibility = 'hidden';
8751      transformEl.style['-webkit-backface-visibility'] = 'hidden';
8752    }
8753    return transformEl;
8754  }
8755
8756  function effectVirtualTransitionEnd(_ref) {
8757    let {
8758      swiper,
8759      duration,
8760      transformElements,
8761      allSlides
8762    } = _ref;
8763    const {
8764      activeIndex
8765    } = swiper;
8766    const getSlide = el => {
8767      if (!el.parentElement) {
8768        // assume shadow root
8769        const slide = swiper.slides.filter(slideEl => slideEl.shadowRoot && slideEl.shadowRoot === el.parentNode)[0];
8770        return slide;
8771      }
8772      return el.parentElement;
8773    };
8774    if (swiper.params.virtualTranslate && duration !== 0) {
8775      let eventTriggered = false;
8776      let transitionEndTarget;
8777      if (allSlides) {
8778        transitionEndTarget = transformElements;
8779      } else {
8780        transitionEndTarget = transformElements.filter(transformEl => {
8781          const el = transformEl.classList.contains('swiper-slide-transform') ? getSlide(transformEl) : transformEl;
8782          return swiper.getSlideIndex(el) === activeIndex;
8783        });
8784      }
8785      transitionEndTarget.forEach(el => {
8786        elementTransitionEnd(el, () => {
8787          if (eventTriggered) return;
8788          if (!swiper || swiper.destroyed) return;
8789          eventTriggered = true;
8790          swiper.animating = false;
8791          const evt = new window.CustomEvent('transitionend', {
8792            bubbles: true,
8793            cancelable: true
8794          });
8795          swiper.wrapperEl.dispatchEvent(evt);
8796        });
8797      });
8798    }
8799  }
8800
8801  function EffectFade(_ref) {
8802    let {
8803      swiper,
8804      extendParams,
8805      on
8806    } = _ref;
8807    extendParams({
8808      fadeEffect: {
8809        crossFade: false
8810      }
8811    });
8812    const setTranslate = () => {
8813      const {
8814        slides
8815      } = swiper;
8816      const params = swiper.params.fadeEffect;
8817      for (let i = 0; i < slides.length; i += 1) {
8818        const slideEl = swiper.slides[i];
8819        const offset = slideEl.swiperSlideOffset;
8820        let tx = -offset;
8821        if (!swiper.params.virtualTranslate) tx -= swiper.translate;
8822        let ty = 0;
8823        if (!swiper.isHorizontal()) {
8824          ty = tx;
8825          tx = 0;
8826        }
8827        const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(slideEl.progress), 0) : 1 + Math.min(Math.max(slideEl.progress, -1), 0);
8828        const targetEl = effectTarget(params, slideEl);
8829        targetEl.style.opacity = slideOpacity;
8830        targetEl.style.transform = `translate3d(${tx}px, ${ty}px, 0px)`;
8831      }
8832    };
8833    const setTransition = duration => {
8834      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
8835      transformElements.forEach(el => {
8836        el.style.transitionDuration = `${duration}ms`;
8837      });
8838      effectVirtualTransitionEnd({
8839        swiper,
8840        duration,
8841        transformElements,
8842        allSlides: true
8843      });
8844    };
8845    effectInit({
8846      effect: 'fade',
8847      swiper,
8848      on,
8849      setTranslate,
8850      setTransition,
8851      overwriteParams: () => ({
8852        slidesPerView: 1,
8853        slidesPerGroup: 1,
8854        watchSlidesProgress: true,
8855        spaceBetween: 0,
8856        virtualTranslate: !swiper.params.cssMode
8857      })
8858    });
8859  }
8860
8861  function EffectCube(_ref) {
8862    let {
8863      swiper,
8864      extendParams,
8865      on
8866    } = _ref;
8867    extendParams({
8868      cubeEffect: {
8869        slideShadows: true,
8870        shadow: true,
8871        shadowOffset: 20,
8872        shadowScale: 0.94
8873      }
8874    });
8875    const createSlideShadows = (slideEl, progress, isHorizontal) => {
8876      let shadowBefore = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
8877      let shadowAfter = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
8878      if (!shadowBefore) {
8879        shadowBefore = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}`.split(' '));
8880        slideEl.append(shadowBefore);
8881      }
8882      if (!shadowAfter) {
8883        shadowAfter = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}`.split(' '));
8884        slideEl.append(shadowAfter);
8885      }
8886      if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
8887      if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
8888    };
8889    const recreateShadows = () => {
8890      // create new ones
8891      const isHorizontal = swiper.isHorizontal();
8892      swiper.slides.forEach(slideEl => {
8893        const progress = Math.max(Math.min(slideEl.progress, 1), -1);
8894        createSlideShadows(slideEl, progress, isHorizontal);
8895      });
8896    };
8897    const setTranslate = () => {
8898      const {
8899        el,
8900        wrapperEl,
8901        slides,
8902        width: swiperWidth,
8903        height: swiperHeight,
8904        rtlTranslate: rtl,
8905        size: swiperSize,
8906        browser
8907      } = swiper;
8908      const params = swiper.params.cubeEffect;
8909      const isHorizontal = swiper.isHorizontal();
8910      const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
8911      let wrapperRotate = 0;
8912      let cubeShadowEl;
8913      if (params.shadow) {
8914        if (isHorizontal) {
8915          cubeShadowEl = swiper.wrapperEl.querySelector('.swiper-cube-shadow');
8916          if (!cubeShadowEl) {
8917            cubeShadowEl = createElement('div', 'swiper-cube-shadow');
8918            swiper.wrapperEl.append(cubeShadowEl);
8919          }
8920          cubeShadowEl.style.height = `${swiperWidth}px`;
8921        } else {
8922          cubeShadowEl = el.querySelector('.swiper-cube-shadow');
8923          if (!cubeShadowEl) {
8924            cubeShadowEl = createElement('div', 'swiper-cube-shadow');
8925            el.append(cubeShadowEl);
8926          }
8927        }
8928      }
8929      for (let i = 0; i < slides.length; i += 1) {
8930        const slideEl = slides[i];
8931        let slideIndex = i;
8932        if (isVirtual) {
8933          slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10);
8934        }
8935        let slideAngle = slideIndex * 90;
8936        let round = Math.floor(slideAngle / 360);
8937        if (rtl) {
8938          slideAngle = -slideAngle;
8939          round = Math.floor(-slideAngle / 360);
8940        }
8941        const progress = Math.max(Math.min(slideEl.progress, 1), -1);
8942        let tx = 0;
8943        let ty = 0;
8944        let tz = 0;
8945        if (slideIndex % 4 === 0) {
8946          tx = -round * 4 * swiperSize;
8947          tz = 0;
8948        } else if ((slideIndex - 1) % 4 === 0) {
8949          tx = 0;
8950          tz = -round * 4 * swiperSize;
8951        } else if ((slideIndex - 2) % 4 === 0) {
8952          tx = swiperSize + round * 4 * swiperSize;
8953          tz = swiperSize;
8954        } else if ((slideIndex - 3) % 4 === 0) {
8955          tx = -swiperSize;
8956          tz = 3 * swiperSize + swiperSize * 4 * round;
8957        }
8958        if (rtl) {
8959          tx = -tx;
8960        }
8961        if (!isHorizontal) {
8962          ty = tx;
8963          tx = 0;
8964        }
8965        const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;
8966        if (progress <= 1 && progress > -1) {
8967          wrapperRotate = slideIndex * 90 + progress * 90;
8968          if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;
8969          if (swiper.browser && swiper.browser.isSafari && Math.abs(wrapperRotate) / 90 % 2 === 1) {
8970            wrapperRotate += 0.001;
8971          }
8972        }
8973        slideEl.style.transform = transform;
8974        if (params.slideShadows) {
8975          createSlideShadows(slideEl, progress, isHorizontal);
8976        }
8977      }
8978      wrapperEl.style.transformOrigin = `50% 50% -${swiperSize / 2}px`;
8979      wrapperEl.style['-webkit-transform-origin'] = `50% 50% -${swiperSize / 2}px`;
8980      if (params.shadow) {
8981        if (isHorizontal) {
8982          cubeShadowEl.style.transform = `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(89.99deg) rotateZ(0deg) scale(${params.shadowScale})`;
8983        } else {
8984          const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;
8985          const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);
8986          const scale1 = params.shadowScale;
8987          const scale2 = params.shadowScale / multiplier;
8988          const offset = params.shadowOffset;
8989          cubeShadowEl.style.transform = `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-89.99deg)`;
8990        }
8991      }
8992      const zFactor = (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0;
8993      wrapperEl.style.transform = `translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`;
8994      wrapperEl.style.setProperty('--swiper-cube-translate-z', `${zFactor}px`);
8995    };
8996    const setTransition = duration => {
8997      const {
8998        el,
8999        slides
9000      } = swiper;
9001      slides.forEach(slideEl => {
9002        slideEl.style.transitionDuration = `${duration}ms`;
9003        slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(subEl => {
9004          subEl.style.transitionDuration = `${duration}ms`;
9005        });
9006      });
9007      if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
9008        const shadowEl = el.querySelector('.swiper-cube-shadow');
9009        if (shadowEl) shadowEl.style.transitionDuration = `${duration}ms`;
9010      }
9011    };
9012    effectInit({
9013      effect: 'cube',
9014      swiper,
9015      on,
9016      setTranslate,
9017      setTransition,
9018      recreateShadows,
9019      getEffectParams: () => swiper.params.cubeEffect,
9020      perspective: () => true,
9021      overwriteParams: () => ({
9022        slidesPerView: 1,
9023        slidesPerGroup: 1,
9024        watchSlidesProgress: true,
9025        resistanceRatio: 0,
9026        spaceBetween: 0,
9027        centeredSlides: false,
9028        virtualTranslate: true
9029      })
9030    });
9031  }
9032
9033  function createShadow(suffix, slideEl, side) {
9034    const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}${suffix ? ` swiper-slide-shadow-${suffix}` : ''}`;
9035    const shadowContainer = getSlideTransformEl(slideEl);
9036    let shadowEl = shadowContainer.querySelector(`.${shadowClass.split(' ').join('.')}`);
9037    if (!shadowEl) {
9038      shadowEl = createElement('div', shadowClass.split(' '));
9039      shadowContainer.append(shadowEl);
9040    }
9041    return shadowEl;
9042  }
9043
9044  function EffectFlip(_ref) {
9045    let {
9046      swiper,
9047      extendParams,
9048      on
9049    } = _ref;
9050    extendParams({
9051      flipEffect: {
9052        slideShadows: true,
9053        limitRotation: true
9054      }
9055    });
9056    const createSlideShadows = (slideEl, progress) => {
9057      let shadowBefore = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
9058      let shadowAfter = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
9059      if (!shadowBefore) {
9060        shadowBefore = createShadow('flip', slideEl, swiper.isHorizontal() ? 'left' : 'top');
9061      }
9062      if (!shadowAfter) {
9063        shadowAfter = createShadow('flip', slideEl, swiper.isHorizontal() ? 'right' : 'bottom');
9064      }
9065      if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
9066      if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
9067    };
9068    const recreateShadows = () => {
9069      // Set shadows
9070      swiper.params.flipEffect;
9071      swiper.slides.forEach(slideEl => {
9072        let progress = slideEl.progress;
9073        if (swiper.params.flipEffect.limitRotation) {
9074          progress = Math.max(Math.min(slideEl.progress, 1), -1);
9075        }
9076        createSlideShadows(slideEl, progress);
9077      });
9078    };
9079    const setTranslate = () => {
9080      const {
9081        slides,
9082        rtlTranslate: rtl
9083      } = swiper;
9084      const params = swiper.params.flipEffect;
9085      for (let i = 0; i < slides.length; i += 1) {
9086        const slideEl = slides[i];
9087        let progress = slideEl.progress;
9088        if (swiper.params.flipEffect.limitRotation) {
9089          progress = Math.max(Math.min(slideEl.progress, 1), -1);
9090        }
9091        const offset = slideEl.swiperSlideOffset;
9092        const rotate = -180 * progress;
9093        let rotateY = rotate;
9094        let rotateX = 0;
9095        let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;
9096        let ty = 0;
9097        if (!swiper.isHorizontal()) {
9098          ty = tx;
9099          tx = 0;
9100          rotateX = -rotateY;
9101          rotateY = 0;
9102        } else if (rtl) {
9103          rotateY = -rotateY;
9104        }
9105        if (swiper.browser && swiper.browser.isSafari) {
9106          if (Math.abs(rotateY) / 90 % 2 === 1) {
9107            rotateY += 0.001;
9108          }
9109          if (Math.abs(rotateX) / 90 % 2 === 1) {
9110            rotateX += 0.001;
9111          }
9112        }
9113        slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
9114        if (params.slideShadows) {
9115          createSlideShadows(slideEl, progress);
9116        }
9117        const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;
9118        const targetEl = effectTarget(params, slideEl);
9119        targetEl.style.transform = transform;
9120      }
9121    };
9122    const setTransition = duration => {
9123      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9124      transformElements.forEach(el => {
9125        el.style.transitionDuration = `${duration}ms`;
9126        el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {
9127          shadowEl.style.transitionDuration = `${duration}ms`;
9128        });
9129      });
9130      effectVirtualTransitionEnd({
9131        swiper,
9132        duration,
9133        transformElements
9134      });
9135    };
9136    effectInit({
9137      effect: 'flip',
9138      swiper,
9139      on,
9140      setTranslate,
9141      setTransition,
9142      recreateShadows,
9143      getEffectParams: () => swiper.params.flipEffect,
9144      perspective: () => true,
9145      overwriteParams: () => ({
9146        slidesPerView: 1,
9147        slidesPerGroup: 1,
9148        watchSlidesProgress: true,
9149        spaceBetween: 0,
9150        virtualTranslate: !swiper.params.cssMode
9151      })
9152    });
9153  }
9154
9155  function EffectCoverflow(_ref) {
9156    let {
9157      swiper,
9158      extendParams,
9159      on
9160    } = _ref;
9161    extendParams({
9162      coverflowEffect: {
9163        rotate: 50,
9164        stretch: 0,
9165        depth: 100,
9166        scale: 1,
9167        modifier: 1,
9168        slideShadows: true
9169      }
9170    });
9171    const setTranslate = () => {
9172      const {
9173        width: swiperWidth,
9174        height: swiperHeight,
9175        slides,
9176        slidesSizesGrid
9177      } = swiper;
9178      const params = swiper.params.coverflowEffect;
9179      const isHorizontal = swiper.isHorizontal();
9180      const transform = swiper.translate;
9181      const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;
9182      const rotate = isHorizontal ? params.rotate : -params.rotate;
9183      const translate = params.depth;
9184      // Each slide offset from center
9185      for (let i = 0, length = slides.length; i < length; i += 1) {
9186        const slideEl = slides[i];
9187        const slideSize = slidesSizesGrid[i];
9188        const slideOffset = slideEl.swiperSlideOffset;
9189        const centerOffset = (center - slideOffset - slideSize / 2) / slideSize;
9190        const offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier;
9191        let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
9192        let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
9193        // var rotateZ = 0
9194        let translateZ = -translate * Math.abs(offsetMultiplier);
9195        let stretch = params.stretch;
9196        // Allow percentage to make a relative stretch for responsive sliders
9197        if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
9198          stretch = parseFloat(params.stretch) / 100 * slideSize;
9199        }
9200        let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;
9201        let translateX = isHorizontal ? stretch * offsetMultiplier : 0;
9202        let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);
9203
9204        // Fix for ultra small values
9205        if (Math.abs(translateX) < 0.001) translateX = 0;
9206        if (Math.abs(translateY) < 0.001) translateY = 0;
9207        if (Math.abs(translateZ) < 0.001) translateZ = 0;
9208        if (Math.abs(rotateY) < 0.001) rotateY = 0;
9209        if (Math.abs(rotateX) < 0.001) rotateX = 0;
9210        if (Math.abs(scale) < 0.001) scale = 0;
9211        if (swiper.browser && swiper.browser.isSafari) {
9212          if (Math.abs(rotateY) / 90 % 2 === 1) {
9213            rotateY += 0.001;
9214          }
9215          if (Math.abs(rotateX) / 90 % 2 === 1) {
9216            rotateX += 0.001;
9217          }
9218        }
9219        const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px)  rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;
9220        const targetEl = effectTarget(params, slideEl);
9221        targetEl.style.transform = slideTransform;
9222        slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
9223        if (params.slideShadows) {
9224          // Set shadows
9225          let shadowBeforeEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
9226          let shadowAfterEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
9227          if (!shadowBeforeEl) {
9228            shadowBeforeEl = createShadow('coverflow', slideEl, isHorizontal ? 'left' : 'top');
9229          }
9230          if (!shadowAfterEl) {
9231            shadowAfterEl = createShadow('coverflow', slideEl, isHorizontal ? 'right' : 'bottom');
9232          }
9233          if (shadowBeforeEl) shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;
9234          if (shadowAfterEl) shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;
9235        }
9236      }
9237    };
9238    const setTransition = duration => {
9239      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9240      transformElements.forEach(el => {
9241        el.style.transitionDuration = `${duration}ms`;
9242        el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {
9243          shadowEl.style.transitionDuration = `${duration}ms`;
9244        });
9245      });
9246    };
9247    effectInit({
9248      effect: 'coverflow',
9249      swiper,
9250      on,
9251      setTranslate,
9252      setTransition,
9253      perspective: () => true,
9254      overwriteParams: () => ({
9255        watchSlidesProgress: true
9256      })
9257    });
9258  }
9259
9260  function EffectCreative(_ref) {
9261    let {
9262      swiper,
9263      extendParams,
9264      on
9265    } = _ref;
9266    extendParams({
9267      creativeEffect: {
9268        limitProgress: 1,
9269        shadowPerProgress: false,
9270        progressMultiplier: 1,
9271        perspective: true,
9272        prev: {
9273          translate: [0, 0, 0],
9274          rotate: [0, 0, 0],
9275          opacity: 1,
9276          scale: 1
9277        },
9278        next: {
9279          translate: [0, 0, 0],
9280          rotate: [0, 0, 0],
9281          opacity: 1,
9282          scale: 1
9283        }
9284      }
9285    });
9286    const getTranslateValue = value => {
9287      if (typeof value === 'string') return value;
9288      return `${value}px`;
9289    };
9290    const setTranslate = () => {
9291      const {
9292        slides,
9293        wrapperEl,
9294        slidesSizesGrid
9295      } = swiper;
9296      const params = swiper.params.creativeEffect;
9297      const {
9298        progressMultiplier: multiplier
9299      } = params;
9300      const isCenteredSlides = swiper.params.centeredSlides;
9301      if (isCenteredSlides) {
9302        const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;
9303        wrapperEl.style.transform = `translateX(calc(50% - ${margin}px))`;
9304      }
9305      for (let i = 0; i < slides.length; i += 1) {
9306        const slideEl = slides[i];
9307        const slideProgress = slideEl.progress;
9308        const progress = Math.min(Math.max(slideEl.progress, -params.limitProgress), params.limitProgress);
9309        let originalProgress = progress;
9310        if (!isCenteredSlides) {
9311          originalProgress = Math.min(Math.max(slideEl.originalProgress, -params.limitProgress), params.limitProgress);
9312        }
9313        const offset = slideEl.swiperSlideOffset;
9314        const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];
9315        const r = [0, 0, 0];
9316        let custom = false;
9317        if (!swiper.isHorizontal()) {
9318          t[1] = t[0];
9319          t[0] = 0;
9320        }
9321        let data = {
9322          translate: [0, 0, 0],
9323          rotate: [0, 0, 0],
9324          scale: 1,
9325          opacity: 1
9326        };
9327        if (progress < 0) {
9328          data = params.next;
9329          custom = true;
9330        } else if (progress > 0) {
9331          data = params.prev;
9332          custom = true;
9333        }
9334        // set translate
9335        t.forEach((value, index) => {
9336          t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`;
9337        });
9338        // set rotates
9339        r.forEach((value, index) => {
9340          let val = data.rotate[index] * Math.abs(progress * multiplier);
9341          if (swiper.browser && swiper.browser.isSafari && Math.abs(val) / 90 % 2 === 1) {
9342            val += 0.001;
9343          }
9344          r[index] = val;
9345        });
9346        slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
9347        const translateString = t.join(', ');
9348        const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;
9349        const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;
9350        const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier;
9351        const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;
9352
9353        // Set shadows
9354        if (custom && data.shadow || !custom) {
9355          let shadowEl = slideEl.querySelector('.swiper-slide-shadow');
9356          if (!shadowEl && data.shadow) {
9357            shadowEl = createShadow('creative', slideEl);
9358          }
9359          if (shadowEl) {
9360            const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress;
9361            shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);
9362          }
9363        }
9364        const targetEl = effectTarget(params, slideEl);
9365        targetEl.style.transform = transform;
9366        targetEl.style.opacity = opacityString;
9367        if (data.origin) {
9368          targetEl.style.transformOrigin = data.origin;
9369        }
9370      }
9371    };
9372    const setTransition = duration => {
9373      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9374      transformElements.forEach(el => {
9375        el.style.transitionDuration = `${duration}ms`;
9376        el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {
9377          shadowEl.style.transitionDuration = `${duration}ms`;
9378        });
9379      });
9380      effectVirtualTransitionEnd({
9381        swiper,
9382        duration,
9383        transformElements,
9384        allSlides: true
9385      });
9386    };
9387    effectInit({
9388      effect: 'creative',
9389      swiper,
9390      on,
9391      setTranslate,
9392      setTransition,
9393      perspective: () => swiper.params.creativeEffect.perspective,
9394      overwriteParams: () => ({
9395        watchSlidesProgress: true,
9396        virtualTranslate: !swiper.params.cssMode
9397      })
9398    });
9399  }
9400
9401  function EffectCards(_ref) {
9402    let {
9403      swiper,
9404      extendParams,
9405      on
9406    } = _ref;
9407    extendParams({
9408      cardsEffect: {
9409        slideShadows: true,
9410        rotate: true,
9411        perSlideRotate: 2,
9412        perSlideOffset: 8
9413      }
9414    });
9415    const setTranslate = () => {
9416      const {
9417        slides,
9418        activeIndex,
9419        rtlTranslate: rtl
9420      } = swiper;
9421      const params = swiper.params.cardsEffect;
9422      const {
9423        startTranslate,
9424        isTouched
9425      } = swiper.touchEventsData;
9426      const currentTranslate = rtl ? -swiper.translate : swiper.translate;
9427      for (let i = 0; i < slides.length; i += 1) {
9428        const slideEl = slides[i];
9429        const slideProgress = slideEl.progress;
9430        const progress = Math.min(Math.max(slideProgress, -4), 4);
9431        let offset = slideEl.swiperSlideOffset;
9432        if (swiper.params.centeredSlides && !swiper.params.cssMode) {
9433          swiper.wrapperEl.style.transform = `translateX(${swiper.minTranslate()}px)`;
9434        }
9435        if (swiper.params.centeredSlides && swiper.params.cssMode) {
9436          offset -= slides[0].swiperSlideOffset;
9437        }
9438        let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;
9439        let tY = 0;
9440        const tZ = -100 * Math.abs(progress);
9441        let scale = 1;
9442        let rotate = -params.perSlideRotate * progress;
9443        let tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;
9444        const slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;
9445        const isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate;
9446        const isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate;
9447        if (isSwipeToNext || isSwipeToPrev) {
9448          const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;
9449          rotate += -28 * progress * subProgress;
9450          scale += -0.5 * subProgress;
9451          tXAdd += 96 * subProgress;
9452          tY = `${-25 * subProgress * Math.abs(progress)}%`;
9453        }
9454        if (progress < 0) {
9455          // next
9456          tX = `calc(${tX}px ${rtl ? '-' : '+'} (${tXAdd * Math.abs(progress)}%))`;
9457        } else if (progress > 0) {
9458          // prev
9459          tX = `calc(${tX}px ${rtl ? '-' : '+'} (-${tXAdd * Math.abs(progress)}%))`;
9460        } else {
9461          tX = `${tX}px`;
9462        }
9463        if (!swiper.isHorizontal()) {
9464          const prevY = tY;
9465          tY = tX;
9466          tX = prevY;
9467        }
9468        const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;
9469
9470        /* eslint-disable */
9471        const transform = `
9472        translate3d(${tX}, ${tY}, ${tZ}px)
9473        rotateZ(${params.rotate ? rtl ? -rotate : rotate : 0}deg)
9474        scale(${scaleString})
9475      `;
9476        /* eslint-enable */
9477
9478        if (params.slideShadows) {
9479          // Set shadows
9480          let shadowEl = slideEl.querySelector('.swiper-slide-shadow');
9481          if (!shadowEl) {
9482            shadowEl = createShadow('cards', slideEl);
9483          }
9484          if (shadowEl) shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);
9485        }
9486        slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
9487        const targetEl = effectTarget(params, slideEl);
9488        targetEl.style.transform = transform;
9489      }
9490    };
9491    const setTransition = duration => {
9492      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9493      transformElements.forEach(el => {
9494        el.style.transitionDuration = `${duration}ms`;
9495        el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {
9496          shadowEl.style.transitionDuration = `${duration}ms`;
9497        });
9498      });
9499      effectVirtualTransitionEnd({
9500        swiper,
9501        duration,
9502        transformElements
9503      });
9504    };
9505    effectInit({
9506      effect: 'cards',
9507      swiper,
9508      on,
9509      setTranslate,
9510      setTransition,
9511      perspective: () => true,
9512      overwriteParams: () => ({
9513        watchSlidesProgress: true,
9514        virtualTranslate: !swiper.params.cssMode
9515      })
9516    });
9517  }
9518
9519  /**
9520   * Swiper 11.0.5
9521   * Most modern mobile touch slider and framework with hardware accelerated transitions
9522   * https://swiperjs.com
9523   *
9524   * Copyright 2014-2023 Vladimir Kharlampidi
9525   *
9526   * Released under the MIT License
9527   *
9528   * Released on: November 22, 2023
9529   */
9530
9531
9532  // Swiper Class
9533  const modules = [Virtual, Keyboard, Mousewheel, Navigation, Pagination, Scrollbar, Parallax, Zoom, Controller, A11y, History, HashNavigation, Autoplay, Thumb, freeMode, Grid, Manipulation, EffectFade, EffectCube, EffectFlip, EffectCoverflow, EffectCreative, EffectCards];
9534  Swiper.use(modules);
9535
9536  return Swiper;
9537
9538})();

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.