{"version":3,"file":"theme-scripts.min.js","sources":["../../node_modules/uikit/dist/js/uikit-core.js","../../node_modules/uikit/src/js/util/lang.js","../../node_modules/uikit/src/js/util/attr.js","../../node_modules/uikit/src/js/util/filter.js","../../node_modules/uikit/src/js/util/selector.js","../../node_modules/uikit/src/js/util/event.js","../../node_modules/uikit/src/js/util/style.js","../../node_modules/uikit/src/js/util/class.js","../../node_modules/uikit/src/js/util/animation.js","../../node_modules/uikit/src/js/util/dimensions.js","../../node_modules/uikit/src/js/util/dom.js","../../node_modules/uikit/src/js/util/env.js","../../node_modules/uikit/src/js/util/observer.js","../../node_modules/uikit/src/js/util/viewport.js","../../node_modules/uikit/src/js/mixin/resize.js","../../node_modules/uikit/src/js/mixin/scroll.js","../../node_modules/uikit/src/js/mixin/media.js","../../node_modules/uikit/src/js/core/svg.js","../../node_modules/uikit/src/js/mixin/parallax.js","../../node_modules/uikit/src/js/components/parallax.js","../../node_modules/uikit/src/js/mixin/class.js","../../node_modules/uikit/src/js/mixin/slider-autoplay.js","../../node_modules/uikit/src/js/mixin/slider-drag.js","../../node_modules/uikit/src/js/mixin/slider-nav.js","../../node_modules/uikit/src/js/mixin/slider.js","../../node_modules/uikit/src/js/mixin/slider-reactive.js","../../node_modules/uikit/src/js/mixin/lazyload.js","../../node_modules/uikit/src/js/components/internal/slider-preload.js","../../node_modules/uikit/src/js/mixin/internal/slideshow-animations.js","../../node_modules/uikit/src/js/components/internal/slider-transitioner.js","../../node_modules/uikit/src/js/components/slider.js","../../node_modules/uikit/src/js/mixin/internal/slideshow-transitioner.js","../../node_modules/uikit/src/js/mixin/slideshow.js","../../node_modules/uikit/src/js/components/internal/slideshow-animations.js","../../node_modules/uikit/src/js/components/slideshow.js","../../assets/scripts/theme/UIkit.js","../../node_modules/jquery/dist/jquery.js","../../assets/scripts/theme/accessibilityAttributes.js","../../assets/scripts/theme/facebookShare.js","../../assets/scripts/theme/heroVideo.js","../../assets/scripts/theme/loadVenues.js","../../assets/scripts/theme/menuIcon.js","../../assets/scripts/theme/scrollspy.js","../../assets/scripts/theme/venueFilter.js","../../assets/scripts/theme.js"],"sourcesContent":["/*! UIkit 3.15.12 | https://www.getuikit.com | (c) 2014 - 2022 YOOtheme | MIT License */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('uikit', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.UIkit = factory());\n})(this, (function () { 'use strict';\n\n const { hasOwnProperty, toString } = Object.prototype;\n\n function hasOwn(obj, key) {\n return hasOwnProperty.call(obj, key);\n }\n\n const hyphenateRe = /\\B([A-Z])/g;\n\n const hyphenate = memoize((str) => str.replace(hyphenateRe, '-$1').toLowerCase());\n\n const camelizeRe = /-(\\w)/g;\n\n const camelize = memoize((str) => str.replace(camelizeRe, toUpper));\n\n const ucfirst = memoize((str) =>\n str.length ? toUpper(null, str.charAt(0)) + str.slice(1) : '');\n\n\n function toUpper(_, c) {\n return c ? c.toUpperCase() : '';\n }\n\n function startsWith(str, search) {\n return str == null ? void 0 : str.startsWith == null ? void 0 : str.startsWith(search);\n }\n\n function endsWith(str, search) {\n return str == null ? void 0 : str.endsWith == null ? void 0 : str.endsWith(search);\n }\n\n function includes(obj, search) {\n return obj == null ? void 0 : obj.includes == null ? void 0 : obj.includes(search);\n }\n\n function findIndex(array, predicate) {\n return array == null ? void 0 : array.findIndex == null ? void 0 : array.findIndex(predicate);\n }\n\n const { isArray, from: toArray } = Array;\n const { assign } = Object;\n\n function isFunction(obj) {\n return typeof obj === 'function';\n }\n\n function isObject(obj) {\n return obj !== null && typeof obj === 'object';\n }\n\n function isPlainObject(obj) {\n return toString.call(obj) === '[object Object]';\n }\n\n function isWindow(obj) {\n return isObject(obj) && obj === obj.window;\n }\n\n function isDocument(obj) {\n return nodeType(obj) === 9;\n }\n\n function isNode(obj) {\n return nodeType(obj) >= 1;\n }\n\n function isElement(obj) {\n return nodeType(obj) === 1;\n }\n\n function nodeType(obj) {\n return !isWindow(obj) && isObject(obj) && obj.nodeType;\n }\n\n function isBoolean(value) {\n return typeof value === 'boolean';\n }\n\n function isString(value) {\n return typeof value === 'string';\n }\n\n function isNumber(value) {\n return typeof value === 'number';\n }\n\n function isNumeric(value) {\n return isNumber(value) || isString(value) && !isNaN(value - parseFloat(value));\n }\n\n function isEmpty(obj) {\n return !(isArray(obj) ? obj.length : isObject(obj) ? Object.keys(obj).length : false);\n }\n\n function isUndefined(value) {\n return value === void 0;\n }\n\n function toBoolean(value) {\n return isBoolean(value) ?\n value :\n value === 'true' || value === '1' || value === '' ?\n true :\n value === 'false' || value === '0' ?\n false :\n value;\n }\n\n function toNumber(value) {\n const number = Number(value);\n return isNaN(number) ? false : number;\n }\n\n function toFloat(value) {\n return parseFloat(value) || 0;\n }\n\n function toNode(element) {\n return toNodes(element)[0];\n }\n\n function toNodes(element) {\n return element && (isNode(element) ? [element] : Array.from(element).filter(isNode)) || [];\n }\n\n function toWindow(element) {var _element;\n if (isWindow(element)) {\n return element;\n }\n\n element = toNode(element);\n const document = isDocument(element) ? element : (_element = element) == null ? void 0 : _element.ownerDocument;\n\n return (document == null ? void 0 : document.defaultView) || window;\n }\n\n function isEqual(value, other) {\n return (\n value === other ||\n isObject(value) &&\n isObject(other) &&\n Object.keys(value).length === Object.keys(other).length &&\n each(value, (val, key) => val === other[key]));\n\n }\n\n function swap(value, a, b) {\n return value.replace(new RegExp(a + \"|\" + b, 'g'), (match) => match === a ? b : a);\n }\n\n function last(array) {\n return array[array.length - 1];\n }\n\n function each(obj, cb) {\n for (const key in obj) {\n if (false === cb(obj[key], key)) {\n return false;\n }\n }\n return true;\n }\n\n function sortBy$1(array, prop) {\n return array.\n slice().\n sort((_ref, _ref2) => {let { [prop]: propA = 0 } = _ref;let { [prop]: propB = 0 } = _ref2;return (\n propA > propB ? 1 : propB > propA ? -1 : 0);});\n\n }\n\n function uniqueBy(array, prop) {\n const seen = new Set();\n return array.filter((_ref3) => {let { [prop]: check } = _ref3;return seen.has(check) ? false : seen.add(check);});\n }\n\n function clamp(number, min, max) {if (min === void 0) {min = 0;}if (max === void 0) {max = 1;}\n return Math.min(Math.max(toNumber(number) || 0, min), max);\n }\n\n function noop() {}\n\n function intersectRect() {for (var _len = arguments.length, rects = new Array(_len), _key = 0; _key < _len; _key++) {rects[_key] = arguments[_key];}\n return [\n ['bottom', 'top'],\n ['right', 'left']].\n every(\n (_ref4) => {let [minProp, maxProp] = _ref4;return (\n Math.min(...rects.map((_ref5) => {let { [minProp]: min } = _ref5;return min;})) -\n Math.max(...rects.map((_ref6) => {let { [maxProp]: max } = _ref6;return max;})) >\n 0);});\n\n }\n\n function pointInRect(point, rect) {\n return (\n point.x <= rect.right &&\n point.x >= rect.left &&\n point.y <= rect.bottom &&\n point.y >= rect.top);\n\n }\n\n function ratio(dimensions, prop, value) {\n const aProp = prop === 'width' ? 'height' : 'width';\n\n return {\n [aProp]: dimensions[prop] ?\n Math.round(value * dimensions[aProp] / dimensions[prop]) :\n dimensions[aProp],\n [prop]: value\n };\n }\n\n function contain(dimensions, maxDimensions) {\n dimensions = { ...dimensions };\n\n for (const prop in dimensions) {\n dimensions =\n dimensions[prop] > maxDimensions[prop] ?\n ratio(dimensions, prop, maxDimensions[prop]) :\n dimensions;\n }\n\n return dimensions;\n }\n\n function cover$1(dimensions, maxDimensions) {\n dimensions = contain(dimensions, maxDimensions);\n\n for (const prop in dimensions) {\n dimensions =\n dimensions[prop] < maxDimensions[prop] ?\n ratio(dimensions, prop, maxDimensions[prop]) :\n dimensions;\n }\n\n return dimensions;\n }\n\n const Dimensions = { ratio, contain, cover: cover$1 };\n\n function getIndex(i, elements, current, finite) {if (current === void 0) {current = 0;}if (finite === void 0) {finite = false;}\n elements = toNodes(elements);\n\n const { length } = elements;\n\n if (!length) {\n return -1;\n }\n\n i = isNumeric(i) ?\n toNumber(i) :\n i === 'next' ?\n current + 1 :\n i === 'previous' ?\n current - 1 :\n elements.indexOf(toNode(i));\n\n if (finite) {\n return clamp(i, 0, length - 1);\n }\n\n i %= length;\n\n return i < 0 ? i + length : i;\n }\n\n function memoize(fn) {\n const cache = Object.create(null);\n return (key) => cache[key] || (cache[key] = fn(key));\n }\n\n class Deferred {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n }\n\n function attr(element, name, value) {\n if (isObject(name)) {\n for (const key in name) {\n attr(element, key, name[key]);\n }\n return;\n }\n\n if (isUndefined(value)) {var _toNode;\n return (_toNode = toNode(element)) == null ? void 0 : _toNode.getAttribute(name);\n } else {\n for (const el of toNodes(element)) {\n if (isFunction(value)) {\n value = value.call(el, attr(el, name));\n }\n\n if (value === null) {\n removeAttr(el, name);\n } else {\n el.setAttribute(name, value);\n }\n }\n }\n }\n\n function hasAttr(element, name) {\n return toNodes(element).some((element) => element.hasAttribute(name));\n }\n\n function removeAttr(element, name) {\n const elements = toNodes(element);\n for (const attribute of name.split(' ')) {\n for (const element of elements) {\n element.removeAttribute(attribute);\n }\n }\n }\n\n function data(element, attribute) {\n for (const name of [attribute, \"data-\" + attribute]) {\n if (hasAttr(element, name)) {\n return attr(element, name);\n }\n }\n }\n\n const voidElements = {\n area: true,\n base: true,\n br: true,\n col: true,\n embed: true,\n hr: true,\n img: true,\n input: true,\n keygen: true,\n link: true,\n menuitem: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true\n };\n function isVoidElement(element) {\n return toNodes(element).some((element) => voidElements[element.tagName.toLowerCase()]);\n }\n\n function isVisible(element) {\n return toNodes(element).some(\n (element) => element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n\n }\n\n const selInput = 'input,select,textarea,button';\n function isInput(element) {\n return toNodes(element).some((element) => matches(element, selInput));\n }\n\n const selFocusable = selInput + \",a[href],[tabindex]\";\n function isFocusable(element) {\n return matches(element, selFocusable);\n }\n\n function parent(element) {var _toNode;\n return (_toNode = toNode(element)) == null ? void 0 : _toNode.parentElement;\n }\n\n function filter(element, selector) {\n return toNodes(element).filter((element) => matches(element, selector));\n }\n\n function matches(element, selector) {\n return toNodes(element).some((element) => element.matches(selector));\n }\n\n function closest(element, selector) {\n return isElement(element) ?\n element.closest(startsWith(selector, '>') ? selector.slice(1) : selector) :\n toNodes(element).\n map((element) => closest(element, selector)).\n filter(Boolean);\n }\n\n function within(element, selector) {\n return isString(selector) ?\n !!closest(element, selector) :\n toNode(selector).contains(toNode(element));\n }\n\n function parents(element, selector) {\n const elements = [];\n\n while (element = parent(element)) {\n if (!selector || matches(element, selector)) {\n elements.push(element);\n }\n }\n\n return elements;\n }\n\n function children(element, selector) {\n element = toNode(element);\n const children = element ? toNodes(element.children) : [];\n return selector ? filter(children, selector) : children;\n }\n\n function index(element, ref) {\n return ref ? toNodes(element).indexOf(toNode(ref)) : children(parent(element)).indexOf(element);\n }\n\n function query(selector, context) {\n return find(selector, getContext(selector, context));\n }\n\n function queryAll(selector, context) {\n return findAll(selector, getContext(selector, context));\n }\n\n function find(selector, context) {\n return toNode(_query(selector, context, 'querySelector'));\n }\n\n function findAll(selector, context) {\n return toNodes(_query(selector, context, 'querySelectorAll'));\n }\n\n const contextSelectorRe = /(^|[^\\\\],)\\s*[!>+~-]/;\n const isContextSelector = memoize((selector) => selector.match(contextSelectorRe));\n\n function getContext(selector, context) {if (context === void 0) {context = document;}\n return isString(selector) && isContextSelector(selector) || isDocument(context) ?\n context :\n context.ownerDocument;\n }\n\n const contextSanitizeRe = /([!>+~-])(?=\\s+[!>+~-]|\\s*$)/g;\n const sanatize = memoize((selector) => selector.replace(contextSanitizeRe, '$1 *'));\n\n function _query(selector, context, queryFn) {if (context === void 0) {context = document;}\n if (!selector || !isString(selector)) {\n return selector;\n }\n\n selector = sanatize(selector);\n\n if (isContextSelector(selector)) {\n const split = splitSelector(selector);\n selector = '';\n for (let sel of split) {\n let ctx = context;\n\n if (sel[0] === '!') {\n const selectors = sel.substr(1).trim().split(' ');\n ctx = closest(parent(context), selectors[0]);\n sel = selectors.slice(1).join(' ').trim();\n if (!sel.length && split.length === 1) {\n return ctx;\n }\n }\n\n if (sel[0] === '-') {\n const selectors = sel.substr(1).trim().split(' ');\n const prev = (ctx || context).previousElementSibling;\n ctx = matches(prev, sel.substr(1)) ? prev : null;\n sel = selectors.slice(1).join(' ');\n }\n\n if (ctx) {\n selector += \"\" + (selector ? ',' : '') + domPath(ctx) + \" \" + sel;\n }\n }\n\n context = document;\n }\n\n try {\n return context[queryFn](selector);\n } catch (e) {\n return null;\n }\n }\n\n const selectorRe = /.*?[^\\\\](?:,|$)/g;\n\n const splitSelector = memoize((selector) =>\n selector.match(selectorRe).map((selector) => selector.replace(/,$/, '').trim()));\n\n\n function domPath(element) {\n const names = [];\n while (element.parentNode) {\n const id = attr(element, 'id');\n if (id) {\n names.unshift(\"#\" + escape(id));\n break;\n } else {\n let { tagName } = element;\n if (tagName !== 'HTML') {\n tagName += \":nth-child(\" + (index(element) + 1) + \")\";\n }\n names.unshift(tagName);\n element = element.parentNode;\n }\n }\n return names.join(' > ');\n }\n\n function escape(css) {\n return isString(css) ? CSS.escape(css) : '';\n }\n\n function on() {for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}\n let [targets, types, selector, listener, useCapture = false] = getArgs(args);\n\n if (listener.length > 1) {\n listener = detail(listener);\n }\n\n if (useCapture != null && useCapture.self) {\n listener = selfFilter(listener);\n }\n\n if (selector) {\n listener = delegate(selector, listener);\n }\n\n for (const type of types) {\n for (const target of targets) {\n target.addEventListener(type, listener, useCapture);\n }\n }\n\n return () => off(targets, types, listener, useCapture);\n }\n\n function off() {for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {args[_key2] = arguments[_key2];}\n let [targets, types,, listener, useCapture = false] = getArgs(args);\n for (const type of types) {\n for (const target of targets) {\n target.removeEventListener(type, listener, useCapture);\n }\n }\n }\n\n function once() {for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {args[_key3] = arguments[_key3];}\n const [element, types, selector, listener, useCapture = false, condition] = getArgs(args);\n const off = on(\n element,\n types,\n selector,\n (e) => {\n const result = !condition || condition(e);\n if (result) {\n off();\n listener(e, result);\n }\n },\n useCapture);\n\n\n return off;\n }\n\n function trigger(targets, event, detail) {\n return toEventTargets(targets).every((target) =>\n target.dispatchEvent(createEvent(event, true, true, detail)));\n\n }\n\n function createEvent(e, bubbles, cancelable, detail) {if (bubbles === void 0) {bubbles = true;}if (cancelable === void 0) {cancelable = false;}\n if (isString(e)) {\n e = new CustomEvent(e, { bubbles, cancelable, detail });\n }\n\n return e;\n }\n\n function getArgs(args) {\n // Event targets\n args[0] = toEventTargets(args[0]);\n\n // Event types\n if (isString(args[1])) {\n args[1] = args[1].split(' ');\n }\n\n // Delegate?\n if (isFunction(args[2])) {\n args.splice(2, 0, false);\n }\n\n return args;\n }\n\n function delegate(selector, listener) {\n return (e) => {\n const current =\n selector[0] === '>' ?\n findAll(selector, e.currentTarget).\n reverse().\n filter((element) => within(e.target, element))[0] :\n closest(e.target, selector);\n\n if (current) {\n e.current = current;\n listener.call(this, e);\n }\n };\n }\n\n function detail(listener) {\n return (e) => isArray(e.detail) ? listener(e, ...e.detail) : listener(e);\n }\n\n function selfFilter(listener) {\n return function (e) {\n if (e.target === e.currentTarget || e.target === e.current) {\n return listener.call(null, e);\n }\n };\n }\n\n function isEventTarget(target) {\n return target && 'addEventListener' in target;\n }\n\n function toEventTarget(target) {\n return isEventTarget(target) ? target : toNode(target);\n }\n\n function toEventTargets(target) {\n return isArray(target) ?\n target.map(toEventTarget).filter(Boolean) :\n isString(target) ?\n findAll(target) :\n isEventTarget(target) ?\n [target] :\n toNodes(target);\n }\n\n function isTouch(e) {\n return e.pointerType === 'touch' || !!e.touches;\n }\n\n function getEventPos(e) {var _e$touches, _e$changedTouches;\n const { clientX: x, clientY: y } = ((_e$touches = e.touches) == null ? void 0 : _e$touches[0]) || ((_e$changedTouches = e.changedTouches) == null ? void 0 : _e$changedTouches[0]) || e;\n\n return { x, y };\n }\n\n function ajax(url, options) {\n const env = {\n data: null,\n method: 'GET',\n headers: {},\n xhr: new XMLHttpRequest(),\n beforeSend: noop,\n responseType: '',\n ...options\n };\n return Promise.resolve().\n then(() => env.beforeSend(env)).\n then(() => send(url, env));\n }\n\n function send(url, env) {\n return new Promise((resolve, reject) => {\n const { xhr } = env;\n\n for (const prop in env) {\n if (prop in xhr) {\n try {\n xhr[prop] = env[prop];\n } catch (e) {\n\n // noop\n }}\n }\n\n xhr.open(env.method.toUpperCase(), url);\n\n for (const header in env.headers) {\n xhr.setRequestHeader(header, env.headers[header]);\n }\n\n on(xhr, 'load', () => {\n if (xhr.status === 0 || xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {\n resolve(xhr);\n } else {\n reject(\n assign(Error(xhr.statusText), {\n xhr,\n status: xhr.status\n }));\n\n }\n });\n\n on(xhr, 'error', () => reject(assign(Error('Network Error'), { xhr })));\n on(xhr, 'timeout', () => reject(assign(Error('Network Timeout'), { xhr })));\n\n xhr.send(env.data);\n });\n }\n\n function getImage(src, srcset, sizes) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n\n img.onerror = (e) => {\n reject(e);\n };\n img.onload = () => {\n resolve(img);\n };\n\n sizes && (img.sizes = sizes);\n srcset && (img.srcset = srcset);\n img.src = src;\n });\n }\n\n const cssNumber = {\n 'animation-iteration-count': true,\n 'column-count': true,\n 'fill-opacity': true,\n 'flex-grow': true,\n 'flex-shrink': true,\n 'font-weight': true,\n 'line-height': true,\n opacity: true,\n order: true,\n orphans: true,\n 'stroke-dasharray': true,\n 'stroke-dashoffset': true,\n widows: true,\n 'z-index': true,\n zoom: true\n };\n\n function css(element, property, value, priority) {if (priority === void 0) {priority = '';}\n const elements = toNodes(element);\n for (const element of elements) {\n if (isString(property)) {\n property = propName(property);\n\n if (isUndefined(value)) {\n return getComputedStyle(element).getPropertyValue(property);\n } else {\n element.style.setProperty(\n property,\n isNumeric(value) && !cssNumber[property] ?\n value + \"px\" :\n value || isNumber(value) ?\n value :\n '',\n priority);\n\n }\n } else if (isArray(property)) {\n const props = {};\n for (const prop of property) {\n props[prop] = css(element, prop);\n }\n return props;\n } else if (isObject(property)) {\n priority = value;\n each(property, (value, property) => css(element, property, value, priority));\n }\n }\n return elements[0];\n }\n\n // https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-setproperty\n const propName = memoize((name) => vendorPropName(name));\n\n function vendorPropName(name) {\n if (startsWith(name, '--')) {\n return name;\n }\n\n name = hyphenate(name);\n\n const { style } = document.documentElement;\n\n if (name in style) {\n return name;\n }\n\n for (const prefix of ['webkit', 'moz']) {\n const prefixedName = \"-\" + prefix + \"-\" + name;\n if (prefixedName in style) {\n return prefixedName;\n }\n }\n }\n\n function addClass(element) {for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {args[_key - 1] = arguments[_key];}\n apply$1(element, args, 'add');\n }\n\n function removeClass(element) {for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {args[_key2 - 1] = arguments[_key2];}\n apply$1(element, args, 'remove');\n }\n\n function removeClasses(element, cls) {\n attr(element, 'class', (value) =>\n (value || '').replace(new RegExp(\"\\\\b\" + cls + \"\\\\b\\\\s?\", 'g'), ''));\n\n }\n\n function replaceClass(element) {\n (arguments.length <= 1 ? undefined : arguments[1]) && removeClass(element, arguments.length <= 1 ? undefined : arguments[1]);\n (arguments.length <= 2 ? undefined : arguments[2]) && addClass(element, arguments.length <= 2 ? undefined : arguments[2]);\n }\n\n function hasClass(element, cls) {\n [cls] = getClasses(cls);\n return !!cls && toNodes(element).some((node) => node.classList.contains(cls));\n }\n\n function toggleClass(element, cls, force) {\n const classes = getClasses(cls);\n\n if (!isUndefined(force)) {\n force = !!force;\n }\n\n for (const node of toNodes(element)) {\n for (const cls of classes) {\n node.classList.toggle(cls, force);\n }\n }\n }\n\n function apply$1(element, args, fn) {\n args = args.reduce((args, arg) => args.concat(getClasses(arg)), []);\n\n for (const node of toNodes(element)) {\n node.classList[fn](...args);\n }\n }\n\n function getClasses(str) {\n return String(str).split(/\\s|,/).filter(Boolean);\n }\n\n function transition$1(element, props, duration, timing) {if (duration === void 0) {duration = 400;}if (timing === void 0) {timing = 'linear';}\n duration = Math.round(duration);\n return Promise.all(\n toNodes(element).map(\n (element) =>\n new Promise((resolve, reject) => {\n for (const name in props) {\n const value = css(element, name);\n if (value === '') {\n css(element, name, value);\n }\n }\n\n const timer = setTimeout(() => trigger(element, 'transitionend'), duration);\n\n once(\n element,\n 'transitionend transitioncanceled',\n (_ref) => {let { type } = _ref;\n clearTimeout(timer);\n removeClass(element, 'uk-transition');\n css(element, {\n transitionProperty: '',\n transitionDuration: '',\n transitionTimingFunction: ''\n });\n type === 'transitioncanceled' ? reject() : resolve(element);\n },\n { self: true });\n\n\n addClass(element, 'uk-transition');\n css(element, {\n transitionProperty: Object.keys(props).map(propName).join(','),\n transitionDuration: duration + \"ms\",\n transitionTimingFunction: timing,\n ...props\n });\n })));\n\n\n }\n\n const Transition = {\n start: transition$1,\n\n async stop(element) {\n trigger(element, 'transitionend');\n await Promise.resolve();\n },\n\n async cancel(element) {\n trigger(element, 'transitioncanceled');\n await Promise.resolve();\n },\n\n inProgress(element) {\n return hasClass(element, 'uk-transition');\n }\n };\n\n const animationPrefix = 'uk-animation-';\n\n function animate$2(element, animation, duration, origin, out) {if (duration === void 0) {duration = 200;}\n return Promise.all(\n toNodes(element).map(\n (element) =>\n new Promise((resolve, reject) => {\n trigger(element, 'animationcanceled');\n const timer = setTimeout(() => trigger(element, 'animationend'), duration);\n\n once(\n element,\n 'animationend animationcanceled',\n (_ref2) => {let { type } = _ref2;\n clearTimeout(timer);\n\n type === 'animationcanceled' ? reject() : resolve(element);\n\n css(element, 'animationDuration', '');\n removeClasses(element, animationPrefix + \"\\\\S*\");\n },\n { self: true });\n\n\n css(element, 'animationDuration', duration + \"ms\");\n addClass(element, animation, animationPrefix + (out ? 'leave' : 'enter'));\n\n if (startsWith(animation, animationPrefix)) {\n origin && addClass(element, \"uk-transform-origin-\" + origin);\n out && addClass(element, animationPrefix + \"reverse\");\n }\n })));\n\n\n }\n\n const inProgressRe = new RegExp(animationPrefix + \"(enter|leave)\");\n\n const Animation = {\n in: animate$2,\n\n out(element, animation, duration, origin) {\n return animate$2(element, animation, duration, origin, true);\n },\n\n inProgress(element) {\n return inProgressRe.test(attr(element, 'class'));\n },\n\n cancel(element) {\n trigger(element, 'animationcanceled');\n }\n };\n\n const dirs$1 = {\n width: ['left', 'right'],\n height: ['top', 'bottom']\n };\n\n function dimensions(element) {\n const rect = isElement(element) ?\n toNode(element).getBoundingClientRect() :\n { height: height(element), width: width(element), top: 0, left: 0 };\n\n return {\n height: rect.height,\n width: rect.width,\n top: rect.top,\n left: rect.left,\n bottom: rect.top + rect.height,\n right: rect.left + rect.width\n };\n }\n\n function offset(element, coordinates) {\n const currentOffset = dimensions(element);\n\n if (element) {\n const { scrollY, scrollX } = toWindow(element);\n const offsetBy = { height: scrollY, width: scrollX };\n\n for (const dir in dirs$1) {\n for (const prop of dirs$1[dir]) {\n currentOffset[prop] += offsetBy[dir];\n }\n }\n }\n\n if (!coordinates) {\n return currentOffset;\n }\n\n const pos = css(element, 'position');\n\n each(css(element, ['left', 'top']), (value, prop) =>\n css(\n element,\n prop,\n coordinates[prop] -\n currentOffset[prop] +\n toFloat(pos === 'absolute' && value === 'auto' ? position(element)[prop] : value)));\n\n\n }\n\n function position(element) {\n let { top, left } = offset(element);\n\n const {\n ownerDocument: { body, documentElement },\n offsetParent\n } = toNode(element);\n let parent = offsetParent || documentElement;\n\n while (\n parent && (\n parent === body || parent === documentElement) &&\n css(parent, 'position') === 'static')\n {\n parent = parent.parentNode;\n }\n\n if (isElement(parent)) {\n const parentOffset = offset(parent);\n top -= parentOffset.top + toFloat(css(parent, 'borderTopWidth'));\n left -= parentOffset.left + toFloat(css(parent, 'borderLeftWidth'));\n }\n\n return {\n top: top - toFloat(css(element, 'marginTop')),\n left: left - toFloat(css(element, 'marginLeft'))\n };\n }\n\n function offsetPosition(element) {\n element = toNode(element);\n\n const offset = [element.offsetTop, element.offsetLeft];\n\n while (element = element.offsetParent) {\n offset[0] += element.offsetTop + toFloat(css(element, \"borderTopWidth\"));\n offset[1] += element.offsetLeft + toFloat(css(element, \"borderLeftWidth\"));\n\n if (css(element, 'position') === 'fixed') {\n const win = toWindow(element);\n offset[0] += win.scrollY;\n offset[1] += win.scrollX;\n return offset;\n }\n }\n\n return offset;\n }\n\n const height = dimension('height');\n const width = dimension('width');\n\n function dimension(prop) {\n const propName = ucfirst(prop);\n return (element, value) => {\n if (isUndefined(value)) {\n if (isWindow(element)) {\n return element[\"inner\" + propName];\n }\n\n if (isDocument(element)) {\n const doc = element.documentElement;\n return Math.max(doc[\"offset\" + propName], doc[\"scroll\" + propName]);\n }\n\n element = toNode(element);\n\n value = css(element, prop);\n value = value === 'auto' ? element[\"offset\" + propName] : toFloat(value) || 0;\n\n return value - boxModelAdjust(element, prop);\n } else {\n return css(\n element,\n prop,\n !value && value !== 0 ? '' : +value + boxModelAdjust(element, prop) + 'px');\n\n }\n };\n }\n\n function boxModelAdjust(element, prop, sizing) {if (sizing === void 0) {sizing = 'border-box';}\n return css(element, 'boxSizing') === sizing ?\n dirs$1[prop].\n map(ucfirst).\n reduce(\n (value, prop) =>\n value +\n toFloat(css(element, \"padding\" + prop)) +\n toFloat(css(element, \"border\" + prop + \"Width\")),\n 0) :\n\n 0;\n }\n\n function flipPosition(pos) {\n for (const dir in dirs$1) {\n for (const i in dirs$1[dir]) {\n if (dirs$1[dir][i] === pos) {\n return dirs$1[dir][1 - i];\n }\n }\n }\n return pos;\n }\n\n function toPx(value, property, element, offsetDim) {if (property === void 0) {property = 'width';}if (element === void 0) {element = window;}if (offsetDim === void 0) {offsetDim = false;}\n if (!isString(value)) {\n return toFloat(value);\n }\n\n return parseCalc(value).reduce((result, value) => {\n const unit = parseUnit(value);\n if (unit) {\n value = percent(\n unit === 'vh' ?\n height(toWindow(element)) :\n unit === 'vw' ?\n width(toWindow(element)) :\n offsetDim ?\n element[\"offset\" + ucfirst(property)] :\n dimensions(element)[property],\n value);\n\n }\n\n return result + toFloat(value);\n }, 0);\n }\n\n const calcRe = /-?\\d+(?:\\.\\d+)?(?:v[wh]|%|px)?/g;\n const parseCalc = memoize((calc) => calc.toString().replace(/\\s/g, '').match(calcRe) || []);\n const unitRe = /(?:v[hw]|%)$/;\n const parseUnit = memoize((str) => (str.match(unitRe) || [])[0]);\n\n function percent(base, value) {\n return base * toFloat(value) / 100;\n }\n\n function ready(fn) {\n if (document.readyState !== 'loading') {\n fn();\n return;\n }\n\n once(document, 'DOMContentLoaded', fn);\n }\n\n function isTag(element, tagName) {var _element$tagName;\n return (element == null ? void 0 : (_element$tagName = element.tagName) == null ? void 0 : _element$tagName.toLowerCase()) === tagName.toLowerCase();\n }\n\n function empty(element) {\n element = $(element);\n element.innerHTML = '';\n return element;\n }\n\n function html(parent, html) {\n return isUndefined(html) ? $(parent).innerHTML : append(empty(parent), html);\n }\n\n const prepend = applyFn('prepend');\n const append = applyFn('append');\n const before = applyFn('before');\n const after = applyFn('after');\n\n function applyFn(fn) {\n return function (ref, element) {var _$;\n const nodes = toNodes(isString(element) ? fragment(element) : element);\n (_$ = $(ref)) == null ? void 0 : _$[fn](...nodes);\n return unwrapSingle(nodes);\n };\n }\n\n function remove$1(element) {\n toNodes(element).forEach((element) => element.remove());\n }\n\n function wrapAll(element, structure) {\n structure = toNode(before(element, structure));\n\n while (structure.firstChild) {\n structure = structure.firstChild;\n }\n\n append(structure, element);\n\n return structure;\n }\n\n function wrapInner(element, structure) {\n return toNodes(\n toNodes(element).map((element) =>\n element.hasChildNodes() ?\n wrapAll(toNodes(element.childNodes), structure) :\n append(element, structure)));\n\n\n }\n\n function unwrap(element) {\n toNodes(element).\n map(parent).\n filter((value, index, self) => self.indexOf(value) === index).\n forEach((parent) => parent.replaceWith(...parent.childNodes));\n }\n\n const fragmentRe = /^\\s*<(\\w+|!)[^>]*>/;\n const singleTagRe = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/;\n\n function fragment(html) {\n const matches = singleTagRe.exec(html);\n if (matches) {\n return document.createElement(matches[1]);\n }\n\n const container = document.createElement('div');\n if (fragmentRe.test(html)) {\n container.insertAdjacentHTML('beforeend', html.trim());\n } else {\n container.textContent = html;\n }\n\n return unwrapSingle(container.childNodes);\n }\n\n function unwrapSingle(nodes) {\n return nodes.length > 1 ? nodes : nodes[0];\n }\n\n function apply(node, fn) {\n if (!isElement(node)) {\n return;\n }\n\n fn(node);\n node = node.firstElementChild;\n while (node) {\n const next = node.nextElementSibling;\n apply(node, fn);\n node = next;\n }\n }\n\n function $(selector, context) {\n return isHtml(selector) ? toNode(fragment(selector)) : find(selector, context);\n }\n\n function $$(selector, context) {\n return isHtml(selector) ? toNodes(fragment(selector)) : findAll(selector, context);\n }\n\n function isHtml(str) {\n return isString(str) && startsWith(str.trim(), '<');\n }\n\n const inBrowser = typeof window !== 'undefined';\n const isRtl = inBrowser && document.dir === 'rtl';\n\n const hasTouch = inBrowser && 'ontouchstart' in window;\n const hasPointerEvents = inBrowser && window.PointerEvent;\n\n const pointerDown = hasPointerEvents ? 'pointerdown' : hasTouch ? 'touchstart' : 'mousedown';\n const pointerMove = hasPointerEvents ? 'pointermove' : hasTouch ? 'touchmove' : 'mousemove';\n const pointerUp = hasPointerEvents ? 'pointerup' : hasTouch ? 'touchend' : 'mouseup';\n const pointerEnter = hasPointerEvents ? 'pointerenter' : hasTouch ? '' : 'mouseenter';\n const pointerLeave = hasPointerEvents ? 'pointerleave' : hasTouch ? '' : 'mouseleave';\n const pointerCancel = hasPointerEvents ? 'pointercancel' : 'touchcancel';\n\n /*\n Based on:\n Copyright (c) 2016 Wilson Page wilsonpage@me.com\n https://github.com/wilsonpage/fastdom\n */\n\n const fastdom = {\n reads: [],\n writes: [],\n\n read(task) {\n this.reads.push(task);\n scheduleFlush();\n return task;\n },\n\n write(task) {\n this.writes.push(task);\n scheduleFlush();\n return task;\n },\n\n clear(task) {\n remove(this.reads, task);\n remove(this.writes, task);\n },\n\n flush\n };\n\n function flush(recursion) {\n runTasks(fastdom.reads);\n runTasks(fastdom.writes.splice(0));\n\n fastdom.scheduled = false;\n\n if (fastdom.reads.length || fastdom.writes.length) {\n scheduleFlush(recursion + 1);\n }\n }\n\n const RECURSION_LIMIT = 4;\n function scheduleFlush(recursion) {\n if (fastdom.scheduled) {\n return;\n }\n\n fastdom.scheduled = true;\n if (recursion && recursion < RECURSION_LIMIT) {\n Promise.resolve().then(() => flush(recursion));\n } else {\n requestAnimationFrame(() => flush(1));\n }\n }\n\n function runTasks(tasks) {\n let task;\n while (task = tasks.shift()) {\n try {\n task();\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n function remove(array, item) {\n const index = array.indexOf(item);\n return ~index && array.splice(index, 1);\n }\n\n function MouseTracker() {}\n\n MouseTracker.prototype = {\n positions: [],\n\n init() {\n this.positions = [];\n\n let position;\n this.unbind = on(document, 'mousemove', (e) => position = getEventPos(e));\n this.interval = setInterval(() => {\n if (!position) {\n return;\n }\n\n this.positions.push(position);\n\n if (this.positions.length > 5) {\n this.positions.shift();\n }\n }, 50);\n },\n\n cancel() {var _this$unbind;\n (_this$unbind = this.unbind) == null ? void 0 : _this$unbind.call(this);\n this.interval && clearInterval(this.interval);\n },\n\n movesTo(target) {\n if (this.positions.length < 2) {\n return false;\n }\n\n const p = target.getBoundingClientRect();\n const { left, right, top, bottom } = p;\n\n const [prevPosition] = this.positions;\n const position = last(this.positions);\n const path = [prevPosition, position];\n\n if (pointInRect(position, p)) {\n return false;\n }\n\n const diagonals = [\n [\n { x: left, y: top },\n { x: right, y: bottom }],\n\n [\n { x: left, y: bottom },\n { x: right, y: top }]];\n\n\n\n return diagonals.some((diagonal) => {\n const intersection = intersect(path, diagonal);\n return intersection && pointInRect(intersection, p);\n });\n }\n };\n\n // Inspired by http://paulbourke.net/geometry/pointlineplane/\n function intersect(_ref, _ref2) {let [{ x: x1, y: y1 }, { x: x2, y: y2 }] = _ref;let [{ x: x3, y: y3 }, { x: x4, y: y4 }] = _ref2;\n const denominator = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);\n\n // Lines are parallel\n if (denominator === 0) {\n return false;\n }\n\n const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator;\n\n if (ua < 0) {\n return false;\n }\n\n // Return an object with the x and y coordinates of the intersection\n return { x: x1 + ua * (x2 - x1), y: y1 + ua * (y2 - y1) };\n }\n\n function observeIntersection(targets, cb, options, intersecting) {if (intersecting === void 0) {intersecting = true;}\n const observer = new IntersectionObserver(\n intersecting ?\n (entries, observer) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n cb(entries, observer);\n }\n } :\n cb,\n options);\n\n for (const el of toNodes(targets)) {\n observer.observe(el);\n }\n\n return observer;\n }\n\n const hasResizeObserver = inBrowser && window.ResizeObserver;\n function observeResize(targets, cb, options) {if (options === void 0) {options = { box: 'border-box' };}\n if (hasResizeObserver) {\n return observe(ResizeObserver, targets, cb, options);\n }\n\n // Fallback Safari < 13.1\n initResizeListener();\n listeners.add(cb);\n\n return {\n disconnect() {\n listeners.delete(cb);\n }\n };\n }\n\n let listeners;\n function initResizeListener() {\n if (listeners) {\n return;\n }\n\n listeners = new Set();\n\n // throttle 'resize'\n let pendingResize;\n const handleResize = () => {\n if (pendingResize) {\n return;\n }\n pendingResize = true;\n requestAnimationFrame(() => pendingResize = false);\n for (const listener of listeners) {\n listener();\n }\n };\n\n on(window, 'load resize', handleResize);\n on(document, 'loadedmetadata load', handleResize, true);\n }\n\n function observeMutation(targets, cb, options) {\n return observe(MutationObserver, targets, cb, options);\n }\n\n function observe(Observer, targets, cb, options) {\n const observer = new Observer(cb);\n for (const el of toNodes(targets)) {\n observer.observe(el, options);\n }\n\n return observer;\n }\n\n const strats = {};\n\n strats.events =\n strats.created =\n strats.beforeConnect =\n strats.connected =\n strats.beforeDisconnect =\n strats.disconnected =\n strats.destroy =\n concatStrat;\n\n // args strategy\n strats.args = function (parentVal, childVal) {\n return childVal !== false && concatStrat(childVal || parentVal);\n };\n\n // update strategy\n strats.update = function (parentVal, childVal) {\n return sortBy$1(\n concatStrat(parentVal, isFunction(childVal) ? { read: childVal } : childVal),\n 'order');\n\n };\n\n // property strategy\n strats.props = function (parentVal, childVal) {\n if (isArray(childVal)) {\n const value = {};\n for (const key of childVal) {\n value[key] = String;\n }\n childVal = value;\n }\n\n return strats.methods(parentVal, childVal);\n };\n\n // extend strategy\n strats.computed = strats.methods = function (parentVal, childVal) {\n return childVal ? parentVal ? { ...parentVal, ...childVal } : childVal : parentVal;\n };\n\n // data strategy\n strats.data = function (parentVal, childVal, vm) {\n if (!vm) {\n if (!childVal) {\n return parentVal;\n }\n\n if (!parentVal) {\n return childVal;\n }\n\n return function (vm) {\n return mergeFnData(parentVal, childVal, vm);\n };\n }\n\n return mergeFnData(parentVal, childVal, vm);\n };\n\n function mergeFnData(parentVal, childVal, vm) {\n return strats.computed(\n isFunction(parentVal) ? parentVal.call(vm, vm) : parentVal,\n isFunction(childVal) ? childVal.call(vm, vm) : childVal);\n\n }\n\n // concat strategy\n function concatStrat(parentVal, childVal) {\n parentVal = parentVal && !isArray(parentVal) ? [parentVal] : parentVal;\n\n return childVal ?\n parentVal ?\n parentVal.concat(childVal) :\n isArray(childVal) ?\n childVal :\n [childVal] :\n parentVal;\n }\n\n // default strategy\n function defaultStrat(parentVal, childVal) {\n return isUndefined(childVal) ? parentVal : childVal;\n }\n\n function mergeOptions(parent, child, vm) {\n const options = {};\n\n if (isFunction(child)) {\n child = child.options;\n }\n\n if (child.extends) {\n parent = mergeOptions(parent, child.extends, vm);\n }\n\n if (child.mixins) {\n for (const mixin of child.mixins) {\n parent = mergeOptions(parent, mixin, vm);\n }\n }\n\n for (const key in parent) {\n mergeKey(key);\n }\n\n for (const key in child) {\n if (!hasOwn(parent, key)) {\n mergeKey(key);\n }\n }\n\n function mergeKey(key) {\n options[key] = (strats[key] || defaultStrat)(parent[key], child[key], vm);\n }\n\n return options;\n }\n\n function parseOptions(options, args) {if (args === void 0) {args = [];}\n try {\n return options ?\n startsWith(options, '{') ?\n JSON.parse(options) :\n args.length && !includes(options, ':') ?\n { [args[0]]: options } :\n options.split(';').reduce((options, option) => {\n const [key, value] = option.split(/:(.*)/);\n if (key && !isUndefined(value)) {\n options[key.trim()] = value.trim();\n }\n return options;\n }, {}) :\n {};\n } catch (e) {\n return {};\n }\n }\n\n function play(el) {\n if (isIFrame(el)) {\n call(el, { func: 'playVideo', method: 'play' });\n }\n\n if (isHTML5(el)) {\n try {\n el.play().catch(noop);\n } catch (e) {\n\n // noop\n }}\n }\n\n function pause(el) {\n if (isIFrame(el)) {\n call(el, { func: 'pauseVideo', method: 'pause' });\n }\n\n if (isHTML5(el)) {\n el.pause();\n }\n }\n\n function mute(el) {\n if (isIFrame(el)) {\n call(el, { func: 'mute', method: 'setVolume', value: 0 });\n }\n\n if (isHTML5(el)) {\n el.muted = true;\n }\n }\n\n function isVideo(el) {\n return isHTML5(el) || isIFrame(el);\n }\n\n function isHTML5(el) {\n return isTag(el, 'video');\n }\n\n function isIFrame(el) {\n return isTag(el, 'iframe') && (isYoutube(el) || isVimeo(el));\n }\n\n function isYoutube(el) {\n return !!el.src.match(\n /\\/\\/.*?youtube(-nocookie)?\\.[a-z]+\\/(watch\\?v=[^&\\s]+|embed)|youtu\\.be\\/.*/);\n\n }\n\n function isVimeo(el) {\n return !!el.src.match(/vimeo\\.com\\/video\\/.*/);\n }\n\n async function call(el, cmd) {\n await enableApi(el);\n post(el, cmd);\n }\n\n function post(el, cmd) {\n try {\n el.contentWindow.postMessage(JSON.stringify({ event: 'command', ...cmd }), '*');\n } catch (e) {\n\n // noop\n }}\n\n const stateKey = '_ukPlayer';\n let counter = 0;\n function enableApi(el) {\n if (el[stateKey]) {\n return el[stateKey];\n }\n\n const youtube = isYoutube(el);\n const vimeo = isVimeo(el);\n\n const id = ++counter;\n let poller;\n\n return el[stateKey] = new Promise((resolve) => {\n youtube &&\n once(el, 'load', () => {\n const listener = () => post(el, { event: 'listening', id });\n poller = setInterval(listener, 100);\n listener();\n });\n\n once(window, 'message', resolve, false, (_ref) => {let { data } = _ref;\n try {\n data = JSON.parse(data);\n return (\n data && (\n youtube && data.id === id && data.event === 'onReady' ||\n vimeo && Number(data.player_id) === id));\n\n } catch (e) {\n\n // noop\n }});\n\n el.src = \"\" + el.src + (includes(el.src, '?') ? '&' : '?') + (\n youtube ? 'enablejsapi=1' : \"api=1&player_id=\" + id);\n\n }).then(() => clearInterval(poller));\n }\n\n function isInView(element, offsetTop, offsetLeft) {if (offsetTop === void 0) {offsetTop = 0;}if (offsetLeft === void 0) {offsetLeft = 0;}\n if (!isVisible(element)) {\n return false;\n }\n\n return intersectRect(\n ...scrollParents(element).\n map((parent) => {\n const { top, left, bottom, right } = offsetViewport(parent);\n\n return {\n top: top - offsetTop,\n left: left - offsetLeft,\n bottom: bottom + offsetTop,\n right: right + offsetLeft\n };\n }).\n concat(offset(element)));\n\n }\n\n function scrollIntoView(element, _temp) {let { offset: offsetBy = 0 } = _temp === void 0 ? {} : _temp;\n const parents = isVisible(element) ? scrollParents(element) : [];\n return parents.reduce(\n (fn, scrollElement, i) => {\n const { scrollTop, scrollHeight, offsetHeight } = scrollElement;\n const viewport = offsetViewport(scrollElement);\n const maxScroll = scrollHeight - viewport.height;\n const { height: elHeight, top: elTop } = parents[i - 1] ?\n offsetViewport(parents[i - 1]) :\n offset(element);\n\n let top = Math.ceil(elTop - viewport.top - offsetBy + scrollTop);\n\n if (offsetBy > 0 && offsetHeight < elHeight + offsetBy) {\n top += offsetBy;\n } else {\n offsetBy = 0;\n }\n\n if (top > maxScroll) {\n offsetBy -= top - maxScroll;\n top = maxScroll;\n } else if (top < 0) {\n offsetBy -= top;\n top = 0;\n }\n\n return () => scrollTo(scrollElement, top - scrollTop).then(fn);\n },\n () => Promise.resolve())();\n\n\n function scrollTo(element, top) {\n return new Promise((resolve) => {\n const scroll = element.scrollTop;\n const duration = getDuration(Math.abs(top));\n const start = Date.now();\n\n (function step() {\n const percent = ease(clamp((Date.now() - start) / duration));\n\n element.scrollTop = scroll + top * percent;\n\n // scroll more if we have not reached our destination\n if (percent === 1) {\n resolve();\n } else {\n requestAnimationFrame(step);\n }\n })();\n });\n }\n\n function getDuration(dist) {\n return 40 * Math.pow(dist, 0.375);\n }\n\n function ease(k) {\n return 0.5 * (1 - Math.cos(Math.PI * k));\n }\n }\n\n function scrolledOver(element, startOffset, endOffset) {if (startOffset === void 0) {startOffset = 0;}if (endOffset === void 0) {endOffset = 0;}\n if (!isVisible(element)) {\n return 0;\n }\n\n const [scrollElement] = scrollParents(element, /auto|scroll/, true);\n const { scrollHeight, scrollTop } = scrollElement;\n const { height: viewportHeight } = offsetViewport(scrollElement);\n const maxScroll = scrollHeight - viewportHeight;\n const elementOffsetTop = offsetPosition(element)[0] - offsetPosition(scrollElement)[0];\n\n const start = Math.max(0, elementOffsetTop - viewportHeight + startOffset);\n const end = Math.min(maxScroll, elementOffsetTop + element.offsetHeight - endOffset);\n\n return clamp((scrollTop - start) / (end - start));\n }\n\n function scrollParents(element, overflowRe, scrollable) {if (overflowRe === void 0) {overflowRe = /auto|scroll|hidden|clip/;}if (scrollable === void 0) {scrollable = false;}\n const scrollEl = scrollingElement(element);\n\n let ancestors = parents(element).reverse();\n ancestors = ancestors.slice(ancestors.indexOf(scrollEl) + 1);\n\n const fixedIndex = findIndex(ancestors, (el) => css(el, 'position') === 'fixed');\n if (~fixedIndex) {\n ancestors = ancestors.slice(fixedIndex);\n }\n\n return [scrollEl].\n concat(\n ancestors.filter(\n (parent) =>\n overflowRe.test(css(parent, 'overflow')) && (\n !scrollable || parent.scrollHeight > offsetViewport(parent).height))).\n\n\n reverse();\n }\n\n function offsetViewport(scrollElement) {\n const window = toWindow(scrollElement);\n const {\n document: { documentElement }\n } = window;\n let viewportElement =\n scrollElement === scrollingElement(scrollElement) ? window : scrollElement;\n\n const { visualViewport } = window;\n if (isWindow(viewportElement) && visualViewport) {\n let { height, width, scale, pageTop: top, pageLeft: left } = visualViewport;\n height = Math.round(height * scale);\n width = Math.round(width * scale);\n return { height, width, top, left, bottom: top + height, right: left + width };\n }\n\n let rect = offset(viewportElement);\n for (let [prop, dir, start, end] of [\n ['width', 'x', 'left', 'right'],\n ['height', 'y', 'top', 'bottom']])\n {\n if (isWindow(viewportElement)) {\n // iOS 12 returns as scrollingElement\n viewportElement = documentElement;\n } else {\n rect[start] += toFloat(css(viewportElement, \"border-\" + start + \"-width\"));\n }\n rect[prop] = rect[dir] = viewportElement[\"client\" + ucfirst(prop)];\n rect[end] = rect[prop] + rect[start];\n }\n return rect;\n }\n\n function scrollingElement(element) {\n return toWindow(element).document.scrollingElement;\n }\n\n const dirs = [\n ['width', 'x', 'left', 'right'],\n ['height', 'y', 'top', 'bottom']];\n\n\n function positionAt(element, target, options) {\n options = {\n attach: {\n element: ['left', 'top'],\n target: ['left', 'top'],\n ...options.attach\n },\n offset: [0, 0],\n placement: [],\n ...options\n };\n\n if (!isArray(target)) {\n target = [target, target];\n }\n\n offset(element, getPosition(element, target, options));\n }\n\n function getPosition(element, target, options) {\n const position = attachTo(element, target, options);\n const { boundary, viewportOffset = 0, placement } = options;\n\n let offsetPosition = position;\n for (const [i, [prop,, start, end]] of Object.entries(dirs)) {\n const viewport = getViewport$2(element, target[i], viewportOffset, boundary, i);\n\n if (isWithin(position, viewport, i)) {\n continue;\n }\n\n let offsetBy = 0;\n\n // Flip\n if (placement[i] === 'flip') {\n const attach = options.attach.target[i];\n if (\n attach === end && position[end] <= viewport[end] ||\n attach === start && position[start] >= viewport[start])\n {\n continue;\n }\n\n offsetBy = flip(element, target, options, i)[start] - position[start];\n\n const scrollArea = getScrollArea(element, target[i], viewportOffset, i);\n\n if (!isWithin(applyOffset(position, offsetBy, i), scrollArea, i)) {\n if (isWithin(position, scrollArea, i)) {\n continue;\n }\n\n if (options.recursion) {\n return false;\n }\n\n const newPos = flipAxis(element, target, options);\n\n if (newPos && isWithin(newPos, scrollArea, 1 - i)) {\n return newPos;\n }\n\n continue;\n }\n\n // Shift\n } else if (placement[i] === 'shift') {\n const targetDim = offset(target[i]);\n const { offset: elOffset } = options;\n offsetBy =\n clamp(\n clamp(position[start], viewport[start], viewport[end] - position[prop]),\n targetDim[start] - position[prop] + elOffset[i],\n targetDim[end] - elOffset[i]) -\n position[start];\n }\n\n offsetPosition = applyOffset(offsetPosition, offsetBy, i);\n }\n\n return offsetPosition;\n }\n\n function attachTo(element, target, options) {\n let { attach, offset: offsetBy } = {\n attach: {\n element: ['left', 'top'],\n target: ['left', 'top'],\n ...options.attach\n },\n offset: [0, 0],\n ...options\n };\n\n let elOffset = offset(element);\n\n for (const [i, [prop,, start, end]] of Object.entries(dirs)) {\n const targetOffset =\n attach.target[i] === attach.element[i] ? offsetViewport(target[i]) : offset(target[i]);\n\n elOffset = applyOffset(\n elOffset,\n targetOffset[start] -\n elOffset[start] +\n moveBy(attach.target[i], end, targetOffset[prop]) -\n moveBy(attach.element[i], end, elOffset[prop]) +\n +offsetBy[i],\n i);\n\n }\n return elOffset;\n }\n\n function applyOffset(position, offset, i) {\n const [, dir, start, end] = dirs[i];\n const newPos = { ...position };\n newPos[start] = position[dir] = position[start] + offset;\n newPos[end] += offset;\n return newPos;\n }\n\n function moveBy(attach, end, dim) {\n return attach === 'center' ? dim / 2 : attach === end ? dim : 0;\n }\n\n function getViewport$2(element, target, viewportOffset, boundary, i) {\n let viewport = getIntersectionArea(...commonScrollParents(element, target).map(offsetViewport));\n\n if (viewportOffset) {\n viewport[dirs[i][2]] += viewportOffset;\n viewport[dirs[i][3]] -= viewportOffset;\n }\n\n if (boundary) {\n viewport = getIntersectionArea(\n viewport,\n offset(isArray(boundary) ? boundary[i] : boundary));\n\n }\n\n return viewport;\n }\n\n function getScrollArea(element, target, viewportOffset, i) {\n const [prop,, start, end] = dirs[i];\n const [scrollElement] = commonScrollParents(element, target);\n const viewport = offsetViewport(scrollElement);\n viewport[start] -= scrollElement[\"scroll\" + ucfirst(start)] - viewportOffset;\n viewport[end] = viewport[start] + scrollElement[\"scroll\" + ucfirst(prop)] - viewportOffset;\n return viewport;\n }\n\n function commonScrollParents(element, target) {\n return scrollParents(target).filter((parent) => within(element, parent));\n }\n\n function getIntersectionArea() {\n let area = {};for (var _len = arguments.length, rects = new Array(_len), _key = 0; _key < _len; _key++) {rects[_key] = arguments[_key];}\n for (const rect of rects) {\n for (const [,, start, end] of dirs) {\n area[start] = Math.max(area[start] || 0, rect[start]);\n area[end] = Math.min(...[area[end], rect[end]].filter(Boolean));\n }\n }\n return area;\n }\n\n function isWithin(positionA, positionB, i) {\n const [,, start, end] = dirs[i];\n return positionA[start] >= positionB[start] && positionA[end] <= positionB[end];\n }\n\n function flip(element, target, _ref, i) {let { offset, attach } = _ref;\n return attachTo(element, target, {\n attach: {\n element: flipAttach(attach.element, i),\n target: flipAttach(attach.target, i)\n },\n offset: flipOffset(offset, i)\n });\n }\n\n function flipAxis(element, target, options) {\n return getPosition(element, target, {\n ...options,\n attach: {\n element: options.attach.element.map(flipAttachAxis).reverse(),\n target: options.attach.target.map(flipAttachAxis).reverse()\n },\n offset: options.offset.reverse(),\n placement: options.placement.reverse(),\n recursion: true\n });\n }\n\n function flipAttach(attach, i) {\n const newAttach = [...attach];\n const index = dirs[i].indexOf(attach[i]);\n if (~index) {\n newAttach[i] = dirs[i][1 - index % 2 + 2];\n }\n return newAttach;\n }\n\n function flipAttachAxis(prop) {\n for (let i = 0; i < dirs.length; i++) {\n const index = dirs[i].indexOf(prop);\n if (~index) {\n return dirs[1 - i][index % 2 + 2];\n }\n }\n }\n\n function flipOffset(offset, i) {\n offset = [...offset];\n offset[i] *= -1;\n return offset;\n }\n\n var util = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ajax: ajax,\n getImage: getImage,\n Transition: Transition,\n Animation: Animation,\n attr: attr,\n hasAttr: hasAttr,\n removeAttr: removeAttr,\n data: data,\n addClass: addClass,\n removeClass: removeClass,\n removeClasses: removeClasses,\n replaceClass: replaceClass,\n hasClass: hasClass,\n toggleClass: toggleClass,\n dimensions: dimensions,\n offset: offset,\n position: position,\n offsetPosition: offsetPosition,\n height: height,\n width: width,\n boxModelAdjust: boxModelAdjust,\n flipPosition: flipPosition,\n toPx: toPx,\n ready: ready,\n isTag: isTag,\n empty: empty,\n html: html,\n prepend: prepend,\n append: append,\n before: before,\n after: after,\n remove: remove$1,\n wrapAll: wrapAll,\n wrapInner: wrapInner,\n unwrap: unwrap,\n fragment: fragment,\n apply: apply,\n $: $,\n $$: $$,\n inBrowser: inBrowser,\n isRtl: isRtl,\n hasTouch: hasTouch,\n pointerDown: pointerDown,\n pointerMove: pointerMove,\n pointerUp: pointerUp,\n pointerEnter: pointerEnter,\n pointerLeave: pointerLeave,\n pointerCancel: pointerCancel,\n on: on,\n off: off,\n once: once,\n trigger: trigger,\n createEvent: createEvent,\n toEventTargets: toEventTargets,\n isTouch: isTouch,\n getEventPos: getEventPos,\n fastdom: fastdom,\n isVoidElement: isVoidElement,\n isVisible: isVisible,\n selInput: selInput,\n isInput: isInput,\n selFocusable: selFocusable,\n isFocusable: isFocusable,\n parent: parent,\n filter: filter,\n matches: matches,\n closest: closest,\n within: within,\n parents: parents,\n children: children,\n index: index,\n hasOwn: hasOwn,\n hyphenate: hyphenate,\n camelize: camelize,\n ucfirst: ucfirst,\n startsWith: startsWith,\n endsWith: endsWith,\n includes: includes,\n findIndex: findIndex,\n isArray: isArray,\n toArray: toArray,\n assign: assign,\n isFunction: isFunction,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isWindow: isWindow,\n isDocument: isDocument,\n isNode: isNode,\n isElement: isElement,\n isBoolean: isBoolean,\n isString: isString,\n isNumber: isNumber,\n isNumeric: isNumeric,\n isEmpty: isEmpty,\n isUndefined: isUndefined,\n toBoolean: toBoolean,\n toNumber: toNumber,\n toFloat: toFloat,\n toNode: toNode,\n toNodes: toNodes,\n toWindow: toWindow,\n isEqual: isEqual,\n swap: swap,\n last: last,\n each: each,\n sortBy: sortBy$1,\n uniqueBy: uniqueBy,\n clamp: clamp,\n noop: noop,\n intersectRect: intersectRect,\n pointInRect: pointInRect,\n Dimensions: Dimensions,\n getIndex: getIndex,\n memoize: memoize,\n Deferred: Deferred,\n MouseTracker: MouseTracker,\n observeIntersection: observeIntersection,\n observeResize: observeResize,\n observeMutation: observeMutation,\n mergeOptions: mergeOptions,\n parseOptions: parseOptions,\n play: play,\n pause: pause,\n mute: mute,\n isVideo: isVideo,\n positionAt: positionAt,\n query: query,\n queryAll: queryAll,\n find: find,\n findAll: findAll,\n escape: escape,\n css: css,\n propName: propName,\n isInView: isInView,\n scrollIntoView: scrollIntoView,\n scrolledOver: scrolledOver,\n scrollParents: scrollParents,\n offsetViewport: offsetViewport\n });\n\n function globalAPI (UIkit) {\n const DATA = UIkit.data;\n\n UIkit.use = function (plugin) {\n if (plugin.installed) {\n return;\n }\n\n plugin.call(null, this);\n plugin.installed = true;\n\n return this;\n };\n\n UIkit.mixin = function (mixin, component) {\n component = (isString(component) ? UIkit.component(component) : component) || this;\n component.options = mergeOptions(component.options, mixin);\n };\n\n UIkit.extend = function (options) {\n options = options || {};\n\n const Super = this;\n const Sub = function UIkitComponent(options) {\n this._init(options);\n };\n\n Sub.prototype = Object.create(Super.prototype);\n Sub.prototype.constructor = Sub;\n Sub.options = mergeOptions(Super.options, options);\n\n Sub.super = Super;\n Sub.extend = Super.extend;\n\n return Sub;\n };\n\n UIkit.update = function (element, e) {\n element = element ? toNode(element) : document.body;\n\n for (const parentEl of parents(element).reverse()) {\n update(parentEl[DATA], e);\n }\n\n apply(element, (element) => update(element[DATA], e));\n };\n\n let container;\n Object.defineProperty(UIkit, 'container', {\n get() {\n return container || document.body;\n },\n\n set(element) {\n container = $(element);\n }\n });\n\n function update(data, e) {\n if (!data) {\n return;\n }\n\n for (const name in data) {\n if (data[name]._connected) {\n data[name]._callUpdate(e);\n }\n }\n }\n }\n\n function hooksAPI (UIkit) {\n UIkit.prototype._callHook = function (hook) {var _this$$options$hook;\n (_this$$options$hook = this.$options[hook]) == null ? void 0 : _this$$options$hook.forEach((handler) => handler.call(this));\n };\n\n UIkit.prototype._callConnected = function () {\n if (this._connected) {\n return;\n }\n\n this._data = {};\n this._computed = {};\n\n this._initProps();\n\n this._callHook('beforeConnect');\n this._connected = true;\n\n this._initEvents();\n this._initObservers();\n\n this._callHook('connected');\n this._callUpdate();\n };\n\n UIkit.prototype._callDisconnected = function () {\n if (!this._connected) {\n return;\n }\n\n this._callHook('beforeDisconnect');\n this._disconnectObservers();\n this._unbindEvents();\n this._callHook('disconnected');\n\n this._connected = false;\n delete this._watch;\n };\n\n UIkit.prototype._callUpdate = function (e) {if (e === void 0) {e = 'update';}\n if (!this._connected) {\n return;\n }\n\n if (e === 'update' || e === 'resize') {\n this._callWatches();\n }\n\n if (!this.$options.update) {\n return;\n }\n\n if (!this._updates) {\n this._updates = new Set();\n fastdom.read(() => {\n if (this._connected) {\n runUpdates.call(this, this._updates);\n }\n delete this._updates;\n });\n }\n\n this._updates.add(e.type || e);\n };\n\n UIkit.prototype._callWatches = function () {\n if (this._watch) {\n return;\n }\n\n const initial = !hasOwn(this, '_watch');\n\n this._watch = fastdom.read(() => {\n if (this._connected) {\n runWatches.call(this, initial);\n }\n this._watch = null;\n });\n };\n\n function runUpdates(types) {\n for (const { read, write, events = [] } of this.$options.update) {\n if (!types.has('update') && !events.some((type) => types.has(type))) {\n continue;\n }\n\n let result;\n if (read) {\n result = read.call(this, this._data, types);\n\n if (result && isPlainObject(result)) {\n assign(this._data, result);\n }\n }\n\n if (write && result !== false) {\n fastdom.write(() => {\n if (this._connected) {\n write.call(this, this._data, types);\n }\n });\n }\n }\n }\n\n function runWatches(initial) {\n const {\n $options: { computed }\n } = this;\n const values = { ...this._computed };\n this._computed = {};\n\n for (const key in computed) {\n const { watch, immediate } = computed[key];\n if (\n watch && (\n initial && immediate ||\n hasOwn(values, key) && !isEqual(values[key], this[key])))\n {\n watch.call(this, this[key], values[key]);\n }\n }\n }\n }\n\n function stateAPI (UIkit) {\n let uid = 0;\n\n UIkit.prototype._init = function (options) {\n options = options || {};\n options.data = normalizeData(options, this.constructor.options);\n\n this.$options = mergeOptions(this.constructor.options, options, this);\n this.$el = null;\n this.$props = {};\n\n this._uid = uid++;\n this._initData();\n this._initMethods();\n this._initComputeds();\n this._callHook('created');\n\n if (options.el) {\n this.$mount(options.el);\n }\n };\n\n UIkit.prototype._initData = function () {\n const { data = {} } = this.$options;\n\n for (const key in data) {\n this.$props[key] = this[key] = data[key];\n }\n };\n\n UIkit.prototype._initMethods = function () {\n const { methods } = this.$options;\n\n if (methods) {\n for (const key in methods) {\n this[key] = methods[key].bind(this);\n }\n }\n };\n\n UIkit.prototype._initComputeds = function () {\n const { computed } = this.$options;\n\n this._computed = {};\n\n if (computed) {\n for (const key in computed) {\n registerComputed(this, key, computed[key]);\n }\n }\n };\n\n UIkit.prototype._initProps = function (props) {\n let key;\n\n props = props || getProps(this.$options);\n\n for (key in props) {\n if (!isUndefined(props[key])) {\n this.$props[key] = props[key];\n }\n }\n\n const exclude = [this.$options.computed, this.$options.methods];\n for (key in this.$props) {\n if (key in props && notIn(exclude, key)) {\n this[key] = this.$props[key];\n }\n }\n };\n\n UIkit.prototype._initEvents = function () {\n this._events = [];\n for (const event of this.$options.events || []) {\n if (hasOwn(event, 'handler')) {\n registerEvent(this, event);\n } else {\n for (const key in event) {\n registerEvent(this, event[key], key);\n }\n }\n }\n };\n\n UIkit.prototype._unbindEvents = function () {\n this._events.forEach((unbind) => unbind());\n delete this._events;\n };\n\n UIkit.prototype._initObservers = function () {\n this._observers = [initPropsObserver(this), initChildListObserver(this)];\n };\n\n UIkit.prototype.registerObserver = function () {\n this._observers.push(...arguments);\n };\n\n UIkit.prototype._disconnectObservers = function () {\n this._observers.forEach((observer) => observer == null ? void 0 : observer.disconnect());\n };\n }\n\n function getProps(opts) {\n const data$1 = {};\n const { args = [], props = {}, el, id } = opts;\n\n if (!props) {\n return data$1;\n }\n\n for (const key in props) {\n const prop = hyphenate(key);\n let value = data(el, prop);\n\n if (isUndefined(value)) {\n continue;\n }\n\n value = props[key] === Boolean && value === '' ? true : coerce$1(props[key], value);\n\n if (prop === 'target' && startsWith(value, '_')) {\n continue;\n }\n\n data$1[key] = value;\n }\n\n const options = parseOptions(data(el, id), args);\n\n for (const key in options) {\n const prop = camelize(key);\n if (!isUndefined(props[prop])) {\n data$1[prop] = coerce$1(props[prop], options[key]);\n }\n }\n\n return data$1;\n }\n\n function registerComputed(component, key, cb) {\n Object.defineProperty(component, key, {\n enumerable: true,\n\n get() {\n const { _computed, $props, $el } = component;\n\n if (!hasOwn(_computed, key)) {\n _computed[key] = (cb.get || cb).call(component, $props, $el);\n }\n\n return _computed[key];\n },\n\n set(value) {\n const { _computed } = component;\n\n _computed[key] = cb.set ? cb.set.call(component, value) : value;\n\n if (isUndefined(_computed[key])) {\n delete _computed[key];\n }\n }\n });\n }\n\n function registerEvent(component, event, key) {\n if (!isPlainObject(event)) {\n event = { name: key, handler: event };\n }\n\n let { name, el, handler, capture, passive, delegate, filter, self } = event;\n el = isFunction(el) ? el.call(component) : el || component.$el;\n\n if (isArray(el)) {\n el.forEach((el) => registerEvent(component, { ...event, el }, key));\n return;\n }\n\n if (!el || filter && !filter.call(component)) {\n return;\n }\n\n component._events.push(\n on(\n el,\n name,\n delegate ? isString(delegate) ? delegate : delegate.call(component) : null,\n isString(handler) ? component[handler] : handler.bind(component),\n { passive, capture, self }));\n\n\n }\n\n function notIn(options, key) {\n return options.every((arr) => !arr || !hasOwn(arr, key));\n }\n\n function coerce$1(type, value) {\n if (type === Boolean) {\n return toBoolean(value);\n } else if (type === Number) {\n return toNumber(value);\n } else if (type === 'list') {\n return toList(value);\n }\n\n return type ? type(value) : value;\n }\n\n function toList(value) {\n return isArray(value) ?\n value :\n isString(value) ?\n value.\n split(/,(?![^(]*\\))/).\n map((value) => isNumeric(value) ? toNumber(value) : toBoolean(value.trim())) :\n [value];\n }\n\n function normalizeData(_ref, _ref2) {let { data = {} } = _ref;let { args = [], props = {} } = _ref2;\n if (isArray(data)) {\n data = data.slice(0, args.length).reduce((data, value, index) => {\n if (isPlainObject(value)) {\n assign(data, value);\n } else {\n data[args[index]] = value;\n }\n return data;\n }, {});\n }\n\n for (const key in data) {\n if (isUndefined(data[key])) {\n delete data[key];\n } else if (props[key]) {\n data[key] = coerce$1(props[key], data[key]);\n }\n }\n\n return data;\n }\n\n function initChildListObserver(component) {\n let { el, computed } = component.$options;\n\n if (!computed) {\n return;\n }\n\n for (const key in computed) {\n if (computed[key].document) {\n el = el.ownerDocument;\n break;\n }\n }\n\n const observer = new MutationObserver(() => component._callWatches());\n observer.observe(el, {\n childList: true,\n subtree: true\n });\n\n return observer;\n }\n\n function initPropsObserver(component) {\n const { $options, $props } = component;\n const { id, attrs, props, el } = $options;\n\n if (!props || attrs === false) {\n return;\n }\n\n const attributes = isArray(attrs) ? attrs : Object.keys(props);\n const filter = attributes.map((key) => hyphenate(key)).concat(id);\n\n const observer = new MutationObserver((records) => {\n const data = getProps($options);\n if (\n records.some((_ref3) => {let { attributeName } = _ref3;\n const prop = attributeName.replace('data-', '');\n return (prop === id ? attributes : [camelize(prop), camelize(attributeName)]).some(\n (prop) => !isUndefined(data[prop]) && data[prop] !== $props[prop]);\n\n }))\n {\n component.$reset();\n }\n });\n\n observer.observe(el, {\n attributes: true,\n attributeFilter: filter.concat(filter.map((key) => \"data-\" + key))\n });\n\n return observer;\n }\n\n function instanceAPI (UIkit) {\n const DATA = UIkit.data;\n\n UIkit.prototype.$create = function (component, element, data) {\n return UIkit[component](element, data);\n };\n\n UIkit.prototype.$mount = function (el) {\n const { name } = this.$options;\n\n if (!el[DATA]) {\n el[DATA] = {};\n }\n\n if (el[DATA][name]) {\n return;\n }\n\n el[DATA][name] = this;\n\n this.$el = this.$options.el = this.$options.el || el;\n\n if (within(el, document)) {\n this._callConnected();\n }\n };\n\n UIkit.prototype.$reset = function () {\n this._callDisconnected();\n this._callConnected();\n };\n\n UIkit.prototype.$destroy = function (removeEl) {if (removeEl === void 0) {removeEl = false;}\n const { el, name } = this.$options;\n\n if (el) {\n this._callDisconnected();\n }\n\n this._callHook('destroy');\n\n if (!(el != null && el[DATA])) {\n return;\n }\n\n delete el[DATA][name];\n\n if (!isEmpty(el[DATA])) {\n delete el[DATA];\n }\n\n if (removeEl) {\n remove$1(this.$el);\n }\n };\n\n UIkit.prototype.$emit = function (e) {\n this._callUpdate(e);\n };\n\n UIkit.prototype.$update = function (element, e) {if (element === void 0) {element = this.$el;}\n UIkit.update(element, e);\n };\n\n UIkit.prototype.$getComponent = UIkit.getComponent;\n\n Object.defineProperty(\n UIkit.prototype,\n '$container',\n Object.getOwnPropertyDescriptor(UIkit, 'container'));\n\n }\n\n const components$2 = {};\n function componentAPI (UIkit) {\n const { data: DATA, prefix: PREFIX } = UIkit;\n\n UIkit.component = function (name, options) {\n name = hyphenate(name);\n const id = PREFIX + name;\n\n if (!options) {\n if (isPlainObject(components$2[id])) {\n components$2[id] = components$2[\"data-\" + id] = UIkit.extend(components$2[id]);\n }\n\n return components$2[id];\n }\n\n name = camelize(name);\n\n UIkit[name] = function (element, data) {\n const component = UIkit.component(name);\n\n return component.options.functional ?\n new component({ data: isPlainObject(element) ? element : [...arguments] }) :\n element ?\n $$(element).map(init)[0] :\n init();\n\n function init(element) {\n const instance = UIkit.getComponent(element, name);\n\n if (instance) {\n if (data) {\n instance.$destroy();\n } else {\n return instance;\n }\n }\n\n return new component({ el: element, data });\n }\n };\n\n const opt = isPlainObject(options) ? { ...options } : options.options;\n\n opt.id = id;\n opt.name = name;\n\n opt.install == null ? void 0 : opt.install(UIkit, opt, name);\n\n if (UIkit._initialized && !opt.functional) {\n requestAnimationFrame(() => UIkit[name](\"[\" + id + \"],[data-\" + id + \"]\"));\n }\n\n return components$2[id] = components$2[\"data-\" + id] = isPlainObject(options) ? opt : options;\n };\n\n UIkit.getComponents = (element) => (element == null ? void 0 : element[DATA]) || {};\n UIkit.getComponent = (element, name) => UIkit.getComponents(element)[name];\n\n UIkit.connect = (node) => {\n if (node[DATA]) {\n for (const name in node[DATA]) {\n node[DATA][name]._callConnected();\n }\n }\n\n for (const attribute of node.getAttributeNames()) {\n const name = getComponentName(attribute);\n name && UIkit[name](node);\n }\n };\n\n UIkit.disconnect = (node) => {\n for (const name in node[DATA]) {\n node[DATA][name]._callDisconnected();\n }\n };\n }\n\n function getComponentName(attribute) {\n const cmp = components$2[attribute];\n return cmp && (isPlainObject(cmp) ? cmp : cmp.options).name;\n }\n\n const UIkit = function (options) {\n this._init(options);\n };\n\n UIkit.util = util;\n UIkit.data = '__uikit__';\n UIkit.prefix = 'uk-';\n UIkit.options = {};\n UIkit.version = '3.15.12';\n\n globalAPI(UIkit);\n hooksAPI(UIkit);\n stateAPI(UIkit);\n componentAPI(UIkit);\n instanceAPI(UIkit);\n\n function boot (UIkit) {\n const { connect, disconnect } = UIkit;\n\n if (!inBrowser || !window.MutationObserver) {\n return;\n }\n\n requestAnimationFrame(function () {\n trigger(document, 'uikit:init', UIkit);\n\n if (document.body) {\n apply(document.body, connect);\n }\n\n new MutationObserver((records) => records.forEach(applyChildListMutation)).observe(\n document,\n {\n childList: true,\n subtree: true\n });\n\n\n new MutationObserver((records) => records.forEach(applyAttributeMutation)).observe(\n document,\n {\n attributes: true,\n subtree: true\n });\n\n\n UIkit._initialized = true;\n });\n\n function applyChildListMutation(_ref) {let { addedNodes, removedNodes } = _ref;\n for (const node of addedNodes) {\n apply(node, connect);\n }\n\n for (const node of removedNodes) {\n apply(node, disconnect);\n }\n }\n\n function applyAttributeMutation(_ref2) {let { target, attributeName } = _ref2;\n const name = getComponentName(attributeName);\n\n if (name) {var _UIkit$getComponent;\n if (hasAttr(target, attributeName)) {\n UIkit[name](target);\n return;\n }\n\n (_UIkit$getComponent = UIkit.getComponent(target, name)) == null ? void 0 : _UIkit$getComponent.$destroy();\n }\n }\n }\n\n var Class = {\n connected() {\n addClass(this.$el, this.$options.id);\n }\n };\n\n var Lazyload = {\n data: {\n preload: 5\n },\n\n methods: {\n lazyload(observeTargets, targets) {if (observeTargets === void 0) {observeTargets = this.$el;}if (targets === void 0) {targets = this.$el;}\n this.registerObserver(\n observeIntersection(observeTargets, (entries, observer) => {\n for (const el of toNodes(isFunction(targets) ? targets() : targets)) {\n $$('[loading=\"lazy\"]', el).\n slice(0, this.preload - 1).\n forEach((el) => removeAttr(el, 'loading'));\n }\n\n for (const el of entries.\n filter((_ref) => {let { isIntersecting } = _ref;return isIntersecting;}).\n map((_ref2) => {let { target } = _ref2;return target;})) {\n observer.unobserve(el);\n }\n }));\n\n }\n }\n };\n\n var Togglable = {\n props: {\n cls: Boolean,\n animation: 'list',\n duration: Number,\n velocity: Number,\n origin: String,\n transition: String\n },\n\n data: {\n cls: false,\n animation: [false],\n duration: 200,\n velocity: 0.2,\n origin: false,\n transition: 'ease',\n clsEnter: 'uk-togglabe-enter',\n clsLeave: 'uk-togglabe-leave'\n },\n\n computed: {\n hasAnimation(_ref) {let { animation } = _ref;\n return !!animation[0];\n },\n\n hasTransition(_ref2) {let { animation } = _ref2;\n return ['slide', 'reveal'].some((transition) => startsWith(animation[0], transition));\n }\n },\n\n methods: {\n toggleElement(targets, toggle, animate) {\n return new Promise((resolve) =>\n Promise.all(\n toNodes(targets).map((el) => {\n const show = isBoolean(toggle) ? toggle : !this.isToggled(el);\n\n if (!trigger(el, \"before\" + (show ? 'show' : 'hide'), [this])) {\n return Promise.reject();\n }\n\n const promise = (\n isFunction(animate) ?\n animate :\n animate === false || !this.hasAnimation ?\n toggleInstant :\n this.hasTransition ?\n toggleTransition :\n toggleAnimation)(\n el, show, this);\n\n const cls = show ? this.clsEnter : this.clsLeave;\n\n addClass(el, cls);\n\n trigger(el, show ? 'show' : 'hide', [this]);\n\n const done = () => {\n removeClass(el, cls);\n trigger(el, show ? 'shown' : 'hidden', [this]);\n };\n\n return promise ?\n promise.then(done, () => {\n removeClass(el, cls);\n return Promise.reject();\n }) :\n done();\n })).\n then(resolve, noop));\n\n },\n\n isToggled(el) {if (el === void 0) {el = this.$el;}\n [el] = toNodes(el);\n return hasClass(el, this.clsEnter) ?\n true :\n hasClass(el, this.clsLeave) ?\n false :\n this.cls ?\n hasClass(el, this.cls.split(' ')[0]) :\n isVisible(el);\n },\n\n _toggle(el, toggled) {\n if (!el) {\n return;\n }\n\n toggled = Boolean(toggled);\n\n let changed;\n if (this.cls) {\n changed = includes(this.cls, ' ') || toggled !== hasClass(el, this.cls);\n changed && toggleClass(el, this.cls, includes(this.cls, ' ') ? undefined : toggled);\n } else {\n changed = toggled === el.hidden;\n changed && (el.hidden = !toggled);\n }\n\n $$('[autofocus]', el).some((el) => isVisible(el) ? el.focus() || true : el.blur());\n\n if (changed) {\n trigger(el, 'toggled', [toggled, this]);\n }\n }\n }\n };\n\n function toggleInstant(el, show, _ref3) {let { _toggle } = _ref3;\n Animation.cancel(el);\n Transition.cancel(el);\n return _toggle(el, show);\n }\n\n async function toggleTransition(\n el,\n show, _ref4)\n\n {var _animation$;let { animation, duration, velocity, transition, _toggle } = _ref4;\n const [mode = 'reveal', startProp = 'top'] = ((_animation$ = animation[0]) == null ? void 0 : _animation$.split('-')) || [];\n\n const dirs = [\n ['left', 'right'],\n ['top', 'bottom']];\n\n const dir = dirs[includes(dirs[0], startProp) ? 0 : 1];\n const end = dir[1] === startProp;\n const props = ['width', 'height'];\n const dimProp = props[dirs.indexOf(dir)];\n const marginProp = \"margin-\" + dir[0];\n const marginStartProp = \"margin-\" + startProp;\n\n let currentDim = dimensions(el)[dimProp];\n\n const inProgress = Transition.inProgress(el);\n await Transition.cancel(el);\n\n if (show) {\n _toggle(el, true);\n }\n\n const prevProps = Object.fromEntries(\n [\n 'padding',\n 'border',\n 'width',\n 'height',\n 'minWidth',\n 'minHeight',\n 'overflowY',\n 'overflowX',\n marginProp,\n marginStartProp].\n map((key) => [key, el.style[key]]));\n\n\n const dim = dimensions(el);\n const currentMargin = toFloat(css(el, marginProp));\n const marginStart = toFloat(css(el, marginStartProp));\n const endDim = dim[dimProp] + marginStart;\n\n if (!inProgress && !show) {\n currentDim += marginStart;\n }\n\n const [wrapper] = wrapInner(el, '
');\n css(wrapper, {\n boxSizing: 'border-box',\n height: dim.height,\n width: dim.width,\n ...css(el, [\n 'overflow',\n 'padding',\n 'borderTop',\n 'borderRight',\n 'borderBottom',\n 'borderLeft',\n 'borderImage',\n marginStartProp])\n\n });\n\n css(el, {\n padding: 0,\n border: 0,\n minWidth: 0,\n minHeight: 0,\n [marginStartProp]: 0,\n width: dim.width,\n height: dim.height,\n overflow: 'hidden',\n [dimProp]: currentDim\n });\n\n const percent = currentDim / endDim;\n duration = (velocity * endDim + duration) * (show ? 1 - percent : percent);\n const endProps = { [dimProp]: show ? endDim : 0 };\n\n if (end) {\n css(el, marginProp, endDim - currentDim + currentMargin);\n endProps[marginProp] = show ? currentMargin : endDim + currentMargin;\n }\n\n if (!end ^ mode === 'reveal') {\n css(wrapper, marginProp, -endDim + currentDim);\n Transition.start(wrapper, { [marginProp]: show ? 0 : -endDim }, duration, transition);\n }\n\n try {\n await Transition.start(el, endProps, duration, transition);\n } finally {\n css(el, prevProps);\n unwrap(wrapper.firstChild);\n\n if (!show) {\n _toggle(el, false);\n }\n }\n }\n\n function toggleAnimation(el, show, cmp) {\n Animation.cancel(el);\n\n const { animation, duration, _toggle } = cmp;\n\n if (show) {\n _toggle(el, true);\n return Animation.in(el, animation[0], duration, cmp.origin);\n }\n\n return Animation.out(el, animation[1] || animation[0], duration, cmp.origin).then(() =>\n _toggle(el, false));\n\n }\n\n var Accordion = {\n mixins: [Class, Lazyload, Togglable],\n\n props: {\n animation: Boolean,\n targets: String,\n active: null,\n collapsible: Boolean,\n multiple: Boolean,\n toggle: String,\n content: String,\n offset: Number\n },\n\n data: {\n targets: '> *',\n active: false,\n animation: true,\n collapsible: true,\n multiple: false,\n clsOpen: 'uk-open',\n toggle: '> .uk-accordion-title',\n content: '> .uk-accordion-content',\n offset: 0\n },\n\n computed: {\n items: {\n get(_ref, $el) {let { targets } = _ref;\n return $$(targets, $el);\n },\n\n watch(items, prev) {\n if (prev || hasClass(items, this.clsOpen)) {\n return;\n }\n\n const active =\n this.active !== false && items[Number(this.active)] ||\n !this.collapsible && items[0];\n\n if (active) {\n this.toggle(active, false);\n }\n },\n\n immediate: true\n },\n\n toggles(_ref2) {let { toggle } = _ref2;\n return this.items.map((item) => $(toggle, item));\n },\n\n contents: {\n get(_ref3) {let { content } = _ref3;\n return this.items.map((item) => $(content, item));\n },\n\n watch(items) {\n for (const el of items) {\n hide(\n el,\n !hasClass(\n this.items.find((item) => within(el, item)),\n this.clsOpen));\n\n\n }\n },\n\n immediate: true\n }\n },\n\n connected() {\n this.lazyload();\n },\n\n events: [\n {\n name: 'click',\n\n delegate() {\n return this.targets + \" \" + this.$props.toggle;\n },\n\n async handler(e) {var _this$_off;\n e.preventDefault();\n\n (_this$_off = this._off) == null ? void 0 : _this$_off.call(this);\n this._off = keepScrollPosition(e.target);\n await this.toggle(index(this.toggles, e.current));\n this._off();\n }\n }],\n\n\n methods: {\n async toggle(item, animate) {\n item = this.items[getIndex(item, this.items)];\n let items = [item];\n const activeItems = filter(this.items, \".\" + this.clsOpen);\n\n if (!this.multiple && !includes(activeItems, items[0])) {\n items = items.concat(activeItems);\n }\n\n if (!this.collapsible && activeItems.length < 2 && includes(activeItems, item)) {\n return;\n }\n\n await Promise.all(\n items.map((el) =>\n this.toggleElement(el, !includes(activeItems, el), (el, show) => {\n toggleClass(el, this.clsOpen, show);\n attr($(this.$props.toggle, el), 'aria-expanded', show);\n\n if (animate === false || !this.animation) {\n hide($(this.content, el), !show);\n return;\n }\n\n return transition(el, show, this);\n })));\n\n\n }\n }\n };\n\n function hide(el, hide) {\n el && (el.hidden = hide);\n }\n\n async function transition(el, show, _ref4) {var _el$_wrapper;let { content, duration, velocity, transition } = _ref4;\n content = ((_el$_wrapper = el._wrapper) == null ? void 0 : _el$_wrapper.firstElementChild) || $(content, el);\n\n if (!el._wrapper) {\n el._wrapper = wrapAll(content, '
');\n }\n\n const wrapper = el._wrapper;\n css(wrapper, 'overflow', 'hidden');\n const currentHeight = toFloat(css(wrapper, 'height'));\n\n await Transition.cancel(wrapper);\n hide(content, false);\n\n const endHeight =\n toFloat(css(content, 'height')) +\n toFloat(css(content, 'marginTop')) +\n toFloat(css(content, 'marginBottom'));\n const percent = currentHeight / endHeight;\n duration = (velocity * endHeight + duration) * (show ? 1 - percent : percent);\n css(wrapper, 'height', currentHeight);\n\n await Transition.start(wrapper, { height: show ? endHeight : 0 }, duration, transition);\n\n unwrap(content);\n delete el._wrapper;\n\n if (!show) {\n hide(content, true);\n }\n }\n\n function keepScrollPosition(el) {\n const scrollParent = scrollParents(el)[0];\n let frame;\n (function scroll() {\n frame = requestAnimationFrame(() => {\n const { top } = el.getBoundingClientRect();\n if (top < 0) {\n scrollParent.scrollTop += top;\n }\n scroll();\n });\n })();\n\n return () => requestAnimationFrame(() => cancelAnimationFrame(frame));\n }\n\n var alert = {\n mixins: [Class, Togglable],\n\n args: 'animation',\n\n props: {\n animation: Boolean,\n close: String\n },\n\n data: {\n animation: true,\n selClose: '.uk-alert-close',\n duration: 150\n },\n\n events: {\n name: 'click',\n\n delegate() {\n return this.selClose;\n },\n\n handler(e) {\n e.preventDefault();\n this.close();\n }\n },\n\n methods: {\n async close() {\n await this.toggleElement(this.$el, false, animate$1);\n this.$destroy(true);\n }\n }\n };\n\n function animate$1(el, show, _ref) {let { duration, transition, velocity } = _ref;\n const height = toFloat(css(el, 'height'));\n css(el, 'height', height);\n return Transition.start(\n el,\n {\n height: 0,\n marginTop: 0,\n marginBottom: 0,\n paddingTop: 0,\n paddingBottom: 0,\n borderTop: 0,\n borderBottom: 0,\n opacity: 0\n },\n velocity * height + duration,\n transition);\n\n }\n\n var Video = {\n args: 'autoplay',\n\n props: {\n automute: Boolean,\n autoplay: Boolean\n },\n\n data: {\n automute: false,\n autoplay: true\n },\n\n connected() {\n this.inView = this.autoplay === 'inview';\n\n if (this.inView && !hasAttr(this.$el, 'preload')) {\n this.$el.preload = 'none';\n }\n\n if (isTag(this.$el, 'iframe') && !hasAttr(this.$el, 'allow')) {\n this.$el.allow = 'autoplay';\n }\n\n if (this.automute) {\n mute(this.$el);\n }\n\n this.registerObserver(observeIntersection(this.$el, () => this.$emit(), {}, false));\n },\n\n update: {\n read(_ref) {let { visible } = _ref;\n if (!isVideo(this.$el)) {\n return false;\n }\n\n return {\n prev: visible,\n visible: isVisible(this.$el) && css(this.$el, 'visibility') !== 'hidden',\n inView: this.inView && isInView(this.$el)\n };\n },\n\n write(_ref2) {let { prev, visible, inView } = _ref2;\n if (!visible || this.inView && !inView) {\n pause(this.$el);\n } else if (this.autoplay === true && !prev || this.inView && inView) {\n play(this.$el);\n }\n }\n }\n };\n\n var Resize = {\n connected() {var _this$$options$resize;\n this.registerObserver(\n observeResize(((_this$$options$resize = this.$options.resizeTargets) == null ? void 0 : _this$$options$resize.call(this)) || this.$el, () =>\n this.$emit('resize')));\n\n\n }\n };\n\n var cover = {\n mixins: [Resize, Video],\n\n props: {\n width: Number,\n height: Number\n },\n\n data: {\n automute: true\n },\n\n events: {\n 'load loadedmetadata'() {\n this.$emit('resize');\n }\n },\n\n resizeTargets() {\n return [this.$el, getPositionedParent(this.$el) || parent(this.$el)];\n },\n\n update: {\n read() {\n const { ratio, cover } = Dimensions;\n const { $el, width, height } = this;\n\n let dim = { width, height };\n\n if (!dim.width || !dim.height) {\n const intrinsic = {\n width: $el.naturalWidth || $el.videoWidth || $el.clientWidth,\n height: $el.naturalHeight || $el.videoHeight || $el.clientHeight\n };\n\n if (dim.width) {\n dim = ratio(intrinsic, 'width', dim.width);\n } else if (height) {\n dim = ratio(intrinsic, 'height', dim.height);\n } else {\n dim = intrinsic;\n }\n }\n\n const { offsetHeight: coverHeight, offsetWidth: coverWidth } =\n getPositionedParent($el) || parent($el);\n const coverDim = cover(dim, {\n width: coverWidth + (coverWidth % 2 ? 1 : 0),\n height: coverHeight + (coverHeight % 2 ? 1 : 0)\n });\n\n if (!coverDim.width || !coverDim.height) {\n return false;\n }\n\n return coverDim;\n },\n\n write(_ref) {let { height, width } = _ref;\n css(this.$el, { height, width });\n },\n\n events: ['resize']\n }\n };\n\n function getPositionedParent(el) {\n while (el = parent(el)) {\n if (css(el, 'position') !== 'static') {\n return el;\n }\n }\n }\n\n var Container = {\n props: {\n container: Boolean\n },\n\n data: {\n container: true\n },\n\n computed: {\n container(_ref) {let { container } = _ref;\n return container === true && this.$container || container && $(container);\n }\n }\n };\n\n var Position = {\n props: {\n pos: String,\n offset: null,\n flip: Boolean,\n shift: Boolean,\n inset: Boolean\n },\n\n data: {\n pos: \"bottom-\" + (isRtl ? 'right' : 'left'),\n offset: false,\n flip: true,\n shift: true,\n inset: false\n },\n\n connected() {\n this.pos = this.$props.pos.split('-').concat('center').slice(0, 2);\n [this.dir, this.align] = this.pos;\n this.axis = includes(['top', 'bottom'], this.dir) ? 'y' : 'x';\n },\n\n methods: {\n positionAt(element, target, boundary) {\n let offset = [this.getPositionOffset(element), this.getShiftOffset(element)];\n const placement = [this.flip && 'flip', this.shift && 'shift'];\n\n const attach = {\n element: [this.inset ? this.dir : flipPosition(this.dir), this.align],\n target: [this.dir, this.align]\n };\n\n if (this.axis === 'y') {\n for (const prop in attach) {\n attach[prop].reverse();\n }\n offset.reverse();\n placement.reverse();\n }\n\n const [scrollElement] = scrollParents(element, /auto|scroll/);\n const { scrollTop, scrollLeft } = scrollElement;\n\n // Ensure none positioned element does not generate scrollbars\n const elDim = dimensions(element);\n css(element, { top: -elDim.height, left: -elDim.width });\n\n positionAt(element, target, {\n attach,\n offset,\n boundary,\n placement,\n viewportOffset: this.getViewportOffset(element)\n });\n\n // Restore scroll position\n scrollElement.scrollTop = scrollTop;\n scrollElement.scrollLeft = scrollLeft;\n },\n\n getPositionOffset(element) {\n return (\n toPx(\n this.offset === false ? css(element, '--uk-position-offset') : this.offset,\n this.axis === 'x' ? 'width' : 'height',\n element) * (\n\n includes(['left', 'top'], this.dir) ? -1 : 1) * (\n this.inset ? -1 : 1));\n\n },\n\n getShiftOffset(element) {\n return this.align === 'center' ?\n 0 :\n toPx(\n css(element, '--uk-position-shift-offset'),\n this.axis === 'y' ? 'width' : 'height',\n element) * (\n includes(['left', 'top'], this.align) ? 1 : -1);\n },\n\n getViewportOffset(element) {\n return toPx(css(element, '--uk-position-viewport-offset'));\n }\n }\n };\n\n var Style = {\n beforeConnect() {\n this._style = attr(this.$el, 'style');\n },\n\n disconnected() {\n attr(this.$el, 'style', this._style);\n }\n };\n\n const active$1 = [];\n\n var Modal = {\n mixins: [Class, Container, Togglable],\n\n props: {\n selPanel: String,\n selClose: String,\n escClose: Boolean,\n bgClose: Boolean,\n stack: Boolean\n },\n\n data: {\n cls: 'uk-open',\n escClose: true,\n bgClose: true,\n overlay: true,\n stack: false\n },\n\n computed: {\n panel(_ref, $el) {let { selPanel } = _ref;\n return $(selPanel, $el);\n },\n\n transitionElement() {\n return this.panel;\n },\n\n bgClose(_ref2) {let { bgClose } = _ref2;\n return bgClose && this.panel;\n }\n },\n\n beforeDisconnect() {\n if (includes(active$1, this)) {\n this.toggleElement(this.$el, false, false);\n }\n },\n\n events: [\n {\n name: 'click',\n\n delegate() {\n return this.selClose;\n },\n\n handler(e) {\n e.preventDefault();\n this.hide();\n }\n },\n\n {\n name: 'click',\n\n delegate() {\n return 'a[href*=\"#\"]';\n },\n\n handler(_ref3) {let { current, defaultPrevented } = _ref3;\n const { hash } = current;\n if (\n !defaultPrevented &&\n hash &&\n isSameSiteAnchor(current) &&\n !within(hash, this.$el) &&\n $(hash, document.body))\n {\n this.hide();\n }\n }\n },\n\n {\n name: 'toggle',\n\n self: true,\n\n handler(e) {\n if (e.defaultPrevented) {\n return;\n }\n\n e.preventDefault();\n\n if (this.isToggled() === includes(active$1, this)) {\n this.toggle();\n }\n }\n },\n\n {\n name: 'beforeshow',\n\n self: true,\n\n handler(e) {\n if (includes(active$1, this)) {\n return false;\n }\n\n if (!this.stack && active$1.length) {\n Promise.all(active$1.map((modal) => modal.hide())).then(this.show);\n e.preventDefault();\n } else {\n active$1.push(this);\n }\n }\n },\n\n {\n name: 'show',\n\n self: true,\n\n handler() {\n once(\n this.$el,\n 'hide',\n on(document, 'focusin', (e) => {\n if (last(active$1) === this && !within(e.target, this.$el)) {\n this.$el.focus();\n }\n }));\n\n\n if (this.overlay) {\n once(this.$el, 'hidden', preventOverscroll(this.$el), { self: true });\n once(this.$el, 'hidden', preventBackgroundScroll(), { self: true });\n }\n\n if (this.stack) {\n css(this.$el, 'zIndex', toFloat(css(this.$el, 'zIndex')) + active$1.length);\n }\n\n addClass(document.documentElement, this.clsPage);\n\n if (this.bgClose) {\n once(\n this.$el,\n 'hide',\n on(document, pointerDown, (_ref4) => {let { target } = _ref4;\n if (\n last(active$1) !== this ||\n this.overlay && !within(target, this.$el) ||\n within(target, this.panel))\n {\n return;\n }\n\n once(\n document,\n pointerUp + \" \" + pointerCancel + \" scroll\",\n (_ref5) => {let { defaultPrevented, type, target: newTarget } = _ref5;\n if (\n !defaultPrevented &&\n type === pointerUp &&\n target === newTarget)\n {\n this.hide();\n }\n },\n true);\n\n }),\n { self: true });\n\n }\n\n if (this.escClose) {\n once(\n this.$el,\n 'hide',\n on(document, 'keydown', (e) => {\n if (e.keyCode === 27 && last(active$1) === this) {\n this.hide();\n }\n }),\n { self: true });\n\n }\n }\n },\n\n {\n name: 'shown',\n\n self: true,\n\n handler() {\n if (!isFocusable(this.$el)) {\n attr(this.$el, 'tabindex', '-1');\n }\n\n if (!$(':focus', this.$el)) {\n this.$el.focus();\n }\n }\n },\n\n {\n name: 'hidden',\n\n self: true,\n\n handler() {\n if (includes(active$1, this)) {\n active$1.splice(active$1.indexOf(this), 1);\n }\n\n css(this.$el, 'zIndex', '');\n\n if (!active$1.some((modal) => modal.clsPage === this.clsPage)) {\n removeClass(document.documentElement, this.clsPage);\n }\n }\n }],\n\n\n methods: {\n toggle() {\n return this.isToggled() ? this.hide() : this.show();\n },\n\n show() {\n if (this.container && parent(this.$el) !== this.container) {\n append(this.container, this.$el);\n return new Promise((resolve) =>\n requestAnimationFrame(() => this.show().then(resolve)));\n\n }\n\n return this.toggleElement(this.$el, true, animate);\n },\n\n hide() {\n return this.toggleElement(this.$el, false, animate);\n }\n }\n };\n\n function animate(el, show, _ref6) {let { transitionElement, _toggle } = _ref6;\n return new Promise((resolve, reject) =>\n once(el, 'show hide', () => {\n el._reject == null ? void 0 : el._reject();\n el._reject = reject;\n\n _toggle(el, show);\n\n const off = once(\n transitionElement,\n 'transitionstart',\n () => {\n once(transitionElement, 'transitionend transitioncancel', resolve, {\n self: true\n });\n clearTimeout(timer);\n },\n { self: true });\n\n\n const timer = setTimeout(() => {\n off();\n resolve();\n }, toMs(css(transitionElement, 'transitionDuration')));\n })).\n then(() => delete el._reject);\n }\n\n function toMs(time) {\n return time ? endsWith(time, 'ms') ? toFloat(time) : toFloat(time) * 1000 : 0;\n }\n\n function preventOverscroll(el) {\n if (CSS.supports('overscroll-behavior', 'contain')) {\n const elements = filterChildren(el, (child) => /auto|scroll/.test(css(child, 'overflow')));\n css(elements, 'overscrollBehavior', 'contain');\n return () => css(elements, 'overscrollBehavior', '');\n }\n\n let startClientY;\n\n const events = [\n on(\n el,\n 'touchstart',\n (_ref7) => {let { targetTouches } = _ref7;\n if (targetTouches.length === 1) {\n startClientY = targetTouches[0].clientY;\n }\n },\n { passive: true }),\n\n\n on(\n el,\n 'touchmove',\n (e) => {\n if (e.targetTouches.length !== 1) {\n return;\n }\n\n let [scrollParent] = scrollParents(e.target, /auto|scroll/);\n if (!within(scrollParent, el)) {\n scrollParent = el;\n }\n\n const clientY = e.targetTouches[0].clientY - startClientY;\n const { scrollTop, scrollHeight, clientHeight } = scrollParent;\n\n if (\n clientHeight >= scrollHeight ||\n scrollTop === 0 && clientY > 0 ||\n scrollHeight - scrollTop <= clientHeight && clientY < 0)\n {\n e.cancelable && e.preventDefault();\n }\n },\n { passive: false })];\n\n\n\n return () => events.forEach((fn) => fn());\n }\n\n let prevented;\n function preventBackgroundScroll() {\n if (prevented) {\n return noop;\n }\n prevented = true;\n\n const { scrollingElement } = document;\n css(scrollingElement, {\n overflowY: 'hidden',\n touchAction: 'none',\n paddingRight: width(window) - scrollingElement.clientWidth\n });\n return () => {\n prevented = false;\n css(scrollingElement, { overflowY: '', touchAction: '', paddingRight: '' });\n };\n }\n\n function filterChildren(el, fn) {\n const children = [];\n apply(el, (node) => {\n if (fn(node)) {\n children.push(node);\n }\n });\n return children;\n }\n\n function isSameSiteAnchor(a) {\n return ['origin', 'pathname', 'search'].every((part) => a[part] === location[part]);\n }\n\n let active;\n\n var drop = {\n mixins: [Container, Lazyload, Position, Style, Togglable],\n\n args: 'pos',\n\n props: {\n mode: 'list',\n toggle: Boolean,\n boundary: Boolean,\n boundaryX: Boolean,\n boundaryY: Boolean,\n target: Boolean,\n targetX: Boolean,\n targetY: Boolean,\n stretch: Boolean,\n delayShow: Number,\n delayHide: Number,\n autoUpdate: Boolean,\n clsDrop: String,\n animateOut: Boolean,\n bgScroll: Boolean\n },\n\n data: {\n mode: ['click', 'hover'],\n toggle: '- *',\n boundary: false,\n boundaryX: false,\n boundaryY: false,\n target: false,\n targetX: false,\n targetY: false,\n stretch: false,\n delayShow: 0,\n delayHide: 800,\n autoUpdate: true,\n clsDrop: false,\n animateOut: false,\n bgScroll: true,\n animation: ['uk-animation-fade'],\n cls: 'uk-open',\n container: false\n },\n\n computed: {\n boundary(_ref, $el) {let { boundary, boundaryX, boundaryY } = _ref;\n return [\n query(boundaryX || boundary, $el) || window,\n query(boundaryY || boundary, $el) || window];\n\n },\n\n target(_ref2, $el) {let { target, targetX, targetY } = _ref2;\n targetX = targetX || target || this.targetEl;\n targetY = targetY || target || this.targetEl;\n\n return [\n targetX === true ? window : query(targetX, $el),\n targetY === true ? window : query(targetY, $el)];\n\n }\n },\n\n created() {\n this.tracker = new MouseTracker();\n },\n\n beforeConnect() {\n this.clsDrop = this.$props.clsDrop || \"uk-\" + this.$options.name;\n },\n\n connected() {\n addClass(this.$el, this.clsDrop);\n\n if (this.toggle && !this.targetEl) {\n this.targetEl = this.$create('toggle', query(this.toggle, this.$el), {\n target: this.$el,\n mode: this.mode\n }).$el;\n attr(this.targetEl, 'aria-haspopup', true);\n this.lazyload(this.targetEl);\n }\n },\n\n disconnected() {\n if (this.isActive()) {\n this.hide(false);\n active = null;\n }\n },\n\n events: [\n {\n name: 'click',\n\n delegate() {\n return \".\" + this.clsDrop + \"-close\";\n },\n\n handler(e) {\n e.preventDefault();\n this.hide(false);\n }\n },\n\n {\n name: 'click',\n\n delegate() {\n return 'a[href*=\"#\"]';\n },\n\n handler(_ref3) {let { defaultPrevented, current } = _ref3;\n const { hash } = current;\n if (\n !defaultPrevented &&\n hash &&\n isSameSiteAnchor(current) &&\n !within(hash, this.$el))\n {\n this.hide(false);\n }\n }\n },\n\n {\n name: 'beforescroll',\n\n handler() {\n this.hide(false);\n }\n },\n\n {\n name: 'toggle',\n\n self: true,\n\n handler(e, toggle) {\n e.preventDefault();\n\n if (this.isToggled()) {\n this.hide(false);\n } else {\n this.show(toggle == null ? void 0 : toggle.$el, false);\n }\n }\n },\n\n {\n name: 'toggleshow',\n\n self: true,\n\n handler(e, toggle) {\n e.preventDefault();\n this.show(toggle == null ? void 0 : toggle.$el);\n }\n },\n\n {\n name: 'togglehide',\n\n self: true,\n\n handler(e) {\n e.preventDefault();\n if (!matches(this.$el, ':focus,:hover')) {\n this.hide();\n }\n }\n },\n\n {\n name: pointerEnter + \" focusin\",\n\n filter() {\n return includes(this.mode, 'hover');\n },\n\n handler(e) {\n if (!isTouch(e)) {\n this.clearTimers();\n }\n }\n },\n\n {\n name: pointerLeave + \" focusout\",\n\n filter() {\n return includes(this.mode, 'hover');\n },\n\n handler(e) {\n if (!isTouch(e) && e.relatedTarget) {\n this.hide();\n }\n }\n },\n\n {\n name: 'toggled',\n\n self: true,\n\n handler(e, toggled) {\n if (!toggled) {\n return;\n }\n\n this.clearTimers();\n this.position();\n }\n },\n\n {\n name: 'show',\n\n self: true,\n\n handler() {\n active = this;\n\n this.tracker.init();\n\n const update = () => this.$emit();\n const handlers = [\n on(\n document,\n pointerDown,\n (_ref4) => {let { target } = _ref4;return (\n !within(target, this.$el) &&\n once(\n document,\n pointerUp + \" \" + pointerCancel + \" scroll\",\n (_ref5) => {let { defaultPrevented, type, target: newTarget } = _ref5;\n if (\n !defaultPrevented &&\n type === pointerUp &&\n target === newTarget &&\n !(this.targetEl && within(target, this.targetEl)))\n {\n this.hide(false);\n }\n },\n true));}),\n\n\n\n on(document, 'keydown', (e) => {\n if (e.keyCode === 27) {\n this.hide(false);\n }\n }),\n\n on(window, 'resize', update),\n\n (() => {\n const observer = observeResize(\n scrollParents(this.$el).concat(this.target),\n update);\n\n return () => observer.disconnect();\n })(),\n\n ...(this.autoUpdate ?\n [\n on([document, scrollParents(this.$el)], 'scroll', update, {\n passive: true\n })] :\n\n []),\n\n ...(this.bgScroll ?\n [] :\n [preventOverscroll(this.$el), preventBackgroundScroll()])];\n\n\n once(this.$el, 'hide', () => handlers.forEach((handler) => handler()), {\n self: true\n });\n }\n },\n\n {\n name: 'beforehide',\n\n self: true,\n\n handler() {\n this.clearTimers();\n }\n },\n\n {\n name: 'hide',\n\n handler(_ref6) {let { target } = _ref6;\n if (this.$el !== target) {\n active =\n active === null && within(target, this.$el) && this.isToggled() ?\n this :\n active;\n return;\n }\n\n active = this.isActive() ? null : active;\n this.tracker.cancel();\n }\n }],\n\n\n update: {\n write() {\n if (this.isToggled() && !hasClass(this.$el, this.clsEnter)) {\n this.position();\n }\n }\n },\n\n methods: {\n show(target, delay) {if (target === void 0) {target = this.targetEl;}if (delay === void 0) {delay = true;}\n if (this.isToggled() && target && this.targetEl && target !== this.targetEl) {\n this.hide(false, false);\n }\n\n this.targetEl = target;\n\n this.clearTimers();\n\n if (this.isActive()) {\n return;\n }\n\n if (active) {\n if (delay && active.isDelaying) {\n this.showTimer = setTimeout(() => matches(target, ':hover') && this.show(), 10);\n return;\n }\n\n let prev;\n while (active && prev !== active && !within(this.$el, active.$el)) {\n prev = active;\n active.hide(false, false);\n }\n }\n\n if (this.container && parent(this.$el) !== this.container) {\n append(this.container, this.$el);\n }\n\n this.showTimer = setTimeout(\n () => this.toggleElement(this.$el, true),\n delay && this.delayShow || 0);\n\n },\n\n hide(delay, animate) {if (delay === void 0) {delay = true;}if (animate === void 0) {animate = true;}\n const hide = () => this.toggleElement(this.$el, false, this.animateOut && animate);\n\n this.clearTimers();\n\n this.isDelaying = getPositionedElements(this.$el).some((el) =>\n this.tracker.movesTo(el));\n\n\n if (delay && this.isDelaying) {\n this.hideTimer = setTimeout(this.hide, 50);\n } else if (delay && this.delayHide) {\n this.hideTimer = setTimeout(hide, this.delayHide);\n } else {\n hide();\n }\n },\n\n clearTimers() {\n clearTimeout(this.showTimer);\n clearTimeout(this.hideTimer);\n this.showTimer = null;\n this.hideTimer = null;\n this.isDelaying = false;\n },\n\n isActive() {\n return active === this;\n },\n\n position() {\n removeClass(this.$el, this.clsDrop + \"-stack\");\n attr(this.$el, 'style', this._style);\n\n // Ensure none positioned element does not generate scrollbars\n this.$el.hidden = true;\n\n const viewports = this.target.map((target) => getViewport$1(this.$el, target));\n const viewportOffset = this.getViewportOffset(this.$el);\n\n const dirs = [\n [0, ['x', 'width', 'left', 'right']],\n [1, ['y', 'height', 'top', 'bottom']]];\n\n\n for (const [i, [axis, prop]] of dirs) {\n if (this.axis !== axis && includes([axis, true], this.stretch)) {\n css(this.$el, {\n [prop]: Math.min(\n offset(this.boundary[i])[prop],\n viewports[i][prop] - 2 * viewportOffset),\n\n [\"overflow-\" + axis]: 'auto'\n });\n }\n }\n\n const maxWidth = viewports[0].width - 2 * viewportOffset;\n\n if (this.$el.offsetWidth > maxWidth) {\n addClass(this.$el, this.clsDrop + \"-stack\");\n }\n\n css(this.$el, 'maxWidth', maxWidth);\n\n this.$el.hidden = false;\n\n this.positionAt(this.$el, this.target, this.boundary);\n\n for (const [i, [axis, prop, start, end]] of dirs) {\n if (this.axis === axis && includes([axis, true], this.stretch)) {\n const positionOffset = Math.abs(this.getPositionOffset(this.$el));\n const targetOffset = offset(this.target[i]);\n const elOffset = offset(this.$el);\n\n css(this.$el, {\n [prop]:\n (targetOffset[start] > elOffset[start] ?\n targetOffset[start] -\n Math.max(\n offset(this.boundary[i])[start],\n viewports[i][start] + viewportOffset) :\n\n Math.min(\n offset(this.boundary[i])[end],\n viewports[i][end] - viewportOffset) -\n targetOffset[end]) - positionOffset,\n [\"overflow-\" + axis]: 'auto'\n });\n\n this.positionAt(this.$el, this.target, this.boundary);\n }\n }\n }\n }\n };\n\n function getPositionedElements(el) {\n const result = [];\n apply(el, (el) => css(el, 'position') !== 'static' && result.push(el));\n return result;\n }\n\n function getViewport$1(el, target) {\n return offsetViewport(scrollParents(target).find((parent) => within(el, parent)));\n }\n\n var formCustom = {\n mixins: [Class],\n\n args: 'target',\n\n props: {\n target: Boolean\n },\n\n data: {\n target: false\n },\n\n computed: {\n input(_, $el) {\n return $(selInput, $el);\n },\n\n state() {\n return this.input.nextElementSibling;\n },\n\n target(_ref, $el) {let { target } = _ref;\n return (\n target && (\n target === true && parent(this.input) === $el && this.input.nextElementSibling ||\n $(target, $el)));\n\n }\n },\n\n update() {var _input$files;\n const { target, input } = this;\n\n if (!target) {\n return;\n }\n\n let option;\n const prop = isInput(target) ? 'value' : 'textContent';\n const prev = target[prop];\n const value = (_input$files = input.files) != null && _input$files[0] ?\n input.files[0].name :\n matches(input, 'select') && (\n option = $$('option', input).filter((el) => el.selected)[0]) // eslint-disable-line prefer-destructuring\n ? option.textContent :\n input.value;\n\n if (prev !== value) {\n target[prop] = value;\n }\n },\n\n events: [\n {\n name: 'change',\n\n handler() {\n this.$emit();\n }\n },\n\n {\n name: 'reset',\n\n el() {\n return closest(this.$el, 'form');\n },\n\n handler() {\n this.$emit();\n }\n }]\n\n };\n\n var Margin = {\n mixins: [Resize],\n\n props: {\n margin: String,\n firstColumn: Boolean\n },\n\n data: {\n margin: 'uk-margin-small-top',\n firstColumn: 'uk-first-column'\n },\n\n resizeTargets() {\n return [this.$el, ...toArray(this.$el.children)];\n },\n\n connected() {\n this.registerObserver(\n observeMutation(this.$el, () => this.$reset(), {\n childList: true,\n attributes: true,\n attributeFilter: ['style']\n }));\n\n },\n\n update: {\n read() {\n const rows = getRows(this.$el.children);\n\n return {\n rows,\n columns: getColumns(rows)\n };\n },\n\n write(_ref) {let { columns, rows } = _ref;\n for (const row of rows) {\n for (const column of row) {\n toggleClass(column, this.margin, rows[0] !== row);\n toggleClass(column, this.firstColumn, columns[0].includes(column));\n }\n }\n },\n\n events: ['resize']\n }\n };\n\n function getRows(items) {\n return sortBy(items, 'top', 'bottom');\n }\n\n function getColumns(rows) {\n const columns = [];\n\n for (const row of rows) {\n const sorted = sortBy(row, 'left', 'right');\n for (let j = 0; j < sorted.length; j++) {\n columns[j] = columns[j] ? columns[j].concat(sorted[j]) : sorted[j];\n }\n }\n\n return isRtl ? columns.reverse() : columns;\n }\n\n function sortBy(items, startProp, endProp) {\n const sorted = [[]];\n\n for (const el of items) {\n if (!isVisible(el)) {\n continue;\n }\n\n let dim = getOffset(el);\n\n for (let i = sorted.length - 1; i >= 0; i--) {\n const current = sorted[i];\n\n if (!current[0]) {\n current.push(el);\n break;\n }\n\n let startDim;\n if (current[0].offsetParent === el.offsetParent) {\n startDim = getOffset(current[0]);\n } else {\n dim = getOffset(el, true);\n startDim = getOffset(current[0], true);\n }\n\n if (dim[startProp] >= startDim[endProp] - 1 && dim[startProp] !== startDim[startProp]) {\n sorted.push([el]);\n break;\n }\n\n if (dim[endProp] - 1 > startDim[startProp] || dim[startProp] === startDim[startProp]) {\n current.push(el);\n break;\n }\n\n if (i === 0) {\n sorted.unshift([el]);\n break;\n }\n }\n }\n\n return sorted;\n }\n\n function getOffset(element, offset) {if (offset === void 0) {offset = false;}\n let { offsetTop, offsetLeft, offsetHeight, offsetWidth } = element;\n\n if (offset) {\n [offsetTop, offsetLeft] = offsetPosition(element);\n }\n\n return {\n top: offsetTop,\n left: offsetLeft,\n bottom: offsetTop + offsetHeight,\n right: offsetLeft + offsetWidth\n };\n }\n\n var Scroll = {\n connected() {\n registerScrollListener(this._uid, () => this.$emit('scroll'));\n },\n\n disconnected() {\n unregisterScrollListener(this._uid);\n }\n };\n\n const scrollListeners = new Map();\n let unbindScrollListener;\n function registerScrollListener(id, listener) {\n unbindScrollListener =\n unbindScrollListener ||\n on(window, 'scroll', () => scrollListeners.forEach((listener) => listener()), {\n passive: true,\n capture: true\n });\n\n scrollListeners.set(id, listener);\n }\n\n function unregisterScrollListener(id) {\n scrollListeners.delete(id);\n if (unbindScrollListener && !scrollListeners.size) {\n unbindScrollListener();\n unbindScrollListener = null;\n }\n }\n\n var grid = {\n extends: Margin,\n\n mixins: [Class],\n\n name: 'grid',\n\n props: {\n masonry: Boolean,\n parallax: Number\n },\n\n data: {\n margin: 'uk-grid-margin',\n clsStack: 'uk-grid-stack',\n masonry: false,\n parallax: 0\n },\n\n connected() {\n this.masonry && addClass(this.$el, 'uk-flex-top uk-flex-wrap-top');\n this.parallax && registerScrollListener(this._uid, () => this.$emit('scroll'));\n },\n\n disconnected() {\n unregisterScrollListener(this._uid);\n },\n\n update: [\n {\n write(_ref) {let { columns } = _ref;\n toggleClass(this.$el, this.clsStack, columns.length < 2);\n },\n\n events: ['resize']\n },\n\n {\n read(data) {\n let { columns, rows } = data;\n\n // Filter component makes elements positioned absolute\n if (\n !columns.length ||\n !this.masonry && !this.parallax ||\n positionedAbsolute(this.$el))\n {\n data.translates = false;\n return false;\n }\n\n let translates = false;\n\n const nodes = children(this.$el);\n const columnHeights = getColumnHeights(columns);\n const margin = getMarginTop(nodes, this.margin) * (rows.length - 1);\n const elHeight = Math.max(...columnHeights) + margin;\n\n if (this.masonry) {\n columns = columns.map((column) => sortBy$1(column, 'offsetTop'));\n translates = getTranslates(rows, columns);\n }\n\n let padding = Math.abs(this.parallax);\n if (padding) {\n padding = columnHeights.reduce(\n (newPadding, hgt, i) =>\n Math.max(\n newPadding,\n hgt + margin + (i % 2 ? padding : padding / 8) - elHeight),\n\n 0);\n\n }\n\n return { padding, columns, translates, height: translates ? elHeight : '' };\n },\n\n write(_ref2) {let { height, padding } = _ref2;\n css(this.$el, 'paddingBottom', padding || '');\n height !== false && css(this.$el, 'height', height);\n },\n\n events: ['resize']\n },\n\n {\n read() {\n if (this.parallax && positionedAbsolute(this.$el)) {\n return false;\n }\n\n return {\n scrolled: this.parallax ?\n scrolledOver(this.$el) * Math.abs(this.parallax) :\n false\n };\n },\n\n write(_ref3) {let { columns, scrolled, translates } = _ref3;\n if (scrolled === false && !translates) {\n return;\n }\n\n columns.forEach((column, i) =>\n column.forEach((el, j) =>\n css(\n el,\n 'transform',\n !scrolled && !translates ?\n '' : \"translateY(\" + (\n\n (translates && -translates[i][j]) + (\n scrolled ? i % 2 ? scrolled : scrolled / 8 : 0)) + \"px)\")));\n\n\n\n\n },\n\n events: ['scroll', 'resize']\n }]\n\n };\n\n function positionedAbsolute(el) {\n return children(el).some((el) => css(el, 'position') === 'absolute');\n }\n\n function getTranslates(rows, columns) {\n const rowHeights = rows.map((row) => Math.max(...row.map((el) => el.offsetHeight)));\n\n return columns.map((elements) => {\n let prev = 0;\n return elements.map(\n (element, row) =>\n prev += row ? rowHeights[row - 1] - elements[row - 1].offsetHeight : 0);\n\n });\n }\n\n function getMarginTop(nodes, cls) {\n const [node] = nodes.filter((el) => hasClass(el, cls));\n\n return toFloat(node ? css(node, 'marginTop') : css(nodes[0], 'paddingLeft'));\n }\n\n function getColumnHeights(columns) {\n return columns.map((column) => column.reduce((sum, el) => sum + el.offsetHeight, 0));\n }\n\n var heightMatch = {\n mixins: [Resize],\n\n args: 'target',\n\n props: {\n target: String,\n row: Boolean\n },\n\n data: {\n target: '> *',\n row: true\n },\n\n computed: {\n elements: {\n get(_ref, $el) {let { target } = _ref;\n return $$(target, $el);\n },\n\n watch() {\n this.$reset();\n }\n }\n },\n\n resizeTargets() {\n return [this.$el, ...this.elements];\n },\n\n update: {\n read() {\n return {\n rows: (this.row ? getRows(this.elements) : [this.elements]).map(match)\n };\n },\n\n write(_ref2) {let { rows } = _ref2;\n for (const { heights, elements } of rows) {\n elements.forEach((el, i) => css(el, 'minHeight', heights[i]));\n }\n },\n\n events: ['resize']\n }\n };\n\n function match(elements) {\n if (elements.length < 2) {\n return { heights: [''], elements };\n }\n\n css(elements, 'minHeight', '');\n let heights = elements.map(getHeight);\n const max = Math.max(...heights);\n\n return {\n heights: elements.map((el, i) => heights[i].toFixed(2) === max.toFixed(2) ? '' : max),\n elements\n };\n }\n\n function getHeight(element) {\n let style = false;\n if (!isVisible(element)) {\n style = element.style.display;\n css(element, 'display', 'block', 'important');\n }\n\n const height = dimensions(element).height - boxModelAdjust(element, 'height', 'content-box');\n\n if (style !== false) {\n css(element, 'display', style);\n }\n\n return height;\n }\n\n var heightViewport = {\n mixins: [Resize],\n\n props: {\n expand: Boolean,\n offsetTop: Boolean,\n offsetBottom: Boolean,\n minHeight: Number\n },\n\n data: {\n expand: false,\n offsetTop: false,\n offsetBottom: false,\n minHeight: 0\n },\n\n resizeTargets() {\n // check for offsetTop change\n return [this.$el, ...scrollParents(this.$el, /auto|scroll/)];\n },\n\n update: {\n read(_ref) {let { minHeight: prev } = _ref;\n if (!isVisible(this.$el)) {\n return false;\n }\n\n let minHeight = '';\n const box = boxModelAdjust(this.$el, 'height', 'content-box');\n\n const { body, scrollingElement } = document;\n const [scrollElement] = scrollParents(this.$el, /auto|scroll/);\n const { height: viewportHeight } = offsetViewport(\n scrollElement === body ? scrollingElement : scrollElement);\n\n\n if (this.expand) {\n minHeight = Math.max(\n viewportHeight - (\n dimensions(scrollElement).height - dimensions(this.$el).height) -\n box,\n 0);\n\n } else {\n const isScrollingElement =\n scrollingElement === scrollElement || body === scrollElement;\n\n // on mobile devices (iOS and Android) window.innerHeight !== 100vh\n minHeight = \"calc(\" + (isScrollingElement ? '100vh' : viewportHeight + \"px\");\n\n if (this.offsetTop) {\n if (isScrollingElement) {\n const top = offsetPosition(this.$el)[0] - offsetPosition(scrollElement)[0];\n minHeight += top > 0 && top < viewportHeight / 2 ? \" - \" + top + \"px\" : '';\n } else {\n minHeight += \" - \" + css(scrollElement, 'paddingTop');\n }\n }\n\n if (this.offsetBottom === true) {\n minHeight += \" - \" + dimensions(this.$el.nextElementSibling).height + \"px\";\n } else if (isNumeric(this.offsetBottom)) {\n minHeight += \" - \" + this.offsetBottom + \"vh\";\n } else if (this.offsetBottom && endsWith(this.offsetBottom, 'px')) {\n minHeight += \" - \" + toFloat(this.offsetBottom) + \"px\";\n } else if (isString(this.offsetBottom)) {\n minHeight += \" - \" + dimensions(query(this.offsetBottom, this.$el)).height + \"px\";\n }\n\n minHeight += (box ? \" - \" + box + \"px\" : '') + \")\";\n }\n\n return { minHeight, prev };\n },\n\n write(_ref2) {let { minHeight } = _ref2;\n css(this.$el, { minHeight });\n\n if (this.minHeight && toFloat(css(this.$el, 'minHeight')) < this.minHeight) {\n css(this.$el, 'minHeight', this.minHeight);\n }\n },\n\n events: ['resize']\n }\n };\n\n var SVG = {\n args: 'src',\n\n props: {\n id: Boolean,\n icon: String,\n src: String,\n style: String,\n width: Number,\n height: Number,\n ratio: Number,\n class: String,\n strokeAnimation: Boolean,\n attributes: 'list'\n },\n\n data: {\n ratio: 1,\n include: ['style', 'class'],\n class: '',\n strokeAnimation: false\n },\n\n beforeConnect() {\n this.class += ' uk-svg';\n },\n\n connected() {\n if (!this.icon && includes(this.src, '#')) {\n [this.src, this.icon] = this.src.split('#');\n }\n\n this.svg = this.getSvg().then((el) => {\n if (this._connected) {\n const svg = insertSVG(el, this.$el);\n\n if (this.svgEl && svg !== this.svgEl) {\n remove$1(this.svgEl);\n }\n\n this.applyAttributes(svg, el);\n\n return this.svgEl = svg;\n }\n }, noop);\n\n if (this.strokeAnimation) {\n this.svg.then((el) => {\n if (this._connected) {\n applyAnimation(el);\n this.registerObserver(\n observeIntersection(el, (records, observer) => {\n applyAnimation(el);\n observer.disconnect();\n }));\n\n }\n });\n }\n },\n\n disconnected() {\n this.svg.then((svg) => {\n if (this._connected) {\n return;\n }\n\n if (isVoidElement(this.$el)) {\n this.$el.hidden = false;\n }\n\n remove$1(svg);\n this.svgEl = null;\n });\n\n this.svg = null;\n },\n\n methods: {\n async getSvg() {\n if (isTag(this.$el, 'img') && !this.$el.complete && this.$el.loading === 'lazy') {\n return new Promise((resolve) =>\n once(this.$el, 'load', () => resolve(this.getSvg())));\n\n }\n\n return parseSVG(await loadSVG(this.src), this.icon) || Promise.reject('SVG not found.');\n },\n\n applyAttributes(el, ref) {\n for (const prop in this.$options.props) {\n if (includes(this.include, prop) && prop in this) {\n attr(el, prop, this[prop]);\n }\n }\n\n for (const attribute in this.attributes) {\n const [prop, value] = this.attributes[attribute].split(':', 2);\n attr(el, prop, value);\n }\n\n if (!this.id) {\n removeAttr(el, 'id');\n }\n\n const props = ['width', 'height'];\n let dimensions = props.map((prop) => this[prop]);\n\n if (!dimensions.some((val) => val)) {\n dimensions = props.map((prop) => attr(ref, prop));\n }\n\n const viewBox = attr(ref, 'viewBox');\n if (viewBox && !dimensions.some((val) => val)) {\n dimensions = viewBox.split(' ').slice(2);\n }\n\n dimensions.forEach((val, i) => attr(el, props[i], toFloat(val) * this.ratio || null));\n }\n }\n };\n\n const loadSVG = memoize(async (src) => {\n if (src) {\n if (startsWith(src, 'data:')) {\n return decodeURIComponent(src.split(',')[1]);\n } else {\n return (await fetch(src)).text();\n }\n } else {\n return Promise.reject();\n }\n });\n\n function parseSVG(svg, icon) {var _svg;\n if (icon && includes(svg, '/g;\n const symbols = {};\n\n function parseSymbols(svg, icon) {\n if (!symbols[svg]) {\n symbols[svg] = {};\n\n symbolRe.lastIndex = 0;\n\n let match;\n while (match = symbolRe.exec(svg)) {\n symbols[svg][match[3]] = \"\";\n }\n }\n\n return symbols[svg][icon];\n }\n\n function applyAnimation(el) {\n const length = getMaxPathLength(el);\n\n if (length) {\n el.style.setProperty('--uk-animation-stroke', length);\n }\n }\n\n function getMaxPathLength(el) {\n return Math.ceil(\n Math.max(\n 0,\n ...$$('[stroke]', el).map((stroke) => {\n try {\n return stroke.getTotalLength();\n } catch (e) {\n return 0;\n }\n })));\n\n\n }\n\n function insertSVG(el, root) {\n if (isVoidElement(root) || isTag(root, 'canvas')) {\n root.hidden = true;\n\n const next = root.nextElementSibling;\n return equals(el, next) ? next : after(root, el);\n }\n\n const last = root.lastElementChild;\n return equals(el, last) ? last : append(root, el);\n }\n\n function equals(el, other) {\n return isTag(el, 'svg') && isTag(other, 'svg') && el.innerHTML === other.innerHTML;\n }\n\n var closeIcon = \"\";\n\n var closeLarge = \"\";\n\n var marker = \"\";\n\n var navParentIcon = \"\";\n\n var navParentIconLarge = \"\";\n\n var navbarParentIcon = \"\";\n\n var navbarToggleIcon = \"\";\n\n var overlayIcon = \"\";\n\n var paginationNext = \"\";\n\n var paginationPrevious = \"\";\n\n var searchIcon = \"\";\n\n var searchLarge = \"\";\n\n var searchNavbar = \"\";\n\n var slidenavNext = \"\";\n\n var slidenavNextLarge = \"\";\n\n var slidenavPrevious = \"\";\n\n var slidenavPreviousLarge = \"\";\n\n var spinner = \"\";\n\n var totop = \"\";\n\n const icons = {\n spinner,\n totop,\n marker,\n 'close-icon': closeIcon,\n 'close-large': closeLarge,\n 'nav-parent-icon': navParentIcon,\n 'nav-parent-icon-large': navParentIconLarge,\n 'navbar-parent-icon': navbarParentIcon,\n 'navbar-toggle-icon': navbarToggleIcon,\n 'overlay-icon': overlayIcon,\n 'pagination-next': paginationNext,\n 'pagination-previous': paginationPrevious,\n 'search-icon': searchIcon,\n 'search-large': searchLarge,\n 'search-navbar': searchNavbar,\n 'slidenav-next': slidenavNext,\n 'slidenav-next-large': slidenavNextLarge,\n 'slidenav-previous': slidenavPrevious,\n 'slidenav-previous-large': slidenavPreviousLarge\n };\n\n const Icon = {\n install: install$1,\n\n extends: SVG,\n\n args: 'icon',\n\n props: ['icon'],\n\n data: { include: [] },\n\n isIcon: true,\n\n beforeConnect() {\n addClass(this.$el, 'uk-icon');\n },\n\n methods: {\n async getSvg() {\n const icon = getIcon(this.icon);\n\n if (!icon) {\n throw 'Icon not found.';\n }\n\n return icon;\n }\n }\n };\n\n const IconComponent = {\n args: false,\n\n extends: Icon,\n\n data: (vm) => ({\n icon: hyphenate(vm.constructor.options.name)\n }),\n\n beforeConnect() {\n addClass(this.$el, this.$options.id);\n }\n };\n\n const NavParentIcon = {\n extends: IconComponent,\n\n beforeConnect() {\n const icon = this.$props.icon;\n this.icon = closest(this.$el, '.uk-nav-primary') ? icon + \"-large\" : icon;\n }\n };\n\n const Slidenav = {\n extends: IconComponent,\n\n beforeConnect() {\n addClass(this.$el, 'uk-slidenav');\n const icon = this.$props.icon;\n this.icon = hasClass(this.$el, 'uk-slidenav-large') ? icon + \"-large\" : icon;\n }\n };\n\n const Search = {\n extends: IconComponent,\n\n beforeConnect() {\n this.icon =\n hasClass(this.$el, 'uk-search-icon') && parents(this.$el, '.uk-search-large').length ?\n 'search-large' :\n parents(this.$el, '.uk-search-navbar').length ?\n 'search-navbar' :\n this.$props.icon;\n }\n };\n\n const Close = {\n extends: IconComponent,\n\n beforeConnect() {\n this.icon = \"close-\" + (hasClass(this.$el, 'uk-close-large') ? 'large' : 'icon');\n }\n };\n\n const Spinner = {\n extends: IconComponent,\n\n methods: {\n async getSvg() {\n const icon = await Icon.methods.getSvg.call(this);\n\n if (this.ratio !== 1) {\n css($('circle', icon), 'strokeWidth', 1 / this.ratio);\n }\n\n return icon;\n }\n }\n };\n\n const parsed = {};\n function install$1(UIkit) {\n UIkit.icon.add = (name, svg) => {\n const added = isString(name) ? { [name]: svg } : name;\n each(added, (svg, name) => {\n icons[name] = svg;\n delete parsed[name];\n });\n\n if (UIkit._initialized) {\n apply(document.body, (el) =>\n each(UIkit.getComponents(el), (cmp) => {\n cmp.$options.isIcon && cmp.icon in added && cmp.$reset();\n }));\n\n }\n };\n }\n\n function getIcon(icon) {\n if (!icons[icon]) {\n return null;\n }\n\n if (!parsed[icon]) {\n parsed[icon] = $((icons[applyRtl(icon)] || icons[icon]).trim());\n }\n\n return parsed[icon].cloneNode(true);\n }\n\n function applyRtl(icon) {\n return isRtl ? swap(swap(icon, 'left', 'right'), 'previous', 'next') : icon;\n }\n\n const nativeLazyLoad = inBrowser && 'loading' in HTMLImageElement.prototype;\n\n var img = {\n args: 'dataSrc',\n\n props: {\n dataSrc: String,\n sources: String,\n offsetTop: String,\n offsetLeft: String,\n target: String,\n loading: String\n },\n\n data: {\n dataSrc: '',\n sources: false,\n offsetTop: '50vh',\n offsetLeft: '50vw',\n target: false,\n loading: 'lazy'\n },\n\n connected() {\n if (this.loading !== 'lazy') {\n this.load();\n return;\n }\n\n const target = [this.$el, ...queryAll(this.$props.target, this.$el)];\n\n if (nativeLazyLoad && isImg(this.$el)) {\n this.$el.loading = 'lazy';\n setSrcAttrs(this.$el);\n\n if (target.length === 1) {\n return;\n }\n }\n\n ensureSrcAttribute(this.$el);\n\n this.registerObserver(\n observeIntersection(\n target,\n (entries, observer) => {\n this.load();\n observer.disconnect();\n },\n {\n rootMargin: toPx(this.offsetTop, 'height') + \"px \" + toPx(\n this.offsetLeft,\n 'width') + \"px\"\n\n }));\n\n\n },\n\n disconnected() {\n if (this._data.image) {\n this._data.image.onload = '';\n }\n },\n\n methods: {\n load() {\n if (this._data.image) {\n return this._data.image;\n }\n\n const image = isImg(this.$el) ?\n this.$el :\n getImageFromElement(this.$el, this.dataSrc, this.sources);\n\n removeAttr(image, 'loading');\n setSrcAttrs(this.$el, image.currentSrc);\n return this._data.image = image;\n }\n }\n };\n\n function setSrcAttrs(el, src) {\n if (isImg(el)) {\n const parentNode = parent(el);\n const elements = isPicture(parentNode) ? children(parentNode) : [el];\n elements.forEach((el) => setSourceProps(el, el));\n } else if (src) {\n const change = !includes(el.style.backgroundImage, src);\n if (change) {\n css(el, 'backgroundImage', \"url(\" + escape(src) + \")\");\n trigger(el, createEvent('load', false));\n }\n }\n }\n\n const srcProps = ['data-src', 'data-srcset', 'sizes'];\n function setSourceProps(sourceEl, targetEl) {\n srcProps.forEach((prop) => {\n const value = data(sourceEl, prop);\n if (value) {\n attr(targetEl, prop.replace(/^(data-)+/, ''), value);\n }\n });\n }\n\n function getImageFromElement(el, src, sources) {\n const img = new Image();\n\n wrapInPicture(img, sources);\n setSourceProps(el, img);\n img.onload = () => {\n setSrcAttrs(el, img.currentSrc);\n };\n attr(img, 'src', src);\n return img;\n }\n\n function wrapInPicture(img, sources) {\n sources = parseSources(sources);\n\n if (sources.length) {\n const picture = fragment('');\n for (const attrs of sources) {\n const source = fragment('');\n attr(source, attrs);\n append(picture, source);\n }\n append(picture, img);\n }\n }\n\n function parseSources(sources) {\n if (!sources) {\n return [];\n }\n\n if (startsWith(sources, '[')) {\n try {\n sources = JSON.parse(sources);\n } catch (e) {\n sources = [];\n }\n } else {\n sources = parseOptions(sources);\n }\n\n if (!isArray(sources)) {\n sources = [sources];\n }\n\n return sources.filter((source) => !isEmpty(source));\n }\n\n function ensureSrcAttribute(el) {\n if (isImg(el) && !hasAttr(el, 'src')) {\n attr(el, 'src', 'data:image/svg+xml;utf8,');\n }\n }\n\n function isPicture(el) {\n return isTag(el, 'picture');\n }\n\n function isImg(el) {\n return isTag(el, 'img');\n }\n\n var Media = {\n props: {\n media: Boolean\n },\n\n data: {\n media: false\n },\n\n connected() {\n const media = toMedia(this.media, this.$el);\n this.matchMedia = true;\n if (media) {\n this.mediaObj = window.matchMedia(media);\n const handler = () => {\n this.matchMedia = this.mediaObj.matches;\n trigger(this.$el, createEvent('mediachange', false, true, [this.mediaObj]));\n };\n this.offMediaObj = on(this.mediaObj, 'change', () => {\n handler();\n this.$emit('resize');\n });\n handler();\n }\n },\n\n disconnected() {var _this$offMediaObj;\n (_this$offMediaObj = this.offMediaObj) == null ? void 0 : _this$offMediaObj.call(this);\n }\n };\n\n function toMedia(value, element) {\n if (isString(value)) {\n if (startsWith(value, '@')) {\n value = toFloat(css(element, \"--uk-breakpoint-\" + value.substr(1)));\n } else if (isNaN(value)) {\n return value;\n }\n }\n\n return value && isNumeric(value) ? \"(min-width: \" + value + \"px)\" : '';\n }\n\n var leader = {\n mixins: [Class, Media, Resize],\n\n props: {\n fill: String\n },\n\n data: {\n fill: '',\n clsWrapper: 'uk-leader-fill',\n clsHide: 'uk-leader-hide',\n attrFill: 'data-fill'\n },\n\n computed: {\n fill(_ref) {let { fill } = _ref;\n return fill || css(this.$el, '--uk-leader-fill-content');\n }\n },\n\n connected() {\n [this.wrapper] = wrapInner(this.$el, \"\");\n },\n\n disconnected() {\n unwrap(this.wrapper.childNodes);\n },\n\n update: {\n read() {\n const width = Math.trunc(this.$el.offsetWidth / 2);\n\n return {\n width,\n fill: this.fill,\n hide: !this.matchMedia\n };\n },\n\n write(_ref2) {let { width, fill, hide } = _ref2;\n toggleClass(this.wrapper, this.clsHide, hide);\n attr(this.wrapper, this.attrFill, new Array(width).join(fill));\n },\n\n events: ['resize']\n }\n };\n\n var modal = {\n install,\n\n mixins: [Modal],\n\n data: {\n clsPage: 'uk-modal-page',\n selPanel: '.uk-modal-dialog',\n selClose:\n '.uk-modal-close, .uk-modal-close-default, .uk-modal-close-outside, .uk-modal-close-full'\n },\n\n events: [\n {\n name: 'show',\n\n self: true,\n\n handler() {\n if (hasClass(this.panel, 'uk-margin-auto-vertical')) {\n addClass(this.$el, 'uk-flex');\n } else {\n css(this.$el, 'display', 'block');\n }\n\n height(this.$el); // force reflow\n }\n },\n\n {\n name: 'hidden',\n\n self: true,\n\n handler() {\n css(this.$el, 'display', '');\n removeClass(this.$el, 'uk-flex');\n }\n }]\n\n };\n\n function install(_ref) {let { modal } = _ref;\n modal.dialog = function (content, options) {\n const dialog = modal(\"
\" +\n\n content + \"
\",\n\n options);\n\n\n dialog.show();\n\n on(\n dialog.$el,\n 'hidden',\n async () => {\n await Promise.resolve();\n dialog.$destroy(true);\n },\n { self: true });\n\n\n return dialog;\n };\n\n modal.alert = function (message, options) {\n return openDialog(\n (_ref2) => {let { labels } = _ref2;return \"
\" + (\n isString(message) ? message : html(message)) + \"
\";},\n\n\n options,\n (deferred) => deferred.resolve());\n\n };\n\n modal.confirm = function (message, options) {\n return openDialog(\n (_ref3) => {let { labels } = _ref3;return \"
\" + (\n isString(message) ? message : html(message)) + \"
\";},\n\n\n options,\n (deferred) => deferred.reject());\n\n };\n\n modal.prompt = function (message, value, options) {\n return openDialog(\n (_ref4) => {let { labels } = _ref4;return \"
\";},\n\n\n options,\n (deferred) => deferred.resolve(null),\n (dialog) => $('input', dialog.$el).value);\n\n };\n\n modal.labels = {\n ok: 'Ok',\n cancel: 'Cancel'\n };\n\n function openDialog(tmpl, options, hideFn, submitFn) {\n options = { bgClose: false, escClose: true, labels: modal.labels, ...options };\n\n const dialog = modal.dialog(tmpl(options), options);\n const deferred = new Deferred();\n\n let resolved = false;\n\n on(dialog.$el, 'submit', 'form', (e) => {\n e.preventDefault();\n deferred.resolve(submitFn == null ? void 0 : submitFn(dialog));\n resolved = true;\n dialog.hide();\n });\n\n on(dialog.$el, 'hide', () => !resolved && hideFn(deferred));\n\n deferred.promise.dialog = dialog;\n\n return deferred.promise;\n }\n }\n\n var nav = {\n extends: Accordion,\n\n data: {\n targets: '> .uk-parent',\n toggle: '> a',\n content: '> ul'\n }\n };\n\n var navbar = {\n mixins: [Class, Container],\n\n props: {\n dropdown: String,\n align: String,\n clsDrop: String,\n boundary: Boolean,\n dropbar: Boolean,\n dropbarAnchor: Boolean,\n duration: Number,\n mode: Boolean,\n offset: Boolean,\n stretch: Boolean,\n delayShow: Boolean,\n delayHide: Boolean,\n target: Boolean,\n targetX: Boolean,\n targetY: Boolean,\n animation: Boolean,\n animateOut: Boolean\n },\n\n data: {\n dropdown: '.uk-navbar-nav > li > a, .uk-navbar-item, .uk-navbar-toggle',\n align: isRtl ? 'right' : 'left',\n clsDrop: 'uk-navbar-dropdown',\n boundary: true,\n dropbar: false,\n dropbarAnchor: false,\n duration: 200,\n container: false\n },\n\n computed: {\n dropbarAnchor(_ref, $el) {let { dropbarAnchor } = _ref;\n return query(dropbarAnchor, $el) || $el;\n },\n\n dropbar: {\n get(_ref2) {let { dropbar } = _ref2;\n if (!dropbar) {\n return null;\n }\n\n dropbar =\n this._dropbar ||\n query(dropbar, this.$el) ||\n $('+ .uk-navbar-dropbar', this.$el);\n\n return dropbar ? dropbar : this._dropbar = $('
');\n },\n\n watch(dropbar) {\n addClass(dropbar, 'uk-dropbar', 'uk-dropbar-top', 'uk-navbar-dropbar');\n },\n\n immediate: true\n },\n\n dropContainer(_, $el) {\n return this.container || $el;\n },\n\n dropdowns: {\n get(_ref3, $el) {let { clsDrop } = _ref3;\n const dropdowns = $$(\".\" + clsDrop, $el);\n\n if (this.dropContainer !== $el) {\n for (const el of $$(\".\" + clsDrop, this.dropContainer)) {var _this$getDropdown;\n const target = (_this$getDropdown = this.getDropdown(el)) == null ? void 0 : _this$getDropdown.targetEl;\n if (!includes(dropdowns, el) && target && within(target, this.$el)) {\n dropdowns.push(el);\n }\n }\n }\n\n return dropdowns;\n },\n\n watch(dropdowns) {\n this.$create(\n 'drop',\n dropdowns.filter((el) => !this.getDropdown(el)),\n {\n ...this.$props,\n flip: false,\n shift: true,\n pos: \"bottom-\" + this.align,\n boundary: this.boundary === true ? this.$el : this.boundary\n });\n\n },\n\n immediate: true\n },\n\n toggles: {\n get(_ref4, $el) {let { dropdown } = _ref4;\n return $$(dropdown, $el);\n },\n\n watch() {\n const justify = hasClass(this.$el, 'uk-navbar-justify');\n for (const container of $$(\n '.uk-navbar-nav, .uk-navbar-left, .uk-navbar-right',\n this.$el))\n {\n css(container, 'flexGrow', justify ? $$(this.dropdown, container).length : '');\n }\n },\n\n immediate: true\n }\n },\n\n disconnected() {\n this.dropbar && remove$1(this.dropbar);\n delete this._dropbar;\n },\n\n events: [\n {\n name: 'mouseover focusin',\n\n delegate() {\n return this.dropdown;\n },\n\n handler(_ref5) {let { current } = _ref5;\n const active = this.getActive();\n if (\n active &&\n includes(active.mode, 'hover') &&\n active.targetEl &&\n !within(active.targetEl, current) &&\n !active.isDelaying)\n {\n active.hide(false);\n }\n }\n },\n\n {\n name: 'keydown',\n\n delegate() {\n return this.dropdown;\n },\n\n handler(e) {\n const { current, keyCode } = e;\n const active = this.getActive();\n\n if (keyCode === keyMap.DOWN && hasAttr(current, 'aria-expanded')) {\n e.preventDefault();\n\n if (!active || active.targetEl !== current) {\n current.click();\n once(this.dropContainer, 'show', (_ref6) => {let { target } = _ref6;return (\n focusFirstFocusableElement(target));});\n\n } else {\n focusFirstFocusableElement(active.$el);\n }\n }\n\n handleNavItemNavigation(e, this.toggles, active);\n }\n },\n\n {\n name: 'keydown',\n\n el() {\n return this.dropContainer;\n },\n\n delegate() {\n return \".\" + this.clsDrop;\n },\n\n handler(e) {\n const { current, keyCode } = e;\n\n if (!includes(this.dropdowns, current)) {\n return;\n }\n\n const active = this.getActive();\n const elements = $$(selFocusable, current);\n const i = findIndex(elements, (el) => matches(el, ':focus'));\n\n if (keyCode === keyMap.UP) {\n e.preventDefault();\n if (i > 0) {\n elements[i - 1].focus();\n }\n }\n\n if (keyCode === keyMap.DOWN) {\n e.preventDefault();\n if (i < elements.length - 1) {\n elements[i + 1].focus();\n }\n }\n\n if (keyCode === keyMap.ESC) {var _active$targetEl;\n active == null ? void 0 : (_active$targetEl = active.targetEl) == null ? void 0 : _active$targetEl.focus();\n }\n\n handleNavItemNavigation(e, this.toggles, active);\n }\n },\n\n {\n name: 'mouseleave',\n\n el() {\n return this.dropbar;\n },\n\n filter() {\n return this.dropbar;\n },\n\n handler() {\n const active = this.getActive();\n\n if (\n active &&\n includes(active.mode, 'hover') &&\n !this.dropdowns.some((el) => matches(el, ':hover')))\n {\n active.hide();\n }\n }\n },\n\n {\n name: 'beforeshow',\n\n el() {\n return this.dropContainer;\n },\n\n filter() {\n return this.dropbar;\n },\n\n handler(_ref7) {let { target } = _ref7;\n if (!this.isDropbarDrop(target)) {\n return;\n }\n\n if (this.dropbar.previousElementSibling !== this.dropbarAnchor) {\n after(this.dropbarAnchor, this.dropbar);\n }\n\n addClass(target, this.clsDrop + \"-dropbar\");\n }\n },\n\n {\n name: 'show',\n\n el() {\n return this.dropContainer;\n },\n\n filter() {\n return this.dropbar;\n },\n\n handler(_ref8) {let { target } = _ref8;\n if (!this.isDropbarDrop(target)) {\n return;\n }\n\n const drop = this.getDropdown(target);\n this._observer = observeResize([drop.$el, ...drop.target], () => {\n const targetOffsets = parents(target, \".\" + this.clsDrop).\n concat(target).\n map((el) => offset(el));\n const minTop = Math.min(...targetOffsets.map((_ref9) => {let { top } = _ref9;return top;}));\n const maxBottom = Math.max(...targetOffsets.map((_ref10) => {let { bottom } = _ref10;return bottom;}));\n const dropbarOffset = offset(this.dropbar);\n css(this.dropbar, 'top', this.dropbar.offsetTop - (dropbarOffset.top - minTop));\n this.transitionTo(\n maxBottom - minTop + toFloat(css(target, 'marginBottom')),\n target);\n\n });\n }\n },\n\n {\n name: 'beforehide',\n\n el() {\n return this.dropContainer;\n },\n\n filter() {\n return this.dropbar;\n },\n\n handler(e) {\n const active = this.getActive();\n\n if (\n matches(this.dropbar, ':hover') &&\n (active == null ? void 0 : active.$el) === e.target &&\n !this.toggles.some((el) => active.targetEl !== el && matches(el, ':focus')))\n {\n e.preventDefault();\n }\n }\n },\n\n {\n name: 'hide',\n\n el() {\n return this.dropContainer;\n },\n\n filter() {\n return this.dropbar;\n },\n\n handler(_ref11) {var _this$_observer;let { target } = _ref11;\n if (!this.isDropbarDrop(target)) {\n return;\n }\n\n (_this$_observer = this._observer) == null ? void 0 : _this$_observer.disconnect();\n\n const active = this.getActive();\n\n if (!active || (active == null ? void 0 : active.$el) === target) {\n this.transitionTo(0);\n }\n }\n }],\n\n\n methods: {\n getActive() {\n return includes(this.dropdowns, active == null ? void 0 : active.$el) && active;\n },\n\n transitionTo(newHeight, el) {\n const { dropbar } = this;\n const oldHeight = height(dropbar);\n\n el = oldHeight < newHeight && el;\n\n css(el, 'clipPath', \"polygon(0 0,100% 0,100% \" + oldHeight + \"px,0 \" + oldHeight + \"px)\");\n\n height(dropbar, oldHeight);\n\n Transition.cancel([el, dropbar]);\n Promise.all([\n Transition.start(dropbar, { height: newHeight }, this.duration),\n Transition.start(\n el,\n {\n clipPath: \"polygon(0 0,100% 0,100% \" + newHeight + \"px,0 \" + newHeight + \"px)\"\n },\n this.duration)]).\n\n\n catch(noop).\n then(() => css(el, { clipPath: '' }));\n },\n\n getDropdown(el) {\n return this.$getComponent(el, 'drop') || this.$getComponent(el, 'dropdown');\n },\n\n isDropbarDrop(el) {\n return this.getDropdown(el) && hasClass(el, this.clsDrop);\n }\n }\n };\n\n function handleNavItemNavigation(e, toggles, active) {\n const { current, keyCode } = e;\n const target = (active == null ? void 0 : active.targetEl) || current;\n const i = toggles.indexOf(target);\n\n // Left\n if (keyCode === keyMap.LEFT && i > 0) {\n active == null ? void 0 : active.hide(false);\n toggles[i - 1].focus();\n }\n\n // Right\n if (keyCode === keyMap.RIGHT && i < toggles.length - 1) {\n active == null ? void 0 : active.hide(false);\n toggles[i + 1].focus();\n }\n\n if (keyCode === keyMap.TAB) {\n target.focus();\n active == null ? void 0 : active.hide(false);\n }\n }\n\n function focusFirstFocusableElement(el) {\n if (!$(':focus', el)) {var _$;\n (_$ = $(selFocusable, el)) == null ? void 0 : _$.focus();\n }\n }\n\n const keyMap = {\n TAB: 9,\n ESC: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40\n };\n\n var Swipe = {\n props: {\n swiping: Boolean\n },\n\n data: {\n swiping: true\n },\n\n computed: {\n swipeTarget(props, $el) {\n return $el;\n }\n },\n\n connected() {\n if (!this.swiping) {\n return;\n }\n\n registerEvent(this, {\n el: this.swipeTarget,\n name: pointerDown,\n passive: true,\n handler(e) {\n if (!isTouch(e)) {\n return;\n }\n\n // Handle Swipe Gesture\n const pos = getEventPos(e);\n const target = 'tagName' in e.target ? e.target : parent(e.target);\n once(document, pointerUp + \" \" + pointerCancel + \" scroll\", (e) => {\n const { x, y } = getEventPos(e);\n\n // swipe\n if (\n e.type !== 'scroll' && target && x && Math.abs(pos.x - x) > 100 ||\n y && Math.abs(pos.y - y) > 100)\n {\n setTimeout(() => {\n trigger(target, 'swipe');\n trigger(target, \"swipe\" + swipeDirection(pos.x, pos.y, x, y));\n });\n }\n });\n }\n });\n }\n };\n\n function swipeDirection(x1, y1, x2, y2) {\n return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ?\n x1 - x2 > 0 ?\n 'Left' :\n 'Right' :\n y1 - y2 > 0 ?\n 'Up' :\n 'Down';\n }\n\n var offcanvas = {\n mixins: [Modal, Swipe],\n\n args: 'mode',\n\n props: {\n mode: String,\n flip: Boolean,\n overlay: Boolean\n },\n\n data: {\n mode: 'slide',\n flip: false,\n overlay: false,\n clsPage: 'uk-offcanvas-page',\n clsContainer: 'uk-offcanvas-container',\n selPanel: '.uk-offcanvas-bar',\n clsFlip: 'uk-offcanvas-flip',\n clsContainerAnimation: 'uk-offcanvas-container-animation',\n clsSidebarAnimation: 'uk-offcanvas-bar-animation',\n clsMode: 'uk-offcanvas',\n clsOverlay: 'uk-offcanvas-overlay',\n selClose: '.uk-offcanvas-close',\n container: false\n },\n\n computed: {\n clsFlip(_ref) {let { flip, clsFlip } = _ref;\n return flip ? clsFlip : '';\n },\n\n clsOverlay(_ref2) {let { overlay, clsOverlay } = _ref2;\n return overlay ? clsOverlay : '';\n },\n\n clsMode(_ref3) {let { mode, clsMode } = _ref3;\n return clsMode + \"-\" + mode;\n },\n\n clsSidebarAnimation(_ref4) {let { mode, clsSidebarAnimation } = _ref4;\n return mode === 'none' || mode === 'reveal' ? '' : clsSidebarAnimation;\n },\n\n clsContainerAnimation(_ref5) {let { mode, clsContainerAnimation } = _ref5;\n return mode !== 'push' && mode !== 'reveal' ? '' : clsContainerAnimation;\n },\n\n transitionElement(_ref6) {let { mode } = _ref6;\n return mode === 'reveal' ? parent(this.panel) : this.panel;\n }\n },\n\n update: {\n read() {\n if (this.isToggled() && !isVisible(this.$el)) {\n this.hide();\n }\n },\n\n events: ['resize']\n },\n\n events: [\n {\n name: 'touchmove',\n\n self: true,\n passive: false,\n\n filter() {\n return this.overlay;\n },\n\n handler(e) {\n e.cancelable && e.preventDefault();\n }\n },\n\n {\n name: 'show',\n\n self: true,\n\n handler() {\n if (this.mode === 'reveal' && !hasClass(parent(this.panel), this.clsMode)) {\n wrapAll(this.panel, '
');\n addClass(parent(this.panel), this.clsMode);\n }\n\n const { body, scrollingElement } = document;\n\n addClass(body, this.clsContainer, this.clsFlip);\n css(body, 'touch-action', 'pan-y pinch-zoom');\n css(this.$el, 'display', 'block');\n css(this.panel, 'maxWidth', scrollingElement.clientWidth);\n addClass(this.$el, this.clsOverlay);\n addClass(\n this.panel,\n this.clsSidebarAnimation,\n this.mode === 'reveal' ? '' : this.clsMode);\n\n\n height(body); // force reflow\n addClass(body, this.clsContainerAnimation);\n\n this.clsContainerAnimation && suppressUserScale();\n }\n },\n\n {\n name: 'hide',\n\n self: true,\n\n handler() {\n removeClass(document.body, this.clsContainerAnimation);\n css(document.body, 'touch-action', '');\n }\n },\n\n {\n name: 'hidden',\n\n self: true,\n\n handler() {\n this.clsContainerAnimation && resumeUserScale();\n\n if (this.mode === 'reveal') {\n unwrap(this.panel);\n }\n\n removeClass(this.panel, this.clsSidebarAnimation, this.clsMode);\n removeClass(this.$el, this.clsOverlay);\n css(this.$el, 'display', '');\n css(this.panel, 'maxWidth', '');\n removeClass(document.body, this.clsContainer, this.clsFlip);\n }\n },\n\n {\n name: 'swipeLeft swipeRight',\n\n handler(e) {\n if (this.isToggled() && endsWith(e.type, 'Left') ^ this.flip) {\n this.hide();\n }\n }\n }]\n\n };\n\n // Chrome in responsive mode zooms page upon opening offcanvas\n function suppressUserScale() {\n getViewport().content += ',user-scalable=0';\n }\n\n function resumeUserScale() {\n const viewport = getViewport();\n viewport.content = viewport.content.replace(/,user-scalable=0$/, '');\n }\n\n function getViewport() {\n return (\n $('meta[name=\"viewport\"]', document.head) || append(document.head, ''));\n\n }\n\n var overflowAuto = {\n mixins: [Class, Resize],\n\n props: {\n selContainer: String,\n selContent: String,\n minHeight: Number\n },\n\n data: {\n selContainer: '.uk-modal',\n selContent: '.uk-modal-dialog',\n minHeight: 150\n },\n\n computed: {\n container(_ref, $el) {let { selContainer } = _ref;\n return closest($el, selContainer);\n },\n\n content(_ref2, $el) {let { selContent } = _ref2;\n return closest($el, selContent);\n }\n },\n\n resizeTargets() {\n return [this.container, this.content];\n },\n\n update: {\n read() {\n if (!this.content || !this.container || !isVisible(this.$el)) {\n return false;\n }\n\n return {\n max: Math.max(\n this.minHeight,\n height(this.container) - (dimensions(this.content).height - height(this.$el)))\n\n };\n },\n\n write(_ref3) {let { max } = _ref3;\n css(this.$el, { minHeight: this.minHeight, maxHeight: max });\n },\n\n events: ['resize']\n }\n };\n\n var responsive = {\n mixins: [Resize],\n\n props: ['width', 'height'],\n\n resizeTargets() {\n return [this.$el, parent(this.$el)];\n },\n\n connected() {\n addClass(this.$el, 'uk-responsive-width');\n },\n\n update: {\n read() {\n return isVisible(this.$el) && this.width && this.height ?\n { width: width(parent(this.$el)), height: this.height } :\n false;\n },\n\n write(dim) {\n height(\n this.$el,\n Dimensions.contain(\n {\n height: this.height,\n width: this.width\n },\n dim).\n height);\n\n },\n\n events: ['resize']\n }\n };\n\n var scroll = {\n props: {\n offset: Number\n },\n\n data: {\n offset: 0\n },\n\n connected() {\n registerClick(this);\n },\n\n disconnected() {\n unregisterClick(this);\n },\n\n methods: {\n async scrollTo(el) {\n el = el && $(el) || document.body;\n\n if (trigger(this.$el, 'beforescroll', [this, el])) {\n await scrollIntoView(el, { offset: this.offset });\n trigger(this.$el, 'scrolled', [this, el]);\n }\n }\n }\n };\n\n const components$1 = new Set();\n function registerClick(cmp) {\n if (!components$1.size) {\n on(document, 'click', clickHandler);\n }\n\n components$1.add(cmp);\n }\n\n function unregisterClick(cmp) {\n components$1.delete(cmp);\n\n if (!components$1.size) {\n off(document, 'click', clickHandler);\n }\n }\n\n function clickHandler(e) {\n if (e.defaultPrevented) {\n return;\n }\n\n for (const component of components$1) {\n if (within(e.target, component.$el)) {\n e.preventDefault();\n component.scrollTo(getTargetElement(component.$el));\n }\n }\n }\n\n function getTargetElement(el) {\n return document.getElementById(decodeURIComponent(el.hash).substring(1));\n }\n\n var scrollspy = {\n mixins: [Scroll],\n\n args: 'cls',\n\n props: {\n cls: String,\n target: String,\n hidden: Boolean,\n offsetTop: Number,\n offsetLeft: Number,\n repeat: Boolean,\n delay: Number\n },\n\n data: () => ({\n cls: '',\n target: false,\n hidden: true,\n offsetTop: 0,\n offsetLeft: 0,\n repeat: false,\n delay: 0,\n inViewClass: 'uk-scrollspy-inview'\n }),\n\n computed: {\n elements: {\n get(_ref, $el) {let { target } = _ref;\n return target ? $$(target, $el) : [$el];\n },\n\n watch(elements, prev) {\n if (this.hidden) {\n // use `opacity:0` instead of `visibility:hidden` to make content focusable with keyboard\n css(filter(elements, \":not(.\" + this.inViewClass + \")\"), 'opacity', 0);\n }\n\n if (!isEqual(elements, prev)) {\n this.$reset();\n }\n },\n\n immediate: true\n }\n },\n\n connected() {\n this._data.elements = new Map();\n this.registerObserver(\n observeIntersection(\n this.elements,\n (records) => {\n const elements = this._data.elements;\n for (const { target: el, isIntersecting } of records) {\n if (!elements.has(el)) {\n elements.set(el, {\n cls: data(el, 'uk-scrollspy-class') || this.cls\n });\n }\n\n const state = elements.get(el);\n if (!this.repeat && state.show) {\n continue;\n }\n\n state.show = isIntersecting;\n }\n\n this.$emit();\n },\n {\n rootMargin: toPx(this.offsetTop, 'height') - 1 + \"px \" + (\n toPx(this.offsetLeft, 'width') - 1) + \"px\"\n\n },\n false));\n\n\n },\n\n disconnected() {\n for (const [el, state] of this._data.elements.entries()) {\n removeClass(el, this.inViewClass, (state == null ? void 0 : state.cls) || '');\n }\n },\n\n update: [\n {\n write(data) {\n for (const [el, state] of data.elements.entries()) {\n if (state.show && !state.inview && !state.queued) {\n state.queued = true;\n\n data.promise = (data.promise || Promise.resolve()).\n then(() => new Promise((resolve) => setTimeout(resolve, this.delay))).\n then(() => {\n this.toggle(el, true);\n setTimeout(() => {\n state.queued = false;\n this.$emit();\n }, 300);\n });\n } else if (!state.show && state.inview && !state.queued && this.repeat) {\n this.toggle(el, false);\n }\n }\n }\n }],\n\n\n methods: {\n toggle(el, inview) {\n const state = this._data.elements.get(el);\n\n if (!state) {\n return;\n }\n\n state.off == null ? void 0 : state.off();\n\n css(el, 'opacity', !inview && this.hidden ? 0 : '');\n\n toggleClass(el, this.inViewClass, inview);\n toggleClass(el, state.cls);\n\n if (/\\buk-animation-/.test(state.cls)) {\n const removeAnimationClasses = () => removeClasses(el, 'uk-animation-[\\\\w-]+');\n if (inview) {\n state.off = once(el, 'animationcancel animationend', removeAnimationClasses);\n } else {\n removeAnimationClasses();\n }\n }\n\n trigger(el, inview ? 'inview' : 'outview');\n\n state.inview = inview;\n\n // change to `visibility: hidden` does not trigger observers\n this.$update(el);\n }\n }\n };\n\n var scrollspyNav = {\n mixins: [Scroll],\n\n props: {\n cls: String,\n closest: String,\n scroll: Boolean,\n overflow: Boolean,\n offset: Number\n },\n\n data: {\n cls: 'uk-active',\n closest: false,\n scroll: false,\n overflow: true,\n offset: 0\n },\n\n computed: {\n links: {\n get(_, $el) {\n return $$('a[href*=\"#\"]', $el).filter((el) => el.hash && isSameSiteAnchor(el));\n },\n\n watch(links) {\n if (this.scroll) {\n this.$create('scroll', links, { offset: this.offset || 0 });\n }\n },\n\n immediate: true\n },\n\n elements(_ref) {let { closest: selector } = _ref;\n return closest(this.links, selector || '*');\n }\n },\n\n update: [\n {\n read() {\n const targets = this.links.map(getTargetElement).filter(Boolean);\n\n const { length } = targets;\n\n if (!length || !isVisible(this.$el)) {\n return false;\n }\n\n const [scrollElement] = scrollParents(targets, /auto|scroll/, true);\n const { scrollTop, scrollHeight } = scrollElement;\n const viewport = offsetViewport(scrollElement);\n const max = scrollHeight - viewport.height;\n let active = false;\n\n if (scrollTop === max) {\n active = length - 1;\n } else {\n for (let i = 0; i < targets.length; i++) {\n if (offset(targets[i]).top - viewport.top - this.offset > 0) {\n break;\n }\n active = +i;\n }\n\n if (active === false && this.overflow) {\n active = 0;\n }\n }\n\n return { active };\n },\n\n write(_ref2) {let { active } = _ref2;\n const changed = active !== false && !hasClass(this.elements[active], this.cls);\n\n this.links.forEach((el) => el.blur());\n for (let i = 0; i < this.elements.length; i++) {\n toggleClass(this.elements[i], this.cls, +i === active);\n }\n\n if (changed) {\n trigger(this.$el, 'active', [active, this.elements[active]]);\n }\n },\n\n events: ['scroll', 'resize']\n }]\n\n };\n\n var sticky = {\n mixins: [Class, Media, Resize, Scroll],\n\n props: {\n position: String,\n top: null,\n bottom: null,\n start: null,\n end: null,\n offset: String,\n overflowFlip: Boolean,\n animation: String,\n clsActive: String,\n clsInactive: String,\n clsFixed: String,\n clsBelow: String,\n selTarget: String,\n showOnUp: Boolean,\n targetOffset: Number\n },\n\n data: {\n position: 'top',\n top: false,\n bottom: false,\n start: false,\n end: false,\n offset: 0,\n overflowFlip: false,\n animation: '',\n clsActive: 'uk-active',\n clsInactive: '',\n clsFixed: 'uk-sticky-fixed',\n clsBelow: 'uk-sticky-below',\n selTarget: '',\n showOnUp: false,\n targetOffset: false\n },\n\n computed: {\n selTarget(_ref, $el) {let { selTarget } = _ref;\n return selTarget && $(selTarget, $el) || $el;\n }\n },\n\n resizeTargets() {\n return document.documentElement;\n },\n\n connected() {\n this.start = coerce(this.start || this.top);\n this.end = coerce(this.end || this.bottom);\n\n this.placeholder =\n $('+ .uk-sticky-placeholder', this.$el) ||\n $('
');\n this.isFixed = false;\n this.setActive(false);\n },\n\n disconnected() {\n if (this.isFixed) {\n this.hide();\n removeClass(this.selTarget, this.clsInactive);\n }\n\n remove$1(this.placeholder);\n this.placeholder = null;\n },\n\n events: [\n {\n name: 'resize',\n\n el() {\n return window;\n },\n\n handler() {\n this.$emit('resize');\n }\n },\n {\n name: 'load hashchange popstate',\n\n el() {\n return window;\n },\n\n filter() {\n return this.targetOffset !== false;\n },\n\n handler() {\n const { scrollingElement } = document;\n\n if (!location.hash || scrollingElement.scrollTop === 0) {\n return;\n }\n\n setTimeout(() => {\n const targetOffset = offset($(location.hash));\n const elOffset = offset(this.$el);\n\n if (this.isFixed && intersectRect(targetOffset, elOffset)) {\n scrollingElement.scrollTop =\n targetOffset.top -\n elOffset.height -\n toPx(this.targetOffset, 'height', this.placeholder) -\n toPx(this.offset, 'height', this.placeholder);\n }\n });\n }\n }],\n\n\n update: [\n {\n read(_ref2, types) {let { height: height$1, width, margin } = _ref2;\n this.inactive = !this.matchMedia || !isVisible(this.$el);\n\n if (this.inactive) {\n return false;\n }\n\n const hide = this.active && types.has('resize');\n if (hide) {\n css(this.selTarget, 'transition', '0s');\n this.hide();\n }\n\n if (!this.active) {\n ({ height: height$1, width } = offset(this.$el));\n margin = css(this.$el, 'margin');\n }\n\n if (hide) {\n this.show();\n requestAnimationFrame(() => css(this.selTarget, 'transition', ''));\n }\n\n const windowHeight = height(window);\n\n let position = this.position;\n if (this.overflowFlip && height$1 > windowHeight) {\n position = position === 'top' ? 'bottom' : 'top';\n }\n\n const referenceElement = this.isFixed ? this.placeholder : this.$el;\n let offset$1 = toPx(this.offset, 'height', referenceElement);\n if (position === 'bottom' && (height$1 < windowHeight || this.overflowFlip)) {\n offset$1 += windowHeight - height$1;\n }\n\n const overflow = this.overflowFlip ?\n 0 :\n Math.max(0, height$1 + offset$1 - windowHeight);\n const topOffset = offset(referenceElement).top;\n\n const start =\n (this.start === false ?\n topOffset :\n parseProp(this.start, this.$el, topOffset)) - offset$1;\n const end =\n this.end === false ?\n document.scrollingElement.scrollHeight - windowHeight :\n parseProp(this.end, this.$el, topOffset + height$1, true) -\n offset(this.$el).height +\n overflow -\n offset$1;\n\n return {\n start,\n end,\n offset: offset$1,\n overflow,\n topOffset,\n height: height$1,\n width,\n margin,\n top: offsetPosition(referenceElement)[0]\n };\n },\n\n write(_ref3) {let { height, width, margin } = _ref3;\n const { placeholder } = this;\n\n css(placeholder, { height, width, margin });\n\n if (!within(placeholder, document)) {\n after(this.$el, placeholder);\n placeholder.hidden = true;\n }\n },\n\n events: ['resize']\n },\n\n {\n read(_ref4)\n\n\n\n\n\n\n {let { scroll: prevScroll = 0, dir: prevDir = 'down', overflow, overflowScroll = 0, start, end } = _ref4;\n const scroll = document.scrollingElement.scrollTop;\n const dir = prevScroll <= scroll ? 'down' : 'up';\n\n return {\n dir,\n prevDir,\n scroll,\n prevScroll,\n offsetParentTop: offset(\n (this.isFixed ? this.placeholder : this.$el).offsetParent).\n top,\n overflowScroll: clamp(\n overflowScroll + clamp(scroll, start, end) - clamp(prevScroll, start, end),\n 0,\n overflow)\n\n };\n },\n\n write(data, types) {\n const isScrollUpdate = types.has('scroll');\n const {\n initTimestamp = 0,\n dir,\n prevDir,\n scroll,\n prevScroll = 0,\n top,\n start,\n topOffset,\n height\n } = data;\n\n if (\n scroll < 0 ||\n scroll === prevScroll && isScrollUpdate ||\n this.showOnUp && !isScrollUpdate && !this.isFixed)\n {\n return;\n }\n\n const now = Date.now();\n if (now - initTimestamp > 300 || dir !== prevDir) {\n data.initScroll = scroll;\n data.initTimestamp = now;\n }\n\n if (\n this.showOnUp &&\n !this.isFixed &&\n Math.abs(data.initScroll - scroll) <= 30 &&\n Math.abs(prevScroll - scroll) <= 10)\n {\n return;\n }\n\n if (\n this.inactive ||\n scroll < start ||\n this.showOnUp && (\n scroll <= start ||\n dir === 'down' && isScrollUpdate ||\n dir === 'up' && !this.isFixed && scroll <= topOffset + height))\n {\n if (!this.isFixed) {\n if (Animation.inProgress(this.$el) && top > scroll) {\n Animation.cancel(this.$el);\n this.hide();\n }\n\n return;\n }\n\n this.isFixed = false;\n\n if (this.animation && scroll > topOffset) {\n Animation.cancel(this.$el);\n Animation.out(this.$el, this.animation).then(() => this.hide(), noop);\n } else {\n this.hide();\n }\n } else if (this.isFixed) {\n this.update();\n } else if (this.animation && scroll > topOffset) {\n Animation.cancel(this.$el);\n this.show();\n Animation.in(this.$el, this.animation).catch(noop);\n } else {\n this.show();\n }\n },\n\n events: ['resize', 'scroll']\n }],\n\n\n methods: {\n show() {\n this.isFixed = true;\n this.update();\n this.placeholder.hidden = false;\n },\n\n hide() {\n this.setActive(false);\n removeClass(this.$el, this.clsFixed, this.clsBelow);\n css(this.$el, { position: '', top: '', width: '' });\n this.placeholder.hidden = true;\n },\n\n update() {\n let {\n width,\n scroll = 0,\n overflow,\n overflowScroll = 0,\n start,\n end,\n offset,\n topOffset,\n height,\n offsetParentTop\n } = this._data;\n const active = start !== 0 || scroll > start;\n let position = 'fixed';\n\n if (scroll > end) {\n offset += end - offsetParentTop;\n position = 'absolute';\n }\n\n if (overflow) {\n offset -= overflowScroll;\n }\n\n css(this.$el, {\n position,\n top: offset + \"px\",\n width\n });\n\n this.setActive(active);\n toggleClass(this.$el, this.clsBelow, scroll > topOffset + height);\n addClass(this.$el, this.clsFixed);\n },\n\n setActive(active) {\n const prev = this.active;\n this.active = active;\n if (active) {\n replaceClass(this.selTarget, this.clsInactive, this.clsActive);\n prev !== active && trigger(this.$el, 'active');\n } else {\n replaceClass(this.selTarget, this.clsActive, this.clsInactive);\n prev !== active && trigger(this.$el, 'inactive');\n }\n }\n }\n };\n\n function parseProp(value, el, propOffset, padding) {\n if (!value) {\n return 0;\n }\n\n if (isNumeric(value) || isString(value) && value.match(/^-?\\d/)) {\n return propOffset + toPx(value, 'height', el, true);\n } else {\n const refElement = value === true ? parent(el) : query(value, el);\n return (\n offset(refElement).bottom - (\n padding && refElement && within(el, refElement) ?\n toFloat(css(refElement, 'paddingBottom')) :\n 0));\n\n }\n }\n\n function coerce(value) {\n if (value === 'true') {\n return true;\n } else if (value === 'false') {\n return false;\n }\n return value;\n }\n\n var Switcher = {\n mixins: [Lazyload, Swipe, Togglable],\n\n args: 'connect',\n\n props: {\n connect: String,\n toggle: String,\n itemNav: String,\n active: Number\n },\n\n data: {\n connect: '~.uk-switcher',\n toggle: '> * > :first-child',\n itemNav: false,\n active: 0,\n cls: 'uk-active',\n attrItem: 'uk-switcher-item'\n },\n\n computed: {\n connects: {\n get(_ref, $el) {let { connect } = _ref;\n return queryAll(connect, $el);\n },\n\n watch(connects) {\n if (this.swiping) {\n css(connects, 'touchAction', 'pan-y pinch-zoom');\n }\n },\n\n document: true,\n immediate: true\n },\n\n connectChildren: {\n get() {\n return this.connects.map((el) => children(el)).flat();\n },\n\n watch() {\n const index = this.index();\n for (const el of this.connects) {\n children(el).forEach((child, i) => toggleClass(child, this.cls, i === index));\n this.lazyload(this.$el, children(el));\n }\n },\n\n immediate: true\n },\n\n toggles: {\n get(_ref2, $el) {let { toggle } = _ref2;\n return $$(toggle, $el).filter(\n (el) => !matches(el, '.uk-disabled *, .uk-disabled, [disabled]'));\n\n },\n\n watch(toggles) {\n const active = this.index();\n this.show(~active ? active : toggles[this.active] || toggles[0]);\n },\n\n immediate: true\n },\n\n children() {\n return children(this.$el).filter((child) =>\n this.toggles.some((toggle) => within(toggle, child)));\n\n },\n\n swipeTarget() {\n return this.connects;\n }\n },\n\n events: [\n {\n name: 'click',\n\n delegate() {\n return this.toggle;\n },\n\n handler(e) {\n e.preventDefault();\n this.show(e.current);\n }\n },\n\n {\n name: 'click',\n\n el() {\n return this.connects.concat(this.itemNav ? queryAll(this.itemNav, this.$el) : []);\n },\n\n delegate() {\n return \"[\" + this.attrItem + \"],[data-\" + this.attrItem + \"]\";\n },\n\n handler(e) {\n e.preventDefault();\n this.show(data(e.current, this.attrItem));\n }\n },\n\n {\n name: 'swipeRight swipeLeft',\n\n filter() {\n return this.swiping;\n },\n\n el() {\n return this.connects;\n },\n\n handler(_ref3) {let { type } = _ref3;\n this.show(endsWith(type, 'Left') ? 'next' : 'previous');\n }\n }],\n\n\n methods: {\n index() {\n return findIndex(this.children, (el) => hasClass(el, this.cls));\n },\n\n show(item) {\n const prev = this.index();\n const next = getIndex(item, this.toggles, prev);\n const active = getIndex(this.children[next], children(this.$el));\n children(this.$el).forEach((child, i) => {\n toggleClass(child, this.cls, active === i);\n attr(this.toggles[i], 'aria-expanded', active === i);\n });\n\n const animate = prev >= 0 && prev !== next;\n this.connects.forEach(async (_ref4) => {let { children } = _ref4;\n await this.toggleElement(\n toNodes(children).filter((child) => hasClass(child, this.cls)),\n false,\n animate);\n\n await this.toggleElement(children[active], true, animate);\n });\n }\n }\n };\n\n var tab = {\n mixins: [Class],\n\n extends: Switcher,\n\n props: {\n media: Boolean\n },\n\n data: {\n media: 960,\n attrItem: 'uk-tab-item'\n },\n\n connected() {\n const cls = hasClass(this.$el, 'uk-tab-left') ?\n 'uk-tab-left' :\n hasClass(this.$el, 'uk-tab-right') ?\n 'uk-tab-right' :\n false;\n\n if (cls) {\n this.$create('toggle', this.$el, { cls, mode: 'media', media: this.media });\n }\n }\n };\n\n const KEY_SPACE = 32;\n\n var toggle = {\n mixins: [Lazyload, Media, Togglable],\n\n args: 'target',\n\n props: {\n href: String,\n target: null,\n mode: 'list',\n queued: Boolean\n },\n\n data: {\n href: false,\n target: false,\n mode: 'click',\n queued: true\n },\n\n computed: {\n target: {\n get(_ref, $el) {let { href, target } = _ref;\n target = queryAll(target || href, $el);\n return target.length && target || [$el];\n },\n\n watch() {\n this.updateAria();\n this.lazyload(this.$el, this.target);\n },\n\n document: true,\n immediate: true\n }\n },\n\n connected() {\n if (!includes(this.mode, 'media') && !isFocusable(this.$el)) {\n attr(this.$el, 'tabindex', '0');\n }\n },\n\n events: [\n {\n name: pointerDown,\n\n filter() {\n return includes(this.mode, 'hover');\n },\n\n handler(e) {\n this._preventClick = null;\n\n if (!isTouch(e) || this._showState) {\n return;\n }\n\n // Clicking a button does not give it focus on all browsers and platforms\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#clicking_and_focus\n trigger(this.$el, 'focus');\n once(\n document,\n pointerDown,\n () => trigger(this.$el, 'blur'),\n true,\n (e) => !within(e.target, this.$el));\n\n\n // Prevent initial click to prevent double toggle through focus + click\n if (includes(this.mode, 'click')) {\n this._preventClick = true;\n }\n }\n },\n\n {\n name: pointerEnter + \" \" + pointerLeave + \" focus blur\",\n\n filter() {\n return includes(this.mode, 'hover');\n },\n\n handler(e) {\n if (isTouch(e)) {\n return;\n }\n\n const show = includes([pointerEnter, 'focus'], e.type);\n const expanded = attr(this.$el, 'aria-expanded');\n\n // Skip hide if still hovered or focused\n if (\n !show && (\n e.type === pointerLeave && matches(this.$el, ':focus') ||\n e.type === 'blur' && matches(this.$el, ':hover')))\n {\n return;\n }\n\n // Skip if state does not change e.g. hover + focus received\n if (this._showState && show && expanded !== this._showState) {\n // Ensure reset if state has changed through click\n if (!show) {\n this._showState = null;\n }\n return;\n }\n\n this._showState = show ? expanded : null;\n\n this.toggle(\"toggle\" + (show ? 'show' : 'hide'));\n }\n },\n\n {\n name: 'keydown',\n\n filter() {\n return includes(this.mode, 'click') && !isTag(this.$el, 'input');\n },\n\n handler(e) {\n if (e.keyCode === KEY_SPACE) {\n e.preventDefault();\n this.$el.click();\n }\n }\n },\n\n {\n name: 'click',\n\n filter() {\n return ['click', 'hover'].some((mode) => includes(this.mode, mode));\n },\n\n handler(e) {\n let link;\n if (\n this._preventClick ||\n closest(e.target, 'a[href=\"#\"], a[href=\"\"]') ||\n (link = closest(e.target, 'a[href]')) && (\n attr(this.$el, 'aria-expanded') !== 'true' ||\n link.hash && matches(this.target, link.hash)))\n {\n e.preventDefault();\n }\n\n if (!this._preventClick && includes(this.mode, 'click')) {\n this.toggle();\n }\n }\n },\n\n {\n name: 'hide show',\n\n self: true,\n\n el() {\n return this.target;\n },\n\n handler(_ref2) {let { target, type } = _ref2;\n this.updateAria(target === this.target[0] && type === 'show');\n }\n },\n\n {\n name: 'mediachange',\n\n filter() {\n return includes(this.mode, 'media');\n },\n\n el() {\n return this.target;\n },\n\n handler(e, mediaObj) {\n if (mediaObj.matches ^ this.isToggled(this.target)) {\n this.toggle();\n }\n }\n }],\n\n\n methods: {\n async toggle(type) {\n if (!trigger(this.target, type || 'toggle', [this])) {\n return;\n }\n\n if (!this.queued) {\n return this.toggleElement(this.target);\n }\n\n const leaving = this.target.filter((el) => hasClass(el, this.clsLeave));\n\n if (leaving.length) {\n for (const el of this.target) {\n const isLeaving = includes(leaving, el);\n this.toggleElement(el, isLeaving, isLeaving);\n }\n return;\n }\n\n const toggled = this.target.filter(this.isToggled);\n await this.toggleElement(toggled, false);\n await this.toggleElement(\n this.target.filter((el) => !includes(toggled, el)),\n true);\n\n },\n\n updateAria(toggled) {\n if (includes(this.mode, 'media')) {\n return;\n }\n\n attr(\n this.$el,\n 'aria-expanded',\n isBoolean(toggled) ? toggled : this.isToggled(this.target));\n\n }\n }\n };\n\n var components = /*#__PURE__*/Object.freeze({\n __proto__: null,\n Accordion: Accordion,\n Alert: alert,\n Cover: cover,\n Drop: drop,\n Dropdown: drop,\n FormCustom: formCustom,\n Grid: grid,\n HeightMatch: heightMatch,\n HeightViewport: heightViewport,\n Icon: Icon,\n Img: img,\n Leader: leader,\n Margin: Margin,\n Modal: modal,\n Nav: nav,\n Navbar: navbar,\n Offcanvas: offcanvas,\n OverflowAuto: overflowAuto,\n Responsive: responsive,\n Scroll: scroll,\n Scrollspy: scrollspy,\n ScrollspyNav: scrollspyNav,\n Sticky: sticky,\n Svg: SVG,\n Switcher: Switcher,\n Tab: tab,\n Toggle: toggle,\n Video: Video,\n Close: Close,\n Spinner: Spinner,\n NavParentIcon: NavParentIcon,\n SlidenavNext: Slidenav,\n SlidenavPrevious: Slidenav,\n SearchIcon: Search,\n Marker: IconComponent,\n NavbarParentIcon: IconComponent,\n NavbarToggleIcon: IconComponent,\n OverlayIcon: IconComponent,\n PaginationNext: IconComponent,\n PaginationPrevious: IconComponent,\n Totop: IconComponent\n });\n\n // register components\n each(components, (component, name) => UIkit.component(name, component));\n\n boot(UIkit);\n\n return UIkit;\n\n}));\n","const { hasOwnProperty, toString } = Object.prototype;\n\nexport function hasOwn(obj, key) {\n return hasOwnProperty.call(obj, key);\n}\n\nconst hyphenateRe = /\\B([A-Z])/g;\n\nexport const hyphenate = memoize((str) => str.replace(hyphenateRe, '-$1').toLowerCase());\n\nconst camelizeRe = /-(\\w)/g;\n\nexport const camelize = memoize((str) => str.replace(camelizeRe, toUpper));\n\nexport const ucfirst = memoize((str) =>\n str.length ? toUpper(null, str.charAt(0)) + str.slice(1) : ''\n);\n\nfunction toUpper(_, c) {\n return c ? c.toUpperCase() : '';\n}\n\nexport function startsWith(str, search) {\n return str?.startsWith?.(search);\n}\n\nexport function endsWith(str, search) {\n return str?.endsWith?.(search);\n}\n\nexport function includes(obj, search) {\n return obj?.includes?.(search);\n}\n\nexport function findIndex(array, predicate) {\n return array?.findIndex?.(predicate);\n}\n\nexport const { isArray, from: toArray } = Array;\nexport const { assign } = Object;\n\nexport function isFunction(obj) {\n return typeof obj === 'function';\n}\n\nexport function isObject(obj) {\n return obj !== null && typeof obj === 'object';\n}\n\nexport function isPlainObject(obj) {\n return toString.call(obj) === '[object Object]';\n}\n\nexport function isWindow(obj) {\n return isObject(obj) && obj === obj.window;\n}\n\nexport function isDocument(obj) {\n return nodeType(obj) === 9;\n}\n\nexport function isNode(obj) {\n return nodeType(obj) >= 1;\n}\n\nexport function isElement(obj) {\n return nodeType(obj) === 1;\n}\n\nfunction nodeType(obj) {\n return !isWindow(obj) && isObject(obj) && obj.nodeType;\n}\n\nexport function isBoolean(value) {\n return typeof value === 'boolean';\n}\n\nexport function isString(value) {\n return typeof value === 'string';\n}\n\nexport function isNumber(value) {\n return typeof value === 'number';\n}\n\nexport function isNumeric(value) {\n return isNumber(value) || (isString(value) && !isNaN(value - parseFloat(value)));\n}\n\nexport function isEmpty(obj) {\n return !(isArray(obj) ? obj.length : isObject(obj) ? Object.keys(obj).length : false);\n}\n\nexport function isUndefined(value) {\n return value === void 0;\n}\n\nexport function toBoolean(value) {\n return isBoolean(value)\n ? value\n : value === 'true' || value === '1' || value === ''\n ? true\n : value === 'false' || value === '0'\n ? false\n : value;\n}\n\nexport function toNumber(value) {\n const number = Number(value);\n return isNaN(number) ? false : number;\n}\n\nexport function toFloat(value) {\n return parseFloat(value) || 0;\n}\n\nexport function toNode(element) {\n return toNodes(element)[0];\n}\n\nexport function toNodes(element) {\n return (element && (isNode(element) ? [element] : Array.from(element).filter(isNode))) || [];\n}\n\nexport function toWindow(element) {\n if (isWindow(element)) {\n return element;\n }\n\n element = toNode(element);\n const document = isDocument(element) ? element : element?.ownerDocument;\n\n return document?.defaultView || window;\n}\n\nexport function isEqual(value, other) {\n return (\n value === other ||\n (isObject(value) &&\n isObject(other) &&\n Object.keys(value).length === Object.keys(other).length &&\n each(value, (val, key) => val === other[key]))\n );\n}\n\nexport function swap(value, a, b) {\n return value.replace(new RegExp(`${a}|${b}`, 'g'), (match) => (match === a ? b : a));\n}\n\nexport function last(array) {\n return array[array.length - 1];\n}\n\nexport function each(obj, cb) {\n for (const key in obj) {\n if (false === cb(obj[key], key)) {\n return false;\n }\n }\n return true;\n}\n\nexport function sortBy(array, prop) {\n return array\n .slice()\n .sort(({ [prop]: propA = 0 }, { [prop]: propB = 0 }) =>\n propA > propB ? 1 : propB > propA ? -1 : 0\n );\n}\n\nexport function uniqueBy(array, prop) {\n const seen = new Set();\n return array.filter(({ [prop]: check }) => (seen.has(check) ? false : seen.add(check)));\n}\n\nexport function clamp(number, min = 0, max = 1) {\n return Math.min(Math.max(toNumber(number) || 0, min), max);\n}\n\nexport function noop() {}\n\nexport function intersectRect(...rects) {\n return [\n ['bottom', 'top'],\n ['right', 'left'],\n ].every(\n ([minProp, maxProp]) =>\n Math.min(...rects.map(({ [minProp]: min }) => min)) -\n Math.max(...rects.map(({ [maxProp]: max }) => max)) >\n 0\n );\n}\n\nexport function pointInRect(point, rect) {\n return (\n point.x <= rect.right &&\n point.x >= rect.left &&\n point.y <= rect.bottom &&\n point.y >= rect.top\n );\n}\n\nfunction ratio(dimensions, prop, value) {\n const aProp = prop === 'width' ? 'height' : 'width';\n\n return {\n [aProp]: dimensions[prop]\n ? Math.round((value * dimensions[aProp]) / dimensions[prop])\n : dimensions[aProp],\n [prop]: value,\n };\n}\n\nfunction contain(dimensions, maxDimensions) {\n dimensions = { ...dimensions };\n\n for (const prop in dimensions) {\n dimensions =\n dimensions[prop] > maxDimensions[prop]\n ? ratio(dimensions, prop, maxDimensions[prop])\n : dimensions;\n }\n\n return dimensions;\n}\n\nfunction cover(dimensions, maxDimensions) {\n dimensions = contain(dimensions, maxDimensions);\n\n for (const prop in dimensions) {\n dimensions =\n dimensions[prop] < maxDimensions[prop]\n ? ratio(dimensions, prop, maxDimensions[prop])\n : dimensions;\n }\n\n return dimensions;\n}\n\nexport const Dimensions = { ratio, contain, cover };\n\nexport function getIndex(i, elements, current = 0, finite = false) {\n elements = toNodes(elements);\n\n const { length } = elements;\n\n if (!length) {\n return -1;\n }\n\n i = isNumeric(i)\n ? toNumber(i)\n : i === 'next'\n ? current + 1\n : i === 'previous'\n ? current - 1\n : elements.indexOf(toNode(i));\n\n if (finite) {\n return clamp(i, 0, length - 1);\n }\n\n i %= length;\n\n return i < 0 ? i + length : i;\n}\n\nexport function memoize(fn) {\n const cache = Object.create(null);\n return (key) => cache[key] || (cache[key] = fn(key));\n}\n\nexport class Deferred {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n}\n","import { isFunction, isObject, isUndefined, toNode, toNodes } from './lang';\n\nexport function attr(element, name, value) {\n if (isObject(name)) {\n for (const key in name) {\n attr(element, key, name[key]);\n }\n return;\n }\n\n if (isUndefined(value)) {\n return toNode(element)?.getAttribute(name);\n } else {\n for (const el of toNodes(element)) {\n if (isFunction(value)) {\n value = value.call(el, attr(el, name));\n }\n\n if (value === null) {\n removeAttr(el, name);\n } else {\n el.setAttribute(name, value);\n }\n }\n }\n}\n\nexport function hasAttr(element, name) {\n return toNodes(element).some((element) => element.hasAttribute(name));\n}\n\nexport function removeAttr(element, name) {\n const elements = toNodes(element);\n for (const attribute of name.split(' ')) {\n for (const element of elements) {\n element.removeAttribute(attribute);\n }\n }\n}\n\nexport function data(element, attribute) {\n for (const name of [attribute, `data-${attribute}`]) {\n if (hasAttr(element, name)) {\n return attr(element, name);\n }\n }\n}\n","import { isElement, isString, startsWith, toNode, toNodes } from './lang';\n\nconst voidElements = {\n area: true,\n base: true,\n br: true,\n col: true,\n embed: true,\n hr: true,\n img: true,\n input: true,\n keygen: true,\n link: true,\n menuitem: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true,\n};\nexport function isVoidElement(element) {\n return toNodes(element).some((element) => voidElements[element.tagName.toLowerCase()]);\n}\n\nexport function isVisible(element) {\n return toNodes(element).some(\n (element) => element.offsetWidth || element.offsetHeight || element.getClientRects().length\n );\n}\n\nexport const selInput = 'input,select,textarea,button';\nexport function isInput(element) {\n return toNodes(element).some((element) => matches(element, selInput));\n}\n\nexport const selFocusable = `${selInput},a[href],[tabindex]`;\nexport function isFocusable(element) {\n return matches(element, selFocusable);\n}\n\nexport function parent(element) {\n return toNode(element)?.parentElement;\n}\n\nexport function filter(element, selector) {\n return toNodes(element).filter((element) => matches(element, selector));\n}\n\nexport function matches(element, selector) {\n return toNodes(element).some((element) => element.matches(selector));\n}\n\nexport function closest(element, selector) {\n return isElement(element)\n ? element.closest(startsWith(selector, '>') ? selector.slice(1) : selector)\n : toNodes(element)\n .map((element) => closest(element, selector))\n .filter(Boolean);\n}\n\nexport function within(element, selector) {\n return isString(selector)\n ? !!closest(element, selector)\n : toNode(selector).contains(toNode(element));\n}\n\nexport function parents(element, selector) {\n const elements = [];\n\n while ((element = parent(element))) {\n if (!selector || matches(element, selector)) {\n elements.push(element);\n }\n }\n\n return elements;\n}\n\nexport function children(element, selector) {\n element = toNode(element);\n const children = element ? toNodes(element.children) : [];\n return selector ? filter(children, selector) : children;\n}\n\nexport function index(element, ref) {\n return ref ? toNodes(element).indexOf(toNode(ref)) : children(parent(element)).indexOf(element);\n}\n","import { attr } from './attr';\nimport { closest, index, matches, parent } from './filter';\nimport { isDocument, isString, memoize, toNode, toNodes } from './lang';\n\nexport function query(selector, context) {\n return find(selector, getContext(selector, context));\n}\n\nexport function queryAll(selector, context) {\n return findAll(selector, getContext(selector, context));\n}\n\nexport function find(selector, context) {\n return toNode(_query(selector, context, 'querySelector'));\n}\n\nexport function findAll(selector, context) {\n return toNodes(_query(selector, context, 'querySelectorAll'));\n}\n\nconst contextSelectorRe = /(^|[^\\\\],)\\s*[!>+~-]/;\nconst isContextSelector = memoize((selector) => selector.match(contextSelectorRe));\n\nfunction getContext(selector, context = document) {\n return (isString(selector) && isContextSelector(selector)) || isDocument(context)\n ? context\n : context.ownerDocument;\n}\n\nconst contextSanitizeRe = /([!>+~-])(?=\\s+[!>+~-]|\\s*$)/g;\nconst sanatize = memoize((selector) => selector.replace(contextSanitizeRe, '$1 *'));\n\nfunction _query(selector, context = document, queryFn) {\n if (!selector || !isString(selector)) {\n return selector;\n }\n\n selector = sanatize(selector);\n\n if (isContextSelector(selector)) {\n const split = splitSelector(selector);\n selector = '';\n for (let sel of split) {\n let ctx = context;\n\n if (sel[0] === '!') {\n const selectors = sel.substr(1).trim().split(' ');\n ctx = closest(parent(context), selectors[0]);\n sel = selectors.slice(1).join(' ').trim();\n if (!sel.length && split.length === 1) {\n return ctx;\n }\n }\n\n if (sel[0] === '-') {\n const selectors = sel.substr(1).trim().split(' ');\n const prev = (ctx || context).previousElementSibling;\n ctx = matches(prev, sel.substr(1)) ? prev : null;\n sel = selectors.slice(1).join(' ');\n }\n\n if (ctx) {\n selector += `${selector ? ',' : ''}${domPath(ctx)} ${sel}`;\n }\n }\n\n context = document;\n }\n\n try {\n return context[queryFn](selector);\n } catch (e) {\n return null;\n }\n}\n\nconst selectorRe = /.*?[^\\\\](?:,|$)/g;\n\nconst splitSelector = memoize((selector) =>\n selector.match(selectorRe).map((selector) => selector.replace(/,$/, '').trim())\n);\n\nfunction domPath(element) {\n const names = [];\n while (element.parentNode) {\n const id = attr(element, 'id');\n if (id) {\n names.unshift(`#${escape(id)}`);\n break;\n } else {\n let { tagName } = element;\n if (tagName !== 'HTML') {\n tagName += `:nth-child(${index(element) + 1})`;\n }\n names.unshift(tagName);\n element = element.parentNode;\n }\n }\n return names.join(' > ');\n}\n\nexport function escape(css) {\n return isString(css) ? CSS.escape(css) : '';\n}\n","import { findAll } from './selector';\nimport { closest, within } from './filter';\nimport { isArray, isFunction, isString, toNode, toNodes } from './lang';\n\nexport function on(...args) {\n let [targets, types, selector, listener, useCapture = false] = getArgs(args);\n\n if (listener.length > 1) {\n listener = detail(listener);\n }\n\n if (useCapture?.self) {\n listener = selfFilter(listener);\n }\n\n if (selector) {\n listener = delegate(selector, listener);\n }\n\n for (const type of types) {\n for (const target of targets) {\n target.addEventListener(type, listener, useCapture);\n }\n }\n\n return () => off(targets, types, listener, useCapture);\n}\n\nexport function off(...args) {\n let [targets, types, , listener, useCapture = false] = getArgs(args);\n for (const type of types) {\n for (const target of targets) {\n target.removeEventListener(type, listener, useCapture);\n }\n }\n}\n\nexport function once(...args) {\n const [element, types, selector, listener, useCapture = false, condition] = getArgs(args);\n const off = on(\n element,\n types,\n selector,\n (e) => {\n const result = !condition || condition(e);\n if (result) {\n off();\n listener(e, result);\n }\n },\n useCapture\n );\n\n return off;\n}\n\nexport function trigger(targets, event, detail) {\n return toEventTargets(targets).every((target) =>\n target.dispatchEvent(createEvent(event, true, true, detail))\n );\n}\n\nexport function createEvent(e, bubbles = true, cancelable = false, detail) {\n if (isString(e)) {\n e = new CustomEvent(e, { bubbles, cancelable, detail });\n }\n\n return e;\n}\n\nfunction getArgs(args) {\n // Event targets\n args[0] = toEventTargets(args[0]);\n\n // Event types\n if (isString(args[1])) {\n args[1] = args[1].split(' ');\n }\n\n // Delegate?\n if (isFunction(args[2])) {\n args.splice(2, 0, false);\n }\n\n return args;\n}\n\nfunction delegate(selector, listener) {\n return (e) => {\n const current =\n selector[0] === '>'\n ? findAll(selector, e.currentTarget)\n .reverse()\n .filter((element) => within(e.target, element))[0]\n : closest(e.target, selector);\n\n if (current) {\n e.current = current;\n listener.call(this, e);\n }\n };\n}\n\nfunction detail(listener) {\n return (e) => (isArray(e.detail) ? listener(e, ...e.detail) : listener(e));\n}\n\nfunction selfFilter(listener) {\n return function (e) {\n if (e.target === e.currentTarget || e.target === e.current) {\n return listener.call(null, e);\n }\n };\n}\n\nfunction isEventTarget(target) {\n return target && 'addEventListener' in target;\n}\n\nfunction toEventTarget(target) {\n return isEventTarget(target) ? target : toNode(target);\n}\n\nexport function toEventTargets(target) {\n return isArray(target)\n ? target.map(toEventTarget).filter(Boolean)\n : isString(target)\n ? findAll(target)\n : isEventTarget(target)\n ? [target]\n : toNodes(target);\n}\n\nexport function isTouch(e) {\n return e.pointerType === 'touch' || !!e.touches;\n}\n\nexport function getEventPos(e) {\n const { clientX: x, clientY: y } = e.touches?.[0] || e.changedTouches?.[0] || e;\n\n return { x, y };\n}\n","import {\n each,\n hyphenate,\n isArray,\n isNumber,\n isNumeric,\n isObject,\n isString,\n isUndefined,\n memoize,\n startsWith,\n toNodes,\n} from './lang';\n\nconst cssNumber = {\n 'animation-iteration-count': true,\n 'column-count': true,\n 'fill-opacity': true,\n 'flex-grow': true,\n 'flex-shrink': true,\n 'font-weight': true,\n 'line-height': true,\n opacity: true,\n order: true,\n orphans: true,\n 'stroke-dasharray': true,\n 'stroke-dashoffset': true,\n widows: true,\n 'z-index': true,\n zoom: true,\n};\n\nexport function css(element, property, value, priority = '') {\n const elements = toNodes(element);\n for (const element of elements) {\n if (isString(property)) {\n property = propName(property);\n\n if (isUndefined(value)) {\n return getComputedStyle(element).getPropertyValue(property);\n } else {\n element.style.setProperty(\n property,\n isNumeric(value) && !cssNumber[property]\n ? `${value}px`\n : value || isNumber(value)\n ? value\n : '',\n priority\n );\n }\n } else if (isArray(property)) {\n const props = {};\n for (const prop of property) {\n props[prop] = css(element, prop);\n }\n return props;\n } else if (isObject(property)) {\n priority = value;\n each(property, (value, property) => css(element, property, value, priority));\n }\n }\n return elements[0];\n}\n\n// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-setproperty\nexport const propName = memoize((name) => vendorPropName(name));\n\nfunction vendorPropName(name) {\n if (startsWith(name, '--')) {\n return name;\n }\n\n name = hyphenate(name);\n\n const { style } = document.documentElement;\n\n if (name in style) {\n return name;\n }\n\n for (const prefix of ['webkit', 'moz']) {\n const prefixedName = `-${prefix}-${name}`;\n if (prefixedName in style) {\n return prefixedName;\n }\n }\n}\n","import { attr } from './attr';\nimport { isUndefined, toNodes } from './lang';\n\nexport function addClass(element, ...args) {\n apply(element, args, 'add');\n}\n\nexport function removeClass(element, ...args) {\n apply(element, args, 'remove');\n}\n\nexport function removeClasses(element, cls) {\n attr(element, 'class', (value) =>\n (value || '').replace(new RegExp(`\\\\b${cls}\\\\b\\\\s?`, 'g'), '')\n );\n}\n\nexport function replaceClass(element, ...args) {\n args[0] && removeClass(element, args[0]);\n args[1] && addClass(element, args[1]);\n}\n\nexport function hasClass(element, cls) {\n [cls] = getClasses(cls);\n return !!cls && toNodes(element).some((node) => node.classList.contains(cls));\n}\n\nexport function toggleClass(element, cls, force) {\n const classes = getClasses(cls);\n\n if (!isUndefined(force)) {\n force = !!force;\n }\n\n for (const node of toNodes(element)) {\n for (const cls of classes) {\n node.classList.toggle(cls, force);\n }\n }\n}\n\nfunction apply(element, args, fn) {\n args = args.reduce((args, arg) => args.concat(getClasses(arg)), []);\n\n for (const node of toNodes(element)) {\n node.classList[fn](...args);\n }\n}\n\nfunction getClasses(str) {\n return String(str).split(/\\s|,/).filter(Boolean);\n}\n","import { attr } from './attr';\nimport { once, trigger } from './event';\nimport { css, propName } from './style';\nimport { startsWith, toNodes } from './lang';\nimport { addClass, hasClass, removeClass, removeClasses } from './class';\n\nfunction transition(element, props, duration = 400, timing = 'linear') {\n duration = Math.round(duration);\n return Promise.all(\n toNodes(element).map(\n (element) =>\n new Promise((resolve, reject) => {\n for (const name in props) {\n const value = css(element, name);\n if (value === '') {\n css(element, name, value);\n }\n }\n\n const timer = setTimeout(() => trigger(element, 'transitionend'), duration);\n\n once(\n element,\n 'transitionend transitioncanceled',\n ({ type }) => {\n clearTimeout(timer);\n removeClass(element, 'uk-transition');\n css(element, {\n transitionProperty: '',\n transitionDuration: '',\n transitionTimingFunction: '',\n });\n type === 'transitioncanceled' ? reject() : resolve(element);\n },\n { self: true }\n );\n\n addClass(element, 'uk-transition');\n css(element, {\n transitionProperty: Object.keys(props).map(propName).join(','),\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: timing,\n ...props,\n });\n })\n )\n );\n}\n\nexport const Transition = {\n start: transition,\n\n async stop(element) {\n trigger(element, 'transitionend');\n await Promise.resolve();\n },\n\n async cancel(element) {\n trigger(element, 'transitioncanceled');\n await Promise.resolve();\n },\n\n inProgress(element) {\n return hasClass(element, 'uk-transition');\n },\n};\n\nconst animationPrefix = 'uk-animation-';\n\nfunction animate(element, animation, duration = 200, origin, out) {\n return Promise.all(\n toNodes(element).map(\n (element) =>\n new Promise((resolve, reject) => {\n trigger(element, 'animationcanceled');\n const timer = setTimeout(() => trigger(element, 'animationend'), duration);\n\n once(\n element,\n 'animationend animationcanceled',\n ({ type }) => {\n clearTimeout(timer);\n\n type === 'animationcanceled' ? reject() : resolve(element);\n\n css(element, 'animationDuration', '');\n removeClasses(element, `${animationPrefix}\\\\S*`);\n },\n { self: true }\n );\n\n css(element, 'animationDuration', `${duration}ms`);\n addClass(element, animation, animationPrefix + (out ? 'leave' : 'enter'));\n\n if (startsWith(animation, animationPrefix)) {\n origin && addClass(element, `uk-transform-origin-${origin}`);\n out && addClass(element, `${animationPrefix}reverse`);\n }\n })\n )\n );\n}\n\nconst inProgressRe = new RegExp(`${animationPrefix}(enter|leave)`);\n\nexport const Animation = {\n in: animate,\n\n out(element, animation, duration, origin) {\n return animate(element, animation, duration, origin, true);\n },\n\n inProgress(element) {\n return inProgressRe.test(attr(element, 'class'));\n },\n\n cancel(element) {\n trigger(element, 'animationcanceled');\n },\n};\n","import { css } from './style';\nimport {\n each,\n isDocument,\n isElement,\n isString,\n isUndefined,\n isWindow,\n memoize,\n toFloat,\n toNode,\n toWindow,\n ucfirst,\n} from './lang';\n\nconst dirs = {\n width: ['left', 'right'],\n height: ['top', 'bottom'],\n};\n\nexport function dimensions(element) {\n const rect = isElement(element)\n ? toNode(element).getBoundingClientRect()\n : { height: height(element), width: width(element), top: 0, left: 0 };\n\n return {\n height: rect.height,\n width: rect.width,\n top: rect.top,\n left: rect.left,\n bottom: rect.top + rect.height,\n right: rect.left + rect.width,\n };\n}\n\nexport function offset(element, coordinates) {\n const currentOffset = dimensions(element);\n\n if (element) {\n const { scrollY, scrollX } = toWindow(element);\n const offsetBy = { height: scrollY, width: scrollX };\n\n for (const dir in dirs) {\n for (const prop of dirs[dir]) {\n currentOffset[prop] += offsetBy[dir];\n }\n }\n }\n\n if (!coordinates) {\n return currentOffset;\n }\n\n const pos = css(element, 'position');\n\n each(css(element, ['left', 'top']), (value, prop) =>\n css(\n element,\n prop,\n coordinates[prop] -\n currentOffset[prop] +\n toFloat(pos === 'absolute' && value === 'auto' ? position(element)[prop] : value)\n )\n );\n}\n\nexport function position(element) {\n let { top, left } = offset(element);\n\n const {\n ownerDocument: { body, documentElement },\n offsetParent,\n } = toNode(element);\n let parent = offsetParent || documentElement;\n\n while (\n parent &&\n (parent === body || parent === documentElement) &&\n css(parent, 'position') === 'static'\n ) {\n parent = parent.parentNode;\n }\n\n if (isElement(parent)) {\n const parentOffset = offset(parent);\n top -= parentOffset.top + toFloat(css(parent, 'borderTopWidth'));\n left -= parentOffset.left + toFloat(css(parent, 'borderLeftWidth'));\n }\n\n return {\n top: top - toFloat(css(element, 'marginTop')),\n left: left - toFloat(css(element, 'marginLeft')),\n };\n}\n\nexport function offsetPosition(element) {\n element = toNode(element);\n\n const offset = [element.offsetTop, element.offsetLeft];\n\n while ((element = element.offsetParent)) {\n offset[0] += element.offsetTop + toFloat(css(element, `borderTopWidth`));\n offset[1] += element.offsetLeft + toFloat(css(element, `borderLeftWidth`));\n\n if (css(element, 'position') === 'fixed') {\n const win = toWindow(element);\n offset[0] += win.scrollY;\n offset[1] += win.scrollX;\n return offset;\n }\n }\n\n return offset;\n}\n\nexport const height = dimension('height');\nexport const width = dimension('width');\n\nfunction dimension(prop) {\n const propName = ucfirst(prop);\n return (element, value) => {\n if (isUndefined(value)) {\n if (isWindow(element)) {\n return element[`inner${propName}`];\n }\n\n if (isDocument(element)) {\n const doc = element.documentElement;\n return Math.max(doc[`offset${propName}`], doc[`scroll${propName}`]);\n }\n\n element = toNode(element);\n\n value = css(element, prop);\n value = value === 'auto' ? element[`offset${propName}`] : toFloat(value) || 0;\n\n return value - boxModelAdjust(element, prop);\n } else {\n return css(\n element,\n prop,\n !value && value !== 0 ? '' : +value + boxModelAdjust(element, prop) + 'px'\n );\n }\n };\n}\n\nexport function boxModelAdjust(element, prop, sizing = 'border-box') {\n return css(element, 'boxSizing') === sizing\n ? dirs[prop]\n .map(ucfirst)\n .reduce(\n (value, prop) =>\n value +\n toFloat(css(element, `padding${prop}`)) +\n toFloat(css(element, `border${prop}Width`)),\n 0\n )\n : 0;\n}\n\nexport function flipPosition(pos) {\n for (const dir in dirs) {\n for (const i in dirs[dir]) {\n if (dirs[dir][i] === pos) {\n return dirs[dir][1 - i];\n }\n }\n }\n return pos;\n}\n\nexport function toPx(value, property = 'width', element = window, offsetDim = false) {\n if (!isString(value)) {\n return toFloat(value);\n }\n\n return parseCalc(value).reduce((result, value) => {\n const unit = parseUnit(value);\n if (unit) {\n value = percent(\n unit === 'vh'\n ? height(toWindow(element))\n : unit === 'vw'\n ? width(toWindow(element))\n : offsetDim\n ? element[`offset${ucfirst(property)}`]\n : dimensions(element)[property],\n value\n );\n }\n\n return result + toFloat(value);\n }, 0);\n}\n\nconst calcRe = /-?\\d+(?:\\.\\d+)?(?:v[wh]|%|px)?/g;\nconst parseCalc = memoize((calc) => calc.toString().replace(/\\s/g, '').match(calcRe) || []);\nconst unitRe = /(?:v[hw]|%)$/;\nconst parseUnit = memoize((str) => (str.match(unitRe) || [])[0]);\n\nfunction percent(base, value) {\n return (base * toFloat(value)) / 100;\n}\n","import { once } from './event';\nimport { parent } from './filter';\nimport { find, findAll } from './selector';\nimport { isElement, isString, isUndefined, startsWith, toNode, toNodes } from './lang';\n\nexport function ready(fn) {\n if (document.readyState !== 'loading') {\n fn();\n return;\n }\n\n once(document, 'DOMContentLoaded', fn);\n}\n\nexport function isTag(element, tagName) {\n return element?.tagName?.toLowerCase() === tagName.toLowerCase();\n}\n\nexport function empty(element) {\n element = $(element);\n element.innerHTML = '';\n return element;\n}\n\nexport function html(parent, html) {\n return isUndefined(html) ? $(parent).innerHTML : append(empty(parent), html);\n}\n\nexport const prepend = applyFn('prepend');\nexport const append = applyFn('append');\nexport const before = applyFn('before');\nexport const after = applyFn('after');\n\nfunction applyFn(fn) {\n return function (ref, element) {\n const nodes = toNodes(isString(element) ? fragment(element) : element);\n $(ref)?.[fn](...nodes);\n return unwrapSingle(nodes);\n };\n}\n\nexport function remove(element) {\n toNodes(element).forEach((element) => element.remove());\n}\n\nexport function wrapAll(element, structure) {\n structure = toNode(before(element, structure));\n\n while (structure.firstChild) {\n structure = structure.firstChild;\n }\n\n append(structure, element);\n\n return structure;\n}\n\nexport function wrapInner(element, structure) {\n return toNodes(\n toNodes(element).map((element) =>\n element.hasChildNodes()\n ? wrapAll(toNodes(element.childNodes), structure)\n : append(element, structure)\n )\n );\n}\n\nexport function unwrap(element) {\n toNodes(element)\n .map(parent)\n .filter((value, index, self) => self.indexOf(value) === index)\n .forEach((parent) => parent.replaceWith(...parent.childNodes));\n}\n\nconst fragmentRe = /^\\s*<(\\w+|!)[^>]*>/;\nconst singleTagRe = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/;\n\nexport function fragment(html) {\n const matches = singleTagRe.exec(html);\n if (matches) {\n return document.createElement(matches[1]);\n }\n\n const container = document.createElement('div');\n if (fragmentRe.test(html)) {\n container.insertAdjacentHTML('beforeend', html.trim());\n } else {\n container.textContent = html;\n }\n\n return unwrapSingle(container.childNodes);\n}\n\nfunction unwrapSingle(nodes) {\n return nodes.length > 1 ? nodes : nodes[0];\n}\n\nexport function apply(node, fn) {\n if (!isElement(node)) {\n return;\n }\n\n fn(node);\n node = node.firstElementChild;\n while (node) {\n const next = node.nextElementSibling;\n apply(node, fn);\n node = next;\n }\n}\n\nexport function $(selector, context) {\n return isHtml(selector) ? toNode(fragment(selector)) : find(selector, context);\n}\n\nexport function $$(selector, context) {\n return isHtml(selector) ? toNodes(fragment(selector)) : findAll(selector, context);\n}\n\nfunction isHtml(str) {\n return isString(str) && startsWith(str.trim(), '<');\n}\n","export const inBrowser = typeof window !== 'undefined';\nexport const isRtl = inBrowser && document.dir === 'rtl';\n\nexport const hasTouch = inBrowser && 'ontouchstart' in window;\nconst hasPointerEvents = inBrowser && window.PointerEvent;\n\nexport const pointerDown = hasPointerEvents ? 'pointerdown' : hasTouch ? 'touchstart' : 'mousedown';\nexport const pointerMove = hasPointerEvents ? 'pointermove' : hasTouch ? 'touchmove' : 'mousemove';\nexport const pointerUp = hasPointerEvents ? 'pointerup' : hasTouch ? 'touchend' : 'mouseup';\nexport const pointerEnter = hasPointerEvents ? 'pointerenter' : hasTouch ? '' : 'mouseenter';\nexport const pointerLeave = hasPointerEvents ? 'pointerleave' : hasTouch ? '' : 'mouseleave';\nexport const pointerCancel = hasPointerEvents ? 'pointercancel' : 'touchcancel';\n","import { on } from './event';\nimport { toNodes } from './lang';\nimport { inBrowser } from './env';\n\nexport function observeIntersection(targets, cb, options, intersecting = true) {\n const observer = new IntersectionObserver(\n intersecting\n ? (entries, observer) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n cb(entries, observer);\n }\n }\n : cb,\n options\n );\n for (const el of toNodes(targets)) {\n observer.observe(el);\n }\n\n return observer;\n}\n\nconst hasResizeObserver = inBrowser && window.ResizeObserver;\nexport function observeResize(targets, cb, options = { box: 'border-box' }) {\n if (hasResizeObserver) {\n return observe(ResizeObserver, targets, cb, options);\n }\n\n // Fallback Safari < 13.1\n initResizeListener();\n listeners.add(cb);\n\n return {\n disconnect() {\n listeners.delete(cb);\n },\n };\n}\n\nlet listeners;\nfunction initResizeListener() {\n if (listeners) {\n return;\n }\n\n listeners = new Set();\n\n // throttle 'resize'\n let pendingResize;\n const handleResize = () => {\n if (pendingResize) {\n return;\n }\n pendingResize = true;\n requestAnimationFrame(() => (pendingResize = false));\n for (const listener of listeners) {\n listener();\n }\n };\n\n on(window, 'load resize', handleResize);\n on(document, 'loadedmetadata load', handleResize, true);\n}\n\nexport function observeMutation(targets, cb, options) {\n return observe(MutationObserver, targets, cb, options);\n}\n\nfunction observe(Observer, targets, cb, options) {\n const observer = new Observer(cb);\n for (const el of toNodes(targets)) {\n observer.observe(el, options);\n }\n\n return observer;\n}\n","import { css } from './style';\nimport { isVisible, parents } from './filter';\nimport { offset, offsetPosition } from './dimensions';\nimport { clamp, findIndex, intersectRect, isWindow, toFloat, toWindow, ucfirst } from './lang';\n\nexport function isInView(element, offsetTop = 0, offsetLeft = 0) {\n if (!isVisible(element)) {\n return false;\n }\n\n return intersectRect(\n ...scrollParents(element)\n .map((parent) => {\n const { top, left, bottom, right } = offsetViewport(parent);\n\n return {\n top: top - offsetTop,\n left: left - offsetLeft,\n bottom: bottom + offsetTop,\n right: right + offsetLeft,\n };\n })\n .concat(offset(element))\n );\n}\n\nexport function scrollIntoView(element, { offset: offsetBy = 0 } = {}) {\n const parents = isVisible(element) ? scrollParents(element) : [];\n return parents.reduce(\n (fn, scrollElement, i) => {\n const { scrollTop, scrollHeight, offsetHeight } = scrollElement;\n const viewport = offsetViewport(scrollElement);\n const maxScroll = scrollHeight - viewport.height;\n const { height: elHeight, top: elTop } = parents[i - 1]\n ? offsetViewport(parents[i - 1])\n : offset(element);\n\n let top = Math.ceil(elTop - viewport.top - offsetBy + scrollTop);\n\n if (offsetBy > 0 && offsetHeight < elHeight + offsetBy) {\n top += offsetBy;\n } else {\n offsetBy = 0;\n }\n\n if (top > maxScroll) {\n offsetBy -= top - maxScroll;\n top = maxScroll;\n } else if (top < 0) {\n offsetBy -= top;\n top = 0;\n }\n\n return () => scrollTo(scrollElement, top - scrollTop).then(fn);\n },\n () => Promise.resolve()\n )();\n\n function scrollTo(element, top) {\n return new Promise((resolve) => {\n const scroll = element.scrollTop;\n const duration = getDuration(Math.abs(top));\n const start = Date.now();\n\n (function step() {\n const percent = ease(clamp((Date.now() - start) / duration));\n\n element.scrollTop = scroll + top * percent;\n\n // scroll more if we have not reached our destination\n if (percent === 1) {\n resolve();\n } else {\n requestAnimationFrame(step);\n }\n })();\n });\n }\n\n function getDuration(dist) {\n return 40 * Math.pow(dist, 0.375);\n }\n\n function ease(k) {\n return 0.5 * (1 - Math.cos(Math.PI * k));\n }\n}\n\nexport function scrolledOver(element, startOffset = 0, endOffset = 0) {\n if (!isVisible(element)) {\n return 0;\n }\n\n const [scrollElement] = scrollParents(element, /auto|scroll/, true);\n const { scrollHeight, scrollTop } = scrollElement;\n const { height: viewportHeight } = offsetViewport(scrollElement);\n const maxScroll = scrollHeight - viewportHeight;\n const elementOffsetTop = offsetPosition(element)[0] - offsetPosition(scrollElement)[0];\n\n const start = Math.max(0, elementOffsetTop - viewportHeight + startOffset);\n const end = Math.min(maxScroll, elementOffsetTop + element.offsetHeight - endOffset);\n\n return clamp((scrollTop - start) / (end - start));\n}\n\nexport function scrollParents(element, overflowRe = /auto|scroll|hidden|clip/, scrollable = false) {\n const scrollEl = scrollingElement(element);\n\n let ancestors = parents(element).reverse();\n ancestors = ancestors.slice(ancestors.indexOf(scrollEl) + 1);\n\n const fixedIndex = findIndex(ancestors, (el) => css(el, 'position') === 'fixed');\n if (~fixedIndex) {\n ancestors = ancestors.slice(fixedIndex);\n }\n\n return [scrollEl]\n .concat(\n ancestors.filter(\n (parent) =>\n overflowRe.test(css(parent, 'overflow')) &&\n (!scrollable || parent.scrollHeight > offsetViewport(parent).height)\n )\n )\n .reverse();\n}\n\nexport function offsetViewport(scrollElement) {\n const window = toWindow(scrollElement);\n const {\n document: { documentElement },\n } = window;\n let viewportElement =\n scrollElement === scrollingElement(scrollElement) ? window : scrollElement;\n\n const { visualViewport } = window;\n if (isWindow(viewportElement) && visualViewport) {\n let { height, width, scale, pageTop: top, pageLeft: left } = visualViewport;\n height = Math.round(height * scale);\n width = Math.round(width * scale);\n return { height, width, top, left, bottom: top + height, right: left + width };\n }\n\n let rect = offset(viewportElement);\n for (let [prop, dir, start, end] of [\n ['width', 'x', 'left', 'right'],\n ['height', 'y', 'top', 'bottom'],\n ]) {\n if (isWindow(viewportElement)) {\n // iOS 12 returns as scrollingElement\n viewportElement = documentElement;\n } else {\n rect[start] += toFloat(css(viewportElement, `border-${start}-width`));\n }\n rect[prop] = rect[dir] = viewportElement[`client${ucfirst(prop)}`];\n rect[end] = rect[prop] + rect[start];\n }\n return rect;\n}\n\nfunction scrollingElement(element) {\n return toWindow(element).document.scrollingElement;\n}\n","import { observeResize } from 'uikit-util';\n\nexport default {\n connected() {\n this.registerObserver(\n observeResize(this.$options.resizeTargets?.call(this) || this.$el, () =>\n this.$emit('resize')\n )\n );\n },\n};\n","import { on } from 'uikit-util';\n\nexport default {\n connected() {\n registerScrollListener(this._uid, () => this.$emit('scroll'));\n },\n\n disconnected() {\n unregisterScrollListener(this._uid);\n },\n};\n\nconst scrollListeners = new Map();\nlet unbindScrollListener;\nexport function registerScrollListener(id, listener) {\n unbindScrollListener =\n unbindScrollListener ||\n on(window, 'scroll', () => scrollListeners.forEach((listener) => listener()), {\n passive: true,\n capture: true,\n });\n\n scrollListeners.set(id, listener);\n}\n\nexport function unregisterScrollListener(id) {\n scrollListeners.delete(id);\n if (unbindScrollListener && !scrollListeners.size) {\n unbindScrollListener();\n unbindScrollListener = null;\n }\n}\n","import {\n createEvent,\n css,\n isNumeric,\n isString,\n on,\n startsWith,\n toFloat,\n trigger,\n} from 'uikit-util';\n\nexport default {\n props: {\n media: Boolean,\n },\n\n data: {\n media: false,\n },\n\n connected() {\n const media = toMedia(this.media, this.$el);\n this.matchMedia = true;\n if (media) {\n this.mediaObj = window.matchMedia(media);\n const handler = () => {\n this.matchMedia = this.mediaObj.matches;\n trigger(this.$el, createEvent('mediachange', false, true, [this.mediaObj]));\n };\n this.offMediaObj = on(this.mediaObj, 'change', () => {\n handler();\n this.$emit('resize');\n });\n handler();\n }\n },\n\n disconnected() {\n this.offMediaObj?.();\n },\n};\n\nfunction toMedia(value, element) {\n if (isString(value)) {\n if (startsWith(value, '@')) {\n value = toFloat(css(element, `--uk-breakpoint-${value.substr(1)}`));\n } else if (isNaN(value)) {\n return value;\n }\n }\n\n return value && isNumeric(value) ? `(min-width: ${value}px)` : '';\n}\n","import {\n $,\n $$,\n after,\n append,\n attr,\n includes,\n isTag,\n isVoidElement,\n memoize,\n noop,\n observeIntersection,\n once,\n remove,\n removeAttr,\n startsWith,\n toFloat,\n} from 'uikit-util';\n\nexport default {\n args: 'src',\n\n props: {\n id: Boolean,\n icon: String,\n src: String,\n style: String,\n width: Number,\n height: Number,\n ratio: Number,\n class: String,\n strokeAnimation: Boolean,\n attributes: 'list',\n },\n\n data: {\n ratio: 1,\n include: ['style', 'class'],\n class: '',\n strokeAnimation: false,\n },\n\n beforeConnect() {\n this.class += ' uk-svg';\n },\n\n connected() {\n if (!this.icon && includes(this.src, '#')) {\n [this.src, this.icon] = this.src.split('#');\n }\n\n this.svg = this.getSvg().then((el) => {\n if (this._connected) {\n const svg = insertSVG(el, this.$el);\n\n if (this.svgEl && svg !== this.svgEl) {\n remove(this.svgEl);\n }\n\n this.applyAttributes(svg, el);\n\n return (this.svgEl = svg);\n }\n }, noop);\n\n if (this.strokeAnimation) {\n this.svg.then((el) => {\n if (this._connected) {\n applyAnimation(el);\n this.registerObserver(\n observeIntersection(el, (records, observer) => {\n applyAnimation(el);\n observer.disconnect();\n })\n );\n }\n });\n }\n },\n\n disconnected() {\n this.svg.then((svg) => {\n if (this._connected) {\n return;\n }\n\n if (isVoidElement(this.$el)) {\n this.$el.hidden = false;\n }\n\n remove(svg);\n this.svgEl = null;\n });\n\n this.svg = null;\n },\n\n methods: {\n async getSvg() {\n if (isTag(this.$el, 'img') && !this.$el.complete && this.$el.loading === 'lazy') {\n return new Promise((resolve) =>\n once(this.$el, 'load', () => resolve(this.getSvg()))\n );\n }\n\n return parseSVG(await loadSVG(this.src), this.icon) || Promise.reject('SVG not found.');\n },\n\n applyAttributes(el, ref) {\n for (const prop in this.$options.props) {\n if (includes(this.include, prop) && prop in this) {\n attr(el, prop, this[prop]);\n }\n }\n\n for (const attribute in this.attributes) {\n const [prop, value] = this.attributes[attribute].split(':', 2);\n attr(el, prop, value);\n }\n\n if (!this.id) {\n removeAttr(el, 'id');\n }\n\n const props = ['width', 'height'];\n let dimensions = props.map((prop) => this[prop]);\n\n if (!dimensions.some((val) => val)) {\n dimensions = props.map((prop) => attr(ref, prop));\n }\n\n const viewBox = attr(ref, 'viewBox');\n if (viewBox && !dimensions.some((val) => val)) {\n dimensions = viewBox.split(' ').slice(2);\n }\n\n dimensions.forEach((val, i) => attr(el, props[i], toFloat(val) * this.ratio || null));\n },\n },\n};\n\nconst loadSVG = memoize(async (src) => {\n if (src) {\n if (startsWith(src, 'data:')) {\n return decodeURIComponent(src.split(',')[1]);\n } else {\n return (await fetch(src)).text();\n }\n } else {\n return Promise.reject();\n }\n});\n\nfunction parseSVG(svg, icon) {\n if (icon && includes(svg, '/g;\nconst symbols = {};\n\nfunction parseSymbols(svg, icon) {\n if (!symbols[svg]) {\n symbols[svg] = {};\n\n symbolRe.lastIndex = 0;\n\n let match;\n while ((match = symbolRe.exec(svg))) {\n symbols[svg][match[3]] = ``;\n }\n }\n\n return symbols[svg][icon];\n}\n\nfunction applyAnimation(el) {\n const length = getMaxPathLength(el);\n\n if (length) {\n el.style.setProperty('--uk-animation-stroke', length);\n }\n}\n\nexport function getMaxPathLength(el) {\n return Math.ceil(\n Math.max(\n 0,\n ...$$('[stroke]', el).map((stroke) => {\n try {\n return stroke.getTotalLength();\n } catch (e) {\n return 0;\n }\n })\n )\n );\n}\n\nfunction insertSVG(el, root) {\n if (isVoidElement(root) || isTag(root, 'canvas')) {\n root.hidden = true;\n\n const next = root.nextElementSibling;\n return equals(el, next) ? next : after(root, el);\n }\n\n const last = root.lastElementChild;\n return equals(el, last) ? last : append(root, el);\n}\n\nfunction equals(el, other) {\n return isTag(el, 'svg') && isTag(other, 'svg') && el.innerHTML === other.innerHTML;\n}\n","import Media from '../mixin/media';\nimport { getMaxPathLength } from '../core/svg';\nimport {\n createEvent,\n css,\n Dimensions,\n findIndex,\n isNumber,\n isString,\n isUndefined,\n noop,\n toFloat,\n toPx,\n trigger,\n ucfirst,\n} from 'uikit-util';\n\nconst props = {\n x: transformFn,\n y: transformFn,\n rotate: transformFn,\n scale: transformFn,\n color: colorFn,\n backgroundColor: colorFn,\n borderColor: colorFn,\n blur: filterFn,\n hue: filterFn,\n fopacity: filterFn,\n grayscale: filterFn,\n invert: filterFn,\n saturate: filterFn,\n sepia: filterFn,\n opacity: cssPropFn,\n stroke: strokeFn,\n bgx: backgroundFn,\n bgy: backgroundFn,\n};\n\nconst { keys } = Object;\n\nexport default {\n mixins: [Media],\n\n props: fillObject(keys(props), 'list'),\n\n data: fillObject(keys(props), undefined),\n\n computed: {\n props(properties, $el) {\n const stops = {};\n for (const prop in properties) {\n if (prop in props && !isUndefined(properties[prop])) {\n stops[prop] = properties[prop].slice();\n }\n }\n const result = {};\n for (const prop in stops) {\n result[prop] = props[prop](prop, $el, stops[prop], stops);\n }\n return result;\n },\n },\n\n events: {\n load() {\n this.$emit();\n },\n },\n\n methods: {\n reset() {\n for (const prop in this.getCss(0)) {\n css(this.$el, prop, '');\n }\n },\n\n getCss(percent) {\n const css = { transform: '', filter: '' };\n for (const prop in this.props) {\n this.props[prop](css, percent);\n }\n return css;\n },\n },\n};\n\nfunction transformFn(prop, el, stops) {\n let unit = getUnit(stops) || { x: 'px', y: 'px', rotate: 'deg' }[prop] || '';\n let transformFn;\n\n if (prop === 'x' || prop === 'y') {\n prop = `translate${ucfirst(prop)}`;\n transformFn = (stop) => toFloat(toFloat(stop).toFixed(unit === 'px' ? 0 : 6));\n } else if (prop === 'scale') {\n unit = '';\n transformFn = (stop) =>\n getUnit([stop]) ? toPx(stop, 'width', el, true) / el.offsetWidth : stop;\n }\n\n if (stops.length === 1) {\n stops.unshift(prop === 'scale' ? 1 : 0);\n }\n\n stops = parseStops(stops, transformFn);\n\n return (css, percent) => {\n css.transform += ` ${prop}(${getValue(stops, percent)}${unit})`;\n };\n}\n\nfunction colorFn(prop, el, stops) {\n if (stops.length === 1) {\n stops.unshift(getCssValue(el, prop, ''));\n }\n\n stops = parseStops(stops, (stop) => parseColor(el, stop));\n\n return (css, percent) => {\n const [start, end, p] = getStop(stops, percent);\n const value = start\n .map((value, i) => {\n value += p * (end[i] - value);\n return i === 3 ? toFloat(value) : parseInt(value, 10);\n })\n .join(',');\n css[prop] = `rgba(${value})`;\n };\n}\n\nfunction parseColor(el, color) {\n return getCssValue(el, 'color', color)\n .split(/[(),]/g)\n .slice(1, -1)\n .concat(1)\n .slice(0, 4)\n .map(toFloat);\n}\n\nfunction filterFn(prop, el, stops) {\n if (stops.length === 1) {\n stops.unshift(0);\n }\n\n const unit = getUnit(stops) || { blur: 'px', hue: 'deg' }[prop] || '%';\n prop = { fopacity: 'opacity', hue: 'hue-rotate' }[prop] || prop;\n stops = parseStops(stops);\n\n return (css, percent) => {\n const value = getValue(stops, percent);\n css.filter += ` ${prop}(${value + unit})`;\n };\n}\n\nfunction cssPropFn(prop, el, stops) {\n if (stops.length === 1) {\n stops.unshift(getCssValue(el, prop, ''));\n }\n\n stops = parseStops(stops);\n\n return (css, percent) => {\n css[prop] = getValue(stops, percent);\n };\n}\n\nfunction strokeFn(prop, el, stops) {\n if (stops.length === 1) {\n stops.unshift(0);\n }\n\n const unit = getUnit(stops);\n const length = getMaxPathLength(el);\n stops = parseStops(stops.reverse(), (stop) => {\n stop = toFloat(stop);\n return unit === '%' ? (stop * length) / 100 : stop;\n });\n\n if (!stops.some(([value]) => value)) {\n return noop;\n }\n\n css(el, 'strokeDasharray', length);\n\n return (css, percent) => {\n css.strokeDashoffset = getValue(stops, percent);\n };\n}\n\nfunction backgroundFn(prop, el, stops, props) {\n if (stops.length === 1) {\n stops.unshift(0);\n }\n\n const attr = prop === 'bgy' ? 'height' : 'width';\n props[prop] = parseStops(stops, (stop) => toPx(stop, attr, el));\n\n const bgProps = ['bgx', 'bgy'].filter((prop) => prop in props);\n if (bgProps.length === 2 && prop === 'bgx') {\n return noop;\n }\n\n if (getCssValue(el, 'backgroundSize', '') === 'cover') {\n return backgroundCoverFn(prop, el, stops, props);\n }\n\n const positions = {};\n for (const prop of bgProps) {\n positions[prop] = getBackgroundPos(el, prop);\n }\n\n return setBackgroundPosFn(bgProps, positions, props);\n}\n\nfunction backgroundCoverFn(prop, el, stops, props) {\n const dimImage = getBackgroundImageDimensions(el);\n\n if (!dimImage.width) {\n return noop;\n }\n\n const dimEl = {\n width: el.offsetWidth,\n height: el.offsetHeight,\n };\n\n const bgProps = ['bgx', 'bgy'].filter((prop) => prop in props);\n\n const positions = {};\n for (const prop of bgProps) {\n const values = props[prop].map(([value]) => value);\n const min = Math.min(...values);\n const max = Math.max(...values);\n const down = values.indexOf(min) < values.indexOf(max);\n const diff = max - min;\n\n positions[prop] = `${(down ? -diff : 0) - (down ? min : max)}px`;\n dimEl[prop === 'bgy' ? 'height' : 'width'] += diff;\n }\n\n const dim = Dimensions.cover(dimImage, dimEl);\n\n for (const prop of bgProps) {\n const attr = prop === 'bgy' ? 'height' : 'width';\n const overflow = dim[attr] - dimEl[attr];\n positions[prop] = `max(${getBackgroundPos(el, prop)},-${overflow}px) + ${positions[prop]}`;\n }\n\n const fn = setBackgroundPosFn(bgProps, positions, props);\n return (css, percent) => {\n fn(css, percent);\n css.backgroundSize = `${dim.width}px ${dim.height}px`;\n css.backgroundRepeat = 'no-repeat';\n };\n}\n\nfunction getBackgroundPos(el, prop) {\n return getCssValue(el, `background-position-${prop.substr(-1)}`, '');\n}\n\nfunction setBackgroundPosFn(bgProps, positions, props) {\n return function (css, percent) {\n for (const prop of bgProps) {\n const value = getValue(props[prop], percent);\n css[`background-position-${prop.substr(-1)}`] = `calc(${positions[prop]} + ${value}px)`;\n }\n };\n}\n\nconst dimensions = {};\nfunction getBackgroundImageDimensions(el) {\n const src = css(el, 'backgroundImage').replace(/^none|url\\([\"']?(.+?)[\"']?\\)$/, '$1');\n\n if (dimensions[src]) {\n return dimensions[src];\n }\n\n const image = new Image();\n if (src) {\n image.src = src;\n\n if (!image.naturalWidth) {\n image.onload = () => {\n dimensions[src] = toDimensions(image);\n trigger(el, createEvent('load', false));\n };\n return toDimensions(image);\n }\n }\n\n return (dimensions[src] = toDimensions(image));\n}\n\nfunction toDimensions(image) {\n return {\n width: image.naturalWidth,\n height: image.naturalHeight,\n };\n}\n\nfunction parseStops(stops, fn = toFloat) {\n const result = [];\n const { length } = stops;\n let nullIndex = 0;\n for (let i = 0; i < length; i++) {\n let [value, percent] = isString(stops[i]) ? stops[i].trim().split(' ') : [stops[i]];\n value = fn(value);\n percent = percent ? toFloat(percent) / 100 : null;\n\n if (i === 0) {\n if (percent === null) {\n percent = 0;\n } else if (percent) {\n result.push([value, 0]);\n }\n } else if (i === length - 1) {\n if (percent === null) {\n percent = 1;\n } else if (percent !== 1) {\n result.push([value, percent]);\n percent = 1;\n }\n }\n\n result.push([value, percent]);\n\n if (percent === null) {\n nullIndex++;\n } else if (nullIndex) {\n const leftPercent = result[i - nullIndex - 1][1];\n const p = (percent - leftPercent) / (nullIndex + 1);\n for (let j = nullIndex; j > 0; j--) {\n result[i - j][1] = leftPercent + p * (nullIndex - j + 1);\n }\n\n nullIndex = 0;\n }\n }\n\n return result;\n}\n\nfunction getStop(stops, percent) {\n const index = findIndex(stops.slice(1), ([, targetPercent]) => percent <= targetPercent) + 1;\n return [\n stops[index - 1][0],\n stops[index][0],\n (percent - stops[index - 1][1]) / (stops[index][1] - stops[index - 1][1]),\n ];\n}\n\nfunction getValue(stops, percent) {\n const [start, end, p] = getStop(stops, percent);\n return isNumber(start) ? start + Math.abs(start - end) * p * (start < end ? 1 : -1) : +end;\n}\n\nconst unitRe = /^-?\\d+(\\S+)/;\nfunction getUnit(stops, defaultUnit) {\n for (const stop of stops) {\n const match = stop.match?.(unitRe);\n if (match) {\n return match[1];\n }\n }\n return defaultUnit;\n}\n\nfunction getCssValue(el, prop, value) {\n const prev = el.style[prop];\n const val = css(css(el, prop, value), prop);\n el.style[prop] = prev;\n return val;\n}\n\nfunction fillObject(keys, value) {\n return keys.reduce((data, prop) => {\n data[prop] = value;\n return data;\n }, {});\n}\n","import Resize from '../mixin/resize';\nimport Scroll from '../mixin/scroll';\nimport Parallax from '../mixin/parallax';\nimport { css, parent, query, scrolledOver, toPx } from 'uikit-util';\n\nexport default {\n mixins: [Parallax, Resize, Scroll],\n\n props: {\n target: String,\n viewport: Number, // Deprecated\n easing: Number,\n start: String,\n end: String,\n },\n\n data: {\n target: false,\n viewport: 1,\n easing: 1,\n start: 0,\n end: 0,\n },\n\n computed: {\n target({ target }, $el) {\n return getOffsetElement((target && query(target, $el)) || $el);\n },\n\n start({ start }) {\n return toPx(start, 'height', this.target, true);\n },\n\n end({ end, viewport }) {\n return toPx(\n end || ((viewport = (1 - viewport) * 100) && `${viewport}vh+${viewport}%`),\n 'height',\n this.target,\n true\n );\n },\n },\n\n update: {\n read({ percent }, types) {\n if (!types.has('scroll')) {\n percent = false;\n }\n\n if (!this.matchMedia) {\n return;\n }\n\n const prev = percent;\n percent = ease(scrolledOver(this.target, this.start, this.end), this.easing);\n\n return {\n percent,\n style: prev === percent ? false : this.getCss(percent),\n };\n },\n\n write({ style }) {\n if (!this.matchMedia) {\n this.reset();\n return;\n }\n\n style && css(this.$el, style);\n },\n\n events: ['scroll', 'resize'],\n },\n};\n\n/*\n * Inspired by https://gist.github.com/gre/1650294?permalink_comment_id=3477425#gistcomment-3477425\n *\n * linear: 0\n * easeInSine: 0.5\n * easeOutSine: -0.5\n * easeInQuad: 1\n * easeOutQuad: -1\n * easeInCubic: 2\n * easeOutCubic: -2\n * easeInQuart: 3\n * easeOutQuart: -3\n * easeInQuint: 4\n * easeOutQuint: -4\n */\nfunction ease(percent, easing) {\n return easing >= 0 ? Math.pow(percent, easing + 1) : 1 - Math.pow(1 - percent, 1 - easing);\n}\n\n// SVG elements do not inherit from HTMLElement\nfunction getOffsetElement(el) {\n return el ? ('offsetTop' in el ? el : getOffsetElement(parent(el))) : document.documentElement;\n}\n","import { addClass } from 'uikit-util';\n\nexport default {\n connected() {\n addClass(this.$el, this.$options.id);\n },\n};\n","import { $, attr, matches } from 'uikit-util';\n\nexport default {\n props: {\n autoplay: Boolean,\n autoplayInterval: Number,\n pauseOnHover: Boolean,\n },\n\n data: {\n autoplay: false,\n autoplayInterval: 7000,\n pauseOnHover: true,\n },\n\n connected() {\n this.autoplay && this.startAutoplay();\n },\n\n disconnected() {\n this.stopAutoplay();\n },\n\n update() {\n attr(this.slides, 'tabindex', '-1');\n },\n\n events: [\n {\n name: 'visibilitychange',\n\n el() {\n return document;\n },\n\n filter() {\n return this.autoplay;\n },\n\n handler() {\n if (document.hidden) {\n this.stopAutoplay();\n } else {\n this.startAutoplay();\n }\n },\n },\n ],\n\n methods: {\n startAutoplay() {\n this.stopAutoplay();\n\n this.interval = setInterval(\n () =>\n (!this.draggable || !$(':focus', this.$el)) &&\n (!this.pauseOnHover || !matches(this.$el, ':hover')) &&\n !this.stack.length &&\n this.show('next'),\n this.autoplayInterval\n );\n },\n\n stopAutoplay() {\n this.interval && clearInterval(this.interval);\n },\n },\n};\n","import {\n closest,\n css,\n getEventPos,\n includes,\n isRtl,\n isTouch,\n noop,\n off,\n on,\n selInput,\n toNodes,\n trigger,\n} from 'uikit-util';\n\nconst pointerOptions = { passive: false, capture: true };\nconst pointerUpOptions = { passive: true, capture: true };\nconst pointerDown = 'touchstart mousedown';\nconst pointerMove = 'touchmove mousemove';\nconst pointerUp = 'touchend touchcancel mouseup click input scroll';\n\nexport default {\n props: {\n draggable: Boolean,\n },\n\n data: {\n draggable: true,\n threshold: 10,\n },\n\n created() {\n for (const key of ['start', 'move', 'end']) {\n const fn = this[key];\n this[key] = (e) => {\n const pos = getEventPos(e).x * (isRtl ? -1 : 1);\n\n this.prevPos = pos === this.pos ? this.prevPos : this.pos;\n this.pos = pos;\n\n fn(e);\n };\n }\n },\n\n events: [\n {\n name: pointerDown,\n\n passive: true,\n\n delegate() {\n return this.selSlides;\n },\n\n handler(e) {\n if (\n !this.draggable ||\n (!isTouch(e) && hasSelectableText(e.target)) ||\n closest(e.target, selInput) ||\n e.button > 0 ||\n this.length < 2\n ) {\n return;\n }\n\n this.start(e);\n },\n },\n\n {\n name: 'dragstart',\n\n handler(e) {\n e.preventDefault();\n },\n },\n\n {\n // iOS workaround for slider stopping if swiping fast\n name: pointerMove,\n el() {\n return this.list;\n },\n handler: noop,\n ...pointerOptions,\n },\n ],\n\n methods: {\n start() {\n this.drag = this.pos;\n\n if (this._transitioner) {\n this.percent = this._transitioner.percent();\n this.drag += this._transitioner.getDistance() * this.percent * this.dir;\n\n this._transitioner.cancel();\n this._transitioner.translate(this.percent);\n\n this.dragging = true;\n\n this.stack = [];\n } else {\n this.prevIndex = this.index;\n }\n\n on(document, pointerMove, this.move, pointerOptions);\n\n // 'input' event is triggered by video controls\n on(document, pointerUp, this.end, pointerUpOptions);\n\n css(this.list, 'userSelect', 'none');\n },\n\n move(e) {\n const distance = this.pos - this.drag;\n\n if (\n distance === 0 ||\n this.prevPos === this.pos ||\n (!this.dragging && Math.abs(distance) < this.threshold)\n ) {\n return;\n }\n\n // prevent click event\n css(this.list, 'pointerEvents', 'none');\n\n e.cancelable && e.preventDefault();\n\n this.dragging = true;\n this.dir = distance < 0 ? 1 : -1;\n\n const { slides } = this;\n let { prevIndex } = this;\n let dis = Math.abs(distance);\n let nextIndex = this.getIndex(prevIndex + this.dir, prevIndex);\n let width = this._getDistance(prevIndex, nextIndex) || slides[prevIndex].offsetWidth;\n\n while (nextIndex !== prevIndex && dis > width) {\n this.drag -= width * this.dir;\n\n prevIndex = nextIndex;\n dis -= width;\n nextIndex = this.getIndex(prevIndex + this.dir, prevIndex);\n width = this._getDistance(prevIndex, nextIndex) || slides[prevIndex].offsetWidth;\n }\n\n this.percent = dis / width;\n\n const prev = slides[prevIndex];\n const next = slides[nextIndex];\n const changed = this.index !== nextIndex;\n const edge = prevIndex === nextIndex;\n\n let itemShown;\n\n [this.index, this.prevIndex]\n .filter((i) => !includes([nextIndex, prevIndex], i))\n .forEach((i) => {\n trigger(slides[i], 'itemhidden', [this]);\n\n if (edge) {\n itemShown = true;\n this.prevIndex = prevIndex;\n }\n });\n\n if ((this.index === prevIndex && this.prevIndex !== prevIndex) || itemShown) {\n trigger(slides[this.index], 'itemshown', [this]);\n }\n\n if (changed) {\n this.prevIndex = prevIndex;\n this.index = nextIndex;\n\n !edge && trigger(prev, 'beforeitemhide', [this]);\n trigger(next, 'beforeitemshow', [this]);\n }\n\n this._transitioner = this._translate(Math.abs(this.percent), prev, !edge && next);\n\n if (changed) {\n !edge && trigger(prev, 'itemhide', [this]);\n trigger(next, 'itemshow', [this]);\n }\n },\n\n end() {\n off(document, pointerMove, this.move, pointerOptions);\n off(document, pointerUp, this.end, pointerUpOptions);\n\n if (this.dragging) {\n this.dragging = null;\n\n if (this.index === this.prevIndex) {\n this.percent = 1 - this.percent;\n this.dir *= -1;\n this._show(false, this.index, true);\n this._transitioner = null;\n } else {\n const dirChange =\n (isRtl ? this.dir * (isRtl ? 1 : -1) : this.dir) < 0 ===\n this.prevPos > this.pos;\n this.index = dirChange ? this.index : this.prevIndex;\n\n if (dirChange) {\n this.percent = 1 - this.percent;\n }\n\n this.show(\n (this.dir > 0 && !dirChange) || (this.dir < 0 && dirChange)\n ? 'next'\n : 'previous',\n true\n );\n }\n }\n\n css(this.list, { userSelect: '', pointerEvents: '' });\n\n this.drag = this.percent = null;\n },\n },\n};\n\nfunction hasSelectableText(el) {\n return (\n css(el, 'userSelect') !== 'none' &&\n toNodes(el.childNodes).some((el) => el.nodeType === 3 && el.textContent.trim())\n );\n}\n","import { $, $$, data, html, toggleClass, toNumber } from 'uikit-util';\n\nexport default {\n data: {\n selNav: false,\n },\n\n computed: {\n nav({ selNav }, $el) {\n return $(selNav, $el);\n },\n\n selNavItem({ attrItem }) {\n return `[${attrItem}],[data-${attrItem}]`;\n },\n\n navItems(_, $el) {\n return $$(this.selNavItem, $el);\n },\n },\n\n update: {\n write() {\n if (this.nav && this.length !== this.nav.children.length) {\n html(\n this.nav,\n this.slides\n .map((_, i) => `
  • `)\n .join('')\n );\n }\n\n this.navItems.concat(this.nav).forEach((el) => el && (el.hidden = !this.maxIndex));\n\n this.updateNav();\n },\n\n events: ['resize'],\n },\n\n events: [\n {\n name: 'click',\n\n delegate() {\n return this.selNavItem;\n },\n\n handler(e) {\n e.preventDefault();\n this.show(data(e.current, this.attrItem));\n },\n },\n\n {\n name: 'itemshow',\n handler: 'updateNav',\n },\n ],\n\n methods: {\n updateNav() {\n const i = this.getValidIndex();\n for (const el of this.navItems) {\n const cmd = data(el, this.attrItem);\n\n toggleClass(el, this.clsActive, toNumber(cmd) === i);\n toggleClass(\n el,\n 'uk-invisible',\n this.finite &&\n ((cmd === 'previous' && i === 0) || (cmd === 'next' && i >= this.maxIndex))\n );\n }\n },\n },\n};\n","import Resize from './resize';\nimport SliderAutoplay from './slider-autoplay';\nimport SliderDrag from './slider-drag';\nimport SliderNav from './slider-nav';\nimport {\n $,\n $$,\n clamp,\n getIndex,\n hasClass,\n isNumber,\n isRtl,\n removeClass,\n trigger,\n} from 'uikit-util';\n\nexport default {\n mixins: [SliderAutoplay, SliderDrag, SliderNav, Resize],\n\n props: {\n clsActivated: Boolean,\n easing: String,\n index: Number,\n finite: Boolean,\n velocity: Number,\n selSlides: String,\n },\n\n data: () => ({\n easing: 'ease',\n finite: false,\n velocity: 1,\n index: 0,\n prevIndex: -1,\n stack: [],\n percent: 0,\n clsActive: 'uk-active',\n clsActivated: false,\n Transitioner: false,\n transitionOptions: {},\n }),\n\n connected() {\n this.prevIndex = -1;\n this.index = this.getValidIndex(this.$props.index);\n this.stack = [];\n },\n\n disconnected() {\n removeClass(this.slides, this.clsActive);\n },\n\n computed: {\n duration({ velocity }, $el) {\n return speedUp($el.offsetWidth / velocity);\n },\n\n list({ selList }, $el) {\n return $(selList, $el);\n },\n\n maxIndex() {\n return this.length - 1;\n },\n\n selSlides({ selList, selSlides }) {\n return `${selList} ${selSlides || '> *'}`;\n },\n\n slides: {\n get() {\n return $$(this.selSlides, this.$el);\n },\n\n watch() {\n this.$emit('resize');\n },\n },\n\n length() {\n return this.slides.length;\n },\n },\n\n methods: {\n show(index, force = false) {\n if (this.dragging || !this.length) {\n return;\n }\n\n const { stack } = this;\n const queueIndex = force ? 0 : stack.length;\n const reset = () => {\n stack.splice(queueIndex, 1);\n\n if (stack.length) {\n this.show(stack.shift(), true);\n }\n };\n\n stack[force ? 'unshift' : 'push'](index);\n\n if (!force && stack.length > 1) {\n if (stack.length === 2) {\n this._transitioner.forward(Math.min(this.duration, 200));\n }\n\n return;\n }\n\n const prevIndex = this.getIndex(this.index);\n const prev = hasClass(this.slides, this.clsActive) && this.slides[prevIndex];\n const nextIndex = this.getIndex(index, this.index);\n const next = this.slides[nextIndex];\n\n if (prev === next) {\n reset();\n return;\n }\n\n this.dir = getDirection(index, prevIndex);\n this.prevIndex = prevIndex;\n this.index = nextIndex;\n\n if (\n (prev && !trigger(prev, 'beforeitemhide', [this])) ||\n !trigger(next, 'beforeitemshow', [this, prev])\n ) {\n this.index = this.prevIndex;\n reset();\n return;\n }\n\n const promise = this._show(prev, next, force).then(() => {\n prev && trigger(prev, 'itemhidden', [this]);\n trigger(next, 'itemshown', [this]);\n\n return new Promise((resolve) => {\n requestAnimationFrame(() => {\n stack.shift();\n if (stack.length) {\n this.show(stack.shift(), true);\n } else {\n this._transitioner = null;\n }\n resolve();\n });\n });\n });\n\n prev && trigger(prev, 'itemhide', [this]);\n trigger(next, 'itemshow', [this]);\n\n return promise;\n },\n\n getIndex(index = this.index, prev = this.index) {\n return clamp(getIndex(index, this.slides, prev, this.finite), 0, this.maxIndex);\n },\n\n getValidIndex(index = this.index, prevIndex = this.prevIndex) {\n return this.getIndex(index, prevIndex);\n },\n\n _show(prev, next, force) {\n this._transitioner = this._getTransitioner(prev, next, this.dir, {\n easing: force\n ? next.offsetWidth < 600\n ? 'cubic-bezier(0.25, 0.46, 0.45, 0.94)' /* easeOutQuad */\n : 'cubic-bezier(0.165, 0.84, 0.44, 1)' /* easeOutQuart */\n : this.easing,\n ...this.transitionOptions,\n });\n\n if (!force && !prev) {\n this._translate(1);\n return Promise.resolve();\n }\n\n const { length } = this.stack;\n return this._transitioner[length > 1 ? 'forward' : 'show'](\n length > 1 ? Math.min(this.duration, 75 + 75 / (length - 1)) : this.duration,\n this.percent\n );\n },\n\n _getDistance(prev, next) {\n return this._getTransitioner(prev, prev !== next && next).getDistance();\n },\n\n _translate(percent, prev = this.prevIndex, next = this.index) {\n const transitioner = this._getTransitioner(prev !== next ? prev : false, next);\n transitioner.translate(percent);\n return transitioner;\n },\n\n _getTransitioner(\n prev = this.prevIndex,\n next = this.index,\n dir = this.dir || 1,\n options = this.transitionOptions\n ) {\n return new this.Transitioner(\n isNumber(prev) ? this.slides[prev] : prev,\n isNumber(next) ? this.slides[next] : next,\n dir * (isRtl ? -1 : 1),\n options\n );\n },\n },\n};\n\nfunction getDirection(index, prevIndex) {\n return index === 'next' ? 1 : index === 'previous' ? -1 : index < prevIndex ? -1 : 1;\n}\n\nexport function speedUp(x) {\n return 0.5 * x + 300; // parabola through (400,500; 600,600; 1800,1200)\n}\n","export default {\n update: {\n write() {\n if (this.stack.length || this.dragging) {\n return;\n }\n\n const index = this.getValidIndex(this.index);\n\n if (!~this.prevIndex || this.index !== index) {\n this.show(index);\n } else {\n this._translate(1, this.prevIndex, this.index);\n }\n },\n\n events: ['resize'],\n },\n};\n","import { $$, isFunction, observeIntersection, removeAttr, toNodes } from 'uikit-util';\n\nexport default {\n data: {\n preload: 5,\n },\n\n methods: {\n lazyload(observeTargets = this.$el, targets = this.$el) {\n this.registerObserver(\n observeIntersection(observeTargets, (entries, observer) => {\n for (const el of toNodes(isFunction(targets) ? targets() : targets)) {\n $$('[loading=\"lazy\"]', el)\n .slice(0, this.preload - 1)\n .forEach((el) => removeAttr(el, 'loading'));\n }\n\n for (const el of entries\n .filter(({ isIntersecting }) => isIntersecting)\n .map(({ target }) => target)) {\n observer.unobserve(el);\n }\n })\n );\n },\n },\n};\n","import Lazyload from '../../mixin/lazyload';\n\nexport default {\n mixins: [Lazyload],\n\n connected() {\n this.lazyload(this.slides, this.getAdjacentSlides);\n },\n};\n","import { css } from 'uikit-util';\n\nexport default {\n slide: {\n show(dir) {\n return [{ transform: translate(dir * -100) }, { transform: translate() }];\n },\n\n percent(current) {\n return translated(current);\n },\n\n translate(percent, dir) {\n return [\n { transform: translate(dir * -100 * percent) },\n { transform: translate(dir * 100 * (1 - percent)) },\n ];\n },\n },\n};\n\nexport function translated(el) {\n return Math.abs(css(el, 'transform').split(',')[4] / el.offsetWidth) || 0;\n}\n\nexport function translate(value = 0, unit = '%') {\n value += value ? unit : '';\n return `translate3d(${value}, 0, 0)`;\n}\n\nexport function scale3d(value) {\n return `scale3d(${value}, ${value}, 1)`;\n}\n","import { translate } from '../../mixin/internal/slideshow-animations';\nimport {\n children,\n clamp,\n createEvent,\n css,\n Deferred,\n dimensions,\n findIndex,\n includes,\n isRtl,\n noop,\n position,\n Transition,\n trigger,\n} from 'uikit-util';\n\nexport default function (prev, next, dir, { center, easing, list }) {\n const deferred = new Deferred();\n\n const from = prev\n ? getLeft(prev, list, center)\n : getLeft(next, list, center) + dimensions(next).width * dir;\n const to = next\n ? getLeft(next, list, center)\n : from + dimensions(prev).width * dir * (isRtl ? -1 : 1);\n\n return {\n dir,\n\n show(duration, percent = 0, linear) {\n const timing = linear ? 'linear' : easing;\n duration -= Math.round(duration * clamp(percent, -1, 1));\n\n this.translate(percent);\n\n percent = prev ? percent : clamp(percent, 0, 1);\n triggerUpdate(this.getItemIn(), 'itemin', { percent, duration, timing, dir });\n prev &&\n triggerUpdate(this.getItemIn(true), 'itemout', {\n percent: 1 - percent,\n duration,\n timing,\n dir,\n });\n\n Transition.start(\n list,\n { transform: translate(-to * (isRtl ? -1 : 1), 'px') },\n duration,\n timing\n ).then(deferred.resolve, noop);\n\n return deferred.promise;\n },\n\n cancel() {\n Transition.cancel(list);\n },\n\n reset() {\n css(list, 'transform', '');\n },\n\n forward(duration, percent = this.percent()) {\n Transition.cancel(list);\n return this.show(duration, percent, true);\n },\n\n translate(percent) {\n const distance = this.getDistance() * dir * (isRtl ? -1 : 1);\n\n css(\n list,\n 'transform',\n translate(\n clamp(\n -to + (distance - distance * percent),\n -getWidth(list),\n dimensions(list).width\n ) * (isRtl ? -1 : 1),\n 'px'\n )\n );\n\n const actives = this.getActives();\n const itemIn = this.getItemIn();\n const itemOut = this.getItemIn(true);\n\n percent = prev ? clamp(percent, -1, 1) : 0;\n\n for (const slide of children(list)) {\n const isActive = includes(actives, slide);\n const isIn = slide === itemIn;\n const isOut = slide === itemOut;\n const translateIn =\n isIn ||\n (!isOut &&\n (isActive ||\n (dir * (isRtl ? -1 : 1) === -1) ^\n (getElLeft(slide, list) > getElLeft(prev || next))));\n\n triggerUpdate(slide, `itemtranslate${translateIn ? 'in' : 'out'}`, {\n dir,\n percent: isOut ? 1 - percent : isIn ? percent : isActive ? 1 : 0,\n });\n }\n },\n\n percent() {\n return Math.abs(\n (css(list, 'transform').split(',')[4] * (isRtl ? -1 : 1) + from) / (to - from)\n );\n },\n\n getDistance() {\n return Math.abs(to - from);\n },\n\n getItemIn(out = false) {\n let actives = this.getActives();\n let nextActives = inView(list, getLeft(next || prev, list, center));\n\n if (out) {\n const temp = actives;\n actives = nextActives;\n nextActives = temp;\n }\n\n return nextActives[findIndex(nextActives, (el) => !includes(actives, el))];\n },\n\n getActives() {\n return inView(list, getLeft(prev || next, list, center));\n },\n };\n}\n\nfunction getLeft(el, list, center) {\n const left = getElLeft(el, list);\n\n return center ? left - centerEl(el, list) : Math.min(left, getMax(list));\n}\n\nexport function getMax(list) {\n return Math.max(0, getWidth(list) - dimensions(list).width);\n}\n\nexport function getWidth(list) {\n return children(list).reduce((right, el) => dimensions(el).width + right, 0);\n}\n\nfunction centerEl(el, list) {\n return dimensions(list).width / 2 - dimensions(el).width / 2;\n}\n\nexport function getElLeft(el, list) {\n return (\n (el &&\n (position(el).left + (isRtl ? dimensions(el).width - dimensions(list).width : 0)) *\n (isRtl ? -1 : 1)) ||\n 0\n );\n}\n\nfunction inView(list, listLeft) {\n listLeft -= 1;\n const listWidth = dimensions(list).width;\n const listRight = listLeft + listWidth + 2;\n\n return children(list).filter((slide) => {\n const slideLeft = getElLeft(slide, list);\n const slideRight = slideLeft + Math.min(dimensions(slide).width, listWidth);\n\n return slideLeft >= listLeft && slideRight <= listRight;\n });\n}\n\nfunction triggerUpdate(el, type, data) {\n trigger(el, createEvent(type, false, false, data));\n}\n","import Class from '../mixin/class';\nimport Slider, { speedUp } from '../mixin/slider';\nimport SliderReactive from '../mixin/slider-reactive';\nimport SliderPreload from './internal/slider-preload';\nimport Transitioner, { getMax, getWidth } from './internal/slider-transitioner';\nimport {\n $,\n addClass,\n children,\n css,\n data,\n dimensions,\n findIndex,\n includes,\n last,\n toFloat,\n toggleClass,\n toNumber,\n} from 'uikit-util';\n\nexport default {\n mixins: [Class, Slider, SliderReactive, SliderPreload],\n\n props: {\n center: Boolean,\n sets: Boolean,\n },\n\n data: {\n center: false,\n sets: false,\n attrItem: 'uk-slider-item',\n selList: '.uk-slider-items',\n selNav: '.uk-slider-nav',\n clsContainer: 'uk-slider-container',\n Transitioner,\n },\n\n computed: {\n avgWidth() {\n return getWidth(this.list) / this.length;\n },\n\n finite({ finite }) {\n return (\n finite ||\n Math.ceil(getWidth(this.list)) <\n Math.trunc(dimensions(this.list).width + getMaxElWidth(this.list) + this.center)\n );\n },\n\n maxIndex() {\n if (!this.finite || (this.center && !this.sets)) {\n return this.length - 1;\n }\n\n if (this.center) {\n return last(this.sets);\n }\n\n let lft = 0;\n const max = getMax(this.list);\n const index = findIndex(this.slides, (el) => {\n if (lft >= max) {\n return true;\n }\n\n lft += dimensions(el).width;\n });\n\n return ~index ? index : this.length - 1;\n },\n\n sets({ sets: enabled }) {\n if (!enabled) {\n return;\n }\n\n let left = 0;\n const sets = [];\n const width = dimensions(this.list).width;\n for (let i = 0; i < this.slides.length; i++) {\n const slideWidth = dimensions(this.slides[i]).width;\n\n if (left + slideWidth > width) {\n left = 0;\n }\n\n if (this.center) {\n if (\n left < width / 2 &&\n left + slideWidth + dimensions(this.slides[+i + 1]).width / 2 > width / 2\n ) {\n sets.push(+i);\n left = width / 2 - slideWidth / 2;\n }\n } else if (left === 0) {\n sets.push(Math.min(+i, this.maxIndex));\n }\n\n left += slideWidth;\n }\n\n if (sets.length) {\n return sets;\n }\n },\n\n transitionOptions() {\n return {\n center: this.center,\n list: this.list,\n };\n },\n },\n\n connected() {\n toggleClass(this.$el, this.clsContainer, !$(`.${this.clsContainer}`, this.$el));\n },\n\n update: {\n write() {\n for (const el of this.navItems) {\n const index = toNumber(data(el, this.attrItem));\n if (index !== false) {\n el.hidden =\n !this.maxIndex ||\n index > this.maxIndex ||\n (this.sets && !includes(this.sets, index));\n }\n }\n\n if (this.length && !this.dragging && !this.stack.length) {\n this.reorder();\n this._translate(1);\n }\n\n this.updateActiveClasses();\n },\n\n events: ['resize'],\n },\n\n events: {\n beforeitemshow(e) {\n if (\n !this.dragging &&\n this.sets &&\n this.stack.length < 2 &&\n !includes(this.sets, this.index)\n ) {\n this.index = this.getValidIndex();\n }\n\n const diff = Math.abs(\n this.index -\n this.prevIndex +\n ((this.dir > 0 && this.index < this.prevIndex) ||\n (this.dir < 0 && this.index > this.prevIndex)\n ? (this.maxIndex + 1) * this.dir\n : 0)\n );\n\n if (!this.dragging && diff > 1) {\n for (let i = 0; i < diff; i++) {\n this.stack.splice(1, 0, this.dir > 0 ? 'next' : 'previous');\n }\n\n e.preventDefault();\n return;\n }\n\n const index =\n this.dir < 0 || !this.slides[this.prevIndex] ? this.index : this.prevIndex;\n this.duration =\n speedUp(this.avgWidth / this.velocity) *\n (dimensions(this.slides[index]).width / this.avgWidth);\n\n this.reorder();\n },\n\n itemshow() {\n if (~this.prevIndex) {\n addClass(this._getTransitioner().getItemIn(), this.clsActive);\n }\n },\n\n itemshown() {\n this.updateActiveClasses();\n },\n },\n\n methods: {\n reorder() {\n if (this.finite) {\n css(this.slides, 'order', '');\n return;\n }\n\n const index = this.dir > 0 && this.slides[this.prevIndex] ? this.prevIndex : this.index;\n\n this.slides.forEach((slide, i) =>\n css(\n slide,\n 'order',\n this.dir > 0 && i < index ? 1 : this.dir < 0 && i >= this.index ? -1 : ''\n )\n );\n\n if (!this.center) {\n return;\n }\n\n const next = this.slides[index];\n let width = dimensions(this.list).width / 2 - dimensions(next).width / 2;\n let j = 0;\n\n while (width > 0) {\n const slideIndex = this.getIndex(--j + index, index);\n const slide = this.slides[slideIndex];\n\n css(slide, 'order', slideIndex > index ? -2 : -1);\n width -= dimensions(slide).width;\n }\n },\n\n updateActiveClasses() {\n const actives = this._getTransitioner(this.index).getActives();\n const activeClasses = [\n this.clsActive,\n ((!this.sets || includes(this.sets, toFloat(this.index))) && this.clsActivated) ||\n '',\n ];\n for (const slide of this.slides) {\n toggleClass(slide, activeClasses, includes(actives, slide));\n }\n },\n\n getValidIndex(index = this.index, prevIndex = this.prevIndex) {\n index = this.getIndex(index, prevIndex);\n\n if (!this.sets) {\n return index;\n }\n\n let prev;\n\n do {\n if (includes(this.sets, index)) {\n return index;\n }\n\n prev = index;\n index = this.getIndex(index + this.dir, prevIndex);\n } while (index !== prev);\n\n return index;\n },\n\n getAdjacentSlides() {\n const { width } = dimensions(this.list);\n const left = -width;\n const right = width * 2;\n const slideWidth = dimensions(this.slides[this.index]).width;\n const slideLeft = this.center ? width / 2 - slideWidth / 2 : 0;\n const slides = new Set();\n for (const i of [-1, 1]) {\n let currentLeft = slideLeft + (i > 0 ? slideWidth : 0);\n let j = 0;\n do {\n const slide = this.slides[this.getIndex(this.index + i + j++ * i)];\n currentLeft += dimensions(slide).width * i;\n slides.add(slide);\n } while (this.slides.length > j && currentLeft > left && currentLeft < right);\n }\n return Array.from(slides);\n },\n },\n};\n\nfunction getMaxElWidth(list) {\n return Math.max(0, ...children(list).map((el) => dimensions(el).width));\n}\n","import { clamp, createEvent, css, Deferred, noop, Transition, trigger } from 'uikit-util';\n\nexport default function Transitioner(prev, next, dir, { animation, easing }) {\n const { percent, translate, show = noop } = animation;\n const props = show(dir);\n const deferred = new Deferred();\n\n return {\n dir,\n\n show(duration, percent = 0, linear) {\n const timing = linear ? 'linear' : easing;\n duration -= Math.round(duration * clamp(percent, -1, 1));\n\n this.translate(percent);\n\n triggerUpdate(next, 'itemin', { percent, duration, timing, dir });\n triggerUpdate(prev, 'itemout', { percent: 1 - percent, duration, timing, dir });\n\n Promise.all([\n Transition.start(next, props[1], duration, timing),\n Transition.start(prev, props[0], duration, timing),\n ]).then(() => {\n this.reset();\n deferred.resolve();\n }, noop);\n\n return deferred.promise;\n },\n\n cancel() {\n Transition.cancel([next, prev]);\n },\n\n reset() {\n for (const prop in props[0]) {\n css([next, prev], prop, '');\n }\n },\n\n forward(duration, percent = this.percent()) {\n Transition.cancel([next, prev]);\n return this.show(duration, percent, true);\n },\n\n translate(percent) {\n this.reset();\n\n const props = translate(percent, dir);\n css(next, props[1]);\n css(prev, props[0]);\n triggerUpdate(next, 'itemtranslatein', { percent, dir });\n triggerUpdate(prev, 'itemtranslateout', { percent: 1 - percent, dir });\n },\n\n percent() {\n return percent(prev || next, next, dir);\n },\n\n getDistance() {\n return prev?.offsetWidth;\n },\n };\n}\n\nfunction triggerUpdate(el, type, data) {\n trigger(el, createEvent(type, false, false, data));\n}\n","import Animations from './internal/slideshow-animations';\nimport Transitioner from './internal/slideshow-transitioner';\nimport Slider from './slider.js';\nimport { addClass, removeClass } from 'uikit-util';\n\nexport default {\n mixins: [Slider],\n\n props: {\n animation: String,\n },\n\n data: {\n animation: 'slide',\n clsActivated: 'uk-transition-active',\n Animations,\n Transitioner,\n },\n\n computed: {\n animation({ animation, Animations }) {\n return { ...(Animations[animation] || Animations.slide), name: animation };\n },\n\n transitionOptions() {\n return { animation: this.animation };\n },\n },\n\n events: {\n beforeitemshow({ target }) {\n addClass(target, this.clsActive);\n },\n\n itemshown({ target }) {\n addClass(target, this.clsActivated);\n },\n\n itemhidden({ target }) {\n removeClass(target, this.clsActive, this.clsActivated);\n },\n },\n};\n","import Animations, {\n scale3d,\n translate,\n translated,\n} from '../../mixin/internal/slideshow-animations';\nimport { css } from 'uikit-util';\n\nexport default {\n ...Animations,\n fade: {\n show() {\n return [{ opacity: 0, zIndex: 0 }, { zIndex: -1 }];\n },\n\n percent(current) {\n return 1 - css(current, 'opacity');\n },\n\n translate(percent) {\n return [{ opacity: 1 - percent, zIndex: 0 }, { zIndex: -1 }];\n },\n },\n\n scale: {\n show() {\n return [{ opacity: 0, transform: scale3d(1 + 0.5), zIndex: 0 }, { zIndex: -1 }];\n },\n\n percent(current) {\n return 1 - css(current, 'opacity');\n },\n\n translate(percent) {\n return [\n { opacity: 1 - percent, transform: scale3d(1 + 0.5 * percent), zIndex: 0 },\n { zIndex: -1 },\n ];\n },\n },\n\n pull: {\n show(dir) {\n return dir < 0\n ? [\n { transform: translate(30), zIndex: -1 },\n { transform: translate(), zIndex: 0 },\n ]\n : [\n { transform: translate(-100), zIndex: 0 },\n { transform: translate(), zIndex: -1 },\n ];\n },\n\n percent(current, next, dir) {\n return dir < 0 ? 1 - translated(next) : translated(current);\n },\n\n translate(percent, dir) {\n return dir < 0\n ? [\n { transform: translate(30 * percent), zIndex: -1 },\n { transform: translate(-100 * (1 - percent)), zIndex: 0 },\n ]\n : [\n { transform: translate(-percent * 100), zIndex: 0 },\n { transform: translate(30 * (1 - percent)), zIndex: -1 },\n ];\n },\n },\n\n push: {\n show(dir) {\n return dir < 0\n ? [\n { transform: translate(100), zIndex: 0 },\n { transform: translate(), zIndex: -1 },\n ]\n : [\n { transform: translate(-30), zIndex: -1 },\n { transform: translate(), zIndex: 0 },\n ];\n },\n\n percent(current, next, dir) {\n return dir > 0 ? 1 - translated(next) : translated(current);\n },\n\n translate(percent, dir) {\n return dir < 0\n ? [\n { transform: translate(percent * 100), zIndex: 0 },\n { transform: translate(-30 * (1 - percent)), zIndex: -1 },\n ]\n : [\n { transform: translate(-30 * percent), zIndex: -1 },\n { transform: translate(100 * (1 - percent)), zIndex: 0 },\n ];\n },\n },\n};\n","import Class from '../mixin/class';\nimport Slideshow from '../mixin/slideshow';\nimport Animations from './internal/slideshow-animations';\nimport SliderReactive from '../mixin/slider-reactive';\nimport SliderPreload from './internal/slider-preload';\nimport { boxModelAdjust, css } from 'uikit-util';\n\nexport default {\n mixins: [Class, Slideshow, SliderReactive, SliderPreload],\n\n props: {\n ratio: String,\n minHeight: Number,\n maxHeight: Number,\n },\n\n data: {\n ratio: '16:9',\n minHeight: false,\n maxHeight: false,\n selList: '.uk-slideshow-items',\n attrItem: 'uk-slideshow-item',\n selNav: '.uk-slideshow-nav',\n Animations,\n },\n\n update: {\n read() {\n if (!this.list) {\n return false;\n }\n\n let [width, height] = this.ratio.split(':').map(Number);\n\n height = (height * this.list.offsetWidth) / width || 0;\n\n if (this.minHeight) {\n height = Math.max(this.minHeight, height);\n }\n\n if (this.maxHeight) {\n height = Math.min(this.maxHeight, height);\n }\n\n return { height: height - boxModelAdjust(this.list, 'height', 'content-box') };\n },\n\n write({ height }) {\n height > 0 && css(this.list, 'minHeight', height);\n },\n\n events: ['resize'],\n },\n\n methods: {\n getAdjacentSlides() {\n return [1, -1].map((i) => this.slides[this.getIndex(this.index + i)]);\n },\n },\n};\n","import UIkit from 'uikit/dist/js/uikit-core';\nimport Parallax from 'uikit/src/js/components/parallax';\nimport Slider from 'uikit/src/js/components/slider';\nimport Slideshow from 'uikit/src/js/components/slideshow';\n\n// Add individual components imported from UIKit below\nconst components = [\n { name: 'parallax', component: Parallax },\n { name: 'slider', component: Slider },\n { name: 'slideshow', component: Slideshow },\n];\n\ncomponents.forEach(({ name, component }) => {\n UIkit.component(name, component);\n});\n\nexport default UIkit;\n","/*!\n * jQuery JavaScript Library v3.6.3\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2022-12-20T21:28Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.3\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.9\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2022-12-19\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// `qSA` may not throw for unrecognized parts using forgiving parsing:\n\t\t\t\t\t// https://drafts.csswg.org/selectors/#forgiving-selector\n\t\t\t\t\t// like the `:has()` pseudo-class:\n\t\t\t\t\t// https://drafts.csswg.org/selectors/#relational\n\t\t\t\t\t// `CSS.supports` is still expected to return `false` then:\n\t\t\t\t\t// https://drafts.csswg.org/css-conditional-4/#typedef-supports-selector-fn\n\t\t\t\t\t// https://drafts.csswg.org/css-conditional-4/#dfn-support-selector\n\t\t\t\t\tif ( support.cssSupportsSelector &&\n\n\t\t\t\t\t\t// eslint-disable-next-line no-undef\n\t\t\t\t\t\t!CSS.supports( \"selector(:is(\" + newSelector + \"))\" ) ) {\n\n\t\t\t\t\t\t// Support: IE 11+\n\t\t\t\t\t\t// Throw to get to the same code path as an error directly in qSA.\n\t\t\t\t\t\t// Note: once we only support browser supporting\n\t\t\t\t\t\t// `CSS.supports('selector(...)')`, we can most likely drop\n\t\t\t\t\t\t// the `try-catch`. IE doesn't implement the API.\n\t\t\t\t\t\tthrow new Error();\n\t\t\t\t\t}\n\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t// Support: Chrome 105+, Firefox 104+, Safari 15.4+\n\t// Make sure forgiving mode is not used in `CSS.supports( \"selector(...)\" )`.\n\t//\n\t// `:is()` uses a forgiving selector list as an argument and is widely\n\t// implemented, so it's a good one to test against.\n\tsupport.cssSupportsSelector = assert( function() {\n\t\t/* eslint-disable no-undef */\n\n\t\treturn CSS.supports( \"selector(*)\" ) &&\n\n\t\t\t// Support: Firefox 78-81 only\n\t\t\t// In old Firefox, `:is()` didn't use forgiving parsing. In that case,\n\t\t\t// fail this test as there's no selector to test against that.\n\t\t\t// `CSS.supports` uses unforgiving parsing\n\t\t\tdocument.querySelectorAll( \":is(:jqfake)\" ) &&\n\n\t\t\t// `*` is needed as Safari & newer Chrome implemented something in between\n\t\t\t// for `:has()` - it throws in `qSA` if it only contains an unsupported\n\t\t\t// argument but multiple ones, one of which is supported, are fine.\n\t\t\t// We want to play safe in case `:is()` gets the same treatment.\n\t\t\t!CSS.supports( \"selector(:is(*,:jqfake))\" );\n\n\t\t/* eslint-enable */\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"\" +\n\t\t\t\t\"\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"\" +\n\t\t\t\t\"\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\tif ( !support.cssSupportsSelector ) {\n\n\t\t// Support: Chrome 105+, Safari 15.4+\n\t\t// `:has()` uses a forgiving selector list as an argument so our regular\n\t\t// `try-catch` mechanism fails to catch `:has()` with arguments not supported\n\t\t// natively like `:has(:contains(\"Foo\"))`. Where supported & spec-compliant,\n\t\t// we now use `CSS.supports(\"selector(:is(SELECTOR_TO_BE_TESTED))\")`, but\n\t\t// outside that we mark `:has` as buggy.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\n\t\t\t// Support: IE <9 only\n\t\t\t// IE doesn't have `contains` on `document` so we need to check for\n\t\t\t// `documentElement` presence.\n\t\t\t// We need to fall back to `a` when `documentElement` is missing\n\t\t\t// as `ownerDocument` of elements within `