{
  "version": 3,
  "sources": ["/cdn/shop/t/77/assets/lux-dream-build.js?cb=20835"],
  "sourcesContent": ["/*\n  Dream Build Giveaway entry form (sections/lux-dream-build.liquid).\n\n  Four panels, checked one at a time. When the rider presses Enter the\n  giveaway, it sends, with the store's Klaviyo public key:\n    1. a \"Dream Build Entry\" event, carrying every answer and the parts in\n       the chosen build, which also writes the answers onto the profile\n       as dream_* properties;\n    2. a list subscription. Joining the email list is a condition of entry,\n       stated on step 1 and in the terms box, so every entrant is subscribed.\n  The flow on that metric sends the confirmation.\n\n  Photo: optional. Shrunk to a 1600px JPEG in the browser, then POSTed to\n  LUXBMX-Utility (/api/dream-build/photo), which stores it in Vercel Blob and\n  returns a URL. The URL and the share permission go on the entry.\n\n  The build: every entry carries its parts (title, variant, slot, price,\n  quantity, ids), because that is what the judges see. Step 2 offers the\n  build from the bike builder on this device (assets/lux-build-lite.js keeps\n  a copy of it in localStorage, \"lux-build-lite-export\") and the rider's own\n  Swym wishlists (fetchLists; the chosen one's share link is made with\n  generateSharedListURL and kept as a record). Both are read again when the\n  rider comes back to the page or changes the build in another tab. A pasted\n  share link is read for its parts; if the parts can't be read from this\n  device the rider is told to enter where they saved the build, so no entry\n  arrives without one. Workshop services (assembly, wheel build) are left\n  out: they aren't parts. Totals are in the build's currency: AUD for\n  wishlists, the shopping currency for a builder build ($value only in AUD).\n\n  Entry window: the form shows only between \"Opens at\" and \"Closes at\", and\n  both are checked again on step 1 and at submit, so a page left open across\n  either time can't slip an entry through. A page opened before the start\n  shows the form by itself at the opening time.\n\n  Privacy: the section is excluded from Shopify's DOM events and masked from\n  Clarity (data-shopify-privacy, data-clarity-mask), and the last button is a\n  plain button, so no native submit event reaches the apps that listen for\n  one. Two more guards, below: change events stay inside the form (Google's\n  tag reads every input on the page when one reaches the document), and\n  Analyzify skips the hidden forms Meta's pixel posts to facebook.com/tr.\n  Google's tag settings should also exclude [data-lux-dream] from automatic\n  user-provided data detection: that is the only full cover.\n*/\n(function () {\n  'use strict';\n\n  // Meta's pixel sends large events by submitting a hidden form to\n  // facebook.com/tr. Analyzify wraps HTMLFormElement.prototype.submit and\n  // republishes the fields of every form submitted that way, which would hand\n  // it Meta's hashed matching data from this form. Its listener skips a form\n  // while form._azfySending is true, so that reads true for Meta's forms.\n  // This file only loads with the Dream Build section. If Analyzify renames\n  // the flag, this stops mattering and nothing breaks.\n  try {\n    Object.defineProperty(HTMLFormElement.prototype, '_azfySending', {\n      configurable: true,\n      get: function () {\n        return !!this.__azfyBusy || /^https:\\/\\/www\\.(facebook|instagram)\\.com\\/tr\\b/.test(this.getAttribute('action') || '');\n      },\n      set: function (v) { this.__azfyBusy = v; }\n    });\n  } catch (e) { /* defineProperty refused: Analyzify sees Meta's forms */ }\n\n  var REVISION = '2025-10-15';\n  // Entrants under 13 can't enter (terms 2.2); 13 to 17 need a parent's OK.\n  var MINOR = '13 to 17';\n  var API = 'https://a.klaviyo.com/client/';\n\n  function words(text) {\n    var t = (text || '').trim();\n    return t ? t.split(/\\s+/).length : 0;\n  }\n\n  // A likely-meant address for a typo in a common provider's domain\n  // (\"gmail.clm\", \"gmial.com\", \"bigpond.con\"), or '' when the domain is known\n  // or not close to one. Close means one letter off, or two for longer names,\n  // so a real but unusual domain is left alone.\n  var EMAIL_DOMAINS = ('gmail.com,googlemail.com,hotmail.com,hotmail.com.au,outlook.com,outlook.com.au,live.com,live.com.au,' +\n    'yahoo.com,yahoo.com.au,ymail.com,icloud.com,me.com,mac.com,bigpond.com,bigpond.net.au,optusnet.com.au,' +\n    'tpg.com.au,iinet.net.au,internode.on.net,westnet.com.au,xtra.co.nz,protonmail.com,proton.me,msn.com,aol.com').split(',');\n\n  function editDistance(a, b) {\n    var prev = [], cur, i, j;\n    for (j = 0; j <= b.length; j++) prev[j] = j;\n    for (i = 1; i <= a.length; i++) {\n      cur = [i];\n      for (j = 1; j <= b.length; j++) {\n        cur[j] = Math.min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + (a.charAt(i - 1) === b.charAt(j - 1) ? 0 : 1));\n      }\n      prev = cur;\n    }\n    return prev[b.length];\n  }\n\n  function emailSuggestion(raw) {\n    var v = String(raw || '').trim();\n    var at = v.lastIndexOf('@');\n    if (at < 1) return '';\n    var domain = v.slice(at + 1).toLowerCase();\n    if (!domain || EMAIL_DOMAINS.indexOf(domain) >= 0) return '';\n    var best = '', bestD = 99;\n    EMAIL_DOMAINS.forEach(function (d) {\n      var dist = editDistance(domain, d);\n      if (dist < bestD) { bestD = dist; best = d; }\n    });\n    var allowed = best.length >= 9 ? 2 : 1;\n    if (best && bestD <= allowed) return v.slice(0, at + 1) + best;\n    // Any domain: the usual slips in .com\n    var fixed = domain.replace(/\\.(con|cmo|clm|vom|xom|comm|coom|cpm)(\\.au)?$/, '.com$2');\n    return fixed !== domain ? v.slice(0, at + 1) + fixed : '';\n  }\n\n  function money(n, currency) {\n    return '$' + Number(n || 0).toLocaleString('en-AU', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' ' + (currency || 'AUD');\n  }\n\n  function uuid() {\n    if (window.crypto && crypto.randomUUID) return crypto.randomUUID();\n    return 'd' + Date.now().toString(36) + Math.random().toString(36).slice(2, 10);\n  }\n\n  // A LUXBMX wishlist share link, as { lid }, or null when it isn't one:\n  // https://www.luxbmx.com/pages/share-wishlist?hkey=...&lid=... (or the older\n  // swym-share-wishlist path). Nothing else is accepted: the link ends up as a\n  // button in a LUXBMX email. lid is '' for a link with only an hkey, which\n  // is a real share link but can't be read from here.\n  function shareLink(value) {\n    try {\n      var u = new URL(String(value || '').trim());\n      if (u.protocol !== 'https:' || !/^(www\\.)?luxbmx\\.com$/i.test(u.hostname)) return null;\n      // Our own wishlist's share link: /pages/wishlist?share=CODE. The code\n      // stands in for Swym's lid; lux-wishlist.js reads the list by it.\n      var code = u.searchParams.get('share');\n      if (/\\/pages\\/wishlist\\/?$/i.test(u.pathname) && code && /^[A-Za-z0-9]{6,20}$/.test(code)) return { lid: code };\n      if (!/\\/pages\\/(swym-)?share-wishlist\\/?$/i.test(u.pathname)) return null;\n      var lid = u.searchParams.get('lid') || '';\n      if (!lid && !u.searchParams.get('hkey')) return null;\n      return { lid: lid };\n    } catch (e) {\n      return null;\n    }\n  }\n\n  // Workshop services (titles start \"WKSP\", handles \"workshop-\" or\n  // \"custom-wheel-build\") aren't parts of the bike.\n  function isService(item) {\n    return /^(wksp|workshop)\\b/i.test(item.dt || '') || /\\/products\\/(workshop-|custom-wheel-build)/i.test(item.du || '');\n  }\n\n  // The bike builder's slots, top to bottom. A build is sent in this order\n  // whatever order its list holds it in (Swym keeps a list newest first).\n  // Parts with no builder slot keep their place, after these.\n  var SLOT_ORDER = ('frame,fork,headset,bars,stem,grips,cranks,bottom bracket,sprocket,chainring,chain,pedals,rear cog,' +\n    'front wheel,rear wheel,front hub,rear hub,front rim,rear rim,rims,spokes,nipples,front tyre,rear tyre,tyres,tubes,' +\n    'seat,seat post,disc brake,rotor,disc mount,v-brake,brake lever,brake cable,pegs,number plate,brake kit,brake caliper').split(',');\n  function inBuildOrder(items) {\n    var rank = function (it) {\n      var i = SLOT_ORDER.indexOf(String(it.note || '').trim().toLowerCase());\n      return i < 0 ? SLOT_ORDER.length : i;\n    };\n    return items.map(function (it, i) { return { it: it, r: rank(it), i: i }; })\n      .sort(function (a, b) { return a.r - b.r || a.i - b.i; })\n      .map(function (x) { return x.it; });\n  }\n\n  // An Australian mobile in E.164 (+614...), or '' when it isn't one.\n  function auMobile(raw) {\n    var d = String(raw || '').replace(/[\\s()\\-.]/g, '');\n    if (d.indexOf('+61') === 0) d = d.slice(3);\n    else if (/^61\\d{9}$/.test(d)) d = d.slice(2);\n    else if (d.charAt(0) === '0') d = d.slice(1);\n    return /^4\\d{8}$/.test(d) ? '+61' + d : '';\n  }\n\n  // A small copy of a part's photo for the confirmation email.\n  function thumb(src) {\n    if (!src) return '';\n    var u = String(src);\n    if (u.indexOf('//') === 0) u = 'https:' + u;\n    if (!/^https:\\/\\//.test(u)) return '';\n    return u + (u.indexOf('?') < 0 ? '?' : '&') + 'width=160';\n  }\n\n  function send(url, headers, body, label) {\n    return fetch(url, { method: 'POST', headers: headers, body: JSON.stringify(body) }).then(function (res) {\n      if (res.ok) return true;\n      return res.text().then(function (t) {\n        throw new Error(label + ' ' + res.status + ' ' + t.slice(0, 300));\n      });\n    });\n  }\n\n  // Straight to Klaviyo first. Tracker blockers and patchy mobile data can\n  // stop that call, so on any failure the same body goes through our relay,\n  // which forwards it to Klaviyo and logs why the direct call failed. The\n  // event's unique_id stops a double count if both arrive.\n  function post(path, cfg, body) {\n    var direct = API + path + '?company_id=' + encodeURIComponent(cfg.companyId);\n    return send(direct, { 'Content-Type': 'application/json', revision: REVISION }, body, 'Klaviyo ' + path).catch(function (err) {\n      if (!cfg.relayUrl) throw err;\n      if (window.console) console.warn('[dream build] direct ' + path + ' failed, relaying', err);\n      var reason = String((err && err.message) || err) + ' | online: ' + navigator.onLine;\n      return send(cfg.relayUrl, { 'Content-Type': 'application/json' }, { path: path, body: body, direct_error: reason }, 'Relay ' + path);\n    });\n  }\n\n  // With our own wishlist (theme setting), lux-wishlist.js hands over the\n  // same Swym-shaped calls (fetchLists, fetchListDetails,\n  // generateSharedListURL), so the rest of this file doesn't need to know.\n  function onSwym(fn) {\n    if (window.luxWishlistProvider === 'lux') {\n      window.LuxWishlistCallbacks = window.LuxWishlistCallbacks || [];\n      window.LuxWishlistCallbacks.push(function (wl) { fn(wl.swym); });\n      return;\n    }\n    if (window._swat && window._swat.fetchLists) return fn(window._swat);\n    window.SwymCallbacks = window.SwymCallbacks || [];\n    window.SwymCallbacks.push(fn);\n  }\n\n  function init(root) {\n    if (root.dataset.dreamReady) return;\n    root.dataset.dreamReady = '1';\n\n    var config = {};\n    try { config = JSON.parse(root.getAttribute('data-config') || '{}'); } catch (e) {}\n\n    var form = root.querySelector('[data-dream-form]');\n    var closed = root.querySelector('[data-dream-closed]');\n    var soon = root.querySelector('[data-dream-soon]');\n    var done = root.querySelector('[data-dream-done]');\n    if (!form) return;\n\n    var opensAt = config.opensAt ? Date.parse(config.opensAt) : NaN;\n    var closesAt = config.closesAt ? Date.parse(config.closesAt) : NaN;\n    // 'soon', 'closed' or 'open', by this device's clock.\n    function windowState() {\n      var now = Date.now();\n      if (!isNaN(opensAt) && now < opensAt) return 'soon';\n      if (!isNaN(closesAt) && now > closesAt) return 'closed';\n      return 'open';\n    }\n    // Swaps the form for the not-open-yet or closed message, and moves focus\n    // to it when the rider was in the form. False when open.\n    function outsideWindow() {\n      var state = windowState();\n      if (state === 'open') return false;\n      var wasShown = !form.hidden;\n      form.hidden = true;\n      var panel = state === 'soon' ? soon : closed;\n      if (panel) {\n        panel.hidden = false;\n        if (wasShown) { panel.focus({ preventScroll: true }); panel.scrollIntoView({ block: 'center' }); }\n      }\n      return true;\n    }\n    if (outsideWindow()) {\n      // Before the start: show the form by itself at the opening time, and\n      // when a phone wakes a tab that slept through it.\n      if (windowState() === 'soon') {\n        var reopened = false;\n        var arm = function () {\n          var wait = Math.max(opensAt - Date.now(), 0) + 1000;\n          setTimeout(reopen, Math.min(wait, 864e5));\n        };\n        var reopen = function () {\n          if (reopened) return;\n          var state = windowState();\n          if (state === 'soon') { arm(); return; }\n          reopened = true;\n          soon.hidden = true;\n          if (state === 'closed') { if (closed) closed.hidden = false; return; }\n          delete root.dataset.dreamReady;\n          init(root);\n        };\n        arm();\n        document.addEventListener('visibilitychange', function () { if (!document.hidden) reopen(); });\n      }\n      return;\n    }\n    form.hidden = false;\n\n    // Google's tag sends a form_start hit on the first change event that\n    // reaches the document, and its automatic email detection reads every\n    // input on the page for that hit. Change events stay inside this form;\n    // every handler here listens on the inputs themselves.\n    form.addEventListener('change', function (e) { e.stopPropagation(); });\n\n    // One id per entry and one per start. Klaviyo records only the first event\n    // with an id, so a retry after a partial failure can't add a second entry.\n    var entryId = uuid();\n    var startedId = uuid();\n\n    var panels = form.querySelectorAll('[data-dream-panel]');\n    var dots = form.querySelectorAll('[data-dream-dot]');\n    var backBtn = form.querySelector('[data-dream-back]');\n    var nextBtn = form.querySelector('[data-dream-next]');\n    var submitBtn = form.querySelector('[data-dream-submit]');\n    var urlInput = form.elements.wishlist_url;\n    var whyInput = form.querySelector('[data-dream-why]');\n    var wordOut = form.querySelector('[data-dream-words]');\n    var maxWords = config.maxWords || 25;\n    var step = 1;\n    var chosenList = null;   // { name, items, total, currency, source, lid }\n    var myLists = [];        // the rider's own Swym lists, for pasted links\n    var pasteReason = '';    // why the last pasted link gave no parts: 'empty', 'loading' or ''\n\n    function show(n) {\n      step = n;\n      panels.forEach(function (p) { p.hidden = Number(p.dataset.dreamPanel) !== n; });\n      dots.forEach(function (d) {\n        var i = Number(d.dataset.dreamDot);\n        d.classList.toggle('is-on', i === n);\n        d.classList.toggle('is-done', i < n);\n      });\n      backBtn.hidden = n === 1;\n      nextBtn.hidden = n === panels.length;\n      submitBtn.hidden = n !== panels.length;\n    }\n\n    function fail(n, message) {\n      var el = form.querySelector('[data-dream-error=\"' + n + '\"]');\n      if (!el) return false;\n      el.textContent = message || '';\n      el.hidden = !message;\n      return !message;\n    }\n\n    function radio(name) {\n      var el = form.querySelector('input[name=\"' + name + '\"]:checked');\n      return el ? el.value : '';\n    }\n\n    var EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n    // \"Did you mean ...?\" under an email field. Next stops once for a likely\n    // typo; pressing Next again keeps what was typed.\n    var suggestWarned = {};\n    function suggestBox(input) {\n      var box = input.parentNode.querySelector('[data-dream-suggest]');\n      if (box) return box;\n      box = document.createElement('p');\n      box.className = 'lux-dream__help lux-dream__suggest';\n      box.setAttribute('data-dream-suggest', '');\n      box.setAttribute('aria-live', 'polite');\n      box.hidden = true;\n      input.insertAdjacentElement('afterend', box);\n      return box;\n    }\n    function showSuggestion(input) {\n      var box = suggestBox(input);\n      var s = emailSuggestion(input.value);\n      if (!s) { box.hidden = true; box.textContent = ''; return ''; }\n      box.textContent = 'Did you mean ';\n      var btn = document.createElement('button');\n      btn.type = 'button';\n      btn.className = 'lux-dream__suggest-fix';\n      btn.textContent = s;\n      btn.addEventListener('click', function () {\n        input.value = s;\n        box.hidden = true;\n        fail(1, '');\n        input.dispatchEvent(new Event('input', { bubbles: true }));\n        input.focus();\n      });\n      box.appendChild(btn);\n      box.appendChild(document.createTextNode('?'));\n      box.hidden = false;\n      return s;\n    }\n    function typoStop(input) {\n      var s = showSuggestion(input);\n      if (!s || suggestWarned[input.name] === input.value.trim()) return '';\n      suggestWarned[input.name] = input.value.trim();\n      return s;\n    }\n    ['email', 'parent_email'].forEach(function (name) {\n      var input = form.elements[name];\n      if (!input) return;\n      input.addEventListener('blur', function () { showSuggestion(input); });\n      input.addEventListener('input', function () {\n        if (suggestWarned[name] && suggestWarned[name] !== input.value.trim()) delete suggestWarned[name];\n        var box = input.parentNode.querySelector('[data-dream-suggest]');\n        if (box && !box.hidden && !emailSuggestion(input.value)) box.hidden = true;\n      });\n    });\n\n    function check(n) {\n      var el = form.elements;\n      if (n === 1) {\n        if (!el.first_name.value.trim() || !el.last_name.value.trim()) return fail(1, 'Add your first and last name.');\n        if (!EMAIL_RE.test(el.email.value.trim())) return fail(1, 'Check your email address.');\n        var typo = typoStop(el.email);\n        if (typo) return fail(1, 'Check your email: did you mean ' + typo + '? Tap it above to fix it, or press Next again to keep yours.');\n        if (!radio('dream_country')) return fail(1, 'Tell us where you live.');\n        if (radio('dream_country') === 'Somewhere else') return fail(1, 'Entries are open to people who live in Australia or New Zealand.');\n        if (!radio('dream_age')) return fail(1, 'Tell us how old you are.');\n        if (radio('dream_age') === 'Under 13') return fail(1, 'You need to be 13 or older to enter. A parent or guardian can enter for you, using their own name and email.');\n        if (radio('dream_age') === MINOR) {\n          if (!EMAIL_RE.test(el.parent_email.value.trim())) return fail(1, \"Add your parent or guardian's email.\");\n          if (el.parent_email.value.trim().toLowerCase() === el.email.value.trim().toLowerCase()) return fail(1, \"Your parent or guardian's email needs to be different from yours.\");\n          var parentTypo = typoStop(el.parent_email);\n          if (parentTypo) return fail(1, \"Check your parent or guardian's email: did you mean \" + parentTypo + '? Tap it above to fix it, or press Next again to keep it.');\n          if (!el.parent_ok.checked) return fail(1, 'Tick the box to confirm your parent or guardian says you can enter.');\n        }\n        if (smsWanted() && !auMobile(el.phone.value)) return fail(1, 'Check your mobile number, like 0412 345 678. Or untick the texts box.');\n        return fail(1, '');\n      }\n      if (n === 2) {\n        if (chosenList && chosenList.items.length) return fail(2, '');\n        var link = urlInput.value.trim();\n        if (!link) {\n          return fail(2, listOpts.children.length\n            ? 'Pick your build above.'\n            : 'Make your build in the bike builder first, or open this page on the phone or computer where you made it.');\n        }\n        if (!shareLink(link)) return fail(2, \"That isn't a LUXBMX wishlist share link. On your wishlist, open the list, tap Share and copy the link.\");\n        if (pasteReason === 'empty') return fail(2, 'That list has no parts in it yet. Add your parts, or pick another build.');\n        if (pasteReason === 'loading') return fail(2, 'Your wishlists are still loading. Try Next again in a moment.');\n        return fail(2, \"We can't read the parts in that list from here. Open this page in the browser or app where you saved your build, or build it again here.\");\n      }\n      if (n === 3) {\n        var missing = ['dream_style', 'dream_experience', 'dream_first_upgrade', 'dream_budget', 'dream_timing'].filter(function (q) { return !radio(q); });\n        if (missing.length || !el.dream_current_bike.value.trim()) return fail(3, 'Answer every question to keep going.');\n        return fail(3, '');\n      }\n      if (n === 4) {\n        var w = words(whyInput.value);\n        if (!w) return fail(4, 'Tell us what BMX means to you.');\n        if (w > maxWords) return fail(4, 'Keep it to ' + maxWords + ' words or less.');\n        if (!el.terms.checked) return fail(4, 'Tick the box to agree to the terms and conditions.');\n        return fail(4, '');\n      }\n      return true;\n    }\n\n    // Funnel events: Shopify customer events (no personal details in them)\n    // and the Meta pixel when it is on the page.\n    function track(name, data) {\n      try { if (window.Shopify && Shopify.analytics && Shopify.analytics.publish) Shopify.analytics.publish(name, data || {}); } catch (e) {}\n    }\n    function trackMeta(event, data, standard) {\n      try { if (typeof window.fbq === 'function') window.fbq(standard ? 'track' : 'trackCustom', event, data || {}); } catch (e) {}\n    }\n\n    // As soon as step 1 passes, Klaviyo knows who this is, so the abandon\n    // flow can reach riders who leave before finishing. Sent once.\n    var startedSent = false;\n    function sendStarted() {\n      if (startedSent) return;\n      startedSent = true;\n      var el = form.elements;\n      var email = el.email.value.trim();\n      post('events', config, {\n        data: {\n          type: 'event',\n          attributes: {\n            properties: { page: location.pathname, dream_age: radio('dream_age'), dream_country: radio('dream_country') },\n            unique_id: startedId,\n            metric: { data: { type: 'metric', attributes: { name: 'Dream Build Started' } } },\n            profile: { data: { type: 'profile', attributes: { email: email, first_name: el.first_name.value.trim(), last_name: el.last_name.value.trim() } } }\n          }\n        }\n      }).catch(function (err) { startedSent = false; if (window.console) console.warn('[dream build] started', err); });\n      try { if (window.klaviyo && window.klaviyo.identify) window.klaviyo.identify({ email: email }); } catch (e) {}\n      track('dream_build_started');\n      trackMeta('DreamBuildStarted');\n    }\n\n    function subscribe(email) {\n      return post('subscriptions', config, {\n        data: {\n          type: 'subscription',\n          attributes: {\n            custom_source: config.source || 'Dream Build Giveaway',\n            profile: { data: { type: 'profile', attributes: { email: email, subscriptions: { email: { marketing: { consent: 'SUBSCRIBED' } } } } } }\n          },\n          relationships: { list: { data: { type: 'list', id: config.listId } } }\n        }\n      });\n    }\n\n    function subscribeSms(email, phone) {\n      return post('subscriptions', config, {\n        data: {\n          type: 'subscription',\n          attributes: {\n            custom_source: config.source || 'Dream Build Giveaway',\n            profile: { data: { type: 'profile', attributes: { email: email, phone_number: phone, subscriptions: { sms: { marketing: { consent: 'SUBSCRIBED' } } } } } }\n          },\n          relationships: { list: { data: { type: 'list', id: config.listId } } }\n        }\n      });\n    }\n\n    function focusPanel() {\n      var p = form.querySelector('[data-dream-panel=\"' + step + '\"]');\n      var target = p && p.querySelector('legend');\n      if (p) p.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      if (target) { target.setAttribute('tabindex', '-1'); target.focus({ preventScroll: true }); }\n    }\n\n    function goNext() {\n      if (!check(step)) return;\n      if (step === 1) {\n        if (outsideWindow()) return;\n        sendStarted();\n      }\n      show(step + 1);\n      track('dream_build_step', { step: step });\n      focusPanel();\n    }\n    nextBtn.addEventListener('click', function () {\n      // A pasted link is read for its parts before step 2 can pass. Back is\n      // held while it reads, so the answer lands on step 2.\n      var pasted = step === 2 && !(chosenList && chosenList.items.length) && shareLink(urlInput.value);\n      if (pasted && pasted.lid) {\n        nextBtn.disabled = true;\n        backBtn.disabled = true;\n        readPasted(urlInput.value).then(function () {\n          nextBtn.disabled = false;\n          backBtn.disabled = false;\n          if (step === 2) goNext();\n        });\n        return;\n      }\n      goNext();\n    });\n    backBtn.addEventListener('click', function () {\n      show(step - 1);\n      focusPanel();\n    });\n\n    var elsewhere = form.querySelector('[data-dream-elsewhere]');\n    form.querySelectorAll('input[name=\"dream_country\"]').forEach(function (r) {\n      r.addEventListener('change', function () { elsewhere.hidden = radio('dream_country') !== 'Somewhere else'; });\n    });\n\n    var minor = form.querySelector('[data-dream-minor]');\n    var tooYoung = form.querySelector('[data-dream-too-young]');\n    form.querySelectorAll('input[name=\"dream_age\"]').forEach(function (r) {\n      r.addEventListener('change', function () {\n        minor.hidden = radio('dream_age') !== MINOR;\n        if (tooYoung) tooYoung.hidden = radio('dream_age') !== 'Under 13';\n      });\n    });\n\n    // SMS sign-up: Klaviyo only has an Australian sender, and it's for adults.\n    var smsBox = form.querySelector('[data-dream-sms]');\n    var smsField = form.querySelector('[data-dream-sms-field]');\n    function smsOffered() { return radio('dream_country') === 'Australia' && radio('dream_age') === '18 or over'; }\n    function smsWanted() { return !!(smsBox && smsOffered() && form.elements.sms_ok.checked); }\n    function syncSms() {\n      if (!smsBox) return;\n      smsBox.hidden = !smsOffered();\n      smsField.hidden = !smsWanted();\n    }\n    if (smsBox) {\n      form.querySelectorAll('input[name=\"dream_country\"], input[name=\"dream_age\"], input[name=\"sms_ok\"]').forEach(function (r) {\n        r.addEventListener('change', syncSms);\n      });\n    }\n\n    whyInput.addEventListener('input', function () {\n      var w = words(whyInput.value);\n      wordOut.textContent = w;\n      wordOut.parentNode.classList.toggle('is-over', w > maxWords);\n    });\n\n    // Optional photo: shrunk to a JPEG here, uploaded on submit.\n    var photoInput = form.querySelector('[data-dream-photo-input]');\n    var photoPreview = form.querySelector('[data-dream-photo-preview]');\n    var photoImg = form.querySelector('[data-dream-photo-img]');\n    var photoPending = null;\n\n    // The img path: lighter on phone memory than a full-size ImageBitmap of\n    // a 24 to 48 MP photo, and it reads the orientation too.\n    function decode(file) {\n      return decodeWithImg(file).catch(function () {\n        if (window.createImageBitmap) return createImageBitmap(file, { imageOrientation: 'from-image' });\n        throw new Error('decode');\n      });\n    }\n\n    function decodeWithImg(file) {\n      return new Promise(function (resolve, reject) {\n        var img = new Image();\n        var url = URL.createObjectURL(file);\n        img.onload = function () { URL.revokeObjectURL(url); resolve(img); };\n        img.onerror = function () { URL.revokeObjectURL(url); reject(new Error('decode')); };\n        img.src = url;\n      });\n    }\n\n    function shrink(file) {\n      return decode(file).then(function (img) {\n        var w = img.width || img.naturalWidth;\n        var h = img.height || img.naturalHeight;\n        var scale = Math.min(1, 1600 / Math.max(w, h));\n        var canvas = document.createElement('canvas');\n        canvas.width = Math.round(w * scale);\n        canvas.height = Math.round(h * scale);\n        canvas.getContext('2d').drawImage(img, 0, 0, canvas.width, canvas.height);\n        if (img.close) img.close();\n        return new Promise(function (resolve, reject) {\n          canvas.toBlob(function (blob) { blob ? resolve(blob) : reject(new Error('encode')); }, 'image/jpeg', 0.85);\n        });\n      });\n    }\n\n    // A photo that fails never reaches the server on its own, so the reason is\n    // reported to the photo endpoint (logged in the Utility runtime logs).\n    function reportPhoto(kind, detail) {\n      try {\n        fetch(config.photoUrl, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ report: kind, detail: String(detail || '').slice(0, 300) }),\n          keepalive: true\n        }).catch(function () {});\n      } catch (e) { /* reporting is best effort */ }\n    }\n\n    function clearPhoto() {\n      photoPending = null;\n      if (photoInput) photoInput.value = '';\n      if (photoPreview) photoPreview.hidden = true;\n      if (photoImg) {\n        if (photoImg.src && photoImg.src.indexOf('blob:') === 0) URL.revokeObjectURL(photoImg.src);\n        photoImg.removeAttribute('src');\n      }\n    }\n\n    if (photoInput && config.photoUrl) {\n      photoInput.addEventListener('change', function () {\n        fail(4, '');\n        var file = photoInput.files && photoInput.files[0];\n        if (!file) { clearPhoto(); return; }\n        // A later pick, or Remove, replaces photoPending: a slower shrink\n        // that lands after that is dropped.\n        var p = photoPending = shrink(file);\n        p.then(function (blob) {\n          if (photoPending !== p) return;\n          if (photoImg.src && photoImg.src.indexOf('blob:') === 0) URL.revokeObjectURL(photoImg.src);\n          photoImg.src = URL.createObjectURL(blob);\n          photoPreview.hidden = false;\n        }).catch(function (err) {\n          if (photoPending !== p) return;\n          reportPhoto('decode', (file.type || 'unknown type') + ', ' + Math.round((file.size || 0) / 1024) + ' KB, ' + ((err && err.message) || err));\n          clearPhoto();\n          fail(4, \"We couldn't open that photo on this device. Try another photo, or take a screenshot of it and upload the screenshot.\");\n        });\n      });\n      form.querySelector('[data-dream-photo-remove]').addEventListener('click', clearPhoto);\n    }\n\n    // Why an upload failed, as a kind the entry's error message can name.\n    function photoKind(status) {\n      if (status === 413) return 'too_large';\n      if (status === 415) return 'type';\n      if (status >= 500) return 'server';\n      return 'other';\n    }\n\n    // One retry for a dropped connection or a server hiccup.\n    function sendPhoto(blob, tries) {\n      return fetch(config.photoUrl, { method: 'POST', headers: { 'Content-Type': 'image/jpeg' }, body: blob }).then(function (res) {\n        if (res.ok) return res.json();\n        var err = new Error('photo ' + res.status);\n        err.kind = photoKind(res.status);\n        throw err;\n      }, function (netErr) {\n        var err = new Error('photo network: ' + ((netErr && netErr.message) || netErr));\n        err.kind = 'network';\n        throw err;\n      }).catch(function (err) {\n        if (tries > 1 && (err.kind === 'network' || err.kind === 'server')) return sendPhoto(blob, tries - 1);\n        throw err;\n      });\n    }\n\n    function uploadPhoto() {\n      if (!photoPending || !config.photoUrl) return Promise.resolve(null);\n      var size = 0;\n      return photoPending.then(function (blob) {\n        size = blob.size;\n        return sendPhoto(blob, 2);\n      }).then(function (json) {\n        return json.url || null;\n      }).catch(function (err) {\n        err.photo = true;\n        err.kind = err.kind || 'other';\n        reportPhoto('upload ' + err.kind, ((err && err.message) || err) + ', ' + Math.round(size / 1024) + ' KB, online: ' + navigator.onLine);\n        throw err;\n      });\n    }\n\n    var PHOTO_FAIL = {\n      network: \"Your photo didn't upload because the connection dropped. Press Enter the giveaway to try again, or remove the photo to enter without one.\",\n      too_large: 'That photo is too large to upload. Choose a smaller one, or remove the photo to enter without one.',\n      type: \"That photo's format didn't work. Choose a different photo, or remove it to enter without one.\",\n      server: 'Our photo upload had a problem. Press Enter the giveaway to try again in a moment, or remove the photo to enter without one.',\n      other: \"Your photo didn't upload. Press Enter the giveaway to try again, or remove the photo to enter without one.\"\n    };\n\n    // Enter in a text field moves forward, and never submits: the entry only\n    // goes from the Enter button.\n    form.addEventListener('keydown', function (e) {\n      if (e.key === 'Enter' && e.target.tagName === 'INPUT') {\n        e.preventDefault();\n        if (step < panels.length) nextBtn.click();\n      }\n    });\n\n    // ---- the build: the bike builder's copy on this device, then Swym lists\n\n    var listWrap = form.querySelector('[data-dream-lists]');\n    var listOpts = form.querySelector('[data-dream-list-opts]');\n    var noLists = form.querySelector('[data-dream-nolists]');\n    var swymRef = null;\n\n    function totalOf(items) {\n      return items.reduce(function (sum, it) { return sum + Number(it.pr || 0) * Number(it.qty || 1); }, 0);\n    }\n\n    // Shows the options, or the no-build box when there are none.\n    function syncOptions() {\n      var any = listOpts.children.length > 0;\n      listWrap.hidden = !any;\n      if (noLists) noLists.hidden = any;\n      var paste = form.querySelector('[data-dream-paste] .lux-dream__label');\n      if (paste) paste.textContent = any ? 'Or paste a wishlist share link' : 'Wishlist share link';\n      fail(2, '');\n    }\n\n    // One radio per build. The builder's goes first.\n    function addOption(key, source, title, items, currency, onPick) {\n      var total = totalOf(items);\n      var label = document.createElement('label');\n      label.className = 'lux-dream__list-opt';\n      label.setAttribute('data-dream-opt', source);\n      var input = document.createElement('input');\n      input.type = 'radio';\n      input.name = 'dream_list';\n      input.value = key;\n      var text = document.createElement('span');\n      var name = document.createElement('span');\n      name.className = 'lux-dream__list-name';\n      name.textContent = title;\n      var meta = document.createElement('span');\n      meta.className = 'lux-dream__list-meta';\n      meta.textContent = items.length + (items.length === 1 ? ' part, ' : ' parts, ') + money(total, currency);\n      text.appendChild(name);\n      text.appendChild(meta);\n      label.appendChild(input);\n      label.appendChild(text);\n      if (source === 'builder') listOpts.insertBefore(label, listOpts.firstChild);\n      else listOpts.appendChild(label);\n      input.addEventListener('change', function () { onPick(total); });\n      syncOptions();\n      return input;\n    }\n\n    // Drops one kind of option. If the rider had picked one of them, the\n    // pick goes too, with a wishlist's share link.\n    function dropOptions(source) {\n      listOpts.querySelectorAll('[data-dream-opt=\"' + source + '\"]').forEach(function (el) { el.remove(); });\n      if (chosenList && chosenList.source === source) {\n        chosenList = null;\n        if (source === 'wishlist') urlInput.value = '';\n      }\n      syncOptions();\n    }\n\n    // The build in the bike builder on this device, in the shape of a Swym\n    // list item, prices in that visit's currency. Read again when the rider\n    // comes back to this page or changes the build in another tab; a picked\n    // builder build is swapped for the new one.\n    function builderBuild() {\n      var wasPicked = !!(chosenList && chosenList.source === 'builder');\n      dropOptions('builder');\n      var saved = null;\n      try { saved = JSON.parse(localStorage.getItem('lux-build-lite-export') || 'null'); } catch (e) {}\n      if (!saved || !Array.isArray(saved.items) || !saved.items.length) {\n        // A build saved before the builder kept this copy shows up after one\n        // more visit to the builder.\n        var older = null;\n        try { older = JSON.parse(localStorage.getItem('lux-build-lite-v2') || 'null'); } catch (e) {}\n        var first = noLists && noLists.querySelector('p');\n        if (first && older && older.picks && Object.keys(older.picks).length) {\n          first.textContent = 'Your build in the bike builder shows here after one more visit: open the builder, then come back to this page.';\n        }\n        return;\n      }\n      var currency = saved.currency || 'AUD';\n      var items = saved.items.map(function (it) {\n        return { dt: it.title, vi: it.variantTitle || '', note: it.slot || '', pr: Number(it.price || 0) / 100, qty: Number(it.qty || 1), du: it.url ? location.origin + it.url : '', epi: it.variantId || null, empi: it.productId || null, iu: it.image || '' };\n      });\n      var input = addOption('builder', 'builder', 'Your build in the bike builder', items, currency, function (total) {\n        chosenList = { name: 'Bike builder', items: items, total: total, currency: currency, source: 'builder' };\n        urlInput.value = '';\n        fail(2, '');\n      });\n      if (wasPicked) {\n        input.checked = true;\n        input.dispatchEvent(new Event('change'));\n      }\n    }\n    builderBuild();\n\n    // Arriving from the bike builder's \"Save and enter the giveaway\": that\n    // build is already picked on step 2, and the form is in view.\n    if (/[?&]build=builder\\b/.test(location.search)) {\n      var fromBuilder = listOpts.querySelector('[data-dream-opt=\"builder\"] input');\n      if (fromBuilder) { fromBuilder.checked = true; fromBuilder.dispatchEvent(new Event('change')); }\n      // After load, so the browser's own scroll restore and late images\n      // don't move it back.\n      var toForm = function () { var at = root.querySelector('.lux-dream__enter'); if (at) at.scrollIntoView({ block: 'start' }); };\n      if (document.readyState === 'complete') setTimeout(toForm, 50);\n      else window.addEventListener('load', function () { setTimeout(toForm, 50); }, { once: true });\n    }\n\n    // Swym lists as choices. Swym keeps prices in the store's currency (AUD).\n    function loadLists(swat) {\n      swymRef = swat;\n      try {\n        swat.fetchLists({\n          callbackFn: function (lists) { renderLists(swat, lists || []); },\n          errorFn: function () {}\n        });\n      } catch (e) {}\n    }\n    onSwym(loadLists);\n\n    function renderLists(swat, lists) {\n      myLists = lists;\n      var pickedLid = chosenList && chosenList.source === 'wishlist' ? chosenList.lid : null;\n      var pickedLink = urlInput.value;\n      dropOptions('wishlist');\n      lists.forEach(function (l, i) {\n        var items = (l.listcontents || []).filter(function (it) { return !isService(it); });\n        if (!items.length) return;\n        var input = addOption(l.lid, 'wishlist', l.lname || 'Wishlist ' + (i + 1), items, 'AUD', function (total) { pickList(swat, l, items, total); });\n        if (l.lid === pickedLid) {\n          input.checked = true;\n          chosenList = { name: l.lname || '', items: items, total: totalOf(items), currency: 'AUD', source: 'wishlist', lid: l.lid };\n          urlInput.value = pickedLink;\n        }\n      });\n    }\n\n    // Back to this page from the builder or the wishlist (the browser can\n    // restore the page as it was), or the build changed in another tab.\n    window.addEventListener('pageshow', function (e) {\n      if (!e.persisted) return;\n      builderBuild();\n      if (swymRef) loadLists(swymRef);\n    });\n    window.addEventListener('storage', function (e) {\n      if (e.key === 'lux-build-lite-export') builderBuild();\n    });\n\n    // A pasted share link: one of this rider's lists, or a list Swym will\n    // read from here. Leaves chosenList empty when neither works, and ignores\n    // an answer that arrives after the rider has moved on.\n    function readPasted(value) {\n      var link = shareLink(value);\n      var lid = link ? link.lid : '';\n      function current() {\n        var now = shareLink(urlInput.value);\n        return now && now.lid === lid && !chosenList;\n      }\n      function use(list) {\n        var items = (list.listcontents || []).filter(function (it) { return it && !isService(it); });\n        if (items.length) chosenList = { name: list.lname || '', items: items, total: totalOf(items), currency: 'AUD', source: 'paste', lid: lid };\n        else pasteReason = 'empty';\n      }\n      pasteReason = '';\n      var mine = myLists.filter(function (l) { return l.lid === lid; })[0];\n      if (mine) { use(mine); return Promise.resolve(); }\n      var swat = swymRef;\n      var read = swat && (swat.fetchListDetails || swat.fetchListCtx);\n      if (lid && !swat) pasteReason = 'loading';\n      if (!lid || !read) return Promise.resolve();\n      return new Promise(function (resolve) {\n        var settled = false;\n        function settle() { if (!settled) { settled = true; clearTimeout(timer); resolve(); } }\n        var timer = setTimeout(settle, 8000);\n        // fetchListDetails answers { list: { listcontents } }, fetchListCtx a\n        // bare array of items.\n        function done(res) {\n          if (settled) return;\n          try {\n            var list = Array.isArray(res) ? { listcontents: res } : res && res.list ? res.list : res;\n            if (list && Array.isArray(list.listcontents) && current()) use(list);\n          } finally { settle(); }\n        }\n        try { read.call(swat, { lid: lid }, done, settle); } catch (e) { settle(); }\n      });\n    }\n\n    // The share link is only a record: the parts are what the entry needs,\n    // so a link that can't be made is not the rider's problem.\n    function pickList(swat, list, items, total) {\n      var picked = chosenList = { name: list.lname || '', items: items, total: total, currency: 'AUD', source: 'wishlist', lid: list.lid };\n      urlInput.value = '';\n      fail(2, '');\n      function noLink() { if (window.console) console.warn('[dream build] no share link for list', list.lid); }\n      try {\n        swat.generateSharedListURL(list.lid, function (link) {\n          if (chosenList !== picked) return;\n          var url = link && (typeof link === 'string' ? link : (link.url || link.shareUrl || ''));\n          if (url) urlInput.value = url; else noLink();\n        }, noLink);\n      } catch (e) { noLink(); }\n    }\n\n    urlInput.addEventListener('input', function () {\n      // A pasted link replaces a picked build, so the parts we send match it.\n      var picked = form.querySelector('input[name=\"dream_list\"]:checked');\n      pasteReason = '';\n      if (document.activeElement === urlInput) {\n        if (picked) picked.checked = false;\n        chosenList = null;\n      }\n    });\n\n    // The terms open over the form, so a rider in an app's browser (no tabs)\n    // doesn't lose the form. If the page can't be read, the dialog says so\n    // and points to its \"Open in a new tab\" link.\n    var termsLinks = root.querySelectorAll('[data-dream-terms]');\n    var termsDialog = root.querySelector('[data-dream-terms-dialog]');\n    if (termsLinks.length && termsDialog && typeof termsDialog.showModal === 'function') {\n      Array.prototype.forEach.call(termsLinks, function (termsLink) {\n        termsLink.addEventListener('click', function (e) {\n          e.preventDefault();\n          var body = termsDialog.querySelector('[data-dream-terms-body]');\n          termsDialog.showModal();\n          if (body.dataset.loaded) return;\n          body.textContent = 'Loading the terms\\u2026';\n          fetch(termsLink.href, { credentials: 'same-origin' })\n            .then(function (r) { if (!r.ok) throw new Error(r.status); return r.text(); })\n            .then(function (html) {\n              var doc = new DOMParser().parseFromString(html, 'text/html');\n              var main = doc.querySelector('.page-content, main .rte');\n              if (!main) throw new Error('no content');\n              body.innerHTML = main.innerHTML;\n              body.dataset.loaded = '1';\n            })\n            .catch(function () { body.textContent = 'The terms could not load here. Use \"Open in a new tab\" above.'; });\n        });\n      });\n      termsDialog.addEventListener('click', function (e) {\n        if (e.target === termsDialog || e.target.closest('[data-dream-terms-close]')) termsDialog.close();\n      });\n    }\n\n    // The entry goes from the Enter button's click, not a form submit: no\n    // native submit event, which tracking apps listen for.\n    form.addEventListener('submit', function (e) { e.preventDefault(); });\n    submitBtn.addEventListener('click', function () {\n      if (outsideWindow()) return;\n      for (var n = 1; n <= panels.length; n++) {\n        if (!check(n)) { show(n); focusPanel(); return; }\n      }\n\n      var el = form.elements;\n      var build = chosenList; // as picked now: a late Swym answer can't change the entry\n      // Spam trap, named so autofill leaves it alone: bots fill it, people don't.\n      if (el.dream_hp_ref && el.dream_hp_ref.value) { if (window.console) console.warn('[dream build] trap filled'); finish(); return; }\n\n      var email = el.email.value.trim();\n      var phone = smsWanted() ? auMobile(el.phone.value) : '';\n      var answers = {\n        dream_style: radio('dream_style'),\n        dream_experience: radio('dream_experience'),\n        dream_current_bike: el.dream_current_bike.value.trim(),\n        dream_first_upgrade: radio('dream_first_upgrade'),\n        dream_budget: radio('dream_budget'),\n        dream_timing: radio('dream_timing'),\n        dream_missing_parts: el.dream_missing_parts.value.trim(),\n        dream_do_better: radio('dream_do_better'),\n        dream_do_better_note: el.dream_do_better_note.value.trim(),\n        dream_bmx_means: el.dream_bmx_means.value.trim(),\n        dream_country: radio('dream_country'),\n        dream_under_18: radio('dream_age') === MINOR,\n        dream_wishlist_url: el.wishlist_url.value.trim(),\n        dream_sms_opt_in: !!phone,\n        dream_entered_at: new Date().toISOString()\n      };\n      if (answers.dream_under_18) answers.dream_parent_email = el.parent_email.value.trim();\n      if (build) {\n        answers.dream_wishlist_total = Math.round(build.total * 100) / 100;\n        answers.dream_part_count = build.items.length;\n        answers.dream_currency = build.currency || 'AUD';\n        answers.dream_build_source = build.source || 'wishlist';\n      }\n\n      sendStarted();\n      submitBtn.disabled = true;\n      backBtn.disabled = true;\n      submitBtn.textContent = 'Sending...';\n\n      uploadPhoto().then(function (photoUrl) {\n        if (photoUrl) {\n          answers.dream_photo_url = photoUrl;\n          answers.dream_photo_share_ok = !!(el.share_ok && el.share_ok.checked);\n        }\n\n        var eventProps = Object.assign({}, answers, {\n          marketing_opt_in: true,\n          page: location.pathname\n        });\n        if (build) {\n          eventProps.wishlist_name = build.name;\n          if (build.lid) eventProps.wishlist_lid = build.lid;\n          // Klaviyo reports $value in the account currency, AUD.\n          if (answers.dream_currency === 'AUD') eventProps.$value = answers.dream_wishlist_total;\n          eventProps.parts = inBuildOrder(build.items).slice(0, 60).map(function (it) {\n            return { title: it.dt || '', variant: it.vi || '', sku: it.sku || '', slot: it.note || '', price: Number(it.pr || 0), qty: Number(it.qty || 1), url: it.du || '', variant_id: it.epi || null, product_id: it.empi || null, image: thumb(it.iu) };\n          });\n          if (build.items.length > 60) eventProps.parts_truncated = true;\n        }\n\n        var profile = {\n          email: email,\n          first_name: el.first_name.value.trim(),\n          last_name: el.last_name.value.trim(),\n          properties: answers\n        };\n\n        var sends = [post('events', config, {\n          data: {\n            type: 'event',\n            attributes: {\n              properties: eventProps,\n              unique_id: entryId,\n              metric: { data: { type: 'metric', attributes: { name: config.metric || 'Dream Build Entry' } } },\n              profile: { data: { type: 'profile', attributes: profile } }\n            }\n          }\n        })];\n\n        // The entry is the event. The list subscription rides along, and if it\n        // fails the entry still stands (the rider is added later from the\n        // entry), so it never blocks the success message.\n        if (config.listId) {\n          sends.push(subscribe(email).catch(function (err) {\n            if (window.console) console.warn('[dream build] subscription', err);\n          }));\n          // Texts are a separate call, so a rejected number never costs the email sign-up.\n          if (phone) {\n            sends.push(subscribeSms(email, phone).catch(function (err) {\n              if (window.console) console.warn('[dream build] sms subscription', err);\n            }));\n          }\n        }\n        return Promise.all(sends);\n      }).then(function () {\n        try { if (window.klaviyo && window.klaviyo.identify) window.klaviyo.identify({ email: email }); } catch (err) {}\n        track('dream_build_entered', { photo: !!answers.dream_photo_url });\n        trackMeta('Lead', { content_name: 'Dream Build Giveaway' }, true);\n        finish();\n      }).catch(function (err) {\n        if (window.console) console.error('[dream build]', err);\n        submitBtn.disabled = false;\n        backBtn.disabled = false;\n        submitBtn.textContent = 'Enter the giveaway';\n        fail(4, err && err.photo\n          ? (PHOTO_FAIL[err.kind] || PHOTO_FAIL.other)\n          : 'Your entry did not go through. Check your connection and try again. If it keeps happening, email us at help@luxbmx.com.');\n      });\n    });\n\n    function finish() {\n      form.hidden = true;\n      done.hidden = false;\n      done.focus();\n      done.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    }\n\n    show(1);\n  }\n\n  function boot(scope) {\n    (scope || document).querySelectorAll('[data-lux-dream]').forEach(init);\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', function () { boot(); });\n  else boot();\n  document.addEventListener('shopify:section:load', function (e) { boot(e.target); });\n})();\n"],
  "mappings": "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",
  "names": ["done"]
}
