{
  "version": 3,
  "sources": ["/cdn/shop/t/5/assets/kob-ownership-draw-rehearsal.js?kob_build=public_draw_recovery_v1"],
  "sourcesContent": ["/*\n * Pointer-response model adapted from ReactBits DotField at commit\n * 4e0e030193b563be6be33d928f77d0d01cefe237.\n * Copyright (c) 2026 David Haz. MIT + Commons Clause License Condition v1.0.\n * See docs/licenses/react-bits-dot-field-license.txt.\n */\nconst PIXI_MODULE = 'https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/+esm';\nlet IMAGE_URL = 'https://cdn.shopify.com/s/files/1/0629/0489/3621/files/195Q8Modrsm12UcF5eyXIKvxha41VFSKY.jpg?v=1786344241&width=1200';\nlet COLLECTOR_NUMBER = '017';\nlet WINNERS = ['007', COLLECTOR_NUMBER, '026'];\nconst DRAW_PALETTE = [0x8fb9ca, 0xbfcdd0, 0xd7c9b8, 0xe0ddd4];\nconst GLYPH_PALETTE = [0xafc7d0, 0xbccdd1, 0xc9cfca, 0xd3cec4];\nconst SELECTED_PALETTE = [0xfff3c4, 0xf5dfa0, 0xd9b968];\nconst GLYPH_FONT_FAMILY = '\"KoB Inter Tight\", \"Helvetica Neue\", Arial, sans-serif';\nconst GLYPH_FONT_WEIGHT = 350;\nconst DIGIT_MASK_CACHE = new Map();\nconst reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\nconst root = document.querySelector('[data-kob-draw]');\ndocument.documentElement.classList.add('kob-draw-surface');\ndocument.body.classList.add('kob-draw-surface');\nconst drawMode = String(root.dataset.drawMode || 'rehearsal').trim().toLowerCase();\nconst formalMode = drawMode === 'formal';\nconst publicLocalization = formalMode ? window.KoBOwnershipPublicDrawLocalization : null;\nconst publicCopy = publicLocalization?.get?.() || {};\n\nfunction publicText(key, fallback = '', variables = {}) {\n  const value = publicCopy[key] || fallback;\n  return publicLocalization?.interpolate\n    ? publicLocalization.interpolate(value, variables)\n    : String(value).replace(/\\{\\{([a-z_]+)\\}\\}/g, (_, name) => String(variables[name] ?? ''));\n}\n\nconst removeStorefrontChat = () => {\n  const selectors = [\n    '#ShopifyChat',\n    '[id*=\"shopify-chat\" i]',\n    '[class*=\"shopify-chat\" i]',\n    '[data-shopify-chat]',\n    'shopify-chat',\n    'iframe[src*=\"inbox.shopify\" i]',\n    'iframe[title=\"Chat\" i]',\n    'iframe[title*=\"chat with\" i]',\n    '.fixture-chat-proxy',\n  ];\n  document.querySelectorAll(selectors.join(',')).forEach((element) => element.remove());\n};\n\nremoveStorefrontChat();\nnew MutationObserver(removeStorefrontChat).observe(document.documentElement, {\n  childList: true,\n  subtree: true,\n});\nconst stageElement = root.querySelector('[data-stage]');\nconst statusElement = root.querySelector('.kob-draw__status');\nconst phaseElement = root.querySelector('[data-phase]');\nconst titleElement = root.querySelector('[data-title]');\nconst detailElement = root.querySelector('[data-detail]');\nconst verificationElement = root.querySelector('[data-verification]');\nconst verificationChecks = Array.from(root.querySelectorAll('[data-check]'));\nconst soundButton = root.querySelector('[data-action=\"sound\"]');\nconst waitingClockElement = root.querySelector('[data-waiting-clock]');\nconst waitingRemainingElement = root.querySelector('[data-waiting-remaining]');\nconst waitingTimeElement = root.querySelector('[data-waiting-time]');\nconst identityElement = root.querySelector('.kob-draw__identity');\nconst identityNumberElement = root.querySelector('.kob-draw__identity strong');\nconst releaseElement = root.querySelector('.kob-draw__header p:last-child');\nconst infoButton = root.querySelector('[data-action=\"draw-info\"]');\nconst infoPanel = root.querySelector('[data-draw-info]');\nconst infoBackdrop = root.querySelector('[data-draw-info-dismiss].kob-draw__info-backdrop');\nconst infoWaiting = root.querySelector('[data-draw-info-waiting]');\nconst infoResult = root.querySelector('[data-draw-info-result]');\nconst infoStatus = root.querySelector('[data-draw-verified-status]');\nconst infoSummary = root.querySelector('[data-draw-result-summary]');\nconst endpoint = String(root.dataset.endpoint || '').replace(/\\/$/, '');\nconst pageParams = new URLSearchParams(window.location.search);\nconst campaignId = String(pageParams.get('campaign_id') || root.dataset.campaignId || '').trim();\nconst bootstrapEndpoint = String(root.dataset.shopifyBootstrapEndpoint || '/tools/collection-access/allocation-customer').trim();\nif (root.dataset.imageUrl) IMAGE_URL = root.dataset.imageUrl;\nconst eventUrl = String(root.dataset.eventUrl || (\n  formalMode && endpoint && campaignId\n    ? `${endpoint}/public-draw?campaign_id=${encodeURIComponent(campaignId)}`\n    : endpoint && pageParams.get('rehearsal_id') && pageParams.get('viewer_token')\n    ? `${endpoint}/draw-rehearsal?rehearsal_id=${encodeURIComponent(pageParams.get('rehearsal_id'))}&viewer_token=${encodeURIComponent(pageParams.get('viewer_token'))}`\n    : ''\n)).trim();\nconst liveMode = Boolean(eventUrl);\n\nlet runId = 0;\nlet currentMode = 'image';\nlet scene = null;\nlet soundEnabled = false;\nlet audioContext = null;\nlet drawEvent = null;\nlet viewerOverlay = null;\nlet sessionToken = '';\n\nfunction applyPublicCopy(variables = {}) {\n  if (!formalMode) return;\n  root.querySelectorAll('[data-public-copy]').forEach((element) => {\n    const key = element.dataset.publicCopy;\n    element.textContent = publicText(key, element.textContent, variables);\n  });\n  root.querySelectorAll('[data-public-aria-label]').forEach((element) => {\n    element.setAttribute('aria-label', publicText(element.dataset.publicAriaLabel, element.getAttribute('aria-label') || ''));\n  });\n}\n\nfunction setDrawRecord(name, value) {\n  root.querySelectorAll(`[data-draw-record=\"${name}\"]`).forEach((element) => {\n    element.textContent = value ?? '\u2014';\n  });\n}\n\nfunction publicNumberMap(event = drawEvent) {\n  return event?.public_draw?.public_numbers || event?.public_numbers || {};\n}\n\nfunction updateInfoRecord(event = drawEvent) {\n  if (!formalMode || !event) return;\n  const commitment = event.public_draw?.commitment || {};\n  const receipt = event.public_draw?.receipt || null;\n  const manifest = event.public_draw?.manifest || event.manifest || {};\n  const candidateCount = Number(receipt?.candidate_count ?? manifest.audit_codes?.length ?? 0);\n  const drawSlots = Number(receipt?.draw_slots ?? commitment.draw_slots ?? manifest.draw_slots ?? 0);\n  const round = receipt?.drand_round ?? commitment.drand_round;\n  const resultFinalized = event.public_draw?.status === 'result_finalized' && Boolean(receipt);\n  const publicNumbers = publicNumberMap(event);\n  const orderedNumbers = Array.isArray(receipt?.ordered_audit_codes)\n    ? receipt.ordered_audit_codes.map((auditCode) => publicNumbers[auditCode]).filter(Boolean)\n    : [];\n\n  applyPublicCopy({ draw_slots: drawSlots });\n  setDrawRecord('algorithm', commitment.algorithm || receipt?.algorithm || publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('round', round ? Number(round).toLocaleString('en-US') : publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('manifest_hash', commitment.manifest_hash || receipt?.manifest_hash || publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('candidate_count', candidateCount || publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('draw_slots', drawSlots || '0');\n  setDrawRecord('result_manifest_hash', receipt?.manifest_hash || commitment.manifest_hash || publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('result_round', round ? Number(round).toLocaleString('en-US') : publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('randomness', receipt?.randomness || publicText('notPublished', 'Not published yet'));\n  setDrawRecord('signature_status', resultFinalized && receipt?.signature ? publicText('verified', 'Verified') : publicText('pending', 'Pending'));\n  setDrawRecord('result_algorithm', receipt?.algorithm || commitment.algorithm || publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('commitment_hash', event.public_draw?.commitment_hash || receipt?.commitment_hash || publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('receipt_hash', receipt?.receipt_hash || publicText('notAvailable', 'Not available yet'));\n  setDrawRecord('full_order', orderedNumbers.length ? orderedNumbers.join(' \u00B7 ') : publicText('notAvailable', 'Not available yet'));\n  if (infoStatus) infoStatus.textContent = resultFinalized ? publicText('verifiedStatus', 'Public randomness verified') : publicText('pendingStatus', 'Public randomness not published yet');\n  if (infoSummary) infoSummary.textContent = publicText('resultSummary', '', {\n    candidate_count: candidateCount,\n    draw_slots: drawSlots,\n  });\n}\n\nfunction closeInfoPanel({ immediate = false } = {}) {\n  if (!infoPanel || infoPanel.hidden) return;\n  root.classList.remove('is-info-open');\n  infoPanel.classList.remove('is-open');\n  infoBackdrop?.classList.remove('is-open');\n  infoPanel.setAttribute('aria-hidden', 'true');\n  infoButton?.setAttribute('aria-expanded', 'false');\n  const finish = () => {\n    infoPanel.hidden = true;\n    if (infoBackdrop) infoBackdrop.hidden = true;\n  };\n  if (immediate || reducedMotion) finish();\n  else window.setTimeout(finish, 240);\n}\n\nfunction openInfoPanel() {\n  if (!infoPanel) return;\n  infoPanel.hidden = false;\n  if (infoBackdrop) infoBackdrop.hidden = false;\n  infoPanel.setAttribute('aria-hidden', 'false');\n  infoButton?.setAttribute('aria-expanded', 'true');\n  requestAnimationFrame(() => {\n    root.classList.add('is-info-open');\n    infoPanel.classList.add('is-open');\n    infoBackdrop?.classList.add('is-open');\n    infoPanel.querySelector('[data-draw-info-dismiss]')?.focus({ preventScroll: true });\n  });\n}\n\nfunction syncInfoMode(phase) {\n  if (!formalMode || !infoButton) return;\n  const resultMode = phase === 'result';\n  infoButton.textContent = publicText(resultMode ? 'infoResult' : 'infoWaiting', resultMode ? 'Verify this draw' : 'How this draw works');\n  if (infoWaiting) infoWaiting.hidden = resultMode;\n  if (infoResult) infoResult.hidden = !resultMode;\n  if (['transition', 'countdown', 'verification'].includes(phase)) closeInfoPanel();\n}\n\n  applyPublicCopy({ draw_slots: '\u2014' });\nsyncInfoMode('preparing');\n\nfunction applyViewer(viewer) {\n  viewerOverlay = viewer?.display_number ? {\n    display_number: String(viewer.display_number).padStart(3, '0'),\n    selected: viewer.selected === null || viewer.selected === undefined ? null : Boolean(viewer.selected),\n  } : null;\n  COLLECTOR_NUMBER = viewerOverlay?.display_number || '';\n  identityElement.hidden = !viewerOverlay;\n  identityNumberElement.textContent = viewerOverlay?.display_number || '\u2014';\n  root.dataset.viewerState = viewerOverlay ? 'entrant' : 'spectator';\n}\n\nasync function fetchJson(url, options = {}, timeoutMs = 5000) {\n  const controller = new AbortController();\n  const timeout = window.setTimeout(() => controller.abort(), timeoutMs);\n  try {\n    const response = await fetch(url, { ...options, signal: controller.signal, cache: 'no-store' });\n    const body = await response.json().catch(() => ({}));\n    if (!response.ok || body.ok === false) {\n      const error = new Error(body.error || `HTTP_${response.status}`);\n      error.status = response.status;\n      throw error;\n    }\n    return body;\n  } finally {\n    window.clearTimeout(timeout);\n  }\n}\n\nasync function loadViewerOverlay() {\n  if (!formalMode || !endpoint || !campaignId) return null;\n  const requestViewer = () => fetchJson(`${endpoint}/public-draw/me?campaign_id=${encodeURIComponent(campaignId)}`, {\n    credentials: 'include',\n    headers: sessionToken ? { authorization: `Bearer ${sessionToken}` } : {},\n  });\n  try {\n    const response = await requestViewer();\n    applyViewer(response.viewer);\n    return response.viewer;\n  } catch (error) {\n    if (error.status !== 401) return null;\n  }\n  try {\n    const bootstrapUrl = new URL(bootstrapEndpoint, location.origin);\n    bootstrapUrl.searchParams.set('campaign_id', campaignId);\n    bootstrapUrl.searchParams.set('customer_nonce', `KOB_DRAW:${Date.now().toString(36)}:${crypto.getRandomValues(new Uint32Array(2)).join('')}`);\n    const bootstrap = await fetchJson(bootstrapUrl, { credentials: 'include' });\n    if (!bootstrap.assertion) return null;\n    const exchange = await fetchJson(`${endpoint}/auth/shopify/exchange`, {\n      method: 'POST',\n      credentials: 'include',\n      headers: { 'content-type': 'application/json' },\n      body: JSON.stringify({ campaign_id: campaignId, assertion: bootstrap.assertion }),\n    });\n    sessionToken = String(exchange.session_token || '');\n    const response = await requestViewer();\n    applyViewer(response.viewer);\n    return response.viewer;\n  } catch (_) {\n    applyViewer(null);\n    return null;\n  }\n}\n\nasync function loadDrawEvent() {\n  const event = await fetchJson(eventUrl || './demo-event.json', { credentials: 'omit' }, 10000);\n  const receipt = event?.public_draw?.receipt;\n  if ((!formalMode && !event?.demo_only) || !['committed', 'result_finalized'].includes(event.public_draw?.status)\n    || (event.public_draw.status === 'result_finalized' && !Array.isArray(receipt?.winner_audit_codes))) {\n    throw new Error('draw_event_invalid');\n  }\n  drawEvent = event;\n  if (event.viewer?.display_number) applyViewer(event.viewer);\n  const displayReceipt = receipt || (eventUrl.startsWith('mock://') ? event.preview_receipt : null);\n  const publicNumbers = publicNumberMap(event);\n  WINNERS = displayReceipt\n    ? (Array.isArray(displayReceipt.winner_numbers)\n      ? displayReceipt.winner_numbers\n      : displayReceipt.winner_audit_codes.map((auditCode) => publicNumbers[auditCode] || (!formalMode ? auditCode.slice(-3) : '')))\n      .map((number) => String(number || '').trim())\n      .filter(Boolean)\n      .map((number) => number.padStart(3, '0'))\n      .filter((number) => /^\\d{3}$/.test(number))\n    : [];\n  if (viewerOverlay && displayReceipt) {\n    applyViewer({ ...viewerOverlay, selected: WINNERS.includes(viewerOverlay.display_number) });\n  }\n  if (event.release?.image_url) IMAGE_URL = event.release.image_url;\n  const round = receipt?.drand_round || event.public_draw?.commitment?.drand_round;\n  releaseElement.textContent = `${event.release?.code || 'Release'} \u00B7 Quicknet round ${Number(round).toLocaleString('en-US')}`;\n  updateInfoRecord(event);\n  return event;\n}\n\nfunction isPendingFormalDraw(error) {\n  if (!formalMode) return false;\n  const message = String(error?.message || '').trim().toLowerCase();\n  return error?.status === 404\n    || message === 'public_draw_not_found'\n    || message === 'ownership_public_draw_not_found';\n}\n\nasync function waitForDrawEvent() {\n  for (;;) {\n    try {\n      return await loadDrawEvent();\n    } catch (error) {\n      if (!isPendingFormalDraw(error)) throw error;\n      hideWaitingClock();\n      clearVerification();\n      clearSelection();\n      setCopy(\n        'preparing',\n        publicText('preparingEyebrow', 'Public draw'),\n        publicText('preparingTitle', 'Preparing the public draw'),\n        publicText('preparingDetail', 'The waiting room will open here automatically after the draw event is committed.'),\n      );\n      await new Promise((resolve) => window.setTimeout(resolve, 5000));\n    }\n  }\n}\n\nconst clamp = (value, min = 0, max = 1) => Math.max(min, Math.min(max, value));\nconst mix = (from, to, amount) => from + (to - from) * amount;\nconst easeInOutCubic = (value) => value < 0.5\n  ? 4 * value * value * value\n  : 1 - Math.pow(-2 * value + 2, 3) / 2;\n\nconst wait = (milliseconds, token) => new Promise((resolve) => {\n  window.setTimeout(() => resolve(token === runId), milliseconds);\n});\n\nfunction setCopy(phase, eyebrow, title, detail) {\n  root.dataset.phase = phase;\n  phaseElement.textContent = eyebrow;\n  titleElement.textContent = title;\n  detailElement.textContent = detail;\n  syncInfoMode(phase);\n}\n\nfunction formatDuration(milliseconds) {\n  const totalSeconds = Math.max(0, Math.ceil(milliseconds / 1000));\n  const hours = Math.floor(totalSeconds / 3600);\n  const minutes = Math.floor((totalSeconds % 3600) / 60);\n  const seconds = totalSeconds % 60;\n  return [hours, minutes, seconds].map((value) => String(value).padStart(2, '0')).join(':');\n}\n\nfunction showWaitingClock(roundTime, localTime) {\n  if (!waitingClockElement) return;\n  waitingClockElement.hidden = false;\n  waitingTimeElement.textContent = localTime;\n  waitingRemainingElement.textContent = formatDuration(roundTime - Date.now());\n}\n\nfunction updateWaitingClock(roundTime) {\n  if (waitingClockElement?.hidden) return;\n  waitingRemainingElement.textContent = formatDuration(roundTime - Date.now());\n}\n\nfunction hideWaitingClock() {\n  if (waitingClockElement) waitingClockElement.hidden = true;\n}\n\nfunction clearVerification() {\n  verificationElement.hidden = true;\n  verificationChecks.forEach((check) => check.classList.remove('is-active'));\n}\n\nfunction clearSelection() {\n  root.removeAttribute('data-own-result');\n}\n\nfunction getAudioContext() {\n  if (!audioContext) {\n    const AudioContextClass = window.AudioContext || window.webkitAudioContext;\n    if (AudioContextClass) audioContext = new AudioContextClass();\n  }\n  return audioContext;\n}\n\nfunction playTone(frequency, delay, duration, volume, type = 'sine') {\n  if (!soundEnabled) return;\n  const context = getAudioContext();\n  if (!context) return;\n  const start = context.currentTime + delay;\n  const oscillator = context.createOscillator();\n  const gain = context.createGain();\n  oscillator.type = type;\n  oscillator.frequency.setValueAtTime(frequency, start);\n  gain.gain.setValueAtTime(0.0001, start);\n  gain.gain.exponentialRampToValueAtTime(volume, start + 0.018);\n  gain.gain.exponentialRampToValueAtTime(0.0001, start + duration);\n  oscillator.connect(gain).connect(context.destination);\n  oscillator.start(start);\n  oscillator.stop(start + duration + 0.04);\n}\n\nfunction playCountdownSound(value) {\n  if (value > 5) return;\n  playTone(92 + (5 - value) * 9, 0, 0.11, 0.025, 'sine');\n}\n\nfunction playSelectedSound() {\n  playTone(196, 0, 0.7, 0.034, 'sine');\n  playTone(293.66, 0.11, 0.82, 0.026, 'sine');\n  playTone(440, 0.24, 1.05, 0.018, 'sine');\n}\n\nasync function loadImage(source) {\n  const image = new Image();\n  image.crossOrigin = 'anonymous';\n  image.decoding = 'async';\n  image.src = source;\n  await image.decode();\n  return image;\n}\n\nfunction imageTargets(image, width, height, columns, rows) {\n  const sample = document.createElement('canvas');\n  sample.width = columns;\n  sample.height = rows;\n  const context = sample.getContext('2d', { willReadFrequently: true });\n  const sourceRatio = image.naturalWidth / image.naturalHeight;\n  const targetRatio = columns / rows;\n  let sourceX = 0;\n  let sourceY = 0;\n  let sourceWidth = image.naturalWidth;\n  let sourceHeight = image.naturalHeight;\n\n  if (sourceRatio > targetRatio) {\n    sourceWidth = image.naturalHeight * targetRatio;\n    sourceX = (image.naturalWidth - sourceWidth) / 2;\n  } else {\n    sourceHeight = image.naturalWidth / targetRatio;\n    sourceY = (image.naturalHeight - sourceHeight) / 2;\n  }\n\n  context.drawImage(\n    image,\n    sourceX,\n    sourceY,\n    sourceWidth,\n    sourceHeight,\n    0,\n    0,\n    columns,\n    rows,\n  );\n\n  const pixels = context.getImageData(0, 0, columns, rows).data;\n  const mobile = width < 700;\n  const statusBounds = statusElement.getBoundingClientRect();\n  const footerBounds = root.querySelector('.kob-draw__footer').getBoundingClientRect();\n  const preferredBoxWidth = Math.min(width * 0.36, height * 0.72, 720);\n  const availableDesktopHeight = Math.max(180, footerBounds.top - statusBounds.bottom - 52);\n  const boxWidth = mobile\n    ? Math.min(width * 0.9, height * 0.5)\n    : Math.min(preferredBoxWidth, availableDesktopHeight * targetRatio);\n  const boxHeight = boxWidth / targetRatio;\n  const startX = (width - boxWidth) / 2;\n  const startY = mobile\n    ? Math.max(statusBounds.bottom + 20, height * 0.44 - boxHeight / 2)\n    : Math.max(statusBounds.bottom + 28, (height - boxHeight) / 2);\n  const cellWidth = boxWidth / columns;\n  const cellHeight = boxHeight / rows;\n  const targets = [];\n\n  root.dataset.imageLeft = String(Math.round(startX));\n  root.dataset.imageRight = String(Math.round(startX + boxWidth));\n  root.dataset.imageTop = String(Math.round(startY));\n  root.dataset.imageBottom = String(Math.round(startY + boxHeight));\n  root.dataset.imageCenterDelta = String(Math.round(startX + boxWidth / 2 - width / 2));\n\n  for (let row = 0; row < rows; row += 1) {\n    for (let column = 0; column < columns; column += 1) {\n      const pixelIndex = (row * columns + column) * 4;\n      const red = pixels[pixelIndex];\n      const green = pixels[pixelIndex + 1];\n      const blue = pixels[pixelIndex + 2];\n      const saturation = (Math.max(red, green, blue) - Math.min(red, green, blue)) / 255;\n      const luminance = (red * 0.2126 + green * 0.7152 + blue * 0.0722) / 255;\n      const subjectStrength = clamp(saturation * 1.65 + Math.abs(luminance - 0.5) * 0.24);\n      const colourLift = 1.08 + subjectStrength * 0.26;\n      const liftedRed = Math.min(255, Math.round(red * colourLift + subjectStrength * 9));\n      const liftedGreen = Math.min(255, Math.round(green * colourLift + subjectStrength * 9));\n      const liftedBlue = Math.min(255, Math.round(blue * colourLift + subjectStrength * 12));\n      const edgeX = Math.min(\n        (column + 0.5) / (columns * 0.1),\n        (columns - column - 0.5) / (columns * 0.1),\n        1,\n      );\n      const edgeY = Math.min(\n        (row + 0.5) / (rows * 0.12),\n        (rows - row - 0.5) / (rows * 0.12),\n        1,\n      );\n      const edgeFade = easeInOutCubic(clamp(Math.min(edgeX, edgeY)));\n      targets.push({\n        x: startX + (column + 0.5) * cellWidth,\n        y: startY + (row + 0.5) * cellHeight,\n        tint: (liftedRed << 16) | (liftedGreen << 8) | liftedBlue,\n        alpha: Math.min(1, (0.28 + subjectStrength * 0.82) * edgeFade),\n        float: 0,\n        scale: Math.max(0.2, Math.min(cellWidth, cellHeight) / 12 * 0.76),\n        rotation: 0,\n      });\n    }\n  }\n\n  return targets;\n}\n\nfunction resultTextLayout(width, height, lineCount) {\n  const mobile = width < 700;\n  const fontSize = Math.min(\n    width * (mobile ? 0.23 : 0.14),\n    height * (mobile ? 0.6 : 0.76) / Math.max(1, lineCount),\n  );\n  return {\n    fontSize,\n    lineHeight: fontSize * 0.9,\n    centerY: height * (mobile ? 0.62 : 0.535),\n    centerX: width * (mobile ? 0.5 : 0.58),\n  };\n}\n\nfunction canonicalDigitMask(digit, digitWidth, fontSize, pointSpacing) {\n  const roundedWidth = Math.round(digitWidth * 10) / 10;\n  const roundedHeight = Math.round(fontSize * 10) / 10;\n  const cacheKey = `${digit}:${roundedWidth}:${roundedHeight}:${pointSpacing}`;\n  if (DIGIT_MASK_CACHE.has(cacheKey)) return DIGIT_MASK_CACHE.get(cacheKey);\n  const renderScale = 3;\n  const canvas = document.createElement('canvas');\n  canvas.width = Math.max(1, Math.ceil(digitWidth * renderScale));\n  canvas.height = Math.max(1, Math.ceil(fontSize * renderScale));\n  const context = canvas.getContext('2d', { willReadFrequently: true });\n  context.clearRect(0, 0, canvas.width, canvas.height);\n  context.fillStyle = '#fff';\n  context.font = `${GLYPH_FONT_WEIGHT} ${fontSize * renderScale}px ${GLYPH_FONT_FAMILY}`;\n  context.textAlign = 'center';\n  context.textBaseline = 'middle';\n  context.fillText(String(digit), canvas.width / 2, canvas.height * 0.51);\n  const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n  const points = [];\n  const sampleStep = 2;\n  const columns = Math.max(9, Math.round(digitWidth / pointSpacing));\n  const rows = Math.max(14, Math.round(fontSize / pointSpacing));\n  for (let row = 0; row < rows; row += 1) {\n    const top = Math.floor(row * canvas.height / rows);\n    const bottom = Math.min(canvas.height, Math.ceil((row + 1) * canvas.height / rows));\n    for (let column = 0; column < columns; column += 1) {\n      const left = Math.floor(column * canvas.width / columns);\n      const right = Math.min(canvas.width, Math.ceil((column + 1) * canvas.width / columns));\n      let alphaSum = 0;\n      let sampleCount = 0;\n      for (let y = top; y < bottom; y += sampleStep) {\n        for (let x = left; x < right; x += sampleStep) {\n          const alpha = pixels[(y * canvas.width + x) * 4 + 3];\n          alphaSum += alpha;\n          sampleCount += 1;\n        }\n      }\n      const coverage = sampleCount ? alphaSum / (sampleCount * 255) : 0;\n      if (coverage > 0.14) {\n        points.push({\n          x: (column + 0.5) / columns,\n          y: (row + 0.5) / rows,\n          toneIndex: hashString(`kob-digit-tone-${digit}-${row}-${column}`),\n        });\n      }\n    }\n  }\n  DIGIT_MASK_CACHE.set(cacheKey, points);\n  return points;\n}\n\nfunction numericPointCloud(lines, width, height, maxPoints, compact) {\n  const lineItems = Array.isArray(lines) ? lines.map(String) : [String(lines)];\n  const mobile = width < 700;\n  const resultLayout = compact ? resultTextLayout(width, height, lineItems.length) : null;\n  const fontSize = resultLayout?.fontSize\n    ?? Math.min(width * (mobile ? 0.48 : 0.34), height * 0.48);\n  const lineHeight = resultLayout?.lineHeight ?? fontSize * 0.9;\n  const centerY = resultLayout?.centerY ?? height * 0.535;\n  const centerX = resultLayout?.centerX ?? width * 0.5;\n  const digitWidth = fontSize * 0.61;\n  const digitGap = fontSize * 0.055;\n  const pointSpacing = compact\n    ? (mobile ? 4.7 : 5)\n    : (mobile ? 5.1 : 5.6);\n  const points = [];\n\n  lineItems.forEach((line, lineIndex) => {\n    const lineWidth = line.length * digitWidth + Math.max(0, line.length - 1) * digitGap;\n    const startX = centerX - lineWidth / 2;\n    const lineCenterY = centerY - ((lineItems.length - 1) * lineHeight) / 2 + lineIndex * lineHeight;\n    Array.from(line).forEach((digit, digitIndex) => {\n      const digitStartX = startX + digitIndex * (digitWidth + digitGap);\n      canonicalDigitMask(digit, digitWidth, fontSize, pointSpacing).forEach((point) => {\n        points.push({\n          x: digitStartX + point.x * digitWidth,\n          y: lineCenterY - fontSize / 2 + point.y * fontSize,\n          lineIndex,\n          toneIndex: point.toneIndex,\n        });\n      });\n    });\n  });\n\n  if (points.length <= maxPoints) return points;\n  return Array.from({ length: maxPoints }, (_, index) => (\n    points[Math.floor(index * points.length / maxPoints)]\n  ));\n}\n\nfunction textPointCloud(lines, width, height, maxPoints) {\n  const canvas = document.createElement('canvas');\n  const density = Math.min(2, window.devicePixelRatio || 1);\n  canvas.width = Math.round(width * density);\n  canvas.height = Math.round(height * density);\n  const context = canvas.getContext('2d', { willReadFrequently: true });\n  context.clearRect(0, 0, canvas.width, canvas.height);\n  context.fillStyle = '#fff';\n  context.textAlign = 'center';\n  context.textBaseline = 'middle';\n\n  const lineItems = Array.isArray(lines) ? lines : [String(lines)];\n  const compact = lineItems.length > 1;\n  if (lineItems.every((line) => /^\\d+$/.test(String(line)))) {\n    return numericPointCloud(lineItems, width, height, maxPoints, compact);\n  }\n  const mobile = width < 700;\n  const resultLayout = compact ? resultTextLayout(width, height, lineItems.length) : null;\n  const fontSize = resultLayout?.fontSize\n    ?? Math.min(width * (mobile ? 0.48 : 0.34), height * 0.48);\n  const lineHeight = resultLayout?.lineHeight ?? fontSize * 0.9;\n  context.font = `600 ${fontSize * density}px Arial, sans-serif`;\n  const centerY = (resultLayout?.centerY ?? height * 0.535) * density;\n  const centerX = (resultLayout?.centerX ?? width * 0.5) * density;\n  const firstY = centerY - ((lineItems.length - 1) * lineHeight * density) / 2;\n\n  lineItems.forEach((line, index) => {\n    context.fillText(line, centerX, firstY + index * lineHeight * density);\n  });\n\n  const data = context.getImageData(0, 0, canvas.width, canvas.height).data;\n  const rawPoints = [];\n  const pointSpacing = compact\n    ? (mobile ? 5.8 : 6.2)\n    : (mobile ? 5.1 : 5.6);\n  const stride = Math.max(3, Math.round(pointSpacing * density));\n\n  for (let y = 0; y < canvas.height; y += stride) {\n    for (let x = 0; x < canvas.width; x += stride) {\n      if (data[(y * canvas.width + x) * 4 + 3] > 90) {\n        const lineIndex = clamp(\n          Math.round((y - firstY) / (lineHeight * density)),\n          0,\n          lineItems.length - 1,\n        );\n        rawPoints.push({ x: x / density, y: y / density, lineIndex });\n      }\n    }\n  }\n\n  if (!rawPoints.length) {\n    return [{ x: width / 2, y: height / 2 }];\n  }\n\n  if (rawPoints.length <= maxPoints) return rawPoints;\n  return Array.from({ length: maxPoints }, (_, index) => (\n    rawPoints[Math.floor(index * rawPoints.length / maxPoints)]\n  ));\n}\n\nfunction scatterTargets(width, height, pointCount, seedOffset = 0) {\n  const random = seededRandom(hashString(`kob-scatter-${seedOffset}-${pointCount}`));\n  return Array.from({ length: pointCount }, () => {\n    return {\n      x: width * (0.04 + random() * 0.92),\n      y: height * (0.05 + random() * 0.9),\n      rotation: (random() - 0.5) * Math.PI * 2,\n      scale: 0.2 + random() * 0.36,\n    };\n  });\n}\n\nfunction hashString(value) {\n  let hash = 2166136261;\n  for (let index = 0; index < value.length; index += 1) {\n    hash ^= value.charCodeAt(index);\n    hash = Math.imul(hash, 16777619);\n  }\n  return hash >>> 0;\n}\n\nfunction seededRandom(seed) {\n  let state = seed >>> 0;\n  return () => {\n    state += 0x6D2B79F5;\n    let value = state;\n    value = Math.imul(value ^ (value >>> 15), value | 1);\n    value ^= value + Math.imul(value ^ (value >>> 7), value | 61);\n    return ((value ^ (value >>> 14)) >>> 0) / 4294967296;\n  };\n}\n\nfunction scheduleWander(particle, width, height, now, startX, startY) {\n  const random = particle.wanderRandom;\n  const fromX = startX ?? particle.wanderX ?? particle.view.x;\n  const fromY = startY ?? particle.wanderY ?? particle.view.y;\n  const minimumDistance = Math.min(width, height) * 0.22;\n  let targetX = fromX;\n  let targetY = fromY;\n\n  for (let attempt = 0; attempt < 5; attempt += 1) {\n    targetX = width * (0.04 + random() * 0.92);\n    targetY = height * (0.05 + random() * 0.9);\n    if (Math.hypot(targetX - fromX, targetY - fromY) >= minimumDistance) break;\n  }\n\n  particle.wanderStartX = fromX;\n  particle.wanderStartY = fromY;\n  particle.wanderTargetX = targetX;\n  particle.wanderTargetY = targetY;\n  particle.wanderStartTime = now;\n  particle.wanderDuration = 3200 + random() * 2400;\n  particle.wanderX = fromX;\n  particle.wanderY = fromY;\n}\n\nfunction updateWander(particle, width, height, now) {\n  if (!Number.isFinite(particle.wanderStartTime)) {\n    scheduleWander(particle, width, height, now);\n  }\n\n  let progress = (now - particle.wanderStartTime) / particle.wanderDuration;\n  if (progress >= 1) {\n    scheduleWander(\n      particle,\n      width,\n      height,\n      now,\n      particle.wanderTargetX,\n      particle.wanderTargetY,\n    );\n    progress = 0;\n  }\n\n  const eased = easeInOutCubic(clamp(progress));\n  particle.wanderX = mix(particle.wanderStartX, particle.wanderTargetX, eased);\n  particle.wanderY = mix(particle.wanderStartY, particle.wanderTargetY, eased);\n}\n\nfunction shuffledIndices(count, key) {\n  const order = Array.from({ length: count }, (_, index) => index);\n  const random = seededRandom(hashString(`kob-draw-${key}-${count}`));\n  for (let index = order.length - 1; index > 0; index -= 1) {\n    const swapIndex = Math.floor(random() * (index + 1));\n    [order[index], order[swapIndex]] = [order[swapIndex], order[index]];\n  }\n  return order;\n}\n\nfunction paletteTint(index) {\n  return DRAW_PALETTE[hashString(`kob-particle-${index}`) % DRAW_PALETTE.length];\n}\n\nfunction mixTint(from, to, amount) {\n  const fromRed = (from >> 16) & 0xff;\n  const fromGreen = (from >> 8) & 0xff;\n  const fromBlue = from & 0xff;\n  const toRed = (to >> 16) & 0xff;\n  const toGreen = (to >> 8) & 0xff;\n  const toBlue = to & 0xff;\n  return (\n    (Math.round(mix(fromRed, toRed, amount)) << 16)\n    | (Math.round(mix(fromGreen, toGreen, amount)) << 8)\n    | Math.round(mix(fromBlue, toBlue, amount))\n  );\n}\n\nfunction createDotTexture(Texture) {\n  const canvas = document.createElement('canvas');\n  canvas.width = 12;\n  canvas.height = 12;\n  const context = canvas.getContext('2d');\n  context.fillStyle = '#fff';\n  context.beginPath();\n  context.arc(6, 6, 4.7, 0, Math.PI * 2);\n  context.fill();\n  return Texture.from(canvas);\n}\n\nfunction textSceneTargets(lines, width, height, particleCount, options = {}) {\n  const { compact = false, selectedLine = -1 } = options;\n  const background = scatterTargets(width, height, particleCount, 7).map((target, index) => ({\n    ...target,\n    tint: paletteTint(index),\n    alpha: 0.3,\n    float: 1,\n    scale: 0.18 + (index % 5) * 0.025,\n    pulse: 0,\n  }));\n  const points = textPointCloud(lines, width, height, particleCount);\n  const particleOrder = shuffledIndices(particleCount, 'glyph-particles');\n  const pointOrder = shuffledIndices(points.length, compact ? 'result-points' : 'number-points');\n  const dotScale = width < 700 ? 0.4 : 0.46;\n  const glyphScale = compact ? dotScale * 0.82 : dotScale;\n\n  pointOrder.forEach((pointIndex, index) => {\n    const particleIndex = particleOrder[index];\n    const selected = points[pointIndex].lineIndex === selectedLine;\n    const toneIndex = points[pointIndex].toneIndex\n      ?? hashString(`kob-glyph-tone-${pointIndex}`);\n    background[particleIndex] = {\n      x: points[pointIndex].x,\n      y: points[pointIndex].y,\n      rotation: 0,\n      scale: selected ? glyphScale * 1.08 : glyphScale,\n      tint: selected\n        ? SELECTED_PALETTE[toneIndex % SELECTED_PALETTE.length]\n        : GLYPH_PALETTE[toneIndex % GLYPH_PALETTE.length],\n      alpha: selected ? 1 : 0.9,\n      float: 0,\n      pulse: 0,\n      glow: selected,\n    };\n  });\n  return background;\n}\n\nasync function createScene() {\n  const { Application, Container, Sprite, Texture } = await import(PIXI_MODULE);\n  if (document.fonts?.load) {\n    await document.fonts.load(`${GLYPH_FONT_WEIGHT} 100px ${GLYPH_FONT_FAMILY}`);\n  }\n  const image = await loadImage(IMAGE_URL);\n  const app = new Application();\n  await app.init({\n    resizeTo: window,\n    preference: 'webgl',\n    backgroundAlpha: 0,\n    antialias: false,\n    autoDensity: true,\n    resolution: Math.min(1.5, window.devicePixelRatio || 1),\n    powerPreference: 'high-performance',\n  });\n  stageElement.appendChild(app.canvas);\n  root.dataset.stageWidth = String(Math.round(app.screen.width));\n  root.dataset.stageHeight = String(Math.round(app.screen.height));\n\n  const mobile = app.screen.width < 700;\n  const columns = mobile ? 92 : app.screen.width < 1100 ? 124 : 150;\n  const rows = mobile ? 60 : app.screen.width < 1100 ? 71 : 86;\n  const targets = imageTargets(image, app.screen.width, app.screen.height, columns, rows);\n  const dotTexture = createDotTexture(Texture);\n  const container = new Container();\n  const particles = targets.map((target, index) => {\n    const particle = new Sprite(dotTexture);\n    particle.anchor.set(0.5);\n    particle.position.set(app.screen.width / 2, app.screen.height / 2);\n    particle.scale.set(0.05);\n    particle.rotation = 0;\n    particle.tint = target.tint;\n    particle.alpha = 0;\n    container.addChild(particle);\n    return {\n      view: particle,\n      tint: target.tint,\n      alpha: 0,\n      x: particle.x,\n      y: particle.y,\n      scale: 0.05,\n      rotation: 0,\n      startX: particle.x,\n      startY: particle.y,\n      startScale: 0.05,\n      startRotation: 0,\n      startTint: target.tint,\n      startAlpha: 0,\n      startFloat: 0,\n      startPulse: 0,\n      targetX: target.x,\n      targetY: target.y,\n      targetScale: target.scale,\n      targetRotation: 0,\n      targetTint: target.tint,\n      targetAlpha: 1,\n      targetFloat: 0,\n      targetPulse: 0,\n      float: 0,\n      pulse: 0,\n      wanderRandom: seededRandom(hashString(`kob-wander-${index}`)),\n      wanderStartTime: Number.NaN,\n      wanderDuration: 0,\n      wanderX: particle.x,\n      wanderY: particle.y,\n      interactionX: 0,\n      interactionY: 0,\n      settled: false,\n      delay: (index % 29) / 29,\n    };\n  });\n  root.dataset.particleCount = String(particles.length);\n\n  app.stage.addChild(container);\n  const state = {\n    app,\n    image,\n    container,\n    particles,\n    columns,\n    rows,\n    dotTexture,\n    transitionStart: performance.now(),\n    transitionDuration: 1700,\n    transitionSpread: 500,\n    transitionMode: 'image',\n    pointer: {\n      x: -9999,\n      y: -9999,\n      previousX: -9999,\n      previousY: -9999,\n      speed: 0,\n      engagement: 0,\n      inside: false,\n      lastRippleAt: 0,\n      lastRippleX: -9999,\n      lastRippleY: -9999,\n    },\n    ripples: [],\n    fpsFrames: 0,\n    fpsStartedAt: performance.now(),\n  };\n\n  let resizeTimer = 0;\n  window.addEventListener('resize', () => {\n    window.clearTimeout(resizeTimer);\n    resizeTimer = window.setTimeout(() => {\n      root.dataset.stageWidth = String(Math.round(app.screen.width));\n      root.dataset.stageHeight = String(Math.round(app.screen.height));\n      setMode(currentMode, 1, true);\n    }, 140);\n  }, { passive: true });\n\n  app.ticker.add(() => {\n    const now = performance.now();\n    state.fpsFrames += 1;\n    if (now - state.fpsStartedAt >= 1000) {\n      root.dataset.renderFps = (state.fpsFrames * 1000 / (now - state.fpsStartedAt)).toFixed(1);\n      state.fpsFrames = 0;\n      state.fpsStartedAt = now;\n    }\n    const pointer = state.pointer;\n    pointer.speed *= 0.86;\n    const targetEngagement = state.transitionMode === 'image' && pointer.inside && !reducedMotion\n      ? Math.max(0.16, Math.min(pointer.speed / 7, 1))\n      : 0;\n    pointer.engagement += (targetEngagement - pointer.engagement) * 0.08;\n    if (pointer.engagement < 0.001) pointer.engagement = 0;\n    state.ripples = state.ripples.filter((ripple) => now - ripple.startedAt < ripple.duration);\n    root.dataset.activeRipples = String(state.ripples.length);\n    const interactionActive = state.transitionMode === 'image'\n      && !reducedMotion\n      && (pointer.engagement > 0.001 || state.ripples.length > 0);\n    state.container.x = state.transitionMode === 'image' ? Math.sin(now * 0.00015) * 1.4 : 0;\n    state.container.y = state.transitionMode === 'image' ? Math.cos(now * 0.00018) * 0.9 : 0;\n    state.particles.forEach((particle, index) => {\n      const delayedStart = state.transitionStart + particle.delay * state.transitionSpread;\n      const progress = clamp((now - delayedStart) / state.transitionDuration);\n      const transitioning = progress < 1;\n      const needsSettleUpdate = transitioning || !particle.settled;\n      if (transitioning) {\n        const eased = easeInOutCubic(progress);\n        particle.x = mix(particle.startX, particle.targetX, eased);\n        particle.y = mix(particle.startY, particle.targetY, eased);\n        particle.scale = mix(particle.startScale, particle.targetScale, eased);\n        particle.rotation = mix(particle.startRotation, particle.targetRotation, eased);\n        particle.tint = mixTint(particle.startTint, particle.targetTint, eased);\n        particle.alpha = mix(particle.startAlpha, particle.targetAlpha, eased);\n        particle.float = mix(particle.startFloat, particle.targetFloat, eased);\n        particle.pulse = mix(particle.startPulse, particle.targetPulse, eased);\n      } else if (!particle.settled) {\n        particle.x = particle.targetX;\n        particle.y = particle.targetY;\n        particle.scale = particle.targetScale;\n        particle.rotation = particle.targetRotation;\n        particle.tint = particle.targetTint;\n        particle.alpha = particle.targetAlpha;\n        particle.float = particle.targetFloat;\n        particle.pulse = particle.targetPulse;\n        particle.settled = true;\n      }\n\n      const breathing = state.transitionMode === 'verification'\n        ? Math.sin(now * 0.0012 + index * 0.047) * 1.4\n        : 0;\n      if (particle.float > 0.001 || particle.targetFloat > 0) {\n        updateWander(particle, state.app.screen.width, state.app.screen.height, now);\n      }\n      let interactionTargetX = 0;\n      let interactionTargetY = 0;\n      if (interactionActive) {\n        const pointerDx = particle.x - pointer.x;\n        const pointerDy = particle.y - pointer.y;\n        const cursorRadius = mobile ? 72 : 108;\n        const pointerDistanceSquared = pointerDx * pointerDx + pointerDy * pointerDy;\n        if (pointerDistanceSquared < cursorRadius * cursorRadius && pointer.engagement > 0) {\n          const pointerDistance = Math.sqrt(pointerDistanceSquared) || 1;\n          const proximity = 1 - pointerDistance / cursorRadius;\n          const push = proximity * proximity * (mobile ? 4.5 : 7.5) * pointer.engagement;\n          interactionTargetX += pointerDx / pointerDistance * push;\n          interactionTargetY += pointerDy / pointerDistance * push;\n        }\n        state.ripples.forEach((ripple) => {\n          const elapsed = now - ripple.startedAt;\n          const rippleProgress = clamp(elapsed / ripple.duration);\n          const dx = particle.x - ripple.x;\n          const dy = particle.y - ripple.y;\n          const distanceSquared = dx * dx + dy * dy;\n          const radius = rippleProgress * ripple.radius;\n          const ringWidth = mobile ? 13 : 18;\n          const minimumDistance = Math.max(0, radius - ringWidth * 3);\n          const maximumDistance = radius + ringWidth * 3;\n          if (distanceSquared < minimumDistance * minimumDistance\n            || distanceSquared > maximumDistance * maximumDistance) return;\n          const distance = Math.sqrt(distanceSquared) || 1;\n          const ringDistance = distance - radius;\n          const band = Math.exp(-(ringDistance * ringDistance) / (2 * ringWidth * ringWidth));\n          const push = band * ripple.amplitude * Math.pow(1 - rippleProgress, 1.4);\n          interactionTargetX += dx / distance * push;\n          interactionTargetY += dy / distance * push;\n        });\n      }\n      particle.interactionX += (interactionTargetX - particle.interactionX) * 0.24;\n      particle.interactionY += (interactionTargetY - particle.interactionY) * 0.24;\n      const hasInteractionOffset = Math.abs(particle.interactionX) > 0.01 || Math.abs(particle.interactionY) > 0.01;\n      if (needsSettleUpdate || particle.float > 0.001 || hasInteractionOffset) {\n        particle.view.x = mix(particle.x, particle.wanderX, particle.float) + particle.interactionX;\n        particle.view.y = mix(particle.y, particle.wanderY, particle.float) + breathing + particle.interactionY;\n      }\n      const pulseWave = particle.pulse > 0\n        ? 0.5 + 0.5 * Math.sin(now * 0.0042 + index * 0.17)\n        : 0;\n      if (needsSettleUpdate || particle.pulse > 0) {\n        particle.view.scale.set(particle.scale * (1 + particle.pulse * pulseWave * 0.12));\n        particle.view.rotation = particle.rotation;\n        particle.view.tint = particle.tint;\n        particle.view.alpha = particle.alpha\n          * (1 - particle.pulse * 0.12 + particle.pulse * pulseWave * 0.12);\n      }\n    });\n  });\n\n  const positionFromEvent = (event) => {\n    const bounds = root.getBoundingClientRect();\n    return {\n      x: event.clientX - bounds.left,\n      y: event.clientY - bounds.top,\n    };\n  };\n  const addRipple = (x, y, amplitude = mobile ? 6 : 9) => {\n    if (reducedMotion || state.transitionMode !== 'image') return;\n    state.ripples.push({\n      x,\n      y,\n      amplitude,\n      radius: mobile ? 110 : 175,\n      duration: mobile ? 1050 : 1350,\n      startedAt: performance.now(),\n    });\n    if (state.ripples.length > 3) state.ripples.shift();\n  };\n  const onPointerEnter = (event) => {\n    if (event.pointerType === 'touch') return;\n    const point = positionFromEvent(event);\n    Object.assign(state.pointer, {\n      x: point.x,\n      y: point.y,\n      previousX: point.x,\n      previousY: point.y,\n      inside: true,\n    });\n    addRipple(point.x, point.y, mobile ? 5 : 7);\n  };\n  const onPointerMove = (event) => {\n    if (event.pointerType === 'touch') return;\n    const point = positionFromEvent(event);\n    const pointerState = state.pointer;\n    const distance = Math.hypot(point.x - pointerState.previousX, point.y - pointerState.previousY);\n    pointerState.speed += (distance - pointerState.speed) * 0.5;\n    pointerState.x = point.x;\n    pointerState.y = point.y;\n    pointerState.previousX = point.x;\n    pointerState.previousY = point.y;\n    pointerState.inside = true;\n    const now = performance.now();\n    const rippleDistance = Math.hypot(point.x - pointerState.lastRippleX, point.y - pointerState.lastRippleY);\n    if (now - pointerState.lastRippleAt > 220 && rippleDistance > 24) {\n      addRipple(point.x, point.y, Math.min(mobile ? 7 : 11, 5 + pointerState.speed * 0.25));\n      pointerState.lastRippleAt = now;\n      pointerState.lastRippleX = point.x;\n      pointerState.lastRippleY = point.y;\n    }\n  };\n  const onPointerLeave = () => {\n    state.pointer.inside = false;\n  };\n  const onPointerDown = (event) => {\n    if (event.pointerType !== 'touch') return;\n    const point = positionFromEvent(event);\n    addRipple(point.x, point.y, 6);\n  };\n  root.addEventListener('pointerenter', onPointerEnter, { passive: true });\n  root.addEventListener('pointermove', onPointerMove, { passive: true });\n  root.addEventListener('pointerleave', onPointerLeave, { passive: true });\n  root.addEventListener('pointerdown', onPointerDown, { passive: true });\n\n  const resize = () => {\n    const now = performance.now();\n    scene.particles.forEach((particle) => {\n      if (particle.float > 0.001 || particle.targetFloat > 0) {\n        scheduleWander(\n          particle,\n          scene.app.screen.width,\n          scene.app.screen.height,\n          now,\n          particle.view.x,\n          particle.view.y,\n        );\n      }\n    });\n    setMode(currentMode, 320, true);\n  };\n  window.addEventListener('resize', resize, { passive: true });\n  return state;\n}\n\nfunction applyTargets(targets, duration = 900, spread = 220, mode = currentMode) {\n  if (!scene) return;\n  scene.transitionStart = performance.now();\n  scene.transitionDuration = duration;\n  scene.transitionSpread = spread;\n  scene.transitionMode = mode;\n  scene.particles.forEach((particle, index) => {\n    const target = targets[index];\n    const nextFloat = target.float ?? 0;\n    const wasWandering = particle.float > 0.001 || particle.targetFloat > 0;\n    if (nextFloat > 0 && !wasWandering) {\n      scheduleWander(\n        particle,\n        scene.app.screen.width,\n        scene.app.screen.height,\n        performance.now(),\n        particle.view.x,\n        particle.view.y,\n      );\n    }\n    particle.startX = particle.x;\n    particle.startY = particle.y;\n    particle.startScale = particle.scale;\n    particle.startRotation = particle.rotation;\n    particle.startTint = particle.tint;\n    particle.startAlpha = particle.alpha;\n    particle.startFloat = particle.float;\n    particle.startPulse = particle.pulse;\n    particle.targetX = target.x;\n    particle.targetY = target.y;\n    particle.targetScale = target.scale ?? (mode === 'image' ? particle.targetScale : 0.48);\n    particle.targetRotation = target.rotation ?? 0;\n    particle.targetTint = target.tint ?? particle.tint;\n    particle.targetAlpha = target.alpha ?? 1;\n    particle.targetFloat = nextFloat;\n    particle.targetPulse = target.pulse ?? 0;\n    particle.settled = false;\n    particle.view.blendMode = target.glow ? 'add' : 'normal';\n  });\n}\n\nfunction setMode(mode, duration = 900, immediate = false) {\n  if (!scene) return;\n  currentMode = mode;\n  const { width, height } = scene.app.screen;\n  let targets;\n  if (mode === 'image') {\n    scene.particles.forEach((particle) => { particle.view.texture = scene.dotTexture; });\n    targets = imageTargets(scene.image, width, height, scene.columns, scene.rows);\n  } else if (mode === 'scatter' || mode === 'verification') {\n    scene.particles.forEach((particle) => { particle.view.texture = scene.dotTexture; });\n    targets = scatterTargets(width, height, scene.particles.length, mode === 'verification' ? 2 : 1).map((target, index) => ({\n      ...target,\n      tint: paletteTint(index),\n      alpha: mode === 'verification' ? 0.1 : 0.18,\n      float: 1,\n      scale: target.scale * 0.76,\n    }));\n  } else if (mode.startsWith('number:')) {\n    scene.particles.forEach((particle) => { particle.view.texture = scene.dotTexture; });\n    targets = textSceneTargets(mode.slice(7), width, height, scene.particles.length);\n  } else if (mode === 'result') {\n    scene.particles.forEach((particle) => { particle.view.texture = scene.dotTexture; });\n    targets = textSceneTargets(WINNERS, width, height, scene.particles.length, {\n      compact: true,\n      selectedLine: WINNERS.indexOf(COLLECTOR_NUMBER),\n    });\n  }\n  applyTargets(targets, immediate ? 1 : duration, immediate ? 0 : Math.min(360, duration * 0.32), mode);\n}\n\nasync function runCountdown(token, startValue = 10) {\n  clearVerification();\n  clearSelection();\n  hideWaitingClock();\n  setCopy(\n    'countdown',\n    publicText('countdownEyebrow', 'Public draw begins'),\n    publicText('countdownTitle', 'Final ten seconds'),\n    publicText('countdownDetail', 'The same image particles now form the countdown.'),\n  );\n  for (let value = startValue; value >= 0; value -= 1) {\n    if (token !== runId) return;\n    setMode(`number:${value}`, value === 10 ? 780 : 520);\n    playCountdownSound(value);\n    const active = await wait(1000, token);\n    if (!active) return;\n  }\n  await runVerification(token);\n}\n\nasync function runVerification(token) {\n  if (token !== runId) return;\n  currentMode = 'verification';\n  hideWaitingClock();\n  setMode('verification', 720);\n  setCopy(\n    'verification',\n    publicText('verificationEyebrow', 'drand checkpoint'),\n    publicText('verificationTitle', 'Verifying the public signal'),\n    publicText('verificationDetail', 'The result is not shown until the public randomness and frozen participant list are verified.'),\n  );\n  verificationElement.hidden = false;\n  for (const check of verificationChecks) {\n    const active = await wait(430, token);\n    if (!active) return;\n    check.classList.add('is-active');\n  }\n  const active = await wait(520, token);\n  if (!active) return;\n  showResult(token);\n}\n\nasync function showResult(token = ++runId) {\n  if (token !== runId) return;\n  clearVerification();\n  clearSelection();\n  hideWaitingClock();\n  const ownSelected = Boolean(viewerOverlay?.selected);\n  const hasPersonalNumber = Boolean(viewerOverlay?.display_number);\n  const selectedIndex = WINNERS.indexOf(COLLECTOR_NUMBER);\n  if (ownSelected && selectedIndex >= 0 && scene) {\n    const { width, height } = scene.app.screen;\n    const { lineHeight, centerY, centerX } = resultTextLayout(width, height, WINNERS.length);\n    const selectedY = centerY - ((WINNERS.length - 1) * lineHeight) / 2 + selectedIndex * lineHeight;\n    root.style.setProperty('--kob-selected-glow-y', `${selectedY}px`);\n    root.style.setProperty('--kob-selected-glow-x', `${centerX}px`);\n  } else {\n    root.style.removeProperty('--kob-selected-glow-y');\n    root.style.removeProperty('--kob-selected-glow-x');\n  }\n  setCopy(\n    'result',\n    publicText('resultEyebrow', 'Draw complete \u00B7 Display order is not a ranking'),\n    publicText('resultTitle', 'Selected draw numbers'),\n    ownSelected\n      ? publicText('resultSelected', 'Your draw number is highlighted in pale gold.')\n      : hasPersonalNumber\n        ? (formalMode\n          ? publicText('resultNotSelected', 'Your draw number was not selected this time.')\n          : 'Your draw number was not selected in this rehearsal.')\n        : publicText('resultSpectator', 'The selected anonymous draw numbers are shown in their fixed display order.'),\n  );\n  setMode('result', 1600);\n  const active = await wait(1450, token);\n  if (!active) return;\n  if (ownSelected) {\n    root.dataset.ownResult = 'selected';\n    playSelectedSound();\n  } else {\n    root.dataset.ownResult = 'not-selected';\n  }\n}\n\nasync function refreshFinalizedEvent(token) {\n  const startedAt = Date.now();\n  while (token === runId) {\n    const event = await loadDrawEvent();\n    if (event.public_draw.status === 'result_finalized') return event;\n    const delayed = Date.now() - startedAt >= 15_000;\n    setCopy(\n      'verification',\n      publicText('verificationEyebrow', 'drand checkpoint'),\n      delayed\n        ? publicText('verificationDelayedTitle', 'Still verifying the same round')\n        : publicText('verificationWaitingTitle', 'Waiting for the public signal'),\n      delayed\n        ? publicText('verificationDelayedDetail', 'This is taking longer than usual. The page will keep retrying the committed round automatically\u2014there is no redraw.')\n        : publicText('verificationWaitingDetail', 'The committed Quicknet round is being verified. The system will not move to another round.'),\n    );\n    if (!await wait(1200, token)) return null;\n  }\n  return null;\n}\n\nasync function runScheduledRehearsal() {\n  const token = ++runId;\n  clearVerification();\n  clearSelection();\n  const roundTime = Date.parse(drawEvent?.public_draw?.commitment?.round_time || '');\n  if (!Number.isFinite(roundTime)) throw new Error('draw_round_time_invalid');\n  if (drawEvent.public_draw.status === 'result_finalized') {\n    showResult(token);\n    return;\n  }\n  const localTime = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'medium' }).format(new Date(roundTime));\n  setCopy(\n    'image',\n    formalMode ? publicText('waitingEyebrow', 'Public draw \u00B7 Waiting room') : 'Draw rehearsal \u00B7 Waiting room',\n    drawEvent.release?.title || (formalMode ? 'Kind of Blu public draw' : 'Public draw rehearsal'),\n    hasPersonalNumberCopy(publicText('waitingSpectator', 'The anonymous participant list and committed public-randomness round are already fixed.')),\n  );\n  setMode('image', 1, true);\n  showWaitingClock(roundTime, localTime);\n\n  while (token === runId && roundTime - Date.now() > 64_000) {\n    updateWaitingClock(roundTime);\n    if (!await wait(250, token)) return;\n  }\n  if (token !== runId) return;\n  hideWaitingClock();\n  setCopy(\n    'transition',\n    publicText('transitionEyebrow', 'T\u221264 seconds \u00B7 Pixel release'),\n    publicText('transitionTitle', 'The photograph lets go'),\n    publicText('transitionDetail', 'The same particles now prepare the public countdown.'),\n  );\n  setMode('scatter', 1500);\n  while (token === runId && roundTime - Date.now() > 60_000) {\n    if (!await wait(100, token)) return;\n  }\n\n  let shown = null;\n  setCopy(\n    'countdown',\n    publicText('countdownEyebrow', 'Public draw begins'),\n    publicText('countdownTitle', 'Final sixty seconds'),\n    publicText('countdownDetail', 'The committed Quicknet round is approaching.'),\n  );\n  while (token === runId && Date.now() < roundTime) {\n    const remaining = Math.max(0, Math.ceil((roundTime - Date.now()) / 1000));\n    if (remaining !== shown) {\n      shown = remaining;\n      setMode(`number:${remaining}`, remaining === 60 ? 780 : 620);\n      playCountdownSound(remaining);\n    }\n    if (!await wait(80, token)) return;\n  }\n  if (token !== runId) return;\n  setMode('number:0', 360);\n  playCountdownSound(0);\n  const finalized = await refreshFinalizedEvent(token);\n  if (!finalized || token !== runId) return;\n  await runVerification(token);\n}\n\nfunction hasPersonalNumberCopy(spectatorCopy) {\n  return viewerOverlay?.display_number\n    ? publicText('waitingPersonal', 'Your draw number and the committed public-randomness round are already fixed.')\n    : spectatorCopy;\n}\n\nasync function replay() {\n  const token = ++runId;\n  clearVerification();\n  clearSelection();\n  hideWaitingClock();\n  setCopy('image', 'One continuous renderer', 'From the model to the draw', 'The same PixiJS particle objects remain on screen through every state.');\n  setMode('image', 1400);\n  if (!await wait(3000, token)) return;\n  setCopy('transition', 'T\u221212 seconds \u00B7 Pixel release', 'The photograph lets go', 'Image-coloured particles detach before gathering into the countdown.');\n  setMode('scatter', 1500);\n  if (!await wait(1750, token)) return;\n  runCountdown(token);\n}\n\nroot.querySelector('[data-action=\"replay\"]')?.addEventListener('click', replay);\nroot.querySelector('[data-action=\"countdown\"]')?.addEventListener('click', () => {\n  const token = ++runId;\n  runCountdown(token);\n});\nroot.querySelector('[data-action=\"result\"]')?.addEventListener('click', () => {\n  const token = ++runId;\n  showResult(token);\n});\ninfoButton?.addEventListener('click', () => {\n  if (infoPanel?.hidden) openInfoPanel();\n  else closeInfoPanel();\n});\nroot.querySelectorAll('[data-draw-info-dismiss]').forEach((button) => {\n  button.addEventListener('click', () => closeInfoPanel());\n});\ndocument.addEventListener('keydown', (event) => {\n  if (event.key === 'Escape' && infoPanel && !infoPanel.hidden) {\n    closeInfoPanel();\n    infoButton?.focus({ preventScroll: true });\n  }\n});\nsoundButton?.addEventListener('click', async () => {\n  soundEnabled = !soundEnabled;\n  soundButton.setAttribute('aria-pressed', String(soundEnabled));\n  soundButton.textContent = soundEnabled\n    ? publicText('soundOn', 'Sound on')\n    : publicText('soundOff', 'Sound off');\n  if (soundEnabled) {\n    const context = getAudioContext();\n    if (context?.state === 'suspended') await context.resume();\n    playTone(220, 0, 0.18, 0.02, 'sine');\n  }\n});\n\ntry {\n  const viewerOverlayPromise = formalMode\n    ? loadViewerOverlay().catch(() => null)\n    : Promise.resolve(null);\n  await waitForDrawEvent();\n  if (document.fonts?.ready) await document.fonts.ready;\n  scene = await createScene();\n  if (liveMode) runScheduledRehearsal();\n  else replay();\n  if (formalMode) {\n    void viewerOverlayPromise.then(() => {\n      if (drawEvent?.public_draw?.status === 'result_finalized' && scene) {\n        showResult(++runId);\n      }\n    });\n  }\n} catch (error) {\n  console.error(error);\n  setCopy(\n    'error',\n    publicText('errorEyebrow', 'Renderer unavailable'),\n    publicText('errorTitle', 'The particle study could not start'),\n    publicText('errorDetail', 'Check the network connection and WebGL support, then reload this page.'),\n  );\n}\n"],
  "mappings": "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",
  "names": []
}
