{"version":3,"mappings":"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","names":["hide","FRAME_MS","FADE_OUT_MS","debounce","#submitter","#allowRequestToBeIntercepted","#willDelegateErrorHandling","#resolveRequestPromise","#toCacheKey","#prefetchTimeout","#maxAges","#resolveRenderPromise","#resolveInterceptionPromise","#activeElement","#beforeNodeMorphed","#viewTransitionStarted","#lastOperation","#shouldRedirect","#findFrameElement","#shouldSubmit","#enable","#tryToPrefetchRequest","#cancelRequestIfObsolete","#tryToUsePrefetchedRequest","#isPrefetchable","#prefetchedLink","#cacheTtl","#cancelPrefetchRequest","#getActionForFormSubmission","#getDefaultAction","#started","#setLanguage","#preloadAll","#setCacheControl","#pageRefreshDebouncePeriod","start","#connected","#loadSourceURL","#currentFetchRequest","#isIgnoringChangesTo","#hasBeenLoaded","#shouldMorphFrame","#visit","#loadFrameResponse","#handleUnvisitableFrameResponse","#shouldInterceptNavigation","#navigateFrame","#resolveVisitPromise","#willHandleFrameMissingFromResponse","#handleFrameMissingFromResponse","#withCurrentNavigationElement","#visitResponse","#throwFrameMissingError","#getFrameElementById","#formActionIsVisitable","#ignoringChangesToAttribute","#ignoredAttributes","#raise","effect","getComputedStyle","mathMax","min","mathMin","max","hash","allPlacements","placements","createPopper","defaultModifiers","eventListeners","popperOffsets","computeStyles","applyStyles","offset","flip","preventOverflow","arrow","exports","Tooltip","fetch"],"ignoreList":[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,77],"sources":["../../../assets/javascripts/main.js","../../../assets/javascripts/selector.js","../../../assets/javascripts/toggler.js","../../../assets/javascripts/gizmos.js","../../../assets/javascripts/stonks_fullpage.js","../../../assets/javascripts/impact_im_ref.js","../../../assets/javascripts/button_grain.js","../../../node_modules/img-comparison-slider/dist/index.js","../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js","../../../node_modules/@popperjs/core/lib/enums.js","../../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../../node_modules/@popperjs/core/lib/utils/math.js","../../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../../node_modules/@popperjs/core/lib/utils/within.js","../../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../../node_modules/@popperjs/core/lib/modifiers/index.js","../../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../../node_modules/@popperjs/core/lib/utils/debounce.js","../../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../../node_modules/@popperjs/core/lib/createPopper.js","../../../node_modules/@popperjs/core/lib/popper-lite.js","../../../node_modules/@popperjs/core/lib/popper.js","../../../node_modules/@popperjs/core/lib/index.js","../../../node_modules/bootstrap/js/dist/dom/data.js","../../../node_modules/bootstrap/js/dist/util/index.js","../../../node_modules/bootstrap/js/dist/dom/event-handler.js","../../../node_modules/bootstrap/js/dist/dom/manipulator.js","../../../node_modules/bootstrap/js/dist/util/config.js","../../../node_modules/bootstrap/js/dist/base-component.js","../../../node_modules/bootstrap/js/dist/util/sanitizer.js","../../../node_modules/bootstrap/js/dist/dom/selector-engine.js","../../../node_modules/bootstrap/js/dist/util/template-factory.js","../../../node_modules/bootstrap/js/dist/tooltip.js","../../../assets/javascripts/all.js","../../../node_modules/@hotwired/stimulus/dist/stimulus.js","../../../assets/javascripts/controllers/button_controller.ts","../../../assets/javascripts/controllers/carousel_controller.ts","../../../assets/javascripts/controllers/clamp_list_controller.ts","../../../assets/javascripts/controllers/email_form_controller.ts","../../../assets/javascripts/controllers/filmbox_characteristic_details_controller.ts","../../../assets/javascripts/controllers/filmbox_feature_guide_link_controller.ts","../../../assets/javascripts/controllers/footer_california_link_controller.ts","../../../assets/javascripts/controllers/gizmo_scrubber_controller.ts","../../../assets/javascripts/video_playback_session.ts","../../../assets/javascripts/video_destination_contract.ts","../../../assets/javascripts/controllers/homepage_hero_controller.ts","../../../assets/javascripts/controllers/learn_aside_controller.ts","../../../assets/javascripts/controllers/learn_search_controller.ts","../../../assets/javascripts/controllers/learn_tree_controller.ts","../../../assets/javascripts/controllers/lensnode_profile_carousel_controller.ts","../../../assets/javascripts/controllers/looks_picker_controller.ts","../../../assets/javascripts/controllers/product_menu_controller.ts","../../../assets/javascripts/controllers/product_primary_action_controller.ts","../../../assets/javascripts/controllers/selection_tabs_controller.ts","../../../assets/javascripts/controllers/share_action_controller.ts","../../../assets/javascripts/controllers/single_select_controller.ts","../../../assets/javascripts/controllers/sticky_header_controller.ts","../../../assets/javascripts/controllers/subnav_overflow_controller.ts","../../../assets/javascripts/controllers/video_player_controller.ts","../../../assets/javascripts/controllers/video_scrubber_controller.ts","../../../assets/javascripts/controllers/viewport_video_controller.ts","../../../assets/javascripts/stimulus.ts"],"sourcesContent":["var bootstrap, d, hide, show\n\nd = document\n\nhide = function (el) {\n  return (el.style.display = 'none')\n}\n\nshow = function (el) {\n  return (el.style.display = 'block')\n}\n\nbootstrap = function () {\n  var btn, cloak, cloaks, i, len\n  cloaks = d.querySelectorAll('.cloaked')\n  for (i = 0, len = cloaks.length; i < len; i++) {\n    cloak = cloaks[i]\n    hide(cloak)\n  }\n  btn = d.querySelector('#feature-tour-button')\n  if (btn) {\n    return btn.addEventListener('click', function (e) {\n      var iframe\n      hide(d.querySelector('#feature-tour-button-section'))\n      show(d.querySelector('#feature-tour-section'))\n      iframe = d.querySelector('#feature-tour-section iframe')\n      iframe.setAttribute('src', iframe.getAttribute('x-src'))\n      d.querySelector('a[id=featureTour]').scrollIntoView()\n      e.preventDefault()\n      return e.stopPropagation()\n    })\n  }\n}\n\nd.addEventListener('turbo:load', function (e) {\n  // Initialize existing behaviors\n  bootstrap()\n  // Initialize Bootstrap tooltips\n  ;[].slice\n    .call(\n      d.querySelectorAll('[data-bs-toggle=\"tooltip\"], [data-toggle=\"tooltip\"]')\n    )\n    .forEach(function (el) {\n      new window.Tooltip(el)\n    })\n})\n","window.addEventListener('turbo:load', function () {\n  var allChoices = Array.from(\n    document.getElementsByClassName('zine-selector-choice')\n  )\n\n  function updateCurrentChoices() {\n    allChoices.forEach(function (element) {\n      var isCurrent =\n        document\n          .getElementById(element.getAttribute('data-selected-image-id'))\n          .getAttribute('src') == element.getAttribute('data-src')\n      if (isCurrent) {\n        element.classList.add('current')\n      } else {\n        element.classList.remove('current')\n      }\n    })\n  }\n\n  allChoices.forEach(function (element) {\n    element.addEventListener('click', function (clickEvent) {\n      var elementToChange = document.getElementById(\n        element.getAttribute('data-selected-image-id')\n      )\n      elementToChange.setAttribute('src', element.getAttribute('data-src'))\n      updateCurrentChoices()\n    })\n  })\n\n  updateCurrentChoices()\n})\n","window.addEventListener('turbo:load', function () {\n  var togglers = Array.from(document.getElementsByClassName('toggler'))\n\n  togglers.forEach(function (element) {\n    element.addEventListener('click', function (clickEvent) {\n      var elementToChange = document.getElementById(\n        element.getAttribute('data-toggle-element-id')\n      )\n      elementToChange.classList.toggle(\n        element.getAttribute('data-toggle-class')\n      )\n    })\n  })\n})\n","function initGizmoFrame(frame, startDelayMs) {\n    if (!frame || frame.__gizmoInitialized) return\n    const bgUp = frame.querySelector('.gizmo-background.up')\n    const bgDown = frame.querySelector('.gizmo-background.down')\n    const fgUp = frame.querySelector('.gizmo-foreground.up')\n    const fgDown = frame.querySelector('.gizmo-foreground.down')\n    if (!bgUp || !bgDown || !fgUp || !fgDown) return\n\n    const requestedIntervalMs = Number(frame.getAttribute('data-toggle-interval-ms'))\n    const intervalMs =\n        Number.isFinite(requestedIntervalMs) && requestedIntervalMs > 0\n            ? requestedIntervalMs\n            : 1500\n\n    let topIsDown = false\n    let isAnimating = false\n\n    function setIsTop(isDownTop) {\n        ;[bgUp, bgDown, fgUp, fgDown].forEach(function (el) {\n            el.classList.remove('is-top')\n        })\n        if (isDownTop) {\n            bgDown.classList.add('is-top')\n            fgDown.classList.add('is-top')\n        } else {\n            bgUp.classList.add('is-top')\n            fgUp.classList.add('is-top')\n        }\n    }\n\n    function setStateDown(down) {\n        frame.classList.toggle('state-down', !!down)\n\n        const targetTopIsDown = !!down\n        if (targetTopIsDown === topIsDown || isAnimating) return\n\n        isAnimating = true\n\n        const currentTopBg = topIsDown ? bgDown : bgUp\n        const currentTopFg = topIsDown ? fgDown : fgUp\n        const nextTopBg = targetTopIsDown ? bgDown : bgUp\n        const nextTopFg = targetTopIsDown ? fgDown : fgUp\n\n        currentTopBg.classList.add('is-top')\n        currentTopFg.classList.add('is-top')\n        nextTopBg.classList.remove('is-top')\n        nextTopFg.classList.remove('is-top')\n\n        frame.classList.add('is-fading')\n\n        // Foreground crossfade (JS-orchestrated to avoid flicker)\n        try {\n            // Ensure current stays fully visible\n            currentTopFg.style.transition = ''\n            currentTopFg.style.opacity = '1'\n\n            // Prepare incoming above, starting transparent\n            nextTopFg.style.transition = 'none'\n            nextTopFg.style.opacity = '0'\n            nextTopFg.style.zIndex = '12'\n\n            // Force reflow so the next transition animates\n            // eslint-disable-next-line no-unused-expressions\n            nextTopFg.offsetHeight\n\n            // Animate incoming to fully visible\n            nextTopFg.style.transition = ''\n            nextTopFg.style.opacity = '1'\n        } catch (_) { }\n\n        let finished = false\n        let fallbackHandle = null\n\n        function finish() {\n            if (finished) return\n            finished = true\n            currentTopBg.removeEventListener('transitionend', onEnd)\n            currentTopBg.removeEventListener('transitioncancel', onEnd)\n            if (fallbackHandle) clearTimeout(fallbackHandle)\n\n            setIsTop(targetTopIsDown)\n            frame.classList.remove('is-fading')\n            topIsDown = targetTopIsDown\n            isAnimating = false\n\n                // Cleanup inline styles\n                ;[currentTopFg, nextTopFg].forEach(function (el) {\n                    el.style.transition = ''\n                    el.style.opacity = ''\n                    el.style.zIndex = ''\n                })\n        }\n\n        const onEnd = function (event) {\n            if (event.propertyName !== 'opacity') return\n            finish()\n        }\n        currentTopBg.addEventListener('transitionend', onEnd)\n        currentTopBg.addEventListener('transitioncancel', onEnd)\n\n        if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n            finish()\n        } else {\n            // Recover before the next toggle if the browser drops transition events.\n            fallbackHandle = setTimeout(finish, Math.max(0, intervalMs - 50))\n        }\n    }\n\n    function toggleState() {\n        setStateDown(!topIsDown)\n    }\n\n    // layout: aspect-ratio support fallback if needed\n    const aspect = frame.getAttribute('data-aspect-ratio') || '100/85'\n    frame.style.setProperty('--gizmo-aspect-ratio', aspect)\n\n    // initialize\n    setIsTop(false)\n\n    const delay = Number.isFinite(startDelayMs) ? Math.max(0, startDelayMs) : 0\n    let intervalHandle = null\n    const start = function () {\n        toggleState()\n        intervalHandle = setInterval(toggleState, intervalMs)\n    }\n    if (delay > 0) {\n        const timeoutHandle = setTimeout(start, delay)\n        frame.__gizmoTimeout = timeoutHandle\n    } else {\n        start()\n    }\n\n    frame.__gizmoInitialized = true\n    frame.__gizmoCleanup = function () {\n        if (intervalHandle) clearInterval(intervalHandle)\n        if (frame.__gizmoTimeout) clearTimeout(frame.__gizmoTimeout)\n    }\n}\n\nfunction initAllGizmos(root) {\n    const scope = root || document\n    // Stagger per carousel container to keep order intuitive\n    const containers = Array.from(\n        scope.querySelectorAll('.zine-carousel.creative-controls, .zine-carousel')\n    )\n    const defaultStepMs = 250\n\n    containers.forEach(function (container) {\n        const frames = Array.from(container.querySelectorAll('.gizmo-frame'))\n        frames.forEach(function (frame, index) {\n            const stepAttr = frame.getAttribute('data-stagger-step-ms')\n            const stepMs = stepAttr ? parseInt(stepAttr) : defaultStepMs\n            const delay = index * (Number.isFinite(stepMs) ? Math.max(0, stepMs) : defaultStepMs)\n            initGizmoFrame(frame, delay)\n        })\n    })\n}\n\ndocument.addEventListener('turbo:load', function () {\n    initAllGizmos(document)\n})\n\nexport { initAllGizmos, initGizmoFrame }\n","document.addEventListener('turbo:load', () => {\n  const root = document.getElementById('stonks-fullpage')\n  if (!root) return\n\n  // Legacy anchor compatibility: stock-system section ids switched from raw\n  // labels like \"Color Photo\" to parameterized \"color-photo\". Browsers may\n  // still hand us the old form via window.location.hash from old bookmarks.\n  // If the hash doesn't match a real element, try matching by data-system-label.\n  const incomingHash = decodeURIComponent((window.location.hash || '').slice(1))\n  if (incomingHash && !document.getElementById(incomingHash)) {\n    const fallback = root.querySelector(\n      `.fp-system[data-system-label=\"${CSS.escape(incomingHash)}\"]`\n    )\n    if (fallback && fallback.id) {\n      window.history.replaceState(null, '', `#${fallback.id}`)\n      fallback.scrollIntoView()\n    }\n  }\n\n  // In-memory storage shim scoped to window (no localStorage)\n  const storage = (() => {\n    const w = window\n    if (!w.__vvStonksMemory) w.__vvStonksMemory = {}\n    const store = w.__vvStonksMemory\n    return {\n      getItem(key) {\n        return Object.prototype.hasOwnProperty.call(store, key)\n          ? store[key]\n          : null\n      },\n      setItem(key, value) {\n        store[key] = String(value)\n      },\n      removeItem(key) {\n        delete store[key]\n      },\n      clear() {\n        Object.keys(store).forEach((k) => delete store[k])\n      },\n    }\n  })()\n\n  const previewImg = root.querySelector('.fp-preview-host .fp-stonk-image')\n  const previewBox = root.querySelector('.fp-preview-host .fp-preview-box')\n  const previewWrapper = root.querySelector(\n    '.fp-preview-host .fp-preview-box .fp-preview-image-wrapper'\n  )\n  const mosaic = root.querySelector('.fp-preview-host .fp-mosaic')\n  const previewCallouts = root.querySelector(\n    '.fp-preview-host .fp-preview-callouts'\n  )\n  const previewLabelEl = root.querySelector(\n    '.fp-preview-host .fp-preview-stonk-label'\n  )\n  const previewDescEl = root.querySelector(\n    '.fp-preview-host .fp-preview-stock-description'\n  )\n  const previewPrimaryEl = root.querySelector(\n    '.fp-preview-host .fp-preview-stonk-label .primary'\n  )\n  const previewSecondaryEl = root.querySelector(\n    '.fp-preview-host .fp-preview-stonk-label .secondary'\n  )\n  const variantPicker = root.querySelector(\n    '.fp-preview-host .fp-variant-picker'\n  )\n  const systems = Array.from(root.querySelectorAll('.fp-system')).filter(\n    (s) => !s.classList.contains('fp-intro')\n  )\n  const syncGaugeSelection = (gauge) => {\n    root.querySelectorAll('.fp-gauge-choices [data-gauge]').forEach((option) => {\n      const selected = (option.getAttribute('data-gauge') || '') === gauge\n      option.classList.toggle('current', selected)\n      option.setAttribute('aria-pressed', String(selected))\n      option.setAttribute('data-state', selected ? 'selected' : 'unselected')\n    })\n  }\n\n  // Loading shimmer state for preview image swaps\n  let pendingShimmerTile = null\n  let pendingShimmerTimeout = null\n  const clearShimmerClasses = (tile) => {\n    if (!tile) return\n    tile.classList.remove('is-loading', 'is-shimmer')\n  }\n  const markTileLoading = (tile) => {\n    if (pendingShimmerTimeout) {\n      clearTimeout(pendingShimmerTimeout)\n      pendingShimmerTimeout = null\n    }\n    if (pendingShimmerTile && pendingShimmerTile !== tile) {\n      clearShimmerClasses(pendingShimmerTile)\n    }\n    pendingShimmerTile = tile || null\n    if (!tile) return\n    tile.classList.add('is-loading')\n    void tile.offsetWidth\n    tile.classList.add('is-shimmer')\n  }\n  const startShimmerFadeOut = (tile) => {\n    if (!tile) return\n    tile.classList.remove('is-loading')\n    pendingShimmerTimeout = setTimeout(() => {\n      tile.classList.remove('is-shimmer')\n      if (pendingShimmerTile === tile) pendingShimmerTile = null\n      pendingShimmerTimeout = null\n    }, 220)\n  }\n  let pendingShimmerSeq = 0\n  const setPreviewSrc = (tile, src) => {\n    if (!src || !previewImg) return\n    const currentSrc = previewImg.getAttribute('src') || ''\n    if (src === currentSrc) return\n\n    const seq = ++pendingShimmerSeq\n    markTileLoading(tile)\n\n    const cleanup = () => {\n      previewImg.removeEventListener('load', onLoad)\n      previewImg.removeEventListener('error', onLoad)\n    }\n    const onLoad = () => {\n      cleanup()\n      if (seq !== pendingShimmerSeq) return\n      startShimmerFadeOut(pendingShimmerTile)\n    }\n    previewImg.addEventListener('load', onLoad)\n    previewImg.addEventListener('error', onLoad)\n    previewImg.src = src\n  }\n  const getSelectedTile = (section) => {\n    if (!section) return null\n    return (\n      section.querySelector('.fp-stock-item.is-selected') ||\n      section.querySelector('.fp-stock-item')\n    )\n  }\n\n  const setPreviewFromSection = (section) => {\n    if (!section || !previewImg) return\n    const selected =\n      section.querySelector('.fp-stock-item.is-selected') ||\n      section.querySelector('.fp-stock-item')\n    if (!selected) return\n    const v = getPersistedVariant()\n    const g = getPersistedGauge()\n    const mapped =\n      selected.getAttribute(`data-url-${v}-${g}`) ||\n      selected.getAttribute(`data-url-cindy-${g}`) ||\n      selected.getAttribute(`data-url-${v}-35`) ||\n      selected.getAttribute('data-url-cindy-35')\n    if (mapped) setPreviewSrc(selected, mapped)\n    const label = selected.getAttribute('data-label') || ''\n    const secondary = selected.getAttribute('data-secondary-label') || ''\n    const desc = selected.getAttribute('data-description') || ''\n    if (previewPrimaryEl) previewPrimaryEl.textContent = label\n    if (previewSecondaryEl) {\n      if (secondary) {\n        previewSecondaryEl.style.display = 'inline'\n        previewSecondaryEl.textContent = secondary\n      } else {\n        previewSecondaryEl.style.display = 'none'\n        previewSecondaryEl.textContent = ''\n      }\n    }\n    if (previewDescEl) previewDescEl.textContent = desc\n    // Sync active thumb in small picker\n    if (variantPicker) {\n      const currentVariant = v || 'cindy'\n      root\n        .querySelectorAll('.fp-variant-picker .variant-thumb')\n        .forEach((t) =>\n          t.classList.toggle(\n            'active',\n            (t.getAttribute('data-variant') || '') === currentVariant\n          )\n        )\n    }\n    // Sync active gauge button and toggle text\n    syncGaugeSelection(g)\n    const toggle = root.querySelector('.fp-gauge-toggle')\n    if (toggle) toggle.textContent = g\n  }\n\n  // ---- View Transition helpers ----\n  const getPersistedVariant = () => {\n    try {\n      return storage.getItem('vv_fbx_variant') || 'cindy'\n    } catch (_) {\n      return 'cindy'\n    }\n  }\n  const getPersistedGauge = () => {\n    try {\n      const selectedGauge = root\n        .querySelector('.fp-gauge-choices [data-gauge][aria-pressed=\"true\"]')\n        ?.getAttribute('data-gauge')\n      return storage.getItem('vv_fbx_gauge') || selectedGauge || '35'\n    } catch (_) {\n      return '35'\n    }\n  }\n  const VARIANT_NAMES = ['cindy', 'bed', 'black', 'blue', 'grass', 'morning']\n  const inferVariantFromUrl = (_) => null\n\n  let lastMosaicVisible = null\n  let lastTransitionEls = []\n  const clearTransitionNames = () => {\n    lastTransitionEls.forEach((el) => {\n      if (el && el.style) el.style.viewTransitionName = ''\n    })\n    lastTransitionEls = []\n  }\n  // Name only the source BEFORE transition; in the callback move it to the target\n  const prepareElementTransition = (fromEl) => {\n    clearTransitionNames()\n    const name = 'stonks-mosaic-pair'\n    if (fromEl && fromEl.style) fromEl.style.viewTransitionName = name\n    lastTransitionEls = [fromEl].filter(Boolean)\n  }\n  const moveTransitionNameToTarget = (fromEl, toEl) => {\n    const name = 'stonks-mosaic-pair'\n    if (fromEl && fromEl.style) fromEl.style.viewTransitionName = ''\n    if (toEl && toEl.style) toEl.style.viewTransitionName = name\n    lastTransitionEls = [toEl].filter(Boolean)\n  }\n\n  const runMosaicToggleWithTransition = (showMosaic, activeSection) => {\n    if (!mosaic || !previewImg) return\n    const urlForSectionVariantGauge = (section, variant, gauge) => {\n      const selected =\n        section.querySelector('.fp-stock-item.is-selected') ||\n        section.querySelector('.fp-stock-item')\n      if (!selected) return null\n      return (\n        selected.getAttribute(`data-url-${variant}-${gauge}`) ||\n        selected.getAttribute(`data-url-cindy-${gauge}`) ||\n        selected.getAttribute(`data-url-${variant}-35`) ||\n        selected.getAttribute('data-url-cindy-35')\n      )\n    }\n    const perform = () => {\n      // Toggle visibility and content\n      if (!showMosaic && activeSection) setPreviewFromSection(activeSection)\n      mosaic.style.opacity = showMosaic ? '1' : '0'\n      mosaic.style.pointerEvents = showMosaic ? 'auto' : 'none'\n      previewImg.style.opacity = showMosaic ? '0' : '1'\n      if (previewCallouts) {\n        previewCallouts.style.opacity = showMosaic ? '0' : '1'\n        previewCallouts.style.pointerEvents = showMosaic ? 'none' : 'auto'\n      }\n    }\n\n    if (!document.startViewTransition || lastMosaicVisible === null) {\n      perform()\n      lastMosaicVisible = showMosaic\n      clearTransitionNames()\n      return\n    }\n\n    // Build mapping between mosaic tile and preview/variant button depending on direction\n    const label =\n      activeSection && activeSection.getAttribute('data-system-label')\n    const persistedVariant = getPersistedVariant()\n    const systemCell = label\n      ? mosaic.querySelector(\n          `.mosaic-cell[data-system-label=\"${CSS.escape(label)}\"]`\n        )\n      : null\n    const cellImgForVariant = (v) =>\n      systemCell &&\n      (systemCell.querySelector(\n        `img.fp-mosaic-image[data-variant=\"${CSS.escape(v)}\"]`\n      ) ||\n        systemCell.querySelector('img.fp-mosaic-image'))\n\n    let fromElForAnim = null\n    let toElForAnim = null\n    let tempVariantForPreview = null\n    if (!showMosaic) {\n      // Mosaic → Preview/Variant\n      let fromEl = cellImgForVariant(persistedVariant)\n      if (!fromEl && systemCell)\n        fromEl = systemCell.querySelector('img.fp-mosaic-image')\n      const toEl = previewImg\n      if (fromEl && toEl) {\n        fromElForAnim = fromEl\n        toElForAnim = toEl\n        prepareElementTransition(fromElForAnim)\n      }\n    } else {\n      // Preview/Variant → Mosaic\n      const previewVariant =\n        inferVariantFromUrl(previewImg.getAttribute('src') || '') ||\n        persistedVariant\n      const fromEl = previewImg\n      const toEl =\n        cellImgForVariant(previewVariant) || cellImgForVariant(persistedVariant)\n      if (fromEl && toEl) {\n        fromElForAnim = fromEl\n        toElForAnim = toEl\n        prepareElementTransition(fromElForAnim)\n      }\n    }\n\n    const vt = document.startViewTransition(() => {\n      // Apply state change for new snapshot\n      perform()\n      // Ensure the target preview image matches the source variant during the new snapshot\n      if (!showMosaic && fromElForAnim === null) {\n        // nothing to map; leave as-is\n      }\n      if (!showMosaic && fromElForAnim && toElForAnim === previewImg) {\n        const fromVariant =\n          fromElForAnim.getAttribute('data-variant') || persistedVariant\n        const desired = urlForSectionVariantGauge(\n          activeSection,\n          fromVariant,\n          getPersistedGauge()\n        )\n        const current = previewImg.getAttribute('src') || ''\n        if (desired && desired !== current) {\n          if (fromVariant !== persistedVariant)\n            tempVariantForPreview = persistedVariant\n          previewImg.src = desired\n        }\n      }\n      // Move the shared name to the target in the new snapshot\n      if (fromElForAnim && toElForAnim) {\n        moveTransitionNameToTarget(fromElForAnim, toElForAnim)\n      }\n    })\n    vt.finished.finally(() => {\n      clearTransitionNames()\n      lastMosaicVisible = showMosaic\n      // Revert the preview image back to the persisted variant after morph if we temporarily changed it\n      if (!showMosaic && tempVariantForPreview) {\n        const back = urlForSectionVariantGauge(\n          activeSection,\n          tempVariantForPreview,\n          getPersistedGauge()\n        )\n        const cur = previewImg.getAttribute('src') || ''\n        if (back && back !== cur) previewImg.src = back\n      }\n    })\n  }\n\n  const initializeSection = (section) => {\n    const firstItem = section.querySelector('.fp-stock-item')\n    if (firstItem) firstItem.classList.add('is-selected')\n    // Initialize the section header labels/desc\n    if (firstItem) {\n      const labelEl = section.querySelector('.fp-stonk-label')\n      const descEl = section.querySelector('.fp-stock-description')\n      const label = firstItem.getAttribute('data-label') || ''\n      const desc = firstItem.getAttribute('data-description') || ''\n      if (labelEl) labelEl.textContent = label\n      if (descEl) descEl.textContent = desc\n    }\n  }\n\n  systems.forEach(initializeSection)\n  // Initialize mosaic images with per-system images and varied variants\n  const VARIANTS = ['cindy', 'bed', 'black', 'blue', 'grass', 'morning']\n  if (mosaic) {\n    const cells = Array.from(mosaic.querySelectorAll('.mosaic-cell'))\n    cells.forEach((cell, i) => {\n      const img = cell.querySelector('.fp-mosaic-image')\n      if (!img) return\n      const variant = VARIANTS[i % VARIANTS.length]\n      img.setAttribute('data-variant', variant)\n      const g = getPersistedGauge()\n      const mapped =\n        img.getAttribute(`data-url-${g}`) || img.getAttribute('data-url-35')\n      if (mapped) img.src = mapped\n    })\n  }\n\n  if (systems.length > 0) setPreviewFromSection(systems[0])\n\n  // --- Scroll-linked vertical centering (desktop only):\n  const isDesktop = () => window.innerWidth > 1000\n  const getSubnavHeight = () => {\n    const subnav = document.querySelector('.subnav-inside, .subnav')\n    if (!subnav) return 0\n    const r = subnav.getBoundingClientRect()\n    // If subnav is fixed/sticky, use its height; otherwise read computed style\n    const h = r.height || parseFloat(getComputedStyle(subnav).height) || 0\n    return Math.max(0, Math.round(h))\n  }\n  const updateStickyVars = () => {\n    if (!isDesktop() || !root || !previewBox || !previewWrapper) {\n      root && root.style.setProperty('--stonks-header-offset', '0px')\n      root && root.style.setProperty('--stonks-stick-top', '0px')\n      return\n    }\n    const headerOffset = getSubnavHeight()\n    root.style.setProperty('--stonks-header-offset', `${headerOffset}px`)\n\n    const vh = window.innerHeight\n    const boxRect = previewWrapper.getBoundingClientRect()\n    const boxHeight = boxRect.height\n\n    // If a label bar exists above the preview, subtract its height (and margins)\n    // so the preview remains vertically centered in the viewport.\n    let labelBarExtra = 0\n    const labelBar = root.querySelector(\n      '.fp-preview-host .fp-preview-label-bar'\n    )\n    if (labelBar) {\n      const cs = getComputedStyle(labelBar)\n      const mb = parseFloat(cs.marginBottom || '0')\n      const mt = parseFloat(cs.marginTop || '0')\n      labelBarExtra = labelBar.getBoundingClientRect().height + mb + mt\n    }\n\n    const idealPad = Math.max(\n      0,\n      Math.floor((vh - headerOffset - boxHeight) / 2)\n    )\n    const stickTop = headerOffset + idealPad - labelBarExtra\n    root.style.setProperty('--stonks-stick-top', `${stickTop}px`)\n  }\n\n  // Tie updates to scroll/resize for seamless feel (no CSS transitions)\n  const onScrollResize = () => {\n    updateStickyVars()\n  }\n  window.addEventListener('scroll', onScrollResize, { passive: true })\n  window.addEventListener('resize', onScrollResize)\n  window.addEventListener('orientationchange', onScrollResize)\n  // Initial values\n  updateStickyVars()\n\n  // Scroll-driven active section: choose the one whose center is closest to viewport center\n  let lastActive = null\n  let ticking = false\n  // Suppress auto-picking during programmatic smooth scrolls until next user input\n  let suppressAutoPick = false\n\n  // Utilities for smart scrolling and highlighting\n  const clamp = (v, min, max) => Math.min(Math.max(v, min), max)\n  const easeInOutQuad = (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t)\n  const animateScrollToY = (targetY, durationMs) => {\n    return new Promise((resolve) => {\n      const startY = window.scrollY\n      const delta = targetY - startY\n      if (Math.abs(delta) < 1 || durationMs <= 0) {\n        if (Math.abs(delta) >= 1) window.scrollTo(0, targetY)\n        resolve()\n        return\n      }\n      const start = performance.now()\n      const step = (now) => {\n        const t = clamp((now - start) / durationMs, 0, 1)\n        const eased = easeInOutQuad(t)\n        window.scrollTo(0, startY + delta * eased)\n        if (t < 1) requestAnimationFrame(step)\n        else resolve()\n      }\n      requestAnimationFrame(step)\n    })\n  }\n  const isItemVisible = (el, headerOffset, margin = 12) => {\n    const r = el.getBoundingClientRect()\n    const safeTop = headerOffset + margin\n    const safeBottom = window.innerHeight - margin\n    return r.top >= safeTop && r.bottom <= safeBottom\n  }\n  const pulseItem = (el) => {\n    if (!el) return\n    el.classList.remove('pulse-highlight')\n    void el.offsetWidth\n    el.classList.add('pulse-highlight')\n    const remove = () => el.classList.remove('pulse-highlight')\n    el.addEventListener('animationend', remove, { once: true })\n  }\n  const viewportRefY = () => {\n    const isMobile = window.innerWidth <= 1000\n    return isMobile ? window.innerHeight * 0.7 : window.innerHeight / 2\n  }\n  const sectionDistanceToRef = (section) => {\n    const r = section.getBoundingClientRect()\n    const ref = viewportRefY()\n    if (ref >= r.top && ref <= r.bottom) return 0\n    return Math.min(Math.abs(ref - r.top), Math.abs(ref - r.bottom))\n  }\n  const pickActive = () => {\n    ticking = false\n    if (systems.length === 0) return\n    // Toggle mosaic vs. single preview based on first system vs viewport reference (bias lower on mobile)\n    if (mosaic && previewImg) {\n      const firstRect = systems[0].getBoundingClientRect()\n      const isMobile = window.innerWidth <= 1000\n      const threshold = isMobile\n        ? window.innerHeight * 0.2\n        : window.innerHeight * 0.33\n      const showMosaic = firstRect.top > threshold\n      if (lastMosaicVisible !== showMosaic) {\n        runMosaicToggleWithTransition(showMosaic, systems[0])\n      }\n    }\n    let best = systems[0]\n    let bestDelta = sectionDistanceToRef(best)\n    for (let i = 1; i < systems.length; i++) {\n      const d = sectionDistanceToRef(systems[i])\n      if (d < bestDelta) {\n        best = systems[i]\n        bestDelta = d\n      }\n    }\n    if (best !== lastActive) {\n      lastActive = best\n      systems.forEach((s) => s.classList.toggle('is-active', s === best))\n      setPreviewFromSection(best)\n    }\n  }\n  const onScroll = () => {\n    if (suppressAutoPick) return\n    if (!ticking) {\n      window.requestAnimationFrame(pickActive)\n      ticking = true\n    }\n  }\n  window.addEventListener('scroll', onScroll, { passive: true })\n  window.addEventListener('resize', onScroll)\n  // Initial evaluation after layout\n  window.requestAnimationFrame(pickActive)\n\n  // Handle clicks to update selection in a section and update preview\n  root.addEventListener('click', (ev) => {\n    // Mobile gauge toggle button\n    const toggleBtn = ev.target.closest && ev.target.closest('.fp-gauge-toggle')\n    if (toggleBtn && root.contains(toggleBtn)) {\n      const current = getPersistedGauge()\n      const next = current === '35' ? '16' : current === '16' ? '8' : '35'\n      try {\n        storage.setItem('vv_fbx_gauge', next)\n      } catch (_) {}\n      const active = lastActive || systems[0]\n      if (active) {\n        const selected = getSelectedTile(active)\n        if (selected) {\n          const v = getPersistedVariant()\n          const mapped =\n            selected.getAttribute(`data-url-${v}-${next}`) ||\n            selected.getAttribute(`data-url-cindy-${next}`)\n          if (mapped) setPreviewSrc(selected, mapped)\n        }\n      }\n      // Sync visual state for both sets of controls\n      syncGaugeSelection(next)\n      // Reflect next value on the toggle button text\n      toggleBtn.textContent = next\n      return\n    }\n\n    // Shuffle button: pick a random stock item across all sections, excluding current\n    const shuffleBtn =\n      ev.target.closest && ev.target.closest('.fp-preview-shuffle-btn')\n    if (shuffleBtn) {\n      ev.preventDefault()\n      const active = lastActive || systems[0]\n      const currentSelected = active\n        ? active.querySelector('.fp-stock-item.is-selected') ||\n          active.querySelector('.fp-stock-item')\n        : null\n      const allItems = Array.from(\n        root.querySelectorAll('.fp-system .fp-stock-item')\n      )\n      const candidates = allItems.filter((el) => el !== currentSelected)\n      if (candidates.length > 0) {\n        const idx = Math.floor(Math.random() * candidates.length)\n        const pick = candidates[idx]\n        // Set the new active section to the picked item's section for consistency\n        const newSection = pick.closest('.fp-system')\n        if (newSection) {\n          lastActive = newSection\n          systems.forEach((s) =>\n            s.classList.toggle('is-active', s === newSection)\n          )\n        }\n        // Reuse existing selection logic by dispatching a click\n        pick.click()\n        // Smart scroll to the picked item, accounting for sticky subnav\n        const headerOffset =\n          (typeof getSubnavHeight === 'function' ? getSubnavHeight() : 0) || 0\n        if (!isItemVisible(pick, headerOffset)) {\n          // Ideal: center item in the viewport area below the subnav\n          const r = pick.getBoundingClientRect()\n          const viewH = window.innerHeight\n          const idealY =\n            window.scrollY +\n            r.top -\n            headerOffset +\n            r.height / 2 -\n            (viewH - headerOffset) / 2\n          // Minimum movement to make visible (avoid large jumps)\n          let minY = window.scrollY\n          if (r.top < headerOffset + 12) {\n            minY = window.scrollY + (r.top - (headerOffset + 12))\n          } else if (r.bottom > viewH - 12) {\n            minY = window.scrollY + (r.bottom - (viewH - 12))\n          }\n          // Prefer the smaller movement to reduce jarring changes\n          const target =\n            Math.abs(idealY - window.scrollY) < Math.abs(minY - window.scrollY)\n              ? idealY\n              : minY\n          // Clamp to document bounds\n          const maxY = Math.max(\n            0,\n            document.documentElement.scrollHeight - viewH\n          )\n          const targetY = clamp(Math.round(target), 0, maxY)\n          // Suppress auto selection changes until next real user scroll input\n          suppressAutoPick = true\n          const unsuppress = () => {\n            suppressAutoPick = false\n          }\n          window.addEventListener('wheel', unsuppress, {\n            passive: true,\n            once: true,\n          })\n          window.addEventListener('touchstart', unsuppress, {\n            passive: true,\n            once: true,\n          })\n          window.addEventListener('touchmove', unsuppress, {\n            passive: true,\n            once: true,\n          })\n          window.addEventListener('keydown', unsuppress, { once: true })\n          // Fixed-duration scroll for consistent timing\n          animateScrollToY(targetY, 260).then(() => {\n            pulseItem(pick)\n          })\n        } else {\n          // Already visible: just pulse to guide attention\n          pulseItem(pick)\n        }\n      }\n      return\n    }\n    // Variant change from small picker under preview\n    const variantBtn =\n      ev.target.closest &&\n      ev.target.closest('.fp-variant-picker .variant-thumb')\n    if (variantBtn && root.contains(variantBtn)) {\n      const variant = variantBtn.getAttribute('data-variant') || 'cindy'\n      try {\n        storage.setItem('vv_fbx_variant', variant)\n      } catch (_) {}\n      // Update preview to the same stock but with new variant if possible\n      const active = lastActive || systems[0]\n      if (active) {\n        const selected = getSelectedTile(active)\n        if (selected) {\n          const g = getPersistedGauge()\n          const mapped =\n            selected.getAttribute(`data-url-${variant}-${g}`) ||\n            selected.getAttribute(`data-url-${variant}-35`)\n          if (mapped) setPreviewSrc(selected, mapped)\n        }\n      }\n      // Visual active state on small picker\n      root\n        .querySelectorAll('.fp-variant-picker .variant-thumb')\n        .forEach((t) => t.classList.toggle('active', t === variantBtn))\n      return\n    }\n    // Gauge change from inline controls under preview\n    const gaugeBtn =\n      ev.target.closest && ev.target.closest('.fp-gauge-choices [data-gauge]')\n    if (gaugeBtn && root.contains(gaugeBtn)) {\n      const gauge = gaugeBtn.getAttribute('data-gauge') || '35'\n      try {\n        storage.setItem('vv_fbx_gauge', gauge)\n      } catch (_) {}\n      const active = lastActive || systems[0]\n      if (active) {\n        const selected = getSelectedTile(active)\n        if (selected) {\n          const v = getPersistedVariant()\n          const mapped =\n            selected.getAttribute(`data-url-${v}-${gauge}`) ||\n            selected.getAttribute(`data-url-cindy-${gauge}`)\n          if (mapped) setPreviewSrc(selected, mapped)\n        }\n      }\n      syncGaugeSelection(gauge)\n      return\n    }\n    const item = ev.target.closest && ev.target.closest('.fp-stock-item')\n    if (!item || !root.contains(item)) return\n    const section = item.closest('.fp-system')\n    if (!section) return\n\n    section\n      .querySelectorAll('.fp-stock-item.is-selected')\n      .forEach((el) => el.classList.remove('is-selected'))\n    item.classList.add('is-selected')\n\n    const v = getPersistedVariant()\n    const g = getPersistedGauge()\n    const url =\n      item.getAttribute(`data-url-${v}-${g}`) ||\n      item.getAttribute(`data-url-cindy-${g}`) ||\n      item.getAttribute(`data-url-${v}-35`) ||\n      item.getAttribute('data-url-cindy-35')\n    if (url) setPreviewSrc(item, url)\n    if (previewPrimaryEl) {\n      previewPrimaryEl.textContent = item.getAttribute('data-label') || ''\n    }\n    if (previewSecondaryEl) {\n      const sec = item.getAttribute('data-secondary-label') || ''\n      if (sec) {\n        previewSecondaryEl.style.display = 'inline'\n        previewSecondaryEl.textContent = sec\n      } else {\n        previewSecondaryEl.style.display = 'none'\n        previewSecondaryEl.textContent = ''\n      }\n    }\n    if (previewDescEl)\n      previewDescEl.textContent = item.getAttribute('data-description') || ''\n  })\n})\n","// Cross-site param propagation (Turbo-safe)\n// - Capture `im_ref` from landing URL into a 1P cookie on first touch\n// - Capture `code` from landing URL into a 1P cookie, updating on later arrivals\n// - Capture `mc_cid`/`mc_eid` (Mailchimp campaign + contact ids) into 1P\n//   cookies, updating on later arrivals — last click wins, matching the\n//   store's attribution window\n// - Decorate outbound links to license.videovillage.com with stored params\n// - Preserves any existing query params (including GA cross-domain `_gl`, `gclid`, etc.)\n\n;(function () {\n  if (window.__vvImpactImRefInstalled) return\n  window.__vvImpactImRefInstalled = true\n\n  // Match your attribution/referral window (30d typical).\n  var MAX_AGE_SECONDS = 60 * 60 * 24 * 30\n  var TRACKED_PARAMS = [\n    {\n      paramName: 'im_ref',\n      cookieName: 'vv_im_ref',\n      captureMode: 'first-touch'\n    },\n    {\n      paramName: 'code',\n      cookieName: 'vv_code',\n      captureMode: 'last-touch'\n    },\n    {\n      paramName: 'mc_cid',\n      cookieName: 'vv_mc_cid',\n      captureMode: 'last-touch'\n    },\n    {\n      paramName: 'mc_eid',\n      cookieName: 'vv_mc_eid',\n      captureMode: 'last-touch'\n    }\n  ]\n\n  function getParam(name) {\n    try {\n      return new URL(window.location.href).searchParams.get(name)\n    } catch (e) {\n      return null\n    }\n  }\n\n  function getCookie(name) {\n    var m = document.cookie.match(\n      new RegExp(\n        '(?:^|; )' +\n          name.replace(/[.*+?^${}()|[\\\\]\\\\\\\\]/g, '\\\\$&') +\n          '=([^;]*)'\n      )\n    )\n    return m ? decodeURIComponent(m[1]) : null\n  }\n\n  function setCookie(name, value, maxAgeSeconds) {\n    if (!value) return\n    document.cookie =\n      name +\n      '=' +\n      encodeURIComponent(value) +\n      '; Max-Age=' +\n      String(maxAgeSeconds) +\n      '; Path=/' +\n      '; Secure' +\n      '; SameSite=Lax'\n  }\n\n  function captureParamFromLocation(config) {\n    var value = getParam(config.paramName)\n    if (!value) return\n    if (config.captureMode === 'first-touch' && getCookie(config.cookieName)) return\n    setCookie(config.cookieName, value, MAX_AGE_SECONDS)\n  }\n\n  function decorateUrlString(href) {\n    try {\n      var url = new URL(href, window.location.href)\n\n      if (url.protocol !== 'http:' && url.protocol !== 'https:') return null\n      if (url.hostname !== 'license.videovillage.com') return null\n\n      var changed = false\n\n      for (var i = 0; i < TRACKED_PARAMS.length; i++) {\n        var config = TRACKED_PARAMS[i]\n        var value = getCookie(config.cookieName)\n        if (!value) continue\n        if (url.searchParams.get(config.paramName)) continue\n\n        url.searchParams.set(config.paramName, value)\n        changed = true\n      }\n\n      return changed ? url.toString() : null\n    } catch (e) {\n      return null\n    }\n  }\n\n  function captureFromLocation() {\n    for (var i = 0; i < TRACKED_PARAMS.length; i++) {\n      captureParamFromLocation(TRACKED_PARAMS[i])\n    }\n  }\n\n  function decorateAllLinks() {\n    var links = document.querySelectorAll('a[href]')\n    for (var i = 0; i < links.length; i++) {\n      var a = links[i]\n      var decorated = decorateUrlString(a.getAttribute('href'))\n      if (decorated) a.setAttribute('href', decorated)\n    }\n  }\n\n  function decorateAnchorIfNeeded(a) {\n    if (!a) return\n    var decorated = decorateUrlString(a.getAttribute('href'))\n    if (decorated) a.setAttribute('href', decorated)\n  }\n\n  // Run on every Turbo visit.\n  document.addEventListener('turbo:load', function () {\n    captureFromLocation()\n    decorateAllLinks()\n  })\n\n  // If this bundle loads after the first `turbo:load`, still capture/decorate once.\n  captureFromLocation()\n  decorateAllLinks()\n\n  // Click-time decoration (capture phase) so we run before many other click handlers.\n  document.addEventListener(\n    'click',\n    function (e) {\n      var a = e.target && e.target.closest ? e.target.closest('a[href]') : null\n      decorateAnchorIfNeeded(a)\n    },\n    true\n  )\n\n  // Middle click / open-in-new-tab on some browsers triggers auxclick, not click.\n  document.addEventListener(\n    'auxclick',\n    function (e) {\n      var a = e.target && e.target.closest ? e.target.closest('a[href]') : null\n      decorateAnchorIfNeeded(a)\n    },\n    true\n  )\n})()\n","const FRAME_MS = 1000 / 24\nconst FADE_OUT_MS = 180\nconst BUTTON_SELECTOR = '.vvbutton:not(input)'\n\nfunction randomPercent() {\n  return `${Math.round(Math.random() * 10000) / 100}%`\n}\n\nfunction setRandomPlatePosition(button) {\n  button.style.setProperty('--vv-button-grain-x', randomPercent())\n  button.style.setProperty('--vv-button-grain-y', randomPercent())\n}\n\nfunction initButtonGrain(button) {\n  if (button.__vvButtonGrainInitialized) return\n\n  let hovering = false\n  let pressing = false\n  let intervalId = null\n  let fadeOutTimeoutId = null\n  const reducedMotionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n  const cleanups = []\n\n  function listen(target, eventName, handler) {\n    target.addEventListener(eventName, handler)\n    cleanups.push(function () {\n      target.removeEventListener(eventName, handler)\n    })\n  }\n\n  function shouldRun() {\n    return (hovering || pressing) && !reducedMotionQuery.matches\n  }\n\n  function clearFadeOutTimeout() {\n    if (!fadeOutTimeoutId) return\n    clearTimeout(fadeOutTimeoutId)\n    fadeOutTimeoutId = null\n  }\n\n  function clearTicker() {\n    if (!intervalId) return\n    clearInterval(intervalId)\n    intervalId = null\n  }\n\n  function stop(animateThroughFade) {\n    button.classList.remove('is-grain-active')\n    button.classList.remove('is-grain-pressed')\n\n    if (animateThroughFade && intervalId && !reducedMotionQuery.matches) {\n      clearFadeOutTimeout()\n      fadeOutTimeoutId = setTimeout(function () {\n        fadeOutTimeoutId = null\n        if (!shouldRun()) clearTicker()\n      }, FADE_OUT_MS)\n      return\n    }\n\n    clearFadeOutTimeout()\n    clearTicker()\n  }\n\n  function sync() {\n    if (!shouldRun()) {\n      stop(!reducedMotionQuery.matches)\n      return\n    }\n\n    clearFadeOutTimeout()\n    button.classList.add('is-grain-active')\n    button.classList.toggle('is-grain-pressed', pressing)\n    setRandomPlatePosition(button)\n\n    if (!intervalId) {\n      intervalId = setInterval(function () {\n        setRandomPlatePosition(button)\n      }, FRAME_MS)\n    }\n  }\n\n  listen(button, 'pointerenter', function () {\n    hovering = true\n    sync()\n  })\n\n  listen(button, 'pointerleave', function () {\n    hovering = false\n    sync()\n  })\n\n  listen(button, 'pointerdown', function () {\n    hovering = true\n    pressing = true\n    sync()\n  })\n\n  listen(button, 'pointerup', function () {\n    pressing = false\n    sync()\n  })\n\n  listen(window, 'pointerup', function () {\n    pressing = false\n    sync()\n  })\n\n  listen(button, 'pointercancel', function () {\n    pressing = false\n    sync()\n  })\n\n  listen(button, 'blur', function () {\n    hovering = false\n    pressing = false\n    stop(false)\n  })\n\n  if (reducedMotionQuery.addEventListener) {\n    reducedMotionQuery.addEventListener('change', sync)\n    cleanups.push(function () {\n      reducedMotionQuery.removeEventListener('change', sync)\n    })\n  } else {\n    reducedMotionQuery.addListener(sync)\n    cleanups.push(function () {\n      reducedMotionQuery.removeListener(sync)\n    })\n  }\n\n  button.__vvButtonGrainInitialized = true\n  button.__vvButtonGrainCleanup = function () {\n    stop(false)\n    while (cleanups.length) cleanups.pop()()\n    button.__vvButtonGrainInitialized = false\n    button.__vvButtonGrainCleanup = null\n  }\n}\n\nfunction initButtonGrainAll(root) {\n  const scope = root || document\n  scope.querySelectorAll(BUTTON_SELECTOR).forEach(initButtonGrain)\n}\n\ndocument.addEventListener('turbo:load', function () {\n  initButtonGrainAll(document)\n})\n\ndocument.addEventListener('turbo:before-cache', function () {\n  document.querySelectorAll(BUTTON_SELECTOR).forEach(function (button) {\n    if (button.__vvButtonGrainCleanup) button.__vvButtonGrainCleanup()\n  })\n})\n\nexport { initButtonGrain, initButtonGrainAll }\n","(()=>{\"use strict\";var t={792:(t,e,i)=>{i.d(e,{Z:()=>n});var s=i(609),o=i.n(s)()((function(t){return t[1]}));o.push([t.id,':host{--divider-width: 1px;--divider-color: #fff;--divider-shadow: none;--default-handle-width: 50px;--default-handle-color: #fff;--default-handle-opacity: 1;--default-handle-shadow: none;--handle-position-start: 50%;position:relative;display:inline-block;overflow:hidden;line-height:0;direction:ltr}@media screen and (-webkit-min-device-pixel-ratio: 0)and (min-resolution: 0.001dpcm){:host{outline-offset:1px}}:host(:focus){outline:2px solid -webkit-focus-ring-color}::slotted(*){-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none;user-drag:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.first{position:absolute;left:0;top:0;right:0;line-height:normal;font-size:100%;max-height:100%;height:100%;width:100%;--exposure: 50%;--keyboard-transition-time: 0ms;--default-transition-time: 0ms;--transition-time: var(--default-transition-time)}.first .first-overlay-container{position:relative;clip-path:inset(0 var(--exposure) 0 0);transition:clip-path var(--transition-time);height:100%}.first .first-overlay{overflow:hidden;height:100%}.first.focused{will-change:clip-path}.first.focused .first-overlay-container{will-change:clip-path}.second{position:relative}.handle-container{transform:translateX(50%);position:absolute;top:0;right:var(--exposure);height:100%;transition:right var(--transition-time),bottom var(--transition-time)}.focused .handle-container{will-change:right}.divider{position:absolute;height:100%;width:100%;left:0;top:0;display:flex;align-items:center;justify-content:center;flex-direction:column}.divider:after{content:\" \";display:block;height:100%;border-left-width:var(--divider-width);border-left-style:solid;border-left-color:var(--divider-color);box-shadow:var(--divider-shadow)}.handle{position:absolute;top:var(--handle-position-start);pointer-events:none;box-sizing:border-box;margin-left:1px;transform:translate(calc(-50% - 0.5px), -50%);line-height:0}.default-handle{width:var(--default-handle-width);opacity:var(--default-handle-opacity);transition:all 1s;filter:drop-shadow(var(--default-handle-shadow))}.default-handle path{stroke:var(--default-handle-color)}.vertical .first-overlay-container{clip-path:inset(0 0 var(--exposure) 0)}.vertical .handle-container{transform:translateY(50%);height:auto;top:unset;bottom:var(--exposure);width:100%;left:0;flex-direction:row}.vertical .divider:after{height:1px;width:100%;border-top-width:var(--divider-width);border-top-style:solid;border-top-color:var(--divider-color);border-left:0}.vertical .handle{top:auto;left:var(--handle-position-start);transform:translate(calc(-50% - 0.5px), -50%) rotate(90deg)}',\"\"]);const n=o},609:t=>{t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i=t(e);return e[2]?\"@media \".concat(e[2],\" {\").concat(i,\"}\"):i})).join(\"\")},e.i=function(t,i,s){\"string\"==typeof t&&(t=[[null,t,\"\"]]);var o={};if(s)for(var n=0;n<this.length;n++){var r=this[n][0];null!=r&&(o[r]=!0)}for(var a=0;a<t.length;a++){var d=[].concat(t[a]);s&&o[d[0]]||(i&&(d[2]?d[2]=\"\".concat(i,\" and \").concat(d[2]):d[2]=i),e.push(d))}},e}}},e={};function i(s){var o=e[s];if(void 0!==o)return o.exports;var n=e[s]={id:s,exports:{}};return t[s](n,n.exports,i),n.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var s in e)i.o(e,s)&&!i.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t=i(792);const e=\"rendered\",s=(t,e)=>{const i=t.getBoundingClientRect();let s,o;return\"mousedown\"===e.type?(s=e.clientX,o=e.clientY):(s=e.touches[0].clientX,o=e.touches[0].clientY),s>=i.x&&s<=i.x+i.width&&o>=i.y&&o<=i.y+i.height};let o;const n={ArrowLeft:-1,ArrowRight:1},r=[\"horizontal\",\"vertical\"],a=t=>({x:t.touches[0].pageX,y:t.touches[0].pageY}),d=t=>({x:t.pageX,y:t.pageY}),h=\"undefined\"!=typeof window&&(null===window||void 0===window?void 0:window.HTMLElement);\"undefined\"!=typeof window&&(window.document&&(o=document.createElement(\"template\"),o.innerHTML='<div class=\"second\" id=\"second\"> <slot name=\"second\"><slot name=\"before\"></slot></slot> </div> <div class=\"first\" id=\"first\"> <div class=\"first-overlay\"> <div class=\"first-overlay-container\" id=\"firstImageContainer\"> <slot name=\"first\"><slot name=\"after\"></slot></slot> </div> </div> <div class=\"handle-container\"> <div class=\"divider\"></div> <div class=\"handle\" id=\"handle\"> <slot name=\"handle\"> <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"default-handle\" viewBox=\"-8 -3 16 6\"> <path d=\"M -5 -2 L -7 0 L -5 2 M 5 -2 L 7 0 L 5 2\" fill=\"none\" vector-effect=\"non-scaling-stroke\"/> </svg> </slot> </div> </div> </div> '),window.customElements.define(\"img-comparison-slider\",class extends h{constructor(){super(),this.exposure=this.hasAttribute(\"value\")?parseFloat(this.getAttribute(\"value\")):50,this.slideOnHover=!1,this.slideDirection=\"horizontal\",this.keyboard=\"enabled\",this.isMouseDown=!1,this.animationDirection=0,this.isFocused=!1,this.dragByHandle=!1,this.onMouseMove=t=>{if(this.isMouseDown||this.slideOnHover){const e=d(t);this.slideToPage(e)}},this.bodyUserSelectStyle=\"\",this.bodyWebkitUserSelectStyle=\"\",this.onMouseDown=t=>{if(this.slideOnHover)return;if(this.handle&&!s(this.handleElement,t))return;t.preventDefault(),window.addEventListener(\"mousemove\",this.onMouseMove),window.addEventListener(\"mouseup\",this.onWindowMouseUp),this.isMouseDown=!0,this.enableTransition();const e=d(t);this.slideToPage(e),this.focus(),this.bodyUserSelectStyle=window.document.body.style.userSelect,this.bodyWebkitUserSelectStyle=window.document.body.style.webkitUserSelect,window.document.body.style.userSelect=\"none\",window.document.body.style.webkitUserSelect=\"none\"},this.onWindowMouseUp=()=>{this.isMouseDown=!1,window.document.body.style.userSelect=this.bodyUserSelectStyle,window.document.body.style.webkitUserSelect=this.bodyWebkitUserSelectStyle,window.removeEventListener(\"mousemove\",this.onMouseMove),window.removeEventListener(\"mouseup\",this.onWindowMouseUp)},this.touchStartPoint=null,this.isTouchComparing=!1,this.hasTouchMoved=!1,this.onTouchStart=t=>{this.dragByHandle&&!s(this.handleElement,t)||(this.touchStartPoint=a(t),this.isFocused&&(this.enableTransition(),this.slideToPage(this.touchStartPoint)))},this.onTouchMove=t=>{if(null===this.touchStartPoint)return;const e=a(t);if(this.isTouchComparing)return this.slideToPage(e),t.preventDefault(),!1;if(!this.hasTouchMoved){const i=Math.abs(e.y-this.touchStartPoint.y),s=Math.abs(e.x-this.touchStartPoint.x);if(\"horizontal\"===this.slideDirection&&i<s||\"vertical\"===this.slideDirection&&i>s)return this.isTouchComparing=!0,this.focus(),this.slideToPage(e),t.preventDefault(),!1;this.hasTouchMoved=!0}},this.onTouchEnd=()=>{this.isTouchComparing=!1,this.hasTouchMoved=!1,this.touchStartPoint=null},this.onBlur=()=>{this.stopSlideAnimation(),this.isFocused=!1,this.firstElement.classList.remove(\"focused\")},this.onFocus=()=>{this.isFocused=!0,this.firstElement.classList.add(\"focused\")},this.onKeyDown=t=>{if(\"disabled\"===this.keyboard)return;const e=n[t.key];this.animationDirection!==e&&void 0!==e&&(this.animationDirection=e,this.startSlideAnimation())},this.onKeyUp=t=>{if(\"disabled\"===this.keyboard)return;const e=n[t.key];void 0!==e&&this.animationDirection===e&&this.stopSlideAnimation()},this.resetDimensions=()=>{this.imageWidth=this.offsetWidth,this.imageHeight=this.offsetHeight};const e=this.attachShadow({mode:\"open\"}),i=new CSSStyleSheet;i.replaceSync(t.Z),e.adoptedStyleSheets=[i],e.appendChild(o.content.cloneNode(!0)),this.firstElement=e.getElementById(\"first\"),this.handleElement=e.getElementById(\"handle\")}set handle(t){this.dragByHandle=\"false\"!==t.toString().toLowerCase()}get handle(){return this.dragByHandle}get value(){return this.exposure}set value(t){const e=parseFloat(t);e!==this.exposure&&(this.exposure=e,this.enableTransition(),this.setExposure())}get hover(){return this.slideOnHover}set hover(t){this.slideOnHover=\"false\"!==t.toString().toLowerCase(),this.removeEventListener(\"mousemove\",this.onMouseMove),this.slideOnHover&&this.addEventListener(\"mousemove\",this.onMouseMove)}get direction(){return this.slideDirection}set direction(t){this.slideDirection=t.toString().toLowerCase(),this.slide(0),this.firstElement.classList.remove(...r),r.includes(this.slideDirection)&&this.firstElement.classList.add(this.slideDirection)}static get observedAttributes(){return[\"hover\",\"direction\"]}connectedCallback(){this.hasAttribute(\"tabindex\")||(this.tabIndex=0),this.addEventListener(\"dragstart\",(t=>(t.preventDefault(),!1))),new ResizeObserver(this.resetDimensions).observe(this),this.setExposure(0),this.keyboard=this.hasAttribute(\"keyboard\")&&\"disabled\"===this.getAttribute(\"keyboard\")?\"disabled\":\"enabled\",this.addEventListener(\"keydown\",this.onKeyDown),this.addEventListener(\"keyup\",this.onKeyUp),this.addEventListener(\"focus\",this.onFocus),this.addEventListener(\"blur\",this.onBlur),this.addEventListener(\"touchstart\",this.onTouchStart,{passive:!0}),this.addEventListener(\"touchmove\",this.onTouchMove,{passive:!1}),this.addEventListener(\"touchend\",this.onTouchEnd),this.addEventListener(\"mousedown\",this.onMouseDown),this.handle=this.hasAttribute(\"handle\")?this.getAttribute(\"handle\"):this.dragByHandle,this.hover=this.hasAttribute(\"hover\")?this.getAttribute(\"hover\"):this.slideOnHover,this.direction=this.hasAttribute(\"direction\")?this.getAttribute(\"direction\"):this.slideDirection,this.resetDimensions(),this.classList.contains(e)||this.classList.add(e)}disconnectedCallback(){this.transitionTimer&&window.clearTimeout(this.transitionTimer)}attributeChangedCallback(t,e,i){\"hover\"===t&&(this.hover=i),\"direction\"===t&&(this.direction=i),\"keyboard\"===t&&(this.keyboard=\"disabled\"===i?\"disabled\":\"enabled\")}setExposure(t=0){var e;this.exposure=(100,(e=this.exposure+t)<0?0:e>100?100:e),this.firstElement.style.setProperty(\"--exposure\",100-this.exposure+\"%\")}slide(t=0){this.setExposure(t);const e=new Event(\"slide\");this.dispatchEvent(e)}slideToPage(t){\"horizontal\"===this.slideDirection&&this.slideToPageX(t.x),\"vertical\"===this.slideDirection&&this.slideToPageY(t.y)}slideToPageX(t){const e=t-this.getBoundingClientRect().left-window.scrollX;this.exposure=e/this.imageWidth*100,this.slide(0)}slideToPageY(t){const e=t-this.getBoundingClientRect().top-window.scrollY;this.exposure=e/this.imageHeight*100,this.slide(0)}enableTransition(){this.firstElement.style.setProperty(\"--transition-time\",\"100ms\"),this.transitionTimer=window.setTimeout((()=>{this.firstElement.style.setProperty(\"--transition-time\",\"var(--default-transition-time)\"),this.transitionTimer=null}),100)}startSlideAnimation(){let t=null,e=this.animationDirection;this.firstElement.style.setProperty(\"--transition-time\",\"var(--keyboard-transition-time)\");const i=s=>{if(0===this.animationDirection||e!==this.animationDirection)return;null===t&&(t=s);const o=(s-t)/16.666666666666668*this.animationDirection;this.slide(o),setTimeout((()=>window.requestAnimationFrame(i)),0),t=s};window.requestAnimationFrame(i)}stopSlideAnimation(){this.animationDirection=0,this.firstElement.style.setProperty(\"--transition-time\",\"var(--default-transition-time)\")}}))})()})();\n//# sourceMappingURL=index.js.map","/*!\nTurbo 8.0.23\nCopyright © 2026 37signals LLC\n */\nconst FrameLoadingStyle = {\n  eager: \"eager\",\n  lazy: \"lazy\"\n};\n\n/**\n * Contains a fragment of HTML which is updated based on navigation within\n * it (e.g. via links or form submissions).\n *\n * @customElement turbo-frame\n * @example\n *   <turbo-frame id=\"messages\">\n *     <a href=\"/messages/expanded\">\n *       Show all expanded messages in this frame.\n *     </a>\n *\n *     <form action=\"/messages\">\n *       Show response from this form within this frame.\n *     </form>\n *   </turbo-frame>\n */\nclass FrameElement extends HTMLElement {\n  static delegateConstructor = undefined\n\n  loaded = Promise.resolve()\n\n  static get observedAttributes() {\n    return [\"disabled\", \"loading\", \"src\"]\n  }\n\n  constructor() {\n    super();\n    this.delegate = new FrameElement.delegateConstructor(this);\n  }\n\n  connectedCallback() {\n    this.delegate.connect();\n  }\n\n  disconnectedCallback() {\n    this.delegate.disconnect();\n  }\n\n  reload() {\n    return this.delegate.sourceURLReloaded()\n  }\n\n  attributeChangedCallback(name) {\n    if (name == \"loading\") {\n      this.delegate.loadingStyleChanged();\n    } else if (name == \"src\") {\n      this.delegate.sourceURLChanged();\n    } else if (name == \"disabled\") {\n      this.delegate.disabledChanged();\n    }\n  }\n\n  /**\n   * Gets the URL to lazily load source HTML from\n   */\n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  /**\n   * Sets the URL to lazily load source HTML from\n   */\n  set src(value) {\n    if (value) {\n      this.setAttribute(\"src\", value);\n    } else {\n      this.removeAttribute(\"src\");\n    }\n  }\n\n  /**\n   * Gets the refresh mode for the frame.\n   */\n  get refresh() {\n    return this.getAttribute(\"refresh\")\n  }\n\n  /**\n   * Sets the refresh mode for the frame.\n   */\n  set refresh(value) {\n    if (value) {\n      this.setAttribute(\"refresh\", value);\n    } else {\n      this.removeAttribute(\"refresh\");\n    }\n  }\n\n  get shouldReloadWithMorph() {\n    return this.src && this.refresh === \"morph\"\n  }\n\n  /**\n   * Determines if the element is loading\n   */\n  get loading() {\n    return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\")\n  }\n\n  /**\n   * Sets the value of if the element is loading\n   */\n  set loading(value) {\n    if (value) {\n      this.setAttribute(\"loading\", value);\n    } else {\n      this.removeAttribute(\"loading\");\n    }\n  }\n\n  /**\n   * Gets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  get disabled() {\n    return this.hasAttribute(\"disabled\")\n  }\n\n  /**\n   * Sets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  set disabled(value) {\n    if (value) {\n      this.setAttribute(\"disabled\", \"\");\n    } else {\n      this.removeAttribute(\"disabled\");\n    }\n  }\n\n  /**\n   * Gets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  get autoscroll() {\n    return this.hasAttribute(\"autoscroll\")\n  }\n\n  /**\n   * Sets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  set autoscroll(value) {\n    if (value) {\n      this.setAttribute(\"autoscroll\", \"\");\n    } else {\n      this.removeAttribute(\"autoscroll\");\n    }\n  }\n\n  /**\n   * Determines if the element has finished loading\n   */\n  get complete() {\n    return !this.delegate.isLoading\n  }\n\n  /**\n   * Gets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isActive() {\n    return this.ownerDocument === document && !this.isPreview\n  }\n\n  /**\n   * Sets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isPreview() {\n    return this.ownerDocument?.documentElement?.hasAttribute(\"data-turbo-preview\")\n  }\n}\n\nfunction frameLoadingStyleFromString(style) {\n  switch (style.toLowerCase()) {\n    case \"lazy\":\n      return FrameLoadingStyle.lazy\n    default:\n      return FrameLoadingStyle.eager\n  }\n}\n\nconst drive = {\n  enabled: true,\n  progressBarDelay: 500,\n  unvisitableExtensions: new Set(\n    [\n      \".7z\", \".aac\", \".apk\", \".avi\", \".bmp\", \".bz2\", \".css\", \".csv\", \".deb\", \".dmg\", \".doc\",\n      \".docx\", \".exe\", \".gif\", \".gz\", \".heic\", \".heif\", \".ico\", \".iso\", \".jpeg\", \".jpg\",\n      \".js\", \".json\", \".m4a\", \".mkv\", \".mov\", \".mp3\", \".mp4\", \".mpeg\", \".mpg\", \".msi\",\n      \".ogg\", \".ogv\", \".pdf\", \".pkg\", \".png\", \".ppt\", \".pptx\", \".rar\", \".rtf\",\n      \".svg\", \".tar\", \".tif\", \".tiff\", \".txt\", \".wav\", \".webm\", \".webp\", \".wma\", \".wmv\",\n      \".xls\", \".xlsx\", \".xml\", \".zip\"\n    ]\n  )\n};\n\nfunction activateScriptElement(element) {\n  if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n    return element\n  } else {\n    const createdScriptElement = document.createElement(\"script\");\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      createdScriptElement.nonce = cspNonce;\n    }\n    createdScriptElement.textContent = element.textContent;\n    createdScriptElement.async = false;\n    copyElementAttributes(createdScriptElement, element);\n    return createdScriptElement\n  }\n}\n\nfunction copyElementAttributes(destinationElement, sourceElement) {\n  for (const { name, value } of sourceElement.attributes) {\n    destinationElement.setAttribute(name, value);\n  }\n}\n\nfunction createDocumentFragment(html) {\n  const template = document.createElement(\"template\");\n  template.innerHTML = html;\n  return template.content\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n  const event = new CustomEvent(eventName, {\n    cancelable,\n    bubbles: true,\n    composed: true,\n    detail\n  });\n\n  if (target && target.isConnected) {\n    target.dispatchEvent(event);\n  } else {\n    document.documentElement.dispatchEvent(event);\n  }\n\n  return event\n}\n\nfunction cancelEvent(event) {\n  event.preventDefault();\n  event.stopImmediatePropagation();\n}\n\nfunction nextRepaint() {\n  if (document.visibilityState === \"hidden\") {\n    return nextEventLoopTick()\n  } else {\n    return nextAnimationFrame()\n  }\n}\n\nfunction nextAnimationFrame() {\n  return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction nextEventLoopTick() {\n  return new Promise((resolve) => setTimeout(() => resolve(), 0))\n}\n\nfunction parseHTMLDocument(html = \"\") {\n  return new DOMParser().parseFromString(html, \"text/html\")\n}\n\nfunction unindent(strings, ...values) {\n  const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n  const match = lines[0].match(/^\\s+/);\n  const indent = match ? match[0].length : 0;\n  return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nfunction interpolate(strings, values) {\n  return strings.reduce((result, string, i) => {\n    const value = values[i] == undefined ? \"\" : values[i];\n    return result + string + value\n  }, \"\")\n}\n\nfunction uuid() {\n  return Array.from({ length: 36 })\n    .map((_, i) => {\n      if (i == 8 || i == 13 || i == 18 || i == 23) {\n        return \"-\"\n      } else if (i == 14) {\n        return \"4\"\n      } else if (i == 19) {\n        return (Math.floor(Math.random() * 4) + 8).toString(16)\n      } else {\n        return Math.floor(Math.random() * 16).toString(16)\n      }\n    })\n    .join(\"\")\n}\n\nfunction getAttribute(attributeName, ...elements) {\n  for (const value of elements.map((element) => element?.getAttribute(attributeName))) {\n    if (typeof value == \"string\") return value\n  }\n\n  return null\n}\n\nfunction hasAttribute(attributeName, ...elements) {\n  return elements.some((element) => element && element.hasAttribute(attributeName))\n}\n\nfunction markAsBusy(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.setAttribute(\"busy\", \"\");\n    }\n    element.setAttribute(\"aria-busy\", \"true\");\n  }\n}\n\nfunction clearBusyState(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.removeAttribute(\"busy\");\n    }\n\n    element.removeAttribute(\"aria-busy\");\n  }\n}\n\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n  return new Promise((resolve) => {\n    const onComplete = () => {\n      element.removeEventListener(\"error\", onComplete);\n      element.removeEventListener(\"load\", onComplete);\n      resolve();\n    };\n\n    element.addEventListener(\"load\", onComplete, { once: true });\n    element.addEventListener(\"error\", onComplete, { once: true });\n    setTimeout(resolve, timeoutInMilliseconds);\n  })\n}\n\nfunction getHistoryMethodForAction(action) {\n  switch (action) {\n    case \"replace\":\n      return history.replaceState\n    case \"advance\":\n    case \"restore\":\n      return history.pushState\n  }\n}\n\nfunction isAction(action) {\n  return action == \"advance\" || action == \"replace\" || action == \"restore\"\n}\n\nfunction getVisitAction(...elements) {\n  const action = getAttribute(\"data-turbo-action\", ...elements);\n\n  return isAction(action) ? action : null\n}\n\nfunction getMetaElement(name) {\n  return document.querySelector(`meta[name=\"${name}\"]`)\n}\n\nfunction getMetaContent(name) {\n  const element = getMetaElement(name);\n  return element && element.content\n}\n\nfunction getCspNonce() {\n  const element = getMetaElement(\"csp-nonce\");\n\n  if (element) {\n    const { nonce, content } = element;\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nfunction setMetaContent(name, content) {\n  let element = getMetaElement(name);\n\n  if (!element) {\n    element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", name);\n\n    document.head.appendChild(element);\n  }\n\n  element.setAttribute(\"content\", content);\n\n  return element\n}\n\nfunction findClosestRecursively(element, selector) {\n  if (element instanceof Element) {\n    return (\n      element.closest(selector) || findClosestRecursively(element.assignedSlot || element.getRootNode()?.host, selector)\n    )\n  }\n}\n\nfunction elementIsFocusable(element) {\n  const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n\n  return !!element && element.closest(inertDisabledOrHidden) == null && typeof element.focus == \"function\"\n}\n\nfunction queryAutofocusableElement(elementOrDocumentFragment) {\n  return Array.from(elementOrDocumentFragment.querySelectorAll(\"[autofocus]\")).find(elementIsFocusable)\n}\n\nasync function around(callback, reader) {\n  const before = reader();\n\n  callback();\n\n  await nextAnimationFrame();\n\n  const after = reader();\n\n  return [before, after]\n}\n\nfunction doesNotTargetIFrame(name) {\n  if (name === \"_blank\") {\n    return false\n  } else if (name) {\n    for (const element of document.getElementsByName(name)) {\n      if (element instanceof HTMLIFrameElement) return false\n    }\n\n    return true\n  } else {\n    return true\n  }\n}\n\nfunction findLinkFromClickTarget(target) {\n  const link = findClosestRecursively(target, \"a[href], a[xlink\\\\:href]\");\n\n  if (!link) return null\n  if (link.href.startsWith(\"#\")) return null\n  if (link.hasAttribute(\"download\")) return null\n\n  const linkTarget = link.getAttribute(\"target\");\n  if (linkTarget && linkTarget !== \"_self\") return null\n\n  return link\n}\n\nfunction debounce(fn, delay) {\n  let timeoutId = null;\n\n  return (...args) => {\n    const callback = () => fn.apply(this, args);\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(callback, delay);\n  }\n}\n\nconst submitter = {\n  \"aria-disabled\": {\n    beforeSubmit: submitter => {\n      submitter.setAttribute(\"aria-disabled\", \"true\");\n      submitter.addEventListener(\"click\", cancelEvent);\n    },\n\n    afterSubmit: submitter => {\n      submitter.removeAttribute(\"aria-disabled\");\n      submitter.removeEventListener(\"click\", cancelEvent);\n    }\n  },\n\n  \"disabled\": {\n    beforeSubmit: submitter => submitter.disabled = true,\n    afterSubmit: submitter => submitter.disabled = false\n  }\n};\n\nclass Config {\n  #submitter = null\n\n  constructor(config) {\n    Object.assign(this, config);\n  }\n\n  get submitter() {\n    return this.#submitter\n  }\n\n  set submitter(value) {\n    this.#submitter = submitter[value] || value;\n  }\n}\n\nconst forms = new Config({\n  mode: \"on\",\n  submitter: \"disabled\"\n});\n\nconst config = {\n  drive,\n  forms\n};\n\nfunction expandURL(locatable) {\n  return new URL(locatable.toString(), document.baseURI)\n}\n\nfunction getAnchor(url) {\n  let anchorMatch;\n  if (url.hash) {\n    return url.hash.slice(1)\n    // eslint-disable-next-line no-cond-assign\n  } else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n    return anchorMatch[1]\n  }\n}\n\nfunction getAction$1(form, submitter) {\n  const action = submitter?.getAttribute(\"formaction\") || form.getAttribute(\"action\") || form.action;\n\n  return expandURL(action)\n}\n\nfunction getExtension(url) {\n  return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\"\n}\n\nfunction isPrefixedBy(baseURL, url) {\n  const prefix = addTrailingSlash(url.origin + url.pathname);\n  return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix)\n}\n\nfunction locationIsVisitable(location, rootLocation) {\n  return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location))\n}\n\nfunction getLocationForLink(link) {\n  return expandURL(link.getAttribute(\"href\") || \"\")\n}\n\nfunction getRequestURL(url) {\n  const anchor = getAnchor(url);\n  return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href\n}\n\nfunction toCacheKey(url) {\n  return getRequestURL(url)\n}\n\nfunction urlsAreEqual(left, right) {\n  return expandURL(left).href == expandURL(right).href\n}\n\nfunction getPathComponents(url) {\n  return url.pathname.split(\"/\").slice(1)\n}\n\nfunction getLastPathComponent(url) {\n  return getPathComponents(url).slice(-1)[0]\n}\n\nfunction addTrailingSlash(value) {\n  return value.endsWith(\"/\") ? value : value + \"/\"\n}\n\nclass FetchResponse {\n  constructor(response) {\n    this.response = response;\n  }\n\n  get succeeded() {\n    return this.response.ok\n  }\n\n  get failed() {\n    return !this.succeeded\n  }\n\n  get clientError() {\n    return this.statusCode >= 400 && this.statusCode <= 499\n  }\n\n  get serverError() {\n    return this.statusCode >= 500 && this.statusCode <= 599\n  }\n\n  get redirected() {\n    return this.response.redirected\n  }\n\n  get location() {\n    return expandURL(this.response.url)\n  }\n\n  get isHTML() {\n    return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/)\n  }\n\n  get statusCode() {\n    return this.response.status\n  }\n\n  get contentType() {\n    return this.header(\"Content-Type\")\n  }\n\n  get responseText() {\n    return this.response.clone().text()\n  }\n\n  get responseHTML() {\n    if (this.isHTML) {\n      return this.response.clone().text()\n    } else {\n      return Promise.resolve(undefined)\n    }\n  }\n\n  header(name) {\n    return this.response.headers.get(name)\n  }\n}\n\nclass LimitedSet extends Set {\n  constructor(maxSize) {\n    super();\n    this.maxSize = maxSize;\n  }\n\n  add(value) {\n    if (this.size >= this.maxSize) {\n      const iterator = this.values();\n      const oldestValue = iterator.next().value;\n      this.delete(oldestValue);\n    }\n    super.add(value);\n  }\n}\n\nconst recentRequests = new LimitedSet(20);\n\nfunction fetchWithTurboHeaders(url, options = {}) {\n  const modifiedHeaders = new Headers(options.headers || {});\n  const requestUID = uuid();\n  recentRequests.add(requestUID);\n  modifiedHeaders.append(\"X-Turbo-Request-Id\", requestUID);\n\n  return window.fetch(url, {\n    ...options,\n    headers: modifiedHeaders\n  })\n}\n\nfunction fetchMethodFromString(method) {\n  switch (method.toLowerCase()) {\n    case \"get\":\n      return FetchMethod.get\n    case \"post\":\n      return FetchMethod.post\n    case \"put\":\n      return FetchMethod.put\n    case \"patch\":\n      return FetchMethod.patch\n    case \"delete\":\n      return FetchMethod.delete\n  }\n}\n\nconst FetchMethod = {\n  get: \"get\",\n  post: \"post\",\n  put: \"put\",\n  patch: \"patch\",\n  delete: \"delete\"\n};\n\nfunction fetchEnctypeFromString(encoding) {\n  switch (encoding.toLowerCase()) {\n    case FetchEnctype.multipart:\n      return FetchEnctype.multipart\n    case FetchEnctype.plain:\n      return FetchEnctype.plain\n    default:\n      return FetchEnctype.urlEncoded\n  }\n}\n\nconst FetchEnctype = {\n  urlEncoded: \"application/x-www-form-urlencoded\",\n  multipart: \"multipart/form-data\",\n  plain: \"text/plain\"\n};\n\nclass FetchRequest {\n  abortController = new AbortController()\n  #resolveRequestPromise = (_value) => {}\n\n  constructor(delegate, method, location, requestBody = new URLSearchParams(), target = null, enctype = FetchEnctype.urlEncoded) {\n    const [url, body] = buildResourceAndBody(expandURL(location), method, requestBody, enctype);\n\n    this.delegate = delegate;\n    this.url = url;\n    this.target = target;\n    this.fetchOptions = {\n      credentials: \"same-origin\",\n      redirect: \"follow\",\n      method: method.toUpperCase(),\n      headers: { ...this.defaultHeaders },\n      body: body,\n      signal: this.abortSignal,\n      referrer: this.delegate.referrer?.href\n    };\n    this.enctype = enctype;\n  }\n\n  get method() {\n    return this.fetchOptions.method\n  }\n\n  set method(value) {\n    const fetchBody = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData();\n    const fetchMethod = fetchMethodFromString(value) || FetchMethod.get;\n\n    this.url.search = \"\";\n\n    const [url, body] = buildResourceAndBody(this.url, fetchMethod, fetchBody, this.enctype);\n\n    this.url = url;\n    this.fetchOptions.body = body;\n    this.fetchOptions.method = fetchMethod.toUpperCase();\n  }\n\n  get headers() {\n    return this.fetchOptions.headers\n  }\n\n  set headers(value) {\n    this.fetchOptions.headers = value;\n  }\n\n  get body() {\n    if (this.isSafe) {\n      return this.url.searchParams\n    } else {\n      return this.fetchOptions.body\n    }\n  }\n\n  set body(value) {\n    this.fetchOptions.body = value;\n  }\n\n  get location() {\n    return this.url\n  }\n\n  get params() {\n    return this.url.searchParams\n  }\n\n  get entries() {\n    return this.body ? Array.from(this.body.entries()) : []\n  }\n\n  cancel() {\n    this.abortController.abort();\n  }\n\n  async perform() {\n    const { fetchOptions } = this;\n    this.delegate.prepareRequest(this);\n    const event = await this.#allowRequestToBeIntercepted(fetchOptions);\n    try {\n      this.delegate.requestStarted(this);\n\n      if (event.detail.fetchRequest) {\n        this.response = event.detail.fetchRequest.response;\n      } else {\n        this.response = fetchWithTurboHeaders(this.url.href, fetchOptions);\n      }\n\n      const response = await this.response;\n      return await this.receive(response)\n    } catch (error) {\n      if (error.name !== \"AbortError\") {\n        if (this.#willDelegateErrorHandling(error)) {\n          this.delegate.requestErrored(this, error);\n        }\n        throw error\n      }\n    } finally {\n      this.delegate.requestFinished(this);\n    }\n  }\n\n  async receive(response) {\n    const fetchResponse = new FetchResponse(response);\n    const event = dispatch(\"turbo:before-fetch-response\", {\n      cancelable: true,\n      detail: { fetchResponse },\n      target: this.target\n    });\n    if (event.defaultPrevented) {\n      this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n    } else if (fetchResponse.succeeded) {\n      this.delegate.requestSucceededWithResponse(this, fetchResponse);\n    } else {\n      this.delegate.requestFailedWithResponse(this, fetchResponse);\n    }\n    return fetchResponse\n  }\n\n  get defaultHeaders() {\n    return {\n      Accept: \"text/html, application/xhtml+xml\"\n    }\n  }\n\n  get isSafe() {\n    return isSafe(this.method)\n  }\n\n  get abortSignal() {\n    return this.abortController.signal\n  }\n\n  acceptResponseType(mimeType) {\n    this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n  }\n\n  async #allowRequestToBeIntercepted(fetchOptions) {\n    const requestInterception = new Promise((resolve) => (this.#resolveRequestPromise = resolve));\n    const event = dispatch(\"turbo:before-fetch-request\", {\n      cancelable: true,\n      detail: {\n        fetchOptions,\n        url: this.url,\n        resume: this.#resolveRequestPromise\n      },\n      target: this.target\n    });\n    this.url = event.detail.url;\n    if (event.defaultPrevented) await requestInterception;\n\n    return event\n  }\n\n  #willDelegateErrorHandling(error) {\n    const event = dispatch(\"turbo:fetch-request-error\", {\n      target: this.target,\n      cancelable: true,\n      detail: { request: this, error: error }\n    });\n\n    return !event.defaultPrevented\n  }\n}\n\nfunction isSafe(fetchMethod) {\n  return fetchMethodFromString(fetchMethod) == FetchMethod.get\n}\n\nfunction buildResourceAndBody(resource, method, requestBody, enctype) {\n  const searchParams =\n    Array.from(requestBody).length > 0 ? new URLSearchParams(entriesExcludingFiles(requestBody)) : resource.searchParams;\n\n  if (isSafe(method)) {\n    return [mergeIntoURLSearchParams(resource, searchParams), null]\n  } else if (enctype == FetchEnctype.urlEncoded) {\n    return [resource, searchParams]\n  } else {\n    return [resource, requestBody]\n  }\n}\n\nfunction entriesExcludingFiles(requestBody) {\n  const entries = [];\n\n  for (const [name, value] of requestBody) {\n    if (value instanceof File) continue\n    else entries.push([name, value]);\n  }\n\n  return entries\n}\n\nfunction mergeIntoURLSearchParams(url, requestBody) {\n  const searchParams = new URLSearchParams(entriesExcludingFiles(requestBody));\n\n  url.search = searchParams.toString();\n\n  return url\n}\n\nclass AppearanceObserver {\n  started = false\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n    this.intersectionObserver = new IntersectionObserver(this.intersect);\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      this.intersectionObserver.observe(this.element);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      this.intersectionObserver.unobserve(this.element);\n    }\n  }\n\n  intersect = (entries) => {\n    const lastEntry = entries.slice(-1)[0];\n    if (lastEntry?.isIntersecting) {\n      this.delegate.elementAppearedInViewport(this.element);\n    }\n  }\n}\n\nclass StreamMessage {\n  static contentType = \"text/vnd.turbo-stream.html\"\n\n  static wrap(message) {\n    if (typeof message == \"string\") {\n      return new this(createDocumentFragment(message))\n    } else {\n      return message\n    }\n  }\n\n  constructor(fragment) {\n    this.fragment = importStreamElements(fragment);\n  }\n}\n\nfunction importStreamElements(fragment) {\n  for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n    const streamElement = document.importNode(element, true);\n\n    for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n      inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n    }\n\n    element.replaceWith(streamElement);\n  }\n\n  return fragment\n}\n\nconst identity = key => key;\n\nclass LRUCache {\n  keys = []\n  entries = {}\n  #toCacheKey\n\n  constructor(size, toCacheKey = identity) {\n    this.size = size;\n    this.#toCacheKey = toCacheKey;\n  }\n\n  has(key) {\n    return this.#toCacheKey(key) in this.entries\n  }\n\n  get(key) {\n    if (this.has(key)) {\n      const entry = this.read(key);\n      this.touch(key);\n      return entry\n    }\n  }\n\n  put(key, entry) {\n    this.write(key, entry);\n    this.touch(key);\n    return entry\n  }\n\n  clear() {\n    for (const key of Object.keys(this.entries)) {\n      this.evict(key);\n    }\n  }\n\n  // Private\n\n  read(key) {\n    return this.entries[this.#toCacheKey(key)]\n  }\n\n  write(key, entry) {\n    this.entries[this.#toCacheKey(key)] = entry;\n  }\n\n  touch(key) {\n    key = this.#toCacheKey(key);\n    const index = this.keys.indexOf(key);\n    if (index > -1) this.keys.splice(index, 1);\n    this.keys.unshift(key);\n    this.trim();\n  }\n\n  trim() {\n    for (const key of this.keys.splice(this.size)) {\n      this.evict(key);\n    }\n  }\n\n  evict(key) {\n    delete this.entries[key];\n  }\n}\n\nconst PREFETCH_DELAY = 100;\n\nclass PrefetchCache extends LRUCache {\n  #prefetchTimeout = null\n  #maxAges = {}\n\n  constructor(size = 1, prefetchDelay = PREFETCH_DELAY) {\n    super(size, toCacheKey);\n    this.prefetchDelay = prefetchDelay;\n  }\n\n  putLater(url, request, ttl) {\n    this.#prefetchTimeout = setTimeout(() => {\n      request.perform();\n      this.put(url, request, ttl);\n      this.#prefetchTimeout = null;\n    }, this.prefetchDelay);\n  }\n\n  put(url, request, ttl = cacheTtl) {\n    super.put(url, request);\n    this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl);\n  }\n\n  clear() {\n    super.clear();\n    if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout);\n  }\n\n  evict(key) {\n    super.evict(key);\n    delete this.#maxAges[key];\n  }\n\n  has(key) {\n    if (super.has(key)) {\n      const maxAge = this.#maxAges[toCacheKey(key)];\n\n      return maxAge && maxAge > Date.now()\n    } else {\n      return false\n    }\n  }\n}\n\nconst cacheTtl = 10 * 1000;\nconst prefetchCache = new PrefetchCache();\n\nconst FormSubmissionState = {\n  initialized: \"initialized\",\n  requesting: \"requesting\",\n  waiting: \"waiting\",\n  receiving: \"receiving\",\n  stopping: \"stopping\",\n  stopped: \"stopped\"\n};\n\nclass FormSubmission {\n  state = FormSubmissionState.initialized\n\n  static confirmMethod(message) {\n    return Promise.resolve(confirm(message))\n  }\n\n  constructor(delegate, formElement, submitter, mustRedirect = false) {\n    const method = getMethod(formElement, submitter);\n    const action = getAction(getFormAction(formElement, submitter), method);\n    const body = buildFormData(formElement, submitter);\n    const enctype = getEnctype(formElement, submitter);\n\n    this.delegate = delegate;\n    this.formElement = formElement;\n    this.submitter = submitter;\n    this.fetchRequest = new FetchRequest(this, method, action, body, formElement, enctype);\n    this.mustRedirect = mustRedirect;\n  }\n\n  get method() {\n    return this.fetchRequest.method\n  }\n\n  set method(value) {\n    this.fetchRequest.method = value;\n  }\n\n  get action() {\n    return this.fetchRequest.url.toString()\n  }\n\n  set action(value) {\n    this.fetchRequest.url = expandURL(value);\n  }\n\n  get body() {\n    return this.fetchRequest.body\n  }\n\n  get enctype() {\n    return this.fetchRequest.enctype\n  }\n\n  get isSafe() {\n    return this.fetchRequest.isSafe\n  }\n\n  get location() {\n    return this.fetchRequest.url\n  }\n\n  // The submission process\n\n  async start() {\n    const { initialized, requesting } = FormSubmissionState;\n    const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n\n    if (typeof confirmationMessage === \"string\") {\n      const confirmMethod = typeof config.forms.confirm === \"function\" ?\n        config.forms.confirm :\n        FormSubmission.confirmMethod;\n\n      const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter);\n      if (!answer) {\n        return\n      }\n    }\n\n    if (this.state == initialized) {\n      this.state = requesting;\n      return this.fetchRequest.perform()\n    }\n  }\n\n  stop() {\n    const { stopping, stopped } = FormSubmissionState;\n    if (this.state != stopping && this.state != stopped) {\n      this.state = stopping;\n      this.fetchRequest.cancel();\n      return true\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (!request.isSafe) {\n      const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n      if (token) {\n        request.headers[\"X-CSRF-Token\"] = token;\n      }\n    }\n\n    if (this.requestAcceptsTurboStreamResponse(request)) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    this.state = FormSubmissionState.waiting;\n    if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter);\n    this.setSubmitsWith();\n    markAsBusy(this.formElement);\n    dispatch(\"turbo:submit-start\", {\n      target: this.formElement,\n      detail: { formSubmission: this }\n    });\n    this.delegate.formSubmissionStarted(this);\n  }\n\n  requestPreventedHandlingResponse(request, response) {\n    prefetchCache.clear();\n\n    this.result = { success: response.succeeded, fetchResponse: response };\n  }\n\n  requestSucceededWithResponse(request, response) {\n    if (response.clientError || response.serverError) {\n      this.delegate.formSubmissionFailedWithResponse(this, response);\n      return\n    }\n\n    prefetchCache.clear();\n\n    if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n      const error = new Error(\"Form responses must redirect to another location\");\n      this.delegate.formSubmissionErrored(this, error);\n    } else {\n      this.state = FormSubmissionState.receiving;\n      this.result = { success: true, fetchResponse: response };\n      this.delegate.formSubmissionSucceededWithResponse(this, response);\n    }\n  }\n\n  requestFailedWithResponse(request, response) {\n    this.result = { success: false, fetchResponse: response };\n    this.delegate.formSubmissionFailedWithResponse(this, response);\n  }\n\n  requestErrored(request, error) {\n    this.result = { success: false, error };\n    this.delegate.formSubmissionErrored(this, error);\n  }\n\n  requestFinished(_request) {\n    this.state = FormSubmissionState.stopped;\n    if (this.submitter) config.forms.submitter.afterSubmit(this.submitter);\n    this.resetSubmitterText();\n    clearBusyState(this.formElement);\n    dispatch(\"turbo:submit-end\", {\n      target: this.formElement,\n      detail: { formSubmission: this, ...this.result }\n    });\n    this.delegate.formSubmissionFinished(this);\n  }\n\n  // Private\n\n  setSubmitsWith() {\n    if (!this.submitter || !this.submitsWith) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.originalSubmitText = this.submitter.innerHTML;\n      this.submitter.innerHTML = this.submitsWith;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      this.originalSubmitText = input.value;\n      input.value = this.submitsWith;\n    }\n  }\n\n  resetSubmitterText() {\n    if (!this.submitter || !this.originalSubmitText) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.submitter.innerHTML = this.originalSubmitText;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      input.value = this.originalSubmitText;\n    }\n  }\n\n  requestMustRedirect(request) {\n    return !request.isSafe && this.mustRedirect\n  }\n\n  requestAcceptsTurboStreamResponse(request) {\n    return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement)\n  }\n\n  get submitsWith() {\n    return this.submitter?.getAttribute(\"data-turbo-submits-with\")\n  }\n}\n\nfunction buildFormData(formElement, submitter) {\n  const formData = new FormData(formElement);\n  const name = submitter?.getAttribute(\"name\");\n  const value = submitter?.getAttribute(\"value\");\n\n  if (name) {\n    formData.append(name, value || \"\");\n  }\n\n  return formData\n}\n\nfunction getCookieValue(cookieName) {\n  if (cookieName != null) {\n    const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n    const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n    if (cookie) {\n      const value = cookie.split(\"=\").slice(1).join(\"=\");\n      return value ? decodeURIComponent(value) : undefined\n    }\n  }\n}\n\nfunction responseSucceededWithoutRedirect(response) {\n  return response.statusCode == 200 && !response.redirected\n}\n\nfunction getFormAction(formElement, submitter) {\n  const formElementAction = typeof formElement.action === \"string\" ? formElement.action : null;\n\n  if (submitter?.hasAttribute(\"formaction\")) {\n    return submitter.getAttribute(\"formaction\") || \"\"\n  } else {\n    return formElement.getAttribute(\"action\") || formElementAction || \"\"\n  }\n}\n\nfunction getAction(formAction, fetchMethod) {\n  const action = expandURL(formAction);\n\n  if (isSafe(fetchMethod)) {\n    action.search = \"\";\n  }\n\n  return action\n}\n\nfunction getMethod(formElement, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || formElement.getAttribute(\"method\") || \"\";\n  return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get\n}\n\nfunction getEnctype(formElement, submitter) {\n  return fetchEnctypeFromString(submitter?.getAttribute(\"formenctype\") || formElement.enctype)\n}\n\nclass Snapshot {\n  constructor(element) {\n    this.element = element;\n  }\n\n  get activeElement() {\n    return this.element.ownerDocument.activeElement\n  }\n\n  get children() {\n    return [...this.element.children]\n  }\n\n  hasAnchor(anchor) {\n    return this.getElementForAnchor(anchor) != null\n  }\n\n  getElementForAnchor(anchor) {\n    return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null\n  }\n\n  get isConnected() {\n    return this.element.isConnected\n  }\n\n  get firstAutofocusableElement() {\n    return queryAutofocusableElement(this.element)\n  }\n\n  get permanentElements() {\n    return queryPermanentElementsAll(this.element)\n  }\n\n  getPermanentElementById(id) {\n    return getPermanentElementById(this.element, id)\n  }\n\n  getPermanentElementMapForSnapshot(snapshot) {\n    const permanentElementMap = {};\n\n    for (const currentPermanentElement of this.permanentElements) {\n      const { id } = currentPermanentElement;\n      const newPermanentElement = snapshot.getPermanentElementById(id);\n      if (newPermanentElement) {\n        permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n      }\n    }\n\n    return permanentElementMap\n  }\n}\n\nfunction getPermanentElementById(node, id) {\n  return node.querySelector(`#${id}[data-turbo-permanent]`)\n}\n\nfunction queryPermanentElementsAll(node) {\n  return node.querySelectorAll(\"[id][data-turbo-permanent]\")\n}\n\nclass FormSubmitObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n      this.started = false;\n    }\n  }\n\n  submitCaptured = () => {\n    this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n    this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n  }\n\n  submitBubbled = (event) => {\n    if (!event.defaultPrevented) {\n      const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n      const submitter = event.submitter || undefined;\n\n      if (\n        form &&\n        submissionDoesNotDismissDialog(form, submitter) &&\n        submissionDoesNotTargetIFrame(form, submitter) &&\n        this.delegate.willSubmitForm(form, submitter)\n      ) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        this.delegate.formSubmitted(form, submitter);\n      }\n    }\n  }\n}\n\nfunction submissionDoesNotDismissDialog(form, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || form.getAttribute(\"method\");\n\n  return method != \"dialog\"\n}\n\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n  const target = submitter?.getAttribute(\"formtarget\") || form.getAttribute(\"target\");\n\n  return doesNotTargetIFrame(target)\n}\n\nclass View {\n  #resolveRenderPromise = (_value) => {}\n  #resolveInterceptionPromise = (_value) => {}\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  // Scrolling\n\n  scrollToAnchor(anchor) {\n    const element = this.snapshot.getElementForAnchor(anchor);\n    if (element) {\n      this.focusElement(element);\n      this.scrollToElement(element);\n    } else {\n      this.scrollToPosition({ x: 0, y: 0 });\n    }\n  }\n\n  scrollToAnchorFromLocation(location) {\n    this.scrollToAnchor(getAnchor(location));\n  }\n\n  scrollToElement(element) {\n    element.scrollIntoView();\n  }\n\n  focusElement(element) {\n    if (element instanceof HTMLElement) {\n      if (element.hasAttribute(\"tabindex\")) {\n        element.focus();\n      } else {\n        element.setAttribute(\"tabindex\", \"-1\");\n        element.focus();\n        element.removeAttribute(\"tabindex\");\n      }\n    }\n  }\n\n  scrollToPosition({ x, y }) {\n    this.scrollRoot.scrollTo(x, y);\n  }\n\n  scrollToTop() {\n    this.scrollToPosition({ x: 0, y: 0 });\n  }\n\n  get scrollRoot() {\n    return window\n  }\n\n  // Rendering\n\n  async render(renderer) {\n    const { isPreview, shouldRender, willRender, newSnapshot: snapshot } = renderer;\n\n    // A workaround to ignore tracked element mismatch reloads when performing\n    // a promoted Visit from a frame navigation\n    const shouldInvalidate = willRender;\n\n    if (shouldRender) {\n      try {\n        this.renderPromise = new Promise((resolve) => (this.#resolveRenderPromise = resolve));\n        this.renderer = renderer;\n        await this.prepareToRenderSnapshot(renderer);\n\n        const renderInterception = new Promise((resolve) => (this.#resolveInterceptionPromise = resolve));\n        const options = { resume: this.#resolveInterceptionPromise, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod };\n        const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n        if (!immediateRender) await renderInterception;\n\n        await this.renderSnapshot(renderer);\n        this.delegate.viewRenderedSnapshot(snapshot, isPreview, this.renderer.renderMethod);\n        this.delegate.preloadOnLoadLinksForView(this.element);\n        this.finishRenderingSnapshot(renderer);\n      } finally {\n        delete this.renderer;\n        this.#resolveRenderPromise(undefined);\n        delete this.renderPromise;\n      }\n    } else if (shouldInvalidate) {\n      this.invalidate(renderer.reloadReason);\n    }\n  }\n\n  invalidate(reason) {\n    this.delegate.viewInvalidated(reason);\n  }\n\n  async prepareToRenderSnapshot(renderer) {\n    this.markAsPreview(renderer.isPreview);\n    await renderer.prepareToRender();\n  }\n\n  markAsPreview(isPreview) {\n    if (isPreview) {\n      this.element.setAttribute(\"data-turbo-preview\", \"\");\n    } else {\n      this.element.removeAttribute(\"data-turbo-preview\");\n    }\n  }\n\n  markVisitDirection(direction) {\n    this.element.setAttribute(\"data-turbo-visit-direction\", direction);\n  }\n\n  unmarkVisitDirection() {\n    this.element.removeAttribute(\"data-turbo-visit-direction\");\n  }\n\n  async renderSnapshot(renderer) {\n    await renderer.render();\n  }\n\n  finishRenderingSnapshot(renderer) {\n    renderer.finishRendering();\n  }\n}\n\nclass FrameView extends View {\n  missing() {\n    this.element.innerHTML = `<strong class=\"turbo-frame-error\">Content missing</strong>`;\n  }\n\n  get snapshot() {\n    return new Snapshot(this.element)\n  }\n}\n\nclass LinkInterceptor {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  start() {\n    this.element.addEventListener(\"click\", this.clickBubbled);\n    document.addEventListener(\"turbo:click\", this.linkClicked);\n    document.addEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  stop() {\n    this.element.removeEventListener(\"click\", this.clickBubbled);\n    document.removeEventListener(\"turbo:click\", this.linkClicked);\n    document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  clickBubbled = (event) => {\n    if (this.clickEventIsSignificant(event)) {\n      this.clickEvent = event;\n    } else {\n      delete this.clickEvent;\n    }\n  }\n\n  linkClicked = (event) => {\n    if (this.clickEvent && this.clickEventIsSignificant(event)) {\n      if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n        this.clickEvent.preventDefault();\n        event.preventDefault();\n        this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n      }\n    }\n    delete this.clickEvent;\n  }\n\n  willVisit = (_event) => {\n    delete this.clickEvent;\n  }\n\n  clickEventIsSignificant(event) {\n    const target = event.composed ? event.target?.parentElement : event.target;\n    const element = findLinkFromClickTarget(target) || target;\n\n    return element instanceof Element && element.closest(\"turbo-frame, html\") == this.element\n  }\n}\n\nclass LinkClickObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n      this.started = false;\n    }\n  }\n\n  clickCaptured = () => {\n    this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n    this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n  }\n\n  clickBubbled = (event) => {\n    if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n      const target = (event.composedPath && event.composedPath()[0]) || event.target;\n      const link = findLinkFromClickTarget(target);\n      if (link && doesNotTargetIFrame(link.target)) {\n        const location = getLocationForLink(link);\n        if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n          event.preventDefault();\n          this.delegate.followedLinkToLocation(link, location);\n        }\n      }\n    }\n  }\n\n  clickEventIsSignificant(event) {\n    return !(\n      (event.target && event.target.isContentEditable) ||\n      event.defaultPrevented ||\n      event.which > 1 ||\n      event.altKey ||\n      event.ctrlKey ||\n      event.metaKey ||\n      event.shiftKey\n    )\n  }\n}\n\nclass FormLinkClickObserver {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.linkInterceptor = new LinkClickObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n  }\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return false\n  }\n\n  prefetchAndCacheRequestToLocation(link, location) {\n    return\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, originalEvent) {\n    return (\n      this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n      (link.hasAttribute(\"data-turbo-method\") || link.hasAttribute(\"data-turbo-stream\"))\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const form = document.createElement(\"form\");\n\n    const type = \"hidden\";\n    for (const [name, value] of location.searchParams) {\n      form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n    }\n\n    const action = Object.assign(location, { search: \"\" });\n    form.setAttribute(\"data-turbo\", \"true\");\n    form.setAttribute(\"action\", action.href);\n    form.setAttribute(\"hidden\", \"\");\n\n    const method = link.getAttribute(\"data-turbo-method\");\n    if (method) form.setAttribute(\"method\", method);\n\n    const turboFrame = link.getAttribute(\"data-turbo-frame\");\n    if (turboFrame) form.setAttribute(\"data-turbo-frame\", turboFrame);\n\n    const turboAction = getVisitAction(link);\n    if (turboAction) form.setAttribute(\"data-turbo-action\", turboAction);\n\n    const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n    if (turboConfirm) form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n\n    const turboStream = link.hasAttribute(\"data-turbo-stream\");\n    if (turboStream) form.setAttribute(\"data-turbo-stream\", \"\");\n\n    this.delegate.submittedFormLinkToLocation(link, location, form);\n\n    document.body.appendChild(form);\n    form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n    requestAnimationFrame(() => form.requestSubmit());\n  }\n}\n\nclass Bardo {\n  static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n    const bardo = new this(delegate, permanentElementMap);\n    bardo.enter();\n    await callback();\n    bardo.leave();\n  }\n\n  constructor(delegate, permanentElementMap) {\n    this.delegate = delegate;\n    this.permanentElementMap = permanentElementMap;\n  }\n\n  enter() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n      this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n      this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n    }\n  }\n\n  leave() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement] = this.permanentElementMap[id];\n      this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n      this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n      this.delegate.leavingBardo(currentPermanentElement);\n    }\n  }\n\n  replaceNewPermanentElementWithPlaceholder(permanentElement) {\n    const placeholder = createPlaceholderForPermanentElement(permanentElement);\n    permanentElement.replaceWith(placeholder);\n  }\n\n  replaceCurrentPermanentElementWithClone(permanentElement) {\n    const clone = permanentElement.cloneNode(true);\n    permanentElement.replaceWith(clone);\n  }\n\n  replacePlaceholderWithPermanentElement(permanentElement) {\n    const placeholder = this.getPlaceholderById(permanentElement.id);\n    placeholder?.replaceWith(permanentElement);\n  }\n\n  getPlaceholderById(id) {\n    return this.placeholders.find((element) => element.content == id)\n  }\n\n  get placeholders() {\n    return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")]\n  }\n}\n\nfunction createPlaceholderForPermanentElement(permanentElement) {\n  const element = document.createElement(\"meta\");\n  element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n  element.setAttribute(\"content\", permanentElement.id);\n  return element\n}\n\nclass Renderer {\n  #activeElement = null\n\n  static renderElement(currentElement, newElement) {\n    // Abstract method\n  }\n\n  constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n    this.currentSnapshot = currentSnapshot;\n    this.newSnapshot = newSnapshot;\n    this.isPreview = isPreview;\n    this.willRender = willRender;\n    this.renderElement = this.constructor.renderElement;\n    this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  get shouldAutofocus() {\n    return true\n  }\n\n  get reloadReason() {\n    return\n  }\n\n  prepareToRender() {\n    return\n  }\n\n  render() {\n    // Abstract method\n  }\n\n  finishRendering() {\n    if (this.resolvingFunctions) {\n      this.resolvingFunctions.resolve();\n      delete this.resolvingFunctions;\n    }\n  }\n\n  async preservingPermanentElements(callback) {\n    await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n  }\n\n  focusFirstAutofocusableElement() {\n    if (this.shouldAutofocus) {\n      const element = this.connectedSnapshot.firstAutofocusableElement;\n      if (element) {\n        element.focus();\n      }\n    }\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement) {\n    if (this.#activeElement) return\n\n    if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n      this.#activeElement = this.currentSnapshot.activeElement;\n    }\n  }\n\n  leavingBardo(currentPermanentElement) {\n    if (currentPermanentElement.contains(this.#activeElement) && this.#activeElement instanceof HTMLElement) {\n      this.#activeElement.focus();\n\n      this.#activeElement = null;\n    }\n  }\n\n  get connectedSnapshot() {\n    return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot\n  }\n\n  get currentElement() {\n    return this.currentSnapshot.element\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  get permanentElementMap() {\n    return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)\n  }\n\n  get renderMethod() {\n    return \"replace\"\n  }\n}\n\nclass FrameRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const destinationRange = document.createRange();\n    destinationRange.selectNodeContents(currentElement);\n    destinationRange.deleteContents();\n\n    const frameElement = newElement;\n    const sourceRange = frameElement.ownerDocument?.createRange();\n    if (sourceRange) {\n      sourceRange.selectNodeContents(frameElement);\n      currentElement.appendChild(sourceRange.extractContents());\n    }\n  }\n\n  constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n    super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n    this.delegate = delegate;\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  async render() {\n    await nextRepaint();\n    this.preservingPermanentElements(() => {\n      this.loadFrameElement();\n    });\n    this.scrollFrameIntoView();\n    await nextRepaint();\n    this.focusFirstAutofocusableElement();\n    await nextRepaint();\n    this.activateScriptElements();\n  }\n\n  loadFrameElement() {\n    this.delegate.willRenderFrame(this.currentElement, this.newElement);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  scrollFrameIntoView() {\n    if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n      const element = this.currentElement.firstElementChild;\n      const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n      const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n\n      if (element) {\n        element.scrollIntoView({ block, behavior });\n        return true\n      }\n    }\n    return false\n  }\n\n  activateScriptElements() {\n    for (const inertScriptElement of this.newScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  get newScriptElements() {\n    return this.currentElement.querySelectorAll(\"script\")\n  }\n}\n\nfunction readScrollLogicalPosition(value, defaultValue) {\n  if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\nfunction readScrollBehavior(value, defaultValue) {\n  if (value == \"auto\" || value == \"smooth\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\n/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set<string>} persistentIds\n * @property {Map<Node, Set<string>>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n\n  /**\n   * @typedef {object} MorphContext\n   *\n   * @property {Element} target\n   * @property {Element} newContent\n   * @property {ConfigInternal} config\n   * @property {ConfigInternal['morphStyle']} morphStyle\n   * @property {ConfigInternal['ignoreActive']} ignoreActive\n   * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n   * @property {ConfigInternal['restoreFocus']} restoreFocus\n   * @property {Map<Node, Set<string>>} idMap\n   * @property {Set<string>} persistentIds\n   * @property {ConfigInternal['callbacks']} callbacks\n   * @property {ConfigInternal['head']} head\n   * @property {HTMLDivElement} pantry\n   * @property {Element[]} activeElementAndParents\n   */\n\n  //=============================================================================\n  // AND NOW IT BEGINS...\n  //=============================================================================\n\n  const noOp = () => {};\n  /**\n   * Default configuration values, updatable by users now\n   * @type {ConfigInternal}\n   */\n  const defaults = {\n    morphStyle: \"outerHTML\",\n    callbacks: {\n      beforeNodeAdded: noOp,\n      afterNodeAdded: noOp,\n      beforeNodeMorphed: noOp,\n      afterNodeMorphed: noOp,\n      beforeNodeRemoved: noOp,\n      afterNodeRemoved: noOp,\n      beforeAttributeUpdated: noOp,\n    },\n    head: {\n      style: \"merge\",\n      shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n      shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n      shouldRemove: noOp,\n      afterHeadMorphed: noOp,\n    },\n    restoreFocus: true,\n  };\n\n  /**\n   * Core idiomorph function for morphing one DOM tree to another\n   *\n   * @param {Element | Document} oldNode\n   * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n   * @param {Config} [config]\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function morph(oldNode, newContent, config = {}) {\n    oldNode = normalizeElement(oldNode);\n    const newNode = normalizeParent(newContent);\n    const ctx = createMorphContext(oldNode, newNode, config);\n\n    const morphedNodes = saveAndRestoreFocus(ctx, () => {\n      return withHeadBlocking(\n        ctx,\n        oldNode,\n        newNode,\n        /** @param {MorphContext} ctx */ (ctx) => {\n          if (ctx.morphStyle === \"innerHTML\") {\n            morphChildren(ctx, oldNode, newNode);\n            return Array.from(oldNode.childNodes);\n          } else {\n            return morphOuterHTML(ctx, oldNode, newNode);\n          }\n        },\n      );\n    });\n\n    ctx.pantry.remove();\n    return morphedNodes;\n  }\n\n  /**\n   * Morph just the outerHTML of the oldNode to the newContent\n   * We have to be careful because the oldNode could have siblings which need to be untouched\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @returns {Node[]}\n   */\n  function morphOuterHTML(ctx, oldNode, newNode) {\n    const oldParent = normalizeParent(oldNode);\n    morphChildren(\n      ctx,\n      oldParent,\n      newNode,\n      // these two optional params are the secret sauce\n      oldNode, // start point for iteration\n      oldNode.nextSibling, // end point for iteration\n    );\n    // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n    return Array.from(oldParent.childNodes);\n  }\n\n  /**\n   * @param {MorphContext} ctx\n   * @param {Function} fn\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function saveAndRestoreFocus(ctx, fn) {\n    if (!ctx.config.restoreFocus) return fn();\n    let activeElement =\n      /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n        document.activeElement\n      );\n\n    // don't bother if the active element is not an input or textarea\n    if (\n      !(\n        activeElement instanceof HTMLInputElement ||\n        activeElement instanceof HTMLTextAreaElement\n      )\n    ) {\n      return fn();\n    }\n\n    const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n    const results = fn();\n\n    if (\n      activeElementId &&\n      activeElementId !== document.activeElement?.getAttribute(\"id\")\n    ) {\n      activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n      activeElement?.focus();\n    }\n    if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n      activeElement.setSelectionRange(selectionStart, selectionEnd);\n    }\n\n    return results;\n  }\n\n  const morphChildren = (function () {\n    /**\n     * This is the core algorithm for matching up children.  The idea is to use id sets to try to match up\n     * nodes as faithfully as possible.  We greedily match, which allows us to keep the algorithm fast, but\n     * by using id sets, we are able to better match up with content deeper in the DOM.\n     *\n     * Basic algorithm:\n     * - for each node in the new content:\n     *   - search self and siblings for an id set match, falling back to a soft match\n     *   - if match found\n     *     - remove any nodes up to the match:\n     *       - pantry persistent nodes\n     *       - delete the rest\n     *     - morph the match\n     *   - elsif no match found, and node is persistent\n     *     - find its match by querying the old root (future) and pantry (past)\n     *     - move it and its children here\n     *     - morph it\n     *   - else\n     *     - create a new node from scratch as a last result\n     *\n     * @param {MorphContext} ctx the merge context\n     * @param {Element} oldParent the old content that we are merging the new content into\n     * @param {Element} newParent the parent element of the new content\n     * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n     * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n     */\n    function morphChildren(\n      ctx,\n      oldParent,\n      newParent,\n      insertionPoint = null,\n      endPoint = null,\n    ) {\n      // normalize\n      if (\n        oldParent instanceof HTMLTemplateElement &&\n        newParent instanceof HTMLTemplateElement\n      ) {\n        // @ts-ignore we can pretend the DocumentFragment is an Element\n        oldParent = oldParent.content;\n        // @ts-ignore ditto\n        newParent = newParent.content;\n      }\n      insertionPoint ||= oldParent.firstChild;\n\n      // run through all the new content\n      for (const newChild of newParent.childNodes) {\n        // once we reach the end of the old parent content skip to the end and insert the rest\n        if (insertionPoint && insertionPoint != endPoint) {\n          const bestMatch = findBestMatch(\n            ctx,\n            newChild,\n            insertionPoint,\n            endPoint,\n          );\n          if (bestMatch) {\n            // if the node to morph is not at the insertion point then remove/move up to it\n            if (bestMatch !== insertionPoint) {\n              removeNodesBetween(ctx, insertionPoint, bestMatch);\n            }\n            morphNode(bestMatch, newChild, ctx);\n            insertionPoint = bestMatch.nextSibling;\n            continue;\n          }\n        }\n\n        // if the matching node is elsewhere in the original content\n        if (newChild instanceof Element) {\n          // we can pretend the id is non-null because the next `.has` line will reject it if not\n          const newChildId = /** @type {String} */ (\n            newChild.getAttribute(\"id\")\n          );\n          if (ctx.persistentIds.has(newChildId)) {\n            // move it and all its children here and morph\n            const movedChild = moveBeforeById(\n              oldParent,\n              newChildId,\n              insertionPoint,\n              ctx,\n            );\n            morphNode(movedChild, newChild, ctx);\n            insertionPoint = movedChild.nextSibling;\n            continue;\n          }\n        }\n\n        // last resort: insert the new node from scratch\n        const insertedNode = createNode(\n          oldParent,\n          newChild,\n          insertionPoint,\n          ctx,\n        );\n        // could be null if beforeNodeAdded prevented insertion\n        if (insertedNode) {\n          insertionPoint = insertedNode.nextSibling;\n        }\n      }\n\n      // remove any remaining old nodes that didn't match up with new content\n      while (insertionPoint && insertionPoint != endPoint) {\n        const tempNode = insertionPoint;\n        insertionPoint = insertionPoint.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n    }\n\n    /**\n     * This performs the action of inserting a new node while handling situations where the node contains\n     * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n     *\n     * @param {Element} oldParent\n     * @param {Node} newChild\n     * @param {Node|null} insertionPoint\n     * @param {MorphContext} ctx\n     * @returns {Node|null}\n     */\n    function createNode(oldParent, newChild, insertionPoint, ctx) {\n      if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n      if (ctx.idMap.has(newChild)) {\n        // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n        const newEmptyChild = document.createElement(\n          /** @type {Element} */ (newChild).tagName,\n        );\n        oldParent.insertBefore(newEmptyChild, insertionPoint);\n        morphNode(newEmptyChild, newChild, ctx);\n        ctx.callbacks.afterNodeAdded(newEmptyChild);\n        return newEmptyChild;\n      } else {\n        // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n        const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n        oldParent.insertBefore(newClonedChild, insertionPoint);\n        ctx.callbacks.afterNodeAdded(newClonedChild);\n        return newClonedChild;\n      }\n    }\n\n    //=============================================================================\n    // Matching Functions\n    //=============================================================================\n    const findBestMatch = (function () {\n      /**\n       * Scans forward from the startPoint to the endPoint looking for a match\n       * for the node. It looks for an id set match first, then a soft match.\n       * We abort softmatching if we find two future soft matches, to reduce churn.\n       * @param {Node} node\n       * @param {MorphContext} ctx\n       * @param {Node | null} startPoint\n       * @param {Node | null} endPoint\n       * @returns {Node | null}\n       */\n      function findBestMatch(ctx, node, startPoint, endPoint) {\n        let softMatch = null;\n        let nextSibling = node.nextSibling;\n        let siblingSoftMatchCount = 0;\n\n        let cursor = startPoint;\n        while (cursor && cursor != endPoint) {\n          // soft matching is a prerequisite for id set matching\n          if (isSoftMatch(cursor, node)) {\n            if (isIdSetMatch(ctx, cursor, node)) {\n              return cursor; // found an id set match, we're done!\n            }\n\n            // we haven't yet saved a soft match fallback\n            if (softMatch === null) {\n              // the current soft match will hard match something else in the future, leave it\n              if (!ctx.idMap.has(cursor)) {\n                // save this as the fallback if we get through the loop without finding a hard match\n                softMatch = cursor;\n              }\n            }\n          }\n          if (\n            softMatch === null &&\n            nextSibling &&\n            isSoftMatch(cursor, nextSibling)\n          ) {\n            // The next new node has a soft match with this node, so\n            // increment the count of future soft matches\n            siblingSoftMatchCount++;\n            nextSibling = nextSibling.nextSibling;\n\n            // If there are two future soft matches, block soft matching for this node to allow\n            // future siblings to soft match. This is to reduce churn in the DOM when an element\n            // is prepended.\n            if (siblingSoftMatchCount >= 2) {\n              softMatch = undefined;\n            }\n          }\n\n          // if the current node contains active element, stop looking for better future matches,\n          // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n          // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion\n          if (ctx.activeElementAndParents.includes(cursor)) break;\n\n          cursor = cursor.nextSibling;\n        }\n\n        return softMatch || null;\n      }\n\n      /**\n       *\n       * @param {MorphContext} ctx\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isIdSetMatch(ctx, oldNode, newNode) {\n        let oldSet = ctx.idMap.get(oldNode);\n        let newSet = ctx.idMap.get(newNode);\n\n        if (!newSet || !oldSet) return false;\n\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /**\n       *\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isSoftMatch(oldNode, newNode) {\n        // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        return (\n          oldElt.nodeType === newElt.nodeType &&\n          oldElt.tagName === newElt.tagName &&\n          // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n          // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n          // its not persistent, and new nodes can't have any hidden state.\n          // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment\n          (!oldElt.getAttribute?.(\"id\") ||\n            oldElt.getAttribute?.(\"id\") === newElt.getAttribute?.(\"id\"))\n        );\n      }\n\n      return findBestMatch;\n    })();\n\n    //=============================================================================\n    // DOM Manipulation Functions\n    //=============================================================================\n\n    /**\n     * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n     * - Persistent nodes will be moved to the pantry for later reuse\n     * - Other nodes will have their hooks called, and then are removed\n     * @param {MorphContext} ctx\n     * @param {Node} node\n     */\n    function removeNode(ctx, node) {\n      // are we going to id set match this later?\n      if (ctx.idMap.has(node)) {\n        // skip callbacks and move to pantry\n        moveBefore(ctx.pantry, node, null);\n      } else {\n        // remove for realsies\n        if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n        node.parentNode?.removeChild(node);\n        ctx.callbacks.afterNodeRemoved(node);\n      }\n    }\n\n    /**\n     * Remove nodes between the start and end nodes\n     * @param {MorphContext} ctx\n     * @param {Node} startInclusive\n     * @param {Node} endExclusive\n     * @returns {Node|null}\n     */\n    function removeNodesBetween(ctx, startInclusive, endExclusive) {\n      /** @type {Node | null} */\n      let cursor = startInclusive;\n      // remove nodes until the endExclusive node\n      while (cursor && cursor !== endExclusive) {\n        let tempNode = /** @type {Node} */ (cursor);\n        cursor = cursor.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n      return cursor;\n    }\n\n    /**\n     * Search for an element by id within the document and pantry, and move it using moveBefore.\n     *\n     * @param {Element} parentNode - The parent node to which the element will be moved.\n     * @param {string} id - The ID of the element to be moved.\n     * @param {Node | null} after - The reference node to insert the element before.\n     *                              If `null`, the element is appended as the last child.\n     * @param {MorphContext} ctx\n     * @returns {Element} The found element\n     */\n    function moveBeforeById(parentNode, id, after, ctx) {\n      const target =\n        /** @type {Element} - will always be found */\n        (\n          // ctx.target.id unsafe because of form input shadowing\n          // ctx.target could be a document fragment which doesn't have `getAttribute`\n          (ctx.target.getAttribute?.(\"id\") === id && ctx.target) ||\n            ctx.target.querySelector(`[id=\"${id}\"]`) ||\n            ctx.pantry.querySelector(`[id=\"${id}\"]`)\n        );\n      removeElementFromAncestorsIdMaps(target, ctx);\n      moveBefore(parentNode, target, after);\n      return target;\n    }\n\n    /**\n     * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n     * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n     * pantry rather than being deleted, preventing their removal hooks from being called.\n     *\n     * @param {Element} element - element to remove from its ancestors' id maps\n     * @param {MorphContext} ctx\n     */\n    function removeElementFromAncestorsIdMaps(element, ctx) {\n      // we know id is non-null String, because this function is only called on elements with ids\n      const id = /** @type {String} */ (element.getAttribute(\"id\"));\n      /** @ts-ignore - safe to loop in this way **/\n      while ((element = element.parentNode)) {\n        let idSet = ctx.idMap.get(element);\n        if (idSet) {\n          idSet.delete(id);\n          if (!idSet.size) {\n            ctx.idMap.delete(element);\n          }\n        }\n      }\n    }\n\n    /**\n     * Moves an element before another element within the same parent.\n     * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n     * This is essentialy a forward-compat wrapper.\n     *\n     * @param {Element} parentNode - The parent node containing the after element.\n     * @param {Node} element - The element to be moved.\n     * @param {Node | null} after - The reference node to insert `element` before.\n     *                              If `null`, `element` is appended as the last child.\n     */\n    function moveBefore(parentNode, element, after) {\n      // @ts-ignore - use proposed moveBefore feature\n      if (parentNode.moveBefore) {\n        try {\n          // @ts-ignore - use proposed moveBefore feature\n          parentNode.moveBefore(element, after);\n        } catch (e) {\n          // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n          parentNode.insertBefore(element, after);\n        }\n      } else {\n        parentNode.insertBefore(element, after);\n      }\n    }\n\n    return morphChildren;\n  })();\n\n  //=============================================================================\n  // Single Node Morphing Code\n  //=============================================================================\n  const morphNode = (function () {\n    /**\n     * @param {Node} oldNode root node to merge content into\n     * @param {Node} newContent new content to merge\n     * @param {MorphContext} ctx the merge context\n     * @returns {Node | null} the element that ended up in the DOM\n     */\n    function morphNode(oldNode, newContent, ctx) {\n      if (ctx.ignoreActive && oldNode === document.activeElement) {\n        // don't morph focused element\n        return null;\n      }\n\n      if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n        return oldNode;\n      }\n\n      if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (\n        oldNode instanceof HTMLHeadElement &&\n        ctx.head.style !== \"morph\"\n      ) {\n        // ok to cast: if newContent wasn't also a <head>, it would've got caught in the `!isSoftMatch` branch above\n        handleHeadElement(\n          oldNode,\n          /** @type {HTMLHeadElement} */ (newContent),\n          ctx,\n        );\n      } else {\n        morphAttributes(oldNode, newContent, ctx);\n        if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n          // @ts-ignore newContent can be a node here because .firstChild will be null\n          morphChildren(ctx, oldNode, newContent);\n        }\n      }\n      ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n      return oldNode;\n    }\n\n    /**\n     * syncs the oldNode to the newNode, copying over all attributes and\n     * inner element state from the newNode to the oldNode\n     *\n     * @param {Node} oldNode the node to copy attributes & state to\n     * @param {Node} newNode the node to copy attributes & state from\n     * @param {MorphContext} ctx the merge context\n     */\n    function morphAttributes(oldNode, newNode, ctx) {\n      let type = newNode.nodeType;\n\n      // if is an element type, sync the attributes from the\n      // new node into the new node\n      if (type === 1 /* element type */) {\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        const oldAttributes = oldElt.attributes;\n        const newAttributes = newElt.attributes;\n        for (const newAttribute of newAttributes) {\n          if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n            continue;\n          }\n          if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n            oldElt.setAttribute(newAttribute.name, newAttribute.value);\n          }\n        }\n        // iterate backwards to avoid skipping over items when a delete occurs\n        for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n          const oldAttribute = oldAttributes[i];\n\n          // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n          // e.g. custom element attribute callbacks can remove other attributes\n          if (!oldAttribute) continue;\n\n          if (!newElt.hasAttribute(oldAttribute.name)) {\n            if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n              continue;\n            }\n            oldElt.removeAttribute(oldAttribute.name);\n          }\n        }\n\n        if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n          syncInputValue(oldElt, newElt, ctx);\n        }\n      }\n\n      // sync text nodes\n      if (type === 8 /* comment */ || type === 3 /* text */) {\n        if (oldNode.nodeValue !== newNode.nodeValue) {\n          oldNode.nodeValue = newNode.nodeValue;\n        }\n      }\n    }\n\n    /**\n     * NB: many bothans died to bring us information:\n     *\n     *  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n     *  https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n     *\n     * @param {Element} oldElement the element to sync the input value to\n     * @param {Element} newElement the element to sync the input value from\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncInputValue(oldElement, newElement, ctx) {\n      if (\n        oldElement instanceof HTMLInputElement &&\n        newElement instanceof HTMLInputElement &&\n        newElement.type !== \"file\"\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n\n        // sync boolean attributes\n        syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n        syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n        if (!newElement.hasAttribute(\"value\")) {\n          if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n            oldElement.value = \"\";\n            oldElement.removeAttribute(\"value\");\n          }\n        } else if (oldValue !== newValue) {\n          if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n            oldElement.setAttribute(\"value\", newValue);\n            oldElement.value = newValue;\n          }\n        }\n        // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n        // did I break something?\n      } else if (\n        oldElement instanceof HTMLOptionElement &&\n        newElement instanceof HTMLOptionElement\n      ) {\n        syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n      } else if (\n        oldElement instanceof HTMLTextAreaElement &&\n        newElement instanceof HTMLTextAreaElement\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n        if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n          return;\n        }\n        if (newValue !== oldValue) {\n          oldElement.value = newValue;\n        }\n        if (\n          oldElement.firstChild &&\n          oldElement.firstChild.nodeValue !== newValue\n        ) {\n          oldElement.firstChild.nodeValue = newValue;\n        }\n      }\n    }\n\n    /**\n     * @param {Element} oldElement element to write the value to\n     * @param {Element} newElement element to read the value from\n     * @param {string} attributeName the attribute name\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n      // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n      const newLiveValue = newElement[attributeName],\n        // @ts-ignore ditto\n        oldLiveValue = oldElement[attributeName];\n      if (newLiveValue !== oldLiveValue) {\n        const ignoreUpdate = ignoreAttribute(\n          attributeName,\n          oldElement,\n          \"update\",\n          ctx,\n        );\n        if (!ignoreUpdate) {\n          // update attribute's associated DOM property\n          // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n          oldElement[attributeName] = newElement[attributeName];\n        }\n        if (newLiveValue) {\n          if (!ignoreUpdate) {\n            // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n            // this is the correct way to set a boolean attribute to \"true\"\n            oldElement.setAttribute(attributeName, \"\");\n          }\n        } else {\n          if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n            oldElement.removeAttribute(attributeName);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {string} attr the attribute to be mutated\n     * @param {Element} element the element that is going to be updated\n     * @param {\"update\" | \"remove\"} updateType\n     * @param {MorphContext} ctx the merge context\n     * @returns {boolean} true if the attribute should be ignored, false otherwise\n     */\n    function ignoreAttribute(attr, element, updateType, ctx) {\n      if (\n        attr === \"value\" &&\n        ctx.ignoreActiveValue &&\n        element === document.activeElement\n      ) {\n        return true;\n      }\n      return (\n        ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n        false\n      );\n    }\n\n    /**\n     * @param {Node} possibleActiveElement\n     * @param {MorphContext} ctx\n     * @returns {boolean}\n     */\n    function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n      return (\n        !!ctx.ignoreActiveValue &&\n        possibleActiveElement === document.activeElement &&\n        possibleActiveElement !== document.body\n      );\n    }\n\n    return morphNode;\n  })();\n\n  //=============================================================================\n  // Head Management Functions\n  //=============================================================================\n  /**\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @param {function} callback\n   * @returns {Node[] | Promise<Node[]>}\n   */\n  function withHeadBlocking(ctx, oldNode, newNode, callback) {\n    if (ctx.head.block) {\n      const oldHead = oldNode.querySelector(\"head\");\n      const newHead = newNode.querySelector(\"head\");\n      if (oldHead && newHead) {\n        const promises = handleHeadElement(oldHead, newHead, ctx);\n        // when head promises resolve, proceed ignoring the head tag\n        return Promise.all(promises).then(() => {\n          const newCtx = Object.assign(ctx, {\n            head: {\n              block: false,\n              ignore: true,\n            },\n          });\n          return callback(newCtx);\n        });\n      }\n    }\n    // just proceed if we not head blocking\n    return callback(ctx);\n  }\n\n  /**\n   *  The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n   *\n   * @param {Element} oldHead\n   * @param {Element} newHead\n   * @param {MorphContext} ctx\n   * @returns {Promise<void>[]}\n   */\n  function handleHeadElement(oldHead, newHead, ctx) {\n    let added = [];\n    let removed = [];\n    let preserved = [];\n    let nodesToAppend = [];\n\n    // put all new head elements into a Map, by their outerHTML\n    let srcToNewHeadNodes = new Map();\n    for (const newHeadChild of newHead.children) {\n      srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n    }\n\n    // for each elt in the current head\n    for (const currentHeadElt of oldHead.children) {\n      // If the current head element is in the map\n      let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n      let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n      let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n      if (inNewContent || isPreserved) {\n        if (isReAppended) {\n          // remove the current version and let the new version replace it and re-execute\n          removed.push(currentHeadElt);\n        } else {\n          // this element already exists and should not be re-appended, so remove it from\n          // the new content map, preserving it in the DOM\n          srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n          preserved.push(currentHeadElt);\n        }\n      } else {\n        if (ctx.head.style === \"append\") {\n          // we are appending and this existing element is not new content\n          // so if and only if it is marked for re-append do we do anything\n          if (isReAppended) {\n            removed.push(currentHeadElt);\n            nodesToAppend.push(currentHeadElt);\n          }\n        } else {\n          // if this is a merge, we remove this content since it is not in the new head\n          if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n            removed.push(currentHeadElt);\n          }\n        }\n      }\n    }\n\n    // Push the remaining new head elements in the Map into the\n    // nodes to append to the head tag\n    nodesToAppend.push(...srcToNewHeadNodes.values());\n\n    let promises = [];\n    for (const newNode of nodesToAppend) {\n      // TODO: This could theoretically be null, based on type\n      let newElt = /** @type {ChildNode} */ (\n        document.createRange().createContextualFragment(newNode.outerHTML)\n          .firstChild\n      );\n      if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n        if (\n          (\"href\" in newElt && newElt.href) ||\n          (\"src\" in newElt && newElt.src)\n        ) {\n          /** @type {(result?: any) => void} */ let resolve;\n          let promise = new Promise(function (_resolve) {\n            resolve = _resolve;\n          });\n          newElt.addEventListener(\"load\", function () {\n            resolve();\n          });\n          promises.push(promise);\n        }\n        oldHead.appendChild(newElt);\n        ctx.callbacks.afterNodeAdded(newElt);\n        added.push(newElt);\n      }\n    }\n\n    // remove all removed elements, after we have appended the new elements to avoid\n    // additional network requests for things like style sheets\n    for (const removedElement of removed) {\n      if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n        oldHead.removeChild(removedElement);\n        ctx.callbacks.afterNodeRemoved(removedElement);\n      }\n    }\n\n    ctx.head.afterHeadMorphed(oldHead, {\n      added: added,\n      kept: preserved,\n      removed: removed,\n    });\n    return promises;\n  }\n\n  //=============================================================================\n  // Create Morph Context Functions\n  //=============================================================================\n  const createMorphContext = (function () {\n    /**\n     *\n     * @param {Element} oldNode\n     * @param {Element} newContent\n     * @param {Config} config\n     * @returns {MorphContext}\n     */\n    function createMorphContext(oldNode, newContent, config) {\n      const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n      const mergedConfig = mergeDefaults(config);\n      const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n      if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n        throw `Do not understand how to morph style ${morphStyle}`;\n      }\n\n      return {\n        target: oldNode,\n        newContent: newContent,\n        config: mergedConfig,\n        morphStyle: morphStyle,\n        ignoreActive: mergedConfig.ignoreActive,\n        ignoreActiveValue: mergedConfig.ignoreActiveValue,\n        restoreFocus: mergedConfig.restoreFocus,\n        idMap: idMap,\n        persistentIds: persistentIds,\n        pantry: createPantry(),\n        activeElementAndParents: createActiveElementAndParents(oldNode),\n        callbacks: mergedConfig.callbacks,\n        head: mergedConfig.head,\n      };\n    }\n\n    /**\n     * Deep merges the config object and the Idiomorph.defaults object to\n     * produce a final configuration object\n     * @param {Config} config\n     * @returns {ConfigInternal}\n     */\n    function mergeDefaults(config) {\n      let finalConfig = Object.assign({}, defaults);\n\n      // copy top level stuff into final config\n      Object.assign(finalConfig, config);\n\n      // copy callbacks into final config (do this to deep merge the callbacks)\n      finalConfig.callbacks = Object.assign(\n        {},\n        defaults.callbacks,\n        config.callbacks,\n      );\n\n      // copy head config into final config  (do this to deep merge the head)\n      finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n      return finalConfig;\n    }\n\n    /**\n     * @returns {HTMLDivElement}\n     */\n    function createPantry() {\n      const pantry = document.createElement(\"div\");\n      pantry.hidden = true;\n      document.body.insertAdjacentElement(\"afterend\", pantry);\n      return pantry;\n    }\n\n    /**\n     * @param {Element} oldNode\n     * @returns {Element[]}\n     */\n    function createActiveElementAndParents(oldNode) {\n      /** @type {Element[]} */\n      let activeElementAndParents = [];\n      let elt = document.activeElement;\n      if (elt?.tagName !== \"BODY\" && oldNode.contains(elt)) {\n        while (elt) {\n          activeElementAndParents.push(elt);\n          if (elt === oldNode) break;\n          elt = elt.parentElement;\n        }\n      }\n      return activeElementAndParents;\n    }\n\n    /**\n     * Returns all elements with an ID contained within the root element and its descendants\n     *\n     * @param {Element} root\n     * @returns {Element[]}\n     */\n    function findIdElements(root) {\n      let elements = Array.from(root.querySelectorAll(\"[id]\"));\n      // root could be a document fragment which doesn't have `getAttribute`\n      if (root.getAttribute?.(\"id\")) {\n        elements.push(root);\n      }\n      return elements;\n    }\n\n    /**\n     * A bottom-up algorithm that populates a map of Element -> IdSet.\n     * The idSet for a given element is the set of all IDs contained within its subtree.\n     * As an optimzation, we filter these IDs through the given list of persistent IDs,\n     * because we don't need to bother considering IDed elements that won't be in the new content.\n     *\n     * @param {Map<Node, Set<string>>} idMap\n     * @param {Set<string>} persistentIds\n     * @param {Element} root\n     * @param {Element[]} elements\n     */\n    function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n      for (const elt of elements) {\n        // we can pretend id is non-null String, because the .has line will reject it immediately if not\n        const id = /** @type {String} */ (elt.getAttribute(\"id\"));\n        if (persistentIds.has(id)) {\n          /** @type {Element|null} */\n          let current = elt;\n          // walk up the parent hierarchy of that element, adding the id\n          // of element to the parent's id set\n          while (current) {\n            let idSet = idMap.get(current);\n            // if the id set doesn't exist, create it and insert it in the map\n            if (idSet == null) {\n              idSet = new Set();\n              idMap.set(current, idSet);\n            }\n            idSet.add(id);\n\n            if (current === root) break;\n            current = current.parentElement;\n          }\n        }\n      }\n    }\n\n    /**\n     * This function computes a map of nodes to all ids contained within that node (inclusive of the\n     * node).  This map can be used to ask if two nodes have intersecting sets of ids, which allows\n     * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n     * to contribute to a parent nodes matching.\n     *\n     * @param {Element} oldContent  the old content that will be morphed\n     * @param {Element} newContent  the new content to morph to\n     * @returns {IdSets}\n     */\n    function createIdMaps(oldContent, newContent) {\n      const oldIdElements = findIdElements(oldContent);\n      const newIdElements = findIdElements(newContent);\n\n      const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n      /** @type {Map<Node, Set<string>>} */\n      let idMap = new Map();\n      populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n      /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n      const newRoot = newContent.__idiomorphRoot || newContent;\n      populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n      return { persistentIds, idMap };\n    }\n\n    /**\n     * This function computes the set of ids that persist between the two contents excluding duplicates\n     *\n     * @param {Element[]} oldIdElements\n     * @param {Element[]} newIdElements\n     * @returns {Set<string>}\n     */\n    function createPersistentIds(oldIdElements, newIdElements) {\n      let duplicateIds = new Set();\n\n      /** @type {Map<string, string>} */\n      let oldIdTagNameMap = new Map();\n      for (const { id, tagName } of oldIdElements) {\n        if (oldIdTagNameMap.has(id)) {\n          duplicateIds.add(id);\n        } else {\n          oldIdTagNameMap.set(id, tagName);\n        }\n      }\n\n      let persistentIds = new Set();\n      for (const { id, tagName } of newIdElements) {\n        if (persistentIds.has(id)) {\n          duplicateIds.add(id);\n        } else if (oldIdTagNameMap.get(id) === tagName) {\n          persistentIds.add(id);\n        }\n        // skip if tag types mismatch because its not possible to morph one tag into another\n      }\n\n      for (const id of duplicateIds) {\n        persistentIds.delete(id);\n      }\n      return persistentIds;\n    }\n\n    return createMorphContext;\n  })();\n\n  //=============================================================================\n  // HTML Normalization Functions\n  //=============================================================================\n  const { normalizeElement, normalizeParent } = (function () {\n    /** @type {WeakSet<Node>} */\n    const generatedByIdiomorph = new WeakSet();\n\n    /**\n     *\n     * @param {Element | Document} content\n     * @returns {Element}\n     */\n    function normalizeElement(content) {\n      if (content instanceof Document) {\n        return content.documentElement;\n      } else {\n        return content;\n      }\n    }\n\n    /**\n     *\n     * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n     * @returns {Element}\n     */\n    function normalizeParent(newContent) {\n      if (newContent == null) {\n        return document.createElement(\"div\"); // dummy parent element\n      } else if (typeof newContent === \"string\") {\n        return normalizeParent(parseContent(newContent));\n      } else if (\n        generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n      ) {\n        // the template tag created by idiomorph parsing can serve as a dummy parent\n        return /** @type {Element} */ (newContent);\n      } else if (newContent instanceof Node) {\n        if (newContent.parentNode) {\n          // we can't use the parent directly because newContent may have siblings\n          // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n          // so instead we create a fake parent node that only sees a slice of its children.\n          /** @type {Element} */\n          return /** @type {any} */ (new SlicedParentNode(newContent));\n        } else {\n          // a single node is added as a child to a dummy parent\n          const dummyParent = document.createElement(\"div\");\n          dummyParent.append(newContent);\n          return dummyParent;\n        }\n      } else {\n        // all nodes in the array or HTMLElement collection are consolidated under\n        // a single dummy parent element\n        const dummyParent = document.createElement(\"div\");\n        for (const elt of [...newContent]) {\n          dummyParent.append(elt);\n        }\n        return dummyParent;\n      }\n    }\n\n    /**\n     * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n     * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n     * or replaced with one or more elements during the morph. This class effectively allows us a window into\n     * a slice of a node's children.\n     * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849–1916)\n     */\n    class SlicedParentNode {\n      /** @param {Node} node */\n      constructor(node) {\n        this.originalNode = node;\n        this.realParentNode = /** @type {Element} */ (node.parentNode);\n        this.previousSibling = node.previousSibling;\n        this.nextSibling = node.nextSibling;\n      }\n\n      /** @returns {Node[]} */\n      get childNodes() {\n        // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n        const nodes = [];\n        let cursor = this.previousSibling\n          ? this.previousSibling.nextSibling\n          : this.realParentNode.firstChild;\n        while (cursor && cursor != this.nextSibling) {\n          nodes.push(cursor);\n          cursor = cursor.nextSibling;\n        }\n        return nodes;\n      }\n\n      /**\n       * @param {string} selector\n       * @returns {Element[]}\n       */\n      querySelectorAll(selector) {\n        return this.childNodes.reduce((results, node) => {\n          if (node instanceof Element) {\n            if (node.matches(selector)) results.push(node);\n            const nodeList = node.querySelectorAll(selector);\n            for (let i = 0; i < nodeList.length; i++) {\n              results.push(nodeList[i]);\n            }\n          }\n          return results;\n        }, /** @type {Element[]} */ ([]));\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      insertBefore(node, referenceNode) {\n        return this.realParentNode.insertBefore(node, referenceNode);\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      moveBefore(node, referenceNode) {\n        // @ts-ignore - use new moveBefore feature\n        return this.realParentNode.moveBefore(node, referenceNode);\n      }\n\n      /**\n       * for later use with populateIdMapWithTree to halt upwards iteration\n       * @returns {Node}\n       */\n      get __idiomorphRoot() {\n        return this.originalNode;\n      }\n    }\n\n    /**\n     *\n     * @param {string} newContent\n     * @returns {Node | null | DocumentFragment}\n     */\n    function parseContent(newContent) {\n      let parser = new DOMParser();\n\n      // remove svgs to avoid false-positive matches on head, etc.\n      let contentWithSvgsRemoved = newContent.replace(\n        /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n        \"\",\n      );\n\n      // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n      if (\n        contentWithSvgsRemoved.match(/<\\/html>/) ||\n        contentWithSvgsRemoved.match(/<\\/head>/) ||\n        contentWithSvgsRemoved.match(/<\\/body>/)\n      ) {\n        let content = parser.parseFromString(newContent, \"text/html\");\n        // if it is a full HTML document, return the document itself as the parent container\n        if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n          generatedByIdiomorph.add(content);\n          return content;\n        } else {\n          // otherwise return the html element as the parent container\n          let htmlElement = content.firstChild;\n          if (htmlElement) {\n            generatedByIdiomorph.add(htmlElement);\n          }\n          return htmlElement;\n        }\n      } else {\n        // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n        // deal with touchy tags like tr, tbody, etc.\n        let responseDoc = parser.parseFromString(\n          \"<body><template>\" + newContent + \"</template></body>\",\n          \"text/html\",\n        );\n        let content = /** @type {HTMLTemplateElement} */ (\n          responseDoc.body.querySelector(\"template\")\n        ).content;\n        generatedByIdiomorph.add(content);\n        return content;\n      }\n    }\n\n    return { normalizeElement, normalizeParent };\n  })();\n\n  //=============================================================================\n  // This is what ends up becoming the Idiomorph global object\n  //=============================================================================\n  return {\n    morph,\n    defaults,\n  };\n})();\n\n/**\n * Morph the state of the currentElement based on the attributes and contents of\n * the newElement. Morphing may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing changes\n * @param newElement Element source of morphing changes\n */\nfunction morphElements(currentElement, newElement, { callbacks, ...options } = {}) {\n  Idiomorph.morph(currentElement, newElement, {\n    ...options,\n    callbacks: new DefaultIdiomorphCallbacks(callbacks)\n  });\n}\n\n/**\n * Morph the child elements of the currentElement based on the child elements of\n * the newElement. Morphing children may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing children changes\n * @param newElement Element source of morphing children changes\n */\nfunction morphChildren(currentElement, newElement, options = {}) {\n  morphElements(currentElement, newElement.childNodes, {\n    ...options,\n    morphStyle: \"innerHTML\"\n  });\n}\n\nfunction shouldRefreshFrameWithMorphing(currentFrame, newFrame) {\n  return currentFrame instanceof FrameElement &&\n    currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) &&\n    !currentFrame.closest(\"[data-turbo-permanent]\")\n}\n\nfunction areFramesCompatibleForRefreshing(currentFrame, newFrame) {\n  // newFrame cannot yet be an instance of FrameElement because custom\n  // elements don't get initialized until they're attached to the DOM, so\n  // test its Element#nodeName instead\n  return newFrame instanceof Element && newFrame.nodeName === \"TURBO-FRAME\" && currentFrame.id === newFrame.id &&\n  (!newFrame.getAttribute(\"src\") || urlsAreEqual(currentFrame.src, newFrame.getAttribute(\"src\")))\n}\n\nfunction closestFrameReloadableWithMorphing(node) {\n  return node.parentElement.closest(\"turbo-frame[src][refresh=morph]\")\n}\n\nclass DefaultIdiomorphCallbacks {\n  #beforeNodeMorphed\n\n  constructor({ beforeNodeMorphed } = {}) {\n    this.#beforeNodeMorphed = beforeNodeMorphed || (() => true);\n  }\n\n  beforeNodeAdded = (node) => {\n    return !(node.id && node.hasAttribute(\"data-turbo-permanent\") && document.getElementById(node.id))\n  }\n\n  beforeNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      if (!currentElement.hasAttribute(\"data-turbo-permanent\") && this.#beforeNodeMorphed(currentElement, newElement)) {\n        const event = dispatch(\"turbo:before-morph-element\", {\n          cancelable: true,\n          target: currentElement,\n          detail: { currentElement, newElement }\n        });\n\n        return !event.defaultPrevented\n      } else {\n        return false\n      }\n    }\n  }\n\n  beforeAttributeUpdated = (attributeName, target, mutationType) => {\n    const event = dispatch(\"turbo:before-morph-attribute\", {\n      cancelable: true,\n      target,\n      detail: { attributeName, mutationType }\n    });\n\n    return !event.defaultPrevented\n  }\n\n  beforeNodeRemoved = (node) => {\n    return this.beforeNodeMorphed(node)\n  }\n\n  afterNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      dispatch(\"turbo:morph-element\", {\n        target: currentElement,\n        detail: { currentElement, newElement }\n      });\n    }\n  }\n}\n\nclass MorphingFrameRenderer extends FrameRenderer {\n  static renderElement(currentElement, newElement) {\n    dispatch(\"turbo:before-frame-morph\", {\n      target: currentElement,\n      detail: { currentElement, newElement }\n    });\n\n    morphChildren(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              closestFrameReloadableWithMorphing(node) === currentElement\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n}\n\nclass ProgressBar {\n  static animationDuration = 300 /*ms*/\n\n  static get defaultCSS() {\n    return unindent`\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 2147483647;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `\n  }\n\n  hiding = false\n  value = 0\n  visible = false\n\n  constructor() {\n    this.stylesheetElement = this.createStylesheetElement();\n    this.progressElement = this.createProgressElement();\n    this.installStylesheetElement();\n    this.setValue(0);\n  }\n\n  show() {\n    if (!this.visible) {\n      this.visible = true;\n      this.installProgressElement();\n      this.startTrickling();\n    }\n  }\n\n  hide() {\n    if (this.visible && !this.hiding) {\n      this.hiding = true;\n      this.fadeProgressElement(() => {\n        this.uninstallProgressElement();\n        this.stopTrickling();\n        this.visible = false;\n        this.hiding = false;\n      });\n    }\n  }\n\n  setValue(value) {\n    this.value = value;\n    this.refresh();\n  }\n\n  // Private\n\n  installStylesheetElement() {\n    document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n  }\n\n  installProgressElement() {\n    this.progressElement.style.width = \"0\";\n    this.progressElement.style.opacity = \"1\";\n    document.documentElement.insertBefore(this.progressElement, document.body);\n    this.refresh();\n  }\n\n  fadeProgressElement(callback) {\n    this.progressElement.style.opacity = \"0\";\n    setTimeout(callback, ProgressBar.animationDuration * 1.5);\n  }\n\n  uninstallProgressElement() {\n    if (this.progressElement.parentNode) {\n      document.documentElement.removeChild(this.progressElement);\n    }\n  }\n\n  startTrickling() {\n    if (!this.trickleInterval) {\n      this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n    }\n  }\n\n  stopTrickling() {\n    window.clearInterval(this.trickleInterval);\n    delete this.trickleInterval;\n  }\n\n  trickle = () => {\n    this.setValue(this.value + Math.random() / 100);\n  }\n\n  refresh() {\n    requestAnimationFrame(() => {\n      this.progressElement.style.width = `${10 + this.value * 90}%`;\n    });\n  }\n\n  createStylesheetElement() {\n    const element = document.createElement(\"style\");\n    element.type = \"text/css\";\n    element.textContent = ProgressBar.defaultCSS;\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      element.nonce = cspNonce;\n    }\n    return element\n  }\n\n  createProgressElement() {\n    const element = document.createElement(\"div\");\n    element.className = \"turbo-progress-bar\";\n    return element\n  }\n}\n\nclass HeadSnapshot extends Snapshot {\n  detailsByOuterHTML = this.children\n    .filter((element) => !elementIsNoscript(element))\n    .map((element) => elementWithoutNonce(element))\n    .reduce((result, element) => {\n      const { outerHTML } = element;\n      const details =\n        outerHTML in result\n          ? result[outerHTML]\n          : {\n              type: elementType(element),\n              tracked: elementIsTracked(element),\n              elements: []\n            };\n      return {\n        ...result,\n        [outerHTML]: {\n          ...details,\n          elements: [...details.elements, element]\n        }\n      }\n    }, {})\n\n  get trackedElementSignature() {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n      .join(\"\")\n  }\n\n  getScriptElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot)\n  }\n\n  getStylesheetElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot)\n  }\n\n  getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n      .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n      .filter(({ type }) => type == matchedType)\n      .map(({ elements: [element] }) => element)\n  }\n\n  get provisionalElements() {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n      if (type == null && !tracked) {\n        return [...result, ...elements]\n      } else if (elements.length > 1) {\n        return [...result, ...elements.slice(1)]\n      } else {\n        return result\n      }\n    }, [])\n  }\n\n  getMetaValue(name) {\n    const element = this.findMetaElementByName(name);\n    return element ? element.getAttribute(\"content\") : null\n  }\n\n  findMetaElementByName(name) {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const {\n        elements: [element]\n      } = this.detailsByOuterHTML[outerHTML];\n      return elementIsMetaElementWithName(element, name) ? element : result\n    }, undefined | undefined)\n  }\n}\n\nfunction elementType(element) {\n  if (elementIsScript(element)) {\n    return \"script\"\n  } else if (elementIsStylesheet(element)) {\n    return \"stylesheet\"\n  }\n}\n\nfunction elementIsTracked(element) {\n  return element.getAttribute(\"data-turbo-track\") == \"reload\"\n}\n\nfunction elementIsScript(element) {\n  const tagName = element.localName;\n  return tagName == \"script\"\n}\n\nfunction elementIsNoscript(element) {\n  const tagName = element.localName;\n  return tagName == \"noscript\"\n}\n\nfunction elementIsStylesheet(element) {\n  const tagName = element.localName;\n  return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n}\n\nfunction elementIsMetaElementWithName(element, name) {\n  const tagName = element.localName;\n  return tagName == \"meta\" && element.getAttribute(\"name\") == name\n}\n\nfunction elementWithoutNonce(element) {\n  if (element.hasAttribute(\"nonce\")) {\n    element.setAttribute(\"nonce\", \"\");\n  }\n\n  return element\n}\n\nclass PageSnapshot extends Snapshot {\n  static fromHTMLString(html = \"\") {\n    return this.fromDocument(parseHTMLDocument(html))\n  }\n\n  static fromElement(element) {\n    return this.fromDocument(element.ownerDocument)\n  }\n\n  static fromDocument({ documentElement, body, head }) {\n    return new this(documentElement, body, new HeadSnapshot(head))\n  }\n\n  constructor(documentElement, body, headSnapshot) {\n    super(body);\n    this.documentElement = documentElement;\n    this.headSnapshot = headSnapshot;\n  }\n\n  clone() {\n    const clonedElement = this.element.cloneNode(true);\n\n    const selectElements = this.element.querySelectorAll(\"select\");\n    const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n\n    for (const [index, source] of selectElements.entries()) {\n      const clone = clonedSelectElements[index];\n      for (const option of clone.selectedOptions) option.selected = false;\n      for (const option of source.selectedOptions) clone.options[option.index].selected = true;\n    }\n\n    for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n      clonedPasswordInput.value = \"\";\n    }\n\n    for (const clonedNoscriptElement of clonedElement.querySelectorAll(\"noscript\")) {\n      clonedNoscriptElement.remove();\n    }\n\n    return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot)\n  }\n\n  get lang() {\n    return this.documentElement.getAttribute(\"lang\")\n  }\n\n  get dir() {\n    return this.documentElement.getAttribute(\"dir\")\n  }\n\n  get headElement() {\n    return this.headSnapshot.element\n  }\n\n  get rootLocation() {\n    const root = this.getSetting(\"root\") ?? \"/\";\n    return expandURL(root)\n  }\n\n  get cacheControlValue() {\n    return this.getSetting(\"cache-control\")\n  }\n\n  get isPreviewable() {\n    return this.cacheControlValue != \"no-preview\"\n  }\n\n  get isCacheable() {\n    return this.cacheControlValue != \"no-cache\"\n  }\n\n  get isVisitable() {\n    return this.getSetting(\"visit-control\") != \"reload\"\n  }\n\n  get prefersViewTransitions() {\n    const viewTransitionEnabled = this.getSetting(\"view-transition\") === \"true\" || this.headSnapshot.getMetaValue(\"view-transition\") === \"same-origin\";\n    return viewTransitionEnabled && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  }\n\n  get refreshMethod() {\n    return this.getSetting(\"refresh-method\")\n  }\n\n  get refreshScroll() {\n    return this.getSetting(\"refresh-scroll\")\n  }\n\n  // Private\n\n  getSetting(name) {\n    return this.headSnapshot.getMetaValue(`turbo-${name}`)\n  }\n}\n\nclass ViewTransitioner {\n  #viewTransitionStarted = false\n  #lastOperation = Promise.resolve()\n\n  renderChange(useViewTransition, render) {\n    if (useViewTransition && this.viewTransitionsAvailable && !this.#viewTransitionStarted) {\n      this.#viewTransitionStarted = true;\n      this.#lastOperation = this.#lastOperation.then(async () => {\n        await document.startViewTransition(render).finished;\n      });\n    } else {\n      this.#lastOperation = this.#lastOperation.then(render);\n    }\n\n    return this.#lastOperation\n  }\n\n  get viewTransitionsAvailable() {\n    return document.startViewTransition\n  }\n}\n\nconst defaultOptions = {\n  action: \"advance\",\n  historyChanged: false,\n  visitCachedSnapshot: () => {},\n  willRender: true,\n  updateHistory: true,\n  shouldCacheSnapshot: true,\n  acceptsStreamResponse: false,\n  refresh: {}\n};\n\nconst TimingMetric = {\n  visitStart: \"visitStart\",\n  requestStart: \"requestStart\",\n  requestEnd: \"requestEnd\",\n  visitEnd: \"visitEnd\"\n};\n\nconst VisitState = {\n  initialized: \"initialized\",\n  started: \"started\",\n  canceled: \"canceled\",\n  failed: \"failed\",\n  completed: \"completed\"\n};\n\nconst SystemStatusCode = {\n  networkFailure: 0,\n  timeoutFailure: -1,\n  contentTypeMismatch: -2\n};\n\nconst Direction = {\n  advance: \"forward\",\n  restore: \"back\",\n  replace: \"none\"\n};\n\nclass Visit {\n  identifier = uuid() // Required by turbo-ios\n  timingMetrics = {}\n\n  followedRedirect = false\n  historyChanged = false\n  scrolled = false\n  shouldCacheSnapshot = true\n  acceptsStreamResponse = false\n  snapshotCached = false\n  state = VisitState.initialized\n  viewTransitioner = new ViewTransitioner()\n\n  constructor(delegate, location, restorationIdentifier, options = {}) {\n    this.delegate = delegate;\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier || uuid();\n\n    const {\n      action,\n      historyChanged,\n      referrer,\n      snapshot,\n      snapshotHTML,\n      response,\n      visitCachedSnapshot,\n      willRender,\n      updateHistory,\n      shouldCacheSnapshot,\n      acceptsStreamResponse,\n      direction,\n      refresh\n    } = {\n      ...defaultOptions,\n      ...options\n    };\n    this.action = action;\n    this.historyChanged = historyChanged;\n    this.referrer = referrer;\n    this.snapshot = snapshot;\n    this.snapshotHTML = snapshotHTML;\n    this.response = response;\n    this.isPageRefresh = this.view.isPageRefresh(this);\n    this.visitCachedSnapshot = visitCachedSnapshot;\n    this.willRender = willRender;\n    this.updateHistory = updateHistory;\n    this.scrolled = !willRender;\n    this.shouldCacheSnapshot = shouldCacheSnapshot;\n    this.acceptsStreamResponse = acceptsStreamResponse;\n    this.direction = direction || Direction[action];\n    this.refresh = refresh;\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  get restorationData() {\n    return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)\n  }\n\n  start() {\n    if (this.state == VisitState.initialized) {\n      this.recordTimingMetric(TimingMetric.visitStart);\n      this.state = VisitState.started;\n      this.adapter.visitStarted(this);\n      this.delegate.visitStarted(this);\n    }\n  }\n\n  cancel() {\n    if (this.state == VisitState.started) {\n      if (this.request) {\n        this.request.cancel();\n      }\n      this.cancelRender();\n      this.state = VisitState.canceled;\n    }\n  }\n\n  complete() {\n    if (this.state == VisitState.started) {\n      this.recordTimingMetric(TimingMetric.visitEnd);\n      this.adapter.visitCompleted(this);\n      this.state = VisitState.completed;\n      this.followRedirect();\n\n      if (!this.followedRedirect) {\n        this.delegate.visitCompleted(this);\n      }\n    }\n  }\n\n  fail() {\n    if (this.state == VisitState.started) {\n      this.state = VisitState.failed;\n      this.adapter.visitFailed(this);\n      this.delegate.visitCompleted(this);\n    }\n  }\n\n  changeHistory() {\n    if (!this.historyChanged && this.updateHistory) {\n      const actionForHistory = this.location.href === this.referrer?.href ? \"replace\" : this.action;\n      const method = getHistoryMethodForAction(actionForHistory);\n      this.history.update(method, this.location, this.restorationIdentifier);\n      this.historyChanged = true;\n    }\n  }\n\n  issueRequest() {\n    if (this.hasPreloadedResponse()) {\n      this.simulateRequest();\n    } else if (this.shouldIssueRequest() && !this.request) {\n      this.request = new FetchRequest(this, FetchMethod.get, this.location);\n      this.request.perform();\n    }\n  }\n\n  simulateRequest() {\n    if (this.response) {\n      this.startRequest();\n      this.recordResponse();\n      this.finishRequest();\n    }\n  }\n\n  startRequest() {\n    this.recordTimingMetric(TimingMetric.requestStart);\n    this.adapter.visitRequestStarted(this);\n  }\n\n  recordResponse(response = this.response) {\n    this.response = response;\n    if (response) {\n      const { statusCode } = response;\n      if (isSuccessful(statusCode)) {\n        this.adapter.visitRequestCompleted(this);\n      } else {\n        this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n      }\n    }\n  }\n\n  finishRequest() {\n    this.recordTimingMetric(TimingMetric.requestEnd);\n    this.adapter.visitRequestFinished(this);\n  }\n\n  loadResponse() {\n    if (this.response) {\n      const { statusCode, responseHTML } = this.response;\n      this.render(async () => {\n        if (this.shouldCacheSnapshot) this.cacheSnapshot();\n        if (this.view.renderPromise) await this.view.renderPromise;\n\n        if (isSuccessful(statusCode) && responseHTML != null) {\n          const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n          await this.renderPageSnapshot(snapshot, false);\n\n          this.adapter.visitRendered(this);\n          this.complete();\n        } else {\n          await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n          this.adapter.visitRendered(this);\n          this.fail();\n        }\n      });\n    }\n  }\n\n  getCachedSnapshot() {\n    const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n\n    if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n      if (this.action == \"restore\" || snapshot.isPreviewable) {\n        return snapshot\n      }\n    }\n  }\n\n  getPreloadedSnapshot() {\n    if (this.snapshotHTML) {\n      return PageSnapshot.fromHTMLString(this.snapshotHTML)\n    }\n  }\n\n  hasCachedSnapshot() {\n    return this.getCachedSnapshot() != null\n  }\n\n  loadCachedSnapshot() {\n    const snapshot = this.getCachedSnapshot();\n    if (snapshot) {\n      const isPreview = this.shouldIssueRequest();\n      this.render(async () => {\n        this.cacheSnapshot();\n        if (this.isPageRefresh) {\n          this.adapter.visitRendered(this);\n        } else {\n          if (this.view.renderPromise) await this.view.renderPromise;\n\n          await this.renderPageSnapshot(snapshot, isPreview);\n\n          this.adapter.visitRendered(this);\n          if (!isPreview) {\n            this.complete();\n          }\n        }\n      });\n    }\n  }\n\n  followRedirect() {\n    if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) {\n      this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n        action: \"replace\",\n        response: this.response,\n        shouldCacheSnapshot: false,\n        willRender: false\n      });\n      this.followedRedirect = true;\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (this.acceptsStreamResponse) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted() {\n    this.startRequest();\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {}\n\n  async requestSucceededWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.redirectedToLocation = response.redirected ? response.location : undefined;\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  async requestFailedWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  requestErrored(_request, _error) {\n    this.recordResponse({\n      statusCode: SystemStatusCode.networkFailure,\n      redirected: false\n    });\n  }\n\n  requestFinished() {\n    this.finishRequest();\n  }\n\n  // Scrolling\n\n  performScroll() {\n    if (!this.scrolled && !this.view.forceReloaded && !this.view.shouldPreserveScrollPosition(this)) {\n      if (this.action == \"restore\") {\n        this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n      } else {\n        this.scrollToAnchor() || this.view.scrollToTop();\n      }\n\n      this.scrolled = true;\n    }\n  }\n\n  scrollToRestoredPosition() {\n    const { scrollPosition } = this.restorationData;\n    if (scrollPosition) {\n      this.view.scrollToPosition(scrollPosition);\n      return true\n    }\n  }\n\n  scrollToAnchor() {\n    const anchor = getAnchor(this.location);\n    if (anchor != null) {\n      this.view.scrollToAnchor(anchor);\n      return true\n    }\n  }\n\n  // Instrumentation\n\n  recordTimingMetric(metric) {\n    this.timingMetrics[metric] = new Date().getTime();\n  }\n\n  getTimingMetrics() {\n    return { ...this.timingMetrics }\n  }\n\n  // Private\n\n  hasPreloadedResponse() {\n    return typeof this.response == \"object\"\n  }\n\n  shouldIssueRequest() {\n    if (this.action == \"restore\") {\n      return !this.hasCachedSnapshot()\n    } else {\n      return this.willRender\n    }\n  }\n\n  cacheSnapshot() {\n    if (!this.snapshotCached) {\n      this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n      this.snapshotCached = true;\n    }\n  }\n\n  async render(callback) {\n    this.cancelRender();\n    await new Promise((resolve) => {\n      this.frame =\n        document.visibilityState === \"hidden\" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve());\n    });\n    await callback();\n    delete this.frame;\n  }\n\n  async renderPageSnapshot(snapshot, isPreview) {\n    await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(snapshot), async () => {\n      await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n      this.performScroll();\n    });\n  }\n\n  cancelRender() {\n    if (this.frame) {\n      cancelAnimationFrame(this.frame);\n      delete this.frame;\n    }\n  }\n}\n\nfunction isSuccessful(statusCode) {\n  return statusCode >= 200 && statusCode < 300\n}\n\nclass BrowserAdapter {\n  progressBar = new ProgressBar()\n\n  constructor(session) {\n    this.session = session;\n  }\n\n  visitProposedToLocation(location, options) {\n    if (locationIsVisitable(location, this.navigator.rootLocation)) {\n      this.navigator.startVisit(location, options?.restorationIdentifier || uuid(), options);\n    } else {\n      window.location.href = location.toString();\n    }\n  }\n\n  visitStarted(visit) {\n    this.location = visit.location;\n    this.redirectedToLocation = null;\n\n    visit.loadCachedSnapshot();\n    visit.issueRequest();\n  }\n\n  visitRequestStarted(visit) {\n    this.progressBar.setValue(0);\n    if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n      this.showVisitProgressBarAfterDelay();\n    } else {\n      this.showProgressBar();\n    }\n  }\n\n  visitRequestCompleted(visit) {\n    visit.loadResponse();\n\n    if (visit.response.redirected) {\n      this.redirectedToLocation = visit.redirectedToLocation;\n    }\n  }\n\n  visitRequestFailedWithStatusCode(visit, statusCode) {\n    switch (statusCode) {\n      case SystemStatusCode.networkFailure:\n      case SystemStatusCode.timeoutFailure:\n      case SystemStatusCode.contentTypeMismatch:\n        return this.reload({\n          reason: \"request_failed\",\n          context: {\n            statusCode\n          }\n        })\n      default:\n        return visit.loadResponse()\n    }\n  }\n\n  visitRequestFinished(_visit) {}\n\n  visitCompleted(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  pageInvalidated(reason) {\n    this.reload(reason);\n  }\n\n  visitFailed(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  visitRendered(_visit) {}\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    return true\n  }\n\n  // Form Submission Delegate\n\n  formSubmissionStarted(_formSubmission) {\n    this.progressBar.setValue(0);\n    this.showFormProgressBarAfterDelay();\n  }\n\n  formSubmissionFinished(_formSubmission) {\n    this.progressBar.setValue(1);\n    this.hideFormProgressBar();\n  }\n\n  // Private\n\n  showVisitProgressBarAfterDelay() {\n    this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n  }\n\n  hideVisitProgressBar() {\n    this.progressBar.hide();\n    if (this.visitProgressBarTimeout != null) {\n      window.clearTimeout(this.visitProgressBarTimeout);\n      delete this.visitProgressBarTimeout;\n    }\n  }\n\n  showFormProgressBarAfterDelay() {\n    if (this.formProgressBarTimeout == null) {\n      this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n  }\n\n  hideFormProgressBar() {\n    this.progressBar.hide();\n    if (this.formProgressBarTimeout != null) {\n      window.clearTimeout(this.formProgressBarTimeout);\n      delete this.formProgressBarTimeout;\n    }\n  }\n\n  showProgressBar = () => {\n    this.progressBar.show();\n  }\n\n  reload(reason) {\n    dispatch(\"turbo:reload\", { detail: reason });\n\n    window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href;\n  }\n\n  get navigator() {\n    return this.session.navigator\n  }\n}\n\nclass CacheObserver {\n  selector = \"[data-turbo-temporary]\"\n\n  started = false\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  removeTemporaryElements = (_event) => {\n    for (const element of this.temporaryElements) {\n      element.remove();\n    }\n  }\n\n  get temporaryElements() {\n    return [...document.querySelectorAll(this.selector)]\n  }\n}\n\nclass FrameRedirector {\n  constructor(session, element) {\n    this.session = session;\n    this.element = element;\n    this.linkInterceptor = new LinkInterceptor(this, element);\n    this.formSubmitObserver = new FormSubmitObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n    this.formSubmitObserver.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n    this.formSubmitObserver.stop();\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldRedirect(element)\n  }\n\n  linkClickIntercepted(element, url, event) {\n    const frame = this.#findFrameElement(element);\n    if (frame) {\n      frame.delegate.linkClickIntercepted(element, url, event);\n    }\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return (\n      element.closest(\"turbo-frame\") == null &&\n      this.#shouldSubmit(element, submitter) &&\n      this.#shouldRedirect(element, submitter)\n    )\n  }\n\n  formSubmitted(element, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n    if (frame) {\n      frame.delegate.formSubmitted(element, submitter);\n    }\n  }\n\n  #shouldSubmit(form, submitter) {\n    const action = getAction$1(form, submitter);\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const rootLocation = expandURL(meta?.content ?? \"/\");\n\n    return this.#shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation)\n  }\n\n  #shouldRedirect(element, submitter) {\n    const isNavigatable =\n      element instanceof HTMLFormElement\n        ? this.session.submissionIsNavigatable(element, submitter)\n        : this.session.elementIsNavigatable(element);\n\n    if (isNavigatable) {\n      const frame = this.#findFrameElement(element, submitter);\n      return frame ? frame != element.closest(\"turbo-frame\") : false\n    } else {\n      return false\n    }\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = submitter?.getAttribute(\"data-turbo-frame\") || element.getAttribute(\"data-turbo-frame\");\n    if (id && id != \"_top\") {\n      const frame = this.element.querySelector(`#${id}:not([disabled])`);\n      if (frame instanceof FrameElement) {\n        return frame\n      }\n    }\n  }\n}\n\nclass History {\n  location\n  restorationIdentifier = uuid()\n  restorationData = {}\n  started = false\n  currentIndex = 0\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"popstate\", this.onPopState, false);\n      this.currentIndex = history.state?.turbo?.restorationIndex || 0;\n      this.started = true;\n      this.replace(new URL(window.location.href));\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"popstate\", this.onPopState, false);\n      this.started = false;\n    }\n  }\n\n  push(location, restorationIdentifier) {\n    this.update(history.pushState, location, restorationIdentifier);\n  }\n\n  replace(location, restorationIdentifier) {\n    this.update(history.replaceState, location, restorationIdentifier);\n  }\n\n  update(method, location, restorationIdentifier = uuid()) {\n    if (method === history.pushState) ++this.currentIndex;\n\n    const state = { turbo: { restorationIdentifier, restorationIndex: this.currentIndex } };\n    method.call(history, state, \"\", location.href);\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier;\n  }\n\n  // Restoration data\n\n  getRestorationDataForIdentifier(restorationIdentifier) {\n    return this.restorationData[restorationIdentifier] || {}\n  }\n\n  updateRestorationData(additionalData) {\n    const { restorationIdentifier } = this;\n    const restorationData = this.restorationData[restorationIdentifier];\n    this.restorationData[restorationIdentifier] = {\n      ...restorationData,\n      ...additionalData\n    };\n  }\n\n  // Scroll restoration\n\n  assumeControlOfScrollRestoration() {\n    if (!this.previousScrollRestoration) {\n      this.previousScrollRestoration = history.scrollRestoration ?? \"auto\";\n      history.scrollRestoration = \"manual\";\n    }\n  }\n\n  relinquishControlOfScrollRestoration() {\n    if (this.previousScrollRestoration) {\n      history.scrollRestoration = this.previousScrollRestoration;\n      delete this.previousScrollRestoration;\n    }\n  }\n\n  // Event handlers\n\n  onPopState = (event) => {\n    const { turbo } = event.state || {};\n    this.location = new URL(window.location.href);\n\n    if (turbo) {\n      const { restorationIdentifier, restorationIndex } = turbo;\n      this.restorationIdentifier = restorationIdentifier;\n      const direction = restorationIndex > this.currentIndex ? \"forward\" : \"back\";\n      this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction);\n      this.currentIndex = restorationIndex;\n    } else {\n      this.currentIndex++;\n      this.delegate.historyPoppedWithEmptyState(this.location);\n    }\n  }\n}\n\nclass LinkPrefetchObserver {\n  started = false\n  #prefetchedLink = null\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (this.started) return\n\n    if (this.eventTarget.readyState === \"loading\") {\n      this.eventTarget.addEventListener(\"DOMContentLoaded\", this.#enable, { once: true });\n    } else {\n      this.#enable();\n    }\n  }\n\n  stop() {\n    if (!this.started) return\n\n    this.eventTarget.removeEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.removeEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.removeEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = false;\n  }\n\n  #enable = () => {\n    this.eventTarget.addEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.addEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.addEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = true;\n  }\n\n  #tryToPrefetchRequest = (event) => {\n    if (getMetaContent(\"turbo-prefetch\") === \"false\") return\n\n    const target = event.target;\n    const isLink = target.matches && target.matches(\"a[href]:not([target^=_]):not([download])\");\n\n    if (isLink && this.#isPrefetchable(target)) {\n      const link = target;\n      const location = getLocationForLink(link);\n\n      if (this.delegate.canPrefetchRequestToLocation(link, location)) {\n        this.#prefetchedLink = link;\n\n        const fetchRequest = new FetchRequest(\n          this,\n          FetchMethod.get,\n          location,\n          new URLSearchParams(),\n          target\n        );\n\n        fetchRequest.fetchOptions.priority = \"low\";\n\n        prefetchCache.putLater(location, fetchRequest, this.#cacheTtl);\n      }\n    }\n  }\n\n  #cancelRequestIfObsolete = (event) => {\n    if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();\n  }\n\n  #cancelPrefetchRequest = () => {\n    prefetchCache.clear();\n    this.#prefetchedLink = null;\n  }\n\n  #tryToUsePrefetchedRequest = (event) => {\n    if (event.target.tagName !== \"FORM\" && event.detail.fetchOptions.method === \"GET\") {\n      const cached = prefetchCache.get(event.detail.url);\n\n      if (cached) {\n        // User clicked link, use cache response\n        event.detail.fetchRequest = cached;\n      }\n\n      prefetchCache.clear();\n    }\n  }\n\n  prepareRequest(request) {\n    const link = request.target;\n\n    request.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n\n    const turboFrame = link.closest(\"turbo-frame\");\n    const turboFrameTarget = link.getAttribute(\"data-turbo-frame\") || turboFrame?.getAttribute(\"target\") || turboFrame?.id;\n\n    if (turboFrameTarget && turboFrameTarget !== \"_top\") {\n      request.headers[\"Turbo-Frame\"] = turboFrameTarget;\n    }\n  }\n\n  // Fetch request interface\n\n  requestSucceededWithResponse() {}\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  get #cacheTtl() {\n    return Number(getMetaContent(\"turbo-prefetch-cache-time\")) || cacheTtl\n  }\n\n  #isPrefetchable(link) {\n    const href = link.getAttribute(\"href\");\n\n    if (!href) return false\n\n    if (unfetchableLink(link)) return false\n    if (linkToTheSamePage(link)) return false\n    if (linkOptsOut(link)) return false\n    if (nonSafeLink(link)) return false\n    if (eventPrevented(link)) return false\n\n    return true\n  }\n}\n\nconst unfetchableLink = (link) => {\n  return link.origin !== document.location.origin || ![\"http:\", \"https:\"].includes(link.protocol) || link.hasAttribute(\"target\")\n};\n\nconst linkToTheSamePage = (link) => {\n  return (link.pathname + link.search === document.location.pathname + document.location.search) || link.href.startsWith(\"#\")\n};\n\nconst linkOptsOut = (link) => {\n  if (link.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n  if (link.getAttribute(\"data-turbo\") === \"false\") return true\n\n  const turboPrefetchParent = findClosestRecursively(link, \"[data-turbo-prefetch]\");\n  if (turboPrefetchParent && turboPrefetchParent.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n\n  return false\n};\n\nconst nonSafeLink = (link) => {\n  const turboMethod = link.getAttribute(\"data-turbo-method\");\n  if (turboMethod && turboMethod.toLowerCase() !== \"get\") return true\n\n  if (isUJS(link)) return true\n  if (link.hasAttribute(\"data-turbo-confirm\")) return true\n  if (link.hasAttribute(\"data-turbo-stream\")) return true\n\n  return false\n};\n\nconst isUJS = (link) => {\n  return link.hasAttribute(\"data-remote\") || link.hasAttribute(\"data-behavior\") || link.hasAttribute(\"data-confirm\") || link.hasAttribute(\"data-method\")\n};\n\nconst eventPrevented = (link) => {\n  const event = dispatch(\"turbo:before-prefetch\", { target: link, cancelable: true });\n  return event.defaultPrevented\n};\n\nclass Navigator {\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  proposeVisit(location, options = {}) {\n    if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n      this.delegate.visitProposedToLocation(location, options);\n    }\n  }\n\n  startVisit(locatable, restorationIdentifier, options = {}) {\n    this.stop();\n    this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, {\n      referrer: this.location,\n      ...options\n    });\n    this.currentVisit.start();\n  }\n\n  submitForm(form, submitter) {\n    this.stop();\n    this.formSubmission = new FormSubmission(this, form, submitter, true);\n\n    this.formSubmission.start();\n  }\n\n  stop() {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n      delete this.formSubmission;\n    }\n\n    if (this.currentVisit) {\n      this.currentVisit.cancel();\n      delete this.currentVisit;\n    }\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get rootLocation() {\n    return this.view.snapshot.rootLocation\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted(formSubmission) {\n    // Not all adapters implement formSubmissionStarted\n    if (typeof this.adapter.formSubmissionStarted === \"function\") {\n      this.adapter.formSubmissionStarted(formSubmission);\n    }\n  }\n\n  async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n    if (formSubmission == this.formSubmission) {\n      const responseHTML = await fetchResponse.responseHTML;\n      if (responseHTML) {\n        const shouldCacheSnapshot = formSubmission.isSafe;\n        if (!shouldCacheSnapshot) {\n          this.view.clearSnapshotCache();\n        }\n\n        const { statusCode, redirected } = fetchResponse;\n        const action = this.#getActionForFormSubmission(formSubmission, fetchResponse);\n        const visitOptions = {\n          action,\n          shouldCacheSnapshot,\n          response: { statusCode, responseHTML, redirected }\n        };\n        this.proposeVisit(fetchResponse.location, visitOptions);\n      }\n    }\n  }\n\n  async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    const responseHTML = await fetchResponse.responseHTML;\n\n    if (responseHTML) {\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n      if (fetchResponse.serverError) {\n        await this.view.renderError(snapshot, this.currentVisit);\n      } else {\n        await this.view.renderPage(snapshot, false, true, this.currentVisit);\n      }\n      if (snapshot.refreshScroll !== \"preserve\") {\n        this.view.scrollToTop();\n      }\n      this.view.clearSnapshotCache();\n    }\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished(formSubmission) {\n    // Not all adapters implement formSubmissionFinished\n    if (typeof this.adapter.formSubmissionFinished === \"function\") {\n      this.adapter.formSubmissionFinished(formSubmission);\n    }\n  }\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    // Not all adapters implement linkPrefetchingIsEnabledForLocation\n    if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === \"function\") {\n      return this.adapter.linkPrefetchingIsEnabledForLocation(location)\n    }\n\n    return true\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    this.delegate.visitStarted(visit);\n  }\n\n  visitCompleted(visit) {\n    this.delegate.visitCompleted(visit);\n    delete this.currentVisit;\n  }\n\n  // Same-page links are no longer handled with a Visit.\n  // This method is still needed for Turbo Native adapters.\n  locationWithActionIsSamePage(location, action) {\n    return false\n  }\n\n  // Visits\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  #getActionForFormSubmission(formSubmission, fetchResponse) {\n    const { submitter, formElement } = formSubmission;\n    return getVisitAction(submitter, formElement) || this.#getDefaultAction(fetchResponse)\n  }\n\n  #getDefaultAction(fetchResponse) {\n    const sameLocationRedirect = fetchResponse.redirected && fetchResponse.location.href === this.location?.href;\n    return sameLocationRedirect ? \"replace\" : \"advance\"\n  }\n}\n\nconst PageStage = {\n  initial: 0,\n  loading: 1,\n  interactive: 2,\n  complete: 3\n};\n\nclass PageObserver {\n  stage = PageStage.initial\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      if (this.stage == PageStage.initial) {\n        this.stage = PageStage.loading;\n      }\n      document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n      addEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n      removeEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = false;\n    }\n  }\n\n  interpretReadyState = () => {\n    const { readyState } = this;\n    if (readyState == \"interactive\") {\n      this.pageIsInteractive();\n    } else if (readyState == \"complete\") {\n      this.pageIsComplete();\n    }\n  }\n\n  pageIsInteractive() {\n    if (this.stage == PageStage.loading) {\n      this.stage = PageStage.interactive;\n      this.delegate.pageBecameInteractive();\n    }\n  }\n\n  pageIsComplete() {\n    this.pageIsInteractive();\n    if (this.stage == PageStage.interactive) {\n      this.stage = PageStage.complete;\n      this.delegate.pageLoaded();\n    }\n  }\n\n  pageWillUnload = () => {\n    this.delegate.pageWillUnload();\n  }\n\n  get readyState() {\n    return document.readyState\n  }\n}\n\nclass ScrollObserver {\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"scroll\", this.onScroll, false);\n      this.onScroll();\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"scroll\", this.onScroll, false);\n      this.started = false;\n    }\n  }\n\n  onScroll = () => {\n    this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n  }\n\n  // Private\n\n  updatePosition(position) {\n    this.delegate.scrollPositionChanged(position);\n  }\n}\n\nclass StreamMessageRenderer {\n  render({ fragment }) {\n    Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => {\n      withAutofocusFromFragment(fragment, () => {\n        withPreservedFocus(() => {\n          document.documentElement.appendChild(fragment);\n        });\n      });\n    });\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement, newPermanentElement) {\n    newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n  }\n\n  leavingBardo() {}\n}\n\nfunction getPermanentElementMapForFragment(fragment) {\n  const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n  const permanentElementMap = {};\n  for (const permanentElementInDocument of permanentElementsInDocument) {\n    const { id } = permanentElementInDocument;\n\n    for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n      const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n\n      if (elementInStream) {\n        permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n      }\n    }\n  }\n\n  return permanentElementMap\n}\n\nasync function withAutofocusFromFragment(fragment, callback) {\n  const generatedID = `turbo-stream-autofocus-${uuid()}`;\n  const turboStreams = fragment.querySelectorAll(\"turbo-stream\");\n  const elementWithAutofocus = firstAutofocusableElementInStreams(turboStreams);\n  let willAutofocusId = null;\n\n  if (elementWithAutofocus) {\n    if (elementWithAutofocus.id) {\n      willAutofocusId = elementWithAutofocus.id;\n    } else {\n      willAutofocusId = generatedID;\n    }\n\n    elementWithAutofocus.id = willAutofocusId;\n  }\n\n  callback();\n  await nextRepaint();\n\n  const hasNoActiveElement = document.activeElement == null || document.activeElement == document.body;\n\n  if (hasNoActiveElement && willAutofocusId) {\n    const elementToAutofocus = document.getElementById(willAutofocusId);\n\n    if (elementIsFocusable(elementToAutofocus)) {\n      elementToAutofocus.focus();\n    }\n    if (elementToAutofocus && elementToAutofocus.id == generatedID) {\n      elementToAutofocus.removeAttribute(\"id\");\n    }\n  }\n}\n\nasync function withPreservedFocus(callback) {\n  const [activeElementBeforeRender, activeElementAfterRender] = await around(callback, () => document.activeElement);\n\n  const restoreFocusTo = activeElementBeforeRender && activeElementBeforeRender.id;\n\n  if (restoreFocusTo) {\n    const elementToFocus = document.getElementById(restoreFocusTo);\n\n    if (elementIsFocusable(elementToFocus) && elementToFocus != activeElementAfterRender) {\n      elementToFocus.focus();\n    }\n  }\n}\n\nfunction firstAutofocusableElementInStreams(nodeListOfStreamElements) {\n  for (const streamElement of nodeListOfStreamElements) {\n    const elementWithAutofocus = queryAutofocusableElement(streamElement.templateElement.content);\n\n    if (elementWithAutofocus) return elementWithAutofocus\n  }\n\n  return null\n}\n\nclass StreamObserver {\n  sources = new Set()\n  #started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.#started) {\n      this.#started = true;\n      addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  stop() {\n    if (this.#started) {\n      this.#started = false;\n      removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  connectStreamSource(source) {\n    if (!this.streamSourceIsConnected(source)) {\n      this.sources.add(source);\n      source.addEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  disconnectStreamSource(source) {\n    if (this.streamSourceIsConnected(source)) {\n      this.sources.delete(source);\n      source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  streamSourceIsConnected(source) {\n    return this.sources.has(source)\n  }\n\n  inspectFetchResponse = (event) => {\n    const response = fetchResponseFromEvent(event);\n    if (response && fetchResponseIsStream(response)) {\n      event.preventDefault();\n      this.receiveMessageResponse(response);\n    }\n  }\n\n  receiveMessageEvent = (event) => {\n    if (this.#started && typeof event.data == \"string\") {\n      this.receiveMessageHTML(event.data);\n    }\n  }\n\n  async receiveMessageResponse(response) {\n    const html = await response.responseHTML;\n    if (html) {\n      this.receiveMessageHTML(html);\n    }\n  }\n\n  receiveMessageHTML(html) {\n    this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n  }\n}\n\nfunction fetchResponseFromEvent(event) {\n  const fetchResponse = event.detail?.fetchResponse;\n  if (fetchResponse instanceof FetchResponse) {\n    return fetchResponse\n  }\n}\n\nfunction fetchResponseIsStream(response) {\n  const contentType = response.contentType ?? \"\";\n  return contentType.startsWith(StreamMessage.contentType)\n}\n\nclass ErrorRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const { documentElement, body } = document;\n\n    documentElement.replaceChild(newElement, body);\n  }\n\n  async render() {\n    this.replaceHeadAndBody();\n    this.activateScriptElements();\n  }\n\n  replaceHeadAndBody() {\n    const { documentElement, head } = document;\n    documentElement.replaceChild(this.newHead, head);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  activateScriptElements() {\n    for (const replaceableElement of this.scriptElements) {\n      const parentNode = replaceableElement.parentNode;\n      if (parentNode) {\n        const element = activateScriptElement(replaceableElement);\n        parentNode.replaceChild(element, replaceableElement);\n      }\n    }\n  }\n\n  get newHead() {\n    return this.newSnapshot.headSnapshot.element\n  }\n\n  get scriptElements() {\n    return document.documentElement.querySelectorAll(\"script\")\n  }\n}\n\nclass PageRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    if (document.body && newElement instanceof HTMLBodyElement) {\n      document.body.replaceWith(newElement);\n    } else {\n      document.documentElement.appendChild(newElement);\n    }\n  }\n\n  get shouldRender() {\n    return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical\n  }\n\n  get reloadReason() {\n    if (!this.newSnapshot.isVisitable) {\n      return {\n        reason: \"turbo_visit_control_is_reload\"\n      }\n    }\n\n    if (!this.trackedElementsAreIdentical) {\n      return {\n        reason: \"tracked_element_mismatch\"\n      }\n    }\n  }\n\n  async prepareToRender() {\n    this.#setLanguage();\n    await this.mergeHead();\n  }\n\n  async render() {\n    if (this.willRender) {\n      await this.replaceBody();\n    }\n  }\n\n  finishRendering() {\n    super.finishRendering();\n    if (!this.isPreview) {\n      this.focusFirstAutofocusableElement();\n    }\n  }\n\n  get currentHeadSnapshot() {\n    return this.currentSnapshot.headSnapshot\n  }\n\n  get newHeadSnapshot() {\n    return this.newSnapshot.headSnapshot\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  #setLanguage() {\n    const { documentElement } = this.currentSnapshot;\n    const { dir, lang } = this.newSnapshot;\n\n    if (lang) {\n      documentElement.setAttribute(\"lang\", lang);\n    } else {\n      documentElement.removeAttribute(\"lang\");\n    }\n    if (dir) {\n      documentElement.setAttribute(\"dir\", dir);\n    } else {\n      documentElement.removeAttribute(\"dir\");\n    }\n  }\n\n  async mergeHead() {\n    const mergedHeadElements = this.mergeProvisionalElements();\n    const newStylesheetElements = this.copyNewHeadStylesheetElements();\n    this.copyNewHeadScriptElements();\n\n    await mergedHeadElements;\n    await newStylesheetElements;\n\n    if (this.willRender) {\n      this.removeUnusedDynamicStylesheetElements();\n    }\n  }\n\n  async replaceBody() {\n    await this.preservingPermanentElements(async () => {\n      this.activateNewBody();\n      await this.assignNewBody();\n    });\n  }\n\n  get trackedElementsAreIdentical() {\n    return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature\n  }\n\n  async copyNewHeadStylesheetElements() {\n    const loadingElements = [];\n\n    for (const element of this.newHeadStylesheetElements) {\n      loadingElements.push(waitForLoad(element));\n\n      document.head.appendChild(element);\n    }\n\n    await Promise.all(loadingElements);\n  }\n\n  copyNewHeadScriptElements() {\n    for (const element of this.newHeadScriptElements) {\n      document.head.appendChild(activateScriptElement(element));\n    }\n  }\n\n  removeUnusedDynamicStylesheetElements() {\n    for (const element of this.unusedDynamicStylesheetElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  async mergeProvisionalElements() {\n    const newHeadElements = [...this.newHeadProvisionalElements];\n\n    for (const element of this.currentHeadProvisionalElements) {\n      if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n        document.head.removeChild(element);\n      }\n    }\n\n    for (const element of newHeadElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  isCurrentElementInElementList(element, elementList) {\n    for (const [index, newElement] of elementList.entries()) {\n      // if title element...\n      if (element.tagName == \"TITLE\") {\n        if (newElement.tagName != \"TITLE\") {\n          continue\n        }\n        if (element.innerHTML == newElement.innerHTML) {\n          elementList.splice(index, 1);\n          return true\n        }\n      }\n\n      // if any other element...\n      if (newElement.isEqualNode(element)) {\n        elementList.splice(index, 1);\n        return true\n      }\n    }\n\n    return false\n  }\n\n  removeCurrentHeadProvisionalElements() {\n    for (const element of this.currentHeadProvisionalElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  copyNewHeadProvisionalElements() {\n    for (const element of this.newHeadProvisionalElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  activateNewBody() {\n    document.adoptNode(this.newElement);\n    this.removeNoscriptElements();\n    this.activateNewBodyScriptElements();\n  }\n\n  removeNoscriptElements() {\n    for (const noscriptElement of this.newElement.querySelectorAll(\"noscript\")) {\n      noscriptElement.remove();\n    }\n  }\n\n  activateNewBodyScriptElements() {\n    for (const inertScriptElement of this.newBodyScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  async assignNewBody() {\n    await this.renderElement(this.currentElement, this.newElement);\n  }\n\n  get unusedDynamicStylesheetElements() {\n    return this.oldHeadStylesheetElements.filter((element) => {\n      return element.getAttribute(\"data-turbo-track\") === \"dynamic\"\n    })\n  }\n\n  get oldHeadStylesheetElements() {\n    return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)\n  }\n\n  get newHeadStylesheetElements() {\n    return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get newHeadScriptElements() {\n    return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get currentHeadProvisionalElements() {\n    return this.currentHeadSnapshot.provisionalElements\n  }\n\n  get newHeadProvisionalElements() {\n    return this.newHeadSnapshot.provisionalElements\n  }\n\n  get newBodyScriptElements() {\n    return this.newElement.querySelectorAll(\"script\")\n  }\n}\n\nclass MorphingPageRenderer extends PageRenderer {\n  static renderElement(currentElement, newElement) {\n    morphElements(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              !closestFrameReloadableWithMorphing(node)\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n\n    dispatch(\"turbo:morph\", { detail: { currentElement, newElement } });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n\n  get renderMethod() {\n    return \"morph\"\n  }\n\n  get shouldAutofocus() {\n    return false\n  }\n}\n\nclass SnapshotCache extends LRUCache {\n  constructor(size) {\n    super(size, toCacheKey);\n  }\n\n  get snapshots() {\n    return this.entries\n  }\n}\n\nclass PageView extends View {\n  snapshotCache = new SnapshotCache(10)\n  lastRenderedLocation = new URL(location.href)\n  forceReloaded = false\n\n  shouldTransitionTo(newSnapshot) {\n    return this.snapshot.prefersViewTransitions && newSnapshot.prefersViewTransitions\n  }\n\n  renderPage(snapshot, isPreview = false, willRender = true, visit) {\n    const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === \"morph\";\n    const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer;\n\n    const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender);\n\n    if (!renderer.shouldRender) {\n      this.forceReloaded = true;\n    } else {\n      visit?.changeHistory();\n    }\n\n    return this.render(renderer)\n  }\n\n  renderError(snapshot, visit) {\n    visit?.changeHistory();\n    const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n    return this.render(renderer)\n  }\n\n  clearSnapshotCache() {\n    this.snapshotCache.clear();\n  }\n\n  async cacheSnapshot(snapshot = this.snapshot) {\n    if (snapshot.isCacheable) {\n      this.delegate.viewWillCacheSnapshot();\n      const { lastRenderedLocation: location } = this;\n      await nextEventLoopTick();\n      const cachedSnapshot = snapshot.clone();\n      this.snapshotCache.put(location, cachedSnapshot);\n      return cachedSnapshot\n    }\n  }\n\n  getCachedSnapshotForLocation(location) {\n    return this.snapshotCache.get(location)\n  }\n\n  isPageRefresh(visit) {\n    return !visit || (this.lastRenderedLocation.pathname === visit.location.pathname && visit.action === \"replace\")\n  }\n\n  shouldPreserveScrollPosition(visit) {\n    return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === \"preserve\"\n  }\n\n  get snapshot() {\n    return PageSnapshot.fromElement(this.element)\n  }\n}\n\nclass Preloader {\n  selector = \"a[data-turbo-preload]\"\n\n  constructor(delegate, snapshotCache) {\n    this.delegate = delegate;\n    this.snapshotCache = snapshotCache;\n  }\n\n  start() {\n    if (document.readyState === \"loading\") {\n      document.addEventListener(\"DOMContentLoaded\", this.#preloadAll);\n    } else {\n      this.preloadOnLoadLinksForView(document.body);\n    }\n  }\n\n  stop() {\n    document.removeEventListener(\"DOMContentLoaded\", this.#preloadAll);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    for (const link of element.querySelectorAll(this.selector)) {\n      if (this.delegate.shouldPreloadLink(link)) {\n        this.preloadURL(link);\n      }\n    }\n  }\n\n  async preloadURL(link) {\n    const location = new URL(link.href);\n\n    if (this.snapshotCache.has(location)) {\n      return\n    }\n\n    const fetchRequest = new FetchRequest(this, FetchMethod.get, location, new URLSearchParams(), link);\n    await fetchRequest.perform();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(fetchRequest) {\n    fetchRequest.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n  }\n\n  async requestSucceededWithResponse(fetchRequest, fetchResponse) {\n    try {\n      const responseHTML = await fetchResponse.responseHTML;\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n\n      this.snapshotCache.put(fetchRequest.url, snapshot);\n    } catch (_) {\n      // If we cannot preload that is ok!\n    }\n  }\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  #preloadAll = () => {\n    this.preloadOnLoadLinksForView(document.body);\n  }\n}\n\nclass Cache {\n  constructor(session) {\n    this.session = session;\n  }\n\n  clear() {\n    this.session.clearCache();\n  }\n\n  resetCacheControl() {\n    this.#setCacheControl(\"\");\n  }\n\n  exemptPageFromCache() {\n    this.#setCacheControl(\"no-cache\");\n  }\n\n  exemptPageFromPreview() {\n    this.#setCacheControl(\"no-preview\");\n  }\n\n  #setCacheControl(value) {\n    setMetaContent(\"turbo-cache-control\", value);\n  }\n}\n\nclass Session {\n  navigator = new Navigator(this)\n  history = new History(this)\n  view = new PageView(this, document.documentElement)\n  adapter = new BrowserAdapter(this)\n\n  pageObserver = new PageObserver(this)\n  cacheObserver = new CacheObserver()\n  linkPrefetchObserver = new LinkPrefetchObserver(this, document)\n  linkClickObserver = new LinkClickObserver(this, window)\n  formSubmitObserver = new FormSubmitObserver(this, document)\n  scrollObserver = new ScrollObserver(this)\n  streamObserver = new StreamObserver(this)\n  formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement)\n  frameRedirector = new FrameRedirector(this, document.documentElement)\n  streamMessageRenderer = new StreamMessageRenderer()\n  cache = new Cache(this)\n\n  enabled = true\n  started = false\n  #pageRefreshDebouncePeriod = 150\n\n  constructor(recentRequests) {\n    this.recentRequests = recentRequests;\n    this.preloader = new Preloader(this, this.view.snapshotCache);\n    this.debouncedRefresh = this.refresh;\n    this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod;\n  }\n\n  start() {\n    if (!this.started) {\n      this.pageObserver.start();\n      this.cacheObserver.start();\n      this.linkPrefetchObserver.start();\n      this.formLinkClickObserver.start();\n      this.linkClickObserver.start();\n      this.formSubmitObserver.start();\n      this.scrollObserver.start();\n      this.streamObserver.start();\n      this.frameRedirector.start();\n      this.history.start();\n      this.preloader.start();\n      this.started = true;\n      this.enabled = true;\n    }\n  }\n\n  disable() {\n    this.enabled = false;\n  }\n\n  stop() {\n    if (this.started) {\n      this.pageObserver.stop();\n      this.cacheObserver.stop();\n      this.linkPrefetchObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkClickObserver.stop();\n      this.formSubmitObserver.stop();\n      this.scrollObserver.stop();\n      this.streamObserver.stop();\n      this.frameRedirector.stop();\n      this.history.stop();\n      this.preloader.stop();\n      this.started = false;\n    }\n  }\n\n  registerAdapter(adapter) {\n    this.adapter = adapter;\n  }\n\n  visit(location, options = {}) {\n    const frameElement = options.frame ? document.getElementById(options.frame) : null;\n\n    if (frameElement instanceof FrameElement) {\n      const action = options.action || getVisitAction(frameElement);\n\n      frameElement.delegate.proposeVisitIfNavigatedWithAction(frameElement, action);\n      frameElement.src = location.toString();\n    } else {\n      this.navigator.proposeVisit(expandURL(location), options);\n    }\n  }\n\n  refresh(url, options = {}) {\n    options = typeof options === \"string\" ? { requestId: options } : options;\n\n    const { method, requestId, scroll } = options;\n    const isRecentRequest = requestId && this.recentRequests.has(requestId);\n    const isCurrentUrl = url === document.baseURI;\n    if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) {\n      this.visit(url, { action: \"replace\", shouldCacheSnapshot: false, refresh: { method, scroll } });\n    }\n  }\n\n  connectStreamSource(source) {\n    this.streamObserver.connectStreamSource(source);\n  }\n\n  disconnectStreamSource(source) {\n    this.streamObserver.disconnectStreamSource(source);\n  }\n\n  renderStreamMessage(message) {\n    this.streamMessageRenderer.render(StreamMessage.wrap(message));\n  }\n\n  clearCache() {\n    this.view.clearSnapshotCache();\n  }\n\n  setProgressBarDelay(delay) {\n    console.warn(\n      \"Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`\"\n    );\n\n    this.progressBarDelay = delay;\n  }\n\n  set progressBarDelay(delay) {\n    config.drive.progressBarDelay = delay;\n  }\n\n  get progressBarDelay() {\n    return config.drive.progressBarDelay\n  }\n\n  set drive(value) {\n    config.drive.enabled = value;\n  }\n\n  get drive() {\n    return config.drive.enabled\n  }\n\n  set formMode(value) {\n    config.forms.mode = value;\n  }\n\n  get formMode() {\n    return config.forms.mode\n  }\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  get pageRefreshDebouncePeriod() {\n    return this.#pageRefreshDebouncePeriod\n  }\n\n  set pageRefreshDebouncePeriod(value) {\n    this.refresh = debounce(this.debouncedRefresh.bind(this), value);\n    this.#pageRefreshDebouncePeriod = value;\n  }\n\n  // Preloader delegate\n\n  shouldPreloadLink(element) {\n    const isUnsafe = element.hasAttribute(\"data-turbo-method\");\n    const isStream = element.hasAttribute(\"data-turbo-stream\");\n    const frameTarget = element.getAttribute(\"data-turbo-frame\");\n    const frame = frameTarget == \"_top\" ?\n      null :\n      document.getElementById(frameTarget) || findClosestRecursively(element, \"turbo-frame:not([disabled])\");\n\n    if (isUnsafe || isStream || frame instanceof FrameElement) {\n      return false\n    } else {\n      const location = new URL(element.href);\n\n      return this.elementIsNavigatable(element) && locationIsVisitable(location, this.snapshot.rootLocation)\n    }\n  }\n\n  // History delegate\n\n  historyPoppedToLocationWithRestorationIdentifierAndDirection(location, restorationIdentifier, direction) {\n    if (this.enabled) {\n      this.navigator.startVisit(location, restorationIdentifier, {\n        action: \"restore\",\n        historyChanged: true,\n        direction\n      });\n    } else {\n      this.adapter.pageInvalidated({\n        reason: \"turbo_disabled\"\n      });\n    }\n  }\n\n  historyPoppedWithEmptyState(location) {\n    this.history.replace(location);\n    this.view.lastRenderedLocation = location;\n    this.view.cacheSnapshot();\n  }\n\n  // Scroll observer delegate\n\n  scrollPositionChanged(position) {\n    this.history.updateRestorationData({ scrollPosition: position });\n  }\n\n  // Form click observer delegate\n\n  willSubmitFormLinkToLocation(link, location) {\n    return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation)\n  }\n\n  submittedFormLinkToLocation() {}\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.navigator.linkPrefetchingIsEnabledForLocation(location)\n    )\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, event) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.applicationAllowsFollowingLinkToLocation(link, location, event)\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const action = this.getActionForLink(link);\n    const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n\n    this.visit(location.href, { action, acceptsStreamResponse });\n  }\n\n  // Navigator delegate\n\n  allowsVisitingLocationWithAction(location, action) {\n    return this.applicationAllowsVisitingLocation(location)\n  }\n\n  visitProposedToLocation(location, options) {\n    extendURLWithDeprecatedProperties(location);\n    this.adapter.visitProposedToLocation(location, options);\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    if (!visit.acceptsStreamResponse) {\n      markAsBusy(document.documentElement);\n      this.view.markVisitDirection(visit.direction);\n    }\n    extendURLWithDeprecatedProperties(visit.location);\n    this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n  }\n\n  visitCompleted(visit) {\n    this.view.unmarkVisitDirection();\n    clearBusyState(document.documentElement);\n    this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return (\n      this.submissionIsNavigatable(form, submitter) &&\n      locationIsVisitable(expandURL(action), this.snapshot.rootLocation)\n    )\n  }\n\n  formSubmitted(form, submitter) {\n    this.navigator.submitForm(form, submitter);\n  }\n\n  // Page observer delegate\n\n  pageBecameInteractive() {\n    this.view.lastRenderedLocation = this.location;\n    this.notifyApplicationAfterPageLoad();\n  }\n\n  pageLoaded() {\n    this.history.assumeControlOfScrollRestoration();\n  }\n\n  pageWillUnload() {\n    this.history.relinquishControlOfScrollRestoration();\n  }\n\n  // Stream observer delegate\n\n  receivedMessageFromStream(message) {\n    this.renderStreamMessage(message);\n  }\n\n  // Page view delegate\n\n  viewWillCacheSnapshot() {\n    this.notifyApplicationBeforeCachingSnapshot();\n  }\n\n  allowsImmediateRender({ element }, options) {\n    const event = this.notifyApplicationBeforeRender(element, options);\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, renderMethod) {\n    this.view.lastRenderedLocation = this.history.location;\n    this.notifyApplicationAfterRender(renderMethod);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    this.preloader.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated(reason) {\n    this.adapter.pageInvalidated(reason);\n  }\n\n  // Frame element\n\n  frameLoaded(frame) {\n    this.notifyApplicationAfterFrameLoad(frame);\n  }\n\n  frameRendered(fetchResponse, frame) {\n    this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n  }\n\n  // Application events\n\n  applicationAllowsFollowingLinkToLocation(link, location, ev) {\n    const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n    return !event.defaultPrevented\n  }\n\n  applicationAllowsVisitingLocation(location) {\n    const event = this.notifyApplicationBeforeVisitingLocation(location);\n    return !event.defaultPrevented\n  }\n\n  notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n    return dispatch(\"turbo:click\", {\n      target: link,\n      detail: { url: location.href, originalEvent: event },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationBeforeVisitingLocation(location) {\n    return dispatch(\"turbo:before-visit\", {\n      detail: { url: location.href },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterVisitingLocation(location, action) {\n    return dispatch(\"turbo:visit\", { detail: { url: location.href, action } })\n  }\n\n  notifyApplicationBeforeCachingSnapshot() {\n    return dispatch(\"turbo:before-cache\")\n  }\n\n  notifyApplicationBeforeRender(newBody, options) {\n    return dispatch(\"turbo:before-render\", {\n      detail: { newBody, ...options },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterRender(renderMethod) {\n    return dispatch(\"turbo:render\", { detail: { renderMethod } })\n  }\n\n  notifyApplicationAfterPageLoad(timing = {}) {\n    return dispatch(\"turbo:load\", {\n      detail: { url: this.location.href, timing }\n    })\n  }\n\n  notifyApplicationAfterFrameLoad(frame) {\n    return dispatch(\"turbo:frame-load\", { target: frame })\n  }\n\n  notifyApplicationAfterFrameRender(fetchResponse, frame) {\n    return dispatch(\"turbo:frame-render\", {\n      detail: { fetchResponse },\n      target: frame,\n      cancelable: true\n    })\n  }\n\n  // Helpers\n\n  submissionIsNavigatable(form, submitter) {\n    if (config.forms.mode == \"off\") {\n      return false\n    } else {\n      const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n\n      if (config.forms.mode == \"optin\") {\n        return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null\n      } else {\n        return submitterIsNavigatable && this.elementIsNavigatable(form)\n      }\n    }\n  }\n\n  elementIsNavigatable(element) {\n    const container = findClosestRecursively(element, \"[data-turbo]\");\n    const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n\n    // Check if Drive is enabled on the session or we're within a Frame.\n    if (config.drive.enabled || withinFrame) {\n      // Element is navigatable by default, unless `data-turbo=\"false\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") != \"false\"\n      } else {\n        return true\n      }\n    } else {\n      // Element isn't navigatable by default, unless `data-turbo=\"true\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") == \"true\"\n      } else {\n        return false\n      }\n    }\n  }\n\n  // Private\n\n  getActionForLink(link) {\n    return getVisitAction(link) || \"advance\"\n  }\n\n  get snapshot() {\n    return this.view.snapshot\n  }\n}\n\n// Older versions of the Turbo Native adapters referenced the\n// `Location#absoluteURL` property in their implementations of\n// the `Adapter#visitProposedToLocation()` and `#visitStarted()`\n// methods. The Location class has since been removed in favor\n// of the DOM URL API, and accordingly all Adapter methods now\n// receive URL objects.\n//\n// We alias #absoluteURL to #toString() here to avoid crashing\n// older adapters which do not expect URL objects. We should\n// consider removing this support at some point in the future.\n\nfunction extendURLWithDeprecatedProperties(url) {\n  Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\n\nconst deprecatedLocationPropertyDescriptors = {\n  absoluteURL: {\n    get() {\n      return this.toString()\n    }\n  }\n};\n\nconst session = new Session(recentRequests);\n\n// Rename `navigator` to avoid shadowing `window.navigator`\nconst { cache, navigator: sessionNavigator } = session;\n\n/**\n * Starts the main session.\n * This initialises any necessary observers such as those to monitor\n * link interactions.\n */\nfunction start() {\n  session.start();\n}\n\n/**\n * Registers an adapter for the main session.\n *\n * @param adapter Adapter to register\n */\nfunction registerAdapter(adapter) {\n  session.registerAdapter(adapter);\n}\n\n/**\n * Performs an application visit to the given location.\n *\n * @param location Location to visit (a URL or path)\n * @param options Options to apply\n * @param options.action Type of history navigation to apply (\"restore\",\n * \"replace\" or \"advance\")\n * @param options.historyChanged Specifies whether the browser history has\n * already been changed for this visit or not\n * @param options.referrer Specifies the referrer of this visit such that\n * navigations to the same page will not result in a new history entry.\n * @param options.snapshotHTML Cached snapshot to render\n * @param options.response Response of the specified location\n */\nfunction visit(location, options) {\n  session.visit(location, options);\n}\n\n/**\n * Connects a stream source to the main session.\n *\n * @param source Stream source to connect\n */\nfunction connectStreamSource(source) {\n  session.connectStreamSource(source);\n}\n\n/**\n * Disconnects a stream source from the main session.\n *\n * @param source Stream source to disconnect\n */\nfunction disconnectStreamSource(source) {\n  session.disconnectStreamSource(source);\n}\n\n/**\n * Renders a stream message to the main session by appending it to the\n * current document.\n *\n * @param message Message to render\n */\nfunction renderStreamMessage(message) {\n  session.renderStreamMessage(message);\n}\n\n/**\n * Sets the delay after which the progress bar will appear during navigation.\n *\n * The progress bar appears after 500ms by default.\n *\n * Note that this method has no effect when used with the iOS or Android\n * adapters.\n *\n * @param delay Time to delay in milliseconds\n */\nfunction setProgressBarDelay(delay) {\n  console.warn(\n    \"Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.drive.progressBarDelay = delay;\n}\n\nfunction setConfirmMethod(confirmMethod) {\n  console.warn(\n    \"Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.confirm = confirmMethod;\n}\n\nfunction setFormMode(mode) {\n  console.warn(\n    \"Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.mode = mode;\n}\n\n/**\n * Morph the state of the currentBody based on the attributes and contents of\n * the newBody. Morphing body elements may dispatch turbo:morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentBody HTMLBodyElement destination of morphing changes\n * @param newBody HTMLBodyElement source of morphing changes\n */\nfunction morphBodyElements(currentBody, newBody) {\n  MorphingPageRenderer.renderElement(currentBody, newBody);\n}\n\n/**\n * Morph the child elements of the currentFrame based on the child elements of\n * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentFrame FrameElement destination of morphing children changes\n * @param newFrame FrameElement source of morphing children changes\n */\nfunction morphTurboFrameElements(currentFrame, newFrame) {\n  MorphingFrameRenderer.renderElement(currentFrame, newFrame);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  PageRenderer: PageRenderer,\n  PageSnapshot: PageSnapshot,\n  FrameRenderer: FrameRenderer,\n  fetch: fetchWithTurboHeaders,\n  config: config,\n  session: session,\n  cache: cache,\n  navigator: sessionNavigator,\n  start: start,\n  registerAdapter: registerAdapter,\n  visit: visit,\n  connectStreamSource: connectStreamSource,\n  disconnectStreamSource: disconnectStreamSource,\n  renderStreamMessage: renderStreamMessage,\n  setProgressBarDelay: setProgressBarDelay,\n  setConfirmMethod: setConfirmMethod,\n  setFormMode: setFormMode,\n  morphBodyElements: morphBodyElements,\n  morphTurboFrameElements: morphTurboFrameElements,\n  morphChildren: morphChildren,\n  morphElements: morphElements\n});\n\nclass TurboFrameMissingError extends Error {}\n\nclass FrameController {\n  fetchResponseLoaded = (_fetchResponse) => Promise.resolve()\n  #currentFetchRequest = null\n  #resolveVisitPromise = () => {}\n  #connected = false\n  #hasBeenLoaded = false\n  #ignoredAttributes = new Set()\n  #shouldMorphFrame = false\n  action = null\n\n  constructor(element) {\n    this.element = element;\n    this.view = new FrameView(this, this.element);\n    this.appearanceObserver = new AppearanceObserver(this, this.element);\n    this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n    this.linkInterceptor = new LinkInterceptor(this, this.element);\n    this.restorationIdentifier = uuid();\n    this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n  }\n\n  // Frame delegate\n\n  connect() {\n    if (!this.#connected) {\n      this.#connected = true;\n      if (this.loadingStyle == FrameLoadingStyle.lazy) {\n        this.appearanceObserver.start();\n      } else {\n        this.#loadSourceURL();\n      }\n      this.formLinkClickObserver.start();\n      this.linkInterceptor.start();\n      this.formSubmitObserver.start();\n    }\n  }\n\n  disconnect() {\n    if (this.#connected) {\n      this.#connected = false;\n      this.appearanceObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkInterceptor.stop();\n      this.formSubmitObserver.stop();\n\n      if (!this.element.hasAttribute(\"recurse\")) {\n        this.#currentFetchRequest?.cancel();\n      }\n    }\n  }\n\n  disabledChanged() {\n    if (this.disabled) {\n      this.#currentFetchRequest?.cancel();\n    } else if (this.loadingStyle == FrameLoadingStyle.eager) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLChanged() {\n    if (this.#isIgnoringChangesTo(\"src\")) return\n\n    if (!this.sourceURL) {\n      this.#currentFetchRequest?.cancel();\n    }\n\n    if (this.element.isConnected) {\n      this.complete = false;\n    }\n\n    if (this.loadingStyle == FrameLoadingStyle.eager || this.#hasBeenLoaded) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLReloaded() {\n    const { refresh, src } = this.element;\n\n    this.#shouldMorphFrame = src && refresh === \"morph\";\n\n    this.element.removeAttribute(\"complete\");\n    this.element.src = null;\n    this.element.src = src;\n    return this.element.loaded\n  }\n\n  loadingStyleChanged() {\n    if (this.loadingStyle == FrameLoadingStyle.lazy) {\n      this.appearanceObserver.start();\n    } else {\n      this.appearanceObserver.stop();\n      this.#loadSourceURL();\n    }\n  }\n\n  async #loadSourceURL() {\n    if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n      this.element.loaded = this.#visit(expandURL(this.sourceURL));\n      this.appearanceObserver.stop();\n      await this.element.loaded;\n      this.#hasBeenLoaded = true;\n    }\n  }\n\n  async loadResponse(fetchResponse) {\n    if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n      this.sourceURL = fetchResponse.response.url;\n    }\n\n    try {\n      const html = await fetchResponse.responseHTML;\n      if (html) {\n        const document = parseHTMLDocument(html);\n        const pageSnapshot = PageSnapshot.fromDocument(document);\n\n        if (pageSnapshot.isVisitable) {\n          await this.#loadFrameResponse(fetchResponse, document);\n        } else {\n          await this.#handleUnvisitableFrameResponse(fetchResponse);\n        }\n      }\n    } finally {\n      this.#shouldMorphFrame = false;\n      this.fetchResponseLoaded = () => Promise.resolve();\n    }\n  }\n\n  // Appearance observer delegate\n\n  elementAppearedInViewport(element) {\n    this.proposeVisitIfNavigatedWithAction(element, getVisitAction(element));\n    this.#loadSourceURL();\n  }\n\n  // Form link click observer delegate\n\n  willSubmitFormLinkToLocation(link) {\n    return this.#shouldInterceptNavigation(link)\n  }\n\n  submittedFormLinkToLocation(link, _location, form) {\n    const frame = this.#findFrameElement(link);\n    if (frame) form.setAttribute(\"data-turbo-frame\", frame.id);\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldInterceptNavigation(element)\n  }\n\n  linkClickIntercepted(element, location) {\n    this.#navigateFrame(element, location);\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return element.closest(\"turbo-frame\") == this.element && this.#shouldInterceptNavigation(element, submitter)\n  }\n\n  formSubmitted(element, submitter) {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n    }\n\n    this.formSubmission = new FormSubmission(this, element, submitter);\n\n    const { fetchRequest } = this.formSubmission;\n    const frame = this.#findFrameElement(element, submitter);\n\n    this.prepareRequest(fetchRequest, frame);\n    this.formSubmission.start();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request, frame = this) {\n    request.headers[\"Turbo-Frame\"] = frame.id;\n\n    if (this.currentNavigationElement?.hasAttribute(\"data-turbo-stream\")) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    markAsBusy(this.element);\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {\n    this.#resolveVisitPromise();\n  }\n\n  async requestSucceededWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  async requestFailedWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  requestErrored(request, error) {\n    console.error(error);\n    this.#resolveVisitPromise();\n  }\n\n  requestFinished(_request) {\n    clearBusyState(this.element);\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted({ formElement }) {\n    markAsBusy(formElement, this.#findFrameElement(formElement));\n  }\n\n  formSubmissionSucceededWithResponse(formSubmission, response) {\n    const frame = this.#findFrameElement(formSubmission.formElement, formSubmission.submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(formSubmission.submitter, formSubmission.formElement, frame));\n    frame.delegate.loadResponse(response);\n\n    if (!formSubmission.isSafe) {\n      session.clearCache();\n    }\n  }\n\n  formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    this.element.delegate.loadResponse(fetchResponse);\n    session.clearCache();\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished({ formElement }) {\n    clearBusyState(formElement, this.#findFrameElement(formElement));\n  }\n\n  // View delegate\n\n  allowsImmediateRender({ element: newFrame }, options) {\n    const event = dispatch(\"turbo:before-frame-render\", {\n      target: this.element,\n      detail: { newFrame, ...options },\n      cancelable: true\n    });\n\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, _renderMethod) {}\n\n  preloadOnLoadLinksForView(element) {\n    session.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated() {}\n\n  // Frame renderer delegate\n\n  willRenderFrame(currentElement, _newElement) {\n    this.previousFrameElement = currentElement.cloneNode(true);\n  }\n\n  visitCachedSnapshot = ({ element }) => {\n    const frame = element.querySelector(\"#\" + this.element.id);\n\n    if (frame && this.previousFrameElement) {\n      frame.replaceChildren(...this.previousFrameElement.children);\n    }\n\n    delete this.previousFrameElement;\n  }\n\n  // Private\n\n  async #loadFrameResponse(fetchResponse, document) {\n    const newFrameElement = await this.extractForeignFrameElement(document.body);\n    const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer;\n\n    if (newFrameElement) {\n      const snapshot = new Snapshot(newFrameElement);\n      const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false);\n      if (this.view.renderPromise) await this.view.renderPromise;\n      this.changeHistory();\n\n      await this.view.render(renderer);\n      this.complete = true;\n      session.frameRendered(fetchResponse, this.element);\n      session.frameLoaded(this.element);\n      await this.fetchResponseLoaded(fetchResponse);\n    } else if (this.#willHandleFrameMissingFromResponse(fetchResponse)) {\n      this.#handleFrameMissingFromResponse(fetchResponse);\n    }\n  }\n\n  async #visit(url) {\n    const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n\n    this.#currentFetchRequest?.cancel();\n    this.#currentFetchRequest = request;\n\n    return new Promise((resolve) => {\n      this.#resolveVisitPromise = () => {\n        this.#resolveVisitPromise = () => {};\n        this.#currentFetchRequest = null;\n        resolve();\n      };\n      request.perform();\n    })\n  }\n\n  #navigateFrame(element, url, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(submitter, element, frame));\n\n    this.#withCurrentNavigationElement(element, () => {\n      frame.src = url;\n    });\n  }\n\n  proposeVisitIfNavigatedWithAction(frame, action = null) {\n    this.action = action;\n\n    if (this.action) {\n      const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n      const { visitCachedSnapshot } = frame.delegate;\n\n      frame.delegate.fetchResponseLoaded = async (fetchResponse) => {\n        if (frame.src) {\n          const { statusCode, redirected } = fetchResponse;\n          const responseHTML = await fetchResponse.responseHTML;\n          const response = { statusCode, redirected, responseHTML };\n          const options = {\n            response,\n            visitCachedSnapshot,\n            willRender: false,\n            updateHistory: false,\n            restorationIdentifier: this.restorationIdentifier,\n            snapshot: pageSnapshot\n          };\n\n          if (this.action) options.action = this.action;\n\n          session.visit(frame.src, options);\n        }\n      };\n    }\n  }\n\n  changeHistory() {\n    if (this.action) {\n      const method = getHistoryMethodForAction(this.action);\n      session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n    }\n  }\n\n  async #handleUnvisitableFrameResponse(fetchResponse) {\n    console.warn(\n      `The response (${fetchResponse.statusCode}) from <turbo-frame id=\"${this.element.id}\"> is performing a full page visit due to turbo-visit-control.`\n    );\n\n    await this.#visitResponse(fetchResponse.response);\n  }\n\n  #willHandleFrameMissingFromResponse(fetchResponse) {\n    this.element.setAttribute(\"complete\", \"\");\n\n    const response = fetchResponse.response;\n    const visit = async (url, options) => {\n      if (url instanceof Response) {\n        this.#visitResponse(url);\n      } else {\n        session.visit(url, options);\n      }\n    };\n\n    const event = dispatch(\"turbo:frame-missing\", {\n      target: this.element,\n      detail: { response, visit },\n      cancelable: true\n    });\n\n    return !event.defaultPrevented\n  }\n\n  #handleFrameMissingFromResponse(fetchResponse) {\n    this.view.missing();\n    this.#throwFrameMissingError(fetchResponse);\n  }\n\n  #throwFrameMissingError(fetchResponse) {\n    const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id=\"${this.element.id}\"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n    throw new TurboFrameMissingError(message)\n  }\n\n  async #visitResponse(response) {\n    const wrapped = new FetchResponse(response);\n    const responseHTML = await wrapped.responseHTML;\n    const { location, redirected, statusCode } = wrapped;\n\n    return session.visit(location, { response: { redirected, statusCode, responseHTML } })\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n    const target = this.#getFrameElementById(id);\n\n    return target instanceof FrameElement ? target : this.element\n  }\n\n  async extractForeignFrameElement(container) {\n    let element;\n    const id = CSS.escape(this.id);\n\n    try {\n      element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n      if (element) {\n        return element\n      }\n\n      element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n      if (element) {\n        await element.loaded;\n        return await this.extractForeignFrameElement(element)\n      }\n    } catch (error) {\n      console.error(error);\n      return new FrameElement()\n    }\n\n    return null\n  }\n\n  #formActionIsVisitable(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return locationIsVisitable(expandURL(action), this.rootLocation)\n  }\n\n  #shouldInterceptNavigation(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n\n    if (element instanceof HTMLFormElement && !this.#formActionIsVisitable(element, submitter)) {\n      return false\n    }\n\n    if (!this.enabled || id == \"_top\") {\n      return false\n    }\n\n    if (id) {\n      const frameElement = this.#getFrameElementById(id);\n      if (frameElement) {\n        return !frameElement.disabled\n      } else if (id == \"_parent\") {\n        return false\n      }\n    }\n\n    if (!session.elementIsNavigatable(element)) {\n      return false\n    }\n\n    if (submitter && !session.elementIsNavigatable(submitter)) {\n      return false\n    }\n\n    return true\n  }\n\n  // Computed properties\n\n  get id() {\n    return this.element.id\n  }\n\n  get disabled() {\n    return this.element.disabled\n  }\n\n  get enabled() {\n    return !this.disabled\n  }\n\n  get sourceURL() {\n    if (this.element.src) {\n      return this.element.src\n    }\n  }\n\n  set sourceURL(sourceURL) {\n    this.#ignoringChangesToAttribute(\"src\", () => {\n      this.element.src = sourceURL ?? null;\n    });\n  }\n\n  get loadingStyle() {\n    return this.element.loading\n  }\n\n  get isLoading() {\n    return this.formSubmission !== undefined || this.#resolveVisitPromise() !== undefined\n  }\n\n  get complete() {\n    return this.element.hasAttribute(\"complete\")\n  }\n\n  set complete(value) {\n    if (value) {\n      this.element.setAttribute(\"complete\", \"\");\n    } else {\n      this.element.removeAttribute(\"complete\");\n    }\n  }\n\n  get isActive() {\n    return this.element.isActive && this.#connected\n  }\n\n  get rootLocation() {\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const root = meta?.content ?? \"/\";\n    return expandURL(root)\n  }\n\n  #isIgnoringChangesTo(attributeName) {\n    return this.#ignoredAttributes.has(attributeName)\n  }\n\n  #ignoringChangesToAttribute(attributeName, callback) {\n    this.#ignoredAttributes.add(attributeName);\n    callback();\n    this.#ignoredAttributes.delete(attributeName);\n  }\n\n  #withCurrentNavigationElement(element, callback) {\n    this.currentNavigationElement = element;\n    callback();\n    delete this.currentNavigationElement;\n  }\n\n  #getFrameElementById(id) {\n    if (id != null) {\n      const element = id === \"_parent\" ?\n        this.element.parentElement.closest(\"turbo-frame\") :\n        document.getElementById(id);\n      if (element instanceof FrameElement) {\n        return element\n      }\n    }\n  }\n}\n\nfunction activateElement(element, currentURL) {\n  if (element) {\n    const src = element.getAttribute(\"src\");\n    if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n      throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`)\n    }\n    if (element.ownerDocument !== document) {\n      element = document.importNode(element, true);\n    }\n\n    if (element instanceof FrameElement) {\n      element.connectedCallback();\n      element.disconnectedCallback();\n      return element\n    }\n  }\n}\n\nconst StreamActions = {\n  after() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling));\n  },\n\n  append() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.append(this.templateContent));\n  },\n\n  before() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e));\n  },\n\n  prepend() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.prepend(this.templateContent));\n  },\n\n  remove() {\n    this.targetElements.forEach((e) => e.remove());\n  },\n\n  replace() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphElements(targetElement, this.templateContent);\n      } else {\n        targetElement.replaceWith(this.templateContent);\n      }\n    });\n  },\n\n  update() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphChildren(targetElement, this.templateContent);\n      } else {\n        targetElement.innerHTML = \"\";\n        targetElement.append(this.templateContent);\n      }\n    });\n  },\n\n  refresh() {\n    const method = this.getAttribute(\"method\");\n    const requestId = this.requestId;\n    const scroll = this.getAttribute(\"scroll\");\n\n    session.refresh(this.baseURI, { method, requestId, scroll });\n  }\n};\n\n// <turbo-stream action=replace target=id><template>...\n\n/**\n * Renders updates to the page from a stream of messages.\n *\n * Using the `action` attribute, this can be configured one of eight ways:\n *\n * - `after` - inserts the result after the target\n * - `append` - appends the result to the target\n * - `before` - inserts the result before the target\n * - `prepend` - prepends the result to the target\n * - `refresh` - initiates a page refresh\n * - `remove` - removes the target\n * - `replace` - replaces the outer HTML of the target\n * - `update` - replaces the inner HTML of the target\n *\n * @customElement turbo-stream\n * @example\n *   <turbo-stream action=\"append\" target=\"dom_id\">\n *     <template>\n *       Content to append to target designated with the dom_id.\n *     </template>\n *   </turbo-stream>\n */\nclass StreamElement extends HTMLElement {\n  static async renderElement(newElement) {\n    await newElement.performAction();\n  }\n\n  async connectedCallback() {\n    try {\n      await this.render();\n    } catch (error) {\n      console.error(error);\n    } finally {\n      this.disconnect();\n    }\n  }\n\n  async render() {\n    return (this.renderPromise ??= (async () => {\n      const event = this.beforeRenderEvent;\n\n      if (this.dispatchEvent(event)) {\n        await nextRepaint();\n        await event.detail.render(this);\n      }\n    })())\n  }\n\n  disconnect() {\n    try {\n      this.remove();\n      // eslint-disable-next-line no-empty\n    } catch {}\n  }\n\n  /**\n   * Removes duplicate children (by ID)\n   */\n  removeDuplicateTargetChildren() {\n    this.duplicateChildren.forEach((c) => c.remove());\n  }\n\n  /**\n   * Gets the list of duplicate children (i.e. those with the same ID)\n   */\n  get duplicateChildren() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute(\"id\"));\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute(\"id\")).map((c) => c.getAttribute(\"id\"));\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute(\"id\")))\n  }\n\n  /**\n  * Removes duplicate siblings (by ID)\n  */\n  removeDuplicateTargetSiblings() {\n    this.duplicateSiblings.forEach((c) => c.remove());\n  }\n\n  /**\n  * Gets the list of duplicate siblings (i.e. those with the same ID)\n  */\n  get duplicateSiblings() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id);\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id);\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.id))\n  }\n\n  /**\n   * Gets the action function to be performed.\n   */\n  get performAction() {\n    if (this.action) {\n      const actionFunction = StreamActions[this.action];\n      if (actionFunction) {\n        return actionFunction\n      }\n      this.#raise(\"unknown action\");\n    }\n    this.#raise(\"action attribute is missing\");\n  }\n\n  /**\n   * Gets the target elements which the template will be rendered to.\n   */\n  get targetElements() {\n    if (this.target) {\n      return this.targetElementsById\n    } else if (this.targets) {\n      return this.targetElementsByQuery\n    } else {\n      this.#raise(\"target or targets attribute is missing\");\n    }\n  }\n\n  /**\n   * Gets the contents of the main `<template>`.\n   */\n  get templateContent() {\n    return this.templateElement.content.cloneNode(true)\n  }\n\n  /**\n   * Gets the main `<template>` used for rendering\n   */\n  get templateElement() {\n    if (this.firstElementChild === null) {\n      const template = this.ownerDocument.createElement(\"template\");\n      this.appendChild(template);\n      return template\n    } else if (this.firstElementChild instanceof HTMLTemplateElement) {\n      return this.firstElementChild\n    }\n    this.#raise(\"first child element must be a <template> element\");\n  }\n\n  /**\n   * Gets the current action.\n   */\n  get action() {\n    return this.getAttribute(\"action\")\n  }\n\n  /**\n   * Gets the current target (an element ID) to which the result will\n   * be rendered.\n   */\n  get target() {\n    return this.getAttribute(\"target\")\n  }\n\n  /**\n   * Gets the current \"targets\" selector (a CSS selector)\n   */\n  get targets() {\n    return this.getAttribute(\"targets\")\n  }\n\n  /**\n   * Reads the request-id attribute\n   */\n  get requestId() {\n    return this.getAttribute(\"request-id\")\n  }\n\n  #raise(message) {\n    throw new Error(`${this.description}: ${message}`)\n  }\n\n  get description() {\n    return (this.outerHTML.match(/<[^>]+>/) ?? [])[0] ?? \"<turbo-stream>\"\n  }\n\n  get beforeRenderEvent() {\n    return new CustomEvent(\"turbo:before-stream-render\", {\n      bubbles: true,\n      cancelable: true,\n      detail: { newStream: this, render: StreamElement.renderElement }\n    })\n  }\n\n  get targetElementsById() {\n    const element = this.ownerDocument?.getElementById(this.target);\n\n    if (element !== null) {\n      return [element]\n    } else {\n      return []\n    }\n  }\n\n  get targetElementsByQuery() {\n    const elements = this.ownerDocument?.querySelectorAll(this.targets);\n\n    if (elements.length !== 0) {\n      return Array.prototype.slice.call(elements)\n    } else {\n      return []\n    }\n  }\n}\n\nclass StreamSourceElement extends HTMLElement {\n  streamSource = null\n\n  connectedCallback() {\n    this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src);\n\n    connectStreamSource(this.streamSource);\n  }\n\n  disconnectedCallback() {\n    if (this.streamSource) {\n      this.streamSource.close();\n\n      disconnectStreamSource(this.streamSource);\n    }\n  }\n\n  get src() {\n    return this.getAttribute(\"src\") || \"\"\n  }\n}\n\nFrameElement.delegateConstructor = FrameController;\n\nif (customElements.get(\"turbo-frame\") === undefined) {\n  customElements.define(\"turbo-frame\", FrameElement);\n}\n\nif (customElements.get(\"turbo-stream\") === undefined) {\n  customElements.define(\"turbo-stream\", StreamElement);\n}\n\nif (customElements.get(\"turbo-stream-source\") === undefined) {\n  customElements.define(\"turbo-stream-source\", StreamSourceElement);\n}\n\n(() => {\n  const scriptElement = document.currentScript;\n  if (!scriptElement) return\n  if (scriptElement.hasAttribute(\"data-turbo-suppress-warning\")) return\n\n  let element = scriptElement.parentElement;\n  while (element) {\n    if (element == document.body) {\n      return console.warn(\n        unindent`\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application’s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        ——\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `,\n        scriptElement.outerHTML\n      )\n    }\n\n    element = element.parentElement;\n  }\n})();\n\nwindow.Turbo = { ...Turbo, StreamActions };\nstart();\n\nexport { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, config, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, morphBodyElements, morphChildren, morphElements, morphTurboFrameElements, sessionNavigator as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit };\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n  return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n  return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n  return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n  if (node == null) {\n    return window;\n  }\n\n  if (node.toString() !== '[object Window]') {\n    var ownerDocument = node.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView || window : window;\n  }\n\n  return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n  var OwnElement = getWindow(node).Element;\n  return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n  var OwnElement = getWindow(node).HTMLElement;\n  return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n  // IE 11 has no ShadowRoot\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n\n  var OwnElement = getWindow(node).ShadowRoot;\n  return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n  var state = _ref.state;\n  Object.keys(state.elements).forEach(function (name) {\n    var style = state.styles[name] || {};\n    var attributes = state.attributes[name] || {};\n    var element = state.elements[name]; // arrow is optional + virtual elements\n\n    if (!isHTMLElement(element) || !getNodeName(element)) {\n      return;\n    } // Flow doesn't support to extend this property, but it's the most\n    // effective way to apply styles to an HTMLElement\n    // $FlowFixMe[cannot-write]\n\n\n    Object.assign(element.style, style);\n    Object.keys(attributes).forEach(function (name) {\n      var value = attributes[name];\n\n      if (value === false) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, value === true ? '' : value);\n      }\n    });\n  });\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state;\n  var initialStyles = {\n    popper: {\n      position: state.options.strategy,\n      left: '0',\n      top: '0',\n      margin: '0'\n    },\n    arrow: {\n      position: 'absolute'\n    },\n    reference: {}\n  };\n  Object.assign(state.elements.popper.style, initialStyles.popper);\n  state.styles = initialStyles;\n\n  if (state.elements.arrow) {\n    Object.assign(state.elements.arrow.style, initialStyles.arrow);\n  }\n\n  return function () {\n    Object.keys(state.elements).forEach(function (name) {\n      var element = state.elements[name];\n      var attributes = state.attributes[name] || {};\n      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n      var style = styleProperties.reduce(function (style, property) {\n        style[property] = '';\n        return style;\n      }, {}); // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      }\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (attribute) {\n        element.removeAttribute(attribute);\n      });\n    });\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'applyStyles',\n  enabled: true,\n  phase: 'write',\n  fn: applyStyles,\n  effect: effect,\n  requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n  return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n  var uaData = navigator.userAgentData;\n\n  if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(function (item) {\n      return item.brand + \"/\" + item.version;\n    }).join(' ');\n  }\n\n  return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n  return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n\n  var clientRect = element.getBoundingClientRect();\n  var scaleX = 1;\n  var scaleY = 1;\n\n  if (includeScale && isHTMLElement(element)) {\n    scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n    scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n  }\n\n  var _ref = isElement(element) ? getWindow(element) : window,\n      visualViewport = _ref.visualViewport;\n\n  var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n  var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n  var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n  var width = clientRect.width / scaleX;\n  var height = clientRect.height / scaleY;\n  return {\n    width: width,\n    height: height,\n    top: y,\n    right: x + width,\n    bottom: y + height,\n    left: x,\n    x: x,\n    y: y\n  };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n  var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n  // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n  var width = element.offsetWidth;\n  var height = element.offsetHeight;\n\n  if (Math.abs(clientRect.width - width) <= 1) {\n    width = clientRect.width;\n  }\n\n  if (Math.abs(clientRect.height - height) <= 1) {\n    height = clientRect.height;\n  }\n\n  return {\n    x: element.offsetLeft,\n    y: element.offsetTop,\n    width: width,\n    height: height\n  };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n  if (parent.contains(child)) {\n    return true;\n  } // then fallback to custom implementation with Shadow DOM support\n  else if (rootNode && isShadowRoot(rootNode)) {\n      var next = child;\n\n      do {\n        if (next && parent.isSameNode(next)) {\n          return true;\n        } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n        next = next.parentNode || next.host;\n      } while (next);\n    } // Give up, the result is false\n\n\n  return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n  return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n  // $FlowFixMe[incompatible-return]: assume body is always available\n  return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n  element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n  if (getNodeName(element) === 'html') {\n    return element;\n  }\n\n  return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n    // $FlowFixMe[incompatible-return]\n    // $FlowFixMe[prop-missing]\n    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n    element.parentNode || ( // DOM Element detected\n    isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n    // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n    getDocumentElement(element) // fallback\n\n  );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n  if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n  getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n\n  return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n  var isFirefox = /firefox/i.test(getUAString());\n  var isIE = /Trident/i.test(getUAString());\n\n  if (isIE && isHTMLElement(element)) {\n    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n    var elementCss = getComputedStyle(element);\n\n    if (elementCss.position === 'fixed') {\n      return null;\n    }\n  }\n\n  var currentNode = getParentNode(element);\n\n  if (isShadowRoot(currentNode)) {\n    currentNode = currentNode.host;\n  }\n\n  while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n    var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n    // create a containing block.\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n      return currentNode;\n    } else {\n      currentNode = currentNode.parentNode;\n    }\n  }\n\n  return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n  var window = getWindow(element);\n  var offsetParent = getTrueOffsetParent(element);\n\n  while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n    offsetParent = getTrueOffsetParent(offsetParent);\n  }\n\n  if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n    return window;\n  }\n\n  return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n  return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n  var v = within(min, value, max);\n  return v > max ? max : v;\n}","export default function getFreshSideObject() {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n  return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function expandToHashMap(value, keys) {\n  return keys.reduce(function (hashMap, key) {\n    hashMap[key] = value;\n    return hashMap;\n  }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : padding;\n  return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n  var _state$modifiersData$;\n\n  var state = _ref.state,\n      name = _ref.name,\n      options = _ref.options;\n  var arrowElement = state.elements.arrow;\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var basePlacement = getBasePlacement(state.placement);\n  var axis = getMainAxisFromPlacement(basePlacement);\n  var isVertical = [left, right].indexOf(basePlacement) >= 0;\n  var len = isVertical ? 'height' : 'width';\n\n  if (!arrowElement || !popperOffsets) {\n    return;\n  }\n\n  var paddingObject = toPaddingObject(options.padding, state);\n  var arrowRect = getLayoutRect(arrowElement);\n  var minProp = axis === 'y' ? top : left;\n  var maxProp = axis === 'y' ? bottom : right;\n  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n  var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n  var arrowOffsetParent = getOffsetParent(arrowElement);\n  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n  // outside of the popper bounds\n\n  var min = paddingObject[minProp];\n  var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n  var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n  var axisProp = axis;\n  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options;\n  var _options$element = options.element,\n      arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n  if (arrowElement == null) {\n    return;\n  } // CSS selector\n\n\n  if (typeof arrowElement === 'string') {\n    arrowElement = state.elements.popper.querySelector(arrowElement);\n\n    if (!arrowElement) {\n      return;\n    }\n  }\n\n  if (!contains(state.elements.popper, arrowElement)) {\n    return;\n  }\n\n  state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'arrow',\n  enabled: true,\n  phase: 'main',\n  fn: arrow,\n  effect: effect,\n  requires: ['popperOffsets'],\n  requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n  return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n  top: 'auto',\n  right: 'auto',\n  bottom: 'auto',\n  left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n  var x = _ref.x,\n      y = _ref.y;\n  var dpr = win.devicePixelRatio || 1;\n  return {\n    x: round(x * dpr) / dpr || 0,\n    y: round(y * dpr) / dpr || 0\n  };\n}\n\nexport function mapToStyles(_ref2) {\n  var _Object$assign2;\n\n  var popper = _ref2.popper,\n      popperRect = _ref2.popperRect,\n      placement = _ref2.placement,\n      variation = _ref2.variation,\n      offsets = _ref2.offsets,\n      position = _ref2.position,\n      gpuAcceleration = _ref2.gpuAcceleration,\n      adaptive = _ref2.adaptive,\n      roundOffsets = _ref2.roundOffsets,\n      isFixed = _ref2.isFixed;\n  var _offsets$x = offsets.x,\n      x = _offsets$x === void 0 ? 0 : _offsets$x,\n      _offsets$y = offsets.y,\n      y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n  var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n    x: x,\n    y: y\n  }) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref3.x;\n  y = _ref3.y;\n  var hasX = offsets.hasOwnProperty('x');\n  var hasY = offsets.hasOwnProperty('y');\n  var sideX = left;\n  var sideY = top;\n  var win = window;\n\n  if (adaptive) {\n    var offsetParent = getOffsetParent(popper);\n    var heightProp = 'clientHeight';\n    var widthProp = 'clientWidth';\n\n    if (offsetParent === getWindow(popper)) {\n      offsetParent = getDocumentElement(popper);\n\n      if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n        heightProp = 'scrollHeight';\n        widthProp = 'scrollWidth';\n      }\n    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n    offsetParent = offsetParent;\n\n    if (placement === top || (placement === left || placement === right) && variation === end) {\n      sideY = bottom;\n      var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n      offsetParent[heightProp];\n      y -= offsetY - popperRect.height;\n      y *= gpuAcceleration ? 1 : -1;\n    }\n\n    if (placement === left || (placement === top || placement === bottom) && variation === end) {\n      sideX = right;\n      var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n      offsetParent[widthProp];\n      x -= offsetX - popperRect.width;\n      x *= gpuAcceleration ? 1 : -1;\n    }\n  }\n\n  var commonStyles = Object.assign({\n    position: position\n  }, adaptive && unsetSides);\n\n  var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n    x: x,\n    y: y\n  }, getWindow(popper)) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref4.x;\n  y = _ref4.y;\n\n  if (gpuAcceleration) {\n    var _Object$assign;\n\n    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n  }\n\n  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n  var state = _ref5.state,\n      options = _ref5.options;\n  var _options$gpuAccelerat = options.gpuAcceleration,\n      gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n      _options$adaptive = options.adaptive,\n      adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n      _options$roundOffsets = options.roundOffsets,\n      roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n  var commonStyles = {\n    placement: getBasePlacement(state.placement),\n    variation: getVariation(state.placement),\n    popper: state.elements.popper,\n    popperRect: state.rects.popper,\n    gpuAcceleration: gpuAcceleration,\n    isFixed: state.options.strategy === 'fixed'\n  };\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.popperOffsets,\n      position: state.options.strategy,\n      adaptive: adaptive,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  if (state.modifiersData.arrow != null) {\n    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.arrow,\n      position: 'absolute',\n      adaptive: false,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-placement': state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'computeStyles',\n  enabled: true,\n  phase: 'beforeWrite',\n  fn: computeStyles,\n  data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n  passive: true\n};\n\nfunction effect(_ref) {\n  var state = _ref.state,\n      instance = _ref.instance,\n      options = _ref.options;\n  var _options$scroll = options.scroll,\n      scroll = _options$scroll === void 0 ? true : _options$scroll,\n      _options$resize = options.resize,\n      resize = _options$resize === void 0 ? true : _options$resize;\n  var window = getWindow(state.elements.popper);\n  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n  if (scroll) {\n    scrollParents.forEach(function (scrollParent) {\n      scrollParent.addEventListener('scroll', instance.update, passive);\n    });\n  }\n\n  if (resize) {\n    window.addEventListener('resize', instance.update, passive);\n  }\n\n  return function () {\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.removeEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.removeEventListener('resize', instance.update, passive);\n    }\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'eventListeners',\n  enabled: true,\n  phase: 'write',\n  fn: function fn() {},\n  effect: effect,\n  data: {}\n};","var hash = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}","var hash = {\n  start: 'end',\n  end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n  return placement.replace(/start|end/g, function (matched) {\n    return hash[matched];\n  });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n  var win = getWindow(node);\n  var scrollLeft = win.pageXOffset;\n  var scrollTop = win.pageYOffset;\n  return {\n    scrollLeft: scrollLeft,\n    scrollTop: scrollTop\n  };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  // Popper 1 is broken in this case and never had a bug report so let's assume\n  // it's not an issue. I don't think anyone ever specifies width on <html>\n  // anyway.\n  // Browsers where the left scrollbar doesn't cause an issue report `0` for\n  // this (e.g. Edge 2019, IE11, Safari)\n  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n  var win = getWindow(element);\n  var html = getDocumentElement(element);\n  var visualViewport = win.visualViewport;\n  var width = html.clientWidth;\n  var height = html.clientHeight;\n  var x = 0;\n  var y = 0;\n\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    var layoutViewport = isLayoutViewport();\n\n    if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x + getWindowScrollBarX(element),\n    y: y\n  };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n  var _element$ownerDocumen;\n\n  var html = getDocumentElement(element);\n  var winScroll = getWindowScroll(element);\n  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n  var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n  var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n  var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n  var y = -winScroll.scrollTop;\n\n  if (getComputedStyle(body || html).direction === 'rtl') {\n    x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x,\n    y: y\n  };\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n  // Firefox wants us to check `-x` and `-y` variations as well\n  var _getComputedStyle = getComputedStyle(element),\n      overflow = _getComputedStyle.overflow,\n      overflowX = _getComputedStyle.overflowX,\n      overflowY = _getComputedStyle.overflowY;\n\n  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n  if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return node.ownerDocument.body;\n  }\n\n  if (isHTMLElement(node) && isScrollParent(node)) {\n    return node;\n  }\n\n  return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n  var _element$ownerDocumen;\n\n  if (list === void 0) {\n    list = [];\n  }\n\n  var scrollParent = getScrollParent(element);\n  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n  var win = getWindow(scrollParent);\n  var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n  var updatedList = list.concat(target);\n  return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n  updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n  return Object.assign({}, rect, {\n    left: rect.x,\n    top: rect.y,\n    right: rect.x + rect.width,\n    bottom: rect.y + rect.height\n  });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n  var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n  rect.top = rect.top + element.clientTop;\n  rect.left = rect.left + element.clientLeft;\n  rect.bottom = rect.top + element.clientHeight;\n  rect.right = rect.left + element.clientWidth;\n  rect.width = element.clientWidth;\n  rect.height = element.clientHeight;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n  return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n  var clippingParents = listScrollParents(getParentNode(element));\n  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n  if (!isElement(clipperElement)) {\n    return [];\n  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n  return clippingParents.filter(function (clippingParent) {\n    return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n  });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n  var firstClippingParent = clippingParents[0];\n  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n    var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n  clippingRect.width = clippingRect.right - clippingRect.left;\n  clippingRect.height = clippingRect.bottom - clippingRect.top;\n  clippingRect.x = clippingRect.left;\n  clippingRect.y = clippingRect.top;\n  return clippingRect;\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n  var reference = _ref.reference,\n      element = _ref.element,\n      placement = _ref.placement;\n  var basePlacement = placement ? getBasePlacement(placement) : null;\n  var variation = placement ? getVariation(placement) : null;\n  var commonX = reference.x + reference.width / 2 - element.width / 2;\n  var commonY = reference.y + reference.height / 2 - element.height / 2;\n  var offsets;\n\n  switch (basePlacement) {\n    case top:\n      offsets = {\n        x: commonX,\n        y: reference.y - element.height\n      };\n      break;\n\n    case bottom:\n      offsets = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n\n    case right:\n      offsets = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n\n    case left:\n      offsets = {\n        x: reference.x - element.width,\n        y: commonY\n      };\n      break;\n\n    default:\n      offsets = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n\n  var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n  if (mainAxis != null) {\n    var len = mainAxis === 'y' ? 'height' : 'width';\n\n    switch (variation) {\n      case start:\n        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n        break;\n\n      case end:\n        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n        break;\n\n      default:\n    }\n  }\n\n  return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      _options$placement = _options.placement,\n      placement = _options$placement === void 0 ? state.placement : _options$placement,\n      _options$strategy = _options.strategy,\n      strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n      _options$boundary = _options.boundary,\n      boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n      _options$rootBoundary = _options.rootBoundary,\n      rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n      _options$elementConte = _options.elementContext,\n      elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n      _options$altBoundary = _options.altBoundary,\n      altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n      _options$padding = _options.padding,\n      padding = _options$padding === void 0 ? 0 : _options$padding;\n  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  var altContext = elementContext === popper ? reference : popper;\n  var popperRect = state.rects.popper;\n  var element = state.elements[altBoundary ? altContext : elementContext];\n  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n  var referenceClientRect = getBoundingClientRect(state.elements.reference);\n  var popperOffsets = computeOffsets({\n    reference: referenceClientRect,\n    element: popperRect,\n    strategy: 'absolute',\n    placement: placement\n  });\n  var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n  var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n  // 0 or negative = within the clipping rect\n\n  var overflowOffsets = {\n    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n    right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n  };\n  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n  if (elementContext === popper && offsetData) {\n    var offset = offsetData[placement];\n    Object.keys(overflowOffsets).forEach(function (key) {\n      var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n      var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n      overflowOffsets[key] += offset[axis] * multiply;\n    });\n  }\n\n  return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      placement = _options.placement,\n      boundary = _options.boundary,\n      rootBoundary = _options.rootBoundary,\n      padding = _options.padding,\n      flipVariations = _options.flipVariations,\n      _options$allowedAutoP = _options.allowedAutoPlacements,\n      allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n  var variation = getVariation(placement);\n  var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n    return getVariation(placement) === variation;\n  }) : basePlacements;\n  var allowedPlacements = placements.filter(function (placement) {\n    return allowedAutoPlacements.indexOf(placement) >= 0;\n  });\n\n  if (allowedPlacements.length === 0) {\n    allowedPlacements = placements;\n  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n  var overflows = allowedPlacements.reduce(function (acc, placement) {\n    acc[placement] = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding\n    })[getBasePlacement(placement)];\n    return acc;\n  }, {});\n  return Object.keys(overflows).sort(function (a, b) {\n    return overflows[a] - overflows[b];\n  });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n  if (getBasePlacement(placement) === auto) {\n    return [];\n  }\n\n  var oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n\n  if (state.modifiersData[name]._skip) {\n    return;\n  }\n\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n      specifiedFallbackPlacements = options.fallbackPlacements,\n      padding = options.padding,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      _options$flipVariatio = options.flipVariations,\n      flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n      allowedAutoPlacements = options.allowedAutoPlacements;\n  var preferredPlacement = state.options.placement;\n  var basePlacement = getBasePlacement(preferredPlacement);\n  var isBasePlacement = basePlacement === preferredPlacement;\n  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n    return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      flipVariations: flipVariations,\n      allowedAutoPlacements: allowedAutoPlacements\n    }) : placement);\n  }, []);\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var checksMap = new Map();\n  var makeFallbackChecks = true;\n  var firstFittingPlacement = placements[0];\n\n  for (var i = 0; i < placements.length; i++) {\n    var placement = placements[i];\n\n    var _basePlacement = getBasePlacement(placement);\n\n    var isStartVariation = getVariation(placement) === start;\n    var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n    var len = isVertical ? 'width' : 'height';\n    var overflow = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      altBoundary: altBoundary,\n      padding: padding\n    });\n    var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n    if (referenceRect[len] > popperRect[len]) {\n      mainVariationSide = getOppositePlacement(mainVariationSide);\n    }\n\n    var altVariationSide = getOppositePlacement(mainVariationSide);\n    var checks = [];\n\n    if (checkMainAxis) {\n      checks.push(overflow[_basePlacement] <= 0);\n    }\n\n    if (checkAltAxis) {\n      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n    }\n\n    if (checks.every(function (check) {\n      return check;\n    })) {\n      firstFittingPlacement = placement;\n      makeFallbackChecks = false;\n      break;\n    }\n\n    checksMap.set(placement, checks);\n  }\n\n  if (makeFallbackChecks) {\n    // `2` may be desired in some cases – research later\n    var numberOfChecks = flipVariations ? 3 : 1;\n\n    var _loop = function _loop(_i) {\n      var fittingPlacement = placements.find(function (placement) {\n        var checks = checksMap.get(placement);\n\n        if (checks) {\n          return checks.slice(0, _i).every(function (check) {\n            return check;\n          });\n        }\n      });\n\n      if (fittingPlacement) {\n        firstFittingPlacement = fittingPlacement;\n        return \"break\";\n      }\n    };\n\n    for (var _i = numberOfChecks; _i > 0; _i--) {\n      var _ret = _loop(_i);\n\n      if (_ret === \"break\") break;\n    }\n  }\n\n  if (state.placement !== firstFittingPlacement) {\n    state.modifiersData[name]._skip = true;\n    state.placement = firstFittingPlacement;\n    state.reset = true;\n  }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'flip',\n  enabled: true,\n  phase: 'main',\n  fn: flip,\n  requiresIfExists: ['offset'],\n  data: {\n    _skip: false\n  }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n  if (preventedOffsets === void 0) {\n    preventedOffsets = {\n      x: 0,\n      y: 0\n    };\n  }\n\n  return {\n    top: overflow.top - rect.height - preventedOffsets.y,\n    right: overflow.right - rect.width + preventedOffsets.x,\n    bottom: overflow.bottom - rect.height + preventedOffsets.y,\n    left: overflow.left - rect.width - preventedOffsets.x\n  };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n  return [top, right, bottom, left].some(function (side) {\n    return overflow[side] >= 0;\n  });\n}\n\nfunction hide(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var preventedOffsets = state.modifiersData.preventOverflow;\n  var referenceOverflow = detectOverflow(state, {\n    elementContext: 'reference'\n  });\n  var popperAltOverflow = detectOverflow(state, {\n    altBoundary: true\n  });\n  var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n  var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n  var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n  var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n  state.modifiersData[name] = {\n    referenceClippingOffsets: referenceClippingOffsets,\n    popperEscapeOffsets: popperEscapeOffsets,\n    isReferenceHidden: isReferenceHidden,\n    hasPopperEscaped: hasPopperEscaped\n  };\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-reference-hidden': isReferenceHidden,\n    'data-popper-escaped': hasPopperEscaped\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'hide',\n  enabled: true,\n  phase: 'main',\n  requiresIfExists: ['preventOverflow'],\n  fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n  var basePlacement = getBasePlacement(placement);\n  var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n    placement: placement\n  })) : offset,\n      skidding = _ref[0],\n      distance = _ref[1];\n\n  skidding = skidding || 0;\n  distance = (distance || 0) * invertDistance;\n  return [left, right].indexOf(basePlacement) >= 0 ? {\n    x: distance,\n    y: skidding\n  } : {\n    x: skidding,\n    y: distance\n  };\n}\n\nfunction offset(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options,\n      name = _ref2.name;\n  var _options$offset = options.offset,\n      offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n  var data = placements.reduce(function (acc, placement) {\n    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n    return acc;\n  }, {});\n  var _data$state$placement = data[state.placement],\n      x = _data$state$placement.x,\n      y = _data$state$placement.y;\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.modifiersData.popperOffsets.x += x;\n    state.modifiersData.popperOffsets.y += y;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'offset',\n  enabled: true,\n  phase: 'main',\n  requires: ['popperOffsets'],\n  fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  // Offsets are the actual position the popper needs to have to be\n  // properly positioned near its reference element\n  // This is the most basic placement, and will be adjusted by\n  // the modifiers in the next step\n  state.modifiersData[name] = computeOffsets({\n    reference: state.rects.reference,\n    element: state.rects.popper,\n    strategy: 'absolute',\n    placement: state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'popperOffsets',\n  enabled: true,\n  phase: 'read',\n  fn: popperOffsets,\n  data: {}\n};","export default function getAltAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      padding = options.padding,\n      _options$tether = options.tether,\n      tether = _options$tether === void 0 ? true : _options$tether,\n      _options$tetherOffset = options.tetherOffset,\n      tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n  var overflow = detectOverflow(state, {\n    boundary: boundary,\n    rootBoundary: rootBoundary,\n    padding: padding,\n    altBoundary: altBoundary\n  });\n  var basePlacement = getBasePlacement(state.placement);\n  var variation = getVariation(state.placement);\n  var isBasePlacement = !variation;\n  var mainAxis = getMainAxisFromPlacement(basePlacement);\n  var altAxis = getAltAxis(mainAxis);\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : tetherOffset;\n  var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n    mainAxis: tetherOffsetValue,\n    altAxis: tetherOffsetValue\n  } : Object.assign({\n    mainAxis: 0,\n    altAxis: 0\n  }, tetherOffsetValue);\n  var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n  var data = {\n    x: 0,\n    y: 0\n  };\n\n  if (!popperOffsets) {\n    return;\n  }\n\n  if (checkMainAxis) {\n    var _offsetModifierState$;\n\n    var mainSide = mainAxis === 'y' ? top : left;\n    var altSide = mainAxis === 'y' ? bottom : right;\n    var len = mainAxis === 'y' ? 'height' : 'width';\n    var offset = popperOffsets[mainAxis];\n    var min = offset + overflow[mainSide];\n    var max = offset - overflow[altSide];\n    var additive = tether ? -popperRect[len] / 2 : 0;\n    var minLen = variation === start ? referenceRect[len] : popperRect[len];\n    var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n    // outside the reference bounds\n\n    var arrowElement = state.elements.arrow;\n    var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n      width: 0,\n      height: 0\n    };\n    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n    var arrowPaddingMin = arrowPaddingObject[mainSide];\n    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n    // to include its full size in the calculation. If the reference is small\n    // and near the edge of a boundary, the popper can overflow even if the\n    // reference is not overflowing as well (e.g. virtual elements with no\n    // width or height)\n\n    var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n    var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n    var tetherMax = offset + maxOffset - offsetModifierValue;\n    var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n    popperOffsets[mainAxis] = preventedOffset;\n    data[mainAxis] = preventedOffset - offset;\n  }\n\n  if (checkAltAxis) {\n    var _offsetModifierState$2;\n\n    var _mainSide = mainAxis === 'x' ? top : left;\n\n    var _altSide = mainAxis === 'x' ? bottom : right;\n\n    var _offset = popperOffsets[altAxis];\n\n    var _len = altAxis === 'y' ? 'height' : 'width';\n\n    var _min = _offset + overflow[_mainSide];\n\n    var _max = _offset - overflow[_altSide];\n\n    var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n    var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n    popperOffsets[altAxis] = _preventedOffset;\n    data[altAxis] = _preventedOffset - _offset;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'preventOverflow',\n  enabled: true,\n  phase: 'main',\n  fn: preventOverflow,\n  requiresIfExists: ['offset']\n};","export { default as applyStyles } from \"./applyStyles.js\";\nexport { default as arrow } from \"./arrow.js\";\nexport { default as computeStyles } from \"./computeStyles.js\";\nexport { default as eventListeners } from \"./eventListeners.js\";\nexport { default as flip } from \"./flip.js\";\nexport { default as hide } from \"./hide.js\";\nexport { default as offset } from \"./offset.js\";\nexport { default as popperOffsets } from \"./popperOffsets.js\";\nexport { default as preventOverflow } from \"./preventOverflow.js\";","export default function getHTMLElementScroll(element) {\n  return {\n    scrollLeft: element.scrollLeft,\n    scrollTop: element.scrollTop\n  };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n  if (node === getWindow(node) || !isHTMLElement(node)) {\n    return getWindowScroll(node);\n  } else {\n    return getHTMLElementScroll(node);\n  }\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n  var rect = element.getBoundingClientRect();\n  var scaleX = round(rect.width) / element.offsetWidth || 1;\n  var scaleY = round(rect.height) / element.offsetHeight || 1;\n  return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n\n  var isOffsetParentAnElement = isHTMLElement(offsetParent);\n  var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n  var documentElement = getDocumentElement(offsetParent);\n  var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n  var scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  var offsets = {\n    x: 0,\n    y: 0\n  };\n\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n    isScrollParent(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n\n    if (isHTMLElement(offsetParent)) {\n      offsets = getBoundingClientRect(offsetParent, true);\n      offsets.x += offsetParent.clientLeft;\n      offsets.y += offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n\n  return {\n    x: rect.left + scroll.scrollLeft - offsets.x,\n    y: rect.top + scroll.scrollTop - offsets.y,\n    width: rect.width,\n    height: rect.height\n  };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n  var map = new Map();\n  var visited = new Set();\n  var result = [];\n  modifiers.forEach(function (modifier) {\n    map.set(modifier.name, modifier);\n  }); // On visiting object, check for its dependencies and visit them recursively\n\n  function sort(modifier) {\n    visited.add(modifier.name);\n    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n    requires.forEach(function (dep) {\n      if (!visited.has(dep)) {\n        var depModifier = map.get(dep);\n\n        if (depModifier) {\n          sort(depModifier);\n        }\n      }\n    });\n    result.push(modifier);\n  }\n\n  modifiers.forEach(function (modifier) {\n    if (!visited.has(modifier.name)) {\n      // check for visited object\n      sort(modifier);\n    }\n  });\n  return result;\n}\n\nexport default function orderModifiers(modifiers) {\n  // order based on dependencies\n  var orderedModifiers = order(modifiers); // order based on phase\n\n  return modifierPhases.reduce(function (acc, phase) {\n    return acc.concat(orderedModifiers.filter(function (modifier) {\n      return modifier.phase === phase;\n    }));\n  }, []);\n}","export default function debounce(fn) {\n  var pending;\n  return function () {\n    if (!pending) {\n      pending = new Promise(function (resolve) {\n        Promise.resolve().then(function () {\n          pending = undefined;\n          resolve(fn());\n        });\n      });\n    }\n\n    return pending;\n  };\n}","export default function mergeByName(modifiers) {\n  var merged = modifiers.reduce(function (merged, current) {\n    var existing = merged[current.name];\n    merged[current.name] = existing ? Object.assign({}, existing, current, {\n      options: Object.assign({}, existing.options, current.options),\n      data: Object.assign({}, existing.data, current.data)\n    }) : current;\n    return merged;\n  }, {}); // IE11 does not support Object.values\n\n  return Object.keys(merged).map(function (key) {\n    return merged[key];\n  });\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n  placement: 'bottom',\n  modifiers: [],\n  strategy: 'absolute'\n};\n\nfunction areValidElements() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  return !args.some(function (element) {\n    return !(element && typeof element.getBoundingClientRect === 'function');\n  });\n}\n\nexport function popperGenerator(generatorOptions) {\n  if (generatorOptions === void 0) {\n    generatorOptions = {};\n  }\n\n  var _generatorOptions = generatorOptions,\n      _generatorOptions$def = _generatorOptions.defaultModifiers,\n      defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n      _generatorOptions$def2 = _generatorOptions.defaultOptions,\n      defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n  return function createPopper(reference, popper, options) {\n    if (options === void 0) {\n      options = defaultOptions;\n    }\n\n    var state = {\n      placement: 'bottom',\n      orderedModifiers: [],\n      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n      modifiersData: {},\n      elements: {\n        reference: reference,\n        popper: popper\n      },\n      attributes: {},\n      styles: {}\n    };\n    var effectCleanupFns = [];\n    var isDestroyed = false;\n    var instance = {\n      state: state,\n      setOptions: function setOptions(setOptionsAction) {\n        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n        cleanupModifierEffects();\n        state.options = Object.assign({}, defaultOptions, state.options, options);\n        state.scrollParents = {\n          reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n          popper: listScrollParents(popper)\n        }; // Orders the modifiers based on their dependencies and `phase`\n        // properties\n\n        var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n        state.orderedModifiers = orderedModifiers.filter(function (m) {\n          return m.enabled;\n        });\n        runModifierEffects();\n        return instance.update();\n      },\n      // Sync update – it will always be executed, even if not necessary. This\n      // is useful for low frequency updates where sync behavior simplifies the\n      // logic.\n      // For high frequency updates (e.g. `resize` and `scroll` events), always\n      // prefer the async Popper#update method\n      forceUpdate: function forceUpdate() {\n        if (isDestroyed) {\n          return;\n        }\n\n        var _state$elements = state.elements,\n            reference = _state$elements.reference,\n            popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n        // anymore\n\n        if (!areValidElements(reference, popper)) {\n          return;\n        } // Store the reference and popper rects to be read by modifiers\n\n\n        state.rects = {\n          reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n          popper: getLayoutRect(popper)\n        }; // Modifiers have the ability to reset the current update cycle. The\n        // most common use case for this is the `flip` modifier changing the\n        // placement, which then needs to re-run all the modifiers, because the\n        // logic was previously ran for the previous placement and is therefore\n        // stale/incorrect\n\n        state.reset = false;\n        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n        // is filled with the initial data specified by the modifier. This means\n        // it doesn't persist and is fresh on each update.\n        // To ensure persistent data, use `${name}#persistent`\n\n        state.orderedModifiers.forEach(function (modifier) {\n          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n        });\n\n        for (var index = 0; index < state.orderedModifiers.length; index++) {\n          if (state.reset === true) {\n            state.reset = false;\n            index = -1;\n            continue;\n          }\n\n          var _state$orderedModifie = state.orderedModifiers[index],\n              fn = _state$orderedModifie.fn,\n              _state$orderedModifie2 = _state$orderedModifie.options,\n              _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n              name = _state$orderedModifie.name;\n\n          if (typeof fn === 'function') {\n            state = fn({\n              state: state,\n              options: _options,\n              name: name,\n              instance: instance\n            }) || state;\n          }\n        }\n      },\n      // Async and optimistically optimized update – it will not be executed if\n      // not necessary (debounced to run at most once-per-tick)\n      update: debounce(function () {\n        return new Promise(function (resolve) {\n          instance.forceUpdate();\n          resolve(state);\n        });\n      }),\n      destroy: function destroy() {\n        cleanupModifierEffects();\n        isDestroyed = true;\n      }\n    };\n\n    if (!areValidElements(reference, popper)) {\n      return instance;\n    }\n\n    instance.setOptions(options).then(function (state) {\n      if (!isDestroyed && options.onFirstUpdate) {\n        options.onFirstUpdate(state);\n      }\n    }); // Modifiers have the ability to execute arbitrary code before the first\n    // update cycle runs. They will be executed in the same order as the update\n    // cycle. This is useful when a modifier adds some persistent data that\n    // other modifiers need to use, but the modifier is run after the dependent\n    // one.\n\n    function runModifierEffects() {\n      state.orderedModifiers.forEach(function (_ref) {\n        var name = _ref.name,\n            _ref$options = _ref.options,\n            options = _ref$options === void 0 ? {} : _ref$options,\n            effect = _ref.effect;\n\n        if (typeof effect === 'function') {\n          var cleanupFn = effect({\n            state: state,\n            name: name,\n            instance: instance,\n            options: options\n          });\n\n          var noopFn = function noopFn() {};\n\n          effectCleanupFns.push(cleanupFn || noopFn);\n        }\n      });\n    }\n\n    function cleanupModifierEffects() {\n      effectCleanupFns.forEach(function (fn) {\n        return fn();\n      });\n      effectCleanupFns = [];\n    }\n\n    return instance;\n  };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","export * from \"./enums.js\";\nexport * from \"./modifiers/index.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { popperGenerator, detectOverflow, createPopper as createPopperBase } from \"./createPopper.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper } from \"./popper.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\";","/*!\n  * Bootstrap data.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Data = factory());\n})(this, (function () { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/data.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * Constants\n   */\n\n  const elementMap = new Map();\n  const data = {\n    set(element, key, instance) {\n      if (!elementMap.has(element)) {\n        elementMap.set(element, new Map());\n      }\n      const instanceMap = elementMap.get(element);\n\n      // make it clear we only want one instance per element\n      // can be removed later when multiple key/instances are fine to be used\n      if (!instanceMap.has(key) && instanceMap.size !== 0) {\n        // eslint-disable-next-line no-console\n        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n        return;\n      }\n      instanceMap.set(key, instance);\n    },\n    get(element, key) {\n      if (elementMap.has(element)) {\n        return elementMap.get(element).get(key) || null;\n      }\n      return null;\n    },\n    remove(element, key) {\n      if (!elementMap.has(element)) {\n        return;\n      }\n      const instanceMap = elementMap.get(element);\n      instanceMap.delete(key);\n\n      // free up element references if there are no instances left for an element\n      if (instanceMap.size === 0) {\n        elementMap.delete(element);\n      }\n    }\n  };\n\n  return data;\n\n}));\n//# sourceMappingURL=data.js.map\n","/*!\n  * Bootstrap index.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Index = {}));\n})(this, (function (exports) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const MAX_UID = 1000000;\n  const MILLISECONDS_MULTIPLIER = 1000;\n  const TRANSITION_END = 'transitionend';\n\n  /**\n   * Properly escape IDs selectors to handle weird IDs\n   * @param {string} selector\n   * @returns {string}\n   */\n  const parseSelector = selector => {\n    if (selector && window.CSS && window.CSS.escape) {\n      // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n      selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n    }\n    return selector;\n  };\n\n  // Shout-out Angus Croll (https://goo.gl/pxwQGp)\n  const toType = object => {\n    if (object === null || object === undefined) {\n      return `${object}`;\n    }\n    return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  };\n\n  /**\n   * Public Util API\n   */\n\n  const getUID = prefix => {\n    do {\n      prefix += Math.floor(Math.random() * MAX_UID);\n    } while (document.getElementById(prefix));\n    return prefix;\n  };\n  const getTransitionDurationFromElement = element => {\n    if (!element) {\n      return 0;\n    }\n\n    // Get transition-duration of the element\n    let {\n      transitionDuration,\n      transitionDelay\n    } = window.getComputedStyle(element);\n    const floatTransitionDuration = Number.parseFloat(transitionDuration);\n    const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n    // Return 0 if element or transition duration is not found\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0;\n    }\n\n    // If multiple durations are defined, take the first\n    transitionDuration = transitionDuration.split(',')[0];\n    transitionDelay = transitionDelay.split(',')[0];\n    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n  };\n  const triggerTransitionEnd = element => {\n    element.dispatchEvent(new Event(TRANSITION_END));\n  };\n  const isElement = object => {\n    if (!object || typeof object !== 'object') {\n      return false;\n    }\n    if (typeof object.jquery !== 'undefined') {\n      object = object[0];\n    }\n    return typeof object.nodeType !== 'undefined';\n  };\n  const getElement = object => {\n    // it's a jQuery object or a node element\n    if (isElement(object)) {\n      return object.jquery ? object[0] : object;\n    }\n    if (typeof object === 'string' && object.length > 0) {\n      return document.querySelector(parseSelector(object));\n    }\n    return null;\n  };\n  const isVisible = element => {\n    if (!isElement(element) || element.getClientRects().length === 0) {\n      return false;\n    }\n    const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n    // Handle `details` element as its content may falsie appear visible when it is closed\n    const closedDetails = element.closest('details:not([open])');\n    if (!closedDetails) {\n      return elementIsVisible;\n    }\n    if (closedDetails !== element) {\n      const summary = element.closest('summary');\n      if (summary && summary.parentNode !== closedDetails) {\n        return false;\n      }\n      if (summary === null) {\n        return false;\n      }\n    }\n    return elementIsVisible;\n  };\n  const isDisabled = element => {\n    if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n    if (element.classList.contains('disabled')) {\n      return true;\n    }\n    if (typeof element.disabled !== 'undefined') {\n      return element.disabled;\n    }\n    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n  };\n  const findShadowRoot = element => {\n    if (!document.documentElement.attachShadow) {\n      return null;\n    }\n\n    // Can find the shadow root otherwise it'll return the document\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode();\n      return root instanceof ShadowRoot ? root : null;\n    }\n    if (element instanceof ShadowRoot) {\n      return element;\n    }\n\n    // when we don't find a shadow root\n    if (!element.parentNode) {\n      return null;\n    }\n    return findShadowRoot(element.parentNode);\n  };\n  const noop = () => {};\n\n  /**\n   * Trick to restart an element's animation\n   *\n   * @param {HTMLElement} element\n   * @return void\n   *\n   * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n   */\n  const reflow = element => {\n    element.offsetHeight; // eslint-disable-line no-unused-expressions\n  };\n  const getjQuery = () => {\n    if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n      return window.jQuery;\n    }\n    return null;\n  };\n  const DOMContentLoadedCallbacks = [];\n  const onDOMContentLoaded = callback => {\n    if (document.readyState === 'loading') {\n      // add listener on the first call when the document is in loading state\n      if (!DOMContentLoadedCallbacks.length) {\n        document.addEventListener('DOMContentLoaded', () => {\n          for (const callback of DOMContentLoadedCallbacks) {\n            callback();\n          }\n        });\n      }\n      DOMContentLoadedCallbacks.push(callback);\n    } else {\n      callback();\n    }\n  };\n  const isRTL = () => document.documentElement.dir === 'rtl';\n  const defineJQueryPlugin = plugin => {\n    onDOMContentLoaded(() => {\n      const $ = getjQuery();\n      /* istanbul ignore if */\n      if ($) {\n        const name = plugin.NAME;\n        const JQUERY_NO_CONFLICT = $.fn[name];\n        $.fn[name] = plugin.jQueryInterface;\n        $.fn[name].Constructor = plugin;\n        $.fn[name].noConflict = () => {\n          $.fn[name] = JQUERY_NO_CONFLICT;\n          return plugin.jQueryInterface;\n        };\n      }\n    });\n  };\n  const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n    return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue;\n  };\n  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n    if (!waitForTransition) {\n      execute(callback);\n      return;\n    }\n    const durationPadding = 5;\n    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n    let called = false;\n    const handler = ({\n      target\n    }) => {\n      if (target !== transitionElement) {\n        return;\n      }\n      called = true;\n      transitionElement.removeEventListener(TRANSITION_END, handler);\n      execute(callback);\n    };\n    transitionElement.addEventListener(TRANSITION_END, handler);\n    setTimeout(() => {\n      if (!called) {\n        triggerTransitionEnd(transitionElement);\n      }\n    }, emulatedDuration);\n  };\n\n  /**\n   * Return the previous/next element of a list.\n   *\n   * @param {array} list    The list of elements\n   * @param activeElement   The active element\n   * @param shouldGetNext   Choose to get next or previous element\n   * @param isCycleAllowed\n   * @return {Element|elem} The proper element\n   */\n  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n    const listLength = list.length;\n    let index = list.indexOf(activeElement);\n\n    // if the element does not exist in the list return an element\n    // depending on the direction and if cycle is allowed\n    if (index === -1) {\n      return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n    }\n    index += shouldGetNext ? 1 : -1;\n    if (isCycleAllowed) {\n      index = (index + listLength) % listLength;\n    }\n    return list[Math.max(0, Math.min(index, listLength - 1))];\n  };\n\n  exports.defineJQueryPlugin = defineJQueryPlugin;\n  exports.execute = execute;\n  exports.executeAfterTransition = executeAfterTransition;\n  exports.findShadowRoot = findShadowRoot;\n  exports.getElement = getElement;\n  exports.getNextActiveElement = getNextActiveElement;\n  exports.getTransitionDurationFromElement = getTransitionDurationFromElement;\n  exports.getUID = getUID;\n  exports.getjQuery = getjQuery;\n  exports.isDisabled = isDisabled;\n  exports.isElement = isElement;\n  exports.isRTL = isRTL;\n  exports.isVisible = isVisible;\n  exports.noop = noop;\n  exports.onDOMContentLoaded = onDOMContentLoaded;\n  exports.parseSelector = parseSelector;\n  exports.reflow = reflow;\n  exports.toType = toType;\n  exports.triggerTransitionEnd = triggerTransitionEnd;\n\n  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\n}));\n//# sourceMappingURL=index.js.map\n","/*!\n  * Bootstrap event-handler.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['../util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EventHandler = factory(global.Index));\n})(this, (function (index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/event-handler.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\n  const stripNameRegex = /\\..*/;\n  const stripUidRegex = /::\\d+$/;\n  const eventRegistry = {}; // Events storage\n  let uidEvent = 1;\n  const customEvents = {\n    mouseenter: 'mouseover',\n    mouseleave: 'mouseout'\n  };\n  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n  /**\n   * Private methods\n   */\n\n  function makeEventUid(element, uid) {\n    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n  }\n  function getElementEvents(element) {\n    const uid = makeEventUid(element);\n    element.uidEvent = uid;\n    eventRegistry[uid] = eventRegistry[uid] || {};\n    return eventRegistry[uid];\n  }\n  function bootstrapHandler(element, fn) {\n    return function handler(event) {\n      hydrateObj(event, {\n        delegateTarget: element\n      });\n      if (handler.oneOff) {\n        EventHandler.off(element, event.type, fn);\n      }\n      return fn.apply(element, [event]);\n    };\n  }\n  function bootstrapDelegationHandler(element, selector, fn) {\n    return function handler(event) {\n      const domElements = element.querySelectorAll(selector);\n      for (let {\n        target\n      } = event; target && target !== this; target = target.parentNode) {\n        for (const domElement of domElements) {\n          if (domElement !== target) {\n            continue;\n          }\n          hydrateObj(event, {\n            delegateTarget: target\n          });\n          if (handler.oneOff) {\n            EventHandler.off(element, event.type, selector, fn);\n          }\n          return fn.apply(target, [event]);\n        }\n      }\n    };\n  }\n  function findHandler(events, callable, delegationSelector = null) {\n    return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n  }\n  function normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n    const isDelegated = typeof handler === 'string';\n    // TODO: tooltip passes `false` instead of selector, so we need to check\n    const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n    let typeEvent = getTypeEvent(originalTypeEvent);\n    if (!nativeEvents.has(typeEvent)) {\n      typeEvent = originalTypeEvent;\n    }\n    return [isDelegated, callable, typeEvent];\n  }\n  function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n    let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n    // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n    // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n    if (originalTypeEvent in customEvents) {\n      const wrapFunction = fn => {\n        return function (event) {\n          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n            return fn.call(this, event);\n          }\n        };\n      };\n      callable = wrapFunction(callable);\n    }\n    const events = getElementEvents(element);\n    const handlers = events[typeEvent] || (events[typeEvent] = {});\n    const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n    if (previousFunction) {\n      previousFunction.oneOff = previousFunction.oneOff && oneOff;\n      return;\n    }\n    const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n    const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n    fn.delegationSelector = isDelegated ? handler : null;\n    fn.callable = callable;\n    fn.oneOff = oneOff;\n    fn.uidEvent = uid;\n    handlers[uid] = fn;\n    element.addEventListener(typeEvent, fn, isDelegated);\n  }\n  function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n    const fn = findHandler(events[typeEvent], handler, delegationSelector);\n    if (!fn) {\n      return;\n    }\n    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n    delete events[typeEvent][fn.uidEvent];\n  }\n  function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n    const storeElementEvent = events[typeEvent] || {};\n    for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n      if (handlerKey.includes(namespace)) {\n        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n      }\n    }\n  }\n  function getTypeEvent(event) {\n    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n    event = event.replace(stripNameRegex, '');\n    return customEvents[event] || event;\n  }\n  const EventHandler = {\n    on(element, event, handler, delegationFunction) {\n      addHandler(element, event, handler, delegationFunction, false);\n    },\n    one(element, event, handler, delegationFunction) {\n      addHandler(element, event, handler, delegationFunction, true);\n    },\n    off(element, originalTypeEvent, handler, delegationFunction) {\n      if (typeof originalTypeEvent !== 'string' || !element) {\n        return;\n      }\n      const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n      const inNamespace = typeEvent !== originalTypeEvent;\n      const events = getElementEvents(element);\n      const storeElementEvent = events[typeEvent] || {};\n      const isNamespace = originalTypeEvent.startsWith('.');\n      if (typeof callable !== 'undefined') {\n        // Simplest case: handler is passed, remove that listener ONLY.\n        if (!Object.keys(storeElementEvent).length) {\n          return;\n        }\n        removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n        return;\n      }\n      if (isNamespace) {\n        for (const elementEvent of Object.keys(events)) {\n          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n        }\n      }\n      for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n        const handlerKey = keyHandlers.replace(stripUidRegex, '');\n        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n          removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n        }\n      }\n    },\n    trigger(element, event, args) {\n      if (typeof event !== 'string' || !element) {\n        return null;\n      }\n      const $ = index_js.getjQuery();\n      const typeEvent = getTypeEvent(event);\n      const inNamespace = event !== typeEvent;\n      let jQueryEvent = null;\n      let bubbles = true;\n      let nativeDispatch = true;\n      let defaultPrevented = false;\n      if (inNamespace && $) {\n        jQueryEvent = $.Event(event, args);\n        $(element).trigger(jQueryEvent);\n        bubbles = !jQueryEvent.isPropagationStopped();\n        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n        defaultPrevented = jQueryEvent.isDefaultPrevented();\n      }\n      const evt = hydrateObj(new Event(event, {\n        bubbles,\n        cancelable: true\n      }), args);\n      if (defaultPrevented) {\n        evt.preventDefault();\n      }\n      if (nativeDispatch) {\n        element.dispatchEvent(evt);\n      }\n      if (evt.defaultPrevented && jQueryEvent) {\n        jQueryEvent.preventDefault();\n      }\n      return evt;\n    }\n  };\n  function hydrateObj(obj, meta = {}) {\n    for (const [key, value] of Object.entries(meta)) {\n      try {\n        obj[key] = value;\n      } catch (_unused) {\n        Object.defineProperty(obj, key, {\n          configurable: true,\n          get() {\n            return value;\n          }\n        });\n      }\n    }\n    return obj;\n  }\n\n  return EventHandler;\n\n}));\n//# sourceMappingURL=event-handler.js.map\n","/*!\n  * Bootstrap manipulator.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Manipulator = factory());\n})(this, (function () { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/manipulator.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  function normalizeData(value) {\n    if (value === 'true') {\n      return true;\n    }\n    if (value === 'false') {\n      return false;\n    }\n    if (value === Number(value).toString()) {\n      return Number(value);\n    }\n    if (value === '' || value === 'null') {\n      return null;\n    }\n    if (typeof value !== 'string') {\n      return value;\n    }\n    try {\n      return JSON.parse(decodeURIComponent(value));\n    } catch (_unused) {\n      return value;\n    }\n  }\n  function normalizeDataKey(key) {\n    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n  }\n  const Manipulator = {\n    setDataAttribute(element, key, value) {\n      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n    },\n    removeDataAttribute(element, key) {\n      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n    },\n    getDataAttributes(element) {\n      if (!element) {\n        return {};\n      }\n      const attributes = {};\n      const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n      for (const key of bsKeys) {\n        let pureKey = key.replace(/^bs/, '');\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1);\n        attributes[pureKey] = normalizeData(element.dataset[key]);\n      }\n      return attributes;\n    },\n    getDataAttribute(element, key) {\n      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n    }\n  };\n\n  return Manipulator;\n\n}));\n//# sourceMappingURL=manipulator.js.map\n","/*!\n  * Bootstrap config.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/manipulator.js'), require('./index.js')) :\n  typeof define === 'function' && define.amd ? define(['../dom/manipulator', './index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Config = factory(global.Manipulator, global.Index));\n})(this, (function (Manipulator, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/config.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Class definition\n   */\n\n  class Config {\n    // Getters\n    static get Default() {\n      return {};\n    }\n    static get DefaultType() {\n      return {};\n    }\n    static get NAME() {\n      throw new Error('You have to implement the static method \"NAME\", for each component!');\n    }\n    _getConfig(config) {\n      config = this._mergeConfigObj(config);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n    _configAfterMerge(config) {\n      return config;\n    }\n    _mergeConfigObj(config, element) {\n      const jsonConfig = index_js.isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n      return {\n        ...this.constructor.Default,\n        ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n        ...(index_js.isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n        ...(typeof config === 'object' ? config : {})\n      };\n    }\n    _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n      for (const [property, expectedTypes] of Object.entries(configTypes)) {\n        const value = config[property];\n        const valueType = index_js.isElement(value) ? 'element' : index_js.toType(value);\n        if (!new RegExp(expectedTypes).test(valueType)) {\n          throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n        }\n      }\n    }\n  }\n\n  return Config;\n\n}));\n//# sourceMappingURL=config.js.map\n","/*!\n  * Bootstrap base-component.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/event-handler.js'), require('./util/config.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./dom/data', './dom/event-handler', './util/config', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BaseComponent = factory(global.Data, global.EventHandler, global.Config, global.Index));\n})(this, (function (Data, EventHandler, Config, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap base-component.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const VERSION = '5.3.8';\n\n  /**\n   * Class definition\n   */\n\n  class BaseComponent extends Config {\n    constructor(element, config) {\n      super();\n      element = index_js.getElement(element);\n      if (!element) {\n        return;\n      }\n      this._element = element;\n      this._config = this._getConfig(config);\n      Data.set(this._element, this.constructor.DATA_KEY, this);\n    }\n\n    // Public\n    dispose() {\n      Data.remove(this._element, this.constructor.DATA_KEY);\n      EventHandler.off(this._element, this.constructor.EVENT_KEY);\n      for (const propertyName of Object.getOwnPropertyNames(this)) {\n        this[propertyName] = null;\n      }\n    }\n\n    // Private\n    _queueCallback(callback, element, isAnimated = true) {\n      index_js.executeAfterTransition(callback, element, isAnimated);\n    }\n    _getConfig(config) {\n      config = this._mergeConfigObj(config, this._element);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n\n    // Static\n    static getInstance(element) {\n      return Data.get(index_js.getElement(element), this.DATA_KEY);\n    }\n    static getOrCreateInstance(element, config = {}) {\n      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n    }\n    static get VERSION() {\n      return VERSION;\n    }\n    static get DATA_KEY() {\n      return `bs.${this.NAME}`;\n    }\n    static get EVENT_KEY() {\n      return `.${this.DATA_KEY}`;\n    }\n    static eventName(name) {\n      return `${name}${this.EVENT_KEY}`;\n    }\n  }\n\n  return BaseComponent;\n\n}));\n//# sourceMappingURL=base-component.js.map\n","/*!\n  * Bootstrap sanitizer.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Sanitizer = {}));\n})(this, (function (exports) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  // js-docs-start allow-list\n  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  const DefaultAllowlist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    dd: [],\n    div: [],\n    dl: [],\n    dt: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  // js-docs-end allow-list\n\n  const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n  /**\n   * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n   * contexts.\n   *\n   * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n   */\n  const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\n  const allowedAttribute = (attribute, allowedAttributeList) => {\n    const attributeName = attribute.nodeName.toLowerCase();\n    if (allowedAttributeList.includes(attributeName)) {\n      if (uriAttributes.has(attributeName)) {\n        return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n      }\n      return true;\n    }\n\n    // Check if a regular expression validates the attribute.\n    return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n  };\n  function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n    if (!unsafeHtml.length) {\n      return unsafeHtml;\n    }\n    if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n      return sanitizeFunction(unsafeHtml);\n    }\n    const domParser = new window.DOMParser();\n    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n    for (const element of elements) {\n      const elementName = element.nodeName.toLowerCase();\n      if (!Object.keys(allowList).includes(elementName)) {\n        element.remove();\n        continue;\n      }\n      const attributeList = [].concat(...element.attributes);\n      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n      for (const attribute of attributeList) {\n        if (!allowedAttribute(attribute, allowedAttributes)) {\n          element.removeAttribute(attribute.nodeName);\n        }\n      }\n    }\n    return createdDocument.body.innerHTML;\n  }\n\n  exports.DefaultAllowlist = DefaultAllowlist;\n  exports.sanitizeHtml = sanitizeHtml;\n\n  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\n}));\n//# sourceMappingURL=sanitizer.js.map\n","/*!\n  * Bootstrap selector-engine.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['../util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory(global.Index));\n})(this, (function (index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/selector-engine.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const getSelector = element => {\n    let selector = element.getAttribute('data-bs-target');\n    if (!selector || selector === '#') {\n      let hrefAttribute = element.getAttribute('href');\n\n      // The only valid content that could double as a selector are IDs or classes,\n      // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n      // `document.querySelector` will rightfully complain it is invalid.\n      // See https://github.com/twbs/bootstrap/issues/32273\n      if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n        return null;\n      }\n\n      // Just in case some CMS puts out a full URL with the anchor appended\n      if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n        hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n      }\n      selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n    }\n    return selector ? selector.split(',').map(sel => index_js.parseSelector(sel)).join(',') : null;\n  };\n  const SelectorEngine = {\n    find(selector, element = document.documentElement) {\n      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n    },\n    findOne(selector, element = document.documentElement) {\n      return Element.prototype.querySelector.call(element, selector);\n    },\n    children(element, selector) {\n      return [].concat(...element.children).filter(child => child.matches(selector));\n    },\n    parents(element, selector) {\n      const parents = [];\n      let ancestor = element.parentNode.closest(selector);\n      while (ancestor) {\n        parents.push(ancestor);\n        ancestor = ancestor.parentNode.closest(selector);\n      }\n      return parents;\n    },\n    prev(element, selector) {\n      let previous = element.previousElementSibling;\n      while (previous) {\n        if (previous.matches(selector)) {\n          return [previous];\n        }\n        previous = previous.previousElementSibling;\n      }\n      return [];\n    },\n    // TODO: this is now unused; remove later along with prev()\n    next(element, selector) {\n      let next = element.nextElementSibling;\n      while (next) {\n        if (next.matches(selector)) {\n          return [next];\n        }\n        next = next.nextElementSibling;\n      }\n      return [];\n    },\n    focusableChildren(element) {\n      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n      return this.find(focusables, element).filter(el => !index_js.isDisabled(el) && index_js.isVisible(el));\n    },\n    getSelectorFromElement(element) {\n      const selector = getSelector(element);\n      if (selector) {\n        return SelectorEngine.findOne(selector) ? selector : null;\n      }\n      return null;\n    },\n    getElementFromSelector(element) {\n      const selector = getSelector(element);\n      return selector ? SelectorEngine.findOne(selector) : null;\n    },\n    getMultipleElementsFromSelector(element) {\n      const selector = getSelector(element);\n      return selector ? SelectorEngine.find(selector) : [];\n    }\n  };\n\n  return SelectorEngine;\n\n}));\n//# sourceMappingURL=selector-engine.js.map\n","/*!\n  * Bootstrap template-factory.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/selector-engine.js'), require('./config.js'), require('./sanitizer.js'), require('./index.js')) :\n  typeof define === 'function' && define.amd ? define(['../dom/selector-engine', './config', './sanitizer', './index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.TemplateFactory = factory(global.SelectorEngine, global.Config, global.Sanitizer, global.Index));\n})(this, (function (SelectorEngine, Config, sanitizer_js, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/template-factory.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'TemplateFactory';\n  const Default = {\n    allowList: sanitizer_js.DefaultAllowlist,\n    content: {},\n    // { selector : text ,  selector2 : text2 , }\n    extraClass: '',\n    html: false,\n    sanitize: true,\n    sanitizeFn: null,\n    template: '<div></div>'\n  };\n  const DefaultType = {\n    allowList: 'object',\n    content: 'object',\n    extraClass: '(string|function)',\n    html: 'boolean',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    template: 'string'\n  };\n  const DefaultContentType = {\n    entry: '(string|element|function|null)',\n    selector: '(string|element)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class TemplateFactory extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    getContent() {\n      return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n    }\n    hasContent() {\n      return this.getContent().length > 0;\n    }\n    changeContent(content) {\n      this._checkContent(content);\n      this._config.content = {\n        ...this._config.content,\n        ...content\n      };\n      return this;\n    }\n    toHtml() {\n      const templateWrapper = document.createElement('div');\n      templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n      for (const [selector, text] of Object.entries(this._config.content)) {\n        this._setContent(templateWrapper, text, selector);\n      }\n      const template = templateWrapper.children[0];\n      const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n      if (extraClass) {\n        template.classList.add(...extraClass.split(' '));\n      }\n      return template;\n    }\n\n    // Private\n    _typeCheckConfig(config) {\n      super._typeCheckConfig(config);\n      this._checkContent(config.content);\n    }\n    _checkContent(arg) {\n      for (const [selector, content] of Object.entries(arg)) {\n        super._typeCheckConfig({\n          selector,\n          entry: content\n        }, DefaultContentType);\n      }\n    }\n    _setContent(template, content, selector) {\n      const templateElement = SelectorEngine.findOne(selector, template);\n      if (!templateElement) {\n        return;\n      }\n      content = this._resolvePossibleFunction(content);\n      if (!content) {\n        templateElement.remove();\n        return;\n      }\n      if (index_js.isElement(content)) {\n        this._putElementInTemplate(index_js.getElement(content), templateElement);\n        return;\n      }\n      if (this._config.html) {\n        templateElement.innerHTML = this._maybeSanitize(content);\n        return;\n      }\n      templateElement.textContent = content;\n    }\n    _maybeSanitize(arg) {\n      return this._config.sanitize ? sanitizer_js.sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n    }\n    _resolvePossibleFunction(arg) {\n      return index_js.execute(arg, [undefined, this]);\n    }\n    _putElementInTemplate(element, templateElement) {\n      if (this._config.html) {\n        templateElement.innerHTML = '';\n        templateElement.append(element);\n        return;\n      }\n      templateElement.textContent = element.textContent;\n    }\n  }\n\n  return TemplateFactory;\n\n}));\n//# sourceMappingURL=template-factory.js.map\n","/*!\n  * Bootstrap tooltip.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./util/index.js'), require('./util/sanitizer.js'), require('./util/template-factory.js')) :\n  typeof define === 'function' && define.amd ? define(['@popperjs/core', './base-component', './dom/event-handler', './dom/manipulator', './util/index', './util/sanitizer', './util/template-factory'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global[\"@popperjs/core\"], global.BaseComponent, global.EventHandler, global.Manipulator, global.Index, global.Sanitizer, global.TemplateFactory));\n})(this, (function (Popper, BaseComponent, EventHandler, Manipulator, index_js, sanitizer_js, TemplateFactory) { 'use strict';\n\n  function _interopNamespaceDefault(e) {\n    const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });\n    if (e) {\n      for (const k in e) {\n        if (k !== 'default') {\n          const d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: () => e[k]\n          });\n        }\n      }\n    }\n    n.default = e;\n    return Object.freeze(n);\n  }\n\n  const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'tooltip';\n  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_MODAL = 'modal';\n  const CLASS_NAME_SHOW = 'show';\n  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\n  const EVENT_MODAL_HIDE = 'hide.bs.modal';\n  const TRIGGER_HOVER = 'hover';\n  const TRIGGER_FOCUS = 'focus';\n  const TRIGGER_CLICK = 'click';\n  const TRIGGER_MANUAL = 'manual';\n  const EVENT_HIDE = 'hide';\n  const EVENT_HIDDEN = 'hidden';\n  const EVENT_SHOW = 'show';\n  const EVENT_SHOWN = 'shown';\n  const EVENT_INSERTED = 'inserted';\n  const EVENT_CLICK = 'click';\n  const EVENT_FOCUSIN = 'focusin';\n  const EVENT_FOCUSOUT = 'focusout';\n  const EVENT_MOUSEENTER = 'mouseenter';\n  const EVENT_MOUSELEAVE = 'mouseleave';\n  const AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: index_js.isRTL() ? 'left' : 'right',\n    BOTTOM: 'bottom',\n    LEFT: index_js.isRTL() ? 'right' : 'left'\n  };\n  const Default = {\n    allowList: sanitizer_js.DefaultAllowlist,\n    animation: true,\n    boundary: 'clippingParents',\n    container: false,\n    customClass: '',\n    delay: 0,\n    fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n    html: false,\n    offset: [0, 6],\n    placement: 'top',\n    popperConfig: null,\n    sanitize: true,\n    sanitizeFn: null,\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n    title: '',\n    trigger: 'hover focus'\n  };\n  const DefaultType = {\n    allowList: 'object',\n    animation: 'boolean',\n    boundary: '(string|element)',\n    container: '(string|element|boolean)',\n    customClass: '(string|function)',\n    delay: '(number|object)',\n    fallbackPlacements: 'array',\n    html: 'boolean',\n    offset: '(array|string|function)',\n    placement: '(string|function)',\n    popperConfig: '(null|object|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    selector: '(string|boolean)',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Tooltip extends BaseComponent {\n    constructor(element, config) {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)');\n      }\n      super(element, config);\n\n      // Private\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._isHovered = null;\n      this._activeTrigger = {};\n      this._popper = null;\n      this._templateFactory = null;\n      this._newContent = null;\n\n      // Protected\n      this.tip = null;\n      this._setListeners();\n      if (!this._config.selector) {\n        this._fixTitle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    enable() {\n      this._isEnabled = true;\n    }\n    disable() {\n      this._isEnabled = false;\n    }\n    toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    }\n    toggle() {\n      if (!this._isEnabled) {\n        return;\n      }\n      if (this._isShown()) {\n        this._leave();\n        return;\n      }\n      this._enter();\n    }\n    dispose() {\n      clearTimeout(this._timeout);\n      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n      if (this._element.getAttribute('data-bs-original-title')) {\n        this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n      }\n      this._disposePopper();\n      super.dispose();\n    }\n    show() {\n      if (this._element.style.display === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n      if (!(this._isWithContent() && this._isEnabled)) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW));\n      const shadowRoot = index_js.findShadowRoot(this._element);\n      const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n      if (showEvent.defaultPrevented || !isInTheDom) {\n        return;\n      }\n\n      // TODO: v6 remove this or make it optional\n      this._disposePopper();\n      const tip = this._getTipElement();\n      this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n      const {\n        container\n      } = this._config;\n      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n        container.append(tip);\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n      }\n      this._popper = this._createPopper(tip);\n      tip.classList.add(CLASS_NAME_SHOW);\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.on(element, 'mouseover', index_js.noop);\n        }\n      }\n      const complete = () => {\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN));\n        if (this._isHovered === false) {\n          this._leave();\n        }\n        this._isHovered = false;\n      };\n      this._queueCallback(complete, this.tip, this._isAnimated());\n    }\n    hide() {\n      if (!this._isShown()) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE));\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const tip = this._getTipElement();\n      tip.classList.remove(CLASS_NAME_SHOW);\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.off(element, 'mouseover', index_js.noop);\n        }\n      }\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n      this._isHovered = null; // it is a trick to support manual triggering\n\n      const complete = () => {\n        if (this._isWithActiveTrigger()) {\n          return;\n        }\n        if (!this._isHovered) {\n          this._disposePopper();\n        }\n        this._element.removeAttribute('aria-describedby');\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN));\n      };\n      this._queueCallback(complete, this.tip, this._isAnimated());\n    }\n    update() {\n      if (this._popper) {\n        this._popper.update();\n      }\n    }\n\n    // Protected\n    _isWithContent() {\n      return Boolean(this._getTitle());\n    }\n    _getTipElement() {\n      if (!this.tip) {\n        this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n      }\n      return this.tip;\n    }\n    _createTipElement(content) {\n      const tip = this._getTemplateFactory(content).toHtml();\n\n      // TODO: remove this check in v6\n      if (!tip) {\n        return null;\n      }\n      tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);\n      // TODO: v6 the following can be achieved with CSS only\n      tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n      const tipId = index_js.getUID(this.constructor.NAME).toString();\n      tip.setAttribute('id', tipId);\n      if (this._isAnimated()) {\n        tip.classList.add(CLASS_NAME_FADE);\n      }\n      return tip;\n    }\n    setContent(content) {\n      this._newContent = content;\n      if (this._isShown()) {\n        this._disposePopper();\n        this.show();\n      }\n    }\n    _getTemplateFactory(content) {\n      if (this._templateFactory) {\n        this._templateFactory.changeContent(content);\n      } else {\n        this._templateFactory = new TemplateFactory({\n          ...this._config,\n          // the `content` var has to be after `this._config`\n          // to override config.content in case of popover\n          content,\n          extraClass: this._resolvePossibleFunction(this._config.customClass)\n        });\n      }\n      return this._templateFactory;\n    }\n    _getContentForTemplate() {\n      return {\n        [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n      };\n    }\n    _getTitle() {\n      return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n    }\n\n    // Private\n    _initializeOnDelegatedTarget(event) {\n      return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n    }\n    _isAnimated() {\n      return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE);\n    }\n    _isShown() {\n      return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW);\n    }\n    _createPopper(tip) {\n      const placement = index_js.execute(this._config.placement, [this, tip, this._element]);\n      const attachment = AttachmentMap[placement.toUpperCase()];\n      return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));\n    }\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n      if (typeof offset === 'string') {\n        return offset.split(',').map(value => Number.parseInt(value, 10));\n      }\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n      return offset;\n    }\n    _resolvePossibleFunction(arg) {\n      return index_js.execute(arg, [this._element, this._element]);\n    }\n    _getPopperConfig(attachment) {\n      const defaultBsPopperConfig = {\n        placement: attachment,\n        modifiers: [{\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }, {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        }, {\n          name: 'preSetPlacement',\n          enabled: true,\n          phase: 'beforeMain',\n          fn: data => {\n            // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n            // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n            this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n          }\n        }]\n      };\n      return {\n        ...defaultBsPopperConfig,\n        ...index_js.execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n      };\n    }\n    _setListeners() {\n      const triggers = this._config.trigger.split(' ');\n      for (const trigger of triggers) {\n        if (trigger === 'click') {\n          EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]);\n            context.toggle();\n          });\n        } else if (trigger !== TRIGGER_MANUAL) {\n          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN);\n          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT);\n          EventHandler.on(this._element, eventIn, this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n            context._enter();\n          });\n          EventHandler.on(this._element, eventOut, this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n            context._leave();\n          });\n        }\n      }\n      this._hideModalHandler = () => {\n        if (this._element) {\n          this.hide();\n        }\n      };\n      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n    }\n    _fixTitle() {\n      const title = this._element.getAttribute('title');\n      if (!title) {\n        return;\n      }\n      if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n        this._element.setAttribute('aria-label', title);\n      }\n      this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n      this._element.removeAttribute('title');\n    }\n    _enter() {\n      if (this._isShown() || this._isHovered) {\n        this._isHovered = true;\n        return;\n      }\n      this._isHovered = true;\n      this._setTimeout(() => {\n        if (this._isHovered) {\n          this.show();\n        }\n      }, this._config.delay.show);\n    }\n    _leave() {\n      if (this._isWithActiveTrigger()) {\n        return;\n      }\n      this._isHovered = false;\n      this._setTimeout(() => {\n        if (!this._isHovered) {\n          this.hide();\n        }\n      }, this._config.delay.hide);\n    }\n    _setTimeout(handler, timeout) {\n      clearTimeout(this._timeout);\n      this._timeout = setTimeout(handler, timeout);\n    }\n    _isWithActiveTrigger() {\n      return Object.values(this._activeTrigger).includes(true);\n    }\n    _getConfig(config) {\n      const dataAttributes = Manipulator.getDataAttributes(this._element);\n      for (const dataAttribute of Object.keys(dataAttributes)) {\n        if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n          delete dataAttributes[dataAttribute];\n        }\n      }\n      config = {\n        ...dataAttributes,\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config = this._mergeConfigObj(config);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n    _configAfterMerge(config) {\n      config.container = config.container === false ? document.body : index_js.getElement(config.container);\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n      return config;\n    }\n    _getDelegateConfig() {\n      const config = {};\n      for (const [key, value] of Object.entries(this._config)) {\n        if (this.constructor.Default[key] !== value) {\n          config[key] = value;\n        }\n      }\n      config.selector = false;\n      config.trigger = 'manual';\n\n      // In the future can be replaced with:\n      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n      // `Object.fromEntries(keysWithDifferentValues)`\n      return config;\n    }\n    _disposePopper() {\n      if (this._popper) {\n        this._popper.destroy();\n        this._popper = null;\n      }\n      if (this.tip) {\n        this.tip.remove();\n        this.tip = null;\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tooltip.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Tooltip);\n\n  return Tooltip;\n\n}));\n//# sourceMappingURL=tooltip.js.map\n","import './main.js'\nimport './selector.js'\nimport './toggler.js'\nimport './gizmos.js'\nimport './stonks_fullpage.js'\nimport './impact_im_ref.js'\nimport './button_grain.js'\n\nimport 'img-comparison-slider'\n\nimport '@hotwired/turbo'\n\n// Import only the Tooltip component from Bootstrap to keep bundle small\n// Requires installing bootstrap and @popperjs/core\nimport Tooltip from 'bootstrap/js/dist/tooltip'\n// Expose for main.js initializer without refactor\n/* eslint-disable no-undef */\n// @ts-ignore\nwindow.Tooltip = Tooltip\n","/*\nStimulus 3.2.1\nCopyright © 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n","import { Controller } from '@hotwired/stimulus'\n\nconst FRAME_MS = 1000 / 24\nconst FADE_OUT_MS = 180\nconst REDUCED_MOTION_QUERY = '(prefers-reduced-motion: reduce)'\n\nexport default class ButtonController extends Controller<HTMLAnchorElement> {\n  private connected = false\n  private hovering = false\n  private pressing = false\n  private tickerId: number | null = null\n  private fadeOutTimeoutId: number | null = null\n  private reducedMotionQuery: MediaQueryList | null = null\n  private usesLegacyMotionListener = false\n\n  connect(): void {\n    this.connected = true\n    this.reducedMotionQuery = window.matchMedia(REDUCED_MOTION_QUERY)\n    this.observeMotionChanges(this.reducedMotionQuery)\n    this.clearPresentation()\n  }\n\n  disconnect(): void {\n    this.connected = false\n    if (this.reducedMotionQuery !== null) {\n      this.stopObservingMotionChanges(this.reducedMotionQuery)\n    }\n    this.reducedMotionQuery = null\n    this.clearPresentation()\n  }\n\n  enter(): void {\n    this.hovering = true\n    this.sync()\n  }\n\n  leave(): void {\n    this.hovering = false\n    this.sync()\n  }\n\n  press(event: PointerEvent): void {\n    this.hovering = this.pointerCanRemainHovered(event)\n    this.pressing = true\n    this.sync()\n  }\n\n  release(event: PointerEvent): void {\n    this.hovering = this.pointerCanRemainHovered(event)\n    this.pressing = false\n    this.sync()\n  }\n\n  cancel(event: PointerEvent): void {\n    this.hovering = this.pointerCanRemainHovered(event)\n    this.pressing = false\n    this.sync()\n  }\n\n  blur(): void {\n    this.hovering = false\n    this.pressing = false\n    this.stop(false)\n  }\n\n  prepareForCache(): void {\n    this.clearPresentation()\n  }\n\n  private readonly handleMotionChange = (): void => {\n    this.sync()\n  }\n\n  private sync(): void {\n    if (!this.shouldRun()) {\n      this.stop(!this.prefersReducedMotion)\n      return\n    }\n\n    this.clearFadeOutTimeout()\n    this.element.dataset.grainState = this.pressing ? 'pressed' : 'active'\n    this.randomizePlatePosition()\n\n    if (this.tickerId === null) {\n      this.tickerId = window.setInterval(() => {\n        this.randomizePlatePosition()\n      }, FRAME_MS)\n    }\n  }\n\n  private shouldRun(): boolean {\n    return (\n      this.connected &&\n      (this.hovering || this.pressing) &&\n      !this.prefersReducedMotion\n    )\n  }\n\n  private get prefersReducedMotion(): boolean {\n    return this.reducedMotionQuery?.matches ?? false\n  }\n\n  private pointerCanRemainHovered(event: PointerEvent): boolean {\n    return event.pointerType === 'mouse' && this.element.matches(':hover')\n  }\n\n  private stop(animateThroughFade: boolean): void {\n    delete this.element.dataset.grainState\n\n    if (animateThroughFade && this.tickerId !== null) {\n      this.clearFadeOutTimeout()\n      this.fadeOutTimeoutId = window.setTimeout(() => {\n        this.fadeOutTimeoutId = null\n        if (!this.shouldRun()) this.clearTicker()\n      }, FADE_OUT_MS)\n      return\n    }\n\n    this.clearFadeOutTimeout()\n    this.clearTicker()\n  }\n\n  private clearPresentation(): void {\n    this.hovering = false\n    this.pressing = false\n    this.stop(false)\n    this.element.style.removeProperty('--button-grain-x')\n    this.element.style.removeProperty('--button-grain-y')\n  }\n\n  private clearTicker(): void {\n    if (this.tickerId === null) return\n\n    window.clearInterval(this.tickerId)\n    this.tickerId = null\n  }\n\n  private clearFadeOutTimeout(): void {\n    if (this.fadeOutTimeoutId === null) return\n\n    window.clearTimeout(this.fadeOutTimeoutId)\n    this.fadeOutTimeoutId = null\n  }\n\n  private observeMotionChanges(query: MediaQueryList): void {\n    if (typeof query.addEventListener === 'function') {\n      this.usesLegacyMotionListener = false\n      query.addEventListener('change', this.handleMotionChange)\n      return\n    }\n\n    this.usesLegacyMotionListener = true\n    query.addListener(this.handleMotionChange)\n  }\n\n  private stopObservingMotionChanges(query: MediaQueryList): void {\n    if (this.usesLegacyMotionListener) {\n      query.removeListener(this.handleMotionChange)\n    } else {\n      query.removeEventListener('change', this.handleMotionChange)\n    }\n\n    this.usesLegacyMotionListener = false\n  }\n\n  private randomizePlatePosition(): void {\n    this.element.style.setProperty('--button-grain-x', this.randomPercent())\n    this.element.style.setProperty('--button-grain-y', this.randomPercent())\n  }\n\n  private randomPercent(): string {\n    return `${Math.round(Math.random() * 10_000) / 100}%`\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\n// Global state shared across all carousel instances\nconst interactedCarousels = new WeakSet<Element>()\nlet globalAttentionInstalled = false\nlet attentionRafPending = false\n\nconst installGlobalAttentionScheduler = () => {\n  if (globalAttentionInstalled) return\n  globalAttentionInstalled = true\n  const scheduleGlobalAttentionUpdate = () => {\n    if (attentionRafPending) return\n    attentionRafPending = true\n    requestAnimationFrame(() => {\n      attentionRafPending = false\n      const evt = new Event('vv:update-carousel-attention')\n      document.dispatchEvent(evt)\n    })\n  }\n  window.addEventListener('scroll', scheduleGlobalAttentionUpdate, {\n    passive: true,\n  })\n  window.addEventListener('resize', scheduleGlobalAttentionUpdate)\n}\n\nexport default class CarouselController extends Controller<HTMLElement> {\n  private isPageMode: boolean = false\n  private navContainer: Element | null = null\n  private prevBtn: HTMLElement | null = null\n  private nextBtn: HTMLElement | null = null\n\n  private resizeObserver: ResizeObserver | null = null\n\n  private suppressAttention: boolean = false\n\n  private rafId: number | null = null\n  private animStartTime = 0\n  private animStartLeft = 0\n  private animEndLeft = 0\n  private animDuration = 0\n\n  private boundOnScrollUpdateDisabled = () => this.updateDisabled()\n  private boundOnScrollGiveAttention = () => this.giveAttentionIfScrollable()\n  private boundWheel = (e: WheelEvent) => this.maybeClearAttentionOnWheel(e)\n  private boundTouchStart = () => this.onTouchStart()\n  private boundResizeUpdateDisabled = () => this.updateDisabled()\n  private boundResizeGiveAttention = () => this.giveAttentionIfScrollable()\n  private boundOrientationChange = () => this.applyMobileCenterStart()\n  private boundTabChange = (e: Event) => this.onTabChange(e)\n  private boundTabPreChange = (e: Event) => this.onTabPreChange(e)\n  private boundAttentionUpdate = () => this.giveAttentionIfScrollable()\n  private boundJump = (e: Event) => this.onJump(e as CustomEvent)\n\n  connect(): void {\n    installGlobalAttentionScheduler()\n\n    const el = this.element\n    this.isPageMode = (el as HTMLElement).dataset.scrollMode === 'page'\n\n    const nav = el.nextElementSibling\n    this.navContainer = nav\n    if (this.isCarouselNav(nav)) {\n      this.prevBtn = nav.querySelector('.prev') as HTMLElement | null\n      this.nextBtn = nav.querySelector('.next') as HTMLElement | null\n    } else {\n      this.prevBtn = null\n      this.nextBtn = null\n    }\n\n    this.updateDisabled()\n    this.applyMobileCenterStart()\n    this.giveAttentionIfScrollable()\n\n    el.addEventListener('scroll', this.boundOnScrollUpdateDisabled)\n    el.addEventListener('scroll', this.boundOnScrollGiveAttention)\n    el.addEventListener('wheel', this.boundWheel, { passive: true })\n    el.addEventListener('touchstart', this.boundTouchStart, { passive: true })\n    el.addEventListener('vv:carousel-jump', this.boundJump as EventListener)\n\n    document.addEventListener('vv:update-carousel-attention', this.boundAttentionUpdate)\n    document.addEventListener('vv:tabchange', this.boundTabChange)\n    document.addEventListener('vv:tabprechange', this.boundTabPreChange)\n    window.addEventListener('resize', this.boundResizeUpdateDisabled)\n    window.addEventListener('resize', this.boundResizeGiveAttention)\n    window.addEventListener('orientationchange', this.boundOrientationChange)\n\n    if ('ResizeObserver' in window) {\n      this.resizeObserver = new ResizeObserver(() => {\n        this.updateDisabled()\n        this.giveAttentionIfScrollable()\n        this.applyMobileCenterStart()\n      })\n      this.resizeObserver.observe(el)\n    }\n\n    if (this.prevBtn) {\n      this.prevBtn.addEventListener('click', this.onPrevClick)\n    }\n    if (this.nextBtn) {\n      this.nextBtn.addEventListener('click', this.onNextClick)\n    }\n  }\n\n  disconnect(): void {\n    const el = this.element\n    el.removeEventListener('scroll', this.boundOnScrollUpdateDisabled)\n    el.removeEventListener('scroll', this.boundOnScrollGiveAttention)\n    el.removeEventListener('wheel', this.boundWheel)\n    el.removeEventListener('touchstart', this.boundTouchStart)\n    el.removeEventListener('vv:carousel-jump', this.boundJump as EventListener)\n\n    document.removeEventListener('vv:update-carousel-attention', this.boundAttentionUpdate)\n    document.removeEventListener('vv:tabchange', this.boundTabChange)\n    document.removeEventListener('vv:tabprechange', this.boundTabPreChange)\n    window.removeEventListener('resize', this.boundResizeUpdateDisabled)\n    window.removeEventListener('resize', this.boundResizeGiveAttention)\n    window.removeEventListener('orientationchange', this.boundOrientationChange)\n\n    if (this.prevBtn) this.prevBtn.removeEventListener('click', this.onPrevClick)\n    if (this.nextBtn) this.nextBtn.removeEventListener('click', this.onNextClick)\n\n    if (this.resizeObserver) {\n      try {\n        this.resizeObserver.disconnect()\n      } catch (_) { }\n      this.resizeObserver = null\n    }\n\n    this.cancelAnim()\n  }\n\n  // ---------------- Helpers ----------------\n  private isCarouselNav(node: Element | null): node is Element {\n    return !!(\n      node &&\n      node.classList &&\n      node.classList.contains('carousel-nav')\n    )\n  }\n\n  private getGapPx(): number {\n    const el = this.element\n    const styles = getComputedStyle(el)\n    const raw = (styles as any).columnGap || (styles as any).gap || '0'\n    let gap = parseFloat(raw)\n    if (!isFinite(gap)) gap = 0\n    if (gap === 0) {\n      const items = el.querySelectorAll('.carousel-item')\n      if (items.length >= 2) {\n        const a = (items[0] as HTMLElement).getBoundingClientRect()\n        const b = (items[1] as HTMLElement).getBoundingClientRect()\n        const measured = b.left - a.right\n        if (isFinite(measured) && measured >= 0) gap = measured\n      }\n    }\n    return gap\n  }\n\n  private getScrollStep(): number {\n    const el = this.element\n    if (this.isPageMode) return el.clientWidth\n    const firstItem = el.querySelector('.carousel-item') as HTMLElement | null\n    if (!firstItem) return el.clientWidth\n    const itemWidth = firstItem.getBoundingClientRect().width\n    const gap = this.getGapPx()\n    return itemWidth + gap\n  }\n\n  private getItemStep(): number {\n    const el = this.element\n    const firstItem = el.querySelector('.carousel-item') as HTMLElement | null\n    if (!firstItem) return this.getScrollStep()\n    const itemWidth = firstItem.getBoundingClientRect().width\n    const gap = this.getGapPx()\n    return itemWidth + gap\n  }\n\n  private getPaddingLeft(): number {\n    const val = parseFloat(getComputedStyle(this.element).paddingLeft)\n    return isNaN(val) ? 0 : val\n  }\n\n  private getPaddingRight(): number {\n    const val = parseFloat(getComputedStyle(this.element).paddingRight)\n    return isNaN(val) ? 0 : val\n  }\n\n  private getScrollPaddingLeft(): number {\n    const styles = getComputedStyle(this.element)\n    const raw =\n      (styles as any).getPropertyValue('scroll-padding-left') ||\n      (styles as any).scrollPaddingLeft ||\n      '0'\n    let val = parseFloat(raw)\n    if (!isFinite(val)) val = 0\n    return val\n  }\n\n  private getLeftInset(): number {\n    return Math.max(this.getPaddingLeft(), this.getScrollPaddingLeft())\n  }\n\n  private applyMobileCenterStart(): void {\n    const el = this.element\n    const firstItem = el.querySelector('.carousel-item') as HTMLElement | null\n    if (!firstItem) return\n    const containerWidth = el.clientWidth || 0\n    const itemWidth = firstItem.getBoundingClientRect().width || 0\n    if (containerWidth <= 0 || itemWidth <= 0) return\n    const fillsViewport = itemWidth / containerWidth >= 0.7\n    if (!fillsViewport) {\n      if ((el as HTMLElement).style.paddingLeft) (el as HTMLElement).style.paddingLeft = ''\n      if ((el as HTMLElement).style.scrollPaddingLeft)\n        (el as HTMLElement).style.scrollPaddingLeft = ''\n      return\n    }\n    const desiredInset = Math.max(0, (containerWidth - itemWidth) / 2)\n    const currentPad = this.getPaddingLeft()\n    if (Math.abs(currentPad - desiredInset) > 0.5) {\n      try {\n        ; (el as HTMLElement).style.paddingLeft = desiredInset + 'px'\n          ; (el as HTMLElement).style.scrollPaddingLeft = desiredInset + 'px'\n      } catch (_) { }\n      requestAnimationFrame(() => {\n        this.updateDisabled()\n        this.giveAttentionIfScrollable()\n      })\n    }\n  }\n\n  private updateDisabled(): void {\n    if (!this.prevBtn || !this.nextBtn) return\n    const el = this.element\n    const maxScroll = el.scrollWidth - el.clientWidth\n    const atStart = el.scrollLeft <= 2\n    const atEnd = el.scrollLeft >= maxScroll - 2\n    this.prevBtn.classList.toggle('disabled', atStart)\n    this.nextBtn.classList.toggle('disabled', atEnd)\n  }\n\n  private easeOutCubic(t: number): number {\n    return 1 - Math.pow(1 - t, 3)\n  }\n\n  private disableSnap(): void {\n    try {\n      ; (this.element as HTMLElement).style.setProperty('scroll-snap-type', 'none', 'important')\n        ; (this.element as HTMLElement).style.setProperty('-webkit-scroll-snap-type', 'none', 'important')\n    } catch (_) { }\n  }\n\n  private restoreSnap(): void {\n    try {\n      ; (this.element as HTMLElement).style.removeProperty('scroll-snap-type')\n        ; (this.element as HTMLElement).style.removeProperty('-webkit-scroll-snap-type')\n    } catch (_) { }\n  }\n\n  private cancelAnim(): void {\n    if (this.rafId !== null) {\n      cancelAnimationFrame(this.rafId)\n      this.rafId = null\n    }\n  }\n\n  private startAnim(toLeft: number): void {\n    const el = this.element\n    this.cancelAnim()\n    this.disableSnap()\n    this.suppressAttention = true\n    this.animStartTime = performance.now()\n    this.animStartLeft = el.scrollLeft\n    this.animEndLeft = toLeft\n    const distance = Math.abs(this.animEndLeft - this.animStartLeft)\n    this.animDuration = Math.max(180, Math.min(320, 0.7 * distance))\n\n    const step = (now: number) => {\n      const elapsed = now - this.animStartTime\n      const t = this.animDuration <= 0 ? 1 : Math.min(1, elapsed / this.animDuration)\n      const eased = this.easeOutCubic(t)\n      const next = this.animStartLeft + (this.animEndLeft - this.animStartLeft) * eased\n      el.scrollLeft = next\n      if (t < 1) {\n        this.rafId = requestAnimationFrame(step)\n      } else {\n        this.rafId = null\n        el.scrollLeft = this.animEndLeft\n        requestAnimationFrame(() => {\n          this.restoreSnap()\n          this.suppressAttention = false\n          this.giveAttentionIfScrollable()\n        })\n      }\n    }\n    this.rafId = requestAnimationFrame(step)\n  }\n\n  private getAnchors(): number[] {\n    const el = this.element\n    const rightBound = el.scrollWidth - el.clientWidth\n    if (this.isPageMode) {\n      const pageWidth = el.clientWidth || 1\n      const anchors: number[] = []\n      let pos = 0\n      while (pos <= rightBound + 0.5) {\n        anchors.push(pos)\n        pos += pageWidth\n      }\n      return anchors\n    }\n    const items = Array.from(el.querySelectorAll('.carousel-item')) as HTMLElement[]\n    const leftPad = this.getLeftInset()\n    const raw = items\n      .map((it) => {\n        const a = it.offsetLeft - leftPad\n        return Math.max(0, Math.min(rightBound, a))\n      })\n      .sort((a, b) => a - b)\n    const anchors: number[] = []\n    const tol = 0.5\n    for (let i = 0; i < raw.length; i++) {\n      if (i === 0 || Math.abs(raw[i] - anchors[anchors.length - 1]) > tol) {\n        anchors.push(raw[i])\n      }\n    }\n    return anchors\n  }\n\n  private pickNearestAnchor(target: number): number {\n    const anchors = this.getAnchors()\n    if (anchors.length === 0) return target\n    let best = anchors[0]\n    let bestDist = Math.abs(best - target)\n    for (let i = 1; i < anchors.length; i++) {\n      const d = Math.abs(anchors[i] - target)\n      if (d < bestDist) {\n        bestDist = d\n        best = anchors[i]\n      }\n    }\n    return best\n  }\n\n  private scrollTo(target: number): void {\n    const el = this.element\n    const leftBound = 0\n    const rightBound = el.scrollWidth - el.clientWidth\n    const clamped = Math.max(leftBound, Math.min(rightBound, target))\n    const snappedTarget = this.pickNearestAnchor(clamped)\n    this.startAnim(snappedTarget)\n  }\n\n  private queueScroll(direction: number): void {\n    const epsilon = 0.5\n    const anchors = this.getAnchors()\n    if (anchors.length === 0) return\n    const base = this.rafId !== null ? this.animEndLeft : this.element.scrollLeft\n    let target: number | undefined\n    if (direction > 0) {\n      target = anchors.find((a) => a > base + epsilon)\n      if (target == null) target = anchors[anchors.length - 1]\n    } else {\n      for (let i = anchors.length - 1; i >= 0; i--) {\n        if (anchors[i] < base - epsilon) {\n          target = anchors[i]\n          break\n        }\n      }\n      if (target == null) target = anchors[0]\n    }\n    this.scrollTo(target!)\n  }\n\n  // ---------------- Attention logic ----------------\n  private giveAttentionIfScrollable(): void {\n    const nextBtn = this.nextBtn\n    if (!nextBtn) return\n\n    const startFade = () => {\n      if (!nextBtn) return\n      if (!nextBtn.classList.contains('needs-attention')) return\n      if (nextBtn.classList.contains('attention-fading')) return\n      nextBtn.classList.remove('needs-attention')\n      nextBtn.classList.add('attention-fading')\n      const onEnd = (e: AnimationEvent) => {\n        if (e && e.animationName !== 'zc-nav-flash-out') return\n        nextBtn.classList.remove('attention-fading')\n        nextBtn.removeEventListener('animationend', onEnd)\n      }\n      nextBtn.addEventListener('animationend', onEnd)\n    }\n\n    const cutAttention = () => {\n      if (!nextBtn) return\n      nextBtn.classList.remove('needs-attention')\n      nextBtn.classList.remove('attention-fading')\n    }\n\n    if (this.suppressAttention) {\n      cutAttention()\n      return\n    }\n    if (interactedCarousels.has(this.element)) {\n      cutAttention()\n      return\n    }\n    // Only the carousel closest to the viewport center may show attention\n    if (!this.isActiveCarousel()) {\n      startFade()\n      return\n    }\n    const el = this.element\n    const maxScroll = el.scrollWidth - el.clientWidth\n    const atEnd = el.scrollLeft >= maxScroll - 2\n    if (!atEnd && maxScroll > 2) {\n      nextBtn.classList.remove('attention-fading')\n      nextBtn.classList.add('needs-attention')\n    } else {\n      startFade()\n    }\n  }\n\n  private isActiveCarousel(): boolean {\n    // Determine which carousel is closest to viewport vertical center\n    const carousels = Array.from(document.querySelectorAll('.carousel')) as HTMLElement[]\n    let best: HTMLElement | null = null\n    let bestDist = Infinity\n    const centerY = window.innerHeight / 2\n    for (const c of carousels) {\n      const r = c.getBoundingClientRect()\n      if (r.height <= 0) continue\n      const visible = r.bottom > 0 && r.top < window.innerHeight\n      if (!visible) continue\n      const cy = r.top + r.height / 2\n      const d = Math.abs(cy - centerY)\n      if (d < bestDist) {\n        bestDist = d\n        best = c\n      }\n    }\n    return best === this.element\n  }\n\n  private clearAttention(): void {\n    const nextBtn = this.nextBtn\n    if (nextBtn) {\n      if (!nextBtn.classList.contains('attention-fading')) {\n        nextBtn.classList.remove('needs-attention')\n        nextBtn.classList.add('attention-fading')\n        const onEnd = (e: AnimationEvent) => {\n          if (e && e.animationName !== 'zc-nav-flash-out') return\n          nextBtn.classList.remove('attention-fading')\n          nextBtn.removeEventListener('animationend', onEnd)\n        }\n        nextBtn.addEventListener('animationend', onEnd)\n      }\n    }\n    interactedCarousels.add(this.element)\n  }\n\n  private maybeClearAttentionOnWheel(e: WheelEvent): void {\n    const dx = Math.abs(e && (e.deltaX != null ? e.deltaX : 0))\n    const dy = Math.abs(e && (e.deltaY != null ? e.deltaY : 0))\n    if (dx > dy && dx > 2) {\n      if (this.nextBtn) {\n        this.nextBtn.classList.remove('needs-attention')\n        this.nextBtn.classList.remove('attention-fading')\n      }\n      interactedCarousels.add(this.element)\n    }\n  }\n\n  private onTouchStart(): void {\n    if (this.nextBtn) {\n      this.nextBtn.classList.remove('needs-attention')\n      this.nextBtn.classList.remove('attention-fading')\n    }\n    interactedCarousels.add(this.element)\n  }\n\n  // ---------------- Event handlers ----------------\n  private onPrevClick = () => {\n    if (this.nextBtn) {\n      this.nextBtn.classList.remove('needs-attention')\n      this.nextBtn.classList.remove('attention-fading')\n    }\n    interactedCarousels.add(this.element)\n    this.queueScroll(-1)\n  }\n\n  private onNextClick = () => {\n    if (this.nextBtn) {\n      this.nextBtn.classList.remove('needs-attention')\n      this.nextBtn.classList.remove('attention-fading')\n    }\n    interactedCarousels.add(this.element)\n    this.queueScroll(1)\n  }\n\n  private onTabChange(e: Event): void {\n    const target = e.target as HTMLElement | null\n    if (target && target.contains && target.contains(this.element)) {\n      this.updateDisabled()\n      this.giveAttentionIfScrollable()\n      this.applyMobileCenterStart()\n      requestAnimationFrame(() => {\n        this.updateDisabled()\n        this.applyMobileCenterStart()\n      })\n      setTimeout(() => {\n        this.updateDisabled()\n        this.applyMobileCenterStart()\n      }, 60)\n      setTimeout(() => {\n        this.updateDisabled()\n        this.applyMobileCenterStart()\n      }, 160)\n    }\n  }\n\n  private onTabPreChange(e: Event): void {\n    const target = e.target as HTMLElement | null\n    if (target && target.contains && target.contains(this.element)) {\n      this.applyMobileCenterStart()\n    }\n  }\n\n  private onJump(e: CustomEvent): void {\n    const detail = e && e.detail\n    if (!detail || (detail as any).index == null) return\n    let index = Number((detail as any).index)\n    if (!Number.isFinite(index)) return\n    const anchors = this.getAnchors()\n    if (!anchors.length) return\n    index = Math.max(0, Math.min(anchors.length - 1, Math.round(index)))\n    if (this.nextBtn) {\n      this.nextBtn.classList.remove('needs-attention')\n      this.nextBtn.classList.remove('attention-fading')\n    }\n    interactedCarousels.add(this.element)\n    this.scrollTo(anchors[index])\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\n// Stimulus controller to clamp any container and provide a toggle\n// Usage: add data-controller=\"clamp-list\" directly on any block-level element you want clamped\n// Optionally set data-clamp-list-max-lines-value to control the approximate number of text lines\nexport default class ClampListController extends Controller<HTMLElement> {\n  static values = {\n    maxLines: { type: Number, default: 5 },\n  }\n\n  declare maxLinesValue: number\n  private resizeObserver: ResizeObserver | null = null\n  private animFrame: number | null = null\n\n  connect(): void {\n    this.initializeClamp()\n  }\n\n  private initializeClamp(): void {\n    const target = this.element as HTMLElement\n\n    // Avoid double-wrapping if the controller reconnects\n    if (target.parentElement && target.parentElement.classList.contains('clamp-list')) {\n      return\n    }\n\n    // Determine effective line-height for this element\n    const computed = getComputedStyle(target)\n    let lineHeightPx = parseFloat(computed.lineHeight)\n    if (isNaN(lineHeightPx) || !isFinite(lineHeightPx)) {\n      const fontSizePx = parseFloat(computed.fontSize) || 16\n      lineHeightPx = fontSizePx * 1.5\n    }\n    const maxHeightPx = this.maxLinesValue * lineHeightPx\n\n    // Skip wrapping if content already fits within the clamped height\n    if (target.scrollHeight <= maxHeightPx + 1) return\n\n    const wrapper = document.createElement('div')\n    wrapper.className = 'clamp-list clamped'\n    target.parentNode?.insertBefore(wrapper, target)\n    wrapper.appendChild(target)\n    target.classList.add('clamp-content')\n\n    // Expose max height via CSS custom property based on computed line-height\n    wrapper.style.setProperty('--clamp-max-height', `${maxHeightPx}px`)\n\n    // Measure and maintain the open height for smooth animation\n    const updateOpenHeight = () => {\n      // Use scrollHeight to get full content height regardless of clamped max-height\n      const openHeightPx = target.scrollHeight\n      wrapper.style.setProperty('--clamp-open-height', `${openHeightPx}px`)\n    }\n    // Initial measure (after DOM insertion)\n    updateOpenHeight()\n    // Observe size changes (e.g., fonts, responsive layout, dynamic content)\n    this.resizeObserver = new ResizeObserver(() => updateOpenHeight())\n    this.resizeObserver.observe(target)\n\n    const toggle = document.createElement('button')\n    toggle.type = 'button'\n    toggle.className = 'clamp-toggle'\n    toggle.setAttribute('aria-expanded', 'false')\n    toggle.setAttribute('aria-label', 'Show more')\n    toggle.innerHTML =\n      '<span class=\"label\">Show More</span> <i class=\"fa fa-chevron-down\" aria-hidden=\"true\"></i>'\n\n    // Max height already set above based on computed line-height\n\n    wrapper.appendChild(toggle)\n\n    const animateMaskStops = (expanding: boolean) => {\n      const duration = 300 // keep in sync with CSS var default\n      const startSolid = parseFloat(\n        getComputedStyle(wrapper).getPropertyValue('--mask-solid-stop') || '65'\n      )\n      const startFeather = parseFloat(\n        getComputedStyle(wrapper).getPropertyValue('--mask-feather-end') || '92'\n      )\n      const fromSolid = expanding ? startSolid : 100\n      const toSolid = expanding ? 100 : startSolid\n      const fromFeather = expanding ? startFeather : 100\n      const toFeather = expanding ? 100 : startFeather\n      const startTime = performance.now()\n\n      const tick = (now: number) => {\n        const t = Math.min(1, (now - startTime) / duration)\n        const ease = t * (2 - t) // easeOutQuad\n        const solid = fromSolid + (toSolid - fromSolid) * ease\n        const feather = fromFeather + (toFeather - fromFeather) * ease\n        wrapper.style.setProperty('--mask-solid-stop', `${solid}%`)\n        wrapper.style.setProperty('--mask-feather-end', `${feather}%`)\n        if (t < 1) {\n          this.animFrame = requestAnimationFrame(tick)\n        } else {\n          this.animFrame = null\n        }\n      }\n      if (this.animFrame) cancelAnimationFrame(this.animFrame)\n      this.animFrame = requestAnimationFrame(tick)\n    }\n\n    toggle.addEventListener('click', () => {\n      const expanded = wrapper.classList.toggle('expanded')\n      wrapper.classList.toggle('clamped', !expanded)\n      toggle.setAttribute('aria-expanded', expanded ? 'true' : 'false')\n      toggle.setAttribute('aria-label', expanded ? 'Show less' : 'Show more')\n      const labelSpan = toggle.querySelector('.label') as HTMLSpanElement | null\n      const icon = toggle.querySelector('i') as HTMLElement | null\n      if (labelSpan && icon) {\n        labelSpan.textContent = expanded ? 'Show Less' : 'Show More'\n        icon.className = expanded ? 'fa fa-chevron-up' : 'fa fa-chevron-down'\n      }\n      // Recompute height just in case content changed between states\n      updateOpenHeight()\n\n      // Animate gradient stops to visually shrink feather in/out\n      animateMaskStops(expanded)\n    })\n  }\n\n  disconnect(): void {\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect()\n      this.resizeObserver = null\n    }\n    if (this.animFrame) {\n      cancelAnimationFrame(this.animFrame)\n      this.animFrame = null\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class EmailFormController extends Controller {\n  static targets = ['email', 'submit']\n\n  declare emailTarget: HTMLInputElement\n  declare submitTarget: HTMLButtonElement\n\n  connect(): void {\n    this.updateDisabled()\n  }\n\n  onInput(): void {\n    this.updateDisabled()\n  }\n\n  private updateDisabled(): void {\n    const hasText = this.emailTarget.value.trim().length > 0\n    this.submitTarget.disabled = !hasText\n    this.submitTarget.setAttribute('aria-disabled', (!hasText).toString())\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class FilmboxCharacteristicDetailsController extends Controller<HTMLElement> {\n  static targets = ['body', 'trigger']\n\n  declare readonly bodyTargets: HTMLElement[]\n  declare readonly triggerTargets: HTMLButtonElement[]\n\n  connect(): void {\n    this.collapse()\n  }\n\n  disconnect(): void {\n    this.collapse()\n  }\n\n  expand(): void {\n    this.bodyTargets.forEach((body) => {\n      body.hidden = false\n    })\n    this.triggerTargets.forEach((trigger) => {\n      trigger.setAttribute('aria-expanded', 'true')\n      trigger.hidden = true\n    })\n  }\n\n  private collapse(): void {\n    this.bodyTargets.forEach((body) => {\n      body.hidden = true\n    })\n    this.triggerTargets.forEach((trigger) => {\n      trigger.hidden = false\n      trigger.setAttribute('aria-expanded', 'false')\n    })\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class FilmboxFeatureGuideLinkController extends Controller<HTMLElement> {\n  static targets = ['link']\n\n  declare readonly linkTarget: HTMLAnchorElement\n\n  reveal(): void {\n    if (!this.linkTarget.matches(':focus-visible')) return\n\n    // Centering avoids the carousel snapping back to the previous card when\n    // native keyboard scrolling only brings the edge of this link into view.\n    this.linkTarget.scrollIntoView({ block: 'nearest', inline: 'center', behavior: 'instant' })\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nconst FRIDAY = 'Friday'\nconst DATE_CHECK_INTERVAL_MS = 60_000\nconst NORMAL_URL = 'https://www.youtube.com/watch?v=G6TyH-dQUV0'\nconst FRIDAY_URL = 'https://www.youtube.com/watch?v=9WaYCdQ8FOQ'\nconst californiaWeekday = new Intl.DateTimeFormat('en-US', {\n  timeZone: 'America/Los_Angeles',\n  weekday: 'long',\n})\n\nexport default class FooterCaliforniaLinkController extends Controller<HTMLAnchorElement> {\n  private dateCheckIntervalId: number | null = null\n\n  connect(): void {\n    this.sync()\n    this.dateCheckIntervalId = window.setInterval(\n      () => this.sync(),\n      DATE_CHECK_INTERVAL_MS\n    )\n  }\n\n  disconnect(): void {\n    if (this.dateCheckIntervalId === null) return\n\n    window.clearInterval(this.dateCheckIntervalId)\n    this.dateCheckIntervalId = null\n  }\n\n  sync(): void {\n    const url = this.isFridayInCalifornia() ? FRIDAY_URL : NORMAL_URL\n\n    if (this.element.getAttribute('href') !== url) {\n      this.element.setAttribute('href', url)\n    }\n  }\n\n  private isFridayInCalifornia(): boolean {\n    return californiaWeekday.format(new Date()) === FRIDAY\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\n// Auto-scrubs a video back and forth and exposes the normalized position as a\n// `--p` custom property (0..1) so the reused gizmo slider knob can track it.\n// Mirrors the filmbox gizmo motion: ease to each end over a fade, then hold,\n// staggered per card. Only runs while on screen to keep many cards cheap.\nconst STAGGER_STEP_MS = 200\nconst FADE_FRACTION = 0.48 // share of each phase spent moving (rest is a hold)\n\nfunction easeInOut(x: number): number {\n  return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2\n}\n\nexport default class GizmoScrubberController extends Controller<HTMLElement> {\n  static targets = ['video']\n  static values = { sweep: { type: Number, default: 1000 }, fade: { type: Number, default: FADE_FRACTION } }\n\n  declare readonly videoTarget: HTMLVideoElement\n  declare readonly sweepValue: number\n  declare readonly fadeValue: number\n\n  private rafId: number | null = null\n  private startTs = 0\n  private offsetMs = 0\n  private dur = 1\n  private ready = false\n  private lastP = -1\n  private io: IntersectionObserver | null = null\n  private boundLoop = (ts: number) => this.loop(ts)\n\n  connect(): void {\n    const v = this.videoTarget\n    v.muted = true\n    v.setAttribute('muted', '')\n    v.setAttribute('playsinline', '')\n    v.setAttribute('webkit-playsinline', '')\n    v.preload = 'auto'\n    v.removeAttribute('autoplay')\n    try { v.pause() } catch { }\n\n    const onMeta = () => {\n      this.dur = isFinite(v.duration) && v.duration > 0 ? v.duration : 1\n      this.ready = true\n    }\n    if (v.readyState >= 1) onMeta()\n    else v.addEventListener('loadedmetadata', onMeta, { once: true })\n    try { v.load() } catch { }\n\n    // Stagger each card within its carousel, like the filmbox gizmos.\n    const peers = this.element\n      .closest('.zine-carousel')\n      ?.querySelectorAll('[data-controller~=\"gizmo-scrubber\"]')\n    const index = peers ? Array.prototype.indexOf.call(peers, this.element) : 0\n    this.offsetMs = Math.max(0, index) * STAGGER_STEP_MS\n\n    // Fixed time origin so the phase stays stable across pause/resume.\n    this.startTs = performance.now()\n\n    this.io = new IntersectionObserver(\n      (entries) => {\n        for (const e of entries) {\n          if (e.isIntersecting) this.startLoop()\n          else this.stopLoop()\n        }\n      },\n      { threshold: 0.1 }\n    )\n    this.io.observe(this.element)\n  }\n\n  private startLoop(): void {\n    if (this.rafId !== null) return\n    this.rafId = requestAnimationFrame(this.boundLoop)\n  }\n\n  private stopLoop(): void {\n    if (this.rafId !== null) {\n      cancelAnimationFrame(this.rafId)\n      this.rafId = null\n    }\n  }\n\n  private loop(ts: number): void {\n    if (this.ready) {\n      const phase = this.sweepValue > 0 ? this.sweepValue : 1000 // ms per direction\n      const frac = this.fadeValue > 0 && this.fadeValue <= 1 ? this.fadeValue : FADE_FRACTION\n      const moveMs = phase * frac\n      const cycle = phase * 2\n      const e = ((ts - this.startTs + this.offsetMs) % cycle + cycle) % cycle\n\n      let p: number\n      if (e < phase) {\n        const lt = e\n        p = lt < moveMs ? easeInOut(lt / moveMs) : 1 // up: 0 -> 1, then hold\n      } else {\n        const lt = e - phase\n        p = lt < moveMs ? 1 - easeInOut(lt / moveMs) : 0 // down: 1 -> 0, then hold\n      }\n\n      // Both the knob and the video update every frame (native refresh rate),\n      // matching how the filmbox gizmos render via their CSS transition.\n      this.element.style.setProperty('--p', String(p))\n      if (Math.abs(p - this.lastP) > 0.0005) {\n        this.lastP = p\n        try { this.videoTarget.currentTime = p * this.dur } catch { }\n      }\n    }\n    this.rafId = requestAnimationFrame(this.boundLoop)\n  }\n\n  disconnect(): void {\n    this.stopLoop()\n    if (this.io) {\n      this.io.disconnect()\n      this.io = null\n    }\n  }\n}\n","import type Hls from 'hls.js'\n\nconst FORCE_HLS_WHEN_AVAILABLE = true\n\ntype HlsModule = typeof import('hls.js')\n\ntype VideoSource = Readonly<{\n  src: string\n  type: string\n}>\n\nexport type VideoPlaybackBufferedRange = Readonly<{\n  start: number\n  end: number\n}>\n\nexport interface VideoPlaybackLease {\n  readonly active: boolean\n  readonly buffered: readonly VideoPlaybackBufferedRange[]\n  readonly initialized: boolean\n\n  activate(): Promise<boolean>\n  deactivate(): void\n  release(): void\n}\n\ntype Transport = 'none' | 'existing' | 'mp4' | 'native-hls' | 'hls.js'\n\ntype SafariVideo = HTMLVideoElement & {\n  webkitPresentationMode?: string\n  webkitDisplayingFullscreen?: boolean\n}\n\nfunction fullscreenElement(): Element | null {\n  const safariDocument = document as Document & { webkitFullscreenElement?: Element }\n  return document.fullscreenElement || safariDocument.webkitFullscreenElement || null\n}\n\nfunction isVideoFullscreen(video: SafariVideo): boolean {\n  return video.webkitPresentationMode === 'fullscreen' ||\n    video.webkitDisplayingFullscreen === true ||\n    fullscreenElement()?.contains(video) === true\n}\n\nconst sessions = new WeakMap<HTMLVideoElement, VideoPlaybackSession>()\ntype PendingMediaCleanup = Readonly<{ cancel(): void }>\nconst pendingDetachedPauses = new WeakMap<HTMLVideoElement, PendingMediaCleanup>()\ntype RelinquishedPlaybackState = Readonly<{\n  source: string\n  currentTime: number\n}>\nconst relinquishedPlaybackStates = new WeakMap<\n  HTMLVideoElement,\n  RelinquishedPlaybackState\n>()\n\nlet hlsModulePromise: Promise<HlsModule | null> | null = null\n\nfunction loadHls(): Promise<HlsModule | null> {\n  if (!hlsModulePromise) {\n    const attempt = import('hls.js').catch(() => {\n      // A transient chunk/network failure must not poison every later video\n      // session in this Turbo document. A future session can retry the import.\n      if (hlsModulePromise === attempt) hlsModulePromise = null\n      return null\n    })\n    hlsModulePromise = attempt\n  }\n\n  return hlsModulePromise\n}\n\nfunction decodeSources(video: HTMLVideoElement): VideoSource[] {\n  const elementSources: VideoSource[] = []\n  video.querySelectorAll<HTMLSourceElement>('source[src]').forEach((source) => {\n    const src = source.getAttribute('src')?.trim() || ''\n    const type = source.getAttribute('type')?.trim() || ''\n    if (src && type) elementSources.push({ src, type })\n  })\n  const encoded = video.getAttribute('data-sources')?.replace(/\\s+/g, '') || ''\n  if (!encoded) return elementSources\n\n  try {\n    const decoded: unknown = JSON.parse(atob(encoded))\n    if (!Array.isArray(decoded)) return []\n\n    const sources: VideoSource[] = []\n    decoded.forEach((candidate: unknown) => {\n      if (!candidate || typeof candidate !== 'object') return\n\n      const source = candidate as Record<string, unknown>\n      const src = typeof source.src === 'string' ? source.src.trim() : ''\n      const type = typeof source.type === 'string' ? source.type.trim() : ''\n      if (src && type) sources.push({ src, type })\n    })\n    return sources.length > 0 ? sources : elementSources\n  } catch {\n    return elementSources\n  }\n}\n\nfunction selectPlayableSource(\n  video: HTMLVideoElement,\n  sources: readonly VideoSource[]\n): VideoSource | null {\n  return sources.find((source) => video.canPlayType(source.type) !== '') || null\n}\n\nfunction parseTimestampToSeconds(value: string | null): number {\n  if (!value) return Number.NaN\n\n  const timestamp = value.trim()\n  if (/^\\d+(?:\\.\\d+)?$/.test(timestamp)) return Number.parseFloat(timestamp)\n\n  const parts = timestamp.split(':').map(Number)\n  if (parts.length === 0 || parts.some((part) => !Number.isFinite(part))) {\n    return Number.NaN\n  }\n\n  return parts.reduce((total, part) => total * 60 + part, 0)\n}\n\nfunction randomStartTime(video: HTMLVideoElement): number | null {\n  if (!video.hasAttribute('data-random-start')) return null\n\n  const candidates = (video.getAttribute('data-random-start') || '')\n    .split(',')\n    .map((value) => parseTimestampToSeconds(value))\n    .filter((value) => Number.isFinite(value) && value >= 0)\n\n  if (candidates.length === 0) return null\n  return candidates[Math.floor(Math.random() * candidates.length)]\n}\n\nfunction sourceWithStartTime(src: string, time: number | null): string {\n  if (time === null || !Number.isFinite(time) || /\\.m3u8(?:\\?|#|$)/i.test(src)) return src\n  return `${src}#t=${time.toFixed(3)}`\n}\n\nfunction currentSource(video: HTMLVideoElement): string {\n  return (\n    video.currentSrc ||\n    video.getAttribute('src') ||\n    video.querySelector<HTMLSourceElement>('source[src]')?.getAttribute('src') ||\n    ''\n  )\n}\n\nfunction normalizedSourceUrl(source: string): string {\n  try {\n    const url = new URL(source, document.baseURI)\n    url.hash = ''\n    return url.href\n  } catch {\n    return source.split('#', 1)[0]\n  }\n}\n\nfunction sourceMatchesConfigured(\n  source: string,\n  configuredSources: readonly VideoSource[]\n): boolean {\n  if (!source || configuredSources.length === 0) return false\n  const normalized = normalizedSourceUrl(source)\n  return configuredSources.some(\n    (candidate) => normalizedSourceUrl(candidate.src) === normalized\n  )\n}\n\nfunction isStaleBlobSource(video: HTMLVideoElement): boolean {\n  return currentSource(video).startsWith('blob:')\n}\n\nfunction bufferedRanges(video: HTMLVideoElement): readonly VideoPlaybackBufferedRange[] {\n  const ranges: VideoPlaybackBufferedRange[] = []\n\n  try {\n    for (let index = 0; index < video.buffered.length; index += 1) {\n      ranges.push({ start: video.buffered.start(index), end: video.buffered.end(index) })\n    }\n  } catch {\n    // A source can change while buffered ranges are being read. An empty\n    // snapshot accurately describes the service state for that instant.\n  }\n\n  return ranges\n}\n\nclass VideoPlaybackSession {\n  private readonly owners = new Set<symbol>()\n  private readonly activeOwners = new Set<symbol>()\n  private readonly listenerAbort = new AbortController()\n  private readonly hlsCleanups: Array<() => void> = []\n  private pendingDisposal: PendingMediaCleanup | null = null\n  private initializePromise: Promise<void> | null = null\n  private hls: Hls | null = null\n  private transport: Transport = 'none'\n  private transportSuspended = false\n  private setupComplete = false\n  private playbackListenersAttached = false\n  private disposed = false\n  private relinquished = false\n  private retryTimer: number | null = null\n  private retryCount = 0\n  private fullscreenRecovery: AbortController | null = null\n  private readonly selectedStartTime: number | null\n\n  constructor(readonly video: HTMLVideoElement) {\n    // Reading configuration and choosing a timestamp are deliberately the\n    // only work performed here. In particular, acquiring a lease does not\n    // import hls.js, attach a source, call load(), or start playback.\n    this.selectedStartTime = randomStartTime(video)\n  }\n\n  acquire(owner: symbol): void {\n    if (this.disposed || this.relinquished) return\n\n    this.cancelDisposal()\n    this.owners.add(owner)\n  }\n\n  async activate(owner: symbol): Promise<boolean> {\n    if (!this.owns(owner)) return false\n\n    this.activeOwners.add(owner)\n    await this.ensureInitialized()\n\n    if (!this.owns(owner) || !this.activeOwners.has(owner)) return false\n    this.resumeTransport()\n    return this.play()\n  }\n\n  deactivate(owner: symbol): void {\n    if (!this.owns(owner)) return\n\n    this.activeOwners.delete(owner)\n    if (this.activeOwners.size === 0) this.suspendPlayback()\n  }\n\n  release(owner: symbol): void {\n    if (!this.owns(owner)) return\n\n    const wasActive = this.activeOwners.delete(owner)\n    this.owners.delete(owner)\n    if (this.activeOwners.size === 0) this.cancelFullscreenRecovery()\n\n    if (this.owners.size === 0) {\n      // Turbo reconnects controllers around permanent elements during a body\n      // replacement. Settle after Turbo has restored permanent nodes and\n      // deferred destination bindings have had time to adopt this exact\n      // session before its HLS MediaSource would otherwise be destroyed.\n      this.scheduleDisposal()\n    } else if (wasActive && this.activeOwners.size === 0) {\n      this.suspendPlayback()\n    }\n  }\n\n  relinquish(): void {\n    if (this.disposed || this.relinquished) return\n\n    this.cancelDisposal()\n    this.relinquished = true\n    this.owners.clear()\n    this.activeOwners.clear()\n    this.listenerAbort.abort()\n    this.cancelFullscreenRecovery()\n    this.clearRetryTimer()\n    this.removeHlsListeners()\n\n    // Looks adopts an already-attached MP4 element and manages subsequent\n    // source swaps natively. Do not pause, clear src, call load(), or destroy\n    // media state here: all would cause a visible reset during Turbo transfer.\n    sessions.delete(this.video)\n  }\n\n  get initialized(): boolean {\n    return this.setupComplete\n  }\n\n  isActive(owner: symbol): boolean {\n    return this.owns(owner) && this.activeOwners.has(owner)\n  }\n\n  get buffered(): readonly VideoPlaybackBufferedRange[] {\n    return bufferedRanges(this.video)\n  }\n\n  private owns(owner: symbol): boolean {\n    return !this.disposed && !this.relinquished && this.owners.has(owner)\n  }\n\n  private async ensureInitialized(): Promise<void> {\n    if (this.setupComplete || this.disposed || this.relinquished) return\n    if (this.initializePromise) {\n      await this.initializePromise\n      return\n    }\n\n    const initialization = this.initialize()\n    this.initializePromise = initialization\n    try {\n      await initialization\n    } finally {\n      if (this.initializePromise === initialization) this.initializePromise = null\n    }\n  }\n\n  private async initialize(): Promise<void> {\n    if (this.activeOwners.size === 0 || this.disposed || this.relinquished) return\n\n    this.configureInlinePlayback()\n\n    const configuredSources = decodeSources(this.video)\n    const existingSource = currentSource(this.video)\n    const relinquishedState = relinquishedPlaybackStates.get(this.video)\n    relinquishedPlaybackStates.delete(this.video)\n    let configuredResumeTime: number | null = null\n\n    if (isStaleBlobSource(this.video)) {\n      // A Turbo snapshot can retain a blob URL after the MediaSource that\n      // produced it has been destroyed. No live registry entry exists here,\n      // so the blob cannot be adopted and must be replaced from data-* input.\n      this.video.pause()\n      this.video.removeAttribute('src')\n      try {\n        this.video.load()\n      } catch {\n        // A later source attachment remains sufficient if load() is rejected.\n      }\n      this.video.classList.remove('loaded')\n    } else if (\n      existingSource &&\n      (configuredSources.length === 0 ||\n        sourceMatchesConfigured(existingSource, configuredSources))\n    ) {\n      // An MP4 (or native HLS URL) can already be loaded when a permanent\n      // element changes owners. Adopt it without resetting source or time,\n      // including when it happens to be paused.\n      this.transport = 'existing'\n      this.setupComplete = true\n      this.video.classList.add('loaded')\n      this.attachPlaybackListeners()\n      return\n    } else if (existingSource) {\n      // A native destination may intentionally reuse the permanent element\n      // for another clip (the Looks picker does this). When it returns to a\n      // configured player, restore that player's canonical source instead of\n      // adopting the destination's last selection as homepage media.\n      if (\n        relinquishedState &&\n        sourceMatchesConfigured(relinquishedState.source, configuredSources)\n      ) {\n        configuredResumeTime = relinquishedState.currentTime\n      }\n      this.video.pause()\n      this.video.removeAttribute('src')\n      try {\n        this.video.load()\n      } catch {\n        // The canonical source attachment below remains sufficient.\n      }\n      this.video.classList.remove('loaded')\n    }\n\n    const hlsUrl = this.video.getAttribute('data-hls')?.trim() || ''\n    this.video.classList.add('loaded')\n    this.attachPlaybackListeners()\n\n    if (hlsUrl) {\n      const module = await loadHls()\n      if (this.activeOwners.size === 0 || this.disposed || this.relinquished) return\n\n      const HlsClass = module?.default\n      if (HlsClass?.isSupported()) {\n        try {\n          this.initializeHls(HlsClass, hlsUrl)\n          this.transport = 'hls.js'\n          this.setupComplete = true\n          this.attachRandomStart()\n          return\n        } catch (error) {\n          console.error('[videos] HLS initialization failed', error)\n        }\n      }\n\n      if (this.video.canPlayType('application/vnd.apple.mpegurl') !== '') {\n        this.video.src = hlsUrl\n        this.transport = 'native-hls'\n        this.setupComplete = true\n        this.attachRandomStart()\n        return\n      }\n\n      if (FORCE_HLS_WHEN_AVAILABLE && module) {\n        this.setupComplete = true\n        return\n      }\n    }\n\n    const source = selectPlayableSource(this.video, configuredSources)\n    if (source) {\n      const startTime = configuredResumeTime ?? this.selectedStartTime\n      this.video.src = sourceWithStartTime(source.src, startTime)\n      this.transport = 'mp4'\n      if (configuredResumeTime === null) {\n        this.attachRandomStart()\n      } else {\n        this.attachPreservedStart(configuredResumeTime)\n      }\n    }\n\n    this.setupComplete = true\n  }\n\n  private configureInlinePlayback(): void {\n    this.video.setAttribute('playsinline', '')\n    this.video.setAttribute('webkit-playsinline', '')\n    if (this.video.hasAttribute('muted')) this.video.muted = true\n  }\n\n  private initializeHls(HlsClass: HlsModule['default'], hlsUrl: string): void {\n    const hls = new HlsClass({\n      // A positive initial position lets hls.js align to the first buffered\n      // frame. Starting at exactly zero can skip that alignment and make\n      // Safari recover a leading timestamp gap after playback has begun.\n      startPosition: 0.001,\n      capLevelToPlayerSize: true,\n      maxBufferLength: 10,\n      abrEwmaDefaultEstimate: 8_000_000,\n      abrEwmaDefaultEstimateMax: 20_000_000,\n    })\n\n    this.hls = hls\n    this.attachHlsErrorRecovery(hls, HlsClass)\n    this.attachHlsLoopQualityGuard(hls, HlsClass)\n    hls.loadSource(hlsUrl)\n    hls.attachMedia(this.video)\n  }\n\n  private attachPlaybackListeners(): void {\n    if (this.playbackListenersAttached) return\n    this.playbackListenersAttached = true\n\n    const { signal } = this.listenerAbort\n    const maxRetries = 2\n\n    this.video.addEventListener(\n      'playing',\n      () => {\n        this.retryCount = 0\n        this.clearRetryTimer()\n      },\n      { signal }\n    )\n\n    this.video.addEventListener(\n      'error',\n      () => {\n        const error = this.video.error\n        console.error('[videos] MediaElement error', {\n          code: error?.code,\n          message: error?.message,\n          readyState: this.video.readyState,\n          networkState: this.video.networkState,\n          currentTime: this.video.currentTime,\n          src: this.video.currentSrc || this.video.src,\n        })\n\n        if (\n          this.retryCount >= maxRetries ||\n          !this.video.isConnected ||\n          this.activeOwners.size === 0\n        ) {\n          return\n        }\n\n        const delay = 300 * 2 ** this.retryCount\n        this.retryCount += 1\n        this.clearRetryTimer()\n        this.retryTimer = window.setTimeout(() => void this.play(), delay)\n      },\n      { signal }\n    )\n\n    this.video.addEventListener(\n      'ended',\n      () => {\n        if (this.video.loop && this.activeOwners.size > 0) void this.play()\n      },\n      { signal }\n    )\n\n    this.attachFullscreenListeners()\n  }\n\n  private attachFullscreenListeners(): void {\n    const { video } = this\n    const { signal } = this.listenerAbort\n    let inFullscreen = isVideoFullscreen(video)\n    let resumeOnExit = inFullscreen && !video.paused\n    let pauseTimer: number | null = null\n\n    const clearPauseTimer = () => {\n      if (pauseTimer !== null) window.clearTimeout(pauseTimer)\n      pauseTimer = null\n    }\n    signal.addEventListener('abort', clearPauseTimer, { once: true })\n\n    const enter = () => {\n      if (inFullscreen) return\n      this.cancelFullscreenRecovery()\n      inFullscreen = true\n      resumeOnExit = !video.paused\n    }\n    const exit = () => {\n      if (!inFullscreen || isVideoFullscreen(video)) return\n      clearPauseTimer()\n      inFullscreen = false\n      if (resumeOnExit) this.recoverFullscreenPlayback()\n      resumeOnExit = false\n    }\n    const presentationChanged = () => {\n      if ((video as SafariVideo).webkitPresentationMode === 'picture-in-picture') {\n        clearPauseTimer()\n        inFullscreen = false\n        resumeOnExit = false\n        this.cancelFullscreenRecovery()\n      } else if (isVideoFullscreen(video)) {\n        enter()\n      } else {\n        exit()\n      }\n    }\n\n    video.addEventListener('webkitbeginfullscreen', enter, { signal })\n    video.addEventListener('webkitendfullscreen', exit, { signal })\n    video.addEventListener('webkitpresentationmodechanged', presentationChanged, { signal })\n    // iOS also has an element-fullscreen path, including a wrapper fallback.\n    // Each session checks whether the fullscreen element actually contains it.\n    document.addEventListener('fullscreenchange', presentationChanged, { signal })\n    document.addEventListener('webkitfullscreenchange', presentationChanged, { signal })\n    video.addEventListener('play', () => {\n      clearPauseTimer()\n      if (inFullscreen) resumeOnExit = true\n    }, { signal })\n    video.addEventListener('pause', () => {\n      // iOS can queue the native pause before the fullscreen state changes.\n      // Let those events settle before treating a pause that remains in\n      // fullscreen as a viewer pause. Exit cancels this pending decision.\n      clearPauseTimer()\n      if (!inFullscreen) return\n      pauseTimer = window.setTimeout(() => {\n        pauseTimer = null\n        if (inFullscreen && isVideoFullscreen(video) && video.paused) resumeOnExit = false\n      }, 150)\n    }, { signal })\n    video.addEventListener('pointerdown', () => this.cancelFullscreenRecovery(), { signal })\n    video.addEventListener('keydown', () => this.cancelFullscreenRecovery(), { signal })\n  }\n\n  private recoverFullscreenPlayback(): void {\n    this.cancelFullscreenRecovery()\n    const recovery = new AbortController()\n    this.fullscreenRecovery = recovery\n\n    // WebKit sends webkitendfullscreen *before* the native exit animation.\n    // A synchronous play() can succeed, then iOS pauses as it returns inline.\n    // Check again across that transition, without an ongoing autoplay loop.\n    const delays = [0, 100, 300, 1000]\n    const timers = delays.map((delay, index) => window.setTimeout(() => {\n      if (\n        !this.video.isConnected || this.activeOwners.size === 0\n      ) {\n        this.cancelFullscreenRecovery()\n        return\n      }\n      if (\n        document.visibilityState === 'visible' && !isVideoFullscreen(this.video) &&\n        this.video.paused\n      ) void this.play()\n      if (index === delays.length - 1) this.cancelFullscreenRecovery()\n    }, delay))\n    recovery.signal.addEventListener('abort', () => {\n      timers.forEach((timer) => window.clearTimeout(timer))\n    }, { once: true })\n  }\n\n  private cancelFullscreenRecovery(): void {\n    this.fullscreenRecovery?.abort()\n    this.fullscreenRecovery = null\n  }\n\n  private attachRandomStart(): void {\n    if (!this.video.hasAttribute('data-random-start')) return\n\n    const seekAndPlay = () => {\n      const duration = this.video.duration\n      if (!Number.isFinite(duration) || duration <= 0) return\n\n      const listedTimes = (this.video.getAttribute('data-random-start') || '')\n        .split(',')\n        .map((value) => parseTimestampToSeconds(value))\n        .filter((value) => Number.isFinite(value) && value >= 0 && value < duration)\n\n      const listedTime =\n        this.selectedStartTime !== null && this.selectedStartTime < duration\n          ? this.selectedStartTime\n          : listedTimes[Math.floor(Math.random() * listedTimes.length)]\n      const target = Number.isFinite(listedTime)\n        ? listedTime\n        : Math.random() * Math.max(0, duration - 2)\n\n      try {\n        this.video.pause()\n        this.video.currentTime = target\n        if (this.activeOwners.size > 0) void this.play()\n      } catch {\n        // The browser can reject a seek until a later ready-state transition.\n      }\n    }\n\n    if (this.video.readyState >= HTMLMediaElement.HAVE_METADATA) {\n      seekAndPlay()\n    } else {\n      this.video.addEventListener('loadedmetadata', seekAndPlay, {\n        once: true,\n        signal: this.listenerAbort.signal,\n      })\n    }\n  }\n\n  private attachPreservedStart(time: number): void {\n    if (!Number.isFinite(time) || time < 0) return\n\n    const seekAndPlay = () => {\n      const duration = this.video.duration\n      const target =\n        Number.isFinite(duration) && duration > 0\n          ? Math.min(time, Math.max(0, duration - 0.01))\n          : time\n      try {\n        this.video.currentTime = target\n        if (this.activeOwners.size > 0) void this.play()\n      } catch {\n        // The #t source fragment remains a fallback if an early seek fails.\n      }\n    }\n\n    if (this.video.readyState >= HTMLMediaElement.HAVE_METADATA) {\n      seekAndPlay()\n    } else {\n      this.video.addEventListener('loadedmetadata', seekAndPlay, {\n        once: true,\n        signal: this.listenerAbort.signal,\n      })\n    }\n  }\n\n  private attachHlsErrorRecovery(hls: Hls, HlsClass: HlsModule['default']): void {\n    const onError = (_event: unknown, data: any) => {\n      console.error('[videos] hls.js error', {\n        type: data?.type,\n        details: data?.details,\n        fatal: data?.fatal,\n        reason: data?.reason,\n        response: data?.response\n          ? { code: data.response.code, text: data.response.text, url: data.response.url }\n          : null,\n      })\n\n      if (!data?.fatal || this.activeOwners.size === 0) return\n\n      try {\n        if (data.type === HlsClass.ErrorTypes.NETWORK_ERROR) {\n          hls.startLoad()\n        } else if (data.type === HlsClass.ErrorTypes.MEDIA_ERROR) {\n          hls.recoverMediaError()\n        }\n      } catch {\n        // A later activation or media event may recover the stream.\n      }\n    }\n\n    hls.on(HlsClass.Events.ERROR, onError)\n    this.hlsCleanups.push(() => hls.off(HlsClass.Events.ERROR, onError))\n  }\n\n  private attachHlsLoopQualityGuard(hls: Hls, HlsClass: HlsModule['default']): void {\n    let lastBandwidth = Number.NaN\n    let lastLevel = -1\n    let lastTime = 0\n\n    const onLevelSwitched = () => {\n      if (Number.isFinite(hls.bandwidthEstimate)) lastBandwidth = hls.bandwidthEstimate\n      if (Number.isFinite(hls.loadLevel)) lastLevel = hls.loadLevel\n    }\n    const onTimeUpdate = () => {\n      lastTime = this.video.currentTime || 0\n    }\n    const onSeeking = () => {\n      const time = this.video.currentTime || 0\n      const duration = this.video.duration || 0\n      if (duration > 1 && lastTime > duration - 0.35 && time <= 0.05) {\n        if (Number.isFinite(lastBandwidth)) hls.bandwidthEstimate = lastBandwidth\n        if (lastLevel >= 0) hls.loadLevel = lastLevel\n      }\n    }\n\n    hls.on(HlsClass.Events.LEVEL_SWITCHED, onLevelSwitched)\n    this.hlsCleanups.push(() => hls.off(HlsClass.Events.LEVEL_SWITCHED, onLevelSwitched))\n    this.video.addEventListener('timeupdate', onTimeUpdate, { signal: this.listenerAbort.signal })\n    this.video.addEventListener('seeking', onSeeking, { signal: this.listenerAbort.signal })\n  }\n\n  private resumeTransport(): void {\n    if (this.transport !== 'hls.js' || !this.hls || !this.transportSuspended) return\n\n    try {\n      const resumeTime = this.video.currentTime\n      this.hls.startLoad(Number.isFinite(resumeTime) ? resumeTime : -1)\n      this.transportSuspended = false\n    } catch {\n      // A not-yet-attached HLS instance can retry on a later activation.\n    }\n  }\n\n  private suspendPlayback(): void {\n    this.cancelFullscreenRecovery()\n    this.video.pause()\n\n    if (this.transport !== 'hls.js' || !this.hls) return\n    try {\n      this.hls.stopLoad()\n      this.transportSuspended = true\n    } catch {\n      // A not-yet-attached HLS instance has nothing to suspend.\n    }\n  }\n\n  private async play(): Promise<boolean> {\n    if (this.activeOwners.size === 0 || this.disposed || this.relinquished) return false\n\n    try {\n      await this.video.play()\n      return !this.video.paused\n    } catch {\n      // Muted autoplay can still be declined. A later visibility event or\n      // explicit activation retries without replacing the active transport.\n      return false\n    }\n  }\n\n  private scheduleDisposal(): void {\n    this.cancelDisposal()\n    let settled = false\n    let fallbackTimer: number | null = null\n    let adoptionTimer: number | null = null\n    let settlementTimer: number | null = null\n\n    const removePendingWork = (): void => {\n      document.removeEventListener('turbo:render', afterRender)\n      if (fallbackTimer !== null) window.clearTimeout(fallbackTimer)\n      if (adoptionTimer !== null) window.clearTimeout(adoptionTimer)\n      if (settlementTimer !== null) window.clearTimeout(settlementTimer)\n      fallbackTimer = null\n      adoptionTimer = null\n      settlementTimer = null\n    }\n\n    const settle = (): void => {\n      if (settled) return\n      settled = true\n      removePendingWork()\n      if (this.pendingDisposal !== pending) return\n\n      this.pendingDisposal = null\n      if (this.owners.size > 0) return\n\n      if (this.video.isConnected) {\n        // Preserve source and currentTime for a genuinely delayed adopter, but\n        // stop playback and HLS loading when no destination ever takes over.\n        this.suspendPlayback()\n      } else {\n        this.dispose()\n      }\n    }\n\n    const afterRender = (): void => {\n      if (adoptionTimer !== null || settlementTimer !== null) return\n\n      // Stimulus observes the rendered DOM asynchronously and each permanent-\n      // video consumer deliberately binds one task later. Two task boundaries\n      // keep owner cleanup behind both steps, avoiding a visible pause between\n      // the outgoing release and destination acquisition.\n      adoptionTimer = window.setTimeout(() => {\n        adoptionTimer = null\n        settlementTimer = window.setTimeout(settle, 0)\n      }, 0)\n    }\n\n    const pending: PendingMediaCleanup = {\n      cancel: () => {\n        if (settled) return\n        settled = true\n        removePendingWork()\n        if (this.pendingDisposal === pending) this.pendingDisposal = null\n      },\n    }\n\n    this.pendingDisposal = pending\n    document.addEventListener('turbo:render', afterRender, { once: true })\n    // Covers release callbacks delivered after turbo:render and genuine\n    // non-Turbo removals without relying on a fragile one-task timing guess.\n    fallbackTimer = window.setTimeout(settle, 1000)\n  }\n\n  private cancelDisposal(): void {\n    this.pendingDisposal?.cancel()\n    this.pendingDisposal = null\n  }\n\n  private dispose(): void {\n    if (this.disposed || this.relinquished || this.owners.size > 0) return\n\n    this.disposed = true\n    this.suspendPlayback()\n    this.listenerAbort.abort()\n    this.clearRetryTimer()\n    this.removeHlsListeners()\n\n    if (this.hls) {\n      try {\n        this.hls.destroy()\n      } catch {\n        // The media element is already ownerless; destruction is best-effort.\n      }\n      this.hls = null\n    }\n\n    sessions.delete(this.video)\n  }\n\n  private removeHlsListeners(): void {\n    this.hlsCleanups.splice(0).forEach((cleanup) => {\n      try {\n        cleanup()\n      } catch {\n        // A destroyed HLS instance can already have removed its listeners.\n      }\n    })\n  }\n\n  private clearRetryTimer(): void {\n    if (this.retryTimer === null) return\n    window.clearTimeout(this.retryTimer)\n    this.retryTimer = null\n  }\n}\n\nclass PlaybackLease implements VideoPlaybackLease {\n  private released = false\n\n  constructor(\n    private readonly session: VideoPlaybackSession,\n    private readonly owner: symbol\n  ) {}\n\n  get active(): boolean {\n    return !this.released && this.session.isActive(this.owner)\n  }\n\n  get buffered(): readonly VideoPlaybackBufferedRange[] {\n    return this.released ? [] : this.session.buffered\n  }\n\n  get initialized(): boolean {\n    return !this.released && this.session.initialized\n  }\n\n  activate(): Promise<boolean> {\n    if (this.released) return Promise.resolve(false)\n    return this.session.activate(this.owner)\n  }\n\n  deactivate(): void {\n    if (!this.released) this.session.deactivate(this.owner)\n  }\n\n  release(): void {\n    if (this.released) return\n    this.released = true\n    this.session.release(this.owner)\n  }\n}\n\nexport function acquireVideoPlayback(video: HTMLVideoElement): VideoPlaybackLease {\n  cancelPendingDetachedPause(video)\n\n  let session = sessions.get(video)\n  if (!session) {\n    session = new VideoPlaybackSession(video)\n    sessions.set(video, session)\n  }\n\n  const owner = Symbol('video-playback-owner')\n  session.acquire(owner)\n  return new PlaybackLease(session, owner)\n}\n\nexport function relinquishVideoPlayback(video: HTMLVideoElement): void {\n  cancelPendingDetachedPause(video)\n  const source = currentSource(video)\n  const currentTime = video.currentTime\n  if (source && Number.isFinite(currentTime)) {\n    relinquishedPlaybackStates.set(video, { source, currentTime })\n  }\n  sessions.get(video)?.relinquish()\n}\n\nexport function scheduleVideoPauseWhenDetached(video: HTMLVideoElement): void {\n  cancelPendingDetachedPause(video)\n\n  let settled = false\n  let fallbackTimer: number | null = null\n  let postRenderTimer: number | null = null\n\n  function removePendingWork(): void {\n    document.removeEventListener('turbo:render', afterRender)\n    if (fallbackTimer !== null) window.clearTimeout(fallbackTimer)\n    if (postRenderTimer !== null) window.clearTimeout(postRenderTimer)\n    fallbackTimer = null\n    postRenderTimer = null\n  }\n\n  function settle(): void {\n    if (settled) return\n    settled = true\n    removePendingWork()\n    if (pendingDetachedPauses.get(video) !== pending) return\n\n    pendingDetachedPauses.delete(video)\n    if (!video.isConnected) video.pause()\n  }\n\n  function afterRender(): void {\n    if (postRenderTimer !== null) return\n\n    // Turbo dispatches this only after Bardo has restored permanent nodes.\n    // One task also lets destination Stimulus observers adopt the live node.\n    postRenderTimer = window.setTimeout(settle, 0)\n  }\n\n  const pending: PendingMediaCleanup = {\n    cancel() {\n      if (settled) return\n      settled = true\n      removePendingWork()\n      if (pendingDetachedPauses.get(video) === pending) {\n        pendingDetachedPauses.delete(video)\n      }\n    },\n  }\n\n  pendingDetachedPauses.set(video, pending)\n  document.addEventListener('turbo:render', afterRender, { once: true })\n  // Covers Stimulus disconnects delivered after turbo:render and genuine\n  // non-Turbo removals without relying on a one- or two-task timing guess.\n  fallbackTimer = window.setTimeout(settle, 1000)\n}\n\nfunction cancelPendingDetachedPause(video: HTMLVideoElement): void {\n  pendingDetachedPauses.get(video)?.cancel()\n}\n","type NativeControlsMode = 'always' | 'hover' | 'none'\n\nfunction setBooleanAttribute(\n  element: HTMLElement,\n  name: string,\n  enabled: boolean\n): void {\n  if (enabled) element.setAttribute(name, '')\n  else element.removeAttribute(name)\n}\n\nfunction setOptionalAttribute(\n  element: HTMLElement,\n  name: string,\n  value: string | undefined\n): void {\n  if (value === undefined) element.removeAttribute(name)\n  else element.setAttribute(name, value)\n}\n\nfunction addToken(element: HTMLElement, name: string, token: string): void {\n  const tokens = new Set(\n    (element.getAttribute(name) || '').split(/\\s+/).filter(Boolean)\n  )\n  tokens.add(token)\n  element.setAttribute(name, Array.from(tokens).join(' '))\n}\n\nfunction removeToken(element: HTMLElement, name: string, token: string): void {\n  const tokens = (element.getAttribute(name) || '')\n    .split(/\\s+/)\n    .filter((candidate) => candidate && candidate !== token)\n  if (tokens.length > 0) element.setAttribute(name, tokens.join(' '))\n  else element.removeAttribute(name)\n}\n\nfunction applySharedMediaAttributes(video: HTMLVideoElement): void {\n  video.defaultMuted = true\n  video.muted = true\n  video.loop = true\n  video.playsInline = true\n  video.setAttribute('muted', '')\n  video.setAttribute('loop', '')\n  video.setAttribute('playsinline', '')\n  video.setAttribute('webkit-playsinline', '')\n}\n\nfunction applyCanonicalMediaConfig(\n  video: HTMLVideoElement,\n  owner: HTMLElement\n): void {\n  const poster = owner.dataset.videoPoster\n  if (poster) {\n    video.setAttribute('poster', poster)\n    // A permanent video can arrive with another destination's poster. Keep\n    // its loading background in sync without touching the media source.\n    video.style.setProperty('--video-poster', `url(${JSON.stringify(poster)})`)\n  }\n\n  setOptionalAttribute(video, 'data-sources', owner.dataset.videoSources)\n  setOptionalAttribute(video, 'data-hls', owner.dataset.videoHls)\n}\n\nfunction removeHomepageOwnership(video: HTMLVideoElement): void {\n  removeToken(video, 'data-homepage-hero-target', 'video')\n  if (video.getAttribute('data-slot') === 'video') video.removeAttribute('data-slot')\n}\n\nfunction setFallbackAlt(video: HTMLVideoElement, alt: string | undefined): void {\n  if (alt === undefined) return\n\n  const fallback = Array.from(video.children).find(\n    (child): child is HTMLImageElement => child instanceof HTMLImageElement\n  )\n  fallback?.setAttribute('alt', alt)\n}\n\nexport function applyHomepageHeroVideoContract(\n  video: HTMLVideoElement,\n  owner: HTMLElement\n): void {\n  applySharedMediaAttributes(video)\n  applyCanonicalMediaConfig(video, owner)\n\n  video.autoplay = false\n  video.controls = false\n  video.preload = 'none'\n  video.tabIndex = -1\n  video.setAttribute('aria-hidden', 'true')\n  video.removeAttribute('autoplay')\n  video.removeAttribute('controls')\n  video.setAttribute('preload', 'none')\n  video.setAttribute('tabindex', '-1')\n\n  addToken(video, 'data-homepage-hero-target', 'video')\n  video.setAttribute('data-slot', 'video')\n  setOptionalAttribute(video, 'data-native-controls', undefined)\n  setOptionalAttribute(video, 'data-captions', undefined)\n  setOptionalAttribute(video, 'data-random-start', undefined)\n  setFallbackAlt(video, '')\n}\n\nexport function applyFullBleedPlayerVideoContract(\n  video: HTMLVideoElement,\n  owner: HTMLElement\n): void {\n  applySharedMediaAttributes(video)\n  applyCanonicalMediaConfig(video, owner)\n  removeHomepageOwnership(video)\n\n  const configuredMode = owner.dataset.videoNativeControls\n  const nativeControls: NativeControlsMode =\n    configuredMode === 'always' || configuredMode === 'hover'\n      ? configuredMode\n      : 'none'\n\n  video.autoplay = true\n  video.controls = nativeControls === 'always'\n  video.setAttribute('autoplay', '')\n  video.removeAttribute('aria-hidden')\n  video.removeAttribute('preload')\n  setBooleanAttribute(video, 'controls', nativeControls === 'always')\n\n  if (nativeControls === 'hover') {\n    video.tabIndex = 0\n    video.setAttribute('tabindex', '0')\n    video.setAttribute('data-native-controls', 'hover')\n  } else {\n    video.removeAttribute('tabindex')\n    video.removeAttribute('data-native-controls')\n  }\n\n  setOptionalAttribute(video, 'data-captions', owner.dataset.videoCaptions)\n  setOptionalAttribute(\n    video,\n    'data-random-start',\n    owner.dataset.videoRandomStartEnabled === 'true'\n      ? owner.dataset.videoRandomStart || ''\n      : undefined\n  )\n  setFallbackAlt(video, owner.dataset.videoFallbackAlt || '')\n}\n\nexport function applyLooksPickerVideoContract(\n  video: HTMLVideoElement,\n  owner: HTMLElement\n): void {\n  applySharedMediaAttributes(video)\n  removeHomepageOwnership(video)\n  video.style.removeProperty('--video-poster')\n\n  const poster = owner.dataset.videoPoster\n  if (poster) video.setAttribute('poster', poster)\n\n  video.autoplay = false\n  video.controls = false\n  video.loop = false\n  video.preload = 'none'\n  video.removeAttribute('aria-hidden')\n  video.removeAttribute('autoplay')\n  video.removeAttribute('controls')\n  video.removeAttribute('loop')\n  video.removeAttribute('tabindex')\n  video.setAttribute('preload', 'none')\n  setOptionalAttribute(video, 'data-sources', undefined)\n  setOptionalAttribute(video, 'data-hls', undefined)\n  setOptionalAttribute(video, 'data-native-controls', undefined)\n  setOptionalAttribute(video, 'data-captions', undefined)\n  setOptionalAttribute(video, 'data-random-start', undefined)\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { acquireVideoPlayback } from '../video_playback_session'\nimport { applyHomepageHeroVideoContract } from '../video_destination_contract'\n\ntype PlaybackLease = ReturnType<typeof acquireVideoPlayback>\ntype AdvanceMode = 'manual' | 'interval' | 'video_loop'\ntype NavigationReason = 'automatic' | 'keyboard' | 'manual' | 'scroll'\n\ninterface SwipeGesture {\n  pointerId: number\n  startX: number\n  startY: number\n  lastX: number\n  lastY: number\n  movedHorizontally: boolean\n}\n\nconst SCROLL_SETTLE_MS = 140\nconst PROGRAMMATIC_SCROLL_TIMEOUT_MS = 1200\n\nexport default class HomepageHeroController extends Controller<HTMLElement> {\n  static targets = [\n    'viewport',\n    'slide',\n    'link',\n    'video',\n    'dot',\n    'toggle',\n    'status',\n    'previous',\n    'next',\n  ]\n\n  static values = {\n    index: { type: Number, default: 0 },\n    rotating: { type: Boolean, default: true },\n  }\n\n  declare readonly viewportTarget: HTMLElement\n  declare readonly slideTargets: HTMLElement[]\n  declare readonly linkTargets: HTMLAnchorElement[]\n  declare readonly videoTargets: HTMLVideoElement[]\n  declare readonly dotTargets: HTMLButtonElement[]\n  declare readonly toggleTarget: HTMLButtonElement\n  declare readonly statusTarget: HTMLElement\n  declare readonly previousTarget: HTMLButtonElement\n  declare readonly nextTarget: HTMLButtonElement\n  declare readonly hasToggleTarget: boolean\n  declare readonly hasStatusTarget: boolean\n  declare readonly hasPreviousTarget: boolean\n  declare readonly hasNextTarget: boolean\n\n  declare indexValue: number\n  declare rotatingValue: boolean\n\n  private connected = false\n  private lifecycleAbort: AbortController | null = null\n  private viewportObserver: IntersectionObserver | null = null\n  private resizeObserver: ResizeObserver | null = null\n  private videoObserver: MutationObserver | null = null\n  private videoReconcileTimer: number | null = null\n  private reducedMotionQuery: MediaQueryList | null = null\n  private slideVideos: Array<HTMLVideoElement | null> = []\n  private listeningVideos = new Set<HTMLVideoElement>()\n  private originalLinkTabIndexes = new Map<HTMLAnchorElement, string | null>()\n\n  private leases = new Map<HTMLVideoElement, PlaybackLease>()\n  private activeLeaseVideo: HTMLVideoElement | null = null\n  private activationPendingVideo: HTMLVideoElement | null = null\n  private activationAttempt: symbol | null = null\n  private playbackRetryTimer: number | null = null\n  private playbackRetryAttempts = 0\n  private playbackSequence = 0\n  private lastVideoTimes = new WeakMap<HTMLVideoElement, number>()\n  private pendingVideoLoop = false\n\n  private isInViewport = false\n  private pageIsVisible = true\n  private pointerSuspended = false\n  private focusSuspended = false\n  private reducedMotion = false\n\n  private intervalTimer: number | null = null\n  private intervalDeadline = 0\n  private intervalRemainingMs: number | null = null\n\n  private scrollFrame: number | null = null\n  private scrollSettleTimer: number | null = null\n  private resizeFrame: number | null = null\n  private programmaticScroll = false\n  private programmaticTargetIndex: number | null = null\n  private programmaticScrollDeadline = 0\n  private swipeGesture: SwipeGesture | null = null\n\n  private readonly handleVisibilityChange = (): void => {\n    this.pageIsVisible = document.visibilityState === 'visible'\n    this.refreshLifecycleState()\n  }\n\n  private readonly handleReducedMotionChange = (event: MediaQueryListEvent): void => {\n    this.reducedMotion = event.matches\n    this.element.dataset.reducedMotion = String(this.reducedMotion)\n\n    if (this.reducedMotion) {\n      this.rotatingValue = false\n      this.clearAdvanceState()\n    }\n\n    this.refreshLifecycleState()\n  }\n\n  connect(): void {\n    this.connected = true\n    this.lifecycleAbort = new AbortController()\n    this.pageIsVisible = document.visibilityState === 'visible'\n    this.pointerSuspended = false\n    this.focusSuspended = this.element.contains(document.activeElement)\n    this.programmaticScroll = false\n    this.pendingVideoLoop = false\n\n    this.reducedMotionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n    this.reducedMotion = this.reducedMotionQuery.matches\n    this.reducedMotionQuery.addEventListener('change', this.handleReducedMotionChange)\n\n    const slideCount = this.slideTargets.length\n    this.indexValue = this.clampedIndex(this.indexValue)\n    // A cached Turbo snapshot can reconnect with its semantic active index\n    // restored before the scrollport's old scrollLeft is restored. Treat the\n    // initial alignment as programmatic so an early scroll event cannot snap\n    // state back to slide zero and pause the transferred active video.\n    // Fresh visits begin at zero, so leaving native scroll observation active\n    // there avoids swallowing a touch/trackpad gesture during the first frame.\n    // The guard is only needed when Turbo restores a non-zero semantic index\n    // before it restores that snapshot's scrollLeft.\n    this.programmaticScroll = this.indexValue > 0\n    this.programmaticTargetIndex = this.programmaticScroll ? this.indexValue : null\n    this.programmaticScrollDeadline = this.programmaticScroll\n      ? performance.now() + PROGRAMMATIC_SCROLL_TIMEOUT_MS\n      : 0\n    if (slideCount < 2 || this.reducedMotion) this.rotatingValue = false\n\n    this.element.dataset.multiple = String(slideCount > 1)\n    this.element.dataset.reducedMotion = String(this.reducedMotion)\n\n    this.captureLinkTabIndexes()\n    this.mapSlideVideos()\n    this.acquireSlideVideos()\n    this.installVideoListeners()\n    this.installVideoReconciliation()\n    this.installVisibilityObservers()\n    this.applyActiveState(false)\n    this.resetAdvanceState()\n\n    // Controls are intentionally inert and visually hidden until Stimulus has\n    // made link focusability, active state, and media playback coherent.\n    this.element.dataset.ready = 'true'\n    this.refreshLifecycleState()\n\n    this.resizeFrame = window.requestAnimationFrame(() => {\n      this.resizeFrame = null\n      if (!this.connected) return\n      this.scrollToIndex(this.indexValue, 'auto')\n      this.scheduleScrollSettle()\n    })\n  }\n\n  disconnect(): void {\n    this.connected = false\n    delete this.element.dataset.ready\n\n    this.clearAdvanceState()\n    this.cancelScrollWork()\n\n    this.viewportObserver?.disconnect()\n    this.viewportObserver = null\n    this.resizeObserver?.disconnect()\n    this.resizeObserver = null\n    this.videoObserver?.disconnect()\n    this.videoObserver = null\n    if (this.videoReconcileTimer !== null) window.clearTimeout(this.videoReconcileTimer)\n    this.videoReconcileTimer = null\n\n    this.reducedMotionQuery?.removeEventListener('change', this.handleReducedMotionChange)\n    this.reducedMotionQuery = null\n    this.lifecycleAbort?.abort()\n    this.lifecycleAbort = null\n\n    // Do not deactivate the current lease here. Turbo moves permanent video\n    // elements between documents during the same task; release's one-task\n    // grace period lets the destination adopt the live session and position.\n    this.playbackSequence += 1\n    this.clearPlaybackRetry()\n    this.activationPendingVideo = null\n    this.activationAttempt = null\n    this.leases.forEach((lease) => lease.release())\n    this.leases.clear()\n    this.activeLeaseVideo = null\n\n    this.restoreLinkTabIndexes()\n    this.listeningVideos.clear()\n    this.slideVideos = []\n    this.swipeGesture = null\n  }\n\n  previous(event?: Event): void {\n    event?.preventDefault()\n    const trigger = event?.currentTarget\n    const moveFocusToNext =\n      trigger instanceof HTMLElement && document.activeElement === trigger && this.indexValue === 1\n    this.stopRotationFromInteraction()\n    if (this.indexValue > 0) this.goTo(this.indexValue - 1, 'manual')\n\n    // Moving from slide two to the first slide intentionally hides Previous.\n    // Keep keyboard focus visible and operable instead of leaving it on the\n    // newly hidden button.\n    if (moveFocusToNext && this.indexValue === 0) {\n      this.navigationButton('next')?.focus({ preventScroll: true })\n    }\n  }\n\n  next(event?: Event): void {\n    event?.preventDefault()\n    this.stopRotationFromInteraction()\n    const nextIndex = this.indexValue === this.slideTargets.length - 1 ? 0 : this.indexValue + 1\n    this.goTo(nextIndex, 'manual')\n  }\n\n  select(event: Event): void {\n    event.preventDefault()\n    const trigger = event.currentTarget\n    if (!(trigger instanceof HTMLElement)) return\n\n    const index = Number.parseInt(trigger.dataset.slideIndex || '', 10)\n    if (!Number.isFinite(index)) return\n\n    this.stopRotationFromInteraction()\n    this.goTo(index, 'manual')\n  }\n\n  toggleRotation(event?: Event): void {\n    event?.preventDefault()\n    if (this.slideTargets.length < 2 || this.reducedMotion) return\n\n    this.rotatingValue = !this.rotatingValue\n    this.clearAdvanceState()\n    if (this.rotatingValue) this.resetAdvanceState()\n\n    if (this.hasStatusTarget) {\n      this.statusTarget.textContent = this.rotatingValue\n        ? 'Automatic slide rotation started.'\n        : 'Automatic slide rotation paused.'\n    }\n\n    this.refreshLifecycleState()\n  }\n\n  suspendForPointer(event: PointerEvent): void {\n    if (event.pointerType !== 'mouse' && event.pointerType !== 'pen') return\n    this.pointerSuspended = true\n    this.refreshLifecycleState()\n  }\n\n  resumeFromPointer(event: PointerEvent): void {\n    if (event.pointerType !== 'mouse' && event.pointerType !== 'pen') return\n    this.pointerSuspended = false\n    this.refreshLifecycleState()\n  }\n\n  suspendForFocus(): void {\n    this.focusSuspended = true\n    this.refreshLifecycleState()\n  }\n\n  resumeFromFocus(event: FocusEvent): void {\n    const nextTarget = event.relatedTarget\n    if (nextTarget instanceof Node && this.element.contains(nextTarget)) return\n\n    this.focusSuspended = false\n    this.refreshLifecycleState()\n  }\n\n  navigateFromKeyboard(event: KeyboardEvent): void {\n    if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey) return\n    if (this.isTextEditingTarget(event.target)) return\n\n    let nextIndex: number | null = null\n    if (event.key === 'ArrowLeft') nextIndex = this.indexValue - 1\n    if (event.key === 'ArrowRight') nextIndex = this.indexValue + 1\n    if (event.key === 'Home') nextIndex = 0\n    if (event.key === 'End') nextIndex = this.slideTargets.length - 1\n    if (nextIndex === null) return\n\n    event.preventDefault()\n    this.stopRotationFromInteraction()\n    this.goTo(nextIndex, 'keyboard')\n  }\n\n  syncFromScroll(): void {\n    this.scheduleScrollSettle()\n    if (this.programmaticScroll || this.scrollFrame !== null) return\n\n    this.scrollFrame = window.requestAnimationFrame(() => {\n      this.scrollFrame = null\n      if (!this.connected || this.programmaticScroll) return\n      this.syncNearestSlide('scroll')\n    })\n  }\n\n  startSwipe(event: PointerEvent): void {\n    if (!event.isPrimary || (event.pointerType !== 'touch' && event.pointerType !== 'pen')) return\n\n    this.programmaticScroll = false\n    this.programmaticTargetIndex = null\n    this.programmaticScrollDeadline = 0\n    this.swipeGesture = {\n      pointerId: event.pointerId,\n      startX: event.clientX,\n      startY: event.clientY,\n      lastX: event.clientX,\n      lastY: event.clientY,\n      movedHorizontally: false,\n    }\n  }\n\n  trackSwipe(event: PointerEvent): void {\n    const gesture = this.swipeGesture\n    if (!gesture || event.pointerId !== gesture.pointerId) return\n\n    gesture.lastX = event.clientX\n    gesture.lastY = event.clientY\n    const deltaX = gesture.lastX - gesture.startX\n    const deltaY = gesture.lastY - gesture.startY\n\n    if (Math.abs(deltaX) > 12 && Math.abs(deltaX) > Math.abs(deltaY) * 1.15) {\n      if (!gesture.movedHorizontally) this.stopRotationFromInteraction()\n      gesture.movedHorizontally = true\n    }\n  }\n\n  finishSwipe(event: PointerEvent): void {\n    const gesture = this.swipeGesture\n    if (!gesture || event.pointerId !== gesture.pointerId) return\n\n    // Browsers cancel pointer streams once native horizontal panning takes\n    // over. Keep the last real pointermove coordinates in that case: some\n    // engines report zeroed coordinates on pointercancel.\n    if (event.type !== 'pointercancel' && Number.isFinite(event.clientX)) {\n      gesture.lastX = event.clientX\n    }\n    if (event.type !== 'pointercancel' && Number.isFinite(event.clientY)) {\n      gesture.lastY = event.clientY\n    }\n    this.swipeGesture = null\n    if (this.slideTargets.length < 2) return\n\n    const deltaX = gesture.lastX - gesture.startX\n    const deltaY = gesture.lastY - gesture.startY\n    const isIntentionalHorizontalSwipe =\n      Math.abs(deltaX) >= 48 &&\n      Math.abs(deltaX) > Math.abs(deltaY) * 1.15\n    if (!isIntentionalHorizontalSwipe) return\n\n    this.stopRotationFromInteraction()\n    const lastIndex = this.slideTargets.length - 1\n    if (this.indexValue === lastIndex && deltaX < 0) {\n      this.goTo(0, 'manual')\n    } else if (this.indexValue === 0 && deltaX > 0) {\n      this.goTo(lastIndex, 'manual')\n    }\n  }\n\n  stopFromWheel(event: WheelEvent): void {\n    const horizontal = Math.abs(event.deltaX)\n    const vertical = Math.abs(event.deltaY)\n    if (horizontal < 1 || horizontal < vertical * 0.8) return\n\n    this.programmaticScroll = false\n    this.programmaticTargetIndex = null\n    this.programmaticScrollDeadline = 0\n    this.stopRotationFromInteraction()\n  }\n\n  private installVisibilityObservers(): void {\n    const signal = this.lifecycleAbort?.signal\n    if (signal) document.addEventListener('visibilitychange', this.handleVisibilityChange, { signal })\n\n    if ('IntersectionObserver' in window) {\n      this.isInViewport = this.elementIntersectsViewport()\n      this.viewportObserver = new IntersectionObserver(\n        (entries) => {\n          const entry = entries.find((candidate) => candidate.target === this.element)\n          if (!entry) return\n          this.isInViewport = entry.isIntersecting && entry.intersectionRatio > 0\n          this.refreshLifecycleState()\n        },\n        { root: null, threshold: [0, 0.05, 0.5] }\n      )\n      this.viewportObserver.observe(this.element)\n    } else {\n      this.isInViewport = true\n    }\n\n    if ('ResizeObserver' in window) {\n      this.resizeObserver = new ResizeObserver(() => {\n        if (this.resizeFrame !== null) window.cancelAnimationFrame(this.resizeFrame)\n        this.resizeFrame = window.requestAnimationFrame(() => {\n          this.resizeFrame = null\n          if (!this.connected || this.swipeGesture) return\n          this.scrollToIndex(this.indexValue, 'auto')\n        })\n      })\n      this.resizeObserver.observe(this.viewportTarget)\n    }\n  }\n\n  private elementIntersectsViewport(): boolean {\n    const rect = this.element.getBoundingClientRect()\n    return (\n      rect.width > 0 &&\n      rect.height > 0 &&\n      rect.bottom > 0 &&\n      rect.right > 0 &&\n      rect.top < window.innerHeight &&\n      rect.left < window.innerWidth\n    )\n  }\n\n  private mapSlideVideos(): void {\n    this.slideVideos = this.currentSlideVideos()\n  }\n\n  private currentSlideVideos(): Array<HTMLVideoElement | null> {\n    // Turbo permanent elements keep the attributes from the outgoing page.\n    // A video returning from a product page may therefore lack this\n    // controller's target token, so the semantic descendant is the fallback.\n    return this.slideTargets.map((slide) => {\n      const declaredTarget = this.videoTargets.find((video) => slide.contains(video))\n      const video = declaredTarget || slide.querySelector<HTMLVideoElement>('video')\n      const owner = slide.querySelector<HTMLElement>(\n        '[data-video-destination=\"homepage-hero\"]'\n      )\n      if (video && owner?.contains(video)) {\n        applyHomepageHeroVideoContract(video, owner)\n      }\n      return video\n    })\n  }\n\n  private installVideoReconciliation(): void {\n    this.videoObserver = new MutationObserver(() => this.scheduleVideoReconciliation())\n    this.videoObserver.observe(this.viewportTarget, { childList: true, subtree: true })\n    this.scheduleVideoReconciliation()\n  }\n\n  private scheduleVideoReconciliation(): void {\n    if (this.videoReconcileTimer !== null) return\n\n    // The cached carousel can connect against its snapshot placeholders\n    // before Turbo swaps matching permanent videos back in from the product\n    // page. Re-read descendants after that task and transfer leases to the\n    // final live nodes without changing the restored active index.\n    this.videoReconcileTimer = window.setTimeout(() => {\n      this.videoReconcileTimer = null\n      this.reconcileSlideVideos()\n    }, 0)\n  }\n\n  private reconcileSlideVideos(): void {\n    if (!this.connected) return\n\n    const nextVideos = this.currentSlideVideos()\n    const unchanged = nextVideos.every((video, index) => video === this.slideVideos[index])\n    if (unchanged) return\n\n    const retainedVideos = new Set(\n      nextVideos.filter((video): video is HTMLVideoElement => video !== null)\n    )\n    this.leases.forEach((lease, video) => {\n      if (retainedVideos.has(video)) return\n\n      if (this.activeLeaseVideo === video) {\n        this.playbackSequence += 1\n        this.activeLeaseVideo = null\n        this.activationPendingVideo = null\n        this.activationAttempt = null\n        this.playbackRetryAttempts = 0\n        this.clearPlaybackRetry()\n      }\n      lease.release()\n      this.leases.delete(video)\n    })\n\n    this.slideVideos = nextVideos\n    this.acquireSlideVideos()\n    this.installVideoListeners()\n    const video = this.activeVideo\n    if (video) this.lastVideoTimes.set(video, video.currentTime)\n    // IntersectionObserver can briefly report the outgoing/detached snapshot\n    // while Turbo is restoring a permanent descendant. Current geometry is\n    // authoritative here and prevents a stale `false` from pausing the live\n    // video between reconciliation and the observer's next callback.\n    this.isInViewport = this.elementIntersectsViewport()\n    this.refreshLifecycleState()\n  }\n\n  private installVideoListeners(): void {\n    const signal = this.lifecycleAbort?.signal\n    if (!signal) return\n\n    const uniqueVideos = new Set(this.slideVideos.filter((video): video is HTMLVideoElement => !!video))\n    uniqueVideos.forEach((video) => {\n      if (this.listeningVideos.has(video)) return\n      this.listeningVideos.add(video)\n\n      video.addEventListener('canplay', () => this.refreshLifecycleState(), { signal })\n      video.addEventListener('loadeddata', () => this.refreshLifecycleState(), { signal })\n      video.addEventListener(\n        'playing',\n        () => {\n          if (video !== this.activeVideo) return\n          this.playbackRetryAttempts = 0\n          this.clearPlaybackRetry()\n        },\n        { signal }\n      )\n      video.addEventListener('timeupdate', (event) => this.handleVideoTimeUpdate(event), { signal })\n      video.addEventListener('ended', (event) => this.handleVideoEnded(event), { signal })\n    })\n  }\n\n  private handleVideoTimeUpdate(event: Event): void {\n    const video = event.currentTarget\n    if (!(video instanceof HTMLVideoElement)) return\n\n    const currentTime = video.currentTime\n    const previousTime = this.lastVideoTimes.get(video)\n    this.lastVideoTimes.set(video, currentTime)\n\n    if (\n      video !== this.activeVideo ||\n      previousTime === undefined ||\n      !Number.isFinite(previousTime) ||\n      !Number.isFinite(currentTime)\n    ) return\n\n    const duration = video.duration\n    const durationIsFinite = Number.isFinite(duration) && duration > 0\n    const crossedMostOfVideo = durationIsFinite\n      ? previousTime >= duration * 0.7 && currentTime <= duration * 0.3\n      : previousTime - currentTime >= 2\n    const unmistakableBackwardJump = durationIsFinite\n      ? previousTime - currentTime >= duration * 0.45\n      : previousTime > currentTime + 2\n\n    if (crossedMostOfVideo && unmistakableBackwardJump) this.handleVideoLoop(video)\n  }\n\n  private handleVideoEnded(event: Event): void {\n    const video = event.currentTarget\n    if (video instanceof HTMLVideoElement) this.handleVideoLoop(video)\n  }\n\n  private handleVideoLoop(video: HTMLVideoElement): void {\n    if (\n      video !== this.activeVideo ||\n      this.activeAdvanceMode !== 'video_loop' ||\n      !this.rotatingValue ||\n      this.reducedMotion\n    ) return\n\n    if (this.rotationIsTemporarilySuspended) {\n      this.pendingVideoLoop = true\n      return\n    }\n\n    this.advanceAutomatically()\n  }\n\n  private refreshLifecycleState(forcePlayback = false): void {\n    if (!this.connected) return\n\n    this.updateRotationUi()\n\n    if (this.mediaShouldPlay) {\n      this.activateCurrentVideo(forcePlayback)\n    } else {\n      this.deactivateCurrentVideo()\n    }\n\n    if (!this.rotationCanAdvance) {\n      if (this.rotatingValue && !this.reducedMotion) {\n        this.pauseIntervalTimer()\n      } else {\n        this.clearIntervalTimer()\n        this.intervalRemainingMs = null\n        this.pendingVideoLoop = false\n      }\n      return\n    }\n\n    if (this.pendingVideoLoop && this.activeAdvanceMode === 'video_loop') {\n      this.pendingVideoLoop = false\n      this.advanceAutomatically()\n      return\n    }\n\n    if (this.activeAdvanceMode === 'interval') {\n      this.resumeIntervalTimer()\n    } else {\n      this.clearIntervalTimer()\n      this.intervalRemainingMs = null\n    }\n  }\n\n  private get mediaShouldPlay(): boolean {\n    return this.connected && this.isInViewport && this.pageIsVisible && !this.reducedMotion\n  }\n\n  private get rotationIsTemporarilySuspended(): boolean {\n    return !this.isInViewport || !this.pageIsVisible || this.pointerSuspended || this.focusSuspended\n  }\n\n  private get rotationCanAdvance(): boolean {\n    return (\n      this.connected &&\n      this.slideTargets.length > 1 &&\n      this.rotatingValue &&\n      !this.reducedMotion &&\n      !this.rotationIsTemporarilySuspended\n    )\n  }\n\n  private get activeSlide(): HTMLElement | null {\n    return this.slideTargets[this.indexValue] || null\n  }\n\n  private get activeVideo(): HTMLVideoElement | null {\n    return this.slideVideos[this.indexValue] || null\n  }\n\n  private get activeAdvanceMode(): AdvanceMode {\n    const mode = this.activeSlide?.dataset.advanceMode\n    if (mode === 'interval' || mode === 'video_loop') return mode\n    return 'manual'\n  }\n\n  private get activeIntervalMs(): number | null {\n    if (this.activeAdvanceMode !== 'interval') return null\n    const seconds = Number(this.activeSlide?.dataset.advanceSeconds)\n    return Number.isFinite(seconds) && seconds > 0 ? seconds * 1000 : null\n  }\n\n  private activateCurrentVideo(force = false): void {\n    const video = this.activeVideo\n    if (!video) {\n      this.deactivateCurrentVideo()\n      return\n    }\n    if (this.activeLeaseVideo === video) {\n      const lease = this.leases.get(video)\n      if (lease) this.activateLease(video, lease, force)\n      return\n    }\n\n    this.deactivateCurrentVideo()\n    const lease = this.leases.get(video) || acquireVideoPlayback(video)\n    this.leases.set(video, lease)\n    this.activeLeaseVideo = video\n    this.lastVideoTimes.set(video, video.currentTime)\n\n    this.activateLease(video, lease)\n  }\n\n  private activateLease(\n    video: HTMLVideoElement,\n    lease: PlaybackLease,\n    force = false\n  ): void {\n    if (!force && this.activationPendingVideo === video) return\n\n    const sequence = ++this.playbackSequence\n    const attempt = Symbol('homepage-hero-playback-attempt')\n    this.activationPendingVideo = video\n    this.activationAttempt = attempt\n    void lease.activate().then((playing) => {\n      if (this.activationAttempt === attempt) {\n        this.activationPendingVideo = null\n        this.activationAttempt = null\n      }\n      if (!this.connected || sequence !== this.playbackSequence || this.activeLeaseVideo !== video) {\n        return\n      }\n\n      if (playing) {\n        this.playbackRetryAttempts = 0\n        this.clearPlaybackRetry()\n      } else {\n        this.schedulePlaybackRetry()\n      }\n    })\n  }\n\n  private deactivateCurrentVideo(): void {\n    const video = this.activeLeaseVideo\n    if (!video) return\n\n    this.playbackSequence += 1\n    this.leases.get(video)?.deactivate()\n    this.activeLeaseVideo = null\n    this.activationPendingVideo = null\n    this.activationAttempt = null\n    this.playbackRetryAttempts = 0\n    this.clearPlaybackRetry()\n  }\n\n  private schedulePlaybackRetry(): void {\n    if (this.playbackRetryTimer !== null || this.playbackRetryAttempts >= 2) return\n    if (!this.mediaShouldPlay || !this.activeLeaseVideo) return\n\n    this.playbackRetryAttempts += 1\n    this.playbackRetryTimer = window.setTimeout(() => {\n      this.playbackRetryTimer = null\n      if (this.mediaShouldPlay) this.activateCurrentVideo()\n    }, 100)\n  }\n\n  private clearPlaybackRetry(): void {\n    if (this.playbackRetryTimer !== null) window.clearTimeout(this.playbackRetryTimer)\n    this.playbackRetryTimer = null\n  }\n\n  private stopRotationFromInteraction(): void {\n    if (!this.rotatingValue) return\n    this.rotatingValue = false\n    this.clearAdvanceState()\n    this.refreshLifecycleState()\n  }\n\n  private resetAdvanceState(): void {\n    this.clearIntervalTimer()\n    this.pendingVideoLoop = false\n    this.intervalRemainingMs = this.activeIntervalMs\n    const video = this.activeVideo\n    if (video) this.lastVideoTimes.set(video, video.currentTime)\n  }\n\n  private clearAdvanceState(): void {\n    this.clearIntervalTimer()\n    this.intervalRemainingMs = null\n    this.pendingVideoLoop = false\n  }\n\n  private resumeIntervalTimer(): void {\n    if (this.intervalTimer !== null) return\n    const fullInterval = this.activeIntervalMs\n    if (fullInterval === null) return\n\n    const delay = Math.max(0, this.intervalRemainingMs ?? fullInterval)\n    this.intervalRemainingMs = delay\n    this.intervalDeadline = performance.now() + delay\n    this.intervalTimer = window.setTimeout(() => {\n      this.intervalTimer = null\n      this.intervalRemainingMs = null\n      if (this.rotationCanAdvance && this.activeAdvanceMode === 'interval') {\n        this.advanceAutomatically()\n      } else {\n        this.intervalRemainingMs = 0\n      }\n    }, delay)\n  }\n\n  private pauseIntervalTimer(): void {\n    if (this.intervalTimer === null) return\n    this.intervalRemainingMs = Math.max(0, this.intervalDeadline - performance.now())\n    this.clearIntervalTimer()\n  }\n\n  private clearIntervalTimer(): void {\n    if (this.intervalTimer !== null) window.clearTimeout(this.intervalTimer)\n    this.intervalTimer = null\n    this.intervalDeadline = 0\n  }\n\n  private advanceAutomatically(): void {\n    if (!this.rotationCanAdvance) return\n    this.goTo(this.indexValue + 1, 'automatic')\n  }\n\n  private goTo(rawIndex: number, reason: NavigationReason): void {\n    const index = reason === 'automatic' ? this.wrappedIndex(rawIndex) : this.clampedIndex(rawIndex)\n    if (index === this.indexValue) return\n\n    this.programmaticScroll = true\n    this.programmaticTargetIndex = index\n    this.programmaticScrollDeadline = performance.now() + PROGRAMMATIC_SCROLL_TIMEOUT_MS\n    this.setActiveIndex(index, reason !== 'automatic')\n    this.scrollToIndex(index, this.reducedMotion ? 'auto' : 'smooth')\n    this.scheduleScrollSettle()\n\n    if (reason !== 'automatic' && reason !== 'scroll') this.focusActiveLinkIfAppropriate(reason)\n  }\n\n  private setActiveIndex(index: number, announce: boolean): void {\n    const clamped = this.clampedIndex(index)\n    if (clamped === this.indexValue) return\n\n    this.deactivateCurrentVideo()\n    this.indexValue = clamped\n    this.applyActiveState(announce)\n    this.resetAdvanceState()\n    this.refreshLifecycleState()\n  }\n\n  private applyActiveState(announce: boolean): void {\n    this.element.dataset.activeIndex = String(this.indexValue)\n\n    this.slideTargets.forEach((slide, index) => {\n      slide.dataset.active = String(index === this.indexValue)\n    })\n\n    this.linkTargets.forEach((link, index) => {\n      const isActive = index === this.indexValue\n      link.tabIndex = isActive ? 0 : -1\n      if (isActive) link.setAttribute('aria-current', 'true')\n      else link.removeAttribute('aria-current')\n    })\n\n    this.dotTargets.forEach((dot, index) => {\n      const isActive = index === this.indexValue\n      dot.dataset.active = String(isActive)\n      if (isActive) dot.setAttribute('aria-current', 'true')\n      else dot.removeAttribute('aria-current')\n    })\n\n    this.updateNavigationUi()\n\n    if (announce && this.hasStatusTarget) {\n      const title = this.activeSlide?.dataset.title?.trim()\n      const position = `Slide ${this.indexValue + 1} of ${this.slideTargets.length}`\n      this.statusTarget.textContent = title ? `${position}: ${title}` : position\n    }\n  }\n\n  private updateRotationUi(): void {\n    const hasMultipleSlides = this.slideTargets.length > 1\n    let state: 'disabled' | 'paused' | 'running' | 'suspended'\n    if (!hasMultipleSlides || this.reducedMotion) state = 'disabled'\n    else if (!this.rotatingValue) state = 'paused'\n    else if (this.rotationIsTemporarilySuspended) state = 'suspended'\n    else state = 'running'\n    this.element.dataset.rotation = state\n\n    if (!this.hasToggleTarget) return\n    this.toggleTarget.disabled = !hasMultipleSlides || this.reducedMotion\n    this.toggleTarget.dataset.state = state\n    this.toggleTarget.setAttribute('aria-pressed', String(this.rotatingValue && !this.reducedMotion))\n    this.toggleTarget.setAttribute('aria-label', 'Automatic slide rotation')\n  }\n\n  private updateNavigationUi(): void {\n    if (this.slideTargets.length < 2) return\n\n    const atStart = this.indexValue === 0\n    const previous = this.navigationButton('previous')\n    if (previous) {\n      previous.disabled = atStart\n      previous.hidden = atStart\n      previous.setAttribute('aria-disabled', String(atStart))\n    }\n\n    const next = this.navigationButton('next')\n    if (next) {\n      next.disabled = false\n      next.hidden = false\n      next.setAttribute('aria-disabled', 'false')\n    }\n  }\n\n  private navigationButton(slot: 'previous' | 'next'): HTMLButtonElement | null {\n    if (slot === 'previous' && this.hasPreviousTarget) return this.previousTarget\n    if (slot === 'next' && this.hasNextTarget) return this.nextTarget\n\n    return this.element.querySelector<HTMLButtonElement>(`[data-slot=\"${slot}\"]`)\n  }\n\n  private acquireSlideVideos(): void {\n    this.slideVideos.forEach((video, index) => {\n      if (!video) return\n\n      // Acquire every permanent element synchronously so the service's\n      // zero-owner cleanup cannot dispose a live HLS session while we wait for\n      // visibility. Acquiring is network-silent. Only inactive slides are\n      // paused so a restored active permanent element can continue playing\n      // until its new lease is activated below.\n      let lease = this.leases.get(video)\n      if (!lease) {\n        lease = acquireVideoPlayback(video)\n        this.leases.set(video, lease)\n      }\n\n      if (index === this.indexValue) {\n        this.activeLeaseVideo = video\n      } else {\n        lease.deactivate()\n      }\n    })\n  }\n\n  private syncNearestSlide(reason: NavigationReason): void {\n    const index = this.nearestSlideIndex()\n    if (index !== this.indexValue) this.setActiveIndex(index, reason === 'scroll')\n  }\n\n  private nearestSlideIndex(): number {\n    const viewportRect = this.viewportTarget.getBoundingClientRect()\n    let nearestIndex = 0\n    let nearestDistance = Number.POSITIVE_INFINITY\n\n    this.slideTargets.forEach((slide, index) => {\n      const distance = Math.abs(slide.getBoundingClientRect().left - viewportRect.left)\n      if (distance < nearestDistance) {\n        nearestDistance = distance\n        nearestIndex = index\n      }\n    })\n\n    return nearestIndex\n  }\n\n  private scrollToIndex(index: number, behavior: ScrollBehavior): void {\n    const slide = this.slideTargets[index]\n    if (!slide) return\n\n    const viewportRect = this.viewportTarget.getBoundingClientRect()\n    const slideRect = slide.getBoundingClientRect()\n    const maxScroll = Math.max(0, this.viewportTarget.scrollWidth - this.viewportTarget.clientWidth)\n    const left = Math.max(\n      0,\n      Math.min(maxScroll, this.viewportTarget.scrollLeft + slideRect.left - viewportRect.left)\n    )\n    this.viewportTarget.scrollTo({ left, behavior })\n  }\n\n  private scheduleScrollSettle(): void {\n    if (this.scrollSettleTimer !== null) window.clearTimeout(this.scrollSettleTimer)\n    this.scrollSettleTimer = window.setTimeout(() => {\n      this.scrollSettleTimer = null\n      if (!this.connected) return\n\n      const targetIndex = this.programmaticTargetIndex\n      if (this.programmaticScroll && targetIndex !== null) {\n        const target = this.slideTargets[targetIndex]\n        const distance = target\n          ? Math.abs(\n              target.getBoundingClientRect().left -\n                this.viewportTarget.getBoundingClientRect().left\n            )\n          : 0\n\n        if (distance > 2 && performance.now() < this.programmaticScrollDeadline) {\n          this.scrollToIndex(targetIndex, this.reducedMotion ? 'auto' : 'smooth')\n          this.scheduleScrollSettle()\n          return\n        }\n\n        if (distance > 2) this.scrollToIndex(targetIndex, 'auto')\n        this.programmaticScroll = false\n        this.programmaticTargetIndex = null\n        this.programmaticScrollDeadline = 0\n        // Muted autoplay can still be rejected while a smooth-scrolling slide\n        // is offscreen. Retry once the destination is physically aligned,\n        // superseding any play promise that remained pending during the move.\n        this.refreshLifecycleState(true)\n        return\n      }\n\n      this.programmaticScroll = false\n      this.syncNearestSlide('scroll')\n    }, SCROLL_SETTLE_MS)\n  }\n\n  private cancelScrollWork(): void {\n    if (this.scrollFrame !== null) window.cancelAnimationFrame(this.scrollFrame)\n    if (this.resizeFrame !== null) window.cancelAnimationFrame(this.resizeFrame)\n    if (this.scrollSettleTimer !== null) window.clearTimeout(this.scrollSettleTimer)\n    this.scrollFrame = null\n    this.resizeFrame = null\n    this.scrollSettleTimer = null\n    this.programmaticScroll = false\n    this.programmaticTargetIndex = null\n    this.programmaticScrollDeadline = 0\n  }\n\n  private captureLinkTabIndexes(): void {\n    this.originalLinkTabIndexes.clear()\n    this.linkTargets.forEach((link) => {\n      this.originalLinkTabIndexes.set(link, link.getAttribute('tabindex'))\n    })\n  }\n\n  private restoreLinkTabIndexes(): void {\n    this.originalLinkTabIndexes.forEach((tabIndex, link) => {\n      if (tabIndex === null) link.removeAttribute('tabindex')\n      else link.setAttribute('tabindex', tabIndex)\n    })\n    this.originalLinkTabIndexes.clear()\n  }\n\n  private focusActiveLinkIfAppropriate(reason: NavigationReason): void {\n    if (reason !== 'keyboard') return\n    const activeLink = this.linkTargets[this.indexValue]\n    if (activeLink && this.element.contains(document.activeElement)) activeLink.focus()\n  }\n\n  private clampedIndex(index: number): number {\n    const lastIndex = Math.max(0, this.slideTargets.length - 1)\n    if (!Number.isFinite(index)) return 0\n    return Math.min(lastIndex, Math.max(0, Math.trunc(index)))\n  }\n\n  private wrappedIndex(index: number): number {\n    const count = this.slideTargets.length\n    if (count === 0) return 0\n    return ((Math.trunc(index) % count) + count) % count\n  }\n\n  private isTextEditingTarget(target: EventTarget | null): boolean {\n    if (!(target instanceof HTMLElement)) return false\n    return (\n      target.isContentEditable ||\n      target instanceof HTMLInputElement ||\n      target instanceof HTMLTextAreaElement ||\n      target instanceof HTMLSelectElement\n    )\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller<HTMLDetailsElement> {\n  static targets = ['summary']\n\n  declare readonly summaryTarget: HTMLElement\n\n  preventCollapse(event: MouseEvent): void {\n    if (this.element.open) {\n      event.preventDefault()\n    }\n  }\n\n  lockOpen(): void {\n    if (this.element.open) {\n      this.summaryTarget.setAttribute('aria-disabled', 'true')\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller<HTMLElement> {\n  static targets = ['input', 'branch', 'empty', 'query', 'toggle', 'panel']\n\n  declare readonly inputTarget: HTMLInputElement\n  declare readonly branchTargets: HTMLElement[]\n  declare readonly hasEmptyTarget: boolean\n  declare readonly emptyTarget: HTMLElement\n  declare readonly hasQueryTarget: boolean\n  declare readonly queryTarget: HTMLElement\n  declare readonly toggleTarget: HTMLButtonElement\n  declare readonly panelTarget: HTMLElement\n\n  toggleSearch(): void {\n    if (this.panelTarget.hidden) {\n      this.openSearch()\n    } else {\n      this.closeSearch()\n    }\n  }\n\n  openSearch(): void {\n    this.panelTarget.hidden = false\n    this.toggleTarget.setAttribute('aria-expanded', 'true')\n    requestAnimationFrame(() => this.inputTarget.focus())\n  }\n\n  closeSearch(): void {\n    this.panelTarget.hidden = true\n    this.toggleTarget.setAttribute('aria-expanded', 'false')\n    this.inputTarget.value = ''\n    this.filter()\n    this.toggleTarget.focus()\n  }\n\n  filter(): void {\n    const query = this.inputTarget.value.trim().toLowerCase()\n    let visibleCount = 0\n\n    this.branchTargets.forEach((branch) => {\n      const matches = query === '' || (branch.dataset.searchText || '').includes(query)\n      branch.hidden = !matches\n      branch.classList.toggle('is-search-match', query !== '' && matches)\n      if (matches) visibleCount += 1\n    })\n\n    if (this.hasEmptyTarget) {\n      this.emptyTarget.hidden = visibleCount > 0 || query === ''\n    }\n    if (this.hasQueryTarget) {\n      this.queryTarget.textContent = query\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\ntype DisclosureState = Record<string, boolean>\n\nexport default class extends Controller<HTMLElement> {\n  static targets = ['disclosure']\n  static values = { storageKey: String }\n\n  declare readonly disclosureTargets: HTMLDetailsElement[]\n  declare readonly storageKeyValue: string\n\n  connect(): void {\n    const state = this.loadState()\n\n    this.disclosureTargets.forEach((disclosure) => {\n      const key = disclosure.dataset.learnTreeKey\n      if (key && typeof state[key] === 'boolean') disclosure.open = state[key]\n    })\n  }\n\n  remember(event: Event): void {\n    const disclosure = event.currentTarget as HTMLDetailsElement\n    const key = disclosure.dataset.learnTreeKey\n    if (!key) return\n\n    this.saveState({ ...this.loadState(), [key]: disclosure.open })\n  }\n\n  private loadState(): DisclosureState {\n    try {\n      const value = window.localStorage.getItem(this.storageKeyValue)\n      if (!value) return {}\n\n      const state: unknown = JSON.parse(value)\n      return state && typeof state === 'object' && !Array.isArray(state)\n        ? (state as DisclosureState)\n        : {}\n    } catch {\n      return {}\n    }\n  }\n\n  private saveState(state: DisclosureState): void {\n    try {\n      window.localStorage.setItem(this.storageKeyValue, JSON.stringify(state))\n    } catch {\n      // Navigation still works when storage is unavailable or full.\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nconst RESUME_DELAY_MS = 4000\nconst REDUCED_MOTION_QUERY = '(prefers-reduced-motion: reduce)'\nconst LOAD_ROOT_MARGIN = '600px 0px'\nconst VISIBLE_THRESHOLD = 0.25\n\ntype ComparisonView = 'lensnode' | 'original'\n\ntype ImageRecord = {\n  alt: string\n  fallback: string\n  key: string\n  srcset: string\n}\n\ntype FrameParts = {\n  frame: HTMLElement\n  image: HTMLImageElement\n  source: HTMLSourceElement\n}\n\nexport default class HeroCarouselController extends Controller<HTMLElement> {\n  static targets = [\n    'frame',\n    'image',\n    'source',\n    'pip',\n    'pagination',\n    'lensNode',\n    'original',\n  ]\n\n  static values = {\n    autoAdvanceMs: Number,\n    original: Object,\n    profiles: Array,\n  }\n\n  declare readonly frameTargets: HTMLElement[]\n  declare readonly imageTargets: HTMLImageElement[]\n  declare readonly sourceTargets: HTMLSourceElement[]\n  declare readonly pipTargets: HTMLButtonElement[]\n  declare readonly paginationTarget: HTMLElement\n  declare readonly lensNodeTarget: HTMLButtonElement\n  declare readonly originalTarget: HTMLButtonElement\n  declare readonly hasPaginationTarget: boolean\n  declare readonly hasLensNodeTarget: boolean\n  declare readonly hasOriginalTarget: boolean\n  declare readonly autoAdvanceMsValue: number\n  declare readonly originalValue: ImageRecord\n  declare readonly profilesValue: ImageRecord[]\n\n  private currentIndex = 0\n  private requestedIndex = 0\n  private view: ComparisonView = 'lensnode'\n  private autoTimeoutId: number | null = null\n  private resumeTimeoutId: number | null = null\n  private motionQuery: MediaQueryList | null = null\n  private loadObserver: IntersectionObserver | null = null\n  private visibilityObserver: IntersectionObserver | null = null\n  private pendingFrameListenerCleanups = new Map<\n    HTMLElement,\n    Set<() => void>\n  >()\n  private requestSequence = 0\n  private isConnected = false\n  private isPrimed = false\n  private isVisible = false\n\n  private boundOnKeydown = (event: KeyboardEvent) =>\n    this.onKeydown(event)\n  private boundOnMotionChange = (event: MediaQueryListEvent) =>\n    this.onMotionChange(event)\n  private boundOnVisibilityChange = () => this.onVisibilityChange()\n\n  connect(): void {\n    if (this.profilesValue.length === 0 || this.frameTargets.length === 0) return\n\n    this.isConnected = true\n    const storedIndex = Number.parseInt(\n      this.element.dataset.currentIndex || '',\n      10,\n    )\n    this.currentIndex = this.isProfileIndex(storedIndex) ? storedIndex : 0\n    this.requestedIndex = this.currentIndex\n    this.view =\n      this.element.dataset.view === 'original' ? 'original' : 'lensnode'\n\n    this.element.addEventListener('keydown', this.boundOnKeydown)\n    document.addEventListener(\n      'visibilitychange',\n      this.boundOnVisibilityChange,\n    )\n    this.motionQuery = window.matchMedia(REDUCED_MOTION_QUERY)\n    this.motionQuery.addEventListener('change', this.boundOnMotionChange)\n\n    this.clearPending()\n    this.renderControls()\n    this.observeViewport()\n  }\n\n  disconnect(): void {\n    this.isConnected = false\n    this.isPrimed = false\n    this.isVisible = false\n    this.requestSequence += 1\n    this.clearAutoAdvance()\n    this.clearResumeTimer()\n    this.clearPendingFrameListeners()\n    this.loadObserver?.disconnect()\n    this.visibilityObserver?.disconnect()\n    this.loadObserver = null\n    this.visibilityObserver = null\n    this.element.removeEventListener('keydown', this.boundOnKeydown)\n    document.removeEventListener(\n      'visibilitychange',\n      this.boundOnVisibilityChange,\n    )\n    this.motionQuery?.removeEventListener('change', this.boundOnMotionChange)\n    this.motionQuery = null\n  }\n\n  next(): void {\n    this.userAdvance(1)\n  }\n\n  prev(): void {\n    this.userAdvance(-1)\n  }\n\n  select(event: Event): void {\n    const pip = event.currentTarget as HTMLButtonElement\n    const index = Number.parseInt(pip.dataset.index || '', 10)\n    if (!this.isProfileIndex(index)) return\n\n    this.pauseForUser()\n    this.activateProfile(index)\n  }\n\n  navigatePips(event: KeyboardEvent): void {\n    const currentPip = event.currentTarget as HTMLButtonElement\n    const currentPosition = this.pipTargets.indexOf(currentPip)\n    if (currentPosition < 0) return\n\n    let nextPosition: number | null = null\n    if (event.key === 'ArrowLeft') {\n      nextPosition =\n        (currentPosition - 1 + this.pipTargets.length) %\n        this.pipTargets.length\n    } else if (event.key === 'ArrowRight') {\n      nextPosition = (currentPosition + 1) % this.pipTargets.length\n    } else if (event.key === 'Home') {\n      nextPosition = 0\n    } else if (event.key === 'End') {\n      nextPosition = this.pipTargets.length - 1\n    }\n\n    if (nextPosition === null) return\n\n    event.preventDefault()\n    const nextPip = this.pipTargets[nextPosition]\n    const index = Number.parseInt(nextPip.dataset.index || '', 10)\n    if (!this.isProfileIndex(index)) return\n\n    this.pauseForUser()\n    this.activateProfile(index)\n    nextPip.focus()\n  }\n\n  showLensNode(): void {\n    this.pauseForUser()\n    this.activateProfile(this.currentIndex)\n  }\n\n  showOriginal(): void {\n    this.pauseForUser()\n    this.activateRecord(this.originalValue, 'original', this.currentIndex)\n  }\n\n  private observeViewport(): void {\n    if (!('IntersectionObserver' in window)) {\n      this.isVisible = true\n      this.prime()\n      return\n    }\n\n    this.loadObserver = new IntersectionObserver(\n      (entries) => {\n        if (!entries.some((entry) => entry.isIntersecting)) return\n\n        this.loadObserver?.disconnect()\n        this.loadObserver = null\n        this.prime()\n      },\n      {rootMargin: LOAD_ROOT_MARGIN},\n    )\n    this.loadObserver.observe(this.element)\n\n    this.visibilityObserver = new IntersectionObserver(\n      (entries) => {\n        const entry = entries[entries.length - 1]\n        this.isVisible = Boolean(\n          entry?.isIntersecting &&\n            entry.intersectionRatio >= VISIBLE_THRESHOLD,\n        )\n        if (this.isVisible) {\n          this.scheduleAutoAdvance()\n        } else {\n          this.clearAutoAdvance()\n        }\n      },\n      {threshold: [0, VISIBLE_THRESHOLD]},\n    )\n    this.visibilityObserver.observe(this.element)\n  }\n\n  private prime(): void {\n    if (this.isPrimed) return\n\n    this.isPrimed = true\n    const activeFrame = this.activeFrame()\n    if (!activeFrame) return\n\n    const {image} = this.frameParts(activeFrame)\n    image.loading = 'eager'\n    void this.waitForFrame(activeFrame)\n      .then(() => {\n        if (!this.isConnected || activeFrame !== this.activeFrame()) return\n\n        activeFrame.dataset.ready = 'true'\n        this.prefetchNeighbors()\n        this.scheduleAutoAdvance()\n      })\n      .catch(() => {\n        if (!this.isConnected || activeFrame !== this.activeFrame()) return\n\n        this.element.dataset.loadError =\n          activeFrame.dataset.assetKey || 'initial'\n      })\n  }\n\n  private userAdvance(delta: number): void {\n    this.pauseForUser()\n    this.advance(delta)\n  }\n\n  private advance(delta: number): void {\n    if (this.profilesValue.length <= 1) return\n\n    const nextIndex =\n      (this.requestedIndex + delta + this.profilesValue.length) %\n      this.profilesValue.length\n    this.activateProfile(nextIndex)\n  }\n\n  private activateProfile(index: number): void {\n    if (!this.isProfileIndex(index)) return\n\n    this.requestedIndex = index\n    this.activateRecord(this.profilesValue[index], 'lensnode', index)\n  }\n\n  private activateRecord(\n    record: ImageRecord,\n    view: ComparisonView,\n    profileIndex: number,\n  ): void {\n    const requestId = ++this.requestSequence\n    this.clearAutoAdvance()\n    this.markPending(view, profileIndex)\n\n    const frame = this.frameForRecord(record, view)\n    if (!frame) {\n      this.handleLoadFailure(record, requestId)\n      return\n    }\n\n    this.prepareFrame(frame, record)\n    void this.waitForFrame(frame)\n      .then(() => {\n        if (\n          !this.isConnected ||\n          requestId !== this.requestSequence ||\n          frame.dataset.assetKey !== record.key\n        ) {\n          return\n        }\n\n        this.commitFrame(frame, view, profileIndex)\n      })\n      .catch(() => {\n        if (this.isConnected && frame.dataset.assetKey === record.key) {\n          frame.dataset.loadError = 'true'\n        }\n        this.handleLoadFailure(record, requestId)\n      })\n  }\n\n  private commitFrame(\n    nextFrame: HTMLElement,\n    view: ComparisonView,\n    profileIndex: number,\n  ): void {\n    this.frameTargets.forEach((frame) => {\n      const active = frame === nextFrame\n      frame.dataset.state = active ? 'active' : 'inactive'\n      frame.setAttribute('aria-hidden', active ? 'false' : 'true')\n    })\n\n    nextFrame.dataset.ready = 'true'\n    nextFrame.removeAttribute('data-load-error')\n    this.currentIndex = profileIndex\n    this.requestedIndex = profileIndex\n    this.view = view\n    this.element.dataset.view = view\n    this.element.dataset.currentIndex = String(profileIndex)\n    this.element.removeAttribute('data-load-error')\n    this.clearPending()\n    this.renderControls()\n    this.prefetchNeighbors()\n    this.scheduleAutoAdvance()\n  }\n\n  private frameForRecord(\n    record: ImageRecord,\n    view: ComparisonView,\n  ): HTMLElement | undefined {\n    const prepared = this.frameTargets.find(\n      (frame) => frame.dataset.assetKey === record.key,\n    )\n    if (prepared) return prepared\n\n    if (view === 'original') {\n      return this.frameTargets.find(\n        (frame) => frame.dataset.frameKind === 'original',\n      )\n    }\n\n    const inactiveLensFrames = this.frameTargets.filter(\n      (frame) =>\n        frame.dataset.frameKind === 'lens' &&\n        frame.dataset.state !== 'active',\n    )\n    const currentKey = this.profilesValue[this.currentIndex]?.key\n    return (\n      inactiveLensFrames.find(\n        (frame) => frame.dataset.assetKey !== currentKey,\n      ) || inactiveLensFrames[0]\n    )\n  }\n\n  private activeFrame(): HTMLElement | undefined {\n    return this.frameTargets.find((frame) => frame.dataset.state === 'active')\n  }\n\n  private frameParts(frame: HTMLElement): FrameParts {\n    const index = this.frameTargets.indexOf(frame)\n    const image = this.imageTargets[index]\n    const source = this.sourceTargets[index]\n    if (!image || !source) throw new Error('Incomplete carousel frame')\n\n    return {frame, image, source}\n  }\n\n  private prepareFrame(frame: HTMLElement, record: ImageRecord): void {\n    const {image, source} = this.frameParts(frame)\n    const sameRecord =\n      frame.dataset.assetKey === record.key && image.hasAttribute('src')\n    const failed =\n      frame.dataset.loadError === 'true' ||\n      (image.complete && image.naturalWidth === 0)\n    if (sameRecord && !failed) {\n      return\n    }\n\n    this.clearPendingFrameListeners(frame)\n    frame.dataset.assetKey = record.key\n    frame.removeAttribute('data-ready')\n    frame.removeAttribute('data-load-error')\n    source.removeAttribute('srcset')\n    image.removeAttribute('src')\n    source.srcset = record.srcset\n    image.alt = record.alt\n    image.loading = 'eager'\n    image.src = record.fallback\n  }\n\n  private async waitForFrame(frame: HTMLElement): Promise<void> {\n    const {image} = this.frameParts(frame)\n    if (!image.getAttribute('src')) throw new Error('Carousel image has no source')\n\n    if (!image.complete) {\n      await new Promise<void>((resolve, reject) => {\n        const cleanup = () => {\n          image.removeEventListener('load', loaded)\n          image.removeEventListener('error', failed)\n          this.unregisterPendingFrameListener(frame, cleanup)\n        }\n        const loaded = () => {\n          cleanup()\n          resolve()\n        }\n        const failed = () => {\n          cleanup()\n          reject(new Error('Carousel image failed to load'))\n        }\n\n        image.addEventListener('load', loaded)\n        image.addEventListener('error', failed)\n        this.registerPendingFrameListener(frame, cleanup)\n      })\n    }\n\n    if (image.naturalWidth === 0) {\n      throw new Error('Carousel image failed to load')\n    }\n\n    try {\n      await image.decode()\n    } catch {\n      if (!image.complete || image.naturalWidth === 0) {\n        throw new Error('Carousel image failed to decode')\n      }\n    }\n  }\n\n  private registerPendingFrameListener(\n    frame: HTMLElement,\n    cleanup: () => void,\n  ): void {\n    const cleanups =\n      this.pendingFrameListenerCleanups.get(frame) || new Set<() => void>()\n    cleanups.add(cleanup)\n    this.pendingFrameListenerCleanups.set(frame, cleanups)\n  }\n\n  private unregisterPendingFrameListener(\n    frame: HTMLElement,\n    cleanup: () => void,\n  ): void {\n    const cleanups = this.pendingFrameListenerCleanups.get(frame)\n    if (!cleanups) return\n\n    cleanups.delete(cleanup)\n    if (cleanups.size === 0) this.pendingFrameListenerCleanups.delete(frame)\n  }\n\n  private clearPendingFrameListeners(frame?: HTMLElement): void {\n    const entries = frame\n      ? [[frame, this.pendingFrameListenerCleanups.get(frame)] as const]\n      : Array.from(this.pendingFrameListenerCleanups.entries())\n\n    entries.forEach(([, cleanups]) => {\n      Array.from(cleanups || []).forEach((cleanup) => cleanup())\n    })\n  }\n\n  private prefetchNeighbors(): void {\n    if (!this.isPrimed) return\n\n    const originalFrame = this.frameTargets.find(\n      (frame) => frame.dataset.frameKind === 'original',\n    )\n    if (originalFrame && originalFrame.dataset.state !== 'active') {\n      this.prefetch(this.originalValue, originalFrame)\n    }\n\n    if (\n      this.element.getAttribute('aria-busy') === 'true' ||\n      this.view !== 'lensnode' ||\n      this.profilesValue.length <= 1\n    ) {\n      return\n    }\n\n    const nextIndex = (this.currentIndex + 1) % this.profilesValue.length\n    const nextRecord = this.profilesValue[nextIndex]\n    const nextFrame = this.frameForRecord(nextRecord, 'lensnode')\n    if (nextFrame && nextFrame.dataset.state !== 'active') {\n      this.prefetch(nextRecord, nextFrame)\n    }\n  }\n\n  private prefetch(record: ImageRecord, frame: HTMLElement): void {\n    this.prepareFrame(frame, record)\n    void this.waitForFrame(frame)\n      .then(() => {\n        if (\n          this.isConnected &&\n          frame.dataset.assetKey === record.key\n        ) {\n          frame.dataset.ready = 'true'\n          frame.removeAttribute('data-load-error')\n        }\n      })\n      .catch(() => {\n        if (this.isConnected && frame.dataset.assetKey === record.key) {\n          frame.dataset.loadError = 'true'\n        }\n      })\n  }\n\n  private markPending(view: ComparisonView, profileIndex: number): void {\n    this.element.setAttribute('aria-busy', 'true')\n    this.element.dataset.pendingView = view\n    this.element.dataset.pendingIndex = String(profileIndex)\n    this.pipTargets.forEach((pip) => {\n      const index = Number.parseInt(pip.dataset.index || '', 10)\n      if (view === 'lensnode' && index === profileIndex) {\n        pip.dataset.pending = 'true'\n      } else {\n        pip.removeAttribute('data-pending')\n      }\n    })\n  }\n\n  private clearPending(): void {\n    this.element.setAttribute('aria-busy', 'false')\n    this.element.removeAttribute('data-pending-view')\n    this.element.removeAttribute('data-pending-index')\n    this.pipTargets.forEach((pip) => pip.removeAttribute('data-pending'))\n  }\n\n  private handleLoadFailure(record: ImageRecord, requestId: number): void {\n    if (!this.isConnected || requestId !== this.requestSequence) return\n\n    this.element.dataset.loadError = record.key\n    this.requestedIndex = this.currentIndex\n    this.clearPending()\n    this.scheduleAutoAdvance()\n  }\n\n  private renderControls(): void {\n    let activePip: HTMLButtonElement | null = null\n    this.pipTargets.forEach((pip) => {\n      const index = Number.parseInt(pip.dataset.index || '', 10)\n      const active = index === this.currentIndex\n      if (active) {\n        pip.setAttribute('aria-current', 'true')\n        activePip = pip\n      } else {\n        pip.removeAttribute('aria-current')\n      }\n      pip.tabIndex = active ? 0 : -1\n    })\n    if (activePip) this.keepPipVisible(activePip)\n\n    if (this.hasLensNodeTarget) {\n      this.lensNodeTarget.setAttribute(\n        'aria-pressed',\n        this.view === 'lensnode' ? 'true' : 'false',\n      )\n    }\n    if (this.hasOriginalTarget) {\n      this.originalTarget.setAttribute(\n        'aria-pressed',\n        this.view === 'original' ? 'true' : 'false',\n      )\n    }\n  }\n\n  private keepPipVisible(pip: HTMLButtonElement): void {\n    if (!this.hasPaginationTarget) return\n\n    const pagination = this.paginationTarget\n    const paginationRect = pagination.getBoundingClientRect()\n    const pipRect = pip.getBoundingClientRect()\n\n    if (pipRect.left < paginationRect.left) {\n      pagination.scrollLeft -= paginationRect.left - pipRect.left\n    } else if (pipRect.right > paginationRect.right) {\n      pagination.scrollLeft += pipRect.right - paginationRect.right\n    }\n  }\n\n  private onKeydown(event: KeyboardEvent): void {\n    if (event.target !== this.element) return\n\n    if (event.key === 'ArrowLeft') {\n      event.preventDefault()\n      this.userAdvance(-1)\n    } else if (event.key === 'ArrowRight') {\n      event.preventDefault()\n      this.userAdvance(1)\n    }\n  }\n\n  private onMotionChange(event: MediaQueryListEvent): void {\n    if (event.matches) {\n      this.clearAutoAdvance()\n      this.clearResumeTimer()\n    } else {\n      this.scheduleAutoAdvance()\n    }\n  }\n\n  private onVisibilityChange(): void {\n    if (document.visibilityState === 'hidden') {\n      this.clearAutoAdvance()\n    } else {\n      this.scheduleAutoAdvance()\n    }\n  }\n\n  private scheduleAutoAdvance(): void {\n    this.clearAutoAdvance()\n    if (\n      !this.isConnected ||\n      !this.isPrimed ||\n      !this.isVisible ||\n      document.visibilityState === 'hidden' ||\n      this.view !== 'lensnode' ||\n      this.profilesValue.length <= 1 ||\n      this.motionQuery?.matches ||\n      this.resumeTimeoutId !== null ||\n      this.element.getAttribute('aria-busy') === 'true'\n    ) {\n      return\n    }\n\n    this.autoTimeoutId = window.setTimeout(() => {\n      this.autoTimeoutId = null\n      this.advance(1)\n    }, this.autoAdvanceMsValue)\n  }\n\n  private clearAutoAdvance(): void {\n    if (this.autoTimeoutId !== null) {\n      window.clearTimeout(this.autoTimeoutId)\n      this.autoTimeoutId = null\n    }\n  }\n\n  private pauseForUser(): void {\n    this.clearAutoAdvance()\n    this.clearResumeTimer()\n    if (this.motionQuery?.matches) return\n\n    this.resumeTimeoutId = window.setTimeout(() => {\n      this.resumeTimeoutId = null\n      this.scheduleAutoAdvance()\n    }, RESUME_DELAY_MS)\n  }\n\n  private clearResumeTimer(): void {\n    if (this.resumeTimeoutId !== null) {\n      window.clearTimeout(this.resumeTimeoutId)\n      this.resumeTimeoutId = null\n    }\n  }\n\n  private isProfileIndex(index: number): boolean {\n    return index >= 0 && index < this.profilesValue.length\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport {\n  relinquishVideoPlayback,\n  scheduleVideoPauseWhenDetached,\n} from '../video_playback_session'\nimport { applyLooksPickerVideoContract } from '../video_destination_contract'\n\nexport default class LooksPickerController extends Controller<HTMLElement> {\n  static targets = ['videoContainer', 'description', 'descriptionContainer']\n\n  declare readonly videoContainerTarget: HTMLElement\n  declare readonly descriptionTarget: HTMLElement\n  declare readonly descriptionContainerTarget: HTMLElement\n\n  private defaultVideoSrc: string | null = null\n  private baseVideo: HTMLVideoElement | null = null\n  private selectedItem: HTMLButtonElement | null = null\n  private bufferVideo: HTMLVideoElement | null = null\n  private swapAbort?: AbortController\n  private playbackAbort?: AbortController\n  private sequenceAbort?: AbortController\n  private viewportObserver: IntersectionObserver | null = null\n  private videoObserver: MutationObserver | null = null\n  private videoBindTimer: number | null = null\n  private shimmerTimeouts = new Map<HTMLButtonElement, number>()\n  private playbackArmed = false\n  private autoplayEnabled = false\n  private swapSequence = 0\n  private connectionGeneration = 0\n  private connected = false\n\n  connect(): void {\n    this.connected = true\n    this.connectionGeneration += 1\n    this.autoplayEnabled = !window.matchMedia('(prefers-reduced-motion: reduce)').matches\n    this.element.dataset.autoplay = this.autoplayEnabled ? 'active' : 'reduced-motion'\n    this.descriptionContainerTarget.setAttribute('aria-live', 'off')\n    const video = this.videoContainerTarget.querySelector<HTMLVideoElement>(\n      'video:not(.crossfade-video)'\n    )\n    this.defaultVideoSrc =\n      video?.currentSrc ||\n      video?.getAttribute('src') ||\n      video?.querySelector('source')?.getAttribute('src') ||\n      null\n\n    this.items.forEach((item) => {\n      item.classList.remove('is-selected')\n      item.setAttribute('aria-pressed', 'false')\n    })\n    const initialItem = this.autoplayItems[0] || null\n    this.selectedItem = initialItem\n    if (initialItem) {\n      initialItem.classList.add('is-selected')\n      initialItem.setAttribute('aria-pressed', 'true')\n      this.updateDescription(\n        initialItem.dataset.label?.trim() || '',\n        initialItem.dataset.description?.trim() || ''\n      )\n    } else {\n      this.hideDescription()\n    }\n\n    this.videoObserver = new MutationObserver(() => this.scheduleVideoBinding())\n    this.videoObserver.observe(this.videoContainerTarget, { childList: true, subtree: true })\n    this.scheduleVideoBinding()\n  }\n\n  disconnect(): void {\n    this.connected = false\n    this.connectionGeneration += 1\n    this.videoObserver?.disconnect()\n    this.videoObserver = null\n    if (this.videoBindTimer !== null) window.clearTimeout(this.videoBindTimer)\n    this.videoBindTimer = null\n    this.swapAbort?.abort()\n    this.swapAbort = undefined\n    this.playbackAbort?.abort()\n    this.playbackAbort = undefined\n    this.sequenceAbort?.abort()\n    this.sequenceAbort = undefined\n    this.viewportObserver?.takeRecords()\n    this.viewportObserver?.disconnect()\n    this.viewportObserver = null\n    this.bufferVideo?.pause()\n    this.bufferVideo?.remove()\n    this.bufferVideo = null\n    this.playbackArmed = false\n    this.autoplayEnabled = false\n    this.clearLoadingState()\n    this.selectedItem = null\n    const video = this.baseVideo\n    this.baseVideo = null\n    if (video) this.pauseWhenDetached(video)\n  }\n\n  select(event: Event): void {\n    const item = event.currentTarget as HTMLButtonElement | null\n    if (!item) return\n\n    this.autoplayEnabled = false\n    this.element.dataset.autoplay = 'stopped'\n    this.descriptionContainerTarget.setAttribute('aria-live', 'polite')\n    this.setVideoLooping(true)\n    this.selectItem(item)\n  }\n\n  private get items(): NodeListOf<HTMLButtonElement> {\n    return this.element.querySelectorAll<HTMLButtonElement>('[data-looks-picker-item]')\n  }\n\n  private get autoplayItems(): HTMLButtonElement[] {\n    const orderedItems: Array<{ item: HTMLButtonElement; order: number }> = []\n\n    this.items.forEach((item) => {\n      const rawOrder = item.dataset.autoplayOrder\n      if (rawOrder === undefined) return\n\n      const order = Number(rawOrder)\n      if (!Number.isInteger(order) || order < 0) return\n      orderedItems.push({ item, order })\n    })\n\n    return orderedItems\n      .sort((left, right) => left.order - right.order)\n      .map(({ item }) => item)\n  }\n\n  private get videoTarget(): HTMLVideoElement {\n    const video =\n      this.baseVideo ||\n      this.videoContainerTarget.querySelector<HTMLVideoElement>('video:not(.crossfade-video)')\n    if (!video) throw new Error('[looks-picker] Missing video in video container target')\n    return video\n  }\n\n  private scheduleVideoBinding(): void {\n    if (this.videoBindTimer !== null) return\n\n    // As with the other permanent-video consumers, the controller wrapper can\n    // connect before Turbo swaps its placeholder descendant for the live\n    // outgoing element. Bind after that task and observe any later swap.\n    this.videoBindTimer = window.setTimeout(() => {\n      this.videoBindTimer = null\n      this.bindCurrentVideo()\n    }, 0)\n  }\n\n  private bindCurrentVideo(): void {\n    const video = this.videoContainerTarget.querySelector<HTMLVideoElement>(\n      'video:not(.crossfade-video)'\n    )\n    if (!video || video === this.baseVideo) return\n\n    const previousVideo = this.baseVideo\n    this.swapSequence += 1\n    this.swapAbort?.abort()\n    this.swapAbort = undefined\n    this.playbackAbort?.abort()\n    this.playbackAbort = undefined\n    this.sequenceAbort?.abort()\n    this.sequenceAbort = undefined\n    this.viewportObserver?.disconnect()\n    this.viewportObserver = null\n    this.bufferVideo?.pause()\n    this.bufferVideo?.remove()\n    this.bufferVideo = null\n    this.playbackArmed = false\n\n    this.baseVideo = video\n    applyLooksPickerVideoContract(video, this.videoContainerTarget)\n    this.setVideoLooping(!this.autoplayEnabled)\n    relinquishVideoPlayback(video)\n    video.classList.add('zine-fullbleed')\n    if (previousVideo) this.pauseWhenDetached(previousVideo)\n\n    const sequenceAbort = new AbortController()\n    this.sequenceAbort = sequenceAbort\n    video.addEventListener('ended', () => this.advanceAutoplay(), {\n      signal: sequenceAbort.signal,\n    })\n\n    this.armPlaybackOnVisibility()\n  }\n\n  private pauseWhenDetached(video: HTMLVideoElement): void {\n    scheduleVideoPauseWhenDetached(video)\n  }\n\n  private selectItem(item: HTMLButtonElement): void {\n    if (this.selectedItem && this.selectedItem !== item) {\n      this.selectedItem.classList.remove('is-selected')\n      this.selectedItem.setAttribute('aria-pressed', 'false')\n    }\n\n    this.selectedItem = item\n    item.classList.add('is-selected')\n    item.setAttribute('aria-pressed', 'true')\n\n    const videoUrl = item.dataset.video || this.defaultVideoSrc\n    if (videoUrl) void this.swapVideo(videoUrl, ++this.swapSequence)\n\n    this.updateDescription(item.dataset.label?.trim() || '', item.dataset.description?.trim() || '')\n  }\n\n  private advanceAutoplay(): void {\n    if (!this.connected || !this.autoplayEnabled) return\n\n    const items = this.autoplayItems\n    if (items.length === 0) return\n    const currentIndex = this.selectedItem ? items.indexOf(this.selectedItem) : -1\n    const nextItem = items[(currentIndex + 1) % items.length]\n    if (nextItem) this.selectItem(nextItem)\n  }\n\n  private setVideoLooping(enabled: boolean): void {\n    const video = this.baseVideo\n    if (!video) return\n\n    video.loop = enabled\n    if (enabled) video.setAttribute('loop', '')\n    else video.removeAttribute('loop')\n  }\n\n  private async swapVideo(src: string, sequence: number): Promise<void> {\n    const baseVideo = this.videoTarget\n    const currentSrc = this.readCurrentVideoSrc()\n    const nextSrc = new URL(src, window.location.href).href\n\n    this.swapAbort?.abort()\n    this.swapAbort = undefined\n    if (\n      currentSrc &&\n      this.normalizedMediaUrl(currentSrc) === this.normalizedMediaUrl(nextSrc)\n    ) {\n      if (this.bufferVideo) this.resetOverlay(this.bufferVideo)\n      this.clearLoadingState()\n      return\n    }\n\n    const abortController = new AbortController()\n    this.swapAbort = abortController\n    const { signal } = abortController\n    const isCurrent = () => !signal.aborted && this.swapSequence === sequence\n\n    if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n      baseVideo.pause()\n      baseVideo.preload = 'metadata'\n      baseVideo.src = src\n      baseVideo.load()\n      if (isCurrent()) this.swapAbort = undefined\n      return\n    }\n\n    this.startLoading()\n    const overlay = this.setupBufferVideo()\n\n    try {\n      this.resetOverlay(overlay)\n      overlay.loop = baseVideo.loop\n      overlay.playbackRate = baseVideo.playbackRate\n      overlay.preload = 'auto'\n      overlay.src = src\n      overlay.load()\n\n      await this.waitForMedia(overlay, HTMLMediaElement.HAVE_FUTURE_DATA, signal)\n      await this.seek(overlay, this.mappedTime(baseVideo, overlay), signal)\n      await this.play(overlay)\n\n      void overlay.offsetWidth\n      overlay.style.opacity = '1'\n      await this.waitForOpacityTransition(overlay, signal)\n\n      baseVideo.pause()\n      baseVideo.preload = 'auto'\n      baseVideo.src = src\n      await this.waitForMedia(baseVideo, HTMLMediaElement.HAVE_METADATA, signal)\n      await this.seek(baseVideo, this.mappedTime(overlay, baseVideo), signal)\n      await this.waitForMedia(baseVideo, HTMLMediaElement.HAVE_FUTURE_DATA, signal)\n      await this.play(baseVideo)\n\n      overlay.style.opacity = '0'\n      await this.waitForOpacityTransition(overlay, signal)\n    } catch (error) {\n      if (isCurrent() && !this.isAbortError(error)) {\n        console.warn('[looks-picker] Video crossfade failed; using a direct swap.', error)\n        baseVideo.pause()\n        baseVideo.preload = 'auto'\n        baseVideo.src = src\n        void this.play(baseVideo)\n      }\n    } finally {\n      if (isCurrent()) {\n        this.resetOverlay(overlay)\n        this.finishLoading()\n        this.swapAbort = undefined\n      }\n    }\n  }\n\n  private setupBufferVideo(): HTMLVideoElement {\n    if (this.bufferVideo?.isConnected) return this.bufferVideo\n\n    const overlay = document.createElement('video')\n    overlay.className = `${this.videoTarget.className} crossfade-video`\n    overlay.muted = true\n    overlay.playsInline = true\n    overlay.setAttribute('muted', '')\n    overlay.setAttribute('playsinline', '')\n    overlay.setAttribute('webkit-playsinline', '')\n    overlay.setAttribute('aria-hidden', 'true')\n    overlay.tabIndex = -1\n    this.videoTarget.parentElement?.appendChild(overlay)\n    this.bufferVideo = overlay\n    return overlay\n  }\n\n  private resetOverlay(overlay: HTMLVideoElement): void {\n    overlay.pause()\n    overlay.style.opacity = '0'\n  }\n\n  private mappedTime(from: HTMLVideoElement, to: HTMLVideoElement): number {\n    if (\n      Number.isFinite(from.duration) &&\n      Number.isFinite(to.duration) &&\n      from.duration > 0 &&\n      to.duration > 0\n    ) {\n      return ((from.currentTime % from.duration) / from.duration) * to.duration\n    }\n    return from.currentTime || 0\n  }\n\n  private waitForMedia(\n    video: HTMLVideoElement,\n    readyState: number,\n    signal: AbortSignal\n  ): Promise<void> {\n    if (video.readyState >= readyState) return Promise.resolve()\n\n    return new Promise((resolve, reject) => {\n      const cleanup = () => {\n        video.removeEventListener('loadedmetadata', onReady)\n        video.removeEventListener('canplay', onReady)\n        video.removeEventListener('error', onError)\n        signal.removeEventListener('abort', onAbort)\n      }\n      const onReady = () => {\n        if (video.readyState < readyState) return\n        cleanup()\n        resolve()\n      }\n      const onError = () => {\n        cleanup()\n        reject(video.error || new Error('Video failed to load'))\n      }\n      const onAbort = () => {\n        cleanup()\n        reject(new DOMException('Video swap aborted', 'AbortError'))\n      }\n\n      video.addEventListener('loadedmetadata', onReady)\n      video.addEventListener('canplay', onReady)\n      video.addEventListener('error', onError)\n      signal.addEventListener('abort', onAbort, { once: true })\n    })\n  }\n\n  private seek(video: HTMLVideoElement, time: number, signal: AbortSignal): Promise<void> {\n    if (!Number.isFinite(time) || Math.abs(video.currentTime - time) < 0.05) {\n      return Promise.resolve()\n    }\n\n    return new Promise((resolve, reject) => {\n      let timeoutId: number\n      const cleanup = () => {\n        window.clearTimeout(timeoutId)\n        video.removeEventListener('seeked', onSeeked)\n        signal.removeEventListener('abort', onAbort)\n      }\n      const onSeeked = () => {\n        cleanup()\n        resolve()\n      }\n      const onAbort = () => {\n        cleanup()\n        reject(new DOMException('Video swap aborted', 'AbortError'))\n      }\n\n      video.addEventListener('seeked', onSeeked, { once: true })\n      signal.addEventListener('abort', onAbort, { once: true })\n      timeoutId = window.setTimeout(onSeeked, 500)\n      video.currentTime = time\n    })\n  }\n\n  private waitForOpacityTransition(\n    video: HTMLVideoElement,\n    signal: AbortSignal\n  ): Promise<void> {\n    return new Promise((resolve, reject) => {\n      let timeoutId: number\n      const cleanup = () => {\n        window.clearTimeout(timeoutId)\n        video.removeEventListener('transitionend', onTransitionEnd)\n        signal.removeEventListener('abort', onAbort)\n      }\n      const finish = () => {\n        cleanup()\n        resolve()\n      }\n      const onTransitionEnd = (event: TransitionEvent) => {\n        if (event.propertyName === 'opacity') finish()\n      }\n      const onAbort = () => {\n        cleanup()\n        reject(new DOMException('Video swap aborted', 'AbortError'))\n      }\n\n      video.addEventListener('transitionend', onTransitionEnd)\n      signal.addEventListener('abort', onAbort, { once: true })\n      timeoutId = window.setTimeout(finish, 350)\n    })\n  }\n\n  private async play(video: HTMLVideoElement): Promise<void> {\n    try {\n      await video.play()\n    } catch {\n      // Muted autoplay can still be declined; visibility and gesture handlers retry it.\n    }\n  }\n\n  private armPlaybackOnVisibility(): void {\n    if (\n      this.playbackArmed ||\n      window.matchMedia('(prefers-reduced-motion: reduce)').matches\n    ) return\n\n    const video = this.baseVideo\n    if (!video) return\n    const generation = this.connectionGeneration\n    const isCurrent = () =>\n      this.connected &&\n      this.connectionGeneration === generation &&\n      this.baseVideo === video &&\n      video.isConnected\n\n    const start = () => {\n      if (this.playbackArmed || !isCurrent()) return\n      this.playbackArmed = true\n      this.viewportObserver?.disconnect()\n      this.viewportObserver = null\n      video.preload = 'auto'\n      this.setupBufferVideo()\n      const selected = this.selectedItem\n      if (selected) this.selectItem(selected)\n      this.ensureAutoplay(video)\n    }\n\n    if (!('IntersectionObserver' in window)) {\n      start()\n      return\n    }\n\n    this.viewportObserver = new IntersectionObserver(\n      (entries) => {\n        if (isCurrent() && entries.some((entry) => entry.isIntersecting)) start()\n      },\n      { rootMargin: '200px 0px' }\n    )\n    this.viewportObserver.observe(this.element)\n  }\n\n  private ensureAutoplay(video: HTMLVideoElement): void {\n    video.muted = true\n    video.playsInline = true\n    video.autoplay = true\n    video.setAttribute('muted', '')\n    video.setAttribute('playsinline', '')\n    video.setAttribute('webkit-playsinline', '')\n    video.setAttribute('autoplay', '')\n    if (video.readyState === HTMLMediaElement.HAVE_NOTHING) video.load()\n\n    const tryPlay = () => void this.play(video)\n    tryPlay()\n\n    const signal = (this.playbackAbort ??= new AbortController()).signal\n    const once: AddEventListenerOptions = { once: true, signal }\n    video.addEventListener('canplay', tryPlay, once)\n    video.addEventListener('loadeddata', tryPlay, once)\n    document.addEventListener(\n      'visibilitychange',\n      () => {\n        if (document.visibilityState === 'visible') tryPlay()\n      },\n      { signal }\n    )\n    window.addEventListener('pageshow', tryPlay, once)\n    window.addEventListener('pointerdown', tryPlay, once)\n    window.addEventListener('touchstart', tryPlay, once)\n    window.addEventListener('click', tryPlay, once)\n  }\n\n  private normalizedMediaUrl(source: string): string {\n    const url = new URL(source, window.location.href)\n    url.hash = ''\n    return url.href\n  }\n\n  private hideDescription(): void {\n    this.descriptionTarget.replaceChildren()\n    this.descriptionContainerTarget.hidden = true\n  }\n\n  private updateDescription(label: string, description: string): void {\n    const container = this.descriptionTarget\n    container.replaceChildren()\n    this.descriptionContainerTarget.hidden = false\n\n    if (label) {\n      const strong = document.createElement('strong')\n      strong.textContent = label\n      container.appendChild(strong)\n      if (description) container.appendChild(document.createTextNode(' '))\n    }\n    if (description) {\n      const span = document.createElement('span')\n      span.className = 'muted'\n      span.textContent = description\n      container.appendChild(span)\n    }\n  }\n\n  private readCurrentVideoSrc(): string | null {\n    const video = this.videoTarget\n    return video.currentSrc || video.src || video.querySelector('source')?.src || null\n  }\n\n  private startLoading(): void {\n    this.clearLoadingState()\n    this.selectedItem?.classList.add('is-loading', 'is-shimmer')\n  }\n\n  private finishLoading(): void {\n    this.items.forEach((item) => {\n      if (!item.classList.contains('is-loading')) return\n      item.classList.remove('is-loading')\n      const timeoutId = window.setTimeout(() => {\n        item.classList.remove('is-shimmer')\n        this.shimmerTimeouts.delete(item)\n      }, 220)\n      this.shimmerTimeouts.set(item, timeoutId)\n    })\n  }\n\n  private clearLoadingState(): void {\n    this.shimmerTimeouts.forEach((timeoutId) => window.clearTimeout(timeoutId))\n    this.shimmerTimeouts.clear()\n    this.items.forEach((item) => {\n      item.classList.remove('is-loading', 'is-shimmer')\n    })\n  }\n\n  private isAbortError(error: unknown): boolean {\n    return error instanceof DOMException && error.name === 'AbortError'\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller<HTMLElement> {\n  static targets = ['trigger', 'menu']\n\n  declare readonly triggerTarget: HTMLAnchorElement\n  declare readonly menuTarget: HTMLElement\n\n  connect(): void {\n    this.close()\n  }\n\n  disconnect(): void {\n    this.close()\n  }\n\n  open(): void {\n    this.menuTarget.hidden = false\n    this.triggerTarget.setAttribute('aria-expanded', 'true')\n    this.element.classList.add('is-open')\n  }\n\n  close(): void {\n    this.menuTarget.hidden = true\n    this.triggerTarget.setAttribute('aria-expanded', 'false')\n    this.element.classList.remove('is-open')\n  }\n\n  closeFromPointer(): void {\n    if (this.element.contains(document.activeElement)) return\n    this.close()\n  }\n\n  closeFromFocus(event: FocusEvent): void {\n    const nextTarget = event.relatedTarget\n    if (nextTarget instanceof Node && this.element.contains(nextTarget)) return\n    this.close()\n  }\n\n  closeFromOutside(event: MouseEvent): void {\n    const target = event.target\n    if (target instanceof Node && !this.element.contains(target)) this.close()\n  }\n\n  closeFromEscape(): void {\n    if (this.menuTarget.hidden) return\n\n    const activeElement = document.activeElement\n    if (activeElement instanceof Node && this.element.contains(activeElement)) {\n      this.triggerTarget.focus()\n    }\n    this.close()\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nconst FRAME_MS = 1000 / 24\nconst FADE_OUT_MS = 180\nconst REDUCED_MOTION_QUERY = '(prefers-reduced-motion: reduce)'\n\ntype BodyOverflowState = Readonly<{\n  element: HTMLElement\n  value: string\n  priority: string\n}>\n\nexport default class ProductPrimaryActionController extends Controller<HTMLElement> {\n  static targets = ['trigger', 'dialogTemplate']\n\n  declare readonly triggerTarget: HTMLAnchorElement\n  declare readonly dialogTemplateTarget: HTMLTemplateElement\n  declare readonly hasDialogTemplateTarget: boolean\n\n  private connected = false\n  private hovering = false\n  private pressing = false\n  private tickerId: number | null = null\n  private fadeOutTimeoutId: number | null = null\n  private reducedMotionQuery: MediaQueryList | null = null\n  private usesLegacyMotionListener = false\n  private inquiryDialog: HTMLDialogElement | null = null\n  private inquiryCloseButton: HTMLButtonElement | null = null\n  private inquiryIframe: HTMLIFrameElement | null = null\n  private bodyOverflowState: BodyOverflowState | null = null\n  private restoreTriggerFocusAfterClose = false\n\n  connect(): void {\n    this.connected = true\n    this.reducedMotionQuery = window.matchMedia(REDUCED_MOTION_QUERY)\n    this.observeMotionChanges(this.reducedMotionQuery)\n    this.clearPresentation()\n  }\n\n  disconnect(): void {\n    this.connected = false\n    if (this.reducedMotionQuery !== null) {\n      this.stopObservingMotionChanges(this.reducedMotionQuery)\n    }\n    this.reducedMotionQuery = null\n    this.destroyInquiryDialog()\n    this.clearPresentation()\n  }\n\n  openInquiry(event: MouseEvent): void {\n    if (!this.shouldOpenInquiry(event)) return\n    if (!this.supportsModalDialog()) return\n\n    if (this.inquiryDialog?.open === true) {\n      event.preventDefault()\n      this.inquiryCloseButton?.focus({ preventScroll: true })\n      return\n    }\n    if (this.inquiryDialog !== null) this.destroyInquiryDialog()\n\n    const fallbackHref = this.triggerTarget.href\n    const dialog = this.cloneInquiryDialog(fallbackHref)\n    if (dialog === null) return\n\n    event.preventDefault()\n    this.inquiryDialog = dialog\n    document.body.append(dialog)\n    this.lockBodyScroll()\n    this.restoreTriggerFocusAfterClose = true\n\n    try {\n      dialog.showModal()\n      this.inquiryCloseButton?.focus({ preventScroll: true })\n    } catch {\n      this.restoreTriggerFocusAfterClose = false\n      this.destroyInquiryDialog()\n      window.location.assign(fallbackHref)\n    }\n  }\n\n  receiveInquiryMessage(event: MessageEvent<unknown>): void {\n    const iframe = this.inquiryIframe\n    if (\n      this.inquiryDialog?.open !== true ||\n      iframe === null ||\n      iframe.contentWindow === null ||\n      event.source !== iframe.contentWindow ||\n      event.origin !== new URL(this.triggerTarget.href).origin ||\n      typeof event.data !== 'object' ||\n      event.data === null ||\n      !('type' in event.data) ||\n      event.data.type !== 'form-close'\n    ) {\n      return\n    }\n\n    this.inquiryDialog.close()\n  }\n\n  enter(): void {\n    this.hovering = true\n    this.sync()\n  }\n\n  leave(): void {\n    this.hovering = false\n    this.sync()\n  }\n\n  press(event: PointerEvent): void {\n    this.hovering = this.pointerCanRemainHovered(event)\n    this.pressing = true\n    this.sync()\n  }\n\n  release(event: PointerEvent): void {\n    this.hovering = this.pointerCanRemainHovered(event)\n    this.pressing = false\n    this.sync()\n  }\n\n  cancel(event: PointerEvent): void {\n    this.hovering = this.pointerCanRemainHovered(event)\n    this.pressing = false\n    this.sync()\n  }\n\n  blur(): void {\n    this.hovering = false\n    this.pressing = false\n    this.stop(false)\n  }\n\n  prepareForCache(): void {\n    this.hovering = false\n    this.pressing = false\n    this.destroyInquiryDialog()\n    this.clearPresentation()\n  }\n\n  private readonly handleMotionChange = (): void => {\n    this.sync()\n  }\n\n  private readonly handleInquiryDialogClose = (): void => {\n    const shouldRestoreFocus = this.restoreTriggerFocusAfterClose\n    this.destroyInquiryDialog()\n\n    if (shouldRestoreFocus && this.connected && this.triggerTarget.isConnected) {\n      this.triggerTarget.focus({ preventScroll: true })\n    }\n  }\n\n  private sync(): void {\n    if (!this.shouldRun()) {\n      this.stop(!this.prefersReducedMotion)\n      return\n    }\n\n    this.clearFadeOutTimeout()\n    this.triggerTarget.dataset.grainState = this.pressing ? 'pressed' : 'active'\n    this.randomizePlatePosition()\n\n    if (this.tickerId === null) {\n      this.tickerId = window.setInterval(() => {\n        this.randomizePlatePosition()\n      }, FRAME_MS)\n    }\n  }\n\n  private shouldRun(): boolean {\n    return (\n      this.connected &&\n      (this.hovering || this.pressing) &&\n      !this.prefersReducedMotion\n    )\n  }\n\n  private shouldOpenInquiry(event: MouseEvent): boolean {\n    return (\n      !event.defaultPrevented &&\n      event.button === 0 &&\n      !event.altKey &&\n      !event.ctrlKey &&\n      !event.metaKey &&\n      !event.shiftKey\n    )\n  }\n\n  private supportsModalDialog(): boolean {\n    return (\n      typeof HTMLDialogElement !== 'undefined' &&\n      typeof HTMLDialogElement.prototype.showModal === 'function'\n    )\n  }\n\n  private cloneInquiryDialog(href: string): HTMLDialogElement | null {\n    if (!this.hasDialogTemplateTarget) return null\n\n    const source = this.dialogTemplateTarget.content.querySelector(\n      '[data-ui=\"product-inquiry-dialog\"]'\n    )\n    if (!(source instanceof HTMLDialogElement)) return null\n\n    const dialog = source.cloneNode(true) as HTMLDialogElement\n    const closeButton = dialog.querySelector<HTMLButtonElement>(\n      '[data-slot=\"close\"]'\n    )\n    const iframe = dialog.querySelector<HTMLIFrameElement>(\n      '[data-slot=\"form\"]'\n    )\n    if (closeButton === null || iframe === null) return null\n\n    iframe.src = this.buildInquiryIframeHref(href)\n    dialog.addEventListener('close', this.handleInquiryDialogClose)\n    this.inquiryCloseButton = closeButton\n    this.inquiryIframe = iframe\n    return dialog\n  }\n\n  private buildInquiryIframeHref(href: string): string {\n    const url = new URL(href)\n\n    // These are the popup parameters Typeform's form runtime uses to adapt\n    // itself for an embedded modal and forward Escape as `form-close`. Keep\n    // them on the iframe only so the public fallback link remains untouched.\n    url.searchParams.set(\n      'typeform-embed-id',\n      String(Math.random()).replace(/^0\\./, '')\n    )\n    url.searchParams.set('typeform-embed', 'popup-blank')\n    url.searchParams.set(\n      'typeform-source',\n      window.location.hostname.replace(/^www\\./, '')\n    )\n    url.searchParams.set('typeform-medium', 'embed-sdk')\n    url.searchParams.set('typeform-medium-version', 'next')\n\n    return url.href\n  }\n\n  private destroyInquiryDialog(): void {\n    const dialog = this.inquiryDialog\n    this.inquiryDialog = null\n    this.inquiryCloseButton = null\n    this.inquiryIframe = null\n    this.restoreTriggerFocusAfterClose = false\n\n    if (dialog !== null) {\n      dialog.removeEventListener('close', this.handleInquiryDialogClose)\n      if (dialog.open) dialog.close()\n      dialog.remove()\n    }\n\n    this.restoreBodyScroll()\n  }\n\n  private lockBodyScroll(): void {\n    if (this.bodyOverflowState !== null) return\n\n    this.bodyOverflowState = {\n      element: document.body,\n      value: document.body.style.getPropertyValue('overflow'),\n      priority: document.body.style.getPropertyPriority('overflow'),\n    }\n    this.bodyOverflowState.element.style.setProperty('overflow', 'hidden')\n  }\n\n  private restoreBodyScroll(): void {\n    const state = this.bodyOverflowState\n    if (state === null) return\n\n    if (state.value === '') {\n      state.element.style.removeProperty('overflow')\n    } else {\n      state.element.style.setProperty('overflow', state.value, state.priority)\n    }\n    this.bodyOverflowState = null\n  }\n\n  private get prefersReducedMotion(): boolean {\n    return this.reducedMotionQuery?.matches ?? false\n  }\n\n  private pointerCanRemainHovered(event: PointerEvent): boolean {\n    return event.pointerType === 'mouse' && this.triggerTarget.matches(':hover')\n  }\n\n  private stop(animateThroughFade: boolean): void {\n    delete this.triggerTarget.dataset.grainState\n\n    if (animateThroughFade && this.tickerId !== null) {\n      this.clearFadeOutTimeout()\n      this.fadeOutTimeoutId = window.setTimeout(() => {\n        this.fadeOutTimeoutId = null\n        if (!this.shouldRun()) this.clearTicker()\n      }, FADE_OUT_MS)\n      return\n    }\n\n    this.clearFadeOutTimeout()\n    this.clearTicker()\n  }\n\n  private clearPresentation(): void {\n    this.hovering = false\n    this.pressing = false\n    this.stop(false)\n    this.triggerTarget.style.removeProperty('--product-primary-action-grain-x')\n    this.triggerTarget.style.removeProperty('--product-primary-action-grain-y')\n  }\n\n  private clearTicker(): void {\n    if (this.tickerId === null) return\n\n    window.clearInterval(this.tickerId)\n    this.tickerId = null\n  }\n\n  private clearFadeOutTimeout(): void {\n    if (this.fadeOutTimeoutId === null) return\n\n    window.clearTimeout(this.fadeOutTimeoutId)\n    this.fadeOutTimeoutId = null\n  }\n\n  private observeMotionChanges(query: MediaQueryList): void {\n    if (typeof query.addEventListener === 'function') {\n      this.usesLegacyMotionListener = false\n      query.addEventListener('change', this.handleMotionChange)\n      return\n    }\n\n    this.usesLegacyMotionListener = true\n    query.addListener(this.handleMotionChange)\n  }\n\n  private stopObservingMotionChanges(query: MediaQueryList): void {\n    if (this.usesLegacyMotionListener) {\n      query.removeListener(this.handleMotionChange)\n    } else {\n      query.removeEventListener('change', this.handleMotionChange)\n    }\n\n    this.usesLegacyMotionListener = false\n  }\n\n  private randomizePlatePosition(): void {\n    this.triggerTarget.style.setProperty(\n      '--product-primary-action-grain-x',\n      this.randomPercent()\n    )\n    this.triggerTarget.style.setProperty(\n      '--product-primary-action-grain-y',\n      this.randomPercent()\n    )\n  }\n\n  private randomPercent(): string {\n    return `${Math.round(Math.random() * 10_000) / 100}%`\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\ntype ActivationOptions = {\n  notify: boolean\n  syncUrl: boolean\n}\n\nexport default class extends Controller<HTMLElement> {\n  static targets = ['panel', 'tab', 'tablist']\n\n  declare readonly panelTargets: HTMLElement[]\n  declare readonly tabTargets: HTMLButtonElement[]\n  declare readonly tablistTarget: HTMLElement\n\n  private changeFrames = new Set<number>()\n  private orientationQuery: MediaQueryList | null = null\n\n  private readonly onPopState = (): void => {\n    const requestedId = this.requestedIdFromUrl()\n    if (requestedId) {\n      this.activate(requestedId, { notify: true, syncUrl: false })\n    }\n  }\n\n  connect(): void {\n    window.addEventListener('popstate', this.onPopState)\n    this.connectOrientation()\n\n    const requestedId = this.requestedIdFromUrl()\n    const activeId = requestedId || this.activePanelId() || this.firstPanelId()\n    if (activeId) {\n      this.activate(activeId, {\n        notify: requestedId !== null,\n        syncUrl: false,\n      })\n    }\n  }\n\n  disconnect(): void {\n    window.removeEventListener('popstate', this.onPopState)\n    this.disconnectOrientation()\n    this.changeFrames.forEach((frame) => cancelAnimationFrame(frame))\n    this.changeFrames.clear()\n  }\n\n  select(event: Event): void {\n    const tab = event.currentTarget\n    if (!(tab instanceof HTMLButtonElement)) return\n\n    const panelId = this.panelIdFor(tab)\n    if (panelId) {\n      this.activate(panelId, { notify: true, syncUrl: true })\n    }\n  }\n\n  navigate(event: KeyboardEvent): void {\n    const current = event.currentTarget\n    if (!(current instanceof HTMLButtonElement)) return\n\n    const currentIndex = this.tabTargets.indexOf(current)\n    if (currentIndex < 0) return\n\n    const vertical = this.tablistTarget.getAttribute('aria-orientation') === 'vertical'\n    const previousKey = vertical ? 'ArrowUp' : 'ArrowLeft'\n    const nextKey = vertical ? 'ArrowDown' : 'ArrowRight'\n    let nextIndex: number | null = null\n    switch (event.key) {\n      case previousKey:\n        nextIndex = (currentIndex - 1 + this.tabTargets.length) % this.tabTargets.length\n        break\n      case nextKey:\n        nextIndex = (currentIndex + 1) % this.tabTargets.length\n        break\n      case 'Home':\n        nextIndex = 0\n        break\n      case 'End':\n        nextIndex = this.tabTargets.length - 1\n        break\n      default:\n        return\n    }\n\n    event.preventDefault()\n    if (nextIndex === null) return\n    const next = this.tabTargets[nextIndex]\n    const panelId = this.panelIdFor(next)\n    if (!panelId) return\n\n    next.focus()\n    this.activate(panelId, { notify: true, syncUrl: true })\n  }\n\n  private activate(panelId: string, options: ActivationOptions): void {\n    const selectedTab = this.tabTargets.find((tab) => this.panelIdFor(tab) === panelId)\n    const selectedPanel = this.panelFor(panelId)\n    if (!selectedTab || !selectedPanel) return\n\n    if (options.notify) {\n      selectedPanel.dispatchEvent(\n        new CustomEvent('vv:tabprechange', {\n          bubbles: true,\n          detail: { id: panelId, group: this.group },\n        })\n      )\n    }\n\n    this.tabTargets.forEach((tab) => {\n      const candidateId = this.panelIdFor(tab)\n      const selected = candidateId === panelId\n      tab.setAttribute('aria-selected', String(selected))\n      tab.tabIndex = selected ? 0 : -1\n      tab.classList.toggle('current', selected)\n      tab.dataset.state = selected ? 'selected' : 'unselected'\n\n      if (!candidateId) return\n      const panel = this.panelFor(candidateId)\n      if (!panel) return\n\n      panel.classList.toggle('active-tab', selected)\n      panel.classList.toggle('hidden-tab', !selected)\n      panel.hidden = !selected\n      panel.setAttribute('role', 'tabpanel')\n      panel.setAttribute('aria-labelledby', tab.id)\n      panel.setAttribute('aria-hidden', String(!selected))\n    })\n\n    if (options.syncUrl) this.writeUrl(panelId)\n    if (!options.notify) return\n\n    const changeFrame = requestAnimationFrame(() => {\n      this.changeFrames.delete(changeFrame)\n      if (!this.element.isConnected) return\n\n      selectedPanel.dispatchEvent(\n        new CustomEvent('vv:tabchange', {\n          bubbles: true,\n          detail: { id: panelId, group: this.group },\n        })\n      )\n    })\n    this.changeFrames.add(changeFrame)\n  }\n\n  private activePanelId(): string | null {\n    const selectedByPanel = this.tabTargets.find((tab) => {\n      const panelId = this.panelIdFor(tab)\n      return panelId ? this.panelFor(panelId)?.classList.contains('active-tab') : false\n    })\n    if (selectedByPanel) return this.panelIdFor(selectedByPanel)\n\n    const selectedByMarkup = this.tabTargets.find(\n      (tab) => tab.getAttribute('aria-selected') === 'true'\n    )\n    return selectedByMarkup ? this.panelIdFor(selectedByMarkup) : null\n  }\n\n  private firstPanelId(): string | null {\n    const first = this.tabTargets[0]\n    return first ? this.panelIdFor(first) : null\n  }\n\n  private panelIdFor(tab: HTMLButtonElement): string | null {\n    return tab.dataset.selectionTabsPanelId || null\n  }\n\n  private panelFor(id: string): HTMLElement | null {\n    return this.panelTargets.find((panel) => panel.id === id) || null\n  }\n\n  private requestedIdFromUrl(): string | null {\n    if (!this.urlParam) return null\n\n    const value = new URL(window.location.href).searchParams.get(this.urlParam)\n    if (!value) return null\n\n    const normalized = value.toLowerCase()\n    const matchingTab = this.tabTargets.find((tab) => {\n      const id = this.panelIdFor(tab)?.toLowerCase()\n      return id === normalized || id?.endsWith(`-${normalized}`)\n    })\n    return matchingTab ? this.panelIdFor(matchingTab) : null\n  }\n\n  private writeUrl(panelId: string): void {\n    if (!this.urlParam) return\n\n    const url = new URL(window.location.href)\n    const pieces = panelId.split('-')\n    url.searchParams.set(this.urlParam, pieces[pieces.length - 1])\n    window.history.replaceState(window.history.state, '', url)\n  }\n\n  private get group(): string {\n    return this.tablistTarget.dataset.selectionTabsGroup || ''\n  }\n\n  private get urlParam(): string | null {\n    return this.tablistTarget.dataset.selectionTabsUrlParam || null\n  }\n\n  private connectOrientation(): void {\n    if (this.tablistTarget.dataset.selectionTabsResponsiveOrientation !== 'true') {\n      return\n    }\n\n    this.orientationQuery = window.matchMedia('(max-width: 800px)')\n    this.orientationQuery.addEventListener('change', this.syncOrientation)\n    this.syncOrientation()\n  }\n\n  private disconnectOrientation(): void {\n    this.orientationQuery?.removeEventListener('change', this.syncOrientation)\n    this.orientationQuery = null\n  }\n\n  private readonly syncOrientation = (): void => {\n    this.tablistTarget.setAttribute(\n      'aria-orientation',\n      this.orientationQuery?.matches ? 'vertical' : 'horizontal'\n    )\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller<HTMLElement> {\n  static targets = ['status']\n  static values = {\n    title: String,\n    url: String,\n  }\n\n  declare readonly statusTarget: HTMLElement\n  declare readonly titleValue: string\n  declare readonly urlValue: string\n\n  private connected = false\n  private operationGeneration = 0\n  private resetTimer: number | null = null\n\n  connect(): void {\n    this.connected = true\n    this.cancelPendingOperation()\n    this.resetFeedback()\n  }\n\n  disconnect(): void {\n    this.connected = false\n    this.cancelPendingOperation()\n    this.resetFeedback()\n  }\n\n  prepareForCache(): void {\n    this.cancelPendingOperation()\n    this.resetFeedback()\n  }\n\n  async share(event: Event): Promise<void> {\n    event.preventDefault()\n    this.resetFeedback()\n    const generation = ++this.operationGeneration\n\n    try {\n      if (typeof navigator.share === 'function') {\n        await navigator.share({ title: this.titleValue, url: this.urlValue })\n        return\n      }\n\n      if (navigator.clipboard && window.isSecureContext) {\n        await navigator.clipboard.writeText(this.urlValue)\n        if (!this.isCurrentOperation(generation)) return\n\n        this.showCopied()\n        return\n      }\n\n      if (this.isCurrentOperation(generation)) this.promptToCopy()\n    } catch (error: unknown) {\n      if (\n        this.isCurrentOperation(generation) &&\n        !this.isAbortError(error)\n      ) {\n        this.promptToCopy()\n      }\n    }\n  }\n\n  private showCopied(): void {\n    this.element.dataset.state = 'copied'\n    this.statusTarget.textContent = 'Link copied'\n    this.resetTimer = window.setTimeout(() => this.resetFeedback(), 1600)\n  }\n\n  private resetFeedback(): void {\n    this.clearResetTimer()\n    this.element.dataset.state = 'idle'\n    this.statusTarget.textContent = ''\n  }\n\n  private cancelPendingOperation(): void {\n    this.operationGeneration += 1\n  }\n\n  private isCurrentOperation(generation: number): boolean {\n    return (\n      this.connected &&\n      this.element.isConnected &&\n      generation === this.operationGeneration\n    )\n  }\n\n  private clearResetTimer(): void {\n    if (this.resetTimer === null) return\n\n    window.clearTimeout(this.resetTimer)\n    this.resetTimer = null\n  }\n\n  private promptToCopy(): void {\n    window.prompt('Copy this link:', this.urlValue)\n  }\n\n  private isAbortError(error: unknown): boolean {\n    return (\n      typeof error === 'object' &&\n      error !== null &&\n      'name' in error &&\n      error.name === 'AbortError'\n    )\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller<HTMLElement> {\n  static targets = ['option']\n\n  declare readonly optionTargets: HTMLButtonElement[]\n\n  connect(): void {\n    const selected =\n      this.optionTargets.find((option) => option.getAttribute('aria-pressed') === 'true') ||\n      this.optionTargets[0]\n    if (selected) this.activate(selected, false)\n  }\n\n  select(event: Event): void {\n    const option = event.currentTarget\n    if (option instanceof HTMLButtonElement) this.activate(option, true)\n  }\n\n  navigate(event: KeyboardEvent): void {\n    const current = event.currentTarget\n    if (!(current instanceof HTMLButtonElement)) return\n\n    const currentIndex = this.optionTargets.indexOf(current)\n    if (currentIndex < 0) return\n\n    let nextIndex: number | null = null\n    switch (event.key) {\n      case 'ArrowLeft':\n      case 'ArrowUp':\n        nextIndex = (currentIndex - 1 + this.optionTargets.length) % this.optionTargets.length\n        break\n      case 'ArrowRight':\n      case 'ArrowDown':\n        nextIndex = (currentIndex + 1) % this.optionTargets.length\n        break\n      case 'Home':\n        nextIndex = 0\n        break\n      case 'End':\n        nextIndex = this.optionTargets.length - 1\n        break\n      default:\n        return\n    }\n\n    event.preventDefault()\n    if (nextIndex === null) return\n    const next = this.optionTargets[nextIndex]\n    next.focus()\n    next.click()\n  }\n\n  private activate(selectedOption: HTMLButtonElement, notify: boolean): void {\n    this.optionTargets.forEach((option) => {\n      const selected = option === selectedOption\n      option.setAttribute('aria-pressed', String(selected))\n      option.classList.toggle('current', selected)\n      option.dataset.state = selected ? 'selected' : 'unselected'\n    })\n\n    if (!notify) return\n    this.element.dispatchEvent(\n      new CustomEvent('vv:selectionchange', {\n        bubbles: true,\n        detail: { value: selectedOption.dataset.gauge || '' },\n      })\n    )\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\ntype StickyState = 'resting' | 'stuck'\n\nexport default class StickyHeaderController extends Controller<HTMLElement> {\n  private animationFrameId: number | null = null\n  private motionFrameId: number | null = null\n  private motionReadyFrameId: number | null = null\n\n  connect(): void {\n    this.restoreState()\n  }\n\n  disconnect(): void {\n    this.cancelScheduledUpdate()\n    this.cancelMotionEnable()\n  }\n\n  scheduleUpdate(): void {\n    if (this.animationFrameId !== null) return\n\n    this.animationFrameId = window.requestAnimationFrame(() => {\n      this.animationFrameId = null\n      this.syncState()\n    })\n  }\n\n  prepareForCache(): void {\n    this.cancelScheduledUpdate()\n    this.cancelMotionEnable()\n    this.setMotionEnabled(false)\n    this.setState('resting')\n  }\n\n  restoreState(): void {\n    this.cancelScheduledUpdate()\n    this.cancelMotionEnable()\n    this.setMotionEnabled(false)\n    this.syncState()\n    this.scheduleMotionEnable()\n  }\n\n  private syncState(): void {\n    const isStuck = window.scrollY > 0 && this.element.getBoundingClientRect().top <= 0\n    this.setState(isStuck ? 'stuck' : 'resting')\n  }\n\n  private setState(state: StickyState): void {\n    this.element.dataset.stickyState = state\n  }\n\n  private setMotionEnabled(enabled: boolean): void {\n    this.element.dataset.stickyMotion = enabled ? 'enabled' : 'disabled'\n  }\n\n  private scheduleMotionEnable(): void {\n    this.motionFrameId = window.requestAnimationFrame(() => {\n      this.motionFrameId = null\n      this.motionReadyFrameId = window.requestAnimationFrame(() => {\n        this.motionReadyFrameId = null\n        this.setMotionEnabled(true)\n      })\n    })\n  }\n\n  private cancelScheduledUpdate(): void {\n    if (this.animationFrameId === null) return\n\n    window.cancelAnimationFrame(this.animationFrameId)\n    this.animationFrameId = null\n  }\n\n  private cancelMotionEnable(): void {\n    if (this.motionFrameId !== null) {\n      window.cancelAnimationFrame(this.motionFrameId)\n      this.motionFrameId = null\n    }\n\n    if (this.motionReadyFrameId !== null) {\n      window.cancelAnimationFrame(this.motionReadyFrameId)\n      this.motionReadyFrameId = null\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller<HTMLElement> {\n  static targets = ['trigger', 'menu']\n\n  declare readonly triggerTarget: HTMLButtonElement\n  declare readonly menuTarget: HTMLElement\n\n  connect(): void {\n    this.close()\n  }\n\n  disconnect(): void {\n    this.close()\n  }\n\n  toggle(): void {\n    if (this.menuTarget.hidden) {\n      this.open()\n    } else {\n      this.close()\n    }\n  }\n\n  open(): void {\n    this.menuTarget.hidden = false\n    this.triggerTarget.setAttribute('aria-expanded', 'true')\n  }\n\n  close(): void {\n    this.menuTarget.hidden = true\n    this.triggerTarget.setAttribute('aria-expanded', 'false')\n  }\n\n  closeFromOutside(event: MouseEvent): void {\n    const target = event.target\n    if (target instanceof Node && !this.element.contains(target)) this.close()\n  }\n\n  closeFromFocus(event: FocusEvent): void {\n    const nextTarget = event.relatedTarget\n    if (nextTarget instanceof Node && this.element.contains(nextTarget)) return\n    this.close()\n  }\n\n  closeFromEscape(): void {\n    if (this.menuTarget.hidden) return\n\n    this.triggerTarget.focus()\n    this.close()\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport {\n  acquireVideoPlayback,\n  type VideoPlaybackLease,\n} from '../video_playback_session'\nimport { applyFullBleedPlayerVideoContract } from '../video_destination_contract'\n\ntype CaptionEntry = Readonly<{\n  clear?: unknown\n  ignore?: unknown\n  text?: unknown\n  t?: unknown\n  url?: unknown\n}>\n\n// Pending lazy activations are keyed by the permanent video element rather\n// than a controller instance. That lets the observer survive the transient\n// disconnect/reconnect cycle produced by a Turbo body replacement.\nconst pendingLazyActivations = new WeakMap<HTMLVideoElement, () => void>()\nlet sharedVideoObserver: IntersectionObserver | null = null\n\nfunction getSharedVideoObserver(): IntersectionObserver | null {\n  if (typeof IntersectionObserver === 'undefined') return null\n  if (sharedVideoObserver) return sharedVideoObserver\n\n  sharedVideoObserver = new IntersectionObserver(\n    (entries) => {\n      entries.forEach((entry) => {\n        if (!entry.isIntersecting) return\n\n        const video = entry.target as HTMLVideoElement\n        const activate = pendingLazyActivations.get(video)\n        sharedVideoObserver?.unobserve(video)\n        pendingLazyActivations.delete(video)\n        activate?.()\n      })\n    },\n    { root: null, rootMargin: '400px 0px', threshold: 0 }\n  )\n\n  return sharedVideoObserver\n}\n\nfunction registerLazyActivation(video: HTMLVideoElement, activate: () => void): void {\n  pendingLazyActivations.set(video, activate)\n  const observer = getSharedVideoObserver()\n  if (observer) {\n    observer.observe(video)\n  } else {\n    pendingLazyActivations.delete(video)\n    activate()\n  }\n}\n\nfunction unregisterLazyActivation(\n  video: HTMLVideoElement,\n  expectedActivation?: () => void\n): void {\n  if (\n    expectedActivation &&\n    pendingLazyActivations.get(video) !== expectedActivation\n  ) {\n    return\n  }\n\n  pendingLazyActivations.delete(video)\n  sharedVideoObserver?.unobserve(video)\n}\n\nfunction decodeCaptions(video: HTMLVideoElement): CaptionEntry[] {\n  const encoded = video.getAttribute('data-captions')?.replace(/\\s+/g, '') || ''\n  if (!encoded) return []\n\n  try {\n    const decoded: unknown = JSON.parse(atob(encoded))\n    return Array.isArray(decoded)\n      ? decoded.filter(\n          (entry: unknown): entry is CaptionEntry =>\n            entry !== null && typeof entry === 'object'\n        )\n      : []\n  } catch {\n    return []\n  }\n}\n\nfunction renderCaption(container: HTMLElement, entry: CaptionEntry | null): void {\n  const caption = container.querySelector<HTMLElement>('.video-caption')\n  if (!caption) return\n\n  caption.replaceChildren()\n  if (!entry) return\n\n  const text = typeof entry.text === 'string' ? entry.text : ''\n  const url = typeof entry.url === 'string' ? entry.url : ''\n  if (!text && !url) return\n\n  if (!url) {\n    caption.textContent = text\n    return\n  }\n\n  const link = document.createElement('a')\n  link.setAttribute('href', encodeURI(url))\n  link.target = '_blank'\n  link.rel = 'noopener'\n  link.textContent = text\n  caption.append(link)\n}\n\nfunction attachCaptionUpdater(\n  container: HTMLElement,\n  video: HTMLVideoElement,\n  signal: AbortSignal\n): void {\n  const items = decodeCaptions(video)\n    .map((entry) => ({ time: Number(entry.t), entry }))\n    .filter((item) => Number.isFinite(item.time))\n    .sort((left, right) => left.time - right.time)\n\n  if (items.length === 0 || !container.querySelector('.video-caption')) return\n\n  let lastDisplayed: CaptionEntry | null | undefined\n  const update = () => {\n    const time = video.currentTime || 0\n    let selected: CaptionEntry | undefined\n\n    for (const item of items) {\n      if (time + 0.0001 < item.time) break\n      selected = item.entry\n    }\n\n    if (!selected) return\n    if (\n      selected.ignore === true ||\n      (selected.clear !== true && selected.text == null && selected.url == null)\n    ) {\n      return\n    }\n\n    const normalized = selected.text || selected.url ? selected : null\n    if (lastDisplayed === normalized) return\n    renderCaption(container, normalized)\n    lastDisplayed = normalized\n  }\n\n  video.addEventListener('timeupdate', update, { signal })\n  video.addEventListener('loadedmetadata', update, { once: true, signal })\n  update()\n}\n\nfunction attachNativeControlsOnHover(video: HTMLVideoElement, signal: AbortSignal): void {\n  if (video.getAttribute('data-native-controls') !== 'hover') return\n\n  let hideTimer: number | null = null\n  const show = () => {\n    if (hideTimer !== null) {\n      window.clearTimeout(hideTimer)\n      hideTimer = null\n    }\n    video.controls = true\n    video.setAttribute('controls', '')\n  }\n  const hide = () => {\n    try {\n      if (video.matches(':hover') || document.activeElement === video) return\n    } catch {\n      // A detached permanent element cannot be matched; hide its controls.\n    }\n\n    video.controls = false\n    video.removeAttribute('controls')\n  }\n  const hideSoon = () => {\n    if (hideTimer !== null) window.clearTimeout(hideTimer)\n    hideTimer = window.setTimeout(() => {\n      hideTimer = null\n      hide()\n    }, 250)\n  }\n\n  hide()\n  video.addEventListener('pointerenter', show, { signal })\n  video.addEventListener('pointermove', show, { signal })\n  video.addEventListener('focus', show, { signal })\n  video.addEventListener('touchstart', show, { passive: true, signal })\n  video.addEventListener('pointerleave', hideSoon, { signal })\n  video.addEventListener('blur', hide, { signal })\n  signal.addEventListener(\n    'abort',\n    () => {\n      if (hideTimer !== null) window.clearTimeout(hideTimer)\n    },\n    { once: true }\n  )\n}\n\nexport default class VideoPlayerController extends Controller<HTMLElement> {\n  private playback: VideoPlaybackLease | null = null\n  private listeners: AbortController | null = null\n  private video: HTMLVideoElement | null = null\n  private lazyActivation: (() => void) | null = null\n  private videoObserver: MutationObserver | null = null\n  private bindTimer: number | null = null\n  private activationPending = false\n  private retryTimer: number | null = null\n  private retryAttempts = 0\n\n  connect(): void {\n    this.videoObserver = new MutationObserver(() => this.scheduleVideoBinding())\n    this.videoObserver.observe(this.element, { childList: true, subtree: true })\n    this.scheduleVideoBinding()\n  }\n\n  disconnect(): void {\n    this.videoObserver?.disconnect()\n    this.videoObserver = null\n    if (this.bindTimer !== null) window.clearTimeout(this.bindTimer)\n    this.bindTimer = null\n    this.releaseVideo()\n  }\n\n  private scheduleVideoBinding(): void {\n    if (this.bindTimer !== null) return\n\n    // Turbo can connect the non-permanent wrapper before Bardo has replaced\n    // its destination placeholder with the outgoing permanent video. Waiting\n    // one task, and observing later child replacement, ensures the lease is\n    // keyed to the final live element rather than the discarded placeholder.\n    this.bindTimer = window.setTimeout(() => {\n      this.bindTimer = null\n      this.bindCurrentVideo()\n    }, 0)\n  }\n\n  private bindCurrentVideo(): void {\n    const video = this.element.querySelector<HTMLVideoElement>('video')\n    if (!video) {\n      this.releaseVideo()\n      return\n    }\n    if (this.video === video && this.playback) {\n      this.retryPlaybackIfEligible()\n      return\n    }\n\n    this.releaseVideo()\n\n    this.video = video\n    unregisterLazyActivation(video)\n    applyFullBleedPlayerVideoContract(video, this.element)\n\n    // Preserve inline/autoplay eligibility before activation. Source\n    // attachment itself remains exclusively owned by the playback service.\n    video.setAttribute('playsinline', '')\n    video.setAttribute('webkit-playsinline', '')\n    if (video.hasAttribute('muted')) video.muted = true\n\n    this.listeners = new AbortController()\n    attachNativeControlsOnHover(video, this.listeners.signal)\n    attachCaptionUpdater(this.element, video, this.listeners.signal)\n    const retryPlayback = () => this.retryPlaybackIfEligible()\n    video.addEventListener('canplay', retryPlayback, { signal: this.listeners.signal })\n    video.addEventListener('loadeddata', retryPlayback, { signal: this.listeners.signal })\n    window.addEventListener('pageshow', retryPlayback, { signal: this.listeners.signal })\n    document.addEventListener(\n      'visibilitychange',\n      () => {\n        if (document.visibilityState === 'visible') retryPlayback()\n      },\n      { signal: this.listeners.signal }\n    )\n\n    this.playback = acquireVideoPlayback(video)\n\n    if (this.isNearViewport(video)) {\n      this.activatePlayback()\n      return\n    }\n\n    this.playback.deactivate()\n    this.lazyActivation = () => this.activatePlayback()\n    registerLazyActivation(video, this.lazyActivation)\n  }\n\n  private releaseVideo(): void {\n    this.listeners?.abort()\n    this.listeners = null\n\n    // Release without deactivating first. The service intentionally waits one\n    // macrotask before zero-owner cleanup so a Turbo destination can lease the\n    // same permanent media element and its live HLS MediaSource.\n    this.playback?.release()\n    this.playback = null\n    this.activationPending = false\n    this.retryAttempts = 0\n    if (this.retryTimer !== null) window.clearTimeout(this.retryTimer)\n    this.retryTimer = null\n\n    const video = this.video\n    const lazyActivation = this.lazyActivation\n    this.video = null\n    this.lazyActivation = null\n    if (video && lazyActivation) {\n      window.setTimeout(() => {\n        unregisterLazyActivation(video, lazyActivation)\n      }, 0)\n    }\n  }\n\n  // Action: data-action=\"video-player#enterFullscreen\"\n  enterFullscreen(): void {\n    const container = this.element\n    const video = container.querySelector<HTMLVideoElement>('video')\n    const target: Element = video || container\n\n    const requestFullscreen = (element: Element): Promise<void> => {\n      try {\n        if (element instanceof HTMLVideoElement) {\n          const webkitVideo = element as HTMLVideoElement & {\n            webkitEnterFullscreen?: () => void\n            webkitSupportsPresentationMode?: (mode: string) => boolean\n            webkitSetPresentationMode?: (mode: string) => void\n          }\n\n          if (\n            typeof webkitVideo.webkitSupportsPresentationMode === 'function' &&\n            typeof webkitVideo.webkitSetPresentationMode === 'function' &&\n            webkitVideo.webkitSupportsPresentationMode('fullscreen')\n          ) {\n            webkitVideo.webkitSetPresentationMode('fullscreen')\n            return Promise.resolve()\n          }\n\n          if (typeof webkitVideo.webkitEnterFullscreen === 'function') {\n            webkitVideo.webkitEnterFullscreen()\n            return Promise.resolve()\n          }\n        }\n      } catch {\n        // Fall through to the standard or prefixed element APIs.\n      }\n\n      const prefixedElement = element as Element & {\n        msRequestFullscreen?: () => Promise<void> | void\n        webkitRequestFullscreen?: () => Promise<void> | void\n      }\n      if (typeof element.requestFullscreen === 'function') return element.requestFullscreen()\n      if (typeof prefixedElement.webkitRequestFullscreen === 'function') {\n        return Promise.resolve(prefixedElement.webkitRequestFullscreen())\n      }\n      if (typeof prefixedElement.msRequestFullscreen === 'function') {\n        return Promise.resolve(prefixedElement.msRequestFullscreen())\n      }\n      return Promise.reject(new Error('Fullscreen not supported'))\n    }\n\n    void requestFullscreen(target)\n      .catch(() => {\n        if (target !== container) return requestFullscreen(container)\n        throw new Error('No alternate fullscreen target')\n      })\n      .catch(() => {\n        // Fullscreen requires browser support and a qualifying user gesture.\n      })\n  }\n\n  private activatePlayback(): void {\n    const playback = this.playback\n    if (this.activationPending || !playback) return\n\n    this.activationPending = true\n    void playback.activate().then((playing) => {\n      if (this.playback !== playback) return\n\n      this.activationPending = false\n      if (playing) {\n        this.retryAttempts = 0\n      } else {\n        this.schedulePlaybackRetry()\n      }\n    })\n  }\n\n  private retryPlaybackIfEligible(): void {\n    const video = this.video\n    if (!video || document.visibilityState !== 'visible' || !this.isNearViewport(video)) return\n\n    this.retryAttempts = 0\n    if (this.retryTimer !== null) window.clearTimeout(this.retryTimer)\n    this.retryTimer = null\n    this.activatePlayback()\n  }\n\n  private schedulePlaybackRetry(): void {\n    if (this.retryTimer !== null || this.retryAttempts >= 2) return\n    const video = this.video\n    if (!video || document.visibilityState !== 'visible' || !this.isNearViewport(video)) return\n\n    this.retryAttempts += 1\n    this.retryTimer = window.setTimeout(() => {\n      this.retryTimer = null\n      this.activatePlayback()\n    }, 100)\n  }\n\n  private isNearViewport(video: HTMLVideoElement): boolean {\n    const bounds = video.getBoundingClientRect()\n    const margin = 400\n    return bounds.top < window.innerHeight + margin && bounds.bottom > -margin\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class VideoScrubberController extends Controller<HTMLElement> {\n  static targets = ['video', 'range']\n\n  declare readonly videoTarget: HTMLVideoElement\n  declare readonly rangeTarget: HTMLInputElement\n\n  private metadataHandler: (() => void) | null = null\n\n  connect(): void {\n    const v = this.videoTarget\n    v.muted = true\n    v.setAttribute('muted', '')\n    v.setAttribute('playsinline', '')\n    v.setAttribute('webkit-playsinline', '')\n    v.preload = 'auto'\n    v.removeAttribute('autoplay')\n    try { v.pause() } catch { }\n\n    this.metadataHandler = () => {\n      const dur = isFinite(v.duration) && v.duration > 0 ? v.duration : 1\n      this.rangeTarget.min = '0'\n      this.rangeTarget.max = String(dur)\n      this.rangeTarget.step = String(Math.max(dur / 240, 0.001))\n      const startValue = parseFloat(this.rangeTarget.value)\n      if (!isFinite(startValue)) {\n        this.rangeTarget.value = '0'\n      }\n      try { v.currentTime = parseFloat(this.rangeTarget.value) || 0 } catch { }\n    }\n\n    if (v.readyState >= 1) {\n      this.metadataHandler()\n    } else {\n      v.addEventListener('loadedmetadata', this.metadataHandler, { once: true })\n    }\n\n    try { v.load() } catch { }\n  }\n\n  scrub(): void {\n    const t = parseFloat(this.rangeTarget.value)\n    if (isFinite(t)) {\n      try { this.videoTarget.currentTime = t } catch { }\n    }\n  }\n\n  disconnect(): void {\n    if (this.metadataHandler) {\n      this.videoTarget.removeEventListener('loadedmetadata', this.metadataHandler)\n      this.metadataHandler = null\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class ViewportVideoController extends Controller<HTMLElement> {\n  private observer: IntersectionObserver | null = null\n  private pageshowHandler: EventListener | null = null\n  private visibilityHandler: EventListener | null = null\n  private activeVideos = new Set<HTMLVideoElement>()\n  private initializedVideos = new WeakSet<HTMLVideoElement>()\n  private pendingLoads = new Map<HTMLVideoElement, () => void>()\n\n  connect(): void {\n    const videos = Array.from(this.element.querySelectorAll<HTMLVideoElement>('video'))\n    if (!videos.length) return\n\n    this.element.hidden = false\n    videos.forEach((video) => this.configureVideo(video))\n    if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n      this.element.hidden = true\n      return\n    }\n\n    if ('IntersectionObserver' in window) {\n      this.observer = new IntersectionObserver(\n        (entries) => {\n          entries.forEach((entry) => {\n            const video = entry.target as HTMLVideoElement\n            if (entry.isIntersecting) {\n              this.activeVideos.add(video)\n              this.loadAndPlay(video)\n            } else {\n              this.activeVideos.delete(video)\n              video.pause()\n            }\n          })\n        },\n        { root: null, rootMargin: '300px 0px', threshold: 0.01 }\n      )\n      videos.forEach((video) => this.observer?.observe(video))\n    } else {\n      videos.forEach((video) => {\n        this.activeVideos.add(video)\n        this.loadAndPlay(video)\n      })\n    }\n\n    this.pageshowHandler = () => {\n      this.activeVideos.forEach((video) => this.loadAndPlay(video))\n    }\n    window.addEventListener('pageshow', this.pageshowHandler)\n\n    this.visibilityHandler = () => {\n      if (document.visibilityState !== 'visible') return\n      this.activeVideos.forEach((video) => this.loadAndPlay(video))\n    }\n    document.addEventListener('visibilitychange', this.visibilityHandler)\n  }\n\n  disconnect(): void {\n    this.observer?.disconnect()\n    this.observer = null\n\n    if (this.pageshowHandler) {\n      window.removeEventListener('pageshow', this.pageshowHandler)\n      this.pageshowHandler = null\n    }\n    if (this.visibilityHandler) {\n      document.removeEventListener('visibilitychange', this.visibilityHandler)\n      this.visibilityHandler = null\n    }\n\n    this.pendingLoads.forEach((cleanup) => cleanup())\n    this.pendingLoads.clear()\n    this.activeVideos.forEach((video) => video.pause())\n    this.activeVideos.clear()\n  }\n\n  private configureVideo(video: HTMLVideoElement): void {\n    video.muted = true\n    video.setAttribute('muted', '')\n    video.setAttribute('playsinline', '')\n    video.setAttribute('webkit-playsinline', '')\n    video.setAttribute('loop', '')\n    video.setAttribute('preload', 'none')\n    video.removeAttribute('autoplay')\n  }\n\n  private loadAndPlay(video: HTMLVideoElement): void {\n    if (this.initializedVideos.has(video)) {\n      this.play(video)\n      return\n    }\n\n    this.initializedVideos.add(video)\n    video.load()\n\n    if (video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n      this.play(video)\n      return\n    }\n\n    let timeoutId: number | null = null\n    const cleanup = () => {\n      video.removeEventListener('loadeddata', onReady)\n      video.removeEventListener('canplay', onReady)\n      video.removeEventListener('loadedmetadata', onReady)\n      video.removeEventListener('error', onError)\n      if (timeoutId !== null) window.clearTimeout(timeoutId)\n      this.pendingLoads.delete(video)\n    }\n    const onReady = () => {\n      cleanup()\n      if (this.activeVideos.has(video)) this.play(video)\n    }\n    const onError = () => {\n      cleanup()\n      this.initializedVideos.delete(video)\n    }\n\n    this.pendingLoads.set(video, cleanup)\n    video.addEventListener('loadeddata', onReady)\n    video.addEventListener('canplay', onReady)\n    video.addEventListener('loadedmetadata', onReady)\n    video.addEventListener('error', onError, { once: true })\n    timeoutId = window.setTimeout(() => {\n      if (video.readyState >= HTMLMediaElement.HAVE_METADATA) onReady()\n    }, 2500)\n  }\n\n  private play(video: HTMLVideoElement): void {\n    video.play().catch(() => {\n      // Browsers may still decline muted autoplay; a later visibility event retries it.\n    })\n  }\n}\n","import { Application } from '@hotwired/stimulus'\nimport ButtonController from './controllers/button_controller'\nimport CarouselController from './controllers/carousel_controller'\nimport ClampListController from './controllers/clamp_list_controller'\nimport EmailFormController from './controllers/email_form_controller'\nimport FilmboxCharacteristicDetailsController from './controllers/filmbox_characteristic_details_controller'\nimport FilmboxFeatureGuideLinkController from './controllers/filmbox_feature_guide_link_controller'\nimport FooterCaliforniaLinkController from './controllers/footer_california_link_controller'\nimport GizmoScrubberController from './controllers/gizmo_scrubber_controller'\nimport HomepageHeroController from './controllers/homepage_hero_controller'\nimport LearnAsideController from './controllers/learn_aside_controller'\nimport LearnSearchController from './controllers/learn_search_controller'\nimport LearnTreeController from './controllers/learn_tree_controller'\nimport LensNodeProfileCarouselController from './controllers/lensnode_profile_carousel_controller'\nimport LooksPickerController from './controllers/looks_picker_controller'\nimport ProductMenuController from './controllers/product_menu_controller'\nimport ProductPrimaryActionController from './controllers/product_primary_action_controller'\nimport SelectionTabsController from './controllers/selection_tabs_controller'\nimport ShareActionController from './controllers/share_action_controller'\nimport SingleSelectController from './controllers/single_select_controller'\nimport StickyHeaderController from './controllers/sticky_header_controller'\nimport SubnavOverflowController from './controllers/subnav_overflow_controller'\nimport VideoPlayerController from './controllers/video_player_controller'\nimport VideoScrubberController from './controllers/video_scrubber_controller'\nimport ViewportVideoController from './controllers/viewport_video_controller'\n\n// Start Stimulus and register controllers here\nconst application = Application.start()\napplication.register('button', ButtonController)\napplication.register('carousel', CarouselController)\napplication.register('clamp-list', ClampListController)\napplication.register('email-form', EmailFormController)\napplication.register('footer-california-link', FooterCaliforniaLinkController)\napplication.register('gizmo-scrubber', GizmoScrubberController)\napplication.register('homepage-hero', HomepageHeroController)\napplication.register(\n  'filmbox-characteristic-details',\n  FilmboxCharacteristicDetailsController\n)\napplication.register('learn-aside', LearnAsideController)\napplication.register('filmbox-feature-guide-link', FilmboxFeatureGuideLinkController)\napplication.register('learn-search', LearnSearchController)\napplication.register('learn-tree', LearnTreeController)\napplication.register('lensnode-profile-carousel', LensNodeProfileCarouselController)\napplication.register('looks-picker', LooksPickerController)\napplication.register('product-menu', ProductMenuController)\napplication.register('product-primary-action', ProductPrimaryActionController)\napplication.register('selection-tabs', SelectionTabsController)\napplication.register('share-action', ShareActionController)\napplication.register('single-select', SingleSelectController)\napplication.register('sticky-header', StickyHeaderController)\napplication.register('subnav-overflow', SubnavOverflowController)\napplication.register('video-player', VideoPlayerController)\napplication.register('video-scrubber', VideoScrubberController)\napplication.register('viewport-video', ViewportVideoController)\n\nexport default application\n"],"file":"site.min.js"}