{
  "version": 3,
  "sources": ["/cdn/shop/t/12/assets/bg-designer-storefront-core.js?nocache=1791178623"],
  "sourcesContent": ["(function () {\n  'use strict';\n\n  var CORE_REVISION = '20261012-1';\n  // This owner outlives core/runtime replacements. Never wrap its private transport twice.\n  installCartAddOnce();\n  // Keep only a valid same/newer core; bump this revision whenever the exported API changes.\n  // An older core is upgraded in place (below) so scripts that captured it see the newer API.\n  if (window.BGDesignerStorefrontCore && isCurrentCoreRevision(window.BGDesignerStorefrontCore.coreRevision)) return;\n\n  function isCurrentCoreRevision(revision) {\n    if (typeof revision !== 'string' || !/^\\d{8}-\\d+$/.test(revision)) return false;\n    var loaded = revision.split('-');\n    var current = CORE_REVISION.split('-');\n    return loaded[0] > current[0] || (loaded[0] === current[0] && Number(loaded[1]) >= Number(current[1]));\n  }\n\n  function installCartAddOnce() {\n    if (window.BGCartAddOnce || !window.document || !window.addEventListener) return;\n    var doc = window.document;\n    // Every browser page has window.fetch; the owner wraps it and never adds a\n    // global the page did not have.\n    var pageHasFetch = typeof window.fetch === 'function';\n    var transport = (window.fetch || (typeof fetch === 'function' && fetch));\n    if (!transport) return;\n    transport = transport.bind(window);\n    var PREFIX = 'bg:cart-add-once:';\n    var RECOVERY = \"We couldn't confirm this item was added. Check your cart before trying again.\";\n    // A contender refused while nothing of its own was sent (another add is being\n    // prepared, a replacement, lock contention, a payload the owner cannot read).\n    var BUSY = 'Your cart is busy. Please try again in a moment.';\n    // A request that requires the existing cart (a guarded cart-line replacement)\n    // found no cart cookie: refused before any cart is created (RCARTADD10).\n    var NO_CART = 'Please reload the page and try again.';\n    // Some of the intended units are in the cart (stock, or the customer lowered\n    // the line): the customer settles it on the cart page.\n    var PARTIAL = 'Part of this item is in your cart. Adjust its quantity there, or remove it before adding it again.';\n    // A no-Web-Locks tab's add was released while its request was out, and it\n    // completed after another add did.\n    var TWICE = 'This item may be in your cart twice. Check your cart.';\n    // A late answer whose read-back shows the whole add (Fable re-check 3, item 2).\n    var EARLIER = 'Your earlier add reached the cart. Check your cart.';\n    // Director decision (a3): the cart page lets the customer clear a hold that no\n    // proof can clear (no Web Locks, a tab that ended without pagehide).\n    var REVIEW_TEXT = 'We could not confirm this item was added. Your cart is shown below. If the item is missing, add it again.';\n    var REVIEW_BUTTON = 'I checked my cart, add again';\n    // A legacy (old product-form) add clears on the cart page (Director decision d).\n    var LEGACY = \"We couldn't confirm this item was added. Open your cart to review it. After that you can add items again.\";\n    var active = null;\n    var acquiring = false;\n    var replacing = false;\n    var preparation = null;\n    // Degraded (CART-ADD-STORAGE-FULL): this page saw journal storage fail; only a live request holds an add then\n    // (OD-005, OD-100). memoryJournal: this page's copies, { text, failed, over } (over: what storage still holds).\n    var degraded = false;\n    var memoryJournal = Object.create(null);\n    var noLocksCounted = false;\n    var forms = new WeakSet();\n    var listeners = [];\n    // A page's send guard per form (ARTWORK-FLOW-3): asked last, right before an\n    // add from that form is journaled and sent.\n    var sendGuards = new WeakMap();\n    var recoveryTimer = null;\n    var sequence = 0;\n    // Operations whose request this page sent (or whose legacy form this page\n    // watches) and that have not settled yet: marked gone on a real unload.\n    var inflightHere = [];\n    var blockingStates = ['sent', 'committed-unknown', 'read-back', 'unresolved', 'handoff', 'quarantined'];\n\n    function cookieIdentity() {\n      try {\n        var match = String(doc.cookie || '').match(/(?:^|;\\s*)cart=([^;]+)/);\n        return match ? decodeURIComponent(match[1]).split('?')[0].trim() : '';\n      } catch (_) { return ''; }\n    }\n    function key(identity) { return PREFIX + encodeURIComponent(identity || 'unknown'); }\n    function isBlocking(entry) { return entry && blockingStates.indexOf(entry.state) !== -1; }\n    function degrade() { if (!degraded) { degraded = true; clearRecoveryUi(); } }\n    function journalNames() {\n      var names = [];\n      try {\n        for (var i = 0; i < window.localStorage.length; i += 1) {\n          var name = window.localStorage.key(i);\n          if (name && name.indexOf(PREFIX) === 0) names.push(name);\n        }\n      } catch (_) { degrade(); }\n      return names.concat(Object.keys(memoryJournal).filter(function (name) { return names.indexOf(name) === -1; }));\n    }\n    // Storage first (other pages' newer records count); this page's copy while reads throw or while storage still\n    // holds exactly what this page could not overwrite. An unreadable record is no record and degrades the page.\n    function stored(keyName) {\n      var memory = memoryJournal[keyName], raw, value = null;\n      try { raw = window.localStorage.getItem(keyName); } catch (_) { degrade(); raw = memory ? memory.text : null; }\n      if (memory && memory.failed && raw === memory.over) raw = memory.text;\n      try { value = raw ? JSON.parse(raw) : null; } catch (_) {}\n      if (raw && !(value && value.opId && value.state)) { degrade(); return null; }\n      return value;\n    }\n    // Observation: the open operation of this page, else of any retained identity. It never holds by itself.\n    function blocked() {\n      if (isBlocking(active)) {\n        var latest = stored(key(active.identity));\n        if (latest && latest.opId === active.opId && !isBlocking(latest)) active = null;\n        else {\n          if (latest && isBlocking(latest)) active = latest;\n          return active;\n        }\n      }\n      // Check all retained identities: a rotated/missing cookie cannot escape an uncertain write.\n      for (var i = 0, names = journalNames(); i < names.length; i += 1) {\n        var entry = stored(names[i]);\n        if (isBlocking(entry)) return entry;\n      }\n      return null;\n    }\n    // Admission. Normal mode: a journal hold as today, once a write probe shows storage still works. Degraded mode:\n    // only a live request of this page (another page's: liveElsewhere in dispatch). Flags never hold when degraded.\n    function held() {\n      var entry = blocked();\n      if (entry && !degraded) storageReady();\n      return degraded ? liveHere() : entry;\n    }\n    function refused(form) { return (!degraded && (held() || acquiring || replacing || (preparation && preparation.form !== form)) && !degraded) || (degraded && liveHere()); }\n    function settledFor(opId) {\n      return journalNames().some(function (name) { var saved = stored(name); return !!saved && saved.opId === opId && !isBlocking(saved); });\n    }\n    function liveHere() { return inflightHere.some(function (entry) { return !settledFor(entry.opId); }); }\n    async function liveElsewhere(locks) {\n      var state = await locks.query();\n      return (state && state.held || []).some(function (lock) {\n        var name = String(lock.name || '');\n        return name.indexOf(INFLIGHT_PREFIX) === 0 && !settledFor(name.slice(INFLIGHT_PREFIX.length));\n      });\n    }\n    // A refused write keeps this page's copy, degrades the page and deletes nothing. A completed add or its\n    // acknowledgement is then stored compact (no baseline), in the room of its own larger record.\n    function persist(entry) {\n      var name, text, over = null, prior = null;\n      try { name = key(entry.identity); text = JSON.stringify(entry); } catch (_) { return false; }\n      try {\n        window.localStorage.setItem(name, text);\n        if (window.localStorage.getItem(name) === text) { memoryJournal[name] = { text: text }; return true; }\n      } catch (_) {}\n      try { over = window.localStorage.getItem(name); prior = JSON.parse(over); } catch (_) {}\n      memoryJournal[name] = { text: text, failed: true, over: over };\n      degrade();\n      if ((entry.state !== 'handoff' && entry.state !== 'acknowledged') || (isBlocking(prior) && prior.opId !== entry.opId)) return true;\n      try {\n        var compact = JSON.stringify(compactOf(entry));\n        window.localStorage.setItem(name, compact);\n        if (window.localStorage.getItem(name) === compact) memoryJournal[name].over = compact;\n      } catch (_) {}\n      return true;\n    }\n    // The comparison facts the late-result paths need, without the baseline cart.\n    function compactOf(entry) {\n      var out = { version: 1, opId: entry.opId, identity: entry.identity, state: entry.state, sentAt: entry.sentAt, intent: entry.intent };\n      // The facts the readers use: the review reason, partial and late-landed marks, the legacy review counts.\n      ['acknowledgeReason', 'partial', 'lateLandedAt', 'before', 'baselineVariants', entry.intent ? '' : 'reviewedVariants']\n        .forEach(function (name) { if (name && entry[name] !== undefined) out[name] = entry[name]; });\n      if (!entry.baseline) return out;\n      var before = totals(entry.baseline);\n      if (entry.baseline.length) out.baselineVariants = variantTotals(entry.baseline);\n      out.before = (entry.intent || []).map(function (line) { return before[signature(line)] || 0; });\n      return out;\n    }\n    // Degraded mode warns conservatively (other pages' records may be missing): the baseline cart or an open record\n    // has a variant of this add, or another request of this page is unsettled.\n    function possibleDuplicate(entry, cart) {\n      var variants = entry.intent.map(function (line) { return line.variant; });\n      var shares = function (lines) { return !lines || lines.some(function (line) { return variants.indexOf(String(line.variant)) !== -1; }); };\n      return shares(cart.items.map(item)) || inflightHere.length > 0 || journalNames().some(function (name) {\n        var other = stored(name);\n        return isBlocking(other) && other.opId !== entry.opId && shares(other.intent);\n      });\n    }\n    function storageReady() {\n      try {\n        var name = 'bg:cart-add-once-probe';\n        window.localStorage.setItem(name, name);\n        if (window.localStorage.getItem(name) === name) { window.localStorage.removeItem(name); return true; }\n      } catch (_) {}\n      degrade();\n      return false;\n    }\n    function current(entry) {\n      if (!entry || !entry.opId) return false;\n      var saved = stored(key(entry.identity));\n      return !!saved && saved.opId === entry.opId && isBlocking(saved);\n    }\n    function result(entry, data, cart) {\n      var failed = entry.state === 'refused' || entry.state === 'baseline-unavailable';\n      return { state: entry.state, opId: entry.opId || '', data: data || null, cart: cart || null,\n        recovery: !failed && ['handoff', 'released', 'acknowledged', 'idle'].indexOf(entry.state) === -1,\n        message: failed\n          ? (window.BGDesignerStorefrontCore && window.BGDesignerStorefrontCore.buildCartFailureMessage('add')) || 'We could not add this item to your cart. Please try again.'\n          : messageFor(entry) };\n    }\n    function announce(outcome, form) {\n      // An operation that entered without a form (a repaired tab's old product\n      // form goes through the fetch bridge) reports to every listener; a\n      // rejected contender reports only to its own form.\n      var broadcast = !form && outcome.state !== 'rejected';\n      listeners.slice().forEach(function (listener) {\n        if (broadcast || !listener.form || listener.form === form) {\n          try { listener.callback(outcome); } catch (_) {}\n        }\n      });\n      try { doc.dispatchEvent(new window.CustomEvent('bg:cart-add-once-outcome', { detail: outcome })); } catch (_) {}\n    }\n    function isLegacy(entry) { return !!(entry && entry.opId && String(entry.opId).indexOf('legacy-') === 0); }\n    function messageFor(entry) { return entry && entry.partial ? PARTIAL : isLegacy(entry) ? LEGACY : RECOVERY; }\n    // True when a control's centre is on screen and nothing (a fixed discount\n    // strip, a chat button) sits on top of it.\n    function clearOnScreen(control) {\n      if (typeof doc.elementFromPoint !== 'function') return true;\n      var box = control.getBoundingClientRect();\n      var x = box.left + box.width / 2;\n      var y = box.top + box.height / 2;\n      if (y < 0 || x < 0 || y > (window.innerHeight || 0) || x > (window.innerWidth || 0)) return false;\n      var hit = doc.elementFromPoint(x, y);\n      return !!hit && (hit === control || control.contains(hit));\n    }\n    function shown(node) {\n      if (!node || !node.isConnected || node.closest('[hidden]')) return false;\n      var rect = node.getBoundingClientRect();\n      return rect.width > 0 && rect.height > 0;\n    }\n    function pinned(node) {\n      for (var current = node; current && current.nodeType === 1; current = current.parentElement) {\n        var position = '';\n        try { position = window.getComputedStyle(current).position; } catch (_) {}\n        if (position === 'fixed' || position === 'sticky') return true;\n      }\n      return false;\n    }\n    // The cart page is the theme's configured cart route (routes.cart_url), also\n    // under a locale prefix (/fr/cart, /en-ca/cart); never a path that merely\n    // ends in /cart (/products/cart, /pages/cart).\n    function cartPath() {\n      var configured = (window.routes && window.routes.cart_url) || (cartRoot() + 'cart');\n      var path = '/cart';\n      try { path = new URL(configured, window.location.href).pathname.replace(/\\/+$/, '') || '/cart'; } catch (_) {}\n      return path.replace(/^\\/[a-z]{2}(?:-[a-z0-9]+)?(?=\\/)/i, '');\n    }\n    function onCartPage() {\n      var path = String(window.location.pathname || '').replace(/\\/+$/, '');\n      var bare = cartPath();\n      if (path === bare) return true;\n      if (path.length <= bare.length || path.slice(-bare.length).toLowerCase() !== bare.toLowerCase()) return false;\n      return /^\\/[a-z]{2}(?:-[a-z0-9]+)?$/i.test(path.slice(0, path.length - bare.length));\n    }\n    // Above the cart, inside the page's padded content column.\n    function cartPageHost() {\n      var main = doc.querySelector('main') || doc.body;\n      return main.querySelector('.page-width') || main;\n    }\n    // The purchase control the customer used (or, after a reload, the first\n    // visible one on the page): a visible add button that is not part of a fixed\n    // or sticky bar. The recovery panel goes right after its row.\n    var lastAddControl = null;\n    function purchaseControl(target) {\n      if (lastAddControl && shown(lastAddControl) && !pinned(lastAddControl)) return lastAddControl;\n      var scope = (target && target.closest && target.closest('product-info')) || doc;\n      var own = target && Array.prototype.find.call(target.querySelectorAll('[type=\"submit\"]'), function (button) { return shown(button) && !pinned(button); });\n      if (own) return own;\n      return Array.prototype.find.call(scope.querySelectorAll('button, [role=\"button\"]'), function (button) {\n        return shown(button) && !pinned(button) && (/add to cart|adding/i.test(button.textContent || '') || (button.form && formAdd(button.form, button)));\n      }) || null;\n    }\n    function recovery(form, entry) {\n      try {\n        var text = messageFor(entry || blocked());\n        var target = form && form.isConnected ? form : doc.querySelector('form[action*=\"/cart/add\"]');\n        var host = target || doc.body;\n        if (!host) return;\n        // Show it where the customer is looking: on the cart page above the cart;\n        // otherwise right after the visible purchase control the customer used\n        // (guided pages and the phone experiences show their own purchase\n        // controls, not the form), then beside the storefront message.\n        var anchor = null;\n        var top = null;\n        if (onCartPage()) top = cartPageHost();\n        else {\n          var control = purchaseControl(target);\n          if (control) anchor = control.parentElement && control.parentElement !== target ? control.parentElement : control;\n          else if (target && !shown(target)) {\n            var scope = target.closest('product-info') || doc;\n            anchor = scope.querySelector('[data-bg-designer-block=\"message\"]') || doc.querySelector('[data-bg-designer-block=\"message\"]');\n          }\n        }\n        var panel = doc.querySelector('[data-bg-cart-add-recovery]');\n        // The customer review offered on the cart page (decision a3) stays as is.\n        if (panel && panel.hasAttribute('data-bg-cart-add-review')) {\n          if (onCartPage()) return;\n          panel.remove(); panel = null;\n        }\n        var created = !panel;\n        if (!panel) {\n          panel = doc.createElement('div');\n          panel.setAttribute('data-bg-cart-add-recovery', '');\n          panel.setAttribute('role', 'alert');\n          var message = doc.createElement('p');\n          message.textContent = text;\n          var view = doc.createElement('a');\n          view.className = 'button button--secondary';\n          view.href = cartRoot() + 'cart';\n          view.textContent = 'View cart';\n          var check = doc.createElement('button');\n          check.type = 'button';\n          check.className = 'button button--secondary';\n          check.textContent = 'Check again';\n          check.addEventListener('click', function () {\n            check.disabled = true;\n            owner.checkAgain().finally(function () { check.disabled = false; });\n          });\n          panel.appendChild(message); panel.appendChild(view); panel.appendChild(check);\n          if (top) top.insertBefore(panel, top.firstChild);\n          else if (anchor && anchor.parentNode) anchor.parentNode.insertBefore(panel, anchor.nextSibling);\n          else host.appendChild(panel);\n        }\n        else if (panel.firstChild && panel.firstChild.textContent !== text) panel.firstChild.textContent = text;\n        // Bring View cart and Check again into view, clear of fixed overlays\n        // (also when a restored page shows it without the form).\n        if (created && shown(panel)) {\n          var controls = panel.querySelectorAll('a, button');\n          if (!Array.prototype.every.call(controls, clearOnScreen)) {\n            try { panel.scrollIntoView({ block: 'center', behavior: 'smooth' }); } catch (_) {}\n          }\n        }\n        if (target) {\n          // A legacy (old-class) form keeps its spinner: its own request is still\n          // live, and its button losing .loading is how this page learns it settled.\n          var ownForm = isOwnerForm(target);\n          Array.prototype.forEach.call(target.querySelectorAll('[type=\"submit\"]'), function (button) {\n            if (ownForm) button.classList.remove('loading');\n            if (!degraded) { button.setAttribute('aria-disabled', 'true'); button.setAttribute('data-bg-cart-add-blocked', ''); }\n          });\n          if (ownForm) Array.prototype.forEach.call(target.querySelectorAll('.loading__spinner'), function (spinner) { spinner.classList.add('hidden'); });\n          target.dispatchEvent(new window.CustomEvent('bg:designer-cart-submit-state', {\n            bubbles: true, detail: { state: 'error', stage: 'cart-add', message: text }\n          }));\n        }\n      } catch (_) { /* UI failure must never release the journal. */ }\n    }\n    // Removes the recovery state from this page: the panel, the sentence mirrored\n    // into product-form boxes, and the disabled state the owner put on buttons.\n    function clearRecoveryUi() {\n      window.clearTimeout(recoveryTimer); recoveryTimer = null;\n      Array.prototype.forEach.call(doc.querySelectorAll('[data-bg-cart-add-recovery]'), function (panel) { panel.remove(); });\n      Array.prototype.forEach.call(doc.querySelectorAll('[data-bg-cart-add-blocked]'), function (button) {\n        button.removeAttribute('data-bg-cart-add-blocked');\n        button.removeAttribute('aria-disabled');\n      });\n      Array.prototype.forEach.call(doc.querySelectorAll('.product-form__error-message-wrapper'), function (wrapper) {\n        var text = String(wrapper.textContent || '');\n        if ([RECOVERY, BUSY, PARTIAL, LEGACY].some(function (known) { return text.indexOf(known) !== -1; })) wrapper.hidden = true;\n      });\n    }\n    function armRecovery(entry, form) {\n      if (recoveryTimer !== null) window.clearTimeout(recoveryTimer);\n      recoveryTimer = window.setTimeout(function () {\n        var pending = blocked();\n        if (pending) { recovery(form, pending); announce(result(pending), form); }\n      }, Math.max(0, (entry.sentAt || Date.now()) + 30000 - Date.now()));\n    }\n    function cartRoot() {\n      return (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n    }\n    function bounded(promise, ms) {\n      return new Promise(function (resolve, reject) {\n        var timer = window.setTimeout(function () { reject(new Error('Cart read timed out')); }, Math.max(0, ms));\n        Promise.resolve(promise).then(function (value) { window.clearTimeout(timer); resolve(value); }, function (error) { window.clearTimeout(timer); reject(error); });\n      });\n    }\n    async function readCart(deadline) {\n      function remaining() { return Math.max(0, Math.min(5000, deadline - Date.now())); }\n      if (!remaining()) throw new Error('Cart read deadline');\n      var response = await bounded(transport(cartRoot() + 'cart.js?_bg_cart_fresh=' + Date.now(), {\n        credentials: 'same-origin', cache: 'no-store', headers: { accept: 'application/json', 'cache-control': 'no-cache', pragma: 'no-cache' }\n      }), remaining());\n      if (!response.ok || !remaining()) throw new Error('Cart read failed');\n      var cart = await bounded(response.json(), remaining());\n      if (!cart || !Array.isArray(cart.items)) throw new Error('Cart read invalid');\n      return cart;\n    }\n    function properties(value) {\n      var output = {};\n      Object.keys(value || {}).sort().forEach(function (name) {\n        if (value[name] !== null && value[name] !== undefined && String(value[name]) !== '') output[name] = String(value[name]);\n      });\n      return output;\n    }\n    function item(value) {\n      var plan = value.selling_plan || (value.selling_plan_allocation && value.selling_plan_allocation.selling_plan && value.selling_plan_allocation.selling_plan.id) || '';\n      return { variant: String(value.variant_id || value.id || ''), plan: String(plan), properties: properties(value.properties), quantity: Number(value.quantity == null ? 1 : value.quantity), key: String(value.key || '') };\n    }\n    function signature(value) { return JSON.stringify([value.variant, value.plan, value.properties]); }\n    function totals(items) {\n      var output = Object.create(null);\n      items.forEach(function (line) { var id = signature(line); output[id] = (output[id] || 0) + line.quantity; });\n      return output;\n    }\n    function compare(entry, cart) {\n      if (!entry.baseline || !entry.intent) return 'conflict';\n      var currentLines = cart.items.map(item);\n      // Aggregation permits Shopify merges/key changes, but cannot hide a changed surviving baseline line.\n      var changedExisting = entry.baseline.some(function (line) {\n        var present = currentLines.find(function (candidate) { return line.key && candidate.key === line.key; });\n        if (!present) return false;\n        var intended = entry.intent.some(function (intent) { return signature(intent) === signature(line); });\n        return signature(present) !== signature(line) || present.quantity < line.quantity || (!intended && present.quantity !== line.quantity);\n      });\n      if (changedExisting) return 'conflict';\n      var before = totals(entry.baseline);\n      var after = totals(currentLines);\n      var wanted = totals(entry.intent);\n      var exact = true;\n      var unchanged = true;\n      var conflict = false;\n      Object.keys(Object.assign({}, before, after, wanted)).forEach(function (id) {\n        var delta = (after[id] || 0) - (before[id] || 0);\n        if (delta !== 0) unchanged = false;\n        if (delta !== (wanted[id] || 0)) exact = false;\n        if (delta !== 0 && delta !== (wanted[id] || 0)) conflict = true;\n      });\n      if (exact) return 'exact';\n      if (unchanged) return 'unchanged';\n      return conflict ? 'conflict' : 'partial';\n    }\n    async function parseIntent(input, init) {\n      var body = init && init.body;\n      var contentType = new Headers(init && init.headers || {}).get('content-type') || '';\n      if (body == null && input && typeof input.clone === 'function') {\n        var copy = input.clone();\n        contentType = copy.headers.get('content-type') || '';\n        body = contentType.indexOf('multipart/form-data') !== -1 ? await copy.formData() : await copy.text();\n      }\n      if (typeof body === 'string' && (contentType.indexOf('json') !== -1 || /^\\s*\\{/.test(body))) {\n        var json = JSON.parse(body);\n        return (json.items || [json]).map(item);\n      }\n      if (typeof body === 'string') body = new URLSearchParams(body);\n      return entriesIntent(body);\n    }\n    function entriesIntent(body) {\n      if (!body || typeof body.entries !== 'function') throw new Error('Cart payload unavailable');\n      var single = { properties: {} };\n      var batch = {};\n      for (var pair of body.entries()) {\n        if (typeof pair[1] !== 'string') throw new Error('Cart payload needs review');\n        var name = pair[0];\n        var value = pair[1];\n        var match = name.match(/^items\\[(\\d+)\\]\\[(id|quantity|selling_plan|properties)\\](?:\\[([^\\]]+)\\])?$/);\n        var target = single;\n        if (match) {\n          target = batch[match[1]] || (batch[match[1]] = { properties: {} });\n          if (match[2] === 'properties') target.properties[match[3]] = value;\n          else target[match[2]] = value;\n        } else if (/^properties\\[.+\\]$/.test(name)) single.properties[name.slice(11, -1)] = value;\n        else if (name === 'id' || name === 'quantity' || name === 'selling_plan') single[name] = value;\n      }\n      return (Object.keys(batch).length ? Object.keys(batch).map(function (id) { return batch[id]; }) : [single]).map(item);\n    }\n    function setState(entry, state, form, data, cart, verifiedComplete) {\n      if (!current(entry)) return result(entry);\n      var saved;\n      try { saved = stored(key(entry.identity)); } catch (_) {}\n      // Quarantine is left only when a fresh read shows the whole intended add.\n      if (saved && saved.state === 'quarantined' && !(verifiedComplete && state === 'handoff')) { Object.assign(entry, saved); return result(entry); }\n      if (saved && saved.state === 'handoff' && ['read-back', 'unresolved', 'refused'].indexOf(state) !== -1) return result(saved, data, cart);\n      entry.everUncertain = !!(entry.everUncertain || (saved && saved.everUncertain));\n      if (state === 'refused' && entry.everUncertain) state = 'unresolved';\n      entry.state = state;\n      if (state === 'unresolved' || state === 'quarantined') entry.everUncertain = true;\n      if (!persist(entry)) { entry.state = 'quarantined'; active = entry; }\n      if (active && active.opId === entry.opId) active = entry.state === 'refused' ? null : entry;\n      var outcome = result(entry, data, cart);\n      if (entry.state === 'unresolved' || entry.state === 'quarantined') recovery(form, entry);\n      if (entry.state !== 'read-back') announce(outcome, form);\n      return outcome;\n    }\n    async function reconcile(entry, deadline, answer, form) {\n      var delays = [500, 1000, 2000, 4000, 8000];\n      var attempt = 0;\n      if (!current(entry)) return result(entry);\n      // Quarantine is durable: unknown legacy baselines and conflicts cannot be cleared by a later coincidence.\n      if (entry.state === 'quarantined') { recovery(form, entry); return result(entry); }\n      var hadHandoff = entry.state === 'handoff';\n      if (hadHandoff && !entry.baseline) return result(entry);\n      if (!hadHandoff) setState(entry, 'read-back', form);\n      while (Date.now() < deadline && current(entry)) {\n        try {\n          var cart = await readCart(deadline);\n          if (!current(entry)) return result(entry);\n          var latest = stored(key(entry.identity));\n          if (latest) Object.assign(entry, latest);\n          if (entry.state === 'quarantined') return result(entry);\n          if (cookieIdentity() !== entry.identity) return setState(entry, 'quarantined', form);\n          var match = compare(entry, cart);\n          if (match === 'exact') {\n            var data = answer && answer.data;\n            if (!data || data.status) data = cart.items.find(function (line) { return signature(item(line)) === signature(entry.intent[0]); });\n            return setState(entry, 'handoff', form, data, cart);\n          }\n          if (match !== 'unchanged' || hadHandoff) { entry.partial = landed(entry, cart) === 'partial'; return setState(entry, 'quarantined', form); }\n          if (answer && answer.errorStatus && !entry.everUncertain) return setState(entry, 'refused', form, answer.data, cart);\n        } catch (_) {}\n        var delay = Math.min(delays[Math.min(attempt++, delays.length - 1)], deadline - Date.now());\n        if (delay <= 0) break;\n        await new Promise(function (resolve) { window.setTimeout(resolve, delay); });\n      }\n      return setState(entry, 'unresolved', form);\n    }\n    var INFLIGHT_PREFIX = 'bg-cart-add-inflight:';\n    var HEARTBEAT_MS = 20000;\n    var HEARTBEAT_STALE_MS = 60000;\n    // Without Web Locks silence proves nothing (decision a3); after this much\n    // silence the cart page offers the customer the explicit review control.\n    var CUSTOMER_REVIEW_AFTER_MS = 600000;\n    var RELEASE_AFTER_MS = 120000;\n    // Durable facts about the request (settledAt, aliveAt) go onto the stored\n    // entry of the same operation without touching its state.\n    function markJournal(entry, fields) {\n      try {\n        var saved = stored(key(entry.identity));\n        if (!saved || saved.opId !== entry.opId || !isBlocking(saved)) return false;\n        Object.assign(saved, fields);\n        Object.assign(entry, fields);\n        if (active && active.opId === entry.opId) Object.assign(active, fields);\n        return persist(saved);\n      } catch (_) { return false; }\n    }\n    // The sender is provably gone, never merely suspended: its request settled\n    // (settledAt), or its page really unloaded (pageGoneAt, not a BFCache\n    // freeze), or, where Web Locks exist, nobody holds its in-flight lock AND its\n    // heartbeat stopped. Without Web Locks silence is never proof (decision a3).\n    // Returns the proof ('settled', 'page-gone', 'heartbeat-stale') or false.\n    async function releasable(entry) {\n      var locks = window.navigator && window.navigator.locks;\n      var hasLocks = !!(locks && typeof locks.request === 'function');\n      var basis = entry.settledAt ? 'settled' : entry.pageGoneAt ? 'page-gone' : '';\n      var gone = entry.settledAt || entry.pageGoneAt || 0;\n      if (!gone) {\n        if (!hasLocks) return false;\n        var lastAlive = entry.aliveAt || entry.sentAt || 0;\n        if (!lastAlive || Date.now() - lastAlive <= HEARTBEAT_STALE_MS) return false;\n        gone = lastAlive;\n        basis = 'heartbeat-stale';\n      }\n      if (Date.now() - gone < RELEASE_AFTER_MS) return false;\n      if (!hasLocks) return basis;\n      try {\n        var free = await locks.request(INFLIGHT_PREFIX + entry.opId, { mode: 'exclusive', ifAvailable: true }, function (lock) { return !!lock; });\n        return free ? basis : false;\n      } catch (_) { return false; }\n    }\n    // Decision (a3): the explicit customer review on the cart page is offered\n    // only when no proof can come (no Web Locks) and the request has been silent\n    // for ten minutes.\n    function customerReviewable(entry) {\n      var locks = window.navigator && window.navigator.locks;\n      if (locks && typeof locks.request === 'function') return false;\n      var lastAlive = entry.aliveAt || entry.sentAt || 0;\n      return !!lastAlive && Date.now() - lastAlive >= CUSTOMER_REVIEW_AFTER_MS;\n    }\n    // Director decision (c2): a legacy (old product-form) request was sent before\n    // this owner could see its body, so its item is unknown: any line in the cart\n    // may be its trace (no narrowing to the form's current variant, which the\n    // page may have changed since).\n    function legacyTrace(entry, cart) { return cart.items.length > 0; }\n    function markPartial(entry, partial) {\n      if (!!entry.partial === partial) return;\n      entry.partial = partial;\n      persist(entry);\n      if (active && active.opId === entry.opId) active.partial = partial;\n    }\n    // How much of the intended add is in the cart now, per intended line:\n    // 'complete' (every intended line rose by at least its quantity: the add\n    // landed, later customer edits aside), 'partial' (some rise, not all),\n    // 'none' (no trace), 'unknown' (no intent: a legacy form's add).\n    function landed(entry, cart) {\n      if (!entry.intent || !(entry.baseline || entry.before)) return 'unknown';\n      var before = entry.baseline ? totals(entry.baseline) : entry.intent.reduce(function (out, line, i) { out[signature(line)] = Math.max(0, Number(entry.before[i]) || 0); return out; }, {});\n      var after = totals(cart.items.map(item));\n      var wanted = totals(entry.intent);\n      var full = true;\n      var any = false;\n      Object.keys(wanted).forEach(function (id) {\n        var delta = (after[id] || 0) - (before[id] || 0);\n        if (delta > 0) any = true;\n        if (delta < wanted[id]) full = false;\n      });\n      return full && (entry.baseline || any) ? 'complete' : any ? 'partial' : 'none'; // a compact record proves nothing it cannot count\n    }\n    // Hold the in-flight lock and stamp aliveAt for an operation this page is\n    // responsible for, until its request (or legacy form) settles.\n    function watchInflight(entry) {\n      var heartbeat = null;\n      var done = false;\n      var beat = function () {\n        heartbeat = window.setTimeout(function () {\n          if (done || !markJournal(entry, { aliveAt: Date.now() })) return;\n          beat();\n        }, HEARTBEAT_MS);\n      };\n      beat();\n      var inflightDone = null;\n      var inflightLocks = window.navigator && window.navigator.locks;\n      if (inflightLocks && typeof inflightLocks.request === 'function') {\n        var inflight = new Promise(function (resolve) { inflightDone = resolve; });\n        try {\n          Promise.resolve(inflightLocks.request(INFLIGHT_PREFIX + entry.opId, { mode: 'exclusive', ifAvailable: true }, function () { return inflight; })).catch(function () {});\n        } catch (_) {}\n      }\n      inflightHere.push(entry);\n      return function settle() {\n        if (done) return;\n        done = true;\n        window.clearTimeout(heartbeat);\n        if (inflightDone) inflightDone();\n        inflightHere = inflightHere.filter(function (value) { return value !== entry; });\n        markJournal(entry, { settledAt: Date.now() });\n      };\n    }\n    // Any count increase for an intended line (variant, selling plan, the full\n    // submitted properties including the context) is a trace of the add.\n    function traceOfIntent(entry, cart) {\n      if (!entry.intent || !entry.baseline) return false;\n      var before = totals(entry.baseline);\n      var after = totals(cart.items.map(item));\n      return entry.intent.some(function (line) {\n        var id = signature(line);\n        return (after[id] || 0) > (before[id] || 0);\n      });\n    }\n    function release(entry, reason, basis) {\n      var saved;\n      try { saved = stored(key(entry.identity)); } catch (_) { return result(entry); }\n      if (!saved || saved.opId !== entry.opId || !isBlocking(saved)) return result(entry);\n      var from = saved.state;\n      saved.state = 'released';\n      saved.releasedAt = Date.now();\n      saved.releaseReason = reason;\n      saved.releaseBasis = basis || '';\n      if (!persist(saved)) return result(entry);\n      if (active && active.opId === saved.opId) active = null;\n      clearRecoveryUi();\n      var detail = { reason: reason, basis: basis || '', from: from, ageMs: Date.now() - (saved.sentAt || Date.now()) };\n      try { doc.dispatchEvent(new window.CustomEvent('bg:cart-add-once-released', { detail: detail })); } catch (_) {}\n      try {\n        if (window.BGDesignerTelemetry && window.BGDesignerTelemetry.emitEvent) window.BGDesignerTelemetry.emitEvent('cart_add_once_released', 'cart', detail, 'high');\n      } catch (_) {}\n      var outcome = result(saved);\n      announce(outcome, null);\n      return outcome;\n    }\n    // Director decisions (b) and (d): on the cart page, once its sender is\n    // provably gone two minutes, a partial add or a legacy add with a line of its\n    // item in the cart is acknowledged (not released): what the customer reviewed\n    // in the cart stays, the next tap is a fresh add.\n    function acknowledgeReviewed(entry, reason, basis) {\n      var saved;\n      try { saved = stored(key(entry.identity)); } catch (_) { return false; }\n      if (!saved || saved.opId !== entry.opId || !isBlocking(saved)) return false;\n      saved.state = 'acknowledged';\n      saved.acknowledgedAt = Date.now();\n      saved.acknowledgeReason = reason;\n      if (basis) saved.acknowledgeBasis = basis;\n      if (!persist(saved)) return false;\n      if (active && active.opId === saved.opId) active = null;\n      clearRecoveryUi();\n      var detail = { reason: reason, basis: basis || '', ageMs: Date.now() - (saved.sentAt || Date.now()) };\n      try {\n        if (window.BGDesignerTelemetry && window.BGDesignerTelemetry.emitEvent) window.BGDesignerTelemetry.emitEvent(reason === 'partial-reviewed' ? 'cart_add_once_partial_acknowledged' : reason === 'customer-cart-review' ? 'cart_add_once_customer_reviewed' : 'cart_add_once_legacy_acknowledged', 'cart', detail, 'high');\n      } catch (_) {}\n      return true;\n    }\n    // A late-landing notice is journaled for the device so the next page shows it\n    // too (a legacy form navigates to the cart right after its add), until the\n    // customer has seen it on the cart page.\n    var NOTICE_KEY = 'bg:cart-add-once-notice';\n    function journalNotice(identity, kind) {\n      try { window.localStorage.setItem(NOTICE_KEY, JSON.stringify({ kind: kind, at: Date.now() })); } catch (_) {}\n    }\n    function reloadCartPage() {\n      try { window.location.reload(); } catch (_) {}\n    }\n    function showJournaledNotice() {\n      try {\n        var notice = JSON.parse(window.localStorage.getItem(NOTICE_KEY) || 'null');\n        if (!notice || notice.seenAt) return;\n        duplicateNotice(null, notice.kind === 'earlier' ? EARLIER : notice.kind === 'partial' ? PARTIAL : TWICE);\n        // Seen only by a visible cart page (an old form's redirect in a background\n        // tab does not count).\n        if (onCartPage() && doc.visibilityState !== 'hidden') { notice.seenAt = Date.now(); window.localStorage.setItem(NOTICE_KEY, JSON.stringify(notice)); }\n      } catch (_) {}\n    }\n    function duplicateNotice(form, text) {\n      try {\n        var existing = doc.querySelector('[data-bg-cart-add-duplicate]');\n        if (existing) { if (existing.firstChild) existing.firstChild.textContent = text || TWICE; return; }\n        var target = form && form.isConnected ? form : doc.querySelector('form[action*=\"/cart/add\"]');\n        var panel = doc.createElement('div');\n        panel.setAttribute('data-bg-cart-add-duplicate', '');\n        panel.setAttribute('role', 'alert');\n        var message = doc.createElement('p');\n        message.textContent = text || TWICE;\n        var view = doc.createElement('a');\n        view.className = 'button button--secondary';\n        view.href = cartRoot() + 'cart';\n        view.textContent = 'View cart';\n        panel.appendChild(message); panel.appendChild(view);\n        // Where the customer is looking, as the recovery panel: on the cart page\n        // above the cart, otherwise beside the visible purchase control.\n        var control = onCartPage() ? null : purchaseControl(target);\n        var anchor = control ? (control.parentElement && control.parentElement !== target ? control.parentElement : control)\n          : target && !shown(target) ? ((target.closest('product-info') || doc).querySelector('[data-bg-designer-block=\"message\"]') || doc.querySelector('[data-bg-designer-block=\"message\"]')) : null;\n        var top = onCartPage() ? cartPageHost() : null;\n        if (top) top.insertBefore(panel, top.firstChild);\n        else if (anchor && anchor.parentNode) anchor.parentNode.insertBefore(panel, anchor.nextSibling);\n        else (target || doc.body).appendChild(panel);\n        if (shown(panel) && !Array.prototype.every.call(panel.querySelectorAll('a, button'), clearOnScreen)) {\n          try { panel.scrollIntoView({ block: 'center', behavior: 'smooth' }); } catch (_) {}\n        }\n      } catch (_) {}\n    }\n    function newestAfter(entry) {\n      var newest = null;\n      for (var i = 0, names = journalNames(); i < names.length; i += 1) {\n        var value = stored(names[i]);\n        if (value && value.opId !== entry.opId && (value.sentAt || 0) > (entry.sentAt || 0) && (!newest || value.sentAt > newest.sentAt)) newest = value;\n      }\n      return newest;\n    }\n    // Decisions (a3) and (e): the request of an operation this page sent\n    // answered (any outcome) after the operation stopped being current (the\n    // customer reviewed the cart page, or another page settled it). The cart is\n    // read; nothing in it is ever changed:\n    // - a newer add of this cart exists and this late add may have added (a 2xx,\n    //   an unreadable cart, or its item in the cart): TWICE with View cart;\n    // - still the newest operation, released: a read-back showing the whole\n    //   intent makes it a hand-off (with the EARLIER notice), part of it a\n    //   partial hold, a failed read or a 2xx with nothing an unresolved hold;\n    // - still the newest operation, reviewed by the customer: the EARLIER notice\n    //   when its item is in the cart (the customer decides, nothing re-blocks).\n    async function lateResult(entry, outcome, form) {\n      if (current(entry) || !entry.intent || !entry.baseline) return;\n      var cart = null;\n      try { cart = await readCart(Date.now() + 5000); } catch (_) {}\n      var sameCart = cookieIdentity() === entry.identity;\n      var newest = newestAfter(entry);\n      var detail = { opId: entry.opId, status: outcome.status || 0 };\n      if (newest) {\n        if (!(outcome.ok || !cart || (sameCart && traceOfIntent(entry, cart)))) return;\n        duplicateNotice(form, TWICE);\n        journalNotice(entry.identity, 'twice');\n        detail.outcome = 'possible-duplicate';\n      } else {\n        var saved;\n        try { saved = stored(key(entry.identity)); } catch (_) { return; }\n        if (!saved || saved.opId !== entry.opId) return;\n        var state = !cart ? 'unread' : sameCart ? landed(saved, cart) : 'none';\n        detail.outcome = 'late-' + state;\n        if (saved.state === 'acknowledged' && saved.acknowledgeReason === 'customer-cart-review') {\n          // A 2xx whose read failed may well be in the cart; a 2xx that a clean\n          // read shows is not in the cart says nothing (decision e).\n          if (state === 'complete' || state === 'partial' || (outcome.ok && state === 'unread')) { duplicateNotice(form, EARLIER); journalNotice(entry.identity, 'earlier'); }\n        } else if (saved.state === 'released') {\n          if (state === 'complete') saved.state = 'handoff';\n          else if (state === 'partial') { saved.state = 'quarantined'; saved.partial = true; }\n          else if (state === 'unread' || outcome.ok) saved.state = 'unresolved';\n          saved.lateResultAt = Date.now();\n          if (saved.state !== 'released') {\n            saved.everUncertain = true;\n            persist(saved);\n            active = saved;\n            if (saved.state === 'handoff') duplicateNotice(form, EARLIER);\n            else recovery(form, saved);\n          }\n        } else return;\n      }\n      try {\n        if (window.BGDesignerTelemetry && window.BGDesignerTelemetry.emitEvent) window.BGDesignerTelemetry.emitEvent('cart_add_once_late_result', 'cart', detail, 'high');\n      } catch (_) {}\n    }\n    // A refused contender never adopts another operation's outcome: its state is\n    // 'rejected'. When an add of this cart is journaled (sent, read back,\n    // unresolved, handed off or quarantined) the customer is asked to check the\n    // cart; when nothing is journaled, the cart is only busy.\n    function rejectAdd(form, own, fromBridge) {\n      if (own) {\n        var ownOutcome = result(own);\n        recovery(form, own); announce(ownOutcome, form);\n        return Promise.resolve(ownOutcome);\n      }\n      var blocker = held();\n      if (degraded) blocker = null;\n      var uncertain = !!(blocker && isBlocking(blocker));\n      var outcome = { state: 'rejected', blockedBy: blocker ? blocker.state : (replacing ? 'replacement' : 'busy'), opId: '',\n        data: null, cart: null, recovery: uncertain, message: uncertain ? messageFor(blocker) : BUSY };\n      if (uncertain) recovery(form, blocker);\n      else if (form && fromBridge) {\n        // The submit stopped here never reaches the form's own handler: show\n        // the busy text in its product-form message box, and tell the runtime.\n        try {\n          var host = typeof form.closest === 'function' ? form.closest('product-form') : null;\n          var wrapper = host && host.querySelector('.product-form__error-message-wrapper');\n          var text = wrapper && wrapper.querySelector('.product-form__error-message');\n          if (text) { text.textContent = BUSY; wrapper.hidden = false; }\n          form.dispatchEvent(new window.CustomEvent('bg:designer-cart-submit-state', {\n            bubbles: true, detail: { state: 'error', stage: 'commerce-context', message: BUSY }\n          }));\n        } catch (_) {}\n      }\n      announce(outcome, form);\n      return Promise.resolve(outcome);\n    }\n    // A guard's verdict: only an explicit ok (true or { ok: true }) lets the add go.\n    function guardAllows(verdict) { return verdict === true || (!!verdict && typeof verdict === 'object' && verdict.ok === true); }\n    async function execute(input, init, form, identity, intent, operation, guard, contended) {\n      if (held() || cookieIdentity() !== identity) return rejectAdd(form);\n      var baseline;\n      try { baseline = await readCart(Date.now() + 5000); }\n      catch (_) { var unavailable = result({ state: 'baseline-unavailable' }); announce(unavailable, form); return unavailable; }\n      if (held() || cookieIdentity() !== identity) return rejectAdd(form);\n      // The add the customer reviewed as missing (decision a3) may have landed\n      // since: this baseline shows it -> nothing is sent; the customer is told,\n      // and the next tap is a fresh add.\n      try {\n        // Every add the customer reviewed as missing on this device, under any\n        // cart cookie (a sign-in merge may carry its line into a new cart).\n        var prior = null;\n        var reviewedPrior = false;\n        var landedPrior = false, shown = false;\n        var baseVariants = variantTotals(baseline.items);\n        for (var k = 0, journals = journalNames(); k < journals.length && !landedPrior; k += 1) {\n          var candidate = stored(journals[k]);\n          if (!candidate || candidate.state !== 'acknowledged' || candidate.acknowledgeReason !== 'customer-cart-review' || candidate.lateLandedAt) continue;\n          if (!prior || candidate.identity === identity) prior = candidate;\n          reviewedPrior = true;\n          if (candidate.intent && (candidate.baseline || candidate.before)) landedPrior = landed(candidate, baseline) !== 'none';\n          else if (candidate.reviewedVariants) {\n            // A legacy add (no intent): more of any variant than the cart the customer reviewed.\n            landedPrior = Object.keys(baseVariants).some(function (variant) { return baseVariants[variant] > (candidate.reviewedVariants[variant] || 0); });\n          }\n          if (landedPrior) { prior = candidate; prior.identity = decodeURIComponent(journals[k].slice(PREFIX.length)); }\n        }\n        // An unseen \"reached the cart\" notice for this device refuses one tap.\n        var earlierUnseen = null;\n        try {\n          earlierUnseen = JSON.parse(window.localStorage.getItem(NOTICE_KEY) || 'null');\n          if (!earlierUnseen || earlierUnseen.kind !== 'earlier' || earlierUnseen.seenAt || earlierUnseen.refusedAt) earlierUnseen = null;\n        } catch (_) { earlierUnseen = null; }\n        if (earlierUnseen) {\n          earlierUnseen.refusedAt = Date.now();\n          try { window.localStorage.setItem(NOTICE_KEY, JSON.stringify(earlierUnseen)); } catch (_) { degrade(); }\n          if (reviewedPrior) landedPrior = true;\n          else {\n            duplicateNotice(form, EARLIER); shown = true;\n            var noticed = { state: 'rejected', blockedBy: 'late-landed', opId: '', data: null, cart: null, recovery: false, message: EARLIER };\n            // Degraded mode: a notice, and the add goes on.\n            if (!degraded) { announce(noticed, form); return noticed; }\n          }\n        }\n        if (landedPrior) {\n          prior.lateLandedAt = Date.now();\n          persist(prior);\n          duplicateNotice(form, EARLIER); shown = true;\n          var arrived = { state: 'rejected', blockedBy: 'late-landed', opId: '', data: null, cart: null, recovery: false, message: EARLIER };\n          if (!degraded) { announce(arrived, form); return arrived; }\n        }\n      } catch (_) {}\n      // This request's send guard (captured in dispatch) decides last, after\n      // every awaited read above and right before the journal and the send, once,\n      // as guard(form, { operation }) with the caller's operation value: the page\n      // checks that operation against its current choice. Anything but an\n      // explicit ok (or a throw) is a pre-send refusal: nothing is journaled or\n      // sent; the rejected outcome carries the page's reason and message (never\n      // empty).\n      if (guard) {\n        var verdict;\n        try { verdict = guard(form, { operation: operation }); } catch (_) { verdict = null; }\n        if (!guardAllows(verdict)) {\n          var guarded = { state: 'rejected', blockedBy: 'guard', opId: '', data: null, cart: null, recovery: false,\n            reason: String((verdict && (verdict.reason || verdict.code)) || 'send-guard'), message: String((verdict && verdict.message) || BUSY) };\n          announce(guarded, form);\n          return guarded;\n        }\n      }\n      var entry = { version: 1, opId: Date.now() + '-' + (++sequence) + '-' + Math.random().toString(36).slice(2),\n        identity: identity, state: 'sent', sentAt: Date.now(), intent: intent, baseline: baseline.items.map(item) };\n      entry.aliveAt = entry.sentAt;\n      var duplicate = true; try { duplicate = contended || possibleDuplicate(entry, baseline); } catch (_) {} // before persist(); an error warns\n      active = entry;\n      if (!persist(entry)) { entry.state = 'quarantined'; return rejectAdd(form, entry); }\n      if (degraded && !shown && duplicate) { duplicateNotice(form, TWICE); journalNotice(identity, 'twice'); }\n      armRecovery(entry, form);\n      // While the request is in flight this page stamps aliveAt and holds the\n      // in-flight lock, so no other tab (and no later reload) can mistake a live\n      // request for a gone one.\n      var settle = watchInflight(entry);\n      var deadline = entry.sentAt + 30000;\n      var completed = false;\n      var answer = null;\n      var watchdog;\n      // No abort or cleanup is evidence of server refusal. The original transport remains observed.\n      var expiry = new Promise(function (resolve) {\n        watchdog = window.setTimeout(function () { resolve(setState(entry, 'unresolved', form)); }, 30000);\n      });\n      var sent = Promise.resolve().then(function () { return transport(input, init); }).then(async function (response) {\n        settle();\n        void lateResult(entry, { ok: response.ok, status: response.status }, form);\n        var data = null;\n        try { data = await bounded(response.json(), 5000); } catch (_) {}\n        answer = { data: data, errorStatus: response.status >= 400, status: response.status };\n        if (completed && current(entry) && entry.state !== 'quarantined') {\n          // A late answer confirmed by a read-back: say so (the page had shown\n          // the recovery state; the next tap would otherwise repeat it).\n          void reconcile(entry, Date.now() + 5000, answer, form).then(function (late) {\n            if (late && late.state === 'handoff') duplicateNotice(form, EARLIER);\n          });\n        }\n        return answer;\n      }, function () { settle(); void lateResult(entry, { ok: false, status: 0 }, form); return null; });\n      var work = bounded(sent, 5000).catch(function () { return null; }).then(function (value) {\n        return reconcile(entry, deadline, value || answer, form);\n      });\n      var outcome = await Promise.race([work, expiry]);\n      completed = true;\n      window.clearTimeout(watchdog);\n      return outcome;\n    }\n    async function dispatch(input, init, form, operation, requestGuard, existingCartOnly) {\n      form = form || (preparation && preparation.form);\n      // ARTWORK-FLOW-3: the request's guard is fixed here, before any await (a\n      // later registration change affects later requests only). A per-request\n      // guard replaces the form's registered one.\n      var guard = typeof requestGuard === 'function' ? requestGuard : (form && sendGuards.get(form)) || null;\n      if (refused(form)) return rejectAdd(form);\n      acquiring = true;\n      if (preparation) { window.clearTimeout(preparation.timer); preparation = null; }\n      try {\n        // Freeze mutable form/urlencoded bodies before the first asynchronous boundary.\n        init = Object.assign({}, init || {});\n        if (init.body && typeof init.body.entries === 'function') {\n          var snapshot = new init.body.constructor();\n          for (var pair of init.body.entries()) snapshot.append(pair[0], pair[1]);\n          init.body = snapshot;\n        }\n        storageReady();\n        var intent = await bounded(parseIntent(input, init), 5000);\n        if (!intent.length || intent.some(function (line) { return !/^\\d+$/.test(line.variant) || !Number.isSafeInteger(line.quantity) || line.quantity <= 0; })) return rejectAdd(form);\n        var identity = cookieIdentity();\n        if (!identity) {\n          // Checked after the intent read and before any cart request: a request\n          // that requires the existing cart never creates one. Nothing is sent,\n          // journaled or held; its check is not asked.\n          if (existingCartOnly) {\n            var missing = { state: 'rejected', blockedBy: 'no-cart', opId: '', data: null, cart: null, recovery: false,\n              reason: 'cart-missing', message: NO_CART };\n            announce(missing, form);\n            return missing;\n          }\n          var core = window.BGDesignerStorefrontCore;\n          if (!core || !core.resolveDurableCartTokenHash) return rejectAdd(form);\n          await bounded(core.resolveDurableCartTokenHash(), 5000);\n          identity = cookieIdentity();\n        }\n        if (!identity || held()) return rejectAdd(form);\n        var locks = window.navigator && window.navigator.locks;\n        if (locks && typeof locks.request === 'function') {\n          if (degraded && typeof locks.query === 'function' && await liveElsewhere(locks)) return rejectAdd(form);\n          return await locks.request('bg-cart-add:' + identity, { mode: 'exclusive', ifAvailable: true }, function (lock) {\n            return lock || degraded ? execute(input, init, form, identity, intent, operation, guard, !lock) : rejectAdd(form);\n          });\n        }\n        if (!noLocksCounted) {\n          noLocksCounted = true;\n          // Ordinary pages may not load the telemetry client. Still emit the one page-level signal.\n          try { doc.dispatchEvent(new window.CustomEvent('bg:cart-add-web-locks-unavailable', { detail: { count: 1 } })); } catch (_) {}\n          try {\n            if (window.BGDesignerTelemetry && window.BGDesignerTelemetry.emitEvent) window.BGDesignerTelemetry.emitEvent('cart_add_web_locks_unavailable', 'cart', {}, 'high');\n          } catch (_) {}\n        }\n        return await execute(input, init, form, identity, intent, operation, guard);\n      } catch (_) { return rejectAdd(form); }\n      finally { acquiring = false; }\n    }\n    function isAdd(input, init) {\n      try {\n        var url = new URL(input && input.url || String(input), window.location.href);\n        return url.origin === window.location.origin && /^(?:\\/[a-z]{2}(?:-[a-z0-9]+)?)?\\/cart\\/add(?:\\.js)?\\/?$/i.test(url.pathname)\n          && String(init && init.method || input && input.method || 'GET').toUpperCase() === 'POST';\n      } catch (_) { return false; }\n    }\n    // A form submission is a cart add when its EFFECTIVE action (the submitter's\n    // formaction, else the form's action) is this store's /cart/add, with any\n    // method (Shopify also adds on a GET to /cart/add).\n    function formAdd(form, submitter) {\n      try {\n        var action = submitter && typeof submitter.hasAttribute === 'function' && submitter.hasAttribute('formaction')\n          ? submitter.getAttribute('formaction') : form.getAttribute('action');\n        var method = String((submitter && typeof submitter.getAttribute === 'function' && submitter.getAttribute('formmethod')) || form.getAttribute('method') || 'get').toLowerCase();\n        if (method === 'dialog') return false;\n        var url = new URL(action || '', window.location.href);\n        return url.origin === window.location.origin && /^(?:\\/[a-z]{2}(?:-[a-z0-9]+)?)?\\/cart\\/add(?:\\.js)?\\/?$/i.test(url.pathname);\n      } catch (_) { return false; }\n    }\n    // A form is the owner's when its product-form element runs the owner-aware\n    // class (it calls runAdd), even if that element was built before this owner\n    // installed (script order differs between sections).\n    function isOwnerForm(form) {\n      if (forms.has(form)) return true;\n      var host = form && typeof form.closest === 'function' ? form.closest('product-form') : null;\n      if (host && host.form === form && host.bgCartAddOnceAware === true) { forms.add(form); return true; }\n      return false;\n    }\n    function quarantineLegacy() {\n      if (active || acquiring || preparation) return;\n      // Never write over an operation already journaled for this cart.\n      if (blocked()) return;\n      // A legacy (old-class) form is busy only while its add is in flight\n      // (.loading); a disabled button alone is a sold-out or validation state.\n      var legacy = Array.prototype.find.call(doc.querySelectorAll('product-form form'), function (form) {\n        return !isOwnerForm(form) && form.querySelector('[type=\"submit\"].loading');\n      });\n      if (!legacy) return;\n      var entry = { version: 1, opId: 'legacy-' + Date.now(), identity: cookieIdentity(), state: 'quarantined', sentAt: Date.now(), aliveAt: Date.now() };\n      active = entry;\n      persist(entry); armRecovery(entry, legacy);\n      // The old form's own request is live until its button stops loading; this\n      // page stands in for it (heartbeat + in-flight lock) until then.\n      var settle = watchInflight(entry);\n      var button = legacy.querySelector('[type=\"submit\"].loading');\n      // Only that same button, still on the page, ending its loading state is the\n      // old request settling. A replaced or removed button proves nothing: the\n      // page keeps standing in for the request until it unloads.\n      var check = function () {\n        if (button.isConnected && !button.classList.contains('loading')) { settle(); void legacyLate(entry, legacy); return true; }\n        return false;\n      };\n      if (!check() && typeof window.MutationObserver === 'function') {\n        var observer = new window.MutationObserver(function () { if (check()) observer.disconnect(); });\n        observer.observe(button, { attributes: true, attributeFilter: ['class'] });\n        observer.observe(legacy, { childList: true, subtree: true });\n      }\n    }\n    function variantTotals(lines) {\n      var output = Object.create(null);\n      (lines || []).forEach(function (line) {\n        var value = line && line.variant !== undefined ? line : item(line || {});\n        output[value.variant] = (output[value.variant] || 0) + Number(value.quantity || 0);\n      });\n      return output;\n    }\n    // A watched legacy add that completes after its hold was reviewed by the\n    // customer (or released): its item is unknown, so a conservative read-back\n    // compares every variant with what should be there (the newer add's\n    // baseline plus its intent, else the cart the customer reviewed). More of any\n    // variant (or an unreadable cart) -> the notice, journaled so the next page\n    // shows it too. Nothing in the cart is changed.\n    var LEGACY_CHECK_KEY = 'bg:cart-add-once-legacy-check';\n    function newestJournal(after) {\n      var newest = null;\n      for (var i = 0, names = journalNames(); i < names.length; i += 1) {\n        var value = stored(names[i]);\n        if (value && (!newest || (value.sentAt || 0) > (newest.sentAt || 0))) newest = value;\n      }\n      return newest && (newest.sentAt || 0) > (after || 0) ? newest : null;\n    }\n    function legacyLate(entry, form) {\n      if (current(entry)) return;\n      var saved;\n      try { saved = stored(key(entry.identity)); } catch (_) { saved = null; }\n      // The newer add may live under another cart key (a legacy page can journal\n      // before the cart cookie exists).\n      var newer = newestJournal(entry.sentAt || 0);\n      if (newer && newer.opId === entry.opId) newer = null;\n      var reviewed = saved && saved.opId === entry.opId && (saved.state === 'released' || saved.acknowledgeReason === 'customer-cart-review') ? saved : null;\n      if (!newer && !reviewed) return;\n      // Proven quantities only (Astra RCARTADD7): a newer add counts its intent\n      // only when a read-back verified it complete (hand-off); a pending,\n      // refused or partial one proves nothing beyond its baseline, so any\n      // increase over that baseline warns.\n      var expected = null;\n      if (newer && (newer.baseline || newer.before)) {\n        expected = newer.baseline ? variantTotals(newer.baseline) : Object.assign({}, newer.baselineVariants);\n        var proven = newer.state === 'handoff' || (newer.state === 'acknowledged' && !newer.acknowledgeReason);\n        if (proven && newer.intent) newer.intent.forEach(function (line) { expected[line.variant] = (expected[line.variant] || 0) + Number(line.quantity || 0); });\n      } else if (!newer && reviewed.reviewedVariants) expected = reviewed.reviewedVariants;\n      // Journaled before the read: the old form navigates to the cart at once, and\n      // the next page finishes the check.\n      var check = { opId: entry.opId, kind: newer ? 'twice' : 'earlier', expected: expected, at: Date.now() };\n      try { window.localStorage.setItem(LEGACY_CHECK_KEY, JSON.stringify(check)); } catch (_) {}\n      return finishLegacyCheck(check, form);\n    }\n    function resumeLegacyCheck() {\n      try {\n        var check = JSON.parse(window.localStorage.getItem(LEGACY_CHECK_KEY) || 'null');\n        if (check && check.opId) void finishLegacyCheck(check, null);\n      } catch (_) {}\n    }\n    async function finishLegacyCheck(check, form) {\n      var expected = check.expected;\n      var kind = check.kind;\n      var entry = { opId: check.opId };\n      var cart = null;\n      try { cart = await readCart(Date.now() + 5000); } catch (_) {}\n      var more = !cart || !expected;\n      if (cart && expected) {\n        var now = variantTotals(cart.items);\n        more = Object.keys(now).some(function (variant) { return now[variant] > (expected[variant] || 0); });\n      }\n      if (cart) { try { window.localStorage.removeItem(LEGACY_CHECK_KEY); } catch (_) {} }\n      if (!more) return;\n      duplicateNotice(form, kind === 'twice' ? TWICE : EARLIER);\n      journalNotice('', kind);\n      if (onCartPage()) showJournaledNotice();\n      try {\n        if (window.BGDesignerTelemetry && window.BGDesignerTelemetry.emitEvent) window.BGDesignerTelemetry.emitEvent('cart_add_once_late_result', 'cart', { opId: entry.opId, outcome: 'legacy-' + kind }, 'high');\n      } catch (_) {}\n    }\n    function releasePreparation(form) {\n      if (preparation && preparation.form === form) { window.clearTimeout(preparation.timer); preparation = null; }\n    }\n    function clearHandoff(entry) {\n      if (!current(entry) || entry.state !== 'handoff') return false;\n      try {\n        // Keep an acknowledgement tombstone so a suspended old owner cannot resurrect this operation.\n        entry.state = 'acknowledged';\n        if (!persist(entry)) { entry.state = 'handoff'; return false; }\n        if (active && active.opId === entry.opId) active = null;\n        clearRecoveryUi();\n        return true;\n      } catch (_) { return false; }\n    }\n    // Check again: a fresh cart read. The whole intended add in the cart settles\n    // it as success (the customer goes to the cart). An UNRESOLVED add with no\n    // trace in the cart whose sender is provably gone for two minutes is\n    // released (the one bounded exception to \"uncertainty never expires\"). A\n    // partial add, a live request, or a quarantined add is never released here.\n    async function checkAgain() {\n      var entry = blocked();\n      if (!entry) { clearRecoveryUi(); return { state: 'idle' }; }\n      // A new cart cookie: checkout or expiry starts an empty cart, but a sign-in\n      // merge carries the lines over. The same cart proof decides either way.\n      var rotated = cookieIdentity() !== entry.identity;\n      var known = !!(entry.intent && (entry.baseline || entry.before));\n      if (rotated || ((entry.state === 'unresolved' || entry.state === 'quarantined') && known)) {\n        var cart;\n        try { cart = await readCart(Date.now() + 5000); } catch (_) { recovery(null, entry); return result(entry); }\n        var latest = stored(key(entry.identity));\n        if (!latest || latest.opId !== entry.opId || !isBlocking(latest)) return result(latest || entry);\n        entry = latest;\n        if (!known) {\n          // A legacy add under a new cookie: released only without a line of its\n          // item; Check again never acknowledges it (the cart page does).\n          if (!legacyTrace(entry, cart)) {\n            var legacyGone = await releasable(entry);\n            if (legacyGone) return release(entry, 'cart-identity-rotated', legacyGone);\n          }\n          recovery(null, entry);\n          return result(entry);\n        }\n        var state = landed(entry, cart);\n        markPartial(entry, state === 'partial');\n        if (state === 'complete') {\n          var data = cart.items.find(function (line) { return signature(item(line)) === signature(entry.intent[0]); });\n          var settled = setState(entry, 'handoff', null, data, cart, true);\n          if (settled.state === 'handoff') window.location.assign(cartRoot() + 'cart');\n          return settled;\n        }\n        if (state === 'none' && (entry.state === 'unresolved' || rotated)) {\n          var gone = await releasable(entry);\n          if (gone) return release(entry, rotated ? 'cart-identity-rotated' : 'request-gone-cart-without-trace', gone);\n        }\n        // A partial add is never acknowledged here (Director decision b).\n        recovery(null, entry);\n        return result(entry);\n      }\n      return reconcile(entry, Date.now() + 5000, null, null);\n    }\n    // The customer is on the cart page: a fresh read reviews the open add. A\n    // hand-off, or an add whose whole intent is in the cart (customer edits\n    // aside), is acknowledged. Once its sender is provably gone two minutes: an\n    // add with no trace is released; a partial add, or a legacy add with a line\n    // of its item, is acknowledged (the customer reviewed it here). Until then it\n    // stays on hold.\n    async function cartArrival() {\n      var entry = blocked();\n      if (!entry || !onCartPage()) return;\n      // A request that is still being sent is left alone, unless it has been\n      // silent long enough for the customer review (its page may be gone).\n      if (['handoff', 'unresolved', 'quarantined'].indexOf(entry.state) === -1 && !customerReviewable(entry)) return;\n      try {\n        var reviewed = await readCart(Date.now() + 5000);\n        // Still the cart page after the read (a same-document navigation may\n        // have left it): otherwise no cart-page decision is taken.\n        if (!onCartPage()) return;\n        var saved = stored(key(entry.identity));\n        if (!saved || saved.opId !== entry.opId || !isBlocking(saved)) return;\n        if (saved.state === 'handoff') { clearHandoff(saved); return; }\n        // A new cart cookie changes only the release reason: the reviewed read\n        // of the (possibly merged) cart decides, as for the same cart.\n        var rotated = cookieIdentity() !== saved.identity;\n        var reason = rotated ? 'cart-identity-rotated' : 'cart-page-review';\n        var gone;\n        // Legacy add (Director decisions c and d): request proof AND cart proof\n        // releases it; with a line of its item in the cart it is acknowledged.\n        if (!saved.intent || !saved.baseline) {\n          if ((gone = await releasable(saved))) {\n            if (!onCartPage()) return;\n            if (legacyTrace(saved, reviewed)) acknowledgeReviewed(saved, 'legacy-reviewed', gone);\n            else release(saved, reason, gone);\n            return;\n          }\n          holdOnCartPage(saved, reviewed); return;\n        }\n        var state = landed(saved, reviewed);\n        markPartial(saved, state === 'partial');\n        if (state === 'complete') { saved.state = 'handoff'; if (persist(saved)) clearHandoff(saved); return; }\n        if (state === 'none' && (gone = await releasable(saved))) { if (onCartPage()) release(saved, reason, gone); return; }\n        if (state === 'partial' && (gone = await releasable(saved))) { if (onCartPage()) acknowledgeReviewed(saved, 'partial-reviewed', gone); return; }\n        holdOnCartPage(saved, reviewed);\n      } catch (_) { recovery(null); }\n    }\n    // Decision (a3): a hold no proof can clear (no Web Locks, ten minutes of\n    // silence) is offered to the customer, on the cart page only, with the cart\n    // shown below: one explicit control journals it as reviewed by the customer.\n    function holdOnCartPage(entry, reviewed) {\n      if (!onCartPage()) return;\n      if (!customerReviewable(entry)) { recovery(null, entry); return; }\n      // The cart the customer is shown with the control (legacy adds have no\n      // intent: the tap compares against it).\n      if (reviewed) { entry.offeredVariants = variantTotals(reviewed.items); persist(entry); }\n      try {\n        Array.prototype.forEach.call(doc.querySelectorAll('[data-bg-cart-add-recovery]'), function (node) { node.remove(); });\n        var panel = doc.createElement('div');\n        panel.setAttribute('data-bg-cart-add-recovery', '');\n        panel.setAttribute('data-bg-cart-add-review', '');\n        panel.setAttribute('role', 'alert');\n        var message = doc.createElement('p');\n        message.textContent = REVIEW_TEXT;\n        var confirm = doc.createElement('button');\n        confirm.type = 'button';\n        confirm.className = 'button button--secondary';\n        confirm.textContent = REVIEW_BUTTON;\n        confirm.addEventListener('click', function () {\n          confirm.disabled = true;\n          customerReviewed(entry).then(function (done) {\n            if (done) return;\n            // A failed cart read keeps the panel as it is.\n            if (done === null) { confirm.disabled = false; return; }\n            // Refused (the sender came back, or the add settled meanwhile): say why.\n            var latest = blocked();\n            panel.remove();\n            if (latest) recovery(null, latest);\n            else clearRecoveryUi();\n          });\n        });\n        panel.appendChild(message); panel.appendChild(confirm);\n        var top = cartPageHost();\n        top.insertBefore(panel, top.firstChild);\n      } catch (_) { recovery(null, entry); }\n    }\n    // The customer's review is taken on a fresh read, never on the arrival read:\n    // the add may have landed meanwhile (a frozen tab resumed). The whole add in\n    // the cart -> a completed add (acknowledged); part of it -> the partial is\n    // acknowledged; only nothing of it -> reviewed as missing. Returns true when\n    // done, null when the read failed (the panel stays), false when refused.\n    async function customerReviewed(entry) {\n      var saved;\n      try { saved = stored(key(entry.identity)); } catch (_) { return false; }\n      if (!saved || saved.opId !== entry.opId || !isBlocking(saved) || !onCartPage()) return false;\n      if (saved.state !== 'handoff' && !customerReviewable(saved)) return false;\n      var cart;\n      try { cart = await readCart(Date.now() + 5000); } catch (_) { return null; }\n      // Still the cart page after the read, or no decision (Astra RCARTADD7).\n      if (!onCartPage()) return false;\n      try { saved = stored(key(entry.identity)); } catch (_) { return false; }\n      if (!saved || saved.opId !== entry.opId || !isBlocking(saved)) return false;\n      // A legacy add (no intent): more of any variant than the cart the control\n      // was offered with (else, without that record, any line) means it reached\n      // the cart: say so and reload. A settled request with no growth (it may\n      // have been refused) is acknowledged silently, as on cart arrival.\n      if (saved.state !== 'handoff' && !(saved.intent && saved.baseline)) {\n        var nowVariants = variantTotals(cart.items);\n        var grew = saved.offeredVariants\n          ? Object.keys(nowVariants).some(function (variant) { return nowVariants[variant] > (saved.offeredVariants[variant] || 0); })\n          : legacyTrace(saved, cart);\n        if (grew) {\n          if (!acknowledgeReviewed(saved, 'legacy-reviewed', 'customer-cart-review')) return false;\n          duplicateNotice(null, EARLIER);\n          journalNotice('', 'earlier');\n          reloadCartPage();\n          return true;\n        }\n        if (saved.settledAt) return acknowledgeReviewed(saved, 'legacy-reviewed', 'customer-cart-review');\n      }\n      var state = saved.state === 'handoff' ? 'complete' : saved.intent && saved.baseline ? landed(saved, cart) : 'none';\n      // The cart just read differs from the one on screen: the notice is\n      // journaled and the cart page reloads at once (no tap can come between),\n      // so the customer sees the line before adding again (Astra RCARTADD7).\n      if (state === 'complete') {\n        saved.state = 'handoff';\n        if (!persist(saved) || !clearHandoff(saved)) return false;\n        duplicateNotice(null, EARLIER);\n        journalNotice('', 'earlier');\n        reloadCartPage();\n        return true;\n      }\n      if (state === 'partial') {\n        if (!acknowledgeReviewed(saved, 'partial-reviewed', 'customer-cart-review')) return false;\n        duplicateNotice(null, PARTIAL);\n        journalNotice('', 'partial');\n        reloadCartPage();\n        return true;\n      }\n      if (!customerReviewable(saved)) return false;\n      saved.reviewedVariants = variantTotals(cart.items);\n      persist(saved);\n      return acknowledgeReviewed(saved, 'customer-cart-review', 'customer-cart-review');\n    }\n    var owner = window.BGCartAddOnce = {\n      revision: '20260928-1',\n      recoveryMessage: RECOVERY,\n      runAdd: function (options) {\n        options = options || {};\n        var init = Object.assign({ method: 'POST', credentials: 'same-origin' }, options.config || {});\n        if (options.formData) init.body = options.formData;\n        // options.operation: the caller's opaque value for this add, handed to its\n        // send guard with the send; options.sendGuard: this add's own guard, in\n        // place of the form's registered one (ARTWORK-FLOW-3);\n        // options.existingCartOnly: add only into the existing cart, never create one.\n        return dispatch(options.url || cartRoot() + 'cart/add.js', init, options.form, options.operation,\n          typeof options.sendGuard === 'function' ? options.sendGuard : null, options.existingCartOnly === true);\n      },\n      registerForm: function (form) { forms.add(form); },\n      // ARTWORK-FLOW-3: a form's send guard (a function; anything else removes it).\n      acceptsSendGuard: true,\n      setSendGuard: function (form, guard) {\n        if (!form) return;\n        if (typeof guard === 'function') sendGuards.set(form, guard);\n        else sendGuards.delete(form);\n      },\n      // A registered product form preparing its add (context save, signing):\n      // other forms are refused until it sends or finishes. Release-only\n      // timer: nothing was sent, so this never becomes a recovery state.\n      beginPreparation: function (form) {\n        if (preparation && preparation.form !== form && !degraded) return false;\n        releasePreparation(form);\n        preparation = { form: form, timer: window.setTimeout(function () { releasePreparation(form); }, 60000) };\n        return true;\n      },\n      finishPreparation: releasePreparation,\n      showRecovery: recovery,\n      isDegraded: function () { return degraded; },\n      getState: function () { return (blocked() || {}).state || (acquiring || preparation ? 'busy' : replacing ? 'replacement' : 'idle'); },\n      subscribe: function (form, callback) {\n        var listener = { form: form, callback: callback }; listeners.push(listener);\n        return function () { listeners = listeners.filter(function (value) { return value !== listener; }); };\n      },\n      checkAgain: checkAgain,\n      verifyReplacementRemoval: async function (opId, lineKey) {\n        var entry = blocked();\n        if (!entry || entry.opId !== opId || entry.state !== 'handoff' || !entry.baseline) return false;\n        var original = entry.baseline.find(function (line) { return line.key === lineKey; });\n        if (!original) return false;\n        var adjusted = Object.assign({}, entry, { baseline: entry.baseline.filter(function (line) { return line.key !== lineKey; }) });\n        var cart = await readCart(Date.now() + 5000);\n        if (!current(entry) || cookieIdentity() !== entry.identity || compare(adjusted, cart) !== 'exact') return false;\n        entry.baseline = adjusted.baseline;\n        return persist(entry);\n      },\n      // This is a synchronous reservation, not a wait-then-replace promise. No add can enter the gap.\n      reserveReplacement: function () {\n        quarantineLegacy();\n        if (refused(null)) return null;\n        replacing = true;\n        return { release: function () { replacing = false; } };\n      },\n      whenReplaceable: function () { quarantineLegacy(); return Promise.resolve(!refused(null)); },\n      acknowledgeDrawer: async function (opId, drawer) {\n        var entry = blocked();\n        if (!entry || entry.opId !== opId || entry.state !== 'handoff' || !drawer || !drawer.isConnected) return false;\n        // Dawn opens its drawer in two timer turns. Observe its acknowledgement once, never poll the cart count.\n        await new Promise(function (resolve) { window.setTimeout(resolve, 0); });\n        await new Promise(function (resolve) { window.setTimeout(resolve, 0); });\n        var opened = drawer.classList.contains('active') || !!drawer.querySelector('#cart-notification.active');\n        if (!opened) return false;\n        try {\n          var cart = await readCart(Date.now() + 5000);\n          if (cookieIdentity() !== entry.identity || compare(entry, cart) !== 'exact') return false;\n          var lines = cart.items.filter(function (line) { return entry.intent.some(function (intent) { return signature(item(line)) === signature(intent); }); });\n          var rendered = lines.every(function (line) {\n            return Array.prototype.some.call(drawer.querySelectorAll('[data-key], [data-line-key], [id]'), function (node) {\n              return node.getAttribute('data-key') === line.key || node.getAttribute('data-line-key') === line.key || node.id === 'cart-notification-product-' + line.key;\n            });\n          });\n          // Notification strips the keyed wrapper while rendering. Its retained key is the explicit acknowledgement.\n          if (!rendered && !(drawer.cartItemKey && lines.length === 1 && drawer.cartItemKey === lines[0].key && drawer.querySelector('#cart-notification-product')?.textContent.trim())) return false;\n          return clearHandoff(entry);\n        } catch (_) { return false; }\n      }\n    };\n    if (pageHasFetch) window.fetch = function (input, init) {\n      if (!isAdd(input, init)) return transport(input, init);\n      return dispatch(input, init).then(function (outcome) {\n        if (outcome.state === 'handoff') return new Response(JSON.stringify(outcome.data || {}), { status: 200, headers: { 'content-type': 'application/json' } });\n        return new Response(JSON.stringify({ status: 409, message: outcome.message, description: outcome.message }), { status: 409, headers: { 'content-type': 'application/json' } });\n      });\n    };\n    // HTMLFormElement.submit() bypasses the submit event (including the runtime's native fallback).\n    var formPrototype = window.HTMLFormElement && window.HTMLFormElement.prototype;\n    if (formPrototype) {\n      var nativeSubmit = formPrototype.submit;\n      formPrototype.submit = function () {\n        if (!formAdd(this, null)) return nativeSubmit.apply(this, arguments);\n        var form = this;\n        void owner.runAdd({ form: form, formData: new window.FormData(form) }).then(function (outcome) {\n          if (outcome.state === 'handoff') window.location.assign(cartRoot() + 'cart');\n        });\n      };\n    }\n    // Remember the purchase control the customer used (the recovery panel goes\n    // beside it).\n    var trackAddControl = function (event) {\n      var node = event.target && typeof event.target.closest === 'function' ? event.target.closest('button, [role=\"button\"]') : null;\n      if (node && (/add to cart|adding/i.test(node.textContent || '') || (node.form && formAdd(node.form, node)))) lastAddControl = node;\n    };\n    window.addEventListener('pointerdown', trackAddControl, true);\n    window.addEventListener('click', trackAddControl, true);\n    window.addEventListener('submit', function (event) {\n      var form = event.target;\n      if (!form || form.tagName !== 'FORM' || !formAdd(form, event.submitter)) return;\n      quarantineLegacy();\n      if (refused(form)) {\n        event.preventDefault(); event.stopImmediatePropagation(); void rejectAdd(form, null, true); return;\n      }\n      if (!form.closest('product-form') && form.dataset.bgDesignerCompletionBound !== '1') {\n        event.preventDefault(); event.stopImmediatePropagation();\n        void owner.runAdd({ form: form, formData: new window.FormData(form) }).then(function (outcome) {\n          if (outcome.state === 'handoff') window.location.assign(cartRoot() + 'cart');\n        });\n        return;\n      }\n      // A registered product form or the storefront runtime gates this submit\n      // (validation, uploads, completion check, preparation). Nothing is sent\n      // and nothing is uncertain yet, so the owner starts no timer here: a\n      // click the page refuses must never turn into a recovery state later.\n      event.preventDefault();\n    }, true);\n    // A runtime-gated form without a registered product form: the runtime's\n    // own prepared dispatch is the one submit that reaches the window (its\n    // original submit is stopped by the runtime). The owner sends that add.\n    window.addEventListener('submit', function (event) {\n      var form = event.target;\n      if (!form || form.tagName !== 'FORM' || !formAdd(form, event.submitter)) return;\n      if (isOwnerForm(form) || form.dataset.bgDesignerCompletionBound !== '1') return;\n      event.preventDefault();\n      if (refused(null)) { void rejectAdd(form, null, true); return; }\n      void owner.runAdd({ form: form, formData: new window.FormData(form) }).then(function (outcome) {\n        if (outcome.state === 'handoff') window.location.assign(cartRoot() + 'cart');\n      });\n    }, false);\n    // A real unload (not a BFCache freeze) ends this page's requests: record it\n    // so another tab can later prove the sender gone.\n    window.addEventListener('pagehide', function (event) {\n      if (event && event.persisted) return;\n      inflightHere.slice().forEach(function (entry) { markJournal(entry, { pageGoneAt: Date.now() }); });\n    });\n    // Another tab (or a restored page) may have settled the add: nothing open ->\n    // this page's recovery controls go and the forms it disabled work again.\n    function reviewOpenAdd() {\n      var entry = blocked();\n      if (entry) armRecovery(entry, null);\n      else if (!acquiring && !preparation) clearRecoveryUi();\n      showJournaledNotice();\n      resumeLegacyCheck();\n    }\n    window.addEventListener('pageshow', function () { quarantineLegacy(); reviewOpenAdd(); void cartArrival(); });\n    window.addEventListener('storage', function (event) { if (!event.key || event.key.indexOf(PREFIX) === 0) reviewOpenAdd(); });\n    function restore() { quarantineLegacy(); var entry = blocked(); if (entry) armRecovery(entry, null); showJournaledNotice(); resumeLegacyCheck(); void cartArrival(); }\n    if (doc.readyState === 'loading') doc.addEventListener('DOMContentLoaded', restore, { once: true });\n    else restore();\n  }\n\n  var JSON_CACHE = Object.create(null);\n  var BOOTSTRAP_PROMISES = Object.create(null);\n  var BOOTSTRAP_PREWARM_FAILURES = Object.create(null);\n  var SHELL_PROMISES = Object.create(null);\n  var TEMPLATE_SUMMARY_PROMISES = Object.create(null);\n  var CART_STATE_PROMISE = null;\n  var LIGHTBOX_ID = 'bg-designer-storefront-preview-lightbox';\n  var CART_TRANSFORM_STATE_MAP_KEY = 'bg_cart_transform_state_map_v1';\n  var LEGACY_CART_TRANSFORM_STATE_MAP_KEY = '_bg_cart_transform_state_map_v1';\n  // The editor-shell loading scrim is opaque, so a lost or foreign ready\n  // message must never strand the customer behind it. Mirrors the 12s\n  // shell-document-warm and product-editor-config watchdog windows.\n  var EDITOR_SHELL_LOADING_WATCHDOG_MS = 12000;\n\n  function text(value) {\n    return String(value || '').trim();\n  }\n\n  function numberValue(value, fallback) {\n    var parsed = Number(value);\n    return Number.isFinite(parsed) ? parsed : fallback;\n  }\n\n  function roundMoney(value) {\n    return Number(numberValue(value, 0).toFixed(2));\n  }\n\n  // EDDM-ROUTE-CENT (2026-10-02): the quote engine's money arithmetic\n  // (apps/api foundation-authoritative-commerce-quote.ts moneyMicros,\n  // roundRatio, centsFromMicros). The amount as authored becomes whole micros,\n  // is scaled by numerator / denominator with one half-up integer division and\n  // is rounded once to the cent, half away from zero. EXACT-CENTS-PR3\n  // (2026-10-04): every product price, add-on and line is built with it; no\n  // flag selects another arithmetic.\n  var MONEY_MICROS_PER_UNIT = 1000000;\n  var MONEY_MICROS_PER_CENT = 10000;\n\n  function divideHalfAwayFromZero(value, divisor) {\n    if (typeof value === 'bigint') {\n      var half = divisor / BigInt(2);\n      return value >= BigInt(0) ? (value + half) / divisor : -((-value + half) / divisor);\n    }\n    var negative = value < 0;\n    var adjusted = (negative ? -value : value) + Math.floor(divisor / 2);\n    var quotient = Math.floor(adjusted / divisor);\n    var remainder = adjusted - (quotient * divisor);\n    if (remainder < 0) quotient -= 1;\n    else if (remainder >= divisor) quotient += 1;\n    return negative ? -quotient : quotient;\n  }\n\n  function scaleMoney(value, numerator, denominator) {\n    var amount = Number(value);\n    var top = numerator === undefined ? 1 : Number(numerator);\n    var bottom = denominator === undefined ? 1 : Number(denominator);\n    if (!Number.isFinite(amount) || !Number.isSafeInteger(top) || !Number.isSafeInteger(bottom) || top < 0 || bottom <= 0) return NaN;\n    var micros = Math.round(amount * MONEY_MICROS_PER_UNIT);\n    if (!Number.isSafeInteger(micros)) return NaN;\n    if (typeof BigInt === 'function') {\n      var exactMicros = BigInt(micros);\n      var exactScaled = top === bottom ? exactMicros : divideHalfAwayFromZero(exactMicros * BigInt(top), BigInt(bottom));\n      return Number(divideHalfAwayFromZero(exactScaled, BigInt(MONEY_MICROS_PER_CENT))) / 100;\n    }\n    var product = micros * top;\n    if (!Number.isSafeInteger(Math.abs(product) + bottom)) return roundMoney(amount * (top / bottom));\n    var scaled = top === bottom ? micros : divideHalfAwayFromZero(product, bottom);\n    return divideHalfAwayFromZero(scaled, MONEY_MICROS_PER_CENT) / 100;\n  }\n\n  // EXACT-CENTS-PLAN-PERCENT (2026-10-04): a plan or staff tier percentage on\n  // money is the quote engine's percentOfCents (foundation-authoritative-\n  // commerce-quote.ts calculateTierPrices): the amount in whole cents, times the\n  // share kept, one half-up integer division. discountPct is a fraction (0.05)\n  // or, above 1, a percent (50). A whole-cent amount times basis points over\n  // 10,000 is exact in scaleMoney's micros.\n  function keepShareOfMoney(amount, discountPct) {\n    var pct = numberValue(discountPct, 0);\n    var share = pct > 1 ? pct / 100 : pct;\n    var keepBps = Math.min(10000, Math.max(0, Math.round((1 - share) * 10000)));\n    var cents = scaleMoney(amount, 1, 1);\n    return Number.isFinite(cents) ? scaleMoney(cents, keepBps, 10000) : NaN;\n  }\n\n  // FUNCTIONS-CURRENCY-AWARE (2026-10-12): the shop-to-presentment rule of the\n  // Cart Transform and the checkout Validation, copied from the control plane's\n  // exact_money.js (parsePresentmentRate, presentmentCents) so the page shows\n  // what the cart charges in the shopper's currency:\n  //\n  //   presentmentCents = floor((shopCents x R + floor(P / 2)) / P)\n  //\n  // for a rate text that is exactly R / P (R its digits without the point, P ten\n  // to the number of fraction digits; ^[0-9]{1,6}(\\.[0-9]{1,18})?$ with R above\n  // 0): one half-up division of exact integers, never a float. A rate of exactly\n  // 1 returns the shop cents unchanged; any other text is unusable (null). Both\n  // functions are the control plane's byte for byte in behavior: the control\n  // plane's tests/presentment-cents.vectors.json is the one table every copy\n  // reproduces (tests/bg-presentment-cents.test.mjs). presentmentCents takes\n  // whole shop cents, 0 or more; the page converts through presentmentCentsOf.\n  var PRESENTMENT_IDENTITY_RATE = { identity: true, digits: '1', units: 1, scale: 1, half: 0 };\n\n  function parsePresentmentRate(rateText) {\n    if (rateText === '1.0') return PRESENTMENT_IDENTITY_RATE;\n    var match = typeof rateText === 'string' && /^([0-9]{1,6})(?:\\.([0-9]{1,18}))?$/.exec(rateText);\n    if (!match) return null;\n    var digits = match[1] + (match[2] || '');\n    var units = Number(digits);\n    var scale = Number('1e' + (digits.length - match[1].length));\n    return units > 0 ? { identity: units === scale && digits.length < 16, digits: digits, units: units, scale: scale, half: scale > 1 ? scale / 2 : 0 } : null;\n  }\n\n  function presentmentCents(shopCents, rate) {\n    if (!rate) return NaN;\n    if (rate.identity) return shopCents;\n    var adjusted = shopCents * rate.units + rate.half;\n    if (adjusted <= 9007199254740991) return (adjusted - (adjusted % rate.scale)) / rate.scale;\n    if (!Number.isSafeInteger(shopCents) || typeof BigInt !== 'function') return NaN;\n    var exact = Number((BigInt(shopCents) * BigInt(rate.digits) + BigInt(rate.half)) / BigInt(rate.scale));\n    return Number.isSafeInteger(exact) ? exact : NaN;\n  }\n\n  // Whole cents of an amount as authored, half away from zero (exact_money.js\n  // moneyCents); NaN when its micros are not a safe integer.\n  function moneyCents(amount) {\n    var micros = Math.round(Number(amount) * MONEY_MICROS_PER_UNIT);\n    return Number.isSafeInteger(micros) ? divideHalfAwayFromZero(micros, MONEY_MICROS_PER_CENT) : NaN;\n  }\n\n  function parseJson(value, fallback) {\n    try {\n      return JSON.parse(String(value || ''));\n    } catch (_) {\n      return fallback;\n    }\n  }\n\n  function deepClone(value, fallback) {\n    try {\n      return JSON.parse(JSON.stringify(value === undefined ? fallback : value));\n    } catch (_) {\n      return fallback;\n    }\n  }\n\n  function encodeJsonParam(value) {\n    if (!value || typeof value !== 'object') return '';\n    try {\n      return window.btoa(unescape(encodeURIComponent(JSON.stringify(value))));\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function normalizeProductPageExperimentContext(value) {\n    var source = value && typeof value === 'object' && !Array.isArray(value) ? value : null;\n    if (!source || source.version !== 1 || typeof source.presentation !== 'string' || typeof source.formattedPrice !== 'string') return null;\n    var presentation = text(source.presentation).toLowerCase();\n    if (presentation !== 'intent_first') return null;\n    var formattedPrice = text(source.formattedPrice).slice(0, 32);\n    var summaryParts = Array.isArray(source.summaryParts)\n      ? source.summaryParts.map(function (entry) { return text(entry).slice(0, 80); }).filter(Boolean).slice(0, 6)\n      : [];\n    if (!formattedPrice) return null;\n    return {\n      version: 1,\n      presentation: presentation,\n      formattedPrice: formattedPrice,\n      summaryParts: summaryParts\n    };\n  }\n\n  // Copy and convert (2026-09-09): the product page's request to copy a\n  // started design and convert the copy to the newly chosen style. Bounded\n  // and validated here and again by the designer API; the editor applies it.\n  function normalizeStyleConversionContext(value) {\n    var source = value && typeof value === 'object' && !Array.isArray(value) ? value : null;\n    if (!source || source.version !== 1) return null;\n    var sourceProjectId = text(source.sourceProjectId).slice(0, 128);\n    var holderId = text(source.holderId).slice(0, 120);\n    var toValueId = text(source.toValueId).slice(0, 120);\n    if (!sourceProjectId || !holderId || !toValueId) return null;\n    var targetSelections = Array.isArray(source.targetSelections)\n      ? source.targetSelections.map(function (entry) {\n        var record = entry && typeof entry === 'object' ? entry : {};\n        return { holderId: text(record.holderId).slice(0, 120), valueId: text(record.valueId).slice(0, 120) };\n      }).filter(function (entry) { return entry.holderId && entry.valueId; }).slice(0, 24)\n      : [];\n    return {\n      version: 1,\n      sourceProjectId: sourceProjectId,\n      holderId: holderId,\n      fromValueId: text(source.fromValueId).slice(0, 120),\n      toValueId: toValueId,\n      fromLabel: text(source.fromLabel).slice(0, 120),\n      toLabel: text(source.toLabel).slice(0, 120),\n      targetSelections: targetSelections\n    };\n  }\n\n  function escapeHtml(value) {\n    return String(value || '')\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n  }\n\n  function slugify(value) {\n    return text(value)\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, '-')\n      .replace(/^-+|-+$/g, '');\n  }\n\n  function uniqueStrings(values) {\n    var seen = Object.create(null);\n    return (Array.isArray(values) ? values : []).map(text).filter(function (entry) {\n      if (!entry || seen[entry]) return false;\n      seen[entry] = true;\n      return true;\n    });\n  }\n\n  function normalizeArtworkMode(value) {\n    var normalized = text(value).toLowerCase();\n    if (!normalized) return '';\n    if (\n      normalized === 'designonline'\n      || normalized === 'customize online'\n      || normalized === 'design online'\n      || normalized === 'edit artwork'\n    ) {\n      return 'designonline';\n    }\n    if (normalized === 'editservice' || normalized === 'template edit service') {\n      return 'editservice';\n    }\n    if (normalized === 'uploadfiles' || normalized === 'upload artwork') {\n      return 'uploadfiles';\n    }\n    if (normalized === 'uploadcanva' || normalized === 'upload canva pdf') {\n      return 'uploadcanva';\n    }\n    if (normalized === 'share canva link' || normalized === 'share canva design' || normalized === 'share canva') {\n      return 'uploadcanva';\n    }\n    if (\n      normalized === 'youhaveart'\n      || normalized === 'i have artwork'\n      || normalized === 'send artwork after checkout'\n      || normalized === 'send artwork later'\n      || normalized === 'order now, send artwork later'\n      || normalized === 'artwork coming later'\n    ) {\n      return 'youhaveart';\n    }\n    if (normalized === 'customdesign' || normalized === 'need a custom design' || normalized === 'custom design' || normalized === 'pro design') {\n      return 'customdesign';\n    }\n    if (normalized === 'reorder' || normalized === 're-order') {\n      return 'reorder';\n    }\n    if (normalized === 'recreate' || normalized === 'recreate a design' || normalized === 'recreate design' || normalized === 're-create design') {\n      return 'recreate';\n    }\n    if (normalized === 'freesetup' || normalized === 'free setup' || normalized === 'free proof setup') {\n      return 'freesetup';\n    }\n    return normalized;\n  }\n\n  function normalizeLaunchProvider(value) {\n    var normalized = text(value).toLowerCase();\n    if (!normalized) return '';\n    if (normalized === 'pitchprint-legacy') return 'pitchprint';\n    if (normalized === 'pitchprint') return 'pitchprint';\n    if (normalized === 'self-hosted') return 'self-hosted';\n    return normalized;\n  }\n\n  function normalizeCartDesignEditor(value) {\n    var normalized = text(value).toLowerCase().replace(/[\\s_]+/g, '-');\n    return normalized === 'pitchprint-mini' ? normalized : '';\n  }\n\n  function normalizeCartQuantityMode(value) {\n    var normalized = text(value).toLowerCase();\n    if (!normalized) return '';\n    if (normalized === 'print_qty' || normalized === 'print-qty' || normalized === 'printqty') {\n      return 'print_qty';\n    }\n    if (normalized === 'set_count' || normalized === 'set-count' || normalized === 'setcount') {\n      return 'set_count';\n    }\n    return '';\n  }\n\n  // Storefront data reads (GET only; no write passes through here). A network\n  // failure (TypeError, before the headers or while the body streams), an\n  // attempt that runs out of time, 408, 429 or 5xx is tried again up to\n  // LOAD_JSON_MAX_ATTEMPTS times with exponential backoff and jitter, never\n  // sooner than Retry-After; a Retry-After longer than LOAD_JSON_MAX_DELAY_MS,\n  // any other answer and a body that is not JSON are final. One read chain\n  // (headers, body and waits together) ends within LOAD_JSON_TOTAL_BUDGET_MS,\n  // below the runtime's 12 s setup-data watchdog, so the watchdog never starts a\n  // second, overlapping chain; each attempt is cut off (and aborted) after\n  // LOAD_JSON_ATTEMPT_TIMEOUT_MS or the remaining budget. A failed read leaves\n  // the cache so a later read can try again.\n  var LOAD_JSON_MAX_ATTEMPTS = 3;\n  var LOAD_JSON_BASE_DELAY_MS = 400;\n  var LOAD_JSON_MAX_DELAY_MS = 4000;\n  var LOAD_JSON_TOTAL_BUDGET_MS = 10000;\n  var LOAD_JSON_ATTEMPT_TIMEOUT_MS = 7000;\n  var LOAD_JSON_MIN_ATTEMPT_MS = 1000;\n\n  function readRetryAfterMs(response) {\n    var raw = text(response && response.headers && typeof response.headers.get === 'function'\n      ? response.headers.get('retry-after')\n      : '');\n    if (!raw) return 0;\n    if (/^\\d+$/.test(raw)) return Number(raw) * 1000;\n    var retryAt = Date.parse(raw);\n    return Number.isFinite(retryAt) ? Math.max(0, retryAt - Date.now()) : 0;\n  }\n\n  function readJsonOnce(url, timeoutMs) {\n    return new Promise(function (resolve, reject) {\n      var Controller = typeof AbortController === 'function' ? AbortController : window.AbortController;\n      var controller = typeof Controller === 'function' ? new Controller() : null;\n      var finished = false;\n      var timer = window.setTimeout(function () {\n        if (finished) return;\n        finished = true;\n        if (controller) {\n          try { controller.abort(); } catch (_) {}\n        }\n        var timeout = new Error('Storefront data did not arrive in time from ' + url);\n        timeout.status = 0;\n        timeout.timedOut = true;\n        timeout.retryable = true;\n        reject(timeout);\n      }, Math.max(0, timeoutMs));\n      function settle(callback, value) {\n        if (finished) return;\n        finished = true;\n        window.clearTimeout(timer);\n        callback(value);\n      }\n      var init = { credentials: 'same-origin', headers: { accept: 'application/json' } };\n      if (controller) init.signal = controller.signal;\n      fetch(url, init).then(function (response) {\n        if (!response.ok) {\n          var status = Number(response.status) || 0;\n          var failure = new Error('Unable to load storefront data from ' + url);\n          failure.status = status;\n          failure.retryAfterMs = readRetryAfterMs(response);\n          failure.retryable = status === 408 || status === 429 || (status >= 500 && status <= 599);\n          // The refused answer's body is never read: release it before the\n          // retry or the final failure so no stream stays open.\n          try {\n            if (response.body && typeof response.body.cancel === 'function') response.body.cancel().catch(function () {});\n          } catch (_) {}\n          if (controller) {\n            try { controller.abort(); } catch (_) {}\n          }\n          settle(reject, failure);\n          return;\n        }\n        response.json().then(function (payload) {\n          settle(resolve, payload);\n        }, function (bodyError) {\n          // A network failure while the body streams is retried like one before\n          // the headers; a body that is not JSON (SyntaxError) is final.\n          var failure = bodyError && typeof bodyError === 'object' ? bodyError : new Error('Unable to read storefront data from ' + url);\n          failure.status = Number(response.status) || 0;\n          failure.retryable = Boolean(bodyError && bodyError.name === 'TypeError');\n          settle(reject, failure);\n        });\n      }, function (networkError) {\n        // Browsers reject fetch with a TypeError when the network fails; other\n        // rejections (an aborted or refused request) are final.\n        var failure = networkError instanceof Error ? networkError : new Error('Unable to reach storefront data at ' + url);\n        failure.status = 0;\n        failure.retryable = Boolean(networkError && networkError.name === 'TypeError');\n        settle(reject, failure);\n      });\n    });\n  }\n\n  function loadJson(url) {\n    var cleanUrl = text(url);\n    if (!cleanUrl) return Promise.resolve(null);\n    if (JSON_CACHE[cleanUrl]) return JSON_CACHE[cleanUrl];\n    var startedAt = Date.now();\n    function remainingMs() {\n      return LOAD_JSON_TOTAL_BUDGET_MS - (Date.now() - startedAt);\n    }\n    function attemptLoad(attempt) {\n      return readJsonOnce(cleanUrl, Math.min(LOAD_JSON_ATTEMPT_TIMEOUT_MS, remainingMs())).catch(function (error) {\n        var retryAfterMs = Number(error && error.retryAfterMs) || 0;\n        if (!error || error.retryable !== true || attempt >= LOAD_JSON_MAX_ATTEMPTS || retryAfterMs > LOAD_JSON_MAX_DELAY_MS) {\n          throw error;\n        }\n        var backoffMs = LOAD_JSON_BASE_DELAY_MS * Math.pow(2, attempt - 1);\n        var delayMs = Math.min(LOAD_JSON_MAX_DELAY_MS, Math.max(retryAfterMs, backoffMs / 2 + Math.random() * (backoffMs / 2)));\n        // The next attempt must still fit inside this chain's budget.\n        if (delayMs + LOAD_JSON_MIN_ATTEMPT_MS > remainingMs()) throw error;\n        return new Promise(function (resolve) {\n          window.setTimeout(resolve, delayMs);\n        }).then(function () {\n          // A pause can outlast its timer (a suspended tab, a busy page):\n          // an expired budget ends the chain before any new request.\n          if (remainingMs() < LOAD_JSON_MIN_ATTEMPT_MS) throw error;\n          return attemptLoad(attempt + 1);\n        });\n      });\n    }\n    var request = attemptLoad(1);\n    JSON_CACHE[cleanUrl] = request;\n    request.catch(function () {\n      if (JSON_CACHE[cleanUrl] === request) delete JSON_CACHE[cleanUrl];\n    });\n    return request;\n  }\n\n  function getRootUrl() {\n    return (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n  }\n\n  function getCurrencyCode() {\n    return text(window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'USD';\n  }\n\n  // FUNCTIONS-CURRENCY-AWARE: the rate is the one Shopify renders into every\n  // storefront page with the shopper's currency, Shopify.currency.rate (a\n  // Decimal string, \"1.44961285\" for CAD on WCR, \"1.0\" in the shop currency).\n  // It is the Markets rate the cart's presentmentCurrencyRate carries, it is\n  // there before anything is in the cart, and it is the only rate the page has:\n  // /cart.js returns converted amounts, not a rate, and only for lines already\n  // added. Parsed once per text; null when absent or unusable.\n  var presentmentRateCache = { text: null, rate: null };\n  function getPresentmentRate() {\n    var currency = window.Shopify && window.Shopify.currency;\n    var rate = currency ? currency.rate : null;\n    var rateText = typeof rate === 'number' ? String(rate) : rate;\n    if (typeof rateText !== 'string') return null;\n    if (rateText !== presentmentRateCache.text) {\n      presentmentRateCache.text = rateText;\n      presentmentRateCache.rate = parsePresentmentRate(rateText);\n    }\n    return presentmentRateCache.rate;\n  }\n\n  // True when the page shows prices in another currency than the shop's: a\n  // usable rate other than 1. Without Shopify.currency, with an unusable rate\n  // or at a rate of 1 every figure is the shop figure (today's page).\n  function isPresentmentConverting() {\n    var rate = getPresentmentRate();\n    return !!(rate && !rate.identity);\n  }\n\n  // The page's conversion of whole shop cents into the shopper's cents\n  // (presentmentCents; a negative amount is the sign times the rule on its\n  // absolute value). The shop cents unchanged when the page does not convert,\n  // for a value that is not whole cents, or past the safe integers.\n  function presentmentCentsOf(shopCents) {\n    var rate = getPresentmentRate();\n    if (!rate || rate.identity || !Number.isSafeInteger(shopCents)) return shopCents;\n    var converted = shopCents < 0 ? -presentmentCents(-shopCents, rate) : presentmentCents(shopCents, rate);\n    return Number.isSafeInteger(converted) ? converted : shopCents;\n  }\n\n  // A shop amount in the shopper's currency: whole shop cents (moneyCents),\n  // converted (presentmentCentsOf), back to an amount. The amount itself, not\n  // re-rounded, when the page does not convert.\n  function presentmentAmount(amount) {\n    if (!isPresentmentConverting()) return amount;\n    var cents = moneyCents(amount);\n    return Number.isSafeInteger(cents) ? presentmentCentsOf(cents) / 100 : amount;\n  }\n\n  function formatCurrencyAmount(amount, currencyCode) {\n    try {\n      return new Intl.NumberFormat('en-US', {\n        style: 'currency',\n        currency: currencyCode\n      }).format(amount);\n    } catch (_) {\n      return '$' + amount.toFixed(2);\n    }\n  }\n\n  // A shop amount as the page shows it: converted into the shopper's currency\n  // (Admin, theme-json and designer-api prices are shop currency). A price the\n  // page computes from a whole line (a tier sale, a set-count package, a print\n  // quantity split) is converted as a line first and then formatted with\n  // formatPresentmentMoney, never through this; this is the amount of one\n  // thing (an add-on, a fee, a per piece). Byte for byte today's text when the\n  // page does not convert.\n  function formatMoney(value) {\n    return formatCurrencyAmount(presentmentAmount(numberValue(value, 0)), getCurrencyCode());\n  }\n\n  // An amount already in the shopper's currency (the cart's own figures from\n  // /cart.js, or a figure the page converted as a line): formatted, never\n  // converted again.\n  function formatPresentmentMoney(value) {\n    return formatCurrencyAmount(numberValue(value, 0), getCurrencyCode());\n  }\n\n  // The shop's own currency (layout/theme.liquid data-bg-shop-currency, from\n  // Liquid's shop.currency; window.Shopify does not carry it). '' without it.\n  function getShopCurrencyCode() {\n    var root = window.document && window.document.documentElement;\n    var code = root && typeof root.getAttribute === 'function' ? text(root.getAttribute('data-bg-shop-currency')) : '';\n    return /^[A-Z]{3}$/.test(code) ? code : '';\n  }\n\n  // A record of a shop amount that a cart line property carries into the\n  // order (Postage, which QPS invoices separately, and the artwork service\n  // amounts): the shop number in the shop's currency, never converted, so the\n  // record does not depend on the rate the page had. A page that does not\n  // convert names the shopper's currency, which is then the shop's (today's\n  // text); a converting page without the layout's shop currency shows the\n  // converted amount rather than a shop number under the shopper's currency.\n  // When the shopper's currency is not the shop's, the record names its\n  // currency so nobody reads it as the shopper's: a bare \"$\" (US dollars)\n  // takes the code's country letters, \"US$12.50\"; a symbol that already names\n  // its currency (CA$, A$, a euro sign) stays as it is.\n  function formatShopMoney(value) {\n    var shopCode = getShopCurrencyCode();\n    if (shopCode) {\n      var record = formatCurrencyAmount(numberValue(value, 0), shopCode);\n      return shopCode === getCurrencyCode() ? record : nameBareDollar(record, shopCode);\n    }\n    return isPresentmentConverting() ? formatMoney(value) : formatPresentmentMoney(value);\n  }\n\n  function nameBareDollar(formatted, currencyCode) {\n    return formatted.replace(/(^|[^A-Za-z])\\$/, function (match, lead) {\n      return lead + currencyCode.slice(0, 2) + '$';\n    });\n  }\n\n  function formatSignedMoneyProperty(value) {\n    var amount = Number(numberValue(value, 0) || 0);\n    if (Math.abs(amount) < 0.005) return '';\n    return (amount < 0 ? '-' : '+') + formatShopMoney(Math.abs(amount));\n  }\n\n  function normalizeAddonType(value) {\n    var normalized = text(value).toLowerCase().replace(/[^a-z]/g, '');\n    if (normalized === 'flat') return 'flat';\n    if (normalized === 'quantitybased') return 'quantityBased';\n    return '';\n  }\n\n  function normalizeAddonSelection(entry) {\n    var source = entry && typeof entry === 'object' ? entry : {};\n    var targetingId = text(source.targetingId);\n    var rawAddonKey = text(source.addonKey);\n    var addonPrice = numberValue(source.addonBasePrice, NaN);\n    if (!Number.isFinite(addonPrice)) addonPrice = numberValue(source.addonPrice, NaN);\n    var explicitAddonType = normalizeAddonType(source.addonType);\n    var hasNonZeroAddonPrice = Number.isFinite(addonPrice) && Math.abs(addonPrice) > 0.0001;\n    var hasAddonKeyShape = /^addon-/i.test(rawAddonKey) || /^addon-/i.test(targetingId);\n    var addonKey = text(\n      hasAddonKeyShape\n        ? (rawAddonKey || targetingId)\n        : ((explicitAddonType || hasNonZeroAddonPrice) ? (rawAddonKey || targetingId) : '')\n    ).toLowerCase();\n    var addonType = explicitAddonType || ((addonKey || hasNonZeroAddonPrice) && Number.isFinite(addonPrice) ? 'quantityBased' : '');\n    var hasAddon = !!addonKey || !!explicitAddonType || hasNonZeroAddonPrice;\n    return {\n      hasAddon: hasAddon,\n      addonKey: addonKey,\n      addonLabel: text(source.addonLabel),\n      addonName: text(source.addonName),\n      addonType: addonType,\n      addonBasePrice: Number.isFinite(addonPrice) ? addonPrice : null,\n      discountEligible: !!source.discountEligible,\n      excludeFromCart: !!source.excludeFromCart,\n      useTypedQuantity: !!source.useTypedQuantity,\n      isPostage: !!source.isPostage,\n      dontSayFree: !!source.dontSayFree\n    };\n  }\n\n  // holdCreditsFromSale keeps a credit out of the discount base. That is only\n  // correct where the submitted line price is grossed up to compensate, which is\n  // the Product Commerce quote lane when the product carries a sale rate. Applying\n  // it anywhere else makes the page quote a total the cart will not charge, so it\n  // is off unless the caller can prove the gross-up is active.\n  function calculateDesignerOptionAddOns(optionSelections, quantity, typedQuantity, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var holdCreditsFromSale = settings.holdCreditsFromSale === true;\n    var selectedQuantity = Math.max(1, numberValue(quantity, 1) || 1);\n    var selectedTypedQuantity = Math.max(1, numberValue(typedQuantity, selectedQuantity) || selectedQuantity);\n    var result = {\n      cartIncludedTotal: 0,\n      cartIncludedDiscountEligibleTotal: 0,\n      cartIncludedNonDiscountEligibleTotal: 0,\n      excludedTotal: 0,\n      postageTotal: 0,\n      displayOnlyTotal: 0,\n      breakdown: []\n    };\n    (Array.isArray(optionSelections) ? optionSelections : []).forEach(function (entry) {\n      var addon = normalizeAddonSelection(entry);\n      if (!addon.hasAddon || !Number.isFinite(addon.addonBasePrice)) return;\n      var unitQuantity = addon.useTypedQuantity ? selectedTypedQuantity : selectedQuantity;\n      // Unit x quantity rounded once to the cent, like the quote engine.\n      var amount = scaleMoney(addon.addonBasePrice, addon.addonType === 'flat' ? 1 : unitQuantity, 1);\n      // A sale discounts what the customer is buying, never what they are\n      // declining. A charge (upgraded stakes, mailing service) takes the discount\n      // when its config allows it; a credit (no stakes) always comes off at face\n      // value, because shrinking a credit by the sale percentage quietly hands\n      // back less than the hardware the customer gave up is worth.\n      var discountEligible = !!addon.discountEligible && (!holdCreditsFromSale || amount > 0);\n      var cartIncluded = !(addon.isPostage || addon.excludeFromCart);\n      if (addon.isPostage) {\n        result.postageTotal = roundMoney(result.postageTotal + amount);\n      } else if (!cartIncluded) {\n        result.excludedTotal = roundMoney(result.excludedTotal + amount);\n      } else {\n        result.cartIncludedTotal = roundMoney(result.cartIncludedTotal + amount);\n        if (discountEligible) {\n          result.cartIncludedDiscountEligibleTotal = roundMoney(result.cartIncludedDiscountEligibleTotal + amount);\n        } else {\n          result.cartIncludedNonDiscountEligibleTotal = roundMoney(result.cartIncludedNonDiscountEligibleTotal + amount);\n        }\n      }\n      result.displayOnlyTotal = roundMoney(result.excludedTotal + result.postageTotal);\n      result.breakdown.push({\n        order: Number(numberValue(entry && entry.order, 0) || 0),\n        label: text(addon.addonLabel || addon.addonName || entry && (entry.valueLabel || entry.holderLabel)) || 'Add-on',\n        amount: amount,\n        unitPrice: addon.addonBasePrice,\n        addonKey: addon.addonKey,\n        addonType: addon.addonType,\n        cartIncluded: cartIncluded,\n        // Effective eligibility, so the summary row renders the same way the\n        // totals above were composed.\n        discountEligible: discountEligible,\n        configuredDiscountEligible: !!addon.discountEligible,\n        excludeFromCart: addon.excludeFromCart,\n        useTypedQuantity: addon.useTypedQuantity,\n        isPostage: addon.isPostage,\n        dontSayFree: addon.dontSayFree,\n        isNegative: amount < 0\n      });\n    });\n    return result;\n  }\n\n  function sumOptionSelectionAddOnTotal(optionSelections, quantity) {\n    return calculateDesignerOptionAddOns(optionSelections, quantity).cartIncludedTotal;\n  }\n\n  function resolveDesignerDesignFeeTotal(payload) {\n    var source = payload && typeof payload === 'object' ? payload : {};\n    var mode = normalizeArtworkMode(source.artworkMode);\n    if (mode === 'editservice') {\n      var templateAmount = numberValue(source.templatePersonalizationAmount, NaN);\n      if (!Number.isFinite(templateAmount)) {\n        templateAmount = numberValue(source.template && source.template.editServiceCost, NaN);\n      }\n      if (!Number.isFinite(templateAmount)) {\n        templateAmount = numberValue(source.editServiceCost, 0);\n      }\n      return roundMoney(templateAmount);\n    }\n    if (mode === 'customdesign') {\n      var customAmount = numberValue(source.customDesignAmount, NaN);\n      if (!Number.isFinite(customAmount)) {\n        customAmount = numberValue(source.customDesignCost, 0);\n      }\n      return roundMoney(customAmount);\n    }\n    return 0;\n  }\n\n  function buildDesignerSplitPrice(payload) {\n    var source = payload && typeof payload === 'object' ? payload : {};\n    var quantity = Math.max(1, numberValue(source.quantity, 1) || 1);\n    var pricing = source.pricingMap && typeof source.pricingMap === 'object' ? source.pricingMap : {};\n    var finalSku = text(source.finalSku);\n    var baseSku = text(source.baseSku).replace(/-q$/i, '') || (finalSku ? finalSku.replace(/-q\\d+$/i, '') : '');\n    if (!finalSku && baseSku) {\n      finalSku = baseSku + '-q' + String(quantity);\n    }\n    var priceRecord = finalSku ? pricing[finalSku] || null : null;\n    var explicitBasePrice = Number(source.basePrice);\n    var productBaseTotal = Number.isFinite(explicitBasePrice)\n      ? roundMoney(explicitBasePrice)\n      : roundMoney(numberValue(priceRecord && priceRecord.price, 0));\n    var optionAddOns = calculateDesignerOptionAddOns(\n      source.optionSelections,\n      quantity,\n      numberValue(source.typedQty || source.typedQuantity, quantity),\n      { holdCreditsFromSale: source.holdCreditsFromSale === true }\n    );\n    var optionAddOnTotal = optionAddOns.cartIncludedTotal;\n    var productTotal = roundMoney(productBaseTotal + optionAddOnTotal);\n    var designFeeTotal = resolveDesignerDesignFeeTotal(source);\n    var grandTotal = roundMoney(productTotal + designFeeTotal);\n    return {\n      quantity: quantity,\n      baseSku: baseSku,\n      finalSku: finalSku,\n      priceRecord: priceRecord,\n      productBaseTotal: productBaseTotal,\n      optionAddOnTotal: optionAddOnTotal,\n      optionAddOns: optionAddOns,\n      excludedOptionAddOnTotal: optionAddOns.excludedTotal,\n      postageOptionAddOnTotal: optionAddOns.postageTotal,\n      productTotal: productTotal,\n      designFeeTotal: designFeeTotal,\n      grandTotal: grandTotal,\n      productPerUnit: quantity > 0 ? roundMoney(productBaseTotal / quantity) : productBaseTotal,\n      grandPerUnit: quantity > 0 ? roundMoney(grandTotal / quantity) : grandTotal\n    };\n  }\n\n  function getCurrentAbsoluteUrl() {\n    try {\n      return new URL(String(window.location.href || ''), window.location.origin).toString();\n    } catch (_) {\n      return window.location.origin;\n    }\n  }\n\n  function buildStableCacheKey(value) {\n    var input = text(value);\n    if (!input) return '';\n    var hash = 5381;\n    for (var index = 0; index < input.length; index += 1) {\n      hash = ((hash << 5) + hash) ^ input.charCodeAt(index);\n    }\n    return 'bg' + (hash >>> 0).toString(36);\n  }\n\n  function getBootstrapCacheStorageKey(cacheKey) {\n    var cleanKey = text(cacheKey);\n    return cleanKey ? ('bg-designer-v2-bootstrap:v2:' + cleanKey) : '';\n  }\n\n  function getDesignerSessionTokenFromPage() {\n    var bootstrap = window.BG_DESIGNER_BOOTSTRAP && typeof window.BG_DESIGNER_BOOTSTRAP === 'object'\n      ? window.BG_DESIGNER_BOOTSTRAP\n      : {};\n    var session = bootstrap.session && typeof bootstrap.session === 'object' ? bootstrap.session : {};\n    return text(bootstrap.sessionToken || session.token);\n  }\n\n  function getBootstrapCacheStore(targetWindow) {\n    if (!targetWindow) return null;\n    try {\n      var existing = targetWindow.__BG_STOREFRONT_BOOTSTRAP_CACHE_V2__;\n      if (existing && typeof existing === 'object') return existing;\n      var nextStore = {};\n      targetWindow.__BG_STOREFRONT_BOOTSTRAP_CACHE_V2__ = nextStore;\n      return nextStore;\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function readCachedBootstrap(cacheKey) {\n    var storageKey = getBootstrapCacheStorageKey(cacheKey);\n    if (!storageKey) return null;\n    var candidates = [window];\n    try {\n      if (window.parent && window.parent !== window) candidates.push(window.parent);\n    } catch (_) {}\n    for (var index = 0; index < candidates.length; index += 1) {\n      var store = getBootstrapCacheStore(candidates[index]);\n      var cachedValue = store && typeof store === 'object' ? store[storageKey] : null;\n      if (cachedValue && cachedValue.bootstrap && cachedValue.launchContext) {\n        return cachedValue;\n      }\n    }\n    try {\n      var raw = window.sessionStorage.getItem(storageKey);\n      if (!raw) return null;\n      var parsed = JSON.parse(raw);\n      if (parsed && parsed.bootstrap && parsed.launchContext) {\n        return parsed;\n      }\n    } catch (_) {}\n    return null;\n  }\n\n  function writeCachedBootstrap(cacheKey, payload) {\n    var storageKey = getBootstrapCacheStorageKey(cacheKey);\n    if (!storageKey || !payload || typeof payload !== 'object') return false;\n    var wroteMemory = false;\n    var targets = [window];\n    try {\n      if (window.parent && window.parent !== window) targets.push(window.parent);\n    } catch (_) {}\n    targets.forEach(function (target) {\n      var store = getBootstrapCacheStore(target);\n      if (!store) return;\n      store[storageKey] = payload;\n      wroteMemory = true;\n    });\n    try {\n      window.sessionStorage.setItem(storageKey, JSON.stringify(payload));\n      return true;\n    } catch (_) {\n      return wroteMemory;\n    }\n  }\n\n  function deleteCachedBootstrap(cacheKey) {\n    var storageKey = getBootstrapCacheStorageKey(cacheKey);\n    if (!storageKey) return false;\n    var removed = false;\n    var targets = [window];\n    try {\n      if (window.parent && window.parent !== window) targets.push(window.parent);\n    } catch (_) {}\n    targets.forEach(function (target) {\n      var store = getBootstrapCacheStore(target);\n      if (store && Object.prototype.hasOwnProperty.call(store, storageKey)) {\n        delete store[storageKey];\n        removed = true;\n      }\n    });\n    try {\n      window.sessionStorage.removeItem(storageKey);\n      return true;\n    } catch (_) {\n      return removed;\n    }\n  }\n\n  function ensureOriginPreconnect(urlValue) {\n    var cleanUrl = text(urlValue);\n    if (!cleanUrl) return false;\n    try {\n      var absoluteUrl = new URL(cleanUrl, window.location.origin);\n      var cacheKey = 'preconnect:' + absoluteUrl.origin;\n      if (JSON_CACHE[cacheKey]) return true;\n      var link = document.createElement('link');\n      link.rel = 'preconnect';\n      link.href = absoluteUrl.origin;\n      link.crossOrigin = 'anonymous';\n      document.head.appendChild(link);\n      JSON_CACHE[cacheKey] = Promise.resolve(true);\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function collectProjectBoardPreviews(project) {\n    var source = project && typeof project === 'object' ? project : {};\n    var documentValue = source.document || {};\n    var metadata = source.metadata || {};\n    var documentMetadata = documentValue.metadata || {};\n    var candidates = [source.boardPreviews, metadata.boardPreviews, documentMetadata.boardPreviews];\n    var entries = candidates.find(function (value) { return Array.isArray(value); });\n    if (!entries) return null; // Legacy records have no indexed preview contract.\n    var boards = Array.isArray(documentValue.boards) ? documentValue.boards : [];\n    var seen = Object.create(null);\n    return entries.filter(function (entry) {\n      var index = Number(entry && entry.boardIndex);\n      if (!entry || entry.boardIndex === null || entry.boardIndex === undefined || !Number.isInteger(index) || index < 0 || !text(entry.url) || seen[index]) return false;\n      if (boards.length && (!boards[index] || (text(entry.boardId) && text(boards[index].id) !== text(entry.boardId)))) return false;\n      seen[index] = true;\n      return true;\n    }).map(function (entry) {\n      return { boardId: text(entry.boardId), boardIndex: Number(entry.boardIndex), url: text(entry.url), isPrimary: entry.isPrimary === true };\n    }).sort(function (left, right) { return left.boardIndex - right.boardIndex; });\n  }\n\n  function collectProjectPreviewUrls(project) {\n    var seen = Object.create(null);\n    var urls = [];\n\n    function push(value) {\n      var cleanValue = text(value);\n      if (!cleanValue || seen[cleanValue]) return;\n      seen[cleanValue] = true;\n      urls.push(cleanValue);\n    }\n\n    var source = project && typeof project === 'object' ? project : {};\n    var metadata = source.metadata && typeof source.metadata === 'object' ? source.metadata : {};\n    var documentValue = source.document && typeof source.document === 'object' ? source.document : {};\n    var documentMetadata = documentValue.metadata && typeof documentValue.metadata === 'object' ? documentValue.metadata : {};\n    var renderArtifacts = metadata.renderArtifacts && typeof metadata.renderArtifacts === 'object' ? metadata.renderArtifacts : {};\n    var documentRenderArtifacts = documentMetadata.renderArtifacts && typeof documentMetadata.renderArtifacts === 'object'\n      ? documentMetadata.renderArtifacts\n      : {};\n    var previewArtifact = renderArtifacts.preview || documentRenderArtifacts.preview || null;\n    var previewMetadata = previewArtifact && previewArtifact.metadata && typeof previewArtifact.metadata === 'object'\n      ? previewArtifact.metadata\n      : {};\n\n    var boardPreviews = collectProjectBoardPreviews(source);\n    if (boardPreviews) boardPreviews.forEach(function (entry) { push(entry.url); });\n\n    push(previewMetadata.objectPublicUrl);\n    push(previewArtifact && previewArtifact.url);\n    // The worker's project GET projects the freshest render into a top-level\n    // previewUrl and omits renderArtifacts entirely \u2014 without this, records\n    // read over the app proxy contribute no preview at all.\n    push(source.previewUrl);\n\n    if (Array.isArray(source.previews)) source.previews.forEach(push);\n    if (Array.isArray(metadata.previews)) metadata.previews.forEach(push);\n    if (Array.isArray(documentMetadata.previews)) documentMetadata.previews.forEach(push);\n\n    var boards = Array.isArray(documentValue.boards) ? documentValue.boards : [];\n    boards.forEach(function (board) {\n      var boardMeta = board && board.metadata && typeof board.metadata === 'object' ? board.metadata : {};\n      push(boardMeta.previewUrl);\n      if (Array.isArray(boardMeta.previews)) boardMeta.previews.forEach(push);\n    });\n\n    return urls;\n  }\n\n  function getDesignerProxyRoot(config) {\n    var explicit = text(config && config.designer && config.designer.proxyRoot);\n    if (explicit) return explicit.replace(/\\/+$/, '');\n    return '/apps/qps-commerce-control-plane/designer';\n  }\n\n  function getEditorBaseUrl(config) {\n    var explicit = text(config && config.designer && config.designer.editorUrl);\n    if (explicit) return explicit.replace(/\\/+$/, '');\n    return getDesignerProxyRoot(config) + '/editor-v2';\n  }\n\n  function getBootstrapBaseUrl(config) {\n    var explicit = text(config && config.designer && config.designer.bootstrapUrl);\n    if (explicit) return explicit.replace(/\\/+$/, '');\n    return getDesignerProxyRoot(config) + '/session/bootstrap';\n  }\n\n  function getProjectsUrl(config) {\n    var explicit = text(config && config.designer && config.designer.projectsUrl);\n    if (explicit) return explicit.replace(/\\/+$/, '');\n    return getDesignerProxyRoot(config) + '/projects';\n  }\n\n  function getTemplateSummaryUrl(config, params) {\n    var source = params && typeof params === 'object' ? params : {};\n    var lookup = text(source.lookup);\n    var legacyId = text(source.legacyId);\n    if (!lookup && !legacyId) return '';\n    try {\n      var requestUrl = new URL(getDesignerProxyRoot(config) + '/template-summary', window.location.origin);\n      if (lookup) requestUrl.searchParams.set('lookup', lookup);\n      if (legacyId) requestUrl.searchParams.set('legacyId', legacyId);\n      return requestUrl.toString();\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function buildBootstrapRequestUrl(config, launchUrl) {\n    var cleanUrl = text(launchUrl);\n    if (!cleanUrl) return '';\n    try {\n      var requestUrl = new URL(cleanUrl, window.location.origin);\n      requestUrl.pathname = new URL(getBootstrapBaseUrl(config), window.location.origin).pathname;\n      requestUrl.searchParams.delete('adminEmbedded');\n      requestUrl.searchParams.delete('adminHostOrigin');\n      requestUrl.searchParams.delete('adminReturnUrl');\n      requestUrl.searchParams.delete('adminNextUrl');\n      requestUrl.searchParams.delete('bgEmbedded');\n      requestUrl.searchParams.delete('bgHostOrigin');\n      requestUrl.searchParams.delete('bgReturnUrl');\n      requestUrl.searchParams.delete('bgNextUrl');\n      requestUrl.searchParams.delete('bgEmbeddedSource');\n      requestUrl.searchParams.delete('bgStorefrontFastLaunch');\n      requestUrl.searchParams.delete('bgBootstrapCacheKey');\n      // Display only (STUDIO-SALE-SENTENCE, SALE-DISPLAY-STRIKETHROUGH): the\n      // editor reads them from its own address; the bootstrap request stays the\n      // same with or without a sale.\n      requestUrl.searchParams.delete('bgSalePending');\n      requestUrl.searchParams.delete('bgSalePercent');\n      requestUrl.searchParams.set('editorVariant', 'editor-v2');\n      if (!requestUrl.searchParams.get('designId') && requestUrl.searchParams.get('id')) {\n        requestUrl.searchParams.set('designId', text(requestUrl.searchParams.get('id')));\n      }\n      if (!requestUrl.searchParams.get('designNumber') && requestUrl.searchParams.get('designnum')) {\n        requestUrl.searchParams.set('designNumber', text(requestUrl.searchParams.get('designnum')));\n      }\n      return requestUrl.toString();\n    } catch (_) {\n      return '';\n    }\n  }\n\n  function getBootstrapCacheKeyForLaunchUrl(config, launchUrl) {\n    return buildStableCacheKey(buildBootstrapRequestUrl(config, launchUrl));\n  }\n\n  function prewarmEditorBootstrap(config, launchUrl) {\n    var bootstrapUrl = buildBootstrapRequestUrl(config, launchUrl);\n    var cacheKey = getBootstrapCacheKeyForLaunchUrl(config, launchUrl);\n    if (!bootstrapUrl || !cacheKey) return Promise.resolve(null);\n    var cached = readCachedBootstrap(cacheKey);\n    if (cached && cached.bootstrap && cached.launchContext) {\n      return Promise.resolve({\n        cacheKey: cacheKey,\n        payload: cached,\n        source: 'cache'\n      });\n    }\n    if (BOOTSTRAP_PROMISES[bootstrapUrl]) return BOOTSTRAP_PROMISES[bootstrapUrl];\n    // A prewarm the worker has already refused twice will keep failing on\n    // every re-render; stop retrying and let open() fall back to direct\n    // frame navigation, where the editor client authorizes itself.\n    if (Number(BOOTSTRAP_PREWARM_FAILURES[bootstrapUrl] || 0) >= 2) return Promise.resolve(null);\n    ensureOriginPreconnect(bootstrapUrl);\n    var prewarmHeaders = { accept: 'application/json' };\n    var prewarmProjectId = '';\n    try {\n      prewarmProjectId = text(new URL(bootstrapUrl, window.location.origin).searchParams.get('projectId'));\n    } catch (_) {}\n    if (prewarmProjectId) {\n      // A guest-owned project bootstrap is denied without the original signed\n      // session proof; present it the same way the commerce mint lane does.\n      var prewarmGuestProof = readStoredGuestClaimProofToken(prewarmProjectId);\n      if (prewarmGuestProof) prewarmHeaders['x-designer-session-token'] = prewarmGuestProof;\n    }\n    BOOTSTRAP_PROMISES[bootstrapUrl] = fetch(bootstrapUrl, {\n      credentials: 'same-origin',\n      headers: prewarmHeaders\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (payload) {\n        if (\n          !response.ok\n          || !payload\n          || typeof payload !== 'object'\n          || payload.ok === false\n          || !payload.bootstrap\n          || !payload.launchContext\n        ) {\n          throw new Error('Unable to preload the editor session.');\n        }\n        writeCachedBootstrap(cacheKey, payload);\n        delete BOOTSTRAP_PREWARM_FAILURES[bootstrapUrl];\n        return {\n          cacheKey: cacheKey,\n          payload: payload,\n          source: 'network'\n        };\n      });\n    }).catch(function (error) {\n      BOOTSTRAP_PREWARM_FAILURES[bootstrapUrl] = Number(BOOTSTRAP_PREWARM_FAILURES[bootstrapUrl] || 0) + 1;\n      throw error;\n    }).finally(function () {\n      delete BOOTSTRAP_PROMISES[bootstrapUrl];\n    });\n    return BOOTSTRAP_PROMISES[bootstrapUrl];\n  }\n\n  function fetchTemplateSummary(config, params) {\n    var requestUrl = getTemplateSummaryUrl(config, params);\n    if (!requestUrl) return Promise.resolve(null);\n    if (TEMPLATE_SUMMARY_PROMISES[requestUrl]) return TEMPLATE_SUMMARY_PROMISES[requestUrl];\n    ensureOriginPreconnect(requestUrl);\n    TEMPLATE_SUMMARY_PROMISES[requestUrl] = fetch(requestUrl, {\n      credentials: 'same-origin',\n      headers: {\n        accept: 'application/json'\n      }\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (payload) {\n        if (!response.ok || !payload || payload.ok === false || !payload.summary || typeof payload.summary !== 'object') {\n          return null;\n        }\n        return payload.summary;\n      });\n    }).finally(function () {\n      delete TEMPLATE_SUMMARY_PROMISES[requestUrl];\n    });\n    return TEMPLATE_SUMMARY_PROMISES[requestUrl];\n  }\n\n  function parseSizeToken(value) {\n    var match = text(value).match(/(\\d+(?:\\.\\d+)?)\\s*x\\s*(\\d+(?:\\.\\d+)?)/i);\n    if (!match) return null;\n    return {\n      width: Number(match[1]),\n      height: Number(match[2]),\n      unit: 'inches'\n    };\n  }\n\n  function normalizeProductOptionKey(value) {\n    return text(value).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n  }\n\n  function buildProductOptionLaunchState(optionSelections) {\n    var selectedOptions = [];\n    var productOptions = {};\n    var seen = Object.create(null);\n    (Array.isArray(optionSelections) ? optionSelections : []).forEach(function (selection) {\n      var source = selection && typeof selection === 'object' ? selection : {};\n      var name = text(source.holderLabel || source.name || source.label || source.variantKey || source.holderParamKey);\n      var value = text(\n        buildSelectionDisplayLabel(source)\n        || source.value\n        || source.rawValue\n        || source.paramValue\n        || source.variantValue\n      );\n      if (!name || !value) return;\n      var key = normalizeProductOptionKey(name);\n      var holderId = text(source.holderId || source.optionHolderId);\n      var valueId = text(source.valueId || source.variationId || source.hvid || source.hvId || source.id);\n      var dedupe = holderId && valueId\n        ? holderId + ':' + valueId\n        : key + ':' + normalizeProductOptionKey(value);\n      if (seen[dedupe]) return;\n      seen[dedupe] = true;\n      var selectedOption = {\n        name: name,\n        key: key,\n        value: value,\n        rawValue: text(source.rawValue || source.value || source.valueLabel || value),\n        variantKey: name,\n        variantValue: value\n      };\n      if (holderId) selectedOption.holderId = holderId;\n      if (valueId) selectedOption.valueId = valueId;\n      selectedOptions.push(selectedOption);\n      productOptions[name] = value;\n      productOptions[key] = value;\n    });\n    return {\n      selectedOptions: selectedOptions,\n      productOptions: productOptions\n    };\n  }\n\n  function appendProductOptionLaunchParams(editorUrl, source) {\n    var payload = source && typeof source === 'object' ? source : {};\n    var optionState = buildProductOptionLaunchState(\n      Array.isArray(payload.selectedOptions) ? payload.selectedOptions : payload.optionSelections\n    );\n    var selectedVariantId = text(payload.selectedVariantId || payload.variantId || payload.baseVariantId);\n    var selectedVariantTitle = text(payload.selectedVariantTitle || payload.variantTitle);\n    if (selectedVariantId) editorUrl.searchParams.set('selectedVariantId', selectedVariantId);\n    if (selectedVariantTitle) editorUrl.searchParams.set('selectedVariantTitle', selectedVariantTitle);\n    if (optionState.selectedOptions.length) editorUrl.searchParams.set('selectedOptions', JSON.stringify(optionState.selectedOptions));\n    if (Object.keys(optionState.productOptions).length) editorUrl.searchParams.set('productOptions', JSON.stringify(optionState.productOptions));\n  }\n\n  function buildEditorUrl(config, context) {\n    var source = context && typeof context === 'object' ? context : {};\n    var editorUrl = new URL(getEditorBaseUrl(config), window.location.origin);\n    var currentUrl = getCurrentAbsoluteUrl();\n    var storeKey = text(source.storeKey || (config && (config.storeKey || config.storefront)));\n    var productHandle = text(source.productHandle || (config && config.handle));\n    var productId = text(source.productId || (config && config.productId));\n    var runtimeVersion = text(source.runtimeVersion || (config && config.runtimeVersion));\n    var projectId = text(source.projectId);\n    var styleConversion = normalizeStyleConversionContext(source.styleConversion);\n    var copiesProject = !!(styleConversion && styleConversion.sourceProjectId === projectId);\n    var projectRefreshToken = text(source.projectRefreshToken);\n    var designId = text(source.designId || (source.template && source.template.designId));\n    var designNumber = text(source.designNumber || (source.template && source.template.designNumber));\n    var templateLookup = text(source.templateLookup || (source.template && (source.template.templateLookup || source.template.templatePublicId || source.template.publicId)));\n    var backer = text(source.backer || (source.template && source.template.backer));\n    var orientation = text(source.selectedOrientation || (source.template && source.template.orientation));\n    var launchMode = text(source.launchMode || source.bgLaunchMode).toLowerCase();\n    if (launchMode !== 'blank' && launchMode !== 'upload') launchMode = '';\n    var size = source.size && typeof source.size === 'object' ? source.size : {};\n    var storefrontBinding = source.storefrontBinding && typeof source.storefrontBinding === 'object'\n      ? deepClone(source.storefrontBinding, {})\n      : {};\n    var productPageExperimentContext = normalizeProductPageExperimentContext(source.productPageExperimentContext);\n    var selectedSidesId = text(source.selectedSidesId);\n    var selectedSidesLabel = text(source.selectedSidesLabel);\n    var selectedSidesTargetingId = text(source.selectedSidesTargetingId);\n    var selectedPrintingId = text(source.selectedPrintingId);\n    var selectedPrintingLabel = text(source.selectedPrintingLabel);\n    var selectedPrintingTargetingId = text(source.selectedPrintingTargetingId);\n    var sidesPolicy = source.sidesPolicy && typeof source.sidesPolicy === 'object'\n      ? deepClone(source.sidesPolicy, {})\n      : null;\n    var sizeToken = text(size.selectedSizeId || size.id || size.targetingId);\n    var sizeLabel = text(size.selectedSizeLabel || size.label);\n    var sizeDimensions = (\n      numberValue(size.selectedWidth, NaN) > 0\n      && numberValue(size.selectedHeight, NaN) > 0\n    ) ? {\n      width: Number(size.selectedWidth),\n      height: Number(size.selectedHeight),\n      unit: text(size.selectedUnit || size.unit) || 'inches'\n    } : parseSizeToken(sizeLabel || sizeToken);\n\n    if (projectId) {\n      editorUrl.searchParams.set('mode', 'edit');\n      editorUrl.searchParams.set('projectId', projectId);\n      if (text(source.source) === 'product' && !copiesProject) editorUrl.searchParams.set('reconfigureProject', '1');\n      if (projectRefreshToken) editorUrl.searchParams.set('bgProjectRefreshToken', projectRefreshToken);\n    } else if (templateLookup || designId || designNumber) {\n      editorUrl.searchParams.set('mode', 'new');\n    } else {\n      editorUrl.searchParams.set('mode', 'new');\n    }\n\n    if (productId) editorUrl.searchParams.set('productId', productId);\n    if (storeKey) editorUrl.searchParams.set('storeKey', storeKey);\n    if (productHandle) editorUrl.searchParams.set('productHandle', productHandle);\n    if (templateLookup) {\n      editorUrl.searchParams.set('templateLookup', templateLookup);\n      editorUrl.searchParams.set('templatePublicId', templateLookup);\n      editorUrl.searchParams.set('templateId', templateLookup);\n    }\n    if (designId) {\n      editorUrl.searchParams.set('id', designId);\n      editorUrl.searchParams.set('designId', designId);\n    }\n    if (designNumber) {\n      editorUrl.searchParams.set('designnum', designNumber);\n      editorUrl.searchParams.set('designNumber', designNumber);\n    }\n    if (backer) editorUrl.searchParams.set('backer', backer);\n    if (sizeToken) {\n      editorUrl.searchParams.set('size', sizeToken);\n      editorUrl.searchParams.set('selectedSizeId', sizeToken);\n    }\n    if (sizeLabel) editorUrl.searchParams.set('selectedSizeLabel', sizeLabel);\n    if (sizeDimensions && sizeDimensions.width > 0 && sizeDimensions.height > 0) {\n      editorUrl.searchParams.set('selectedWidth', String(sizeDimensions.width));\n      editorUrl.searchParams.set('selectedHeight', String(sizeDimensions.height));\n      editorUrl.searchParams.set('selectedUnit', text(sizeDimensions.unit || 'inches'));\n    }\n    if (orientation) editorUrl.searchParams.set('selectedOrientation', orientation.toLowerCase());\n    // Pass-through direct cart (Editor Commerce Contract, Decision A): the\n    // launch context carries the RESOLVED per-product directToCart flag\n    // (Product Commerce advancedMetadata.directToCart, falling back to the\n    // store-wide designerDefaults.directToCart default, compiled into the\n    // runtime bundle metadata by the API). An unset flag keeps the classic\n    // return-to-product close.\n    if (source.directToCart === true) {\n      editorUrl.searchParams.set('completionDestination', 'add-to-cart');\n    }\n    if (selectedSidesId) editorUrl.searchParams.set('selectedSidesId', selectedSidesId);\n    if (selectedSidesLabel) editorUrl.searchParams.set('selectedSidesLabel', selectedSidesLabel);\n    if (selectedSidesTargetingId) editorUrl.searchParams.set('selectedSidesTargetingId', selectedSidesTargetingId);\n    if (sidesPolicy) editorUrl.searchParams.set('sidesPolicy', JSON.stringify(sidesPolicy));\n    if (selectedPrintingId) editorUrl.searchParams.set('selectedPrintingId', selectedPrintingId);\n    if (selectedPrintingLabel) editorUrl.searchParams.set('selectedPrintingLabel', selectedPrintingLabel);\n    if (selectedPrintingTargetingId) editorUrl.searchParams.set('selectedPrintingTargetingId', selectedPrintingTargetingId);\n    if (launchMode) {\n      editorUrl.searchParams.set('bgLaunchMode', launchMode);\n      editorUrl.searchParams.set('launchMode', launchMode);\n    }\n    // S4 flow-back (ADR-021): the page's chosen quantity rides the launch\n    // into the shared Configuration Session, and a relaunch re-adopts the\n    // session the last editor visit minted or mutated.\n    var launchQuantity = Number(source.quantity);\n    if (Number.isInteger(launchQuantity) && launchQuantity > 0) {\n      editorUrl.searchParams.set('quantity', String(launchQuantity));\n    }\n    var launchConfigurationSessionId = text(source.configurationSessionId);\n    if (launchConfigurationSessionId) {\n      editorUrl.searchParams.set('bgConfigurationSession', launchConfigurationSessionId);\n    }\n    appendProductOptionLaunchParams(editorUrl, source);\n\n    if (!Object.keys(storefrontBinding).length) {\n      var launchOptionState = buildProductOptionLaunchState(\n        Array.isArray(source.selectedOptions) ? source.selectedOptions : source.optionSelections\n      );\n      storefrontBinding = {\n        productId: productId,\n        productHandle: productHandle,\n        templateLookup: templateLookup,\n        templateTitle: text(source.templateTitle || (source.template && source.template.title)),\n        selection: {\n          selectedSizeId: sizeToken,\n          selectedSizeLabel: sizeLabel,\n          selectedWidth: sizeDimensions && sizeDimensions.width > 0 ? Number(sizeDimensions.width) : null,\n          selectedHeight: sizeDimensions && sizeDimensions.height > 0 ? Number(sizeDimensions.height) : null,\n          selectedUnit: sizeDimensions ? text(sizeDimensions.unit || 'inches') : '',\n          selectedOrientation: orientation,\n          size: text(size.size || sizeLabel),\n          unfoldedSize: text(size.unfoldedSize),\n          selectedSidesId: selectedSidesId,\n          selectedSidesLabel: selectedSidesLabel,\n          selectedSidesTargetingId: selectedSidesTargetingId,\n          sidesPolicy: sidesPolicy,\n          selectedPrintingId: selectedPrintingId,\n          selectedPrintingLabel: selectedPrintingLabel,\n          selectedPrintingTargetingId: selectedPrintingTargetingId,\n          backer: backer,\n          printQuantity: Number.isSafeInteger(launchQuantity) && launchQuantity > 0 && launchQuantity <= 1000000 ? launchQuantity : null,\n          optionSelections: Array.isArray(source.optionSelections) ? deepClone(source.optionSelections, []) : [],\n          selectedVariantId: text(source.selectedVariantId || source.variantId || source.baseVariantId),\n          selectedVariantTitle: text(source.selectedVariantTitle || source.variantTitle),\n          selectedOptions: launchOptionState.selectedOptions,\n          productOptions: launchOptionState.productOptions\n        }\n      };\n      if (!storefrontBinding.selection.printQuantity) {\n        delete storefrontBinding.selection.printQuantity;\n      }\n    }\n    var bindingParam = encodeJsonParam(storefrontBinding);\n    if (bindingParam) {\n      editorUrl.searchParams.set('bgStorefrontBinding', bindingParam);\n    }\n    var experimentContextParam = encodeJsonParam(productPageExperimentContext);\n    if (experimentContextParam) editorUrl.searchParams.set('bgProductPageExperimentContext', experimentContextParam);\n    // STUDIO-SALE-SENTENCE (OD-122): the product page has a store sale\n    // configured, so the Studio says the store pages' sentence beside every\n    // price it shows (all before discounts). Only an explicit true sets it.\n    if (source.salePending === true) editorUrl.searchParams.set('bgSalePending', '1');\n    // SALE-DISPLAY-STRIKETHROUGH: the page shows the store's tier sale, so the\n    // Studio shows its prices crossed out with the price after that sale\n    // (Shopify's per-unit floor). Only a whole percent from 1 to 99 is written.\n    var salePercent = source.salePercent;\n    if (typeof salePercent === 'number' && Number.isInteger(salePercent) && salePercent > 0 && salePercent < 100) {\n      editorUrl.searchParams.set('bgSalePercent', String(salePercent));\n    }\n    var styleConversionParam = encodeJsonParam(styleConversion);\n    if (styleConversionParam) editorUrl.searchParams.set('bgStyleConversion', styleConversionParam);\n\n    editorUrl.searchParams.set('bgEmbedded', '1');\n    editorUrl.searchParams.set('bgHostOrigin', window.location.origin);\n    editorUrl.searchParams.set('bgReturnUrl', currentUrl);\n    editorUrl.searchParams.set('bgNextUrl', currentUrl);\n    editorUrl.searchParams.set('bgEmbeddedSource', text(source.source) || 'product');\n    editorUrl.searchParams.set('bgStorefrontFastLaunch', '1');\n    if (runtimeVersion) editorUrl.searchParams.set('bgStorefrontRuntime', runtimeVersion);\n    var cacheKey = getBootstrapCacheKeyForLaunchUrl(config, editorUrl.toString());\n    if (cacheKey) editorUrl.searchParams.set('bgBootstrapCacheKey', cacheKey);\n    return editorUrl.toString();\n  }\n\n  function buildUpdatedLaunchUrl(config, launchUrl, detail) {\n    var cleanLaunchUrl = text(launchUrl);\n    if (!cleanLaunchUrl) return '';\n    try {\n      var updatedUrl = new URL(cleanLaunchUrl, window.location.origin);\n      var payload = detail && typeof detail === 'object' ? detail : {};\n      var projectId = text(payload.projectId);\n      var designId = text(payload.designId);\n      var designNumber = text(payload.designNumber);\n      if (projectId) updatedUrl.searchParams.set('projectId', projectId);\n      if (designId) {\n        updatedUrl.searchParams.set('id', designId);\n        updatedUrl.searchParams.set('designId', designId);\n      }\n      if (designNumber) {\n        updatedUrl.searchParams.set('designnum', designNumber);\n        updatedUrl.searchParams.set('designNumber', designNumber);\n      }\n      var nextCacheKey = getBootstrapCacheKeyForLaunchUrl(config, updatedUrl.toString());\n      if (nextCacheKey) {\n        updatedUrl.searchParams.set('bgBootstrapCacheKey', nextCacheKey);\n      } else {\n        updatedUrl.searchParams.delete('bgBootstrapCacheKey');\n      }\n      return updatedUrl.toString();\n    } catch (_) {\n      return cleanLaunchUrl;\n    }\n  }\n\n  function readConfig(root) {\n    var rootNode = root && root.nodeType === 1 ? root : null;\n    if (!rootNode) return null;\n    var configId = text(rootNode.getAttribute('data-config-id'));\n    if (!configId) return null;\n    var node = document.getElementById(configId);\n    if (!node) return null;\n    return parseJson(node.textContent, null);\n  }\n\n  function buildSelectionDisplayLabel(selection) {\n    var source = selection && typeof selection === 'object' ? selection : {};\n    var valueLabel = text(source.valueLabel || source.label);\n    var flavorText = text(source.flavorText);\n    if (!flavorText) return valueLabel;\n    if (!valueLabel) return flavorText;\n    return valueLabel + ' (' + flavorText + ')';\n  }\n\n  function buildOptionSelection(holder, value, order) {\n    var holderValue = holder && typeof holder === 'object' ? holder : {};\n    var sourceValue = value && typeof value === 'object' ? value : {};\n    return {\n      order: Number(order || holderValue.sortOrder || 0) || 0,\n      holderId: text(holderValue.id || holderValue.holderId),\n      holderHtmlId: text(holderValue.htmlID || holderValue.holderHtmlId || slugify(holderValue.displayName)),\n      holderLabel: text(holderValue.displayName || holderValue.holderLabel),\n      valueLabel: text(sourceValue.label || sourceValue.valueLabel),\n      flavorText: text(sourceValue.flavorText),\n      targetingId: text(sourceValue.targetingID || sourceValue.targetingId),\n      hvid: text(sourceValue.hvId || sourceValue.hvid),\n      friendlySku: text(sourceValue.friendlySku),\n      numericSku: text(sourceValue.numericSku),\n      paramValue: text(sourceValue.value || sourceValue.targetingID || sourceValue.label),\n      addonPrice: Number.isFinite(Number(sourceValue.addonPrice)) ? Number(sourceValue.addonPrice) : null\n    };\n  }\n\n  function serializeOptionSelection(entry, compact) {\n    var source = entry && typeof entry === 'object' ? entry : {};\n    var addon = normalizeAddonSelection(source);\n    var payload = {\n      order: Number(numberValue(source.order, 0) || 0),\n      holderHtmlId: text(source.holderHtmlId),\n      holderLabel: text(source.holderLabel),\n      valueLabel: text(source.valueLabel),\n      targetingId: text(source.targetingId),\n      numericSku: text(source.numericSku),\n      addonPrice: Number.isFinite(Number(source.addonPrice)) ? Number(source.addonPrice) : null\n    };\n    if (!compact) {\n      payload.holderId = text(source.holderId);\n      payload.flavorText = text(source.flavorText);\n      payload.hvid = text(source.hvid);\n      payload.friendlySku = text(source.friendlySku);\n      payload.paramValue = text(source.paramValue);\n    }\n    if (addon.hasAddon) {\n      payload.addonKey = addon.addonKey;\n      payload.addonLabel = addon.addonLabel;\n      payload.addonName = addon.addonName;\n      payload.addonType = addon.addonType;\n      payload.addonBasePrice = addon.addonBasePrice;\n      payload.discountEligible = addon.discountEligible;\n      payload.excludeFromCart = addon.excludeFromCart;\n      payload.useTypedQuantity = addon.useTypedQuantity;\n      payload.isPostage = addon.isPostage;\n      payload.dontSayFree = addon.dontSayFree;\n    }\n    return payload;\n  }\n\n  function serializeCartTransformSelection(entry) {\n    var source = entry && typeof entry === 'object' ? entry : {};\n    var addon = normalizeAddonSelection(source);\n    var numericSku = text(source.numericSku);\n    // Stable Product Commerce identity is required by the API-owned quote\n    // resolver. Targeting IDs and numeric SKU segments are not unique on all\n    // products (notably Postcards), so never compact these two fields away.\n    var stableIdentity = {};\n    var holderId = text(source.holderId);\n    var valueId = text(source.hvid || source.valueId);\n    if (holderId) stableIdentity.holderId = holderId;\n    if (valueId) stableIdentity.valueId = valueId;\n    if (addon.hasAddon) {\n      if (addon.isPostage || addon.excludeFromCart || (Number.isFinite(addon.addonBasePrice) && Math.abs(addon.addonBasePrice) > 0.0001)) {\n        var addonPayload = Object.assign({}, stableIdentity, {\n          order: Number(numberValue(source.order, 0) || 0),\n          holderHtmlId: text(source.holderHtmlId),\n          targetingId: text(source.targetingId),\n          addonKey: addon.addonKey || text(source.targetingId)\n        });\n        if (numericSku) addonPayload.numericSku = numericSku;\n        if (addon.addonType) addonPayload.addonType = addon.addonType;\n        if (Number.isFinite(addon.addonBasePrice)) addonPayload.addonBasePrice = addon.addonBasePrice;\n        if (addon.discountEligible) addonPayload.discountEligible = true;\n        if (addon.excludeFromCart) addonPayload.excludeFromCart = true;\n        if (addon.useTypedQuantity) addonPayload.useTypedQuantity = true;\n        if (addon.isPostage) addonPayload.isPostage = true;\n        if (addon.dontSayFree) addonPayload.dontSayFree = true;\n        return addonPayload;\n      }\n      if (numericSku && !/^addon-/i.test(text(source.addonKey)) && !/^addon-/i.test(text(source.targetingId))) {\n        return Object.assign({}, stableIdentity, {\n          order: Number(numberValue(source.order, 0) || 0),\n          holderHtmlId: text(source.holderHtmlId),\n          targetingId: text(source.targetingId),\n          numericSku: numericSku\n        });\n      }\n      var zeroAddonPayload = Object.assign({}, stableIdentity, {\n        order: Number(numberValue(source.order, 0) || 0),\n        holderHtmlId: text(source.holderHtmlId),\n        targetingId: text(source.targetingId),\n        addonKey: addon.addonKey || text(source.targetingId)\n      });\n      if (addon.addonType) zeroAddonPayload.addonType = addon.addonType;\n      if (Number.isFinite(addon.addonBasePrice)) zeroAddonPayload.addonBasePrice = addon.addonBasePrice;\n      if (addon.discountEligible) zeroAddonPayload.discountEligible = true;\n      if (addon.useTypedQuantity) zeroAddonPayload.useTypedQuantity = true;\n      if (addon.dontSayFree) zeroAddonPayload.dontSayFree = true;\n      return zeroAddonPayload;\n    }\n    if (!numericSku && (!holderId || !valueId)) return null;\n    var selectionPayload = Object.assign({}, stableIdentity, {\n      order: Number(numberValue(source.order, 0) || 0),\n      holderHtmlId: text(source.holderHtmlId),\n      targetingId: text(source.targetingId)\n    });\n    if (numericSku) selectionPayload.numericSku = numericSku;\n    return selectionPayload;\n  }\n\n  function serializeSelectedAddon(entry) {\n    var source = entry && typeof entry === 'object' ? entry : {};\n    var targetingId = text(source.targetingId);\n    var rawKey = text(source.key || source.addonKey);\n    var price = numberValue(source.pricing, numberValue(source.optionAddonPrice, numberValue(source.addonBasePrice, numberValue(source.addonPrice, NaN))));\n    var explicitAddonType = normalizeAddonType(source.addonType);\n    var hasNonZeroAddonPrice = Number.isFinite(price) && Math.abs(price) > 0.0001;\n    var hasAddonKeyShape = /^addon-/i.test(rawKey) || /^addon-/i.test(targetingId);\n    var key = text(\n      hasAddonKeyShape\n        ? (rawKey || targetingId)\n        : ((explicitAddonType || hasNonZeroAddonPrice) ? (rawKey || targetingId) : '')\n    ).toLowerCase();\n    if (!key) return null;\n    return {\n      key: key,\n      selectedLabel: text(source.selectedLabel || source.valueLabel || source.label || source.addonLabel)\n    };\n  }\n\n  function normalizeSelectedAddons(value) {\n    return (Array.isArray(value) ? value : []).map(serializeSelectedAddon).filter(Boolean).slice(0, 100);\n  }\n\n  function serializeAddonConfig(value, fallbackKey) {\n    var source = value && typeof value === 'object' ? value : {};\n    var key = text(source.key || source.addonKey || source.targetingId || fallbackKey).toLowerCase();\n    if (!key) return null;\n    var price = numberValue(\n      source.pricing,\n      numberValue(\n        source.optionAddonPrice,\n        numberValue(source.addonBasePrice, numberValue(source.addonPrice, NaN))\n      )\n    );\n    return {\n      key: key,\n      addonLabel: text(source.addonLabel || source.label || source.holderLabel),\n      addonName: text(source.addonName || source.name || source.valueLabel),\n      addonType: normalizeAddonType(source.addonType) || (Number.isFinite(price) ? 'quantityBased' : 'flat'),\n      pricing: Number.isFinite(price) ? price : 0,\n      optionAddonPrice: Number.isFinite(price) ? price : null,\n      discountEligible: !!source.discountEligible,\n      excludeFromCart: !!source.excludeFromCart,\n      useTypedQuantity: !!source.useTypedQuantity,\n      isPostage: !!source.isPostage,\n      dontSayFree: !!source.dontSayFree\n    };\n  }\n\n  function normalizeAddonByKey(value) {\n    if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n    var result = {};\n    Object.keys(value).slice(0, 100).forEach(function (key) {\n      var addon = serializeAddonConfig(value[key], key);\n      if (addon) result[addon.key] = addon;\n    });\n    return result;\n  }\n\n  // The context identity alone is selection-blind \u2014 printing/sides/variant/\n  // option/quantity choices are launch params, not identity fields \u2014 which\n  // let a relaunch after an option change silently reuse the previous editor\n  // session (the fast-click stale-selection race). The bootstrap cache key\n  // canonicalizes the launch URL: every selection-bearing param, none of the\n  // volatile transport params (bgReturnUrl and friends are stripped), so two\n  // launches share an identity only when they are the same launch.\n  function buildEditorLaunchIdentity(config, context, launchUrl) {\n    var identity = buildEditorContextIdentity(context);\n    var launchKey = text(launchUrl) ? getBootstrapCacheKeyForLaunchUrl(config, launchUrl) : '';\n    return launchKey ? identity + '|' + launchKey : identity;\n  }\n\n  function buildEditorContextIdentity(context) {\n    var source = context && typeof context === 'object' ? context : {};\n    var projectId = text(source.projectId);\n    var projectRefreshToken = text(source.projectRefreshToken);\n    var launchMode = text(source.launchMode || source.bgLaunchMode).toLowerCase();\n    if (launchMode !== 'blank' && launchMode !== 'upload') launchMode = '';\n    if (projectId) {\n      return [\n        'project',\n        text(source.source),\n        text(source.productHandle || source.handle),\n        projectId,\n        projectRefreshToken,\n        launchMode\n      ].join('|');\n    }\n    var template = source.template && typeof source.template === 'object' ? source.template : {};\n    var size = source.size && typeof source.size === 'object' ? source.size : {};\n    return [\n      'template',\n      text(source.source),\n      text(source.productHandle || source.handle),\n      text(source.templateLookup || template.templateLookup || template.templatePublicId || template.publicId),\n      text(source.designId || template.designId),\n      text(source.designNumber || template.designNumber),\n      text(source.backer || template.backer),\n      text(size.selectedSizeId || size.id || size.targetingId),\n      text(source.selectedOrientation || size.selectedOrientation || template.orientation),\n      launchMode\n    ].join('|');\n  }\n\n  function normalizeCompletionConfirmation(value) {\n    var source = value && typeof value === 'object' ? value : {};\n    return {\n      accepted: source.accepted === true,\n      acceptedAt: text(source.acceptedAt),\n      documentFingerprint: text(source.documentFingerprint),\n      issueCodes: uniqueStrings(Array.isArray(source.issueCodes) ? source.issueCodes : [])\n    };\n  }\n\n  function normalizeCompletionReview(value) {\n    var source = value && typeof value === 'object' ? value : {};\n    return {\n      operatorReviewRequired: source.operatorReviewRequired === true,\n      customerConfirmationRequired: source.customerConfirmationRequired === true,\n      issueCodes: uniqueStrings(Array.isArray(source.issueCodes) ? source.issueCodes : []),\n      notes: uniqueStrings(Array.isArray(source.notes) ? source.notes : [])\n    };\n  }\n\n  function normalizeCompletionIssue(value) {\n    var source = value && typeof value === 'object' ? value : {};\n    var code = text(source.code);\n    var title = text(source.title);\n    if (!code || !title) return null;\n    return {\n      code: code,\n      severity: text(source.severity) || 'warning',\n      disposition: text(source.disposition) || 'advisory',\n      occurrenceCount: Math.max(1, numberValue(source.occurrenceCount, 1) || 1),\n      title: title,\n      message: text(source.message)\n    };\n  }\n\n  function normalizeCompletionIssues(value) {\n    var source = Array.isArray(value) ? value : [];\n    var seen = Object.create(null);\n    return source.map(normalizeCompletionIssue).filter(function (entry) {\n      if (!entry) return false;\n      var key = entry.disposition + ':' + entry.code;\n      if (seen[key]) return false;\n      seen[key] = true;\n      return true;\n    });\n  }\n\n  function normalizeCompletionState(value) {\n    var source = value && typeof value === 'object' ? value : {};\n    var decision = text(source.decision);\n    var reason = text(source.reason);\n    var checkedAt = text(source.checkedAt);\n    var message = text(source.message);\n    var allowed = typeof source.allowed === 'boolean'\n      ? source.allowed\n      : (decision === 'allowed' || decision === 'allowed_with_confirmation');\n    var confirmation = normalizeCompletionConfirmation(source.confirmation);\n    var review = normalizeCompletionReview(source.review);\n    var issues = normalizeCompletionIssues(source.issues);\n    if (!decision && !reason && !checkedAt && !message && allowed !== true && !confirmation.accepted && !confirmation.documentFingerprint && !review.issueCodes.length && !review.notes.length && !issues.length) {\n      return null;\n    }\n    return {\n      allowed: allowed,\n      decision: decision,\n      reason: reason,\n      message: message,\n      checkedAt: checkedAt,\n      hardBlockCount: Math.max(0, numberValue(source.hardBlockCount, 0) || 0),\n      confirmationRequiredCount: Math.max(0, numberValue(source.confirmationRequiredCount, 0) || 0),\n      confirmation: confirmation,\n      review: review,\n      issues: issues\n    };\n  }\n\n  function normalizeDesignerQuantityMode(value) {\n    var normalized = text(value);\n    if (normalized === 'promoSlider' || normalized === 'apparelMatrix' || normalized === 'dropdown') {\n      return normalized;\n    }\n    return '';\n  }\n\n  function normalizeApparelSizes(value) {\n    var source = value && typeof value === 'object' ? value : {};\n    var sizes = {};\n    Object.keys(source).forEach(function (key) {\n      var cleanKey = text(key);\n      var qty = Math.max(0, numberValue(source[key], 0) || 0);\n      if (!cleanKey || qty <= 0) return;\n      sizes[cleanKey] = Math.round(qty);\n    });\n    return sizes;\n  }\n\n  function normalizeStringList(value) {\n    if (!Array.isArray(value)) return [];\n    return uniqueStrings(value.map(text).filter(Boolean));\n  }\n\n  function normalizePositiveIntegerList(value) {\n    if (!Array.isArray(value)) return [];\n    return value.map(function (entry) {\n      return Math.max(0, Math.round(numberValue(entry, 0) || 0));\n    }).filter(function (entry, index, source) {\n      return entry > 0 && source.indexOf(entry) === index;\n    }).sort(function (left, right) {\n      return left - right;\n    });\n  }\n\n  function buildTurnaroundPropertyValue(value) {\n    var clean = text(value).replace(/\\s+/g, ' ');\n    if (!clean) return '';\n    if (/after proof approval\\.?$/i.test(clean)) {\n      return clean.replace(/\\s*\\.*$/, '.');\n    }\n    return clean.replace(/\\s*\\.*$/, '') + ' after proof approval.';\n  }\n\n  // PRICING-TIER-RENAME-A (2026-10-11): the staff-assigned Partner tier.\n  // Release A reads a price record, cart line or customer tag under the tier's\n  // former name too (pricing data, stored bundles and carts from before the\n  // rename); everything the theme writes carries only the new name. Release B\n  // removes the former name. The price slot (3, after the member plans) is unchanged.\n  var PARTNER_TIER_PRICE_KEY = 'pricePartnerTier';\n  var PARTNER_TIER_TAG = 'PartnerTier';\n  var LEGACY_PARTNER_TIER_PRICE_KEY = 'priceMattSmith';\n  var LEGACY_PARTNER_TIER_TAG = LEGACY_PARTNER_TIER_PRICE_KEY.slice('price'.length);\n\n  // The amount a record holds for a price key. For the Partner tier the new\n  // key wins when the record has a value there; the former key is read only\n  // when it does not.\n  function readTierPrice(record, key) {\n    if (!record || typeof record !== 'object') return undefined;\n    var value = record[key];\n    if ((value === undefined || value === null) && key === PARTNER_TIER_PRICE_KEY) return record[LEGACY_PARTNER_TIER_PRICE_KEY];\n    return value;\n  }\n\n  // A price record with the tier's former key written under the new key, in\n  // the same place (the new key wins when both are there). A record without the\n  // former key is returned as it is; otherwise a copy, never the shared object.\n  function withPartnerTierPriceKey(record) {\n    if (!record || typeof record !== 'object' || Array.isArray(record)) return record;\n    if (!Object.prototype.hasOwnProperty.call(record, LEGACY_PARTNER_TIER_PRICE_KEY)) return record;\n    var hasNewKey = record[PARTNER_TIER_PRICE_KEY] !== undefined && record[PARTNER_TIER_PRICE_KEY] !== null;\n    var next = {};\n    Object.keys(record).forEach(function (key) {\n      if (key === LEGACY_PARTNER_TIER_PRICE_KEY) {\n        if (!hasNewKey) next[PARTNER_TIER_PRICE_KEY] = record[key];\n      } else if (key !== PARTNER_TIER_PRICE_KEY || hasNewKey) {\n        next[key] = record[key];\n      }\n    });\n    return next;\n  }\n\n  // Pricing data ({ pricing: { sku: row } }) with every row's tier under the\n  // new key. Data without the former key is returned as it is.\n  function withPartnerTierPricingData(data) {\n    var pricing = data && typeof data === 'object' && data.pricing && typeof data.pricing === 'object' ? data.pricing : null;\n    if (!pricing) return data;\n    var changed = false;\n    var nextPricing = {};\n    Object.keys(pricing).forEach(function (sku) {\n      var row = withPartnerTierPriceKey(pricing[sku]);\n      if (row !== pricing[sku]) changed = true;\n      nextPricing[sku] = row;\n    });\n    return changed ? Object.assign({}, data, { pricing: nextPricing }) : data;\n  }\n\n  function normalizePriceEntry(value, options) {\n    var source = value && typeof value === 'object' ? value : {};\n    var settings = options && typeof options === 'object' ? options : {};\n    var payload = {};\n    [\n      'price',\n      PARTNER_TIER_PRICE_KEY,\n      'priceBrokerBasic',\n      'priceBrokerPremium',\n      'priceFriendsFamily'\n    ].forEach(function (key) {\n      var amount = numberValue(readTierPrice(source, key), NaN);\n      // BD-ZERO-TIER-CELL: a staff tier at or below zero, blank or unreadable\n      // is no tier price (retail), as the Worker's canonical row keeps it.\n      if (key === 'price' ? Number.isFinite(amount) : amount > 0) {\n        payload[key] = amount;\n      }\n    });\n    if (!settings.compact) {\n      var estTurnaround = buildTurnaroundPropertyValue(source.estTurnaround);\n      if (estTurnaround) {\n        payload.estTurnaround = estTurnaround;\n      }\n    }\n    return Object.keys(payload).length ? payload : null;\n  }\n\n  function parseSkuQuantity(finalSku) {\n    var match = text(finalSku).match(/q(\\d+)$/i);\n    return match ? Number(numberValue(match[1], NaN)) : NaN;\n  }\n\n  function calculateCartTransformAddonTotals(optionSelections, quantity, typedQuantity, selectedAddons, addonByKey) {\n    var selectedQuantity = Math.max(1, numberValue(quantity, 1) || 1);\n    var selectedTypedQuantity = Math.max(1, numberValue(typedQuantity, selectedQuantity) || selectedQuantity);\n    var entries = [];\n    var seenKeys = {};\n    var pushEntry = function (entry) {\n      if (!entry || typeof entry !== 'object') return;\n      var key = text(entry.key || entry.addonKey || entry.targetingId);\n      if (key) {\n        if (seenKeys[key]) return;\n        seenKeys[key] = true;\n      }\n      entries.push(entry);\n    };\n    (Array.isArray(optionSelections) ? optionSelections : []).forEach(pushEntry);\n    (Array.isArray(selectedAddons) ? selectedAddons : []).forEach(pushEntry);\n    var result = {\n      eligibleTotal: 0,\n      nonEligibleTotal: 0\n    };\n    entries.forEach(function (entry) {\n      var key = text(entry.key || entry.addonKey || entry.targetingId);\n      var mapped = key && addonByKey && typeof addonByKey === 'object' && addonByKey[key] && typeof addonByKey[key] === 'object'\n        ? Object.assign({}, addonByKey[key], entry)\n        : entry;\n      if (mapped && typeof mapped === 'object' && !Number.isFinite(numberValue(mapped.addonBasePrice, NaN))) {\n        var mappedPrice = numberValue(mapped.pricing, numberValue(mapped.optionAddonPrice, NaN));\n        if (Number.isFinite(mappedPrice)) {\n          mapped = Object.assign({}, mapped, { addonBasePrice: mappedPrice });\n        }\n      }\n      var addon = normalizeAddonSelection(mapped);\n      if (!addon.hasAddon || !Number.isFinite(addon.addonBasePrice)) return;\n      if (Math.abs(addon.addonBasePrice) <= 0.0001) return;\n      if (addon.isPostage || addon.excludeFromCart) return;\n      var unitQuantity = addon.useTypedQuantity ? selectedTypedQuantity : selectedQuantity;\n      var amount = scaleMoney(addon.addonBasePrice, addon.addonType === 'flat' ? 1 : unitQuantity, 1);\n      if (Math.abs(amount) <= 0.0001) return;\n      if (addon.discountEligible && amount > 0.005) {\n        result.eligibleTotal = roundMoney(result.eligibleTotal + amount);\n      } else {\n        result.nonEligibleTotal = roundMoney(result.nonEligibleTotal + amount);\n      }\n    });\n    return result;\n  }\n\n  function calculateCartTransformDesignAmount(payload, profile) {\n    var source = payload && typeof payload === 'object' ? payload : {};\n    var profileSettings = profile && typeof profile === 'object' ? profile : {};\n    var mode = normalizeArtworkMode(source.artworkMode);\n    var amount = 0;\n    var discountPct = 0;\n    if (mode === 'editservice') {\n      amount = numberValue(source.editServiceCost, NaN);\n      if (!Number.isFinite(amount)) {\n        amount = numberValue(source.template && source.template.editServiceCost, 0);\n      }\n      discountPct = numberValue(profileSettings.editServiceDiscountPct, 0);\n    } else if (mode === 'customdesign') {\n      amount = numberValue(source.customDesignCost, NaN);\n      if (!Number.isFinite(amount)) {\n        amount = numberValue(source.customDesignAmount, 0);\n      }\n      discountPct = numberValue(profileSettings.customDesignDiscountPct, 0);\n    }\n    if (!(amount > 0.005)) return 0;\n    var kept = keepShareOfMoney(amount, discountPct);\n    return Number.isFinite(kept) ? kept : 0;\n  }\n\n  // EXACT-CENTS-CATALOG (2026-10-03): an authored value prices a line only for\n  // the compact value it rounds to (half up, as the pricing map stores it). A\n  // cart edit rebuilds the stored state with Object.assign, so the OLD authored\n  // row can sit beside a NEW compact row; that row must never price another\n  // bracket. A key that does not match keeps the compact value, scaled exactly.\n  function overlayAuthoredPriceEntry(priceEntry, authoredPriceEntry) {\n    var result = Object.assign({}, priceEntry);\n    var authored = normalizePriceEntry(authoredPriceEntry, { compact: true });\n    if (!authored) return result;\n    Object.keys(authored).forEach(function (key) {\n      var compactCents = Math.round(numberValue(priceEntry && priceEntry[key], NaN) * 100);\n      var authoredCents = Math.round(scaleMoney(authored[key], 1, 1) * 100);\n      if (Number.isFinite(compactCents) && compactCents === authoredCents) result[key] = authored[key];\n    });\n    return result;\n  }\n\n  function buildCartTransformLinePriceEntry(payload, priceEntry) {\n    var source = payload && typeof payload === 'object' ? payload : {};\n    var price = priceEntry && typeof priceEntry === 'object' ? priceEntry : null;\n    if (!price || !Number.isFinite(numberValue(price.price, NaN))) return null;\n    var finalSku = text(source.finalSku);\n    var paidPrintQty = Math.max(1, numberValue(source.paidPrintQty || source.paidPrintQuantity || source.printQuantity, 1) || 1);\n    var typedQty = Math.max(1, numberValue(source.typedQuantity || source.typedQty || source.printQuantity || paidPrintQty, paidPrintQty) || paidPrintQty);\n    var bracketQty = parseSkuQuantity(finalSku);\n    // EXACT-CENTS-PR3: every line is built from the row as authored (when the\n    // state carries it) with the quote engine arithmetic, the number its page\n    // shows. A state from older bytes without the authored row is scaled\n    // exactly from the compact row it carries.\n    var authored = overlayAuthoredPriceEntry(price, source.authoredPriceEntry);\n    var scalePrice = function (amount) {\n      var parsed = numberValue(amount, NaN);\n      if (!Number.isFinite(parsed)) return NaN;\n      return Number.isFinite(bracketQty) && bracketQty > 0 ? scaleMoney(parsed, paidPrintQty, bracketQty) : scaleMoney(parsed, 1, 1);\n    };\n    var retailProduct = scalePrice(authored.price);\n    if (!Number.isFinite(retailProduct)) return null;\n    var addonTotals = calculateCartTransformAddonTotals(\n      source.optionSelections,\n      paidPrintQty,\n      typedQty,\n      source.selectedAddons,\n      source.addonByKey\n    );\n    var sizeSurchargeTotal = Number(numberValue(source.sizeSurchargeTotal, 0) || 0);\n    var calculateProfile = function (profile) {\n      var settings = profile && typeof profile === 'object' ? profile : {};\n      var productAmount = retailProduct;\n      if (settings.specialPriceKey) {\n        var specialAmount = scalePrice(readTierPrice(authored, settings.specialPriceKey));\n        productAmount = Number.isFinite(specialAmount) ? specialAmount : retailProduct;\n      } else if (settings.productDiscountPct) {\n        productAmount = keepShareOfMoney(retailProduct, settings.productDiscountPct);\n      }\n      // EXACT-CENTS-PLAN-PERCENT: each part in whole cents (the plan or tier\n      // share of the product and of the eligible add-ons rounded on its own, as\n      // the quote engine does), then the parts summed.\n      var addonAmount = addonTotals.nonEligibleTotal + keepShareOfMoney(addonTotals.eligibleTotal, settings.discountAddons);\n      return roundMoney(productAmount + sizeSurchargeTotal + addonAmount + calculateCartTransformDesignAmount(source, settings));\n    };\n    var entry = {\n      price: calculateProfile({}),\n      priceProPlan: calculateProfile({\n        editServiceDiscountPct: 0.5,\n        customDesignDiscountPct: 0.25\n      }),\n      priceUltimatePlan: calculateProfile({\n        productDiscountPct: 0.05,\n        editServiceDiscountPct: 1,\n        customDesignDiscountPct: 0.5,\n        discountAddons: 0.05\n      })\n    };\n    [\n      [PARTNER_TIER_PRICE_KEY, PARTNER_TIER_PRICE_KEY],\n      ['priceBrokerBasic', 'priceBrokerBasic'],\n      ['priceBrokerPremium', 'priceBrokerPremium'],\n      ['priceFriendsFamily', 'priceFriendsFamily']\n    ].forEach(function (pair) {\n      var outputKey = pair[0];\n      var sourceKey = pair[1];\n      // BD-ZERO-TIER-CELL: only a positive tier cell prices the tier; any\n      // other cell leaves the key out and the Cart Transform charges `price`.\n      if (numberValue(readTierPrice(authored, sourceKey), NaN) > 0) {\n        entry[outputKey] = calculateProfile({\n          specialPriceKey: sourceKey,\n          discountAddons: 0.3\n        });\n      }\n    });\n    return entry;\n  }\n\n  function normalizeApparelSizeSurcharges(value) {\n    var source = value && typeof value === 'object' ? value : {};\n    var next = {};\n    Object.keys(source).forEach(function (key) {\n      var cleanKey = text(key);\n      if (!cleanKey) return;\n      var amount = Number(numberValue(source[key], 0) || 0);\n      if (amount > 0) {\n        next[cleanKey] = amount;\n      }\n    });\n    return next;\n  }\n\n  function buildApparelSizesPropertyValue(value) {\n    var sizes = normalizeApparelSizes(value);\n    var keys = Object.keys(sizes);\n    if (!keys.length) return '';\n    return keys.map(function (key) {\n      return key + ': ' + String(sizes[key]);\n    }).join(', ');\n  }\n\n  function truncatePropertyText(value, limit) {\n    var clean = text(value);\n    var max = Math.max(1, Number(limit || 0) || 1024);\n    if (clean.length <= max) return clean;\n    return clean.slice(0, Math.max(0, max - 1)).trim() + '\u2026';\n  }\n\n  function normalizeEddmRoute(entry) {\n    var source = entry && typeof entry === 'object' ? entry : {};\n    var routeId = text(source.routeId || source.id || source.crid);\n    var zip = text(source.zip || source.zipCode || source.zip_code);\n    var crid = text(source.crid || source.cridId || source.crid_id);\n    if (!routeId && zip && crid) routeId = zip + '-' + crid;\n    return {\n      routeId: routeId,\n      zip: zip,\n      crid: crid,\n      routeType: text(source.routeType || source.route_type),\n      dataVersion: text(source.dataVersion || source.data_version),\n      residential: Number(numberValue(source.residential || source.residentialCount || source.res_cnt, 0) || 0),\n      business: Number(numberValue(source.business || source.businessCount || source.bus_cnt, 0) || 0),\n      total: Number(numberValue(source.total || source.totalCount || source.tot_cnt, 0) || 0)\n    };\n  }\n\n  function normalizeEddmState(value) {\n    var source = value && typeof value === 'object' ? value : null;\n    if (!source) return null;\n    var selectedRoutes = Array.isArray(source.selectedRoutes)\n      ? source.selectedRoutes.map(normalizeEddmRoute).filter(function (entry) {\n        return entry.routeId || entry.zip || entry.crid;\n      })\n      : [];\n    var routeDetails = truncatePropertyText(source.routeDetails, 1400);\n    var routeGroupUuid = text(source.routeGroupUuid);\n    var totalAddresses = Number(numberValue(source.totalAddresses, 0) || 0);\n    var routeCount = Number(numberValue(source.selectedRouteCount || source.routes || selectedRoutes.length, selectedRoutes.length) || 0);\n    var hasSelection = !!(routeGroupUuid || routeDetails || totalAddresses > 0 || routeCount > 0 || selectedRoutes.length);\n    if (!hasSelection && !source.active) return null;\n    return {\n      provider: text(source.provider),\n      dataVersion: text(source.dataVersion),\n      routeGroupUuid: routeGroupUuid,\n      targetInMailboxDate: text(source.targetInMailboxDate),\n      routesSelected: !!(source.routesSelected || hasSelection),\n      selectedRouteCount: routeCount,\n      residentialAddresses: Number(numberValue(source.residentialAddresses, 0) || 0),\n      businessAddresses: Number(numberValue(source.businessAddresses, 0) || 0),\n      totalAddresses: totalAddresses,\n      residentialOnly: !!source.residentialOnly,\n      politicalMailer: !!source.politicalMailer,\n      routeDetails: routeDetails,\n      selectedRoutes: selectedRoutes.slice(0, 100)\n    };\n  }\n\n  function normalizeUploadFiles(value) {\n    return (Array.isArray(value) ? value : []).map(function (entry) {\n      var source = entry && typeof entry === 'object' ? entry : {};\n      return {\n        uploadRef: text(source.uploadRef),\n        name: text(source.name || source.fileName),\n        fileName: text(source.fileName || source.name),\n        url: text(source.url || source.publicUrl),\n        publicUrl: text(source.publicUrl || source.url),\n        objectKey: text(source.objectKey),\n        contentType: text(source.contentType),\n        byteSize: Math.max(0, Number(numberValue(source.byteSize, 0) || 0)),\n        storageTarget: text(source.storageTarget)\n      };\n    }).filter(function (entry) {\n      return !!(entry.uploadRef || entry.name || entry.fileName || entry.url || entry.publicUrl || entry.objectKey);\n    });\n  }\n\n  function normalizeUploads(value) {\n    return (Array.isArray(value) ? value : []).map(function (entry) {\n      var source = entry && typeof entry === 'object' ? entry : {};\n      var files = normalizeUploadFiles(source.files);\n      return {\n        id: text(source.id),\n        label: text(source.label || source.id),\n        files: files\n      };\n    }).filter(function (entry) {\n      return !!(entry.id || entry.label || entry.files.length);\n    });\n  }\n\n  function collectUploadedFileNames(state) {\n    var payload = state && typeof state === 'object' ? state : {};\n    var names = [];\n    normalizeUploads(payload.uploads).forEach(function (entry) {\n      entry.files.forEach(function (file) {\n        var fileName = text(file.fileName || file.name);\n        if (fileName) names.push(fileName);\n      });\n    });\n    return names;\n  }\n\n  function normalizeCustomerInputs(value) {\n    var allowedTypes = {\n      short_text: true,\n      long_text: true,\n      number: true,\n      phone: true,\n      email: true,\n      url: true,\n      date: true,\n      checkbox: true\n    };\n    var seenIds = Object.create(null);\n    var seenLabels = Object.create(null);\n    return (Array.isArray(value) ? value : []).slice(0, 20).map(function (entry) {\n      var source = entry && typeof entry === 'object' ? entry : {};\n      var id = text(source.id).toLowerCase();\n      var label = truncatePropertyText(source.label, 80);\n      var type = text(source.type).toLowerCase();\n      if (!/^[a-z][a-z0-9_]{0,47}$/.test(id) || !label || !allowedTypes[type]) return null;\n      var labelKey = label.toLowerCase();\n      if (seenIds[id] || seenLabels[labelKey]) return null;\n      seenIds[id] = true;\n      seenLabels[labelKey] = true;\n      return {\n        id: id,\n        label: label,\n        type: type,\n        value: type === 'checkbox'\n          ? source.value === true\n          : truncatePropertyText(source.value, 1000)\n      };\n    }).filter(Boolean);\n  }\n\n  function readLegacyTemplateRowId(template) {\n    var source = template && typeof template === 'object' ? template : {};\n    var foundationTemplateId = text(source.foundationTemplateId);\n    if (foundationTemplateId.indexOf('legacy_design_template_') === 0) return foundationTemplateId;\n    var designId = text(source.designId);\n    if (designId.indexOf('legacy_design_template_') === 0) return designId;\n    return '';\n  }\n\n  function normalizeChannelOfferOrigin(value) {\n    var source = value && typeof value === 'object' ? value : {};\n    if (!text(source.offerId) || text(source.offerId).length > 160\n      || !/^co1_[a-f0-9]{64}$/.test(text(source.revisionId))\n      || !/^\\d+$/.test(text(source.variantId))\n      || !/^\\d+$/.test(text(source.productId))\n      || (source.mode !== 'native' && source.mode !== 'custom')) return null;\n    return { offerId: text(source.offerId), revisionId: text(source.revisionId), variantId: text(source.variantId),\n      productId: text(source.productId), mode: source.mode, designIncluded: source.designIncluded === true };\n  }\n\n  // Only a confirmed, same-product catalog can select merchandise on the page.\n  // These browser helpers are not a pricing authority: the server validates\n  // custom entitlements and Shopify owns a native variant's selling price.\n  function normalizeChannelCatalog(value, productId) {\n    var source = value && typeof value === 'object' ? value : {};\n    var baseId = text(source.calculatorVariantId);\n    if (source.version !== 1 || !/^\\d+$/.test(baseId) || !Array.isArray(source.offers) || source.offers.length > 100) return null;\n    var seen = Object.create(null);\n    var offers = [];\n    for (var i = 0; i < source.offers.length; i += 1) {\n      var offer = source.offers[i] || {};\n      var identity = normalizeChannelOfferOrigin({ offerId: offer.offerId, revisionId: offer.revisionId,\n        variantId: offer.variantId, productId: offer.product && offer.product.id, mode: 'native', designIncluded: offer.designIncluded });\n      var quantity = Number(offer.packageQuantity);\n      var cents = Number(offer.price && offer.price.amountCents);\n      if (!identity || identity.productId !== text(productId) || identity.variantId === baseId || seen[identity.variantId]\n        || !Number.isSafeInteger(quantity) || quantity < 1 || quantity > 10000000\n        || !Number.isSafeInteger(cents) || cents < 0 || !/^[A-Z]{3}$/.test(text(offer.price && offer.price.currency))\n        || !offer.selections || typeof offer.selections !== 'object' || Array.isArray(offer.selections)) return null;\n      var selections = Object.create(null);\n      var keys = Object.keys(offer.selections);\n      if (keys.length > 200) return null;\n      for (var j = 0; j < keys.length; j += 1) {\n        var key = keys[j];\n        if (!key || /^(?:__proto__|constructor|prototype)$/.test(key) || typeof offer.selections[key] !== 'string' || !text(offer.selections[key])) return null;\n        selections[key] = offer.selections[key];\n      }\n      var services = offer.designServiceChoices || [];\n      if (!Array.isArray(services) || services.length > 100 || services.some(function (choice) {\n        return !choice || typeof choice.holderId !== 'string' || !text(choice.holderId)\n          || typeof choice.valueId !== 'string' || !text(choice.valueId);\n      })) return null;\n      seen[identity.variantId] = true;\n      offers.push({ offerId: identity.offerId, revisionId: identity.revisionId, variantId: identity.variantId,\n        productId: identity.productId, name: text(offer.name), packageQuantity: quantity, selections: selections,\n        designServiceChoices: services.map(function (choice) { return { holderId: choice.holderId, valueId: choice.valueId }; }),\n        designIncluded: identity.designIncluded, collectSizesAfterOrder: offer.collectSizesAfterOrder === true,\n        includeSizeSurcharges: offer.includeSizeSurcharges === true,\n        price: { amountCents: cents, currency: text(offer.price.currency) } });\n    }\n    return { version: 1, calculatorVariantId: baseId, offers: offers };\n  }\n\n  function findChannelOfferByVariant(catalog, variantId) {\n    return catalog && Array.isArray(catalog.offers)\n      ? catalog.offers.find(function (offer) { return offer.variantId === text(variantId); }) || null : null;\n  }\n\n  function channelOfferMatches(offer, current) {\n    if (!offer || !current || Number(current.printQuantity) !== offer.packageQuantity) return false;\n    var selections = current.selections && typeof current.selections === 'object' ? current.selections : {};\n    var expected = Object.keys(offer.selections);\n    if (Object.keys(selections).length !== expected.length || expected.some(function (key) { return selections[key] !== offer.selections[key]; })) return false;\n    if (current.hasProject || current.hasTemplate || current.hasUploads || Number(current.artworkCharges || 0) !== 0) return false;\n    if (current.apparelSizes && Object.keys(current.apparelSizes).some(function (size) { return Number(current.apparelSizes[size]) !== 0; })) return false;\n    return current.artworkMode === 'customdesign' && offer.designIncluded || current.artworkMode === 'sendlater' || current.artworkMode === 'youhaveart';\n  }\n\n  function resolveChannelPurchase(catalog, origin, current) {\n    var identity = normalizeChannelOfferOrigin(origin);\n    var offer = identity && findChannelOfferByVariant(catalog, identity.variantId);\n    if (!offer || identity.productId !== offer.productId || identity.offerId !== offer.offerId || identity.revisionId !== offer.revisionId) {\n      return { pricingMode: 'custom', variantId: catalog ? catalog.calculatorVariantId : '', offer: null, designIncluded: false };\n    }\n    var native = channelOfferMatches(offer, current);\n    return { pricingMode: native ? 'native' : 'custom', variantId: native ? offer.variantId : catalog.calculatorVariantId,\n      offer: offer, designIncluded: offer.designIncluded };\n  }\n\n  function buildDesignerState(payload) {\n    var source = payload && typeof payload === 'object' ? payload : {};\n    // The protected sign lane quotes from the stored FULL state, so the\n    // legacy edit-service lookup must live on its top level too (the\n    // template block's templateLookup stays the launch-facing native id).\n    var stateTemplateLookup = normalizeArtworkMode(source.artworkMode) === 'editservice'\n      ? (text(source.templateLookup).indexOf('legacy_design_template_') === 0\n        ? text(source.templateLookup)\n        : readLegacyTemplateRowId(source.template))\n      : '';\n    var designerState = {\n      runtimeVersion: text(source.runtimeVersion) || 'designer-storefront-v1',\n      handle: text(source.handle),\n      sourceHandle: text(source.sourceHandle),\n      productId: text(source.productId),\n      baseVariantId: text(source.baseVariantId),\n      channelOffer: normalizeChannelOfferOrigin(source.channelOffer),\n      templateLookup: stateTemplateLookup,\n      quoteRevision: text(source.quoteRevision),\n      pricingFingerprint: text(source.pricingFingerprint),\n      quantityMode: normalizeDesignerQuantityMode(source.quantityMode),\n      optionSelections: Array.isArray(source.optionSelections) ? source.optionSelections.map(function (entry) {\n        return serializeOptionSelection(entry, false);\n      }) : [],\n      artworkSectionEnabled: source.artworkSectionEnabled !== false,\n      artworkMode: normalizeArtworkMode(source.artworkMode),\n      artworkLabel: text(source.artworkLabel),\n      cartDesignEditor: normalizeCartDesignEditor(source.cartDesignEditor),\n      launchProvider: normalizeLaunchProvider(\n        source.launchProvider\n        || source.provider\n        || (source.project && source.project.provider)\n      ),\n      cartQuantityMode: normalizeCartQuantityMode(source.cartQuantityMode),\n      template: source.template && typeof source.template === 'object' ? {\n        designId: text(source.template.designId),\n        designNumber: text(source.template.designNumber),\n        templateLookup: text(source.template.templateLookup || source.template.templatePublicId || source.template.publicId),\n        templatePublicId: text(source.template.templatePublicId || source.template.templateLookup || source.template.publicId),\n        foundationTemplateId: text(source.template.foundationTemplateId),\n        revision: text(source.template.revision || source.template.templateRevision),\n        title: text(source.template.title),\n        editServiceCost: Number(numberValue(source.template.editServiceCost, 0) || 0),\n        editServiceOriginalCost: Number(numberValue(source.template.editServiceOriginalCost, source.template.editServiceCost) || 0),\n        previewUrl: text(source.template.previewUrl || (Array.isArray(source.template.previews) ? source.template.previews[0] : '')),\n        previews: Array.isArray(source.template.previews) ? source.template.previews.map(text).filter(Boolean) : [],\n        backer: text(source.template.backer),\n        backerLabel: text(source.template.backerLabel),\n        orientation: text(source.template.orientation)\n      } : null,\n      project: source.project && typeof source.project === 'object' ? {\n        projectId: text(source.project.projectId),\n        designId: text(source.project.designId),\n        designNumber: text(source.project.designNumber),\n        title: text(source.project.title || source.project.name || source.project.designTitle),\n        updatedAt: text(source.project.updatedAt || source.project.lastEditedAt || source.project.modifiedAt),\n        documentOrientation: text(source.project.documentOrientation),\n        previewUrl: text(source.project.previewUrl),\n        previews: Array.isArray(source.project.previews) ? source.project.previews.map(text).filter(Boolean) : [],\n        numPages: Number(numberValue(source.project.numPages || source.project.pages || source.project.pageCount || source.project.pageLength, 0) || 0),\n        // EDITOR-LANES-EMPTY-SAVE-01: the document-derived artwork truth,\n        // carried only once it is known (a reload must not invent one).\n        hasArtwork: typeof source.project.hasArtwork === 'boolean' ? source.project.hasArtwork : undefined,\n        refreshToken: text(source.project.refreshToken),\n        provider: normalizeLaunchProvider(source.project.provider)\n      } : null,\n      completion: normalizeCompletionState(source.completion),\n      canvaUrl: text(source.canvaUrl),\n      guidedFill: source.guidedFill && typeof source.guidedFill === 'object' ? {\n        armed: source.guidedFill.armed === true,\n        projectId: text(source.guidedFill.projectId)\n      } : null,\n      customerInputs: normalizeCustomerInputs(source.customerInputs),\n      uploads: normalizeUploads(source.uploads),\n      finalSku: text(source.finalSku),\n      priceEntry: normalizePriceEntry(source.priceEntry || source.priceRecord || source.priceObj),\n      selectedAddons: normalizeSelectedAddons(source.selectedAddons),\n      addonByKey: normalizeAddonByKey(source.addonByKey),\n      editServiceCost: Number(numberValue(source.editServiceCost, 0) || 0),\n      editServiceOriginalCost: Number(numberValue(source.editServiceOriginalCost, source.editServiceCost) || 0),\n      customDesignCost: Number(numberValue(source.customDesignCost, 0) || 0),\n      templatePersonalizationAmount: Number(numberValue(source.templatePersonalizationAmount, 0) || 0),\n      customDesignAmount: Number(numberValue(source.customDesignAmount, 0) || 0),\n      printQuantity: Number(numberValue(source.printQuantity, 0) || 0),\n      typedQuantity: Number(numberValue(source.typedQuantity || source.typedQty, 0) || 0),\n      paidPrintQty: Number(numberValue(source.paidPrintQty || source.paidPrintQuantity, 0) || 0),\n      quantityLockedToPricingTable: source.quantityLockedToPricingTable === true || source.lockedToPricingTable === true,\n      quantityPriceQuantities: normalizePositiveIntegerList(source.quantityPriceQuantities || source.priceQuantities),\n      quantityMin: Number(numberValue(source.quantityMin, 0) || 0),\n      quantityMax: Number(numberValue(source.quantityMax, 0) || 0),\n      quantityStep: Number(numberValue(source.quantityStep, 0) || 0),\n      setCount: Number(numberValue(source.setCount, 0) || 0),\n      apparelSizes: normalizeApparelSizes(source.apparelSizes),\n      sizeSurchargeTotal: Number(numberValue(source.sizeSurchargeTotal, 0) || 0),\n      apparelAvailableSizes: normalizeStringList(source.apparelAvailableSizes),\n      apparelSizeSurcharges: normalizeApparelSizeSurcharges(source.apparelSizeSurcharges),\n      apparelMinQty: Number(numberValue(source.apparelMinQty, 0) || 0),\n      apparelDefaultQty: Number(numberValue(source.apparelDefaultQty, 0) || 0),\n      apparelDefaultSize: text(source.apparelDefaultSize),\n      selectedSizeId: text(source.selectedSizeId),\n      selectedSizeLabel: text(source.selectedSizeLabel),\n      selectedWidth: text(source.selectedWidth),\n      selectedHeight: text(source.selectedHeight),\n      selectedUnit: text(source.selectedUnit),\n      selectedOrientation: text(source.selectedOrientation),\n      selectedSidesId: text(source.selectedSidesId),\n      selectedSidesLabel: text(source.selectedSidesLabel),\n      selectedSidesTargetingId: text(source.selectedSidesTargetingId),\n      sidesPolicy: source.sidesPolicy && typeof source.sidesPolicy === 'object' ? deepClone(source.sidesPolicy, {}) : null,\n      selectedPrintingId: text(source.selectedPrintingId),\n      selectedPrintingLabel: text(source.selectedPrintingLabel),\n      selectedPrintingTargetingId: text(source.selectedPrintingTargetingId),\n      eddm: normalizeEddmState(source.eddm)\n    };\n    // EXACT-CENTS-PR3: the row as authored rides with the state whenever the\n    // page or the cart wrote it, because every line is built from it. The core\n    // never reads the per-line marker; it only carries it, since cart.js shows\n    // a line signed before 2026-10-04 12:03Z (no marker) with its own arithmetic.\n    // Same key order as before, so a marked state serializes byte for byte.\n    if (source.quoteArithmetic === true) designerState.quoteArithmetic = true;\n    var authoredPriceEntry = normalizePriceEntry(source.authoredPriceEntry, { compact: true });\n    if (authoredPriceEntry) designerState.authoredPriceEntry = authoredPriceEntry;\n    // MF-A: approval ticks ride the full state (never the compact one), so cart rebuilds keep them; only true is kept.\n    var approvals = source.approvals && typeof source.approvals === 'object' ? source.approvals : {};\n    if (approvals.designReviewApproved === true || approvals.customDesignApproved === true) {\n      designerState.approvals = { designReviewApproved: approvals.designReviewApproved === true, customDesignApproved: approvals.customDesignApproved === true };\n    }\n    return designerState;\n  }\n\n  function buildPublicProperties(state) {\n    var payload = state && typeof state === 'object' ? state : {};\n    var properties = {};\n    var selections = Array.isArray(payload.optionSelections)\n      ? payload.optionSelections.slice().sort(function (a, b) {\n        return (Number(a && a.order) || 0) - (Number(b && b.order) || 0);\n      })\n      : [];\n    selections.forEach(function (entry) {\n      var key = text(entry && entry.holderLabel);\n      var value = buildSelectionDisplayLabel(entry);\n      if (!key || !value) return;\n      properties[key] = value;\n    });\n    if (payload.printQuantity) {\n      properties.Quantity = String(payload.printQuantity);\n    }\n    var estTurnaround = buildTurnaroundPropertyValue(\n      payload.estTurnaround\n      || (payload.priceEntry && payload.priceEntry.estTurnaround)\n      || (payload.priceRecord && payload.priceRecord.estTurnaround)\n      || (payload.priceObj && payload.priceObj.estTurnaround)\n    );\n    if (estTurnaround) {\n      properties['Est. Turnaround Time'] = estTurnaround;\n    }\n    var sizesSummary = buildApparelSizesPropertyValue(payload.apparelSizes);\n    if (sizesSummary) {\n      properties.Sizes = sizesSummary;\n    }\n    if (payload.setCount && payload.setCount > 1) {\n      properties.Sets = String(payload.setCount);\n    }\n    if (payload.artworkSectionEnabled !== false && text(payload.artworkLabel)) {\n      properties.Artwork = text(payload.artworkLabel);\n    }\n    if (payload.artworkMode === 'editservice') {\n      var templatePersonalizationAmount = formatSignedMoneyProperty(payload.templatePersonalizationAmount);\n      if (templatePersonalizationAmount) {\n        properties['Template Personalization'] = templatePersonalizationAmount;\n      }\n    }\n    if (payload.artworkMode === 'customdesign') {\n      var customDesignAmount = formatSignedMoneyProperty(payload.customDesignAmount);\n      if (customDesignAmount) {\n        properties['Custom Design'] = customDesignAmount;\n      }\n    }\n    if (text(payload.canvaUrl)) {\n      properties['Canva Link'] = text(payload.canvaUrl);\n    }\n    normalizeCustomerInputs(payload.customerInputs).forEach(function (entry) {\n      var value = entry.type === 'checkbox'\n        ? (entry.value === true ? 'Yes' : '')\n        : text(entry.value);\n      if (!value || Object.prototype.hasOwnProperty.call(properties, entry.label)) return;\n      properties[entry.label] = truncatePropertyText(value, 1000);\n    });\n    var uploadedFileNames = collectUploadedFileNames(payload);\n    if (uploadedFileNames.length) {\n      properties['Uploaded Files'] = uploadedFileNames.join(', ');\n    }\n    if (payload.project && text(payload.project.projectId)) {\n      properties['Project ID'] = text(payload.project.projectId);\n    }\n    var designId = text(\n      payload.project && payload.project.designId\n        || payload.template && payload.template.designId\n    );\n    if (designId) {\n      properties['_Design ID'] = designId;\n    }\n    var designNumber = text(\n      payload.project && payload.project.designNumber\n        || payload.template && payload.template.designNumber\n    );\n    if (designNumber) {\n      properties['Design #'] = designNumber;\n    }\n    var backer = text(payload.template && (payload.template.backerLabel || payload.template.backer));\n    if (backer) {\n      properties.Backer = backer;\n    }\n    // RE1 reorder mark: staff and the customer see WHICH design is being\n    // reordered (design number + title \u2014 never raw internal ids), or the\n    // standing fallback promise when no design was picked. The value is\n    // rebuilt from the stored designer state on every context sign, so\n    // cart-side updates keep it consistent.\n    var reorderState = payload.reorder && typeof payload.reorder === 'object' ? payload.reorder : null;\n    if (reorderState) {\n      var reorderValue = '';\n      if (text(reorderState.source) === 'fallback') {\n        reorderValue = 'We will reach out to you after checkout.';\n      } else {\n        var reorderNumber = text(reorderState.designNumber);\n        var reorderTitle = text(reorderState.title);\n        reorderValue = reorderNumber\n          ? 'Design ' + reorderNumber + (reorderTitle ? ' \"' + reorderTitle + '\"' : '')\n          : (reorderTitle || 'Previous design');\n        // RE2 reference attach: a design from another product names its\n        // source so staff know the artwork needs fitting to this order.\n        var reorderSourceProduct = text(reorderState.sourceProduct);\n        if (text(reorderState.source) === 'reference' && reorderSourceProduct) {\n          reorderValue += ' \u2014 from ' + reorderSourceProduct;\n        }\n        // REORDER-REFERENCE-STAFF-REF: a reference loads no project, so a\n        // design with no name and no number gave staff no pointer. Its lookup\n        // rides one underscore property (hidden from the cart and checkout,\n        // shown on the Shopify order). Reference mode only: a loaded-project\n        // line keeps its single project id for the orders/create preflight.\n        var reorderSourceRef = text(reorderState.sourceRef);\n        if (text(reorderState.source) === 'reference' && reorderSourceRef) {\n          properties['_Reorder Design ID'] = truncatePropertyText(reorderSourceRef, 255);\n        }\n      }\n      properties.Reorder = truncatePropertyText(reorderValue, 255);\n    }\n    if (payload.eddm && typeof payload.eddm === 'object') {\n      var eddm = normalizeEddmState(payload.eddm);\n      if (eddm) {\n        if (eddm.provider) properties['EDDM Provider'] = eddm.provider;\n        if (eddm.dataVersion) properties['EDDM Data Version'] = eddm.dataVersion;\n        if (eddm.routeGroupUuid) properties['EDDM Route Group'] = eddm.routeGroupUuid;\n        if (eddm.targetInMailboxDate) properties['Target In-Mailbox Date'] = eddm.targetInMailboxDate;\n        if (eddm.routesSelected || eddm.selectedRouteCount || eddm.residentialAddresses || eddm.businessAddresses || eddm.totalAddresses) {\n          properties['EDDM Routes'] = String(eddm.selectedRouteCount || 0);\n          properties['EDDM Residential Addresses'] = String(eddm.residentialAddresses || 0);\n          properties['EDDM Business Addresses'] = String(eddm.businessAddresses || 0);\n          properties['EDDM Total Addresses'] = String(eddm.totalAddresses || 0);\n        }\n        if (eddm.residentialOnly) properties['EDDM Residential Only'] = 'Yes';\n        if (eddm.politicalMailer) properties['EDDM Political Mailer'] = 'Yes';\n        if (eddm.routeDetails) properties['EDDM Route Details'] = truncatePropertyText(eddm.routeDetails, 1024);\n      }\n    }\n    var postageTotal = calculateDesignerOptionAddOns(\n      payload.optionSelections,\n      payload.printQuantity || payload.paidPrintQty || payload.typedQuantity,\n      payload.typedQuantity || payload.typedQty || payload.printQuantity\n    ).postageTotal;\n    if (postageTotal > 0.005) {\n      properties.Postage = formatShopMoney(postageTotal) + ' will be invoiced separately.';\n    }\n    // MF-A: the approval rows are derived from the state, so signing and every re-sign rebuild them (staff keys below).\n    var approvalState = payload.approvals && typeof payload.approvals === 'object' ? payload.approvals : {};\n    if (approvalState.designReviewApproved === true) properties['Design Approval'] = 'I have reviewed and approve my design.';\n    if (approvalState.customDesignApproved === true) properties.Approval = 'I acknowledge';\n    return properties;\n  }\n\n  function buildCartTransformState(state) {\n    var payload = state && typeof state === 'object' ? state : {};\n    var selections = Array.isArray(payload.optionSelections)\n      ? payload.optionSelections.map(function (entry) {\n        return serializeCartTransformSelection(entry);\n      }).filter(function (entry) {\n        return !!(entry && typeof entry === 'object');\n      })\n      : [];\n    var priceEntry = normalizePriceEntry(payload.priceEntry || payload.priceRecord || payload.priceObj, { compact: true });\n    var linePriceEntry = buildCartTransformLinePriceEntry(payload, priceEntry);\n    var selectedAddons = normalizeSelectedAddons(payload.selectedAddons);\n    var addonByKey = normalizeAddonByKey(payload.addonByKey);\n    var artworkMode = normalizeArtworkMode(payload.artworkMode || payload.artworkSelection || payload.artworkLabel);\n    var compact = {\n      runtimeVersion: text(payload.runtimeVersion || 'designer-storefront-v1'),\n      handle: text(payload.handle),\n      sourceHandle: text(payload.sourceHandle),\n      productId: text(payload.productId),\n      baseVariantId: text(payload.baseVariantId),\n      finalSku: text(payload.finalSku),\n    };\n    if (!compact.handle) delete compact.handle;\n    if (!compact.sourceHandle) delete compact.sourceHandle;\n    if (!compact.productId) delete compact.productId;\n    var quoteRevision = text(payload.quoteRevision);\n    if (quoteRevision) compact.quoteRevision = quoteRevision;\n    var pricingFingerprint = text(payload.pricingFingerprint);\n    if (pricingFingerprint) compact.pricingFingerprint = pricingFingerprint;\n    var channelOrigin = normalizeChannelOfferOrigin(payload.channelOffer);\n    if (channelOrigin) compact.channelOffer = channelOrigin;\n    if (priceEntry) compact.priceEntry = priceEntry;\n    if (linePriceEntry) compact.linePriceEntry = linePriceEntry;\n    var cartQuantityMode = normalizeCartQuantityMode(payload.cartQuantityMode);\n    if (cartQuantityMode && (cartQuantityMode !== 'set_count' || channelOrigin)) compact.cartQuantityMode = cartQuantityMode;\n    var printQuantity = Number(numberValue(payload.printQuantity, 0) || 0);\n    if (printQuantity > 0) compact.printQuantity = printQuantity;\n    var typedQty = Number(numberValue(payload.typedQuantity || payload.typedQty, 0) || 0);\n    if (typedQty > 0 && typedQty !== printQuantity) compact.typedQty = typedQty;\n    var paidPrintQty = Number(numberValue(payload.paidPrintQty || payload.paidPrintQuantity, 0) || 0);\n    if (paidPrintQty > 0 && paidPrintQty !== printQuantity) compact.paidPrintQty = paidPrintQty;\n    var sizeSurchargeTotal = Number(numberValue(payload.sizeSurchargeTotal, 0) || 0);\n    if (sizeSurchargeTotal > 0) compact.sizeSurchargeTotal = sizeSurchargeTotal;\n    var editServiceCost = Number(numberValue(payload.editServiceCost, 0) || 0);\n    if (editServiceCost > 0) compact.editServiceCost = editServiceCost;\n    var customDesignCost = Number(numberValue(payload.customDesignCost, 0) || 0);\n    var customDesignAmount = Number(numberValue(payload.customDesignAmount, 0) || 0);\n    if (artworkMode) {\n      compact.artworkMode = artworkMode;\n    }\n    if (artworkMode === 'editservice') {\n      // A legacy picker row is priced from ITS OWN legacy record, so its row\n      // id must win over any product-level native lookup the selection\n      // inherited (launch/bootstrap paths keep using template.templateLookup,\n      // which stays untouched). Native selections never carry a\n      // legacy_design_template_ id and keep the native lookup + revision.\n      var legacyRowId = readLegacyTemplateRowId(payload.template);\n      var templateLookup = legacyRowId\n        || text(payload.templateLookup)\n        || text(payload.template && (payload.template.templateLookup || payload.template.templatePublicId));\n      if (templateLookup) compact.templateLookup = templateLookup;\n      var templateRevision = text(payload.template && (payload.template.revision || payload.template.templateRevision));\n      if (templateRevision && !legacyRowId) compact.templateRevision = templateRevision;\n    }\n    var quoteDiagnostics = {};\n    if (artworkMode === 'editservice') {\n      var diagnosticEditServiceCost = numberValue(payload.editServiceCost, NaN);\n      var diagnosticEditServiceOriginalCost = numberValue(\n        payload.editServiceOriginalCost,\n        numberValue(payload.template && payload.template.editServiceOriginalCost, NaN)\n      );\n      if (Number.isFinite(diagnosticEditServiceCost) && diagnosticEditServiceCost >= 0) {\n        quoteDiagnostics.editServiceCost = diagnosticEditServiceCost;\n      }\n      if (Number.isFinite(diagnosticEditServiceOriginalCost) && diagnosticEditServiceOriginalCost >= 0) {\n        quoteDiagnostics.editServiceOriginalCost = diagnosticEditServiceOriginalCost;\n      }\n    } else if (artworkMode === 'customdesign') {\n      var diagnosticCustomDesignCost = numberValue(payload.customDesignCost, NaN);\n      if (Number.isFinite(diagnosticCustomDesignCost) && diagnosticCustomDesignCost >= 0) {\n        quoteDiagnostics.customDesignCost = diagnosticCustomDesignCost;\n      }\n    }\n    if (Object.keys(quoteDiagnostics).length) compact.quoteDiagnostics = quoteDiagnostics;\n    if (artworkMode === 'customdesign' && customDesignAmount > 0) {\n      compact.customDesignAmount = customDesignAmount;\n    } else if (artworkMode === 'customdesign' && customDesignCost > 0) {\n      compact.customDesignAmount = customDesignCost;\n    }\n    var templatePersonalizationAmount = Number(numberValue(payload.templatePersonalizationAmount, 0) || 0);\n    if (templatePersonalizationAmount > 0) compact.templatePersonalizationAmount = templatePersonalizationAmount;\n    var apparelSizes = normalizeApparelSizes(payload.apparelSizes);\n    if (Object.keys(apparelSizes).length) compact.apparelSizes = apparelSizes;\n    if (selections.length) compact.optionSelections = selections;\n    if (!linePriceEntry && selectedAddons.length) compact.selectedAddons = selectedAddons;\n    if (!linePriceEntry && Object.keys(addonByKey).length) compact.addonByKey = addonByKey;\n    return compact;\n  }\n\n  function getCartTransformStateMapKey() {\n    return CART_TRANSFORM_STATE_MAP_KEY;\n  }\n\n  function readDesignerStateFromProperties(properties) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var serializedState = parseJson(source._bg_designer_state_v1, null);\n    if (serializedState && typeof serializedState === 'object') {\n      return serializedState;\n    }\n    var compactState = parseJson(source._bg_cart_transform_state_v1, null);\n    if (compactState && typeof compactState === 'object') {\n      return buildDesignerState(compactState);\n    }\n    return null;\n  }\n\n  var COMMERCE_CONTEXT_URL = '/apps/qps-commerce-control-plane/designer/commerce-contexts';\n  var CART_TRANSFORM_SIGN_URL = '/apps/qps-commerce-control-plane/designer/cart-transform/sign';\n  var COMMERCE_PROJECT_BOOTSTRAP_URL = '/apps/qps-commerce-control-plane/designer/session/bootstrap';\n  var commerceContextCache = {};\n  var commerceProjectSessionCache = Object.create(null);\n  var STAFF_PROPERTY_KEYS = {\n    Size: true,\n    Paper: true,\n    Material: true,\n    Corners: true,\n    Quantity: true,\n    'Est. Turnaround Time': true,\n    Sizes: true,\n    Artwork: true,\n    Reorder: true,\n    '_Reorder Design ID': true,\n    'Uploaded Files': true,\n    '_Design ID': true,\n    'Design #': true,\n    '_Production SKU': true,\n    '_Context ID': true,\n    'Design Approval': true,\n    Approval: true\n  };\n  var EXTRA_PUBLIC_PROPERTY_KEYS = [\n    'Project ID',\n    'Design ID',\n    'Context ID',\n    'QPS Context ID',\n    'Production SKU',\n    'Template Personalization',\n    'Custom Design',\n    'Est. Turnaround Time',\n    'Canva Link',\n    'Sets',\n    'QR Code Link',\n    'Imprint Information',\n    'Design Approval',\n    'Approval',\n    'Uploaded Files'\n  ];\n\n  function readCommerceContextIdProperty(properties, fallback) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    return text(\n      fallback\n      || source._bg_context_id\n      || source['_Context ID']\n      || source['Context ID']\n      || source['QPS Context ID']\n    );\n  }\n\n  function readCommerceContextVersion(context, fallback) {\n    var source = context && typeof context === 'object' ? context : {};\n    var explicit = text(fallback || source.contextVersion);\n    if (/^\\d{13}$/.test(explicit)) return explicit;\n    var parsed = Date.parse(text(source.updatedAt || (source.audit && source.audit.updatedAt)));\n    return Number.isFinite(parsed) && parsed > 0 ? String(Math.round(parsed)) : '';\n  }\n\n  function hashCartToken(value) {\n    var clean = text(value);\n    if (!clean || !window.crypto || !window.crypto.subtle || typeof TextEncoder === 'undefined') {\n      return Promise.resolve('');\n    }\n    return window.crypto.subtle.digest('SHA-256', new TextEncoder().encode(clean)).then(function (buffer) {\n      return Array.prototype.map.call(new Uint8Array(buffer), function (byte) {\n        return byte.toString(16).padStart(2, '0');\n      }).join('');\n    }).catch(function () { return ''; });\n  }\n\n  function buildStaffOrderProperties(state, sourceProperties, contextId) {\n    var payload = state && typeof state === 'object' ? state : {};\n    var source = sourceProperties && typeof sourceProperties === 'object' ? sourceProperties : {};\n    var publicProperties = buildPublicProperties(payload);\n    // Product option rows are keyed by staff-authored holder labels (Sides,\n    // Stakes, Stock, ...), so the static allowlist alone drops them whenever a\n    // line is context-signed after a cart-side update.\n    var holderLabelKeys = Object.create(null);\n    (Array.isArray(payload.optionSelections) ? payload.optionSelections : []).forEach(function (entry) {\n      var label = text(entry && entry.holderLabel);\n      if (label) holderLabelKeys[label] = true;\n    });\n    normalizeCustomerInputs(payload.customerInputs).forEach(function (entry) {\n      if (entry.label) holderLabelKeys[entry.label] = true;\n    });\n    var out = {};\n    Object.keys(publicProperties).forEach(function (key) {\n      if (!STAFF_PROPERTY_KEYS[key] && !holderLabelKeys[key]) return;\n      var value = text(publicProperties[key]);\n      if (!value) return;\n      out[key] = value;\n    });\n    var finalSku = text(payload.finalSku || source._bg_final_sku || source['_Production SKU'] || source['Production SKU']);\n    if (finalSku) out['_Production SKU'] = finalSku;\n    var cleanContextId = readCommerceContextIdProperty(source, contextId);\n    if (cleanContextId) out['_Context ID'] = cleanContextId;\n    return out;\n  }\n\n  function readFormDataProperties(formData) {\n    var properties = {};\n    if (!formData || typeof formData.entries !== 'function') return properties;\n    var matcher = /^properties\\[(.+)\\]$/;\n    formData.forEach(function (value, key) {\n      var match = String(key || '').match(matcher);\n      if (!match) return;\n      properties[match[1]] = value;\n    });\n    return properties;\n  }\n\n  function setFormDataProperty(formData, key, value) {\n    if (!formData || typeof formData.set !== 'function') return;\n    formData.set('properties[' + key + ']', text(value));\n  }\n\n  function deleteFormDataProperty(formData, key) {\n    if (!formData || typeof formData.delete !== 'function') return;\n    formData.delete('properties[' + key + ']');\n  }\n\n  function buildCommerceContextPayload(properties, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var fullState = parseJson(source._bg_designer_state_v1, null);\n    if (!fullState || typeof fullState !== 'object') {\n      fullState = readDesignerStateFromProperties(source);\n    }\n    if (!fullState || typeof fullState !== 'object') return null;\n    var pricingState = parseJson(source._bg_cart_transform_state_v1, null);\n    if (!pricingState || typeof pricingState !== 'object') {\n      pricingState = buildCartTransformState(fullState);\n    }\n    var sourceContextId = readCommerceContextIdProperty(source);\n    var staffProperties = buildStaffOrderProperties(fullState, source, sourceContextId);\n    var project = fullState.project && typeof fullState.project === 'object' ? fullState.project : {};\n    var template = fullState.template && typeof fullState.template === 'object' ? fullState.template : {};\n    return {\n      contextId: sourceContextId,\n      storeKey: text(settings.storeKey),\n      shop: text(settings.shop || (window.Shopify && window.Shopify.shop)),\n      customerId: text(settings.customerId),\n      cartTokenHash: text(settings.cartTokenHash),\n      lineKey: text(settings.lineKey || source._bg_update_line_key),\n      source: text(settings.source || 'storefront'),\n      product: {\n        handle: text(fullState.handle || source._bg_designer_handle),\n        sourceHandle: text(fullState.sourceHandle || source._bg_designer_source_handle || fullState.handle || source._bg_designer_handle),\n        productId: text(fullState.productId),\n        baseVariantId: text(fullState.baseVariantId || source._bg_base_variant_id),\n        finalSku: text(fullState.finalSku || source._bg_final_sku)\n      },\n      design: {\n        provider: text(fullState.launchProvider || project.provider || source._bg_designer_provider),\n        projectId: text(project.projectId),\n        designId: text(project.designId || template.designId || source['_Design ID'] || source['Design ID']),\n        designNumber: text(project.designNumber || template.designNumber || source['Design #']),\n        templateLookup: text(template.templateLookup || template.templatePublicId || template.publicId),\n        templatePublicId: text(template.templatePublicId || template.templateLookup || template.publicId),\n        title: text(template.title),\n        previewUrl: text(project.previewUrl || template.previewUrl),\n        numPages: Number(numberValue(project.numPages || project.pages || project.pageCount || project.pageLength, 0) || 0),\n        previews: Array.isArray(project.previews) && project.previews.length\n          ? project.previews.map(text).filter(Boolean)\n          : (Array.isArray(template.previews) ? template.previews.map(text).filter(Boolean) : [])\n      },\n      properties: {\n        staffProperties: staffProperties,\n        pricingState: pricingState,\n        fullState: fullState\n      }\n    };\n  }\n\n  function shouldDeleteCommerceContextProperty(key) {\n    if (!key) return false;\n    if (key === '_bg_update_line_key') return true;\n    if (key === '_bg_reprice_nonce') return true;\n    if (key.indexOf('_bg_completion_') === 0) return true;\n    return false;\n  }\n\n  function applyCommerceContextToProperties(properties, context, state) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var contextId = text(context && (context.contextId || context.id)) || readCommerceContextIdProperty(source);\n    if (!contextId) return source;\n    var payloadState = state && typeof state === 'object' ? state : readDesignerStateFromProperties(source);\n    var publicProperties = payloadState ? buildPublicProperties(payloadState) : {};\n    Object.keys(publicProperties).forEach(function (key) {\n      delete source[key];\n    });\n    EXTRA_PUBLIC_PROPERTY_KEYS.forEach(function (key) {\n      delete source[key];\n    });\n    Object.keys(source).forEach(function (key) {\n      if (shouldDeleteCommerceContextProperty(key)) delete source[key];\n    });\n    source._bg_context_id = contextId;\n    delete source._bg_context_version;\n    var contextVersion = readCommerceContextVersion(context);\n    if (contextVersion) source._bg_context_version = contextVersion;\n    source._bg_cart_transform_state_v1 = JSON.stringify(buildCartTransformState(payloadState || {}));\n    if (payloadState && typeof payloadState === 'object') {\n      source._bg_designer_state_v1 = JSON.stringify(payloadState);\n    }\n    var staffProperties = buildStaffOrderProperties(payloadState || {}, source, contextId);\n    Object.keys(staffProperties).forEach(function (key) {\n      var value = text(staffProperties[key]);\n      if (!value) return;\n      source[key] = value;\n    });\n    return source;\n  }\n\n  function signCartTransformProperties(properties, options) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var settings = options && typeof options === 'object' ? options : {};\n    var expectedProjectReference = readSelfHostedProjectReference(source);\n    var expectedProjectAccessRequired = Boolean(\n      expectedProjectReference\n      && !expectedProjectReference.conflicted\n      && /^shp_[A-Za-z0-9_-]{8,128}$/.test(text(expectedProjectReference.projectId))\n    );\n    if (\n      (expectedProjectReference && !expectedProjectAccessRequired)\n      || (!expectedProjectAccessRequired && (\n        text(source._bg_project_id_v1)\n        || text(source._bg_project_access_sig_v1)\n        || text(source._bg_project_access_attestation_v1)\n      ))\n    ) {\n      return Promise.reject(new Error('Project-bound cart identity is inconsistent.'));\n    }\n    var state = parseJson(source._bg_cart_transform_state_v1, null);\n    if (!state || typeof state !== 'object') {\n      return Promise.reject(new Error('Cart pricing state is invalid.'));\n    }\n    var expectedContextId = readCommerceContextIdProperty(source);\n    var expectedContextVersion = text(source._bg_context_version);\n    if (!expectedContextId || !/^\\d{13}$/.test(expectedContextVersion)) {\n      return Promise.reject(new Error('Cart pricing context is incomplete.'));\n    }\n    var designerSessionToken = text(settings.sessionToken);\n    if (!designerSessionToken && expectedProjectAccessRequired) {\n      // The signing seal requires a session whose projectId claim matches the\n      // line's project; the page session never carries one, so a project-bound\n      // sign resolves the stored project-scoped session (guest claim proof\n      // included) before falling back to the page token.\n      var signingProjectSession = readStoredCommerceProjectSession(text(expectedProjectReference.projectId));\n      if (signingProjectSession) designerSessionToken = text(signingProjectSession.sessionToken);\n    }\n    if (!designerSessionToken) designerSessionToken = getDesignerSessionTokenFromPage();\n    var requestHeaders = {\n      accept: 'application/json',\n      'content-type': 'application/json',\n      'x-qps-cart-token-hash': text(settings.cartTokenHash)\n    };\n    if (designerSessionToken) {\n      requestHeaders['x-designer-session-token'] = designerSessionToken;\n    }\n    delete source._bg_pt_v4;\n    delete source._bg_pt_v5;\n    delete source._bg_project_id_v1;\n    delete source._bg_project_access_sig_v1;\n    delete source._bg_project_access_attestation_v1;\n    return fetch(CART_TRANSFORM_SIGN_URL, {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: requestHeaders,\n      body: JSON.stringify({\n        state: state,\n        contextId: expectedContextId,\n        cartTokenHash: text(settings.cartTokenHash)\n      })\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (body) {\n        if (\n          !response.ok\n          || !body\n          || body.ok !== true\n          || !body.signature\n          || (!text(body.priceTokenV5) && !text(body.priceTokenV4))\n          || (body.projectAccessRequired === true && (\n            !text(body.projectAccessProjectId)\n            || !/^[A-Za-z0-9_-]{43}$/.test(text(body.projectAccessSignature))\n            || !text(body.projectAccessAttestation)\n          ))\n        ) {\n          var signingError = new Error(text(body && body.error) || 'Cart pricing could not be verified.');\n          signingError.status = Number(response.status || 0) || 0;\n          signingError.payload = body;\n          throw signingError;\n        }\n        var signedState = body.state && typeof body.state === 'object'\n          ? body.state\n          : parseJson(body.stateJson, null);\n        if (!signedState || typeof signedState !== 'object' || Array.isArray(signedState)) {\n          throw new Error('Cart pricing state could not be verified.');\n        }\n        var responseContextId = text(body.contextId);\n        var responseContextVersion = text(body.contextVersion);\n        var requiresBoundContextEcho = Boolean(text(body.priceTokenV5));\n        if (\n          (requiresBoundContextEcho && (\n            responseContextId !== expectedContextId\n            || responseContextVersion !== expectedContextVersion\n          ))\n          || (responseContextId && responseContextId !== expectedContextId)\n          || (responseContextVersion && responseContextVersion !== expectedContextVersion)\n        ) {\n          throw new Error('Cart pricing context changed before it could be verified.');\n        }\n        var responseProjectId = text(body.projectAccessProjectId);\n        var responseProjectAccessSignature = text(body.projectAccessSignature);\n        var isBoundV5Response = Boolean(text(body.priceTokenV5));\n        if (\n          (isBoundV5Response && (body.projectAccessRequired === true) !== expectedProjectAccessRequired)\n          || (!isBoundV5Response && body.projectAccessRequired === true)\n        ) {\n          throw new Error('Project-bound cart access mode changed before it could be verified.');\n        }\n        if (body.projectAccessRequired === true) {\n          var responseAttestationParts = text(body.projectAccessAttestation).split('.');\n          if (\n            !expectedProjectReference\n            || expectedProjectReference.conflicted\n            || !/^shp_[A-Za-z0-9_-]{8,128}$/.test(responseProjectId)\n            || responseProjectId !== text(expectedProjectReference.projectId)\n            || responseAttestationParts.length !== 7\n            || responseProjectAccessSignature !== text(responseAttestationParts[6])\n          ) {\n            throw new Error('Project-bound cart identity changed before it could be verified.');\n          }\n        } else if (responseProjectId || responseProjectAccessSignature || text(body.projectAccessAttestation)) {\n          throw new Error('Cart pricing returned unexpected project access proof.');\n        }\n        source._bg_cart_transform_state_v1 = JSON.stringify(signedState);\n        if (text(signedState.baseVariantId)) source._bg_base_variant_id = text(signedState.baseVariantId);\n        if (text(signedState.finalSku)) source._bg_final_sku = text(signedState.finalSku);\n        if (text(signedState.cartQuantityMode)) source._bg_cart_quantity_mode = text(signedState.cartQuantityMode);\n        source._bg_cart_transform_sig_v1 = text(body.signature);\n        if (text(body.projectAccessAttestation)) {\n          source._bg_project_id_v1 = responseProjectId;\n          source._bg_project_access_sig_v1 = responseProjectAccessSignature;\n          source._bg_project_access_attestation_v1 = text(body.projectAccessAttestation);\n        }\n        if (text(body.priceTokenV5)) {\n          source._bg_pt_v5 = text(body.priceTokenV5);\n        } else if (text(body.priceTokenV4)) {\n          source._bg_pt_v4 = text(body.priceTokenV4);\n        }\n        return source;\n      });\n    });\n  }\n\n  function buildCommerceContextCacheKey(contextId, cartTokenHash) {\n    return text(contextId) + ':' + text(cartTokenHash);\n  }\n\n  // Write-through for every cached cartTokenHash variant of a context: a read\n  // after a context write must never serve the pre-write context or a cached\n  // miss, no matter which cartTokenHash the earlier read used.\n  function storeCommerceContextInCache(contextId, context) {\n    var lookup = text(contextId);\n    if (!lookup) return;\n    var fresh = Promise.resolve(context);\n    Object.keys(commerceContextCache).forEach(function (cacheKey) {\n      if (cacheKey.indexOf(lookup + ':') === 0) {\n        commerceContextCache[cacheKey] = fresh;\n      }\n    });\n    commerceContextCache[buildCommerceContextCacheKey(lookup, '')] = fresh;\n  }\n\n  function readCustomerReferenceCode() {\n    try {\n      var telemetry = window.BGDesignerTelemetry;\n      if (!telemetry || typeof telemetry.getSessionId !== 'function') return '';\n      var sessionId = text(telemetry.getSessionId()).replace(/[^A-Za-z0-9]/g, '');\n      return sessionId.length >= 6 ? sessionId.slice(-6).toUpperCase() : '';\n    } catch (_) {\n      return '';\n    }\n  }\n\n  // One plain message for every failed cart save or signing; `operation` is\n  // 'update' for a cart line edit or quantity change, anything else is an add.\n  function buildCartFailureMessage(operation) {\n    var message = operation === 'update'\n      ? 'We could not update this cart item. Please try again.'\n      : 'We could not add this item to your cart. Please try again.';\n    var referenceCode = readCustomerReferenceCode();\n    return message + (referenceCode ? ' Your reference code is ' + referenceCode + '.' : '');\n  }\n\n  // The customer sees only the plain message and reference code; the technical\n  // text rides serverError (120 characters) for telemetry, and the HTTP status\n  // and signer payload stay on the error for callers.\n  function toCustomerCartFailure(error, operation) {\n    var source = error || {};\n    var failure = new Error(buildCartFailureMessage(operation));\n    failure.status = Number(source.status || 0) || 0;\n    failure.referenceCode = readCustomerReferenceCode();\n    failure.serverError = text(source.serverError || source.message).slice(0, 120);\n    if (source.payload !== undefined) failure.payload = source.payload;\n    return failure;\n  }\n\n  function persistCommerceContextPayload(payload, options) {\n    if (!payload || typeof payload !== 'object') {\n      return Promise.reject(new Error('Commerce context payload is required.'));\n    }\n    var headers = {\n      accept: 'application/json',\n      'content-type': 'application/json'\n    };\n    var sessionToken = text(options && options.sessionToken);\n    if (sessionToken) {\n      // Guest carts rotate their Shopify cart token on the first add, so a\n      // later context write (quantity change, cart edit) can no longer match\n      // the write-once cart binding. The project session lets the worker\n      // defer that one guest shape to the API project-proof seal \u2014 the same\n      // adjudication the sign lane already trusts. The token stays in the\n      // header, never in the payload body.\n      headers['x-designer-session-token'] = sessionToken;\n    }\n    return fetch(COMMERCE_CONTEXT_URL, {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: headers,\n      body: JSON.stringify(payload)\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (body) {\n        if (!response.ok || !body || body.ok !== true || !body.contextId) {\n          var storageError = new Error('Commerce context storage failed.');\n          storageError.status = Number(response.status || 0) || 0;\n          storageError.serverError = text(body && body.error);\n          throw storageError;\n        }\n        var context = body.context || { contextId: body.contextId };\n        var topLevelContextId = text(body.contextId);\n        var nestedContextId = text(context && (context.contextId || context.id));\n        if (nestedContextId && nestedContextId !== topLevelContextId) {\n          throw new Error('Commerce context storage returned inconsistent identity.');\n        }\n        storeCommerceContextInCache(body.contextId || context.contextId || context.id, context);\n        return context;\n      });\n    }, function (networkError) {\n      var failure = new Error(text(networkError && networkError.message) || 'Commerce context storage is unreachable.');\n      failure.status = 0;\n      throw failure;\n    });\n  }\n\n  // ORDER-META-01: coarse browser + device classification for order\n  // analytics. Values are advisory metadata only \u2014 never inputs to pricing,\n  // signing, or context identity.\n  function readClientUserAgentAnalytics() {\n    try {\n      var nav = typeof window !== 'undefined' && window.navigator ? window.navigator : null;\n      var ua = text(nav && nav.userAgent);\n      if (!ua) return { device: '', browser: '' };\n      var device = 'desktop';\n      if (\n        /iPad/i.test(ua)\n        || (/Android/i.test(ua) && !/Mobile/i.test(ua))\n        || (/Macintosh/.test(ua) && nav && Number(nav.maxTouchPoints || 0) > 1)\n      ) {\n        device = 'tablet';\n      } else if (/Mobi|iPhone|iPod|Android/i.test(ua)) {\n        device = 'mobile';\n      }\n      var browser = 'other';\n      var match = null;\n      if ((match = ua.match(/Edg(?:e|A|iOS)?\\/(\\d+)/))) browser = 'edge ' + match[1];\n      else if ((match = ua.match(/SamsungBrowser\\/(\\d+)/))) browser = 'samsung ' + match[1];\n      else if ((match = ua.match(/OPR\\/(\\d+)/))) browser = 'opera ' + match[1];\n      else if ((match = ua.match(/(?:CriOS|Chrome)\\/(\\d+)/))) browser = 'chrome ' + match[1];\n      else if ((match = ua.match(/(?:FxiOS|Firefox)\\/(\\d+)/))) browser = 'firefox ' + match[1];\n      else if (/Safari\\//.test(ua) && (match = ua.match(/Version\\/(\\d+)/))) browser = 'safari ' + match[1];\n      return { device: device, browser: browser };\n    } catch (_) {\n      return { device: '', browser: '' };\n    }\n  }\n\n  // Stamped AFTER signing: the cart-transform signature binds its named\n  // security fields, so these hidden analytics properties ride the order\n  // line without touching the trusted-pricing corridor.\n  function applyOrderAnalyticsProperties(properties) {\n    var target = properties && typeof properties === 'object' ? properties : {};\n    var analytics = readClientUserAgentAnalytics();\n    if (analytics.device && !text(target._bg_ua_device)) target._bg_ua_device = analytics.device;\n    if (analytics.browser && !text(target._bg_ua_browser)) target._bg_ua_browser = analytics.browser;\n    return target;\n  }\n\n  function isNativeChannelOfferProperties(properties) {\n    var state = readDesignerStateFromProperties(properties || {});\n    var origin = normalizeChannelOfferOrigin(state && state.channelOffer);\n    return !!(origin && origin.mode === 'native' && origin.productId === text(state.productId)\n      && origin.variantId !== text(state.baseVariantId));\n  }\n\n  function isNativeChannelOfferLine(line) {\n    return !!(line && typeof line.sku === 'string' && /^BGCO_[a-f0-9]{32}$/.test(line.sku));\n  }\n\n  function prepareCommerceContextProperties(properties, options) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var state = readDesignerStateFromProperties(source);\n    var hasDesignerMarker = Boolean(text(source._bg_designer_version));\n    if (!hasDesignerMarker && (!state || !text(state.runtimeVersion))) {\n      return Promise.resolve(source);\n    }\n    var settings = options && typeof options === 'object' ? options : {};\n    var isAdd = !text(settings.lineKey) && !text(source._bg_update_line_key);\n    var failAsCustomerMessage = function (error) {\n      throw toCustomerCartFailure(error, isAdd ? 'add' : 'update');\n    };\n    if (!state || !text(source._bg_designer_version || state.runtimeVersion)) {\n      return Promise.reject(new Error('Designer cart state is invalid.')).catch(failAsCustomerMessage);\n    }\n    if (isAdd) {\n      // An add is a new cart line; a prior prepare's form ID is bound to another cart read.\n      source = Object.assign({}, source);\n      ['_bg_context_id', '_Context ID', 'Context ID', 'QPS Context ID', '_bg_context_version'].forEach(function (key) {\n        delete source[key];\n      });\n    }\n    var payload = buildCommerceContextPayload(source, options);\n    if (!payload) return Promise.reject(new Error('Commerce context payload is invalid.')).catch(failAsCustomerMessage);\n    var projectReference = readSelfHostedProjectReference(source);\n    var needsProjectSession = Boolean(\n      !text(settings.sessionToken)\n      && projectReference\n      && !projectReference.conflicted\n      && /^shp_[A-Za-z0-9_-]{8,128}$/.test(text(projectReference.projectId))\n    );\n    // Project-bound adds must sign with a project-scoped session or the\n    // signing seal rejects the line; resolve it up front (stored proof, or a\n    // fresh proof-headered mint when storage was clobbered) instead of\n    // letting the sign lane fall back to the page token.\n    var sessionResolution = needsProjectSession\n      ? resolveCommerceProjectSession(source).catch(function () { return null; })\n      : Promise.resolve(null);\n    return sessionResolution.then(function (projectSession) {\n      var signOptions = projectSession && text(projectSession.sessionToken)\n        ? Object.assign({}, settings, { sessionToken: text(projectSession.sessionToken) })\n        : options;\n      return persistCommerceContextPayload(payload, {\n        sessionToken: text(signOptions && signOptions.sessionToken)\n      }).then(function (context) {\n        var prepared = applyCommerceContextToProperties(source, context, state);\n        if (isNativeChannelOfferProperties(prepared)) {\n          ['_bg_cart_transform_state_v1', '_bg_cart_transform_sig_v1', '_bg_pt_v4', '_bg_pt_v5',\n            '_bg_project_id_v1', '_bg_project_access_sig_v1', '_bg_project_access_attestation_v1'].forEach(function (key) { delete prepared[key]; });\n          return prepared;\n        }\n        return signCartTransformProperties(prepared, signOptions);\n      }).then(applyOrderAnalyticsProperties);\n    }).catch(failAsCustomerMessage);\n  }\n\n  function isProjectBoundCommerceProperties(properties) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var reference = readSelfHostedProjectReference(source);\n    var projectId = text(reference && reference.projectId);\n    var contextId = readCommerceContextIdProperty(source);\n    var contextVersion = text(source._bg_context_version);\n    return /^shp_[A-Za-z0-9_-]{8,128}$/.test(projectId)\n      && /^ctx_[A-Za-z0-9_-]{8,96}$/.test(contextId)\n      && /^\\d{13}$/.test(contextVersion);\n  }\n\n  function readCommerceProjectStateCandidates(properties) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var states = [\n      parseJson(source._bg_designer_state_v1, null),\n      parseJson(source._bg_cart_transform_state_v1, null)\n    ];\n    var candidates = states.filter(function (state) {\n      return state && typeof state === 'object' && !Array.isArray(state);\n    }).map(function (state) {\n      var project = state.project && typeof state.project === 'object' ? state.project : {};\n      // Resume-restored states can carry the self-hosted-<id> publicId\n      // alias; commerce lanes require the canonical shp_ id.\n      return {\n        state: state,\n        projectId: text(project.projectId).replace(/^self-hosted-(?=shp_)/, '')\n      };\n    });\n    var directProjectId = text(source._bg_project_id_v1);\n    if (directProjectId) {\n      candidates.push({\n        state: null,\n        projectId: directProjectId,\n        securityBinding: true\n      });\n    }\n    return candidates;\n  }\n\n  function readSelfHostedProjectReference(properties) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var candidates = readCommerceProjectStateCandidates(source);\n    var selfHostedCandidates = candidates.filter(function (candidate) {\n      return candidate.projectId.indexOf('shp_') === 0;\n    });\n    if (!selfHostedCandidates.length) return null;\n    var uniqueProjectIds = [];\n    candidates.forEach(function (candidate) {\n      if (candidate.projectId && uniqueProjectIds.indexOf(candidate.projectId) === -1) {\n        uniqueProjectIds.push(candidate.projectId);\n      }\n    });\n    var conflicted = uniqueProjectIds.length > 1;\n    var referencedProjectId = selfHostedCandidates[0].projectId;\n    var matchingCandidates = selfHostedCandidates.filter(function (candidate) {\n      return candidate.projectId === referencedProjectId;\n    });\n    var selected = matchingCandidates.filter(function (candidate) {\n      return text(candidate.state && candidate.state.productId);\n    })[0] || matchingCandidates[0];\n    var state = selected && selected.state ? selected.state : {};\n    return {\n      projectId: conflicted ? '' : referencedProjectId,\n      referencedProjectId: referencedProjectId,\n      conflicted: conflicted,\n      productId: text(state && state.productId),\n      productHandle: text(state && (state.handle || state.sourceHandle)),\n      contextId: readCommerceContextIdProperty(source),\n      contextVersion: text(source._bg_context_version)\n    };\n  }\n\n  function hasSelfHostedProjectReference(properties) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    return Boolean(\n      readSelfHostedProjectReference(source)\n      || text(source._bg_project_access_sig_v1)\n      || text(source._bg_project_access_attestation_v1)\n    );\n  }\n\n  function requiresProjectAccessCheckoutRefresh(properties) {\n    var source = properties && typeof properties === 'object' ? properties : {};\n    var projectAccessAttestation = text(source._bg_project_access_attestation_v1);\n    var projectAccessSignature = text(source._bg_project_access_sig_v1);\n    return Boolean(projectAccessAttestation || projectAccessSignature)\n      || (hasSelfHostedProjectReference(source) && Boolean(text(source._bg_pt_v5)));\n  }\n\n  function readStoredJsonObject(storage, key) {\n    try {\n      var parsed = parseJson(storage && storage.getItem(key), null);\n      return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;\n    } catch (_) {\n      return null;\n    }\n  }\n\n  function readBootstrapProjectId(bootstrap) {\n    var source = bootstrap && typeof bootstrap === 'object' ? bootstrap : {};\n    var session = source.session && typeof source.session === 'object' ? source.session : {};\n    var launchContext = source.launchContext && typeof source.launchContext === 'object' ? source.launchContext : {};\n    return text(source.projectId || session.projectId || launchContext.projectId);\n  }\n\n  function readBootstrapProjectSession(bootstrap, projectId, sourceLabel) {\n    var source = bootstrap && typeof bootstrap === 'object' ? bootstrap : {};\n    var session = source.session && typeof source.session === 'object' ? source.session : {};\n    var bootstrapProjectId = readBootstrapProjectId(source);\n    var sessionToken = text(source.sessionToken || session.token);\n    if (!sessionToken || bootstrapProjectId !== projectId) return null;\n    return {\n      projectId: projectId,\n      sessionToken: sessionToken,\n      source: text(sourceLabel) || 'stored-bootstrap'\n    };\n  }\n\n  function readSessionTokenProjectClaim(token) {\n    var parts = text(token).split('.');\n    if (parts.length !== 3 || typeof window.atob !== 'function') {\n      return { parsed: false, projectId: '' };\n    }\n    try {\n      var normalized = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n      while (normalized.length % 4) normalized += '=';\n      var payload = JSON.parse(window.atob(normalized));\n      // Designer session tokens mint the payload as {version:'v1', claims:{...}},\n      // so the projectId claim lives one level down; flat payloads are the\n      // legacy shape.\n      var claims = payload && payload.claims && typeof payload.claims === 'object' && !Array.isArray(payload.claims)\n        ? payload.claims\n        : payload;\n      return { parsed: true, projectId: text(claims && claims.projectId) };\n    } catch (_) {\n      return { parsed: false, projectId: '' };\n    }\n  }\n\n  function sessionCandidateCarriesProject(candidate, projectId) {\n    if (!candidate) return false;\n    // The cart-signing project-proof seal requires the presented session's\n    // projectId claim to equal the line's project, so a token bound to a\n    // different (or no) project can never seal; skip it so a later source \u2014\n    // the guest claim proof or a fresh project-scoped mint \u2014 serves instead.\n    // Unparseable tokens pass through unchanged.\n    var claim = readSessionTokenProjectClaim(candidate.sessionToken);\n    if (!claim.parsed) return true;\n    return claim.projectId === projectId;\n  }\n\n  function readStoredGuestClaimProofToken(projectId) {\n    var sessionStorageRef = null;\n    try { sessionStorageRef = window.sessionStorage; } catch (_) {}\n    var guestProofs = readStoredJsonObject(sessionStorageRef, 'bg_designer_guest_claim_proofs_v1');\n    // Proofs are keyed by the canonical id; launches may reference the\n    // project through its self-hosted-<id> publicId alias.\n    var canonicalProjectId = text(projectId).replace(/^self-hosted-/, '');\n    var guestProof = (guestProofs && guestProofs[projectId] && typeof guestProofs[projectId] === 'object' && guestProofs[projectId])\n      || (guestProofs && guestProofs[canonicalProjectId] && typeof guestProofs[canonicalProjectId] === 'object' && guestProofs[canonicalProjectId])\n      || {};\n    return text(guestProof.token);\n  }\n\n  // The strongest locally stored credential able to read this project's\n  // record: the guest claim proof, else a project-scoped bootstrap session.\n  // Empty when this browser session holds nothing for the project \u2014 callers\n  // use that to skip protected reads entirely on cold loads.\n  // Every locally stored credential that might read this project's record,\n  // strongest first. Not all candidates are owner-scoped (a page prewarm\n  // bootstrap can echo the projectId without read rights), so record reads\n  // try them in order instead of trusting the first hit.\n  function readStoredProjectReadCredentialCandidates(projectId) {\n    var cleanProjectId = text(projectId);\n    if (!cleanProjectId) return [];\n    var candidates = [];\n    var guestProof = readStoredGuestClaimProofToken(cleanProjectId);\n    if (guestProof) candidates.push(guestProof);\n    var storedSession = readStoredCommerceProjectSession(cleanProjectId);\n    if (storedSession && text(storedSession.sessionToken)) candidates.push(text(storedSession.sessionToken));\n    var editorCacheToken = readEditorBootstrapCacheSessionToken(cleanProjectId);\n    if (editorCacheToken) candidates.push(editorCacheToken);\n    return candidates.filter(function (value, index) {\n      return candidates.indexOf(value) === index;\n    });\n  }\n\n  function readStoredProjectReadCredential(projectId) {\n    return text(readStoredProjectReadCredentialCandidates(projectId)[0]);\n  }\n\n  // The editor page caches its bootstrap (token included) in per-tab\n  // sessionStorage; a same-tab navigation return can present that session to\n  // read the project it just saved. Expired or foreign-project entries never\n  // match, and cold loads have no entries at all.\n  function readEditorBootstrapCacheSessionToken(projectId) {\n    var sessionStorageRef = null;\n    try { sessionStorageRef = window.sessionStorage; } catch (_) { return ''; }\n    if (!sessionStorageRef) return '';\n    try {\n      for (var index = 0; index < sessionStorageRef.length; index += 1) {\n        var key = sessionStorageRef.key(index) || '';\n        if (key.indexOf('bg-designer-v2-bootstrap:') !== 0) continue;\n        var parsed = null;\n        try { parsed = JSON.parse(sessionStorageRef.getItem(key) || ''); } catch (_) { continue; }\n        var bootstrap = parsed && parsed.bootstrap && typeof parsed.bootstrap === 'object' ? parsed.bootstrap : null;\n        if (!bootstrap || text(bootstrap.projectId) !== projectId) continue;\n        var tokenValue = text(bootstrap.sessionToken);\n        if (!tokenValue) continue;\n        var expiresAt = Date.parse(text(bootstrap.sessionExpiresAt) || '');\n        if (Number.isFinite(expiresAt) && expiresAt <= Date.now()) continue;\n        return tokenValue;\n      }\n    } catch (_) {}\n    return '';\n  }\n\n  function readStoredCommerceProjectSession(projectId) {\n    var cachedToken = text(commerceProjectSessionCache[projectId]);\n    if (cachedToken) {\n      var cached = { projectId: projectId, sessionToken: cachedToken, source: 'memory' };\n      if (sessionCandidateCarriesProject(cached, projectId)) return cached;\n    }\n    var current = readBootstrapProjectSession(window.BG_DESIGNER_BOOTSTRAP, projectId, 'page-bootstrap');\n    if (current && sessionCandidateCarriesProject(current, projectId)) return current;\n    var sessionStorageRef = null;\n    try { sessionStorageRef = window.sessionStorage; } catch (_) {}\n    var storedBootstrap = readStoredJsonObject(sessionStorageRef, 'bg_designer_bootstrap_v1');\n    var stored = readBootstrapProjectSession(storedBootstrap, projectId, 'stored-bootstrap');\n    if (stored && sessionCandidateCarriesProject(stored, projectId)) return stored;\n    var guestToken = readStoredGuestClaimProofToken(projectId);\n    if (guestToken) {\n      var guest = { projectId: projectId, sessionToken: guestToken, source: 'guest-claim-proof' };\n      if (sessionCandidateCarriesProject(guest, projectId)) return guest;\n    }\n    return null;\n  }\n\n  function fetchFreshCommerceProjectSession(reference) {\n    var projectId = text(reference && reference.projectId);\n    if (!/^shp_[A-Za-z0-9_-]{8,128}$/.test(projectId)) {\n      return Promise.reject(new Error('Project-bound cart access is incomplete.'));\n    }\n    var endpoint;\n    try {\n      endpoint = new URL(\n        text(window.BG_DESIGNER_BOOTSTRAP_ENDPOINT) || COMMERCE_PROJECT_BOOTSTRAP_URL,\n        window.location.origin\n      );\n      endpoint.searchParams.set('projectId', projectId);\n      if (text(reference && reference.productId)) endpoint.searchParams.set('productId', text(reference.productId));\n      if (text(reference && reference.productHandle)) endpoint.searchParams.set('productHandle', text(reference.productHandle));\n      endpoint.searchParams.set('bgStorefrontRuntime', 'designer-storefront-v1');\n    } catch (_) {\n      return Promise.reject(new Error('Project-bound cart access is unavailable.'));\n    }\n    var freshHeaders = {\n      accept: 'application/json',\n      'cache-control': 'no-cache',\n      pragma: 'no-cache'\n    };\n    var guestClaimToken = readStoredGuestClaimProofToken(projectId);\n    if (guestClaimToken) {\n      // Present the guest claim proof so the bootstrap lane can mint a\n      // project-scoped guest session instead of denying the projectId.\n      freshHeaders['x-designer-session-token'] = guestClaimToken;\n    }\n    return fetch(endpoint.toString(), {\n      credentials: 'same-origin',\n      cache: 'no-store',\n      headers: freshHeaders\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (body) {\n        var bootstrap = body && body.bootstrap && typeof body.bootstrap === 'object'\n          ? body.bootstrap\n          : null;\n        var resolved = readBootstrapProjectSession(bootstrap, projectId, 'bootstrap');\n        if (!response.ok || !body || body.ok !== true || !resolved) {\n          var error = new Error(text(body && body.error) || 'Project-bound cart access could not be refreshed.');\n          error.status = Number(response.status || 0) || 0;\n          throw error;\n        }\n        commerceProjectSessionCache[projectId] = resolved.sessionToken;\n        return resolved;\n      });\n    });\n  }\n\n  function resolveCommerceProjectSession(properties, options) {\n    var reference = readSelfHostedProjectReference(properties);\n    if (!reference || reference.conflicted || !/^shp_[A-Za-z0-9_-]{8,128}$/.test(reference.projectId)) {\n      return Promise.reject(new Error('Project-bound cart access is incomplete.'));\n    }\n    var forceFresh = Boolean(options && options.forceFresh);\n    var stored = forceFresh ? null : readStoredCommerceProjectSession(reference.projectId);\n    return stored ? Promise.resolve(stored) : fetchFreshCommerceProjectSession(reference);\n  }\n\n  function resignCommerceContextProperties(properties, options) {\n    var source = properties && typeof properties === 'object'\n      ? Object.assign({}, properties)\n      : {};\n    if (!isProjectBoundCommerceProperties(source)) {\n      return Promise.reject(new Error('Project-bound cart context is incomplete.'));\n    }\n    return signCartTransformProperties(source, options).then(function (signed) {\n      if (\n        !signed\n        || !text(signed._bg_pt_v5)\n        || !text(signed._bg_project_id_v1)\n        || !text(signed._bg_project_access_sig_v1)\n        || !text(signed._bg_project_access_attestation_v1)\n        || !isProjectBoundCommerceProperties(signed)\n      ) {\n        throw new Error('Project-bound cart access could not be refreshed.');\n      }\n      return signed;\n    });\n  }\n\n  function prepareCommerceContextFormData(formData, options) {\n    var properties = readFormDataProperties(formData);\n    var originalKeys = Object.keys(properties);\n    return prepareCommerceContextProperties(properties, options).then(function (nextProperties) {\n      originalKeys.forEach(function (key) {\n        deleteFormDataProperty(formData, key);\n      });\n      Object.keys(nextProperties).forEach(function (key) {\n        var value = text(nextProperties[key]);\n        if (!value) return;\n        setFormDataProperty(formData, key, value);\n      });\n      return nextProperties;\n    });\n  }\n\n  function readCommerceContextFullState(context) {\n    var payload = context && typeof context === 'object' ? context : {};\n    var properties = payload.properties && typeof payload.properties === 'object' ? payload.properties : {};\n    var fullState = properties.fullState && typeof properties.fullState === 'object' ? properties.fullState : null;\n    return fullState || null;\n  }\n\n  function fetchCommerceContext(contextId, options) {\n    var lookup = text(contextId);\n    if (!lookup) return Promise.resolve(null);\n    var settings = options && typeof options === 'object' ? options : {};\n    var cartTokenHash = text(settings.cartTokenHash);\n    var cacheKey = buildCommerceContextCacheKey(lookup, cartTokenHash);\n    if (commerceContextCache[cacheKey]) return commerceContextCache[cacheKey];\n    var requestUrl = COMMERCE_CONTEXT_URL + '/' + encodeURIComponent(lookup);\n    if (cartTokenHash) requestUrl += '?cartTokenHash=' + encodeURIComponent(cartTokenHash);\n    commerceContextCache[cacheKey] = fetch(requestUrl, {\n      method: 'GET',\n      credentials: 'same-origin',\n      headers: {\n        accept: 'application/json',\n        'x-qps-cart-token-hash': cartTokenHash\n      }\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (body) {\n        if (!response.ok || !body || body.ok !== true || !body.context) return null;\n        return body.context;\n      });\n    }).catch(function () {\n      return null;\n    });\n    return commerceContextCache[cacheKey];\n  }\n\n  function buildCartTransformMapEntry(state) {\n    if (normalizeChannelOfferOrigin(state && state.channelOffer)?.mode === 'native') return null;\n    var compactState = buildCartTransformState(state);\n    if (!text(compactState.baseVariantId) || !text(compactState.finalSku)) {\n      return null;\n    }\n    return compactState;\n  }\n\n  function collectCartTransformMapEntries(cart, options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var mode = text(settings.mode) || 'sync';\n    var targetLineKey = text(settings.lineKey);\n    var pendingState = settings.state && typeof settings.state === 'object' ? settings.state : null;\n    var pendingEntry = pendingState ? buildCartTransformMapEntry(pendingState) : null;\n    var items = cart && Array.isArray(cart.items) ? cart.items : [];\n    var entries = [];\n    var replaced = false;\n\n    if (mode === 'add' && pendingEntry) {\n      entries.push(pendingEntry);\n    }\n\n    items.forEach(function (item) {\n      if (isNativeChannelOfferLine(item)) return;\n      var itemKey = text(item && item.key);\n      if (targetLineKey && itemKey === targetLineKey) {\n        if (mode === 'remove') {\n          replaced = true;\n          return;\n        }\n        if (pendingEntry) {\n          entries.push(pendingEntry);\n          replaced = true;\n          return;\n        }\n      }\n      var itemState = readDesignerStateFromProperties(item && item.properties);\n      var itemEntry = itemState ? buildCartTransformMapEntry(itemState) : null;\n      if (itemEntry) {\n        entries.push(itemEntry);\n      }\n    });\n\n    if (mode !== 'add' && pendingEntry && !replaced) {\n      entries.push(pendingEntry);\n    }\n\n    return entries;\n  }\n\n  function buildCartTransformStateMapPayload(cart, options) {\n    return {\n      version: 'designer-storefront-cart-transform-map-v1',\n      updatedAt: new Date().toISOString(),\n      lines: collectCartTransformMapEntries(cart, options)\n    };\n  }\n\n  function updateCartAttributes(attributes) {\n    return fetch(getRootUrl() + 'cart/update.js', {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: {\n        'content-type': 'application/json',\n        accept: 'application/json'\n      },\n      body: JSON.stringify({\n        attributes: attributes && typeof attributes === 'object' ? attributes : {}\n      })\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (payload) {\n        if (!response.ok || !payload) {\n          throw new Error('Unable to update cart attributes.');\n        }\n        CART_STATE_PROMISE = null;\n        return payload;\n      });\n    });\n  }\n\n  function hasCartTransformStateMapAttributes(cart) {\n    var attributes = cart && cart.attributes && typeof cart.attributes === 'object' ? cart.attributes : {};\n    return !!(text(attributes[CART_TRANSFORM_STATE_MAP_KEY]) || text(attributes[LEGACY_CART_TRANSFORM_STATE_MAP_KEY]));\n  }\n\n  function clearCartTransformStateMapAttributes() {\n    return fetchCartState().then(function (cart) {\n      var nextAttributes = Object.assign({}, cart && cart.attributes && typeof cart.attributes === 'object' ? cart.attributes : {});\n      var hadCurrent = text(nextAttributes[CART_TRANSFORM_STATE_MAP_KEY]);\n      var hadLegacy = text(nextAttributes[LEGACY_CART_TRANSFORM_STATE_MAP_KEY]);\n      if (!hadCurrent && !hadLegacy) return cart;\n      nextAttributes[CART_TRANSFORM_STATE_MAP_KEY] = '';\n      nextAttributes[LEGACY_CART_TRANSFORM_STATE_MAP_KEY] = '';\n      return updateCartAttributes(nextAttributes);\n    });\n  }\n\n  function syncCartTransformStateMap(options) {\n    void options;\n    // The live cart transform now reads each line's compact state directly.\n    // Keeping a cart-level map creates stale cross-line metadata after removals\n    // and can conflict with other active checkout/cart rules.\n    return clearCartTransformStateMapAttributes();\n  }\n\n  function syncCartTransformStateMapForProperties(properties, options) {\n    void properties;\n    void options;\n    return clearCartTransformStateMapAttributes();\n  }\n\n  function syncCartTransformStateMapForRemoval(lineKey) {\n    void lineKey;\n    return clearCartTransformStateMapAttributes();\n  }\n\n  function fetchCartState(options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var forceFresh = settings.forceFresh === true || settings.noCache === true;\n    if (!forceFresh && CART_STATE_PROMISE) return CART_STATE_PROMISE;\n    var cartUrl = getRootUrl() + 'cart.js';\n    if (forceFresh) {\n      try {\n        var freshUrl = new URL(cartUrl, window.location.origin);\n        freshUrl.searchParams.set('_bg_cart_fresh', String(Date.now()));\n        cartUrl = freshUrl.toString();\n      } catch (_) {\n        cartUrl += (cartUrl.indexOf('?') === -1 ? '?' : '&') + '_bg_cart_fresh=' + encodeURIComponent(String(Date.now()));\n      }\n    }\n    var promise = fetch(cartUrl, {\n      credentials: 'same-origin',\n      cache: 'no-store',\n      headers: {\n        accept: 'application/json',\n        'cache-control': 'no-cache',\n        pragma: 'no-cache'\n      }\n    }).then(function (response) {\n      if (!response.ok) throw new Error('Unable to load the current cart.');\n      return response.json();\n    }).then(function (payload) {\n      if (!forceFresh) CART_STATE_PROMISE = null;\n      return payload;\n    }, function (error) {\n      if (!forceFresh) CART_STATE_PROMISE = null;\n      throw error;\n    });\n    if (!forceFresh) CART_STATE_PROMISE = promise;\n    return promise;\n  }\n\n  // A guest session has no durable cart until Shopify sets the `cart` cookie,\n  // and every cookieless /cart.js read mints a DIFFERENT transient token, so a\n  // commerce context created from one read can never match the hash a later\n  // prepare presents and the add fails closed before /cart/add ever runs (the\n  // pre-first-add flavor of guest cart-token rotation; the post-add flavor is\n  // the project-proof seal deferral). One empty /cart/update.js materializes\n  // the cart and pins its token, so every hash bound into a commerce context\n  // survives the whole prepare -> sign -> add corridor.\n  function hasDurableCartCookie() {\n    try {\n      var jar = String((window.document && window.document.cookie) || '');\n      var parts = jar.split(';');\n      for (var index = 0; index < parts.length; index += 1) {\n        var separator = parts[index].indexOf('=');\n        if (\n          separator > 0\n          && parts[index].slice(0, separator).trim() === 'cart'\n          && parts[index].slice(separator + 1).trim()\n        ) return true;\n      }\n    } catch (_) {\n      // Cookie access can throw in sandboxed frames; the materializing lane\n      // below is safe to repeat, so fail toward it.\n    }\n    return false;\n  }\n\n  function resolveDurableCartTokenHash() {\n    var materialized = hasDurableCartCookie()\n      ? Promise.resolve(null)\n      : fetch(getRootUrl() + 'cart/update.js', {\n        method: 'POST',\n        credentials: 'same-origin',\n        headers: {\n          'content-type': 'application/json',\n          accept: 'application/json'\n        },\n        body: JSON.stringify({ updates: {} })\n      }).catch(function () {\n        // Materialization is best-effort: fall back to the previous\n        // fresh-read behavior instead of blocking the add outright.\n        return null;\n      });\n    return materialized.then(function () {\n      return fetchCartState({ forceFresh: true });\n    }).then(function (cart) {\n      return hashCartToken(cart && cart.token);\n    });\n  }\n\n  function findLineByKey(cart, lineKey) {\n    var cleanKey = text(lineKey);\n    var items = cart && Array.isArray(cart.items) ? cart.items : [];\n    for (var index = 0; index < items.length; index += 1) {\n      if (text(items[index] && items[index].key) === cleanKey) return items[index];\n    }\n    return null;\n  }\n\n  // The one fingerprint of a cart line (#461 artwork flow): key, variant,\n  // quantity and properties exactly as the cart returns them.\n  function cartLineFingerprint(line) {\n    if (!line) return '';\n    return JSON.stringify([text(line.key), text(line.variant_id || line.id), Number(line.quantity), line.properties || {}]);\n  }\n  async function readCartLineFingerprint(lineKey) {\n    var cart = await fetchCartState({ forceFresh: true });\n    return cartLineFingerprint(findLineByKey(cart, lineKey));\n  }\n  // SALE-DISPLAY-PER-UNIT-ROUNDING fix round 1 (Astra 1, review of #690): the ONE\n  // rule for the Shopify quantity an update of a designer cart line submits. A\n  // channel package (the edited state names a channel offer, or the line is a\n  // native offer variant) keeps the sets the line holds; every other line, and\n  // a new add (no line), is submitted at 1. The product page's line totals read\n  // the same rule (runtime getRetainedSetCount).\n  function resolveDesignerLineSubmitQuantity(state, originalLine) {\n    var channel = normalizeChannelOfferOrigin(state && state.channelOffer);\n    return channel || isNativeChannelOfferLine(originalLine)\n      ? Math.max(1, Number(originalLine && originalLine.quantity) || 1)\n      : 1;\n  }\n  var CART_LINE_CHANGED_ELSEWHERE = 'This cart item changed in another tab. Review your cart and try again.';\n  var RELOAD_TO_UPDATE = 'Please reload the page and try again.';\n  async function updateDesignerCartLine(lineKey, variantId, properties, options) {\n    var cart = await fetchCartState({ forceFresh: true });\n    var original = findLineByKey(cart, lineKey);\n    var targetId = text(variantId);\n    if (!/^\\d+$/.test(targetId) || !original) throw new Error('This cart item changed. Reopen it from your cart.');\n    // Another tab may have changed the line since the caller read it: compare\n    // this fresh read with the caller's fingerprint before any write.\n    var expected = options && options.expectedFingerprint;\n    if (expected && cartLineFingerprint(original) !== expected) throw new Error(CART_LINE_CHANGED_ELSEWHERE);\n    // The caller decides last (ARTWORK-FLOW-3), once, immediately before the\n    // actual mutation (the /cart/change POST or the replacement add), after\n    // every awaited preparation including the attribute cleanup: anything but an\n    // explicit ok (or a throw) writes nothing.\n    var beforeWrite = options && typeof options.beforeMutation === 'function' ? function () {\n      var allowed = options.beforeMutation();\n      if (!(allowed === true || (allowed && typeof allowed === 'object' && allowed.ok === true))) {\n        throw new Error(String((allowed && allowed.message) || 'This cart item was not updated.'));\n      }\n      return true;\n    } : null;\n    var state = readDesignerStateFromProperties(properties || {});\n    var channel = normalizeChannelOfferOrigin(state && state.channelOffer);\n    var quantity = resolveDesignerLineSubmitQuantity(state, original);\n    if (text(original.variant_id || original.id) === targetId) return changeCartLine(lineKey, quantity, properties, beforeWrite);\n    // Only channel edits replace merchandise. A normal calculator edit must\n    // not silently move an unrelated cart line to another product/variant.\n    if (!channel || text(original.product_id) !== text(state.productId)) throw new Error('This cart item does not match the selected offer.');\n    var replacementProperties = Object.assign({}, properties, { _bg_replacement_for: text(lineKey) });\n    var replacement = (cart.items || []).find(function (line) {\n      return text(line.variant_id || line.id) === targetId && text((line.properties || {})._bg_replacement_for) === text(lineKey);\n    });\n    if (replacement) {\n      if (readCommerceContextIdProperty(replacement.properties) !== readCommerceContextIdProperty(properties)) {\n        throw new Error('A previous update needs review. Open your cart before trying again.');\n      }\n      await changeCartLine(replacement.key, quantity, replacementProperties, beforeWrite);\n    } else {\n      // An older add-once owner kept on this tab cannot ask at send time, and an\n      // earlier ask is not enough: a guarded replacement is refused (nothing is\n      // sent through it; its journals and in-flight work stay as they are).\n      if (beforeWrite && !window.BGCartAddOnce.acceptsSendGuard) throw new Error(RELOAD_TO_UPDATE);\n      var outcome = await window.BGCartAddOnce.runAdd({ config: { method: 'POST', credentials: 'same-origin',\n        headers: { 'content-type': 'application/json', accept: 'application/json' },\n        body: JSON.stringify({ items: [{ id: targetId, quantity: quantity, properties: replacementProperties }] }) },\n        sendGuard: beforeWrite ? function () {\n          try { return beforeWrite() ? { ok: true } : { ok: false }; } catch (error) { return { ok: false, reason: 'before-mutation', message: error && error.message }; }\n        } : null,\n        // A guarded replacement goes only into the existing cart: if the cart\n        // cookie is gone, the owner refuses before creating a cart (RCARTADD10).\n        existingCartOnly: !!beforeWrite });\n      if (outcome.state === 'rejected' && (outcome.blockedBy === 'guard' || outcome.blockedBy === 'no-cart')) throw new Error(outcome.message);\n      if (outcome.state !== 'handoff') throw new Error('We could not add the updated package. Your original item is still in your cart.');\n    }\n    CART_STATE_PROMISE = null;\n    var verifiedCart = await fetchCartState({ forceFresh: true });\n    var currentOriginal = findLineByKey(verifiedCart, lineKey);\n    if (!currentOriginal || Number(currentOriginal.quantity) !== Number(original.quantity)\n      || text(currentOriginal.variant_id || currentOriginal.id) !== text(original.variant_id || original.id)) {\n      throw new Error('The original item changed during this update. Open your cart to review both items.');\n    }\n    var verified = (verifiedCart.items || []).filter(function (line) {\n      return text(line.variant_id || line.id) === targetId && text((line.properties || {})._bg_replacement_for) === text(lineKey)\n        && readCommerceContextIdProperty(line.properties) === readCommerceContextIdProperty(properties)\n        && Number(line.quantity) === quantity;\n    });\n    if (verified.length !== 1) throw new Error('Your cart update needs review. Open your cart to check the items.');\n    try {\n      var updated = await changeCartLine(lineKey, 0, {});\n      if (findLineByKey(updated, lineKey)) throw new Error('Original item remains');\n      if (outcome && !await window.BGCartAddOnce.verifyReplacementRemoval(outcome.opId, text(lineKey))) throw new Error('Original item removal needs review');\n      return updated;\n    } catch (_) {\n      // Never delete a potentially merged or already-used replacement as a\n      // compensating action. A retry recognizes our exact replacement marker.\n      throw new Error('The updated package was added, but the original could not be removed. Open your cart to review both items.');\n    }\n  }\n\n  // beforeWrite (optional, internal): asked right before the POST with no await\n  // between; a throw posts nothing. With it, the preparation only reads, and the\n  // cart-transform map cleanup is written only after the line write succeeded.\n  function changeCartLine(lineKey, quantity, properties, beforeWrite) {\n    var request = function () {\n      if (typeof beforeWrite === 'function') beforeWrite();\n      return fetch(getRootUrl() + 'cart/change.js', {\n        method: 'POST',\n        credentials: 'same-origin',\n        headers: {\n          'content-type': 'application/json',\n          accept: 'application/json'\n        },\n        body: JSON.stringify({\n          id: text(lineKey),\n          quantity: Math.max(0, numberValue(quantity, 1) || 0),\n          properties: properties && typeof properties === 'object' ? properties : {}\n        })\n      }).then(function (response) {\n        return response.json().catch(function () { return null; }).then(function (payload) {\n          if (!response.ok || !payload) {\n            throw new Error('Unable to update the cart line.');\n          }\n          CART_STATE_PROMISE = null;\n          return payload;\n        });\n      });\n    };\n    var state = readDesignerStateFromProperties(properties);\n    if (typeof beforeWrite === 'function') {\n      if (!state) return Promise.resolve().then(request);\n      return fetchCartState().then(hasCartTransformStateMapAttributes, function () { return true; }).then(function (cleanup) {\n        return request().then(function (payload) {\n          if (!cleanup) return payload;\n          return clearCartTransformStateMapAttributes().catch(function () { return null; }).then(function () { return payload; });\n        });\n      });\n    }\n    if (!state) return request();\n    return syncCartTransformStateMap({\n      mode: Math.max(0, numberValue(quantity, 1) || 0) === 0 ? 'remove' : 'update',\n      lineKey: lineKey,\n      state: state\n    }).catch(function () {\n      return null;\n    }).then(request);\n  }\n\n  function fetchProjectRecord(config, projectId) {\n    var cleanProjectId = text(projectId);\n    if (!cleanProjectId) return Promise.resolve(null);\n    // A guest-owned project is readable only with an owner-scoped session\n    // proof. Some stored candidates (page prewarm bootstraps) echo the\n    // projectId without read rights, so try each stored credential in order\n    // and keep the first record that resolves.\n    var credentials = readStoredProjectReadCredentialCandidates(cleanProjectId);\n    if (!credentials.length) credentials = [''];\n    var requestRecord = function (credentialIndex) {\n      var recordHeaders = { accept: 'application/json' };\n      if (credentials[credentialIndex]) recordHeaders['x-designer-session-token'] = credentials[credentialIndex];\n      return fetch(getProjectsUrl(config) + '/' + encodeURIComponent(cleanProjectId), {\n        credentials: 'same-origin',\n        headers: recordHeaders\n      }).then(function (response) {\n        if (!response.ok) return null;\n        return response.json().catch(function () { return null; });\n      }).then(function (payload) {\n        var project = payload && payload.project && typeof payload.project === 'object' ? payload.project : null;\n        if (project) return project;\n        var nextIndex = credentialIndex + 1;\n        return nextIndex < credentials.length ? requestRecord(nextIndex) : null;\n      });\n    };\n    return requestRecord(0).catch(function () {\n      return null;\n    });\n  }\n\n  function fetchProjectCompletionEligibility(config, payload, options) {\n    var requestPayload = payload && typeof payload === 'object' ? deepClone(payload, {}) : {};\n    var sessionToken = text(options && options.sessionToken) || getDesignerSessionTokenFromPage();\n    var headers = {\n      accept: 'application/json',\n      'content-type': 'application/json'\n    };\n    if (sessionToken) {\n      headers['x-designer-session-token'] = sessionToken;\n    }\n    return fetch(getDesignerProxyRoot(config) + '/projects/completion-eligibility', {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: headers,\n      body: JSON.stringify(requestPayload)\n    }).then(function (response) {\n      return response.json().catch(function () { return null; }).then(function (body) {\n        if (!response.ok || !body || body.ok !== true || !body.completionEligibility || typeof body.completionEligibility !== 'object') {\n          var error = new Error(text(body && body.error) || 'Unable to verify print readiness.');\n          error.status = Number(response.status || 0) || 0;\n          error.payload = body;\n          throw error;\n        }\n        return body.completionEligibility;\n      });\n    });\n  }\n\n  // EDITOR-LANES-EMPTY-SAVE-01: the purchase gate needs the truth about\n  // artwork, and that truth is the saved document, never the project id. A\n  // board background fill lives on the board (not in objects) and does not\n  // count; hidden objects and reference-only objects are not printed and do\n  // not count either, and neither does an UNFILLED image slot (a shape/path\n  // placeholder carrying metadata.imageSlot: editor-only presentation that the\n  // render service prints as nothing; a FILLED slot is an image object and\n  // counts). Same eligibility as the render service's getRenderableBoardObjects.\n  // Returns true / false from a document with boards, and null when the record\n  // carries no document (unknown, never \"empty\").\n  function isEmptyImageSlotObject(object) {\n    var metadata = object && object.metadata && typeof object.metadata === 'object' ? object.metadata : {};\n    var slot = metadata.imageSlot && typeof metadata.imageSlot === 'object' ? metadata.imageSlot : null;\n    if (!slot || slot.enabled !== true) return false;\n    return text(object.type).toLowerCase() !== 'image';\n  }\n\n  function isPrintableArtworkObject(object) {\n    if (!object || typeof object !== 'object') return false;\n    if (object.visible === false || object.isReference === true) return false;\n    return !isEmptyImageSlotObject(object);\n  }\n\n  function readProjectArtworkPresence(project) {\n    var documentValue = project && project.document && typeof project.document === 'object' ? project.document : null;\n    var boards = documentValue && Array.isArray(documentValue.boards) ? documentValue.boards : null;\n    if (!boards) return null;\n    return boards.some(function (board) {\n      var objects = board && Array.isArray(board.objects) ? board.objects : [];\n      return objects.some(isPrintableArtworkObject);\n    });\n  }\n\n  function fetchProjectPreview(config, projectId) {\n    return fetchProjectRecord(config, projectId).then(function (project) {\n      if (!project) return null;\n      var previews = collectProjectPreviewUrls(project);\n      return {\n        projectId: text(project.id || project.projectId || projectId),\n        hasArtwork: readProjectArtworkPresence(project),\n        designId: text(project.designId),\n        designNumber: text(project.designNumber),\n        title: text(project.title || project.name || project.designTitle || (project.document && project.document.title)),\n        updatedAt: text(project.updatedAt || project.lastEditedAt || project.modifiedAt),\n        documentOrientation: readProjectDocumentOrientation(project),\n        revision: Number(project.revision) || 0,\n        boardPreviews: collectProjectBoardPreviews(project),\n        previewUrl: text(previews[0]),\n        previews: previews,\n        // 3D preview Slice 7: server-computed product-mockup poster. Present\n        // ONLY while the api judges it current for this design; absent means\n        // the consumer keeps the ordinary 2D preview. Signed URLs expire, so\n        // callers must never persist this field.\n        mockupPoster: readProjectMockupPoster(project),\n        numPages: Number(numberValue(project.numPages || project.pages || project.pageCount || project.pageLength, 0) || 0)\n      };\n    });\n  }\n\n  function readProjectDocumentOrientation(project) {\n    var boards = project && project.document && project.document.boards;\n    var board = Array.isArray(boards) ? boards[0] : null;\n    var width = Number(board && board.width);\n    var height = Number(board && board.height);\n    if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(height) || height <= 0) return '';\n    if (Math.abs(width - height) < 0.0001) return 'square';\n    return width > height ? 'landscape' : 'portrait';\n  }\n\n  function readProjectMockupPoster(project) {\n    var poster = project && project.mockupPoster && typeof project.mockupPoster === 'object' ? project.mockupPoster : null;\n    var url = text(poster && poster.url);\n    if (!url) return null;\n    return {\n      url: url,\n      width: Number(numberValue(poster.width, 0) || 0),\n      height: Number(numberValue(poster.height, 0) || 0),\n      fingerprint: text(poster.fingerprint)\n    };\n  }\n\n  function ensurePreviewLightbox() {\n    var existing = document.getElementById(LIGHTBOX_ID);\n    if (existing) return existing;\n\n    var lightbox = document.createElement('div');\n    lightbox.id = LIGHTBOX_ID;\n    lightbox.className = 'bg-designer-preview-lightbox';\n    lightbox.setAttribute('aria-hidden', 'true');\n    lightbox.innerHTML = '' +\n      '<div class=\"bg-designer-preview-lightbox__panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Design preview\">' +\n        '<button type=\"button\" class=\"bg-designer-preview-lightbox__dismiss\" data-bg-designer-preview-dismiss aria-label=\"Close preview\">Close</button>' +\n        '<div class=\"bg-designer-preview-lightbox__frame\">' +\n          '<img class=\"bg-designer-preview-lightbox__image\" data-bg-designer-preview-image alt=\"\">' +\n        '</div>' +\n      '</div>';\n    document.body.appendChild(lightbox);\n\n    lightbox.addEventListener('click', function (event) {\n      if (event.target === lightbox) {\n        closePreviewLightbox();\n      }\n    });\n    var dismiss = lightbox.querySelector('[data-bg-designer-preview-dismiss]');\n    if (dismiss) {\n      dismiss.addEventListener('click', closePreviewLightbox);\n    }\n    document.addEventListener('keydown', function (event) {\n      if (event.key === 'Escape' && lightbox.classList.contains('is-open')) {\n        closePreviewLightbox();\n      }\n    });\n    return lightbox;\n  }\n\n  function openPreviewLightbox(previewUrl, title) {\n    var cleanUrl = text(previewUrl);\n    if (!cleanUrl) return false;\n    var lightbox = ensurePreviewLightbox();\n    var image = lightbox.querySelector('[data-bg-designer-preview-image]');\n    if (!image) return false;\n    image.src = cleanUrl;\n    image.alt = text(title) ? ('Preview image for ' + title) : 'Preview image';\n    lightbox.classList.add('is-open');\n    lightbox.setAttribute('aria-hidden', 'false');\n    document.body.classList.add('bg-designer-preview-lightbox--open');\n    return true;\n  }\n\n  function closePreviewLightbox() {\n    var lightbox = document.getElementById(LIGHTBOX_ID);\n    if (!lightbox) return false;\n    lightbox.classList.remove('is-open');\n    lightbox.setAttribute('aria-hidden', 'true');\n    var image = lightbox.querySelector('[data-bg-designer-preview-image]');\n    if (image) {\n      image.removeAttribute('src');\n      image.alt = '';\n    }\n    document.body.classList.remove('bg-designer-preview-lightbox--open');\n    return true;\n  }\n\n  function isAllowedOrigin(origin) {\n    try {\n      if (window.BGDesignerIsAllowedOrigin && typeof window.BGDesignerIsAllowedOrigin === 'function') {\n        return window.BGDesignerIsAllowedOrigin(origin);\n      }\n    } catch (_) {}\n    return text(origin) === window.location.origin;\n  }\n\n  // Phone-class devices must open the editor as a FULL-PAGE navigation, not\n  // the overlay iframe: inside an iframe the editor cannot see the on-screen\n  // keyboard \u2014 the viewport meta (interactive-widget/viewport-fit), the\n  // visualViewport keyboard shrink, and safe-area env() all belong to the TOP\n  // document, and iOS pans the top page on input focus where the embedded\n  // shell cannot counter it \u2014 so the mobile keyboard/format-bar behavior is\n  // only correct top-level. Same standards signals as the editor's own\n  // mobile-shell gate (touch + coarse pointer + not hybrid + width <= 860).\n  function isTouchEditingShellViewport() {\n    try {\n      if (!window.matchMedia) return false;\n      var hasCoarsePointer = window.matchMedia('(any-pointer: coarse)').matches;\n      var hasFinePointer = window.matchMedia('(any-pointer: fine)').matches;\n      var hasTouch = Number(window.navigator && window.navigator.maxTouchPoints || 0) > 0 || hasCoarsePointer;\n      var isHybridDevice = hasCoarsePointer && hasFinePointer;\n      var width = window.innerWidth || (document.documentElement && document.documentElement.clientWidth) || 0;\n      return hasTouch && hasCoarsePointer && !isHybridDevice && width > 0 && width <= 860;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  function createEditorShell(options) {\n    var settings = options && typeof options === 'object' ? options : {};\n    var config = settings.config || {};\n    var overlayId = text(settings.overlayId) || ('bg-designer-editor-shell-' + buildStableCacheKey(JSON.stringify({\n      handle: config.handle,\n      source: settings.source\n    })));\n    var activeContext = null;\n    var activeLaunchUrl = '';\n    var shellDocumentWarmUrl = '';\n    var shellDocumentWarmPromise = null;\n    var shellDocumentWarmResolver = null;\n    var shellDocumentWarmTimer = 0;\n    var loadingRevealWatchdogTimer = 0;\n\n    function ensureOverlay() {\n      var existing = document.getElementById(overlayId);\n      if (existing) return existing;\n\n      var overlay = document.createElement('div');\n      overlay.id = overlayId;\n      overlay.className = 'bg-designer-editor-shell';\n      overlay.setAttribute('aria-hidden', 'true');\n      overlay.innerHTML = '' +\n        '<div class=\"bg-designer-editor-shell__backdrop\" data-bg-designer-shell-close></div>' +\n        '<div class=\"bg-designer-editor-shell__panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Designer\">' +\n          '<div class=\"bg-designer-editor-shell__loading\" data-bg-designer-shell-loading>' +\n            '<div class=\"bg-designer-editor-shell__loading-card\">' +\n              '<div class=\"bg-designer-editor-shell__spinner\" aria-hidden=\"true\"></div>' +\n              '<p class=\"bg-designer-editor-shell__loading-copy\">' + escapeHtml(text(settings.loadingCopy) || 'Loading designer\u2026') + '</p>' +\n            '</div>' +\n          '</div>' +\n          '<iframe class=\"bg-designer-editor-shell__frame\" data-bg-designer-shell-frame title=\"Designer\" loading=\"eager\" allow=\"clipboard-read; clipboard-write\"></iframe>' +\n        '</div>';\n      document.body.appendChild(overlay);\n\n      overlay.addEventListener('click', function (event) {\n        if (event.target && event.target.getAttribute('data-bg-designer-shell-close') !== null) {\n          close();\n        }\n      });\n      document.addEventListener('keydown', function (event) {\n        if (event.key === 'Escape' && overlay.classList.contains('is-open')) {\n          close();\n        }\n      });\n      return overlay;\n    }\n\n    function postCachedPayloadToFrame(payload) {\n      var frame = getFrame();\n      var cleanPayload = payload && typeof payload === 'object' ? payload : null;\n      if (!frame || !frame.contentWindow || !cleanPayload || !cleanPayload.bootstrap) return false;\n      try {\n        frame.contentWindow.postMessage({\n          type: 'storefront:swap-context',\n          payload: cleanPayload\n        }, '*');\n        frame.dataset.bgContextPushed = '1';\n        return true;\n      } catch (_) {\n        return false;\n      }\n    }\n\n    function getFrame() {\n      var overlay = ensureOverlay();\n      return overlay.querySelector('[data-bg-designer-shell-frame]');\n    }\n\n    function setLoadingVisible(visible) {\n      var overlay = ensureOverlay();\n      var loading = overlay.querySelector('[data-bg-designer-shell-loading]');\n      if (!loading) return;\n      if (loadingRevealWatchdogTimer) {\n        window.clearTimeout(loadingRevealWatchdogTimer);\n        loadingRevealWatchdogTimer = 0;\n      }\n      if (visible) {\n        // Force-reveal if no identity-matching ready message ever arrives:\n        // the opaque scrim must never strand the customer.\n        loadingRevealWatchdogTimer = window.setTimeout(function () {\n          loadingRevealWatchdogTimer = 0;\n          setLoadingVisible(false);\n        }, EDITOR_SHELL_LOADING_WATCHDOG_MS);\n      }\n      loading.hidden = !visible;\n      overlay.classList.toggle('is-loading', !!visible);\n    }\n\n    function resolveShellDocumentWarm(value) {\n      if (shellDocumentWarmTimer) {\n        window.clearTimeout(shellDocumentWarmTimer);\n        shellDocumentWarmTimer = 0;\n      }\n      if (typeof shellDocumentWarmResolver === 'function') {\n        shellDocumentWarmResolver(Boolean(value));\n      }\n      shellDocumentWarmResolver = null;\n      shellDocumentWarmPromise = null;\n    }\n\n    function prewarmDocument(context) {\n      // Phones navigate top-level (see open) \u2014 never boot a hidden iframe\n      // editor they will not use.\n      if (isTouchEditingShellViewport()) return Promise.resolve(false);\n      var overlay = ensureOverlay();\n      var frame = getFrame();\n      // BD-B20: the owner passes the page's current launch context so the\n      // warmed editor boots with a selection the server accepts, built the\n      // same way open() builds a launch URL (a matching launch reuses it).\n      var warmUrl = buildEditorUrl(config, context && typeof context === 'object'\n        ? Object.assign({}, context, { source: text(settings.source) || 'product' })\n        : {\n          source: text(settings.source) || 'product',\n          productHandle: config && config.handle,\n          productId: config && config.productId,\n          runtimeVersion: config && config.runtimeVersion\n        });\n      if (!frame || !warmUrl) return Promise.resolve(false);\n      // Never clobber a real launch. This idle warm force-closes the overlay\n      // and re-points the iframe at its warm URL; when a\n      // customer clicked a launch control inside the post-boot idle window\n      // (0.9-2.2s), that overwrote the in-flight launch navigation and\n      // minted a bindingless session (the fast-click launch race). Once the\n      // overlay is open, a launch promise is in flight, or open() has\n      // recorded a launch URL, the warm stands down for this page view.\n      if (\n        overlay.classList.contains('is-open')\n        || SHELL_PROMISES[overlayId]\n        || text(activeLaunchUrl)\n      ) {\n        return Promise.resolve(false);\n      }\n      if (\n        frame.contentWindow\n        && frame.dataset.bgShellReady === '1'\n        && text(frame.dataset.bgFrameUrl) === warmUrl\n      ) {\n        shellDocumentWarmUrl = warmUrl;\n        return Promise.resolve(true);\n      }\n      if (shellDocumentWarmPromise && shellDocumentWarmUrl === warmUrl) {\n        return shellDocumentWarmPromise;\n      }\n      shellDocumentWarmUrl = warmUrl;\n      frame.dataset.bgFrameUrl = warmUrl;\n      frame.dataset.bgBootstrapCacheKey = getBootstrapCacheKeyForLaunchUrl(config, warmUrl);\n      // A launch with this exact context reuses the ready warmed frame at\n      // once; the editor does not re-announce ready for the same payload.\n      frame.dataset.bgContextIdentity = context && typeof context === 'object'\n        ? buildEditorLaunchIdentity(config, context, warmUrl)\n        : '';\n      frame.dataset.bgContextPushed = '';\n      frame.dataset.bgShellReady = '';\n      overlay.setAttribute('aria-hidden', 'true');\n      overlay.classList.remove('is-open');\n      document.body.classList.remove('bg-designer-editor-shell--open');\n      setLoadingVisible(false);\n      shellDocumentWarmPromise = new Promise(function (resolve) {\n        shellDocumentWarmResolver = resolve;\n        shellDocumentWarmTimer = window.setTimeout(function () {\n          // A warm that never became ready (rate limit, server or network\n          // error) must not hold a matching launch behind the scrim: drop its\n          // labels and document so the launch loads the editor fresh.\n          if (frame.dataset.bgShellReady !== '1' && !text(activeLaunchUrl)) {\n            frame.dataset.bgContextIdentity = '';\n            frame.dataset.bgFrameUrl = '';\n            frame.removeAttribute('src');\n          }\n          resolveShellDocumentWarm(false);\n        }, 12000);\n      });\n      if (text(frame.getAttribute('src')) !== warmUrl) {\n        frame.src = warmUrl;\n      } else if (frame.contentWindow) {\n        window.setTimeout(function () {\n          if (frame.dataset.bgShellReady === '1') {\n            resolveShellDocumentWarm(true);\n          }\n        }, 0);\n      }\n      return shellDocumentWarmPromise;\n    }\n\n    function refreshBootstrap(detail) {\n      if (!activeLaunchUrl) return Promise.resolve(false);\n      var frame = getFrame();\n      var currentCacheKey = text(frame && frame.dataset.bgBootstrapCacheKey);\n      var nextLaunchUrl = buildUpdatedLaunchUrl(config, activeLaunchUrl, detail);\n      var nextCacheKey = getBootstrapCacheKeyForLaunchUrl(config, nextLaunchUrl);\n      if (currentCacheKey) deleteCachedBootstrap(currentCacheKey);\n      if (nextCacheKey && nextCacheKey !== currentCacheKey) deleteCachedBootstrap(nextCacheKey);\n      activeLaunchUrl = nextLaunchUrl || activeLaunchUrl;\n      if (frame) {\n        if (nextCacheKey) {\n          frame.dataset.bgBootstrapCacheKey = nextCacheKey;\n        } else {\n          delete frame.dataset.bgBootstrapCacheKey;\n        }\n        if (activeLaunchUrl) frame.dataset.bgFrameUrl = activeLaunchUrl;\n        frame.dataset.bgContextPushed = '';\n        if (activeContext) {\n          frame.dataset.bgContextIdentity = buildEditorLaunchIdentity(config, activeContext, activeLaunchUrl);\n        }\n      }\n      return Promise.resolve(true);\n    }\n\n    function open(context) {\n      var nextContext = deepClone(context, {});\n      var nextLaunchUrl = buildEditorUrl(config, Object.assign({}, nextContext, {\n        source: text(settings.source) || 'product'\n      }));\n      if (!nextLaunchUrl) return Promise.resolve(false);\n      if (isTouchEditingShellViewport()) {\n        // The launch URL is fully self-sufficient (project/template/size/\n        // sides context all ride it) and the editor's close/approve flow\n        // navigates back to the product page on its own when no parent\n        // shell answers. settings.navigate is an injection seam for tests\n        // (jsdom's location.assign is unforgeable).\n        activeContext = nextContext;\n        activeLaunchUrl = nextLaunchUrl;\n        // The page is about to unload: the owner may persist form-owned\n        // launch state (MOBILE-DTC-PARITY-01 quantity/options stash) here.\n        // A bookkeeping failure must never block the launch itself.\n        if (typeof settings.onBeforeTopLevelLaunchNavigate === 'function') {\n          try {\n            settings.onBeforeTopLevelLaunchNavigate(deepClone(nextContext, {}), nextLaunchUrl);\n          } catch (_) {}\n        }\n        if (typeof settings.navigate === 'function') {\n          settings.navigate(nextLaunchUrl);\n        } else {\n          window.location.assign(nextLaunchUrl);\n        }\n        return Promise.resolve(true);\n      }\n      var frame = getFrame();\n      var overlay = ensureOverlay();\n      var nextContextIdentity = buildEditorLaunchIdentity(config, nextContext, nextLaunchUrl);\n      var canReuseReadyFrame = Boolean(\n        frame\n        && frame.contentWindow\n        && frame.dataset.bgShellReady === '1'\n        && frame.dataset.bgContextIdentity\n        && frame.dataset.bgContextIdentity === nextContextIdentity\n      );\n      activeContext = nextContext;\n      activeLaunchUrl = nextLaunchUrl;\n      overlay.classList.add('is-open');\n      overlay.setAttribute('aria-hidden', 'false');\n      document.body.classList.add('bg-designer-editor-shell--open');\n      frame.dataset.bgContextIdentity = nextContextIdentity;\n      if (canReuseReadyFrame) {\n        frame.dataset.bgFrameUrl = activeLaunchUrl;\n        setLoadingVisible(false);\n        return Promise.resolve(true);\n      }\n      setLoadingVisible(true);\n\n      if (SHELL_PROMISES[overlayId]) return SHELL_PROMISES[overlayId];\n      SHELL_PROMISES[overlayId] = prewarmEditorBootstrap(config, activeLaunchUrl).catch(function () {\n        return { cacheKey: '', payload: null };\n      }).then(function (result) {\n        // A faster second open() may have superseded the context this fetch\n        // started under (it mutates activeContext/activeLaunchUrl and gets\n        // this same promise back). Re-derive EVERYTHING from the current\n        // module state so the shared continuation always applies the LATEST\n        // launch \u2014 the fast-click race applied the old cache key, identity,\n        // and payload to a frame already labeled with the new URL.\n        var launchUrl = text(activeLaunchUrl);\n        var launchIdentity = buildEditorLaunchIdentity(config, activeContext, launchUrl);\n        var launchCacheKey = getBootstrapCacheKeyForLaunchUrl(config, launchUrl);\n        var resultMatchesLaunch = text(result && result.cacheKey) === launchCacheKey;\n        var cachedPayload = resultMatchesLaunch && result && result.payload && typeof result.payload === 'object'\n          ? result.payload\n          : readCachedBootstrap(launchCacheKey);\n        var requiresProjectNavigation = !!text(activeContext && activeContext.projectId);\n        var currentFrameMatchesLaunchUrl = text(frame.getAttribute('src') || frame.src) === launchUrl;\n        frame.dataset.bgFrameUrl = launchUrl;\n        frame.dataset.bgBootstrapCacheKey = launchCacheKey;\n        frame.dataset.bgContextIdentity = launchIdentity;\n        if (\n          !requiresProjectNavigation\n          && frame.contentWindow\n          && frame.dataset.bgShellReady === '1'\n          && cachedPayload\n          && cachedPayload.bootstrap\n          && currentFrameMatchesLaunchUrl\n        ) {\n          postCachedPayloadToFrame(cachedPayload);\n          return true;\n        }\n        if (\n          requiresProjectNavigation\n          && text(frame.getAttribute('src')) === launchUrl\n          && frame.contentWindow\n          && frame.dataset.bgShellReady === '1'\n          && cachedPayload\n          && cachedPayload.bootstrap\n        ) {\n          postCachedPayloadToFrame(cachedPayload);\n          return true;\n        }\n        if (\n          frame.contentWindow\n          && frame.dataset.bgShellReady === '1'\n          && cachedPayload\n          && cachedPayload.bootstrap\n        ) {\n          frame.dataset.bgShellReady = '';\n          frame.dataset.bgContextPushed = '';\n          frame.src = launchUrl;\n          return true;\n        }\n        if (text(frame.getAttribute('src')) !== launchUrl) {\n          frame.dataset.bgShellReady = '';\n          frame.dataset.bgContextPushed = '';\n          frame.src = launchUrl;\n        }\n        return true;\n      }).finally(function () {\n        delete SHELL_PROMISES[overlayId];\n      });\n      return SHELL_PROMISES[overlayId];\n    }\n\n    function prewarm(context) {\n      var launchUrl = buildEditorUrl(config, Object.assign({}, context || {}, {\n        source: text(settings.source) || 'product'\n      }));\n      if (!launchUrl) return Promise.resolve(false);\n      return prewarmEditorBootstrap(config, launchUrl).then(function () {\n        return true;\n      }).catch(function () {\n        return false;\n      });\n    }\n\n    function close() {\n      var overlay = ensureOverlay();\n      overlay.classList.remove('is-open');\n      overlay.setAttribute('aria-hidden', 'true');\n      document.body.classList.remove('bg-designer-editor-shell--open');\n      setLoadingVisible(false);\n      return true;\n    }\n\n    // Parent -> editor notification lane (pass-through direct cart): the\n    // background add corridor reports progress/failure INTO the still-open\n    // editor overlay, because the product page's message block is invisible\n    // behind it. Scoped to the editor's own origin.\n    function postMessageToEditor(type, detail) {\n      var frame = getFrame();\n      if (!frame || !frame.contentWindow || !text(type)) return false;\n      var editorOrigin = window.location.origin;\n      try {\n        editorOrigin = new URL(getEditorBaseUrl(config), window.location.origin).origin;\n      } catch (_) {\n        editorOrigin = window.location.origin;\n      }\n      try {\n        frame.contentWindow.postMessage({\n          type: text(type),\n          detail: detail && typeof detail === 'object' ? detail : {},\n          source: 'bg-designer-storefront-shell'\n        }, editorOrigin);\n        return true;\n      } catch (_) {\n        return false;\n      }\n    }\n\n    window.addEventListener('message', function (event) {\n      var frame = getFrame();\n      var overlay = ensureOverlay();\n      if (!frame || event.source !== frame.contentWindow) return;\n      if (!isAllowedOrigin(event.origin)) return;\n      var data = event.data;\n      if (!data || typeof data !== 'object') return;\n\n      if (data.type === 'storefront:ready-first-usable') {\n        frame.dataset.bgShellReady = '1';\n        if (shellDocumentWarmResolver && text(frame.dataset.bgFrameUrl) === text(frame.getAttribute('src') || frame.src || activeLaunchUrl || shellDocumentWarmUrl)) {\n          resolveShellDocumentWarm(true);\n        }\n        if (!frame.dataset.bgContextIdentity && activeContext) {\n          frame.dataset.bgContextIdentity = buildEditorLaunchIdentity(config, activeContext, activeLaunchUrl);\n        }\n        if (frame.dataset.bgContextPushed !== '1') {\n          var cachedPayload = readCachedBootstrap(text(frame.dataset.bgBootstrapCacheKey));\n          if (cachedPayload && cachedPayload.bootstrap) {\n            postCachedPayloadToFrame(cachedPayload);\n          }\n        }\n        // Only a ready from the active launch target may reveal the editor.\n        // The prewarmed default-product document can emit ready while open()\n        // is still re-navigating the frame to the real launch URL; revealing\n        // on that message shows the wrong (default) design. Keep the opaque\n        // scrim up instead \u2014 the launch target emits its own ready after\n        // navigation, and the setLoadingVisible watchdog bounds a lost one.\n        var readyFrameUrl = text(frame.getAttribute('src') || frame.src);\n        var readyMatchesActiveLaunch = !activeLaunchUrl || (\n          readyFrameUrl === text(activeLaunchUrl)\n          && (!activeContext || text(frame.dataset.bgContextIdentity) === buildEditorLaunchIdentity(config, activeContext, activeLaunchUrl))\n        );\n        if (readyMatchesActiveLaunch) {\n          setLoadingVisible(false);\n        }\n        if (typeof settings.onReadyFirstUsable === 'function') {\n          settings.onReadyFirstUsable(data.detail && typeof data.detail === 'object' ? data.detail : {}, deepClone(activeContext, {}));\n        }\n        return;\n      }\n\n      if (data.type === 'storefront:ready-full') {\n        if (typeof settings.onReadyFull === 'function') {\n          settings.onReadyFull(data.detail && typeof data.detail === 'object' ? data.detail : {}, deepClone(activeContext, {}));\n        }\n        return;\n      }\n\n      if (data.type === 'storefront:relaunch-product') {\n        // Stage 2 S6 (ECO-SIGNS-04): the editor executed a cross-product\n        // move; the design now belongs to another product. The THEME owns\n        // page URLs, so the shell hands the validated detail to the host\n        // page, which navigates to the moved product with the saved-design\n        // resume + configuration-session params.\n        var relaunchDetail = data.detail && typeof data.detail === 'object' ? data.detail : {};\n        if (typeof settings.onRelaunchProduct === 'function') {\n          try {\n            settings.onRelaunchProduct({\n              productHandle: text(relaunchDetail.productHandle),\n              projectId: text(relaunchDetail.projectId),\n              configurationSessionId: text(relaunchDetail.configurationSessionId)\n            });\n          } catch (_) { /* the editor keeps its own fallback lane */ }\n        }\n        return;\n      }\n\n      if (data.type === 'storefront:close') {\n        var storefrontCloseDetail = data.detail && typeof data.detail === 'object' ? data.detail : {};\n        if (activeContext) {\n          activeContext.projectId = text(storefrontCloseDetail.projectId || activeContext.projectId);\n          activeContext.designId = text(storefrontCloseDetail.designId || activeContext.designId);\n          activeContext.designNumber = text(storefrontCloseDetail.designNumber || activeContext.designNumber);\n          frame.dataset.bgContextIdentity = buildEditorLaunchIdentity(config, activeContext, activeLaunchUrl);\n        }\n        refreshBootstrap(storefrontCloseDetail);\n        // Pass-through direct cart: onClose runs FIRST so its owner can claim\n        // the close ({ deferShellClose: true }) and keep the overlay up while\n        // the background add-to-cart corridor runs \u2014 hiding the shell before\n        // asking is the product-page flash. Any onClose that does not claim\n        // the close (or throws) keeps the classic hide-then-return behavior.\n        var storefrontCloseResult = null;\n        if (typeof settings.onClose === 'function') {\n          try {\n            storefrontCloseResult = settings.onClose(storefrontCloseDetail, deepClone(activeContext, {}));\n          } catch (_) {\n            storefrontCloseResult = null;\n          }\n        }\n        if (!storefrontCloseResult || storefrontCloseResult.deferShellClose !== true) {\n          close();\n        }\n        return;\n      }\n\n      if (data.type !== 'designer-admin-embedded-lifecycle') return;\n      var detail = data.detail && typeof data.detail === 'object' ? data.detail : {};\n      if (data.event === 'project-saved') {\n        if (activeContext) {\n          activeContext.projectId = text(detail.projectId || activeContext.projectId);\n          activeContext.designId = text(detail.designId || activeContext.designId);\n          activeContext.designNumber = text(detail.designNumber || activeContext.designNumber);\n          frame.dataset.bgContextIdentity = buildEditorContextIdentity(activeContext);\n        }\n        refreshBootstrap(detail);\n        if (typeof settings.onProjectSaved === 'function') {\n          settings.onProjectSaved(detail, deepClone(activeContext, {}));\n        }\n        return;\n      }\n      if (data.event === 'after-close-app') {\n        if (activeContext) {\n          activeContext.projectId = text(detail.projectId || activeContext.projectId);\n          activeContext.designId = text(detail.designId || activeContext.designId);\n          activeContext.designNumber = text(detail.designNumber || activeContext.designNumber);\n          frame.dataset.bgContextIdentity = buildEditorContextIdentity(activeContext);\n        }\n        refreshBootstrap(detail);\n        close();\n        if (typeof settings.onClose === 'function') {\n          settings.onClose(detail, deepClone(activeContext, {}));\n        }\n        return;\n      }\n\n      if (!overlay.classList.contains('is-open')) return;\n      if (typeof settings.onLifecycleEvent === 'function') {\n        settings.onLifecycleEvent(data.event, detail, deepClone(activeContext, {}));\n      }\n    });\n\n    return {\n      ensureOverlay: ensureOverlay,\n      open: open,\n      prewarmDocument: prewarmDocument,\n      prewarm: prewarm,\n      close: close,\n      postMessageToEditor: postMessageToEditor,\n      getActiveContext: function () {\n        return deepClone(activeContext, {});\n      }\n    };\n  }\n\n  var coreApi = {\n    coreRevision: CORE_REVISION,\n    text: text,\n    numberValue: numberValue,\n    roundMoney: roundMoney,\n    scaleMoney: scaleMoney,\n    parseJson: parseJson,\n    deepClone: deepClone,\n    escapeHtml: escapeHtml,\n    slugify: slugify,\n    uniqueStrings: uniqueStrings,\n    loadJson: loadJson,\n    readConfig: readConfig,\n    formatMoney: formatMoney,\n    formatPresentmentMoney: formatPresentmentMoney,\n    formatShopMoney: formatShopMoney,\n    parsePresentmentRate: parsePresentmentRate,\n    presentmentCents: presentmentCents,\n    isPresentmentConverting: isPresentmentConverting,\n    presentmentCentsOf: presentmentCentsOf,\n    presentmentAmount: presentmentAmount,\n    calculateDesignerOptionAddOns: calculateDesignerOptionAddOns,\n    buildDesignerSplitPrice: buildDesignerSplitPrice,\n    buildSelectionDisplayLabel: buildSelectionDisplayLabel,\n    buildOptionSelection: buildOptionSelection,\n    buildDesignerState: buildDesignerState,\n    normalizeChannelCatalog: normalizeChannelCatalog,\n    findChannelOfferByVariant: findChannelOfferByVariant,\n    normalizeChannelOfferOrigin: normalizeChannelOfferOrigin,\n    channelOfferMatches: channelOfferMatches,\n    resolveChannelPurchase: resolveChannelPurchase,\n    buildPublicProperties: buildPublicProperties,\n    buildCartTransformState: buildCartTransformState,\n    buildStaffOrderProperties: buildStaffOrderProperties,\n    readDesignerStateFromProperties: readDesignerStateFromProperties,\n    buildCommerceContextPayload: buildCommerceContextPayload,\n    hasSelfHostedProjectReference: hasSelfHostedProjectReference,\n    isProjectBoundCommerceProperties: isProjectBoundCommerceProperties,\n    requiresProjectAccessCheckoutRefresh: requiresProjectAccessCheckoutRefresh,\n    resolveCommerceProjectSession: resolveCommerceProjectSession,\n    readCustomerReferenceCode: readCustomerReferenceCode,\n    buildCartFailureMessage: buildCartFailureMessage,\n    prepareCommerceContextProperties: prepareCommerceContextProperties,\n    updateDesignerCartLine: updateDesignerCartLine,\n    resolveDesignerLineSubmitQuantity: resolveDesignerLineSubmitQuantity,\n    cartLineFingerprint: cartLineFingerprint,\n    readCartLineFingerprint: readCartLineFingerprint,\n    updateDesignerCartLineAcceptsBeforeMutation: true,\n    isNativeChannelOfferProperties: isNativeChannelOfferProperties,\n    isNativeChannelOfferLine: isNativeChannelOfferLine,\n    readClientUserAgentAnalytics: readClientUserAgentAnalytics,\n    resignCommerceContextProperties: resignCommerceContextProperties,\n    prepareCommerceContextFormData: prepareCommerceContextFormData,\n    fetchCommerceContext: fetchCommerceContext,\n    readCommerceContextFullState: readCommerceContextFullState,\n    getCartTransformStateMapKey: getCartTransformStateMapKey,\n    buildCartTransformStateMapPayload: buildCartTransformStateMapPayload,\n    clearCartTransformStateMapAttributes: clearCartTransformStateMapAttributes,\n    syncCartTransformStateMap: syncCartTransformStateMap,\n    syncCartTransformStateMapForProperties: syncCartTransformStateMapForProperties,\n    syncCartTransformStateMapForRemoval: syncCartTransformStateMapForRemoval,\n    normalizeDesignerQuantityMode: normalizeDesignerQuantityMode,\n    normalizeApparelSizes: normalizeApparelSizes,\n    normalizeArtworkMode: normalizeArtworkMode,\n    normalizeLaunchProvider: normalizeLaunchProvider,\n    buildEditorContextIdentity: buildEditorContextIdentity,\n    hashCartToken: hashCartToken,\n    resolveDurableCartTokenHash: resolveDurableCartTokenHash,\n    normalizeCompletionState: normalizeCompletionState,\n    fetchCartState: fetchCartState,\n    findLineByKey: findLineByKey,\n    changeCartLine: changeCartLine,\n    fetchProjectRecord: fetchProjectRecord,\n    fetchProjectCompletionEligibility: fetchProjectCompletionEligibility,\n    fetchProjectPreview: fetchProjectPreview,\n    readProjectArtworkPresence: readProjectArtworkPresence,\n    readProjectDocumentOrientation: readProjectDocumentOrientation,\n    hasStoredProjectReadCredential: function (projectId) {\n      return !!readStoredProjectReadCredential(projectId);\n    },\n    fetchTemplateSummary: fetchTemplateSummary,\n    collectProjectPreviewUrls: collectProjectPreviewUrls,\n    collectProjectBoardPreviews: collectProjectBoardPreviews,\n    buildEditorUrl: buildEditorUrl,\n    openPreviewLightbox: openPreviewLightbox,\n    closePreviewLightbox: closePreviewLightbox,\n    createEditorShell: createEditorShell,\n    parseSizeToken: parseSizeToken,\n    PARTNER_TIER_PRICE_KEY: PARTNER_TIER_PRICE_KEY,\n    PARTNER_TIER_TAG: PARTNER_TIER_TAG,\n    LEGACY_PARTNER_TIER_PRICE_KEY: LEGACY_PARTNER_TIER_PRICE_KEY,\n    LEGACY_PARTNER_TIER_TAG: LEGACY_PARTNER_TIER_TAG,\n    readTierPrice: readTierPrice,\n    withPartnerTierPriceKey: withPartnerTierPriceKey,\n    withPartnerTierPricingData: withPartnerTierPricingData\n  };\n\n  var loadedCore = window.BGDesignerStorefrontCore;\n  if (loadedCore && typeof loadedCore === 'object') {\n    Object.keys(coreApi).forEach(function (key) {\n      loadedCore[key] = coreApi[key];\n    });\n  } else {\n    window.BGDesignerStorefrontCore = coreApi;\n  }\n})();\n"],
  "mappings": "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YACA,WACA,WACA,UACA,UACA,WACA,QACA,cACA,SACA,WACA,YACA,uBACA,gBACA,qBACA,iBACA,wBACA,mBACA,kBACA,8BACA,wBACA,2BACA,qBACA,mBACA,wBACA,0BACA,4BACA,oBACA,uBACA,sBACA,wBACA,0BACA,gCACA,4BACA,8BACA,iCACA,qCACA,8BACA,0BACA,wBACA,iCACA,uBACA,kCACA,oBACA,wBACA,4CAA6C,GAC7C,+BACA,yBACA,6BACA,gCACA,+BACA,qBACA,6BACA,4BACA,kCACA,qCACA,0BACA,uCACA,oCACA,8BACA,sBACA,qBACA,wBACA,2BACA,cACA,4BACA,yBACA,eACA,cACA,eACA,mBACA,kCACA,oBACA,2BACA,+BACA,+BAAgC,SAAU,UAAW,CACnD,MAAO,CAAC,CAAC,gCAAgC,SAAS,CACpD,EACA,qBACA,0BACA,4BACA,eACA,oBACA,qBACA,kBACA,eACA,uBACA,iBACA,8BACA,wBACA,cACA,wBACA,0BACF,EAEI,WAAa,OAAO,yBACpB,YAAc,OAAO,YAAe,SACtC,OAAO,KAAK,OAAO,EAAE,QAAQ,SAAU,IAAK,CAC1C,WAAW,GAAG,EAAI,QAAQ,GAAG,CAC/B,CAAC,EAED,OAAO,yBAA2B,OAEtC,GAAG",
  "names": ["name", "text", "current", "shown", "failure"]
}
