{
  "version": 3,
  "sources": ["/cdn/shop/t/199/assets/pab-pricing.js?pab_build=20261014_prices2"],
  "sourcesContent": ["/*\n * PAB pricing + cart helpers (Phase 1 + Phase 2).\n *\n * Architecture rules (Phase 3 \u2014 stack quantity):\n *   - 1 PAB build = 1 main cart line + optional accessory cart lines\n *   - Main line quantity = stack count (Shopify-native shipping weight)\n *   - Standard stack variant weight: 3.3 oz | RealAged stack variant: 4.0 oz\n *   - Accessories are normal Shopify product lines (native weight + price)\n *   - `_total_cents` on the main line = Shopify-allocated stack/build cents\n *     (roundedUnitCents \u00D7 quantity; excludes accessories)\n *   - `_total_cents_exact` = pre-allocation arithmetic total (diagnostics only)\n *   - Cart Transform sets fixedPricePerUnit = _total_cents / quantity\n *   - Accessory cart lines link to the parent build via `_build_id` +\n *     `_pab_accessory_line` (presentation hide is separate; cart sync is here)\n *\n * Phase 2 surface:\n *   window.PAB.computeTotalCents(spec, variantPrices, accessoryCents)\n *   window.PAB.ensureVariantPrices()  // lazy /variants/{id}.js hydration\n *   window.PAB.specFromCartLine(line) // parse line.properties \u2192 spec object\n *   window.PAB.editPabBuild(lineKey, edits, meta?)  // recompute + /cart/change.js\n *\n * Phase 2 inline editing covers stacks / paper / finish / UV / serials /\n * denomination. Tier and accessories editing is deferred to Phase 2.1 \u2014\n * those flows would require a richer cart-line UI (4 gun colors + case\n * qty steppers, tier rebrand of the whole row) and the user explicitly\n * asked us not to expand surface area until the simpler edits are stable.\n */\n(function () {\n  'use strict';\n\n  /* Stack-weight carrier variants \u2014 set in Shopify admin:\n   *   Print A Bill - Standard Stack  \u2192 3.3 oz\n   *   Print A Bill - RealAged Stack  \u2192 4.0 oz\n   * Legacy single carrier ID kept as Standard until RealAged variant is created. */\n  var PAB_STACK_VARIANT_STANDARD = 52502897590548;\n  var PAB_STACK_VARIANT_REALAGED = 52674499019028;\n  var PAB_BUILD_VARIANT_ID = PAB_STACK_VARIANT_STANDARD;\n  var PAB_CONFIG_STATE_KEY = 'pab:configurator:last-added:v1';\n  var PAB_CONFIG_HISTORY_KEY = 'pabRestoreBuildId';\n  var PAB_CONFIG_STATE_VERSION = 1;\n  var PAB_CONFIG_STATE_MAX_AGE_MS = 12 * 60 * 60 * 1000;\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * Pricing constants \u2014 kept in lockstep with templates/page.print-a-bill.liquid\n   * If you change one place, change the other. The two systems will be merged\n   * into a single source in a later refactor.\n   * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var TIER_VARIANTS = {\n    standard: 51357328670996,\n    premium:  51357343940884,\n    ultimate: 51357408428308\n  };\n\n  /* All three tiers share the same per-stack variant table. */\n  var STACK_VARIANTS = {\n    '1-9':     51359831589140,\n    '10-19':   51359831621908,\n    '20-49':   51359831654676,\n    '50-99':   51359831687444,\n    '100-499': 51359831720212,\n    '500-999': 51359831752980,\n    '1000+':   51359831785748\n  };\n\n  var ADDON_VARIANTS = {\n    denominationChange:         51548059009300,\n    denominationChangeIncluded: 51806190141716,\n    uvSetup:                    51265030390036,\n    uvPerStack:                 51265140457748,\n    serialSetup:                51548061171988,\n    serialPerStack:             51548062056724,\n    realAged:                   51265030357268,\n    durable:                    51548062744852,\n    flame:                      51548067922196\n  };\n\n  /* Canonical USD used only when live /variants/{id}.js hydration fails.\n   * Hydrated Shopify prices always win when present. */\n  var PAB_CANONICAL_USD = {\n    51359831589140: 25.99, // stack 2-9 (1-9 bracket)\n    51265030390036: 25, // uvSetup\n    51265140457748: 3,  // uvPerStack\n    51548061171988: 25, // serialSetup\n    51548062056724: 3,  // serialPerStack\n    51548067922196: 3,  // flame paper / stack\n    51548062744852: 7,  // durable paper / stack\n    51265030357268: 3   // realAged finish / stack\n  };\n\n  var TIER_FALLBACK_DOLLARS = {\n    standard: 49,\n    premium:  79,\n    ultimate: 129\n  };\n\n  var ALL_REQUIRED_PRICE_IDS = (function () {\n    var ids = [];\n    Object.keys(TIER_VARIANTS).forEach(function (k) { ids.push(TIER_VARIANTS[k]); });\n    Object.keys(STACK_VARIANTS).forEach(function (k) { ids.push(STACK_VARIANTS[k]); });\n    Object.keys(ADDON_VARIANTS).forEach(function (k) { ids.push(ADDON_VARIANTS[k]); });\n    return Array.from(new Set(ids));\n  })();\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function tierKey(t)   { return String(t || '').toLowerCase(); }\n  function tierLabel(t) {\n    var k = tierKey(t);\n    return k ? (k.charAt(0).toUpperCase() + k.slice(1)) : '';\n  }\n  function paperLabelFromKey(k) {\n    if (k === 'durable') return 'Premium Durable';\n    if (k === 'flame')   return 'Flame-Retardant';\n    return 'Signature';\n  }\n  function paperKeyFromLabel(label) {\n    var s = String(label || '').toLowerCase();\n    if (s.indexOf('durable') >= 0) return 'durable';\n    if (s.indexOf('flame')   >= 0) return 'flame';\n    return 'signature';\n  }\n  function finishKeyFromLabel(label) {\n    var s = String(label || '').toLowerCase();\n    if (/realaged|real-aged/.test(s)) return 'realaged';\n    return 'standard';\n  }\n  function finishLabelFromKey(key) {\n    return finishKeyFromLabel(key) === 'realaged' ? 'RealAged' : 'Standard';\n  }\n  function uuid() {\n    if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n      return crypto.randomUUID();\n    }\n    return 'pab-' + Date.now().toString(36) + '-' +\n      Math.random().toString(36).slice(2, 10);\n  }\n\n  function getStackVariantId(qty) {\n    if (qty <= 9)    return STACK_VARIANTS['1-9'];\n    if (qty <= 19)   return STACK_VARIANTS['10-19'];\n    if (qty <= 49)   return STACK_VARIANTS['20-49'];\n    if (qty <= 99)   return STACK_VARIANTS['50-99'];\n    if (qty <= 499)  return STACK_VARIANTS['100-499'];\n    if (qty <= 999)  return STACK_VARIANTS['500-999'];\n    return STACK_VARIANTS['1000+'];\n  }\n\n  function priceOf(id, prices) {\n    var key = String(id);\n    if (prices) {\n      if (prices[id] !== undefined && prices[id] !== null && !isNaN(prices[id])) {\n        return Number(prices[id]);\n      }\n      if (prices[key] !== undefined && prices[key] !== null && !isNaN(prices[key])) {\n        return Number(prices[key]);\n      }\n    }\n    if (PAB_CANONICAL_USD[id] !== undefined) return Number(PAB_CANONICAL_USD[id]);\n    if (PAB_CANONICAL_USD[key] !== undefined) return Number(PAB_CANONICAL_USD[key]);\n    return 0;\n  }\n\n  function formatMoney(cents) {\n    var dollars = (cents / 100);\n    return '$' + dollars.toFixed(2).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n  }\n\n  function parseStacksCount(raw) {\n    var digits = String(raw == null ? '' : raw).replace(/[^\\d]/g, '');\n    if (!digits) return 0;\n    return parseInt(digits, 10) || 0;\n  }\n\n  function formatStacksCount(value) {\n    var n = parseStacksCount(value);\n    if (n < 0) n = 0;\n    return n.toLocaleString('en-US');\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 pure pricing function \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * Mirrors the configurator's window.calculateTotal() arithmetic exactly.\n   *\n   * spec: {\n   *   tier:        'standard'|'premium'|'ultimate',\n   *   stacks:      integer >= 2,\n   *   paper:       'signature'|'durable'|'flame',\n   *   finish:      'standard'|'realaged',\n   *   uv:          boolean,\n   *   serials:     boolean,\n   *   denomChange: boolean   (ignored for ultimate \u2014 included free)\n   * }\n   * variantPrices: { [variant_id]: priceInDollars }\n   * accessoryCents: integer cents added at the end (already-priced accessories)\n   * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function computeTotalCents(spec, variantPrices, accessoryCents) {\n    if (!spec || !spec.tier) return 0;\n    var tier   = tierKey(spec.tier);\n    var stacks = parseInt(spec.stacks, 10) || 0;\n    var prices = variantPrices || {};\n    var dollars = 0;\n\n    var tierVid  = TIER_VARIANTS[tier];\n    var tierLive = tierVid ? priceOf(tierVid, prices) : 0;\n    dollars += tierLive > 0 ? tierLive : (TIER_FALLBACK_DOLLARS[tier] || 0);\n\n    if (stacks >= 2) {\n      var unit = priceOf(getStackVariantId(stacks), prices);\n      dollars += unit * stacks;\n    }\n\n    if (tier !== 'ultimate' && isEnabledFeatureValue(spec.denomChange)) {\n      dollars += priceOf(ADDON_VARIANTS.denominationChange, prices);\n    }\n\n    var paper  = paperKeyFromLabel(spec.paper);\n    var finish = finishKeyFromLabel(spec.finish);\n\n    if (stacks >= 2) {\n      if (spec.uv) {\n        dollars += priceOf(ADDON_VARIANTS.uvSetup, prices)\n                 + priceOf(ADDON_VARIANTS.uvPerStack, prices) * stacks;\n      }\n      if (spec.serials) {\n        dollars += priceOf(ADDON_VARIANTS.serialSetup, prices)\n                 + priceOf(ADDON_VARIANTS.serialPerStack, prices) * stacks;\n      }\n      if (paper === 'flame')   dollars += priceOf(ADDON_VARIANTS.flame,   prices) * stacks;\n      if (paper === 'durable') dollars += priceOf(ADDON_VARIANTS.durable, prices) * stacks;\n      /* RealAged is automatically suppressed on Durable paper (configurator rule). */\n      if (finish === 'realaged' && paper !== 'durable') {\n        dollars += priceOf(ADDON_VARIANTS.realAged, prices) * stacks;\n      }\n    } else {\n      if (spec.uv)      dollars += priceOf(ADDON_VARIANTS.uvSetup, prices);\n      if (spec.serials) dollars += priceOf(ADDON_VARIANTS.serialSetup, prices);\n    }\n\n    return Math.round(dollars * 100) + (parseInt(accessoryCents, 10) || 0);\n  }\n\n  function computePriceBreakdown(spec, prices, accessoryPrices) {\n    if (!spec || !spec.tier) return { rows: [], totalCents: 0 };\n    var tier = tierKey(spec.tier);\n    var stacks = readStackQuantity(spec);\n    var paper = paperKeyFromLabel(spec.paper);\n    var finish = finishKeyFromLabel(spec.finish);\n    var rows = [];\n    function add(label, choice, cents, accessory) {\n      rows.push({ label: label, choice: String(choice || ''), cents: Math.round(cents), accessory: !!accessory });\n    }\n    function cents(id) { return Math.round(priceOf(id, prices) * 100); }\n    if (spec.billSeries || spec.denomination) {\n      var faceValue = formatDenominationProperty(spec.denomination);\n      if (faceValue === 'Custom' && spec.customDenomination) faceValue = spec.customDenomination;\n      add('Bill format', [normalizeBillSeriesLabel(spec.billSeries), faceValue ? faceValue + ' face value' : ''].filter(Boolean).join(' \u00B7 '), 0);\n      if (spec.baseBill && formatDenominationProperty(spec.denomination) === 'Custom') add('Base bill', spec.baseBill, 0);\n    }\n    var designCents = cents(TIER_VARIANTS[tier]) || Math.round((TIER_FALLBACK_DOLLARS[tier] || 0) * 100);\n    add('Design package', tierLabel(tier), designCents);\n    var stackCents = cents(getStackVariantId(stacks));\n    add('Printing', formatStacksCount(stacks) + ' stacks \u00D7 ' + formatMoney(stackCents), stackCents * stacks);\n    var paperCents = paper === 'durable' ? cents(ADDON_VARIANTS.durable) : paper === 'flame' ? cents(ADDON_VARIANTS.flame) : 0;\n    add('Paper', paperLabelFromKey(paper) + (paperCents ? ' \u00B7 ' + formatStacksCount(stacks) + ' \u00D7 ' + formatMoney(paperCents) : ''), paperCents * stacks);\n    var finishCents = finish === 'realaged' && paper !== 'durable' ? cents(ADDON_VARIANTS.realAged) : 0;\n    add('Finish', finishLabelFromKey(finishCents ? 'realaged' : 'standard') + (finishCents ? ' \u00B7 ' + formatStacksCount(stacks) + ' \u00D7 ' + formatMoney(finishCents) : ''), finishCents * stacks);\n    if (spec.uv) add('UV ink', formatMoney(cents(ADDON_VARIANTS.uvSetup)) + ' setup + ' + formatStacksCount(stacks) + ' \u00D7 ' + formatMoney(cents(ADDON_VARIANTS.uvPerStack)), cents(ADDON_VARIANTS.uvSetup) + cents(ADDON_VARIANTS.uvPerStack) * stacks);\n    if (spec.serials) add('Serial numbers', formatMoney(cents(ADDON_VARIANTS.serialSetup)) + ' setup + ' + formatStacksCount(stacks) + ' \u00D7 ' + formatMoney(cents(ADDON_VARIANTS.serialPerStack)), cents(ADDON_VARIANTS.serialSetup) + cents(ADDON_VARIANTS.serialPerStack) * stacks);\n    if (tier === 'ultimate' || isEnabledFeatureValue(spec.denomChange)) add('Denomination change', tier === 'ultimate' ? 'Included in Ultimate' : 'Custom denomination', tier === 'ultimate' ? 0 : cents(ADDON_VARIANTS.denominationChange));\n    var denominationRow = rows.find(function (row) { return row.label === 'Denomination change'; });\n    if (denominationRow && formatDenominationProperty(spec.denomination) === 'Custom') denominationRow.printedValue = String(spec.customDenomination || '').trim();\n\n    var exactMain = computeMainLineTotalCents(spec, prices);\n    var allocated = allocateShopifyMainLineCents(exactMain, stacks);\n    var rowMain = rows.reduce(function (total, row) { return total + row.cents; }, 0);\n    var rounding = allocated.allocatedMainCents - rowMain;\n    if (rounding) {\n      var stackRow = rows.find(function (row) { return row.label === 'Printing'; });\n      stackRow.cents += rounding;\n      stackRow.roundingCents = rounding;\n    }\n    var accessoryCents = 0;\n    (spec.accessoryItems || []).forEach(function (item) {\n      var qty = parseInt(item.qty, 10) || 0;\n      if (qty <= 0) return;\n      var unit = Math.round(accessoryUnitDollars(item.variantId, accessoryPrices) * 100);\n      accessoryCents += unit * qty;\n      add(item.label, qty + ' \u00D7 ' + formatMoney(unit) + ' \u00B7 Billed separately', unit * qty, true);\n      rows[rows.length - 1].accessoryVariantId = String(item.variantId);\n    });\n    if (spec.rush) add('Rush service', 'Requested \u00B7 Subject to availability \u00B7 Not charged', 0);\n    return { rows: rows, customDenominationSelected: formatDenominationProperty(spec.denomination) === 'Custom', roundingCents: rounding, mainLineCents: allocated.allocatedMainCents, accessoryCents: accessoryCents, totalCents: allocated.allocatedMainCents + accessoryCents };\n  }\n\n  function priceBreakdownCopy(key, fallback) {\n    var source = document.querySelector('[data-pab-price-copy]');\n    return source && source.getAttribute('data-' + key) || fallback;\n  }\n\n  function breakdownAmount(row) {\n    if (row.cents === 0 && row.label === 'Denomination change') return priceBreakdownCopy('included-with-ultimate', 'Included with Ultimate');\n    if (row.cents === 0) return row.label === 'Rush service' ? 'Not charged' : 'Included';\n    return row.cents < 0 ? '\u2212' + formatMoney(-row.cents) : formatMoney(row.cents);\n  }\n\n  function visiblePriceSpec(form) {\n    var root = document.getElementById('pab-mockup-root');\n    if (!root) return buildCalculatorSpec(form);\n    var tier = root.querySelector('.tier.selected')?.dataset.tier || 'premium';\n    var paper = root.querySelector('#paper input:checked')?.dataset.label || 'Signature';\n    return {\n      tier: tier,\n      stacks: parseStacksCount(root.querySelector('#qty')?.value) || 2,\n      paper: paper,\n      finish: root.querySelector('#realaged-option')?.checked ? 'realaged' : 'standard',\n      uv: !!root.querySelector('#uv-option')?.checked,\n      serials: !!root.querySelector('#serial-option')?.checked,\n      denomChange: tierKey(tier) === 'ultimate' || !!root.querySelector('#denom-change-option')?.checked,\n      rush: !!(window.PABRushService && window.PABRushService.get()),\n      billSeries: root.querySelector('#series .selected')?.dataset.series || 'New Series',\n      denomination: root.querySelector('#denoms .selected')?.dataset.denom || '100',\n      customDenomination: window.PABCustomDenomination ? window.PABCustomDenomination.value() : '',\n      baseBill: window.PABBaseBill && (root.querySelector('#denoms .selected')?.dataset.denom || '').toLowerCase().indexOf('custom') >= 0 ? window.PABBaseBill.property() : '',\n      accessoryItems: readAccessoriesFromForm(form).items\n    };\n  }\n\n  function chargeLabel(row) {\n    if (row.label === 'UV ink') return 'UV Ink';\n    if (row.label === 'Denomination change') return priceBreakdownCopy('custom-denomination', 'Custom denomination');\n    if (row.label === 'Design package') return row.choice + ' design';\n    if (row.label === 'Printing') return 'Stacks \u00B7 ' + row.choice.split(' stacks')[0];\n    if (row.label === 'Paper') return row.choice.split(' \u00B7 ')[0] + ' paper';\n    if (row.label === 'Finish') return 'RealAged finish';\n    if (row.accessory) return row.label + ' \u00B7 ' + row.choice.split(' \u00D7 ')[0];\n    return row.label;\n  }\n\n  function chargeCalculation(row) {\n    var calculation = '';\n    if (row.label === 'Design package') return 'One-time design fee';\n    if (row.label === 'Printing') return row.choice.replace(' stacks \u00D7 ', ' \u00D7 ').replace(/\\.00\\b/g, '');\n    if (row.label === 'Paper' || row.label === 'Finish') calculation = row.choice.split(' \u00B7 ')[1] || '';\n    if (row.label === 'UV ink' || row.label === 'Serial numbers') calculation = row.choice;\n    if (calculation) return calculation.replace(' \u00D7 ', ' stacks \u00D7 ').replace(/\\.00\\b/g, '');\n    if (row.accessory) return row.choice.split(' \u00B7 ')[0].replace(/\\.00\\b/g, '');\n    if (row.label === 'Denomination change') return row.printedValue ? priceBreakdownCopy('printed-value', '[value] printed on each bill').replace('[value]', row.printedValue) : row.cents ? 'One-time fee' : '';\n    return '';\n  }\n\n  function chargeEditor(row) {\n    if (row.accessory) return { step: 4, target: '.accessory[data-variant=\"' + row.accessoryVariantId + '\"] .accessory-plus' };\n    if (row.label === 'Design package') return { step: 1, target: '.tier.selected' };\n    if (row.label === 'Printing') return { step: 2, target: '#qty' };\n    if (row.label === 'Paper') return { step: 3, panel: 'paper', target: '#paper input:checked' };\n    if (row.label === 'Finish') return { step: 3, panel: 'finish', target: '#realaged-option' };\n    if (row.label === 'UV ink') return { step: 3, panel: 'special', target: '#uv-option' };\n    if (row.label === 'Serial numbers') return { step: 3, panel: 'special', target: '#serial-option' };\n    if (row.label === 'Denomination change') return { step: 0, target: '#pab-custom-denom-input' };\n    return null;\n  }\n\n  var chargeEditNavigation = 0;\n  var cancelChargeEditLanding = null;\n\n  function tabletPageClearance() {\n    var top = 24;\n    document.querySelectorAll('#site-header, #shopify-section-header, .shopify-section-header, header').forEach(function (header) {\n      var rect = header.getBoundingClientRect();\n      if (rect.width >= window.innerWidth * 0.7 && rect.top <= 24 && rect.bottom > 0 && rect.height < window.innerHeight / 2) top = Math.max(top, rect.bottom + 16);\n    });\n    return top;\n  }\n\n  function tabletChargeClearance(root, destination) {\n    var tabletMode = root.hasAttribute('data-pab-tablet-preview');\n    var pageTop = tabletMode ? tabletPageClearance() : 0;\n    if (tabletMode && root.dataset.pabTabletPreview === 'closed') return pageTop;\n    var preview = root.querySelector('.preview-card');\n    if (!preview) return pageTop;\n    var style = window.getComputedStyle(preview);\n    var rect = preview.getBoundingClientRect();\n    var target = destination.getBoundingClientRect();\n    if ((style.position !== 'sticky' && style.position !== 'fixed') || rect.height < 8 || target.left >= rect.right || target.right <= rect.left) return pageTop;\n    var pinnedTop = Math.max(0, parseFloat(style.top) || 0);\n    return Math.max(pageTop, pinnedTop + rect.height + 16);\n  }\n\n  function landTabletCharge(root, destination, behavior) {\n    var clearance = tabletChargeClearance(root, destination);\n    if (!clearance) return false;\n    var rect = destination.getBoundingClientRect();\n    window.scrollTo({ top: Math.max(0, window.scrollY + rect.top - clearance), behavior: behavior });\n    return true;\n  }\n\n  function checkTabletChargeLanding(root, destination, token) {\n    var cancelled = false;\n    var timers = [];\n    var inputs = ['pointerdown', 'touchstart', 'wheel', 'keydown'];\n    function stop() {\n      cancelled = true;\n      timers.forEach(window.clearTimeout);\n      inputs.forEach(function (type) { window.removeEventListener(type, stop, true); });\n      window.removeEventListener('scrollend', check);\n      if (cancelChargeEditLanding === stop) cancelChargeEditLanding = null;\n    }\n    function check() {\n      if (cancelled || token !== chargeEditNavigation || !destination.isConnected) return;\n      var clearance = tabletChargeClearance(root, destination);\n      var rect = destination.getBoundingClientRect();\n      if (clearance && (rect.top < clearance - 2 || rect.top > clearance + 24)) landTabletCharge(root, destination, 'instant');\n    }\n    inputs.forEach(function (type) { window.addEventListener(type, stop, { capture: true, passive: true }); });\n    window.addEventListener('scrollend', check);\n    timers.push(window.setTimeout(check, 650), window.setTimeout(check, 1100), window.setTimeout(stop, 1500));\n    cancelChargeEditLanding = stop;\n  }\n\n  document.addEventListener('click', function (event) {\n    var edit = event.target.closest && event.target.closest('[data-pab-charge-target]');\n    var root = document.getElementById('pab-mockup-root');\n    if (!edit || !root || !root.contains(edit)) return;\n    event.preventDefault();\n    if (cancelChargeEditLanding) cancelChargeEditLanding();\n    var token = ++chargeEditNavigation;\n    var mobileReview = !!edit.closest('.pab-mobile-review-details');\n    var guided = root.classList.contains('pab-guide-on') && !mobileReview;\n    var reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    function reveal() {\n      if (token !== chargeEditNavigation) return;\n      var panelId = edit.dataset.pabChargePanel;\n      var panel = panelId && root.querySelector('#' + panelId);\n      var toggle = panelId && root.querySelector('[data-open=\"' + panelId + '\"]');\n      if (panel && !panel.classList.contains('open') && toggle) toggle.click();\n      var control = root.querySelector(edit.dataset.pabChargeTarget);\n      if (!control || control.getClientRects().length === 0) return;\n      var destination = control.closest('.choice, .accessory') || control;\n      if (mobileReview) {\n        destination.scrollIntoView({ block: 'center', inline: 'nearest', behavior: reduced ? 'auto' : 'smooth' });\n        control.focus({ preventScroll: true });\n        return;\n      }\n      var section = toggle || control.closest('.pab-custom-denom, .accessory, .config-section') || control;\n      var tablet = tabletChargeClearance(root, section) > 0;\n      if (tablet) {\n        var focus = window.matchMedia('(pointer: coarse)').matches ? section : control;\n        if (focus === section && !section.hasAttribute('tabindex')) section.setAttribute('tabindex', '-1');\n        focus.focus({ preventScroll: true });\n        landTabletCharge(root, section, guided || reduced ? 'instant' : 'smooth');\n        checkTabletChargeLanding(root, section, token);\n      } else {\n        destination.scrollIntoView({ block: 'center', inline: 'nearest', behavior: reduced ? 'instant' : 'smooth' });\n        control.focus({ preventScroll: true });\n      }\n    }\n    window.requestAnimationFrame(function () {\n      window.requestAnimationFrame(function () {\n        window.requestAnimationFrame(function () {\n          if (guided) window.setTimeout(reveal, 450);\n          else reveal();\n        });\n      });\n    });\n  });\n\n  function renderPriceBreakdown(breakdown, scope, editable) {\n    var renderRoot = scope || document;\n    renderRoot.querySelectorAll('[data-pab-price-rows]').forEach(function (target) {\n      if (!scope && target.closest('[data-pab-cart-charges]')) return;\n      var snapshot = JSON.stringify([breakdown.rows, breakdown.customDenominationSelected]);\n      if (target.dataset.pabPriceSnapshot === snapshot) return;\n      target.dataset.pabPriceSnapshot = snapshot;\n      var fragment = document.createDocumentFragment();\n      breakdown.rows.filter(function (row) { return row.cents !== 0 || row.label === 'Denomination change' && breakdown.customDenominationSelected; }).forEach(function (row) {\n        var tr = document.createElement('tr');\n        if (row.cents === 0) tr.className = 'pab-price-included';\n        var choice = document.createElement('th');\n        choice.scope = 'row';\n        var editor = editable === false ? null : chargeEditor(row);\n        var label = document.createElement(editor ? 'button' : 'span');\n        label.textContent = chargeLabel(row);\n        if (editor) {\n          label.type = 'button';\n          label.className = 'pab-price-edit';\n          label.dataset.pabReviewEdit = String(editor.step);\n          label.dataset.pabChargeTarget = editor.target;\n          if (editor.panel) label.dataset.pabChargePanel = editor.panel;\n          label.setAttribute('aria-label', 'Edit ' + chargeLabel(row));\n        }\n        choice.appendChild(label);\n        var calculation = chargeCalculation(row);\n        if (calculation) {\n          var detail = document.createElement('small');\n          detail.textContent = calculation;\n          choice.appendChild(detail);\n        }\n        var amount = document.createElement('td');\n        amount.textContent = breakdownAmount(row);\n        tr.append(choice, amount);\n        fragment.appendChild(tr);\n      });\n      target.replaceChildren(fragment);\n    });\n    renderRoot.querySelectorAll('[data-pab-price-basis]').forEach(function (note) {\n      var basis = note.dataset.pabPriceBasis || note.textContent.trim();\n      note.dataset.pabPriceBasis = basis;\n      note.textContent = basis;\n    });\n  }\n\n  var PAB_RAW_PROPERTIES = {\n    Tier: '_pab_tier', Stacks: '_pab_stacks', Paper: '_pab_paper', Finish: '_pab_finish',\n    'UV Ink': '_pab_uv_ink', 'Serial Numbers': '_pab_serial_numbers',\n    'Denomination Change': '_pab_denomination_change', 'Bill Series': '_pab_bill_series',\n    Denomination: '_pab_denomination', 'Custom Denomination': '_pab_custom_denomination',\n    'Base Bill': '_pab_base_bill', 'Rush Service Requested': '_pab_rush_requested'\n  };\n  var PAB_CHARGE_PROPERTIES = ['Design package', 'Printing', 'Paper', 'Finish', 'UV ink', 'Serial numbers', 'Denomination change'];\n\n  // Enabled only after the compatible checkout app has been reviewed and\n  // released. A theme preview cannot isolate a checkout app deployment.\n  function itemizedCheckoutProperties(properties, spec) {\n    var breakdown = computePriceBreakdown(spec, window.PAB_VARIANT_PRICES || {}, window.ACCESSORY_LIVE_PRICES || {});\n    var chargeKeys = {\n      'Design package': 'design', Printing: 'printing', Paper: 'paper', Finish: 'finish',\n      'UV ink': 'uv', 'Serial numbers': 'serials', 'Denomination change': 'denomination'\n    };\n    var rows = breakdown.rows.filter(function (row) {\n      return !row.accessory && row.cents > 0 && chargeKeys[row.label];\n    }).flatMap(function (row) {\n      if (row.label === 'UV ink' || row.label === 'Serial numbers') {\n        var uv = row.label === 'UV ink';\n        var key = uv ? 'uv' : 'serials';\n        var label = uv ? 'UV Ink' : 'Serial numbers';\n        var setupCents = Math.round(priceOf(ADDON_VARIANTS[uv ? 'uvSetup' : 'serialSetup'], window.PAB_VARIANT_PRICES || {}) * 100);\n        return [\n          { key: key + '_setup', label: label + ' setup', cents: setupCents },\n          { key: key, label: label, cents: row.cents - setupCents, quantity: readStackQuantity(spec) }\n        ].filter(function (part) { return part.cents > 0; });\n      }\n      return { key: chargeKeys[row.label], label: chargeLabel(row), cents: row.cents };\n    });\n    var total = rows.reduce(function (sum, row) { return sum + row.cents; }, 0);\n    if (total !== Number(properties._total_cents)) {\n      throw new Error('Your custom bill prices have refreshed. Please review the charges and try again.');\n    }\n    var ordered = { _pab_bill_name: properties['Bill Name'] };\n    var format = breakdown.rows.find(function (row) { return row.label === 'Bill format'; });\n    if (format) ordered._pab_bill_format = format.choice.replace(' face value', '');\n    if (spec.rush) ordered._pab_rush_service = 'Requested \u00B7 Quoted separately';\n    Object.keys(PAB_RAW_PROPERTIES).forEach(function (key) {\n      if (properties[key] !== undefined && properties[key] !== '') {\n        ordered[PAB_RAW_PROPERTIES[key]] = key === 'Denomination Change'\n          ? (isEnabledFeatureValue(properties[key]) ? 'Yes' : 'No') : String(properties[key]);\n      }\n    });\n    Object.keys(properties).forEach(function (key) {\n      if (key.charAt(0) === '_' && key.indexOf('_pab_price_') !== 0) ordered[key] = properties[key];\n    });\n    ordered._pab_checkout_breakdown = JSON.stringify({\n      version: 1, currency: 'USD', quantity: readStackQuantity(spec), totalCents: total, rows: rows\n    });\n    ordered._pab_checkout_charge_rows = rows.map(function (row) {\n      return row.label + (row.quantity ? ' \u00B7 ' + formatStacksCount(row.quantity) + ' stacks \u00D7 ' + formatMoney(row.cents / row.quantity) : '') + ' \u2014 ' + formatMoney(row.cents);\n    }).join('||');\n    ordered._pab_summary_version = '3';\n    return ordered;\n  }\n\n  function checkoutTimelineProperties(properties) {\n    if (window.PAB_ITEMIZED_CHECKOUT === true && properties['Custom order timeline']) {\n      properties._pab_proof_timeline_summary = properties['Custom order timeline'];\n      delete properties['Custom order timeline'];\n    }\n    return properties;\n  }\n\n  function appendPriceProperties(properties, spec) {\n    if (window.PAB_ITEMIZED_CHECKOUT === true) return itemizedCheckoutProperties(properties, spec);\n    if (window.PAB_CLEAN_CART_PROPERTIES !== true) {\n      Object.keys(PAB_RAW_PROPERTIES).forEach(function (key) {\n        if (properties[key] !== undefined && properties[key] !== '') properties[PAB_RAW_PROPERTIES[key]] = String(properties[key]);\n      });\n      properties._pab_summary_version = 'legacy';\n      return properties;\n    }\n    var breakdown = computePriceBreakdown(spec, window.PAB_VARIANT_PRICES || {}, window.ACCESSORY_LIVE_PRICES || {});\n    var ordered = { 'Bill Name': properties['Bill Name'] };\n    var format = breakdown.rows.find(function (row) { return row.label === 'Bill format'; });\n    if (format) ordered['Bill format'] = format.choice.replace(' face value', '');\n    breakdown.rows.forEach(function (row) {\n      if (row.accessory || !row.cents) return;\n      var value = breakdownAmount(row);\n      if (row.label === 'Design package') value = row.choice + ' \u2014 ' + value;\n      if (row.label === 'Printing') value = formatStacksCount(spec.stacks) + ' stacks \u2014 ' + value;\n      if (row.label === 'Paper') value = row.choice.split(' \u00B7 ')[0] + ' \u2014 ' + value;\n      if (row.label === 'Finish') value = 'RealAged \u2014 ' + value;\n      ordered[row.label] = value;\n    });\n    if (spec.rush) ordered['Rush service'] = 'Requested \u00B7 No charge';\n    Object.keys(PAB_RAW_PROPERTIES).forEach(function (key) {\n      if (properties[key] !== undefined && properties[key] !== '') ordered[PAB_RAW_PROPERTIES[key]] = key === 'Denomination Change' ? (isEnabledFeatureValue(properties[key]) ? 'Yes' : 'No') : String(properties[key]);\n    });\n    Object.keys(properties).forEach(function (key) {\n      if (key.charAt(0) === '_' && key.indexOf('_pab_price_') !== 0) ordered[key] = properties[key];\n    });\n    // The native charge values are the historical price snapshot. Separate\n    // accessory cart lines already carry their own quantity and price.\n    ordered._pab_summary_version = '2';\n    return ordered;\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 live price hydration (lazy) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * The configurator hydrates window.PAB_VARIANT_PRICES on page load.\n   * The cart page does not \u2014 so this lazy loader fills any gaps on the\n   * first edit. Idempotent: subsequent calls are no-ops once cached. */\n  var pricesPromise = null;\n  function ensureVariantPrices() {\n    if (!window.PAB_VARIANT_PRICES) window.PAB_VARIANT_PRICES = {};\n    var store = window.PAB_VARIANT_PRICES;\n    var missing = ALL_REQUIRED_PRICE_IDS.filter(function (id) {\n      return store[id] === undefined || store[id] === null || isNaN(store[id]);\n    });\n    if (!missing.length) {\n      syncVolumePricingLabels({ prices: store });\n      return Promise.resolve(store);\n    }\n    if (pricesPromise) return pricesPromise;\n\n    pricesPromise = Promise.all(missing.map(function (id) {\n      return fetch('/variants/' + id + '.js', { credentials: 'same-origin' })\n        .then(function (r) { return r.ok ? r.json() : null; })\n        .then(function (v) {\n          if (v && v.price !== undefined) {\n            var p = Number(v.price);\n            /* Shopify returns price in cents (integer); store in dollars. */\n            store[id] = p > 0 && p < 100 ? p : p / 100;\n          }\n        })\n        .catch(function () {});\n    })).then(function () {\n      pricesPromise = null;\n      try {\n        document.dispatchEvent(new Event('pabPricesLoaded'));\n      } catch (_pe) {}\n      syncVolumePricingLabels({ prices: store });\n      return store;\n    });\n    return pricesPromise;\n  }\n\n  var VOLUME_TIERS = [\n    { key: '1-9',     suffix: '' },\n    { key: '10-19',   suffix: ' \u00B7 12% off' },\n    { key: '20-49',   suffix: ' \u00B7 23% off' },\n    { key: '50-99',   suffix: ' \u00B7 35% off' },\n    { key: '100-499', suffix: ' \u00B7 46% off' }\n  ];\n\n  function stackBracketLabel(qty) {\n    qty = parseInt(qty, 10) || 0;\n    if (qty >= 500) return null;\n    if (qty >= 100) return '100\u2013499';\n    if (qty >= 50)  return '50\u201399';\n    if (qty >= 20)  return '20\u201349';\n    if (qty >= 10)  return '10\u201319';\n    return '2\u20139';\n  }\n\n  function formatStackUnitMoney(dollars) {\n    return '$' + Number(dollars).toFixed(2);\n  }\n\n  function stackUnitDollars(qty, prices) {\n    qty = parseInt(qty, 10) || 0;\n    if (qty < 2) qty = 2;\n    return priceOf(getStackVariantId(qty), prices || window.PAB_VARIANT_PRICES || {});\n  }\n\n  function syncVolumePricingLabels(opts) {\n    opts = opts || {};\n    var root = opts.root || document;\n    var prices = opts.prices || window.PAB_VARIANT_PRICES || {};\n    var qty = opts.qty;\n\n    VOLUME_TIERS.forEach(function (tier) {\n      var dollars = priceOf(STACK_VARIANTS[tier.key], prices);\n      var row = root.querySelector('[data-pab-stack-tier=\"' + tier.key + '\"]');\n      var priceEl = row ? row.querySelector('[data-pab-stack-price]') : null;\n      if (priceEl && dollars > 0) {\n        priceEl.textContent = formatStackUnitMoney(dollars) + ' / stack' + tier.suffix;\n      }\n    });\n\n    if (qty == null) {\n      var qtyEl = root.querySelector('#qty');\n      if (qtyEl) qty = parseInt(String(qtyEl.value || qtyEl.textContent || '').replace(/[^0-9]/g, ''), 10) || 0;\n    }\n    var copy = root.querySelector('#discount-copy');\n    if (!copy || qty == null) return;\n    copy.setAttribute('data-pab-volume-hint', 'savings');\n    if (typeof window.PABMobileVolumeHintCopy === 'function') {\n      copy.textContent = window.PABMobileVolumeHintCopy(qty);\n      return;\n    }\n    if (qty >= 500) {\n      copy.textContent = 'Contact us for volume pricing';\n      return;\n    }\n    if (qty < 10) {\n      var more = Math.max(1, 10 - Math.max(qty, 0));\n      copy.textContent = 'Add ' + more + ' more ' + (more === 1 ? 'stack' : 'stacks') + ' to unlock 12% off';\n      return;\n    }\n    var unit = stackUnitDollars(qty, prices);\n    var base = priceOf(STACK_VARIANTS['1-9'], prices);\n    if (!(base > 0)) base = 25.99;\n    if (!(unit > 0)) unit = qty >= 100 ? 13.99 : qty >= 50 ? 16.99 : qty >= 20 ? 19.99 : qty >= 10 ? 22.99 : 25.99;\n    var savings = Math.max(0, (base - unit) * qty);\n    copy.textContent = savings > 0\n      ? formatStackUnitMoney(unit) + ' per stack \u00B7 Save ' + formatStackUnitMoney(savings)\n      : formatStackUnitMoney(unit) + ' per stack';\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 PAB page (form) readers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function readTotalCents(form) {\n    var customField = form.querySelector('#custom-total-field');\n    if (customField && customField.value && !isNaN(parseInt(customField.value, 10))) {\n      return parseInt(customField.value, 10);\n    }\n    var totalField = form.querySelector('#totalField');\n    if (totalField && totalField.value) {\n      var dollars = parseFloat(totalField.value.replace(/[^0-9.]/g, ''));\n      if (!isNaN(dollars)) return Math.round(dollars * 100);\n    }\n    return 0;\n  }\n\n  function readTier(form) {\n    var checked = form.querySelector('input[name=\"tier\"]:checked');\n    if (!checked) return null;\n    return tierLabel(checked.value);\n  }\n\n  function readStacks(form) {\n    var input = form.querySelector('#stackCount');\n    if (!input) return 0;\n    if (typeof window.parsePabStackCount === 'function') {\n      return window.parsePabStackCount(input.value);\n    }\n    return parseInt(String(input.value).replace(/[^\\d]/g, ''), 10) || 0;\n  }\n\n  function readPaperFromForm(form) {\n    if (form.querySelector('#durablePaper')?.checked) return 'Premium Durable';\n    if (form.querySelector('#flamePaper')?.checked)   return 'Flame-Retardant';\n    return 'Signature';\n  }\n\n  function readFinishFromForm(form) {\n    return form.querySelector('#realAged')?.checked ? 'RealAged' : 'Standard';\n  }\n\n  function yesNo(v) { return v ? 'Yes' : 'No'; }\n\n  function isEnabledFeatureValue(value) {\n    return value === true || /^yes$/i.test(String(value || '').trim());\n  }\n\n  function normalizeSavedAccessoryItems(items) {\n    return (items || []).map(function (item) {\n      var qty = clampAccessoryQty(item && item.qty);\n      return {\n        variantId: String(item && item.variantId || ''),\n        qty: qty\n      };\n    }).filter(function (item) {\n      return item.variantId && isAccessoryVariantId(item.variantId);\n    });\n  }\n\n  function savedConfiguratorRecord(spec, buildId) {\n    return {\n      version: PAB_CONFIG_STATE_VERSION,\n      savedAt: Date.now(),\n      buildId: String(buildId || '').trim(),\n      state: {\n        tier: tierKey(spec.tier),\n        stacks: readStackQuantity(spec),\n        billName: String(spec.billName || '').trim(),\n        billSeries: normalizeBillSeriesLabel(spec.billSeries),\n        denomination: formatDenominationProperty(spec.denomination),\n        customDenomination: String(spec.customDenomination || '').trim(),\n        baseBill: String(spec.baseBill || '').trim(),\n        paper: paperKeyFromLabel(spec.paper),\n        finish: finishKeyFromLabel(spec.finish),\n        uv: isEnabledFeatureValue(spec.uv),\n        serials: isEnabledFeatureValue(spec.serials),\n        rush: isEnabledFeatureValue(spec.rush),\n        denomChange: isEnabledFeatureValue(spec.denomChange),\n        accessoryItems: normalizeSavedAccessoryItems(spec.accessoryItems)\n      }\n    };\n  }\n\n  function saveLastAddedConfiguratorState(spec, buildId) {\n    var record = savedConfiguratorRecord(spec, buildId);\n    if (!record.buildId) return null;\n    try {\n      window.sessionStorage.setItem(PAB_CONFIG_STATE_KEY, JSON.stringify(record));\n      var historyState = Object.assign({}, window.history.state || {});\n      historyState[PAB_CONFIG_HISTORY_KEY] = record.buildId;\n      window.history.replaceState(historyState, document.title, window.location.href);\n    } catch (_e) {\n      return null;\n    }\n    return record;\n  }\n\n  function readLastAddedConfiguratorState() {\n    try {\n      var raw = window.sessionStorage.getItem(PAB_CONFIG_STATE_KEY);\n      if (!raw) return null;\n      var record = JSON.parse(raw);\n      var savedAt = parseInt(record && record.savedAt, 10) || 0;\n      if (\n        !record ||\n        record.version !== PAB_CONFIG_STATE_VERSION ||\n        !String(record.buildId || '').trim() ||\n        !record.state ||\n        !savedAt ||\n        Date.now() - savedAt > PAB_CONFIG_STATE_MAX_AGE_MS\n      ) {\n        clearLastAddedConfiguratorState();\n        return null;\n      }\n      return record;\n    } catch (_e) {\n      clearLastAddedConfiguratorState();\n      return null;\n    }\n  }\n\n  function clearLastAddedConfiguratorState() {\n    try {\n      window.sessionStorage.removeItem(PAB_CONFIG_STATE_KEY);\n      var historyState = Object.assign({}, window.history.state || {});\n      delete historyState[PAB_CONFIG_HISTORY_KEY];\n      window.history.replaceState(historyState, document.title, window.location.href);\n    } catch (_e) {}\n  }\n\n  function currentConfiguratorHistoryBuildId() {\n    try {\n      return String(\n        window.history.state && window.history.state[PAB_CONFIG_HISTORY_KEY] || ''\n      ).trim();\n    } catch (_e) {\n      return '';\n    }\n  }\n\n  function readDenomChange(form, tier) {\n    if (tierKey(tier) === 'ultimate') return 'Included';\n    return yesNo(!!form.querySelector('#denominationChange')?.checked);\n  }\n\n  function readMockupFormatState() {\n    if (\n      !window.PABMockupState ||\n      typeof window.PABMockupState.getState !== 'function'\n    ) return null;\n    var state = window.PABMockupState.getState();\n    return state && typeof state === 'object' ? state : null;\n  }\n\n  function readBillSeriesFromForm(form) {\n    var state = readMockupFormatState();\n    if (state && state.billSeries) return String(state.billSeries).trim();\n    var el = form.querySelector('#billSeriesField') ||\n      form.querySelector('[name=\"properties[Bill Series]\"]');\n    return el ? String(el.value || '').trim() : '';\n  }\n\n  function readDenominationFromForm(form) {\n    var state = readMockupFormatState();\n    if (state && state.denomination) return String(state.denomination).trim();\n    var el = form.querySelector('#billDenominationField') ||\n      form.querySelector('[name=\"properties[Denomination]\"]');\n    return el ? String(el.value || '').trim() : '';\n  }\n\n  /* The customer's actual figure when the denomination type is Custom.\n     Kept separate from `Denomination` so the value is never collapsed into\n     the word \"Custom\" \u2014 see formatDenominationProperty below. */\n  function readCustomDenominationFromForm(form) {\n    var el = form.querySelector('#billCustomDenominationField') ||\n      form.querySelector('[name=\"properties[Custom Denomination]\"]');\n    return el ? String(el.value || '').trim() : '';\n  }\n\n  /* Which existing bill design a custom figure is printed on. Blank for\n     standard denominations, where `Denomination` already names the design. */\n  function readBaseBillFromForm(form) {\n    var state = readMockupFormatState();\n    if (state && state.baseBill) return String(state.baseBill).trim();\n    var el = form.querySelector('#billBaseBillField') ||\n      form.querySelector('[name=\"properties[Base Bill]\"]');\n    return el ? String(el.value || '').trim() : '';\n  }\n\n  function readPreviewImageFromForm(form) {\n    var el = form.querySelector('#billPreviewImageField') ||\n      form.querySelector('[name=\"properties[_preview_image]\"]');\n    if (el && el.value) return String(el.value).trim();\n    var mockupImg = document.getElementById('bill-image');\n    if (mockupImg && mockupImg.src) {\n      var visible = mockupImg.style.display !== 'none' &&\n        getComputedStyle(mockupImg).display !== 'none';\n      var customSample = document.querySelector('#pab-mockup-root .bill-inner.custom-sample');\n      if (visible && !customSample) return String(mockupImg.currentSrc || mockupImg.src).trim();\n    }\n    var legacyImg = document.getElementById('tierImage');\n    if (legacyImg && legacyImg.src) return String(legacyImg.currentSrc || legacyImg.src).trim();\n    return resolvePabPreviewImageUrl(\n      readBillSeriesFromForm(form),\n      readDenominationFromForm(form),\n      readBaseBillFromForm(form)\n    );\n  }\n\n  function sanitizePreviewImageUrl(raw) {\n    var url = String(raw || '').trim();\n    if (!url) return '';\n    try {\n      var parsed = new URL(url, window.location.origin);\n      if (parsed.protocol !== 'https:') return '';\n      var host = parsed.hostname.toLowerCase();\n      var hostOk = host === 'cdn.shopify.com' ||\n        host.endsWith('.myshopify.com') ||\n        host === window.location.hostname.toLowerCase();\n      var path = parsed.pathname || '';\n      var pathOk = path.indexOf('/cdn/shop/') >= 0 ||\n        path.indexOf('/s/files/') >= 0 ||\n        path.indexOf('/assets/') >= 0;\n      if (!hostOk || !pathOk) return '';\n      if (/example-stack/i.test(path) || /example-stack/i.test(url)) return '';\n      return parsed.href;\n    } catch (_e) {\n      return '';\n    }\n  }\n\n  /* Properties the builder always states for itself. Absence from the next bag\n   * means the customer switched it off, not that we forgot it, so preserving\n   * the previous value would resurrect a cleared choice. Everything else is\n   * still carried forward, which is what protects properties written by other\n   * systems from being dropped on edit. */\n  var BUILDER_OWNED_PROPERTIES = ['Bill Name', 'Rush Service Requested', '_pab_checkout_breakdown', '_pab_checkout_charge_rows', '_pab_bill_name', '_pab_bill_format', '_pab_rush_service'];\n\n  function mergePreservedLineProperties(nextProperties, existingProperties) {\n    if (!existingProperties || typeof existingProperties !== 'object') {\n      return nextProperties;\n    }\n    Object.keys(existingProperties).forEach(function (key) {\n      if (Object.prototype.hasOwnProperty.call(nextProperties, key)) return;\n      if (BUILDER_OWNED_PROPERTIES.indexOf(key) !== -1 || key.indexOf('Price \u00B7 ') === 0 || key.indexOf('_pab_price_') === 0 || Object.prototype.hasOwnProperty.call(PAB_RAW_PROPERTIES, key) || Object.values(PAB_RAW_PROPERTIES).indexOf(key) !== -1 || PAB_CHARGE_PROPERTIES.indexOf(key) !== -1 || key === 'Bill format' || key === 'Rush service') return;\n      var val = existingProperties[key];\n      if (val == null || val === '') return;\n      nextProperties[key] = val;\n    });\n    return nextProperties;\n  }\n\n  var PAB_BILL_PREVIEW_FILES = {\n    'New Series': {\n      '1': '90s_ONE_DOLLAR.png',\n      '2': '90s_TWO_DOLLAR.png',\n      '5': 'NS_FIVE_DOLLAR.png',\n      '10': 'NS_TEN_DOLLAR.png',\n      '20': 'NS_TWENTY_DOLLAR.png',\n      '50': 'NS_FIFTY_DOLLAR.png',\n      '100': 'NS_ONE_HUNDRED_DOLLAR.png'\n    },\n    '2000 Series': {\n      '1': '90s_ONE_DOLLAR.png',\n      '2': '90s_TWO_DOLLAR.png',\n      '5': '2000s_FIVE_DOLLAR.png',\n      '10': '2000s_TEN_DOLLAR.png',\n      '20': '2000s_TWENTY_DOLLAR.png',\n      '50': '2000s_FIFTY_DOLLAR.png',\n      '100': '2000s_ONE_HUNDRED_DOLLAR.png'\n    },\n    '1990 Series': {\n      '1': '90s_ONE_DOLLAR.png',\n      '2': '90s_TWO_DOLLAR.png',\n      '5': '90s_FIVE_DOLLAR.png',\n      '10': '90s_TEN_DOLLAR.png',\n      '20': '90s_TWENTY_DOLLAR.png',\n      '50': '90s_FIFTY_DOLLAR.png',\n      '100': '90s_ONE_HUNDRED_DOLLAR.png'\n    },\n    'Vintage Series': {\n      '500': 'PAB_VTG_FIVE_HUNDRED.png',\n      '1000': 'PAB_VTG_ONE_THOUSAND.png',\n      '5000': 'PAB_VTG_FIVE_THOUSAND.png',\n      '10000': 'PAB_VTG_TEN_THOUSAND.png',\n      '100000': 'PAB_VTG_ONE_HUNDRED_THOUSAND.png',\n      '1000000': 'PAB_VTG_ONE_MILLION.png'\n    }\n  };\n\n  function normalizeBillSeriesLabel(raw) {\n    var value = String(raw || '').trim();\n    if (!value) return 'New Series';\n    if (/^vintage/i.test(value)) return 'Vintage Series';\n    if (/^1990/i.test(value)) return '1990 Series';\n    if (/^2000/i.test(value)) return '2000 Series';\n    return 'New Series';\n  }\n\n  function normalizeDenomKey(raw) {\n    var value = String(raw || '').trim().toLowerCase();\n    /* '$custom' is the configurator chip's sentinel; 'Custom' is the cart\n     * property. They mean the same thing, but only the second was recognised:\n     * stripping the $ and then the non-digits left an empty string, which fell\n     * through to the '100' default. So resolving a preview from the chip's own\n     * value returned $100 artwork instead of nothing, quietly. */\n    if (!value || value === 'custom' || value === '$custom') return 'custom';\n    return value.replace(/^\\$/, '').replace(/[^\\d]/g, '') || '100';\n  }\n\n  function formatDenominationProperty(raw) {\n    var key = normalizeDenomKey(raw);\n    if (key === 'custom') return 'Custom';\n    return '$' + key;\n  }\n\n  var PAB_SERIES_DENOMINATIONS = {\n    'New Series': ['5', '10', '20', '50', '100'],\n    '2000 Series': ['5', '10', '20', '50', '100'],\n    '1990 Series': ['1', '2', '5', '10', '20', '50', '100'],\n    'Vintage Series': ['500', '1000', '5000', '10000', '100000', '1000000']\n  };\n\n  function pabDenominationsForSeries(series) {\n    var label = normalizeBillSeriesLabel(series);\n    return (PAB_SERIES_DENOMINATIONS[label] || PAB_SERIES_DENOMINATIONS['New Series']).slice();\n  }\n\n  function isPabDenominationAvailable(series, denomination) {\n    var key = normalizeDenomKey(denomination);\n    if (key === 'custom') return true;\n    return pabDenominationsForSeries(series).indexOf(key) !== -1;\n  }\n\n  function pabDefaultDenominationForSeries(series) {\n    return normalizeBillSeriesLabel(series) === 'Vintage Series' ? '$500' : '$100';\n  }\n\n  function normalizePabBaseBill(series, baseBill, fallbackDenomination) {\n    var seriesLabel = normalizeBillSeriesLabel(series);\n    var available = pabDenominationsForSeries(seriesLabel);\n    var candidates = [baseBill, fallbackDenomination];\n    for (var i = 0; i < candidates.length; i++) {\n      var raw = String(candidates[i] == null ? '' : candidates[i]).trim();\n      if (!raw || /^\\$?custom$/i.test(raw)) continue;\n      var key = normalizeDenomKey(raw);\n      if (available.indexOf(key) !== -1) return '$' + key;\n    }\n    return pabDefaultDenominationForSeries(seriesLabel);\n  }\n\n  function normalizePabFormatState(series, denomination, baseBill, fallbackBaseBill) {\n    var seriesLabel = normalizeBillSeriesLabel(series);\n    var denominationLabel = formatDenominationProperty(denomination);\n    if (denominationLabel === 'Custom') {\n      return {\n        billSeries: seriesLabel,\n        denomination: 'Custom',\n        baseBill: normalizePabBaseBill(seriesLabel, baseBill, fallbackBaseBill)\n      };\n    }\n    if (!isPabDenominationAvailable(seriesLabel, denominationLabel)) {\n      denominationLabel = pabDefaultDenominationForSeries(seriesLabel);\n    }\n    return {\n      billSeries: seriesLabel,\n      denomination: denominationLabel,\n      baseBill: ''\n    };\n  }\n\n  function normalizeAssetBaseUrl(base) {\n    var value = String(base || '').trim();\n    if (!value) return window.location.origin + '/cdn/shop/assets/';\n    if (value.indexOf('//') === 0) return window.location.protocol + value;\n    if (value.indexOf('http') === 0) return value;\n    if (value.charAt(0) === '/') return window.location.origin + value;\n    return window.location.origin + '/' + value;\n  }\n\n  function getPabAssetBaseUrl() {\n    if (window.PAB && window.PAB.assetBaseUrl) {\n      return normalizeAssetBaseUrl(window.PAB.assetBaseUrl);\n    }\n    var scripts = document.querySelectorAll('script[src*=\"pab-pricing.js\"], script[src*=\"pab-mockup.js\"]');\n    for (var i = 0; i < scripts.length; i++) {\n      var src = scripts[i].getAttribute('src') || '';\n      if (!src) continue;\n      return normalizeAssetBaseUrl(\n        src.replace(/(?:pab-pricing|pab-mockup)\\.js(?:\\?.*)?$/, '')\n      );\n    }\n    return normalizeAssetBaseUrl('/cdn/shop/assets/');\n  }\n\n  function resolvePabPreviewImageUrl(series, denomination, baseDenomination) {\n    var denomKey = normalizeDenomKey(denomination);\n    var seriesLabel = normalizeBillSeriesLabel(series);\n    /* Custom keeps the chosen bill artwork. The exact printed value is supplied\n     * after checkout, so the preview must never flash a generic custom image. */\n    if (denomKey === 'custom') {\n      denomKey = normalizeDenomKey(\n        normalizePabBaseBill(seriesLabel, baseDenomination)\n      );\n    }\n    if (!isPabDenominationAvailable(seriesLabel, denomKey)) {\n      denomKey = normalizeDenomKey(pabDefaultDenominationForSeries(seriesLabel));\n    }\n    var file = PAB_BILL_PREVIEW_FILES[seriesLabel] &&\n      PAB_BILL_PREVIEW_FILES[seriesLabel][denomKey];\n    if (!file) return '';\n    return sanitizePreviewImageUrl(getPabAssetBaseUrl() + file);\n  }\n\n  var CASE_VARIANT_ID = '45279612993812';\n  var COUNTER_VARIANT_ID = '45138745262356';\n\n  /* Hard cap on per-accessory quantity. Enforced everywhere:\n   *   - Liquid stepper row (min/max + disabled buttons at boundaries)\n   *   - JS stepper click handler in static-cart.liquid\n   *   - JS blur handler for typed values in static-cart.liquid\n   *   - editPabBuild() merge step (authoritative)\n   *   - assertCartInvariants() (loud failure if any line drifts outside)\n   * If you change this, update the matching constant in\n   * snippets/pab-cart-line-accessory-row.liquid. */\n  var MAX_ACCESSORY_QTY = 15;\n\n  function clampAccessoryQty(qty) {\n    var q = parseInt(qty, 10);\n    if (isNaN(q) || q < 0) q = 0;\n    if (q > MAX_ACCESSORY_QTY) q = MAX_ACCESSORY_QTY;\n    return q;\n  }\n\n  /* Canonical accessory registry. Ordered list of every accessory that\n   * appears in the PAB cart-line stepper UI. If you add an accessory\n   * here, also add a matching row in snippets/pab-cart-line.liquid \u2014\n   * the Liquid render hardcodes the same variant IDs/labels so the cart\n   * page can render all 5 rows regardless of what's in the property bag. */\n  var ACCESSORY_DEFS = [\n    { variantId: '44193409138964', label: 'Red Money Gun'   },\n    { variantId: '44193409171732', label: 'Pink Money Gun'  },\n    { variantId: '44193409204500', label: 'Black Money Gun' },\n    { variantId: '44193409237268', label: 'Gold Money Gun'  },\n    { variantId: CASE_VARIANT_ID,  label: 'Display Case'    },\n    { variantId: COUNTER_VARIANT_ID, label: 'Money Counter' }\n  ];\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Stack quantity carriers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * Shipping weight = variant weight \u00D7 line quantity (Shopify native).\n   * Accessories use each product's own variant weight \u00D7 quantity. */\n\n  function isRealAgedShippingFinish(finish, paper) {\n    var paperKey = paperKeyFromLabel(paper);\n    if (typeof paper === 'string' && /^(signature|durable|flame)$/i.test(String(paper).trim())) {\n      paperKey = String(paper).toLowerCase();\n    }\n    return /realaged|real-aged/i.test(String(finish || '')) && paperKey !== 'durable';\n  }\n\n  function resolveStackBuildVariantId(spec) {\n    if (!PAB_STACK_VARIANT_STANDARD) {\n      throw new Error('PAB: PAB_STACK_VARIANT_STANDARD is not configured.');\n    }\n    if (isRealAgedShippingFinish(spec.finish, spec.paper)) {\n      if (!PAB_STACK_VARIANT_REALAGED) {\n        throw new Error(\n          'PAB: RealAged stack variant is not configured. Set PAB_STACK_VARIANT_REALAGED ' +\n          'to the \"Print A Bill - RealAged Stack\" variant ID (4.0 oz) in assets/pab-pricing.js.'\n        );\n      }\n      return Number(PAB_STACK_VARIANT_REALAGED);\n    }\n    return Number(PAB_STACK_VARIANT_STANDARD);\n  }\n\n  function readStackQuantity(spec) {\n    var stacks = parseInt(spec && spec.stacks, 10) || 0;\n    if (stacks < 2) throw new Error('PAB: stack count must be at least 2');\n    return stacks;\n  }\n\n  /* Cart Transform divides _total_cents by line quantity and rounds per unit.\n   * When exact main \u00F7 stacks is not an integer cent amount, store the\n   * Shopify-allocated main total so properties, PAB UI, and checkout agree. */\n  function allocateShopifyMainLineCents(exactMainCents, stackQty) {\n    var exact = parseInt(exactMainCents, 10) || 0;\n    var qty = parseInt(stackQty, 10) || 0;\n    if (exact <= 0) {\n      return {\n        exactMainCents: exact,\n        roundedUnitCents: 0,\n        allocatedMainCents: exact,\n        allocationDriftCents: 0\n      };\n    }\n    if (qty < 2) {\n      return {\n        exactMainCents: exact,\n        roundedUnitCents: exact,\n        allocatedMainCents: exact,\n        allocationDriftCents: 0\n      };\n    }\n    var roundedUnit = Math.round(exact / qty);\n    var allocated = roundedUnit * qty;\n    return {\n      exactMainCents: exact,\n      roundedUnitCents: roundedUnit,\n      allocatedMainCents: allocated,\n      allocationDriftCents: allocated - exact\n    };\n  }\n\n  function applyShopifyMainLineAllocation(spec, exactMainCents) {\n    var stacks = readStackQuantity(spec);\n    var alloc = allocateShopifyMainLineCents(exactMainCents, stacks);\n    spec.exactMainCents = alloc.exactMainCents;\n    spec.mainLineCents = alloc.allocatedMainCents;\n    spec.roundedUnitCents = alloc.roundedUnitCents;\n    spec.allocationDriftCents = alloc.allocationDriftCents;\n    spec.totalCents = alloc.allocatedMainCents +\n      (parseInt(spec.accessoryCents, 10) || 0);\n    return spec;\n  }\n\n  function computeCustomerFacingTotals(spec, variantPrices, accessoryCents) {\n    var acc = parseInt(accessoryCents, 10) || 0;\n    var exactMain = computeMainLineTotalCents(spec, variantPrices);\n    var alloc = allocateShopifyMainLineCents(exactMain, readStackQuantity(spec));\n    return {\n      exactMainCents: alloc.exactMainCents,\n      mainLineCents: alloc.allocatedMainCents,\n      roundedUnitCents: alloc.roundedUnitCents,\n      allocationDriftCents: alloc.allocationDriftCents,\n      accessoryCents: acc,\n      totalCents: alloc.allocatedMainCents + acc\n    };\n  }\n\n  function computeCustomerFacingTotalCents(spec, variantPrices, accessoryCents) {\n    return computeCustomerFacingTotals(spec, variantPrices, accessoryCents).totalCents;\n  }\n\n  function computeMainLineTotalCents(spec, variantPrices) {\n    return computeTotalCents({\n      tier:        tierKey(spec.tier) || spec.tier,\n      stacks:      readStackQuantity(spec),\n      paper:       spec.paper,\n      finish:      spec.finish,\n      uv:          !!spec.uv,\n      serials:     !!spec.serials,\n      denomChange: isEnabledFeatureValue(spec.denomChange)\n    }, variantPrices || window.PAB_VARIANT_PRICES || {}, 0);\n  }\n\n  var ACCESSORY_VARIANT_IDS = {};\n  ACCESSORY_DEFS.forEach(function (def) {\n    ACCESSORY_VARIANT_IDS[String(def.variantId)] = true;\n  });\n\n  function isAccessoryVariantId(variantId) {\n    return !!ACCESSORY_VARIANT_IDS[String(variantId)];\n  }\n\n  function isPabAccessoryLine(item) {\n    if (!item || !item.properties) return false;\n    if (item.properties._custom_build) return false;\n    if (String(item.properties._pab_accessory_line || '') !== 'true') return false;\n    var bid = String(item.properties._build_id || '').trim();\n    if (!bid) return false;\n    return isAccessoryVariantId(item.variant_id);\n  }\n\n  function findAccessoryLinesForBuild(cart, buildId) {\n    var bid = String(buildId || '').trim();\n    if (!bid) return [];\n    return (cart.items || []).filter(function (it) {\n      return isPabAccessoryLine(it) && String(it.properties._build_id || '') === bid;\n    });\n  }\n\n  function parseAccessoryItemsFromCart(cart, buildId) {\n    var items = defaultAccessoryItems();\n    var byVariantId = {};\n    items.forEach(function (it) { byVariantId[String(it.variantId)] = it; });\n    findAccessoryLinesForBuild(cart, buildId).forEach(function (line) {\n      var vid = String(line.variant_id);\n      if (byVariantId[vid]) {\n        byVariantId[vid].qty = parseInt(line.quantity, 10) || 0;\n      }\n    });\n    return items;\n  }\n\n  function pabMainLineCentsFromLine(line) {\n    var p = (line && line.properties) || {};\n    var propMain = parseInt(p._total_cents, 10) || 0;\n    var shopifyMain = parseInt(line && line.final_line_price, 10) || 0;\n    if (propMain <= 0) return shopifyMain;\n    /* Legacy lines stored exact pre-round cents; Shopify line total is authoritative. */\n    if (!p._total_cents_exact && shopifyMain > 0 && shopifyMain !== propMain) {\n      return shopifyMain;\n    }\n    return propMain;\n  }\n\n  /* Customer-facing card total = main build + linked accessory line prices. */\n  function pabDisplayTotalCentsFromLine(line, cart) {\n    var p = (line && line.properties) || {};\n    var mainCents = pabMainLineCentsFromLine(line);\n    var buildId = p._build_id || '';\n    var accLineCents = 0;\n    if (cart && buildId) {\n      findAccessoryLinesForBuild(cart, buildId).forEach(function (acc) {\n        accLineCents += parseInt(acc.final_line_price, 10) || 0;\n      });\n    }\n    if (accLineCents > 0) return mainCents + accLineCents;\n    var fullBuild = parseInt(p._full_build_cents, 10) || 0;\n    if (fullBuild > mainCents) return fullBuild;\n    var accProp = parseInt(p._accessory_cents, 10) || 0;\n    return mainCents + accProp;\n  }\n\n  function pabAccessoryCentsFromLine(line, cart) {\n    var p = (line && line.properties) || {};\n    var buildId = p._build_id || '';\n    var accLineCents = 0;\n    if (cart && buildId) {\n      findAccessoryLinesForBuild(cart, buildId).forEach(function (acc) {\n        accLineCents += parseInt(acc.final_line_price, 10) || 0;\n      });\n    }\n    if (accLineCents > 0) return accLineCents;\n    return parseInt(p._accessory_cents, 10) || 0;\n  }\n\n  function accessoryVariantPurchasable(variantId) {\n    var id = String(variantId || '');\n    if (!id) return false;\n    var map = window.PAB_ACCESSORY_AVAILABILITY || {};\n    if (Object.prototype.hasOwnProperty.call(map, id)) return map[id] !== false;\n    var card = document.querySelector('.accessory[data-variant=\"' + id + '\"]');\n    if (card && card.getAttribute('data-available') === 'false') return false;\n    if (card && card.classList.contains('is-out-of-stock')) return false;\n    return true;\n  }\n\n  function stripUnavailableAccessories(items) {\n    return (items || []).map(function (item) {\n      if (!item) return item;\n      var qty = clampAccessoryQty(item.qty);\n      if (!accessoryVariantPurchasable(item.variantId)) qty = 0;\n      return {\n        variantId: item.variantId,\n        label: item.label,\n        qty: qty\n      };\n    });\n  }\n\n  function findAccessoryStockProblem(items, cart, limits, editingBuildId) {\n    for (var item of items || []) {\n      var id = String(item.variantId || '');\n      var requested = Math.max(0, parseInt(item.qty, 10) || 0);\n      var limit = limits[id];\n      if (!requested || typeof limit !== 'number' || !Number.isFinite(limit) || limit < 0) continue;\n      var existing = (cart.items || []).reduce(function (total, line) {\n        if (String(line.variant_id) !== id) return total;\n        var p = line.properties || {};\n        if (editingBuildId && String(p._build_id || '') === String(editingBuildId) && String(p._pab_accessory_line || '') === 'true') return total;\n        return total + Math.max(0, parseInt(line.quantity, 10) || 0);\n      }, 0);\n      var remaining = Math.max(0, Math.floor(limit) - existing);\n      if (requested > remaining) return { label: item.label || 'Accessory', remaining: remaining, inCart: existing };\n    }\n    return null;\n  }\n\n  async function requireAccessoryStock(items, editingBuildId, currentCart) {\n    var limits = {};\n    (items || []).forEach(function (item) {\n      if (!(parseInt(item.qty, 10) > 0)) return;\n      var card = document.querySelector('.accessory[data-variant=\"' + String(item.variantId) + '\"]') || document.querySelector('[data-pab-acc-row][data-pab-variant-id=\"' + String(item.variantId) + '\"]');\n      var raw = card && card.getAttribute('data-pab-stock-limit');\n      if (raw == null || raw === '') return;\n      var limit = Number(raw);\n      if (Number.isFinite(limit) && limit >= 0) limits[String(item.variantId)] = limit;\n    });\n    if (!Object.keys(limits).length) return;\n    var cart = currentCart;\n    if (!cart) {\n      try {\n        var response = await fetch('/cart.js', { credentials: 'same-origin', cache: 'no-store' });\n        if (response.ok) cart = await response.json();\n      } catch (_stockError) {}\n    }\n    if (!cart || !Array.isArray(cart.items)) return;\n    var problem = findAccessoryStockProblem(items, cart, limits, editingBuildId);\n    if (!problem) return;\n    var messages = document.querySelector('[data-pab-stock-in-cart]');\n    var key = problem.remaining > 0 ? (editingBuildId ? 'data-pab-stock-edit' : 'data-pab-stock-remaining') : problem.inCart > 0 ? 'data-pab-stock-in-cart' : 'data-pab-stock-unavailable';\n    var message = messages && (messages.getAttribute(key) || messages.getAttribute('data-pab-stock-remaining'));\n    if (message) throw new Error(message.replace('[accessory]', problem.label).replace('[count]', String(problem.remaining)));\n  }\n\n  function buildPlainAccessoryCartItems(accessoryItems, buildId) {\n    var bid = String(buildId || '').trim();\n    if (!bid) return [];\n    return (accessoryItems || [])\n      .filter(function (item) {\n        var qty = clampAccessoryQty(item && item.qty);\n        return item && qty > 0 && accessoryVariantPurchasable(item.variantId);\n      })\n      .map(function (item) {\n        return {\n          id: Number(item.variantId),\n          quantity: clampAccessoryQty(item.qty),\n          properties: {\n            _build_id: bid,\n            _pab_accessory_line: 'true'\n          }\n        };\n      })\n      .filter(function (entry) { return entry.id > 0 && entry.quantity > 0; });\n  }\n\n  async function syncPabAccessoryCartLines(cart, buildId, accessoryItems) {\n    var bid = String(buildId || '').trim();\n    if (!bid) throw new Error('PAB accessory sync: missing build id');\n\n    var desiredByVid = {};\n    ACCESSORY_DEFS.forEach(function (def) {\n      desiredByVid[String(def.variantId)] = 0;\n    });\n    (accessoryItems || []).forEach(function (item) {\n      if (!item) return;\n      var vid = String(item.variantId);\n      if (!isAccessoryVariantId(vid)) return;\n      var qty = clampAccessoryQty(item.qty);\n      if (!accessoryVariantPurchasable(vid)) qty = 0;\n      desiredByVid[vid] = qty;\n    });\n\n    var existing = findAccessoryLinesForBuild(cart, bid);\n    var existingByVid = {};\n    for (var ei = 0; ei < existing.length; ei++) {\n      var eline = existing[ei];\n      var evid = String(eline.variant_id);\n      if (!existingByVid[evid]) {\n        existingByVid[evid] = eline;\n      } else {\n        await removeCartLineByKey(eline.key);\n      }\n    }\n\n    var changeOpts = {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      credentials: 'same-origin'\n    };\n\n    for (var di = 0; di < ACCESSORY_DEFS.length; di++) {\n      var def = ACCESSORY_DEFS[di];\n      var vid = String(def.variantId);\n      var wantQty = desiredByVid[vid] || 0;\n      var line = existingByVid[vid];\n\n      if (wantQty <= 0) {\n        if (line) await removeCartLineByKey(line.key);\n        continue;\n      }\n\n      if (line) {\n        if (parseInt(line.quantity, 10) !== wantQty) {\n          var chRes = await fetch('/cart/change.js', Object.assign({}, changeOpts, {\n            body: JSON.stringify({ id: line.key, quantity: wantQty })\n          }));\n          if (!chRes.ok) {\n            var chErr = '';\n            try {\n              var chJson = await chRes.json();\n              chErr = (chJson && (chJson.description || chJson.message)) || '';\n            } catch (_ce) {}\n            throw new Error(chErr || ('Failed to update accessory (' + chRes.status + ')'));\n          }\n        }\n        continue;\n      }\n\n      var addRes = await fetch('/cart/add.js', Object.assign({}, changeOpts, {\n        body: JSON.stringify({\n          items: [{\n            id: Number(vid),\n            quantity: wantQty,\n            properties: {\n              _build_id: bid,\n              _pab_accessory_line: 'true'\n            }\n          }]\n        })\n      }));\n      if (!addRes.ok) {\n        var addErr = '';\n        try {\n          var addJson = await addRes.json();\n          addErr = (addJson && (addJson.description || addJson.message)) || '';\n        } catch (_ae) {}\n        throw new Error(addErr || ('Failed to add accessory (' + addRes.status + ')'));\n      }\n    }\n\n    return { synced: true, buildId: bid };\n  }\n\n  async function removePabBuildByKey(lineKey) {\n    if (!lineKey) throw new Error('PAB remove: missing line key');\n    var cartRes = await fetch('/cart.js', { credentials: 'same-origin', cache: 'no-store' });\n    if (!cartRes.ok) throw new Error('PAB remove: failed to read cart');\n    var cart = await cartRes.json();\n    var line = (cart.items || []).find(function (it) { return it && it.key === lineKey; });\n    if (!line) throw new Error('PAB remove: line not found');\n\n    var buildId = line.properties && line.properties._build_id;\n    var keysToRemove = [lineKey];\n    if (buildId) {\n      (cart.items || []).forEach(function (it) {\n        if (!it || !it.key || it.key === lineKey) return;\n        if (!it.properties) return;\n        if (String(it.properties._build_id || '') !== String(buildId)) return;\n        keysToRemove.push(it.key);\n      });\n    }\n\n    for (var ri = 0; ri < keysToRemove.length; ri++) {\n      await removeCartLineByKey(keysToRemove[ri]);\n    }\n    return { removed: keysToRemove.length, buildId: buildId || null };\n  }\n\n  async function removeCartLineByKey(lineKey) {\n    if (!lineKey) return;\n    await fetch('/cart/change.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      credentials: 'same-origin',\n      body: JSON.stringify({ id: lineKey, quantity: 0 })\n    });\n  }\n\n  /* Accessory metadata on the PAB line (guns/cases are separate cart lines).\n   * `_accessory_qtys` \u2014 display-only snapshot at add/edit time for the PAB card. */\n  var ACC_LIST_DELIM = '|';\n\n  function accessoryItemsToText(items) {\n    if (!items || !items.length) return '';\n    var visible = items.filter(function (i) { return i && i.qty > 0; });\n    return visible.map(function (i) { return i.label + ' \u00D7 ' + i.qty; }).join('\\n');\n  }\n\n  function accessoryItemsToListProp(items) {\n    if (!items || !items.length) return '';\n    var visible = items.filter(function (i) { return i && i.qty > 0; });\n    return visible.map(function (i) { return i.label + ' \u00D7 ' + i.qty; }).join(ACC_LIST_DELIM);\n  }\n  function accessoryItemsToQtysProp(items) {\n    if (!items || !items.length) return '';\n    return items.map(function (i) {\n      return String(i.variantId) + ':' + (parseInt(i.qty, 10) || 0);\n    }).join(ACC_LIST_DELIM);\n  }\n\n  function defaultAccessoryItems() {\n    return ACCESSORY_DEFS.map(function (def) {\n      return { variantId: def.variantId, label: def.label, qty: 0 };\n    });\n  }\n\n  function parseAccessoryEntry(entry) {\n    var s = String(entry || '').trim();\n    if (!s) return null;\n    var m = s.match(/^(.+?)\\s*[\u00D7x]\\s*(\\d+)\\s*$/i);\n    if (m) return { label: m[1].trim(), qty: parseInt(m[2], 10) || 1 };\n    return null;\n  }\n\n  /* Parse a cart line's property bag into the full 5-item accessory list.\n   * Preference order:\n   *   1. `_accessory_qtys` (Phase 2.3) \u2014 already structured per variantId\n   *   2. `_accessories_list` (Phase 2.2) \u2014 pipe-separated labels, match by label\n   *   3. Label-keyed properties, `Accessories` text, or legacy `Accessory N`\n   * Items not found in the source default to qty=0. The output always has\n   * one entry per ACCESSORY_DEFS item, in registry order. */\n  function parseAccessoryItemsFromProps(p) {\n    var items = defaultAccessoryItems();\n    var byVariantId = {};\n    items.forEach(function (it) { byVariantId[String(it.variantId)] = it; });\n\n    if (p && p._accessory_qtys) {\n      String(p._accessory_qtys).split(ACC_LIST_DELIM).forEach(function (entry) {\n        var pair = String(entry).split(':');\n        var vid = String(pair[0] || '').trim();\n        var qty = parseInt(pair[1], 10);\n        if (isNaN(qty) || qty < 0) qty = 0;\n        if (byVariantId[vid]) byVariantId[vid].qty = clampAccessoryQty(qty);\n      });\n      return items;\n    }\n\n    var labelToVariantId = {};\n    ACCESSORY_DEFS.forEach(function (def) {\n      labelToVariantId[def.label.toLowerCase()] = def.variantId;\n    });\n\n    var legacySrc = [];\n    var parsedFromLabelKeys = false;\n    if (p) {\n      ACCESSORY_DEFS.forEach(function (def) {\n        var raw = p[def.label];\n        if (raw == null || String(raw).trim() === '') return;\n        parsedFromLabelKeys = true;\n        var val = String(raw).trim();\n        var m = val.match(/^[\u00D7x]?\\s*(\\d+)\\s*$/i);\n        var qty = m ? parseInt(m[1], 10) : parseInt(val, 10);\n        if (isNaN(qty) || qty < 0) qty = 0;\n        if (byVariantId[def.variantId]) byVariantId[def.variantId].qty = clampAccessoryQty(qty);\n      });\n    }\n    if (!parsedFromLabelKeys) {\n      if (p && p._accessories_list) {\n        legacySrc = String(p._accessories_list).split(ACC_LIST_DELIM);\n      } else if (p) {\n        var numbered = [];\n        Object.keys(p).forEach(function (key) {\n          var m = String(key).match(/^Accessory\\s+(\\d+)$/i);\n          if (m) numbered.push({ n: parseInt(m[1], 10), val: p[key] });\n        });\n        if (numbered.length) {\n          numbered.sort(function (a, b) { return a.n - b.n; });\n          legacySrc = numbered.map(function (o) { return o.val; });\n        } else if (p.Accessories) {\n          var accStr = String(p.Accessories);\n          legacySrc = accStr.indexOf('\\n') >= 0 ? accStr.split('\\n') : accStr.split(',');\n        }\n      }\n      legacySrc.forEach(function (chunk) {\n        var entry = parseAccessoryEntry(chunk);\n        if (!entry) return;\n        var vid = labelToVariantId[entry.label.toLowerCase()];\n        if (vid && byVariantId[vid]) byVariantId[vid].qty = clampAccessoryQty(entry.qty);\n      });\n    }\n    return items;\n  }\n\n  /* Lazy live-price hydration for accessories. Mirrors the configurator's\n   * loadAccessoryPrices() IIFE on page.print-a-bill.liquid. Idempotent;\n   * one in-flight promise at a time. */\n  var accessoryPricesPromise = null;\n\n  function dispatchAccessoryPricesLoaded(missing) {\n    try {\n      document.dispatchEvent(new CustomEvent('pabAccessoryPricesLoaded', {\n        detail: { missing: missing || [] }\n      }));\n    } catch (_e) {}\n  }\n\n  function missingAccessoryVariantIds(store) {\n    return ACCESSORY_DEFS.filter(function (def) {\n      var v = store[def.variantId];\n      if (v === undefined || v === null || isNaN(v)) v = store[String(def.variantId)];\n      return v === undefined || v === null || isNaN(v);\n    }).map(function (def) { return String(def.variantId); });\n  }\n\n  function ensureAccessoryPrices() {\n    if (!window.ACCESSORY_LIVE_PRICES) window.ACCESSORY_LIVE_PRICES = {};\n    var store = window.ACCESSORY_LIVE_PRICES;\n    var allPresent = missingAccessoryVariantIds(store).length === 0;\n    if (allPresent) return Promise.resolve(store);\n    if (accessoryPricesPromise) return accessoryPricesPromise;\n\n    accessoryPricesPromise = Promise.all([\n      fetch('/products/prop-money-guns.js',    { credentials: 'same-origin' }).then(function (r) { return r.ok ? r.json() : null; }).catch(function () { return null; }),\n      fetch('/products/money-bill-display.js', { credentials: 'same-origin' }).then(function (r) { return r.ok ? r.json() : null; }).catch(function () { return null; }),\n      fetch('/products/money-counter.js',      { credentials: 'same-origin' }).then(function (r) { return r.ok ? r.json() : null; }).catch(function () { return null; })\n    ]).then(function (results) {\n      results.forEach(function (prod) {\n        if (!prod || !prod.variants) return;\n        prod.variants.forEach(function (v) {\n          var p = parseFloat(v.price);\n          store[String(v.id)] = p > 0 && p < 100 ? p : p / 100;\n          if (!window.PAB_ACCESSORY_AVAILABILITY) window.PAB_ACCESSORY_AVAILABILITY = {};\n          window.PAB_ACCESSORY_AVAILABILITY[String(v.id)] = v.available !== false;\n        });\n      });\n      accessoryPricesPromise = null;\n      var missing = missingAccessoryVariantIds(store);\n      if (missing.length && window.console) {\n        console.warn('[PAB] Accessory live prices unavailable for variant IDs:', missing);\n      }\n      dispatchAccessoryPricesLoaded(missing);\n      return store;\n    }).catch(function (err) {\n      accessoryPricesPromise = null;\n      if (window.console) {\n        console.warn('[PAB] Accessory price fetch failed (page continues):', err);\n      }\n      dispatchAccessoryPricesLoaded(missingAccessoryVariantIds(store));\n      return store;\n    });\n    return accessoryPricesPromise;\n  }\n\n  function accessoryUnitDollars(variantId, prices) {\n    var src = prices || window.ACCESSORY_LIVE_PRICES || {};\n    var v = src[variantId];\n    if (v === undefined || v === null || isNaN(v)) v = src[String(variantId)];\n    if (v === undefined || v === null || isNaN(v)) v = src[Number(variantId)];\n    return v ? parseFloat(v) : 0;\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Fail-closed accessory pricing (PRICE-01) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * When the /products/*.js fetch fails, ACCESSORY_LIVE_PRICES has no entry\n   * for the accessory and computeAccessoryCents contributes 0 for it. Shopify\n   * still charges its own price on the separate accessory line, so the\n   * customer is quoted less than they are charged \u2014 $100.98 in the builder,\n   * $120.97 in the cart. Rather than invent a fallback price, commit paths\n   * refuse and ask the customer to retry. */\n  var ACCESSORY_PRICE_UNAVAILABLE_MESSAGE =\n    \"We couldn't load current accessory pricing. Your build is saved\u2014please \" +\n    'retry in a moment so we can show you an accurate total.';\n\n  /* Zero is treated as unconfirmed, not free. No accessory legitimately costs\n   * nothing, so a 0 here always means the price never arrived. */\n  function hasConfirmedAccessoryPrice(variantId, prices) {\n    var src = prices || window.ACCESSORY_LIVE_PRICES || {};\n    var v = src[variantId];\n    if (v === undefined || v === null || isNaN(v)) v = src[String(variantId)];\n    if (v === undefined || v === null || isNaN(v)) v = src[Number(variantId)];\n    var n = parseFloat(v);\n    return isFinite(n) && n > 0;\n  }\n\n  /* Only what the customer actually selected can distort the total, so an\n   * unpriced accessory sitting at qty 0 must not block the build. */\n  function selectedAccessoriesMissingPrices(accessoryItems, prices) {\n    var missing = [];\n    (accessoryItems || []).forEach(function (item) {\n      if (!item) return;\n      if ((parseInt(item.qty, 10) || 0) <= 0) return;\n      if (hasConfirmedAccessoryPrice(item.variantId, prices)) return;\n      missing.push(String(item.variantId));\n    });\n    return missing;\n  }\n\n  function accessoryPriceUnavailableError(missing) {\n    var err = new Error(ACCESSORY_PRICE_UNAVAILABLE_MESSAGE);\n    err.name = 'PabAccessoryPriceUnavailable';\n    err.pabAccessoryPriceUnavailable = true;\n    err.missingVariantIds = missing;\n    return err;\n  }\n\n  /* ensureAccessoryPrices() only issues a request when something is missing,\n   * so calling it here doubles as the retry path \u2014 a Retry button re-enters\n   * the same commit and gets a fresh fetch. */\n  async function assertSelectedAccessoryPrices(accessoryItems) {\n    var missing = selectedAccessoriesMissingPrices(\n      accessoryItems,\n      window.ACCESSORY_LIVE_PRICES || {}\n    );\n    if (!missing.length) return;\n    await ensureAccessoryPrices();\n    missing = selectedAccessoriesMissingPrices(\n      accessoryItems,\n      window.ACCESSORY_LIVE_PRICES || {}\n    );\n    if (missing.length) throw accessoryPriceUnavailableError(missing);\n  }\n\n  function formatAccessoryPriceLabel(variantId, qty, prices) {\n    qty = parseInt(qty, 10) || 0;\n    if (qty <= 0) return '';\n    var unitDollars = accessoryUnitDollars(variantId, prices);\n    if (!unitDollars || unitDollars <= 0 || isNaN(unitDollars)) return 'Included';\n    var unitCents = Math.round(unitDollars * 100);\n    var lineCents = unitCents * qty;\n    if (qty === 1) return formatMoney(unitCents);\n    return formatMoney(unitCents) + ' \u00D7 ' + qty + ' \u00B7 ' + formatMoney(lineCents);\n  }\n\n  function hydrateAccessoryPricesFromCart(cart) {\n    if (!cart || !cart.items) return window.ACCESSORY_LIVE_PRICES || {};\n    if (!window.ACCESSORY_LIVE_PRICES) window.ACCESSORY_LIVE_PRICES = {};\n    var store = window.ACCESSORY_LIVE_PRICES;\n    cart.items.forEach(function (line) {\n      if (!isPabAccessoryLine(line)) return;\n      var qty = parseInt(line.quantity, 10) || 0;\n      if (qty <= 0) return;\n      var lineCents = parseInt(line.final_line_price, 10) || 0;\n      if (lineCents <= 0) return;\n      store[String(line.variant_id)] = lineCents / qty / 100;\n    });\n    return store;\n  }\n\n  function computeAccessoryCents(items, prices) {\n    if (!items || !items.length) return 0;\n    var total = 0;\n    items.forEach(function (item) {\n      var qty = clampAccessoryQty(item && item.qty);\n      if (!item || qty <= 0) return;\n      var dollars = accessoryUnitDollars(item.variantId, prices);\n      if (dollars > 0) total += Math.round(dollars * 100) * qty;\n    });\n    return total;\n  }\n\n  function readAccessoriesFromForm(form) {\n    var items = defaultAccessoryItems();\n    var byVariantId = {};\n    items.forEach(function (it) { byVariantId[String(it.variantId)] = it; });\n\n    form.querySelectorAll('.gun-qty').forEach(function (input) {\n      var qty = clampAccessoryQty(input.value);\n      var vid = String(input.dataset.variant);\n      if (byVariantId[vid]) byVariantId[vid].qty = qty;\n    });\n\n    form.querySelectorAll('.accessory-qty').forEach(function (input) {\n      var qty = clampAccessoryQty(input.value);\n      var vid = String(input.dataset.variant);\n      if (byVariantId[vid]) byVariantId[vid].qty = qty;\n    });\n\n    document.querySelectorAll('#pab-mockup-root .accessory[data-variant]').forEach(function (card) {\n      var vid = String(card.dataset.variant || '');\n      if (!byVariantId[vid]) return;\n      var qty = clampAccessoryQty((card.querySelector('strong') || {}).textContent);\n      if (card.getAttribute('data-available') === 'false' || card.classList.contains('is-out-of-stock')) qty = 0;\n      byVariantId[vid].qty = qty;\n    });\n\n    items = stripUnavailableAccessories(items);\n    var cents = computeAccessoryCents(items, window.ACCESSORY_LIVE_PRICES || {});\n    return {\n      text:  accessoryItemsToText(items),\n      cents: cents,\n      items: items\n    };\n  }\n\n  /* Configurator-only spec for live total display. Uses lowercase tier keys\n   * expected by computeTotalCents (radio values), not tierLabel() output. */\n  function buildCalculatorSpec(form) {\n    var tierRadio = form.querySelector('input[name=\"tier\"]:checked');\n    if (!tierRadio) return null;\n    var acc = readAccessoriesFromForm(form);\n    var paperKey = 'signature';\n    if (form.querySelector('#durablePaper')?.checked) paperKey = 'durable';\n    else if (form.querySelector('#flamePaper')?.checked) paperKey = 'flame';\n    return {\n      tier: tierRadio.value,\n      stacks: readStacks(form),\n      paper: paperKey,\n      finish: form.querySelector('#realAged')?.checked ? 'realaged' : 'standard',\n      uv: !!form.querySelector('#uvInk')?.checked,\n      serials: !!form.querySelector('#serialNumbers')?.checked,\n      denomChange: tierKey(tierRadio.value) === 'ultimate'\n        ? true\n        : !!form.querySelector('#denominationChange')?.checked,\n      accessoryCents: acc.cents\n    };\n  }\n\n  function refreshConfiguratorTotal(onCents) {\n    var form = document.getElementById('customOrderForm');\n    if (!form) {\n      if (onCents) onCents(0);\n      return Promise.resolve(0);\n    }\n    if (!form.querySelector('input[name=\"tier\"]:checked')) {\n      if (onCents) onCents(0);\n      return Promise.resolve(0);\n    }\n    return ensureVariantPrices().then(function (prices) {\n      return ensureAccessoryPrices().then(function () {\n        var spec = buildCalculatorSpec(form);\n        if (!spec) {\n          if (onCents) onCents(0);\n          return Promise.resolve(0);\n        }\n        var accessoryCents = spec.accessoryCents || 0;\n        delete spec.accessoryCents;\n        var cents = computeCustomerFacingTotalCents(spec, prices, accessoryCents);\n        renderPriceBreakdown(computePriceBreakdown(visiblePriceSpec(form), prices, window.ACCESSORY_LIVE_PRICES || {}));\n        syncVolumePricingLabels({ prices: prices, qty: spec.stacks, root: form });\n        if (onCents) onCents(cents);\n        return cents;\n      });\n    });\n  }\n\n  var PAB_BILL_NAME_ERROR = 'Please enter a bill name between 3 and 30 characters.';\n  var PAB_BILL_NAME_PATTERN = /^[a-zA-Z0-9 \\-']{3,30}$/;\n\n  function validateBillName(raw) {\n    if (typeof window.validatePabBillName === 'function') {\n      return window.validatePabBillName(raw);\n    }\n    var value = String(raw || '').trim();\n    if (!value || !PAB_BILL_NAME_PATTERN.test(value)) {\n      return { valid: false, value: value, message: PAB_BILL_NAME_ERROR };\n    }\n    return { valid: true, value: value, message: '' };\n  }\n\n  function readBillName(form) {\n    if (typeof window.syncPabBillNameFields === 'function') {\n      window.syncPabBillNameFields();\n    }\n    var el = form.querySelector('[name=\"properties[Bill Name]\"]') || form.querySelector('#billNameSubmit');\n    var result = validateBillName(el ? el.value : '');\n    if (result.valid && el) el.value = result.value;\n    return result.valid ? result.value : '';\n  }\n\n  function buildSpec(form) {\n    var tier = readTier(form);\n    var stacks = readStacks(form);\n    var acc = readAccessoriesFromForm(form);\n    var format = normalizePabFormatState(\n      readBillSeriesFromForm(form),\n      readDenominationFromForm(form),\n      readBaseBillFromForm(form)\n    );\n    return {\n      tier:             tier,\n      stacks:           stacks,\n      billName:         readBillName(form),\n      billSeries:       format.billSeries,\n      denomination:     format.denomination,\n      customDenomination: format.denomination === 'Custom'\n        ? readCustomDenominationFromForm(form)\n        : '',\n      baseBill:         format.baseBill,\n      previewImage:     resolvePabPreviewImageUrl(\n        format.billSeries,\n        format.denomination,\n        format.baseBill\n      ) || readPreviewImageFromForm(form),\n      paper:            readPaperFromForm(form),\n      finish:           readFinishFromForm(form),\n      uv:               !!form.querySelector('#uvInk')?.checked,\n      serials:          !!form.querySelector('#serialNumbers')?.checked,\n      /* Rush is a request, not a purchase. It never reaches computeTotalCents\n       * and has no variant, so it cannot move the price. */\n      rush:             !!form.querySelector('#rushService')?.checked,\n      denomChange:      readDenomChange(form, tier),\n      accessories:      acc.text,\n      accessoryItems:   acc.items,\n      accessoryCents:   acc.cents,\n      totalCents:       readTotalCents(form)\n    };\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 property-bag builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function buildPropertyBag(spec, existingBuildId, existingProperties) {\n    if (!spec.tier) throw new Error('PAB: tier not selected');\n    if (!spec.stacks || spec.stacks < 2) throw new Error('PAB: stack count must be at least 2');\n    if (!spec.totalCents || spec.totalCents <= 0) throw new Error('PAB: total is zero');\n    var billResult = validateBillName(spec.billName);\n    if (!billResult.valid) throw new Error(billResult.message);\n    var billName = billResult.value;\n    var format = normalizePabFormatState(\n      spec.billSeries,\n      spec.denomination,\n      spec.baseBill\n    );\n    spec.billSeries = format.billSeries;\n    spec.denomination = format.denomination;\n    spec.baseBill = format.baseBill;\n    if (spec.denomination !== 'Custom') spec.customDenomination = '';\n    spec.previewImage = resolvePabPreviewImageUrl(\n      spec.billSeries,\n      spec.denomination,\n      spec.baseBill\n    ) || sanitizePreviewImageUrl(spec.previewImage);\n\n    /* Customer-facing order: Tier \u2192 \u2026 \u2192 Denomination Change \u2192 Accessories.\n     * Line price uses _total_cents (no visible Total property). Private keys follow. */\n    var items = (spec.accessoryItems && spec.accessoryItems.length)\n      ? spec.accessoryItems\n      : defaultAccessoryItems();\n\n    var properties = {\n      'Bill Name':           billName,\n      _bill_name_base:       billName,\n      Tier:                  spec.tier,\n      Stacks:                formatStacksCount(spec.stacks),\n      Paper:                 spec.paper,\n      Finish:                spec.finish,\n      'UV Ink':              spec.uv ? 'Yes' : 'No',\n      'Serial Numbers':      spec.serials ? 'Yes' : 'No',\n      'Denomination Change': spec.denomChange\n    };\n\n    /* Rush differs from the features above: it is written only when requested\n     * and the key is omitted entirely otherwise, so an unrequested build\n     * carries no rush property at all. That keeps it out of the order, the\n     * notification and the staff email without anything having to filter it.\n     *\n     * Writing '' instead looked equivalent and was not: Shopify drops blank\n     * properties on /cart/add.js but keeps them on a line update, so an\n     * unchecked build kept an empty \"Rush Service Requested\" key forever.\n     * Omitting it is safe because BUILDER_OWNED_PROPERTIES stops the\n     * preservation merge putting the old 'Yes' back. */\n    if (spec.rush) properties['Rush Service Requested'] = 'Yes';\n\n    if (spec.billSeries) properties['Bill Series'] = spec.billSeries;\n    if (spec.denomination) properties.Denomination = spec.denomination;\n    // Only meaningful alongside Denomination = Custom. Carried as its own\n    // property so checkout, the order, and the Jotform prefill all receive the\n    // real figure rather than the type marker.\n    if (spec.denomination === 'Custom' && spec.customDenomination) {\n      properties['Custom Denomination'] = spec.customDenomination;\n    } else {\n      // Edits merge over the line's existing properties, so an inherited value\n      // would survive a switch back to a standard denomination. An empty\n      // string is how Shopify drops a line-item property.\n      properties['Custom Denomination'] = '';\n    }\n    /* Which bill design the custom figure is printed on. Only meaningful\n     * alongside Denomination = Custom, and blanked the same way when the\n     * customer switches back to a standard denomination \u2014 an inherited base\n     * bill would otherwise survive the edit merge and describe a design that\n     * is no longer being printed. */\n    if (spec.denomination === 'Custom' && spec.baseBill) {\n      properties['Base Bill'] = spec.baseBill;\n    } else {\n      properties['Base Bill'] = '';\n    }\n    var previewUrl = sanitizePreviewImageUrl(spec.previewImage) ||\n      resolvePabPreviewImageUrl(spec.billSeries, spec.denomination, spec.baseBill);\n    if (previewUrl) properties._preview_image = previewUrl;\n\n    var mainLineCents = parseInt(spec.mainLineCents, 10);\n    if (!mainLineCents || mainLineCents <= 0) {\n      mainLineCents = (parseInt(spec.totalCents, 10) || 0) -\n        (parseInt(spec.accessoryCents, 10) || 0);\n    }\n    if (mainLineCents <= 0) throw new Error('PAB: main line total is zero');\n\n    properties._custom_build = 'true';\n    properties._build_id = existingBuildId || uuid();\n    properties._total_cents = String(mainLineCents);\n    properties._full_build_cents = String(spec.totalCents);\n    properties._accessory_cents = String(spec.accessoryCents || 0);\n    var exactMainCents = parseInt(spec.exactMainCents, 10);\n    if (exactMainCents > 0) {\n      properties._total_cents_exact = String(exactMainCents);\n      if (spec.allocationDriftCents) {\n        properties._allocation_drift_cents = String(spec.allocationDriftCents);\n      }\n    }\n    properties._version = 'pab-v2';\n    properties._accessory_qtys = accessoryItemsToQtysProp(items);\n\n    var visibleList = accessoryItemsToListProp(items);\n    if (visibleList) properties._accessories_list = visibleList;\n\n    properties = appendPriceProperties(properties, spec);\n    return checkoutTimelineProperties(mergePreservedLineProperties(properties, existingProperties));\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Add to cart (Phase 1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  var _addInFlight = false;\n\n  function isAddInFlight() {\n    return _addInFlight;\n  }\n\n  function formatAddToCartError(status, details) {\n    if (status === 502 || status === 503 || status === 504) {\n      return 'The store is temporarily unavailable. Please wait a moment and tap Add to Cart again.';\n    }\n    if (details) return details;\n    return 'Failed to add your custom build to cart (' + status + '). Please try again.';\n  }\n\n  function requireProofTimelineAcknowledgment() {\n    var checkbox = document.getElementById('pab-proof-timeline-agree');\n    if (!checkbox || !checkbox.checked) {\n      if (window.PABProofTimeline) window.PABProofTimeline.prompt();\n      throw new Error(checkbox && checkbox.dataset.error || 'Please read and accept the custom order timeline before continuing.');\n    }\n    return checkoutTimelineProperties({\n      'Custom order timeline': checkbox.dataset.checkout,\n      _pab_proof_timeline_version: checkbox.dataset.version,\n      _pab_proof_timeline_accepted_at: new Date().toISOString(),\n      _pab_proof_timeline_acknowledgment: checkbox.dataset.agreement\n    });\n  }\n\n  async function addCustomBuildToCart(form) {\n    requireProofTimelineAcknowledgment();\n    if (_addInFlight) {\n      throw new Error('Add to cart is already in progress. Please wait.');\n    }\n    _addInFlight = true;\n\n    try {\n      if (!PAB_STACK_VARIANT_STANDARD) {\n        throw new Error(\n          'PAB: PAB_STACK_VARIANT_STANDARD is not configured in assets/pab-pricing.js. ' +\n          'Create the \"Print A Bill - Standard Stack\" variant (3.3 oz) in Shopify admin.'\n        );\n      }\n      await ensureAccessoryPrices();\n      await ensureVariantPrices();\n      var spec = buildSpec(form);\n      spec.accessoryItems = stripUnavailableAccessories(spec.accessoryItems);\n      await requireAccessoryStock(spec.accessoryItems);\n      await recomputeSpecTotals(spec, { requireAccessoryPrices: true });\n      var customTotalField = form.querySelector('#custom-total-field');\n      var totalField = form.querySelector('#totalField');\n      if (customTotalField) customTotalField.value = String(spec.totalCents || 0);\n      if (totalField) totalField.value = formatMoney(spec.totalCents || 0);\n      var stackVariantId = resolveStackBuildVariantId(spec);\n      var stackQty = readStackQuantity(spec);\n      var properties = Object.assign(buildPropertyBag(spec, null), requireProofTimelineAcknowledgment());\n      var accessoryItems = (spec.accessoryItems && spec.accessoryItems.length)\n        ? spec.accessoryItems\n        : defaultAccessoryItems();\n\n      var trace = false;\n      try {\n        trace = window.sessionStorage && window.sessionStorage.getItem('PAB_ADD_TRACE') === '1';\n      } catch (_t) {}\n      if (trace && window.console) {\n        console.info('[PAB add] POST /cart/add.js', {\n          variant_id: stackVariantId,\n          quantity: stackQty,\n          build_id: properties._build_id,\n          accessory_count: buildPlainAccessoryCartItems(accessoryItems, properties._build_id).length\n        });\n      }\n\n      var cartItems = [{\n        id: Number(stackVariantId),\n        quantity: stackQty,\n        properties: properties\n      }];\n      buildPlainAccessoryCartItems(accessoryItems, properties._build_id).forEach(function (acc) {\n        cartItems.push(acc);\n      });\n\n      Object.assign(properties, requireProofTimelineAcknowledgment());\n      var res = await fetch('/cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        credentials: 'same-origin',\n        body: JSON.stringify({ items: cartItems })\n      });\n\n      if (!res.ok) {\n        var details = '';\n        try {\n          var errJson = await res.json();\n          details = (errJson && (errJson.description || errJson.message)) || '';\n        } catch (_e) {}\n        throw new Error(formatAddToCartError(res.status, details));\n      }\n\n      var addJson = await res.json();\n      saveLastAddedConfiguratorState(spec, properties._build_id);\n      if (trace && window.console) {\n        console.info('[PAB add] OK', addJson);\n      }\n      await syncPabBillNameLetters({ reload: false });\n      return addJson;\n    } finally {\n      _addInFlight = false;\n    }\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Cart-line spec parsing (Phase 2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  function specFromCartLine(line, cart) {\n    var p = (line && line.properties) || {};\n    var paperLabel  = (p._pab_paper || p.Paper)  || 'Signature';\n    var finishLabel = (p._pab_finish || p.Finish) || 'Standard';\n    var paper  = paperKeyFromLabel(paperLabel);\n    var finish = finishKeyFromLabel(finishLabel);\n    var buildId = p._build_id || '';\n    var accessoryItems;\n    if (cart && buildId) {\n      /* Authoritative: real Shopify accessory lines linked by _build_id.\n       * Missing lines \u2192 qty 0 for that variant (never stale _accessory_qtys). */\n      accessoryItems = parseAccessoryItemsFromCart(cart, buildId);\n    } else {\n      /* Legacy builds without _build_id \u2014 property bag only. */\n      accessoryItems = parseAccessoryItemsFromProps(p);\n    }\n    var qtyStacks = parseInt(line && line.quantity, 10);\n    var stacksFromQty = (qtyStacks >= 2) ? qtyStacks : parseStacksCount((p._pab_stacks || p.Stacks));\n    var format = normalizePabFormatState(\n      (p._pab_bill_series || p['Bill Series']),\n      (p._pab_denomination || p.Denomination),\n      (p._pab_base_bill || p['Base Bill'])\n    );\n    var previewImage = resolvePabPreviewImageUrl(\n      format.billSeries,\n      format.denomination,\n      format.baseBill\n    ) || sanitizePreviewImageUrl(p._preview_image);\n    return {\n      tier:           tierKey((p._pab_tier || p.Tier)),\n      tierLabel:      (p._pab_tier || p.Tier) || tierLabel((p._pab_tier || p.Tier)),\n      billName:       readBillNameBase(p),\n      billSeries:     format.billSeries,\n      denomination:   format.denomination,\n      customDenomination: format.denomination === 'Custom'\n        ? String((p._pab_custom_denomination || p['Custom Denomination']) || '').trim()\n        : '',\n      baseBill:       format.baseBill,\n      previewImage:   previewImage,\n      stacks:         stacksFromQty,\n      paper:          paper,\n      paperLabel:     paperLabel,\n      finish:         finish,\n      finishLabel:    finishLabelFromKey(finish),\n      uv:             /^yes$/i.test(String((p._pab_uv_ink || p['UV Ink']) || '')),\n      rush:           /^yes$/i.test(String((p._pab_rush_requested || p['Rush Service Requested']) || '')),\n      serials:        /^yes$/i.test(String((p._pab_serial_numbers || p['Serial Numbers']) || '')),\n      denomChange:    isEnabledFeatureValue((p._pab_denomination_change || p['Denomination Change'])),\n      accessories:    p.Accessories || accessoryItemsToText(accessoryItems),\n      accessoryItems: accessoryItems,\n      accessoryCents: pabAccessoryCentsFromLine(line, cart),\n      buildId:        p._build_id || '',\n      mainLineCents:  pabMainLineCentsFromLine(line),\n      exactMainCents: parseInt(p._total_cents_exact, 10) ||\n                        parseInt(p._total_cents, 10) || 0,\n      allocationDriftCents: parseInt(p._allocation_drift_cents, 10) || 0,\n      totalCents:     pabDisplayTotalCentsFromLine(line, cart)\n    };\n  }\n\n  /* Build a Shopify property bag from a cart-line-style spec (after edit).\n   * Preserves the existing _build_id so the line keeps a stable identity\n   * even though Shopify will rotate the line key when properties change. */\n  function buildPropertyBagFromCartSpec(spec, existingProperties) {\n    var format = normalizePabFormatState(\n      spec.billSeries,\n      spec.denomination,\n      spec.baseBill\n    );\n    var legacy = {\n      tier:           tierLabel(spec.tier),\n      stacks:         spec.stacks,\n      billName:       String(spec.billName || '').trim(),\n      billSeries:     format.billSeries,\n      denomination:   format.denomination,\n      // The edit path rebuilds the bag from the cart spec, so the custom\n      // figure has to be carried here too or a cart edit silently drops it.\n      customDenomination: format.denomination === 'Custom'\n        ? String(spec.customDenomination || '').trim()\n        : '',\n      baseBill:       format.baseBill,\n      previewImage:   resolvePabPreviewImageUrl(\n        format.billSeries,\n        format.denomination,\n        format.baseBill\n      ) || sanitizePreviewImageUrl(spec.previewImage),\n      paper:          paperLabelFromKey(spec.paper),\n      finish:         spec.finish === 'realaged' && spec.paper !== 'durable'\n                        ? 'RealAged'\n                        : 'Standard',\n      uv:             !!spec.uv,\n      serials:        !!spec.serials,\n      rush:           !!spec.rush,\n      denomChange:    tierKey(spec.tier) === 'ultimate'\n                        ? 'Included'\n                        : (isEnabledFeatureValue(spec.denomChange) ? 'Yes' : 'No'),\n      accessories:    spec.accessories || '',\n      accessoryItems: spec.accessoryItems || [],\n      accessoryCents: spec.accessoryCents || 0,\n      totalCents:     spec.totalCents\n    };\n    /* Empty string is falsy for `|| null` and would mint a new uuid every\n     * edit \u2014 breaks identity when Shopify rotates line keys after property\n     * updates. Treat only non-empty strings as stable ids. */\n    var bid = spec.buildId;\n    if (bid == null || String(bid).trim() === '') bid = null;\n    return buildPropertyBag(legacy, bid, existingProperties);\n  }\n\n  /* Resolve the live cart line for a PAB edit. DOM `data-cartitem-key`\n   * can lag behind Shopify after /cart/update or section refresh; we\n   * fall back to `_build_id` stamped on the row (data-pab-build-id). */\n  function findPabLineInCart(cart, domKey, buildIdHint) {\n    var items = cart.items || [];\n    var line = items.find(function (it) { return it && it.key === domKey; });\n    if (line && line.properties && line.properties._custom_build) return line;\n    if (buildIdHint) {\n      var bid = String(buildIdHint);\n      var matches = items.filter(function (it) {\n        return (\n          it &&\n          it.properties &&\n          it.properties._custom_build &&\n          String(it.properties._build_id || '') === bid\n        );\n      });\n      if (matches.length === 1) return matches[0];\n      if (matches.length > 1) {\n        console.warn('[PAB] findPabLineInCart: multiple lines with _build_id', bid);\n      }\n    }\n    return null;\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Staged edit helpers (cart page preview) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n  function cloneSpec(spec) {\n    var format = normalizePabFormatState(\n      spec.billSeries,\n      spec.denomination,\n      spec.baseBill\n    );\n    return {\n      tier:           spec.tier,\n      tierLabel:      spec.tierLabel,\n      billName:       String(spec.billName || '').trim(),\n      billSeries:     format.billSeries,\n      denomination:   format.denomination,\n      customDenomination: format.denomination === 'Custom'\n        ? String(spec.customDenomination || '').trim()\n        : '',\n      baseBill:       format.baseBill,\n      previewImage:   resolvePabPreviewImageUrl(\n        format.billSeries,\n        format.denomination,\n        format.baseBill\n      ) || sanitizePreviewImageUrl(spec.previewImage),\n      stacks:         spec.stacks,\n      paper:          spec.paper,\n      paperLabel:     spec.paperLabel,\n      finish:         spec.finish,\n      finishLabel:    spec.finishLabel,\n      uv:             !!spec.uv,\n      serials:        !!spec.serials,\n      rush:           !!spec.rush,\n      denomChange:    isEnabledFeatureValue(spec.denomChange),\n      accessories:    spec.accessories || '',\n      accessoryItems: (spec.accessoryItems || defaultAccessoryItems()).map(function (it) {\n        return { variantId: it.variantId, label: it.label, qty: it.qty };\n      }),\n      accessoryCents: parseInt(spec.accessoryCents, 10) || 0,\n      buildId:        spec.buildId || '',\n      mainLineCents:  parseInt(spec.mainLineCents, 10) || 0,\n      exactMainCents: parseInt(spec.exactMainCents, 10) || 0,\n      roundedUnitCents: parseInt(spec.roundedUnitCents, 10) || 0,\n      allocationDriftCents: parseInt(spec.allocationDriftCents, 10) || 0,\n      totalCents:     parseInt(spec.totalCents, 10) || 0\n    };\n  }\n\n  function mergeEditsIntoSpec(current, edits) {\n    var previousFormat = normalizePabFormatState(\n      current.billSeries,\n      current.denomination,\n      current.baseBill\n    );\n    var previousDesign = previousFormat.denomination === 'Custom'\n      ? previousFormat.baseBill\n      : previousFormat.denomination;\n    var next = cloneSpec(current);\n\n    if (Object.prototype.hasOwnProperty.call(edits, 'stacks')) {\n      var s = parseInt(edits.stacks, 10);\n      if (!s || s < 2) throw new Error('PAB edit: stacks must be at least 2');\n      next.stacks = s;\n    }\n    if (Object.prototype.hasOwnProperty.call(edits, 'paper')) {\n      var pk = String(edits.paper).toLowerCase();\n      if (pk !== 'signature' && pk !== 'durable' && pk !== 'flame') {\n        throw new Error('PAB edit: unknown paper ' + edits.paper);\n      }\n      next.paper = pk;\n      next.paperLabel = paperLabelFromKey(pk);\n      if (pk === 'durable') next.finish = 'standard';\n    }\n    if (Object.prototype.hasOwnProperty.call(edits, 'finish')) {\n      next.finish = (edits.finish && next.paper !== 'durable') ? 'realaged' : 'standard';\n      next.finishLabel = next.finish === 'realaged' ? 'RealAged' : 'Standard';\n    }\n    /* Tier drives the parent variant, so a tier edit makes editPabBuild swap\n     * variants rather than patch the line in place. The inline cart editor\n     * never offered tier, but the builder's Edit Design flow does. */\n    if (Object.prototype.hasOwnProperty.call(edits, 'tier')) {\n      var tk = tierKey(edits.tier);\n      if (tk !== 'standard' && tk !== 'premium' && tk !== 'ultimate') {\n        throw new Error('PAB edit: unknown tier ' + edits.tier);\n      }\n      next.tier = tk;\n    }\n    if (Object.prototype.hasOwnProperty.call(edits, 'uv'))      next.uv      = !!edits.uv;\n    if (Object.prototype.hasOwnProperty.call(edits, 'serials')) next.serials = !!edits.serials;\n    if (Object.prototype.hasOwnProperty.call(edits, 'rush'))    next.rush    = !!edits.rush;\n    if (Object.prototype.hasOwnProperty.call(edits, 'denomChange')) {\n      next.denomChange = isEnabledFeatureValue(edits.denomChange);\n    }\n\n    /* The cart's inline editor cannot change the bill name, so this was never\n     * needed until the builder round-trip. Without it, renaming a build in the\n     * builder and pressing Update Cart would silently keep the old name. */\n    if (Object.prototype.hasOwnProperty.call(edits, 'billName')) {\n      next.billName = String(edits.billName == null ? '' : edits.billName).trim();\n    }\n    if (Object.prototype.hasOwnProperty.call(edits, 'billSeries')) {\n      next.billSeries = normalizeBillSeriesLabel(edits.billSeries);\n    }\n    if (Object.prototype.hasOwnProperty.call(edits, 'denomination')) {\n      next.denomination = formatDenominationProperty(edits.denomination);\n    }\n    if (Object.prototype.hasOwnProperty.call(edits, 'baseBill')) {\n      next.baseBill = String(edits.baseBill || '').trim();\n    }\n    var enteringCustom =\n      previousFormat.denomination !== 'Custom' &&\n      next.denomination === 'Custom';\n    var normalizedFormat = normalizePabFormatState(\n      next.billSeries,\n      next.denomination,\n      next.baseBill,\n      enteringCustom ? previousDesign : next.baseBill\n    );\n    next.billSeries = normalizedFormat.billSeries;\n    next.denomination = normalizedFormat.denomination;\n    next.baseBill = normalizedFormat.baseBill;\n    if (next.denomination !== 'Custom') next.customDenomination = '';\n\n    if (Object.prototype.hasOwnProperty.call(edits, 'customDenomination')) {\n      next.customDenomination = next.denomination === 'Custom'\n        ? String(edits.customDenomination || '').trim()\n        : '';\n    }\n    var formatChanged =\n      Object.prototype.hasOwnProperty.call(edits, 'billSeries') ||\n      Object.prototype.hasOwnProperty.call(edits, 'denomination') ||\n      Object.prototype.hasOwnProperty.call(edits, 'baseBill');\n    if (formatChanged) {\n      next.previewImage = resolvePabPreviewImageUrl(next.billSeries, next.denomination, next.baseBill);\n    } else if (Object.prototype.hasOwnProperty.call(edits, 'previewImage')) {\n      next.previewImage = sanitizePreviewImageUrl(edits.previewImage);\n    }\n\n    if (Object.prototype.hasOwnProperty.call(edits, 'accessories')) {\n      var accEdits = Array.isArray(edits.accessories) ? edits.accessories : [edits.accessories];\n      accEdits.forEach(function (e) {\n        if (!e || e.variantId == null) return;\n        var vid = String(e.variantId);\n        var q = parseInt(e.qty, 10);\n        if (isNaN(q) || q < 0) q = 0;\n        if (q > MAX_ACCESSORY_QTY) q = MAX_ACCESSORY_QTY;\n        if (!accessoryVariantPurchasable(vid)) q = 0;\n        for (var i = 0; i < next.accessoryItems.length; i++) {\n          if (String(next.accessoryItems[i].variantId) === vid) {\n            next.accessoryItems[i].qty = q;\n            break;\n          }\n        }\n      });\n      next.accessoryItems.forEach(function (it) {\n        var q2 = parseInt(it.qty, 10);\n        if (isNaN(q2) || q2 < 0) q2 = 0;\n        if (q2 > MAX_ACCESSORY_QTY) q2 = MAX_ACCESSORY_QTY;\n        it.qty = q2;\n      });\n    }\n\n    return next;\n  }\n\n  /* options.requireAccessoryPrices is opt-in so the cart line's debounced\n   * price preview keeps recomputing while the customer experiments. Only the\n   * two paths that actually mutate the cart refuse. */\n  async function recomputeSpecTotals(spec, options) {\n    await ensureAccessoryPrices();\n    var prices = await ensureVariantPrices();\n    spec.accessoryItems = stripUnavailableAccessories(spec.accessoryItems);\n    if (options && options.requireAccessoryPrices) {\n      await assertSelectedAccessoryPrices(spec.accessoryItems);\n    }\n    spec.accessoryCents = computeAccessoryCents(\n      spec.accessoryItems,\n      window.ACCESSORY_LIVE_PRICES || {}\n    );\n    spec.accessories = accessoryItemsToText(spec.accessoryItems);\n    var exactMain = computeMainLineTotalCents(spec, prices);\n    applyShopifyMainLineAllocation(spec, exactMain);\n    if (!spec.totalCents || spec.totalCents <= 0) {\n      throw new Error('PAB edit: computed total is zero \u2014 refusing to update');\n    }\n    return spec;\n  }\n\n  function specSignature(spec) {\n    if (!spec) return '';\n    var acc = (spec.accessoryItems || []).map(function (it) {\n      return String(it.variantId) + ':' + (parseInt(it.qty, 10) || 0);\n    }).sort().join(',');\n    return [\n      tierKey(spec.tier),\n      parseInt(spec.stacks, 10) || 0,\n      normalizeBillSeriesLabel(spec.billSeries),\n      formatDenominationProperty(spec.denomination),\n      // Without this a value-only change ($25 \u2192 $500) produces an identical\n      // signature, so the line never reads as dirty and Save stays disabled.\n      String(spec.customDenomination || ''),\n      String(spec.baseBill || ''),\n      String(spec.previewImage || ''),\n      String(spec.paper || '').toLowerCase(),\n      String(spec.finish || '').toLowerCase(),\n      spec.uv ? '1' : '0',\n      spec.serials ? '1' : '0',\n      spec.rush ? '1' : '0',\n      isEnabledFeatureValue(spec.denomChange) ? '1' : '0',\n      acc\n    ].join('|');\n  }\n\n  function specsAreEqual(a, b) {\n    return specSignature(a) === specSignature(b);\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Edit (Phase 2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * Pull current cart \u2192 find line by key \u2192 apply partial edits \u2192 recompute\n   * _total_cents \u2192 single POST /cart/change.js with the full new property bag.\n   * Caller is responsible for the hard reload (see static-cart.liquid).\n   *\n   * `edits` is a partial spec; only fields actually being changed need to\n   * be supplied:\n   *   { stacks, paper, finish, uv, serials, denomChange, accessories }\n   * `meta` (optional third arg):\n   *   { buildIdHint: string } \u2014 fallback when DOM `data-cartitem-key` is stale\n   *   but `data-pab-build-id` still matches the line in /cart.js.\n   *\n   * `paper` accepts 'signature' | 'durable' | 'flame'.\n   * `finish` accepts boolean (true = RealAged).\n   * `uv`, `serials`, `denomChange` accept boolean.\n   * `stacks` accepts integer >= 2.\n   * `accessories` accepts array of { variantId, qty } partials. Only the\n   *   variantIds present in the edit are modified; others retain their\n   *   current quantities. Triggers a live-price fetch + accessoryCents\n   *   recompute. */\n  async function editPabBuild(lineKey, edits, meta) {\n    if (!lineKey)                  throw new Error('PAB edit: missing line key');\n    if (!edits || typeof edits !== 'object') throw new Error('PAB edit: missing edits');\n\n    meta = meta || {};\n    var buildIdHint = meta.buildIdHint || meta.buildId || null;\n\n    var cartRes = await fetch('/cart.js', { credentials: 'same-origin', cache: 'no-store' });\n    if (!cartRes.ok) throw new Error('PAB edit: failed to read cart');\n    var cart = await cartRes.json();\n    var line = findPabLineInCart(cart, lineKey, buildIdHint);\n    if (!line) {\n      throw new Error(\n        'PAB edit: line not found ' + lineKey +\n          (buildIdHint ? ' (buildId ' + buildIdHint + ' also unmatched in /cart.js)' : '')\n      );\n    }\n    if (!line.properties || !line.properties._custom_build) {\n      throw new Error('PAB edit: line is not a custom build');\n    }\n\n    var resolvedKey = line.key;\n\n    var current = specFromCartLine(line, cart);\n    var next = mergeEditsIntoSpec(current, edits);\n    await requireAccessoryStock(next.accessoryItems, current.buildId, cart);\n    await recomputeSpecTotals(next, { requireAccessoryPrices: true });\n\n    /* Carry forward _build_id from the live line when the parsed spec left\n     * buildId empty \u2014 required for stable matching after Shopify re-keys. */\n    var mergedSpec = Object.assign({}, next, { totalCents: next.totalCents });\n    if (\n      (mergedSpec.buildId == null || String(mergedSpec.buildId).trim() === '') &&\n      line.properties &&\n      line.properties._build_id\n    ) {\n      mergedSpec.buildId = line.properties._build_id;\n    }\n    var buildId = String(\n      mergedSpec.buildId || (line.properties && line.properties._build_id) || ''\n    ).trim();\n    var newProperties = buildPropertyBagFromCartSpec(mergedSpec, line.properties);\n    if (meta && meta.proofTimeline) Object.assign(newProperties, meta.proofTimeline);\n    checkoutTimelineProperties(newProperties);\n    var stackQty = readStackQuantity(mergedSpec);\n    var targetVariantId = resolveStackBuildVariantId(mergedSpec);\n    var accessoryItems = stripUnavailableAccessories(mergedSpec.accessoryItems || defaultAccessoryItems());\n\n    /* Shopify /cart/change.js cannot swap variant_id \u2014 remove + re-add when\n     * finish toggles between Standard and RealAged stack carriers. */\n    if (Number(line.variant_id) !== Number(targetVariantId)) {\n      await removeCartLineByKey(resolvedKey);\n      var swapRes = await fetch('/cart/add.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        credentials: 'same-origin',\n        body: JSON.stringify({\n          id: Number(targetVariantId),\n          quantity: stackQty,\n          properties: newProperties\n        })\n      });\n      if (!swapRes.ok) {\n        var swapDetails = '';\n        try {\n          var swapErr = await swapRes.json();\n          swapDetails = (swapErr && (swapErr.description || swapErr.message)) || '';\n        } catch (_se) {}\n        throw new Error(swapDetails || ('Failed to update PAB build variant (' + swapRes.status + ')'));\n      }\n      var swapJson = await swapRes.json();\n      var postSwapCartRes = await fetch('/cart.js?pm_force_network=1', { credentials: 'same-origin', cache: 'no-store' });\n      if (postSwapCartRes.ok) {\n        var postSwapCart = await postSwapCartRes.json();\n        await syncPabAccessoryCartLines(postSwapCart, buildId, accessoryItems);\n      }\n      try {\n        await syncPabBillNameLetters({ reload: false });\n      } catch (syncErr) {\n        console.error('[PAB] Bill Name letter sync after edit failed:', syncErr);\n      }\n      return swapJson;\n    }\n\n    var items = cart.items || [];\n    var lineIndex1 = items.findIndex(function (it) { return it && it.key === resolvedKey; }) + 1;\n\n    var changeOpts = {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      credentials: 'same-origin',\n      body: ''\n    };\n\n    console.log('[PAB change]', {\n      cartKey: resolvedKey,\n      quantity: stackQty,\n      lineIndex: lineIndex1,\n      domKeyWas: lineKey,\n      keysMatched: resolvedKey === lineKey,\n      buildIdHint: buildIdHint || null,\n      payload: {\n        id: resolvedKey,\n        quantity: stackQty,\n        propertyKeyCount: Object.keys(newProperties || {}).length\n      }\n    });\n\n    function shouldRetryIdOrLine(status, errText) {\n      return (\n        status === 400 &&\n        /valid id or line|id or line parameter/i.test(String(errText || ''))\n      );\n    }\n\n    async function readChangeError(res) {\n      var details = '';\n      try {\n        var errJson0 = await res.json();\n        details = (errJson0 && (errJson0.description || errJson0.message)) || '';\n      } catch (_e0) {}\n      return details;\n    }\n\n    /* Order: `id` (line key) \u2192 `line` as the same key string (some themes /\n       API combinations apply property bags more reliably here) \u2192 1-based\n       numeric index last (can target the wrong row if order differs). */\n    var attempts = [\n      { label: 'id', body: { id: resolvedKey, quantity: stackQty, properties: newProperties } },\n      { label: 'lineKey', body: { line: resolvedKey, quantity: stackQty, properties: newProperties } }\n    ];\n    if (lineIndex1 >= 1) {\n      attempts.push({\n        label: 'lineIndex',\n        body: { line: lineIndex1, quantity: stackQty, properties: newProperties }\n      });\n    }\n\n    var changeRes;\n    var lastDetails = '';\n    for (var ai = 0; ai < attempts.length; ai++) {\n      changeOpts.body = JSON.stringify(attempts[ai].body);\n      if (ai > 0) {\n        console.warn('[PAB change] retry', attempts[ai].label, 'after prior failure', lastDetails);\n        console.log('[PAB change retry]', attempts[ai].label, attempts[ai].body);\n      }\n      changeRes = await fetch('/cart/change.js', changeOpts);\n      if (changeRes.ok) break;\n      lastDetails = await readChangeError(changeRes);\n      if (!shouldRetryIdOrLine(changeRes.status, lastDetails) || ai === attempts.length - 1) {\n        break;\n      }\n    }\n\n    if (!changeRes.ok) {\n      throw new Error(lastDetails || ('Failed to update PAB build (' + changeRes.status + ')'));\n    }\n\n    var changeJson;\n    try {\n      changeJson = await changeRes.json();\n    } catch (_eJ) {\n      changeJson = null;\n    }\n\n    /* Confirm the mutation stuck \u2014 avoids a \u201Csuccessful\u201D 200 + full reload\n     * that still shows stale stacks/price when the server ignored properties. */\n    var verifyRes = await fetch('/cart.js', { credentials: 'same-origin', cache: 'no-store' });\n    var verifyCart = cart;\n    if (verifyRes.ok) {\n      verifyCart = await verifyRes.json();\n      var bidNeedle = String(newProperties._build_id || '');\n      var vline = (verifyCart.items || []).find(function (it) {\n        var p = it && it.properties;\n        return p && p._custom_build && String(p._build_id || '') === bidNeedle;\n      });\n      if (!vline && bidNeedle) {\n        vline = findPabLineInCart(verifyCart, resolvedKey, buildIdHint || bidNeedle);\n      }\n      if (Object.prototype.hasOwnProperty.call(edits, 'stacks')) {\n        var gotQty = vline ? parseInt(vline.quantity, 10) : NaN;\n        var gs = vline && vline.properties ? parseStacksCount(vline.properties._pab_stacks || vline.properties.Stacks) : NaN;\n        if (!vline || gotQty !== next.stacks || gs !== next.stacks) {\n          console.error('[PAB change] post-save verify failed', {\n            expectedStacks: next.stacks,\n            gotQuantity: gotQty,\n            gotStacksProp: gs,\n            buildId: bidNeedle,\n            lineFound: !!vline\n          });\n          throw new Error(\n            'Could not save stack count \u2014 the store did not accept the update. Please try again.'\n          );\n        }\n      }\n    }\n\n    await syncPabAccessoryCartLines(verifyCart, buildId, accessoryItems);\n\n    try {\n      await syncPabBillNameLetters({ reload: false });\n    } catch (syncErr) {\n      console.error('[PAB] Bill Name letter sync after edit failed:', syncErr);\n    }\n\n    return changeJson;\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Cart Invariants (Phase 2 hardening) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   *\n   * Runs cheap, read-only assertions against /cart.js to detect any\n   * deviation from the locked-in architecture:\n   *\n   *   1. 1 PAB build = 1 main cart line; quantity = stack count (>= 2)\n   *   2. Stacks property must match line quantity\n   *   3. _build_id is unique across the cart (anti-merge nonce intact)\n   *   4. Legacy bundle properties (_locked, _parent, _unique_build) are absent\n   *   5. No phantom \"PAB-related\" lines without the _custom_build marker\n   *   6. _accessory_cents is present on every PAB line (forward-compat marker)\n   *\n   * Returns { ok, violations[], summary }. On violation:\n   *   - console.error fires with the structured result\n   *   - if window.PAB_DEBUG_INVARIANTS is truthy, also alert() the user\n   *\n   * Stress tests should ALWAYS check window.PAB.lastInvariantResult after\n   * every mutation. Call PAB.assertCartInvariants() directly from devtools\n   * at any time to audit current state.\n   * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  async function assertCartInvariants() {\n    var cartRes = await fetch('/cart.js', { credentials: 'same-origin', cache: 'no-store' });\n    if (!cartRes.ok) {\n      var fail = { ok: false, violations: ['cart.js fetch failed: ' + cartRes.status], summary: {} };\n      window.PAB.lastInvariantResult = fail;\n      console.error('[PAB INVARIANTS] cart fetch failed', fail);\n      return fail;\n    }\n    var cart = await cartRes.json();\n    var items = cart.items || [];\n    var pabLines = items.filter(function (it) {\n      return it && it.properties && it.properties._custom_build;\n    });\n    var violations = [];\n    var seenBuildIds = {};\n    var pabTotalCents = 0;\n\n    pabLines.forEach(function (it, idx) {\n      var p = it.properties || {};\n      var label = 'pab[' + idx + '] (key=' + (it.key || '?') + ')';\n\n      if (it.quantity < 2) {\n        violations.push(label + ': quantity is ' + it.quantity + ', expected >= 2 (stack count)');\n      }\n\n      var stacksProp = parseStacksCount((p._pab_stacks || p.Stacks));\n      if (stacksProp !== it.quantity) {\n        violations.push(\n          label + ': quantity (' + it.quantity + ') does not match Stacks property (\"' +\n          (p._pab_stacks || p.Stacks) + '\")'\n        );\n      }\n\n      var variantId = Number(it.variant_id);\n      var allowedVariants = [Number(PAB_STACK_VARIANT_STANDARD)];\n      if (PAB_STACK_VARIANT_REALAGED) allowedVariants.push(Number(PAB_STACK_VARIANT_REALAGED));\n      if (allowedVariants.indexOf(variantId) < 0) {\n        violations.push(\n          label + ': variant_id ' + variantId + ' is not a configured PAB stack carrier'\n        );\n      }\n\n      var buildId = p._build_id;\n      if (!buildId) {\n        violations.push(label + ': missing _build_id (anti-merge nonce required)');\n      } else if (seenBuildIds[buildId]) {\n        violations.push(\n          label + ': duplicate _build_id \"' + buildId + '\" \u2014 also on ' + seenBuildIds[buildId] +\n          ' (Shopify should never merge custom builds; check accidental collision)'\n        );\n      } else {\n        seenBuildIds[buildId] = label;\n      }\n\n      var cents = parseInt(p._total_cents, 10);\n      if (p._total_cents === undefined || p._total_cents === null || p._total_cents === '') {\n        violations.push(label + ': missing _total_cents');\n      } else if (!cents || isNaN(cents) || cents <= 0) {\n        violations.push(label + ': _total_cents is \"' + p._total_cents + '\" (must be a positive integer)');\n      } else {\n        pabTotalCents += cents;\n      }\n\n      if (!(p._pab_tier || p.Tier))   violations.push(label + ': missing Tier property');\n      if (!(p._pab_stacks || p.Stacks)) violations.push(label + ': missing Stacks property');\n\n      var stacks = parseStacksCount((p._pab_stacks || p.Stacks));\n      if (!stacks || stacks < 2) {\n        violations.push(label + ': Stacks is \"' + (p._pab_stacks || p.Stacks) + '\" (must be >= 2)');\n      }\n\n      if (p._locked || p._parent || p._unique_build) {\n        violations.push(\n          label + ': legacy bundle property detected (_locked=' + p._locked +\n          ', _parent=' + p._parent + ', _unique_build=' + p._unique_build +\n          ') \u2014 Phase 0 architecture leaked through'\n        );\n      }\n\n      if (p._accessory_cents === undefined) {\n        /* Soft warning \u2014 pre-Phase-2 lines lack this. Logged but not fatal. */\n        violations.push(label + ': missing _accessory_cents (pre-Phase-2 line; edits will zero out accessories)');\n      }\n\n      /* Phase 2.3 hard cap (0..MAX_ACCESSORY_QTY) \u2014 flag any accessory\n       * qty stored on a PAB line that's out of range. Defensive sweep in\n       * editPabBuild already clamps, so this fires only if a stale line\n       * predates the cap or something wrote raw values directly. */\n      var accItems = parseAccessoryItemsFromProps(p);\n      accItems.forEach(function (acc) {\n        var q = parseInt(acc.qty, 10);\n        if (isNaN(q) || q < 0 || q > MAX_ACCESSORY_QTY) {\n          violations.push(\n            label + ': accessory \"' + acc.label + '\" qty=' + acc.qty +\n            ' is outside the allowed range 0..' + MAX_ACCESSORY_QTY\n          );\n        }\n      });\n    });\n\n    /* Phantom-detection: any non-PAB line that smells like a legacy bundle child. */\n    items.forEach(function (it, idx) {\n      if (!it) return;\n      if (it.properties && it.properties._custom_build) return;\n      var p = it.properties || {};\n      if (p._parent || p._locked || p._unique_build) {\n        violations.push(\n          'item[' + idx + '] (variant=' + it.variant_id + '): non-PAB line carries legacy bundle property \u2014 ' +\n          'orphan from old parent/child architecture, should not exist'\n        );\n      }\n    });\n\n    var summary = {\n      itemCount:        items.length,\n      pabLineCount:     pabLines.length,\n      pabTotalCents:    pabTotalCents,\n      pabTotalDisplay:  formatMoney(pabTotalCents),\n      shopifySubtotal:  cart.total_price,\n      buildIds:         Object.keys(seenBuildIds)\n    };\n    var result = { ok: violations.length === 0, violations: violations, summary: summary, at: new Date().toISOString() };\n    window.PAB.lastInvariantResult = result;\n\n    if (!result.ok) {\n      console.error('[PAB INVARIANT VIOLATION]', result);\n      if (window.PAB_DEBUG_INVARIANTS) {\n        try {\n          alert('PAB invariant violation:\\n\\n' + violations.join('\\n\\n'));\n        } catch (_e) {}\n      }\n    } else if (window.PAB_DEBUG_INVARIANTS) {\n      console.log('[PAB invariants OK]', summary);\n    }\n    return result;\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Bill Name letters (stored on line item) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * When 2+ PAB lines share the same base Bill Name (case-insensitive),\n   * persist checkout-facing Bill Name as \"[base] [A-Z]\" within that group.\n   * Unique names stay unchanged. Base name lives in _bill_name_base. */\n  var PAB_BILL_NAME_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\n  var _billNameSyncInFlight = false;\n\n  function isPabCartItem(it) {\n    if (!it || !it.properties) return false;\n    if (it.properties._custom_build) return true;\n    return !!(\n      it.properties.Tier &&\n      it.properties.Stacks &&\n      it.properties._build_id\n    );\n  }\n\n  function stripSyncedBillNameLetter(displayName) {\n    var s = String(displayName || '').trim();\n    if (!s) return '';\n    var m = s.match(/^(.+) ([A-Z])$/);\n    return m ? m[1].trim() : s;\n  }\n\n  function readBillNameBase(props) {\n    if (!props) return '';\n    var stored = String(props._bill_name_base || '').trim();\n    if (stored) return stored;\n    return String(props._pab_bill_name || props['Bill Name'] || '').trim();\n  }\n\n  function letteringCoreFromBase(storedBase, needLetters) {\n    var base = String(storedBase || '').trim();\n    if (!base) return '';\n    return needLetters ? stripSyncedBillNameLetter(base) : base;\n  }\n\n  function formatBillNameDisplay(base, letter) {\n    var raw = String(base || '').trim();\n    if (!raw) return '';\n    if (!letter) return raw;\n    var core = stripSyncedBillNameLetter(raw);\n    return core + ' ' + letter;\n  }\n\n  function cloneLineProperties(props) {\n    var next = {};\n    Object.keys(props || {}).forEach(function (key) {\n      next[key] = props[key];\n    });\n    return next;\n  }\n\n  function propertiesWithBillName(lineProps, base, displayName) {\n    var next = cloneLineProperties(lineProps);\n    if (base) next._bill_name_base = base;\n    else delete next._bill_name_base;\n    var nameKey = Object.prototype.hasOwnProperty.call(lineProps, '_pab_bill_name') ? '_pab_bill_name' : 'Bill Name';\n    if (displayName) next[nameKey] = displayName;\n    else delete next[nameKey];\n    return next;\n  }\n\n  function getPabCartLines(cart) {\n    return (cart && cart.items ? cart.items : []).filter(isPabCartItem);\n  }\n\n  function findPabLineByBuildId(cart, buildId) {\n    if (!buildId) return null;\n    var bid = String(buildId);\n    var matches = getPabCartLines(cart).filter(function (it) {\n      return String(it.properties._build_id || '') === bid;\n    });\n    return matches.length === 1 ? matches[0] : null;\n  }\n\n  function billNameGroupKey(storedBase) {\n    var core = stripSyncedBillNameLetter(String(storedBase || '').trim());\n    return core ? core.toLowerCase() : '';\n  }\n\n  function resolveStoredBaseForLine(props, groupNeedsLetters) {\n    var stored = String(props._bill_name_base || '').trim();\n    if (stored) return stored;\n    var legacyDisplay = String(props._pab_bill_name || props['Bill Name'] || '').trim();\n    if (!legacyDisplay) return '';\n    return groupNeedsLetters ? stripSyncedBillNameLetter(legacyDisplay) : legacyDisplay;\n  }\n\n  function computePabBillNameLetterPlan(cart) {\n    var pabLines = getPabCartLines(cart);\n    var prepared = pabLines.map(function (line) {\n      var props = line.properties || {};\n      var provisionalBase = String(props._bill_name_base || '').trim();\n      if (!provisionalBase) {\n        provisionalBase = String(props._pab_bill_name || props['Bill Name'] || '').trim();\n      }\n      return {\n        line: line,\n        props: props,\n        groupKey: billNameGroupKey(provisionalBase)\n      };\n    });\n\n    var lineCountByKey = {};\n    prepared.forEach(function (entry) {\n      if (!entry.groupKey) return;\n      lineCountByKey[entry.groupKey] = (lineCountByKey[entry.groupKey] || 0) + 1;\n    });\n\n    var groupLineIndex = {};\n\n    return prepared.map(function (entry) {\n      var props = entry.props;\n      var groupKey = entry.groupKey;\n      var needsLetters = !!groupKey && (lineCountByKey[groupKey] || 0) > 1;\n      var storedBase = resolveStoredBaseForLine(props, needsLetters);\n      var displayName = storedBase;\n\n      if (storedBase && needsLetters) {\n        var idx = groupLineIndex[groupKey] || 0;\n        groupLineIndex[groupKey] = idx + 1;\n        var letter = PAB_BILL_NAME_LETTERS[idx] || String(idx + 1);\n        displayName = formatBillNameDisplay(letteringCoreFromBase(storedBase, true), letter);\n      }\n\n      var currentDisplay = String(props._pab_bill_name || props['Bill Name'] || '').trim();\n      var currentBase = String(props._bill_name_base || '').trim();\n      return {\n        buildId: props._build_id || '',\n        key: entry.line.key,\n        base: storedBase,\n        displayName: displayName,\n        needsUpdate: !!storedBase && (currentDisplay !== displayName || currentBase !== storedBase)\n      };\n    });\n  }\n\n  async function postCartChangeProperties(lineKey, quantity, properties) {\n    var body = { id: lineKey, quantity: quantity, properties: properties };\n    var res = await fetch('/cart/change.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      credentials: 'same-origin',\n      body: JSON.stringify(body)\n    });\n    if (res.ok) return res.json();\n    var details = '';\n    try {\n      var errJson = await res.json();\n      details = (errJson && (errJson.description || errJson.message)) || '';\n    } catch (_e) {}\n    if (res.status === 400 && /valid id or line|id or line parameter/i.test(details)) {\n      res = await fetch('/cart/change.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        credentials: 'same-origin',\n        body: JSON.stringify({ line: lineKey, quantity: quantity, properties: properties })\n      });\n      if (res.ok) return res.json();\n    }\n    throw new Error(details || ('Bill Name sync failed (' + res.status + ')'));\n  }\n\n  async function syncPabBillNameLetters(options) {\n    options = options || {};\n    if (_billNameSyncInFlight) {\n      return { updated: 0, skipped: true };\n    }\n    _billNameSyncInFlight = true;\n    try {\n      var cartRes = await fetch('/cart.js', { credentials: 'same-origin', cache: 'no-store' });\n      if (!cartRes.ok) throw new Error('Bill Name sync: failed to read cart');\n      var cart = await cartRes.json();\n      var totalUpdated = 0;\n      var safety = 0;\n\n      while (safety++ < 24) {\n        var plan = computePabBillNameLetterPlan(cart);\n        var pending = plan.filter(function (entry) { return entry.needsUpdate; });\n        if (!pending.length) break;\n\n        var entry = pending[0];\n        var line = findPabLineByBuildId(cart, entry.buildId);\n        if (!line) {\n          line = (cart.items || []).find(function (it) { return it && it.key === entry.key; });\n        }\n        if (!line) break;\n\n        var nextProps = propertiesWithBillName(line.properties, entry.base, entry.displayName);\n        await postCartChangeProperties(line.key, line.quantity || 1, nextProps);\n        totalUpdated++;\n\n        var refreshRes = await fetch('/cart.js', { credentials: 'same-origin', cache: 'no-store' });\n        if (!refreshRes.ok) break;\n        cart = await refreshRes.json();\n      }\n\n      if (options.reload && totalUpdated > 0) {\n        if (typeof window.pmSmoothCartReload === 'function') {\n          window.pmSmoothCartReload();\n        } else {\n          window.location.reload();\n        }\n        return { updated: totalUpdated, reloaded: true, cart: cart };\n      }\n      return { updated: totalUpdated, reloaded: false, cart: cart };\n    } finally {\n      _billNameSyncInFlight = false;\n    }\n  }\n\n  /* Cart fingerprint \u2014 used by the cart page to detect drift between tabs\n   * or after bfcache restore. Cheap, returns a stable string. Line keys\n   * mutate when properties change, so this naturally catches edits made\n   * in other tabs too. */\n  function cartFingerprint(cart) {\n    if (!cart || !cart.items) return '0||';\n    var items = cart.items.slice().sort(function (a, b) {\n      return String(a.key || '').localeCompare(String(b.key || ''));\n    });\n    return items.length + '|' + cart.total_price + '|' +\n      items.map(function (i) { return i.key + ':' + i.quantity; }).join(',');\n  }\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  window.PAB = window.PAB || {};\n  window.PAB.computePriceBreakdown = computePriceBreakdown;\n  window.PAB.renderPriceBreakdown = renderPriceBreakdown;\n  window.PAB.refreshPriceBreakdown = queuePriceBreakdown;\n  window.PAB.PAB_BUILD_VARIANT_ID = PAB_BUILD_VARIANT_ID;\n  window.PAB.resolvePabPreviewImageUrl = resolvePabPreviewImageUrl;\n  window.PAB.sanitizePreviewImageUrl   = sanitizePreviewImageUrl;\n  window.PAB.formatDenominationProperty = formatDenominationProperty;\n  window.PAB.normalizeBillSeriesLabel = normalizeBillSeriesLabel;\n  window.PAB.normalizeDenomKey          = normalizeDenomKey;\n  window.PAB.pabDenominationsForSeries = pabDenominationsForSeries;\n  window.PAB.isPabDenominationAvailable = isPabDenominationAvailable;\n  window.PAB.pabDefaultDenominationForSeries = pabDefaultDenominationForSeries;\n  window.PAB.normalizePabBaseBill = normalizePabBaseBill;\n  window.PAB.normalizePabFormatState = normalizePabFormatState;\n  window.PAB.buildPropertyBag     = buildPropertyBag;\n  window.PAB.addCustomBuildToCart = addCustomBuildToCart;\n  window.PAB.isAddInFlight       = isAddInFlight;\n  window.PAB.formatMoney          = formatMoney;\n  window.PAB.parseStacksCount     = parseStacksCount;\n  window.PAB.formatStacksCount    = formatStacksCount;\n\n  /* Phase 2 surface */\n  window.PAB.computeTotalCents    = computeTotalCents;\n  window.PAB.CONFIG_STATE_KEY     = PAB_CONFIG_STATE_KEY;\n  window.PAB.saveLastAddedConfiguratorState = saveLastAddedConfiguratorState;\n  window.PAB.readLastAddedConfiguratorState = readLastAddedConfiguratorState;\n  window.PAB.clearLastAddedConfiguratorState = clearLastAddedConfiguratorState;\n  window.PAB.currentConfiguratorHistoryBuildId = currentConfiguratorHistoryBuildId;\n  window.PAB.allocateShopifyMainLineCents = allocateShopifyMainLineCents;\n  window.PAB.computeCustomerFacingTotals = computeCustomerFacingTotals;\n  window.PAB.computeCustomerFacingTotalCents = computeCustomerFacingTotalCents;\n  window.PAB.pabMainLineCentsFromLine = pabMainLineCentsFromLine;\n  window.PAB.refreshConfiguratorTotal = refreshConfiguratorTotal;\n  window.PAB.ensureVariantPrices  = ensureVariantPrices;\n  window.PAB.paperKeyFromLabel    = paperKeyFromLabel;\n  window.PAB.finishKeyFromLabel   = finishKeyFromLabel;\n  window.PAB.stackUnitDollars     = stackUnitDollars;\n  window.PAB.syncVolumePricingLabels = syncVolumePricingLabels;\n  window.PAB.specFromCartLine     = specFromCartLine;\n  window.PAB.cloneSpec            = cloneSpec;\n  window.PAB.mergeEditsIntoSpec   = mergeEditsIntoSpec;\n  window.PAB.recomputeSpecTotals  = recomputeSpecTotals;\n  window.PAB.specSignature        = specSignature;\n  window.PAB.specsAreEqual        = specsAreEqual;\n  window.PAB.buildPropertyBagFromCartSpec = buildPropertyBagFromCartSpec;\n  window.PAB.editPabBuild         = editPabBuild;\n  window.PAB.readBillNameBase     = readBillNameBase;\n  window.PAB.syncPabBillNameLetters = syncPabBillNameLetters;\n  window.PAB.TIER_VARIANTS        = TIER_VARIANTS;\n  window.PAB.STACK_VARIANTS       = STACK_VARIANTS;\n  window.PAB.ADDON_VARIANTS       = ADDON_VARIANTS;\n\n  /* Phase 2.3 accessory surface \u2014 exposed so static-cart.liquid can warm\n   * the live-price cache as soon as the cart loads, and so debugging /\n   * tests can inspect the canonical accessory registry. */\n  window.PAB.ACCESSORY_DEFS         = ACCESSORY_DEFS;\n  window.PAB.accessoryVariantPurchasable = accessoryVariantPurchasable;\n  window.PAB.stripUnavailableAccessories = stripUnavailableAccessories;\n  window.PAB.clampAccessoryQty = clampAccessoryQty;\n\n  /* PRICE-01 fail-closed surface \u2014 the cart line and the configurator both\n   * need the message and the check to render their retry affordance. */\n  window.PAB.ACCESSORY_PRICE_UNAVAILABLE_MESSAGE = ACCESSORY_PRICE_UNAVAILABLE_MESSAGE;\n  window.PAB.hasConfirmedAccessoryPrice          = hasConfirmedAccessoryPrice;\n  window.PAB.selectedAccessoriesMissingPrices    = selectedAccessoriesMissingPrices;\n  window.PAB.assertSelectedAccessoryPrices       = assertSelectedAccessoryPrices;\n  window.PAB.MAX_ACCESSORY_QTY      = MAX_ACCESSORY_QTY;\n  window.PAB.ensureAccessoryPrices  = ensureAccessoryPrices;\n  window.PAB.computeAccessoryCents  = computeAccessoryCents;\n  window.PAB.accessoryUnitDollars   = accessoryUnitDollars;\n  window.PAB.formatAccessoryPriceLabel = formatAccessoryPriceLabel;\n  window.PAB.hydrateAccessoryPricesFromCart = hydrateAccessoryPricesFromCart;\n  window.PAB.parseAccessoryItemsFromProps = parseAccessoryItemsFromProps;\n  window.PAB.isPabAccessoryLine           = isPabAccessoryLine;\n  window.PAB.findAccessoryLinesForBuild  = findAccessoryLinesForBuild;\n  window.PAB.parseAccessoryItemsFromCart = parseAccessoryItemsFromCart;\n  window.PAB.syncPabAccessoryCartLines   = syncPabAccessoryCartLines;\n  window.PAB.removePabBuildByKey         = removePabBuildByKey;\n  window.PAB.isAccessoryVariantId        = isAccessoryVariantId;\n\n  window.PAB.PAB_STACK_VARIANT_STANDARD = PAB_STACK_VARIANT_STANDARD;\n  window.PAB.PAB_STACK_VARIANT_REALAGED = PAB_STACK_VARIANT_REALAGED;\n  window.PAB.PAB_BUILD_VARIANT_ID = PAB_BUILD_VARIANT_ID;\n  window.PAB.resolveStackBuildVariantId = resolveStackBuildVariantId;\n\n  /* Phase 2 hardening surface */\n  window.PAB.assertCartInvariants = assertCartInvariants;\n  window.PAB.cartFingerprint      = cartFingerprint;\n  window.PAB.lastInvariantResult  = null;\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 WP-8: cart-authoritative reconstruction \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * /cart.js is the authority for any build already in the cart. These helpers\n   * never read sessionStorage \u2014 callers reconcile against what they return. */\n\n  /* Reconstruct one build from live cart data.\n   *\n   * Resolves the parent by _build_id, gathers its accessory lines, and returns\n   * a spec plus a fingerprint. `exists: false` means the build is genuinely\n   * absent, which callers must treat as \"clear the cache and start fresh\" \u2014\n   * never as \"fall back to the cached copy\".\n   *\n   * Throws only on transport or parse failure, so a caller can distinguish\n   * \"cart says this build is gone\" from \"we could not read the cart\". Those\n   * two cases must behave differently: the first clears state, the second\n   * must not. */\n  async function buildStateFromCart(buildId, options) {\n    var id = String(buildId || '').trim();\n    if (!id) return { exists: false, reason: 'no-build-id' };\n\n    var timeoutMs = (options && options.timeoutMs) || 10000;\n    var controller = typeof AbortController === 'function' ? new AbortController() : null;\n    var timer = controller ? setTimeout(function () { controller.abort(); }, timeoutMs) : null;\n\n    var cart = options && options.cartSnapshot;\n    try {\n      if (!cart || !Array.isArray(cart.items)) {\n      var res = await fetch('/cart.js', {\n        headers: { 'Accept': 'application/json' },\n        signal: controller ? controller.signal : undefined\n      });\n      if (!res.ok) throw new Error('cart request failed: HTTP ' + res.status);\n      cart = await res.json();\n      }\n    } finally {\n      if (timer) clearTimeout(timer);\n    }\n\n    if (!cart || !Array.isArray(cart.items)) {\n      throw new Error('cart response was malformed');\n    }\n\n    var line = findPabLineByBuildId(cart, id);\n    if (!line) return { exists: false, reason: 'not-in-cart', cart: cart };\n\n    var spec = specFromCartLine(line, cart);\n    var fingerprint = window.PABBuildFingerprint\n      ? window.PABBuildFingerprint.fingerprint(cart, id)\n      : '';\n\n    return {\n      exists: true,\n      buildId: id,\n      spec: spec,\n      line: line,\n      accessoryLines: findAccessoryLinesForBuild(cart, id),\n      fingerprint: fingerprint,\n      cart: cart\n    };\n  }\n\n  /* Count the PAB builds in a cart. Used to refuse guessing when more than one\n     exists and no explicit identifier was supplied. */\n  function listPabBuildIds(cart) {\n    if (!cart || !Array.isArray(cart.items)) return [];\n    var seen = {};\n    var ids = [];\n    cart.items.forEach(function (item) {\n      var p = (item && item.properties) || {};\n      if (String(p._custom_build || '') !== 'true') return;\n      var id = String(p._build_id || '').trim();\n      if (!id || seen[id]) return;\n      seen[id] = true;\n      ids.push(id);\n    });\n    return ids;\n  }\n\n  /* Duplicate a build under a fresh _build_id.\n   *\n   * Adds a new parent plus its own accessory group. The source build is never\n   * mutated \u2014 that separation is what keeps Edit from ever silently producing\n   * a second build. */\n  /* Builder round-trip commit. The builder could always *restore* a build for\n   * editing (WP-8) but had no way to commit the edit back: its submit handler\n   * only ever called addCustomBuildToCart, so pressing the button left the\n   * original line untouched and added a second one.\n   *\n   * This is deliberately a thin adapter, not a second update implementation.\n   * It reads the form with the same buildSpec() the add path uses, translates\n   * that spec into the same `edits` shape the cart's inline editor produces,\n   * and hands off to the existing editPabBuild \u2014 which owns recomputation,\n   * the property bag, accessory reconciliation and parent/child linkage.\n   *\n   * buildIdHint is passed as well as the line key because Shopify rotates line\n   * keys when properties change; editPabBuild falls back to the hint. */\n  async function updateCustomBuildFromForm(form, buildId) {\n    requireProofTimelineAcknowledgment();\n    if (_addInFlight) throw new Error('An update is already in progress. Please wait.');\n    _addInFlight = true;\n    try {\n      var id = String(buildId || '').trim();\n      if (!id) throw new Error('PAB update: missing build id');\n\n      // Re-validate against the live cart rather than trusting the caller.\n      var state = await buildStateFromCart(id);\n      if (!state.exists) {\n        var err = new Error('PAB update: build is no longer in the cart');\n        err.pabBuildMissing = true;\n        throw err;\n      }\n\n      var spec = buildSpec(form);\n      var edits = {\n        billName:           spec.billName,\n        billSeries:         spec.billSeries,\n        denomination:       spec.denomination,\n        customDenomination: spec.customDenomination,\n        baseBill:           spec.baseBill,\n        tier:               tierKey(spec.tier),\n        stacks:             readStackQuantity(spec),\n        // mergeEditsIntoSpec wants a paper *key* and a boolean finish, while\n        // buildSpec reports both as display labels.\n        paper:              paperKeyFromLabel(spec.paper),\n        finish:             /realaged/i.test(String(spec.finish || '')),\n        uv:                 !!spec.uv,\n        serials:            !!spec.serials,\n        rush:               !!spec.rush,\n        denomChange:        spec.denomChange,\n        accessories:        (spec.accessoryItems || []).map(function (it) {\n                              return { variantId: it.variantId, qty: it.qty };\n                            })\n      };\n\n      return await editPabBuild(state.line.key, edits, { buildIdHint: id, proofTimeline: requireProofTimelineAcknowledgment() });\n    } finally {\n      _addInFlight = false;\n    }\n  }\n\n  async function duplicatePabBuild(buildId) {\n    var state = await buildStateFromCart(buildId);\n    if (!state.exists) throw new Error('PAB duplicate: build not found in cart');\n    await ensureAccessoryPrices();\n\n    var copy = cloneSpec(state.spec);\n    copy.buildId = uuid();\n    copy.accessoryItems = (state.spec.accessoryItems || []).map(function (it) {\n      return { variantId: it.variantId, label: it.label, qty: it.qty };\n    });\n    await requireAccessoryStock(copy.accessoryItems, null, state.cart);\n    await recomputeSpecTotals(copy, { requireAccessoryPrices: true });\n\n    var properties = buildPropertyBagFromCartSpec(copy, state.line.properties);\n    properties._build_id = copy.buildId;\n\n    var items = [{\n      id: resolveStackBuildVariantId(copy),\n      quantity: readStackQuantity(copy),\n      properties: properties\n    }];\n\n    (copy.accessoryItems || []).forEach(function (it) {\n      var qty = clampAccessoryQty(it.qty);\n      if (qty <= 0 || !accessoryVariantPurchasable(it.variantId)) return;\n      items.push({\n        id: it.variantId,\n        quantity: qty,\n        properties: { _build_id: copy.buildId, _pab_accessory_line: 'true' }\n      });\n    });\n\n    var res = await fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify({ items: items })\n    });\n    if (!res.ok) {\n      var details = '';\n      try {\n        var errorJson = await res.json();\n        details = (errorJson && (errorJson.description || errorJson.message)) || '';\n      } catch (_duplicateError) {}\n      throw new Error(formatAddToCartError(res.status, details));\n    }\n\n    /* Duplicating is precisely the act that creates a same-name pair, so assign\n     * the A/B letters here rather than leaving it to the sync that runs on cart\n     * load. Without this the copy and its original both render unlettered and\n     * visibly correct themselves a few seconds later. Failing the sync must not\n     * fail the duplicate -- the load-time pass still catches it. */\n    try {\n      await syncPabBillNameLetters({ reload: false });\n    } catch (syncErr) {\n      console.error('[PAB] Bill Name letter sync after duplicate failed:', syncErr);\n    }\n\n    return { buildId: copy.buildId, sourceBuildId: String(buildId) };\n  }\n\n  window.PAB.buildStateFromCart  = buildStateFromCart;\n  window.PAB.listPabBuildIds     = listPabBuildIds;\n  window.PAB.updateCustomBuildFromForm = updateCustomBuildFromForm;\n  window.PAB.duplicatePabBuild   = duplicatePabBuild;\n\n  /* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Bill Name (Print A Bill page) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  window.PAB_BILL_NAME_ERROR = 'Please enter a bill name between 3 and 30 characters.';\n  window.PAB_BILL_NAME_HINT = 'Used to identify this design throughout your order.';\n  window.PAB_BILL_NAME_PATTERN = /^[a-zA-Z0-9 \\-']{3,30}$/;\n\n  window.getPabStickyBarInset = function () {\n    var bar = document.getElementById('simple-sticky-bar');\n    if (!bar || !bar.classList.contains('show')) return 32;\n    var rect = bar.getBoundingClientRect();\n    return Math.max(rect.height + 36, 120);\n  };\n\n  window.validatePabBillName = function (raw) {\n    var value = String(raw || '').trim();\n    if (!value || !window.PAB_BILL_NAME_PATTERN.test(value)) {\n      return { valid: false, value: value, message: window.PAB_BILL_NAME_ERROR };\n    }\n    return { valid: true, value: value, message: '' };\n  };\n\n  window.syncPabBillNameFields = function (source) {\n    var top = document.getElementById('billNameTop');\n    var bottom = document.getElementById('billName');\n    var submit = document.getElementById('billNameSubmit');\n    if (!submit) return '';\n    var value = '';\n    if (source === 'top' && top) value = top.value;\n    else if (source === 'bottom' && bottom) value = bottom.value;\n    else value = (bottom && bottom.value) || (top && top.value) || submit.value || '';\n    if (top) top.value = value;\n    if (bottom) bottom.value = value;\n    submit.value = String(value || '').trim();\n    return submit.value;\n  };\n\n  window.getPabBillNameValidation = function () {\n    window.syncPabBillNameFields();\n    var submit = document.getElementById('billNameSubmit');\n    return window.validatePabBillName(submit ? submit.value : '');\n  };\n\n  window.getPabBillNameValue = function () {\n    var result = window.getPabBillNameValidation();\n    if (!result.valid) return '';\n    var top = document.getElementById('billNameTop');\n    var bottom = document.getElementById('billName');\n    var submit = document.getElementById('billNameSubmit');\n    if (top) top.value = result.value;\n    if (bottom) bottom.value = result.value;\n    if (submit) submit.value = result.value;\n    return result.value;\n  };\n\n  window.clearPabBillNameFields = function () {\n    ['billNameTop', 'billName', 'billNameSubmit'].forEach(function (id) {\n      var el = document.getElementById(id);\n      if (!el) return;\n      el.value = '';\n      el.classList.remove('input-error');\n    });\n    var designName = document.querySelector('#pab-mockup-root #design-name');\n    if (designName) {\n      designName.value = '';\n      designName.classList.remove('input-error');\n    }\n    document.querySelectorAll('[data-pab-design-name-error]').forEach(function (el) {\n      el.hidden = true;\n    });\n    window.setPabBillNameError(false);\n  };\n\n  window.setPabBillNameError = function (hasError, message) {\n    ['billNameTop', 'billName'].forEach(function (id) {\n      var el = document.getElementById(id);\n      if (el) el.classList.toggle('input-error', !!hasError);\n    });\n    document.querySelectorAll('[data-pab-bill-name-error]').forEach(function (el) {\n      if (hasError) {\n        el.hidden = false;\n        el.textContent = message || window.PAB_BILL_NAME_ERROR;\n      } else {\n        el.hidden = true;\n      }\n    });\n  };\n\n  window.scrollPabFieldIntoView = function (el) {\n    if (!el) return;\n    var field = el.closest('.bill-name-field') || el;\n    var bottomInset = window.getPabStickyBarInset();\n    field.style.scrollMarginTop = '96px';\n    field.style.scrollMarginBottom = bottomInset + 'px';\n    field.scrollIntoView({ behavior: 'smooth', block: 'center' });\n  };\n\n  window.scrollPabBillNameIntoView = function (preferTop) {\n    var target = preferTop\n      ? document.getElementById('billNameTop')\n      : document.getElementById('billName');\n    if (!target) {\n      target = document.getElementById('billNameTop') || document.getElementById('billName');\n    }\n    window.scrollPabFieldIntoView(target);\n  };\n\n  document.addEventListener('DOMContentLoaded', function () {\n    var top = document.getElementById('billNameTop');\n    var bottom = document.getElementById('billName');\n    if (!top || !bottom) return;\n    var syncing = false;\n    function sync(from) {\n      if (syncing) return;\n      syncing = true;\n      window.syncPabBillNameFields(from);\n      window.setPabBillNameError(false);\n      syncing = false;\n    }\n    top.addEventListener('input', function () { sync('top'); });\n    bottom.addEventListener('input', function () { sync('bottom'); });\n  });\n  var priceRefreshQueued = false;\n  function queuePriceBreakdown() {\n    if (priceRefreshQueued || !document.querySelector('[data-pab-price-rows]')) return;\n    priceRefreshQueued = true;\n    window.requestAnimationFrame(function () {\n      priceRefreshQueued = false;\n      var form = document.getElementById('customOrderForm');\n      if (!form) return;\n      Promise.all([ensureVariantPrices(), ensureAccessoryPrices()]).then(function () {\n        renderPriceBreakdown(computePriceBreakdown(visiblePriceSpec(form), window.PAB_VARIANT_PRICES || {}, window.ACCESSORY_LIVE_PRICES || {}));\n      }).catch(function () {});\n    });\n  }\n  document.addEventListener('input', queuePriceBreakdown);\n  document.addEventListener('change', queuePriceBreakdown);\n  document.addEventListener('click', queuePriceBreakdown);\n  document.addEventListener('pabPricesLoaded', queuePriceBreakdown);\n  document.addEventListener('DOMContentLoaded', function () {\n    var total = document.querySelector('#pab-mockup-root #total');\n    if (total) new MutationObserver(queuePriceBreakdown).observe(total, { childList: true, characterData: true, subtree: true });\n    queuePriceBreakdown();\n  });\n})();\n\n\n"],
  "mappings": "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",
  "names": ["cents", "def", "vid", "entry"]
}
