` tag we check the equality\n * of the VNodes corresponding to the `
` tags and, since they are the\n * same tag in the same position, we'd be able to avoid completely\n * re-rendering the subtree under them with a new DOM element and would just\n * call out to `patch` to handle reconciling their children and so on.\n *\n * 3. Check, for both windows, to see if the element at the beginning of the\n * window corresponds to the element at the end of the other window. This is\n * a heuristic which will let us identify _some_ situations in which\n * elements have changed position, for instance it _should_ detect that the\n * children nodes themselves have not changed but merely moved in the\n * following example:\n *\n * oldVNode: `
`\n * newVNode: `
`\n *\n * If we find cases like this then we also need to move the concrete DOM\n * elements corresponding to the moved children to write the re-order to the\n * DOM.\n *\n * 4. Finally, if VNodes have the `key` attribute set on them we check for any\n * nodes in the old children which have the same key as the first element in\n * our window on the new children. If we find such a node we handle calling\n * out to `patch`, moving relevant DOM nodes, and so on, in accordance with\n * what we find.\n *\n * Finally, once we've narrowed our 'windows' to the point that either of them\n * collapse (i.e. they have length 0) we then handle any remaining VNode\n * insertion or deletion that needs to happen to get a DOM state that correctly\n * reflects the new child VNodes. If, for instance, after our window on the old\n * children has collapsed we still have more nodes on the new children that\n * we haven't dealt with yet then we need to add them, or if the new children\n * collapse but we still have unhandled _old_ children then we need to make\n * sure the corresponding DOM nodes are removed.\n *\n * @param parentElm the node into which the parent VNode is rendered\n * @param oldCh the old children of the parent node\n * @param newVNode the new VNode which will replace the parent\n * @param newCh the new children of the parent node\n * @param isInitialRender whether or not this is the first render of the vdom\n */\nconst updateChildren = (parentElm, oldCh, newVNode, newCh, isInitialRender = false) => {\n let oldStartIdx = 0;\n let newStartIdx = 0;\n let idxInOld = 0;\n let i = 0;\n let oldEndIdx = oldCh.length - 1;\n let oldStartVnode = oldCh[0];\n let oldEndVnode = oldCh[oldEndIdx];\n let newEndIdx = newCh.length - 1;\n let newStartVnode = newCh[0];\n let newEndVnode = newCh[newEndIdx];\n let node;\n let elmToMove;\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n if (oldStartVnode == null) {\n // VNode might have been moved left\n oldStartVnode = oldCh[++oldStartIdx];\n }\n else if (oldEndVnode == null) {\n oldEndVnode = oldCh[--oldEndIdx];\n }\n else if (newStartVnode == null) {\n newStartVnode = newCh[++newStartIdx];\n }\n else if (newEndVnode == null) {\n newEndVnode = newCh[--newEndIdx];\n }\n else if (isSameVnode(oldStartVnode, newStartVnode, isInitialRender)) {\n // if the start nodes are the same then we should patch the new VNode\n // onto the old one, and increment our `newStartIdx` and `oldStartIdx`\n // indices to reflect that. We don't need to move any DOM Nodes around\n // since things are matched up in order.\n patch(oldStartVnode, newStartVnode, isInitialRender);\n oldStartVnode = oldCh[++oldStartIdx];\n newStartVnode = newCh[++newStartIdx];\n }\n else if (isSameVnode(oldEndVnode, newEndVnode, isInitialRender)) {\n // likewise, if the end nodes are the same we patch new onto old and\n // decrement our end indices, and also likewise in this case we don't\n // need to move any DOM Nodes.\n patch(oldEndVnode, newEndVnode, isInitialRender);\n oldEndVnode = oldCh[--oldEndIdx];\n newEndVnode = newCh[--newEndIdx];\n }\n else if (isSameVnode(oldStartVnode, newEndVnode, isInitialRender)) {\n // case: \"Vnode moved right\"\n //\n // We've found that the last node in our window on the new children is\n // the same VNode as the _first_ node in our window on the old children\n // we're dealing with now. Visually, this is the layout of these two\n // nodes:\n //\n // newCh: [..., newStartVnode , ... , newEndVnode , ...]\n // ^^^^^^^^^^^\n // oldCh: [..., oldStartVnode , ... , oldEndVnode , ...]\n // ^^^^^^^^^^^^^\n //\n // In this situation we need to patch `newEndVnode` onto `oldStartVnode`\n // and move the DOM element for `oldStartVnode`.\n if ((oldStartVnode.$tag$ === 'slot' || newEndVnode.$tag$ === 'slot')) {\n putBackInOriginalLocation(oldStartVnode.$elm$.parentNode, false);\n }\n patch(oldStartVnode, newEndVnode, isInitialRender);\n // We need to move the element for `oldStartVnode` into a position which\n // will be appropriate for `newEndVnode`. For this we can use\n // `.insertBefore` and `oldEndVnode.$elm$.nextSibling`. If there is a\n // sibling for `oldEndVnode.$elm$` then we want to move the DOM node for\n // `oldStartVnode` between `oldEndVnode` and it's sibling, like so:\n //\n //
\n //
\n //
\n // \n //
\n // \n // ```\n // In this case if we do not un-shadow here and use the value of the shadowing property, attributeChangedCallback\n // will be called with `newValue = \"some-value\"` and will set the shadowed property (this.someAttribute = \"another-value\")\n // to the value that was set inline i.e. \"some-value\" from above example. When\n // the connectedCallback attempts to un-shadow it will use \"some-value\" as the initial value rather than \"another-value\"\n //\n // The case where the attribute was NOT set inline but was not set programmatically shall be handled/un-shadowed\n // by connectedCallback as this attributeChangedCallback will not fire.\n //\n // https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n //\n // TODO(STENCIL-16) we should think about whether or not we actually want to be reflecting the attributes to\n // properties here given that this goes against best practices outlined here\n // https://developers.google.com/web/fundamentals/web-components/best-practices#avoid-reentrancy\n if (this.hasOwnProperty(propName)) {\n newValue = this[propName];\n delete this[propName];\n }\n else if (prototype.hasOwnProperty(propName) &&\n typeof this[propName] === 'number' &&\n this[propName] == newValue) {\n // if the propName exists on the prototype of `Cstr`, this update may be a result of Stencil using native\n // APIs to reflect props as attributes. Calls to `setAttribute(someElement, propName)` will result in\n // `propName` to be converted to a `DOMString`, which may not be what we want for other primitive props.\n return;\n }\n else if (propName == null) {\n // At this point we should know this is not a \"member\", so we can treat it like watching an attribute\n // on a vanilla web component\n const hostRef = getHostRef(this);\n const flags = hostRef === null || hostRef === void 0 ? void 0 : hostRef.$flags$;\n // We only want to trigger the callback(s) if:\n // 1. The instance is ready\n // 2. The watchers are ready\n // 3. The value has changed\n if (flags &&\n !(flags & 8 /* HOST_FLAGS.isConstructingInstance */) &&\n flags & 128 /* HOST_FLAGS.isWatchReady */ &&\n newValue !== oldValue) {\n const instance = hostRef.$lazyInstance$ ;\n const entry = (_a = cmpMeta.$watchers$) === null || _a === void 0 ? void 0 : _a[attrName];\n entry === null || entry === void 0 ? void 0 : entry.forEach((callbackName) => {\n if (instance[callbackName] != null) {\n instance[callbackName].call(instance, newValue, oldValue, attrName);\n }\n });\n }\n return;\n }\n this[propName] = newValue === null && typeof this[propName] === 'boolean' ? false : newValue;\n });\n };\n // Create an array of attributes to observe\n // This list in comprised of all strings used within a `@Watch()` decorator\n // on a component as well as any Stencil-specific \"members\" (`@Prop()`s and `@State()`s).\n // As such, there is no way to guarantee type-safety here that a user hasn't entered\n // an invalid attribute.\n Cstr.observedAttributes = Array.from(new Set([\n ...Object.keys((_a = cmpMeta.$watchers$) !== null && _a !== void 0 ? _a : {}),\n ...members\n .filter(([_, m]) => m[0] & 15 /* MEMBER_FLAGS.HasAttribute */)\n .map(([propName, m]) => {\n var _a;\n const attrName = m[1] || propName;\n attrNameToPropName.set(attrName, propName);\n if (m[0] & 512 /* MEMBER_FLAGS.ReflectAttr */) {\n (_a = cmpMeta.$attrsToReflect$) === null || _a === void 0 ? void 0 : _a.push([propName, attrName]);\n }\n return attrName;\n }),\n ]));\n }\n }\n return Cstr;\n};\n/**\n * Initialize a Stencil component given a reference to its host element, its\n * runtime bookkeeping data structure, runtime metadata about the component,\n * and (optionally) an HMR version ID.\n *\n * @param elm a host element\n * @param hostRef the element's runtime bookkeeping object\n * @param cmpMeta runtime metadata for the Stencil component\n * @param hmrVersionId an (optional) HMR version ID\n */\nconst initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {\n let Cstr;\n // initializeComponent\n if ((hostRef.$flags$ & 32 /* HOST_FLAGS.hasInitializedComponent */) === 0) {\n // Let the runtime know that the component has been initialized\n hostRef.$flags$ |= 32 /* HOST_FLAGS.hasInitializedComponent */;\n {\n // lazy loaded components\n // request the component's implementation to be\n // wired up with the host element\n Cstr = loadModule(cmpMeta);\n if (Cstr.then) {\n // Await creates a micro-task avoid if possible\n const endLoad = uniqueTime();\n Cstr = await Cstr;\n endLoad();\n }\n if (!Cstr.isProxied) {\n // we've never proxied this Constructor before\n // let's add the getters/setters to its prototype before\n // the first time we create an instance of the implementation\n {\n cmpMeta.$watchers$ = Cstr.watchers;\n }\n proxyComponent(Cstr, cmpMeta, 2 /* PROXY_FLAGS.proxyState */);\n Cstr.isProxied = true;\n }\n const endNewInstance = createTime('createInstance', cmpMeta.$tagName$);\n // ok, time to construct the instance\n // but let's keep track of when we start and stop\n // so that the getters/setters don't incorrectly step on data\n {\n hostRef.$flags$ |= 8 /* HOST_FLAGS.isConstructingInstance */;\n }\n // construct the lazy-loaded component implementation\n // passing the hostRef is very important during\n // construction in order to directly wire together the\n // host element and the lazy-loaded instance\n try {\n new Cstr(hostRef);\n }\n catch (e) {\n consoleError(e);\n }\n {\n hostRef.$flags$ &= ~8 /* HOST_FLAGS.isConstructingInstance */;\n }\n {\n hostRef.$flags$ |= 128 /* HOST_FLAGS.isWatchReady */;\n }\n endNewInstance();\n fireConnectedCallback(hostRef.$lazyInstance$);\n }\n if (Cstr.style) {\n // this component has styles but we haven't registered them yet\n let style = Cstr.style;\n if (typeof style !== 'string') {\n style = style[(hostRef.$modeName$ = computeMode(elm))];\n }\n const scopeId = getScopeId(cmpMeta, hostRef.$modeName$);\n if (!styles.has(scopeId)) {\n const endRegisterStyles = createTime('registerStyles', cmpMeta.$tagName$);\n registerStyle(scopeId, style, !!(cmpMeta.$flags$ & 1 /* CMP_FLAGS.shadowDomEncapsulation */));\n endRegisterStyles();\n }\n }\n }\n // we've successfully created a lazy instance\n const ancestorComponent = hostRef.$ancestorComponent$;\n const schedule = () => scheduleUpdate(hostRef, true);\n if (ancestorComponent && ancestorComponent['s-rc']) {\n // this is the initial load and this component it has an ancestor component\n // but the ancestor component has NOT fired its will update lifecycle yet\n // so let's just cool our jets and wait for the ancestor to continue first\n // this will get fired off when the ancestor component\n // finally gets around to rendering its lazy self\n // fire off the initial update\n ancestorComponent['s-rc'].push(schedule);\n }\n else {\n schedule();\n }\n};\nconst fireConnectedCallback = (instance) => {\n {\n safeCall(instance, 'connectedCallback');\n }\n};\nconst connectedCallback = (elm) => {\n if ((plt.$flags$ & 1 /* PLATFORM_FLAGS.isTmpDisconnected */) === 0) {\n const hostRef = getHostRef(elm);\n const cmpMeta = hostRef.$cmpMeta$;\n const endConnected = createTime('connectedCallback', cmpMeta.$tagName$);\n if (!(hostRef.$flags$ & 1 /* HOST_FLAGS.hasConnected */)) {\n // first time this component has connected\n hostRef.$flags$ |= 1 /* HOST_FLAGS.hasConnected */;\n let hostId;\n {\n hostId = elm.getAttribute(HYDRATE_ID);\n if (hostId) {\n if (cmpMeta.$flags$ & 1 /* CMP_FLAGS.shadowDomEncapsulation */) {\n const scopeId = addStyle(elm.shadowRoot, cmpMeta, elm.getAttribute('s-mode'))\n ;\n elm.classList.remove(scopeId + '-h', scopeId + '-s');\n }\n initializeClientHydrate(elm, cmpMeta.$tagName$, hostId, hostRef);\n }\n }\n if (!hostId) {\n // initUpdate\n // if the slot polyfill is required we'll need to put some nodes\n // in here to act as original content anchors as we move nodes around\n // host element has been connected to the DOM\n if ((// TODO(STENCIL-854): Remove code related to legacy shadowDomShim field\n cmpMeta.$flags$ & (4 /* CMP_FLAGS.hasSlotRelocation */ | 8 /* CMP_FLAGS.needsShadowDomShim */))) {\n setContentReference(elm);\n }\n }\n {\n // find the first ancestor component (if there is one) and register\n // this component as one of the actively loading child components for its ancestor\n let ancestorComponent = elm;\n while ((ancestorComponent = ancestorComponent.parentNode || ancestorComponent.host)) {\n // climb up the ancestors looking for the first\n // component that hasn't finished its lifecycle update yet\n if ((ancestorComponent.nodeType === 1 /* NODE_TYPE.ElementNode */ &&\n ancestorComponent.hasAttribute('s-id') &&\n ancestorComponent['s-p']) ||\n ancestorComponent['s-p']) {\n // we found this components first ancestor component\n // keep a reference to this component's ancestor component\n attachToAncestor(hostRef, (hostRef.$ancestorComponent$ = ancestorComponent));\n break;\n }\n }\n }\n // Lazy properties\n // https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n if (cmpMeta.$members$) {\n Object.entries(cmpMeta.$members$).map(([memberName, [memberFlags]]) => {\n if (memberFlags & 31 /* MEMBER_FLAGS.Prop */ && elm.hasOwnProperty(memberName)) {\n const value = elm[memberName];\n delete elm[memberName];\n elm[memberName] = value;\n }\n });\n }\n {\n initializeComponent(elm, hostRef, cmpMeta);\n }\n }\n else {\n // not the first time this has connected\n // reattach any event listeners to the host\n // since they would have been removed when disconnected\n addHostEventListeners(elm, hostRef, cmpMeta.$listeners$);\n // fire off connectedCallback() on component instance\n if (hostRef === null || hostRef === void 0 ? void 0 : hostRef.$lazyInstance$) {\n fireConnectedCallback(hostRef.$lazyInstance$);\n }\n else if (hostRef === null || hostRef === void 0 ? void 0 : hostRef.$onReadyPromise$) {\n hostRef.$onReadyPromise$.then(() => fireConnectedCallback(hostRef.$lazyInstance$));\n }\n }\n endConnected();\n }\n};\nconst setContentReference = (elm) => {\n // only required when we're NOT using native shadow dom (slot)\n // or this browser doesn't support native shadow dom\n // and this host element was NOT created with SSR\n // let's pick out the inner content for slot projection\n // create a node to represent where the original\n // content was first placed, which is useful later on\n const contentRefElm = (elm['s-cr'] = doc.createComment(''));\n contentRefElm['s-cn'] = true;\n elm.insertBefore(contentRefElm, elm.firstChild);\n};\nconst disconnectInstance = (instance) => {\n {\n safeCall(instance, 'disconnectedCallback');\n }\n};\nconst disconnectedCallback = async (elm) => {\n if ((plt.$flags$ & 1 /* PLATFORM_FLAGS.isTmpDisconnected */) === 0) {\n const hostRef = getHostRef(elm);\n {\n if (hostRef.$rmListeners$) {\n hostRef.$rmListeners$.map((rmListener) => rmListener());\n hostRef.$rmListeners$ = undefined;\n }\n }\n if (hostRef === null || hostRef === void 0 ? void 0 : hostRef.$lazyInstance$) {\n disconnectInstance(hostRef.$lazyInstance$);\n }\n else if (hostRef === null || hostRef === void 0 ? void 0 : hostRef.$onReadyPromise$) {\n hostRef.$onReadyPromise$.then(() => disconnectInstance(hostRef.$lazyInstance$));\n }\n }\n};\nconst bootstrapLazy = (lazyBundles, options = {}) => {\n var _a;\n const endBootstrap = createTime();\n const cmpTags = [];\n const exclude = options.exclude || [];\n const customElements = win.customElements;\n const head = doc.head;\n const metaCharset = /*@__PURE__*/ head.querySelector('meta[charset]');\n const dataStyles = /*@__PURE__*/ doc.createElement('style');\n const deferredConnectedCallbacks = [];\n const styles = /*@__PURE__*/ doc.querySelectorAll(`[${HYDRATED_STYLE_ID}]`);\n let appLoadFallback;\n let isBootstrapping = true;\n let i = 0;\n Object.assign(plt, options);\n plt.$resourcesUrl$ = new URL(options.resourcesUrl || './', doc.baseURI).href;\n {\n // If the app is already hydrated there is not point to disable the\n // async queue. This will improve the first input delay\n plt.$flags$ |= 2 /* PLATFORM_FLAGS.appLoaded */;\n }\n {\n for (; i < styles.length; i++) {\n registerStyle(styles[i].getAttribute(HYDRATED_STYLE_ID), convertScopedToShadow(styles[i].innerHTML), true);\n }\n }\n let hasSlotRelocation = false;\n lazyBundles.map((lazyBundle) => {\n lazyBundle[1].map((compactMeta) => {\n var _a;\n const cmpMeta = {\n $flags$: compactMeta[0],\n $tagName$: compactMeta[1],\n $members$: compactMeta[2],\n $listeners$: compactMeta[3],\n };\n // Check if we are using slots outside the shadow DOM in this component.\n // We'll use this information later to add styles for `slot-fb` elements\n if (cmpMeta.$flags$ & 4 /* CMP_FLAGS.hasSlotRelocation */) {\n hasSlotRelocation = true;\n }\n {\n cmpMeta.$members$ = compactMeta[2];\n }\n {\n cmpMeta.$listeners$ = compactMeta[3];\n }\n {\n cmpMeta.$attrsToReflect$ = [];\n }\n {\n cmpMeta.$watchers$ = (_a = compactMeta[4]) !== null && _a !== void 0 ? _a : {};\n }\n const tagName = cmpMeta.$tagName$;\n const HostElement = class extends HTMLElement {\n // StencilLazyHost\n constructor(self) {\n // @ts-ignore\n super(self);\n self = this;\n registerHost(self, cmpMeta);\n if (cmpMeta.$flags$ & 1 /* CMP_FLAGS.shadowDomEncapsulation */) {\n // this component is using shadow dom\n // and this browser supports shadow dom\n // add the read-only property \"shadowRoot\" to the host element\n // adding the shadow root build conditionals to minimize runtime\n {\n {\n self.attachShadow({\n mode: 'open',\n delegatesFocus: !!(cmpMeta.$flags$ & 16 /* CMP_FLAGS.shadowDelegatesFocus */),\n });\n }\n }\n }\n }\n connectedCallback() {\n if (appLoadFallback) {\n clearTimeout(appLoadFallback);\n appLoadFallback = null;\n }\n if (isBootstrapping) {\n // connectedCallback will be processed once all components have been registered\n deferredConnectedCallbacks.push(this);\n }\n else {\n plt.jmp(() => connectedCallback(this));\n }\n }\n disconnectedCallback() {\n plt.jmp(() => disconnectedCallback(this));\n }\n componentOnReady() {\n return getHostRef(this).$onReadyPromise$;\n }\n };\n cmpMeta.$lazyBundleId$ = lazyBundle[0];\n if (!exclude.includes(tagName) && !customElements.get(tagName)) {\n cmpTags.push(tagName);\n customElements.define(tagName, proxyComponent(HostElement, cmpMeta, 1 /* PROXY_FLAGS.isElementConstructor */));\n }\n });\n });\n // Add styles for `slot-fb` elements if any of our components are using slots outside the Shadow DOM\n if (hasSlotRelocation) {\n dataStyles.innerHTML += SLOT_FB_CSS;\n }\n // Add hydration styles\n {\n dataStyles.innerHTML += cmpTags + HYDRATED_CSS;\n }\n // If we have styles, add them to the DOM\n if (dataStyles.innerHTML.length) {\n dataStyles.setAttribute('data-styles', '');\n // Apply CSP nonce to the style tag if it exists\n const nonce = (_a = plt.$nonce$) !== null && _a !== void 0 ? _a : queryNonceMetaTagContent(doc);\n if (nonce != null) {\n dataStyles.setAttribute('nonce', nonce);\n }\n // Insert the styles into the document head\n // NOTE: this _needs_ to happen last so we can ensure the nonce (and other attributes) are applied\n head.insertBefore(dataStyles, metaCharset ? metaCharset.nextSibling : head.firstChild);\n }\n // Process deferred connectedCallbacks now all components have been registered\n isBootstrapping = false;\n if (deferredConnectedCallbacks.length) {\n deferredConnectedCallbacks.map((host) => host.connectedCallback());\n }\n else {\n {\n plt.jmp(() => (appLoadFallback = setTimeout(appDidLoad, 30)));\n }\n }\n // Fallback appLoad event\n endBootstrap();\n};\nconst addHostEventListeners = (elm, hostRef, listeners, attachParentListeners) => {\n if (listeners) {\n listeners.map(([flags, name, method]) => {\n const target = getHostListenerTarget(elm, flags) ;\n const handler = hostListenerProxy(hostRef, method);\n const opts = hostListenerOpts(flags);\n plt.ael(target, name, handler, opts);\n (hostRef.$rmListeners$ = hostRef.$rmListeners$ || []).push(() => plt.rel(target, name, handler, opts));\n });\n }\n};\nconst hostListenerProxy = (hostRef, methodName) => (ev) => {\n try {\n {\n if (hostRef.$flags$ & 256 /* HOST_FLAGS.isListenReady */) {\n // instance is ready, let's call it's member method for this event\n hostRef.$lazyInstance$[methodName](ev);\n }\n else {\n (hostRef.$queuedListeners$ = hostRef.$queuedListeners$ || []).push([methodName, ev]);\n }\n }\n }\n catch (e) {\n consoleError(e);\n }\n};\nconst getHostListenerTarget = (elm, flags) => {\n if (flags & 4 /* LISTENER_FLAGS.TargetDocument */)\n return doc;\n if (flags & 8 /* LISTENER_FLAGS.TargetWindow */)\n return win;\n if (flags & 16 /* LISTENER_FLAGS.TargetBody */)\n return doc.body;\n return elm;\n};\n// prettier-ignore\nconst hostListenerOpts = (flags) => (flags & 2 /* LISTENER_FLAGS.Capture */) !== 0;\n/**\n * Assigns the given value to the nonce property on the runtime platform object.\n * During runtime, this value is used to set the nonce attribute on all dynamically created script and style tags.\n * @param nonce The value to be assigned to the platform nonce property.\n * @returns void\n */\nconst setNonce = (nonce) => (plt.$nonce$ = nonce);\n/**\n * A WeakMap mapping runtime component references to their corresponding host reference\n * instances.\n */\nconst hostRefs = /*@__PURE__*/ new WeakMap();\n/**\n * Given a {@link d.RuntimeRef} retrieve the corresponding {@link d.HostRef}\n *\n * @param ref the runtime ref of interest\n * @returns the Host reference (if found) or undefined\n */\nconst getHostRef = (ref) => hostRefs.get(ref);\n/**\n * Register a lazy instance with the {@link hostRefs} object so it's\n * corresponding {@link d.HostRef} can be retrieved later.\n *\n * @param lazyInstance the lazy instance of interest\n * @param hostRef that instances `HostRef` object\n * @returns a reference to the host ref WeakMap\n */\nconst registerInstance = (lazyInstance, hostRef) => hostRefs.set((hostRef.$lazyInstance$ = lazyInstance), hostRef);\n/**\n * Register a host element for a Stencil component, setting up various metadata\n * and callbacks based on {@link BUILD} flags as well as the component's runtime\n * metadata.\n *\n * @param hostElement the host element to register\n * @param cmpMeta runtime metadata for that component\n * @returns a reference to the host ref WeakMap\n */\nconst registerHost = (hostElement, cmpMeta) => {\n const hostRef = {\n $flags$: 0,\n $hostElement$: hostElement,\n $cmpMeta$: cmpMeta,\n $instanceValues$: new Map(),\n };\n {\n hostRef.$onInstancePromise$ = new Promise((r) => (hostRef.$onInstanceResolve$ = r));\n }\n {\n hostRef.$onReadyPromise$ = new Promise((r) => (hostRef.$onReadyResolve$ = r));\n hostElement['s-p'] = [];\n hostElement['s-rc'] = [];\n }\n addHostEventListeners(hostElement, hostRef, cmpMeta.$listeners$);\n return hostRefs.set(hostElement, hostRef);\n};\nconst isMemberInElement = (elm, memberName) => memberName in elm;\nconst consoleError = (e, el) => (0, console.error)(e, el);\nconst cmpModules = /*@__PURE__*/ new Map();\nconst loadModule = (cmpMeta, hostRef, hmrVersionId) => {\n // loadModuleImport\n const exportName = cmpMeta.$tagName$.replace(/-/g, '_');\n const bundleId = cmpMeta.$lazyBundleId$;\n const module = cmpModules.get(bundleId) ;\n if (module) {\n return module[exportName];\n }\n /*!__STENCIL_STATIC_IMPORT_SWITCH__*/\n return import(\n /* @vite-ignore */\n /* webpackInclude: /\\.entry\\.js$/ */\n /* webpackExclude: /\\.system\\.entry\\.js$/ */\n /* webpackMode: \"lazy\" */\n `./${bundleId}.entry.js${''}`).then((importedModule) => {\n {\n cmpModules.set(bundleId, importedModule);\n }\n return importedModule[exportName];\n }, consoleError);\n};\nconst styles = /*@__PURE__*/ new Map();\nconst modeResolutionChain = [];\nconst win = typeof window !== 'undefined' ? window : {};\nconst doc = win.document || { head: {} };\nconst plt = {\n $flags$: 0,\n $resourcesUrl$: '',\n jmp: (h) => h(),\n raf: (h) => requestAnimationFrame(h),\n ael: (el, eventName, listener, opts) => el.addEventListener(eventName, listener, opts),\n rel: (el, eventName, listener, opts) => el.removeEventListener(eventName, listener, opts),\n ce: (eventName, opts) => new CustomEvent(eventName, opts),\n};\nconst setPlatformHelpers = (helpers) => {\n Object.assign(plt, helpers);\n};\nconst supportsShadow = \n// TODO(STENCIL-854): Remove code related to legacy shadowDomShim field\ntrue;\nconst promiseResolve = (v) => Promise.resolve(v);\nconst supportsConstructableStylesheets = /*@__PURE__*/ (() => {\n try {\n new CSSStyleSheet();\n return typeof new CSSStyleSheet().replaceSync === 'function';\n }\n catch (e) { }\n return false;\n })()\n ;\nconst queueDomReads = [];\nconst queueDomWrites = [];\nconst queueTask = (queue, write) => (cb) => {\n queue.push(cb);\n if (!queuePending) {\n queuePending = true;\n if (write && plt.$flags$ & 4 /* PLATFORM_FLAGS.queueSync */) {\n nextTick(flush);\n }\n else {\n plt.raf(flush);\n }\n }\n};\nconst consume = (queue) => {\n for (let i = 0; i < queue.length; i++) {\n try {\n queue[i](performance.now());\n }\n catch (e) {\n consoleError(e);\n }\n }\n queue.length = 0;\n};\nconst flush = () => {\n // always force a bunch of medium callbacks to run, but still have\n // a throttle on how many can run in a certain time\n // DOM READS!!!\n consume(queueDomReads);\n // DOM WRITES!!!\n {\n consume(queueDomWrites);\n if ((queuePending = queueDomReads.length > 0)) {\n // still more to do yet, but we've run out of time\n // let's let this thing cool off and try again in the next tick\n plt.raf(flush);\n }\n }\n};\nconst nextTick = (cb) => promiseResolve().then(cb);\nconst readTask = /*@__PURE__*/ queueTask(queueDomReads, false);\nconst writeTask = /*@__PURE__*/ queueTask(queueDomWrites, true);\n\nexport { Build as B, Host as H, setPlatformHelpers as a, bootstrapLazy as b, setMode as c, createEvent as d, readTask as e, getElement as f, getMode as g, h, forceUpdate as i, getAssetPath as j, promiseResolve as p, registerInstance as r, setNonce as s, writeTask as w };\n","/*!\n * (C) Ionic http://ionicframework.com - MIT License\n */\nexport { c as createAnimation } from './animation-dde8cc0d.js';\nexport { a as LIFECYCLE_DID_ENTER, c as LIFECYCLE_DID_LEAVE, L as LIFECYCLE_WILL_ENTER, b as LIFECYCLE_WILL_LEAVE, d as LIFECYCLE_WILL_UNLOAD, g as getIonPageElement } from './index-89cbcdab.js';\nexport { iosTransitionAnimation } from './ios.transition-41ff786a.js';\nexport { mdTransitionAnimation } from './md.transition-92606aa8.js';\nexport { g as getTimeGivenProgression } from './cubic-bezier-fe2083dc.js';\nexport { createGesture } from './index-2cf77112.js';\nexport { g as getPlatforms, i as initialize, a as isPlatform } from './ionic-global-fb3f9f73.js';\nexport { c as componentOnReady } from './helpers-ae653409.js';\nexport { I as IonicSafeString, g as getMode, s as setupConfig } from './config-49c88215.js';\nexport { o as openURL } from './theme-01f3f29c.js';\nexport { m as menuController } from './index-2f8a2df6.js';\nexport { b as actionSheetController, a as alertController, l as loadingController, m as modalController, p as pickerController, c as popoverController, t as toastController } from './overlays-9d7511dd.js';\nimport './index-a5d50daf.js';\nimport './index-db215ebe.js';\nimport './gesture-controller-1bf57181.js';\nimport './hardware-back-button-b2bc76db.js';\nimport './index-9b0d46f4.js';\nimport './framework-delegate-bc1fd82a.js';\n\nconst IonicSlides = (opts) => {\n const { swiper, extendParams } = opts;\n const slidesParams = {\n effect: undefined,\n direction: 'horizontal',\n initialSlide: 0,\n loop: false,\n parallax: false,\n slidesPerView: 1,\n spaceBetween: 0,\n speed: 300,\n slidesPerColumn: 1,\n slidesPerColumnFill: 'column',\n slidesPerGroup: 1,\n centeredSlides: false,\n slidesOffsetBefore: 0,\n slidesOffsetAfter: 0,\n touchEventsTarget: 'container',\n freeMode: false,\n freeModeMomentum: true,\n freeModeMomentumRatio: 1,\n freeModeMomentumBounce: true,\n freeModeMomentumBounceRatio: 1,\n freeModeMomentumVelocityRatio: 1,\n freeModeSticky: false,\n freeModeMinimumVelocity: 0.02,\n autoHeight: false,\n setWrapperSize: false,\n zoom: {\n maxRatio: 3,\n minRatio: 1,\n toggle: false,\n },\n touchRatio: 1,\n touchAngle: 45,\n simulateTouch: true,\n touchStartPreventDefault: false,\n shortSwipes: true,\n longSwipes: true,\n longSwipesRatio: 0.5,\n longSwipesMs: 300,\n followFinger: true,\n threshold: 0,\n touchMoveStopPropagation: true,\n touchReleaseOnEdges: false,\n iOSEdgeSwipeDetection: false,\n iOSEdgeSwipeThreshold: 20,\n resistance: true,\n resistanceRatio: 0.85,\n watchSlidesProgress: false,\n watchSlidesVisibility: false,\n preventClicks: true,\n preventClicksPropagation: true,\n slideToClickedSlide: false,\n loopAdditionalSlides: 0,\n noSwiping: true,\n runCallbacksOnInit: true,\n coverflowEffect: {\n rotate: 50,\n stretch: 0,\n depth: 100,\n modifier: 1,\n slideShadows: true,\n },\n flipEffect: {\n slideShadows: true,\n limitRotation: true,\n },\n cubeEffect: {\n slideShadows: true,\n shadow: true,\n shadowOffset: 20,\n shadowScale: 0.94,\n },\n fadeEffect: {\n crossFade: false,\n },\n a11y: {\n prevSlideMessage: 'Previous slide',\n nextSlideMessage: 'Next slide',\n firstSlideMessage: 'This is the first slide',\n lastSlideMessage: 'This is the last slide',\n },\n };\n if (swiper.pagination) {\n slidesParams.pagination = {\n type: 'bullets',\n clickable: false,\n hideOnClick: false,\n };\n }\n if (swiper.scrollbar) {\n slidesParams.scrollbar = {\n hide: true,\n };\n }\n extendParams(slidesParams);\n};\n\nexport { IonicSlides };\n","/*!\n * (C) Ionic http://ionicframework.com - MIT License\n */\nimport { a as setPlatformHelpers, g as getMode, c as setMode } from './index-db215ebe.js';\n\n// TODO(FW-2832): types\nclass Config {\n constructor() {\n this.m = new Map();\n }\n reset(configObj) {\n this.m = new Map(Object.entries(configObj));\n }\n get(key, fallback) {\n const value = this.m.get(key);\n return value !== undefined ? value : fallback;\n }\n getBoolean(key, fallback = false) {\n const val = this.m.get(key);\n if (val === undefined) {\n return fallback;\n }\n if (typeof val === 'string') {\n return val === 'true';\n }\n return !!val;\n }\n getNumber(key, fallback) {\n const val = parseFloat(this.m.get(key));\n return isNaN(val) ? (fallback !== undefined ? fallback : NaN) : val;\n }\n set(key, value) {\n this.m.set(key, value);\n }\n}\nconst config = /*@__PURE__*/ new Config();\nconst configFromSession = (win) => {\n try {\n const configStr = win.sessionStorage.getItem(IONIC_SESSION_KEY);\n return configStr !== null ? JSON.parse(configStr) : {};\n }\n catch (e) {\n return {};\n }\n};\nconst saveConfig = (win, c) => {\n try {\n win.sessionStorage.setItem(IONIC_SESSION_KEY, JSON.stringify(c));\n }\n catch (e) {\n return;\n }\n};\nconst configFromURL = (win) => {\n const configObj = {};\n win.location.search\n .slice(1)\n .split('&')\n .map((entry) => entry.split('='))\n .map(([key, value]) => [decodeURIComponent(key), decodeURIComponent(value)])\n .filter(([key]) => startsWith(key, IONIC_PREFIX))\n .map(([key, value]) => [key.slice(IONIC_PREFIX.length), value])\n .forEach(([key, value]) => {\n configObj[key] = value;\n });\n return configObj;\n};\nconst startsWith = (input, search) => {\n return input.substr(0, search.length) === search;\n};\nconst IONIC_PREFIX = 'ionic:';\nconst IONIC_SESSION_KEY = 'ionic-persist-config';\n\nconst getPlatforms = (win) => setupPlatforms(win);\nconst isPlatform = (winOrPlatform, platform) => {\n if (typeof winOrPlatform === 'string') {\n platform = winOrPlatform;\n winOrPlatform = undefined;\n }\n return getPlatforms(winOrPlatform).includes(platform);\n};\nconst setupPlatforms = (win = window) => {\n if (typeof win === 'undefined') {\n return [];\n }\n win.Ionic = win.Ionic || {};\n let platforms = win.Ionic.platforms;\n if (platforms == null) {\n platforms = win.Ionic.platforms = detectPlatforms(win);\n platforms.forEach((p) => win.document.documentElement.classList.add(`plt-${p}`));\n }\n return platforms;\n};\nconst detectPlatforms = (win) => {\n const customPlatformMethods = config.get('platform');\n return Object.keys(PLATFORMS_MAP).filter((p) => {\n const customMethod = customPlatformMethods === null || customPlatformMethods === void 0 ? void 0 : customPlatformMethods[p];\n return typeof customMethod === 'function' ? customMethod(win) : PLATFORMS_MAP[p](win);\n });\n};\nconst isMobileWeb = (win) => isMobile(win) && !isHybrid(win);\nconst isIpad = (win) => {\n // iOS 12 and below\n if (testUserAgent(win, /iPad/i)) {\n return true;\n }\n // iOS 13+\n if (testUserAgent(win, /Macintosh/i) && isMobile(win)) {\n return true;\n }\n return false;\n};\nconst isIphone = (win) => testUserAgent(win, /iPhone/i);\nconst isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);\nconst isAndroid = (win) => testUserAgent(win, /android|sink/i);\nconst isAndroidTablet = (win) => {\n return isAndroid(win) && !testUserAgent(win, /mobile/i);\n};\nconst isPhablet = (win) => {\n const width = win.innerWidth;\n const height = win.innerHeight;\n const smallest = Math.min(width, height);\n const largest = Math.max(width, height);\n return smallest > 390 && smallest < 520 && largest > 620 && largest < 800;\n};\nconst isTablet = (win) => {\n const width = win.innerWidth;\n const height = win.innerHeight;\n const smallest = Math.min(width, height);\n const largest = Math.max(width, height);\n return isIpad(win) || isAndroidTablet(win) || (smallest > 460 && smallest < 820 && largest > 780 && largest < 1400);\n};\nconst isMobile = (win) => matchMedia(win, '(any-pointer:coarse)');\nconst isDesktop = (win) => !isMobile(win);\nconst isHybrid = (win) => isCordova(win) || isCapacitorNative(win);\nconst isCordova = (win) => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);\nconst isCapacitorNative = (win) => {\n const capacitor = win['Capacitor'];\n return !!(capacitor === null || capacitor === void 0 ? void 0 : capacitor.isNative);\n};\nconst isElectron = (win) => testUserAgent(win, /electron/i);\nconst isPWA = (win) => { var _a; return !!(((_a = win.matchMedia) === null || _a === void 0 ? void 0 : _a.call(win, '(display-mode: standalone)').matches) || win.navigator.standalone); };\nconst testUserAgent = (win, expr) => expr.test(win.navigator.userAgent);\nconst matchMedia = (win, query) => { var _a; return (_a = win.matchMedia) === null || _a === void 0 ? void 0 : _a.call(win, query).matches; };\nconst PLATFORMS_MAP = {\n ipad: isIpad,\n iphone: isIphone,\n ios: isIOS,\n android: isAndroid,\n phablet: isPhablet,\n tablet: isTablet,\n cordova: isCordova,\n capacitor: isCapacitorNative,\n electron: isElectron,\n pwa: isPWA,\n mobile: isMobile,\n mobileweb: isMobileWeb,\n desktop: isDesktop,\n hybrid: isHybrid,\n};\n\n// TODO(FW-2832): types\nlet defaultMode;\nconst getIonMode = (ref) => {\n return (ref && getMode(ref)) || defaultMode;\n};\nconst initialize = (userConfig = {}) => {\n if (typeof window === 'undefined') {\n return;\n }\n const doc = window.document;\n const win = window;\n const Ionic = (win.Ionic = win.Ionic || {});\n const platformHelpers = {};\n if (userConfig._ael) {\n platformHelpers.ael = userConfig._ael;\n }\n if (userConfig._rel) {\n platformHelpers.rel = userConfig._rel;\n }\n if (userConfig._ce) {\n platformHelpers.ce = userConfig._ce;\n }\n setPlatformHelpers(platformHelpers);\n // create the Ionic.config from raw config object (if it exists)\n // and convert Ionic.config into a ConfigApi that has a get() fn\n const configObj = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, configFromSession(win)), { persistConfig: false }), Ionic.config), configFromURL(win)), userConfig);\n config.reset(configObj);\n if (config.getBoolean('persistConfig')) {\n saveConfig(win, configObj);\n }\n // Setup platforms\n setupPlatforms(win);\n // first see if the mode was set as an attribute on \n // which could have been set by the user, or by pre-rendering\n // otherwise get the mode via config settings, and fallback to md\n Ionic.config = config;\n Ionic.mode = defaultMode = config.get('mode', doc.documentElement.getAttribute('mode') || (isPlatform(win, 'ios') ? 'ios' : 'md'));\n config.set('mode', defaultMode);\n doc.documentElement.setAttribute('mode', defaultMode);\n doc.documentElement.classList.add(defaultMode);\n if (config.getBoolean('_testing')) {\n config.set('animated', false);\n }\n const isIonicElement = (elm) => { var _a; return (_a = elm.tagName) === null || _a === void 0 ? void 0 : _a.startsWith('ION-'); };\n const isAllowedIonicModeValue = (elmMode) => ['ios', 'md'].includes(elmMode);\n setMode((elm) => {\n while (elm) {\n const elmMode = elm.mode || elm.getAttribute('mode');\n if (elmMode) {\n if (isAllowedIonicModeValue(elmMode)) {\n return elmMode;\n }\n else if (isIonicElement(elm)) {\n console.warn('Invalid ionic mode: \"' + elmMode + '\", expected: \"ios\" or \"md\"');\n }\n }\n elm = elm.parentElement;\n }\n return defaultMode;\n });\n};\n\nexport { isPlatform as a, getIonMode as b, config as c, getPlatforms as g, initialize as i };\n","/*!\n * (C) Ionic http://ionicframework.com - MIT License\n */\nimport { c as createAnimation } from './animation-dde8cc0d.js';\nimport { g as getIonPageElement } from './index-89cbcdab.js';\nimport './index-a5d50daf.js';\nimport './helpers-ae653409.js';\nimport './index-db215ebe.js';\n\nconst DURATION = 540;\n// TODO(FW-2832): types\nconst getClonedElement = (tagName) => {\n return document.querySelector(`${tagName}.ion-cloned-element`);\n};\nconst shadow = (el) => {\n return el.shadowRoot || el;\n};\nconst getLargeTitle = (refEl) => {\n const tabs = refEl.tagName === 'ION-TABS' ? refEl : refEl.querySelector('ion-tabs');\n const query = 'ion-content ion-header:not(.header-collapse-condense-inactive) ion-title.title-large';\n if (tabs != null) {\n const activeTab = tabs.querySelector('ion-tab:not(.tab-hidden), .ion-page:not(.ion-page-hidden)');\n return activeTab != null ? activeTab.querySelector(query) : null;\n }\n return refEl.querySelector(query);\n};\nconst getBackButton = (refEl, backDirection) => {\n const tabs = refEl.tagName === 'ION-TABS' ? refEl : refEl.querySelector('ion-tabs');\n let buttonsList = [];\n if (tabs != null) {\n const activeTab = tabs.querySelector('ion-tab:not(.tab-hidden), .ion-page:not(.ion-page-hidden)');\n if (activeTab != null) {\n buttonsList = activeTab.querySelectorAll('ion-buttons');\n }\n }\n else {\n buttonsList = refEl.querySelectorAll('ion-buttons');\n }\n for (const buttons of buttonsList) {\n const parentHeader = buttons.closest('ion-header');\n const activeHeader = parentHeader && !parentHeader.classList.contains('header-collapse-condense-inactive');\n const backButton = buttons.querySelector('ion-back-button');\n const buttonsCollapse = buttons.classList.contains('buttons-collapse');\n const startSlot = buttons.slot === 'start' || buttons.slot === '';\n if (backButton !== null && startSlot && ((buttonsCollapse && activeHeader && backDirection) || !buttonsCollapse)) {\n return backButton;\n }\n }\n return null;\n};\nconst createLargeTitleTransition = (rootAnimation, rtl, backDirection, enteringEl, leavingEl) => {\n const enteringBackButton = getBackButton(enteringEl, backDirection);\n const leavingLargeTitle = getLargeTitle(leavingEl);\n const enteringLargeTitle = getLargeTitle(enteringEl);\n const leavingBackButton = getBackButton(leavingEl, backDirection);\n const shouldAnimationForward = enteringBackButton !== null && leavingLargeTitle !== null && !backDirection;\n const shouldAnimationBackward = enteringLargeTitle !== null && leavingBackButton !== null && backDirection;\n if (shouldAnimationForward) {\n const leavingLargeTitleBox = leavingLargeTitle.getBoundingClientRect();\n const enteringBackButtonBox = enteringBackButton.getBoundingClientRect();\n const enteringBackButtonTextEl = shadow(enteringBackButton).querySelector('.button-text');\n const enteringBackButtonTextBox = enteringBackButtonTextEl.getBoundingClientRect();\n const leavingLargeTitleTextEl = shadow(leavingLargeTitle).querySelector('.toolbar-title');\n const leavingLargeTitleTextBox = leavingLargeTitleTextEl.getBoundingClientRect();\n animateLargeTitle(rootAnimation, rtl, backDirection, leavingLargeTitle, leavingLargeTitleBox, leavingLargeTitleTextBox, enteringBackButtonTextEl, enteringBackButtonTextBox);\n animateBackButton(rootAnimation, rtl, backDirection, enteringBackButton, enteringBackButtonBox, enteringBackButtonTextEl, enteringBackButtonTextBox, leavingLargeTitle, leavingLargeTitleTextBox);\n }\n else if (shouldAnimationBackward) {\n const enteringLargeTitleBox = enteringLargeTitle.getBoundingClientRect();\n const leavingBackButtonBox = leavingBackButton.getBoundingClientRect();\n const leavingBackButtonTextEl = shadow(leavingBackButton).querySelector('.button-text');\n const leavingBackButtonTextBox = leavingBackButtonTextEl.getBoundingClientRect();\n const enteringLargeTitleTextEl = shadow(enteringLargeTitle).querySelector('.toolbar-title');\n const enteringLargeTitleTextBox = enteringLargeTitleTextEl.getBoundingClientRect();\n animateLargeTitle(rootAnimation, rtl, backDirection, enteringLargeTitle, enteringLargeTitleBox, enteringLargeTitleTextBox, leavingBackButtonTextEl, leavingBackButtonTextBox);\n animateBackButton(rootAnimation, rtl, backDirection, leavingBackButton, leavingBackButtonBox, leavingBackButtonTextEl, leavingBackButtonTextBox, enteringLargeTitle, enteringLargeTitleTextBox);\n }\n return {\n forward: shouldAnimationForward,\n backward: shouldAnimationBackward,\n };\n};\nconst animateBackButton = (rootAnimation, rtl, backDirection, backButtonEl, backButtonBox, backButtonTextEl, backButtonTextBox, largeTitleEl, largeTitleTextBox) => {\n var _a, _b;\n const BACK_BUTTON_START_OFFSET = rtl ? `calc(100% - ${backButtonBox.right + 4}px)` : `${backButtonBox.left - 4}px`;\n const TEXT_ORIGIN_X = rtl ? 'right' : 'left';\n const ICON_ORIGIN_X = rtl ? 'left' : 'right';\n const CONTAINER_ORIGIN_X = rtl ? 'right' : 'left';\n /**\n * When the title and back button texts match\n * then they should overlap during the page transition.\n * If the texts do not match up then the back button text scale adjusts\n * to not perfectly match the large title text otherwise the\n * proportions will be incorrect.\n * When the texts match we scale both the width and height to account for\n * font weight differences between the title and back button.\n */\n const doTitleAndButtonTextsMatch = ((_a = backButtonTextEl.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === ((_b = largeTitleEl.textContent) === null || _b === void 0 ? void 0 : _b.trim());\n const WIDTH_SCALE = largeTitleTextBox.width / backButtonTextBox.width;\n /**\n * We subtract an offset to account for slight sizing/padding\n * differences between the title and the back button.\n */\n const HEIGHT_SCALE = (largeTitleTextBox.height - LARGE_TITLE_SIZE_OFFSET) / backButtonTextBox.height;\n const TEXT_START_SCALE = doTitleAndButtonTextsMatch\n ? `scale(${WIDTH_SCALE}, ${HEIGHT_SCALE})`\n : `scale(${HEIGHT_SCALE})`;\n const TEXT_END_SCALE = 'scale(1)';\n const backButtonIconEl = shadow(backButtonEl).querySelector('ion-icon');\n const backButtonIconBox = backButtonIconEl.getBoundingClientRect();\n /**\n * We need to offset the container by the icon dimensions\n * so that the back button text aligns with the large title\n * text. Otherwise, the back button icon will align with the\n * large title text but the back button text will not.\n */\n const CONTAINER_START_TRANSLATE_X = rtl\n ? `${backButtonIconBox.width / 2 - (backButtonIconBox.right - backButtonBox.right)}px`\n : `${backButtonBox.left - backButtonIconBox.width / 2}px`;\n const CONTAINER_END_TRANSLATE_X = rtl ? `-${window.innerWidth - backButtonBox.right}px` : `${backButtonBox.left}px`;\n /**\n * Back button container should be\n * aligned to the top of the title container\n * so the texts overlap as the back button\n * text begins to fade in.\n */\n const CONTAINER_START_TRANSLATE_Y = `${largeTitleTextBox.top}px`;\n /**\n * The cloned back button should align exactly with the\n * real back button on the entering page otherwise there will\n * be a layout shift.\n */\n const CONTAINER_END_TRANSLATE_Y = `${backButtonBox.top}px`;\n /**\n * In the forward direction, the cloned back button\n * container should translate from over the large title\n * to over the back button. In the backward direction,\n * it should translate from over the back button to over\n * the large title.\n */\n const FORWARD_CONTAINER_KEYFRAMES = [\n { offset: 0, transform: `translate3d(${CONTAINER_START_TRANSLATE_X}, ${CONTAINER_START_TRANSLATE_Y}, 0)` },\n { offset: 1, transform: `translate3d(${CONTAINER_END_TRANSLATE_X}, ${CONTAINER_END_TRANSLATE_Y}, 0)` },\n ];\n const BACKWARD_CONTAINER_KEYFRAMES = [\n { offset: 0, transform: `translate3d(${CONTAINER_END_TRANSLATE_X}, ${CONTAINER_END_TRANSLATE_Y}, 0)` },\n { offset: 1, transform: `translate3d(${CONTAINER_START_TRANSLATE_X}, ${CONTAINER_START_TRANSLATE_Y}, 0)` },\n ];\n const CONTAINER_KEYFRAMES = backDirection ? BACKWARD_CONTAINER_KEYFRAMES : FORWARD_CONTAINER_KEYFRAMES;\n /**\n * In the forward direction, the text in the cloned back button\n * should start to be (roughly) the size of the large title\n * and then scale down to be the size of the actual back button.\n * The text should also translate, but that translate is handled\n * by the container keyframes.\n */\n const FORWARD_TEXT_KEYFRAMES = [\n { offset: 0, opacity: 0, transform: TEXT_START_SCALE },\n { offset: 1, opacity: 1, transform: TEXT_END_SCALE },\n ];\n const BACKWARD_TEXT_KEYFRAMES = [\n { offset: 0, opacity: 1, transform: TEXT_END_SCALE },\n { offset: 1, opacity: 0, transform: TEXT_START_SCALE },\n ];\n const TEXT_KEYFRAMES = backDirection ? BACKWARD_TEXT_KEYFRAMES : FORWARD_TEXT_KEYFRAMES;\n /**\n * The icon should scale in/out in the second\n * half of the animation. The icon should also\n * translate, but that translate is handled by the\n * container keyframes.\n */\n const FORWARD_ICON_KEYFRAMES = [\n { offset: 0, opacity: 0, transform: 'scale(0.6)' },\n { offset: 0.6, opacity: 0, transform: 'scale(0.6)' },\n { offset: 1, opacity: 1, transform: 'scale(1)' },\n ];\n const BACKWARD_ICON_KEYFRAMES = [\n { offset: 0, opacity: 1, transform: 'scale(1)' },\n { offset: 0.2, opacity: 0, transform: 'scale(0.6)' },\n { offset: 1, opacity: 0, transform: 'scale(0.6)' },\n ];\n const ICON_KEYFRAMES = backDirection ? BACKWARD_ICON_KEYFRAMES : FORWARD_ICON_KEYFRAMES;\n const enteringBackButtonTextAnimation = createAnimation();\n const enteringBackButtonIconAnimation = createAnimation();\n const enteringBackButtonAnimation = createAnimation();\n const clonedBackButtonEl = getClonedElement('ion-back-button');\n const clonedBackButtonTextEl = shadow(clonedBackButtonEl).querySelector('.button-text');\n const clonedBackButtonIconEl = shadow(clonedBackButtonEl).querySelector('ion-icon');\n clonedBackButtonEl.text = backButtonEl.text;\n clonedBackButtonEl.mode = backButtonEl.mode;\n clonedBackButtonEl.icon = backButtonEl.icon;\n clonedBackButtonEl.color = backButtonEl.color;\n clonedBackButtonEl.disabled = backButtonEl.disabled;\n clonedBackButtonEl.style.setProperty('display', 'block');\n clonedBackButtonEl.style.setProperty('position', 'fixed');\n enteringBackButtonIconAnimation.addElement(clonedBackButtonIconEl);\n enteringBackButtonTextAnimation.addElement(clonedBackButtonTextEl);\n enteringBackButtonAnimation.addElement(clonedBackButtonEl);\n enteringBackButtonAnimation\n .beforeStyles({\n position: 'absolute',\n top: '0px',\n [CONTAINER_ORIGIN_X]: '0px',\n })\n .keyframes(CONTAINER_KEYFRAMES);\n enteringBackButtonTextAnimation\n .beforeStyles({\n 'transform-origin': `${TEXT_ORIGIN_X} top`,\n })\n .beforeAddWrite(() => {\n backButtonEl.style.setProperty('display', 'none');\n clonedBackButtonEl.style.setProperty(TEXT_ORIGIN_X, BACK_BUTTON_START_OFFSET);\n })\n .afterAddWrite(() => {\n backButtonEl.style.setProperty('display', '');\n clonedBackButtonEl.style.setProperty('display', 'none');\n clonedBackButtonEl.style.removeProperty(TEXT_ORIGIN_X);\n })\n .keyframes(TEXT_KEYFRAMES);\n enteringBackButtonIconAnimation\n .beforeStyles({\n 'transform-origin': `${ICON_ORIGIN_X} center`,\n })\n .keyframes(ICON_KEYFRAMES);\n rootAnimation.addAnimation([\n enteringBackButtonTextAnimation,\n enteringBackButtonIconAnimation,\n enteringBackButtonAnimation,\n ]);\n};\nconst animateLargeTitle = (rootAnimation, rtl, backDirection, largeTitleEl, largeTitleBox, largeTitleTextBox, backButtonTextEl, backButtonTextBox) => {\n var _a, _b;\n /**\n * The horizontal transform origin for the large title\n */\n const ORIGIN_X = rtl ? 'right' : 'left';\n const TITLE_START_OFFSET = rtl ? `calc(100% - ${largeTitleBox.right}px)` : `${largeTitleBox.left}px`;\n /**\n * The cloned large should align exactly with the\n * real large title on the leaving page otherwise there will\n * be a layout shift.\n */\n const START_TRANSLATE_X = '0px';\n const START_TRANSLATE_Y = `${largeTitleBox.top}px`;\n /**\n * How much to offset the large title translation by.\n * This accounts for differences in sizing between the large\n * title and the back button due to padding and font weight.\n */\n const LARGE_TITLE_TRANSLATION_OFFSET = 8;\n /**\n * The scaled title should (roughly) overlap the back button.\n * This ensures that the back button and title overlap during\n * the animation. Note that since both elements either fade in\n * or fade out over the course of the animation, neither element\n * will be fully visible on top of the other. As a result, the overlap\n * does not need to be perfect, so approximate values are acceptable here.\n */\n const END_TRANSLATE_X = rtl\n ? `-${window.innerWidth - backButtonTextBox.right - LARGE_TITLE_TRANSLATION_OFFSET}px`\n : `${backButtonTextBox.x - LARGE_TITLE_TRANSLATION_OFFSET}px`;\n /**\n * The top of the scaled large title\n * should match with the top of the\n * back button text element.\n * We subtract 2px to account for the top padding\n * on the large title element.\n */\n const LARGE_TITLE_TOP_PADDING = 2;\n const END_TRANSLATE_Y = `${backButtonTextBox.y - LARGE_TITLE_TOP_PADDING}px`;\n /**\n * In the forward direction, the large title should start at its\n * normal size and then scale down to be (roughly) the size of the\n * back button on the other view. In the backward direction, the\n * large title should start at (roughly) the size of the back button\n * and then scale up to its original size.\n *\n * Note that since both elements either fade in\n * or fade out over the course of the animation, neither element\n * will be fully visible on top of the other. As a result, the overlap\n * does not need to be perfect, so approximate values are acceptable here.\n */\n /**\n * When the title and back button texts match\n * then they should overlap during the page transition.\n * If the texts do not match up then the large title text scale adjusts\n * to not perfectly match the back button text otherwise the\n * proportions will be incorrect.\n * When the texts match we scale both the width and height to account for\n * font weight differences between the title and back button.\n */\n const doTitleAndButtonTextsMatch = ((_a = backButtonTextEl.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === ((_b = largeTitleEl.textContent) === null || _b === void 0 ? void 0 : _b.trim());\n const WIDTH_SCALE = backButtonTextBox.width / largeTitleTextBox.width;\n const HEIGHT_SCALE = backButtonTextBox.height / (largeTitleTextBox.height - LARGE_TITLE_SIZE_OFFSET);\n const START_SCALE = 'scale(1)';\n const END_SCALE = doTitleAndButtonTextsMatch ? `scale(${WIDTH_SCALE}, ${HEIGHT_SCALE})` : `scale(${HEIGHT_SCALE})`;\n const BACKWARDS_KEYFRAMES = [\n { offset: 0, opacity: 0, transform: `translate3d(${END_TRANSLATE_X}, ${END_TRANSLATE_Y}, 0) ${END_SCALE}` },\n { offset: 0.1, opacity: 0 },\n { offset: 1, opacity: 1, transform: `translate3d(${START_TRANSLATE_X}, ${START_TRANSLATE_Y}, 0) ${START_SCALE}` },\n ];\n const FORWARDS_KEYFRAMES = [\n {\n offset: 0,\n opacity: 0.99,\n transform: `translate3d(${START_TRANSLATE_X}, ${START_TRANSLATE_Y}, 0) ${START_SCALE}`,\n },\n { offset: 0.6, opacity: 0 },\n { offset: 1, opacity: 0, transform: `translate3d(${END_TRANSLATE_X}, ${END_TRANSLATE_Y}, 0) ${END_SCALE}` },\n ];\n const KEYFRAMES = backDirection ? BACKWARDS_KEYFRAMES : FORWARDS_KEYFRAMES;\n const clonedTitleEl = getClonedElement('ion-title');\n const clonedLargeTitleAnimation = createAnimation();\n clonedTitleEl.innerText = largeTitleEl.innerText;\n clonedTitleEl.size = largeTitleEl.size;\n clonedTitleEl.color = largeTitleEl.color;\n clonedLargeTitleAnimation.addElement(clonedTitleEl);\n clonedLargeTitleAnimation\n .beforeStyles({\n 'transform-origin': `${ORIGIN_X} top`,\n /**\n * Since font size changes will cause\n * the dimension of the large title to change\n * we need to set the cloned title height\n * equal to that of the original large title height.\n */\n height: `${largeTitleBox.height}px`,\n display: '',\n position: 'relative',\n [ORIGIN_X]: TITLE_START_OFFSET,\n })\n .beforeAddWrite(() => {\n largeTitleEl.style.setProperty('opacity', '0');\n })\n .afterAddWrite(() => {\n largeTitleEl.style.setProperty('opacity', '');\n clonedTitleEl.style.setProperty('display', 'none');\n })\n .keyframes(KEYFRAMES);\n rootAnimation.addAnimation(clonedLargeTitleAnimation);\n};\nconst iosTransitionAnimation = (navEl, opts) => {\n var _a;\n try {\n const EASING = 'cubic-bezier(0.32,0.72,0,1)';\n const OPACITY = 'opacity';\n const TRANSFORM = 'transform';\n const CENTER = '0%';\n const OFF_OPACITY = 0.8;\n const isRTL = navEl.ownerDocument.dir === 'rtl';\n const OFF_RIGHT = isRTL ? '-99.5%' : '99.5%';\n const OFF_LEFT = isRTL ? '33%' : '-33%';\n const enteringEl = opts.enteringEl;\n const leavingEl = opts.leavingEl;\n const backDirection = opts.direction === 'back';\n const contentEl = enteringEl.querySelector(':scope > ion-content');\n const headerEls = enteringEl.querySelectorAll(':scope > ion-header > *:not(ion-toolbar), :scope > ion-footer > *');\n const enteringToolBarEls = enteringEl.querySelectorAll(':scope > ion-header > ion-toolbar');\n const rootAnimation = createAnimation();\n const enteringContentAnimation = createAnimation();\n rootAnimation\n .addElement(enteringEl)\n .duration(((_a = opts.duration) !== null && _a !== void 0 ? _a : 0) || DURATION)\n .easing(opts.easing || EASING)\n .fill('both')\n .beforeRemoveClass('ion-page-invisible');\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\n if (leavingEl && navEl !== null && navEl !== undefined) {\n const navDecorAnimation = createAnimation();\n navDecorAnimation.addElement(navEl);\n rootAnimation.addAnimation(navDecorAnimation);\n }\n if (!contentEl && enteringToolBarEls.length === 0 && headerEls.length === 0) {\n enteringContentAnimation.addElement(enteringEl.querySelector(':scope > .ion-page, :scope > ion-nav, :scope > ion-tabs')); // REVIEW\n }\n else {\n enteringContentAnimation.addElement(contentEl); // REVIEW\n enteringContentAnimation.addElement(headerEls);\n }\n rootAnimation.addAnimation(enteringContentAnimation);\n if (backDirection) {\n enteringContentAnimation\n .beforeClearStyles([OPACITY])\n .fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`)\n .fromTo(OPACITY, OFF_OPACITY, 1);\n }\n else {\n // entering content, forward direction\n enteringContentAnimation\n .beforeClearStyles([OPACITY])\n .fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`);\n }\n if (contentEl) {\n const enteringTransitionEffectEl = shadow(contentEl).querySelector('.transition-effect');\n if (enteringTransitionEffectEl) {\n const enteringTransitionCoverEl = enteringTransitionEffectEl.querySelector('.transition-cover');\n const enteringTransitionShadowEl = enteringTransitionEffectEl.querySelector('.transition-shadow');\n const enteringTransitionEffect = createAnimation();\n const enteringTransitionCover = createAnimation();\n const enteringTransitionShadow = createAnimation();\n enteringTransitionEffect\n .addElement(enteringTransitionEffectEl)\n .beforeStyles({ opacity: '1', display: 'block' })\n .afterStyles({ opacity: '', display: '' });\n enteringTransitionCover\n .addElement(enteringTransitionCoverEl) // REVIEW\n .beforeClearStyles([OPACITY])\n .fromTo(OPACITY, 0, 0.1);\n enteringTransitionShadow\n .addElement(enteringTransitionShadowEl) // REVIEW\n .beforeClearStyles([OPACITY])\n .fromTo(OPACITY, 0.03, 0.7);\n enteringTransitionEffect.addAnimation([enteringTransitionCover, enteringTransitionShadow]);\n enteringContentAnimation.addAnimation([enteringTransitionEffect]);\n }\n }\n const enteringContentHasLargeTitle = enteringEl.querySelector('ion-header.header-collapse-condense');\n const { forward, backward } = createLargeTitleTransition(rootAnimation, isRTL, backDirection, enteringEl, leavingEl);\n enteringToolBarEls.forEach((enteringToolBarEl) => {\n const enteringToolBar = createAnimation();\n enteringToolBar.addElement(enteringToolBarEl);\n rootAnimation.addAnimation(enteringToolBar);\n const enteringTitle = createAnimation();\n enteringTitle.addElement(enteringToolBarEl.querySelector('ion-title')); // REVIEW\n const enteringToolBarButtons = createAnimation();\n const buttons = Array.from(enteringToolBarEl.querySelectorAll('ion-buttons,[menuToggle]'));\n const parentHeader = enteringToolBarEl.closest('ion-header');\n const inactiveHeader = parentHeader === null || parentHeader === void 0 ? void 0 : parentHeader.classList.contains('header-collapse-condense-inactive');\n let buttonsToAnimate;\n if (backDirection) {\n buttonsToAnimate = buttons.filter((button) => {\n const isCollapseButton = button.classList.contains('buttons-collapse');\n return (isCollapseButton && !inactiveHeader) || !isCollapseButton;\n });\n }\n else {\n buttonsToAnimate = buttons.filter((button) => !button.classList.contains('buttons-collapse'));\n }\n enteringToolBarButtons.addElement(buttonsToAnimate);\n const enteringToolBarItems = createAnimation();\n enteringToolBarItems.addElement(enteringToolBarEl.querySelectorAll(':scope > *:not(ion-title):not(ion-buttons):not([menuToggle])'));\n const enteringToolBarBg = createAnimation();\n enteringToolBarBg.addElement(shadow(enteringToolBarEl).querySelector('.toolbar-background')); // REVIEW\n const enteringBackButton = createAnimation();\n const backButtonEl = enteringToolBarEl.querySelector('ion-back-button');\n if (backButtonEl) {\n enteringBackButton.addElement(backButtonEl);\n }\n enteringToolBar.addAnimation([\n enteringTitle,\n enteringToolBarButtons,\n enteringToolBarItems,\n enteringToolBarBg,\n enteringBackButton,\n ]);\n enteringToolBarButtons.fromTo(OPACITY, 0.01, 1);\n enteringToolBarItems.fromTo(OPACITY, 0.01, 1);\n if (backDirection) {\n if (!inactiveHeader) {\n enteringTitle\n .fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`)\n .fromTo(OPACITY, 0.01, 1);\n }\n enteringToolBarItems.fromTo('transform', `translateX(${OFF_LEFT})`, `translateX(${CENTER})`);\n // back direction, entering page has a back button\n enteringBackButton.fromTo(OPACITY, 0.01, 1);\n }\n else {\n // entering toolbar, forward direction\n if (!enteringContentHasLargeTitle) {\n enteringTitle\n .fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`)\n .fromTo(OPACITY, 0.01, 1);\n }\n enteringToolBarItems.fromTo('transform', `translateX(${OFF_RIGHT})`, `translateX(${CENTER})`);\n enteringToolBarBg.beforeClearStyles([OPACITY, 'transform']);\n const translucentHeader = parentHeader === null || parentHeader === void 0 ? void 0 : parentHeader.translucent;\n if (!translucentHeader) {\n enteringToolBarBg.fromTo(OPACITY, 0.01, 'var(--opacity)');\n }\n else {\n enteringToolBarBg.fromTo('transform', isRTL ? 'translateX(-100%)' : 'translateX(100%)', 'translateX(0px)');\n }\n // forward direction, entering page has a back button\n if (!forward) {\n enteringBackButton.fromTo(OPACITY, 0.01, 1);\n }\n if (backButtonEl && !forward) {\n const enteringBackBtnText = createAnimation();\n enteringBackBtnText\n .addElement(shadow(backButtonEl).querySelector('.button-text')) // REVIEW\n .fromTo(`transform`, isRTL ? 'translateX(-100px)' : 'translateX(100px)', 'translateX(0px)');\n enteringToolBar.addAnimation(enteringBackBtnText);\n }\n }\n });\n // setup leaving view\n if (leavingEl) {\n const leavingContent = createAnimation();\n const leavingContentEl = leavingEl.querySelector(':scope > ion-content');\n const leavingToolBarEls = leavingEl.querySelectorAll(':scope > ion-header > ion-toolbar');\n const leavingHeaderEls = leavingEl.querySelectorAll(':scope > ion-header > *:not(ion-toolbar), :scope > ion-footer > *');\n if (!leavingContentEl && leavingToolBarEls.length === 0 && leavingHeaderEls.length === 0) {\n leavingContent.addElement(leavingEl.querySelector(':scope > .ion-page, :scope > ion-nav, :scope > ion-tabs')); // REVIEW\n }\n else {\n leavingContent.addElement(leavingContentEl); // REVIEW\n leavingContent.addElement(leavingHeaderEls);\n }\n rootAnimation.addAnimation(leavingContent);\n if (backDirection) {\n // leaving content, back direction\n leavingContent\n .beforeClearStyles([OPACITY])\n .fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)');\n const leavingPage = getIonPageElement(leavingEl);\n rootAnimation.afterAddWrite(() => {\n if (rootAnimation.getDirection() === 'normal') {\n leavingPage.style.setProperty('display', 'none');\n }\n });\n }\n else {\n // leaving content, forward direction\n leavingContent\n .fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`)\n .fromTo(OPACITY, 1, OFF_OPACITY);\n }\n if (leavingContentEl) {\n const leavingTransitionEffectEl = shadow(leavingContentEl).querySelector('.transition-effect');\n if (leavingTransitionEffectEl) {\n const leavingTransitionCoverEl = leavingTransitionEffectEl.querySelector('.transition-cover');\n const leavingTransitionShadowEl = leavingTransitionEffectEl.querySelector('.transition-shadow');\n const leavingTransitionEffect = createAnimation();\n const leavingTransitionCover = createAnimation();\n const leavingTransitionShadow = createAnimation();\n leavingTransitionEffect\n .addElement(leavingTransitionEffectEl)\n .beforeStyles({ opacity: '1', display: 'block' })\n .afterStyles({ opacity: '', display: '' });\n leavingTransitionCover\n .addElement(leavingTransitionCoverEl) // REVIEW\n .beforeClearStyles([OPACITY])\n .fromTo(OPACITY, 0.1, 0);\n leavingTransitionShadow\n .addElement(leavingTransitionShadowEl) // REVIEW\n .beforeClearStyles([OPACITY])\n .fromTo(OPACITY, 0.7, 0.03);\n leavingTransitionEffect.addAnimation([leavingTransitionCover, leavingTransitionShadow]);\n leavingContent.addAnimation([leavingTransitionEffect]);\n }\n }\n leavingToolBarEls.forEach((leavingToolBarEl) => {\n const leavingToolBar = createAnimation();\n leavingToolBar.addElement(leavingToolBarEl);\n const leavingTitle = createAnimation();\n leavingTitle.addElement(leavingToolBarEl.querySelector('ion-title')); // REVIEW\n const leavingToolBarButtons = createAnimation();\n const buttons = leavingToolBarEl.querySelectorAll('ion-buttons,[menuToggle]');\n const parentHeader = leavingToolBarEl.closest('ion-header');\n const inactiveHeader = parentHeader === null || parentHeader === void 0 ? void 0 : parentHeader.classList.contains('header-collapse-condense-inactive');\n const buttonsToAnimate = Array.from(buttons).filter((button) => {\n const isCollapseButton = button.classList.contains('buttons-collapse');\n return (isCollapseButton && !inactiveHeader) || !isCollapseButton;\n });\n leavingToolBarButtons.addElement(buttonsToAnimate);\n const leavingToolBarItems = createAnimation();\n const leavingToolBarItemEls = leavingToolBarEl.querySelectorAll(':scope > *:not(ion-title):not(ion-buttons):not([menuToggle])');\n if (leavingToolBarItemEls.length > 0) {\n leavingToolBarItems.addElement(leavingToolBarItemEls);\n }\n const leavingToolBarBg = createAnimation();\n leavingToolBarBg.addElement(shadow(leavingToolBarEl).querySelector('.toolbar-background')); // REVIEW\n const leavingBackButton = createAnimation();\n const backButtonEl = leavingToolBarEl.querySelector('ion-back-button');\n if (backButtonEl) {\n leavingBackButton.addElement(backButtonEl);\n }\n leavingToolBar.addAnimation([\n leavingTitle,\n leavingToolBarButtons,\n leavingToolBarItems,\n leavingBackButton,\n leavingToolBarBg,\n ]);\n rootAnimation.addAnimation(leavingToolBar);\n // fade out leaving toolbar items\n leavingBackButton.fromTo(OPACITY, 0.99, 0);\n leavingToolBarButtons.fromTo(OPACITY, 0.99, 0);\n leavingToolBarItems.fromTo(OPACITY, 0.99, 0);\n if (backDirection) {\n if (!inactiveHeader) {\n // leaving toolbar, back direction\n leavingTitle\n .fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)')\n .fromTo(OPACITY, 0.99, 0);\n }\n leavingToolBarItems.fromTo('transform', `translateX(${CENTER})`, isRTL ? 'translateX(-100%)' : 'translateX(100%)');\n leavingToolBarBg.beforeClearStyles([OPACITY, 'transform']);\n // leaving toolbar, back direction, and there's no entering toolbar\n // should just slide out, no fading out\n const translucentHeader = parentHeader === null || parentHeader === void 0 ? void 0 : parentHeader.translucent;\n if (!translucentHeader) {\n leavingToolBarBg.fromTo(OPACITY, 'var(--opacity)', 0);\n }\n else {\n leavingToolBarBg.fromTo('transform', 'translateX(0px)', isRTL ? 'translateX(-100%)' : 'translateX(100%)');\n }\n if (backButtonEl && !backward) {\n const leavingBackBtnText = createAnimation();\n leavingBackBtnText\n .addElement(shadow(backButtonEl).querySelector('.button-text')) // REVIEW\n .fromTo('transform', `translateX(${CENTER})`, `translateX(${(isRTL ? -124 : 124) + 'px'})`);\n leavingToolBar.addAnimation(leavingBackBtnText);\n }\n }\n else {\n // leaving toolbar, forward direction\n if (!inactiveHeader) {\n leavingTitle\n .fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`)\n .fromTo(OPACITY, 0.99, 0)\n .afterClearStyles([TRANSFORM, OPACITY]);\n }\n leavingToolBarItems\n .fromTo('transform', `translateX(${CENTER})`, `translateX(${OFF_LEFT})`)\n .afterClearStyles([TRANSFORM, OPACITY]);\n leavingBackButton.afterClearStyles([OPACITY]);\n leavingTitle.afterClearStyles([OPACITY]);\n leavingToolBarButtons.afterClearStyles([OPACITY]);\n }\n });\n }\n return rootAnimation;\n }\n catch (err) {\n throw err;\n }\n};\n/**\n * The scale of the back button during the animation\n * is computed based on the scale of the large title\n * and vice versa. However, we need to account for slight\n * variations in the size of the large title due to\n * padding and font weight. This value should be used to subtract\n * a small amount from the large title height when computing scales\n * to get more accurate scale results.\n */\nconst LARGE_TITLE_SIZE_OFFSET = 10;\n\nexport { iosTransitionAnimation, shadow };\n","/*!\n * (C) Ionic http://ionicframework.com - MIT License\n */\nimport { b as bootstrapLazy } from './index-db215ebe.js';\nexport { s as setNonce } from './index-db215ebe.js';\nimport { g as globalScripts } from './app-globals-ea8ee7a0.js';\nimport './ionic-global-fb3f9f73.js';\n\nconst defineCustomElements = (win, options) => {\n if (typeof window === 'undefined') return undefined;\n globalScripts();\n return bootstrapLazy(JSON.parse(\"[[\\\"ion-menu_3\\\",[[33,\\\"ion-menu-button\\\",{\\\"color\\\":[513],\\\"disabled\\\":[4],\\\"menu\\\":[1],\\\"autoHide\\\":[4,\\\"auto-hide\\\"],\\\"type\\\":[1],\\\"visible\\\":[32]},[[16,\\\"ionMenuChange\\\",\\\"visibilityChanged\\\"],[16,\\\"ionSplitPaneVisible\\\",\\\"visibilityChanged\\\"]]],[33,\\\"ion-menu\\\",{\\\"contentId\\\":[513,\\\"content-id\\\"],\\\"menuId\\\":[513,\\\"menu-id\\\"],\\\"type\\\":[1025],\\\"disabled\\\":[1028],\\\"side\\\":[513],\\\"swipeGesture\\\":[4,\\\"swipe-gesture\\\"],\\\"maxEdgeStart\\\":[2,\\\"max-edge-start\\\"],\\\"isPaneVisible\\\":[32],\\\"isEndSide\\\":[32],\\\"isOpen\\\":[64],\\\"isActive\\\":[64],\\\"open\\\":[64],\\\"close\\\":[64],\\\"toggle\\\":[64],\\\"setOpen\\\":[64]},[[16,\\\"ionSplitPaneVisible\\\",\\\"onSplitPaneChanged\\\"],[2,\\\"click\\\",\\\"onBackdropClick\\\"],[0,\\\"keydown\\\",\\\"onKeydown\\\"]],{\\\"type\\\":[\\\"typeChanged\\\"],\\\"disabled\\\":[\\\"disabledChanged\\\"],\\\"side\\\":[\\\"sideChanged\\\"],\\\"swipeGesture\\\":[\\\"swipeGestureChanged\\\"]}],[1,\\\"ion-menu-toggle\\\",{\\\"menu\\\":[1],\\\"autoHide\\\":[4,\\\"auto-hide\\\"],\\\"visible\\\":[32]},[[16,\\\"ionMenuChange\\\",\\\"visibilityChanged\\\"],[16,\\\"ionSplitPaneVisible\\\",\\\"visibilityChanged\\\"]]]]],[\\\"ion-fab_3\\\",[[33,\\\"ion-fab-button\\\",{\\\"color\\\":[513],\\\"activated\\\":[4],\\\"disabled\\\":[4],\\\"download\\\":[1],\\\"href\\\":[1],\\\"rel\\\":[1],\\\"routerDirection\\\":[1,\\\"router-direction\\\"],\\\"routerAnimation\\\":[16],\\\"target\\\":[1],\\\"show\\\":[4],\\\"translucent\\\":[4],\\\"type\\\":[1],\\\"size\\\":[1],\\\"closeIcon\\\":[1,\\\"close-icon\\\"]}],[1,\\\"ion-fab\\\",{\\\"horizontal\\\":[1],\\\"vertical\\\":[1],\\\"edge\\\":[4],\\\"activated\\\":[1028],\\\"close\\\":[64],\\\"toggle\\\":[64]},null,{\\\"activated\\\":[\\\"activatedChanged\\\"]}],[1,\\\"ion-fab-list\\\",{\\\"activated\\\":[4],\\\"side\\\":[1]},null,{\\\"activated\\\":[\\\"activatedChanged\\\"]}]]],[\\\"ion-refresher_2\\\",[[0,\\\"ion-refresher-content\\\",{\\\"pullingIcon\\\":[1025,\\\"pulling-icon\\\"],\\\"pullingText\\\":[1,\\\"pulling-text\\\"],\\\"refreshingSpinner\\\":[1025,\\\"refreshing-spinner\\\"],\\\"refreshingText\\\":[1,\\\"refreshing-text\\\"]}],[32,\\\"ion-refresher\\\",{\\\"pullMin\\\":[2,\\\"pull-min\\\"],\\\"pullMax\\\":[2,\\\"pull-max\\\"],\\\"closeDuration\\\":[1,\\\"close-duration\\\"],\\\"snapbackDuration\\\":[1,\\\"snapback-duration\\\"],\\\"pullFactor\\\":[2,\\\"pull-factor\\\"],\\\"disabled\\\":[4],\\\"nativeRefresher\\\":[32],\\\"state\\\":[32],\\\"complete\\\":[64],\\\"cancel\\\":[64],\\\"getProgress\\\":[64]},null,{\\\"disabled\\\":[\\\"disabledChanged\\\"]}]]],[\\\"ion-back-button\\\",[[33,\\\"ion-back-button\\\",{\\\"color\\\":[513],\\\"defaultHref\\\":[1025,\\\"default-href\\\"],\\\"disabled\\\":[516],\\\"icon\\\":[1],\\\"text\\\":[1],\\\"type\\\":[1],\\\"routerAnimation\\\":[16]}]]],[\\\"ion-toast\\\",[[33,\\\"ion-toast\\\",{\\\"overlayIndex\\\":[2,\\\"overlay-index\\\"],\\\"delegate\\\":[16],\\\"hasController\\\":[4,\\\"has-controller\\\"],\\\"color\\\":[513],\\\"enterAnimation\\\":[16],\\\"leaveAnimation\\\":[16],\\\"cssClass\\\":[1,\\\"css-class\\\"],\\\"duration\\\":[2],\\\"header\\\":[1],\\\"layout\\\":[1],\\\"message\\\":[1],\\\"keyboardClose\\\":[4,\\\"keyboard-close\\\"],\\\"position\\\":[1],\\\"positionAnchor\\\":[1,\\\"position-anchor\\\"],\\\"buttons\\\":[16],\\\"translucent\\\":[4],\\\"animated\\\":[4],\\\"icon\\\":[1],\\\"htmlAttributes\\\":[16],\\\"swipeGesture\\\":[1,\\\"swipe-gesture\\\"],\\\"isOpen\\\":[4,\\\"is-open\\\"],\\\"trigger\\\":[1],\\\"revealContentToScreenReader\\\":[32],\\\"present\\\":[64],\\\"dismiss\\\":[64],\\\"onDidDismiss\\\":[64],\\\"onWillDismiss\\\":[64]},null,{\\\"swipeGesture\\\":[\\\"swipeGestureChanged\\\"],\\\"isOpen\\\":[\\\"onIsOpenChange\\\"],\\\"trigger\\\":[\\\"triggerChanged\\\"]}]]],[\\\"ion-card_5\\\",[[33,\\\"ion-card\\\",{\\\"color\\\":[513],\\\"button\\\":[4],\\\"type\\\":[1],\\\"disabled\\\":[4],\\\"download\\\":[1],\\\"href\\\":[1],\\\"rel\\\":[1],\\\"routerDirection\\\":[1,\\\"router-direction\\\"],\\\"routerAnimation\\\":[16],\\\"target\\\":[1]}],[32,\\\"ion-card-content\\\"],[33,\\\"ion-card-header\\\",{\\\"color\\\":[513],\\\"translucent\\\":[4]}],[33,\\\"ion-card-subtitle\\\",{\\\"color\\\":[513]}],[33,\\\"ion-card-title\\\",{\\\"color\\\":[513]}]]],[\\\"ion-item-option_3\\\",[[33,\\\"ion-item-option\\\",{\\\"color\\\":[513],\\\"disabled\\\":[4],\\\"download\\\":[1],\\\"expandable\\\":[4],\\\"href\\\":[1],\\\"rel\\\":[1],\\\"target\\\":[1],\\\"type\\\":[1]}],[32,\\\"ion-item-options\\\",{\\\"side\\\":[1],\\\"fireSwipeEvent\\\":[64]}],[0,\\\"ion-item-sliding\\\",{\\\"disabled\\\":[4],\\\"state\\\":[32],\\\"getOpenAmount\\\":[64],\\\"getSlidingRatio\\\":[64],\\\"open\\\":[64],\\\"close\\\":[64],\\\"closeOpened\\\":[64]},null,{\\\"disabled\\\":[\\\"disabledChanged\\\"]}]]],[\\\"ion-accordion_2\\\",[[49,\\\"ion-accordion\\\",{\\\"value\\\":[1],\\\"disabled\\\":[4],\\\"readonly\\\":[4],\\\"toggleIcon\\\":[1,\\\"toggle-icon\\\"],\\\"toggleIconSlot\\\":[1,\\\"toggle-icon-slot\\\"],\\\"state\\\":[32],\\\"isNext\\\":[32],\\\"isPrevious\\\":[32]},null,{\\\"value\\\":[\\\"valueChanged\\\"]}],[33,\\\"ion-accordion-group\\\",{\\\"animated\\\":[4],\\\"multiple\\\":[4],\\\"value\\\":[1025],\\\"disabled\\\":[4],\\\"readonly\\\":[4],\\\"expand\\\":[1],\\\"requestAccordionToggle\\\":[64],\\\"getAccordions\\\":[64]},[[0,\\\"keydown\\\",\\\"onKeydown\\\"]],{\\\"value\\\":[\\\"valueChanged\\\"],\\\"disabled\\\":[\\\"disabledChanged\\\"],\\\"readonly\\\":[\\\"readonlyChanged\\\"]}]]],[\\\"ion-infinite-scroll_2\\\",[[32,\\\"ion-infinite-scroll-content\\\",{\\\"loadingSpinner\\\":[1025,\\\"loading-spinner\\\"],\\\"loadingText\\\":[1,\\\"loading-text\\\"]}],[0,\\\"ion-infinite-scroll\\\",{\\\"threshold\\\":[1],\\\"disabled\\\":[4],\\\"position\\\":[1],\\\"isLoading\\\":[32],\\\"complete\\\":[64]},null,{\\\"threshold\\\":[\\\"thresholdChanged\\\"],\\\"disabled\\\":[\\\"disabledChanged\\\"]}]]],[\\\"ion-reorder_2\\\",[[33,\\\"ion-reorder\\\",null,[[2,\\\"click\\\",\\\"onClick\\\"]]],[0,\\\"ion-reorder-group\\\",{\\\"disabled\\\":[4],\\\"state\\\":[32],\\\"complete\\\":[64]},null,{\\\"disabled\\\":[\\\"disabledChanged\\\"]}]]],[\\\"ion-segment_2\\\",[[33,\\\"ion-segment-button\\\",{\\\"disabled\\\":[1028],\\\"layout\\\":[1],\\\"type\\\":[1],\\\"value\\\":[8],\\\"checked\\\":[32],\\\"setFocus\\\":[64]},null,{\\\"value\\\":[\\\"valueChanged\\\"]}],[33,\\\"ion-segment\\\",{\\\"color\\\":[513],\\\"disabled\\\":[4],\\\"scrollable\\\":[4],\\\"swipeGesture\\\":[4,\\\"swipe-gesture\\\"],\\\"value\\\":[1032],\\\"selectOnFocus\\\":[4,\\\"select-on-focus\\\"],\\\"activated\\\":[32]},[[0,\\\"keydown\\\",\\\"onKeyDown\\\"]],{\\\"color\\\":[\\\"colorChanged\\\"],\\\"swipeGesture\\\":[\\\"swipeGestureChanged\\\"],\\\"value\\\":[\\\"valueChanged\\\"],\\\"disabled\\\":[\\\"disabledChanged\\\"]}]]],[\\\"ion-tab-bar_2\\\",[[33,\\\"ion-tab-button\\\",{\\\"disabled\\\":[4],\\\"download\\\":[1],\\\"href\\\":[1],\\\"rel\\\":[1],\\\"layout\\\":[1025],\\\"selected\\\":[1028],\\\"tab\\\":[1],\\\"target\\\":[1]},[[8,\\\"ionTabBarChanged\\\",\\\"onTabBarChanged\\\"]]],[33,\\\"ion-tab-bar\\\",{\\\"color\\\":[513],\\\"selectedTab\\\":[1,\\\"selected-tab\\\"],\\\"translucent\\\":[4],\\\"keyboardVisible\\\":[32]},null,{\\\"selectedTab\\\":[\\\"selectedTabChanged\\\"]}]]],[\\\"ion-chip\\\",[[33,\\\"ion-chip\\\",{\\\"color\\\":[513],\\\"outline\\\":[4],\\\"disabled\\\":[4]}]]],[\\\"ion-datetime-button\\\",[[33,\\\"ion-datetime-button\\\",{\\\"color\\\":[513],\\\"disabled\\\":[516],\\\"datetime\\\":[1],\\\"datetimePresentation\\\":[32],\\\"dateText\\\":[32],\\\"timeText\\\":[32],\\\"datetimeActive\\\":[32],\\\"selectedButton\\\":[32]}]]],[\\\"ion-input\\\",[[38,\\\"ion-input\\\",{\\\"color\\\":[513],\\\"accept\\\":[1],\\\"autocapitalize\\\":[1],\\\"autocomplete\\\":[1],\\\"autocorrect\\\":[1],\\\"autofocus\\\":[4],\\\"clearInput\\\":[4,\\\"clear-input\\\"],\\\"clearOnEdit\\\":[4,\\\"clear-on-edit\\\"],\\\"counter\\\":[4],\\\"counterFormatter\\\":[16],\\\"debounce\\\":[2],\\\"disabled\\\":[4],\\\"enterkeyhint\\\":[1],\\\"errorText\\\":[1,\\\"error-text\\\"],\\\"fill\\\":[1],\\\"inputmode\\\":[1],\\\"helperText\\\":[1,\\\"helper-text\\\"],\\\"label\\\":[1],\\\"labelPlacement\\\":[1,\\\"label-placement\\\"],\\\"legacy\\\":[4],\\\"max\\\":[8],\\\"maxlength\\\":[2],\\\"min\\\":[8],\\\"minlength\\\":[2],\\\"multiple\\\":[4],\\\"name\\\":[1],\\\"pattern\\\":[1],\\\"placeholder\\\":[1],\\\"readonly\\\":[4],\\\"required\\\":[4],\\\"shape\\\":[1],\\\"spellcheck\\\":[4],\\\"step\\\":[1],\\\"size\\\":[2],\\\"type\\\":[1],\\\"value\\\":[1032],\\\"hasFocus\\\":[32],\\\"setFocus\\\":[64],\\\"getInputElement\\\":[64]},null,{\\\"debounce\\\":[\\\"debounceChanged\\\"],\\\"disabled\\\":[\\\"disabledChanged\\\"],\\\"placeholder\\\":[\\\"placeholderChanged\\\"],\\\"value\\\":[\\\"valueChanged\\\"]}]]],[\\\"ion-searchbar\\\",[[34,\\\"ion-searchbar\\\",{\\\"color\\\":[513],\\\"animated\\\":[4],\\\"autocomplete\\\":[1],\\\"autocorrect\\\":[1],\\\"cancelButtonIcon\\\":[1,\\\"cancel-button-icon\\\"],\\\"cancelButtonText\\\":[1,\\\"cancel-button-text\\\"],\\\"clearIcon\\\":[1,\\\"clear-icon\\\"],\\\"debounce\\\":[2],\\\"disabled\\\":[4],\\\"inputmode\\\":[1],\\\"enterkeyhint\\\":[1],\\\"name\\\":[1],\\\"placeholder\\\":[1],\\\"searchIcon\\\":[1,\\\"search-icon\\\"],\\\"showCancelButton\\\":[1,\\\"show-cancel-button\\\"],\\\"showClearButton\\\":[1,\\\"show-clear-button\\\"],\\\"spellcheck\\\":[4],\\\"type\\\":[1],\\\"value\\\":[1025],\\\"focused\\\":[32],\\\"noAnimate\\\":[32],\\\"setFocus\\\":[64],\\\"getInputElement\\\":[64]},null,{\\\"debounce\\\":[\\\"debounceChanged\\\"],\\\"value\\\":[\\\"valueChanged\\\"],\\\"showCancelButton\\\":[\\\"showCancelButtonChanged\\\"]}]]],[\\\"ion-toggle\\\",[[33,\\\"ion-toggle\\\",{\\\"color\\\":[513],\\\"name\\\":[1],\\\"checked\\\":[1028],\\\"disabled\\\":[4],\\\"value\\\":[1],\\\"enableOnOffLabels\\\":[4,\\\"enable-on-off-labels\\\"],\\\"labelPlacement\\\":[1,\\\"label-placement\\\"],\\\"legacy\\\":[4],\\\"justify\\\":[1],\\\"alignment\\\":[1],\\\"activated\\\":[32]},null,{\\\"disabled\\\":[\\\"disabledChanged\\\"]}]]],[\\\"ion-nav_2\\\",[[1,\\\"ion-nav\\\",{\\\"delegate\\\":[16],\\\"swipeGesture\\\":[1028,\\\"swipe-gesture\\\"],\\\"animated\\\":[4],\\\"animation\\\":[16],\\\"rootParams\\\":[16],\\\"root\\\":[1],\\\"push\\\":[64],\\\"insert\\\":[64],\\\"insertPages\\\":[64],\\\"pop\\\":[64],\\\"popTo\\\":[64],\\\"popToRoot\\\":[64],\\\"removeIndex\\\":[64],\\\"setRoot\\\":[64],\\\"setPages\\\":[64],\\\"setRouteId\\\":[64],\\\"getRouteId\\\":[64],\\\"getActive\\\":[64],\\\"getByIndex\\\":[64],\\\"canGoBack\\\":[64],\\\"getPrevious\\\":[64]},null,{\\\"swipeGesture\\\":[\\\"swipeGestureChanged\\\"],\\\"root\\\":[\\\"rootChanged\\\"]}],[0,\\\"ion-nav-link\\\",{\\\"component\\\":[1],\\\"componentProps\\\":[16],\\\"routerDirection\\\":[1,\\\"router-direction\\\"],\\\"routerAnimation\\\":[16]}]]],[\\\"ion-textarea\\\",[[38,\\\"ion-textarea\\\",{\\\"color\\\":[513],\\\"autocapitalize\\\":[1],\\\"autofocus\\\":[4],\\\"clearOnEdit\\\":[4,\\\"clear-on-edit\\\"],\\\"debounce\\\":[2],\\\"disabled\\\":[4],\\\"fill\\\":[1],\\\"inputmode\\\":[1],\\\"enterkeyhint\\\":[1],\\\"maxlength\\\":[2],\\\"minlength\\\":[2],\\\"name\\\":[1],\\\"placeholder\\\":[1],\\\"readonly\\\":[4],\\\"required\\\":[4],\\\"spellcheck\\\":[4],\\\"cols\\\":[514],\\\"rows\\\":[2],\\\"wrap\\\":[1],\\\"autoGrow\\\":[516,\\\"auto-grow\\\"],\\\"value\\\":[1025],\\\"counter\\\":[4],\\\"counterFormatter\\\":[16],\\\"errorText\\\":[1,\\\"error-text\\\"],\\\"helperText\\\":[1,\\\"helper-text\\\"],\\\"label\\\":[1],\\\"labelPlacement\\\":[1,\\\"label-placement\\\"],\\\"legacy\\\":[4],\\\"shape\\\":[1],\\\"hasFocus\\\":[32],\\\"setFocus\\\":[64],\\\"getInputElement\\\":[64]},null,{\\\"debounce\\\":[\\\"debounceChanged\\\"],\\\"disabled\\\":[\\\"disabledChanged\\\"],\\\"value\\\":[\\\"valueChanged\\\"]}]]],[\\\"ion-backdrop\\\",[[33,\\\"ion-backdrop\\\",{\\\"visible\\\":[4],\\\"tappable\\\":[4],\\\"stopPropagation\\\":[4,\\\"stop-propagation\\\"]},[[2,\\\"click\\\",\\\"onMouseDown\\\"]]]]],[\\\"ion-loading\\\",[[34,\\\"ion-loading\\\",{\\\"overlayIndex\\\":[2,\\\"overlay-index\\\"],\\\"delegate\\\":[16],\\\"hasController\\\":[4,\\\"has-controller\\\"],\\\"keyboardClose\\\":[4,\\\"keyboard-close\\\"],\\\"enterAnimation\\\":[16],\\\"leaveAnimation\\\":[16],\\\"message\\\":[1],\\\"cssClass\\\":[1,\\\"css-class\\\"],\\\"duration\\\":[2],\\\"backdropDismiss\\\":[4,\\\"backdrop-dismiss\\\"],\\\"showBackdrop\\\":[4,\\\"show-backdrop\\\"],\\\"spinner\\\":[1025],\\\"translucent\\\":[4],\\\"animated\\\":[4],\\\"htmlAttributes\\\":[16],\\\"isOpen\\\":[4,\\\"is-open\\\"],\\\"trigger\\\":[1],\\\"present\\\":[64],\\\"dismiss\\\":[64],\\\"onDidDismiss\\\":[64],\\\"onWillDismiss\\\":[64]},null,{\\\"isOpen\\\":[\\\"onIsOpenChange\\\"],\\\"trigger\\\":[\\\"triggerChanged\\\"]}]]],[\\\"ion-breadcrumb_2\\\",[[33,\\\"ion-breadcrumb\\\",{\\\"collapsed\\\":[4],\\\"last\\\":[4],\\\"showCollapsedIndicator\\\":[4,\\\"show-collapsed-indicator\\\"],\\\"color\\\":[1],\\\"active\\\":[4],\\\"disabled\\\":[4],\\\"download\\\":[1],\\\"href\\\":[1],\\\"rel\\\":[1],\\\"separator\\\":[4],\\\"target\\\":[1],\\\"routerDirection\\\":[1,\\\"router-direction\\\"],\\\"routerAnimation\\\":[16]}],[33,\\\"ion-breadcrumbs\\\",{\\\"color\\\":[513],\\\"maxItems\\\":[2,\\\"max-items\\\"],\\\"itemsBeforeCollapse\\\":[2,\\\"items-before-collapse\\\"],\\\"itemsAfterCollapse\\\":[2,\\\"items-after-collapse\\\"],\\\"collapsed\\\":[32],\\\"activeChanged\\\":[32]},[[0,\\\"collapsedClick\\\",\\\"onCollapsedClick\\\"]],{\\\"maxItems\\\":[\\\"maxItemsChanged\\\"],\\\"itemsBeforeCollapse\\\":[\\\"maxItemsChanged\\\"],\\\"itemsAfterCollapse\\\":[\\\"maxItemsChanged\\\"]}]]],[\\\"ion-modal\\\",[[33,\\\"ion-modal\\\",{\\\"hasController\\\":[4,\\\"has-controller\\\"],\\\"overlayIndex\\\":[2,\\\"overlay-index\\\"],\\\"delegate\\\":[16],\\\"keyboardClose\\\":[4,\\\"keyboard-close\\\"],\\\"enterAnimation\\\":[16],\\\"leaveAnimation\\\":[16],\\\"breakpoints\\\":[16],\\\"initialBreakpoint\\\":[2,\\\"initial-breakpoint\\\"],\\\"backdropBreakpoint\\\":[2,\\\"backdrop-breakpoint\\\"],\\\"handle\\\":[4],\\\"handleBehavior\\\":[1,\\\"handle-behavior\\\"],\\\"component\\\":[1],\\\"componentProps\\\":[16],\\\"cssClass\\\":[1,\\\"css-class\\\"],\\\"backdropDismiss\\\":[4,\\\"backdrop-dismiss\\\"],\\\"showBackdrop\\\":[4,\\\"show-backdrop\\\"],\\\"animated\\\":[4],\\\"presentingElement\\\":[16],\\\"htmlAttributes\\\":[16],\\\"isOpen\\\":[4,\\\"is-open\\\"],\\\"trigger\\\":[1],\\\"keepContentsMounted\\\":[4,\\\"keep-contents-mounted\\\"],\\\"canDismiss\\\":[4,\\\"can-dismiss\\\"],\\\"presented\\\":[32],\\\"present\\\":[64],\\\"dismiss\\\":[64],\\\"onDidDismiss\\\":[64],\\\"onWillDismiss\\\":[64],\\\"setCurrentBreakpoint\\\":[64],\\\"getCurrentBreakpoint\\\":[64]},null,{\\\"isOpen\\\":[\\\"onIsOpenChange\\\"],\\\"trigger\\\":[\\\"triggerChanged\\\"]}]]],[\\\"ion-route_4\\\",[[0,\\\"ion-route\\\",{\\\"url\\\":[1],\\\"component\\\":[1],\\\"componentProps\\\":[16],\\\"beforeLeave\\\":[16],\\\"beforeEnter\\\":[16]},null,{\\\"url\\\":[\\\"onUpdate\\\"],\\\"component\\\":[\\\"onUpdate\\\"],\\\"componentProps\\\":[\\\"onComponentProps\\\"]}],[0,\\\"ion-route-redirect\\\",{\\\"from\\\":[1],\\\"to\\\":[1]},null,{\\\"from\\\":[\\\"propDidChange\\\"],\\\"to\\\":[\\\"propDidChange\\\"]}],[0,\\\"ion-router\\\",{\\\"root\\\":[1],\\\"useHash\\\":[4,\\\"use-hash\\\"],\\\"canTransition\\\":[64],\\\"push\\\":[64],\\\"back\\\":[64],\\\"printDebug\\\":[64],\\\"navChanged\\\":[64]},[[8,\\\"popstate\\\",\\\"onPopState\\\"],[4,\\\"ionBackButton\\\",\\\"onBackButton\\\"]]],[1,\\\"ion-router-link\\\",{\\\"color\\\":[513],\\\"href\\\":[1],\\\"rel\\\":[1],\\\"routerDirection\\\":[1,\\\"router-direction\\\"],\\\"routerAnimation\\\":[16],\\\"target\\\":[1]}]]],[\\\"ion-avatar_3\\\",[[33,\\\"ion-avatar\\\"],[33,\\\"ion-badge\\\",{\\\"color\\\":[513]}],[1,\\\"ion-thumbnail\\\"]]],[\\\"ion-col_3\\\",[[1,\\\"ion-col\\\",{\\\"offset\\\":[1],\\\"offsetXs\\\":[1,\\\"offset-xs\\\"],\\\"offsetSm\\\":[1,\\\"offset-sm\\\"],\\\"offsetMd\\\":[1,\\\"offset-md\\\"],\\\"offsetLg\\\":[1,\\\"offset-lg\\\"],\\\"offsetXl\\\":[1,\\\"offset-xl\\\"],\\\"pull\\\":[1],\\\"pullXs\\\":[1,\\\"pull-xs\\\"],\\\"pullSm\\\":[1,\\\"pull-sm\\\"],\\\"pullMd\\\":[1,\\\"pull-md\\\"],\\\"pullLg\\\":[1,\\\"pull-lg\\\"],\\\"pullXl\\\":[1,\\\"pull-xl\\\"],\\\"push\\\":[1],\\\"pushXs\\\":[1,\\\"push-xs\\\"],\\\"pushSm\\\":[1,\\\"push-sm\\\"],\\\"pushMd\\\":[1,\\\"push-md\\\"],\\\"pushLg\\\":[1,\\\"push-lg\\\"],\\\"pushXl\\\":[1,\\\"push-xl\\\"],\\\"size\\\":[1],\\\"sizeXs\\\":[1,\\\"size-xs\\\"],\\\"sizeSm\\\":[1,\\\"size-sm\\\"],\\\"sizeMd\\\":[1,\\\"size-md\\\"],\\\"sizeLg\\\":[1,\\\"size-lg\\\"],\\\"sizeXl\\\":[1,\\\"size-xl\\\"]},[[9,\\\"resize\\\",\\\"onResize\\\"]]],[1,\\\"ion-grid\\\",{\\\"fixed\\\":[4]}],[1,\\\"ion-row\\\"]]],[\\\"ion-tab_2\\\",[[1,\\\"ion-tab\\\",{\\\"active\\\":[1028],\\\"delegate\\\":[16],\\\"tab\\\":[1],\\\"component\\\":[1],\\\"setActive\\\":[64]},null,{\\\"active\\\":[\\\"changeActive\\\"]}],[1,\\\"ion-tabs\\\",{\\\"useRouter\\\":[1028,\\\"use-router\\\"],\\\"selectedTab\\\":[32],\\\"select\\\":[64],\\\"getTab\\\":[64],\\\"getSelected\\\":[64],\\\"setRouteId\\\":[64],\\\"getRouteId\\\":[64]}]]],[\\\"ion-img\\\",[[1,\\\"ion-img\\\",{\\\"alt\\\":[1],\\\"src\\\":[1],\\\"loadSrc\\\":[32],\\\"loadError\\\":[32]},null,{\\\"src\\\":[\\\"srcChanged\\\"]}]]],[\\\"ion-progress-bar\\\",[[33,\\\"ion-progress-bar\\\",{\\\"type\\\":[1],\\\"reversed\\\":[4],\\\"value\\\":[2],\\\"buffer\\\":[2],\\\"color\\\":[513]}]]],[\\\"ion-range\\\",[[33,\\\"ion-range\\\",{\\\"color\\\":[513],\\\"debounce\\\":[2],\\\"name\\\":[1],\\\"label\\\":[1],\\\"dualKnobs\\\":[4,\\\"dual-knobs\\\"],\\\"min\\\":[2],\\\"max\\\":[2],\\\"pin\\\":[4],\\\"pinFormatter\\\":[16],\\\"snaps\\\":[4],\\\"step\\\":[2],\\\"ticks\\\":[4],\\\"activeBarStart\\\":[1026,\\\"active-bar-start\\\"],\\\"disabled\\\":[4],\\\"value\\\":[1026],\\\"labelPlacement\\\":[1,\\\"label-placement\\\"],\\\"legacy\\\":[4],\\\"ratioA\\\":[32],\\\"ratioB\\\":[32],\\\"pressedKnob\\\":[32]},null,{\\\"debounce\\\":[\\\"debounceChanged\\\"],\\\"min\\\":[\\\"minChanged\\\"],\\\"max\\\":[\\\"maxChanged\\\"],\\\"activeBarStart\\\":[\\\"activeBarStartChanged\\\"],\\\"disabled\\\":[\\\"disabledChanged\\\"],\\\"value\\\":[\\\"valueChanged\\\"]}]]],[\\\"ion-split-pane\\\",[[33,\\\"ion-split-pane\\\",{\\\"contentId\\\":[513,\\\"content-id\\\"],\\\"disabled\\\":[4],\\\"when\\\":[8],\\\"visible\\\":[32]},null,{\\\"visible\\\":[\\\"visibleChanged\\\"],\\\"disabled\\\":[\\\"updateState\\\"],\\\"when\\\":[\\\"updateState\\\"]}]]],[\\\"ion-text\\\",[[1,\\\"ion-text\\\",{\\\"color\\\":[513]}]]],[\\\"ion-item_8\\\",[[33,\\\"ion-item-divider\\\",{\\\"color\\\":[513],\\\"sticky\\\":[4]}],[32,\\\"ion-item-group\\\"],[1,\\\"ion-skeleton-text\\\",{\\\"animated\\\":[4]}],[32,\\\"ion-list\\\",{\\\"lines\\\":[1],\\\"inset\\\":[4],\\\"closeSlidingItems\\\":[64]}],[33,\\\"ion-list-header\\\",{\\\"color\\\":[513],\\\"lines\\\":[1]}],[49,\\\"ion-item\\\",{\\\"color\\\":[513],\\\"button\\\":[4],\\\"detail\\\":[4],\\\"detailIcon\\\":[1,\\\"detail-icon\\\"],\\\"disabled\\\":[4],\\\"download\\\":[1],\\\"fill\\\":[1],\\\"shape\\\":[1],\\\"href\\\":[1],\\\"rel\\\":[1],\\\"lines\\\":[1],\\\"counter\\\":[4],\\\"routerAnimation\\\":[16],\\\"routerDirection\\\":[1,\\\"router-direction\\\"],\\\"target\\\":[1],\\\"type\\\":[1],\\\"counterFormatter\\\":[16],\\\"multipleInputs\\\":[32],\\\"focusable\\\":[32],\\\"counterString\\\":[32]},[[0,\\\"ionInput\\\",\\\"handleIonInput\\\"],[0,\\\"ionColor\\\",\\\"labelColorChanged\\\"],[0,\\\"ionStyle\\\",\\\"itemStyle\\\"]],{\\\"counterFormatter\\\":[\\\"counterFormatterChanged\\\"]}],[34,\\\"ion-label\\\",{\\\"color\\\":[513],\\\"position\\\":[1],\\\"noAnimate\\\":[32]},null,{\\\"color\\\":[\\\"colorChanged\\\"],\\\"position\\\":[\\\"positionChanged\\\"]}],[33,\\\"ion-note\\\",{\\\"color\\\":[513]}]]],[\\\"ion-select_3\\\",[[33,\\\"ion-select\\\",{\\\"cancelText\\\":[1,\\\"cancel-text\\\"],\\\"color\\\":[513],\\\"compareWith\\\":[1,\\\"compare-with\\\"],\\\"disabled\\\":[4],\\\"fill\\\":[1],\\\"interface\\\":[1],\\\"interfaceOptions\\\":[8,\\\"interface-options\\\"],\\\"justify\\\":[1],\\\"label\\\":[1],\\\"labelPlacement\\\":[1,\\\"label-placement\\\"],\\\"legacy\\\":[4],\\\"multiple\\\":[4],\\\"name\\\":[1],\\\"okText\\\":[1,\\\"ok-text\\\"],\\\"placeholder\\\":[1],\\\"selectedText\\\":[1,\\\"selected-text\\\"],\\\"toggleIcon\\\":[1,\\\"toggle-icon\\\"],\\\"expandedIcon\\\":[1,\\\"expanded-icon\\\"],\\\"shape\\\":[1],\\\"value\\\":[1032],\\\"isExpanded\\\":[32],\\\"open\\\":[64]},null,{\\\"disabled\\\":[\\\"styleChanged\\\"],\\\"isExpanded\\\":[\\\"styleChanged\\\"],\\\"placeholder\\\":[\\\"styleChanged\\\"],\\\"value\\\":[\\\"styleChanged\\\"]}],[1,\\\"ion-select-option\\\",{\\\"disabled\\\":[4],\\\"value\\\":[8]}],[34,\\\"ion-select-popover\\\",{\\\"header\\\":[1],\\\"subHeader\\\":[1,\\\"sub-header\\\"],\\\"message\\\":[1],\\\"multiple\\\":[4],\\\"options\\\":[16]}]]],[\\\"ion-picker-internal\\\",[[33,\\\"ion-picker-internal\\\",{\\\"exitInputMode\\\":[64]},[[1,\\\"touchstart\\\",\\\"preventTouchStartPropagation\\\"]]]]],[\\\"ion-datetime_3\\\",[[33,\\\"ion-datetime\\\",{\\\"color\\\":[1],\\\"name\\\":[1],\\\"disabled\\\":[4],\\\"readonly\\\":[4],\\\"isDateEnabled\\\":[16],\\\"min\\\":[1025],\\\"max\\\":[1025],\\\"presentation\\\":[1],\\\"cancelText\\\":[1,\\\"cancel-text\\\"],\\\"doneText\\\":[1,\\\"done-text\\\"],\\\"clearText\\\":[1,\\\"clear-text\\\"],\\\"yearValues\\\":[8,\\\"year-values\\\"],\\\"monthValues\\\":[8,\\\"month-values\\\"],\\\"dayValues\\\":[8,\\\"day-values\\\"],\\\"hourValues\\\":[8,\\\"hour-values\\\"],\\\"minuteValues\\\":[8,\\\"minute-values\\\"],\\\"locale\\\":[1],\\\"firstDayOfWeek\\\":[2,\\\"first-day-of-week\\\"],\\\"titleSelectedDatesFormatter\\\":[16],\\\"multiple\\\":[4],\\\"highlightedDates\\\":[16],\\\"value\\\":[1025],\\\"showDefaultTitle\\\":[4,\\\"show-default-title\\\"],\\\"showDefaultButtons\\\":[4,\\\"show-default-buttons\\\"],\\\"showClearButton\\\":[4,\\\"show-clear-button\\\"],\\\"showDefaultTimeLabel\\\":[4,\\\"show-default-time-label\\\"],\\\"hourCycle\\\":[1,\\\"hour-cycle\\\"],\\\"size\\\":[1],\\\"preferWheel\\\":[4,\\\"prefer-wheel\\\"],\\\"showMonthAndYear\\\":[32],\\\"activeParts\\\":[32],\\\"workingParts\\\":[32],\\\"isTimePopoverOpen\\\":[32],\\\"forceRenderDate\\\":[32],\\\"confirm\\\":[64],\\\"reset\\\":[64],\\\"cancel\\\":[64]},null,{\\\"disabled\\\":[\\\"disabledChanged\\\"],\\\"min\\\":[\\\"minChanged\\\"],\\\"max\\\":[\\\"maxChanged\\\"],\\\"yearValues\\\":[\\\"yearValuesChanged\\\"],\\\"monthValues\\\":[\\\"monthValuesChanged\\\"],\\\"dayValues\\\":[\\\"dayValuesChanged\\\"],\\\"hourValues\\\":[\\\"hourValuesChanged\\\"],\\\"minuteValues\\\":[\\\"minuteValuesChanged\\\"],\\\"value\\\":[\\\"valueChanged\\\"]}],[34,\\\"ion-picker\\\",{\\\"overlayIndex\\\":[2,\\\"overlay-index\\\"],\\\"delegate\\\":[16],\\\"hasController\\\":[4,\\\"has-controller\\\"],\\\"keyboardClose\\\":[4,\\\"keyboard-close\\\"],\\\"enterAnimation\\\":[16],\\\"leaveAnimation\\\":[16],\\\"buttons\\\":[16],\\\"columns\\\":[16],\\\"cssClass\\\":[1,\\\"css-class\\\"],\\\"duration\\\":[2],\\\"showBackdrop\\\":[4,\\\"show-backdrop\\\"],\\\"backdropDismiss\\\":[4,\\\"backdrop-dismiss\\\"],\\\"animated\\\":[4],\\\"htmlAttributes\\\":[16],\\\"isOpen\\\":[4,\\\"is-open\\\"],\\\"trigger\\\":[1],\\\"presented\\\":[32],\\\"present\\\":[64],\\\"dismiss\\\":[64],\\\"onDidDismiss\\\":[64],\\\"onWillDismiss\\\":[64],\\\"getColumn\\\":[64]},null,{\\\"isOpen\\\":[\\\"onIsOpenChange\\\"],\\\"trigger\\\":[\\\"triggerChanged\\\"]}],[32,\\\"ion-picker-column\\\",{\\\"col\\\":[16]},null,{\\\"col\\\":[\\\"colChanged\\\"]}]]],[\\\"ion-radio_2\\\",[[33,\\\"ion-radio\\\",{\\\"color\\\":[513],\\\"name\\\":[1],\\\"disabled\\\":[4],\\\"value\\\":[8],\\\"labelPlacement\\\":[1,\\\"label-placement\\\"],\\\"legacy\\\":[4],\\\"justify\\\":[1],\\\"alignment\\\":[1],\\\"checked\\\":[32],\\\"buttonTabindex\\\":[32],\\\"setFocus\\\":[64],\\\"setButtonTabindex\\\":[64]},null,{\\\"value\\\":[\\\"valueChanged\\\"],\\\"checked\\\":[\\\"styleChanged\\\"],\\\"color\\\":[\\\"styleChanged\\\"],\\\"disabled\\\":[\\\"styleChanged\\\"]}],[0,\\\"ion-radio-group\\\",{\\\"allowEmptySelection\\\":[4,\\\"allow-empty-selection\\\"],\\\"compareWith\\\":[1,\\\"compare-with\\\"],\\\"name\\\":[1],\\\"value\\\":[1032]},[[4,\\\"keydown\\\",\\\"onKeydown\\\"]],{\\\"value\\\":[\\\"valueChanged\\\"]}]]],[\\\"ion-ripple-effect\\\",[[1,\\\"ion-ripple-effect\\\",{\\\"type\\\":[1],\\\"addRipple\\\":[64]}]]],[\\\"ion-button_2\\\",[[33,\\\"ion-button\\\",{\\\"color\\\":[513],\\\"buttonType\\\":[1025,\\\"button-type\\\"],\\\"disabled\\\":[516],\\\"expand\\\":[513],\\\"fill\\\":[1537],\\\"routerDirection\\\":[1,\\\"router-direction\\\"],\\\"routerAnimation\\\":[16],\\\"download\\\":[1],\\\"href\\\":[1],\\\"rel\\\":[1],\\\"shape\\\":[513],\\\"size\\\":[513],\\\"strong\\\":[4],\\\"target\\\":[1],\\\"type\\\":[1],\\\"form\\\":[1]},null,{\\\"disabled\\\":[\\\"disabledChanged\\\"]}],[1,\\\"ion-icon\\\",{\\\"mode\\\":[1025],\\\"color\\\":[1],\\\"ios\\\":[1],\\\"md\\\":[1],\\\"flipRtl\\\":[4,\\\"flip-rtl\\\"],\\\"name\\\":[513],\\\"src\\\":[1],\\\"icon\\\":[8],\\\"size\\\":[1],\\\"lazy\\\":[4],\\\"sanitize\\\":[4],\\\"svgContent\\\":[32],\\\"isVisible\\\":[32]},null,{\\\"name\\\":[\\\"loadIcon\\\"],\\\"src\\\":[\\\"loadIcon\\\"],\\\"icon\\\":[\\\"loadIcon\\\"],\\\"ios\\\":[\\\"loadIcon\\\"],\\\"md\\\":[\\\"loadIcon\\\"]}]]],[\\\"ion-action-sheet\\\",[[34,\\\"ion-action-sheet\\\",{\\\"overlayIndex\\\":[2,\\\"overlay-index\\\"],\\\"delegate\\\":[16],\\\"hasController\\\":[4,\\\"has-controller\\\"],\\\"keyboardClose\\\":[4,\\\"keyboard-close\\\"],\\\"enterAnimation\\\":[16],\\\"leaveAnimation\\\":[16],\\\"buttons\\\":[16],\\\"cssClass\\\":[1,\\\"css-class\\\"],\\\"backdropDismiss\\\":[4,\\\"backdrop-dismiss\\\"],\\\"header\\\":[1],\\\"subHeader\\\":[1,\\\"sub-header\\\"],\\\"translucent\\\":[4],\\\"animated\\\":[4],\\\"htmlAttributes\\\":[16],\\\"isOpen\\\":[4,\\\"is-open\\\"],\\\"trigger\\\":[1],\\\"present\\\":[64],\\\"dismiss\\\":[64],\\\"onDidDismiss\\\":[64],\\\"onWillDismiss\\\":[64]},null,{\\\"isOpen\\\":[\\\"onIsOpenChange\\\"],\\\"trigger\\\":[\\\"triggerChanged\\\"]}]]],[\\\"ion-alert\\\",[[34,\\\"ion-alert\\\",{\\\"overlayIndex\\\":[2,\\\"overlay-index\\\"],\\\"delegate\\\":[16],\\\"hasController\\\":[4,\\\"has-controller\\\"],\\\"keyboardClose\\\":[4,\\\"keyboard-close\\\"],\\\"enterAnimation\\\":[16],\\\"leaveAnimation\\\":[16],\\\"cssClass\\\":[1,\\\"css-class\\\"],\\\"header\\\":[1],\\\"subHeader\\\":[1,\\\"sub-header\\\"],\\\"message\\\":[1],\\\"buttons\\\":[16],\\\"inputs\\\":[1040],\\\"backdropDismiss\\\":[4,\\\"backdrop-dismiss\\\"],\\\"translucent\\\":[4],\\\"animated\\\":[4],\\\"htmlAttributes\\\":[16],\\\"isOpen\\\":[4,\\\"is-open\\\"],\\\"trigger\\\":[1],\\\"present\\\":[64],\\\"dismiss\\\":[64],\\\"onDidDismiss\\\":[64],\\\"onWillDismiss\\\":[64]},[[4,\\\"keydown\\\",\\\"onKeydown\\\"]],{\\\"isOpen\\\":[\\\"onIsOpenChange\\\"],\\\"trigger\\\":[\\\"triggerChanged\\\"],\\\"buttons\\\":[\\\"buttonsChanged\\\"],\\\"inputs\\\":[\\\"inputsChanged\\\"]}]]],[\\\"ion-app_8\\\",[[0,\\\"ion-app\\\",{\\\"setFocus\\\":[64]}],[1,\\\"ion-content\\\",{\\\"color\\\":[513],\\\"fullscreen\\\":[4],\\\"forceOverscroll\\\":[1028,\\\"force-overscroll\\\"],\\\"scrollX\\\":[4,\\\"scroll-x\\\"],\\\"scrollY\\\":[4,\\\"scroll-y\\\"],\\\"scrollEvents\\\":[4,\\\"scroll-events\\\"],\\\"getScrollElement\\\":[64],\\\"getBackgroundElement\\\":[64],\\\"scrollToTop\\\":[64],\\\"scrollToBottom\\\":[64],\\\"scrollByPoint\\\":[64],\\\"scrollToPoint\\\":[64]},[[9,\\\"resize\\\",\\\"onResize\\\"]]],[36,\\\"ion-footer\\\",{\\\"collapse\\\":[1],\\\"translucent\\\":[4],\\\"keyboardVisible\\\":[32]}],[36,\\\"ion-header\\\",{\\\"collapse\\\":[1],\\\"translucent\\\":[4]}],[1,\\\"ion-router-outlet\\\",{\\\"mode\\\":[1025],\\\"delegate\\\":[16],\\\"animated\\\":[4],\\\"animation\\\":[16],\\\"swipeHandler\\\":[16],\\\"commit\\\":[64],\\\"setRouteId\\\":[64],\\\"getRouteId\\\":[64]},null,{\\\"swipeHandler\\\":[\\\"swipeHandlerChanged\\\"]}],[33,\\\"ion-title\\\",{\\\"color\\\":[513],\\\"size\\\":[1]},null,{\\\"size\\\":[\\\"sizeChanged\\\"]}],[33,\\\"ion-toolbar\\\",{\\\"color\\\":[513]},[[0,\\\"ionStyle\\\",\\\"childrenStyle\\\"]]],[34,\\\"ion-buttons\\\",{\\\"collapse\\\":[4]}]]],[\\\"ion-picker-column-internal\\\",[[33,\\\"ion-picker-column-internal\\\",{\\\"disabled\\\":[4],\\\"items\\\":[16],\\\"value\\\":[1032],\\\"color\\\":[513],\\\"numericInput\\\":[4,\\\"numeric-input\\\"],\\\"isActive\\\":[32],\\\"scrollActiveItemIntoView\\\":[64],\\\"setValue\\\":[64]},null,{\\\"value\\\":[\\\"valueChange\\\"]}]]],[\\\"ion-popover\\\",[[33,\\\"ion-popover\\\",{\\\"hasController\\\":[4,\\\"has-controller\\\"],\\\"delegate\\\":[16],\\\"overlayIndex\\\":[2,\\\"overlay-index\\\"],\\\"enterAnimation\\\":[16],\\\"leaveAnimation\\\":[16],\\\"component\\\":[1],\\\"componentProps\\\":[16],\\\"keyboardClose\\\":[4,\\\"keyboard-close\\\"],\\\"cssClass\\\":[1,\\\"css-class\\\"],\\\"backdropDismiss\\\":[4,\\\"backdrop-dismiss\\\"],\\\"event\\\":[8],\\\"showBackdrop\\\":[4,\\\"show-backdrop\\\"],\\\"translucent\\\":[4],\\\"animated\\\":[4],\\\"htmlAttributes\\\":[16],\\\"triggerAction\\\":[1,\\\"trigger-action\\\"],\\\"trigger\\\":[1],\\\"size\\\":[1],\\\"dismissOnSelect\\\":[4,\\\"dismiss-on-select\\\"],\\\"reference\\\":[1],\\\"side\\\":[1],\\\"alignment\\\":[1025],\\\"arrow\\\":[4],\\\"isOpen\\\":[4,\\\"is-open\\\"],\\\"keyboardEvents\\\":[4,\\\"keyboard-events\\\"],\\\"keepContentsMounted\\\":[4,\\\"keep-contents-mounted\\\"],\\\"presented\\\":[32],\\\"presentFromTrigger\\\":[64],\\\"present\\\":[64],\\\"dismiss\\\":[64],\\\"getParentPopover\\\":[64],\\\"onDidDismiss\\\":[64],\\\"onWillDismiss\\\":[64]},null,{\\\"trigger\\\":[\\\"onTriggerChange\\\"],\\\"triggerAction\\\":[\\\"onTriggerChange\\\"],\\\"isOpen\\\":[\\\"onIsOpenChange\\\"]}]]],[\\\"ion-checkbox\\\",[[33,\\\"ion-checkbox\\\",{\\\"color\\\":[513],\\\"name\\\":[1],\\\"checked\\\":[1028],\\\"indeterminate\\\":[1028],\\\"disabled\\\":[4],\\\"value\\\":[8],\\\"labelPlacement\\\":[1,\\\"label-placement\\\"],\\\"justify\\\":[1],\\\"alignment\\\":[1],\\\"legacy\\\":[4]},null,{\\\"checked\\\":[\\\"styleChanged\\\"],\\\"disabled\\\":[\\\"styleChanged\\\"]}]]],[\\\"ion-spinner\\\",[[1,\\\"ion-spinner\\\",{\\\"color\\\":[513],\\\"duration\\\":[2],\\\"name\\\":[1],\\\"paused\\\":[4]}]]]]\"), options);\n};\n\nexport { defineCustomElements };\n","/*!\n * (C) Ionic http://ionicframework.com - MIT License\n */\nimport { c as createAnimation } from './animation-dde8cc0d.js';\nimport { g as getIonPageElement } from './index-89cbcdab.js';\nimport './index-a5d50daf.js';\nimport './helpers-ae653409.js';\nimport './index-db215ebe.js';\n\nconst mdTransitionAnimation = (_, opts) => {\n var _a, _b, _c;\n const OFF_BOTTOM = '40px';\n const CENTER = '0px';\n const backDirection = opts.direction === 'back';\n const enteringEl = opts.enteringEl;\n const leavingEl = opts.leavingEl;\n const ionPageElement = getIonPageElement(enteringEl);\n const enteringToolbarEle = ionPageElement.querySelector('ion-toolbar');\n const rootTransition = createAnimation();\n rootTransition.addElement(ionPageElement).fill('both').beforeRemoveClass('ion-page-invisible');\n // animate the component itself\n if (backDirection) {\n rootTransition.duration(((_a = opts.duration) !== null && _a !== void 0 ? _a : 0) || 200).easing('cubic-bezier(0.47,0,0.745,0.715)');\n }\n else {\n rootTransition\n .duration(((_b = opts.duration) !== null && _b !== void 0 ? _b : 0) || 280)\n .easing('cubic-bezier(0.36,0.66,0.04,1)')\n .fromTo('transform', `translateY(${OFF_BOTTOM})`, `translateY(${CENTER})`)\n .fromTo('opacity', 0.01, 1);\n }\n // Animate toolbar if it's there\n if (enteringToolbarEle) {\n const enteringToolBar = createAnimation();\n enteringToolBar.addElement(enteringToolbarEle);\n rootTransition.addAnimation(enteringToolBar);\n }\n // setup leaving view\n if (leavingEl && backDirection) {\n // leaving content\n rootTransition.duration(((_c = opts.duration) !== null && _c !== void 0 ? _c : 0) || 200).easing('cubic-bezier(0.47,0,0.745,0.715)');\n const leavingPage = createAnimation();\n leavingPage\n .addElement(getIonPageElement(leavingEl))\n .onFinish((currentStep) => {\n if (currentStep === 1 && leavingPage.elements.length > 0) {\n leavingPage.elements[0].style.setProperty('display', 'none');\n }\n })\n .fromTo('transform', `translateY(${CENTER})`, `translateY(${OFF_BOTTOM})`)\n .fromTo('opacity', 1, 0);\n rootTransition.addAnimation(leavingPage);\n }\n return rootTransition;\n};\n\nexport { mdTransitionAnimation };\n","/*!\n * (C) Ionic http://ionicframework.com - MIT License\n */\nimport { d as doc } from './index-a5d50daf.js';\nimport { b as getIonMode, c as config } from './ionic-global-fb3f9f73.js';\nimport { C as CoreDelegate } from './framework-delegate-bc1fd82a.js';\nimport { OVERLAY_BACK_BUTTON_PRIORITY } from './hardware-back-button-b2bc76db.js';\nimport { c as componentOnReady, f as focusElement, a as addEventListener, b as removeEventListener, g as getElementRoot } from './helpers-ae653409.js';\nimport { p as printIonWarning } from './index-9b0d46f4.js';\n\nlet lastOverlayIndex = 0;\nlet lastId = 0;\nconst activeAnimations = new WeakMap();\nconst createController = (tagName) => {\n return {\n create(options) {\n return createOverlay(tagName, options);\n },\n dismiss(data, role, id) {\n return dismissOverlay(document, data, role, tagName, id);\n },\n async getTop() {\n return getPresentedOverlay(document, tagName);\n },\n };\n};\nconst alertController = /*@__PURE__*/ createController('ion-alert');\nconst actionSheetController = /*@__PURE__*/ createController('ion-action-sheet');\nconst loadingController = /*@__PURE__*/ createController('ion-loading');\nconst modalController = /*@__PURE__*/ createController('ion-modal');\nconst pickerController = /*@__PURE__*/ createController('ion-picker');\nconst popoverController = /*@__PURE__*/ createController('ion-popover');\nconst toastController = /*@__PURE__*/ createController('ion-toast');\n/**\n * Prepares the overlay element to be presented.\n */\nconst prepareOverlay = (el) => {\n if (typeof document !== 'undefined') {\n /**\n * Adds a single instance of event listeners for application behaviors:\n *\n * - Escape Key behavior to dismiss an overlay\n * - Trapping focus within an overlay\n * - Back button behavior to dismiss an overlay\n *\n * This only occurs when the first overlay is created.\n */\n connectListeners(document);\n }\n const overlayIndex = lastOverlayIndex++;\n /**\n * overlayIndex is used in the overlay components to set a zIndex.\n * This ensures that the most recently presented overlay will be\n * on top.\n */\n el.overlayIndex = overlayIndex;\n};\n/**\n * Assigns an incrementing id to an overlay element, that does not\n * already have an id assigned to it.\n *\n * Used to track unique instances of an overlay element.\n */\nconst setOverlayId = (el) => {\n if (!el.hasAttribute('id')) {\n el.id = `ion-overlay-${++lastId}`;\n }\n return el.id;\n};\nconst createOverlay = (tagName, opts) => {\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\n if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined') {\n return window.customElements.whenDefined(tagName).then(() => {\n const element = document.createElement(tagName);\n element.classList.add('overlay-hidden');\n /**\n * Convert the passed in overlay options into props\n * that get passed down into the new overlay.\n */\n Object.assign(element, Object.assign(Object.assign({}, opts), { hasController: true }));\n // append the overlay element to the document body\n getAppRoot(document).appendChild(element);\n return new Promise((resolve) => componentOnReady(element, resolve));\n });\n }\n return Promise.resolve();\n};\n/**\n * This query string selects elements that\n * are eligible to receive focus. We select\n * interactive elements that meet the following\n * criteria:\n * 1. Element does not have a negative tabindex\n * 2. Element does not have `hidden`\n * 3. Element does not have `disabled` for non-Ionic components.\n * 4. Element does not have `disabled` or `disabled=\"true\"` for Ionic components.\n * Note: We need this distinction because `disabled=\"false\"` is\n * valid usage for the disabled property on ion-button.\n */\nconst focusableQueryString = '[tabindex]:not([tabindex^=\"-\"]):not([hidden]):not([disabled]), input:not([type=hidden]):not([tabindex^=\"-\"]):not([hidden]):not([disabled]), textarea:not([tabindex^=\"-\"]):not([hidden]):not([disabled]), button:not([tabindex^=\"-\"]):not([hidden]):not([disabled]), select:not([tabindex^=\"-\"]):not([hidden]):not([disabled]), .ion-focusable:not([tabindex^=\"-\"]):not([hidden]):not([disabled]), .ion-focusable[disabled=\"false\"]:not([tabindex^=\"-\"]):not([hidden])';\nconst focusFirstDescendant = (ref, overlay) => {\n let firstInput = ref.querySelector(focusableQueryString);\n const shadowRoot = firstInput === null || firstInput === void 0 ? void 0 : firstInput.shadowRoot;\n if (shadowRoot) {\n // If there are no inner focusable elements, just focus the host element.\n firstInput = shadowRoot.querySelector(focusableQueryString) || firstInput;\n }\n if (firstInput) {\n focusElement(firstInput);\n }\n else {\n // Focus overlay instead of letting focus escape\n overlay.focus();\n }\n};\nconst isOverlayHidden = (overlay) => overlay.classList.contains('overlay-hidden');\nconst focusLastDescendant = (ref, overlay) => {\n const inputs = Array.from(ref.querySelectorAll(focusableQueryString));\n let lastInput = inputs.length > 0 ? inputs[inputs.length - 1] : null;\n const shadowRoot = lastInput === null || lastInput === void 0 ? void 0 : lastInput.shadowRoot;\n if (shadowRoot) {\n // If there are no inner focusable elements, just focus the host element.\n lastInput = shadowRoot.querySelector(focusableQueryString) || lastInput;\n }\n if (lastInput) {\n lastInput.focus();\n }\n else {\n // Focus overlay instead of letting focus escape\n overlay.focus();\n }\n};\n/**\n * Traps keyboard focus inside of overlay components.\n * Based on https://w3c.github.io/aria-practices/examples/dialog-modal/alertdialog.html\n * This includes the following components: Action Sheet, Alert, Loading, Modal,\n * Picker, and Popover.\n * Should NOT include: Toast\n */\nconst trapKeyboardFocus = (ev, doc) => {\n const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker,ion-popover');\n const target = ev.target;\n /**\n * If no active overlay, ignore this event.\n *\n * If this component uses the shadow dom,\n * this global listener is pointless\n * since it will not catch the focus\n * traps as they are inside the shadow root.\n * We need to add a listener to the shadow root\n * itself to ensure the focus trap works.\n */\n if (!lastOverlay || !target) {\n return;\n }\n /**\n * If the ion-disable-focus-trap class\n * is present on an overlay, then this component\n * instance has opted out of focus trapping.\n * An example of this is when the sheet modal\n * has a backdrop that is disabled. The content\n * behind the sheet should be focusable until\n * the backdrop is enabled.\n */\n if (lastOverlay.classList.contains('ion-disable-focus-trap')) {\n return;\n }\n const trapScopedFocus = () => {\n /**\n * If we are focusing the overlay, clear\n * the last focused element so that hitting\n * tab activates the first focusable element\n * in the overlay wrapper.\n */\n if (lastOverlay === target) {\n lastOverlay.lastFocus = undefined;\n /**\n * Otherwise, we must be focusing an element\n * inside of the overlay. The two possible options\n * here are an input/button/etc or the ion-focus-trap\n * element. The focus trap element is used to prevent\n * the keyboard focus from leaving the overlay when\n * using Tab or screen assistants.\n */\n }\n else {\n /**\n * We do not want to focus the traps, so get the overlay\n * wrapper element as the traps live outside of the wrapper.\n */\n const overlayRoot = getElementRoot(lastOverlay);\n if (!overlayRoot.contains(target)) {\n return;\n }\n const overlayWrapper = overlayRoot.querySelector('.ion-overlay-wrapper');\n if (!overlayWrapper) {\n return;\n }\n /**\n * If the target is inside the wrapper, let the browser\n * focus as normal and keep a log of the last focused element.\n * Additionally, if the backdrop was tapped we should not\n * move focus back inside the wrapper as that could cause\n * an interactive elements focus state to activate.\n */\n if (overlayWrapper.contains(target) || target === overlayRoot.querySelector('ion-backdrop')) {\n lastOverlay.lastFocus = target;\n }\n else {\n /**\n * Otherwise, we must have focused one of the focus traps.\n * We need to wrap the focus to either the first element\n * or the last element.\n */\n /**\n * Once we call `focusFirstDescendant` and focus the first\n * descendant, another focus event will fire which will\n * cause `lastOverlay.lastFocus` to be updated before\n * we can run the code after that. We will cache the value\n * here to avoid that.\n */\n const lastFocus = lastOverlay.lastFocus;\n // Focus the first element in the overlay wrapper\n focusFirstDescendant(overlayWrapper, lastOverlay);\n /**\n * If the cached last focused element is the\n * same as the active element, then we need\n * to wrap focus to the last descendant. This happens\n * when the first descendant is focused, and the user\n * presses Shift + Tab. The previous line will focus\n * the same descendant again (the first one), causing\n * last focus to equal the active element.\n */\n if (lastFocus === doc.activeElement) {\n focusLastDescendant(overlayWrapper, lastOverlay);\n }\n lastOverlay.lastFocus = doc.activeElement;\n }\n }\n };\n const trapShadowFocus = () => {\n /**\n * If the target is inside the wrapper, let the browser\n * focus as normal and keep a log of the last focused element.\n */\n if (lastOverlay.contains(target)) {\n lastOverlay.lastFocus = target;\n }\n else {\n /**\n * Otherwise, we are about to have focus\n * go out of the overlay. We need to wrap\n * the focus to either the first element\n * or the last element.\n */\n /**\n * Once we call `focusFirstDescendant` and focus the first\n * descendant, another focus event will fire which will\n * cause `lastOverlay.lastFocus` to be updated before\n * we can run the code after that. We will cache the value\n * here to avoid that.\n */\n const lastFocus = lastOverlay.lastFocus;\n // Focus the first element in the overlay wrapper\n focusFirstDescendant(lastOverlay, lastOverlay);\n /**\n * If the cached last focused element is the\n * same as the active element, then we need\n * to wrap focus to the last descendant. This happens\n * when the first descendant is focused, and the user\n * presses Shift + Tab. The previous line will focus\n * the same descendant again (the first one), causing\n * last focus to equal the active element.\n */\n if (lastFocus === doc.activeElement) {\n focusLastDescendant(lastOverlay, lastOverlay);\n }\n lastOverlay.lastFocus = doc.activeElement;\n }\n };\n if (lastOverlay.shadowRoot) {\n trapShadowFocus();\n }\n else {\n trapScopedFocus();\n }\n};\nconst connectListeners = (doc) => {\n if (lastOverlayIndex === 0) {\n lastOverlayIndex = 1;\n doc.addEventListener('focus', (ev) => {\n trapKeyboardFocus(ev, doc);\n }, true);\n // handle back-button click\n doc.addEventListener('ionBackButton', (ev) => {\n const lastOverlay = getPresentedOverlay(doc);\n if (lastOverlay === null || lastOverlay === void 0 ? void 0 : lastOverlay.backdropDismiss) {\n ev.detail.register(OVERLAY_BACK_BUTTON_PRIORITY, () => {\n return lastOverlay.dismiss(undefined, BACKDROP);\n });\n }\n });\n // handle ESC to close overlay\n doc.addEventListener('keydown', (ev) => {\n if (ev.key === 'Escape') {\n const lastOverlay = getPresentedOverlay(doc);\n if (lastOverlay === null || lastOverlay === void 0 ? void 0 : lastOverlay.backdropDismiss) {\n lastOverlay.dismiss(undefined, BACKDROP);\n }\n }\n });\n }\n};\nconst dismissOverlay = (doc, data, role, overlayTag, id) => {\n const overlay = getPresentedOverlay(doc, overlayTag, id);\n if (!overlay) {\n return Promise.reject('overlay does not exist');\n }\n return overlay.dismiss(data, role);\n};\n/**\n * Returns a list of all overlays in the DOM even if they are not presented.\n */\nconst getOverlays = (doc, selector) => {\n if (selector === undefined) {\n selector = 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker,ion-popover,ion-toast';\n }\n return Array.from(doc.querySelectorAll(selector)).filter((c) => c.overlayIndex > 0);\n};\n/**\n * Returns a list of all presented overlays.\n * Inline overlays can exist in the DOM but not be presented,\n * so there are times when we want to exclude those.\n * @param doc The document to find the element within.\n * @param overlayTag The selector for the overlay, defaults to Ionic overlay components.\n */\nconst getPresentedOverlays = (doc, overlayTag) => {\n return getOverlays(doc, overlayTag).filter((o) => !isOverlayHidden(o));\n};\n/**\n * Returns a presented overlay element.\n * @param doc The document to find the element within.\n * @param overlayTag The selector for the overlay, defaults to Ionic overlay components.\n * @param id The unique identifier for the overlay instance.\n * @returns The overlay element or `undefined` if no overlay element is found.\n */\nconst getPresentedOverlay = (doc, overlayTag, id) => {\n const overlays = getPresentedOverlays(doc, overlayTag);\n return id === undefined ? overlays[overlays.length - 1] : overlays.find((o) => o.id === id);\n};\n/**\n * When an overlay is presented, the main\n * focus is the overlay not the page content.\n * We need to remove the page content from the\n * accessibility tree otherwise when\n * users use \"read screen from top\" gestures with\n * TalkBack and VoiceOver, the screen reader will begin\n * to read the content underneath the overlay.\n *\n * We need a container where all page components\n * exist that is separate from where the overlays\n * are added in the DOM. For most apps, this element\n * is the top most ion-router-outlet. In the event\n * that devs are not using a router,\n * they will need to add the \"ion-view-container-root\"\n * id to the element that contains all of their views.\n *\n * TODO: If Framework supports having multiple top\n * level router outlets we would need to update this.\n * Example: One outlet for side menu and one outlet\n * for main content.\n */\nconst setRootAriaHidden = (hidden = false) => {\n const root = getAppRoot(document);\n const viewContainer = root.querySelector('ion-router-outlet, ion-nav, #ion-view-container-root');\n if (!viewContainer) {\n return;\n }\n if (hidden) {\n viewContainer.setAttribute('aria-hidden', 'true');\n }\n else {\n viewContainer.removeAttribute('aria-hidden');\n }\n};\nconst present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {\n var _a, _b;\n if (overlay.presented) {\n return;\n }\n setRootAriaHidden(true);\n overlay.presented = true;\n overlay.willPresent.emit();\n (_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();\n const mode = getIonMode(overlay);\n // get the user's animation fn if one was provided\n const animationBuilder = overlay.enterAnimation\n ? overlay.enterAnimation\n : config.get(name, mode === 'ios' ? iosEnterAnimation : mdEnterAnimation);\n const completed = await overlayAnimation(overlay, animationBuilder, overlay.el, opts);\n if (completed) {\n overlay.didPresent.emit();\n (_b = overlay.didPresentShorthand) === null || _b === void 0 ? void 0 : _b.emit();\n }\n /**\n * When an overlay that steals focus\n * is dismissed, focus should be returned\n * to the element that was focused\n * prior to the overlay opening. Toast\n * does not steal focus and is excluded\n * from returning focus as a result.\n */\n if (overlay.el.tagName !== 'ION-TOAST') {\n focusPreviousElementOnDismiss(overlay.el);\n }\n /**\n * If the focused element is already\n * inside the overlay component then\n * focus should not be moved from that\n * to the overlay container.\n */\n if (overlay.keyboardClose && (document.activeElement === null || !overlay.el.contains(document.activeElement))) {\n overlay.el.focus();\n }\n};\n/**\n * When an overlay component is dismissed,\n * focus should be returned to the element\n * that presented the overlay. Otherwise\n * focus will be set on the body which\n * means that people using screen readers\n * or tabbing will need to re-navigate\n * to where they were before they\n * opened the overlay.\n */\nconst focusPreviousElementOnDismiss = async (overlayEl) => {\n let previousElement = document.activeElement;\n if (!previousElement) {\n return;\n }\n const shadowRoot = previousElement === null || previousElement === void 0 ? void 0 : previousElement.shadowRoot;\n if (shadowRoot) {\n // If there are no inner focusable elements, just focus the host element.\n previousElement = shadowRoot.querySelector(focusableQueryString) || previousElement;\n }\n await overlayEl.onDidDismiss();\n previousElement.focus();\n};\nconst dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnimation, opts) => {\n var _a, _b;\n if (!overlay.presented) {\n return false;\n }\n /**\n * If this is the last visible overlay then\n * we want to re-add the root to the accessibility tree.\n */\n if (doc !== undefined && getPresentedOverlays(doc).length === 1) {\n setRootAriaHidden(false);\n }\n overlay.presented = false;\n try {\n // Overlay contents should not be clickable during dismiss\n overlay.el.style.setProperty('pointer-events', 'none');\n overlay.willDismiss.emit({ data, role });\n (_a = overlay.willDismissShorthand) === null || _a === void 0 ? void 0 : _a.emit({ data, role });\n const mode = getIonMode(overlay);\n const animationBuilder = overlay.leaveAnimation\n ? overlay.leaveAnimation\n : config.get(name, mode === 'ios' ? iosLeaveAnimation : mdLeaveAnimation);\n // If dismissed via gesture, no need to play leaving animation again\n if (role !== GESTURE) {\n await overlayAnimation(overlay, animationBuilder, overlay.el, opts);\n }\n overlay.didDismiss.emit({ data, role });\n (_b = overlay.didDismissShorthand) === null || _b === void 0 ? void 0 : _b.emit({ data, role });\n activeAnimations.delete(overlay);\n /**\n * Make overlay hidden again in case it is being reused.\n * We can safely remove pointer-events: none as\n * overlay-hidden will set display: none.\n */\n overlay.el.classList.add('overlay-hidden');\n overlay.el.style.removeProperty('pointer-events');\n /**\n * Clear any focus trapping references\n * when the overlay is dismissed.\n */\n if (overlay.el.lastFocus !== undefined) {\n overlay.el.lastFocus = undefined;\n }\n }\n catch (err) {\n console.error(err);\n }\n overlay.el.remove();\n return true;\n};\nconst getAppRoot = (doc) => {\n return doc.querySelector('ion-app') || doc.body;\n};\nconst overlayAnimation = async (overlay, animationBuilder, baseEl, opts) => {\n // Make overlay visible in case it's hidden\n baseEl.classList.remove('overlay-hidden');\n const aniRoot = overlay.el;\n const animation = animationBuilder(aniRoot, opts);\n if (!overlay.animated || !config.getBoolean('animated', true)) {\n animation.duration(0);\n }\n if (overlay.keyboardClose) {\n animation.beforeAddWrite(() => {\n const activeElement = baseEl.ownerDocument.activeElement;\n if (activeElement === null || activeElement === void 0 ? void 0 : activeElement.matches('input,ion-input, ion-textarea')) {\n activeElement.blur();\n }\n });\n }\n const activeAni = activeAnimations.get(overlay) || [];\n activeAnimations.set(overlay, [...activeAni, animation]);\n await animation.play();\n return true;\n};\nconst eventMethod = (element, eventName) => {\n let resolve;\n const promise = new Promise((r) => (resolve = r));\n onceEvent(element, eventName, (event) => {\n resolve(event.detail);\n });\n return promise;\n};\nconst onceEvent = (element, eventName, callback) => {\n const handler = (ev) => {\n removeEventListener(element, eventName, handler);\n callback(ev);\n };\n addEventListener(element, eventName, handler);\n};\nconst isCancel = (role) => {\n return role === 'cancel' || role === BACKDROP;\n};\nconst defaultGate = (h) => h();\n/**\n * Calls a developer provided method while avoiding\n * Angular Zones. Since the handler is provided by\n * the developer, we should throw any errors\n * received so that developer-provided bug\n * tracking software can log it.\n */\nconst safeCall = (handler, arg) => {\n if (typeof handler === 'function') {\n const jmp = config.get('_zoneGate', defaultGate);\n return jmp(() => {\n try {\n return handler(arg);\n }\n catch (e) {\n throw e;\n }\n });\n }\n return undefined;\n};\nconst BACKDROP = 'backdrop';\nconst GESTURE = 'gesture';\nconst OVERLAY_GESTURE_PRIORITY = 39;\n/**\n * Creates a delegate controller.\n *\n * Requires that the component has the following properties:\n * - `el: HTMLElement`\n * - `hasController: boolean`\n * - `delegate?: FrameworkDelegate`\n *\n * @param ref The component class instance.\n */\nconst createDelegateController = (ref) => {\n let inline = false;\n let workingDelegate;\n const coreDelegate = CoreDelegate();\n /**\n * Determines whether or not an overlay is being used\n * inline or via a controller/JS and returns the correct delegate.\n * By default, subsequent calls to getDelegate will use\n * a cached version of the delegate.\n * This is useful for calling dismiss after present,\n * so that the correct delegate is given.\n * @param force `true` to force the non-cached version of the delegate.\n * @returns The delegate to use and whether or not the overlay is inline.\n */\n const getDelegate = (force = false) => {\n if (workingDelegate && !force) {\n return {\n delegate: workingDelegate,\n inline,\n };\n }\n const { el, hasController, delegate } = ref;\n /**\n * If using overlay inline\n * we potentially need to use the coreDelegate\n * so that this works in vanilla JS apps.\n * If a developer has presented this component\n * via a controller, then we can assume\n * the component is already in the\n * correct place.\n */\n const parentEl = el.parentNode;\n inline = parentEl !== null && !hasController;\n workingDelegate = inline ? delegate || coreDelegate : delegate;\n return { inline, delegate: workingDelegate };\n };\n /**\n * Attaches a component in the DOM. Teleports the component\n * to the root of the app.\n * @param component The component to optionally construct and append to the element.\n */\n const attachViewToDom = async (component) => {\n const { delegate } = getDelegate(true);\n if (delegate) {\n return await delegate.attachViewToDom(ref.el, component);\n }\n const { hasController } = ref;\n if (hasController && component !== undefined) {\n throw new Error('framework delegate is missing');\n }\n return null;\n };\n /**\n * Moves a component back to its original location in the DOM.\n */\n const removeViewFromDom = () => {\n const { delegate } = getDelegate();\n if (delegate && ref.el !== undefined) {\n delegate.removeViewFromDom(ref.el.parentElement, ref.el);\n }\n };\n return {\n attachViewToDom,\n removeViewFromDom,\n };\n};\n/**\n * Constructs a trigger interaction for an overlay.\n * Presents an overlay when the trigger is clicked.\n *\n * Usage:\n * ```ts\n * triggerController = createTriggerController();\n * triggerController.addClickListener(el, trigger);\n * ```\n */\nconst createTriggerController = () => {\n let destroyTriggerInteraction;\n /**\n * Removes the click listener from the trigger element.\n */\n const removeClickListener = () => {\n if (destroyTriggerInteraction) {\n destroyTriggerInteraction();\n destroyTriggerInteraction = undefined;\n }\n };\n /**\n * Adds a click listener to the trigger element.\n * Presents the overlay when the trigger is clicked.\n * @param el The overlay element.\n * @param trigger The ID of the element to add a click listener to.\n */\n const addClickListener = (el, trigger) => {\n removeClickListener();\n const triggerEl = trigger !== undefined ? document.getElementById(trigger) : null;\n if (!triggerEl) {\n printIonWarning(`A trigger element with the ID \"${trigger}\" was not found in the DOM. The trigger element must be in the DOM when the \"trigger\" property is set on an overlay component.`, el);\n return;\n }\n const configureTriggerInteraction = (targetEl, overlayEl) => {\n const openOverlay = () => {\n overlayEl.present();\n };\n targetEl.addEventListener('click', openOverlay);\n return () => {\n targetEl.removeEventListener('click', openOverlay);\n };\n };\n destroyTriggerInteraction = configureTriggerInteraction(triggerEl, el);\n };\n return {\n addClickListener,\n removeClickListener,\n };\n};\n\nexport { BACKDROP as B, GESTURE as G, OVERLAY_GESTURE_PRIORITY as O, alertController as a, actionSheetController as b, popoverController as c, createDelegateController as d, createTriggerController as e, present as f, dismiss as g, eventMethod as h, isCancel as i, prepareOverlay as j, setOverlayId as k, loadingController as l, modalController as m, activeAnimations as n, focusFirstDescendant as o, pickerController as p, getPresentedOverlay as q, safeCall as s, toastController as t };\n","export function applyPolyfills() {\n var promises = [];\n if (typeof window !== 'undefined') {\n var win = window;\n\n if (!win.customElements ||\n (win.Element && (!win.Element.prototype.closest || !win.Element.prototype.matches || !win.Element.prototype.remove || !win.Element.prototype.getRootNode))) {\n promises.push(import(/* webpackChunkName: \"polyfills-dom\" */ './dom.js'));\n }\n\n var checkIfURLIsSupported = function() {\n try {\n var u = new URL('b', 'http://a');\n u.pathname = 'c%20d';\n return (u.href === 'http://a/c%20d') && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n\n if (\n 'function' !== typeof Object.assign || !Object.entries ||\n !Array.prototype.find || !Array.prototype.includes ||\n !String.prototype.startsWith || !String.prototype.endsWith ||\n (win.NodeList && !win.NodeList.prototype.forEach) ||\n !win.fetch ||\n !checkIfURLIsSupported() ||\n typeof WeakMap == 'undefined'\n ) {\n promises.push(import(/* webpackChunkName: \"polyfills-core-js\" */ './core-js.js'));\n }\n }\n return Promise.all(promises);\n}\n","/*!\n * (C) Ionic http://ionicframework.com - MIT License\n */\nconst hostContext = (selector, el) => {\n return el.closest(selector) !== null;\n};\n/**\n * Create the mode and color classes for the component based on the classes passed in\n */\nconst createColorClasses = (color, cssClassMap) => {\n return typeof color === 'string' && color.length > 0\n ? Object.assign({ 'ion-color': true, [`ion-color-${color}`]: true }, cssClassMap) : cssClassMap;\n};\nconst getClassList = (classes) => {\n if (classes !== undefined) {\n const array = Array.isArray(classes) ? classes : classes.split(' ');\n return array\n .filter((c) => c != null)\n .map((c) => c.trim())\n .filter((c) => c !== '');\n }\n return [];\n};\nconst getClassMap = (classes) => {\n const map = {};\n getClassList(classes).forEach((c) => (map[c] = true));\n return map;\n};\nconst SCHEME = /^[a-z][a-z0-9+\\-.]*:/;\nconst openURL = async (url, ev, direction, animation) => {\n if (url != null && url[0] !== '#' && !SCHEME.test(url)) {\n const router = document.querySelector('ion-router');\n if (router) {\n if (ev != null) {\n ev.preventDefault();\n }\n return router.push(url, direction, animation);\n }\n }\n return false;\n};\n\nexport { createColorClasses as c, getClassMap as g, hostContext as h, openURL as o };\n","/*!\n * (C) Ionic http://ionicframework.com - MIT License\n */\nexport * from '../dist/esm/polyfills/index.js';\nexport * from '../dist/esm/loader.js';\n","import LocalForage from 'localforage';\n/** @hidden */\nexport const Drivers = {\n SecureStorage: 'ionicSecureStorage',\n IndexedDB: LocalForage.INDEXEDDB,\n LocalStorage: LocalForage.LOCALSTORAGE\n};\nconst defaultConfig = {\n name: '_ionicstorage',\n storeName: '_ionickv',\n dbKey: '_ionickey',\n driverOrder: [\n Drivers.SecureStorage,\n Drivers.IndexedDB,\n Drivers.LocalStorage\n ]\n};\nexport class Storage {\n /**\n * Create a new Storage instance using the order of drivers and any additional config\n * options to pass to LocalForage.\n *\n * Possible default driverOrder options are: ['indexeddb', 'localstorage'] and the\n * default is that exact ordering.\n *\n * When using Ionic Secure Storage (enterprise only), use ['ionicSecureStorage', 'indexeddb', 'localstorage'] to ensure\n * Secure Storage is used when available, or fall back to IndexedDB or LocalStorage on the web.\n */\n constructor(config = defaultConfig) {\n this._db = null;\n this._secureStorageDriver = null;\n const actualConfig = Object.assign({}, defaultConfig, config || {});\n this._config = actualConfig;\n }\n async create() {\n const db = LocalForage.createInstance(this._config);\n this._db = db;\n await db.setDriver(this._config.driverOrder || []);\n return this;\n }\n /**\n * Define a new Driver. Must be called before\n * initializing the database. Example:\n *\n * await storage.defineDriver(myDriver);\n * await storage.create();\n */\n async defineDriver(driver) {\n if (driver._driver === Drivers.SecureStorage) {\n this._secureStorageDriver = driver;\n }\n return LocalForage.defineDriver(driver);\n }\n /**\n * Get the name of the driver being used.\n * @returns Name of the driver\n */\n get driver() {\n var _a;\n return ((_a = this._db) === null || _a === void 0 ? void 0 : _a.driver()) || null;\n }\n assertDb() {\n if (!this._db) {\n throw new Error('Database not created. Must call create() first');\n }\n return this._db;\n }\n /**\n * Get the value associated with the given key.\n * @param key the key to identify this value\n * @returns Returns a promise with the value of the given key\n */\n get(key) {\n const db = this.assertDb();\n return db.getItem(key);\n }\n /**\n * Set the value for the given key.\n * @param key the key to identify this value\n * @param value the value for this key\n * @returns Returns a promise that resolves when the key and value are set\n */\n set(key, value) {\n const db = this.assertDb();\n return db.setItem(key, value);\n }\n /**\n * Remove any value associated with this key.\n * @param key the key to identify this value\n * @returns Returns a promise that resolves when the value is removed\n */\n remove(key) {\n const db = this.assertDb();\n return db.removeItem(key);\n }\n /**\n * Clear the entire key value store. WARNING: HOT!\n * @returns Returns a promise that resolves when the store is cleared\n */\n clear() {\n const db = this.assertDb();\n return db.clear();\n }\n /**\n * @returns Returns a promise that resolves with the number of keys stored.\n */\n length() {\n const db = this.assertDb();\n return db.length();\n }\n /**\n * @returns Returns a promise that resolves with the keys in the store.\n */\n keys() {\n const db = this.assertDb();\n return db.keys();\n }\n /**\n * Iterate through each key,value pair.\n * @param iteratorCallback a callback of the form (value, key, iterationNumber)\n * @returns Returns a promise that resolves when the iteration has finished.\n */\n forEach(iteratorCallback) {\n const db = this.assertDb();\n return db.iterate(iteratorCallback);\n }\n setEncryptionKey(key) {\n var _a;\n if (!this._secureStorageDriver) {\n throw new Error('@ionic-enterprise/secure-storage not installed. Encryption support not available');\n }\n else {\n (_a = this._secureStorageDriver) === null || _a === void 0 ? void 0 : _a.setEncryptionKey(key);\n }\n }\n}\n","/**\n * Virtual DOM patching algorithm based on Snabbdom by\n * Simon Friis Vindum (@paldepind)\n * Licensed under the MIT License\n * https://github.com/snabbdom/snabbdom/blob/master/LICENSE\n *\n * Modified for Stencil's renderer and slot projection\n */\nlet scopeId;\nlet contentRef;\nlet hostTagName;\nlet customError;\nlet i = 0;\nlet useNativeShadowDom = false;\nlet checkSlotFallbackVisibility = false;\nlet checkSlotRelocate = false;\nlet isSvgMode = false;\nlet renderingRef = null;\nlet queueCongestion = 0;\nlet queuePending = false;\n/*\n Stencil Client Platform v4.9.1 | MIT Licensed | https://stenciljs.com\n */\nimport { BUILD, NAMESPACE } from '@stencil/core/internal/app-data';\nconst Build = {\n isDev: BUILD.isDev ? true : false,\n isBrowser: true,\n isServer: false,\n isTesting: BUILD.isTesting ? true : false,\n};\nconst getAssetPath = (path) => {\n const assetUrl = new URL(path, plt.$resourcesUrl$);\n return assetUrl.origin !== win.location.origin ? assetUrl.href : assetUrl.pathname;\n};\nconst setAssetPath = (path) => (plt.$resourcesUrl$ = path);\nconst createTime = (fnName, tagName = '') => {\n if (BUILD.profile && performance.mark) {\n const key = `st:${fnName}:${tagName}:${i++}`;\n // Start\n performance.mark(key);\n // End\n return () => performance.measure(`[Stencil] ${fnName}() <${tagName}>`, key);\n }\n else {\n return () => {\n return;\n };\n }\n};\nconst uniqueTime = (key, measureText) => {\n if (BUILD.profile && performance.mark) {\n if (performance.getEntriesByName(key, 'mark').length === 0) {\n performance.mark(key);\n }\n return () => {\n if (performance.getEntriesByName(measureText, 'measure').length === 0) {\n performance.measure(measureText, key);\n }\n };\n }\n else {\n return () => {\n return;\n };\n }\n};\nconst inspect = (ref) => {\n const hostRef = getHostRef(ref);\n if (!hostRef) {\n return undefined;\n }\n const flags = hostRef.$flags$;\n const hostElement = hostRef.$hostElement$;\n return {\n renderCount: hostRef.$renderCount$,\n flags: {\n hasRendered: !!(flags & 2 /* HOST_FLAGS.hasRendered */),\n hasConnected: !!(flags & 1 /* HOST_FLAGS.hasConnected */),\n isWaitingForChildren: !!(flags & 4 /* HOST_FLAGS.isWaitingForChildren */),\n isConstructingInstance: !!(flags & 8 /* HOST_FLAGS.isConstructingInstance */),\n isQueuedForUpdate: !!(flags & 16 /* HOST_FLAGS.isQueuedForUpdate */),\n hasInitializedComponent: !!(flags & 32 /* HOST_FLAGS.hasInitializedComponent */),\n hasLoadedComponent: !!(flags & 64 /* HOST_FLAGS.hasLoadedComponent */),\n isWatchReady: !!(flags & 128 /* HOST_FLAGS.isWatchReady */),\n isListenReady: !!(flags & 256 /* HOST_FLAGS.isListenReady */),\n needsRerender: !!(flags & 512 /* HOST_FLAGS.needsRerender */),\n },\n instanceValues: hostRef.$instanceValues$,\n ancestorComponent: hostRef.$ancestorComponent$,\n hostElement,\n lazyInstance: hostRef.$lazyInstance$,\n vnode: hostRef.$vnode$,\n modeName: hostRef.$modeName$,\n onReadyPromise: hostRef.$onReadyPromise$,\n onReadyResolve: hostRef.$onReadyResolve$,\n onInstancePromise: hostRef.$onInstancePromise$,\n onInstanceResolve: hostRef.$onInstanceResolve$,\n onRenderResolve: hostRef.$onRenderResolve$,\n queuedListeners: hostRef.$queuedListeners$,\n rmListeners: hostRef.$rmListeners$,\n ['s-id']: hostElement['s-id'],\n ['s-cr']: hostElement['s-cr'],\n ['s-lr']: hostElement['s-lr'],\n ['s-p']: hostElement['s-p'],\n ['s-rc']: hostElement['s-rc'],\n ['s-sc']: hostElement['s-sc'],\n };\n};\nconst installDevTools = () => {\n if (BUILD.devTools) {\n const stencil = (win.stencil = win.stencil || {});\n const originalInspect = stencil.inspect;\n stencil.inspect = (ref) => {\n let result = inspect(ref);\n if (!result && typeof originalInspect === 'function') {\n result = originalInspect(ref);\n }\n return result;\n };\n }\n};\nconst CONTENT_REF_ID = 'r';\nconst ORG_LOCATION_ID = 'o';\nconst SLOT_NODE_ID = 's';\nconst TEXT_NODE_ID = 't';\nconst HYDRATE_ID = 's-id';\nconst HYDRATED_STYLE_ID = 'sty-id';\nconst HYDRATE_CHILD_ID = 'c-id';\nconst HYDRATED_CSS = '{visibility:hidden}.hydrated{visibility:inherit}';\n/**\n * Constant for styles to be globally applied to `slot-fb` elements for pseudo-slot behavior.\n *\n * Two cascading rules must be used instead of a `:not()` selector due to Stencil browser\n * support as of Stencil v4.\n */\nconst SLOT_FB_CSS = 'slot-fb{display:contents}slot-fb[hidden]{display:none}';\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\nconst FORM_ASSOCIATED_CUSTOM_ELEMENT_CALLBACKS = [\n 'formAssociatedCallback',\n 'formResetCallback',\n 'formDisabledCallback',\n 'formStateRestoreCallback',\n];\n/**\n * Default style mode id\n */\n/**\n * Reusable empty obj/array\n * Don't add values to these!!\n */\nconst EMPTY_OBJ = {};\n/**\n * Namespaces\n */\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst HTML_NS = 'http://www.w3.org/1999/xhtml';\nconst isDef = (v) => v != null;\n/**\n * Check whether a value is a 'complex type', defined here as an object or a\n * function.\n *\n * @param o the value to check\n * @returns whether it's a complex type or not\n */\nconst isComplexType = (o) => {\n // https://jsperf.com/typeof-fn-object/5\n o = typeof o;\n return o === 'object' || o === 'function';\n};\n/**\n * Helper method for querying a `meta` tag that contains a nonce value\n * out of a DOM's head.\n *\n * @param doc The DOM containing the `head` to query against\n * @returns The content of the meta tag representing the nonce value, or `undefined` if no tag\n * exists or the tag has no content.\n */\nfunction queryNonceMetaTagContent(doc) {\n var _a, _b, _c;\n return (_c = (_b = (_a = doc.head) === null || _a === void 0 ? void 0 : _a.querySelector('meta[name=\"csp-nonce\"]')) === null || _b === void 0 ? void 0 : _b.getAttribute('content')) !== null && _c !== void 0 ? _c : undefined;\n}\n/**\n * Production h() function based on Preact by\n * Jason Miller (@developit)\n * Licensed under the MIT License\n * https://github.com/developit/preact/blob/master/LICENSE\n *\n * Modified for Stencil's compiler and vdom\n */\n// export function h(nodeName: string | d.FunctionalComponent, vnodeData: d.PropsType, child?: d.ChildType): d.VNode;\n// export function h(nodeName: string | d.FunctionalComponent, vnodeData: d.PropsType, ...children: d.ChildType[]): d.VNode;\nconst h = (nodeName, vnodeData, ...children) => {\n let child = null;\n let key = null;\n let slotName = null;\n let simple = false;\n let lastSimple = false;\n const vNodeChildren = [];\n const walk = (c) => {\n for (let i = 0; i < c.length; i++) {\n child = c[i];\n if (Array.isArray(child)) {\n walk(child);\n }\n else if (child != null && typeof child !== 'boolean') {\n if ((simple = typeof nodeName !== 'function' && !isComplexType(child))) {\n child = String(child);\n }\n else if (BUILD.isDev && typeof nodeName !== 'function' && child.$flags$ === undefined) {\n consoleDevError(`vNode passed as children has unexpected type.\nMake sure it's using the correct h() function.\nEmpty objects can also be the cause, look for JSX comments that became objects.`);\n }\n if (simple && lastSimple) {\n // If the previous child was simple (string), we merge both\n vNodeChildren[vNodeChildren.length - 1].$text$ += child;\n }\n else {\n // Append a new vNode, if it's text, we create a text vNode\n vNodeChildren.push(simple ? newVNode(null, child) : child);\n }\n lastSimple = simple;\n }\n }\n };\n walk(children);\n if (vnodeData) {\n if (BUILD.isDev && nodeName === 'input') {\n validateInputProperties(vnodeData);\n }\n if (BUILD.vdomKey && vnodeData.key) {\n key = vnodeData.key;\n }\n if (BUILD.slotRelocation && vnodeData.name) {\n slotName = vnodeData.name;\n }\n // normalize class / className attributes\n if (BUILD.vdomClass) {\n const classData = vnodeData.className || vnodeData.class;\n if (classData) {\n vnodeData.class =\n typeof classData !== 'object'\n ? classData\n : Object.keys(classData)\n .filter((k) => classData[k])\n .join(' ');\n }\n }\n }\n if (BUILD.isDev && vNodeChildren.some(isHost)) {\n consoleDevError(`The
must be the single root component. Make sure:\n- You are NOT using hostData() and in the same component.\n- is used once, and it's the single root component of the render() function.`);\n }\n if (BUILD.vdomFunctional && typeof nodeName === 'function') {\n // nodeName is a functional component\n return nodeName(vnodeData === null ? {} : vnodeData, vNodeChildren, vdomFnUtils);\n }\n const vnode = newVNode(nodeName, null);\n vnode.$attrs$ = vnodeData;\n if (vNodeChildren.length > 0) {\n vnode.$children$ = vNodeChildren;\n }\n if (BUILD.vdomKey) {\n vnode.$key$ = key;\n }\n if (BUILD.slotRelocation) {\n vnode.$name$ = slotName;\n }\n return vnode;\n};\n/**\n * A utility function for creating a virtual DOM node from a tag and some\n * possible text content.\n *\n * @param tag the tag for this element\n * @param text possible text content for the node\n * @returns a newly-minted virtual DOM node\n */\nconst newVNode = (tag, text) => {\n const vnode = {\n $flags$: 0,\n $tag$: tag,\n $text$: text,\n $elm$: null,\n $children$: null,\n };\n if (BUILD.vdomAttribute) {\n vnode.$attrs$ = null;\n }\n if (BUILD.vdomKey) {\n vnode.$key$ = null;\n }\n if (BUILD.slotRelocation) {\n vnode.$name$ = null;\n }\n return vnode;\n};\nconst Host = {};\n/**\n * Check whether a given node is a Host node or not\n *\n * @param node the virtual DOM node to check\n * @returns whether it's a Host node or not\n */\nconst isHost = (node) => node && node.$tag$ === Host;\n/**\n * Implementation of {@link d.FunctionalUtilities} for Stencil's VDom.\n *\n * Note that these functions convert from {@link d.VNode} to\n * {@link d.ChildNode} to give functional component developers a friendly\n * interface.\n */\nconst vdomFnUtils = {\n forEach: (children, cb) => children.map(convertToPublic).forEach(cb),\n map: (children, cb) => children.map(convertToPublic).map(cb).map(convertToPrivate),\n};\n/**\n * Convert a {@link d.VNode} to a {@link d.ChildNode} in order to present a\n * friendlier public interface (hence, 'convertToPublic').\n *\n * @param node the virtual DOM node to convert\n * @returns a converted child node\n */\nconst convertToPublic = (node) => ({\n vattrs: node.$attrs$,\n vchildren: node.$children$,\n vkey: node.$key$,\n vname: node.$name$,\n vtag: node.$tag$,\n vtext: node.$text$,\n});\n/**\n * Convert a {@link d.ChildNode} back to an equivalent {@link d.VNode} in\n * order to use the resulting object in the virtual DOM. The initial object was\n * likely created as part of presenting a public API, so converting it back\n * involved making it 'private' again (hence, `convertToPrivate`).\n *\n * @param node the child node to convert\n * @returns a converted virtual DOM node\n */\nconst convertToPrivate = (node) => {\n if (typeof node.vtag === 'function') {\n const vnodeData = Object.assign({}, node.vattrs);\n if (node.vkey) {\n vnodeData.key = node.vkey;\n }\n if (node.vname) {\n vnodeData.name = node.vname;\n }\n return h(node.vtag, vnodeData, ...(node.vchildren || []));\n }\n const vnode = newVNode(node.vtag, node.vtext);\n vnode.$attrs$ = node.vattrs;\n vnode.$children$ = node.vchildren;\n vnode.$key$ = node.vkey;\n vnode.$name$ = node.vname;\n return vnode;\n};\n/**\n * Validates the ordering of attributes on an input element\n *\n * @param inputElm the element to validate\n */\nconst validateInputProperties = (inputElm) => {\n const props = Object.keys(inputElm);\n const value = props.indexOf('value');\n if (value === -1) {\n return;\n }\n const typeIndex = props.indexOf('type');\n const minIndex = props.indexOf('min');\n const maxIndex = props.indexOf('max');\n const stepIndex = props.indexOf('step');\n if (value < typeIndex || value < minIndex || value < maxIndex || value < stepIndex) {\n consoleDevWarn(`The \"value\" prop of should be set after \"min\", \"max\", \"type\" and \"step\"`);\n }\n};\n/**\n * Entrypoint of the client-side hydration process. Facilitates calls to hydrate the\n * document and all its nodes.\n *\n * This process will also reconstruct the shadow root and slot DOM nodes for components using shadow DOM.\n *\n * @param hostElm The element to hydrate.\n * @param tagName The element's tag name.\n * @param hostId The host ID assigned to the element by the server.\n * @param hostRef The host reference for the element.\n */\nconst initializeClientHydrate = (hostElm, tagName, hostId, hostRef) => {\n const endHydrate = createTime('hydrateClient', tagName);\n const shadowRoot = hostElm.shadowRoot;\n const childRenderNodes = [];\n const slotNodes = [];\n const shadowRootNodes = BUILD.shadowDom && shadowRoot ? [] : null;\n const vnode = (hostRef.$vnode$ = newVNode(tagName, null));\n if (!plt.$orgLocNodes$) {\n initializeDocumentHydrate(doc.body, (plt.$orgLocNodes$ = new Map()));\n }\n hostElm[HYDRATE_ID] = hostId;\n hostElm.removeAttribute(HYDRATE_ID);\n clientHydrate(vnode, childRenderNodes, slotNodes, shadowRootNodes, hostElm, hostElm, hostId);\n childRenderNodes.map((c) => {\n const orgLocationId = c.$hostId$ + '.' + c.$nodeId$;\n const orgLocationNode = plt.$orgLocNodes$.get(orgLocationId);\n const node = c.$elm$;\n // Put the node back in its original location since the native Shadow DOM\n // can handle rendering it its correct location now\n if (orgLocationNode && supportsShadow && orgLocationNode['s-en'] === '') {\n orgLocationNode.parentNode.insertBefore(node, orgLocationNode.nextSibling);\n }\n if (!shadowRoot) {\n node['s-hn'] = tagName;\n if (orgLocationNode) {\n node['s-ol'] = orgLocationNode;\n node['s-ol']['s-nr'] = node;\n }\n }\n plt.$orgLocNodes$.delete(orgLocationId);\n });\n if (BUILD.shadowDom && shadowRoot) {\n shadowRootNodes.map((shadowRootNode) => {\n if (shadowRootNode) {\n shadowRoot.appendChild(shadowRootNode);\n }\n });\n }\n endHydrate();\n};\n/**\n * Recursively constructs the virtual node tree for a host element and its children.\n * The tree is constructed by parsing the annotations set on the nodes by the server.\n *\n * In addition to constructing the vNode tree, we also track information about the node's\n * descendants like which are slots, which should exist in the shadow root, and which\n * are nodes that should be rendered as children of the parent node.\n *\n * @param parentVNode The vNode representing the parent node.\n * @param childRenderNodes An array of all child nodes in the parent's node tree.\n * @param slotNodes An array of all slot nodes in the parent's node tree.\n * @param shadowRootNodes An array all nodes that should be rendered in the shadow root in the parent's node tree.\n * @param hostElm The parent element.\n * @param node The node to construct the vNode tree for.\n * @param hostId The host ID assigned to the element by the server.\n */\nconst clientHydrate = (parentVNode, childRenderNodes, slotNodes, shadowRootNodes, hostElm, node, hostId) => {\n let childNodeType;\n let childIdSplt;\n let childVNode;\n let i;\n if (node.nodeType === 1 /* NODE_TYPE.ElementNode */) {\n childNodeType = node.getAttribute(HYDRATE_CHILD_ID);\n if (childNodeType) {\n // got the node data from the element's attribute\n // `${hostId}.${nodeId}.${depth}.${index}`\n childIdSplt = childNodeType.split('.');\n if (childIdSplt[0] === hostId || childIdSplt[0] === '0') {\n childVNode = {\n $flags$: 0,\n $hostId$: childIdSplt[0],\n $nodeId$: childIdSplt[1],\n $depth$: childIdSplt[2],\n $index$: childIdSplt[3],\n $tag$: node.tagName.toLowerCase(),\n $elm$: node,\n $attrs$: null,\n $children$: null,\n $key$: null,\n $name$: null,\n $text$: null,\n };\n childRenderNodes.push(childVNode);\n node.removeAttribute(HYDRATE_CHILD_ID);\n // this is a new child vnode\n // so ensure its parent vnode has the vchildren array\n if (!parentVNode.$children$) {\n parentVNode.$children$ = [];\n }\n // add our child vnode to a specific index of the vnode's children\n parentVNode.$children$[childVNode.$index$] = childVNode;\n // this is now the new parent vnode for all the next child checks\n parentVNode = childVNode;\n if (shadowRootNodes && childVNode.$depth$ === '0') {\n shadowRootNodes[childVNode.$index$] = childVNode.$elm$;\n }\n }\n }\n // recursively drill down, end to start so we can remove nodes\n for (i = node.childNodes.length - 1; i >= 0; i--) {\n clientHydrate(parentVNode, childRenderNodes, slotNodes, shadowRootNodes, hostElm, node.childNodes[i], hostId);\n }\n if (node.shadowRoot) {\n // keep drilling down through the shadow root nodes\n for (i = node.shadowRoot.childNodes.length - 1; i >= 0; i--) {\n clientHydrate(parentVNode, childRenderNodes, slotNodes, shadowRootNodes, hostElm, node.shadowRoot.childNodes[i], hostId);\n }\n }\n }\n else if (node.nodeType === 8 /* NODE_TYPE.CommentNode */) {\n // `${COMMENT_TYPE}.${hostId}.${nodeId}.${depth}.${index}`\n childIdSplt = node.nodeValue.split('.');\n if (childIdSplt[1] === hostId || childIdSplt[1] === '0') {\n // comment node for either the host id or a 0 host id\n childNodeType = childIdSplt[0];\n childVNode = {\n $flags$: 0,\n $hostId$: childIdSplt[1],\n $nodeId$: childIdSplt[2],\n $depth$: childIdSplt[3],\n $index$: childIdSplt[4],\n $elm$: node,\n $attrs$: null,\n $children$: null,\n $key$: null,\n $name$: null,\n $tag$: null,\n $text$: null,\n };\n if (childNodeType === TEXT_NODE_ID) {\n childVNode.$elm$ = node.nextSibling;\n if (childVNode.$elm$ && childVNode.$elm$.nodeType === 3 /* NODE_TYPE.TextNode */) {\n childVNode.$text$ = childVNode.$elm$.textContent;\n childRenderNodes.push(childVNode);\n // remove the text comment since it's no longer needed\n node.remove();\n if (!parentVNode.$children$) {\n parentVNode.$children$ = [];\n }\n parentVNode.$children$[childVNode.$index$] = childVNode;\n if (shadowRootNodes && childVNode.$depth$ === '0') {\n shadowRootNodes[childVNode.$index$] = childVNode.$elm$;\n }\n }\n }\n else if (childVNode.$hostId$ === hostId) {\n // this comment node is specifically for this host id\n if (childNodeType === SLOT_NODE_ID) {\n // `${SLOT_NODE_ID}.${hostId}.${nodeId}.${depth}.${index}.${slotName}`;\n childVNode.$tag$ = 'slot';\n if (childIdSplt[5]) {\n node['s-sn'] = childVNode.$name$ = childIdSplt[5];\n }\n else {\n node['s-sn'] = '';\n }\n node['s-sr'] = true;\n if (BUILD.shadowDom && shadowRootNodes) {\n // browser support shadowRoot and this is a shadow dom component\n // create an actual slot element\n childVNode.$elm$ = doc.createElement(childVNode.$tag$);\n if (childVNode.$name$) {\n // add the slot name attribute\n childVNode.$elm$.setAttribute('name', childVNode.$name$);\n }\n // insert the new slot element before the slot comment\n node.parentNode.insertBefore(childVNode.$elm$, node);\n // remove the slot comment since it's not needed for shadow\n node.remove();\n if (childVNode.$depth$ === '0') {\n shadowRootNodes[childVNode.$index$] = childVNode.$elm$;\n }\n }\n slotNodes.push(childVNode);\n if (!parentVNode.$children$) {\n parentVNode.$children$ = [];\n }\n parentVNode.$children$[childVNode.$index$] = childVNode;\n }\n else if (childNodeType === CONTENT_REF_ID) {\n // `${CONTENT_REF_ID}.${hostId}`;\n if (BUILD.shadowDom && shadowRootNodes) {\n // remove the content ref comment since it's not needed for shadow\n node.remove();\n }\n else if (BUILD.slotRelocation) {\n hostElm['s-cr'] = node;\n node['s-cn'] = true;\n }\n }\n }\n }\n }\n else if (parentVNode && parentVNode.$tag$ === 'style') {\n const vnode = newVNode(null, node.textContent);\n vnode.$elm$ = node;\n vnode.$index$ = '0';\n parentVNode.$children$ = [vnode];\n }\n};\n/**\n * Recursively locate any comments representing an original location for a node in a node's\n * children or shadowRoot children.\n *\n * @param node The node to search.\n * @param orgLocNodes A map of the original location annotation and the current node being searched.\n */\nconst initializeDocumentHydrate = (node, orgLocNodes) => {\n if (node.nodeType === 1 /* NODE_TYPE.ElementNode */) {\n let i = 0;\n for (; i < node.childNodes.length; i++) {\n initializeDocumentHydrate(node.childNodes[i], orgLocNodes);\n }\n if (node.shadowRoot) {\n for (i = 0; i < node.shadowRoot.childNodes.length; i++) {\n initializeDocumentHydrate(node.shadowRoot.childNodes[i], orgLocNodes);\n }\n }\n }\n else if (node.nodeType === 8 /* NODE_TYPE.CommentNode */) {\n const childIdSplt = node.nodeValue.split('.');\n if (childIdSplt[0] === ORG_LOCATION_ID) {\n orgLocNodes.set(childIdSplt[1] + '.' + childIdSplt[2], node);\n node.nodeValue = '';\n // useful to know if the original location is\n // the root light-dom of a shadow dom component\n node['s-en'] = childIdSplt[3];\n }\n }\n};\n// Private\nconst computeMode = (elm) => modeResolutionChain.map((h) => h(elm)).find((m) => !!m);\n// Public\nconst setMode = (handler) => modeResolutionChain.push(handler);\nconst getMode = (ref) => getHostRef(ref).$modeName$;\n/**\n * Parse a new property value for a given property type.\n *\n * While the prop value can reasonably be expected to be of `any` type as far as TypeScript's type checker is concerned,\n * it is not safe to assume that the string returned by evaluating `typeof propValue` matches:\n * 1. `any`, the type given to `propValue` in the function signature\n * 2. the type stored from `propType`.\n *\n * This function provides the capability to parse/coerce a property's value to potentially any other JavaScript type.\n *\n * Property values represented in TSX preserve their type information. In the example below, the number 0 is passed to\n * a component. This `propValue` will preserve its type information (`typeof propValue === 'number'`). Note that is\n * based on the type of the value being passed in, not the type declared of the class member decorated with `@Prop`.\n * ```tsx\n * \n * ```\n *\n * HTML prop values on the other hand, will always a string\n *\n * @param propValue the new value to coerce to some type\n * @param propType the type of the prop, expressed as a binary number\n * @returns the parsed/coerced value\n */\nconst parsePropertyValue = (propValue, propType) => {\n // ensure this value is of the correct prop type\n if (propValue != null && !isComplexType(propValue)) {\n if (BUILD.propBoolean && propType & 4 /* MEMBER_FLAGS.Boolean */) {\n // per the HTML spec, any string value means it is a boolean true value\n // but we'll cheat here and say that the string \"false\" is the boolean false\n return propValue === 'false' ? false : propValue === '' || !!propValue;\n }\n if (BUILD.propNumber && propType & 2 /* MEMBER_FLAGS.Number */) {\n // force it to be a number\n return parseFloat(propValue);\n }\n if (BUILD.propString && propType & 1 /* MEMBER_FLAGS.String */) {\n // could have been passed as a number or boolean\n // but we still want it as a string\n return String(propValue);\n }\n // redundant return here for better minification\n return propValue;\n }\n // not sure exactly what type we want\n // so no need to change to a different type\n return propValue;\n};\nconst getElement = (ref) => (BUILD.lazyLoad ? getHostRef(ref).$hostElement$ : ref);\nconst createEvent = (ref, name, flags) => {\n const elm = getElement(ref);\n return {\n emit: (detail) => {\n if (BUILD.isDev && !elm.isConnected) {\n consoleDevWarn(`The \"${name}\" event was emitted, but the dispatcher node is no longer connected to the dom.`);\n }\n return emitEvent(elm, name, {\n bubbles: !!(flags & 4 /* EVENT_FLAGS.Bubbles */),\n composed: !!(flags & 2 /* EVENT_FLAGS.Composed */),\n cancelable: !!(flags & 1 /* EVENT_FLAGS.Cancellable */),\n detail,\n });\n },\n };\n};\n/**\n * Helper function to create & dispatch a custom Event on a provided target\n * @param elm the target of the Event\n * @param name the name to give the custom Event\n * @param opts options for configuring a custom Event\n * @returns the custom Event\n */\nconst emitEvent = (elm, name, opts) => {\n const ev = plt.ce(name, opts);\n elm.dispatchEvent(ev);\n return ev;\n};\nconst rootAppliedStyles = /*@__PURE__*/ new WeakMap();\nconst registerStyle = (scopeId, cssText, allowCS) => {\n let style = styles.get(scopeId);\n if (supportsConstructableStylesheets && allowCS) {\n style = (style || new CSSStyleSheet());\n if (typeof style === 'string') {\n style = cssText;\n }\n else {\n style.replaceSync(cssText);\n }\n }\n else {\n style = cssText;\n }\n styles.set(scopeId, style);\n};\nconst addStyle = (styleContainerNode, cmpMeta, mode) => {\n var _a;\n const scopeId = getScopeId(cmpMeta, mode);\n const style = styles.get(scopeId);\n if (!BUILD.attachStyles) {\n return scopeId;\n }\n // if an element is NOT connected then getRootNode() will return the wrong root node\n // so the fallback is to always use the document for the root node in those cases\n styleContainerNode = styleContainerNode.nodeType === 11 /* NODE_TYPE.DocumentFragment */ ? styleContainerNode : doc;\n if (style) {\n if (typeof style === 'string') {\n styleContainerNode = styleContainerNode.head || styleContainerNode;\n let appliedStyles = rootAppliedStyles.get(styleContainerNode);\n let styleElm;\n if (!appliedStyles) {\n rootAppliedStyles.set(styleContainerNode, (appliedStyles = new Set()));\n }\n if (!appliedStyles.has(scopeId)) {\n if (BUILD.hydrateClientSide &&\n styleContainerNode.host &&\n (styleElm = styleContainerNode.querySelector(`[${HYDRATED_STYLE_ID}=\"${scopeId}\"]`))) {\n // This is only happening on native shadow-dom, do not needs CSS var shim\n styleElm.innerHTML = style;\n }\n else {\n styleElm = doc.createElement('style');\n styleElm.innerHTML = style;\n // Apply CSP nonce to the style tag if it exists\n const nonce = (_a = plt.$nonce$) !== null && _a !== void 0 ? _a : queryNonceMetaTagContent(doc);\n if (nonce != null) {\n styleElm.setAttribute('nonce', nonce);\n }\n if (BUILD.hydrateServerSide || BUILD.hotModuleReplacement) {\n styleElm.setAttribute(HYDRATED_STYLE_ID, scopeId);\n }\n styleContainerNode.insertBefore(styleElm, styleContainerNode.querySelector('link'));\n }\n // Add styles for `slot-fb` elements if we're using slots outside the Shadow DOM\n if (cmpMeta.$flags$ & 4 /* CMP_FLAGS.hasSlotRelocation */) {\n styleElm.innerHTML += SLOT_FB_CSS;\n }\n if (appliedStyles) {\n appliedStyles.add(scopeId);\n }\n }\n }\n else if (BUILD.constructableCSS && !styleContainerNode.adoptedStyleSheets.includes(style)) {\n styleContainerNode.adoptedStyleSheets = [...styleContainerNode.adoptedStyleSheets, style];\n }\n }\n return scopeId;\n};\nconst attachStyles = (hostRef) => {\n const cmpMeta = hostRef.$cmpMeta$;\n const elm = hostRef.$hostElement$;\n const flags = cmpMeta.$flags$;\n const endAttachStyles = createTime('attachStyles', cmpMeta.$tagName$);\n const scopeId = addStyle(BUILD.shadowDom && supportsShadow && elm.shadowRoot ? elm.shadowRoot : elm.getRootNode(), cmpMeta, hostRef.$modeName$);\n if ((BUILD.shadowDom || BUILD.scoped) && BUILD.cssAnnotations && flags & 10 /* CMP_FLAGS.needsScopedEncapsulation */) {\n // only required when we're NOT using native shadow dom (slot)\n // or this browser doesn't support native shadow dom\n // and this host element was NOT created with SSR\n // let's pick out the inner content for slot projection\n // create a node to represent where the original\n // content was first placed, which is useful later on\n // DOM WRITE!!\n elm['s-sc'] = scopeId;\n elm.classList.add(scopeId + '-h');\n if (BUILD.scoped && flags & 2 /* CMP_FLAGS.scopedCssEncapsulation */) {\n elm.classList.add(scopeId + '-s');\n }\n }\n endAttachStyles();\n};\nconst getScopeId = (cmp, mode) => 'sc-' + (BUILD.mode && mode && cmp.$flags$ & 32 /* CMP_FLAGS.hasMode */ ? cmp.$tagName$ + '-' + mode : cmp.$tagName$);\nconst convertScopedToShadow = (css) => css.replace(/\\/\\*!@([^\\/]+)\\*\\/[^\\{]+\\{/g, '$1{');\n/**\n * Production setAccessor() function based on Preact by\n * Jason Miller (@developit)\n * Licensed under the MIT License\n * https://github.com/developit/preact/blob/master/LICENSE\n *\n * Modified for Stencil's compiler and vdom\n */\n/**\n * When running a VDom render set properties present on a VDom node onto the\n * corresponding HTML element.\n *\n * Note that this function has special functionality for the `class`,\n * `style`, `key`, and `ref` attributes, as well as event handlers (like\n * `onClick`, etc). All others are just passed through as-is.\n *\n * @param elm the HTMLElement onto which attributes should be set\n * @param memberName the name of the attribute to set\n * @param oldValue the old value for the attribute\n * @param newValue the new value for the attribute\n * @param isSvg whether we're in an svg context or not\n * @param flags bitflags for Vdom variables\n */\nconst setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags) => {\n if (oldValue !== newValue) {\n let isProp = isMemberInElement(elm, memberName);\n let ln = memberName.toLowerCase();\n if (BUILD.vdomClass && memberName === 'class') {\n const classList = elm.classList;\n const oldClasses = parseClassList(oldValue);\n const newClasses = parseClassList(newValue);\n classList.remove(...oldClasses.filter((c) => c && !newClasses.includes(c)));\n classList.add(...newClasses.filter((c) => c && !oldClasses.includes(c)));\n }\n else if (BUILD.vdomStyle && memberName === 'style') {\n // update style attribute, css properties and values\n if (BUILD.updatable) {\n for (const prop in oldValue) {\n if (!newValue || newValue[prop] == null) {\n if (!BUILD.hydrateServerSide && prop.includes('-')) {\n elm.style.removeProperty(prop);\n }\n else {\n elm.style[prop] = '';\n }\n }\n }\n }\n for (const prop in newValue) {\n if (!oldValue || newValue[prop] !== oldValue[prop]) {\n if (!BUILD.hydrateServerSide && prop.includes('-')) {\n elm.style.setProperty(prop, newValue[prop]);\n }\n else {\n elm.style[prop] = newValue[prop];\n }\n }\n }\n }\n else if (BUILD.vdomKey && memberName === 'key')\n ;\n else if (BUILD.vdomRef && memberName === 'ref') {\n // minifier will clean this up\n if (newValue) {\n newValue(elm);\n }\n }\n else if (BUILD.vdomListener &&\n (BUILD.lazyLoad ? !isProp : !elm.__lookupSetter__(memberName)) &&\n memberName[0] === 'o' &&\n memberName[1] === 'n') {\n // Event Handlers\n // so if the member name starts with \"on\" and the 3rd characters is\n // a capital letter, and it's not already a member on the element,\n // then we're assuming it's an event listener\n if (memberName[2] === '-') {\n // on- prefixed events\n // allows to be explicit about the dom event to listen without any magic\n // under the hood:\n // // listens for \"click\"\n // // listens for \"Click\"\n // // listens for \"ionChange\"\n // // listens for \"EVENTS\"\n memberName = memberName.slice(3);\n }\n else if (isMemberInElement(win, ln)) {\n // standard event\n // the JSX attribute could have been \"onMouseOver\" and the\n // member name \"onmouseover\" is on the window's prototype\n // so let's add the listener \"mouseover\", which is all lowercased\n memberName = ln.slice(2);\n }\n else {\n // custom event\n // the JSX attribute could have been \"onMyCustomEvent\"\n // so let's trim off the \"on\" prefix and lowercase the first character\n // and add the listener \"myCustomEvent\"\n // except for the first character, we keep the event name case\n memberName = ln[2] + memberName.slice(3);\n }\n if (oldValue || newValue) {\n // Need to account for \"capture\" events.\n // If the event name ends with \"Capture\", we'll update the name to remove\n // the \"Capture\" suffix and make sure the event listener is setup to handle the capture event.\n const capture = memberName.endsWith(CAPTURE_EVENT_SUFFIX);\n // Make sure we only replace the last instance of \"Capture\"\n memberName = memberName.replace(CAPTURE_EVENT_REGEX, '');\n if (oldValue) {\n plt.rel(elm, memberName, oldValue, capture);\n }\n if (newValue) {\n plt.ael(elm, memberName, newValue, capture);\n }\n }\n }\n else if (BUILD.vdomPropOrAttr) {\n // Set property if it exists and it's not a SVG\n const isComplex = isComplexType(newValue);\n if ((isProp || (isComplex && newValue !== null)) && !isSvg) {\n try {\n if (!elm.tagName.includes('-')) {\n const n = newValue == null ? '' : newValue;\n // Workaround for Safari, moving the caret when re-assigning the same valued\n if (memberName === 'list') {\n isProp = false;\n }\n else if (oldValue == null || elm[memberName] != n) {\n elm[memberName] = n;\n }\n }\n else {\n elm[memberName] = newValue;\n }\n }\n catch (e) {\n /**\n * in case someone tries to set a read-only property, e.g. \"namespaceURI\", we just ignore it\n */\n }\n }\n /**\n * Need to manually update attribute if:\n * - memberName is not an attribute\n * - if we are rendering the host element in order to reflect attribute\n * - if it's a SVG, since properties might not work in