{
  "version": 3,
  "sources": ["/cdn/shop/t/19/assets/fizzy-pdp-hero.js?buy-once=20260911"],
  "sourcesContent": ["// FizzyIQ \u2014 PDP hero + buy box interactions\n// Ported from 02 PDP FizzyFocus v3.html. Self-initializes on DOMContentLoaded.\n(function () {\n  function init() {\n    var hero = document.getElementById('pdpHero');\n    if (!hero) return;\n\n    // Read the inert JSON once the deferred section script initializes.\n    // An absent/invalid payload clears any stale editor state and fails closed.\n    var stickPayload = document.getElementById('fizzy-pdp-stick');\n    window.__fizzyPdpStick = null;\n    if (stickPayload) {\n      try { window.__fizzyPdpStick = JSON.parse(stickPayload.textContent); }\n      catch (error) { console.error('[FizzyIQ] stick pack data unavailable'); }\n    }\n\n    // The real vendor iframe is present at parse time. Its ready handshake\n    // must work on preview URLs too, independently of the lower reviews widget.\n    (function initFrontrowBadge() {\n      var frame = hero.querySelector('#iframe-frontrow-quant');\n      if (!frame || frame.dataset.fizzyBound === 'true') return;\n      frame.dataset.fizzyBound = 'true';\n      var origin = 'https://app.thefrontrowhealth.com';\n      var loader = document.querySelector('script[data-fizzy-quant-loader]');\n      frame.dataset.frontrowState = 'loading';\n      function ready() {\n        // The frame owns the ready handshake. Do not gate this on the parent\n        // loader: a third-party storage/tracking error must not prevent the\n        // genuine badge document from initializing.\n        if (frame.isConnected && frame.contentWindow) {\n          frame.contentWindow.postMessage({ name: 'PARENT_READY' }, origin);\n        }\n      }\n      function onMessage(event) {\n        if (event.origin !== origin || event.source !== frame.contentWindow) return;\n        var data = event.data;\n        var name = typeof data === 'string' ? data : data && data.name;\n        if (name === 'QUANT_REQUEST_READY_STATUS') ready();\n        if (name === 'RESIZE_HEIGHT' && data && Number.isFinite(data.value) && data.value >= 20 && data.value <= 1000) {\n          frame.dataset.frontrowState = 'ready';\n          frame.style.height = data.value + 'px';\n          frame.style.display = 'block';\n        }\n      }\n      function onVendorLoad() {\n        loader.dataset.ready = 'true';\n        ready();\n      }\n      window.addEventListener('message', onMessage);\n      frame.addEventListener('load', ready);\n      if (!loader) {\n        loader = document.createElement('script');\n        loader.dataset.fizzyQuantLoader = 'true';\n        loader.src = origin + '/api/widgets/script?id=3096';\n        loader.defer = true;\n        loader.addEventListener('load', onVendorLoad, { once: true });\n        document.head.appendChild(loader);\n      } else if (loader.dataset.ready === 'true') {\n        ready();\n      } else {\n        loader.addEventListener('load', onVendorLoad, { once: true });\n      }\n    })();\n\n    // Keep the mobile header opaque only while it crosses the light purchase area.\n    var purchaseSurface = hero.querySelector('.pdp-purchase-surface');\n    var purchaseHeader = document.querySelector('.gh');\n    if (purchaseSurface && purchaseHeader) {\n      var purchaseMobile = window.matchMedia('(max-width: 820px)');\n      var purchaseFrame = 0;\n      function updatePurchaseHeader() {\n        purchaseFrame = 0;\n        var active = false;\n        if (purchaseMobile.matches && purchaseSurface.isConnected) {\n          var bounds = purchaseSurface.getBoundingClientRect();\n          var headerEdge = purchaseHeader.getBoundingClientRect().bottom;\n          active = bounds.top <= headerEdge && bounds.bottom > headerEdge;\n        }\n        document.body.classList.toggle('pdp-purchase-header', active);\n      }\n      function schedulePurchaseHeader() {\n        if (!purchaseFrame) purchaseFrame = requestAnimationFrame(updatePurchaseHeader);\n      }\n      window.addEventListener('scroll', schedulePurchaseHeader, { passive: true });\n      window.addEventListener('resize', schedulePurchaseHeader, { passive: true });\n      window.addEventListener('pageshow', schedulePurchaseHeader);\n      window.addEventListener('load', schedulePurchaseHeader);\n      purchaseMobile.addEventListener('change', schedulePurchaseHeader);\n      if ('ResizeObserver' in window) {\n        var purchaseResize = new ResizeObserver(schedulePurchaseHeader);\n        purchaseResize.observe(hero);\n        purchaseResize.observe(purchaseSurface);\n        purchaseResize.observe(purchaseHeader);\n      }\n      updatePurchaseHeader();\n    }\n\n    // \u2500\u2500 flavor catalog (label + short taste note) \u2500\u2500\n    var FLAV = {\n      bc: { name: 'Berry Cherry',        taste: 'Mixed berries with a tart cherry finish \u2014 bold, balanced, not too sweet.' },\n      sl: { name: 'Strawberry Lemonade', taste: 'Fresh strawberry meets bright lemonade \u2014 the sweet-tart classic kids ask for by name.' },\n      wm: { name: 'Watermelon',          taste: 'Crisp, lightly sweet watermelon \u2014 clean and naturally refreshing.' },\n      ob: { name: 'Orange Creamsicle',   taste: 'Bright orange citrus with a creamy finish \u2014 like a fizzy creamsicle, minus the sugar.' }\n    };\n\n    // Per-flavor hero videos (updated 2026-05-15 \u2014 compressed visualizer set).\n    var FLAVOR_VIDEO = {\n      bc: 'https://cdn.shopify.com/videos/c/o/v/6ea3ab5db29b47cda1308e50040a3e58.mp4',\n      sl: 'https://cdn.shopify.com/videos/c/o/v/8deb1650bf26476da5779c9a39acc01d.mp4',\n      wm: 'https://cdn.shopify.com/videos/c/o/v/d6004e1f825b4308b60f18c25b6c9b82.mp4',\n      ob: 'https://cdn.shopify.com/videos/c/o/v/ba8aa019128042e39419f1f364ac66e7.mp4'\n    };\n\n    // Per-flavor \"drink with benefits\" stills shown as carousel slide 1.\n    // The image swaps when the user previews a different flavor; the\n    // overlay icons + labels are static HTML (see fizzy-pdp-hero.liquid).\n    // Updated 2026-05-19 with refreshed Group_* art. Mapping confirmed\n    // by Sam: 725=BC, 731=SL, 732=WM, 730=OB.\n    var DRINK_BENEFITS_IMG = {\n      // Refreshed JPGs 2026-05-28 (v=1780002433) \u2014 same Group_* mapping\n      // (bc=725, sl=731, wm=732, ob=730), now in JPG format.\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/pdphero_keybenefits_newgray_berrycherry.jpg?v=1781239796&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/pdphero_keybenefits_newgray_strawberrylemonade.jpg?v=1781239793&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/pdphero_keybenefits_newgray_watermelon.jpg?v=1781239799&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/pdphero_keybenefits_newgray_orangecreamsicle.jpg?v=1781239797&width=1440'\n    };\n    // Slide 4 \u2014 flavor-aware deep-color drink backdrop for the\n    // \"Clinically Studied Ingredient Benefits\" composition. Cards +\n    // copy are HTML overlays in fizzy-pdp-hero.liquid; only the\n    // background image swaps src per flavor.\n    var CLINICAL_BG_IMG = {\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/berry2.png?v=1779059040&width=900',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/strawberry2.png?v=1779059034&width=900',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/watermelon2.png?v=1779059031&width=900',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/orange2.png?v=1779059037&width=900'\n    };\n    // Slide 7 \u2014 flavor-aware \"what's included\" composition on a\n    // hardcoded paper-cream background (set inline in the section\n    // markup). No HTML overlay \u2014 pure image swap per flavor.\n    var INCLUDED_IMG = {\n      // Refreshed JPGs 2026-05-28 (v=1780002435/6). 2026-05-30: BC\n      // reverted from hero_testimonial.jpg back to berrycherry3.jpg\n      // per Sam \u2014 the testimonial composition moved up to slide\n      // data-i=\"8\" for ALL flavors (no flavor-swap on that slide),\n      // and this slot is now the unified *3.jpg pouch composition.\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Rebranded_Berry_Cherry.jpg?v=1781237491&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Strawberry_Lemonade.jpg?v=1781237491&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Credibility_Watermelon.jpg?v=1781237491&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Rebranded_Image.jpg?v=1781237491&width=1440'\n    };\n    // Slide \u2014 flavor-aware lifestyle image. Each flavor gets its\n    // own kitchen-scene lifestyle photo tinted to the flavor's brand\n    // color. Swapped by applyFlavorLifestyleImage below; the thumb\n    // at #lifestyleThumbImg mirrors the main image. Added 2026-05-22.\n    var FLAVOR_LIFESTYLE_IMG = {\n      // Refreshed 2026-05-28 (v=1780002436) to the new \"Simple steps.\n      // Big Results.\" 4-image strip per flavor. Filenames are GUID-\n      // suffixed in Shopify Files to avoid collision with the legacy\n      // berry.jpg / strawberry.jpg / watermelon.jpg / orange.jpg.\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_How_to_Use_Berry_Cherry.jpg?v=1781237491&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_How_to_Use_Strawberry_Lemonade.jpg?v=1781237491&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/How_to_Use_New_Gray_Watermelon.jpg?v=1781237491&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_How_to_Use_Orange_Creamsicle.jpg?v=1781237491&width=1440'\n    };\n    // Slide \u2014 second flavor-aware lifestyle image. Inserted as the\n    // 3rd carousel slide (data-i=\"2\") on 2026-05-26 to give each\n    // flavor a second lifestyle showcase. Swapped by\n    // applyFlavorLifestyle2Image; thumb mirrored via #lifestyleThumbImg2.\n    var FLAVOR_LIFESTYLE2_IMG = {\n      // Refreshed 2026-05-28 (v=1780005532-56) \u2014 new \"All of the good\n      // stuff. None of the bad.\" flavor photography. Filenames are\n      // GUID-suffixed in Shopify Files to avoid collision with the\n      // legacy berry2.jpg / strawberry2.jpg / etc.\n      bc: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Trust_Badges_Berry_Cherry.jpg?v=1781237491&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Trust_Badges_Strawberry.jpg?v=1781237492&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Trust_Badges_Watermelon.jpg?v=1781237491&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0631/8915/5937/files/FizzyIQ_Trust_Badges_New_Gray_Orange.jpg?v=1781237491&width=1440'\n    };\n    // Slide 9 \u2014 flavor-aware Supplement Facts panel. Each variant\n    // has its own SFP rendered as a flat image (added 2026-05-19).\n    // Mapping confirmed by Sam: 18=SL, 21=BC, 19=OB, 16=WM.\n    var SFP_IMG = {\n      bc: 'https://cdn.shopify.com/s/files/1/0756/5194/0663/files/berrycherrySFP.jpg?v=1781291696&width=1440',\n      sl: 'https://cdn.shopify.com/s/files/1/0756/5194/0663/files/strawberrySFP.jpg?v=1781291700&width=1440',\n      wm: 'https://cdn.shopify.com/s/files/1/0756/5194/0663/files/watermelonSFP.jpg?v=1781291698&width=1440',\n      ob: 'https://cdn.shopify.com/s/files/1/0756/5194/0663/files/orangeSFP.jpg?v=1781291702&width=1440'\n    };\n\n    // Flavor grounds (Sam 2026-09-21): the gallery stills drawn on the flat\n    // grey ground have one version per flavor on that flavor's light ground,\n    // served as theme assets. Liquid writes the four URLs onto each <img> as\n    // data-ground-bc/sl/wm/ob; this reads them back as a flavor -> URL map.\n    function groundMap(el) {\n      if (!el || !el.dataset || !el.dataset.groundBc) return null;\n      var abs = function (u) { try { return new URL(u, window.location.href).href; } catch (e) { return u; } };\n      var d = el.dataset;\n      return { bc: abs(d.groundBc), sl: abs(d.groundSl), wm: abs(d.groundWm), ob: abs(d.groundOb) };\n    }\n\n    // \u2500\u2500 plan + pricing config \u2500\u2500\n    // Pricing is sourced from the product's live variant metadata (admin =\n    // single source of truth), injected as window.__fizzyPdpPrices by the\n    // section liquid. Values arrive in cents; compare-at drives \"was\" + save%.\n    var PLAN_MONTHS = { '1m': 1, '2m': 2, '3m': 3 };\n    function money(amount, decimals) {\n      if (typeof amount !== 'number' || !isFinite(amount)) return 'Unavailable';\n      return new Intl.NumberFormat(document.documentElement.lang || 'en-US', {\n        style: 'currency', currency: window.__fizzyPdpCurrency || 'USD',\n        minimumFractionDigits: decimals === true || amount % 1 ? 2 : 0,\n        maximumFractionDigits: 2\n      }).format(amount);\n    }\n    function unavailablePrice() {\n      return { price: null, was: 0, save_amt: 0, save_pct: 0, available: false };\n    }\n    function priceFromCents(cents, compare, available) {\n      if (!Number.isFinite(Number(cents)) || Number(cents) <= 0 || available === false) return unavailablePrice();\n      var price = Number(cents) / 100;\n      var was = Number(compare) > Number(cents) ? Number(compare) / 100 : 0;\n      return { price: price, was: was, save_amt: was ? was - price : 0,\n        save_pct: was ? Math.round((was - price) / was * 100) : 0, available: true };\n    }\n    function priceFor(age, plan) {\n      var tbl = window.__fizzyPdpPrices || {};\n      var src = tbl[age] && tbl[age][plan];\n      return src ? priceFromCents(src.price, src.was, src.available) : unavailablePrice();\n    }\n    var PLAN_LABELS = { '1m': 'Monthly', '2m': '2-month', '3m': '3-month' };\n    // Long-form plan strings written to cart line-item properties.\n    // Hoisted to module scope so both the ATC handler and the sticky\n    // ATC sync (syncStickyAtc) can read from one source of truth.\n    // 2026-05-30: 2-month restored alongside Monthly + 3-month.\n    var PLAN_PROPERTY = {\n      '1m': 'Monthly Delivery',\n      '2m': '2-month Delivery',\n      '3m': '3-month Delivery',\n      'stick15': 'Build your stickpack bundle'\n    };\n\n    var state = {\n      plan: '1m',\n      stickQuantity: 15,\n      /* Single age selection \u2014 8\u201313 (1 serving/day) or 14+ (2/day, the\n         adult dose). Simplified back from the household picker on\n         2026-06-03 per Sam. */\n      age: window.__fizzyPdpInitialAge === '14+' ? '14+' : '8-13',\n      // Flavors are chosen explicitly; the product preview never fills the box.\n      qty: { bc: 0, sl: 0, wm: 0, ob: 0 }\n    };\n    /* Bundle price for the selected age + plan (from live variant metadata).\n       Box mode: the price matrix is empty (Classic Box variants are titled by\n       size, not by age/plan strings), so read the size variant's price. */\n    // Stick packs share this builder and cart path, with their own parent/children.\n    function isStickPlan(plan) { return (plan || state.plan) === 'stick15'; }\n    function stickData() { return window.__fizzyPdpStick || {}; }\n    function stickSize(quantity) {\n      var size = Number(quantity || state.stickQuantity);\n      return [15, 30, 60].indexOf(size) !== -1 ? size : 15;\n    }\n    function stickDays(quantity) { return stickSize(quantity) === 15 ? 15 : 30; }\n    function stickPlanId(quantity) {\n      var map = stickData().planMap || {};\n      for (var name in map) {\n        if (new RegExp('(^|\\\\D)' + stickDays(quantity) + '\\\\s+days?(?![a-z])', 'i').test(name) && /^[1-9]\\d*$/.test(String(map[name]))) return map[name];\n      }\n      return null;\n    }\n    function stickVariant(quantity) {\n      var size = stickSize(quantity), data = stickData();\n      if (!data.enabled || !Array.isArray(data.variants)) return null;\n      return data.variants.find(function (v) {\n        return new RegExp('^' + size + '(?:\\\\s+(?:items|sticks))?$', 'i').test(String(v.option1).trim());\n      }) || null;\n    }\n    function stickChildFor(f) {\n      var map = stickData().childMap || {};\n      var names = {bc:'berrycherry',sl:'strawberrylemonade',wm:'watermelon',ob:'orangecreamsicle'};\n      for (var name in map) {\n        if (name.toLowerCase().replace(/[^a-z0-9]/g, '') !== names[f]) continue;\n        var value = map[name], id = value && typeof value === 'object' ? value.id : value;\n        if (!/^[1-9]\\d*$/.test(String(id))) return null;\n        return {id:id,option:name};\n      }\n      return null;\n    }\n    function stickPrice(quantity) {\n      var variant = stickVariant(quantity), plan = stickPlanId(quantity);\n      if (!variant || !plan || !['bc','sl','wm','ob'].every(stickChildFor)) return unavailablePrice();\n      var allocation = (variant.selling_plan_allocations || []).find(function (a) { return String(a.selling_plan_id) === String(plan); });\n      // Never substitute a parent price or another selling plan for this subscription.\n      return allocation ? priceFromCents(allocation.price, 0, variant.available) : unavailablePrice();\n    }\n    function quantityStep() { return isStickPlan() ? 3 : 1; }\n    function stickStock(f) {\n      var stock = stickData().childStock, child = stickChildFor(f);\n      if (!child) return 0;\n      if (!stock) return Infinity;\n      for (var name in stock) {\n        if (name.toLowerCase().replace(/[^a-z0-9]/g, '') === child.option.toLowerCase().replace(/[^a-z0-9]/g, '')) {\n          var value = Number(stock[name]);\n          return Number.isFinite(value) ? Math.max(0, value) : 0;\n        }\n      }\n      return Infinity;\n    }\n    function exactSelection() {\n      var req = required();\n      return req > 0 && selectedCount() === req && ['bc','sl','wm','ob'].every(function (f) {\n        var q = state.qty[f];\n        return Number.isInteger(q) && q >= 0 && (!isStickPlan() || q % 3 === 0) &&\n          (!q || (flavorAvail(f) && q <= flavorStock(f)));\n      });\n    }\n    function resetFlavorCounts() { ['bc','sl','wm','ob'].forEach(function (f) { state.qty[f] = 0; }); }\n\n    function boxPlanIdFor(age, plan) {\n      var days = PLAN_MONTHS[plan] * 30;\n      if (!days) return null;\n      var map = boxDataFor(age).planMap;\n      for (var name in map) {\n        if (new RegExp('(^|\\\\D)' + days + '(?!\\\\d)').test(name)) return map[name];\n      }\n      return null;\n    }\n    function regularTierPrice(plan) {\n      if (isStickPlan(plan)) return stickPrice();\n      if (!window.__fizzyPdpChildMap) return priceFor(state.age, plan);\n      var months = PLAN_MONTHS[plan];\n      var planId = boxPlanIdFor(state.age, plan);\n      if (!months || !planId) return unavailablePrice();\n      var size = months * (state.age === '14+' ? 2 : 1);\n      var list = boxDataFor(state.age).variants;\n      for (var i = 0; i < list.length; i++) {\n        var variant = list[i];\n        if (String(variant.option1).trim() !== String(size)) continue;\n        var cents = variant.price;\n        var allocations = variant.selling_plan_allocations || [];\n        var allocation = allocations.find(function (item) { return String(item.selling_plan_id) === String(planId); });\n        if (allocations.length && !allocation) return unavailablePrice();\n        if (allocation) cents = allocation.price;\n        // Intro pricing (Skio set price): strike the regular subscription price (variant price).\n        var p = priceFromCents(cents, allocation ? variant.price : variant.compare_at_price, variant.available);\n        var adj = allocation && allocation.price_adjustments;\n        if (p.available && adj && adj.length > 1 && Number(adj[1].price) > 0) p.renewal = Number(adj[1].price) / 100;\n        return p;\n      }\n      return unavailablePrice();\n    }\n    // Mirrors the automatic subscription discount; Shopify calculates checkout totals.\n    function octoberOfferActive() {\n      return false; // October 20%-every-box offer ended at the Oct 23 intro-pricing launch.\n    }\n    function tierPrice(plan) {\n      var p = regularTierPrice(plan);\n      if (!p.available || !octoberOfferActive()) return p;\n      var discounted = Math.round(p.price * 80) / 100;\n      if (isStickPlan(plan)) {\n        // Shopify's product discount truncates the discount to whole cents.\n        // Subtract that amount instead of rounding the final discounted price.\n        var cents = Math.round(p.price * 100);\n        discounted = (cents - Math.floor(cents * 20 / 100)) / 100;\n      }\n      return {price: discounted, was: p.price, save_amt: p.price - discounted, save_pct: 20, available: true};\n    }\n    function subscriptionRenewalText(plan) {\n      var regular = regularTierPrice(plan), offer = tierPrice(plan);\n      if (!regular.available || !offer.available) return 'Plan unavailable.';\n      var days = isStickPlan(plan) ? stickDays() : (PLAN_MONTHS[plan] || 1) * 30;\n      return octoberOfferActive()\n        ? money(offer.price) + ' every ' + days + ' days.'\n        : regular.renewal && regular.renewal !== regular.price\n          ? money(regular.price) + ' first box, then ' + money(regular.renewal) + ' every ' + days + ' days.'\n          : money(regular.price) + ' every ' + days + ' days.';\n    }\n    function stickRenewalText() { return subscriptionRenewalText('stick15'); }\n    function stickPlanLabel() { return stickSize() + '-stick bundle'; }\n    /* Cart line-item label for the chosen age. */\n    function ageLabel() { return state.age === '14+' ? 'Ages 14+' : 'Ages 8\u201313'; }\n    // Static Box mode (Skio): the child pouch product's variants, emitted by the\n    // section when box_child_product is set. Keys are the child's option strings;\n    // self-contained normalizer so 'Water Melon' and 'Watermelon' both resolve.\n    function boxChildFor(f) {\n      var cm = window.__fizzyPdpChildMap;\n      if (!cm) return null;\n      var names = { bc: 'berrycherry', sl: 'strawberrylemonade', wm: 'watermelon', ob: 'orangecreamsicle' };\n      var want = names[f];\n      for (var k in cm) {\n        if (String(k).toLowerCase().replace(/[^a-z0-9+]/g, '') === want) {\n          // Flat map (option string \u2192 variant id). Flat is required: nested JSON\n          // ends in '}}', which Shopify rejects as Liquid syntax in template\n          // settings. Object values still accepted for forward-compat.\n          var v = cm[k];\n          return (v && typeof v === 'object') ? v : { id: v, option: k };\n        }\n      }\n      return null;\n    }\n    // Resolve by age, independently of which product route rendered this page.\n    // Never substitute another age's variants or selling plans when data is absent.\n    function boxDataFor(age) {\n      var data = (window.__fizzyPdpBoxes || {})[age] || {};\n      return { variants: Array.isArray(data.variants) ? data.variants : [], planMap: data.planMap || {} };\n    }\n    // A flavor is in stock for the current age + plan if its bundle variant is\n    // available. Shopify computes that from the child SKU, so this reflects true\n    // stock. Fail open (treat as available) if the map is missing. Frontend only.\n    function flavorAvail(f, plan) {\n      if (isStickPlan(plan)) return !!stickChildFor(f) && stickStock(f) >= 3;\n      // Box mode: the box parent has no flavor axis, so stock lives on the\n      // child pouch variant itself. The child product is unpublished, so the\n      // section bridges its availability through the box product's\n      // fizzy.child_stock metafield (__fizzyPdpChildStock, keyed by the same\n      // option strings as the child map). Absent metafield = fail open.\n      if (window.__fizzyPdpChildMap) {\n        var c = boxChildFor(f);\n        if (!c) return true;\n        var st = window.__fizzyPdpChildStock;\n        if (st) {\n          var norm = function (s) { return String(s).toLowerCase().replace(/[^a-z0-9+]/g, ''); };\n          for (var sk in st) {\n            if (norm(sk) === norm(c.option)) return Number(st[sk]) > 0;\n          }\n        }\n        return c.available !== false;\n      }\n      var m = window.__fizzyPdpAvail, byAge = m && m[state.age], byPlan = byAge && byAge[typeof plan === 'string' ? plan : state.plan];\n      if (!byPlan) return true;\n      return byPlan[f] !== false;\n    }\n    // Remaining child stock for a flavor (box mode). The bundle builder caps\n    // each flavor's quantity at this number \u2014 1 unit left means at most 1 in\n    // the box. Infinity when the stock bridge is absent (fail open) or in\n    // legacy mode (parent variants gate availability wholesale there).\n    function flavorStock(f, plan) {\n      if (isStickPlan(plan)) return Math.floor(stickStock(f) / 3) * 3;\n      if (!window.__fizzyPdpChildMap || !window.__fizzyPdpChildStock) return Infinity;\n      var c = boxChildFor(f);\n      if (!c) return Infinity;\n      var norm = function (s) { return String(s).toLowerCase().replace(/[^a-z0-9+]/g, ''); };\n      for (var sk in window.__fizzyPdpChildStock) {\n        if (norm(sk) === norm(c.option)) {\n          var n = Number(window.__fizzyPdpChildStock[sk]);\n          return isNaN(n) ? Infinity : Math.max(0, n);\n        }\n      }\n      return Infinity;\n    }\n\n    var fields = hero.querySelectorAll('.flavor-field');\n    var eyebrowFlavor = document.getElementById('eyebrowFlavor');\n    var flavorNote = document.getElementById('flavorNote');\n    var heroSlide = document.getElementById('heroSlide');\n    var heroThumb = document.getElementById('heroThumb');\n    // Flavor switcher \u2014 4 colored dots + shared name label, anchored\n    // to the bottom-right of the visualizer (.pdp-flavor-overlay).\n    var previewPills = document.querySelectorAll('.pdp-flavor-overlay .pfo-dot');\n    var pfoName = document.getElementById('pfoName');\n    var current = 'bc';\n    // Ensure body carries the initial flavor class so the trust ticker\n    // (and any other body.flavor-* selectors) tint correctly on first paint.\n    document.body.classList.add('flavor-bc');\n    var animating = false;\n\n    // \u2500\u2500 flavor crossfade \u2500\u2500\n    // Helper: mirror the selected flavor class onto <body> so siblings of\n    // the hero (e.g. the trust ticker section below) can react to it.\n    function setBodyFlavor(f) {\n      var body = document.body;\n      body.classList.remove('flavor-bc', 'flavor-sl', 'flavor-wm', 'flavor-ob');\n      body.classList.add('flavor-' + f);\n    }\n\n    // \"Tastes like\" copy lives inside the .pdp-flavor-overlay pill at the\n    // top of the buy box (under the H1). The pill stacks the flavor name\n    // and the description on two lines. setTagline(f) is called from\n    // swapTo so the line tracks the active flavor without us having to\n    // wire a second source of truth. Source text comes from each .opt's\n    // data-desc attribute in the flavor picker.\n    var pfoTaste = document.getElementById('pfoTaste');\n    function setTagline(f) {\n      if (!pfoTaste) return;\n      var src = document.querySelector('.flavor-picker .opt[data-f=\"' + f + '\"]');\n      if (!src) return;\n      var desc = src.getAttribute('data-desc') || '';\n      if (pfoTaste.textContent === desc) return;\n      // Match the .pfo-name crossfade so the two lines feel like one\n      // unit when the flavor changes. The 280ms aligns to the CSS\n      // transition duration so the text swap lands exactly at opacity 0.\n      pfoTaste.classList.add('fading');\n      setTimeout(function () {\n        pfoTaste.textContent = desc;\n        pfoTaste.classList.remove('fading');\n      }, 280);\n    }\n\n    var settleTimer = 0;\n    function swapTo(f) {\n      /* No `animating` gate (Sam 2026-08-31: \"a bit of a delay when I try to\n         toggle through flavors\") \u2014 it silently dropped every tap inside the\n         previous swap's 950ms crossfade. Swaps are interruptible now; the\n         settle timer below is coalesced so only the last swap's tail runs. */\n      if (f === current) return;\n      // `current = f` runs at the TOP of the body now (was at the very\n      // end). Any downstream helper that reads `current` (syncStickyAtc,\n      // setTagline, etc.) needs the new flavor \u2014 having the assignment\n      // at the bottom meant those reads were always one tick behind,\n      // which left the sticky bar's active dot stuck on the previous\n      // flavor on every swap.\n      current = f;\n      hero.classList.add('transitioning');\n      // Body flavor class flips at the START so the ticker bg transition\n      // runs in parallel with the hero crossfade rather than after it.\n      setBodyFlavor(f);\n      // The optimized surfaces transition their own colors immediately; they\n      // must not wait for the legacy background crossfade to finish.\n      if (hero.classList.contains('pdp-purchase-optimized')) {\n        hero.classList.remove('flavor-bc', 'flavor-sl', 'flavor-wm', 'flavor-ob');\n        hero.classList.add('flavor-' + f);\n      }\n      // Sync the \"Tastes like\" line under the flavor grid to the new flavor.\n      setTagline(f);\n      // Layered crossfade on .flavor-field \u2014 the smooth 900ms transition.\n      // (Direct .pdp-hero.flavor-* class is updated at end of transition so\n      // there's no instant background \"jump\" before the fade completes.)\n      fields.forEach(function (el) { el.classList.toggle('active', el.dataset.f === f); });\n      if (eyebrowFlavor) {\n        eyebrowFlavor.classList.add('fading');\n        setTimeout(function () {\n          eyebrowFlavor.textContent = FLAV[f].name;\n          eyebrowFlavor.classList.remove('fading');\n        }, 300);\n      }\n      if (pfoName) {\n        // Swap at 280ms to match the .pfo-name CSS transition \u2014 the text\n        // changes exactly when opacity reaches 0, then fades + lifts back\n        // into place. Same timing used for .pfo-taste below.\n        pfoName.classList.add('fading');\n        setTimeout(function () {\n          pfoName.textContent = FLAV[f].name;\n          pfoName.classList.remove('fading');\n        }, 280);\n      }\n      if (flavorNote) {\n        flavorNote.classList.add('fading');\n        setTimeout(function () {\n          flavorNote.textContent = FLAV[f].taste;\n          flavorNote.classList.remove('fading');\n        }, 300);\n      }\n      if (heroSlide) heroSlide.dataset.f = f;\n      // (thumb image swap moved into applyFlavorVideo \u2014 no more inline\n      // gradient bg here since the thumb now always shows a pouch PNG.)\n      // sync the flavor-preview pills (under the title) to the new flavor\n      if (previewPills && previewPills.length) {\n        previewPills.forEach(function (p) { p.classList.toggle('active', p.dataset.f === f); });\n      }\n      applyFlavorVideo(f);\n      applyFlavorDrinkImage(f);\n      applyFlavorLifestyle2Image(f);\n      applyFlavorLifestyleImage(f);\n      applyFlavorClinicalImage(f);\n      applyFlavorIncludedImage(f);\n      applyFlavorSfpImage(f);\n      applyFlavorGround(f);\n      // Update the sticky-bar pouch thumb to the new active flavor.\n      // (Plan label + ATC text don't change on flavor swap, only the\n      // thumb \u2014 but syncStickyAtc handles all three idempotently.)\n      if (typeof syncStickyAtc === 'function') syncStickyAtc();\n      if (settleTimer) clearTimeout(settleTimer);\n      settleTimer = setTimeout(function () {\n        // After the crossfade completes, sync the direct .pdp-hero flavor\n        // class so the underlying background matches for the next interaction.\n        hero.classList.remove('flavor-bc', 'flavor-sl', 'flavor-wm', 'flavor-ob');\n        hero.classList.add('flavor-' + f);\n        hero.classList.remove('transitioning');\n        animating = false;\n      }, 950);\n      // (current = f was hoisted to the top of this function \u2014 see comment there.)\n    }\n\n    // \u2500\u2500 hero video state \u2500\u2500\n    var heroVideo = document.getElementById('heroVideo');\n    var heroVideoToggle = document.getElementById('heroVideoToggle');\n    var heroSlide = document.getElementById('heroSlide');\n    var userPausedHero = true;\n\n    // Product-image poster: the flavor's pouch shows under the hero video while\n    // that video loads / swaps, so sifting through flavors never shows a blank\n    // frame (Sam 2026-06-16). The cover-fit video fades in over it on .video-ready.\n    function setHeroPoster(f) {\n      var poster = document.getElementById('heroPoster');\n      if (!poster) return;\n      var pouch = document.querySelector('.flavor-picker .opt[data-f=\"' + f + '\"] .opt-pouch');\n      // Gallery posters need the original resolution; picker/thumb images stay small.\n      var heroImages = isStickPlan() && stickData().heroImages;\n      var source = (heroImages && heroImages[f]) || (pouch && pouch.src);\n      if (source && poster.getAttribute('src') !== source) poster.src = source;\n      if (FLAV[f]) poster.alt = 'FizzyFocus ' + FLAV[f].name + (isStickPlan() ? ' stick' : ' pouch');\n    }\n    function setHeroThumb(f) {\n      var thumbImg = document.getElementById('heroThumbImg');\n      var pouch = document.querySelector('.flavor-picker .opt[data-f=\"' + f + '\"] .opt-pouch');\n      if (thumbImg && pouch && thumbImg.src !== pouch.src) thumbImg.src = pouch.src;\n    }\n    function attachHeroReady(videoEl) {\n      if (!videoEl || !heroSlide) return;\n      // Reveal on every playback, including resume after showing the pouch.\n      var reveal = function () {\n        if (videoEl !== heroVideo || videoEl.paused) return;\n        heroSlide.classList.add('video-ready');\n      };\n      videoEl.addEventListener('playing', reveal);\n      if (!videoEl.paused && videoEl.readyState >= 2) reveal();\n    }\n    if (heroVideo) attachHeroReady(heroVideo);\n\n    function syncHeroToggleUI() {\n      if (!heroVideoToggle || !heroVideo) return;\n      var paused = heroVideo.paused;\n      if (paused && heroSlide) heroSlide.classList.remove('video-ready');\n      heroVideoToggle.classList.toggle('paused', paused);\n      heroVideoToggle.setAttribute('aria-label', paused ? 'Play video' : 'Pause video');\n    }\n    if (heroVideoToggle && heroVideo) {\n      heroVideoToggle.addEventListener('click', function (e) {\n        e.stopPropagation();\n        if (heroVideo.paused) {\n          userPausedHero = false;\n          heroVideo.play().catch(function () {});\n        } else {\n          userPausedHero = true;\n          heroVideo.pause();\n        }\n        syncHeroToggleUI();\n      });\n      heroVideo.addEventListener('play', syncHeroToggleUI);\n      heroVideo.addEventListener('pause', syncHeroToggleUI);\n    }\n\n    // \u2500\u2500 per-flavor video swap (with fade-out \u2192 swap \u2192 fade-in) \u2500\u2500\n    // Removing .has-video fades the current video to opacity 0 over 600ms.\n    // We swap src mid-fade and let .has-video re-add to fade in the new one.\n    // Swap the carousel slide 1 \"drink benefits\" image AND its matching\n    // thumbnail to the version for the currently-previewed flavor.\n    // Decoded async + opacity-faded so swaps are clean even on slower\n    // connections.\n    var drinkBenefitsImg = document.getElementById('drinkBenefitsImg');\n    var drinkBenefitsThumbImg = document.getElementById('drinkBenefitsThumbImg');\n    function applyFlavorDrinkImage(f) {\n      if (!DRINK_BENEFITS_IMG[f]) return;\n      var nextSrc = DRINK_BENEFITS_IMG[f];\n      // Thumb uses the same source \u2014 Shopify CDN width param could be\n      // smaller for the thumbnail but the browser caches the larger one\n      // anyway, so use the same URL.\n      if (drinkBenefitsThumbImg) drinkBenefitsThumbImg.src = nextSrc;\n      if (!drinkBenefitsImg) return;\n      if (drinkBenefitsImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        drinkBenefitsImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          drinkBenefitsImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            drinkBenefitsImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide \u2014 flavor-aware lifestyle image. Same swap strategy as\n    // applyFlavorDrinkImage above: preload the next src, fade the\n    // current <img> to 0, swap src, fade back. Thumb at\n    // #lifestyleThumbImg mirrors the main slide's source so the row\n    // beneath the carousel updates in lockstep.\n    var lifestyleImg = document.getElementById('lifestyleImg');\n    var lifestyleThumbImg = document.getElementById('lifestyleThumbImg');\n    FLAVOR_LIFESTYLE_IMG = groundMap(lifestyleImg) || FLAVOR_LIFESTYLE_IMG;\n    function applyFlavorLifestyleImage(f) {\n      if (!FLAVOR_LIFESTYLE_IMG[f]) return;\n      var nextSrc = FLAVOR_LIFESTYLE_IMG[f];\n      if (lifestyleThumbImg) lifestyleThumbImg.src = nextSrc;\n      if (!lifestyleImg) return;\n      if (lifestyleImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        if (current !== f) return; // a later preview won; don't show this late image\n        lifestyleImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          lifestyleImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            lifestyleImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide \u2014 second flavor-aware lifestyle image. Identical swap\n    // pattern to applyFlavorLifestyleImage; separate handles so the two\n    // lifestyle slides update independently on flavor change.\n    var lifestyleImg2 = document.getElementById('lifestyleImg2');\n    var lifestyleThumbImg2 = document.getElementById('lifestyleThumbImg2');\n    function applyFlavorLifestyle2Image(f) {\n      if (!FLAVOR_LIFESTYLE2_IMG[f]) return;\n      var nextSrc = FLAVOR_LIFESTYLE2_IMG[f];\n      if (lifestyleThumbImg2) lifestyleThumbImg2.src = nextSrc;\n      if (!lifestyleImg2) return;\n      if (lifestyleImg2.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        if (current !== f) return; // a later preview won; don't show this late image\n        lifestyleImg2.style.opacity = '0';\n        requestAnimationFrame(function () {\n          lifestyleImg2.src = nextSrc;\n          requestAnimationFrame(function () {\n            lifestyleImg2.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide 5 \u2014 flavor-aware clinical-benefits backdrop. Same swap\n    // strategy as applyFlavorDrinkImage above: preload the next src,\n    // fade the current <img> to 0, swap src, fade back. Background\n    // image is the only thing that changes between flavors \u2014 the\n    // title and frosted cards are static HTML overlays.\n    var clinicalBgImg = document.getElementById('clinicalBgImg');\n    var clinicalThumbImg = document.getElementById('clinicalThumbImg');\n    function applyFlavorClinicalImage(f) {\n      if (!CLINICAL_BG_IMG[f]) return;\n      var nextSrc = CLINICAL_BG_IMG[f];\n      if (clinicalThumbImg) clinicalThumbImg.src = nextSrc;\n      if (!clinicalBgImg) return;\n      if (clinicalBgImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        clinicalBgImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          clinicalBgImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            clinicalBgImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide 7 \u2014 flavor-aware \"what's included\" image. Same preload-\n    // then-fade-swap strategy as slides 1 + 4 above. Background of\n    // the slide itself is paper-cream (hardcoded inline in the\n    // section markup); only the product shot swaps per flavor.\n    var includedImg = document.getElementById('includedImg');\n    var includedThumbImg = document.getElementById('includedThumbImg');\n    INCLUDED_IMG = groundMap(includedImg) || INCLUDED_IMG;\n    function applyFlavorIncludedImage(f) {\n      if (!INCLUDED_IMG[f]) return;\n      var nextSrc = INCLUDED_IMG[f];\n      if (includedThumbImg) includedThumbImg.src = nextSrc;\n      if (!includedImg) return;\n      if (includedImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        if (current !== f) return; // a later preview won; don't show this late image\n        includedImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          includedImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            includedImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Slide 8 \u2014 flavor-aware Supplement Facts image. Same preload-\n    // then-fade-swap pattern as the included slide above.\n    var sfpImg = document.getElementById('sfpImg');\n    var sfpThumbImg = document.getElementById('sfpThumbImg');\n    function applyFlavorSfpImage(f) {\n      if (!SFP_IMG[f]) return;\n      var nextSrc = SFP_IMG[f];\n      if (sfpThumbImg) sfpThumbImg.src = nextSrc;\n      if (!sfpImg) return;\n      if (sfpImg.src === nextSrc) return;\n      var pre = new Image();\n      pre.onload = function () {\n        if (current !== f) return; // a later preview won; don't show this late image\n        sfpImg.style.opacity = '0';\n        requestAnimationFrame(function () {\n          sfpImg.src = nextSrc;\n          requestAnimationFrame(function () {\n            sfpImg.style.opacity = '';\n          });\n        });\n      };\n      pre.src = nextSrc;\n    }\n\n    // Stills with no flavor artwork of their own (benefits, stimulant\n    // comparison, nutrient forms) swap only their ground. Slides preload the\n    // next file first so the swap never shows a blank frame; thumbnails swap\n    // straight away. A late preload for a flavor no longer previewed is ignored.\n    var groundImgs = Array.prototype.slice.call(document.querySelectorAll('img[data-flavor-ground]'));\n    function applyFlavorGround(f) {\n      groundImgs.forEach(function (img) {\n        var map = groundMap(img);\n        var nextSrc = map && map[f];\n        if (!nextSrc || img.src === nextSrc) return;\n        if (img.closest('.pdp-thumbs')) { img.src = nextSrc; return; }\n        var pre = new Image();\n        pre.onload = function () { if (current === f) img.src = nextSrc; };\n        pre.src = nextSrc;\n      });\n    }\n\n    function applyFlavorVideo(f) {\n      if (!heroVideo || !heroSlide) return;\n      var stageEl = document.getElementById('pdpStage');\n      var src = FLAVOR_VIDEO[f];\n      setHeroPoster(f);\n\n      if (src) {\n        // Preserve the shopper\u2019s choice when the same flavor is already loaded.\n        if (heroVideo.dataset.src === src && heroSlide.classList.contains('has-video')) {\n          if (!userPausedHero && heroSlide.classList.contains('active')) {\n            heroVideo.play().catch(function () {});\n          } else { heroVideo.pause(); }\n          syncHeroToggleUI();\n          return;\n        }\n\n        // Replace the flavor video while preserving the shopper's playback\n        // choice. The matching pouch stays visible until the new video plays.\n        var oldVideo = heroVideo;\n        oldVideo.pause();\n        var newVideo = document.createElement('video');\n        newVideo.id = 'heroVideo';\n        newVideo.src = src;\n        newVideo.dataset.src = src;\n        newVideo.muted = true;\n        newVideo.loop = true;\n        newVideo.playsInline = true;\n        newVideo.preload = 'none';\n        newVideo.autoplay = false;\n        newVideo.addEventListener('play', syncHeroToggleUI);\n        newVideo.addEventListener('pause', syncHeroToggleUI);\n        oldVideo.parentNode.replaceChild(newVideo, oldVideo);\n        heroVideo = newVideo;\n        // Reveal only when this flavor starts playing, not while it buffers.\n        if (heroSlide) heroSlide.classList.remove('video-ready');\n        attachHeroReady(newVideo);\n        if (!userPausedHero && heroSlide.classList.contains('active')) {\n          heroVideo.play().catch(function () { syncHeroToggleUI(); });\n        }\n        if (!heroSlide.classList.contains('has-video')) {\n          heroSlide.classList.add('has-video');\n        }\n        if (stageEl && heroSlide.classList.contains('active')) {\n          stageEl.classList.add('show-video-toggle');\n        }\n        syncHeroToggleUI();\n      } else {\n        // No video for this flavor \u2014 pause and revert to fallback image\n        heroSlide.classList.remove('has-video');\n        if (stageEl) stageEl.classList.remove('show-video-toggle');\n        try { heroVideo.pause(); } catch (_) {}\n      }\n      // Thumbnail is now a static pouch <img> regardless of whether\n      // this flavor has a hero video \u2014 we no longer mirror the video\n      // into the thumb (which doubled the decoder workload). Pull the\n      // pouch URL straight from the matching flavor-picker tile so\n      // asset paths aren't duplicated in JS.\n      setHeroThumb(f);\n    }\n\n    // \u2500\u2500 gallery carousel (free scroll + thumb sync) \u2500\u2500\n    var stage = document.getElementById('pdpStage');\n    var track = document.getElementById('pdpTrack');\n    if (stage && track) {\n      var slides = track.querySelectorAll('.slide');\n      var thumbsEl = document.getElementById('pdpThumbs');\n      var thumbs = thumbsEl ? thumbsEl.querySelectorAll('.t') : [];\n      var counter = document.getElementById('pdpCounter');\n      var prevBtn = stage.querySelector('.arrow.prev');\n      var nextBtn = stage.querySelector('.arrow.next');\n      var slideIdx = 0;\n\n      function setActive(i) {\n        var total = slides.length;\n        slideIdx = Math.max(0, Math.min(total - 1, i));\n        thumbs.forEach(function (t, ix) {\n          t.classList.toggle('active', ix === slideIdx);\n          t.setAttribute('aria-pressed', ix === slideIdx ? 'true' : 'false');\n        });\n        slides.forEach(function (s, ix) { s.classList.toggle('active', ix === slideIdx); });\n        if (counter) counter.textContent = (slideIdx + 1) + ' / ' + total;\n\n        // play/pause hero video based on whether the product-video slide is active\n        if (heroVideo && heroSlide && heroSlide.classList.contains('has-video')) {\n          if (slides[slideIdx] === heroSlide) {\n            if (!userPausedHero) heroVideo.play().catch(function () {});\n          } else {\n            heroVideo.pause();\n          }\n        }\n        // show pause/play toggle only on hero slide when a video is loaded\n        stage.classList.toggle(\n          'show-video-toggle',\n          slides[slideIdx] === heroSlide && heroSlide && heroSlide.classList.contains('has-video')\n        );\n        // flavor preview pills are tied to the hero/product showcase slot \u2014\n        // hidden when the user has swiped to any marketing-still slide.\n        stage.classList.toggle('on-hero-slide', slides[slideIdx] === heroSlide);\n        // (Marketing-slide BC indigo lock removed \u2014 the section bg now\n        // stays in the active flavor color across all carousel slides.)\n        syncHeroToggleUI();\n\n        var activeThumb = thumbs[slideIdx];\n        var pointerDriven = window.matchMedia('(hover: hover) and (pointer: fine)').matches;\n        var keyboardInThumbs = thumbsEl && thumbsEl.contains(document.activeElement) && document.activeElement.matches(':focus-visible');\n        if (activeThumb && thumbsEl && (!pointerDriven || thumbsEl.matches(':hover') || keyboardInThumbs)) {\n          var tr = activeThumb.getBoundingClientRect();\n          var cr = thumbsEl.getBoundingClientRect();\n          /* Horizontal mode (default) \u2014 keep the active thumb in\n             view by adjusting scrollLeft. Vertical mode (\u22651500px)\n             does the same on scrollTop. Sam 2026-06-01: as the user\n             swipes the carousel, the strip auto-scrolls so the\n             active slide's indicator is always visible. */\n          var isVertical = getComputedStyle(thumbsEl).flexDirection === 'column';\n          if (isVertical) {\n            if (tr.top < cr.top) thumbsEl.scrollTop += tr.top - cr.top - 8;\n            else if (tr.bottom > cr.bottom) thumbsEl.scrollTop += tr.bottom - cr.bottom + 8;\n          } else {\n            if (tr.left < cr.left) thumbsEl.scrollLeft += tr.left - cr.left - 8;\n            else if (tr.right > cr.right) thumbsEl.scrollLeft += tr.right - cr.right + 8;\n          }\n        }\n      }\n\n      // Arrows, arrow keys and thumbnails set the slide at once, then scroll the\n      // track there. While that scroll is in flight the scroll handler must not\n      // re-derive the slide from the passing position, or .on-hero-slide (and\n      // the offer band keyed on it), the counter and the hero video flicker back\n      // and forth (2026-10-01). The guard clears when the track arrives, on\n      // scrollend, or after a fallback timeout that also re-syncs.\n      var navTarget = null;\n      var navTimer = null;\n      var reduceNav = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)');\n      function syncToTrack() {\n        var w = track.clientWidth;\n        if (w === 0) return;\n        var i = Math.round(track.scrollLeft / w);\n        if (i !== slideIdx) setActive(i);\n      }\n      function endNav() {\n        if (navTarget === null) return;\n        navTarget = null;\n        clearTimeout(navTimer);\n        // Re-sync only once the track rests on a slide; if it is still moving,\n        // the scroll handler takes over from here.\n        var w = track.clientWidth;\n        if (w > 0 && Math.abs(track.scrollLeft - Math.round(track.scrollLeft / w) * w) < 2) syncToTrack();\n      }\n      function goSlide(n) {\n        var total = slides.length;\n        var target = ((n % total) + total) % total;\n        navTarget = target;\n        clearTimeout(navTimer);\n        navTimer = setTimeout(endNav, 1500);\n        track.scrollTo({ left: target * track.clientWidth, behavior: reduceNav && reduceNav.matches ? 'auto' : 'smooth' });\n        setActive(target);\n      }\n\n      var scrollRaf = null;\n      track.addEventListener('scroll', function () {\n        if (scrollRaf) return;\n        scrollRaf = requestAnimationFrame(function () {\n          scrollRaf = null;\n          if (navTarget !== null) {\n            var w = track.clientWidth;\n            if (w > 0 && Math.round(track.scrollLeft / w) === navTarget && Math.abs(track.scrollLeft - navTarget * w) < 2) endNav();\n            return;\n          }\n          syncToTrack();\n        });\n      }, { passive: true });\n      track.addEventListener('scrollend', endNav);\n      // A drag takes over from any programmatic slide change.\n      track.addEventListener('pointerdown', function () { navTarget = null; clearTimeout(navTimer); });\n\n      if (thumbsEl) {\n        // Trackpad gestures may remain latched to their original scroll target\n        // after the pointer leaves. Never consume that wheel input in this rail.\n        thumbsEl.addEventListener('wheel', function (e) {\n          var rect = thumbsEl.getBoundingClientRect();\n          var inside = e.clientX >= rect.left && e.clientX < rect.right && e.clientY >= rect.top && e.clientY < rect.bottom;\n          if (!inside && e.cancelable) e.preventDefault();\n        }, { passive: false });\n        thumbsEl.addEventListener('click', function (e) {\n          var t = e.target.closest('.t');\n          if (!t || !thumbsEl.contains(t)) return;\n          var i = parseInt(t.dataset.i, 10);\n          if (Number.isFinite(i)) goSlide(i);\n        });\n      }\n\n      /* Vertical thumb strip (\u22651500px) \u2014 keep max-height locked to\n         the stage's actual rendered height so the strip never\n         extends past the carousel. Pure CSS can't read another\n         element's computed size, so a ResizeObserver handles it.\n         Sam 2026-06-01. */\n      /* Thumbnails are always a horizontal row below the gallery now\n         (vertical strip removed 2026-06-12) \u2014 clear any stale inline\n         max-height the old vertical-strip sync may have left behind. */\n      if (thumbsEl) thumbsEl.style.maxHeight = '';\n      if (prevBtn) prevBtn.addEventListener('click', function () { goSlide(slideIdx - 1); });\n      if (nextBtn) nextBtn.addEventListener('click', function () { goSlide(slideIdx + 1); });\n\n      stage.tabIndex = 0;\n      stage.addEventListener('keydown', function (e) {\n        if (e.key === 'ArrowLeft') { goSlide(slideIdx - 1); e.preventDefault(); }\n        if (e.key === 'ArrowRight') { goSlide(slideIdx + 1); e.preventDefault(); }\n      });\n\n      // drag-to-scroll on the main stage\n      var tD = null;\n      track.addEventListener('pointerdown', function (e) {\n        if (e.target.closest('.arrow')) return;\n        tD = { x: e.clientX, left: track.scrollLeft, moved: 0 };\n        track.setPointerCapture(e.pointerId);\n        track.classList.add('dragging');\n      });\n      track.addEventListener('pointermove', function (e) {\n        if (!tD) return;\n        var dx = e.clientX - tD.x;\n        tD.moved = Math.max(tD.moved, Math.abs(dx));\n        track.scrollLeft = tD.left - dx;\n      });\n      function endTD() {\n        if (!tD) return;\n        track.classList.remove('dragging');\n        var w = track.clientWidth;\n        if (w > 0) {\n          var i = Math.round(track.scrollLeft / w);\n          track.scrollTo({ left: i * w, behavior: 'smooth' });\n        }\n        tD = null;\n      }\n      track.addEventListener('pointerup', endTD);\n      track.addEventListener('pointercancel', endTD);\n\n      setActive(0);\n    }\n\n    // Initial flavor video \u2014 ensures JS state matches the DOM-rendered slide 0\n    applyFlavorVideo(current);\n\n    // \u2500\u2500 BUNDLE BUILDER \u2500\u2500\n    function required() {\n      if (isStickPlan()) return stickSize();\n      var months = PLAN_MONTHS[state.plan] || 1;\n      /* Pouches = months \u00D7 servings/day (8\u201313 = 1, 14+ = 2). */\n      var ageMult = state.age === '14+' ? 2 : 1;\n      return months * ageMult;\n    }\n    function selectedCount() {\n      return state.qty.bc + state.qty.sl + state.qty.wm + state.qty.ob;\n    }\n\n    // Quantity edits stay within the plan the shopper explicitly selected.\n    function canAddFlavor(f) {\n      var step = quantityStep();\n      return selectedCount() + step <= required() && tierPrice(state.plan).available &&\n        flavorAvail(f) && state.qty[f] + step <= flavorStock(f);\n    }\n    function quantityChanged() {\n      renderBundle();\n    }\n\n    // Re-render the tier card prices (.was, .price, .save) and the\n    // \"Buy once\" link price when state.age changes. Each .tier\n    // element has a data-plan attribute so we can look up the matching\n    // from live variant metadata. Called on initial render and on every age\n    // toggle (see age handler further down).\n    var optimizedPurchase = hero.classList.contains('pdp-purchase-optimized');\n    var purchaseBusy = false;\n\n    function renderStickSupply() {\n      hero.querySelectorAll('[data-stick-quantity]').forEach(function (option) {\n        var quantity = Number(option.dataset.stickQuantity);\n        var available = stickPrice(quantity).available;\n        var selected = quantity === stickSize();\n        option.classList.toggle('selected', selected);\n        option.setAttribute('aria-checked', selected ? 'true' : 'false');\n        option.setAttribute('aria-disabled', available ? 'false' : 'true');\n        option.setAttribute('aria-label', quantity + ' sticks' + (available ? '' : ', unavailable'));\n        option.disabled = !available || purchaseBusy;\n        option.tabIndex = selected && available ? 0 : -1;\n      });\n      hero.querySelectorAll('[data-stick-supply-options]').forEach(function (group) {\n        // Keep one available choice reachable if the selected size is unavailable.\n        if (!group.querySelector('[tabindex=\"0\"]')) {\n          var first = group.querySelector('[data-stick-quantity]:not(:disabled)');\n          if (first) first.tabIndex = 0;\n        }\n      });\n      hero.querySelectorAll('[data-stick-delivery]').forEach(function (label) {\n        label.textContent = 'Delivered every ' + stickDays() + ' days';\n      });\n    }\n\n    function resolveStickEntryQuantity() {\n      // Let shoppers enter through an available size without changing an\n      // already selected stick bundle or a valid remembered quantity.\n      if (isStickPlan() || stickPrice().available) return;\n      var available = [15, 30, 60].find(function (quantity) { return stickPrice(quantity).available; });\n      if (available) state.stickQuantity = available;\n    }\n\n    function renderTierPrices() {\n      resolveStickEntryQuantity();\n      renderStickSupply();\n      var offerActive = octoberOfferActive();\n      hero.classList.toggle('oct-active', offerActive);\n      /* Price + struck compare-at per tier, for the selected age. */\n      var tiers = document.querySelectorAll('.tier[data-plan]');\n      tiers.forEach(function (tier) {\n        var plan = tier.dataset.plan;\n        if (!plan) return;\n        var p = tierPrice(plan);\n        var offerBadge = tier.querySelector('.oct-price-badge');\n        if (offerBadge) offerBadge.hidden = !(!isStickPlan(plan) && p.available && p.was > p.price); // First-box price label on intro-priced pouch cards\n        var monthCount = PLAN_MONTHS[plan] || 1;\n        var pouchCount = monthCount * (state.age === '14+' ? 2 : 1);\n        var servingCount = isStickPlan(plan) ? stickSize() : pouchCount * 30;\n        var serving = tier.querySelector('[data-serving-price]');\n        if (serving) {\n          var showServing = p.available && p.price > 0 && servingCount > 0;\n          serving.hidden = !showServing;\n          serving.style.display = showServing ? '' : 'none';\n          serving.textContent = showServing ? money(p.price / servingCount, true) + '/serving' : '';\n        }\n        if (isStickPlan(plan)) {\n          var stickPriceEl = tier.querySelector('.price');\n          if (stickPriceEl) stickPriceEl.textContent = money(p.price);\n          var stickWasEl = tier.querySelector('.was');\n          if (stickWasEl) { stickWasEl.textContent = money(p.was); stickWasEl.hidden = !p.was; stickWasEl.style.display = p.was ? '' : 'none'; }\n          var sizeEl = tier.querySelector('[data-stick-size]');\n          if (sizeEl) sizeEl.textContent = stickSize() + ' sticks';\n          tier.setAttribute('aria-disabled', p.available ? 'false' : 'true');\n          return;\n        }\n        var pouchesEl = tier.querySelector('[data-plan-pouches]');\n        if (pouchesEl) pouchesEl.textContent = pouchCount + (pouchCount === 1 ? ' pouch' : ' pouches');\n        var wasEl = tier.querySelector('.was');\n        var priceEl = tier.querySelector('.price');\n        var saveEl = tier.querySelector('.save');\n        var chipEl = tier.querySelector('[data-save-chip]');\n        if (priceEl) priceEl.textContent = money(p.price);\n        tier.setAttribute('aria-disabled', p.available ? 'false' : 'true');\n        // Compare pouches with the same quantity bought once. This is display-only:\n        // p.was remains the regular subscription price for offer and renewal logic.\n        var onceUnit = Number(window.__fizzyPdpBoxOncePrice);\n        var COMPARE_TO_SUB_LIST = true; // false = strike through the one-time price ($80/$240) instead of the subscription list price ($59/$177)\n        var onceValue = COMPARE_TO_SUB_LIST ? p.was : Math.round(onceUnit * pouchCount * 100) / 100;\n        var showOnceValue = p.available && (COMPARE_TO_SUB_LIST || (Number.isFinite(onceUnit) && onceUnit > 0)) &&\n          Number.isFinite(onceValue) && onceValue > p.price;\n        var priceRail = tier.querySelector('.tier-price');\n        if (priceRail) priceRail.classList.toggle('has-once-value', !!(wasEl && showOnceValue));\n        if (wasEl) {\n          wasEl.classList.add('pdp-once-value');\n          wasEl.textContent = '';\n          if (showOnceValue) {\n            var onceLabel = document.createElement('span');\n            onceLabel.className = 'visually-hidden';\n            onceLabel.textContent = COMPARE_TO_SUB_LIST ? 'Regular price ' : 'One-time price ';\n            var onceAmount = document.createElement('span');\n            onceAmount.className = 'pdp-once-value-amount';\n            onceAmount.textContent = money(onceValue);\n            wasEl.appendChild(onceLabel);\n            wasEl.appendChild(onceAmount);\n          }\n          wasEl.hidden = !showOnceValue;\n          wasEl.style.display = showOnceValue ? '' : 'none';\n        }\n        if (saveEl) saveEl.textContent = 'Save ' + money(p.save_amt) + ' \u00B7 ' + p.save_pct + '%';\n        if (chipEl) { chipEl.textContent = 'SAVE ' + p.save_pct + '%'; chipEl.style.display = p.save_pct ? '' : 'none'; }\n      });\n      document.querySelectorAll('[data-once-count]').forEach(function (el) {\n        el.textContent = '1 pouch';\n      });\n      document.querySelectorAll('[data-once-serving]').forEach(function (el) {\n        var once = Number(window.__fizzyPdpBoxOncePrice);\n        el.textContent = once > 0 ? ' \u00B7 ' + money(once / 30, true) + '/serving' : '';\n      });\n      var boPrice = document.querySelector('.buy-once-link .bo-price');\n      if (boPrice) {\n        if (window.__fizzyPdpChildMap) {\n          // Box mode buy-once sells the child pouch DIRECTLY (no box, no\n          // _pv). The one-pouch shortcut always shows the unit price.\n          // Unit price comes from the\n          // section's box_once_price setting via __fizzyPdpBoxOncePrice.\n          var boUnit = Number(window.__fizzyPdpBoxOncePrice);\n          boPrice.textContent = boUnit > 0 ? money(boUnit) : 'price at checkout';\n        } else {\n          var once = priceFor('8-13', 'once');\n          boPrice.textContent = money(once.price);\n        }\n      }\n    }\n    document.addEventListener('fizzy:october-expired', function() {\n      renderTierPrices();\n      renderBundle();\n      syncStickyAtc();\n    });\n    // Render once on init so the page matches state.age on first paint.\n    renderTierPrices();\n\n    // Deep-link: ?flavor=bc|sl|wm|ob pre-selects (previews) that flavor on load\n    // \u2014 used by the home \"Best Sellers\" Learn more links. Sam 2026-06-09.\n    (function () {\n      var fp = (new URLSearchParams(window.location.search)).get('flavor');\n      if (fp && /^(bc|sl|wm|ob)$/.test(fp) && fp !== current) { swapTo(fp); }\n    })();\n\n    var bundleCounter = document.getElementById('bundleCounter');\n    var bundleProgress = document.getElementById('bundleProgress');\n    var addBtn = document.getElementById('addToCartBtn');\n\n    // \u2500\u2500 Sticky ATC element refs + sync \u2500\u2500\n    // Sync mirrors three things from the main buy box onto the sticky\n    // bar: the ATC's text + disabled state, the active plan label,\n    // and the pouch thumbnail. Called from renderBundle (whenever\n    // bundle/plan state changes) and from swapTo (whenever the active\n    // flavor changes), so the sticky bar never falls out of sync.\n    var stickyAtc        = document.getElementById('stickyAtc');\n    var stickyAtcBtn     = document.getElementById('stickyAtcBtn');\n    var stickyAtcThumb   = document.getElementById('stickyAtcThumb');\n    var stickyAtcPlan    = document.getElementById('stickyAtcPlan');\n    var stickyPlanTimer = 0;\n    var stickyAtcPrice   = document.getElementById('stickyAtcPrice');\n    var stickyAtcWas     = document.getElementById('stickyAtcWas');\n    var stickyAtcFlavorName = document.getElementById('stickyAtcFlavorName');\n    var stickyAtcDots    = document.querySelectorAll('#stickyAtcFlavors .sa-dot');\n    // Sticky button is a single-state \"Buy now\" scroll shortcut on\n    // every viewport \u2014 it never mirrors the main ATC's validation\n    // state. Tapping it smooth-scrolls the user up to the buy box\n    // where they can configure flavor + plan and then commit via the\n    // real ATC. Keeps the sticky bar as a \"get me back to where I can\n    // buy\" affordance rather than a parallel commit path.\n    /* Which side of the buy box the reader is on: 'ahead' (buy box still below\n       the fold), 'past' (scrolled beyond it), or null (buy box on screen, bar\n       hidden). Declared out here because syncStickyAtc runs on every bundle and\n       flavour change and would otherwise stamp the wrong label back on.\n       Sam 2026-08-28. */\n    var stickyMode = null;\n\n    /* The button has never added to cart \u2014 it smooth-scrolls to the buy box.\n       That was tolerable when the bar only appeared after you had already\n       passed the real Add to Cart; now that it also greets you on the way\n       down, a button reading \"Add to Cart\" that silently scrolls is a lie.\n       Name the action in the ahead state. */\n    /* Lowest daily cost for the selected age, using the plan-card prices. */\n    function lowestPerDay() {\n      var best = null;\n      ['1m', '3m'].forEach(function (plan) {\n        var p = tierPrice(plan);\n        if (!p.available) return;\n        var per = p.price / (PLAN_MONTHS[plan] * 30);\n        if (!best || per < best.per) best = { per: per, plan: plan, price: p.price, days: PLAN_MONTHS[plan] * 30 };\n      });\n      return best;\n    }\n\n    function stickyLabelFor(mode) {\n      if (optimizedPurchase) {\n        if (purchaseBusy) return 'Adding\u2026';\n        var chosen = tierPrice(state.plan);\n        if (!chosen.available) return 'Choose a plan &rarr;';\n        var complete = selectedCount() === required() && required() > 0;\n        return (complete ? 'Add to cart' : 'Choose flavors') + ' \u00B7 ' + money(chosen.price) + ' &rarr;';\n      }\n\n      var offer = lowestPerDay();\n      if (offer) return '<span>From ' + money(offer.per, true) + '/day &rarr;</span>';\n      return mode === 'ahead' ? 'Choose your plan &rarr;' : 'Select your plan &rarr;';\n    }\n\n    function renderPlanAvailability() {\n      var el = document.querySelector('[data-plan-notice]');\n      if (!el) return;\n      var available = tierPrice(state.plan).available;\n      el.hidden = available;\n      el.textContent = available ? '' : 'This plan is currently unavailable. Choose another age or plan.';\n    }\n\n    function syncStickyAtc() {\n      if (!stickyAtcBtn) return;\n      stickyAtcBtn.disabled = optimizedPurchase && purchaseBusy;\n      stickyAtcBtn.innerHTML = stickyLabelFor(stickyMode);\n      if (stickyAtcPlan) {\n        var planLabel = isStickPlan() ? stickPlanLabel() : PLAN_PROPERTY[state.plan] || PLAN_LABELS[state.plan] || '';\n        clearTimeout(stickyPlanTimer);\n        if (stickyAtcPlan.textContent !== planLabel) {\n          stickyAtcPlan.classList.add('fading');\n          stickyPlanTimer = setTimeout(function () {\n            stickyAtcPlan.textContent = planLabel;\n            stickyAtcPlan.classList.remove('fading');\n          }, 180);\n        } else { stickyAtcPlan.classList.remove('fading'); }\n      }\n      /* Price + compare-at \u2014 sourced from priceFor() (live variant metadata) so\n         the sticky stays in lockstep with the active age tier. */\n      var p = tierPrice(state.plan);\n      if (p && stickyAtcPrice) stickyAtcPrice.textContent = money(p.price);\n      if (p && stickyAtcWas) { stickyAtcWas.textContent = money(p.was); stickyAtcWas.hidden = !p.was; stickyAtcWas.style.display = p.was ? '' : 'none'; }\n      /* Active flavor name caption \u2014 pulled from the FLAV catalog so\n         it stays in sync with the previewed flavor (the source of\n         truth for the hero swap). */\n      if (stickyAtcFlavorName && FLAV[current]) {\n        stickyAtcFlavorName.textContent = FLAV[current].name;\n      }\n      if (stickyAtcThumb) {\n        var pouchEl = document.querySelector(\n          '.flavor-picker .opt[data-f=\"' + current + '\"] .opt-pouch'\n        );\n        if (pouchEl && stickyAtcThumb.src !== pouchEl.src) {\n          stickyAtcThumb.src = pouchEl.src;\n        }\n      }\n      // Mirror the active flavor onto the sticky's dot row so the\n      // paper ring follows whichever flavor is being previewed.\n      if (stickyAtcDots && stickyAtcDots.length) {\n        stickyAtcDots.forEach(function (d) {\n          d.classList.toggle('active', d.dataset.f === current);\n          /* The swatches carry no state for assistive tech otherwise \u2014 selection\n             was a class alone \u2014 and a sold-out swatch would swap the hero and\n             then silently skip the add. Both are announced now, and the\n             :disabled styling that already existed becomes reachable. */\n          /* `current`, not `f`. An earlier pass wrote `f` here, which does not\n             exist in this scope: syncStickyAtc() takes no argument. The\n             ReferenceError aborted init() partway \u2014 after the ATC and picker\n             handlers wired up but BEFORE the sticky-ATC mount, the member-gifts\n             modal and the accordion \u2014 so the sticky bar never appeared and\n             [data-mg-open] did nothing. Sam 2026-08-29. */\n          var on = d.getAttribute('data-f') === current;\n          d.setAttribute('aria-pressed', on ? 'true' : 'false');\n          var avail = typeof flavorAvail === 'function' ? flavorAvail(d.getAttribute('data-f')) : true;\n          /* Sold out still PREVIEWS (Sam 2026-08-31): the swatch swaps the\n             hero; only the add is blocked, by the click handler's own\n             flavorAvail guard. `disabled` killed the click entirely, which\n             dead-ended browsing whenever the whole lineup was out of stock. */\n          d.disabled = false;\n          d.classList.toggle('is-soldout', !avail);\n          var nm = (FLAV[d.getAttribute('data-f')] || {}).name || d.getAttribute('data-f');\n          d.setAttribute('aria-label', avail ? nm : nm + ', coming soon');\n      });\n      }\n    }\n\n    // Sticky swatches preview only; quantities belong to the picker steppers.\n    if (stickyAtcDots && stickyAtcDots.length) {\n      stickyAtcDots.forEach(function (dot) {\n        dot.addEventListener('click', function () {\n          var f = dot.dataset.f;\n          if (f) swapTo(f);\n        });\n      });\n    }\n\n    // All amounts come from the same live allocation resolver as Add to cart.\n    function renderPurchaseTerms() {\n      var p = tierPrice(state.plan);\n      var terms = hero.querySelector('[data-purchase-terms]');\n      var renewal = hero.querySelector('[data-purchase-renewal]');\n      var valid = p.available && p.price > 0;\n      if (terms) terms.hidden = !valid;\n      if (renewal) renewal.textContent = valid && !isStickPlan() ? subscriptionRenewalText(state.plan) : '';\n    }\n\n    function renderBundle() {\n      // Drop any flavor that's out of stock for the current age + plan before\n      // counting, so a sold-out flavor can't keep the bundle \"complete\" \u2014\n      // and clamp each flavor to its remaining child stock (1 left = max 1).\n      ['bc', 'sl', 'wm', 'ob'].forEach(function (f) {\n        if (state.qty[f] && !flavorAvail(f)) state.qty[f] = 0;\n        var cap = flavorStock(f);\n        if (state.qty[f] > cap) state.qty[f] = cap;\n      });\n      var req = required();\n      var cur = selectedCount();\n      var remaining = req - cur;\n      hero.classList.toggle('stick-mode', isStickPlan());\n      hero.dataset.purchasePlan = state.plan;\n      hero.dataset.stickDays = stickDays();\n      hero.dataset.stickQuantity = stickSize();\n      document.querySelectorAll('[data-stick-only]').forEach(function (el) { el.hidden = !isStickPlan(); });\n      document.querySelectorAll('[data-stick-target]').forEach(function (el) { el.textContent = stickSize(); });\n      document.querySelectorAll('[data-stick-renewal]').forEach(function (el) { el.textContent = stickRenewalText(); });\n      document.querySelectorAll('.flavor-picker .opt-pouch').forEach(function (img) {\n        if (!img.dataset.pouchSrc) { img.dataset.pouchSrc = img.getAttribute('src'); img.dataset.pouchAlt = img.alt; }\n        var tile = img.closest('.opt'), f = tile && tile.dataset.f;\n        var source = isStickPlan() && stickData().images ? stickData().images[f] : img.dataset.pouchSrc;\n        if (source && img.getAttribute('src') !== source) img.src = source;\n        img.alt = isStickPlan() ? (FLAV[f] || {}).name + ' FizzyFocus stick' : img.dataset.pouchAlt;\n      });\n      // A plan switch changes the format even before another flavor is previewed.\n      setHeroPoster(current);\n      setHeroThumb(current);\n      document.querySelectorAll('.flavor-help-mobile').forEach(function (help) {\n        help.textContent = isStickPlan() ? (cur === req ? 'Pack full. Remove 3 sticks to make room for another flavor.' : 'Tap a flavor or use + to add 3 sticks. Use Remove to take 3 out.') : req === 1\n          ? 'Tap a flavor to choose or switch your pouch.'\n          : cur === req\n            ? 'Box full. Tap any flavor to preview it. Remove a pouch to make room.'\n            : 'Tap a flavor to preview it and add a pouch. Use Remove to take one out.';\n      });\n\n      if (bundleCounter) {\n        bundleCounter.innerHTML = '<b>' + cur + '</b> of <b>' + req + '</b> ' + (isStickPlan() ? 'sticks picked' : 'selected');\n        bundleCounter.classList.toggle('complete', cur === req && req > 0);\n      }\n\n      if (bundleProgress) {\n        var pct = req > 0 ? Math.min(1, cur / req) : 0;\n        var fillEl = bundleProgress.querySelector('.fill');\n        if (fillEl) {\n          // transform: scaleX is GPU-composited \u2014 no layout/paint per\n          // frame the way `width` would. Smooth on Safari even with\n          // the header's backdrop-filter and ticker marquee running.\n          fillEl.style.transform = 'scaleX(' + pct + ')';\n        }\n        bundleProgress.classList.toggle('complete', cur === req && req > 0);\n      }\n\n      document.querySelectorAll('.flavor-picker .opt').forEach(function (opt) {\n        var f = opt.dataset.f;\n        var q = state.qty[f];\n        var soldOut = !flavorAvail(f);\n        var stepper = opt.querySelector('.stepper');\n        // Qty count lives between the +/- buttons inside the stepper now\n        // (previously was a corner badge \u2014 moved inline for readability).\n        var qtyEl = opt.querySelector('.stepper .qty');\n        if (qtyEl) qtyEl.textContent = q;\n        var flavorName = (FLAV[f] || {}).name || f;\n        ['inc','dec'].forEach(function (action) {\n          var button = stepper.querySelector('.' + action);\n          button.setAttribute('aria-label', (action === 'inc' ? 'Add ' : 'Remove ') + (isStickPlan() ? '3 ' : '') + flavorName + (isStickPlan() ? ' sticks' : ''));\n          var label = button.querySelector('.quantity-action');\n          if (label) label.textContent = (action === 'inc' ? ' Add' : ' Remove') + (isStickPlan() ? ' 3' : '');\n        });\n        stepper.querySelector('.dec').disabled = q <= 0;\n        var remove = opt.querySelector('.remove-btn');\n        if (remove) { remove.disabled = q <= 0; remove.setAttribute('aria-label', 'Remove ' + (isStickPlan() ? '3 ' : 'one ') + flavorName + (isStickPlan() ? ' sticks' : '')); remove.textContent = isStickPlan() ? 'Remove 3' : 'Remove'; }\n        stepper.querySelector('.inc').disabled = !canAddFlavor(f);\n        opt.classList.toggle('soldout', soldOut);\n        /* Sold-out was drawn only by a ::after label. Generated content is not\n           reliably exposed to assistive tech and carries no accessible name, so\n           the state was visual-only. State it on the tile as well.\n           Sam 2026-08-29. */\n        opt.setAttribute('aria-disabled', soldOut ? 'true' : 'false');\n        var soName = (FLAV[f] || {}).name || f;\n        opt.setAttribute('aria-label', soldOut ? soName + ', coming soon' : soName + ', ' + q + (isStickPlan() ? ' sticks in your pack' : ' in your box'));\n        // Mobile-only corner badge mirrors the same count \u2014 it's\n        // hidden via .has-qty (opacity 0/1) so the badge fades in\n        // when the flavor enters the bundle and out when it leaves.\n        var badgeEl = opt.querySelector('.opt-badge');\n        if (badgeEl) badgeEl.textContent = q;\n        opt.classList.toggle('selected', q > 0);\n        opt.classList.toggle('has-qty', q > 0);\n      });\n\n      if (addBtn) {\n        var p = tierPrice(state.plan);\n        if (!p.available) {\n          addBtn.disabled = true;\n          addBtn.textContent = 'Plan unavailable';\n        } else if (req === 0) {\n          addBtn.disabled = true;\n          addBtn.textContent = 'Select a plan';\n        } else if (!exactSelection()) {\n          addBtn.disabled = true;\n          addBtn.textContent = isStickPlan() ? (remaining > 0 ? 'Choose ' + remaining + ' more sticks' : 'Choose exactly ' + req + ' sticks') : cur === 0 ? 'Choose your flavors' : remaining === 1\n            ? 'Add 1 more pouch to continue'\n            : 'Add ' + remaining + ' more pouches to continue';\n        } else {\n          addBtn.disabled = false;\n          addBtn.textContent = 'Add to cart \u00B7 ' + money(p.price);\n        }\n      }\n      if (purchaseBusy && addBtn) { addBtn.disabled = true; addBtn.textContent = 'Adding\u2026'; }\n      renderPurchaseTerms();\n      renderPlanAvailability();\n      // Mirror the latest ATC state to the sticky bar at the very end \u2014\n      // captures both the text/disabled changes above AND any state.plan\n      // change that came in via the tier click handler.\n      syncStickyAtc();\n    }\n\n    // Steppers change only the bundle quantity on every viewport.\n    document.querySelectorAll('.flavor-picker .stepper').forEach(function (st) {\n      var f = st.dataset.f;\n      st.querySelector('.inc').addEventListener('click', function (e) {\n        e.stopPropagation();\n        if (!canAddFlavor(f)) return;\n        state.qty[f] += quantityStep();\n        quantityChanged();\n      });\n      st.querySelector('.dec').addEventListener('click', function (e) {\n        e.stopPropagation();\n        if (state.qty[f] <= 0) return;\n        state.qty[f] = Math.max(0, state.qty[f] - quantityStep());\n        quantityChanged();\n      });\n    });\n\n    // Every card previews; a one-pouch plan switches directly to that flavor.\n    document.querySelectorAll('.flavor-picker .opt').forEach(function (o) {\n      o.addEventListener('click', function (e) {\n        if (e.target.closest('.stepper, .remove-btn')) return;\n        var f = o.dataset.f;\n        swapTo(f);\n        if (purchaseBusy) return;\n        if (required() === 1) {\n          if (!tierPrice(state.plan).available || !flavorAvail(f) || flavorStock(f) < 1) return;\n          Object.keys(state.qty).forEach(function (key) { state.qty[key] = key === f ? 1 : 0; });\n          quantityChanged();\n        } else if (window.matchMedia('(max-width: 820px)').matches && canAddFlavor(f)) {\n          state.qty[f] += quantityStep();\n          quantityChanged();\n        }\n      });\n    });\n\n    // Mobile-only Remove button \u2014 single-action equivalent of the\n    // .stepper's [\u2212] button. Decrement by 1, no-op when already at 0.\n    // e.stopPropagation prevents the tile click from also firing\n    // (which would add 1 back via the handler above).\n    document.querySelectorAll('.flavor-picker .remove-btn').forEach(function (btn) {\n      btn.addEventListener('click', function (e) {\n        e.stopPropagation();\n        var f = btn.dataset.f;\n        if (state.qty[f] <= 0) return;\n        state.qty[f] = Math.max(0, state.qty[f] - quantityStep());\n        quantityChanged();\n      });\n    });\n\n    // Flavor preview pills under the H1 \u2014 same preview behavior, no bundle impact.\n    previewPills.forEach(function (p) {\n      p.addEventListener('click', function () {\n        swapTo(p.dataset.f);\n      });\n    });\n\n    // Deep link: ?variant=wm / ?flavor=watermelon (mobile-menu flavor links)\n    // previews that flavor on load. Preview only \u2014 nothing added to the bundle.\n    (function () {\n      try {\n        var q = new URLSearchParams(window.location.search);\n        var raw = (q.get('flavor') || q.get('variant') || '').toLowerCase();\n        if (!raw) return;\n        var MAP = {\n          bc: 'bc', sl: 'sl', wm: 'wm', ob: 'ob',\n          'berry-cherry': 'bc', 'berrycherry': 'bc', 'berry': 'bc',\n          'strawberry-lemonade': 'sl', 'strawberrylemonade': 'sl', 'strawberry': 'sl',\n          'watermelon': 'wm', 'water-melon': 'wm',\n          'orange-creamsicle': 'ob', 'orangecreamsicle': 'ob', 'orange': 'ob'\n        };\n        var f = MAP[raw];\n        if (f) swapTo(f);\n      } catch (e) {}\n    })();\n\n    /* Keeps a radiogroup's ARIA and roving tabindex in step with the .selected\n       class, and gives it arrow-key operation. The age and plan pickers are\n       divs with click listeners; marking them up as radios without this would\n       announce a group nobody can move through. Added 2026-08-28. */\n    function wireRadioGroup(nodes, onPick) {\n      if (!nodes || !nodes.length) return;\n      var list = Array.prototype.slice.call(nodes);\n      function sync(chosen) {\n        list.forEach(function (n) {\n          var on = n === chosen;\n          n.setAttribute('aria-checked', on ? 'true' : 'false');\n          n.tabIndex = on ? 0 : -1;\n        });\n      }\n      list.forEach(function (n, i) {\n        n.addEventListener('keydown', function (e) {\n          var k = e.key, step = 0;\n          if (k === 'ArrowRight' || k === 'ArrowDown') step = 1;\n          else if (k === 'ArrowLeft' || k === 'ArrowUp') step = -1;\n          else if (k === ' ' || k === 'Enter') { e.preventDefault(); n.click(); return; }\n          else return;\n          e.preventDefault();\n          var next = list[(i + step + list.length) % list.length];\n          var visited = 0;\n          while (next.getAttribute('aria-disabled') === 'true' && visited++ < list.length) next = list[(list.indexOf(next) + step + list.length) % list.length];\n          if (next.getAttribute('aria-disabled') !== 'true') { next.focus(); next.click(); }\n        });\n      });\n      /* The click handlers already toggle .selected, so mirror from there\n         rather than duplicating the selection logic. */\n      list.forEach(function (n) {\n        n.addEventListener('click', function () { if (purchaseBusy || n.getAttribute('aria-disabled') === 'true') return; sync(n); if (onPick) onPick(n); });\n      });\n      sync(list.filter(function (n) { return n.classList.contains('selected'); })[0] || list[0]);\n    }\n\n    // Plan tier selection \u2014 just toggle .selected and update state.\n    var tiers = document.querySelectorAll('.tier');\n    tiers.forEach(function (t) {\n      t.addEventListener('click', function () {\n        if (!tierPrice(t.dataset.plan).available || purchaseBusy) return;\n        var wasStick = isStickPlan();\n        tiers.forEach(function (x) { x.classList.toggle('selected', x === t); });\n        state.plan = t.dataset.plan;\n        if (wasStick !== isStickPlan()) resetFlavorCounts();\n        trimToRequired();\n        renderTierPrices();\n        renderBundle();\n      });\n    });\n\n    // Sample-pack button (inside the .pdp-flavor-overlay preview pill).\n    /* Sample-kit clicks are handled site-wide by initSampleKitTriggers() in\n       fizzy-header.js (Sam 2026-09-04) so every entry point behaves the same\n       and the anchor's navigation is cancelled. The per-element binding that\n       used to live here has been removed to avoid opening the form twice. */\n\n    /* \u2500\u2500 Age picker (single select) \u2500\u2500\n       8\u201313 or 14+ (the adult dose). Drives required() pouches + tier\n       pricing. Simplified back from the household picker 2026-06-03. */\n    /* Display only: 14+ takes 2 servings/day, so each plan covers the same\n       window with double the servings \u2014 show 60/120/180 instead of 30/60/90.\n       The shipping cadence (every 30/60/90 days) is unchanged. */\n    function renderServings() {\n      var mult = state.age === '14+' ? 2 : 1;\n      document.querySelectorAll('.tnote-srv').forEach(function (el) {\n        var base = parseInt(el.dataset.srv, 10) || 0;\n        el.textContent = base * mult;\n      });\n    }\n\n    hero.querySelectorAll('[data-stick-supply-options]').forEach(function (group) {\n      var options = group.querySelectorAll('[data-stick-quantity]');\n      options.forEach(function (option) {\n        option.addEventListener('click', function () {\n          var quantity = Number(option.dataset.stickQuantity);\n          if (purchaseBusy || !isStickPlan() || !stickPrice(quantity).available) return;\n          state.stickQuantity = quantity;\n          trimToRequired();\n          renderTierPrices();\n          renderBundle();\n        });\n      });\n      wireRadioGroup(options);\n    });\n\n    wireRadioGroup(document.querySelectorAll('.plans .tier'));\n\n    var ageOpts = document.querySelectorAll('.age-picker .opt');\n    ageOpts.forEach(function (a) {\n      a.addEventListener('click', function () {\n        if (purchaseBusy) return;\n        ageOpts.forEach(function (x) { x.classList.toggle('selected', x === a); });\n        state.age = a.dataset.age;\n        renderServings();\n        renderTierPrices();\n        trimToRequired();\n        renderBundle();\n      });\n    });\n    wireRadioGroup(ageOpts);\n    renderServings();\n\n    function trimToRequired() {\n      var req = required();\n      var cur = selectedCount();\n      if (cur <= req) return;\n      var step = quantityStep();\n      while (cur > req) {\n        var order = ['bc', 'sl', 'wm', 'ob']\n          .filter(function (f) { return state.qty[f] >= step; })\n          .sort(function (a, b) { return isStickPlan() ? state.qty[b] - state.qty[a] : state.qty[a] - state.qty[b]; });\n        if (!order.length) break;\n        state.qty[order[0]] -= step;\n        cur -= step;\n      }\n    }\n\n    if (addBtn) {\n      // Plan \u2192 human-readable property string that lands in the cart drawer chip\n      // (PLAN_PROPERTY hoisted to module scope above so syncStickyAtc\n      // can read it too \u2014 see the top of init().)\n      // Long-form flavor name written to line-item properties (drawer reads\n      // this to pick the swatch + pouch image via FLAVOR_MAP).\n      var FLAVOR_NAME = {\n        bc: 'Berry Cherry',\n        sl: 'Strawberry Lemonade',\n        wm: 'Watermelon',\n        ob: 'Orange Creamsicle'\n      };\n      // Canonical option strings for resolving the parent bundle variant.\n      // Matching is whitespace/case-insensitive so the same code runs on the\n      // dev store (\"Watermelon\") and production (\"Water Melon\"); the Flavor 1..N\n      // line-item properties always use the STORE's exact option string, since\n      // the production bundle app matches on them.\n      var FLAVOR_OPTION = { bc: 'Berry Cherry', sl: 'Strawberry Lemonade', wm: 'Water Melon', ob: 'Orange Creamsicle' };\n      var QTY_OPTION = { '1m': '1 Month Supply', '2m': '2 Month Supply', '3m': '3 Month Supply', 'once': 'Try It Once' };\n      function normOpt(s) { return String(s == null ? '' : s).toLowerCase().replace(/[^a-z0-9+]/g, ''); }\n      function pdpVariant(flavorParam, age, plan) {\n        if (isStickPlan(plan)) return stickVariant();\n        var list = window.__fizzyPdpVariants || [];\n        if (window.__fizzyPdpChildMap) {\n          // Skio Classic Box product: ONE option (\"Size\"), values \"1\"/\"2\"/\"3\"\u2026\n          // The variant is the pouch COUNT; age/plan only decide which count \u2014\n          // and the AGE decides which box product's variants to search (8-13 =\n          // rendered product, 14+ = the alt box emitted by the section).\n          var months = plan === 'once' ? 1 : parseInt(plan, 10) || 1;\n          var size = months * (age === '14+' ? 2 : 1);\n          var boxList = boxDataFor(age).variants;\n          for (var b = 0; b < boxList.length; b++) {\n            if (String(boxList[b].option1).trim() === String(size)) return boxList[b];\n          }\n          return null;\n        }\n        var a = normOpt(age === '14+' ? 'Ages 14+' : 'Ages 8-13');\n        var q = normOpt(QTY_OPTION[plan]);\n        for (var i = 0; i < list.length; i++) {\n          var v = list[i];\n          if (normOpt(v.option1) === normOpt(FLAVOR_OPTION[flavorParam]) && normOpt(v.option2) === a && normOpt(v.option3) === q) {\n            return v;\n          }\n        }\n        return null;\n      }\n      // Box mode: the selling plan must MATCH the chosen tier's frequency\n      // (1m\u219230 days, 2m\u219260, 3m\u219290) \u2014 Sam's rule 2026-08-15. The plan map is\n      // emitted by the section from the box product's selling plan groups.\n      function boxPlanFor(plan) {\n        if (isStickPlan(plan)) return stickPlanId();\n        return boxPlanIdFor(state.age, plan);\n      }\n      function storeFlavorOption(flavorParam) {\n        if (isStickPlan()) { var stick = stickChildFor(flavorParam); return stick ? stick.option : null; }\n        // Box mode: the store-exact flavor string lives on the CHILD product's\n        // option (the parent has no flavor axis to read it from).\n        if (window.__fizzyPdpChildMap) {\n          var c = boxChildFor(flavorParam);\n          if (c) return c.option;\n        }\n        var list = window.__fizzyPdpVariants || [], want = normOpt(FLAVOR_OPTION[flavorParam]);\n        for (var i = 0; i < list.length; i++) { if (normOpt(list[i].option1) === want) return list[i].option1; }\n        return FLAVOR_OPTION[flavorParam];\n      }\n      // Skio Static Box cart contract: one _pv<child-variant-gid> property per\n      // chosen flavor, value = pouch count. Skio composes the box (and the $0\n      // child order lines) from these. Size correctness is OUR job \u2014 Skio does\n      // not validate at cart time (their support, 2026-08-14).\n      function applyBoxProperties(properties, counts) {\n        if (!window.__fizzyPdpChildMap && !isStickPlan()) return;\n        for (var f in counts) {\n          if (!counts[f]) continue;\n          var c = isStickPlan() ? stickChildFor(f) : boxChildFor(f);\n          if (c) properties['_pvgid://shopify/ProductVariant/' + c.id] = counts[f];\n        }\n      }\n      function sellingPlanOf(v) { var a = v && v.selling_plan_allocations; return (a && a.length) ? a[0].selling_plan_id : null; }\n\n      addBtn.addEventListener('click', function () {\n        if (addBtn.disabled || purchaseBusy) return;\n        if (!exactSelection() || !tierPrice(state.plan).available) { renderBundle(); return; }\n\n        // Bundle contract: ONE line = the parent variant for the primary flavor\n        // \u00D7 age \u00D7 plan, quantity 1, with Flavor 1..N properties (one per pouch\n        // slot) + Age Range + the Skio selling_plan from the variant's allocation.\n        // Matches the developer's fizzyiq-buy-box / live orders. The bundle app\n        // expands this into the $0 child component pouches server-side.\n        var units = [];\n        ['bc', 'sl', 'wm', 'ob'].forEach(function (f) { for (var i = 0; i < state.qty[f]; i++) units.push(f); });\n        if (!units.length) return;\n        var variant = pdpVariant(units[0], state.age, state.plan);\n        if (!variant) {\n          console.error('[FizzyIQ ATC] no variant for', units[0], state.age, state.plan);\n          return;\n        }\n        // Store-exact option strings (storeFlavorOption) so the same code runs on\n        // dev (\"Watermelon\") and prod (\"Water Melon\"). In box mode the variant\n        // option is the SIZE, so Age Range comes from the UI state instead.\n        var properties = {};\n        if (isStickPlan()) {\n          properties._offer = 'stick15';\n          properties['Bundle size'] = stickSize() + ' sticks';\n        } else {\n          properties['Age Range'] = window.__fizzyPdpChildMap ? ageLabel() : variant.option2;\n        }\n        units.forEach(function (f, i) { properties['Flavor ' + (i + 1)] = storeFlavorOption(f); });\n        applyBoxProperties(properties, state.qty);\n        var line = { id: variant.id, quantity: 1, properties: properties };\n        var sp = (window.__fizzyPdpChildMap || isStickPlan()) ? boxPlanFor(state.plan) : sellingPlanOf(variant);\n        if ((window.__fizzyPdpChildMap || isStickPlan()) && state.plan !== 'once' && !sp) {\n          // A subscription tier without its matching frequency plan must NEVER\n          // fall through to a one-time sale at the subscription price.\n          console.error('[FizzyIQ ATC] no selling plan for tier', state.plan, '\u2014 box product is missing that frequency');\n          addBtn.textContent = 'Plan unavailable \u2014 try another';\n          setTimeout(function () { renderBundle(); }, 2200);\n          return;\n        }\n        if (sp) line.selling_plan = sp;\n        // Public line-item property: Shopify displays this beneath the product\n        // at checkout. The automatic discount still owns billing and totals.\n        if (sp && state.plan !== 'once' && octoberOfferActive()) {\n          var regular = regularTierPrice(state.plan);\n          var offer = tierPrice(state.plan);\n          if (regular.available && offer.available) {\n            properties['October subscription offer'] = isStickPlan()\n              ? '20% off every order: $' + offer.price.toFixed(2) + ' each. Before tax.'\n              : '20% off every box: $' + offer.price.toFixed(2) + ' each. Before tax.';\n          }\n        }\n        if (sp && state.plan !== 'once' && !isStickPlan()) {\n          var intro = regularTierPrice(state.plan);\n          if (intro.available && intro.was > intro.price) properties['Subscription offer'] = subscriptionRenewalText(state.plan);\n        }\n        var items = [line];\n\n        if (!items.length) return;\n\n        // Disable + busy state while the request is in flight\n        var prevText = addBtn.textContent;\n        addBtn.disabled = true;\n        addBtn.textContent = 'Adding\u2026';\n        purchaseBusy = true;\n        syncStickyAtc();\n\n        fetch('/cart/add.js', {\n          method: 'POST',\n          credentials: 'same-origin',\n          headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n          body: JSON.stringify({ items: items })\n        })\n          .then(function (r) {\n            if (!r.ok) return r.json().then(function (err) { throw err; });\n            return r.json();\n          })\n          .then(function (response) {\n            // Try to highlight the most recently added line in the drawer.\n            // /cart/add.js returns { items: [...] }; pick the last one's key.\n            var addedLines = (response && response.items) || [];\n            var highlightKey = addedLines.length\n              ? addedLines[addedLines.length - 1].key\n              : null;\n\n            if (window.FizzyCart && typeof window.FizzyCart.refresh === 'function') {\n              return window.FizzyCart.refresh(highlightKey).then(function () {\n                window.FizzyCart.open();\n                purchaseBusy = false;\n                addBtn.disabled = false;\n                renderBundle();\n              });\n            }\n            // Drawer not on this page \u2014 bounce to /cart as a fallback\n            window.location.href = '/cart';\n          })\n          .catch(function (err) {\n            console.error('[FizzyIQ ATC] add failed', err);\n            addBtn.textContent = (err && err.description) || 'Add failed \u2014 try again';\n            // Leave button disabled briefly so the error message is readable,\n            // then restore via renderBundle.\n            setTimeout(function () {\n              purchaseBusy = false;\n              addBtn.disabled = false;\n              renderBundle();\n            }, 2200);\n          });\n      });\n\n      // \u2500\u2500 Buy Once link \u2500\u2500\n      // A separate one-pouch purchase. The permalink preloads checkout with\n      // only the selected pouch, without a subscription or bundle expansion.\n      var buyOnceBtn = document.getElementById('buyOnceBtn');\n      var buyOncePopup = document.getElementById('buyOncePopup');\n      if (buyOnceBtn && buyOncePopup) {\n        var onceChoices = buyOncePopup.querySelectorAll('.buy-once-popup-flavor');\n        var onceError = buyOncePopup.querySelector('[data-buy-once-error]');\n        var onceBusy = false;\n        var onceLabel = buyOnceBtn.innerHTML;\n\n        var onceClose = buyOncePopup.querySelector('[data-buy-once-close]');\n        var oncePrice = buyOncePopup.querySelector('[data-buy-once-price]');\n        var oncePreviousOverflow;\n        function closeBuyOncePopup(restoreFocus) {\n          if (!buyOncePopup.open) return;\n          window.fizzyPopupMotion.dismiss(buyOncePopup, function () {\n            buyOncePopup.close();\n            if (restoreFocus) buyOnceBtn.focus({ preventScroll: true });\n          });\n        }\n        buyOncePopup.addEventListener('close', function () {\n          if (buyOncePopup.open) return;\n          buyOnceBtn.setAttribute('aria-expanded', 'false');\n          if (oncePreviousOverflow !== undefined) {\n            document.body.style.overflow = oncePreviousOverflow;\n            oncePreviousOverflow = undefined;\n          }\n        });\n        /* Subscription upsell (Sam 2026-10-09): the selected age's Monthly plan against the same\n           pouches bought one at a time, from the same live prices as the plan cards. */\n        var onceUpsell = buyOncePopup.querySelector('[data-buy-once-upsell]');\n        function fillOnceUpsell() {\n          if (!onceUpsell) return;\n          var monthly = tierPrice('1m');\n          var pouches = state.age === '14+' ? 2 : 1;\n          var unit = window.__fizzyPdpChildMap ? Number(window.__fizzyPdpBoxOncePrice) : priceFor('8-13', 'once').price;\n          var save = unit * pouches - monthly.price;\n          var ok = monthly.available && monthly.price > 0 && unit > 0 && save > 0;\n          onceUpsell.hidden = !ok;\n          if (!ok) return;\n          var saveEl = onceUpsell.querySelector('[data-upsell-save]');\n          var bodyEl = onceUpsell.querySelector('[data-upsell-body]');\n          if (saveEl) saveEl.textContent = money(Math.round(save * 100) / 100);\n          if (bodyEl) bodyEl.textContent = pouches + (pouches === 1 ? ' pouch' : ' pouches') + ' every 30 days for ' +\n            money(monthly.price) + ', shipped free, plus a free sample kit in your first box. Renews until canceled; cancel any time.';\n        }\n        var onceSubscribe = buyOncePopup.querySelector('[data-buy-once-subscribe]');\n        if (onceSubscribe) {\n          onceSubscribe.addEventListener('click', function () {\n            if (!buyOncePopup.open) return;\n            window.fizzyPopupMotion.dismiss(buyOncePopup, function () {\n              buyOncePopup.close();\n              var monthlyTier = Array.prototype.find.call(document.querySelectorAll('.tier[data-plan=\"1m\"]'), function (t) { return t.offsetParent !== null; });\n              if (monthlyTier && !monthlyTier.classList.contains('selected')) monthlyTier.click();\n              var picker = document.getElementById('flavorPicker') || monthlyTier;\n              if (!picker) return;\n              picker.scrollIntoView({ behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth', block: 'start' });\n              // Focus the first visible control in the picker; on phones none is focusable before a\n              // flavor is chosen, so fall back to the Monthly card that was just selected.\n              var control = Array.prototype.find.call(picker.querySelectorAll('button:not(:disabled), [tabindex=\"0\"]'), function (el) { return el.offsetParent !== null; }) || monthlyTier;\n              if (control) control.focus({ preventScroll: true });\n            });\n          });\n        }\n        function openBuyOncePopup() {\n          window.fizzyPopupMotion.reveal(buyOncePopup, function () {\n            if (onceError) { onceError.textContent = ''; onceError.hidden = true; }\n            fillOnceUpsell();\n            var price = buyOnceBtn.querySelector('.bo-price');\n            if (oncePrice && price) oncePrice.textContent = price.textContent;\n            oncePreviousOverflow = document.body.style.overflow;\n            document.body.style.overflow = 'hidden';\n            buyOncePopup.showModal();\n            buyOnceBtn.setAttribute('aria-expanded', 'true');\n            if (onceClose) onceClose.focus({ preventScroll: true });\n          });\n        }\n        buyOnceBtn.addEventListener('click', function (event) {\n          if (onceBusy || buyOnceBtn.disabled) return;\n          event.stopPropagation();\n          if (!buyOncePopup.open) openBuyOncePopup();\n          else closeBuyOncePopup(true);\n        });\n        if (onceClose) onceClose.addEventListener('click', function () { closeBuyOncePopup(true); });\n        // Native dialog contains focus. Only a click entirely outside its bounds\n        // dismisses it; dragging from a flavor row onto the backdrop does not.\n        var onceBackdropDown = false;\n        function outsideOnce(event) {\n          var rect = buyOncePopup.getBoundingClientRect();\n          return event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom;\n        }\n        buyOncePopup.addEventListener('pointerdown', function (event) { onceBackdropDown = outsideOnce(event); });\n        buyOncePopup.addEventListener('click', function (event) {\n          if (onceBackdropDown && outsideOnce(event)) closeBuyOncePopup(true);\n          onceBackdropDown = false;\n        });\n        buyOncePopup.addEventListener('cancel', function (event) {\n          event.preventDefault();\n          closeBuyOncePopup(true);\n        });\n        function resetOnceCheckout() {\n          onceBusy = false;\n          buyOnceBtn.disabled = false;\n          buyOnceBtn.innerHTML = onceLabel;\n          onceChoices.forEach(function (button) { button.disabled = false; });\n          closeBuyOncePopup(false);\n        }\n        window.addEventListener('pageshow', resetOnceCheckout);\n\n        function checkoutOneTime(flavorKey) {\n          if (onceBusy) return;\n          // Missing child mappings must never fall back to a box parent.\n          // Legacy 8\u201313 Try It Once variants represent one pouch.\n          var isBox = !!window.__fizzyPdpChildMap;\n          var variant = isBox ? boxChildFor(flavorKey) : pdpVariant(flavorKey, '8-13', 'once');\n          var id = variant && String(variant.id).replace(/^gid:\\/\\/shopify\\/ProductVariant\\//, '');\n          if (!variant || !/^[1-9]\\d*$/.test(id) || variant.available === false || (isBox && flavorStock(flavorKey, 'once') < 1)) {\n            if (onceError) {\n              onceError.textContent = 'This flavor is unavailable. Please choose another pouch.';\n              onceError.hidden = false;\n            }\n            return;\n          }\n          onceBusy = true;\n          onceLabel = buyOnceBtn.innerHTML;\n          buyOnceBtn.disabled = true;\n          buyOnceBtn.textContent = 'Opening checkout\u2026';\n          onceChoices.forEach(function (button) { button.disabled = true; });\n          closeBuyOncePopup(false);\n          var root = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n          window.location.assign(root + 'cart/' + id + ':1');\n        }\n        onceChoices.forEach(function (button) {\n          button.addEventListener('click', function () { checkoutOneTime(button.dataset.flavor); });\n        });\n      }\n      // \u2500\u2500 End buy-once flow \u2500\u2500\n    }\n\n    document.querySelectorAll('[data-stick-mix]').forEach(function (button) {\n      button.addEventListener('click', function () {\n        if (!isStickPlan() || purchaseBusy || !stickPrice().available) return;\n        resetFlavorCounts();\n        var groups = stickSize() / 3;\n        while (groups-- > 0) {\n          var choices = ['bc','sl','wm','ob'].filter(canAddFlavor).sort(function (a,b) { return state.qty[a] - state.qty[b]; });\n          if (!choices.length) break;\n          state.qty[choices[0]] += 3;\n        }\n        renderBundle();\n      });\n    });\n    // Select once on entry. Explicit available plan links take precedence;\n    // otherwise compare the actual upfront prices of current subscription tiers.\n    function selectInitialPlan() {\n      var choices = [];\n      hero.querySelectorAll('.tier[data-plan]').forEach(function (node) {\n        var plan = node.dataset.plan;\n        if (['stick15', '1m', '3m'].indexOf(plan) === -1 || choices.some(function (choice) { return choice.plan === plan; })) return;\n        var offer = tierPrice(plan);\n        if (offer.available && Number.isFinite(offer.price) && offer.price > 0) {\n          choices.push({node: node, plan: plan, price: offer.price});\n        }\n      });\n      var requested = new URLSearchParams(window.location.search).get('plan');\n      var chosen = choices.find(function (choice) { return choice.plan === requested; });\n      // Default to Monthly (Sam 2026-10-23); lowest price is only the fallback.\n      if (!chosen) chosen = choices.find(function (choice) { return choice.plan === '1m'; });\n      if (!chosen) {\n        chosen = choices.reduce(function (lowest, choice) {\n          return !lowest || choice.price < lowest.price ? choice : lowest;\n        }, null);\n      }\n      if (chosen) chosen.node.click();\n    }\n    selectInitialPlan();\n    renderBundle();\n\n\n    // \u2500\u2500 Sticky ATC visibility \u2500\u2500\n    // Show the sticky bar once the main #addToCartBtn scrolls out of\n    // view; hide it again when the user scrolls back to the buy box.\n    // IntersectionObserver is GPU-cheap (no scroll handler running on\n    // every frame) and handles initial state correctly \u2014 on a tall\n    // mobile viewport where the ATC starts below the fold, the bar\n    // will slide in on first paint.\n    (function setupStickyAtc() {\n      if (!stickyAtc || !addBtn) return;\n      // Portal the sticky bar to <body> so it escapes the .pdp-hero\n      // stacking context (.pdp-hero uses isolation: isolate for its\n      // flavor-field crossfade; without this move, any later page\n      // section would render above the entire hero stacking context\n      // and hide the sticky bar). Only relocate if it's not already\n      // there \u2014 guards against re-runs in the section editor.\n      if (stickyAtc.parentNode !== document.body) {\n        document.body.appendChild(stickyAtc);\n      }\n      if (stickyAtcBtn) {\n        /* Sticky ATC click \u2014 smooth-scroll to the buy box on every\n           viewport. Reverted 2026-05-30 per Sam: the bar is a \"get\n           me back to where I can buy\" affordance, not a parallel\n           commit path. Target priority: .age-picker \u2192 .pdp-right \u2192\n           #flavorPicker (last resort, still inside the buy box).\n           scroll-margin-top on .age-picker (set in fizzy-dark.css)\n           keeps it clear of the fixed header. */\n        stickyAtcBtn.addEventListener('click', function () {\n          if (optimizedPurchase) {\n            if (purchaseBusy) return;\n            if (!addBtn.disabled) { addBtn.click(); return; }\n            var picker = tierPrice(state.plan).available ? document.getElementById('flavorPicker') : document.querySelector('.plans');\n            if (picker) {\n              picker.scrollIntoView({ behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth', block: 'start' });\n              var control = picker.querySelector('button:not(:disabled), [role=\"radio\"][tabindex=\"0\"]');\n              if (control) control.focus({ preventScroll: true });\n            }\n            return;\n          }\n\n          var target = document.querySelector('.age-picker') ||\n                       document.querySelector('.pdp-right') ||\n                       document.getElementById('flavorPicker');\n          if (target) {\n            target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n          }\n        });\n      }\n      if (!('IntersectionObserver' in window)) {\n        // Old browser fallback \u2014 just leave the sticky hidden. Users\n        // on these browsers can still ATC from the main buy box.\n        return;\n      }\n      /* Compute \"user has scrolled past the buy box\" directly from\n         the addBtn's bounding rect. This is the source of truth \u2014\n         IntersectionObserver fires it on threshold crossings, and a\n         scroll listener re-checks on every scroll so the state can't\n         get stuck after smooth-scrolls, widget reflows, or scroll\n         interruptions. Sam 2026-06-01: prior version observed only\n         IntersectionObserver crossings and the body class could end\n         up out of sync (sticky bar disappeared, header reappeared\n         after navigating to clinician reviews). */\n      /* The first control the buy box asks for. Once it is on screen the\n         shopper has arrived at the controls, and a bar telling them to go find\n         the plan picker is pointing at something they are already looking at. */\n      var agePicker = document.querySelector('.age-picker');\n\n      function evalStickyState() {\n        if (!addBtn) return;\n        var rect = addBtn.getBoundingClientRect();\n        var vh = window.innerHeight || document.documentElement.clientHeight;\n\n        /* Two ways for the buy box to be off screen, and the bar earns its\n           place in both. It used to show only on `bottom < 0` \u2014 scrolled past.\n           But the buy column sits well below the fold on phones and below the\n           gallery on desktop, so a reader coming down the page had no flavour\n           control and no route to the plan picker until they had already\n           reached it. `top > vh` covers that half.\n\n           No scroll guard: Sam wants it present from the top of the page, so\n           the CTA and the flavour swatches are there before the reader has\n           done anything. An earlier version held it back 240px to avoid\n           slamming in at load; the bar is the primary route to the buy box on\n           this layout, so being late is the worse failure. */\n        var past  = rect.bottom < 0;\n        var ahead = rect.top > vh;\n\n        /* 'ahead' ends when the AGE picker enters the viewport, not when the\n           add-to-cart button does (Sam 2026-08-29). Those are far apart: the\n           picker is the top of the buy box and the button is the bottom of it,\n           so on a phone the bar was still saying \"Choose your plan\" while the\n           shopper was already reading the plan tiers. Scrolling further turns\n           `past` true and the bar returns with the real add-to-cart label. */\n        if (!optimizedPurchase && ahead && agePicker) {\n          var ap = agePicker.getBoundingClientRect();\n          if (ap.top < vh) ahead = false;\n        }\n\n        var mode  = past ? 'past' : (ahead ? 'ahead' : null);\n        if (optimizedPurchase && window.matchMedia('(min-width: 1025px)').matches) mode = null;\n\n        if (mode !== stickyMode) {\n          stickyMode = mode;\n          if (stickyAtcBtn) stickyAtcBtn.innerHTML = stickyLabelFor(mode);\n          stickyAtc.setAttribute('data-sa-mode', mode || 'hidden');\n        }\n        stickyAtc.classList.toggle('visible', !!mode);\n        stickyAtc.setAttribute('aria-hidden', mode ? 'false' : 'true');\n        /* aria-hidden alone left five focusable controls in the tab order while\n           the bar was off screen: the hidden state is transform + opacity +\n           pointer-events, none of which removes an element from tab order. The\n           bar is portalled to <body>, so those were the last five tab stops on\n           the page \u2014 four swatches and a CTA that are invisible and, being\n           inside aria-hidden, silent to assistive tech (axe aria-hidden-focus).\n           inert takes them out of both. Sam 2026-08-28. */\n        if ('inert' in stickyAtc) stickyAtc.inert = !mode;\n        document.body.classList.toggle('sticky-atc-active', !!mode);\n      }\n\n      var observer = new IntersectionObserver(function () {\n        evalStickyState();\n      }, {\n        rootMargin: '0px',\n        threshold: 0\n      });\n      observer.observe(addBtn);\n      /* The age picker now decides half the state, so its crossings have to\n         wake the same evaluator. The rAF scroll fallback below covers the\n         cases where IO callbacks get stuck, as it already does for addBtn. */\n      if (agePicker) observer.observe(agePicker);\n\n      /* Scroll fallback \u2014 ensures state recovery when\n         IntersectionObserver crossings get missed or fire in\n         intermediate states. rAF-throttled so it's cheap. */\n      var stickyScrollRaf = null;\n      window.addEventListener('scroll', function () {\n        if (stickyScrollRaf) return;\n        stickyScrollRaf = requestAnimationFrame(function () {\n          stickyScrollRaf = null;\n          evalStickyState();\n        });\n      }, { passive: true });\n      /* scrollend (Chrome 114+, Firefox 109+, Safari 18.2+) fires\n         when scrolling stops \u2014 including after smooth-scroll-into-view\n         from the FR \"Read their reviews\" handler. Catches the final\n         state even when the rAF chain was interrupted by a fast\n         user scroll. Sam 2026-06-01. */\n      window.addEventListener('scrollend', evalStickyState);\n      window.addEventListener('resize', evalStickyState);\n      /* Expose for cross-section calls \u2014 the FR postMessage bridge\n         can call this after triggering a programmatic scroll so the\n         state is correct even if scrollend isn't supported in the\n         current browser. */\n      window.__fizzyEvalStickyState = evalStickyState;\n      evalStickyState();\n      // Prime the sticky's content with the initial state so the\n      // first appearance has the right plan + thumb already set.\n      syncStickyAtc();\n\n      /* Flavor-tint while the hero section is in view \u2014 when the\n         user is still on the hero (and a flavor that isn't BC is\n         selected), the sticky ATC adopts that flavor's deep color\n         so the bar reads as a continuation of the hero's flavor\n         field. Once the user scrolls past the hero, the bar\n         reverts to BC indigo. Sam 2026-06-01. */\n      if (hero) {\n        var heroTintObserver = new IntersectionObserver(function (entries) {\n          entries.forEach(function (entry) {\n            document.body.classList.toggle('sticky-atc-tinted', entry.isIntersecting);\n          });\n        }, {\n          rootMargin: '0px',\n          threshold: 0\n        });\n        heroTintObserver.observe(hero);\n      }\n\n      // \u2500\u2500 Bottom-of-page spacer \u2500\u2500\n      // The sticky bar permanently occupies a strip at the viewport\n      // bottom. Without a matching spacer, the footer's last lines\n      // (copyright, cert badges, etc.) stay covered no matter how\n      // far the user scrolls. Mark <body> with a class and set a\n      // CSS variable equal to the bar's measured height \u2014 the CSS\n      // rule in fizzy-dark.css uses that variable to extend the\n      // page just enough that the footer can scroll fully clear.\n      document.body.classList.add('has-sticky-atc');\n      function applyStickySpacer() {\n        if (!stickyAtc) return;\n        var h = stickyAtc.offsetHeight;\n        document.documentElement.style.setProperty('--sa-height', h + 'px');\n      }\n      applyStickySpacer();\n      // Re-measure on resize because the bar's height changes between\n      // the desktop layout and the narrow-mobile (sub-380px) one.\n      window.addEventListener('resize', applyStickySpacer);\n    })();\n\n    // \u2500\u2500 Free Member Gifts modal \u2500\u2500\n    // [data-mg-open] (the member-gifts card button) opens the modal;\n    // [data-mg-close] (X + backdrop) or ESC closes it. Body scroll\n    // locked while open. Sam: 2026-05-30.\n    (function setupMemberGiftsModal() {\n      var modal = document.getElementById('memberGiftsModal');\n      var openBtns = hero.querySelectorAll('[data-mg-open]');\n      var returnFocus = null;\n      if (!modal || !openBtns.length) return;\n\n      /* Force the modal to <body> root every init. Without this move\n         the modal lives inside .pdp-right, which has ancestors\n         (.pdp-stage / sticky sections / transformed slides) that\n         create their own stacking contexts and clip backdrop-filter.\n         Re-running appendChild on an already-correctly-placed node\n         is a cheap no-op, so we don't bother gating on parentNode. */\n      document.body.appendChild(modal);\n\n      function openModal(event) {\n        returnFocus = event.currentTarget;\n        window.fizzyPopupMotion.reveal(modal, function () {\n          modal.classList.add('open');\n          modal.setAttribute('aria-hidden', 'false');\n          document.body.style.overflow = 'hidden';\n          var closeBtn = modal.querySelector('.mg-close');\n          if (closeBtn) closeBtn.focus({ preventScroll: true });\n        });\n      }\n      function closeModal() {\n        window.fizzyPopupMotion.dismiss(modal, function () {\n          modal.classList.remove('open');\n          modal.setAttribute('aria-hidden', 'true');\n          document.body.style.overflow = '';\n          if (returnFocus && returnFocus.isConnected) returnFocus.focus({ preventScroll: true });\n        });\n      }\n\n      openBtns.forEach(function (button) { button.addEventListener('click', openModal); });\n      /* Close on:\n         1. Explicit [data-mg-close] (X button or backdrop)\n         2. Any click outside the dialog content card (mirrors COA / SFP\n            modal behavior \u2014 every popup on the site should support\n            click-outside-to-close). Sam: 2026-05-30. */\n      modal.addEventListener('click', function (e) {\n        if (e.target.closest('[data-mg-close]')) { closeModal(); return; }\n        var dialog = modal.querySelector('.mg-dialog');\n        if (dialog && !dialog.contains(e.target)) closeModal();\n      });\n      document.addEventListener('keydown', function (e) {\n        if (e.key === 'Escape' && modal.classList.contains('open')) closeModal();\n        if (e.key !== 'Tab' || modal.getAttribute('aria-hidden') !== 'false') return;\n\n        // Re-read visible controls so the tab loop follows dynamic modal content.\n        var focusable = Array.prototype.filter.call(modal.querySelectorAll(\n          'a[href], area[href], button, input, select, textarea, iframe, [tabindex], [contenteditable]'\n        ), function (element) {\n          return element.tabIndex >= 0 && !element.matches(':disabled') &&\n            !element.closest('[inert]') && element.getClientRects().length > 0 &&\n            window.getComputedStyle(element).visibility === 'visible';\n        });\n        if (!focusable.length) { e.preventDefault(); return; }\n        var first = focusable[0];\n        var last = focusable[focusable.length - 1];\n        var current = document.activeElement;\n        if (e.shiftKey && (current === first || focusable.indexOf(current) < 0)) {\n          e.preventDefault();\n          last.focus({ preventScroll: true });\n        } else if (!e.shiftKey && (current === last || focusable.indexOf(current) < 0)) {\n          e.preventDefault();\n          first.focus({ preventScroll: true });\n        }\n      });\n    })();\n\n    // \u2500\u2500 Info-accordion (one row open at a time) \u2500\u2500\n    // Native <details>/<summary> handles open/close on click; the shared\n    // fizzy-disclosure module animates it. The only JS here is the\n    // single-open behavior: opening a row closes any other open row \u2014\n    // routed through fizzyDisclosure.close so the outgoing row collapses\n    // rather than vanishing (yanking `open` skips the transition).\n    // Falls back to the old instant snap if that module is absent.\n    (function setupInfoAccordion() {\n      var rows = hero.querySelectorAll('.info-accordion .ia-row');\n      if (!rows.length) return;\n      rows.forEach(function (row) {\n        row.addEventListener('toggle', function () {\n          if (!row.hasAttribute('open')) return;\n          rows.forEach(function (other) {\n            if (other !== row && other.hasAttribute('open')) {\n              if (window.fizzyDisclosure) window.fizzyDisclosure.close(other);\n              else other.removeAttribute('open');\n            }\n          });\n        });\n      });\n    })();\n\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* Fullscreen product images. Keep native pinch zoom and a bounded image\n   window: only the current image and its neighbors get reading-size sources.\n   Rebuild on open for current flavor assets; release the images on close. */\n(function () {\n  'use strict';\n  var dlg = document.getElementById('pdpZoomLightbox');\n  if (!dlg) return;\n  var track = document.getElementById('pdpZoomTrack');\n  var dots = document.getElementById('pdpZoomThumbs');\n  var slides = [];\n  var activePos = -1;\n  var layoutWidth = 0;\n  var scrollFrame = 0;\n  var PZL_REDUCE = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n  function imageAtWidth(src, width) {\n    var url = new URL(src, document.baseURI);\n    if (url.hostname === 'cdn.shopify.com') url.searchParams.set('width', width);\n    return url.href;\n  }\n\n  function loadNearby(pos) {\n    /* Detach distant sources first so visiting the whole gallery never\n       leaves eleven large images attached to the dialog. */\n    slides.forEach(function (slide, i) {\n      if (Math.abs(i - pos) > 1) slide.img.removeAttribute('src');\n    });\n    slides.forEach(function (slide, i) {\n      if (Math.abs(i - pos) <= 1 && !slide.img.hasAttribute('src')) {\n        slide.img.src = slide.src;\n      }\n    });\n  }\n\n  function activate(pos) {\n    pos = Math.max(0, Math.min(pos, slides.length - 1));\n    if (pos === activePos) return;\n    activePos = pos;\n    loadNearby(pos);\n    slides.forEach(function (slide, i) {\n      slide.dot.classList.toggle('active', i === pos);\n      if (i === pos) slide.dot.setAttribute('aria-current', 'true');\n      else slide.dot.removeAttribute('aria-current');\n    });\n    var active = slides[pos].dot;\n    var target = active.offsetLeft - (dots.clientWidth - active.offsetWidth) / 2;\n    /* One update per selected image, not a new animation every scroll frame. */\n    dots.scrollTo({ left: target, behavior: 'auto' });\n  }\n\n  function select(pos, animate) {\n    var distance = Math.abs(pos - activePos);\n    activate(pos);\n    track.scrollTo({\n      left: activePos * track.clientWidth,\n      /* Jumping across the gallery should not decode every image en route. */\n      behavior: animate && distance === 1 && !PZL_REDUCE ? 'smooth' : 'auto'\n    });\n  }\n\n  function build() {\n    var readingWidth = Math.min(2400, Math.max(1600, document.documentElement.clientWidth * 2));\n    document.querySelectorAll('.pdp-stage .slide').forEach(function (slide) {\n      if (slide.querySelector('video')) return;\n      var source = slide.querySelector('img');\n      if (!source || !source.getAttribute('src')) return;\n      var cell = document.createElement('div');\n      cell.className = 'pzl-slide';\n      var img = document.createElement('img');\n      img.alt = source.getAttribute('alt') || '';\n      img.decoding = 'async';\n      cell.appendChild(img);\n      track.appendChild(cell);\n      var dot = document.createElement('button');\n      dot.type = 'button';\n      dot.className = 'pzl-thumb';\n      dot.setAttribute('aria-label', 'Image ' + (slides.length + 1) + ' of the carousel');\n      var thumb = document.createElement('img');\n      thumb.src = imageAtWidth(source.getAttribute('src'), 160);\n      thumb.alt = '';\n      thumb.width = 46;\n      thumb.height = 46;\n      thumb.decoding = 'async';\n      dot.appendChild(thumb);\n      var pos = slides.length;\n      dot.addEventListener('click', function () { select(pos, true); });\n      dots.appendChild(dot);\n      slides.push({\n        index: parseInt(slide.dataset.i, 10),\n        src: imageAtWidth(source.getAttribute('src'), readingWidth),\n        img: img,\n        dot: dot\n      });\n    });\n  }\n\n  track.addEventListener('scroll', function () {\n    if (!dlg.open || scrollFrame) return;\n    scrollFrame = requestAnimationFrame(function () {\n      scrollFrame = 0;\n      if (dlg.open && slides.length) {\n        activate(Math.round(track.scrollLeft / Math.max(track.clientWidth, 1)));\n      }\n    });\n  }, { passive: true });\n\n  /* Observe layout width only. Pinch changes the visual viewport, which must\n     not rebuild the gallery or re-center the image underneath the fingers. */\n  function preserveSlide() {\n    if (!dlg.open || activePos < 0 || track.clientWidth === layoutWidth) return;\n    layoutWidth = track.clientWidth;\n    track.scrollTo({ left: activePos * layoutWidth, behavior: 'auto' });\n  }\n  if ('ResizeObserver' in window) new ResizeObserver(preserveSlide).observe(track);\n  else window.addEventListener('resize', preserveSlide);\n\n  dlg.addEventListener('close', function () {\n    if (scrollFrame) cancelAnimationFrame(scrollFrame);\n    scrollFrame = 0;\n    slides.forEach(function (slide) { slide.img.removeAttribute('src'); });\n    track.replaceChildren();\n    dots.replaceChildren();\n    slides = [];\n    activePos = -1;\n  });\n\n  document.addEventListener('click', function (e) {\n    var t = e.target instanceof Element ? e.target : null;\n    if (!t) return;\n    if (t.closest('[data-pdp-zoom]')) {\n      if (dlg.open) return;\n      build();\n      if (!slides.length) return;\n      window.fizzyPopupMotion.open(dlg);\n      layoutWidth = track.clientWidth;\n      var counter = document.getElementById('pdpCounter');\n      var current = counter ? parseInt(counter.textContent, 10) - 1 : 0;\n      var pos = slides.findIndex(function (slide) { return slide.index === current; });\n      select(Math.max(pos, 0), false);\n      return;\n    }\n    if (t.closest('[data-pzl-close]') || t === dlg) window.fizzyPopupMotion.close(dlg);\n  });\n})();"],
  "mappings": "CAEC,UAAY,CACX,SAAS,MAAO,CACd,IAAI,KAAO,SAAS,eAAe,SAAS,EAC5C,GAAI,CAAC,KAAM,OAIX,IAAI,aAAe,SAAS,eAAe,iBAAiB,EAE5D,GADA,OAAO,gBAAkB,KACrB,aACF,GAAI,CAAE,OAAO,gBAAkB,KAAK,MAAM,aAAa,WAAW,CAAG,OAC9D,MAAO,CAAE,QAAQ,MAAM,uCAAuC,CAAG,EAKzE,UAA6B,CAC5B,IAAI,MAAQ,KAAK,cAAc,wBAAwB,EACvD,GAAI,CAAC,OAAS,MAAM,QAAQ,aAAe,OAAQ,OACnD,MAAM,QAAQ,WAAa,OAC3B,IAAI,OAAS,oCACT,OAAS,SAAS,cAAc,iCAAiC,EACrE,MAAM,QAAQ,cAAgB,UAC9B,SAAS,OAAQ,CAIX,MAAM,aAAe,MAAM,eAC7B,MAAM,cAAc,YAAY,CAAE,KAAM,cAAe,EAAG,MAAM,CAEpE,CACA,SAAS,UAAU,MAAO,CACxB,GAAI,QAAM,SAAW,QAAU,MAAM,SAAW,MAAM,eACtD,KAAI,KAAO,MAAM,KACb,KAAO,OAAO,MAAS,SAAW,KAAO,MAAQ,KAAK,KACtD,OAAS,8BAA8B,MAAM,EAC7C,OAAS,iBAAmB,MAAQ,OAAO,SAAS,KAAK,KAAK,GAAK,KAAK,OAAS,IAAM,KAAK,OAAS,MACvG,MAAM,QAAQ,cAAgB,QAC9B,MAAM,MAAM,OAAS,KAAK,MAAQ,KAClC,MAAM,MAAM,QAAU,SAE1B,CACA,SAAS,cAAe,CACtB,OAAO,QAAQ,MAAQ,OACvB,MAAM,CACR,CACA,OAAO,iBAAiB,UAAW,SAAS,EAC5C,MAAM,iBAAiB,OAAQ,KAAK,EAC/B,OAOM,OAAO,QAAQ,QAAU,OAClC,MAAM,EAEN,OAAO,iBAAiB,OAAQ,aAAc,CAAE,KAAM,EAAK,CAAC,GAT5D,OAAS,SAAS,cAAc,QAAQ,EACxC,OAAO,QAAQ,iBAAmB,OAClC,OAAO,IAAM,OAAS,8BACtB,OAAO,MAAQ,GACf,OAAO,iBAAiB,OAAQ,aAAc,CAAE,KAAM,EAAK,CAAC,EAC5D,SAAS,KAAK,YAAY,MAAM,EAMpC,GAAG,EAGH,IAAI,gBAAkB,KAAK,cAAc,uBAAuB,EAC5D,eAAiB,SAAS,cAAc,KAAK,EACjD,GAAI,iBAAmB,eAAgB,CAGrC,IAASA,sBAAT,UAAgC,CAC9B,cAAgB,EAChB,IAAI,OAAS,GACb,GAAI,eAAe,SAAW,gBAAgB,YAAa,CACzD,IAAI,OAAS,gBAAgB,sBAAsB,EAC/C,WAAa,eAAe,sBAAsB,EAAE,OACxD,OAAS,OAAO,KAAO,YAAc,OAAO,OAAS,UACvD,CACA,SAAS,KAAK,UAAU,OAAO,sBAAuB,MAAM,CAC9D,EACSC,wBAAT,UAAkC,CAC3B,gBAAe,cAAgB,sBAAsBD,qBAAoB,EAChF,EAZS,qBAAAA,sBAUA,uBAAAC,wBAZL,eAAiB,OAAO,WAAW,oBAAoB,EACvD,cAAgB,EAmBpB,GALA,OAAO,iBAAiB,SAAUA,wBAAwB,CAAE,QAAS,EAAK,CAAC,EAC3E,OAAO,iBAAiB,SAAUA,wBAAwB,CAAE,QAAS,EAAK,CAAC,EAC3E,OAAO,iBAAiB,WAAYA,uBAAsB,EAC1D,OAAO,iBAAiB,OAAQA,uBAAsB,EACtD,eAAe,iBAAiB,SAAUA,uBAAsB,EAC5D,mBAAoB,OAAQ,CAC9B,IAAI,eAAiB,IAAI,eAAeA,uBAAsB,EAC9D,eAAe,QAAQ,IAAI,EAC3B,eAAe,QAAQ,eAAe,EACtC,eAAe,QAAQ,cAAc,CACvC,CACAD,sBAAqB,CACvB,CAGA,IAAI,KAAO,CACT,GAAI,CAAE,KAAM,eAAuB,MAAO,+EAA2E,EACrH,GAAI,CAAE,KAAM,sBAAuB,MAAO,4FAAwF,EAClI,GAAI,CAAE,KAAM,aAAuB,MAAO,wEAAoE,EAC9G,GAAI,CAAE,KAAM,oBAAuB,MAAO,4FAAwF,CACpI,EAGI,aAAe,CACjB,GAAI,4EACJ,GAAI,4EACJ,GAAI,4EACJ,GAAI,2EACN,EAOI,mBAAqB,CAGvB,GAAI,6HACJ,GAAI,oIACJ,GAAI,4HACJ,GAAI,iIACN,EAKI,gBAAkB,CACpB,GAAI,2FACJ,GAAI,gGACJ,GAAI,gGACJ,GAAI,2FACN,EAII,aAAe,CAMjB,GAAI,oHACJ,GAAI,iHACJ,GAAI,oHACJ,GAAI,4GACN,EAKI,qBAAuB,CAKzB,GAAI,qHACJ,GAAI,4HACJ,GAAI,oHACJ,GAAI,yHACN,EAKI,sBAAwB,CAK1B,GAAI,uHACJ,GAAI,qHACJ,GAAI,qHACJ,GAAI,yHACN,EAII,QAAU,CACZ,GAAI,oGACJ,GAAI,mGACJ,GAAI,mGACJ,GAAI,8FACN,EAMA,SAAS,UAAU,GAAI,CACrB,GAAI,CAAC,IAAM,CAAC,GAAG,SAAW,CAAC,GAAG,QAAQ,SAAU,OAAO,KACvD,IAAI,IAAM,SAAU,EAAG,CAAE,GAAI,CAAE,OAAO,IAAI,IAAI,EAAG,OAAO,SAAS,IAAI,EAAE,IAAM,OAAS,EAAG,CAAE,OAAO,CAAG,CAAE,EACnG,EAAI,GAAG,QACX,MAAO,CAAE,GAAI,IAAI,EAAE,QAAQ,EAAG,GAAI,IAAI,EAAE,QAAQ,EAAG,GAAI,IAAI,EAAE,QAAQ,EAAG,GAAI,IAAI,EAAE,QAAQ,CAAE,CAC9F,CAMA,IAAI,YAAc,CAAE,KAAM,EAAG,KAAM,EAAG,KAAM,CAAE,EAC9C,SAAS,MAAM,OAAQ,SAAU,CAC/B,OAAI,OAAO,QAAW,UAAY,CAAC,SAAS,MAAM,EAAU,cACrD,IAAI,KAAK,aAAa,SAAS,gBAAgB,MAAQ,QAAS,CACrE,MAAO,WAAY,SAAU,OAAO,oBAAsB,MAC1D,sBAAuB,WAAa,IAAQ,OAAS,EAAI,EAAI,EAC7D,sBAAuB,CACzB,CAAC,EAAE,OAAO,MAAM,CAClB,CACA,SAAS,kBAAmB,CAC1B,MAAO,CAAE,MAAO,KAAM,IAAK,EAAG,SAAU,EAAG,SAAU,EAAG,UAAW,EAAM,CAC3E,CACA,SAAS,eAAe,MAAO,QAAS,UAAW,CACjD,GAAI,CAAC,OAAO,SAAS,OAAO,KAAK,CAAC,GAAK,OAAO,KAAK,GAAK,GAAK,YAAc,GAAO,OAAO,iBAAiB,EAC1G,IAAI,MAAQ,OAAO,KAAK,EAAI,IACxB,IAAM,OAAO,OAAO,EAAI,OAAO,KAAK,EAAI,OAAO,OAAO,EAAI,IAAM,EACpE,MAAO,CAAE,MAAO,MAAO,IAAK,IAAK,SAAU,IAAM,IAAM,MAAQ,EAC7D,SAAU,IAAM,KAAK,OAAO,IAAM,OAAS,IAAM,GAAG,EAAI,EAAG,UAAW,EAAK,CAC/E,CACA,SAAS,SAAS,IAAK,KAAM,CAC3B,IAAI,IAAM,OAAO,kBAAoB,CAAC,EAClC,IAAM,IAAI,GAAG,GAAK,IAAI,GAAG,EAAE,IAAI,EACnC,OAAO,IAAM,eAAe,IAAI,MAAO,IAAI,IAAK,IAAI,SAAS,EAAI,iBAAiB,CACpF,CACA,IAAI,YAAc,CAAE,KAAM,UAAW,KAAM,UAAW,KAAM,SAAU,EAKlE,cAAgB,CAClB,KAAM,mBACN,KAAM,mBACN,KAAM,mBACN,QAAW,6BACb,EAEI,MAAQ,CACV,KAAM,KACN,cAAe,GAIf,IAAK,OAAO,uBAAyB,MAAQ,MAAQ,OAErD,IAAK,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,CAAE,CACpC,EAKA,SAAS,YAAY,KAAM,CAAE,OAAQ,MAAQ,MAAM,QAAU,SAAW,CACxE,SAAS,WAAY,CAAE,OAAO,OAAO,iBAAmB,CAAC,CAAG,CAC5D,SAAS,UAAU,SAAU,CAC3B,IAAI,KAAO,OAAO,UAAY,MAAM,aAAa,EACjD,MAAO,CAAC,GAAI,GAAI,EAAE,EAAE,QAAQ,IAAI,IAAM,GAAK,KAAO,EACpD,CACA,SAAS,UAAU,SAAU,CAAE,OAAO,UAAU,QAAQ,IAAM,GAAK,GAAK,EAAI,CAC5E,SAAS,YAAY,SAAU,CAC7B,IAAI,IAAM,UAAU,EAAE,SAAW,CAAC,EAClC,QAAS,QAAQ,IACf,GAAI,IAAI,OAAO,UAAY,UAAU,QAAQ,EAAI,qBAAsB,GAAG,EAAE,KAAK,IAAI,GAAK,aAAa,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,EAAG,OAAO,IAAI,IAAI,EAEjJ,OAAO,IACT,CACA,SAAS,aAAa,SAAU,CAC9B,IAAI,KAAO,UAAU,QAAQ,EAAG,KAAO,UAAU,EACjD,MAAI,CAAC,KAAK,SAAW,CAAC,MAAM,QAAQ,KAAK,QAAQ,EAAU,KACpD,KAAK,SAAS,KAAK,SAAU,EAAG,CACrC,OAAO,IAAI,OAAO,IAAM,KAAO,6BAA8B,GAAG,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CACjG,CAAC,GAAK,IACR,CACA,SAAS,cAAc,EAAG,CACxB,IAAI,IAAM,UAAU,EAAE,UAAY,CAAC,EAC/B,MAAQ,CAAC,GAAG,cAAc,GAAG,qBAAqB,GAAG,aAAa,GAAG,kBAAkB,EAC3F,QAAS,QAAQ,IACf,GAAI,KAAK,YAAY,EAAE,QAAQ,aAAc,EAAE,IAAM,MAAM,CAAC,EAC5D,KAAI,MAAQ,IAAI,IAAI,EAAG,GAAK,OAAS,OAAO,OAAU,SAAW,MAAM,GAAK,MAC5E,MAAK,aAAa,KAAK,OAAO,EAAE,CAAC,EAC1B,CAAC,GAAG,GAAG,OAAO,IAAI,EADkB,KAG7C,OAAO,IACT,CACA,SAAS,WAAW,SAAU,CAC5B,IAAI,QAAU,aAAa,QAAQ,EAAG,KAAO,YAAY,QAAQ,EACjE,GAAI,CAAC,SAAW,CAAC,MAAQ,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,MAAM,aAAa,EAAG,OAAO,iBAAiB,EAC9F,IAAI,YAAc,QAAQ,0BAA4B,CAAC,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,eAAe,IAAM,OAAO,IAAI,CAAG,CAAC,EAElI,OAAO,WAAa,eAAe,WAAW,MAAO,EAAG,QAAQ,SAAS,EAAI,iBAAiB,CAChG,CACA,SAAS,cAAe,CAAE,OAAO,YAAY,EAAI,EAAI,CAAG,CACxD,SAAS,WAAW,EAAG,CACrB,IAAI,MAAQ,UAAU,EAAE,WAAY,MAAQ,cAAc,CAAC,EAC3D,GAAI,CAAC,MAAO,MAAO,GACnB,GAAI,CAAC,MAAO,MAAO,KACnB,QAAS,QAAQ,MACf,GAAI,KAAK,YAAY,EAAE,QAAQ,aAAc,EAAE,IAAM,MAAM,OAAO,YAAY,EAAE,QAAQ,aAAc,EAAE,EAAG,CACzG,IAAI,MAAQ,OAAO,MAAM,IAAI,CAAC,EAC9B,OAAO,OAAO,SAAS,KAAK,EAAI,KAAK,IAAI,EAAG,KAAK,EAAI,CACvD,CAEF,MAAO,IACT,CACA,SAAS,gBAAiB,CACxB,IAAI,IAAM,SAAS,EACnB,OAAO,IAAM,GAAK,cAAc,IAAM,KAAO,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,MAAM,SAAU,EAAG,CACpF,IAAI,EAAI,MAAM,IAAI,CAAC,EACnB,OAAO,OAAO,UAAU,CAAC,GAAK,GAAK,IAAM,CAAC,YAAY,GAAK,EAAI,IAAM,KAClE,CAAC,GAAM,YAAY,CAAC,GAAK,GAAK,YAAY,CAAC,EAChD,CAAC,CACH,CACA,SAAS,mBAAoB,CAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,QAAQ,SAAU,EAAG,CAAE,MAAM,IAAI,CAAC,EAAI,CAAG,CAAC,CAAG,CAElG,SAAS,aAAa,IAAK,KAAM,CAC/B,IAAI,KAAO,YAAY,IAAI,EAAI,GAC/B,GAAI,CAAC,KAAM,OAAO,KAClB,IAAI,IAAM,WAAW,GAAG,EAAE,QAC1B,QAAS,QAAQ,IACf,GAAI,IAAI,OAAO,UAAY,KAAO,SAAS,EAAE,KAAK,IAAI,EAAG,OAAO,IAAI,IAAI,EAE1E,OAAO,IACT,CACA,SAAS,iBAAiB,KAAM,CAC9B,GAAI,YAAY,IAAI,EAAG,OAAO,WAAW,EACzC,GAAI,CAAC,OAAO,mBAAoB,OAAO,SAAS,MAAM,IAAK,IAAI,EAC/D,IAAI,OAAS,YAAY,IAAI,EACzB,OAAS,aAAa,MAAM,IAAK,IAAI,EACzC,GAAI,CAAC,QAAU,CAAC,OAAQ,OAAO,iBAAiB,EAGhD,QAFI,KAAO,QAAU,MAAM,MAAQ,MAAQ,EAAI,GAC3C,KAAO,WAAW,MAAM,GAAG,EAAE,SACxB,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,IAAI,QAAU,KAAK,CAAC,EACpB,GAAI,OAAO,QAAQ,OAAO,EAAE,KAAK,IAAM,OAAO,IAAI,EAClD,KAAI,MAAQ,QAAQ,MAChB,YAAc,QAAQ,0BAA4B,CAAC,EACnD,WAAa,YAAY,KAAK,SAAU,KAAM,CAAE,OAAO,OAAO,KAAK,eAAe,IAAM,OAAO,MAAM,CAAG,CAAC,EAC7G,GAAI,YAAY,QAAU,CAAC,WAAY,OAAO,iBAAiB,EAC3D,aAAY,MAAQ,WAAW,OAEnC,IAAI,EAAI,eAAe,MAAO,WAAa,QAAQ,MAAQ,QAAQ,iBAAkB,QAAQ,SAAS,EAClG,IAAM,YAAc,WAAW,kBACnC,OAAI,EAAE,WAAa,KAAO,IAAI,OAAS,GAAK,OAAO,IAAI,CAAC,EAAE,KAAK,EAAI,IAAG,EAAE,QAAU,OAAO,IAAI,CAAC,EAAE,KAAK,EAAI,KAClG,EACT,CACA,OAAO,iBAAiB,CAC1B,CAEA,SAAS,oBAAqB,CAC5B,MAAO,EACT,CACA,SAAS,UAAU,KAAM,CACvB,IAAI,EAAI,iBAAiB,IAAI,EAC7B,GAAI,CAAC,EAAE,WAAa,CAAC,mBAAmB,EAAG,OAAO,EAClD,IAAI,WAAa,KAAK,MAAM,EAAE,MAAQ,EAAE,EAAI,IAC5C,GAAI,YAAY,IAAI,EAAG,CAGrB,IAAI,MAAQ,KAAK,MAAM,EAAE,MAAQ,GAAG,EACpC,YAAc,MAAQ,KAAK,MAAM,MAAQ,GAAK,GAAG,GAAK,GACxD,CACA,MAAO,CAAC,MAAO,WAAY,IAAK,EAAE,MAAO,SAAU,EAAE,MAAQ,WAAY,SAAU,GAAI,UAAW,EAAI,CACxG,CACA,SAAS,wBAAwB,KAAM,CACrC,IAAI,QAAU,iBAAiB,IAAI,EAAG,MAAQ,UAAU,IAAI,EAC5D,GAAI,CAAC,QAAQ,WAAa,CAAC,MAAM,UAAW,MAAO,oBACnD,IAAI,KAAO,YAAY,IAAI,EAAI,UAAU,GAAK,YAAY,IAAI,GAAK,GAAK,GACxE,OAAO,mBAAmB,EACtB,MAAM,MAAM,KAAK,EAAI,UAAY,KAAO,SACxC,QAAQ,SAAW,QAAQ,UAAY,QAAQ,MAC7C,MAAM,QAAQ,KAAK,EAAI,oBAAsB,MAAM,QAAQ,OAAO,EAAI,UAAY,KAAO,SACzF,MAAM,QAAQ,KAAK,EAAI,UAAY,KAAO,QAClD,CACA,SAAS,kBAAmB,CAAE,OAAO,wBAAwB,SAAS,CAAG,CACzE,SAAS,gBAAiB,CAAE,OAAO,UAAU,EAAI,eAAiB,CAElE,SAAS,UAAW,CAAE,OAAO,MAAM,MAAQ,MAAQ,WAAa,gBAAa,CAI7E,SAAS,YAAY,EAAG,CACtB,IAAI,GAAK,OAAO,mBAChB,GAAI,CAAC,GAAI,OAAO,KAChB,IAAI,MAAQ,CAAE,GAAI,cAAe,GAAI,qBAAsB,GAAI,aAAc,GAAI,kBAAmB,EAChG,KAAO,MAAM,CAAC,EAClB,QAAS,KAAK,GACZ,GAAI,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,cAAe,EAAE,IAAM,KAAM,CAI/D,IAAI,EAAI,GAAG,CAAC,EACZ,OAAQ,GAAK,OAAO,GAAM,SAAY,EAAI,CAAE,GAAI,EAAG,OAAQ,CAAE,CAC/D,CAEF,OAAO,IACT,CAGA,SAAS,WAAW,IAAK,CACvB,IAAI,MAAQ,OAAO,iBAAmB,CAAC,GAAG,GAAG,GAAK,CAAC,EACnD,MAAO,CAAE,SAAU,MAAM,QAAQ,KAAK,QAAQ,EAAI,KAAK,SAAW,CAAC,EAAG,QAAS,KAAK,SAAW,CAAC,CAAE,CACpG,CAIA,SAAS,YAAY,EAAG,KAAM,CAC5B,GAAI,YAAY,IAAI,EAAG,MAAO,CAAC,CAAC,cAAc,CAAC,GAAK,WAAW,CAAC,GAAK,EAMrE,GAAI,OAAO,mBAAoB,CAC7B,IAAI,EAAI,YAAY,CAAC,EACrB,GAAI,CAAC,EAAG,MAAO,GACf,IAAI,GAAK,OAAO,qBAChB,GAAI,GAAI,CACN,IAAI,KAAO,SAAU,EAAG,CAAE,OAAO,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,cAAe,EAAE,CAAG,EACrF,QAAS,MAAM,GACb,GAAI,KAAK,EAAE,IAAM,KAAK,EAAE,MAAM,EAAG,OAAO,OAAO,GAAG,EAAE,CAAC,EAAI,CAE7D,CACA,OAAO,EAAE,YAAc,EACzB,CACA,IAAI,EAAI,OAAO,gBAAiB,MAAQ,GAAK,EAAE,MAAM,GAAG,EAAG,OAAS,OAAS,MAAM,OAAO,MAAS,SAAW,KAAO,MAAM,IAAI,EAC/H,OAAK,OACE,OAAO,CAAC,IAAM,GADD,EAEtB,CAKA,SAAS,YAAY,EAAG,KAAM,CAC5B,GAAI,YAAY,IAAI,EAAG,OAAO,KAAK,MAAM,WAAW,CAAC,EAAI,CAAC,EAAI,EAC9D,GAAI,CAAC,OAAO,oBAAsB,CAAC,OAAO,qBAAsB,MAAO,KACvE,IAAI,EAAI,YAAY,CAAC,EACrB,GAAI,CAAC,EAAG,MAAO,KACf,IAAI,KAAO,SAAU,EAAG,CAAE,OAAO,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,cAAe,EAAE,CAAG,EACrF,QAAS,MAAM,OAAO,qBACpB,GAAI,KAAK,EAAE,IAAM,KAAK,EAAE,MAAM,EAAG,CAC/B,IAAI,EAAI,OAAO,OAAO,qBAAqB,EAAE,CAAC,EAC9C,OAAO,MAAM,CAAC,EAAI,IAAW,KAAK,IAAI,EAAG,CAAC,CAC5C,CAEF,MAAO,IACT,CAEA,IAAI,OAAS,KAAK,iBAAiB,eAAe,EAC9C,cAAgB,SAAS,eAAe,eAAe,EACvD,WAAa,SAAS,eAAe,YAAY,EACjD,UAAY,SAAS,eAAe,WAAW,EAC/C,UAAY,SAAS,eAAe,WAAW,EAG/C,aAAe,SAAS,iBAAiB,8BAA8B,EACvE,QAAU,SAAS,eAAe,SAAS,EAC3C,QAAU,KAGd,SAAS,KAAK,UAAU,IAAI,WAAW,EACvC,IAAI,UAAY,GAKhB,SAAS,cAAc,EAAG,CACxB,IAAI,KAAO,SAAS,KACpB,KAAK,UAAU,OAAO,YAAa,YAAa,YAAa,WAAW,EACxE,KAAK,UAAU,IAAI,UAAY,CAAC,CAClC,CAQA,IAAI,SAAW,SAAS,eAAe,UAAU,EACjD,SAAS,WAAW,EAAG,CACrB,GAAK,SACL,KAAI,IAAM,SAAS,cAAc,+BAAiC,EAAI,IAAI,EAC1E,GAAK,IACL,KAAI,KAAO,IAAI,aAAa,WAAW,GAAK,GACxC,SAAS,cAAgB,OAI7B,SAAS,UAAU,IAAI,QAAQ,EAC/B,WAAW,UAAY,CACrB,SAAS,YAAc,KACvB,SAAS,UAAU,OAAO,QAAQ,CACpC,EAAG,GAAG,IACR,CAEA,IAAI,YAAc,EAClB,SAAS,OAAO,EAAG,CAKb,IAAM,UAOV,QAAU,EACV,KAAK,UAAU,IAAI,eAAe,EAGlC,cAAc,CAAC,EAGX,KAAK,UAAU,SAAS,wBAAwB,IAClD,KAAK,UAAU,OAAO,YAAa,YAAa,YAAa,WAAW,EACxE,KAAK,UAAU,IAAI,UAAY,CAAC,GAGlC,WAAW,CAAC,EAIZ,OAAO,QAAQ,SAAU,GAAI,CAAE,GAAG,UAAU,OAAO,SAAU,GAAG,QAAQ,IAAM,CAAC,CAAG,CAAC,EAC/E,gBACF,cAAc,UAAU,IAAI,QAAQ,EACpC,WAAW,UAAY,CACrB,cAAc,YAAc,KAAK,CAAC,EAAE,KACpC,cAAc,UAAU,OAAO,QAAQ,CACzC,EAAG,GAAG,GAEJ,UAIF,QAAQ,UAAU,IAAI,QAAQ,EAC9B,WAAW,UAAY,CACrB,QAAQ,YAAc,KAAK,CAAC,EAAE,KAC9B,QAAQ,UAAU,OAAO,QAAQ,CACnC,EAAG,GAAG,GAEJ,aACF,WAAW,UAAU,IAAI,QAAQ,EACjC,WAAW,UAAY,CACrB,WAAW,YAAc,KAAK,CAAC,EAAE,MACjC,WAAW,UAAU,OAAO,QAAQ,CACtC,EAAG,GAAG,GAEJ,YAAW,UAAU,QAAQ,EAAI,GAIjC,cAAgB,aAAa,QAC/B,aAAa,QAAQ,SAAU,EAAG,CAAE,EAAE,UAAU,OAAO,SAAU,EAAE,QAAQ,IAAM,CAAC,CAAG,CAAC,EAExF,iBAAiB,CAAC,EAClB,sBAAsB,CAAC,EACvB,2BAA2B,CAAC,EAC5B,0BAA0B,CAAC,EAC3B,yBAAyB,CAAC,EAC1B,yBAAyB,CAAC,EAC1B,oBAAoB,CAAC,EACrB,kBAAkB,CAAC,EAIf,OAAO,eAAkB,YAAY,cAAc,EACnD,aAAa,aAAa,WAAW,EACzC,YAAc,WAAW,UAAY,CAGnC,KAAK,UAAU,OAAO,YAAa,YAAa,YAAa,WAAW,EACxE,KAAK,UAAU,IAAI,UAAY,CAAC,EAChC,KAAK,UAAU,OAAO,eAAe,EACrC,UAAY,EACd,EAAG,GAAG,EAER,CAGA,IAAI,UAAY,SAAS,eAAe,WAAW,EAC/C,gBAAkB,SAAS,eAAe,iBAAiB,EAC3D,UAAY,SAAS,eAAe,WAAW,EAC/C,eAAiB,GAKrB,SAAS,cAAc,EAAG,CACxB,IAAI,OAAS,SAAS,eAAe,YAAY,EACjD,GAAK,OACL,KAAI,MAAQ,SAAS,cAAc,+BAAiC,EAAI,eAAe,EAEnF,WAAa,YAAY,GAAK,UAAU,EAAE,WAC1C,OAAU,YAAc,WAAW,CAAC,GAAO,OAAS,MAAM,IAC1D,QAAU,OAAO,aAAa,KAAK,IAAM,SAAQ,OAAO,IAAM,QAC9D,KAAK,CAAC,IAAG,OAAO,IAAM,cAAgB,KAAK,CAAC,EAAE,MAAQ,YAAY,EAAI,SAAW,WACvF,CACA,SAAS,aAAa,EAAG,CACvB,IAAI,SAAW,SAAS,eAAe,cAAc,EACjD,MAAQ,SAAS,cAAc,+BAAiC,EAAI,eAAe,EACnF,UAAY,OAAS,SAAS,MAAQ,MAAM,MAAK,SAAS,IAAM,MAAM,IAC5E,CACA,SAAS,gBAAgB,QAAS,CAChC,GAAI,GAAC,SAAW,CAAC,WAEjB,KAAI,OAAS,UAAY,CACnB,UAAY,WAAa,QAAQ,QACrC,UAAU,UAAU,IAAI,aAAa,CACvC,EACA,QAAQ,iBAAiB,UAAW,MAAM,EACtC,CAAC,QAAQ,QAAU,QAAQ,YAAc,GAAG,OAAO,EACzD,CACI,WAAW,gBAAgB,SAAS,EAExC,SAAS,kBAAmB,CAC1B,GAAI,GAAC,iBAAmB,CAAC,WACzB,KAAI,OAAS,UAAU,OACnB,QAAU,WAAW,UAAU,UAAU,OAAO,aAAa,EACjE,gBAAgB,UAAU,OAAO,SAAU,MAAM,EACjD,gBAAgB,aAAa,aAAc,OAAS,aAAe,aAAa,EAClF,CACI,iBAAmB,YACrB,gBAAgB,iBAAiB,QAAS,SAAU,EAAG,CACrD,EAAE,gBAAgB,EACd,UAAU,QACZ,eAAiB,GACjB,UAAU,KAAK,EAAE,MAAM,UAAY,CAAC,CAAC,IAErC,eAAiB,GACjB,UAAU,MAAM,GAElB,iBAAiB,CACnB,CAAC,EACD,UAAU,iBAAiB,OAAQ,gBAAgB,EACnD,UAAU,iBAAiB,QAAS,gBAAgB,GAUtD,IAAI,iBAAmB,SAAS,eAAe,kBAAkB,EAC7D,sBAAwB,SAAS,eAAe,uBAAuB,EAC3E,SAAS,sBAAsB,EAAG,CAChC,GAAK,mBAAmB,CAAC,EACzB,KAAI,QAAU,mBAAmB,CAAC,EAKlC,GADI,wBAAuB,sBAAsB,IAAM,SACnD,EAAC,kBACD,iBAAiB,MAAQ,QAC7B,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACvB,iBAAiB,MAAM,QAAU,IACjC,sBAAsB,UAAY,CAChC,iBAAiB,IAAM,QACvB,sBAAsB,UAAY,CAChC,iBAAiB,MAAM,QAAU,EACnC,CAAC,CACH,CAAC,CACH,EACA,IAAI,IAAM,SACZ,CAOA,IAAI,aAAe,SAAS,eAAe,cAAc,EACrD,kBAAoB,SAAS,eAAe,mBAAmB,EACnE,qBAAuB,UAAU,YAAY,GAAK,qBAClD,SAAS,0BAA0B,EAAG,CACpC,GAAK,qBAAqB,CAAC,EAC3B,KAAI,QAAU,qBAAqB,CAAC,EAEpC,GADI,oBAAmB,kBAAkB,IAAM,SAC3C,EAAC,cACD,aAAa,MAAQ,QACzB,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACnB,UAAY,IAChB,aAAa,MAAM,QAAU,IAC7B,sBAAsB,UAAY,CAChC,aAAa,IAAM,QACnB,sBAAsB,UAAY,CAChC,aAAa,MAAM,QAAU,EAC/B,CAAC,CACH,CAAC,EACH,EACA,IAAI,IAAM,SACZ,CAKA,IAAI,cAAgB,SAAS,eAAe,eAAe,EACvD,mBAAqB,SAAS,eAAe,oBAAoB,EACrE,SAAS,2BAA2B,EAAG,CACrC,GAAK,sBAAsB,CAAC,EAC5B,KAAI,QAAU,sBAAsB,CAAC,EAErC,GADI,qBAAoB,mBAAmB,IAAM,SAC7C,EAAC,eACD,cAAc,MAAQ,QAC1B,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACnB,UAAY,IAChB,cAAc,MAAM,QAAU,IAC9B,sBAAsB,UAAY,CAChC,cAAc,IAAM,QACpB,sBAAsB,UAAY,CAChC,cAAc,MAAM,QAAU,EAChC,CAAC,CACH,CAAC,EACH,EACA,IAAI,IAAM,SACZ,CAOA,IAAI,cAAgB,SAAS,eAAe,eAAe,EACvD,iBAAmB,SAAS,eAAe,kBAAkB,EACjE,SAAS,yBAAyB,EAAG,CACnC,GAAK,gBAAgB,CAAC,EACtB,KAAI,QAAU,gBAAgB,CAAC,EAE/B,GADI,mBAAkB,iBAAiB,IAAM,SACzC,EAAC,eACD,cAAc,MAAQ,QAC1B,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACvB,cAAc,MAAM,QAAU,IAC9B,sBAAsB,UAAY,CAChC,cAAc,IAAM,QACpB,sBAAsB,UAAY,CAChC,cAAc,MAAM,QAAU,EAChC,CAAC,CACH,CAAC,CACH,EACA,IAAI,IAAM,SACZ,CAMA,IAAI,YAAc,SAAS,eAAe,aAAa,EACnD,iBAAmB,SAAS,eAAe,kBAAkB,EACjE,aAAe,UAAU,WAAW,GAAK,aACzC,SAAS,yBAAyB,EAAG,CACnC,GAAK,aAAa,CAAC,EACnB,KAAI,QAAU,aAAa,CAAC,EAE5B,GADI,mBAAkB,iBAAiB,IAAM,SACzC,EAAC,aACD,YAAY,MAAQ,QACxB,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACnB,UAAY,IAChB,YAAY,MAAM,QAAU,IAC5B,sBAAsB,UAAY,CAChC,YAAY,IAAM,QAClB,sBAAsB,UAAY,CAChC,YAAY,MAAM,QAAU,EAC9B,CAAC,CACH,CAAC,EACH,EACA,IAAI,IAAM,SACZ,CAIA,IAAI,OAAS,SAAS,eAAe,QAAQ,EACzC,YAAc,SAAS,eAAe,aAAa,EACvD,SAAS,oBAAoB,EAAG,CAC9B,GAAK,QAAQ,CAAC,EACd,KAAI,QAAU,QAAQ,CAAC,EAEvB,GADI,cAAa,YAAY,IAAM,SAC/B,EAAC,QACD,OAAO,MAAQ,QACnB,KAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CACnB,UAAY,IAChB,OAAO,MAAM,QAAU,IACvB,sBAAsB,UAAY,CAChC,OAAO,IAAM,QACb,sBAAsB,UAAY,CAChC,OAAO,MAAM,QAAU,EACzB,CAAC,CACH,CAAC,EACH,EACA,IAAI,IAAM,SACZ,CAMA,IAAI,WAAa,MAAM,UAAU,MAAM,KAAK,SAAS,iBAAiB,yBAAyB,CAAC,EAChG,SAAS,kBAAkB,EAAG,CAC5B,WAAW,QAAQ,SAAU,IAAK,CAChC,IAAI,IAAM,UAAU,GAAG,EACnB,QAAU,KAAO,IAAI,CAAC,EAC1B,GAAI,GAAC,SAAW,IAAI,MAAQ,SAC5B,IAAI,IAAI,QAAQ,aAAa,EAAG,CAAE,IAAI,IAAM,QAAS,MAAQ,CAC7D,IAAI,IAAM,IAAI,MACd,IAAI,OAAS,UAAY,CAAM,UAAY,IAAG,IAAI,IAAM,QAAS,EACjE,IAAI,IAAM,QACZ,CAAC,CACH,CAEA,SAAS,iBAAiB,EAAG,CAC3B,GAAI,GAAC,WAAa,CAAC,WACnB,KAAI,QAAU,SAAS,eAAe,UAAU,EAC5C,IAAM,aAAa,CAAC,EAGxB,GAFA,cAAc,CAAC,EAEX,IAAK,CAEP,GAAI,UAAU,QAAQ,MAAQ,KAAO,UAAU,UAAU,SAAS,WAAW,EAAG,CAC1E,CAAC,gBAAkB,UAAU,UAAU,SAAS,QAAQ,EAC1D,UAAU,KAAK,EAAE,MAAM,UAAY,CAAC,CAAC,EAC9B,UAAU,MAAM,EACzB,iBAAiB,EACjB,MACF,CAIA,IAAI,SAAW,UACf,SAAS,MAAM,EACf,IAAI,SAAW,SAAS,cAAc,OAAO,EAC7C,SAAS,GAAK,YACd,SAAS,IAAM,IACf,SAAS,QAAQ,IAAM,IACvB,SAAS,MAAQ,GACjB,SAAS,KAAO,GAChB,SAAS,YAAc,GACvB,SAAS,QAAU,OACnB,SAAS,SAAW,GACpB,SAAS,iBAAiB,OAAQ,gBAAgB,EAClD,SAAS,iBAAiB,QAAS,gBAAgB,EACnD,SAAS,WAAW,aAAa,SAAU,QAAQ,EACnD,UAAY,SAER,WAAW,UAAU,UAAU,OAAO,aAAa,EACvD,gBAAgB,QAAQ,EACpB,CAAC,gBAAkB,UAAU,UAAU,SAAS,QAAQ,GAC1D,UAAU,KAAK,EAAE,MAAM,UAAY,CAAE,iBAAiB,CAAG,CAAC,EAEvD,UAAU,UAAU,SAAS,WAAW,GAC3C,UAAU,UAAU,IAAI,WAAW,EAEjC,SAAW,UAAU,UAAU,SAAS,QAAQ,GAClD,QAAQ,UAAU,IAAI,mBAAmB,EAE3C,iBAAiB,CACnB,KAAO,CAEL,UAAU,UAAU,OAAO,WAAW,EAClC,SAAS,QAAQ,UAAU,OAAO,mBAAmB,EACzD,GAAI,CAAE,UAAU,MAAM,CAAG,OAAS,EAAG,CAAC,CACxC,CAMA,aAAa,CAAC,EAChB,CAGA,IAAI,MAAQ,SAAS,eAAe,UAAU,EAC1C,MAAQ,SAAS,eAAe,UAAU,EAC9C,GAAI,OAAS,MAAO,CASlB,IAASE,WAAT,SAAmB,EAAG,CACpB,IAAI,MAAQ,OAAO,OACnB,SAAW,KAAK,IAAI,EAAG,KAAK,IAAI,MAAQ,EAAG,CAAC,CAAC,EAC7C,OAAO,QAAQ,SAAU,EAAG,GAAI,CAC9B,EAAE,UAAU,OAAO,SAAU,KAAO,QAAQ,EAC5C,EAAE,aAAa,eAAgB,KAAO,SAAW,OAAS,OAAO,CACnE,CAAC,EACD,OAAO,QAAQ,SAAU,EAAG,GAAI,CAAE,EAAE,UAAU,OAAO,SAAU,KAAO,QAAQ,CAAG,CAAC,EAC9E,UAAS,QAAQ,YAAe,SAAW,EAAK,MAAQ,OAGxD,WAAa,WAAa,UAAU,UAAU,SAAS,WAAW,IAChE,OAAO,QAAQ,IAAM,UAClB,gBAAgB,UAAU,KAAK,EAAE,MAAM,UAAY,CAAC,CAAC,EAE1D,UAAU,MAAM,GAIpB,MAAM,UAAU,OACd,oBACA,OAAO,QAAQ,IAAM,WAAa,WAAa,UAAU,UAAU,SAAS,WAAW,CACzF,EAGA,MAAM,UAAU,OAAO,gBAAiB,OAAO,QAAQ,IAAM,SAAS,EAGtE,iBAAiB,EAEjB,IAAI,YAAc,OAAO,QAAQ,EAC7B,cAAgB,OAAO,WAAW,oCAAoC,EAAE,QACxE,iBAAmB,UAAY,SAAS,SAAS,SAAS,aAAa,GAAK,SAAS,cAAc,QAAQ,gBAAgB,EAC/H,GAAI,aAAe,WAAa,CAAC,eAAiB,SAAS,QAAQ,QAAQ,GAAK,kBAAmB,CACjG,IAAI,GAAK,YAAY,sBAAsB,EACvC,GAAK,SAAS,sBAAsB,EAMpC,WAAa,iBAAiB,QAAQ,EAAE,gBAAkB,SAC1D,WACE,GAAG,IAAM,GAAG,IAAK,SAAS,WAAa,GAAG,IAAM,GAAG,IAAM,EACpD,GAAG,OAAS,GAAG,SAAQ,SAAS,WAAa,GAAG,OAAS,GAAG,OAAS,GAE1E,GAAG,KAAO,GAAG,KAAM,SAAS,YAAc,GAAG,KAAO,GAAG,KAAO,EACzD,GAAG,MAAQ,GAAG,QAAO,SAAS,YAAc,GAAG,MAAQ,GAAG,MAAQ,EAE/E,CACF,EAWSC,aAAT,UAAuB,CACrB,IAAI,EAAI,MAAM,YACd,GAAI,IAAM,EACV,KAAI,EAAI,KAAK,MAAM,MAAM,WAAa,CAAC,EACnC,IAAM,UAAUD,WAAU,CAAC,EACjC,EACSE,QAAT,UAAkB,CAChB,GAAI,YAAc,KAClB,WAAY,KACZ,aAAa,QAAQ,EAGrB,IAAI,EAAI,MAAM,YACV,EAAI,GAAK,KAAK,IAAI,MAAM,WAAa,KAAK,MAAM,MAAM,WAAa,CAAC,EAAI,CAAC,EAAI,GAAGD,aAAY,EAClG,EACSE,SAAT,SAAiB,EAAG,CAClB,IAAI,MAAQ,OAAO,OACf,QAAW,EAAI,MAAS,OAAS,MACrC,UAAY,OACZ,aAAa,QAAQ,EACrB,SAAW,WAAWD,QAAQ,IAAI,EAClC,MAAM,SAAS,CAAE,KAAM,OAAS,MAAM,YAAa,SAAU,WAAa,UAAU,QAAU,OAAS,QAAS,CAAC,EACjHF,WAAU,MAAM,CAClB,EAmESI,OAAT,UAAiB,CACf,GAAK,GACL,OAAM,UAAU,OAAO,UAAU,EACjC,IAAI,EAAI,MAAM,YACd,GAAI,EAAI,EAAG,CACT,IAAI,EAAI,KAAK,MAAM,MAAM,WAAa,CAAC,EACvC,MAAM,SAAS,CAAE,KAAM,EAAI,EAAG,SAAU,QAAS,CAAC,CACpD,CACA,GAAK,KACP,EAhKS,UAAAJ,WA6DA,YAAAC,aAMA,OAAAC,QASA,QAAAC,SA2EA,MAAAC,OA/JL,OAAS,MAAM,iBAAiB,QAAQ,EACxC,SAAW,SAAS,eAAe,WAAW,EAC9C,OAAS,SAAW,SAAS,iBAAiB,IAAI,EAAI,CAAC,EACvD,QAAU,SAAS,eAAe,YAAY,EAC9C,QAAU,MAAM,cAAc,aAAa,EAC3C,QAAU,MAAM,cAAc,aAAa,EAC3C,SAAW,EA4DX,UAAY,KACZ,SAAW,KACX,UAAY,OAAO,YAAc,OAAO,WAAW,kCAAkC,EA0BrF,UAAY,KAChB,MAAM,iBAAiB,SAAU,UAAY,CACvC,YACJ,UAAY,sBAAsB,UAAY,CAE5C,GADA,UAAY,KACR,YAAc,KAAM,CACtB,IAAI,EAAI,MAAM,YACV,EAAI,GAAK,KAAK,MAAM,MAAM,WAAa,CAAC,IAAM,WAAa,KAAK,IAAI,MAAM,WAAa,UAAY,CAAC,EAAI,GAAGF,QAAO,EACtH,MACF,CACAD,aAAY,CACd,CAAC,EACH,EAAG,CAAE,QAAS,EAAK,CAAC,EACpB,MAAM,iBAAiB,YAAaC,OAAM,EAE1C,MAAM,iBAAiB,cAAe,UAAY,CAAE,UAAY,KAAM,aAAa,QAAQ,CAAG,CAAC,EAE3F,WAGF,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,KAAO,SAAS,sBAAsB,EACtC,OAAS,EAAE,SAAW,KAAK,MAAQ,EAAE,QAAU,KAAK,OAAS,EAAE,SAAW,KAAK,KAAO,EAAE,QAAU,KAAK,OACvG,CAAC,QAAU,EAAE,YAAY,EAAE,eAAe,CAChD,EAAG,CAAE,QAAS,EAAM,CAAC,EACrB,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,EAAI,EAAE,OAAO,QAAQ,IAAI,EAC7B,GAAI,GAAC,GAAK,CAAC,SAAS,SAAS,CAAC,GAC9B,KAAI,EAAI,SAAS,EAAE,QAAQ,EAAG,EAAE,EAC5B,OAAO,SAAS,CAAC,GAAGC,SAAQ,CAAC,EACnC,CAAC,GAWC,WAAU,SAAS,MAAM,UAAY,IACrC,SAAS,QAAQ,iBAAiB,QAAS,UAAY,CAAEA,SAAQ,SAAW,CAAC,CAAG,CAAC,EACjF,SAAS,QAAQ,iBAAiB,QAAS,UAAY,CAAEA,SAAQ,SAAW,CAAC,CAAG,CAAC,EAErF,MAAM,SAAW,EACjB,MAAM,iBAAiB,UAAW,SAAU,EAAG,CACzC,EAAE,MAAQ,cAAeA,SAAQ,SAAW,CAAC,EAAG,EAAE,eAAe,GACjE,EAAE,MAAQ,eAAgBA,SAAQ,SAAW,CAAC,EAAG,EAAE,eAAe,EACxE,CAAC,EAGD,IAAI,GAAK,KACT,MAAM,iBAAiB,cAAe,SAAU,EAAG,CAC7C,EAAE,OAAO,QAAQ,QAAQ,IAC7B,GAAK,CAAE,EAAG,EAAE,QAAS,KAAM,MAAM,WAAY,MAAO,CAAE,EACtD,MAAM,kBAAkB,EAAE,SAAS,EACnC,MAAM,UAAU,IAAI,UAAU,EAChC,CAAC,EACD,MAAM,iBAAiB,cAAe,SAAU,EAAG,CACjD,GAAK,GACL,KAAI,GAAK,EAAE,QAAU,GAAG,EACxB,GAAG,MAAQ,KAAK,IAAI,GAAG,MAAO,KAAK,IAAI,EAAE,CAAC,EAC1C,MAAM,WAAa,GAAG,KAAO,GAC/B,CAAC,EAWD,MAAM,iBAAiB,YAAaC,MAAK,EACzC,MAAM,iBAAiB,gBAAiBA,MAAK,EAE7CJ,WAAU,CAAC,CACb,CAGA,iBAAiB,OAAO,EAGxB,SAAS,UAAW,CAClB,GAAI,YAAY,EAAG,OAAO,UAAU,EACpC,IAAI,OAAS,YAAY,MAAM,IAAI,GAAK,EAEpC,QAAU,MAAM,MAAQ,MAAQ,EAAI,EACxC,OAAO,OAAS,OAClB,CACA,SAAS,eAAgB,CACvB,OAAO,MAAM,IAAI,GAAK,MAAM,IAAI,GAAK,MAAM,IAAI,GAAK,MAAM,IAAI,EAChE,CAGA,SAAS,aAAa,EAAG,CACvB,IAAI,KAAO,aAAa,EACxB,OAAO,cAAc,EAAI,MAAQ,SAAS,GAAK,UAAU,MAAM,IAAI,EAAE,WACnE,YAAY,CAAC,GAAK,MAAM,IAAI,CAAC,EAAI,MAAQ,YAAY,CAAC,CAC1D,CACA,SAAS,iBAAkB,CACzB,aAAa,CACf,CAOA,IAAI,kBAAoB,KAAK,UAAU,SAAS,wBAAwB,EACpE,aAAe,GAEnB,SAAS,mBAAoB,CAC3B,KAAK,iBAAiB,uBAAuB,EAAE,QAAQ,SAAU,OAAQ,CACvE,IAAI,SAAW,OAAO,OAAO,QAAQ,aAAa,EAC9C,UAAY,WAAW,QAAQ,EAAE,UACjC,SAAW,WAAa,UAAU,EACtC,OAAO,UAAU,OAAO,WAAY,QAAQ,EAC5C,OAAO,aAAa,eAAgB,SAAW,OAAS,OAAO,EAC/D,OAAO,aAAa,gBAAiB,UAAY,QAAU,MAAM,EACjE,OAAO,aAAa,aAAc,SAAW,WAAa,UAAY,GAAK,gBAAgB,EAC3F,OAAO,SAAW,CAAC,WAAa,aAChC,OAAO,SAAW,UAAY,UAAY,EAAI,EAChD,CAAC,EACD,KAAK,iBAAiB,6BAA6B,EAAE,QAAQ,SAAU,MAAO,CAE5E,GAAI,CAAC,MAAM,cAAc,gBAAgB,EAAG,CAC1C,IAAI,MAAQ,MAAM,cAAc,sCAAsC,EAClE,QAAO,MAAM,SAAW,EAC9B,CACF,CAAC,EACD,KAAK,iBAAiB,uBAAuB,EAAE,QAAQ,SAAU,MAAO,CACtE,MAAM,YAAc,mBAAqB,UAAU,EAAI,OACzD,CAAC,CACH,CAEA,SAAS,2BAA4B,CAGnC,GAAI,cAAY,GAAK,WAAW,EAAE,WAClC,KAAI,UAAY,CAAC,GAAI,GAAI,EAAE,EAAE,KAAK,SAAU,SAAU,CAAE,OAAO,WAAW,QAAQ,EAAE,SAAW,CAAC,EAC5F,YAAW,MAAM,cAAgB,WACvC,CAEA,SAAS,kBAAmB,CAC1B,0BAA0B,EAC1B,kBAAkB,EAClB,IAAI,YAAc,mBAAmB,EACrC,KAAK,UAAU,OAAO,aAAc,WAAW,EAE/C,IAAIK,OAAQ,SAAS,iBAAiB,kBAAkB,EACxDA,OAAM,QAAQ,SAAU,KAAM,CAC5B,IAAI,KAAO,KAAK,QAAQ,KACxB,GAAK,KACL,KAAI,EAAI,UAAU,IAAI,EAClB,WAAa,KAAK,cAAc,kBAAkB,EAClD,aAAY,WAAW,OAAS,EAAE,CAAC,YAAY,IAAI,GAAK,EAAE,WAAa,EAAE,IAAM,EAAE,QACrF,IAAI,WAAa,YAAY,IAAI,GAAK,EAClC,WAAa,YAAc,MAAM,MAAQ,MAAQ,EAAI,GACrD,aAAe,YAAY,IAAI,EAAI,UAAU,EAAI,WAAa,GAC9D,QAAU,KAAK,cAAc,sBAAsB,EACvD,GAAI,QAAS,CACX,IAAI,YAAc,EAAE,WAAa,EAAE,MAAQ,GAAK,aAAe,EAC/D,QAAQ,OAAS,CAAC,YAClB,QAAQ,MAAM,QAAU,YAAc,GAAK,OAC3C,QAAQ,YAAc,YAAc,MAAM,EAAE,MAAQ,aAAc,EAAI,EAAI,WAAa,EACzF,CACA,GAAI,YAAY,IAAI,EAAG,CACrB,IAAI,aAAe,KAAK,cAAc,QAAQ,EAC1C,eAAc,aAAa,YAAc,MAAM,EAAE,KAAK,GAC1D,IAAI,WAAa,KAAK,cAAc,MAAM,EACtC,aAAc,WAAW,YAAc,MAAM,EAAE,GAAG,EAAG,WAAW,OAAS,CAAC,EAAE,IAAK,WAAW,MAAM,QAAU,EAAE,IAAM,GAAK,QAC7H,IAAI,OAAS,KAAK,cAAc,mBAAmB,EAC/C,SAAQ,OAAO,YAAc,UAAU,EAAI,WAC/C,KAAK,aAAa,gBAAiB,EAAE,UAAY,QAAU,MAAM,EACjE,MACF,CACA,IAAI,UAAY,KAAK,cAAc,qBAAqB,EACpD,YAAW,UAAU,YAAc,YAAc,aAAe,EAAI,SAAW,aACnF,IAAI,MAAQ,KAAK,cAAc,MAAM,EACjC,QAAU,KAAK,cAAc,QAAQ,EACrC,OAAS,KAAK,cAAc,OAAO,EACnC,OAAS,KAAK,cAAc,kBAAkB,EAC9C,UAAS,QAAQ,YAAc,MAAM,EAAE,KAAK,GAChD,KAAK,aAAa,gBAAiB,EAAE,UAAY,QAAU,MAAM,EAGjE,IAAI,SAAW,OAAO,OAAO,sBAAsB,EAC/C,oBAAsB,GACtB,UAAY,oBAAsB,EAAE,IAAM,KAAK,MAAM,SAAW,WAAa,GAAG,EAAI,IACpF,cAAgB,EAAE,YAAc,qBAAwB,OAAO,SAAS,QAAQ,GAAK,SAAW,IAClG,OAAO,SAAS,SAAS,GAAK,UAAY,EAAE,MAC1C,UAAY,KAAK,cAAc,aAAa,EAEhD,GADI,WAAW,UAAU,UAAU,OAAO,iBAAkB,CAAC,EAAE,OAAS,cAAc,EAClF,MAAO,CAGT,GAFA,MAAM,UAAU,IAAI,gBAAgB,EACpC,MAAM,YAAc,GAChB,cAAe,CACjB,IAAIC,WAAY,SAAS,cAAc,MAAM,EAC7CA,WAAU,UAAY,kBACtBA,WAAU,YAAc,oBAAsB,iBAAmB,kBACjE,IAAI,WAAa,SAAS,cAAc,MAAM,EAC9C,WAAW,UAAY,wBACvB,WAAW,YAAc,MAAM,SAAS,EACxC,MAAM,YAAYA,UAAS,EAC3B,MAAM,YAAY,UAAU,CAC9B,CACA,MAAM,OAAS,CAAC,cAChB,MAAM,MAAM,QAAU,cAAgB,GAAK,MAC7C,CACI,SAAQ,OAAO,YAAc,QAAU,MAAM,EAAE,QAAQ,EAAI,SAAQ,EAAE,SAAW,KAChF,SAAU,OAAO,YAAc,QAAU,EAAE,SAAW,IAAK,OAAO,MAAM,QAAU,EAAE,SAAW,GAAK,QAC1G,CAAC,EACD,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,SAAU,GAAI,CACnE,GAAG,YAAc,SACnB,CAAC,EACD,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,GAAI,CACrE,IAAIC,MAAO,OAAO,OAAO,sBAAsB,EAC/C,GAAG,YAAcA,MAAO,EAAI,SAAQ,MAAMA,MAAO,GAAI,EAAI,EAAI,WAAa,EAC5E,CAAC,EACD,IAAI,QAAU,SAAS,cAAc,0BAA0B,EAC/D,GAAI,QACF,GAAI,OAAO,mBAAoB,CAK7B,IAAI,OAAS,OAAO,OAAO,sBAAsB,EACjD,QAAQ,YAAc,OAAS,EAAI,MAAM,MAAM,EAAI,mBACrD,KAAO,CACL,IAAI,KAAO,SAAS,OAAQ,MAAM,EAClC,QAAQ,YAAc,MAAM,KAAK,KAAK,CACxC,CAEJ,CACA,SAAS,iBAAiB,wBAAyB,UAAW,CAC5D,iBAAiB,EACjB,aAAa,EACb,cAAc,CAChB,CAAC,EAED,iBAAiB,GAIhB,UAAY,CACX,IAAI,GAAM,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAG,IAAI,QAAQ,EAC/D,IAAM,kBAAkB,KAAK,EAAE,GAAK,KAAO,SAAW,OAAO,EAAE,CACrE,GAAG,EAEH,IAAI,cAAgB,SAAS,eAAe,eAAe,EACvD,eAAiB,SAAS,eAAe,gBAAgB,EACzD,OAAS,SAAS,eAAe,cAAc,EAQ/C,UAAmB,SAAS,eAAe,WAAW,EACtD,aAAmB,SAAS,eAAe,cAAc,EACzD,eAAmB,SAAS,eAAe,gBAAgB,EAC3D,cAAmB,SAAS,eAAe,eAAe,EAC1D,gBAAkB,EAClB,eAAmB,SAAS,eAAe,gBAAgB,EAC3D,aAAmB,SAAS,eAAe,cAAc,EACzD,oBAAsB,SAAS,eAAe,qBAAqB,EACnE,cAAmB,SAAS,iBAAiB,2BAA2B,EAYxE,WAAa,KAQjB,SAAS,cAAe,CACtB,IAAI,KAAO,KACX,OAAC,KAAM,IAAI,EAAE,QAAQ,SAAU,KAAM,CACnC,IAAI,EAAI,UAAU,IAAI,EACtB,GAAK,EAAE,UACP,KAAI,IAAM,EAAE,OAAS,YAAY,IAAI,EAAI,KACrC,CAAC,MAAQ,IAAM,KAAK,OAAK,KAAO,CAAE,IAAK,IAAK,KAAM,KAAM,MAAO,EAAE,MAAO,KAAM,YAAY,IAAI,EAAI,EAAG,GAC3G,CAAC,EACM,IACT,CAEA,SAAS,eAAe,KAAM,CAC5B,GAAI,kBAAmB,CACrB,GAAI,aAAc,MAAO,eACzB,IAAI,OAAS,UAAU,MAAM,IAAI,EACjC,GAAI,CAAC,OAAO,UAAW,MAAO,uBAC9B,IAAI,SAAW,cAAc,IAAM,SAAS,GAAK,SAAS,EAAI,EAC9D,OAAQ,SAAW,cAAgB,kBAAoB,SAAQ,MAAM,OAAO,KAAK,EAAI,SACvF,CAEA,IAAI,MAAQ,aAAa,EACzB,OAAI,MAAc,cAAgB,MAAM,MAAM,IAAK,EAAI,EAAI,qBACpD,OAAS,QAAU,0BAA4B,yBACxD,CAEA,SAAS,wBAAyB,CAChC,IAAI,GAAK,SAAS,cAAc,oBAAoB,EACpD,GAAK,GACL,KAAI,UAAY,UAAU,MAAM,IAAI,EAAE,UACtC,GAAG,OAAS,UACZ,GAAG,YAAc,UAAY,GAAK,kEACpC,CAEA,SAAS,eAAgB,CACvB,GAAK,aAGL,IAFA,aAAa,SAAW,mBAAqB,aAC7C,aAAa,UAAY,eAAe,UAAU,EAC9C,cAAe,CACjB,IAAI,UAAY,YAAY,EAAI,eAAe,EAAI,cAAc,MAAM,IAAI,GAAK,YAAY,MAAM,IAAI,GAAK,GAC3G,aAAa,eAAe,EACxB,cAAc,cAAgB,WAChC,cAAc,UAAU,IAAI,QAAQ,EACpC,gBAAkB,WAAW,UAAY,CACvC,cAAc,YAAc,UAC5B,cAAc,UAAU,OAAO,QAAQ,CACzC,EAAG,GAAG,GACC,cAAc,UAAU,OAAO,QAAQ,CAClD,CAGA,IAAI,EAAI,UAAU,MAAM,IAAI,EAS5B,GARI,GAAK,iBAAgB,eAAe,YAAc,MAAM,EAAE,KAAK,GAC/D,GAAK,eAAgB,aAAa,YAAc,MAAM,EAAE,GAAG,EAAG,aAAa,OAAS,CAAC,EAAE,IAAK,aAAa,MAAM,QAAU,EAAE,IAAM,GAAK,QAItI,qBAAuB,KAAK,OAAO,IACrC,oBAAoB,YAAc,KAAK,OAAO,EAAE,MAE9C,eAAgB,CAClB,IAAI,QAAU,SAAS,cACrB,+BAAiC,QAAU,eAC7C,EACI,SAAW,eAAe,MAAQ,QAAQ,MAC5C,eAAe,IAAM,QAAQ,IAEjC,CAGI,eAAiB,cAAc,QACjC,cAAc,QAAQ,SAAU,EAAG,CACjC,EAAE,UAAU,OAAO,SAAU,EAAE,QAAQ,IAAM,OAAO,EAWpD,IAAI,GAAK,EAAE,aAAa,QAAQ,IAAM,QACtC,EAAE,aAAa,eAAgB,GAAK,OAAS,OAAO,EACpD,IAAI,MAAQ,OAAO,aAAgB,WAAa,YAAY,EAAE,aAAa,QAAQ,CAAC,EAAI,GAKxF,EAAE,SAAW,GACb,EAAE,UAAU,OAAO,aAAc,CAAC,KAAK,EACvC,IAAI,IAAM,KAAK,EAAE,aAAa,QAAQ,CAAC,GAAK,CAAC,GAAG,MAAQ,EAAE,aAAa,QAAQ,EAC/E,EAAE,aAAa,aAAc,MAAQ,GAAK,GAAK,eAAe,CAClE,CAAC,EAEH,CAGI,eAAiB,cAAc,QACjC,cAAc,QAAQ,SAAU,IAAK,CACnC,IAAI,iBAAiB,QAAS,UAAY,CACxC,IAAI,EAAI,IAAI,QAAQ,EAChB,GAAG,OAAO,CAAC,CACjB,CAAC,CACH,CAAC,EAIH,SAAS,qBAAsB,CAC7B,IAAI,EAAI,UAAU,MAAM,IAAI,EACxB,MAAQ,KAAK,cAAc,uBAAuB,EAClD,QAAU,KAAK,cAAc,yBAAyB,EACtD,MAAQ,EAAE,WAAa,EAAE,MAAQ,EACjC,QAAO,MAAM,OAAS,CAAC,OACvB,UAAS,QAAQ,YAAc,OAAS,CAAC,YAAY,EAAI,wBAAwB,MAAM,IAAI,EAAI,GACrG,CAEA,SAAS,cAAe,CAItB,CAAC,KAAM,KAAM,KAAM,IAAI,EAAE,QAAQ,SAAU,EAAG,CACxC,MAAM,IAAI,CAAC,GAAK,CAAC,YAAY,CAAC,IAAG,MAAM,IAAI,CAAC,EAAI,GACpD,IAAI,IAAM,YAAY,CAAC,EACnB,MAAM,IAAI,CAAC,EAAI,MAAK,MAAM,IAAI,CAAC,EAAI,IACzC,CAAC,EACD,IAAI,IAAM,SAAS,EACf,IAAM,cAAc,EACpB,UAAY,IAAM,IA+BtB,GA9BA,KAAK,UAAU,OAAO,aAAc,YAAY,CAAC,EACjD,KAAK,QAAQ,aAAe,MAAM,KAClC,KAAK,QAAQ,UAAY,UAAU,EACnC,KAAK,QAAQ,cAAgB,UAAU,EACvC,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,SAAU,GAAI,CAAE,GAAG,OAAS,CAAC,YAAY,CAAG,CAAC,EACpG,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,GAAI,CAAE,GAAG,YAAc,UAAU,CAAG,CAAC,EACxG,SAAS,iBAAiB,sBAAsB,EAAE,QAAQ,SAAU,GAAI,CAAE,GAAG,YAAc,iBAAiB,CAAG,CAAC,EAChH,SAAS,iBAAiB,2BAA2B,EAAE,QAAQ,SAAU,IAAK,CACvE,IAAI,QAAQ,WAAY,IAAI,QAAQ,SAAW,IAAI,aAAa,KAAK,EAAG,IAAI,QAAQ,SAAW,IAAI,KACxG,IAAI,KAAO,IAAI,QAAQ,MAAM,EAAG,EAAI,MAAQ,KAAK,QAAQ,EACrD,OAAS,YAAY,GAAK,UAAU,EAAE,OAAS,UAAU,EAAE,OAAO,CAAC,EAAI,IAAI,QAAQ,SACnF,QAAU,IAAI,aAAa,KAAK,IAAM,SAAQ,IAAI,IAAM,QAC5D,IAAI,IAAM,YAAY,GAAK,KAAK,CAAC,GAAK,CAAC,GAAG,KAAO,oBAAsB,IAAI,QAAQ,QACrF,CAAC,EAED,cAAc,OAAO,EACrB,aAAa,OAAO,EACpB,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,KAAM,CACvE,KAAK,YAAc,YAAY,EAAK,MAAQ,IAAM,8DAAgE,mEAAsE,MAAQ,EAC5L,+CACA,MAAQ,IACN,uEACA,yEACR,CAAC,EAEG,gBACF,cAAc,UAAY,MAAQ,IAAM,cAAgB,IAAM,SAAW,YAAY,EAAI,gBAAkB,YAC3G,cAAc,UAAU,OAAO,WAAY,MAAQ,KAAO,IAAM,CAAC,GAG/D,eAAgB,CAClB,IAAI,IAAM,IAAM,EAAI,KAAK,IAAI,EAAG,IAAM,GAAG,EAAI,EACzC,OAAS,eAAe,cAAc,OAAO,EAC7C,SAIF,OAAO,MAAM,UAAY,UAAY,IAAM,KAE7C,eAAe,UAAU,OAAO,WAAY,MAAQ,KAAO,IAAM,CAAC,CACpE,CAuCA,GArCA,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,IAAK,CACtE,IAAI,EAAI,IAAI,QAAQ,EAChB,EAAI,MAAM,IAAI,CAAC,EACf,QAAU,CAAC,YAAY,CAAC,EACxB,QAAU,IAAI,cAAc,UAAU,EAGtC,MAAQ,IAAI,cAAc,eAAe,EACzC,QAAO,MAAM,YAAc,GAC/B,IAAI,YAAc,KAAK,CAAC,GAAK,CAAC,GAAG,MAAQ,EACzC,CAAC,MAAM,KAAK,EAAE,QAAQ,SAAU,OAAQ,CACtC,IAAI,OAAS,QAAQ,cAAc,IAAM,MAAM,EAC/C,OAAO,aAAa,cAAe,SAAW,MAAQ,OAAS,YAAc,YAAY,EAAI,KAAO,IAAM,YAAc,YAAY,EAAI,UAAY,GAAG,EACvJ,IAAI,MAAQ,OAAO,cAAc,kBAAkB,EAC/C,QAAO,MAAM,aAAe,SAAW,MAAQ,OAAS,YAAc,YAAY,EAAI,KAAO,IACnG,CAAC,EACD,QAAQ,cAAc,MAAM,EAAE,SAAW,GAAK,EAC9C,IAAI,OAAS,IAAI,cAAc,aAAa,EACxC,SAAU,OAAO,SAAW,GAAK,EAAG,OAAO,aAAa,aAAc,WAAa,YAAY,EAAI,KAAO,QAAU,YAAc,YAAY,EAAI,UAAY,GAAG,EAAG,OAAO,YAAc,YAAY,EAAI,WAAa,UAC1N,QAAQ,cAAc,MAAM,EAAE,SAAW,CAAC,aAAa,CAAC,EACxD,IAAI,UAAU,OAAO,UAAW,OAAO,EAKvC,IAAI,aAAa,gBAAiB,QAAU,OAAS,OAAO,EAC5D,IAAI,QAAU,KAAK,CAAC,GAAK,CAAC,GAAG,MAAQ,EACrC,IAAI,aAAa,aAAc,QAAU,OAAS,gBAAkB,OAAS,KAAO,GAAK,YAAY,EAAI,uBAAyB,eAAe,EAIjJ,IAAI,QAAU,IAAI,cAAc,YAAY,EACxC,UAAS,QAAQ,YAAc,GACnC,IAAI,UAAU,OAAO,WAAY,EAAI,CAAC,EACtC,IAAI,UAAU,OAAO,UAAW,EAAI,CAAC,CACvC,CAAC,EAEG,OAAQ,CACV,IAAI,EAAI,UAAU,MAAM,IAAI,EACvB,EAAE,UAGI,MAAQ,GACjB,OAAO,SAAW,GAClB,OAAO,YAAc,iBACX,eAAe,GAMzB,OAAO,SAAW,GAClB,OAAO,YAAc,oBAAmB,MAAM,EAAE,KAAK,IANrD,OAAO,SAAW,GAClB,OAAO,YAAc,YAAY,EAAK,UAAY,EAAI,UAAY,UAAY,eAAiB,kBAAoB,IAAM,UAAa,MAAQ,EAAI,sBAAwB,YAAc,EACpL,+BACA,OAAS,UAAY,8BATzB,OAAO,SAAW,GAClB,OAAO,YAAc,mBAazB,CACI,cAAgB,SAAU,OAAO,SAAW,GAAM,OAAO,YAAc,gBAC3E,oBAAoB,EACpB,uBAAuB,EAIvB,cAAc,CAChB,CAGA,SAAS,iBAAiB,yBAAyB,EAAE,QAAQ,SAAU,GAAI,CACzE,IAAI,EAAI,GAAG,QAAQ,EACnB,GAAG,cAAc,MAAM,EAAE,iBAAiB,QAAS,SAAU,EAAG,CAC9D,EAAE,gBAAgB,EACb,aAAa,CAAC,IACnB,MAAM,IAAI,CAAC,GAAK,aAAa,EAC7B,gBAAgB,EAClB,CAAC,EACD,GAAG,cAAc,MAAM,EAAE,iBAAiB,QAAS,SAAU,EAAG,CAC9D,EAAE,gBAAgB,EACd,QAAM,IAAI,CAAC,GAAK,KACpB,MAAM,IAAI,CAAC,EAAI,KAAK,IAAI,EAAG,MAAM,IAAI,CAAC,EAAI,aAAa,CAAC,EACxD,gBAAgB,EAClB,CAAC,CACH,CAAC,EAGD,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,EAAG,CACpE,EAAE,iBAAiB,QAAS,SAAU,EAAG,CACvC,GAAI,GAAE,OAAO,QAAQ,uBAAuB,EAC5C,KAAI,EAAI,EAAE,QAAQ,EAElB,GADA,OAAO,CAAC,EACJ,cACJ,GAAI,SAAS,IAAM,EAAG,CACpB,GAAI,CAAC,UAAU,MAAM,IAAI,EAAE,WAAa,CAAC,YAAY,CAAC,GAAK,YAAY,CAAC,EAAI,EAAG,OAC/E,OAAO,KAAK,MAAM,GAAG,EAAE,QAAQ,SAAU,IAAK,CAAE,MAAM,IAAI,GAAG,EAAI,MAAQ,EAAI,EAAI,CAAG,CAAC,EACrF,gBAAgB,CAClB,MAAW,OAAO,WAAW,oBAAoB,EAAE,SAAW,aAAa,CAAC,IAC1E,MAAM,IAAI,CAAC,GAAK,aAAa,EAC7B,gBAAgB,GAEpB,CAAC,CACH,CAAC,EAMD,SAAS,iBAAiB,4BAA4B,EAAE,QAAQ,SAAU,IAAK,CAC7E,IAAI,iBAAiB,QAAS,SAAU,EAAG,CACzC,EAAE,gBAAgB,EAClB,IAAI,EAAI,IAAI,QAAQ,EAChB,MAAM,IAAI,CAAC,GAAK,IACpB,MAAM,IAAI,CAAC,EAAI,KAAK,IAAI,EAAG,MAAM,IAAI,CAAC,EAAI,aAAa,CAAC,EACxD,gBAAgB,EAClB,CAAC,CACH,CAAC,EAGD,aAAa,QAAQ,SAAU,EAAG,CAChC,EAAE,iBAAiB,QAAS,UAAY,CACtC,OAAO,EAAE,QAAQ,CAAC,CACpB,CAAC,CACH,CAAC,GAIA,UAAY,CACX,GAAI,CACF,IAAI,EAAI,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC9C,KAAO,EAAE,IAAI,QAAQ,GAAK,EAAE,IAAI,SAAS,GAAK,IAAI,YAAY,EAClE,GAAI,CAAC,IAAK,OACV,IAAI,IAAM,CACR,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAClC,eAAgB,KAAM,YAAe,KAAM,MAAS,KACpD,sBAAuB,KAAM,mBAAsB,KAAM,WAAc,KACvE,WAAc,KAAM,cAAe,KACnC,oBAAqB,KAAM,iBAAoB,KAAM,OAAU,IACjE,EACI,EAAI,IAAI,GAAG,EACX,GAAG,OAAO,CAAC,CACjB,OAAS,EAAG,CAAC,CACf,GAAG,EAMH,SAAS,eAAe,MAAO,OAAQ,CACrC,GAAI,CAAC,OAAS,CAAC,MAAM,OAAQ,OAC7B,IAAI,KAAO,MAAM,UAAU,MAAM,KAAK,KAAK,EAC3C,SAAS,KAAK,OAAQ,CACpB,KAAK,QAAQ,SAAU,EAAG,CACxB,IAAI,GAAK,IAAM,OACf,EAAE,aAAa,eAAgB,GAAK,OAAS,OAAO,EACpD,EAAE,SAAW,GAAK,EAAI,EACxB,CAAC,CACH,CACA,KAAK,QAAQ,SAAU,EAAG,EAAG,CAC3B,EAAE,iBAAiB,UAAW,SAAU,EAAG,CACzC,IAAI,EAAI,EAAE,IAAK,KAAO,EACtB,GAAI,IAAM,cAAgB,IAAM,YAAa,KAAO,UAC3C,IAAM,aAAe,IAAM,UAAW,KAAO,WAC7C,IAAM,KAAO,IAAM,QAAS,CAAE,EAAE,eAAe,EAAG,EAAE,MAAM,EAAG,MAAQ,KACzE,QACL,EAAE,eAAe,EAGjB,QAFI,KAAO,MAAM,EAAI,KAAO,KAAK,QAAU,KAAK,MAAM,EAClD,QAAU,EACP,KAAK,aAAa,eAAe,IAAM,QAAU,UAAY,KAAK,QAAQ,KAAO,MAAM,KAAK,QAAQ,IAAI,EAAI,KAAO,KAAK,QAAU,KAAK,MAAM,EAChJ,KAAK,aAAa,eAAe,IAAM,SAAU,KAAK,MAAM,EAAG,KAAK,MAAM,EAChF,CAAC,CACH,CAAC,EAGD,KAAK,QAAQ,SAAU,EAAG,CACxB,EAAE,iBAAiB,QAAS,UAAY,CAAM,cAAgB,EAAE,aAAa,eAAe,IAAM,SAAgB,KAAK,CAAC,EAAO,QAAQ,OAAO,CAAC,EAAG,CAAC,CACrJ,CAAC,EACD,KAAK,KAAK,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,UAAU,SAAS,UAAU,CAAG,CAAC,EAAE,CAAC,GAAK,KAAK,CAAC,CAAC,CAC3F,CAGA,IAAI,MAAQ,SAAS,iBAAiB,OAAO,EAC7C,MAAM,QAAQ,SAAU,EAAG,CACzB,EAAE,iBAAiB,QAAS,UAAY,CACtC,GAAI,GAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,WAAa,cAC5C,KAAI,SAAW,YAAY,EAC3B,MAAM,QAAQ,SAAU,EAAG,CAAE,EAAE,UAAU,OAAO,WAAY,IAAM,CAAC,CAAG,CAAC,EACvE,MAAM,KAAO,EAAE,QAAQ,KACnB,WAAa,YAAY,GAAG,kBAAkB,EAClD,eAAe,EACf,iBAAiB,EACjB,aAAa,EACf,CAAC,CACH,CAAC,EAcD,SAAS,gBAAiB,CACxB,IAAI,KAAO,MAAM,MAAQ,MAAQ,EAAI,EACrC,SAAS,iBAAiB,YAAY,EAAE,QAAQ,SAAU,GAAI,CAC5D,IAAI,KAAO,SAAS,GAAG,QAAQ,IAAK,EAAE,GAAK,EAC3C,GAAG,YAAc,KAAO,IAC1B,CAAC,CACH,CAEA,KAAK,iBAAiB,6BAA6B,EAAE,QAAQ,SAAU,MAAO,CAC5E,IAAI,QAAU,MAAM,iBAAiB,uBAAuB,EAC5D,QAAQ,QAAQ,SAAU,OAAQ,CAChC,OAAO,iBAAiB,QAAS,UAAY,CAC3C,IAAI,SAAW,OAAO,OAAO,QAAQ,aAAa,EAC9C,cAAgB,CAAC,YAAY,GAAK,CAAC,WAAW,QAAQ,EAAE,YAC5D,MAAM,cAAgB,SACtB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACf,CAAC,CACH,CAAC,EACD,eAAe,OAAO,CACxB,CAAC,EAED,eAAe,SAAS,iBAAiB,cAAc,CAAC,EAExD,IAAI,QAAU,SAAS,iBAAiB,kBAAkB,EAC1D,QAAQ,QAAQ,SAAU,EAAG,CAC3B,EAAE,iBAAiB,QAAS,UAAY,CAClC,eACJ,QAAQ,QAAQ,SAAU,EAAG,CAAE,EAAE,UAAU,OAAO,WAAY,IAAM,CAAC,CAAG,CAAC,EACzE,MAAM,IAAM,EAAE,QAAQ,IACtB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,aAAa,EACf,CAAC,CACH,CAAC,EACD,eAAe,OAAO,EACtB,eAAe,EAEf,SAAS,gBAAiB,CACxB,IAAI,IAAM,SAAS,EACf,IAAM,cAAc,EACxB,GAAI,OAAO,KAEX,QADI,KAAO,aAAa,EACjB,IAAM,KAAK,CAChB,IAAI,MAAQ,CAAC,KAAM,KAAM,KAAM,IAAI,EAChC,OAAO,SAAU,EAAG,CAAE,OAAO,MAAM,IAAI,CAAC,GAAK,IAAM,CAAC,EACpD,KAAK,SAAU,EAAG,EAAG,CAAE,OAAO,YAAY,EAAI,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,CAAG,CAAC,EAC7G,GAAI,CAAC,MAAM,OAAQ,MACnB,MAAM,IAAI,MAAM,CAAC,CAAC,GAAK,KACvB,KAAO,IACT,CACF,CAEA,GAAI,OAAQ,CAmBV,IAASC,SAAT,SAAiB,EAAG,CAAE,OAAO,OAAO,GAAK,KAAO,GAAK,CAAC,EAAE,YAAY,EAAE,QAAQ,cAAe,EAAE,CAAG,EACzFC,YAAT,SAAoB,YAAa,IAAK,KAAM,CAC1C,GAAI,YAAY,IAAI,EAAG,OAAO,aAAa,EAC3C,IAAI,KAAO,OAAO,oBAAsB,CAAC,EACzC,GAAI,OAAO,mBAAoB,CAQ7B,QAHI,OAAS,OAAS,OAAS,EAAI,SAAS,KAAM,EAAE,GAAK,EACrD,KAAO,QAAU,MAAQ,MAAQ,EAAI,GACrC,QAAU,WAAW,GAAG,EAAE,SACrB,EAAI,EAAG,EAAI,QAAQ,OAAQ,IAClC,GAAI,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,IAAM,OAAO,IAAI,EAAG,OAAO,QAAQ,CAAC,EAE1E,OAAO,IACT,CAGA,QAFI,EAAID,SAAQ,MAAQ,MAAQ,WAAa,WAAW,EACpD,EAAIA,SAAQ,WAAW,IAAI,CAAC,EACvB,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,IAAI,EAAI,KAAK,CAAC,EACd,GAAIA,SAAQ,EAAE,OAAO,IAAMA,SAAQ,cAAc,WAAW,CAAC,GAAKA,SAAQ,EAAE,OAAO,IAAM,GAAKA,SAAQ,EAAE,OAAO,IAAM,EACnH,OAAO,CAEX,CACA,OAAO,IACT,EAISE,YAAT,SAAoB,KAAM,CACxB,OAAI,YAAY,IAAI,EAAU,YAAY,EACnC,aAAa,MAAM,IAAK,IAAI,CACrC,EACSC,mBAAT,SAA2B,YAAa,CACtC,GAAI,YAAY,EAAG,CAAE,IAAI,MAAQ,cAAc,WAAW,EAAG,OAAO,MAAQ,MAAM,OAAS,IAAM,CAGjG,GAAI,OAAO,mBAAoB,CAC7B,IAAI,EAAI,YAAY,WAAW,EAC/B,GAAI,EAAG,OAAO,EAAE,MAClB,CAEA,QADI,KAAO,OAAO,oBAAsB,CAAC,EAAG,KAAOH,SAAQ,cAAc,WAAW,CAAC,EAC5E,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAO,GAAIA,SAAQ,KAAK,CAAC,EAAE,OAAO,IAAM,KAAM,OAAO,KAAK,CAAC,EAAE,QAC9F,OAAO,cAAc,WAAW,CAClC,EAKSI,oBAAT,SAA4B,WAAY,OAAQ,CAC9C,GAAI,GAAC,OAAO,oBAAsB,CAAC,YAAY,IAC/C,QAAS,KAAK,OACZ,GAAK,OAAO,CAAC,EACb,KAAI,EAAI,YAAY,EAAI,cAAc,CAAC,EAAI,YAAY,CAAC,EACpD,IAAG,WAAW,mCAAqC,EAAE,EAAE,EAAI,OAAO,CAAC,IAE3E,EACSC,eAAT,SAAuB,EAAG,CAAE,IAAI,EAAI,GAAK,EAAE,yBAA0B,OAAQ,GAAK,EAAE,OAAU,EAAE,CAAC,EAAE,gBAAkB,IAAM,EA1DlH,QAAAL,SACA,WAAAC,YA6BA,WAAAC,YAIA,kBAAAC,mBAgBA,mBAAAC,oBAQA,cAAAC,eAvEL,YAAc,CAChB,GAAI,eACJ,GAAI,sBACJ,GAAI,aACJ,GAAI,mBACN,EAMI,cAAgB,CAAE,GAAI,eAAgB,GAAI,sBAAuB,GAAI,cAAe,GAAI,mBAAoB,EAC5G,WAAa,CAAE,KAAM,iBAAkB,KAAM,iBAAkB,KAAM,iBAAkB,KAAQ,aAAc,EA6DjH,OAAO,iBAAiB,QAAS,UAAY,CAC3C,GAAI,SAAO,UAAY,cACvB,IAAI,CAAC,eAAe,GAAK,CAAC,UAAU,MAAM,IAAI,EAAE,UAAW,CAAE,aAAa,EAAG,MAAQ,CAOrF,IAAI,MAAQ,CAAC,EAEb,GADA,CAAC,KAAM,KAAM,KAAM,IAAI,EAAE,QAAQ,SAAU,EAAG,CAAE,QAAS,EAAI,EAAG,EAAI,MAAM,IAAI,CAAC,EAAG,IAAK,MAAM,KAAK,CAAC,CAAG,CAAC,EACnG,EAAC,MAAM,OACX,KAAI,QAAUJ,YAAW,MAAM,CAAC,EAAG,MAAM,IAAK,MAAM,IAAI,EACxD,GAAI,CAAC,QAAS,CACZ,QAAQ,MAAM,+BAAgC,MAAM,CAAC,EAAG,MAAM,IAAK,MAAM,IAAI,EAC7E,MACF,CAIA,IAAI,WAAa,CAAC,EACd,YAAY,GACd,WAAW,OAAS,UACpB,WAAW,aAAa,EAAI,UAAU,EAAI,WAE1C,WAAW,WAAW,EAAI,OAAO,mBAAqB,SAAS,EAAI,QAAQ,QAE7E,MAAM,QAAQ,SAAU,EAAG,EAAG,CAAE,WAAW,WAAa,EAAI,EAAE,EAAIE,mBAAkB,CAAC,CAAG,CAAC,EACzFC,oBAAmB,WAAY,MAAM,GAAG,EACxC,IAAI,KAAO,CAAE,GAAI,QAAQ,GAAI,SAAU,EAAG,WAAY,UAAW,EAC7D,GAAM,OAAO,oBAAsB,YAAY,EAAKF,YAAW,MAAM,IAAI,EAAIG,eAAc,OAAO,EACtG,IAAK,OAAO,oBAAsB,YAAY,IAAM,MAAM,OAAS,QAAU,CAAC,GAAI,CAGhF,QAAQ,MAAM,yCAA0C,MAAM,KAAM,8CAAyC,EAC7G,OAAO,YAAc,sCACrB,WAAW,UAAY,CAAE,aAAa,CAAG,EAAG,IAAI,EAChD,MACF,CAIA,GAHI,KAAI,KAAK,aAAe,IAGxB,IAAM,MAAM,OAAS,QAAU,mBAAmB,EAAG,CACvD,IAAI,QAAU,iBAAiB,MAAM,IAAI,EACrC,MAAQ,UAAU,MAAM,IAAI,EAC5B,QAAQ,WAAa,MAAM,YAC7B,WAAW,4BAA4B,EAAI,YAAY,EACnD,yBAA2B,MAAM,MAAM,QAAQ,CAAC,EAAI,qBACpD,uBAAyB,MAAM,MAAM,QAAQ,CAAC,EAAI,qBAE1D,CACA,GAAI,IAAM,MAAM,OAAS,QAAU,CAAC,YAAY,EAAG,CACjD,IAAI,MAAQ,iBAAiB,MAAM,IAAI,EACnC,MAAM,WAAa,MAAM,IAAM,MAAM,QAAO,WAAW,oBAAoB,EAAI,wBAAwB,MAAM,IAAI,EACvH,CACA,IAAI,MAAQ,CAAC,IAAI,EAEjB,GAAK,MAAM,OAGX,KAAI,SAAW,OAAO,YACtB,OAAO,SAAW,GAClB,OAAO,YAAc,eACrB,aAAe,GACf,cAAc,EAEd,MAAM,eAAgB,CACpB,OAAQ,OACR,YAAa,cACb,QAAS,CAAE,eAAgB,mBAAoB,OAAU,kBAAmB,EAC5E,KAAM,KAAK,UAAU,CAAE,MAAO,KAAM,CAAC,CACvC,CAAC,EACE,KAAK,SAAU,EAAG,CACjB,OAAK,EAAE,GACA,EAAE,KAAK,EADI,EAAE,KAAK,EAAE,KAAK,SAAU,IAAK,CAAE,MAAM,GAAK,CAAC,CAE/D,CAAC,EACA,KAAK,SAAU,SAAU,CAGxB,IAAI,WAAc,UAAY,SAAS,OAAU,CAAC,EAC9C,aAAe,WAAW,OAC1B,WAAW,WAAW,OAAS,CAAC,EAAE,IAClC,KAEJ,GAAI,OAAO,WAAa,OAAO,OAAO,UAAU,SAAY,WAC1D,OAAO,OAAO,UAAU,QAAQ,YAAY,EAAE,KAAK,UAAY,CAC7D,OAAO,UAAU,KAAK,EACtB,aAAe,GACf,OAAO,SAAW,GAClB,aAAa,CACf,CAAC,EAGH,OAAO,SAAS,KAAO,OACzB,CAAC,EACA,MAAM,SAAU,IAAK,CACpB,QAAQ,MAAM,2BAA4B,GAAG,EAC7C,OAAO,YAAe,KAAO,IAAI,aAAgB,8BAGjD,WAAW,UAAY,CACrB,aAAe,GACf,OAAO,SAAW,GAClB,aAAa,CACf,EAAG,IAAI,CACT,CAAC,IACL,CAAC,EAKD,IAAI,WAAa,SAAS,eAAe,YAAY,EACjD,aAAe,SAAS,eAAe,cAAc,EACzD,GAAI,YAAc,aAAc,CAS9B,IAASC,mBAAT,SAA2B,aAAc,CAClC,aAAa,MAClB,OAAO,iBAAiB,QAAQ,aAAc,UAAY,CACxD,aAAa,MAAM,EACf,cAAc,WAAW,MAAM,CAAE,cAAe,EAAK,CAAC,CAC5D,CAAC,CACH,EAYSC,gBAAT,UAA0B,CACxB,GAAK,WACL,KAAI,QAAU,UAAU,IAAI,EACxB,QAAU,MAAM,MAAQ,MAAQ,EAAI,EACpC,KAAO,OAAO,mBAAqB,OAAO,OAAO,sBAAsB,EAAI,SAAS,OAAQ,MAAM,EAAE,MACpG,KAAO,KAAO,QAAU,QAAQ,MAChC,GAAK,QAAQ,WAAa,QAAQ,MAAQ,GAAK,KAAO,GAAK,KAAO,EAEtE,GADA,WAAW,OAAS,CAAC,GACjB,EAAC,GACL,KAAI,OAAS,WAAW,cAAc,oBAAoB,EACtD,OAAS,WAAW,cAAc,oBAAoB,EACtD,SAAQ,OAAO,YAAc,MAAM,KAAK,MAAM,KAAO,GAAG,EAAI,GAAG,GAC/D,SAAQ,OAAO,YAAc,SAAW,UAAY,EAAI,SAAW,YAAc,sBACnF,MAAM,QAAQ,KAAK,EAAI,sGAC3B,EAmBSC,kBAAT,UAA4B,CAC1B,OAAO,iBAAiB,OAAO,aAAc,UAAY,CACnD,YAAa,UAAU,YAAc,GAAI,UAAU,OAAS,IAChED,gBAAe,EACf,IAAI,MAAQ,WAAW,cAAc,WAAW,EAC5C,WAAa,QAAO,UAAU,YAAc,MAAM,aACtD,qBAAuB,SAAS,KAAK,MAAM,SAC3C,SAAS,KAAK,MAAM,SAAW,SAC/B,aAAa,UAAU,EACvB,WAAW,aAAa,gBAAiB,MAAM,EAC3C,WAAW,UAAU,MAAM,CAAE,cAAe,EAAK,CAAC,CACxD,CAAC,CACH,EAWSE,aAAT,SAAqB,MAAO,CAC1B,IAAI,KAAO,aAAa,sBAAsB,EAC9C,OAAO,MAAM,QAAU,KAAK,MAAQ,MAAM,QAAU,KAAK,OAAS,MAAM,QAAU,KAAK,KAAO,MAAM,QAAU,KAAK,MACrH,EAUSC,mBAAT,UAA6B,CAC3B,SAAW,GACX,WAAW,SAAW,GACtB,WAAW,UAAY,UACvB,YAAY,QAAQ,SAAU,OAAQ,CAAE,OAAO,SAAW,EAAO,CAAC,EAClEJ,mBAAkB,EAAK,CACzB,EAGSK,iBAAT,SAAyB,UAAW,CAClC,GAAI,UAGJ,KAAI,MAAQ,CAAC,CAAC,OAAO,mBACjB,QAAU,MAAQ,YAAY,SAAS,EAAIV,YAAW,UAAW,OAAQ,MAAM,EAC/E,GAAK,SAAW,OAAO,QAAQ,EAAE,EAAE,QAAQ,qCAAsC,EAAE,EACvF,GAAI,CAAC,SAAW,CAAC,aAAa,KAAK,EAAE,GAAK,QAAQ,YAAc,IAAU,OAAS,YAAY,UAAW,MAAM,EAAI,EAAI,CAClH,YACF,UAAU,YAAc,2DACxB,UAAU,OAAS,IAErB,MACF,CACA,SAAW,GACX,UAAY,WAAW,UACvB,WAAW,SAAW,GACtB,WAAW,YAAc,yBACzB,YAAY,QAAQ,SAAU,OAAQ,CAAE,OAAO,SAAW,EAAM,CAAC,EACjEK,mBAAkB,EAAK,EACvB,IAAI,KAAQ,OAAO,SAAW,OAAO,QAAQ,QAAU,OAAO,QAAQ,OAAO,MAAS,IACtF,OAAO,SAAS,OAAO,KAAO,QAAU,GAAK,IAAI,EACnD,EAtHS,kBAAAA,mBAkBA,eAAAC,gBAiCA,iBAAAC,kBAuBA,YAAAC,aAaA,kBAAAC,mBASA,gBAAAC,iBAxGL,YAAc,aAAa,iBAAiB,wBAAwB,EACpE,UAAY,aAAa,cAAc,uBAAuB,EAC9D,SAAW,GACX,UAAY,WAAW,UAEvB,UAAY,aAAa,cAAc,uBAAuB,EAC9D,UAAY,aAAa,cAAc,uBAAuB,EAC9D,qBAQJ,aAAa,iBAAiB,QAAS,UAAY,CAC7C,aAAa,OACjB,WAAW,aAAa,gBAAiB,OAAO,EAC5C,uBAAyB,SAC3B,SAAS,KAAK,MAAM,SAAW,qBAC/B,qBAAuB,QAE3B,CAAC,EAGD,IAAI,WAAa,aAAa,cAAc,wBAAwB,EAgBhE,cAAgB,aAAa,cAAc,2BAA2B,EACtE,eACF,cAAc,iBAAiB,QAAS,UAAY,CAC7C,aAAa,MAClB,OAAO,iBAAiB,QAAQ,aAAc,UAAY,CACxD,aAAa,MAAM,EACnB,IAAI,YAAc,MAAM,UAAU,KAAK,KAAK,SAAS,iBAAiB,uBAAuB,EAAG,SAAU,EAAG,CAAE,OAAO,EAAE,eAAiB,IAAM,CAAC,EAC5I,aAAe,CAAC,YAAY,UAAU,SAAS,UAAU,GAAG,YAAY,MAAM,EAClF,IAAI,OAAS,SAAS,eAAe,cAAc,GAAK,YACxD,GAAK,OACL,QAAO,eAAe,CAAE,SAAU,OAAO,WAAW,kCAAkC,EAAE,QAAU,OAAS,SAAU,MAAO,OAAQ,CAAC,EAGrI,IAAI,QAAU,MAAM,UAAU,KAAK,KAAK,OAAO,iBAAiB,uCAAuC,EAAG,SAAU,GAAI,CAAE,OAAO,GAAG,eAAiB,IAAM,CAAC,GAAK,YAC7J,SAAS,QAAQ,MAAM,CAAE,cAAe,EAAK,CAAC,EACpD,CAAC,CACH,CAAC,EAeH,WAAW,iBAAiB,QAAS,SAAU,MAAO,CAChD,UAAY,WAAW,WAC3B,MAAM,gBAAgB,EACjB,aAAa,KACbL,mBAAkB,EAAI,EADHE,kBAAiB,EAE3C,CAAC,EACG,WAAW,UAAU,iBAAiB,QAAS,UAAY,CAAEF,mBAAkB,EAAI,CAAG,CAAC,EAG3F,IAAI,iBAAmB,GAKvB,aAAa,iBAAiB,cAAe,SAAU,MAAO,CAAE,iBAAmBG,aAAY,KAAK,CAAG,CAAC,EACxG,aAAa,iBAAiB,QAAS,SAAU,MAAO,CAClD,kBAAoBA,aAAY,KAAK,GAAGH,mBAAkB,EAAI,EAClE,iBAAmB,EACrB,CAAC,EACD,aAAa,iBAAiB,SAAU,SAAU,MAAO,CACvD,MAAM,eAAe,EACrBA,mBAAkB,EAAI,CACxB,CAAC,EAQD,OAAO,iBAAiB,WAAYI,kBAAiB,EAyBrD,YAAY,QAAQ,SAAU,OAAQ,CACpC,OAAO,iBAAiB,QAAS,UAAY,CAAEC,iBAAgB,OAAO,QAAQ,MAAM,CAAG,CAAC,CAC1F,CAAC,CACH,CAEF,CAEA,SAAS,iBAAiB,kBAAkB,EAAE,QAAQ,SAAU,OAAQ,CACtE,OAAO,iBAAiB,QAAS,UAAY,CAC3C,GAAI,GAAC,YAAY,GAAK,cAAgB,CAAC,WAAW,EAAE,WACpD,mBAAkB,EAElB,QADI,OAAS,UAAU,EAAI,EACpB,UAAW,GAAG,CACnB,IAAI,QAAU,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,OAAO,YAAY,EAAE,KAAK,SAAU,EAAE,EAAG,CAAE,OAAO,MAAM,IAAI,CAAC,EAAI,MAAM,IAAI,CAAC,CAAG,CAAC,EACpH,GAAI,CAAC,QAAQ,OAAQ,MACrB,MAAM,IAAI,QAAQ,CAAC,CAAC,GAAK,CAC3B,CACA,aAAa,EACf,CAAC,CACH,CAAC,EAGD,SAAS,mBAAoB,CAC3B,IAAI,QAAU,CAAC,EACf,KAAK,iBAAiB,kBAAkB,EAAE,QAAQ,SAAU,KAAM,CAChE,IAAI,KAAO,KAAK,QAAQ,KACxB,GAAI,GAAC,UAAW,KAAM,IAAI,EAAE,QAAQ,IAAI,IAAM,IAAM,QAAQ,KAAK,SAAU,OAAQ,CAAE,OAAO,OAAO,OAAS,IAAM,CAAC,GACnH,KAAI,MAAQ,UAAU,IAAI,EACtB,MAAM,WAAa,OAAO,SAAS,MAAM,KAAK,GAAK,MAAM,MAAQ,GACnE,QAAQ,KAAK,CAAC,KAAM,KAAM,KAAM,KAAM,MAAO,MAAM,KAAK,CAAC,EAE7D,CAAC,EACD,IAAI,UAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,MAAM,EAClE,OAAS,QAAQ,KAAK,SAAU,OAAQ,CAAE,OAAO,OAAO,OAAS,SAAW,CAAC,EAE5E,SAAQ,OAAS,QAAQ,KAAK,SAAU,OAAQ,CAAE,OAAO,OAAO,OAAS,IAAM,CAAC,GAChF,SACH,OAAS,QAAQ,OAAO,SAAU,OAAQ,OAAQ,CAChD,MAAO,CAAC,QAAU,OAAO,MAAQ,OAAO,MAAQ,OAAS,MAC3D,EAAG,IAAI,GAEL,QAAQ,OAAO,KAAK,MAAM,CAChC,CACA,kBAAkB,EAClB,aAAa,GAUZ,UAA0B,CAwCzB,GAvCI,CAAC,WAAa,CAAC,SAOf,UAAU,aAAe,SAAS,MACpC,SAAS,KAAK,YAAY,SAAS,EAEjC,cAQF,aAAa,iBAAiB,QAAS,UAAY,CACjD,GAAI,kBAAmB,CACrB,GAAI,aAAc,OAClB,GAAI,CAAC,OAAO,SAAU,CAAE,OAAO,MAAM,EAAG,MAAQ,CAChD,IAAI,OAAS,UAAU,MAAM,IAAI,EAAE,UAAY,SAAS,eAAe,cAAc,EAAI,SAAS,cAAc,QAAQ,EACxH,GAAI,OAAQ,CACV,OAAO,eAAe,CAAE,SAAU,OAAO,WAAW,kCAAkC,EAAE,QAAU,OAAS,SAAU,MAAO,OAAQ,CAAC,EACrI,IAAI,QAAU,OAAO,cAAc,qDAAqD,EACpF,SAAS,QAAQ,MAAM,CAAE,cAAe,EAAK,CAAC,CACpD,CACA,MACF,CAEA,IAAI,OAAS,SAAS,cAAc,aAAa,GACpC,SAAS,cAAc,YAAY,GACnC,SAAS,eAAe,cAAc,EAC/C,QACF,OAAO,eAAe,CAAE,SAAU,SAAU,MAAO,OAAQ,CAAC,CAEhE,CAAC,EAEC,EAAE,yBAA0B,SAG9B,OAcF,IAAI,UAAY,SAAS,cAAc,aAAa,EAEpD,SAAS,iBAAkB,CACzB,GAAK,OACL,KAAI,KAAO,OAAO,sBAAsB,EACpC,GAAK,OAAO,aAAe,SAAS,gBAAgB,aAcpD,KAAQ,KAAK,OAAS,EACtB,MAAQ,KAAK,IAAM,GAQvB,GAAI,CAAC,mBAAqB,OAAS,UAAW,CAC5C,IAAI,GAAK,UAAU,sBAAsB,EACrC,GAAG,IAAM,KAAI,MAAQ,GAC3B,CAEA,IAAI,KAAQ,KAAO,OAAU,MAAQ,QAAU,KAC3C,mBAAqB,OAAO,WAAW,qBAAqB,EAAE,UAAS,KAAO,MAE9E,OAAS,aACX,WAAa,KACT,eAAc,aAAa,UAAY,eAAe,IAAI,GAC9D,UAAU,aAAa,eAAgB,MAAQ,QAAQ,GAEzD,UAAU,UAAU,OAAO,UAAW,CAAC,CAAC,IAAI,EAC5C,UAAU,aAAa,cAAe,KAAO,QAAU,MAAM,EAQzD,UAAW,YAAW,UAAU,MAAQ,CAAC,MAC7C,SAAS,KAAK,UAAU,OAAO,oBAAqB,CAAC,CAAC,IAAI,EAC5D,CAEA,IAAI,SAAW,IAAI,qBAAqB,UAAY,CAClD,gBAAgB,CAClB,EAAG,CACD,WAAY,MACZ,UAAW,CACb,CAAC,EACD,SAAS,QAAQ,MAAM,EAInB,WAAW,SAAS,QAAQ,SAAS,EAKzC,IAAI,gBAAkB,KA+BtB,GA9BA,OAAO,iBAAiB,SAAU,UAAY,CACxC,kBACJ,gBAAkB,sBAAsB,UAAY,CAClD,gBAAkB,KAClB,gBAAgB,CAClB,CAAC,EACH,EAAG,CAAE,QAAS,EAAK,CAAC,EAMpB,OAAO,iBAAiB,YAAa,eAAe,EACpD,OAAO,iBAAiB,SAAU,eAAe,EAKjD,OAAO,uBAAyB,gBAChC,gBAAgB,EAGhB,cAAc,EAQV,KAAM,CACR,IAAI,iBAAmB,IAAI,qBAAqB,SAAU,QAAS,CACjE,QAAQ,QAAQ,SAAU,MAAO,CAC/B,SAAS,KAAK,UAAU,OAAO,oBAAqB,MAAM,cAAc,CAC1E,CAAC,CACH,EAAG,CACD,WAAY,MACZ,UAAW,CACb,CAAC,EACD,iBAAiB,QAAQ,IAAI,CAC/B,CAUA,SAAS,KAAK,UAAU,IAAI,gBAAgB,EAC5C,SAAS,mBAAoB,CAC3B,GAAK,UACL,KAAI,EAAI,UAAU,aAClB,SAAS,gBAAgB,MAAM,YAAY,cAAe,EAAI,IAAI,EACpE,CACA,kBAAkB,EAGlB,OAAO,iBAAiB,SAAU,iBAAiB,CACrD,GAAG,GAMF,UAAiC,CAChC,IAAI,MAAQ,SAAS,eAAe,kBAAkB,EAClD,SAAW,KAAK,iBAAiB,gBAAgB,EACjD,YAAc,KAClB,GAAI,CAAC,OAAS,CAAC,SAAS,OAAQ,OAQhC,SAAS,KAAK,YAAY,KAAK,EAE/B,SAAS,UAAU,MAAO,CACxB,YAAc,MAAM,cACpB,OAAO,iBAAiB,OAAO,MAAO,UAAY,CAChD,MAAM,UAAU,IAAI,MAAM,EAC1B,MAAM,aAAa,cAAe,OAAO,EACzC,SAAS,KAAK,MAAM,SAAW,SAC/B,IAAI,SAAW,MAAM,cAAc,WAAW,EAC1C,UAAU,SAAS,MAAM,CAAE,cAAe,EAAK,CAAC,CACtD,CAAC,CACH,CACA,SAAS,YAAa,CACpB,OAAO,iBAAiB,QAAQ,MAAO,UAAY,CACjD,MAAM,UAAU,OAAO,MAAM,EAC7B,MAAM,aAAa,cAAe,MAAM,EACxC,SAAS,KAAK,MAAM,SAAW,GAC3B,aAAe,YAAY,aAAa,YAAY,MAAM,CAAE,cAAe,EAAK,CAAC,CACvF,CAAC,CACH,CAEA,SAAS,QAAQ,SAAU,OAAQ,CAAE,OAAO,iBAAiB,QAAS,SAAS,CAAG,CAAC,EAMnF,MAAM,iBAAiB,QAAS,SAAU,EAAG,CAC3C,GAAI,EAAE,OAAO,QAAQ,iBAAiB,EAAG,CAAE,WAAW,EAAG,MAAQ,CACjE,IAAI,OAAS,MAAM,cAAc,YAAY,EACzC,QAAU,CAAC,OAAO,SAAS,EAAE,MAAM,GAAG,WAAW,CACvD,CAAC,EACD,SAAS,iBAAiB,UAAW,SAAU,EAAG,CAEhD,GADI,EAAE,MAAQ,UAAY,MAAM,UAAU,SAAS,MAAM,GAAG,WAAW,EACnE,IAAE,MAAQ,OAAS,MAAM,aAAa,aAAa,IAAM,SAG7D,KAAI,UAAY,MAAM,UAAU,OAAO,KAAK,MAAM,iBAChD,6FACF,EAAG,SAAU,QAAS,CACpB,OAAO,QAAQ,UAAY,GAAK,CAAC,QAAQ,QAAQ,WAAW,GAC1D,CAAC,QAAQ,QAAQ,SAAS,GAAK,QAAQ,eAAe,EAAE,OAAS,GACjE,OAAO,iBAAiB,OAAO,EAAE,aAAe,SACpD,CAAC,EACD,GAAI,CAAC,UAAU,OAAQ,CAAE,EAAE,eAAe,EAAG,MAAQ,CACrD,IAAI,MAAQ,UAAU,CAAC,EACnB,KAAO,UAAU,UAAU,OAAS,CAAC,EACrCC,SAAU,SAAS,cACnB,EAAE,WAAaA,WAAY,OAAS,UAAU,QAAQA,QAAO,EAAI,IACnE,EAAE,eAAe,EACjB,KAAK,MAAM,CAAE,cAAe,EAAK,CAAC,GACzB,CAAC,EAAE,WAAaA,WAAY,MAAQ,UAAU,QAAQA,QAAO,EAAI,KAC1E,EAAE,eAAe,EACjB,MAAM,MAAM,CAAE,cAAe,EAAK,CAAC,GAEvC,CAAC,CACH,GAAG,GASF,UAA8B,CAC7B,IAAI,KAAO,KAAK,iBAAiB,yBAAyB,EACrD,KAAK,QACV,KAAK,QAAQ,SAAU,IAAK,CAC1B,IAAI,iBAAiB,SAAU,UAAY,CACpC,IAAI,aAAa,MAAM,GAC5B,KAAK,QAAQ,SAAU,MAAO,CACxB,QAAU,KAAO,MAAM,aAAa,MAAM,IACxC,OAAO,gBAAiB,OAAO,gBAAgB,MAAM,KAAK,EACzD,MAAM,gBAAgB,MAAM,EAErC,CAAC,CACH,CAAC,CACH,CAAC,CACH,GAAG,CAEL,CAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,CAET,GAAG,GAKF,UAAY,CACX,aACA,IAAI,IAAM,SAAS,eAAe,iBAAiB,EACnD,GAAI,CAAC,IAAK,OACV,IAAI,MAAQ,SAAS,eAAe,cAAc,EAC9C,KAAO,SAAS,eAAe,eAAe,EAC9C,OAAS,CAAC,EACV,UAAY,GACZ,YAAc,EACd,YAAc,EACd,WAAa,OAAO,YAAc,OAAO,WAAW,kCAAkC,EAAE,QAE5F,SAAS,aAAa,IAAK,MAAO,CAChC,IAAI,IAAM,IAAI,IAAI,IAAK,SAAS,OAAO,EACvC,OAAI,IAAI,WAAa,mBAAmB,IAAI,aAAa,IAAI,QAAS,KAAK,EACpE,IAAI,IACb,CAEA,SAAS,WAAW,IAAK,CAGvB,OAAO,QAAQ,SAAU,MAAO,EAAG,CAC7B,KAAK,IAAI,EAAI,GAAG,EAAI,GAAG,MAAM,IAAI,gBAAgB,KAAK,CAC5D,CAAC,EACD,OAAO,QAAQ,SAAU,MAAO,EAAG,CAC7B,KAAK,IAAI,EAAI,GAAG,GAAK,GAAK,CAAC,MAAM,IAAI,aAAa,KAAK,IACzD,MAAM,IAAI,IAAM,MAAM,IAE1B,CAAC,CACH,CAEA,SAAS,SAAS,IAAK,CAErB,GADA,IAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,OAAO,OAAS,CAAC,CAAC,EAC9C,MAAQ,UACZ,WAAY,IACZ,WAAW,GAAG,EACd,OAAO,QAAQ,SAAU,MAAO,EAAG,CACjC,MAAM,IAAI,UAAU,OAAO,SAAU,IAAM,GAAG,EAC1C,IAAM,IAAK,MAAM,IAAI,aAAa,eAAgB,MAAM,EACvD,MAAM,IAAI,gBAAgB,cAAc,CAC/C,CAAC,EACD,IAAI,OAAS,OAAO,GAAG,EAAE,IACrB,OAAS,OAAO,YAAc,KAAK,YAAc,OAAO,aAAe,EAE3E,KAAK,SAAS,CAAE,KAAM,OAAQ,SAAU,MAAO,CAAC,EAClD,CAEA,SAAS,OAAO,IAAK,QAAS,CAC5B,IAAI,SAAW,KAAK,IAAI,IAAM,SAAS,EACvC,SAAS,GAAG,EACZ,MAAM,SAAS,CACb,KAAM,UAAY,MAAM,YAExB,SAAU,SAAW,WAAa,GAAK,CAAC,WAAa,SAAW,MAClE,CAAC,CACH,CAEA,SAAS,OAAQ,CACf,IAAI,aAAe,KAAK,IAAI,KAAM,KAAK,IAAI,KAAM,SAAS,gBAAgB,YAAc,CAAC,CAAC,EAC1F,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,SAAU,MAAO,CACtE,GAAI,OAAM,cAAc,OAAO,EAC/B,KAAI,OAAS,MAAM,cAAc,KAAK,EACtC,GAAI,GAAC,QAAU,CAAC,OAAO,aAAa,KAAK,GACzC,KAAI,KAAO,SAAS,cAAc,KAAK,EACvC,KAAK,UAAY,YACjB,IAAI,IAAM,SAAS,cAAc,KAAK,EACtC,IAAI,IAAM,OAAO,aAAa,KAAK,GAAK,GACxC,IAAI,SAAW,QACf,KAAK,YAAY,GAAG,EACpB,MAAM,YAAY,IAAI,EACtB,IAAI,IAAM,SAAS,cAAc,QAAQ,EACzC,IAAI,KAAO,SACX,IAAI,UAAY,YAChB,IAAI,aAAa,aAAc,UAAY,OAAO,OAAS,GAAK,kBAAkB,EAClF,IAAI,MAAQ,SAAS,cAAc,KAAK,EACxC,MAAM,IAAM,aAAa,OAAO,aAAa,KAAK,EAAG,GAAG,EACxD,MAAM,IAAM,GACZ,MAAM,MAAQ,GACd,MAAM,OAAS,GACf,MAAM,SAAW,QACjB,IAAI,YAAY,KAAK,EACrB,IAAI,IAAM,OAAO,OACjB,IAAI,iBAAiB,QAAS,UAAY,CAAE,OAAO,IAAK,EAAI,CAAG,CAAC,EAChE,KAAK,YAAY,GAAG,EACpB,OAAO,KAAK,CACV,MAAO,SAAS,MAAM,QAAQ,EAAG,EAAE,EACnC,IAAK,aAAa,OAAO,aAAa,KAAK,EAAG,YAAY,EAC1D,IAAK,IACL,IAAK,GACP,CAAC,GACH,CAAC,CACH,CAEA,MAAM,iBAAiB,SAAU,UAAY,CACvC,CAAC,IAAI,MAAQ,cACjB,YAAc,sBAAsB,UAAY,CAC9C,YAAc,EACV,IAAI,MAAQ,OAAO,QACrB,SAAS,KAAK,MAAM,MAAM,WAAa,KAAK,IAAI,MAAM,YAAa,CAAC,CAAC,CAAC,CAE1E,CAAC,EACH,EAAG,CAAE,QAAS,EAAK,CAAC,EAIpB,SAAS,eAAgB,CACnB,CAAC,IAAI,MAAQ,UAAY,GAAK,MAAM,cAAgB,cACxD,YAAc,MAAM,YACpB,MAAM,SAAS,CAAE,KAAM,UAAY,YAAa,SAAU,MAAO,CAAC,EACpE,CACI,mBAAoB,OAAQ,IAAI,eAAe,aAAa,EAAE,QAAQ,KAAK,EAC1E,OAAO,iBAAiB,SAAU,aAAa,EAEpD,IAAI,iBAAiB,QAAS,UAAY,CACpC,aAAa,qBAAqB,WAAW,EACjD,YAAc,EACd,OAAO,QAAQ,SAAU,MAAO,CAAE,MAAM,IAAI,gBAAgB,KAAK,CAAG,CAAC,EACrE,MAAM,gBAAgB,EACtB,KAAK,gBAAgB,EACrB,OAAS,CAAC,EACV,UAAY,EACd,CAAC,EAED,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,EAAI,EAAE,kBAAkB,QAAU,EAAE,OAAS,KACjD,GAAK,EACL,IAAI,EAAE,QAAQ,iBAAiB,EAAG,CAGhC,GAFI,IAAI,OACR,MAAM,EACF,CAAC,OAAO,QAAQ,OACpB,OAAO,iBAAiB,KAAK,GAAG,EAChC,YAAc,MAAM,YACpB,IAAI,QAAU,SAAS,eAAe,YAAY,EAC9C,QAAU,QAAU,SAAS,QAAQ,YAAa,EAAE,EAAI,EAAI,EAC5D,IAAM,OAAO,UAAU,SAAU,MAAO,CAAE,OAAO,MAAM,QAAU,OAAS,CAAC,EAC/E,OAAO,KAAK,IAAI,IAAK,CAAC,EAAG,EAAK,EAC9B,MACF,EACI,EAAE,QAAQ,kBAAkB,GAAK,IAAM,MAAK,OAAO,iBAAiB,MAAM,GAAG,EACnF,CAAC,CACH,GAAG",
  "names": ["updatePurchaseHeader", "schedulePurchaseHeader", "setActive", "syncToTrack", "endNav", "goSlide", "endTD", "tiers", "onceLabel", "once", "normOpt", "pdpVariant", "boxPlanFor", "storeFlavorOption", "applyBoxProperties", "sellingPlanOf", "closeBuyOncePopup", "fillOnceUpsell", "openBuyOncePopup", "outsideOnce", "resetOnceCheckout", "checkoutOneTime", "current"]
}
