PageSourceSearch

https://turtlebay-nyc.org/wp-content/plugins/counter-number-showcase/assets/js/bootstrap.js?ver=7.1.1

js turtlebay-nyc.org collected 2026-09-25 00:47:43 UTC 148,892 bytes, 5,046 lines download raw bytes

vendor: 4,401 bytes, lines 1-132
1/*!
2  * Bootstrap v5.1.3 (https://getbootstrap.com/)
3  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5  */
6(function (global, factory) {
7  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :
8  typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :
9  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));
10})(this, (function (Popper) { 'use strict';
11
12  function _interopNamespace(e) {
13    if (e && e.__esModule) return e;
14    const n = Object.create(null);
15    if (e) {
16      for (const k in e) {
17        if (k !== 'default') {
18          const d = Object.getOwnPropertyDescriptor(e, k);
19          Object.defineProperty(n, k, d.get ? d : {
20            enumerable: true,
21            get: () => e[k]
22          });
23        }
24      }
25    }
26    n.default = e;
27    return Object.freeze(n);
28  }
29
30  const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
31
32  /**
33   * --------------------------------------------------------------------------
34   * Bootstrap (v5.1.3): util/index.js
35   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
36   * --------------------------------------------------------------------------
37   */
38  const MAX_UID = 1000000;
39  const MILLISECONDS_MULTIPLIER = 1000;
40  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
41
42  const toType = obj => {
43    if (obj === null || obj === undefined) {
44      return `${obj}`;
45    }
46
47    return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
48  };
49  /**
50   * --------------------------------------------------------------------------
51   * Public Util Api
52   * --------------------------------------------------------------------------
53   */
54
55
56  const getUID = prefix => {
57    do {
58      prefix += Math.floor(Math.random() * MAX_UID);
59    } while (document.getElementById(prefix));
60
61    return prefix;
62  };
63
64  const getSelector = element => {
65    let selector = element.getAttribute('data-bs-target');
66
67    if (!selector || selector === '#') {
68      let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
69      // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
70      // `document.querySelector` will rightfully complain it is invalid.
71      // See https://github.com/twbs/bootstrap/issues/32273
72
73      if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
74        return null;
75      } // Just in case some CMS puts out a full URL with the anchor appended
76
77
78      if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
79        hrefAttr = `#${hrefAttr.split('#')[1]}`;
80      }
81
82      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
83    }
84
85    return selector;
86  };
87
88  const getSelectorFromElement = element => {
89    const selector = getSelector(element);
90
91    if (selector) {
92      return document.querySelector(selector) ? selector : null;
93    }
94
95    return null;
96  };
97
98  const getElementFromSelector = element => {
99    const selector = getSelector(element);
100    return selector ? document.querySelector(selector) : null;
101  };
102
103  const getTransitionDurationFromElement = element => {
104    if (!element) {
105      return 0;
106    } // Get transition-duration of the element
107
108
109    let {
110      transitionDuration,
111      transitionDelay
112    } = window.getComputedStyle(element);
113    const floatTransitionDuration = Number.parseFloat(transitionDuration);
114    const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
115
116    if (!floatTransitionDuration && !floatTransitionDelay) {
117      return 0;
118    } // If multiple durations are defined, take the first
119
120
121    transitionDuration = transitionDuration.split(',')[0];
122    transitionDelay = transitionDelay.split(',')[0];
123    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
124  };
125
126  const triggerTransitionEnd = element => {
127    element.dispatchEvent(new Event(TRANSITION_END));
128  };
129
130  const isElement = obj => {
131    if (!obj || typeof obj !== 'object') {
132      return false;
vendor: 4,095 bytes, lines 133-293
133    }
134
135    if (typeof obj.jquery !== 'undefined') {
136      obj = obj[0];
137    }
138
139    return typeof obj.nodeType !== 'undefined';
140  };
141
142  const getElement = obj => {
143    if (isElement(obj)) {
144      // it's a jQuery object or a node element
145      return obj.jquery ? obj[0] : obj;
146    }
147
148    if (typeof obj === 'string' && obj.length > 0) {
149      return document.querySelector(obj);
150    }
151
152    return null;
153  };
154
155  const typeCheckConfig = (componentName, config, configTypes) => {
156    Object.keys(configTypes).forEach(property => {
157      const expectedTypes = configTypes[property];
158      const value = config[property];
159      const valueType = value && isElement(value) ? 'element' : toType(value);
160
161      if (!new RegExp(expectedTypes).test(valueType)) {
162        throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
163      }
164    });
165  };
166
167  const isVisible = element => {
168    if (!isElement(element) || element.getClientRects().length === 0) {
169      return false;
170    }
171
172    return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
173  };
174
175  const isDisabled = element => {
176    if (!element || element.nodeType !== Node.ELEMENT_NODE) {
177      return true;
178    }
179
180    if (element.classList.contains('disabled')) {
181      return true;
182    }
183
184    if (typeof element.disabled !== 'undefined') {
185      return element.disabled;
186    }
187
188    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
189  };
190
191  const findShadowRoot = element => {
192    if (!document.documentElement.attachShadow) {
193      return null;
194    } // Can find the shadow root otherwise it'll return the document
195
196
197    if (typeof element.getRootNode === 'function') {
198      const root = element.getRootNode();
199      return root instanceof ShadowRoot ? root : null;
200    }
201
202    if (element instanceof ShadowRoot) {
203      return element;
204    } // when we don't find a shadow root
205
206
207    if (!element.parentNode) {
208      return null;
209    }
210
211    return findShadowRoot(element.parentNode);
212  };
213
214  const noop = () => {};
215  /**
216   * Trick to restart an element's animation
217   *
218   * @param {HTMLElement} element
219   * @return void
220   *
221   * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
222   */
223
224
225  const reflow = element => {
226    // eslint-disable-next-line no-unused-expressions
227    element.offsetHeight;
228  };
229
230  const getjQuery = () => {
231    const {
232      jQuery
233    } = window;
234
235    if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
236      return jQuery;
237    }
238
239    return null;
240  };
241
242  const DOMContentLoadedCallbacks = [];
243
244  const onDOMContentLoaded = callback => {
245    if (document.readyState === 'loading') {
246      // add listener on the first call when the document is in loading state
247      if (!DOMContentLoadedCallbacks.length) {
248        document.addEventListener('DOMContentLoaded', () => {
249          DOMContentLoadedCallbacks.forEach(callback => callback());
250        });
251      }
252
253      DOMContentLoadedCallbacks.push(callback);
254    } else {
255      callback();
256    }
257  };
258
259  const isRTL = () => document.documentElement.dir === 'rtl';
260
261  const defineJQueryPlugin = plugin => {
262    onDOMContentLoaded(() => {
263      const $ = getjQuery();
264      /* istanbul ignore if */
265
266      if ($) {
267        const name = plugin.NAME;
268        const JQUERY_NO_CONFLICT = $.fn[name];
269        $.fn[name] = plugin.jQueryInterface;
270        $.fn[name].Constructor = plugin;
271
272        $.fn[name].noConflict = () => {
273          $.fn[name] = JQUERY_NO_CONFLICT;
274          return plugin.jQueryInterface;
275        };
276      }
277    });
278  };
279
280  const execute = callback => {
281    if (typeof callback === 'function') {
282      callback();
283    }
284  };
285
286  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
287    if (!waitForTransition) {
288      execute(callback);
289      return;
290    }
291
292    const durationPadding = 5;
293    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
vendor: 15,953 bytes, lines 294-794
294    let called = false;
295
296    const handler = ({
297      target
298    }) => {
299      if (target !== transitionElement) {
300        return;
301      }
302
303      called = true;
304      transitionElement.removeEventListener(TRANSITION_END, handler);
305      execute(callback);
306    };
307
308    transitionElement.addEventListener(TRANSITION_END, handler);
309    setTimeout(() => {
310      if (!called) {
311        triggerTransitionEnd(transitionElement);
312      }
313    }, emulatedDuration);
314  };
315  /**
316   * Return the previous/next element of a list.
317   *
318   * @param {array} list    The list of elements
319   * @param activeElement   The active element
320   * @param shouldGetNext   Choose to get next or previous element
321   * @param isCycleAllowed
322   * @return {Element|elem} The proper element
323   */
324
325
326  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
327    let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed
328
329    if (index === -1) {
330      return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];
331    }
332
333    const listLength = list.length;
334    index += shouldGetNext ? 1 : -1;
335
336    if (isCycleAllowed) {
337      index = (index + listLength) % listLength;
338    }
339
340    return list[Math.max(0, Math.min(index, listLength - 1))];
341  };
342
343  /**
344   * --------------------------------------------------------------------------
345   * Bootstrap (v5.1.3): dom/event-handler.js
346   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
347   * --------------------------------------------------------------------------
348   */
349  /**
350   * ------------------------------------------------------------------------
351   * Constants
352   * ------------------------------------------------------------------------
353   */
354
355  const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
356  const stripNameRegex = /\..*/;
357  const stripUidRegex = /::\d+$/;
358  const eventRegistry = {}; // Events storage
359
360  let uidEvent = 1;
361  const customEvents = {
362    mouseenter: 'mouseover',
363    mouseleave: 'mouseout'
364  };
365  const customEventsRegex = /^(mouseenter|mouseleave)/i;
366  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
367  /**
368   * ------------------------------------------------------------------------
369   * Private methods
370   * ------------------------------------------------------------------------
371   */
372
373  function getUidEvent(element, uid) {
374    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
375  }
376
377  function getEvent(element) {
378    const uid = getUidEvent(element);
379    element.uidEvent = uid;
380    eventRegistry[uid] = eventRegistry[uid] || {};
381    return eventRegistry[uid];
382  }
383
384  function bootstrapHandler(element, fn) {
385    return function handler(event) {
386      event.delegateTarget = element;
387
388      if (handler.oneOff) {
389        EventHandler.off(element, event.type, fn);
390      }
391
392      return fn.apply(element, [event]);
393    };
394  }
395
396  function bootstrapDelegationHandler(element, selector, fn) {
397    return function handler(event) {
398      const domElements = element.querySelectorAll(selector);
399
400      for (let {
401        target
402      } = event; target && target !== this; target = target.parentNode) {
403        for (let i = domElements.length; i--;) {
404          if (domElements[i] === target) {
405            event.delegateTarget = target;
406
407            if (handler.oneOff) {
408              EventHandler.off(element, event.type, selector, fn);
409            }
410
411            return fn.apply(target, [event]);
412          }
413        }
414      } // To please ESLint
415
416
417      return null;
418    };
419  }
420
421  function findHandler(events, handler, delegationSelector = null) {
422    const uidEventList = Object.keys(events);
423
424    for (let i = 0, len = uidEventList.length; i < len; i++) {
425      const event = events[uidEventList[i]];
426
427      if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
428        return event;
429      }
430    }
431
432    return null;
433  }
434
435  function normalizeParams(originalTypeEvent, handler, delegationFn) {
436    const delegation = typeof handler === 'string';
437    const originalHandler = delegation ? delegationFn : handler;
438    let typeEvent = getTypeEvent(originalTypeEvent);
439    const isNative = nativeEvents.has(typeEvent);
440
441    if (!isNative) {
442      typeEvent = originalTypeEvent;
443    }
444
445    return [delegation, originalHandler, typeEvent];
446  }
447
448  function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
449    if (typeof originalTypeEvent !== 'string' || !element) {
450      return;
451    }
452
453    if (!handler) {
454      handler = delegationFn;
455      delegationFn = null;
456    } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
457    // this prevents the handler from being dispatched the same way as mouseover or mouseout does
458
459
460    if (customEventsRegex.test(originalTypeEvent)) {
461      const wrapFn = fn => {
462        return function (event) {
463          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
464            return fn.call(this, event);
465          }
466        };
467      };
468
469      if (delegationFn) {
470        delegationFn = wrapFn(delegationFn);
471      } else {
472        handler = wrapFn(handler);
473      }
474    }
475
476    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
477    const events = getEvent(element);
478    const handlers = events[typeEvent] || (events[typeEvent] = {});
479    const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);
480
481    if (previousFn) {
482      previousFn.oneOff = previousFn.oneOff && oneOff;
483      return;
484    }
485
486    const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));
487    const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);
488    fn.delegationSelector = delegation ? handler : null;
489    fn.originalHandler = originalHandler;
490    fn.oneOff = oneOff;
491    fn.uidEvent = uid;
492    handlers[uid] = fn;
493    element.addEventListener(typeEvent, fn, delegation);
494  }
495
496  function removeHandler(element, events, typeEvent, handler, delegationSelector) {
497    const fn = findHandler(events[typeEvent], handler, delegationSelector);
498
499    if (!fn) {
500      return;
501    }
502
503    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
504    delete events[typeEvent][fn.uidEvent];
505  }
506
507  function removeNamespacedHandlers(element, events, typeEvent, namespace) {
508    const storeElementEvent = events[typeEvent] || {};
509    Object.keys(storeElementEvent).forEach(handlerKey => {
510      if (handlerKey.includes(namespace)) {
511        const event = storeElementEvent[handlerKey];
512        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
513      }
514    });
515  }
516
517  function getTypeEvent(event) {
518    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
519    event = event.replace(stripNameRegex, '');
520    return customEvents[event] || event;
521  }
522
523  const EventHandler = {
524    on(element, event, handler, delegationFn) {
525      addHandler(element, event, handler, delegationFn, false);
526    },
527
528    one(element, event, handler, delegationFn) {
529      addHandler(element, event, handler, delegationFn, true);
530    },
531
532    off(element, originalTypeEvent, handler, delegationFn) {
533      if (typeof originalTypeEvent !== 'string' || !element) {
534        return;
535      }
536
537      const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
538      const inNamespace = typeEvent !== originalTypeEvent;
539      const events = getEvent(element);
540      const isNamespace = originalTypeEvent.startsWith('.');
541
542      if (typeof originalHandler !== 'undefined') {
543        // Simplest case: handler is passed, remove that listener ONLY.
544        if (!events || !events[typeEvent]) {
545          return;
546        }
547
548        removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);
549        return;
550      }
551
552      if (isNamespace) {
553        Object.keys(events).forEach(elementEvent => {
554          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
555        });
556      }
557
558      const storeElementEvent = events[typeEvent] || {};
559      Object.keys(storeElementEvent).forEach(keyHandlers => {
560        const handlerKey = keyHandlers.replace(stripUidRegex, '');
561
562        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
563          const event = storeElementEvent[keyHandlers];
564          removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
565        }
566      });
567    },
568
569    trigger(element, event, args) {
570      if (typeof event !== 'string' || !element) {
571        return null;
572      }
573
574      const $ = getjQuery();
575      const typeEvent = getTypeEvent(event);
576      const inNamespace = event !== typeEvent;
577      const isNative = nativeEvents.has(typeEvent);
578      let jQueryEvent;
579      let bubbles = true;
580      let nativeDispatch = true;
581      let defaultPrevented = false;
582      let evt = null;
583
584      if (inNamespace && $) {
585        jQueryEvent = $.Event(event, args);
586        $(element).trigger(jQueryEvent);
587        bubbles = !jQueryEvent.isPropagationStopped();
588        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
589        defaultPrevented = jQueryEvent.isDefaultPrevented();
590      }
591
592      if (isNative) {
593        evt = document.createEvent('HTMLEvents');
594        evt.initEvent(typeEvent, bubbles, true);
595      } else {
596        evt = new CustomEvent(event, {
597          bubbles,
598          cancelable: true
599        });
600      } // merge custom information in our event
601
602
603      if (typeof args !== 'undefined') {
604        Object.keys(args).forEach(key => {
605          Object.defineProperty(evt, key, {
606            get() {
607              return args[key];
608            }
609
610          });
611        });
612      }
613
614      if (defaultPrevented) {
615        evt.preventDefault();
616      }
617
618      if (nativeDispatch) {
619        element.dispatchEvent(evt);
620      }
621
622      if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
623        jQueryEvent.preventDefault();
624      }
625
626      return evt;
627    }
628
629  };
630
631  /**
632   * --------------------------------------------------------------------------
633   * Bootstrap (v5.1.3): dom/data.js
634   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
635   * --------------------------------------------------------------------------
636   */
637
638  /**
639   * ------------------------------------------------------------------------
640   * Constants
641   * ------------------------------------------------------------------------
642   */
643  const elementMap = new Map();
644  const Data = {
645    set(element, key, instance) {
646      if (!elementMap.has(element)) {
647        elementMap.set(element, new Map());
648      }
649
650      const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
651      // can be removed later when multiple key/instances are fine to be used
652
653      if (!instanceMap.has(key) && instanceMap.size !== 0) {
654        // eslint-disable-next-line no-console
655        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
656        return;
657      }
658
659      instanceMap.set(key, instance);
660    },
661
662    get(element, key) {
663      if (elementMap.has(element)) {
664        return elementMap.get(element).get(key) || null;
665      }
666
667      return null;
668    },
669
670    remove(element, key) {
671      if (!elementMap.has(element)) {
672        return;
673      }
674
675      const instanceMap = elementMap.get(element);
676      instanceMap.delete(key); // free up element references if there are no instances left for an element
677
678      if (instanceMap.size === 0) {
679        elementMap.delete(element);
680      }
681    }
682
683  };
684
685  /**
686   * --------------------------------------------------------------------------
687   * Bootstrap (v5.1.3): base-component.js
688   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
689   * --------------------------------------------------------------------------
690   */
691  /**
692   * ------------------------------------------------------------------------
693   * Constants
694   * ------------------------------------------------------------------------
695   */
696
697  const VERSION = '5.1.3';
698
699  class BaseComponent {
700    constructor(element) {
701      element = getElement(element);
702
703      if (!element) {
704        return;
705      }
706
707      this._element = element;
708      Data.set(this._element, this.constructor.DATA_KEY, this);
709    }
710
711    dispose() {
712      Data.remove(this._element, this.constructor.DATA_KEY);
713      EventHandler.off(this._element, this.constructor.EVENT_KEY);
714      Object.getOwnPropertyNames(this).forEach(propertyName => {
715        this[propertyName] = null;
716      });
717    }
718
719    _queueCallback(callback, element, isAnimated = true) {
720      executeAfterTransition(callback, element, isAnimated);
721    }
722    /** Static */
723
724
725    static getInstance(element) {
726      return Data.get(getElement(element), this.DATA_KEY);
727    }
728
729    static getOrCreateInstance(element, config = {}) {
730      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
731    }
732
733    static get VERSION() {
734      return VERSION;
735    }
736
737    static get NAME() {
738      throw new Error('You have to implement the static method "NAME", for each component!');
739    }
740
741    static get DATA_KEY() {
742      return `bs.${this.NAME}`;
743    }
744
745    static get EVENT_KEY() {
746      return `.${this.DATA_KEY}`;
747    }
748
749  }
750
751  /**
752   * --------------------------------------------------------------------------
753   * Bootstrap (v5.1.3): util/component-functions.js
754   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
755   * --------------------------------------------------------------------------
756   */
757
758  const enableDismissTrigger = (component, method = 'hide') => {
759    const clickEvent = `click.dismiss${component.EVENT_KEY}`;
760    const name = component.NAME;
761    EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
762      if (['A', 'AREA'].includes(this.tagName)) {
763        event.preventDefault();
764      }
765
766      if (isDisabled(this)) {
767        return;
768      }
769
770      const target = getElementFromSelector(this) || this.closest(`.${name}`);
771      const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
772
773      instance[method]();
774    });
775  };
776
777  /**
778   * --------------------------------------------------------------------------
779   * Bootstrap (v5.1.3): alert.js
780   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
781   * --------------------------------------------------------------------------
782   */
783  /**
784   * ------------------------------------------------------------------------
785   * Constants
786   * ------------------------------------------------------------------------
787   */
788
789  const NAME$d = 'alert';
790  const DATA_KEY$c = 'bs.alert';
791  const EVENT_KEY$c = `.${DATA_KEY$c}`;
792  const EVENT_CLOSE = `close${EVENT_KEY$c}`;
793  const EVENT_CLOSED = `closed${EVENT_KEY$c}`;
794  const CLASS_NAME_FADE$5 = 'fade';
vendor: 4,515 bytes, lines 795-949
795  const CLASS_NAME_SHOW$8 = 'show';
796  /**
797   * ------------------------------------------------------------------------
798   * Class Definition
799   * ------------------------------------------------------------------------
800   */
801
802  class Alert extends BaseComponent {
803    // Getters
804    static get NAME() {
805      return NAME$d;
806    } // Public
807
808
809    close() {
810      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
811
812      if (closeEvent.defaultPrevented) {
813        return;
814      }
815
816      this._element.classList.remove(CLASS_NAME_SHOW$8);
817
818      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
819
820      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
821    } // Private
822
823
824    _destroyElement() {
825      this._element.remove();
826
827      EventHandler.trigger(this._element, EVENT_CLOSED);
828      this.dispose();
829    } // Static
830
831
832    static jQueryInterface(config) {
833      return this.each(function () {
834        const data = Alert.getOrCreateInstance(this);
835
836        if (typeof config !== 'string') {
837          return;
838        }
839
840        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
841          throw new TypeError(`No method named "${config}"`);
842        }
843
844        data[config](this);
845      });
846    }
847
848  }
849  /**
850   * ------------------------------------------------------------------------
851   * Data Api implementation
852   * ------------------------------------------------------------------------
853   */
854
855
856  enableDismissTrigger(Alert, 'close');
857  /**
858   * ------------------------------------------------------------------------
859   * jQuery
860   * ------------------------------------------------------------------------
861   * add .Alert to jQuery only if jQuery is present
862   */
863
864  defineJQueryPlugin(Alert);
865
866  /**
867   * --------------------------------------------------------------------------
868   * Bootstrap (v5.1.3): button.js
869   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
870   * --------------------------------------------------------------------------
871   */
872  /**
873   * ------------------------------------------------------------------------
874   * Constants
875   * ------------------------------------------------------------------------
876   */
877
878  const NAME$c = 'button';
879  const DATA_KEY$b = 'bs.button';
880  const EVENT_KEY$b = `.${DATA_KEY$b}`;
881  const DATA_API_KEY$7 = '.data-api';
882  const CLASS_NAME_ACTIVE$3 = 'active';
883  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
884  const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;
885  /**
886   * ------------------------------------------------------------------------
887   * Class Definition
888   * ------------------------------------------------------------------------
889   */
890
891  class Button extends BaseComponent {
892    // Getters
893    static get NAME() {
894      return NAME$c;
895    } // Public
896
897
898    toggle() {
899      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
900      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
901    } // Static
902
903
904    static jQueryInterface(config) {
905      return this.each(function () {
906        const data = Button.getOrCreateInstance(this);
907
908        if (config === 'toggle') {
909          data[config]();
910        }
911      });
912    }
913
914  }
915  /**
916   * ------------------------------------------------------------------------
917   * Data Api implementation
918   * ------------------------------------------------------------------------
919   */
920
921
922  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {
923    event.preventDefault();
924    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
925    const data = Button.getOrCreateInstance(button);
926    data.toggle();
927  });
928  /**
929   * ------------------------------------------------------------------------
930   * jQuery
931   * ------------------------------------------------------------------------
932   * add .Button to jQuery only if jQuery is present
933   */
934
935  defineJQueryPlugin(Button);
936
937  /**
938   * --------------------------------------------------------------------------
939   * Bootstrap (v5.1.3): dom/manipulator.js
940   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
941   * --------------------------------------------------------------------------
942   */
943  function normalizeData(val) {
944    if (val === 'true') {
945      return true;
946    }
947
948    if (val === 'false') {
949      return false;
vendor: 5,725 bytes, lines 950-1143
950    }
951
952    if (val === Number(val).toString()) {
953      return Number(val);
954    }
955
956    if (val === '' || val === 'null') {
957      return null;
958    }
959
960    return val;
961  }
962
963  function normalizeDataKey(key) {
964    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
965  }
966
967  const Manipulator = {
968    setDataAttribute(element, key, value) {
969      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
970    },
971
972    removeDataAttribute(element, key) {
973      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
974    },
975
976    getDataAttributes(element) {
977      if (!element) {
978        return {};
979      }
980
981      const attributes = {};
982      Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {
983        let pureKey = key.replace(/^bs/, '');
984        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
985        attributes[pureKey] = normalizeData(element.dataset[key]);
986      });
987      return attributes;
988    },
989
990    getDataAttribute(element, key) {
991      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
992    },
993
994    offset(element) {
995      const rect = element.getBoundingClientRect();
996      return {
997        top: rect.top + window.pageYOffset,
998        left: rect.left + window.pageXOffset
999      };
1000    },
1001
1002    position(element) {
1003      return {
1004        top: element.offsetTop,
1005        left: element.offsetLeft
1006      };
1007    }
1008
1009  };
1010
1011  /**
1012   * --------------------------------------------------------------------------
1013   * Bootstrap (v5.1.3): dom/selector-engine.js
1014   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1015   * --------------------------------------------------------------------------
1016   */
1017  const NODE_TEXT = 3;
1018  const SelectorEngine = {
1019    find(selector, element = document.documentElement) {
1020      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
1021    },
1022
1023    findOne(selector, element = document.documentElement) {
1024      return Element.prototype.querySelector.call(element, selector);
1025    },
1026
1027    children(element, selector) {
1028      return [].concat(...element.children).filter(child => child.matches(selector));
1029    },
1030
1031    parents(element, selector) {
1032      const parents = [];
1033      let ancestor = element.parentNode;
1034
1035      while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
1036        if (ancestor.matches(selector)) {
1037          parents.push(ancestor);
1038        }
1039
1040        ancestor = ancestor.parentNode;
1041      }
1042
1043      return parents;
1044    },
1045
1046    prev(element, selector) {
1047      let previous = element.previousElementSibling;
1048
1049      while (previous) {
1050        if (previous.matches(selector)) {
1051          return [previous];
1052        }
1053
1054        previous = previous.previousElementSibling;
1055      }
1056
1057      return [];
1058    },
1059
1060    next(element, selector) {
1061      let next = element.nextElementSibling;
1062
1063      while (next) {
1064        if (next.matches(selector)) {
1065          return [next];
1066        }
1067
1068        next = next.nextElementSibling;
1069      }
1070
1071      return [];
1072    },
1073
1074    focusableChildren(element) {
1075      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(', ');
1076      return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
1077    }
1078
1079  };
1080
1081  /**
1082   * --------------------------------------------------------------------------
1083   * Bootstrap (v5.1.3): carousel.js
1084   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1085   * --------------------------------------------------------------------------
1086   */
1087  /**
1088   * ------------------------------------------------------------------------
1089   * Constants
1090   * ------------------------------------------------------------------------
1091   */
1092
1093  const NAME$b = 'carousel';
1094  const DATA_KEY$a = 'bs.carousel';
1095  const EVENT_KEY$a = `.${DATA_KEY$a}`;
1096  const DATA_API_KEY$6 = '.data-api';
1097  const ARROW_LEFT_KEY = 'ArrowLeft';
1098  const ARROW_RIGHT_KEY = 'ArrowRight';
1099  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
1100
1101  const SWIPE_THRESHOLD = 40;
1102  const Default$a = {
1103    interval: 5000,
1104    keyboard: true,
1105    slide: false,
1106    pause: 'hover',
1107    wrap: true,
1108    touch: true
1109  };
1110  const DefaultType$a = {
1111    interval: '(number|boolean)',
1112    keyboard: 'boolean',
1113    slide: '(boolean|string)',
1114    pause: '(string|boolean)',
1115    wrap: 'boolean',
1116    touch: 'boolean'
1117  };
1118  const ORDER_NEXT = 'next';
1119  const ORDER_PREV = 'prev';
1120  const DIRECTION_LEFT = 'left';
1121  const DIRECTION_RIGHT = 'right';
1122  const KEY_TO_DIRECTION = {
1123    [ARROW_LEFT_KEY]: DIRECTION_RIGHT,
1124    [ARROW_RIGHT_KEY]: DIRECTION_LEFT
1125  };
1126  const EVENT_SLIDE = `slide${EVENT_KEY$a}`;
1127  const EVENT_SLID = `slid${EVENT_KEY$a}`;
1128  const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;
1129  const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;
1130  const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;
1131  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;
1132  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;
1133  const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;
1134  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;
1135  const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;
1136  const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;
1137  const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;
1138  const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
1139  const CLASS_NAME_CAROUSEL = 'carousel';
1140  const CLASS_NAME_ACTIVE$2 = 'active';
1141  const CLASS_NAME_SLIDE = 'slide';
1142  const CLASS_NAME_END = 'carousel-item-end';
1143  const CLASS_NAME_START = 'carousel-item-start';
1144  const CLASS_NAME_NEXT = 'carousel-item-next';
1145  const CLASS_NAME_PREV = 'carousel-item-prev';
1146  const CLASS_NAME_POINTER_EVENT = 'pointer-event';
1147  const SELECTOR_ACTIVE$1 = '.active';
1148  const SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
1149  const SELECTOR_ITEM = '.carousel-item';
1150  const SELECTOR_ITEM_IMG = '.carousel-item img';
1151  const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';
1152  const SELECTOR_INDICATORS = '.carousel-indicators';
1153  const SELECTOR_INDICATOR = '[data-bs-target]';
1154  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
1155  const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
1156  const POINTER_TYPE_TOUCH = 'touch';
1157  const POINTER_TYPE_PEN = 'pen';
1158  /**
1159   * ------------------------------------------------------------------------
1160   * Class Definition
1161   * ------------------------------------------------------------------------
1162   */
1163
1164  class Carousel extends BaseComponent {
1165    constructor(element, config) {
1166      super(element);
1167      this._items = null;
1168      this._interval = null;
1169      this._activeElement = null;
1170      this._isPaused = false;
1171      this._isSliding = false;
1172      this.touchTimeout = null;
1173      this.touchStartX = 0;
1174      this.touchDeltaX = 0;
1175      this._config = this._getConfig(config);
1176      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
1177      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
1178      this._pointerEvent = Boolean(window.PointerEvent);
1179
1180      this._addEventListeners();
1181    } // Getters
1182
1183
1184    static get Default() {
1185      return Default$a;
1186    }
1187
1188    static get NAME() {
1189      return NAME$b;
1190    } // Public
1191
1192
1193    next() {
1194      this._slide(ORDER_NEXT);
1195    }
1196
1197    nextWhenVisible() {
1198      // Don't call next when the page isn't visible
1199      // or the carousel or its parent isn't visible
1200      if (!document.hidden && isVisible(this._element)) {
1201        this.next();
1202      }
1203    }
1204
1205    prev() {
1206      this._slide(ORDER_PREV);
1207    }
1208
1209    pause(event) {
1210      if (!event) {
1211        this._isPaused = true;
1212      }
1213
1214      if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {
1215        triggerTransitionEnd(this._element);
1216        this.cycle(true);
1217      }
1218
1219      clearInterval(this._interval);
1220      this._interval = null;
1221    }
1222
1223    cycle(event) {
1224      if (!event) {
1225        this._isPaused = false;
1226      }
1227
1228      if (this._interval) {
1229        clearInterval(this._interval);
1230        this._interval = null;
1231      }
1232
1233      if (this._config && this._config.interval && !this._isPaused) {
1234        this._updateInterval();
1235
1236        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
1237      }
1238    }
1239
1240    to(index) {
1241      this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1242
1243      const activeIndex = this._getItemIndex(this._activeElement);
1244
1245      if (index > this._items.length - 1 || index < 0) {
1246        return;
1247      }
1248
1249      if (this._isSliding) {
1250        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
1251        return;
1252      }
1253
1254      if (activeIndex === index) {
1255        this.pause();
1256        this.cycle();
1257        return;
1258      }
1259
1260      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
1261
1262      this._slide(order, this._items[index]);
1263    } // Private
1264
1265
1266    _getConfig(config) {
1267      config = { ...Default$a,
1268        ...Manipulator.getDataAttributes(this._element),
1269        ...(typeof config === 'object' ? config : {})
1270      };
1271      typeCheckConfig(NAME$b, config, DefaultType$a);
1272      return config;
1273    }
1274
1275    _handleSwipe() {
1276      const absDeltax = Math.abs(this.touchDeltaX);
1277
1278      if (absDeltax <= SWIPE_THRESHOLD) {
1279        return;
1280      }
1281
1282      const direction = absDeltax / this.touchDeltaX;
1283      this.touchDeltaX = 0;
1284
1285      if (!direction) {
1286        return;
1287      }
1288
1289      this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);
1290    }
1291
1292    _addEventListeners() {
1293      if (this._config.keyboard) {
1294        EventHandler.on(this._element, EVENT_KEYDOWN, event =>
1294 this._keydown(event));
1295      }
1296
1297      if (this._config.pause === 'hover') {
1298        EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event));
1299        EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));
1300      }
1301
1302      if (this._config.touch && this._touchSupported) {
1303        this._addTouchEventListeners();
1304      }
1305    }
1306
1307    _addTouchEventListeners() {
1308      const hasPointerPenTouch = event => {
1309        return this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
1310      };
1311
1312      const start = event => {
1313        if (hasPointerPenTouch(event)) {
1314          this.touchStartX = event.clientX;
1315        } else if (!this._pointerEvent) {
1316          this.touchStartX = event.touches[0].clientX;
1317        }
1318      };
1319
1320      const move = event => {
1321        // ensure swiping with one touch and not pinching
1322        this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;
1323      };
1324
1325      const end = event => {
1326        if (hasPointerPenTouch(event)) {
1327          this.touchDeltaX = event.clientX - this.touchStartX;
1328        }
1329
1330        this._handleSwipe();
1331
1332        if (this._config.pause === 'hover') {
1333          // If it's a touch-enabled device, mouseenter/leave are fired as
1334          // part of the mouse compatibility events on first tap - the carousel
1335          // would stop cycling until user tapped out of it;
1336          // here, we listen for touchend, explicitly pause the carousel
1337          // (as if it's the second time we tap on it, mouseenter compat event
1338          // is NOT fired) and after a timeout (to allow for mouse compatibility
1339          // events to fire) we explicitly restart cycling
1340          this.pause();
1341
1342          if (this.touchTimeout) {
1343            clearTimeout(this.touchTimeout);
1344          }
1345
1346          this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
1347        }
1348      };
1349
1350      SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {
1351        EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault());
1352      });
1353
1354      if (this._pointerEvent) {
1355        EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event));
1356        EventHandler.on(this._element, EVENT_POINTERUP, event => end(event));
1357
1358        this._element.classList.add(CLASS_NAME_POINTER_EVENT);
1359      } else {
1360        EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event));
1361        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event));
1362        EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event));
1363      }
1364    }
1365
1366    _keydown(event) {
1367      if (/input|textarea/i.test(event.target.tagName)) {
1368        return;
1369      }
1370
1371      const direction = KEY_TO_DIRECTION[event.key];
1372
1373      if (direction) {
1374        event.preventDefault();
1375
1376        this._slide(direction);
1377      }
1378    }
1379
1380    _getItemIndex(element) {
1381      this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];
1382      return this._items.indexOf(element);
1383    }
1384
1385    _getItemByOrder(order, activeElement) {
1386      const isNext = order === ORDER_NEXT;
1387      return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);
1388    }
1389
1390    _triggerSlideEvent(relatedTarget, eventDirectionName) {
1391      const targetIndex = this._getItemIndex(relatedTarget);
1392
1393      const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));
1394
1395      return EventHandler.trigger(this._element, EVENT_SLIDE, {
1396        relatedTarget,
1397        direction: eventDirectionName,
1398        from: fromIndex,
1399        to: targetIndex
1400      });
1401    }
1402
1403    _setActiveIndicatorElement(element) {
1404      if (this._indicatorsElement) {
1405        const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);
1406        activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
1407        activeIndicator.removeAttribute('aria-current');
1408        const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);
1409
1410        for (let i = 0; i < indicators.length; i++) {
1411          if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {
1412            indicators[i].classList.add(CLASS_NAME_ACTIVE$2);
1413            indicators[i].setAttribute('aria-current', 'true');
1414            break;
1415          }
1416        }
1417      }
1418    }
1419
1420    _updateInterval() {
1421      const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1422
1423      if (!element) {
1424        return;
1425      }
1426
1427      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
1428
1429      if (elementInterval) {
1430        this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
1431        this._config.interval = elementInterval;
1432      } else {
1433        this._config.interval = this._config.defaultInterval || this._config.interval;
1434      }
1435    }
1436
1437    _slide(directionOrOrder, element) {
1438      const order = this._directionToOrder(directionOrOrder);
1439
1440      const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1441
1442      const activeElementIndex = this._getItemIndex(activeElement);
1443
1444      const nextElement = element || this._getItemByOrder(order, activeElement);
1445
1446      const nextElementIndex = this._getItemIndex(nextElement);
1447
1448      const isCycling = Boolean(this._interval);
1449      const isNext = order === ORDER_NEXT;
1450      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
1451      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
1452
1453      const eventDirectionName = this._orderToDirection(order);
1454
1455      if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {
1456        this._isSliding = false;
1457        return;
1458      }
1459
1460      if (this._isSliding) {
1461        return;
1462      }
1463
1464      const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
1465
1466      if (slideEvent.defaultPrevented) {
1467        return;
1468      }
1469
1470      if (!activeElement || !nextElement) {
1471        // Some weirdness is happening, so we bail
1472        return;
1473      }
1474
1475      this._isSliding = true;
1476
1477      if (isCycling) {
1478        this.pause();
1479      }
1480
1481      this._setActiveIndicatorElement(nextElement);
1482
1483      this._activeElement = nextElement;
1484
1485      const triggerSlidEvent = () => {
1486        EventHandler.trigger(this._element, EVENT_SLID, {
1487          relatedTarget: nextElement,
1488          direction: eventDirectionName,
1489          from: activeElementIndex,
1490          to: nextElementIndex
1491        });
1492      };
1493
1494      if (this._element.classList.contains(CLASS_NAME_SLIDE)) {
1495        nextElement.classList.add(orderClassName);
1496        reflow(nextElement);
1497        activeElement.classList.add(directionalClassName);
1498        nextElement.classList.add(directionalClassName);
1499
1500        const completeCallBack = () => {
1501          nextElement.classList.remove(directionalClassName, orderClassName);
1502          nextElement.classList.add(CLASS_NAME_ACTIVE$2);
1503          activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
1504          this._isSliding = false;
1505          setTimeout(triggerSlidEvent, 0);
1506        };
1507
1508        this._queueCallback(completeCallBack, activeElement, true);
1509      } else {
1510        activeElement.classList.remove(CLASS_NAME_ACTIVE$2);
1511        nextElement.classList.add(CLASS_NAME_ACTIVE$2);
1512        this._isSliding = false;
1513        triggerSlidEvent();
1514      }
1515
1516      if (isCycling) {
1517        this.cycle();
1518      }
1519    }
1520
1521    _directionToOrder(direction) {
1522      if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
1523        return direction;
1524      }
1525
1526      if (isRTL()) {
1527        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
1528      }
1529
1530      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
1531    }
1532
1533    _orderToDirection(order) {
1534      if (![ORDER_NEXT, ORDER_PREV].includes(order)) {
1535        return order;
1536      }
1537
1538      if (isRTL()) {
1539        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
1540      }
1541
1542      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
1543    } // Static
1544
1545
1546    static carouselInterface(element, config) {
1547      const data = Carousel.getOrCreateInstance(element, config);
1548      let {
1549        _config
1550      } = data;
1551
1552      if (typeof config === 'object') {
1553        _config = { ..._config,
1554          ...config
1555        };
1556      }
1557
1558      const action = typeof config === 'string' ? config : _config.slide;
1559
1560      if (typeof config === 'number') {
1561        data.to(config);
1562      } else if (typeof action === 'string') {
1563        if (typeof data[action] === 'undefined') {
1564          throw new TypeError(`No method named "${action}"`);
1565        }
1566
1567        data[action]();
1568      } else if (_config.interval && _config.ride) {
1569        data.pause();
1570        data.cycle();
1571      }
1572    }
1573
1574    static jQueryInterface(config) {
1575      return this.each(function () {
1576        Carousel.carouselInterface(this, config);
1577      });
1578    }
1579
1580    static dataApiClickHandler(event) {
1581      const target = getElementFromSelector(this);
1582
1583      if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
1584        return;
1585      }
1586
1587      const config = { ...Manipulator.getDataAttributes(target),
1588        ...Manipulator.getDataAttributes(this)
1589      };
1590      const slideIndex = this.getAttribute('data-bs-slide-to');
1591
1592      if (slideIndex) {
1593        config.interval = false;
1594      }
1595
1596      Carousel.carouselInterface(target, config);
1597
1598      if (slideIndex) {
1599        Carousel.getInstance(target).to(slideIndex);
1600      }
1601
1602      event.preventDefault();
1603    }
1604
1605  }
1606  /**
1607   * ------------------------------------------------------------------------
1608   * Data Api implementation
1609   * ------------------------------------------------------------------------
1610   */
1611
1612
1613  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);
1614  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
1615    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
1616
1617    for (let i = 0, len = carousels.length; i < len; i++) {
1618      Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]));
1619    }
1620  });
1621  /**
1622   * ------------------------------------------------------------------------
1623   * jQuery
1624   * ------------------------------------------------------------------------
1625   * add .Carousel to jQuery only if jQuery is present
1626   */
1627
1628  defineJQueryPlugin(Carousel);
1629
1630  /**
1631   * --------------------------------------------------------------------------
1632   * Bootstrap (v5.1.3): collapse.js
1633   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1634   * --------------------------------------------------------------------------
1635   */
1636  /**
1637   * ------------------------------------------------------------------------
1638   * Constants
1639   * ------------------------------------------------------------------------
1640   */
1641
1642  const NAME$a = 'collapse';
1643  const DATA_KEY$9 = 'bs.collapse';
1644  const EVENT_KEY$9 = `.${DATA_KEY$9}`;
1645  const DATA_API_KEY$5 = '.data-api';
1646  const Default$9 = {
1647    toggle: true,
1648    parent: null
1649  };
1650  const DefaultType$9 = {
1651    toggle: 'boolean',
1652    parent: '(null|element)'
1653  };
1654  const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;
1655  const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;
1656  const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;
1657  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;
1658  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;
1659  const CLASS_NAME_SHOW$7 = 'show';
1660  const CLASS_NAME_COLLAPSE = 'collapse';
1661  const CLASS_NAME_COLLAPSING = 'collapsing';
1662  const CLASS_NAME_COLLAPSED = 'collapsed';
1663  const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
1664  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
1665  const WIDTH = 'width';
1666  const HEIGHT = 'height';
1667  const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
1668  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
1669  /**
1670   * ------------------------------------------------------------------------
1671   * Class Definition
1672   * ------------------------------------------------------------------------
1673   */
1674
1675  class Collapse extends BaseComponent {
1676    constructor(element, config) {
1677      super(element);
1678      this._isTransitioning = false;
1679      this._config = this._getConfig(config);
1680      this._triggerArray = [];
1681      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
1682
1683      for (let i = 0, len = toggleList.length; i < len; i++) {
1684        const elem = toggleList[i];
1685        const selector = getSelectorFromElement(elem);
1686        const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element);
1687
1688        if (selector !== null && filterElement.length) {
1689          this._selector = selector;
1690
1691          this._triggerArray.push(elem);
1692        }
1693      }
1694
1695      this._initializeChildren();
1696
1697      if (!this._config.parent) {
1698        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
1699      }
1700
1701      if (this._config.toggle) {
1702        this.toggle();
1703      }
1704    } // Getters
1705
1706
1707    static get Default() {
1708      return Default$9;
1709    }
1710
1711    static get NAME() {
1712      return NAME$a;
1713    } // Public
1714
1715
1716    toggle() {
1717      if (this._isShown()) {
1718        this.hide();
1719      } else {
1720        this.show();
1721      }
1722    }
1723
1724    show() {
1725      if (this._isTransitioning || this._isShown()) {
1726        return;
1727      }
1728
1729      let actives = [];
1730      let activesData;
1731
1732      if (this._config.parent) {
1733        const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
1734        actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth
1735      }
1736
1737      const container = SelectorEngine.findOne(this._selector);
1738
1739      if (actives.length) {
1740        const tempActiveData = actives.find(elem => container !== elem);
1741        activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
1742
1743        if (activesData && activesData._isTransitioning) {
1744          return;
1745        }
1746      }
1747
1748      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);
1749
1750      if (startEvent.defaultPrevented) {
1751        return;
1752      }
1753
1754      actives.forEach(elemActive => {
1755        if (container !== elemActive) {
1756          Collapse.getOrCreateInstance(elemActive, {
1757            toggle: false
1758          }).hide();
1759        }
1760
1761        if (!activesData) {
1762          Data.set(elemActive, DATA_KEY$9, null);
1763        }
1764      });
1765
1766      const dimension = this._getDimension();
1767
1768      this._element.classList.remove(CLASS_NAME_COLLAPSE);
1769
1770      this._element.classList.add(CLASS_NAME_COLLAPSING);
1771
1772      this._element.style[dimension] = 0;
1773
1774      this._addAriaAndCollapsedClass(this._triggerArray, true);
1775
1776      this._isTransitioning = true;
1777
1778      const complete = () => {
1779        this._isTransitioning = false;
1780
1781        this._element.classList.remove(CLASS_NAME_COLLAPSING);
1782
1783        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1784
1785        this._element.style[dimension] = '';
1786        EventHandler.trigger(this._element, EVENT_SHOWN$5);
1787      };
1788
1789      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
1790      const scrollSize = `scroll${capitalizedDimension}`;
1791
1792      this._queueCallback(complete, this._element, true);
1793
1794      this._element.style[dimension] = `${this._element[scrollSize]}px`;
1795    }
1796
1797    hide() {
1798      if (this._isTransitioning || !this._isShown()) {
1799        return;
1800      }
1801
1802      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);
1803
1804      if (startEvent.defaultPrevented) {
1805        return;
1806      }
1807
1808      const dimension = this._getDimension();
1809
1810      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
1811      reflow(this._element);
1812
1813      this._element.classList.add(CLASS_NAME_COLLAPSING);
1814
1815      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1816
1817      const triggerArrayLength = this._triggerArray.length;
1818
1819      for (let i = 0; i < triggerArrayLength; i++) {
1820        const trigger = this._triggerArray[i];
1821        const elem = getElementFromSelector(trigger);
1822
1823        if (elem && !this._isShown(elem)) {
1824          this._addAriaAndCollapsedClass([trigger], false);
1825        }
1826      }
1827
1828      this._isTransitioning = true;
1829
1830      const complete = () => {
1831        this._isTransitioning = false;
1832
1833        this._element.classList.remove(CLASS_NAME_COLLAPSING);
1834
1835        this._element.classList.add(CLASS_NAME_COLLAPSE);
1836
1837        EventHandler.trigger(this._element, EVENT_HIDDEN$5);
1838      };
1839
1840      this._element.style[dimension] = '';
1841
1842      this._queueCallback(complete, this._element, true);
1843    }
1844
1845    _isShown(element = this._element) {
1846      return element.classList.contains(CLASS_NAME_SHOW$7);
1847    } // Private
1848
1849
1850    _getConfig(config) {
1851      config = { ...Default$9,
1852        ...Manipulator.getDataAttributes(this._element),
1853        ...config
1854      };
1855      config.toggle = Boolean(config.toggle); // Coerce string values
1856
1857      config.parent = getElement(config.parent);
1858      typeCheckConfig(NAME$a, config, DefaultType$9);
1859      return config;
1860    }
1861
1862    _getDimension() {
1863      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
1864    }
1865
1866    _initializeChildren() {
1867      if (!this._config.parent) {
1868        return;
1869      }
1870
1871      const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
1872      SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {
1873        const selected = getElementFromSelector(element);
1874
1875        if (selected) {
1876          this._addAriaAndCollapsedClass([element], this._isShown(selected));
1877        }
1878      });
1879    }
1880
1881    _addAriaAndCollapsedClass(triggerArray, isOpen) {
1882      if (!triggerArray.length) {
1883        return;
1884      }
1885
1886      triggerArray.forEach(elem => {
1887        if (isOpen) {
1888          elem.classList.remove(CLASS_NAME_COLLAPSED);
1889        } else {
1890          elem.classList.add(CLASS_NAME_COLLAPSED);
1891        }
1892
1893        elem.setAttribute('aria-expanded', isOpen);
1894      });
1895    } // Static
1896
1897
1898    static jQueryInterface(config) {
1899      return this.each(function () {
1900        const _config = {};
1901
1902        if (typeof config === 'string' && /show|hide/.test(config)) {
1903          _config.toggle = false;
1904        }
1905
1906        const data = Collapse.getOrCreateInstance(this, _config);
1907
1908        if (typeof config === 'string') {
1909          if (typeof data[config] === 'undefined') {
1910            throw new TypeError(`No method named "${config}"`);
1911          }
1912
1913          data[config]();
1914        }
1915      });
1916    }
1917
1918  }
1919  /**
1920   * ------------------------------------------------------------------------
1921   * Data Api implementation
1922   * ------------------------------------------------------------------------
1923   */
1924
1925
1926  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {
1927    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
1928    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
1929      event.preventDefault();
1930    }
1931
1932    const selector = getSelectorFromElement(this);
1933    const selectorElements = SelectorEngine.find(selector);
1934    selectorElements.forEach(element => {
1935      Collapse.getOrCreateInstance(element, {
1936        toggle: false
1937      }).toggle();
1938    });
1939  });
1940  /**
1941   * ------------------------------------------------------------------------
1942   * jQuery
1943   * ------------------------------------------------------------------------
1944   * add .Collapse to jQuery only if jQuery is present
1945   */
1946
1947  defineJQueryPlugin(Collapse);
1948
1949  /**
1950   * --------------------------------------------------------------------------
1951   * Bootstrap (v5.1.3): dropdown.js
1952   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1953   * --------------------------------------------------------------------------
1954   */
1955  /**
1956   * ------------------------------------------------------------------------
1957   * Constants
1958   * ------------------------------------------------------------------------
1959   */
1960
1961  const NAME$9 = 'dropdown';
1962  const DATA_KEY$8 = 'bs.dropdown';
1963  const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1964  const DATA_API_KEY$4 = '.data-api';
1965  const ESCAPE_KEY$2 = 'Escape';
1966  const SPACE_KEY = 'Space';
1967  const TAB_KEY$1 = 'Tab';
1968  const ARROW_UP_KEY = 'ArrowUp';
1969  const ARROW_DOWN_KEY = 'ArrowDown';
1970  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
1971
1972  const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);
1973  const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;
1974  const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;
1975  const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;
1976  const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;
1977  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;
1978  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;
1979  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;
1980  const CLASS_NAME_SHOW$6 = 'show';
1981  const CLASS_NAME_DROPUP = 'dropup';
1982  const CLASS_NAME_DROPEND = 'dropend';
1983  const CLASS_NAME_DROPSTART = 'dropstart';
1984  const CLASS_NAME_NAVBAR = 'navbar';
1985  const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]';
1986  const SELECTOR_MENU = '.dropdown-menu';
1987  const SELECTOR_NAVBAR_NAV = '.navbar-nav';
1988  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
1989  const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
1990  const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
1991  const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
1992  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
1993  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
1994  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
1995  const Default$8 = {
1996    offset: [0, 2],
1997    boundary: 'clippingParents',
1998    reference: 'toggle',
1999    display: 'dynamic',
2000    popperConfig: null,
2001    autoClose: true
2002  };
2003  const DefaultType$8 = {
2004    offset: '(array|string|function)',
2005    boundary: '(string|element)',
2006    reference: '(string|element|object)',
2007    display: 'string',
2008    popperConfig: '(null|object|function)',
2009    autoClose: '(boolean|string)'
2010  };
2011  /**
2012   * ------------------------------------------------------------------------
2013   * Class Definition
2014   * ------------------------------------------------------------------------
2015   */
2016
2017  class Dropdown extends BaseComponent {
2018    constructor(element, config) {
2019      super(element);
2020      this._popper = null;
2021      this._config = this._getConfig(config);
2022      this._menu = this._getMenuElement();
2023      this._inNavbar = this._detectNavbar();
2024    } // Getters
2025
2026
2027    static get Default() {
2028      return Default$8;
2029    }
2030
2031    static get DefaultType() {
2032      return DefaultType$8;
2033    }
2034
2035    static get NAME() {
2036      return NAME$9;
2037    } // Public
2038
2039
2040    toggle() {
2041      return this._isShown() ? this.hide() : this.show();
2042    }
2043
2044    show() {
2045      if (isDisabled(this._element) || this._isShown(this._menu)) {
2046        return;
2047      }
2048
2049      const relatedTarget = {
2050        relatedTarget: this._element
2051      };
2052      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);
2053
2054      if (showEvent.defaultPrevented) {
2055        return;
2056      }
2057
2058      const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar
2059
2060      if (this._inNavbar) {
2061        Manipulator.setDataAttribute(this._menu, 'popper', 'none');
2062      } else {
2063        this._createPopper(parent);
2064      } // If this is a touch-enabled device we add extra
2065      // empty mouseover listeners to the body's immediate children;
2066      // only needed because of broken event delegation on iOS
2067      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
2068
2069
2070      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
2071        [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop));
2072      }
2073
2074      this._element.focus();
2075
2076      this._element.setAttribute('aria-expanded', true);
2077
2078      this._menu.classList.add(CLASS_NAME_SHOW$6);
2079
2080      this._element.classList.add(CLASS_NAME_SHOW$6);
2081
2082      EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);
2083    }
2084
2085    hide() {
2086      if (isDisabled(this._element) || !this._isShown(this._menu)) {
2087        return;
2088      }
2089
2090      const relatedTarget = {
2091        relatedTarget: this._element
2092      };
2093
2094      this._completeHide(relatedTarget);
2095    }
2096
2097    dispose() {
2098      if (this._popper) {
2099        this._popper.destroy();
2100      }
2101
2102      super.dispose();
2103    }
2104
2105    update() {
2106      this._inNavbar = this._detectNavbar();
2107
2108      if (this._popper) {
2109        this._popper.update();
2110      }
2111    } // Private
2112
2113
2114    _completeHide(relatedTarget) {
2115      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);
2116
2117      if (hideEvent.defaultPrevented) {
2118        return;
2119      } // If this is a touch-enabled device we remove the extra
2120      // empty mouseover listeners we added for iOS support
2121
2122
2123      if ('ontouchstart' in document.documentElement) {
2124        [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop));
2125      }
2126
2127      if (this._popper) {
2128        this._popper.destroy();
2129      }
2130
2131      this._menu.classList.remove(CLASS_NAME_SHOW$6);
2132
2133      this._element.classList.remove(CLASS_NAME_SHOW$6);
2134
2135      this._element.setAttribute('aria-expanded', 'false');
2136
2137      Manipulator.removeDataAttribute(this._menu, 'popper');
2138      EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);
2139    }
2140
2141    _getConfig(config) {
2142      config = { ...this.constructor.Default,
2143        ...Manipulator.getDataAttributes(this._element),
2144        ...config
2145      };
2146      typeCheckConfig(NAME$9, config, this.constructor.DefaultType);
2147
2148      if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
2149        // Popper virtual elements require a getBoundingClientRect method
2150        throw new TypeError(`${NAME$9.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
2151      }
2152
2153      return config;
2154    }
2155
2156    _createPopper(parent) {
2157      if (typeof Popper__namespace === 'undefined') {
2158        throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
2159      }
2160
2161      let referenceElement = this._element;
2162
2163      if (this._config.reference === 'parent') {
2164        referenceElement = parent;
2165      } else if (isElement(this._config.reference)) {
2166        referenceElement = getElement(this._config.reference);
2167      } else if (typeof this._config.reference === 'object') {
2168        referenceElement = this._config.reference;
2169      }
2170
2171      const popperConfig = this._getPopperConfig();
2172
2173      const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
2174      this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
2175
2176      if (isDisplayStatic) {
2177        Manipulator.setDataAttribute(this._menu, 'popper', 'static');
2178      }
2179    }
2180
2181    _isShown(element = this._element) {
2182      return element.classList.contains(CLASS_NAME_SHOW$6);
2183    }
2184
2185    _getMenuElement() {
2186      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
2187    }
2188
2189    _getPlacement() {
2190      const parentDropdown = this._element.parentNode;
2191
2192      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
2193        return PLACEMENT_RIGHT;
2194      }
2195
2196      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
2197        return PLACEMENT_LEFT;
2198      } // We need to trim the value because custom properties can also include spaces
2199
2200
2201      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
2202
2203      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
2204        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
2205      }
2206
2207      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
2208    }
2209
2210    _detectNavbar() {
2211      return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
2212    }
2213
2214    _getOffset() {
2215      const {
2216        offset
2217      } = this._config;
2218
2219      if (typeof offset === 'string') {
2220        return offset.split(',').map(val => Number.parseInt(val, 10));
2221      }
2222
2223      if (typeof offset === 'function') {
2224        return popperData => offset(popperData, this._element);
2225      }
2226
2227      return offset;
2228    }
2229
2230    _getPopperConfig() {
2231      const defaultBsPopperConfig = {
2232        placement: this._getPlacement(),
2233        modifiers: [{
2234          name: 'preventOverflow',
2235          options: {
2236            boundary: this._config.boundary
2237          }
2238        }, {
2239          name: 'offset',
2240          options: {
2241            offset: this._getOffset()
2242          }
2243        }]
2244      }; // Disable Popper if we have a static display
2245
2246      if (this._config.display === 'static') {
2247        defaultBsPopperConfig.modifiers = [{
2248          name: 'applyStyles',
2249          enabled: false
2250        }];
2251      }
2252
2253      return { ...defaultBsPopperConfig,
2254        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
2255      };
2256    }
2257
2258    _selectMenuItem({
2259      key,
2260      target
2261    }) {
2262      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
2263
2264      if (!items.length) {
2265        return;
2266      } // if target isn't included in items (e.g. when expanding the dropdown)
2267      // allow cycling to get the last item in case key equals ARROW_UP_KEY
2268
2269
2270      getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
2271    } // Static
2272
2273
2274    static jQueryInterface(config) {
2275      return this.each(function () {
2276        const data = Dropdown.getOrCreateInstance(this, config);
2277
2278        if (typeof config !== 'string') {
2279          return;
2280        }
2281
2282        if (typeof data[config] === 'undefined') {
2283          throw new TypeError(`No method named "${config}"`);
2284        }
2285
2286        data[config]();
2287      });
2288    }
2289
2290    static clearMenus(event) {
2291      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {
2292        return;
2293      }
2294
2295      const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);
2296
2297      for (let i = 0, len = toggles.length; i < len; i++) {
2298        const context = Dropdown.getInstance(toggles[i]);
2299
2300        if (!context || context._config.autoClose === false) {
2301          continue;
2302        }
2303
2304        if (!context._isShown()) {
2305          continue;
2306        }
2307
2308        const relatedTarget = {
2309          relatedTarget: context._element
2310        };
2311
2312        if (event) {
2313          const composedPath = event.composedPath();
2314          const isMenuTarget = composedPath.includes(context._menu);
2315
2316          if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
2317            continue;
2318          } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
2319
2320
2321          if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
2322            continue;
2323          }
2324
2325          if (event.type === 'click') {
2326            relatedTarget.clickEvent = event;
2327          }
2328        }
2329
2330        context._completeHide(relatedTarget);
2331      }
2332    }
2333
2334    static getParentFromElement(element) {
2335      return getElementFromSelector(element) || element.parentNode;
2336    }
2337
2338    static dataApiKeydownHandler(event) {
2339      // If not input/textarea:
2340      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command
2341      // If input/textarea:
2342      //  - If space key => not a dropdown command
2343      //  - If key is other than escape
2344      //    - If key is not up or down => not a dropdown command
2345      //    - If trigger inside the menu => not a dropdown command
2346      if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {
2347        return;
2348      }
2349
2350      const isActive = this.classList.contains(CLASS_NAME_SHOW$6);
2351
2352      if (!isActive && event.key === ESCAPE_KEY$2) {
2353        return;
2354      }
2355
2356      event.preventDefault();
2357      event.stopPropagation();
2358
2359      if (isDisabled(this)) {
2360        return;
2361      }
2362
2363      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
2364      const instance = Dropdown.getOrCreateInstance(getToggleButton);
2365
2366      if (event.key === ESCAPE_KEY$2) {
2367        instance.hide();
2368        return;
2369      }
2370
2371      if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {
2372        if (!isActive) {
2373          instance.show();
2374        }
2375
2376        instance._selectMenuItem(event);
2377
2378        return;
2379      }
2380
2381      if (!isActive || event.key === SPACE_KEY) {
2382        Dropdown.clearMenus();
2383      }
2384    }
2385
2386  }
2387  /**
2388   * ------------------------------------------------------------------------
2389   * Data Api implementation
2390   * ------------------------------------------------------------------------
2391   */
2392
2393
2394  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
2395  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
2396  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
2397  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
2398  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
2399    event.preventDefault();
2400    Dropdown.getOrCreateInstance(this).toggle();
2401  });
2402  /**
2403   * ------------------------------------------------------------------------
2404   * jQuery
2405   * ------------------------------------------------------------------------
2406   * add .Dropdown to jQuery only if jQuery is present
2407   */
2408
2409  defineJQueryPlugin(Dropdown);
2410
2411  /**
2412   * --------------------------------------------------------------------------
2413   * Bootstrap (v5.1.3): util/scrollBar.js
2414   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2415   * --------------------------------------------------------------------------
2416   */
2417  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
2418  const SELECTOR_STICKY_CONTENT = '.sticky-top';
2419
2420  class ScrollBarHelper {
2421    constructor() {
2422      this._element = document.body;
2423    }
2424
2425    getWidth() {
2426      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
2427      const documentWidth = document.documentElement.clientWidth;
2428      return Math.abs(window.innerWidth - documentWidth);
2429    }
2430
2431    hide() {
2432      const width = this.getWidth();
2433
2434      this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
2435
2436
2437      this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width);
2437 // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
2438
2439
2440      this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
2441
2442      this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
2443    }
2444
2445    _disableOverFlow() {
2446      this._saveInitialAttribute(this._element, 'overflow');
2447
2448      this._element.style.overflow = 'hidden';
2449    }
2450
2451    _setElementAttributes(selector, styleProp, callback) {
2452      const scrollbarWidth = this.getWidth();
2453
2454      const manipulationCallBack = element => {
2455        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
2456          return;
2457        }
2458
2459        this._saveInitialAttribute(element, styleProp);
2460
2461        const calculatedValue = window.getComputedStyle(element)[styleProp];
2462        element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
2463      };
2464
2465      this._applyManipulationCallback(selector, manipulationCallBack);
2466    }
2467
2468    reset() {
2469      this._resetElementAttributes(this._element, 'overflow');
2470
2471      this._resetElementAttributes(this._element, 'paddingRight');
2472
2473      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
2474
2475      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
2476    }
2477
2478    _saveInitialAttribute(element, styleProp) {
2479      const actualValue = element.style[styleProp];
2480
2481      if (actualValue) {
2482        Manipulator.setDataAttribute(element, styleProp, actualValue);
2483      }
2484    }
2485
2486    _resetElementAttributes(selector, styleProp) {
2487      const manipulationCallBack = element => {
2488        const value = Manipulator.getDataAttribute(element, styleProp);
2489
2490        if (typeof value === 'undefined') {
2491          element.style.removeProperty(styleProp);
2492        } else {
2493          Manipulator.removeDataAttribute(element, styleProp);
2494          element.style[styleProp] = value;
2495        }
2496      };
2497
2498      this._applyManipulationCallback(selector, manipulationCallBack);
2499    }
2500
2501    _applyManipulationCallback(selector, callBack) {
2502      if (isElement(selector)) {
2503        callBack(selector);
2504      } else {
2505        SelectorEngine.find(selector, this._element).forEach(callBack);
2506      }
2507    }
2508
2509    isOverflowing() {
2510      return this.getWidth() > 0;
2511    }
2512
2513  }
2514
2515  /**
2516   * --------------------------------------------------------------------------
2517   * Bootstrap (v5.1.3): util/backdrop.js
2518   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2519   * --------------------------------------------------------------------------
2520   */
2521  const Default$7 = {
2522    className: 'modal-backdrop',
2523    isVisible: true,
2524    // if false, we use the backdrop helper without adding any element to the dom
2525    isAnimated: false,
2526    rootElement: 'body',
2527    // give the choice to place backdrop under different elements
2528    clickCallback: null
2529  };
2530  const DefaultType$7 = {
2531    className: 'string',
2532    isVisible: 'boolean',
2533    isAnimated: 'boolean',
2534    rootElement: '(element|string)',
2535    clickCallback: '(function|null)'
2536  };
2537  const NAME$8 = 'backdrop';
2538  const CLASS_NAME_FADE$4 = 'fade';
2539  const CLASS_NAME_SHOW$5 = 'show';
2540  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;
2541
2542  class Backdrop {
2543    constructor(config) {
2544      this._config = this._getConfig(config);
2545      this._isAppended = false;
2546      this._element = null;
2547    }
2548
2549    show(callback) {
2550      if (!this._config.isVisible) {
2551        execute(callback);
2552        return;
2553      }
2554
2555      this._append();
2556
2557      if (this._config.isAnimated) {
2558        reflow(this._getElement());
2559      }
2560
2561      this._getElement().classList.add(CLASS_NAME_SHOW$5);
2562
2563      this._emulateAnimation(() => {
2564        execute(callback);
2565      });
2566    }
2567
2568    hide(callback) {
2569      if (!this._config.isVisible) {
2570        execute(callback);
2571        return;
2572      }
2573
2574      this._getElement().classList.remove(CLASS_NAME_SHOW$5);
2575
2576      this._emulateAnimation(() => {
2577        this.dispose();
2578        execute(callback);
2579      });
2580    } // Private
2581
2582
2583    _getElement() {
2584      if (!this._element) {
2585        const backdrop = document.createElement('div');
2586        backdrop.className = this._config.className;
2587
2588        if (this._config.isAnimated) {
2589          backdrop.classList.add(CLASS_NAME_FADE$4);
2590        }
2591
2592        this._element = backdrop;
2593      }
2594
2595      return this._element;
2596    }
2597
2598    _getConfig(config) {
2599      config = { ...Default$7,
2600        ...(typeof config === 'object' ? config : {})
2601      }; // use getElement() with the default "body" to get a fresh Element on each instantiation
2602
2603      config.rootElement = getElement(config.rootElement);
2604      typeCheckConfig(NAME$8, config, DefaultType$7);
2605      return config;
2606    }
2607
2608    _append() {
2609      if (this._isAppended) {
2610        return;
2611      }
2612
2613      this._config.rootElement.append(this._getElement());
2614
2615      EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {
2616        execute(this._config.clickCallback);
2617      });
2618      this._isAppended = true;
2619    }
2620
2621    dispose() {
2622      if (!this._isAppended) {
2623        return;
2624      }
2625
2626      EventHandler.off(this._element, EVENT_MOUSEDOWN);
2627
2628      this._element.remove();
2629
2630      this._isAppended = false;
2631    }
2632
2633    _emulateAnimation(callback) {
2634      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
2635    }
2636
2637  }
2638
2639  /**
2640   * --------------------------------------------------------------------------
2641   * Bootstrap (v5.1.3): util/focustrap.js
2642   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2643   * --------------------------------------------------------------------------
2644   */
2645  const Default$6 = {
2646    trapElement: null,
2647    // The element to trap focus inside of
2648    autofocus: true
2649  };
2650  const DefaultType$6 = {
2651    trapElement: 'element',
2652    autofocus: 'boolean'
2653  };
2654  const NAME$7 = 'focustrap';
2655  const DATA_KEY$7 = 'bs.focustrap';
2656  const EVENT_KEY$7 = `.${DATA_KEY$7}`;
2657  const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;
2658  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;
2659  const TAB_KEY = 'Tab';
2660  const TAB_NAV_FORWARD = 'forward';
2661  const TAB_NAV_BACKWARD = 'backward';
2662
2663  class FocusTrap {
2664    constructor(config) {
2665      this._config = this._getConfig(config);
2666      this._isActive = false;
2667      this._lastTabNavDirection = null;
2668    }
2669
2670    activate() {
2671      const {
2672        trapElement,
2673        autofocus
2674      } = this._config;
2675
2676      if (this._isActive) {
2677        return;
2678      }
2679
2680      if (autofocus) {
2681        trapElement.focus();
2682      }
2683
2684      EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop
2685
2686      EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));
2687      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
2688      this._isActive = true;
2689    }
2690
2691    deactivate() {
2692      if (!this._isActive) {
2693        return;
2694      }
2695
2696      this._isActive = false;
2697      EventHandler.off(document, EVENT_KEY$7);
2698    } // Private
2699
2700
2701    _handleFocusin(event) {
2702      const {
2703        target
2704      } = event;
2705      const {
2706        trapElement
2707      } = this._config;
2708
2709      if (target === document || target === trapElement || trapElement.contains(target)) {
2710        return;
2711      }
2712
2713      const elements = SelectorEngine.focusableChildren(trapElement);
2714
2715      if (elements.length === 0) {
2716        trapElement.focus();
2717      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
2718        elements[elements.length - 1].focus();
2719      } else {
2720        elements[0].focus();
2721      }
2722    }
2723
2724    _handleKeydown(event) {
2725      if (event.key !== TAB_KEY) {
2726        return;
2727      }
2728
2729      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
2730    }
2731
2732    _getConfig(config) {
2733      config = { ...Default$6,
2734        ...(typeof config === 'object' ? config : {})
2735      };
2736      typeCheckConfig(NAME$7, config, DefaultType$6);
2737      return config;
2738    }
2739
2740  }
2741
2742  /**
2743   * --------------------------------------------------------------------------
2744   * Bootstrap (v5.1.3): modal.js
2745   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2746   * --------------------------------------------------------------------------
2747   */
2748  /**
2749   * ------------------------------------------------------------------------
2750   * Constants
2751   * ------------------------------------------------------------------------
2752   */
2753
2754  const NAME$6 = 'modal';
2755  const DATA_KEY$6 = 'bs.modal';
2756  const EVENT_KEY$6 = `.${DATA_KEY$6}`;
2757  const DATA_API_KEY$3 = '.data-api';
2758  const ESCAPE_KEY$1 = 'Escape';
2759  const Default$5 = {
2760    backdrop: true,
2761    keyboard: true,
2762    focus: true
2763  };
2764  const DefaultType$5 = {
2765    backdrop: '(boolean|string)',
2766    keyboard: 'boolean',
2767    focus: 'boolean'
2768  };
2769  const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;
2770  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;
2771  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;
2772  const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;
2773  const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;
2774  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;
2775  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;
2776  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;
2777  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;
2778  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;
2779  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
2780  const CLASS_NAME_OPEN = 'modal-open';
2781  const CLASS_NAME_FADE$3 = 'fade';
2782  const CLASS_NAME_SHOW$4 = 'show';
2783  const CLASS_NAME_STATIC = 'modal-static';
2784  const OPEN_SELECTOR$1 = '.modal.show';
2785  const SELECTOR_DIALOG = '.modal-dialog';
2786  const SELECTOR_MODAL_BODY = '.modal-body';
2787  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
2788  /**
2789   * ------------------------------------------------------------------------
2790   * Class Definition
2791   * ------------------------------------------------------------------------
2792   */
2793
2794  class Modal extends BaseComponent {
2795    constructor(element, config) {
2796      super(element);
2797      this._config = this._getConfig(config);
2798      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
2799      this._backdrop = this._initializeBackDrop();
2800      this._focustrap = this._initializeFocusTrap();
2801      this._isShown = false;
2802      this._ignoreBackdropClick = false;
2803      this._isTransitioning = false;
2804      this._scrollBar = new ScrollBarHelper();
2805    } // Getters
2806
2807
2808    static get Default() {
2809      return Default$5;
2810    }
2811
2812    static get NAME() {
2813      return NAME$6;
2814    } // Public
2815
2816
2817    toggle(relatedTarget) {
2818      return this._isShown ? this.hide() : this.show(relatedTarget);
2819    }
2820
2821    show(relatedTarget) {
2822      if (this._isShown || this._isTransitioning) {
2823        return;
2824      }
2825
2826      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
2827        relatedTarget
2828      });
2829
2830      if (showEvent.defaultPrevented) {
2831        return;
2832      }
2833
2834      this._isShown = true;
2835
2836      if (this._isAnimated()) {
2837        this._isTransitioning = true;
2838      }
2839
2840      this._scrollBar.hide();
2841
2842      document.body.classList.add(CLASS_NAME_OPEN);
2843
2844      this._adjustDialog();
2845
2846      this._setEscapeEvent();
2847
2848      this._setResizeEvent();
2849
2850      EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
2851        EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
2852          if (event.target === this._element) {
2853            this._ignoreBackdropClick = true;
2854          }
2855        });
2856      });
2857
2858      this._showBackdrop(() => this._showElement(relatedTarget));
2859    }
2860
2861    hide() {
2862      if (!this._isShown || this._isTransitioning) {
2863        return;
2864      }
2865
2866      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
2867
2868      if (hideEvent.defaultPrevented) {
2869        return;
2870      }
2871
2872      this._isShown = false;
2873
2874      const isAnimated = this._isAnimated();
2875
2876      if (isAnimated) {
2877        this._isTransitioning = true;
2878      }
2879
2880      this._setEscapeEvent();
2881
2882      this._setResizeEvent();
2883
2884      this._focustrap.deactivate();
2885
2886      this._element.classList.remove(CLASS_NAME_SHOW$4);
2887
2888      EventHandler.off(this._element, EVENT_CLICK_DISMISS);
2889      EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
2890
2891      this._queueCallback(() => this._hideModal(), this._element, isAnimated);
2892    }
2893
2894    dispose() {
2895      [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));
2896
2897      this._backdrop.dispose();
2898
2899      this._focustrap.deactivate();
2900
2901      super.dispose();
2902    }
2903
2904    handleUpdate() {
2905      this._adjustDialog();
2906    } // Private
2907
2908
2909    _initializeBackDrop() {
2910      return new Backdrop({
2911        isVisible: Boolean(this._config.backdrop),
2912        // 'static' option will be translated to true, and booleans will keep their value
2913        isAnimated: this._isAnimated()
2914      });
2915    }
2916
2917    _initializeFocusTrap() {
2918      return new FocusTrap({
2919        trapElement: this._element
2920      });
2921    }
2922
2923    _getConfig(config) {
2924      config = { ...Default$5,
2925        ...Manipulator.getDataAttributes(this._element),
2926        ...(typeof config === 'object' ? config : {})
2927      };
2928      typeCheckConfig(NAME$6, config, DefaultType$5);
2929      return config;
2930    }
2931
2932    _showElement(relatedTarget) {
2933      const isAnimated = this._isAnimated();
2934
2935      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
2936
2937      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
2938        // Don't move modal's DOM position
2939        document.body.append(this._element);
2940      }
2941
2942      this._element.style.display = 'block';
2943
2944      this._element.removeAttribute('aria-hidden');
2945
2946      this._element.setAttribute('aria-modal', true);
2947
2948      this._element.setAttribute('role', 'dialog');
2949
2950      this._element.scrollTop = 0;
2951
2952      if (modalBody) {
2953        modalBody.scrollTop = 0;
2954      }
2955
2956      if (isAnimated) {
2957        reflow(this._element);
2958      }
2959
2960      this._element.classList.add(CLASS_NAME_SHOW$4);
2961
2962      const transitionComplete = () => {
2963        if (this._config.focus) {
2964          this._focustrap.activate();
2965        }
2966
2967        this._isTransitioning = false;
2968        EventHandler.trigger(this._element, EVENT_SHOWN$3, {
2969          relatedTarget
2970        });
2971      };
2972
2973      this._queueCallback(transitionComplete, this._dialog, isAnimated);
2974    }
2975
2976    _setEscapeEvent() {
2977      if (this._isShown) {
2978        EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
2979          if (this._config.keyboard && event.key === ESCAPE_KEY$1) {
2980            event.preventDefault();
2981            this.hide();
2982          } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {
2983            this._triggerBackdropTransition();
2984          }
2985        });
2986      } else {
2987        EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);
2988      }
2989    }
2990
2991    _setResizeEvent() {
2992      if (this._isShown) {
2993        EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());
2994      } else {
2995        EventHandler.off(window, EVENT_RESIZE);
2996      }
2997    }
2998
2999    _hideModal() {
3000      this._element.style.display = 'none';
3001
3002      this._element.setAttribute('aria-hidden', true);
3003
3004      this._element.removeAttribute('aria-modal');
3005
3006      this._element.removeAttribute('role');
3007
3008      this._isTransitioning = false;
3009
3010      this._backdrop.hide(() => {
3011        document.body.classList.remove(CLASS_NAME_OPEN);
3012
3013        this._resetAdjustments();
3014
3015        this._scrollBar.reset();
3016
3017        EventHandler.trigger(this._element, EVENT_HIDDEN$3);
3018      });
3019    }
3020
3021    _showBackdrop(callback) {
3022      EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {
3023        if (this._ignoreBackdropClick) {
3024          this._ignoreBackdropClick = false;
3025          return;
3026        }
3027
3028        if (event.target !== event.currentTarget) {
3029          return;
3030        }
3031
3032        if (this._config.backdrop === true) {
3033          this.hide();
3034        } else if (this._config.backdrop === 'static') {
3035          this._triggerBackdropTransition();
3036        }
3037      });
3038
3039      this._backdrop.show(callback);
3040    }
3041
3042    _isAnimated() {
3043      return this._element.classList.contains(CLASS_NAME_FADE$3);
3044    }
3045
3046    _triggerBackdropTransition() {
3047      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
3048
3049      if (hideEvent.defaultPrevented) {
3050        return;
3051      }
3052
3053      const {
3054        classList,
3055        scrollHeight,
3056        style
3057      } = this._element;
3058      const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
3059
3060      if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
3061        return;
3062      }
3063
3064      if (!isModalOverflowing) {
3065        style.overflowY = 'hidden';
3066      }
3067
3068      classList.add(CLASS_NAME_STATIC);
3069
3070      this._queueCallback(() => {
3071        classList.remove(CLASS_NAME_STATIC);
3072
3073        if (!isModalOverflowing) {
3074          this._queueCallback(() => {
3075            style.overflowY = '';
3076          }, this._dialog);
3077        }
3078      }, this._dialog);
3079
3080      this._element.focus();
3081    } // ----------------------------------------------------------------------
3082    // the following methods are used to handle overflowing modals
3083    // ----------------------------------------------------------------------
3084
3085
3086    _adjustDialog() {
3087      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
3088
3089      const scrollbarWidth = this._scrollBar.getWidth();
3090
3091      const isBodyOverflowing = scrollbarWidth > 0;
3092
3093      if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
3094        this._element.style.paddingLeft = `${scrollbarWidth}px`;
3095      }
3096
3097      if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
3098        this._element.style.paddingRight = `${scrollbarWidth}px`;
3099      }
3100    }
3101
3102    _resetAdjustments() {
3103      this._element.style.paddingLeft = '';
3104      this._element.style.paddingRight = '';
3105    } // Static
3106
3107
3108    static jQueryInterface(config, relatedTarget) {
3109      return this.each(function () {
3110        const data = Modal.getOrCreateInstance(this, config);
3111
3112        if (typeof config !== 'string') {
3113          return;
3114        }
3115
3116        if (typeof data[config] === 'undefined') {
vendor: 4,925 bytes, lines 3117-3298
3117          throw new TypeError(`No method named "${config}"`);
3118        }
3119
3120        data[config](relatedTarget);
3121      });
3122    }
3123
3124  }
3125  /**
3126   * ------------------------------------------------------------------------
3127   * Data Api implementation
3128   * ------------------------------------------------------------------------
3129   */
3130
3131
3132  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
3133    const target = getElementFromSelector(this);
3134
3135    if (['A', 'AREA'].includes(this.tagName)) {
3136      event.preventDefault();
3137    }
3138
3139    EventHandler.one(target, EVENT_SHOW$3, showEvent => {
3140      if (showEvent.defaultPrevented) {
3141        // only register focus restorer if modal will actually get shown
3142        return;
3143      }
3144
3145      EventHandler.one(target, EVENT_HIDDEN$3, () => {
3146        if (isVisible(this)) {
3147          this.focus();
3148        }
3149      });
3150    }); // avoid conflict when clicking moddal toggler while another one is open
3151
3152    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
3153
3154    if (allReadyOpen) {
3155      Modal.getInstance(allReadyOpen).hide();
3156    }
3157
3158    const data = Modal.getOrCreateInstance(target);
3159    data.toggle(this);
3160  });
3161  enableDismissTrigger(Modal);
3162  /**
3163   * ------------------------------------------------------------------------
3164   * jQuery
3165   * ------------------------------------------------------------------------
3166   * add .Modal to jQuery only if jQuery is present
3167   */
3168
3169  defineJQueryPlugin(Modal);
3170
3171  /**
3172   * --------------------------------------------------------------------------
3173   * Bootstrap (v5.1.3): offcanvas.js
3174   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3175   * --------------------------------------------------------------------------
3176   */
3177  /**
3178   * ------------------------------------------------------------------------
3179   * Constants
3180   * ------------------------------------------------------------------------
3181   */
3182
3183  const NAME$5 = 'offcanvas';
3184  const DATA_KEY$5 = 'bs.offcanvas';
3185  const EVENT_KEY$5 = `.${DATA_KEY$5}`;
3186  const DATA_API_KEY$2 = '.data-api';
3187  const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;
3188  const ESCAPE_KEY = 'Escape';
3189  const Default$4 = {
3190    backdrop: true,
3191    keyboard: true,
3192    scroll: false
3193  };
3194  const DefaultType$4 = {
3195    backdrop: 'boolean',
3196    keyboard: 'boolean',
3197    scroll: 'boolean'
3198  };
3199  const CLASS_NAME_SHOW$3 = 'show';
3200  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
3201  const OPEN_SELECTOR = '.offcanvas.show';
3202  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;
3203  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;
3204  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;
3205  const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;
3206  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;
3207  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;
3208  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
3209  /**
3210   * ------------------------------------------------------------------------
3211   * Class Definition
3212   * ------------------------------------------------------------------------
3213   */
3214
3215  class Offcanvas extends BaseComponent {
3216    constructor(element, config) {
3217      super(element);
3218      this._config = this._getConfig(config);
3219      this._isShown = false;
3220      this._backdrop = this._initializeBackDrop();
3221      this._focustrap = this._initializeFocusTrap();
3222
3223      this._addEventListeners();
3224    } // Getters
3225
3226
3227    static get NAME() {
3228      return NAME$5;
3229    }
3230
3231    static get Default() {
3232      return Default$4;
3233    } // Public
3234
3235
3236    toggle(relatedTarget) {
3237      return this._isShown ? this.hide() : this.show(relatedTarget);
3238    }
3239
3240    show(relatedTarget) {
3241      if (this._isShown) {
3242        return;
3243      }
3244
3245      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {
3246        relatedTarget
3247      });
3248
3249      if (showEvent.defaultPrevented) {
3250        return;
3251      }
3252
3253      this._isShown = true;
3254      this._element.style.visibility = 'visible';
3255
3256      this._backdrop.show();
3257
3258      if (!this._config.scroll) {
3259        new ScrollBarHelper().hide();
3260      }
3261
3262      this._element.removeAttribute('aria-hidden');
3263
3264      this._element.setAttribute('aria-modal', true);
3265
3266      this._element.setAttribute('role', 'dialog');
3267
3268      this._element.classList.add(CLASS_NAME_SHOW$3);
3269
3270      const completeCallBack = () => {
3271        if (!this._config.scroll) {
3272          this._focustrap.activate();
3273        }
3274
3275        EventHandler.trigger(this._element, EVENT_SHOWN$2, {
3276          relatedTarget
3277        });
3278      };
3279
3280      this._queueCallback(completeCallBack, this._element, true);
3281    }
3282
3283    hide() {
3284      if (!this._isShown) {
3285        return;
3286      }
3287
3288      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);
3289
3290      if (hideEvent.defaultPrevented) {
3291        return;
3292      }
3293
3294      this._focustrap.deactivate();
3295
3296      this._element.blur();
3297
3298      this._isShown = false;
3299
3300      this._element.classList.remove(CLASS_NAME_SHOW$3);
3301
3302      this._backdrop.hide();
3303
3304      const completeCallback = () => {
3305        this._element.setAttribute('aria-hidden', true);
3306
3307        this._element.removeAttribute('aria-modal');
3308
3309        this._element.removeAttribute('role');
3310
3311        this._element.style.visibility = 'hidden';
3312
3313        if (!this._config.scroll) {
3314          new ScrollBarHelper().reset();
3315        }
3316
3317        EventHandler.trigger(this._element, EVENT_HIDDEN$2);
3318      };
3319
3320      this._queueCallback(completeCallback, this._element, true);
3321    }
3322
3323    dispose() {
3324      this._backdrop.dispose();
3325
3326      this._focustrap.deactivate();
3327
3328      super.dispose();
3329    } // Private
3330
3331
3332    _getConfig(config) {
3333      config = { ...Default$4,
3334        ...Manipulator.getDataAttributes(this._element),
3335        ...(typeof config === 'object' ? config : {})
3336      };
3337      typeCheckConfig(NAME$5, config, DefaultType$4);
3338      return config;
3339    }
3340
3341    _initializeBackDrop() {
3342      return new Backdrop({
3343        className: CLASS_NAME_BACKDROP,
3344        isVisible: this._config.backdrop,
3345        isAnimated: true,
3346        rootElement: this._element.parentNode,
3347        clickCallback: () => this.hide()
3348      });
3349    }
3350
3351    _initializeFocusTrap() {
3352      return new FocusTrap({
3353        trapElement: this._element
3354      });
3355    }
3356
3357    _addEventListeners() {
3358      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
3359        if (this._config.keyboard && event.key === ESCAPE_KEY) {
3360          this.hide();
3361        }
3362      });
3363    } // Static
3364
3365
3366    static jQueryInterface(config) {
3367      return this.each(function () {
3368        const data = Offcanvas.getOrCreateInstance(this, config);
3369
3370        if (typeof config !== 'string') {
3371          return;
3372        }
3373
3374        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
3375          throw new TypeError(`No method named "${config}"`);
3376        }
3377
3378        data[config](this);
3379      });
3380    }
3381
3382  }
3383  /**
3384   * ------------------------------------------------------------------------
3385   * Data Api implementation
3386   * ------------------------------------------------------------------------
3387   */
3388
3389
3390  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
3391    const target = getElementFromSelector(this);
3392
3393    if (['A', 'AREA'].includes(this.tagName)) {
3394      event.preventDefault();
3395    }
3396
3397    if (isDisabled(this)) {
3398      return;
3399    }
3400
3401    EventHandler.one(target, EVENT_HIDDEN$2, () => {
3402      // focus on trigger when it is closed
3403      if (isVisible(this)) {
3404        this.focus();
3405      }
3406    }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
3407
3408    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
3409
3410    if (allReadyOpen && allReadyOpen !== target) {
3411      Offcanvas.getInstance(allReadyOpen).hide();
3412    }
3413
3414    const data = Offcanvas.getOrCreateInstance(target);
3415    data.toggle(this);
3416  });
3417  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
3418  enableDismissTrigger(Offcanvas);
3419  /**
3420   * ------------------------------------------------------------------------
3421   * jQuery
3422   * ------------------------------------------------------------------------
3423   */
3424
3425  defineJQueryPlugin(Offcanvas);
3426
3427  /**
3428   * --------------------------------------------------------------------------
3429   * Bootstrap (v5.1.3): util/sanitizer.js
3430   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3431   * --------------------------------------------------------------------------
3432   */
3433  const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
3434  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
3435  /**
3436   * A pattern that recognizes a commonly useful subset of URLs that are safe.
3437   *
3438   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
3439   */
3440
3441  const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
3442  /**
3443   * A pattern that matches safe data URLs. Only matches image, video and audio types.
3444   *
3445   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
3446   */
3447
3448  const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
3449
3450  const allowedAttribute = (attribute, allowedAttributeList) => {
3451    const attributeName = attribute.nodeName.toLowerCase();
3452
3453    if (allowedAttributeList.includes(attributeName)) {
3454      if (uriAttributes.has(attributeName)) {
3455        return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
3456      }
3457
3458      return true;
3459    }
3460
3461    const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp); // Check if a regular expression validates the attribute.
3462
3463    for (let i = 0, len = regExp.length; i < len; i++) {
3464      if (regExp[i].test(attributeName)) {
3465        return true;
3466      }
3467    }
3468
3469    return false;
3470  };
3471
3472  const DefaultAllowlist = {
3473    // Global attributes allowed on any supplied element below.
3474    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
3475    a: ['target', 'href', 'title', 'rel'],
3476    area: [],
3477    b: [],
3478    br: [],
3479    col: [],
3480    code: [],
3481    div: [],
3482    em: [],
3483    hr: [],
3484    h1: [],
3485    h2: [],
3486    h3: [],
3487    h4: [],
3488    h5: [],
3489    h6: [],
3490    i: [],
3491    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
3492    li: [],
3493    ol: [],
3494    p: [],
3495    pre: [],
3496    s: [],
3497    small: [],
3498    span: [],
3499    sub: [],
3500    sup: [],
3501    strong: [],
3502    u: [],
3503    ul: []
3504  };
3505  function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
3506    if (!unsafeHtml.length) {
3507      return unsafeHtml;
3508    }
3509
3510    if (sanitizeFn && typeof sanitizeFn === 'function') {
3511      return sanitizeFn(unsafeHtml);
3512    }
3513
3514    const domParser = new window.DOMParser();
3515    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
3516    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
3517
3518    for (let i = 0, len = elements.length; i < len; i++) {
3519      const element = elements[i];
3520      const elementName = element.nodeName.toLowerCase();
3521
3522      if (!Object.keys(allowList).includes(elementName)) {
3523        element.remove();
3524        continue;
3525      }
3526
3527      const attributeList = [].concat(...element.attributes);
3528      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
3529      attributeList.forEach(attribute => {
3530        if (!allowedAttribute(attribute, allowedAttributes)) {
3531          element.removeAttribute(attribute.nodeName);
3532        }
3533      });
3534    }
3535
3536    return createdDocument.body.innerHTML;
3537  }
3538
3539  /**
3540   * --------------------------------------------------------------------------
3541   * Bootstrap (v5.1.3): tooltip.js
3542   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3543   * --------------------------------------------------------------------------
3544   */
3545  /**
3546   * ------------------------------------------------------------------------
3547   * Constants
3548   * ------------------------------------------------------------------------
3549   */
3550
3551  const NAME$4 = 'tooltip';
3552  const DATA_KEY$4 = 'bs.tooltip';
3553  const EVENT_KEY$4 = `.${DATA_KEY$4}`;
3554  const CLASS_PREFIX$1 = 'bs-tooltip';
3555  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
3556  const DefaultType$3 = {
3557    animation: 'boolean',
3558    template: 'string',
3559    title: '(string|element|function)',
3560    trigger: 'string',
3561    delay: '(number|object)',
3562    html: 'boolean',
3563    selector: '(string|boolean)',
3564    placement: '(string|function)',
3565    offset: '(array|string|function)',
3566    container: '(string|element|boolean)',
3567    fallbackPlacements: 'array',
3568    boundary: '(string|element)',
3569    customClass: '(string|function)',
3570    sanitize: 'boolean',
3571    sanitizeFn: '(null|function)',
3572    allowList: 'object',
3573    popperConfig: '(null|object|function)'
3574  };
3575  const AttachmentMap = {
3576    AUTO: 'auto',
3577    TOP: 'top',
3578    RIGHT: isRTL() ? 'left' : 'right',
3579    BOTTOM: 'bottom',
3580    LEFT: isRTL() ? 'right' : 'left'
3581  };
3582  const Default$3 = {
3583    animation: true,
3584    template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
3585    trigger: 'hover focus',
3586    title: '',
3587    delay: 0,
3588    html: false,
3589    selector: false,
3590    placement: 'top',
3591    offset: [0, 0],
3592    container: false,
3593    fallbackPlacements: ['top', 'right', 'bottom', 'left'],
3594    boundary: 'clippingParents',
3595    customClass: '',
3596    sanitize: true,
3597    sanitizeFn: null,
3598    allowList: DefaultAllowlist,
3599    popperConfig: null
3600  };
3601  const Event$2 = {
3602    HIDE: `hide${EVENT_KEY$4}`,
3603    HIDDEN: `hidden${EVENT_KEY$4}`,
3604    SHOW: `show${EVENT_KEY$4}`,
3605    SHOWN: `shown${EVENT_KEY$4}`,
3606    INSERTED: `inserted${EVENT_KEY$4}`,
3607    CLICK: `click${EVENT_KEY$4}`,
3608    FOCUSIN: `focusin${EVENT_KEY$4}`,
3609    FOCUSOUT: `focusout${EVENT_KEY$4}`,
3610    MOUSEENTER: `mouseenter${EVENT_KEY$4}`,
3611    MOUSELEAVE: `mouseleave${EVENT_KEY$4}`
3612  };
3613  const CLASS_NAME_FADE$2 = 'fade';
3614  const CLASS_NAME_MODAL = 'modal';
3615  const CLASS_NAME_SHOW$2 = 'show';
3616  const HOVER_STATE_SHOW = 'show';
3617  const HOVER_STATE_OUT = 'out';
3618  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
3619  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
3620  const EVENT_MODAL_HIDE = 'hide.bs.modal';
3621  const TRIGGER_HOVER = 'hover';
3622  const TRIGGER_FOCUS = 'focus';
3623  const TRIGGER_CLICK = 'click';
3624  const TRIGGER_MANUAL = 'manual';
3625  /**
3626   * ------------------------------------------------------------------------
3627   * Class Definition
3628   * ------------------------------------------------------------------------
3629   */
3630
3631  class Tooltip extends BaseComponent {
3632    constructor(element, config) {
3633      if (typeof Popper__namespace === 'undefined') {
3634        throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
3635      }
3636
3637      super(element); // private
3638
3639      this._isEnabled = true;
3640      this._timeout = 0;
3641      this._hoverState = '';
3642      this._activeTrigger = {};
3643      this._popper = null; // Protected
3644
3645      this._config = this._getConfig(config);
3646      this.tip = null;
3647
3648      this._setListeners();
3649    } // Getters
3650
3651
3652    static get Default() {
3653      return Default$3;
3654    }
3655
3656    static get NAME() {
3657      return NAME$4;
3658    }
3659
3660    static get Event() {
3661      return Event$2;
3662    }
3663
3664    static get DefaultType() {
3665      return DefaultType$3;
3666    } // Public
3667
3668
3669    enable() {
3670      this._isEnabled = true;
3671    }
3672
3673    disable() {
3674      this._isEnabled = false;
3675    }
3676
3677    toggleEnabled() {
3678      this._isEnabled = !this._isEnabled;
3679    }
3680
3681    toggle(event) {
3682      if (!this._isEnabled) {
3683        return;
3684      }
3685
3686      if (event) {
3687        const context = this._initializeOnDelegatedTarget(event);
3688
3689        context._activeTrigger.click = !context._activeTrigger.click;
3690
3691        if (context._isWithActiveTrigger()) {
3692          context._enter(null, context);
3693        } else {
3694          context._leave(null, context);
3695        }
3696      } else {
3697        if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {
3698          this._leave(null, this);
3699
3700          return;
3701        }
3702
3703        this._enter(null, this);
3704      }
3705    }
3706
3707    dispose() {
3708      clearTimeout(this._timeout);
3709      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
3710
3711      if (this.tip) {
3712        this.tip.remove();
3713      }
3714
3715      this._disposePopper();
3716
3717      super.dispose();
3718    }
3719
3720    show() {
3721      if (this._element.style.display === 'none') {
3722        throw new Error('Please use show on visible elements');
3723      }
3724
3725      if (!(this.isWithContent() && this._isEnabled)) {
3726        return;
3727      }
3728
3729      const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);
3730      const shadowRoot = findShadowRoot(this._element);
3731      const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);
3732
3733      if (showEvent.defaultPrevented || !isInTheDom) {
3734        return;
3735      } // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`
3736      // This will be removed later in favor of a `setContent` method
3737
3738
3739      if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {
3740        this._disposePopper();
3741
3742        this.tip.remove();
3743        this.tip = null;
3744      }
3745
3746      const tip = this.getTipElement();
3747      const tipId = getUID(this.constructor.NAME);
3748      tip.setAttribute('id', tipId);
3749
3750      this._element.setAttribute('aria-describedby', tipId);
3751
3752      if (this._config.animation) {
3753        tip.classList.add(CLASS_NAME_FADE$2);
3754      }
3755
3756      const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
3757
3758      const attachment = this._getAttachment(placement);
3759
3760      this._addAttachmentClass(attachment);
3761
3762      const {
3763        container
3764      } = this._config;
3765      Data.set(tip, this.constructor.DATA_KEY, this);
3766
3767      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
3768        container.append(tip);
3769        EventHandler.trigger(this._element, this.constructor.Event.INSERTED);
3770      }
3771
3772      if (this._popper) {
3773        this._popper.update();
3774      } else {
3775        this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
3776      }
3777
3778      tip.classList.add(CLASS_NAME_SHOW$2);
3779
3780      const customClass = this._resolvePossibleFunction(this._config.customClass);
3781
3782      if (customClass) {
3783        tip.classList.add(...customClass.split(' '));
3784      } // If this is a touch-enabled device we add extra
3785      // empty mouseover listeners to the body's immediate children;
3786      // only needed because of broken event delegation on iOS
3787      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
3788
3789
3790      if ('ontouchstart' in document.documentElement) {
3791        [].concat(...document.body.children).forEach(element => {
3792          EventHandler.on(element, 'mouseover', noop);
3793        });
3794      }
3795
3796      const complete = () => {
3797        const prevHoverState = this._hoverState;
3798        this._hoverState = null;
3799        EventHandler.trigger(this._element, this.constructor.Event.SHOWN);
3800
3801        if (prevHoverState === HOVER_STATE_OUT) {
3802          this._leave(null, this);
3803        }
3804      };
3805
3806      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
3807
3808      this._queueCallback(complete, this.tip, isAnimated);
3809    }
3810
3811    hide() {
3812      if (!this._popper) {
3813        return;
3814      }
3815
3816      const tip = this.getTipElement();
3817
3818      const complete = () => {
3819        if (this._isWithActiveTrigger()) {
3820          return;
3821        }
3822
3823        if (this._hoverState !== HOVER_STATE_SHOW) {
3824          tip.remove();
3825        }
3826
3827        this._cleanTipClass();
3828
3829        this._element.removeAttribute('aria-describedby');
3830
3831        EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);
3832
3833        this._disposePopper();
3834      };
3835
3836      const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);
3837
3838      if (hideEvent.defaultPrevented) {
3839        return;
3840      }
3841
3842      tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra
3843      // empty mouseover listeners we added for iOS support
3844
3845      if ('ontouchstart' in document.documentElement) {
3846        [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop));
3847      }
3848
3849      this._activeTrigger[TRIGGER_CLICK] = false;
3850      this._activeTrigger[TRIGGER_FOCUS] = false;
3851      this._activeTrigger[TRIGGER_HOVER] = false;
3852      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
3853
3854      this._queueCallback(complete, this.tip, isAnimated);
3855
3856      this._hoverState = '';
3857    }
3858
3859    update() {
3860      if (this._popper !== null) {
3861        this._popper.update();
3862      }
3863    } // Protected
3864
3865
3866    isWithContent() {
3867      return Boolean(this.getTitle());
3868    }
3869
3870    getTipElement() {
3871      if (this.tip) {
3872        return this.tip;
3873      }
3874
3875      const element = document.createElement('div');
3876      element.innerHTML = this._config.template;
3877      const tip = element.children[0];
3878      this.setContent(tip);
3879      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
3880      this.tip = tip;
3881      return this.tip;
3882    }
3883
3884    setContent(tip) {
3885      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);
3886    }
3887
3888    _sanitizeAndSetContent(template, content, selector) {
3889      const templateElement = SelectorEngine.findOne(selector, template);
3890
3891      if (!content && templateElement) {
3892        templateElement.remove();
3893        return;
3894      } // we use append for html objects to maintain js events
3895
3896
3897      this.setElementContent(templateElement, content);
3898    }
3899
3900    setElementContent(element, content) {
3901      if (element === null) {
3902        return;
3903      }
3904
3905      if (isElement(content)) {
3906        content = getElement(content); // content is a DOM node or a jQuery
3907
3908        if (this._config.html) {
3909          if (content.parentNode !== element) {
3910            element.innerHTML = '';
3911            element.append(content);
3912          }
3913        } else {
3914          element.textContent = content.textContent;
3915        }
3916
3917        return;
3918      }
3919
3920      if (this._config.html) {
3921        if (this._config.sanitize) {
3922          content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);
3923        }
3924
3925        element.innerHTML = content;
3926      } else {
3927        element.textContent = content;
3928      }
3929    }
3930
3931    getTitle() {
3932      const title = this._element.getAttribute('data-bs-original-title') || this._config.title;
3933
3934      return this._resolvePossibleFunction(title);
3935    }
3936
3937    updateAttachment(attachment) {
3938      if (attachment === 'right') {
3939        return 'end';
3940      }
3941
3942      if (attachment === 'left') {
3943        return 'start';
3944      }
3945
3946      return attachment;
3947    } // Private
3948
3949
3950    _initializeOnDelegatedTarget(event, context) {
3951      return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
3952    }
3953
3954    _getOffset() {
3955      const {
3956        offset
3957      } = this._config;
3958
3959      if (typeof offset === 'string') {
3960        return offset.split(',').map(val => Number.parseInt(val, 10));
3961      }
3962
3963      if (typeof offset === 'function') {
3964        return popperData => offset(popperData, this._element);
3965      }
3966
3967      return offset;
3968    }
3969
3970    _resolvePossibleFunction(content) {
3971      return typeof content === 'function' ? content.call(this._element) : content;
3972    }
3973
3974    _getPopperConfig(attachment) {
3975      const defaultBsPopperConfig = {
3976        placement: attachment,
3977        modifiers: [{
3978          name: 'flip',
3979          options: {
3980            fallbackPlacements: this._config.fallbackPlacements
3981          }
3982        }, {
3983          name: 'offset',
3984          options: {
3985            offset: this._getOffset()
3986          }
3987        }, {
3988          name: 'preventOverflow',
3989          options: {
3990            boundary: this._config.boundary
3991          }
3992        }, {
3993          name: 'arrow',
3994          options: {
3995            element: `.${this.constructor.NAME}-arrow`
3996          }
3997        }, {
3998          name: 'onChange',
3999          enabled: true,
4000          phase: 'afterWrite',
4001          fn: data => this._handlePopperPlacementChange(data)
4002        }],
4003        onFirstUpdate: data => {
4004          if (data.options.placement !== data.placement) {
4005            this._handlePopperPlacementChange(data);
4006          }
4007        }
4008      };
4009      return { ...defaultBsPopperConfig,
4010        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
4011      };
4012    }
4013
4014    _addAttachmentClass(attachment) {
4015      this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);
4016    }
4017
4018    _getAttachment(placement) {
4019      return AttachmentMap[placement.toUpperCase()];
4020    }
4021
4022    _setListeners() {
4023      const triggers = this._config.trigger.split(' ');
4024
4025      triggers.forEach(trigger => {
4026        if (trigger === 'click') {
4027          EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));
4028        } else if (trigger !== TRIGGER_MANUAL) {
4029          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;
4030          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;
4031          EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event));
4032          EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event));
4033        }
4034      });
4035
4036      this._hideModalHandler = () => {
4037        if (this._element) {
4038          this.hide();
4039        }
4040      };
4041
4042      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
4043
4044      if (this._config.selector) {
4045        this._config = { ...this._config,
4046          trigger: 'manual',
4047          selector: ''
4048        };
4049      } else {
4050        this._fixTitle();
4051      }
4052    }
4053
4054    _fixTitle() {
4055      const title = this._element.getAttribute('title');
4056
4057      const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');
4058
4059      if (title || originalTitleType !== 'string') {
4060        this._element.setAttribute('data-bs-original-title', title || '');
4061
4062        if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {
4063          this._element.setAttribute('aria-label', title);
4064        }
4065
4066        this._element.setAttribute('title', '');
4067      }
4068    }
4069
4070    _enter(event, context) {
4071      context = this._initializeOnDelegatedTarget(event, context);
4072
4073      if (event) {
4074        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
4075      }
4076
4077      if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {
4078        context._hoverState = HOVER_STATE_SHOW;
4079        return;
4080      }
4081
4082      clearTimeout(context._timeout);
4083      context._hoverState = HOVER_STATE_SHOW;
4084
4085      if (!context._config.delay || !context._config.delay.show) {
4086        context.show();
4087        return;
4088      }
4089
4090      context._timeout = setTimeout(() => {
4091        if (context._hoverState === HOVER_STATE_SHOW) {
4092          context.show();
4093        }
4094      }, context._config.delay.show);
4095    }
4096
4097    _leave(event, context) {
4098      context = this._initializeOnDelegatedTarget(event, context);
4099
4100      if (event) {
4101        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
4102      }
4103
4104      if (context._isWithActiveTrigger()) {
4105        return;
4106      }
4107
4108      clearTimeout(context._timeout);
4109      context._hoverState = HOVER_STATE_OUT;
4110
4111      if (!context._config.delay || !context._config.delay.hide) {
4112        context.hide();
4113        return;
4114      }
4115
4116      context._timeout = setTimeout(() => {
4117        if (context._hoverState === HOVER_STATE_OUT) {
4118          context.hide();
4119        }
4120      }, context._config.delay.hide);
4121    }
4122
4123    _isWithActiveTrigger() {
4124      for (const trigger in this._activeTrigger) {
4125        if (this._activeTrigger[trigger]) {
4126          return true;
4127        }
4128      }
4129
4130      return false;
4131    }
4132
4133    _getConfig(config) {
4134      const dataAttributes = Manipulator.getDataAttributes(this._element);
4135      Object.keys(dataAttributes).forEach(dataAttr => {
4136        if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {
4137          delete dataAttributes[dataAttr];
4138        }
4139      });
4140      config = { ...this.constructor.Default,
4141        ...dataAttributes,
4142        ...(typeof config === 'object' && config ? config : {})
4143      };
4144      config.container = config.container === false ? document.body : getElement(config.container);
4145
4146      if (typeof config.delay === 'number') {
4147        config.delay = {
4148          show: config.delay,
4149          hide: config.delay
4150        };
4151      }
4152
4153      if (typeof config.title === 'number') {
4154        config.title = config.title.toString();
4155      }
4156
4157      if (typeof config.content === 'number') {
4158        config.content = config.content.toString();
4159      }
4160
4161      typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
4162
4163      if (config.sanitize) {
4164        config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);
4165      }
4166
4167      return config;
4168    }
4169
4170    _getDelegateConfig() {
4171      const config = {};
4172
4173      for (const key in this._config) {
4174        if (this.constructor.Default[key] !== this._config[key]) {
4175          config[key] = this._config[key];
4176        }
4177      } // In the future can be replaced with:
4178      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
4179      // `Object.fromEntries(keysWithDifferentValues)`
4180
4181
4182      return config;
4183    }
4184
4185    _cleanTipClass() {
4186      const tip = this.getTipElement();
4187      const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g');
4188      const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);
4189
4190      if (tabClass !== null && tabClass.length > 0) {
4191        tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
4192      }
4193    }
4194
4195    _getBasicClassPrefix() {
4196      return CLASS_PREFIX$1;
4197    }
4198
4199    _handlePopperPlacementChange(popperData) {
4200      const {
4201        state
4202      } = popperData;
4203
4204      if (!state) {
4205        return;
4206      }
4207
4208      this.tip = state.elements.popper;
4209
4210      this._cleanTipClass();
4211
4212      this._addAttachmentClass(this._getAttachment(state.placement));
4213    }
4214
4215    _disposePopper() {
4216      if (this._popper) {
4217        this._popper.destroy();
4218
4219        this._popper = null;
4220      }
4221    } // Static
4222
4223
4224    static jQueryInterface(config) {
4225      return this.each(function () {
4226        const data = Tooltip.getOrCreateInstance(this, config);
4227
4228        if (typeof config === 'string') {
4229          if (typeof data[config] === 'undefined') {
4230            throw new TypeError(`No method named "${config}"`);
4231          }
4232
4233          data[config]();
4234        }
4235      });
4236    }
4237
4238  }
4239  /**
4240   * ------------------------------------------------------------------------
4241   * jQuery
4242   * ------------------------------------------------------------------------
4243   * add .Tooltip to jQuery only if jQuery is present
4244   */
4245
4246
4247  defineJQueryPlugin(Tooltip);
4248
4249  /**
4250   * --------------------------------------------------------------------------
4251   * Bootstrap (v5.1.3): popover.js
4252   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4253   * --------------------------------------------------------------------------
4254   */
4255  /**
4256   * ------------------------------------------------------------------------
4257   * Constants
4258   * ------------------------------------------------------------------------
4259   */
4260
4261  const NAME$3 = 'popover';
4262  const DATA_KEY$3 = 'bs.popover';
4263  const EVENT_KEY$3 = `.${DATA_KEY$3}`;
4264  const CLASS_PREFIX = 'bs-popover';
4265  const Default$2 = { ...Tooltip.Default,
4266    placement: 'right',
4267    offset: [0, 8],
4268    trigger: 'click',
4269    content: '',
4270    template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>'
4271  };
4272  const DefaultType$2 = { ...Tooltip.DefaultType,
4273    content: '(string|element|function)'
4274  };
4275  const Event$1 = {
4276    HIDE: `hide${EVENT_KEY$3}`,
4277    HIDDEN: `hidden${EVENT_KEY$3}`,
4278    SHOW: `show${EVENT_KEY$3}`,
4279    SHOWN: `shown${EVENT_KEY$3}`,
4280    INSERTED: `inserted${EVENT_KEY$3}`,
4281    CLICK: `click${EVENT_KEY$3}`,
4282    FOCUSIN: `focusin${EVENT_KEY$3}`,
4283    FOCUSOUT: `focusout${EVENT_KEY$3}`,
4284    MOUSEENTER: `mouseenter${EVENT_KEY$3}`,
4285    MOUSELEAVE: `mouseleave${EVENT_KEY$3}`
4286  };
4287  const SELECTOR_TITLE = '.popover-header';
4288  const SELECTOR_CONTENT = '.popover-body';
4289  /**
4290   * ------------------------------------------------------------------------
4291   * Class Definition
4292   * ------------------------------------------------------------------------
4293   */
4294
4295  class Popover extends Tooltip {
4296    // Getters
4297    static get Default() {
4298      return Default$2;
4299    }
4300
4301    static get NAME() {
4302      return NAME$3;
4303    }
4304
4305    static get Event() {
4306      return Event$1;
4307    }
4308
4309    static get DefaultType() {
4310      return DefaultType$2;
4311    } // Overrides
4312
4313
4314    isWithContent() {
4315      return this.getTitle() || this._getContent();
4316    }
4317
4318    setContent(tip) {
4319      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
4320
4321      this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
4322    } // Private
4323
4324
4325    _getContent() {
4326      return this._resolvePossibleFunction(this._config.content);
4327    }
4328
4329    _getBasicClassPrefix() {
4330      return CLASS_PREFIX;
4331    } // Static
4332
4333
4334    static jQueryInterface(config) {
4335      return this.each(function () {
4336        const data = Popover.getOrCreateInstance(this, config);
4337
4338        if (typeof config === 'string') {
4339          if (typeof data[config] === 'undefined') {
4340            throw new TypeError(`No method named "${config}"`);
4341          }
4342
4343          data[config]();
4344        }
4345      });
4346    }
4347
4348  }
4349  /**
4350   * ------------------------------------------------------------------------
4351   * jQuery
4352   * ------------------------------------------------------------------------
4353   * add .Popover to jQuery only if jQuery is present
4354   */
4355
4356
4357  defineJQueryPlugin(Popover);
4358
4359  /**
4360   * --------------------------------------------------------------------------
4361   * Bootstrap (v5.1.3): scrollspy.js
4362   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4363   * --------------------------------------------------------------------------
4364   */
4365  /**
4366   * ------------------------------------------------------------------------
4367   * Constants
4368   * ------------------------------------------------------------------------
4369   */
4370
4371  const NAME$2 = 'scrollspy';
4372  const DATA_KEY$2 = 'bs.scrollspy';
4373  const EVENT_KEY$2 = `.${DATA_KEY$2}`;
4374  const DATA_API_KEY$1 = '.data-api';
4375  const Default$1 = {
4376    offset: 10,
4377    method: 'auto',
4378    target: ''
4379  };
4380  const DefaultType$1 = {
4381    offset: 'number',
4382    method: 'string',
4383    target: '(string|element)'
4384  };
4385  const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
4386  const EVENT_SCROLL = `scroll${EVENT_KEY$2}`;
4387  const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;
4388  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
4389  const CLASS_NAME_ACTIVE$1 = 'active';
4390  const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
4391  const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';
4392  const SELECTOR_NAV_LINKS = '.nav-link';
4393  const SELECTOR_NAV_ITEMS = '.nav-item';
4394  const SELECTOR_LIST_ITEMS = '.list-group-item';
4395  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
4396  const SELECTOR_DROPDOWN$1 = '.dropdown';
4397  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
4398  const METHOD_OFFSET = 'offset';
4399  const METHOD_POSITION = 'position';
4400  /**
4401   * ------------------------------------------------------------------------
4402   * Class Definition
4403   * ------------------------------------------------------------------------
4404   */
4405
4406  class ScrollSpy extends BaseComponent {
4407    constructor(element, config) {
4408      super(element);
4409      this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
4410      this._config = this._getConfig(config);
4411      this._offsets = [];
4412      this._targets = [];
4413      this._activeTarget = null;
4414      this._scrollHeight = 0;
4415      EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());
4416      this.refresh();
4417
4418      this._process();
4419    } // Getters
4420
4421
4422    static get Default() {
4423      return Default$1;
4424    }
4425
4426    static get NAME() {
4427      return NAME$2;
4428    } // Public
4429
4430
4431    refresh() {
4432      const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
4433      const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
4434      const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
4435      this._offsets = [];
4436      this._targets = [];
4437      this._scrollHeight = this._getScrollHeight();
4438      const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);
4439      targets.map(element => {
4440        const targetSelector = getSelectorFromElement(element);
4441        const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;
4442
4443        if (target) {
4444          const targetBCR = target.getBoundingClientRect();
4445
4446          if (targetBCR.width || targetBCR.height) {
4447            return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];
4448          }
4449        }
4450
4451        return null;
4452      }).filter(item => item).sort((a, b) =>
4452 a[0] - b[0]).forEach(item => {
4453        this._offsets.push(item[0]);
4454
4455        this._targets.push(item[1]);
4456      });
4457    }
4458
4459    dispose() {
4460      EventHandler.off(this._scrollElement, EVENT_KEY$2);
4461      super.dispose();
4462    } // Private
4463
4464
4465    _getConfig(config) {
4466      config = { ...Default$1,
4467        ...Manipulator.getDataAttributes(this._element),
4468        ...(typeof config === 'object' && config ? config : {})
4469      };
4470      config.target = getElement(config.target) || document.documentElement;
4471      typeCheckConfig(NAME$2, config, DefaultType$1);
4472      return config;
4473    }
4474
4475    _getScrollTop() {
4476      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
4477    }
4478
4479    _getScrollHeight() {
4480      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
4481    }
4482
4483    _getOffsetHeight() {
4484      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
4485    }
4486
4487    _process() {
4488      const scrollTop = this._getScrollTop() + this._config.offset;
4489
4490      const scrollHeight = this._getScrollHeight();
4491
4492      const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
4493
4494      if (this._scrollHeight !== scrollHeight) {
4495        this.refresh();
4496      }
4497
4498      if (scrollTop >= maxScroll) {
4499        const target = this._targets[this._targets.length - 1];
4500
4501        if (this._activeTarget !== target) {
4502          this._activate(target);
4503        }
4504
4505        return;
4506      }
4507
4508      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
4509        this._activeTarget = null;
4510
4511        this._clear();
4512
4513        return;
4514      }
4515
4516      for (let i = this._offsets.length; i--;) {
4517        const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
4518
4519        if (isActiveTarget) {
4520          this._activate(this._targets[i]);
4521        }
4522      }
4523    }
4524
4525    _activate(target) {
4526      this._activeTarget = target;
4527
4528      this._clear();
4529
4530      const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
4531      const link = SelectorEngine.findOne(queries.join(','), this._config.target);
4532      link.classList.add(CLASS_NAME_ACTIVE$1);
4533
4534      if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
4535        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);
4536      } else {
4537        SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {
4538          // Set triggered links parents as active
4539          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
4540          SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1)); // Handle special case when .nav-link is inside .nav-item
4541
4542          SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {
4543            SelectorEngine.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1));
4544          });
4545        });
4546      }
4547
4548      EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {
4549        relatedTarget: target
4550      });
4551    }
4552
4553    _clear() {
4554      SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));
4555    } // Static
4556
4557
4558    static jQueryInterface(config) {
4559      return this.each(function () {
4560        const data = ScrollSpy.getOrCreateInstance(this, config);
4561
4562        if (typeof config !== 'string') {
4563          return;
4564        }
4565
4566        if (typeof data[config] === 'undefined') {
4567          throw new TypeError(`No method named "${config}"`);
4568        }
4569
4570        data[config]();
4571      });
4572    }
4573
4574  }
4575  /**
4576   * ------------------------------------------------------------------------
4577   * Data Api implementation
4578   * ------------------------------------------------------------------------
4579   */
4580
4581
4582  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
4583    SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));
4584  });
4585  /**
4586   * ------------------------------------------------------------------------
4587   * jQuery
4588   * ------------------------------------------------------------------------
4589   * add .ScrollSpy to jQuery only if jQuery is present
4590   */
4591
4592  defineJQueryPlugin(ScrollSpy);
4593
4594  /**
4595   * --------------------------------------------------------------------------
4596   * Bootstrap (v5.1.3): tab.js
4597   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4598   * --------------------------------------------------------------------------
4599   */
4600  /**
4601   * ------------------------------------------------------------------------
4602   * Constants
4603   * ------------------------------------------------------------------------
4604   */
4605
4606  const NAME$1 = 'tab';
4607  const DATA_KEY$1 = 'bs.tab';
4608  const EVENT_KEY$1 = `.${DATA_KEY$1}`;
4609  const DATA_API_KEY = '.data-api';
4610  const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
4611  const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
4612  const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
4613  const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
4614  const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;
4615  const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
4616  const CLASS_NAME_ACTIVE = 'active';
4617  const CLASS_NAME_FADE$1 = 'fade';
4618  const CLASS_NAME_SHOW$1 = 'show';
4619  const SELECTOR_DROPDOWN = '.dropdown';
4620  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
4621  const SELECTOR_ACTIVE = '.active';
4622  const SELECTOR_ACTIVE_UL = ':scope > li > .active';
4623  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
4624  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
4625  const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';
4626  /**
4627   * ------------------------------------------------------------------------
4628   * Class Definition
4629   * ------------------------------------------------------------------------
4630   */
4631
4632  class Tab extends BaseComponent {
4633    // Getters
4634    static get NAME() {
4635      return NAME$1;
4636    } // Public
4637
4638
4639    show() {
4640      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
4641        return;
4642      }
4643
4644      let previous;
4645      const target = getElementFromSelector(this._element);
4646
4647      const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);
4648
4649      if (listElement) {
4650        const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
4651        previous = SelectorEngine.find(itemSelector, listElement);
4652        previous = previous[previous.length - 1];
4653      }
4654
4655      const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {
4656        relatedTarget: this._element
4657      }) : null;
4658      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {
4659        relatedTarget: previous
4660      });
4661
4662      if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {
4663        return;
4664      }
4665
4666      this._activate(this._element, listElement);
4667
4668      const complete = () => {
4669        EventHandler.trigger(previous, EVENT_HIDDEN$1, {
4670          relatedTarget: this._element
4671        });
4672        EventHandler.trigger(this._element, EVENT_SHOWN$1, {
4673          relatedTarget: previous
4674        });
4675      };
4676
4677      if (target) {
4678        this._activate(target, target.parentNode, complete);
4679      } else {
4680        complete();
4681      }
4682    } // Private
4683
4684
4685    _activate(element, container, callback) {
4686      const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);
4687      const active = activeElements[0];
4688      const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);
4689
4690      const complete = () => this._transitionComplete(element, active, callback);
4691
4692      if (active && isTransitioning) {
4693        active.classList.remove(CLASS_NAME_SHOW$1);
4694
4695        this._queueCallback(complete, element, true);
4696      } else {
4697        complete();
4698      }
4699    }
4700
4701    _transitionComplete(element, active, callback) {
4702      if (active) {
4703        active.classList.remove(CLASS_NAME_ACTIVE);
4704        const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);
4705
4706        if (dropdownChild) {
4707          dropdownChild.classList.remove(CLASS_NAME_ACTIVE);
4708        }
4709
4710        if (active.getAttribute('role') === 'tab') {
4711          active.setAttribute('aria-selected', false);
4712        }
4713      }
4714
4715      element.classList.add(CLASS_NAME_ACTIVE);
4716
4717      if (element.getAttribute('role') === 'tab') {
4718        element.setAttribute('aria-selected', true);
4719      }
4720
4721      reflow(element);
4722
4723      if (element.classList.contains(CLASS_NAME_FADE$1)) {
4724        element.classList.add(CLASS_NAME_SHOW$1);
4725      }
4726
4727      let parent = element.parentNode;
4728
4729      if (parent && parent.nodeName === 'LI') {
4730        parent = parent.parentNode;
4731      }
4732
4733      if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
4734        const dropdownElement = element.closest(SELECTOR_DROPDOWN);
4735
4736        if (dropdownElement) {
4737          SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));
4738        }
4739
4740        element.setAttribute('aria-expanded', true);
4741      }
4742
4743      if (callback) {
4744        callback();
4745      }
4746    } // Static
4747
4748
4749    static jQueryInterface(config) {
4750      return this.each(function () {
4751        const data = Tab.getOrCreateInstance(this);
4752
4753        if (typeof config === 'string') {
4754          if (typeof data[config] === 'undefined') {
4755            throw new TypeError(`No method named "${config}"`);
4756          }
4757
4758          data[config]();
4759        }
4760      });
4761    }
4762
4763  }
4764  /**
4765   * ------------------------------------------------------------------------
4766   * Data Api implementation
4767   * ------------------------------------------------------------------------
4768   */
4769
4770
4771  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
4772    if (['A', 'AREA'].includes(this.tagName)) {
4773      event.preventDefault();
4774    }
4775
4776    if (isDisabled(this)) {
4777      return;
4778    }
4779
4780    const data = Tab.getOrCreateInstance(this);
4781    data.show();
4782  });
4783  /**
4784   * ------------------------------------------------------------------------
4785   * jQuery
4786   * ------------------------------------------------------------------------
4787   * add .Tab to jQuery only if jQuery is present
4788   */
4789
4790  defineJQueryPlugin(Tab);
4791
4792  /**
4793   * --------------------------------------------------------------------------
4794   * Bootstrap (v5.1.3): toast.js
4795   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4796   * --------------------------------------------------------------------------
4797   */
4798  /**
4799   * ------------------------------------------------------------------------
4800   * Constants
4801   * ------------------------------------------------------------------------
4802   */
4803
4804  const NAME = 'toast';
4805  const DATA_KEY = 'bs.toast';
4806  const EVENT_KEY = `.${DATA_KEY}`;
4807  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
4808  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
4809  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
4810  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
4811  const EVENT_HIDE = `hide${EVENT_KEY}`;
4812  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
4813  const EVENT_SHOW = `show${EVENT_KEY}`;
4814  const EVENT_SHOWN = `shown${EVENT_KEY}`;
4815  const CLASS_NAME_FADE = 'fade';
vendor: 4,599 bytes, lines 4816-5001
4816  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
4817
4818  const CLASS_NAME_SHOW = 'show';
4819  const CLASS_NAME_SHOWING = 'showing';
4820  const DefaultType = {
4821    animation: 'boolean',
4822    autohide: 'boolean',
4823    delay: 'number'
4824  };
4825  const Default = {
4826    animation: true,
4827    autohide: true,
4828    delay: 5000
4829  };
4830  /**
4831   * ------------------------------------------------------------------------
4832   * Class Definition
4833   * ------------------------------------------------------------------------
4834   */
4835
4836  class Toast extends BaseComponent {
4837    constructor(element, config) {
4838      super(element);
4839      this._config = this._getConfig(config);
4840      this._timeout = null;
4841      this._hasMouseInteraction = false;
4842      this._hasKeyboardInteraction = false;
4843
4844      this._setListeners();
4845    } // Getters
4846
4847
4848    static get DefaultType() {
4849      return DefaultType;
4850    }
4851
4852    static get Default() {
4853      return Default;
4854    }
4855
4856    static get NAME() {
4857      return NAME;
4858    } // Public
4859
4860
4861    show() {
4862      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
4863
4864      if (showEvent.defaultPrevented) {
4865        return;
4866      }
4867
4868      this._clearTimeout();
4869
4870      if (this._config.animation) {
4871        this._element.classList.add(CLASS_NAME_FADE);
4872      }
4873
4874      const complete = () => {
4875        this._element.classList.remove(CLASS_NAME_SHOWING);
4876
4877        EventHandler.trigger(this._element, EVENT_SHOWN);
4878
4879        this._maybeScheduleHide();
4880      };
4881
4882      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
4883
4884
4885      reflow(this._element);
4886
4887      this._element.classList.add(CLASS_NAME_SHOW);
4888
4889      this._element.classList.add(CLASS_NAME_SHOWING);
4890
4891      this._queueCallback(complete, this._element, this._config.animation);
4892    }
4893
4894    hide() {
4895      if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
4896        return;
4897      }
4898
4899      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
4900
4901      if (hideEvent.defaultPrevented) {
4902        return;
4903      }
4904
4905      const complete = () => {
4906        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
4907
4908
4909        this._element.classList.remove(CLASS_NAME_SHOWING);
4910
4911        this._element.classList.remove(CLASS_NAME_SHOW);
4912
4913        EventHandler.trigger(this._element, EVENT_HIDDEN);
4914      };
4915
4916      this._element.classList.add(CLASS_NAME_SHOWING);
4917
4918      this._queueCallback(complete, this._element, this._config.animation);
4919    }
4920
4921    dispose() {
4922      this._clearTimeout();
4923
4924      if (this._element.classList.contains(CLASS_NAME_SHOW)) {
4925        this._element.classList.remove(CLASS_NAME_SHOW);
4926      }
4927
4928      super.dispose();
4929    } // Private
4930
4931
4932    _getConfig(config) {
4933      config = { ...Default,
4934        ...Manipulator.getDataAttributes(this._element),
4935        ...(typeof config === 'object' && config ? config : {})
4936      };
4937      typeCheckConfig(NAME, config, this.constructor.DefaultType);
4938      return config;
4939    }
4940
4941    _maybeScheduleHide() {
4942      if (!this._config.autohide) {
4943        return;
4944      }
4945
4946      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
4947        return;
4948      }
4949
4950      this._timeout = setTimeout(() => {
4951        this.hide();
4952      }, this._config.delay);
4953    }
4954
4955    _onInteraction(event, isInteracting) {
4956      switch (event.type) {
4957        case 'mouseover':
4958        case 'mouseout':
4959          this._hasMouseInteraction = isInteracting;
4960          break;
4961
4962        case 'focusin':
4963        case 'focusout':
4964          this._hasKeyboardInteraction = isInteracting;
4965          break;
4966      }
4967
4968      if (isInteracting) {
4969        this._clearTimeout();
4970
4971        return;
4972      }
4973
4974      const nextElement = event.relatedTarget;
4975
4976      if (this._element === nextElement || this._element.contains(nextElement)) {
4977        return;
4978      }
4979
4980      this._maybeScheduleHide();
4981    }
4982
4983    _setListeners() {
4984      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
4985      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
4986      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
4987      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
4988    }
4989
4990    _clearTimeout() {
4991      clearTimeout(this._timeout);
4992      this._timeout = null;
4993    } // Static
4994
4995
4996    static jQueryInterface(config) {
4997      return this.each(function () {
4998        const data = Toast.getOrCreateInstance(this, config);
4999
5000        if (typeof config === 'string') {
5001          if (typeof data[config] === 'undefined') {
5002            throw new TypeError(`No method named "${config}"`);
5003          }
5004
5005          data[config](this);
5006        }
5007      });
5008    }
5009
5010  }
5011
5012  enableDismissTrigger(Toast);
5013  /**
5014   * ------------------------------------------------------------------------
5015   * jQuery
5016   * ------------------------------------------------------------------------
5017   * add .Toast to jQuery only if jQuery is present
5018   */
5019
5020  defineJQueryPlugin(Toast);
5021
5022  /**
5023   * --------------------------------------------------------------------------
5024   * Bootstrap (v5.1.3): index.umd.js
5025   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5026   * --------------------------------------------------------------------------
5027   */
5028  const index_umd = {
5029    Alert,
5030    Button,
5031    Carousel,
5032    Collapse,
5033    Dropdown,
5034    Modal,
5035    Offcanvas,
5036    Popover,
5037    ScrollSpy,
5038    Tab,
5039    Toast,
5040    Tooltip
5041  };
5042
5043  return index_umd;
5044
5045}));
5046//# sourceMappingURL=bootstrap.js.map

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