{
  "version": 3,
  "sources": ["rally-play.jsx"],
  "sourcesContent": ["/* FACT Rallye: Teilnehmer-Ansicht (Root-Komponente RallyPlay)\n * Spec: 06_Planung/specs/2026-10-17-rallye-organizer-design.md, Abschnitt 6.2\n *\n * Ablauf: Beitreten -> Warten (Lobby) -> Unterwegs (Station suchen, Frage, Ergebnis)\n *         -> Zum Ziel -> Warten auf die anderen -> Finale -> Ergebnis.\n *\n * Globaler Babel-Scope: alle Top-Level-Namen beginnen mit RallyPlay / rallyPlay / RAL_PLAY_.\n * Bausteine aus rally-ui.jsx, Logik aus rally-engine.js, Daten aus rally-store.js.\n * Overlays (Sheet, Confirm, Toast) sind position:absolute im eigenen Root.\n *\n * Aktive Teilnahme: localStorage 'fact_rally_active:<deviceId>' = { eventId, code, playerId, deviceId }.\n * Der Suffix trennt Test-Geraete (?rallydevice=NAME), die sich einen Browser teilen.\n */\n\nconst RAL_PLAY_ACTIVE_KEY = 'fact_rally_active';\nconst RAL_PLAY_POS_MS = 20000;          // Positionsmeldung hoechstens alle 20 s (Spec R6)\nconst RAL_PLAY_GPS_GRACE_MS = 20000;    // so lange auf GPS warten, bevor der Ehrlich-Knopf kommt\nconst RAL_PLAY_ACC_BONUS_MAX = 40;      // GPS-Ungenauigkeit bis zu 40 m grosszuegig anrechnen\n\n// ── Helfer ────────────────────────────────────────────────────────────────────\nfunction rallyPlayDeviceId() {\n  try { return window.RallyStore ? window.RallyStore.me().deviceId : ''; } catch (e) { return ''; }\n}\nfunction rallyPlayActiveKey() {\n  const dev = rallyPlayDeviceId();\n  return dev ? RAL_PLAY_ACTIVE_KEY + ':' + dev : RAL_PLAY_ACTIVE_KEY;\n}\nfunction rallyPlayReadActive() {\n  try {\n    const v = JSON.parse(localStorage.getItem(rallyPlayActiveKey()) || 'null');\n    return v && v.eventId && v.playerId ? v : null;\n  } catch (e) { return null; }\n}\nfunction rallyPlayWriteActive(v) {\n  try {\n    if (v) localStorage.setItem(rallyPlayActiveKey(), JSON.stringify({ ...v, at: v.at || Date.now() }));\n    else localStorage.removeItem(rallyPlayActiveKey());\n  } catch (e) {}\n}\n// Organisatorin spielt mit (organizerMode 'player'): mit eigenem Namen beitreten und die Teilnahme\n// merken. Danach z. B. onStarted(code) aufrufen bzw. die Spielansicht öffnen. Gibt den Code zurück.\nasync function rallyPlayJoinSelf(event, name) {\n  const S = window.RallyStore;\n  const nm = String(name || rallyPlayReadName() || '').trim().slice(0, 24);\n  if (!S || !event || !event.code) throw Object.assign(new Error('invalid_input'), { code: 'invalid_input' });\n  const r = await S.joinEvent(event.code, { name: nm });\n  if (nm) rallyPlaySaveName(nm);\n  rallyPlayWriteActive({ eventId: r.event.id, code: r.event.code, playerId: r.player.id, deviceId: rallyPlayDeviceId() });\n  return r.event.code;\n}\nwindow.rallyPlayJoinSelf = rallyPlayJoinSelf;\n// Spielername merken (Beitreten + Schnellstart füllen ihn vor)\nconst RAL_PLAY_NAME_KEY = 'fact_rally_name';\nfunction rallyPlayReadName() {\n  try { return String(localStorage.getItem(RAL_PLAY_NAME_KEY) || '').slice(0, 24); } catch (e) { return ''; }\n}\nfunction rallyPlaySaveName(n) {\n  try { const v = String(n || '').trim().slice(0, 24); if (v) localStorage.setItem(RAL_PLAY_NAME_KEY, v); } catch (e) {}\n}\nfunction rallyPlayInitialName(user) {\n  return rallyPlayReadName() || ((user && user.name) ? String(user.name).slice(0, 24) : '');\n}\n// Platzhalter in Strings ersetzen: rallyPlayT('key', lang, { n: 3 })\nfunction rallyPlayT(key, lang, vars) {\n  let s = t(key, lang);\n  if (vars) Object.keys(vars).forEach(k => { s = s.split('{' + k + '}').join(String(vars[k])); });\n  return s;\n}\nfunction rallyPlayHasEst(event) {\n  const E = window.RallyEngine;\n  if (E && typeof E.hasEstimates === 'function') return !!E.hasEstimates(event);\n  return ((event && event.tour && event.tour.stations) || []).some(s => s && s.puzzle && s.puzzle.type === 'estimate');\n}\nfunction rallyPlayCanRetryType(puzzle) {\n  return !!puzzle && (puzzle.type === 'mcq' || puzzle.type === 'text' || puzzle.type === 'number');\n}\nfunction rallyPlayCheck(puzzle, value, lang) {\n  return RallyEngine.checkAnswer(puzzle, value, lang);\n}\nfunction rallyPlayPointsOf(puzzle, answer, lang) {\n  if (!puzzle || !answer) return 0;\n  return RallyEngine.pointsFor(puzzle, answer.value, answer.hintsUsed, answer.attempt || 1, lang);\n}\nfunction rallyPlayCoinsFor(points) {\n  const E = window.RallyEngine;\n  if (E && typeof E.coinsFor === 'function') return Math.max(0, E.coinsFor(points) || 0);\n  return Math.max(0, Math.round((Number(points) || 0) / 10));\n}\n// Grobe Erkennung deutscher Inhalte (für den Hinweis in der englischen Oberfläche)\nconst RAL_PLAY_DE_WORDS = new RegExp('(^|[\\\\s,.;:!?\\\\u0022\\\\u201E(])(' + [\n  'der', 'die', 'das', 'und', 'nicht', 'ist', 'wie', 'welche', 'welcher', 'welches', 'wann', 'wo', 'wer', 'warum',\n  'mit', 'auf', 'ein', 'eine', 'einen', 'einem', 'einer', 'im', 'vom', 'zum', 'zur', 'des', 'dem',\n].join('|') + ')(?=[\\\\s,.;:!?\\\\u0022\\\\u201C)]|$)', 'i');\nfunction rallyPlayLooksGerman(text) {\n  const s = String(text || '');\n  if (!s.trim()) return false;\n  if (/[äöüÄÖÜß]/.test(s)) return true;\n  return RAL_PLAY_DE_WORDS.test(s);\n}\n// Schnellstart: steht am Start nur der allgemeine Platzhalter („Euer Startpunkt“)?\nfunction rallyPlayStartIsGeneric(start) {\n  if (!start) return false;\n  if (start.generic) return true;\n  const S = (window.I18n && window.I18n.strings) || {};\n  const de = S.de && S.de['rally.quick.startLabel'];\n  const en = S.en && S.en['rally.quick.startLabel'];\n  return !start.label || start.label === de || start.label === en;\n}\n// Anzeigename des Startpunkts. Mitspieler sehen „Startpunkt von Anna“ statt „Euer Startpunkt“.\nfunction rallyPlayStartLabel(event, lang, isHost) {\n  const start = event && event.tour && event.tour.start;\n  if (!start) return '';\n  if (!rallyPlayIsQuick(event) || !rallyPlayStartIsGeneric(start)) return start.label || '';\n  if (isHost) return t('rally.quick.startLabel', lang);\n  const host = event.tour && event.tour.hostName;\n  return host ? rallyPlayT('rally.quick.startOf', lang, { name: host }) : t('rally.quick.startGeneric', lang);\n}\nfunction rallyPlayCleanCode(c) {\n  return String(c || '').toUpperCase().replace(/[^A-Z0-9]/g, '').slice(0, 5);\n}\nfunction rallyPlayErrText(err, lang) {\n  const code = err && err.code;\n  const k = {\n    not_found: 'rally.play.err.notFound',\n    event_not_lobby: 'rally.play.err.started',\n    event_not_active: 'rally.play.err.notActive',\n    invalid_team: 'rally.play.err.team',\n    invalid_input: 'rally.play.err.name',\n    not_on_roster: 'rally.play.err.notOnRoster',\n  }[code] || 'rally.play.err.generic';\n  return t(k, lang);\n}\n// Späteinstieg (Spec §11 P5): im laufenden Spiel erlaubt, außer die Organisatorin hat es abgeschaltet\nfunction rallyPlayLateOk(event) {\n  return !!event && event.status === 'active' && !(event.settings && event.settings.lateJoin === false);\n}\n// Teamname in der Sprache der Ansicht (eigene Namen bleiben, wie sie sind)\nfunction rallyPlayTeamName(event, no, lang) {\n  const E = window.RallyEngine;\n  if (E && typeof E.teamName === 'function') return E.teamName(event, no, lang);\n  const tm = event && (event.teams || []).find(x => +x.no === +no);\n  return tm ? rallyPickText(tm.name, lang) : String(no);\n}\n// „Team Brezn“: ein vorangestelltes „Team“ im Namen nicht doppeln\nfunction rallyPlayBareName(name) {\n  return String(name || '').replace(/^team\\s+/i, '');\n}\nfunction rallyPlayTeam(event, no, lang) {\n  if (!event || no == null) return null;\n  const tm = (event.teams || []).find(x => +x.no === +no) || { no, name: '#' + no, emoji: '👥' };\n  return lang ? { ...tm, name: rallyPlayTeamName(event, no, lang) } : tm;\n}\n// Tempo-/Zielbonus aktiv? (ein Team, Kinder, Schule: aus)\nfunction rallyPlaySpeedOn(event) {\n  const w = event && event.tour && event.tour.settings && event.tour.settings.speedWeight;\n  return w !== 'off' && !rallyPlaySingle(event);\n}\n// Warum gab es keinen Zielbonus? Tempo zu hoch oder zu viele Stationen ohne GPS bestätigt\nfunction rallyPlayNoBonusKey(row) {\n  if (!row || !row.suspicious) return null;\n  const E = window.RallyEngine || {};\n  const lim = E.SUSPICIOUS_KMH || 8;\n  return row.paceKmh != null && row.paceKmh > lim ? 'rally.play.end.noBonusFast' : 'rally.play.end.noBonusHonest';\n}\n// Gültige Antwort eines Teams auf eine Station: der zweite Versuch (attempt 2) ersetzt den ersten,\n// sonst zählt die früheste Zeile.\nfunction rallyPlayTeamAnswer(answers, team, stationId) {\n  let best = null;\n  (answers || []).forEach(a => {\n    if (!a || +a.team !== +team || a.stationId !== stationId) return;\n    const at = +a.attempt || 1, bt = best ? (+best.attempt || 1) : 0;\n    if (!best || at > bt || (at === bt && Date.parse(a.at) < Date.parse(best.at))) best = a;\n  });\n  return best;\n}\nfunction rallyPlayFact(factId, lang) {\n  if (factId == null) return null;\n  const f = (window.FACTS || []).find(x => x && (String(x.id) === String(factId) || (x.id == null && String(x.nr) === String(factId))));\n  if (!f) return null;\n  const p = typeof window.pickFact === 'function' ? window.pickFact(f, lang) : { ...f };\n  const clean = (v) => (typeof v === 'string' ? v.replace(/\\s*\\[\\d+\\]/g, '') : v);\n  return { ...p, text: clean(p.text), text2: clean(p.text2) };\n}\nfunction rallyPlayIsInfo(station) {\n  return !station || station.kind === 'info' || !station.puzzle;\n}\nfunction rallyPlayFmtNumber(n, lang, unit) {\n  const v = Number(n);\n  if (!isFinite(v)) return String(n == null ? '' : n);\n  const digits = Number.isInteger(v) ? 0 : Math.min(2, (String(v).split('.')[1] || '').length);\n  return rallyFmtNum(v, lang, digits, unit);\n}\nfunction rallyPlayFmtValue(puzzle, value, lang) {\n  if (!puzzle || value == null || value === '') return '';\n  if (puzzle.type === 'mcq') {\n    const i = Number(value);\n    return (puzzle.choices || [])[i] != null ? String(puzzle.choices[i]) : '';\n  }\n  if (puzzle.type === 'number' || puzzle.type === 'estimate') {\n    const n = RallyEngine.parseNumber(value, lang);\n    const s = isNaN(n) ? String(value) : rallyPlayFmtNumber(n, lang, puzzle.unit);\n    return puzzle.unit ? s + ' ' + puzzle.unit : s;\n  }\n  return String(value);\n}\nfunction rallyPlayCorrectText(puzzle, lang) {\n  if (!puzzle) return '';\n  if (puzzle.type === 'mcq') return rallyPlayFmtValue(puzzle, puzzle.correctIndex, lang);\n  if (puzzle.type === 'number') {\n    const base = rallyPlayFmtValue(puzzle, puzzle.answer, lang);\n    const tol = Math.abs(Number(puzzle.tolerance) || 0);\n    return tol ? base + ' (± ' + rallyPlayFmtNumber(tol, lang) + ')' : base;\n  }\n  return String(puzzle.answer == null ? '' : puzzle.answer);\n}\nfunction rallyPlayFinishPoint(event) {\n  const tour = (event && event.tour) || {};\n  return tour.finish || tour.start || null;\n}\nfunction rallyPlayMapsUrl(p) {\n  return 'https://www.google.com/maps/dir/?api=1&travelmode=walking&destination=' + p.lat + ',' + p.lng;\n}\n\n// Schnellstart (Spec §10): Gastgeber spielt mit (organizerMode 'player')\nfunction rallyPlayIsQuick(event) {\n  return !!event && event.organizerMode === 'player';\n}\nfunction rallyPlaySingle(event) {\n  return !!event && ((event.teams && event.teams.length === 1) || +event.teamCount === 1);\n}\n// Ist dieses Gerät Owner? Local: Geräte-ID, Supabase: auth-Nutzer (RallyStore.isOwner).\nfunction useRallyPlayIsHost(event) {\n  const [host, setHost] = React.useState(false);\n  const id = event && event.id, owner = event && event.ownerId, quick = rallyPlayIsQuick(event);\n  React.useEffect(() => {\n    if (!id || !quick) { setHost(false); return; }\n    let alive = true;\n    const S = window.RallyStore;\n    const p = S && typeof S.isOwner === 'function'\n      ? S.isOwner(event)\n      : Promise.resolve(!!owner && owner === rallyPlayDeviceId());\n    Promise.resolve(p).then(v => { if (alive) setHost(!!v); }).catch(() => { if (alive) setHost(false); });\n    return () => { alive = false; };\n  }, [id, owner, quick]); // eslint-disable-line react-hooks/exhaustive-deps\n  return host;\n}\n// Gastgeber-Gerät startet das Finale automatisch, sobald alle Teams im Ziel sind\n// oder die Zeit um ist (RallyEngine.finaleDue). Höchstens ein Aufruf gleichzeitig;\n// schlägt er fehl (Netz), frühestens nach 4 s erneut.\nfunction useRallyPlayAutoFinale(event, finishes, isHost) {\n  const busy = React.useRef(false);\n  const lastTry = React.useRef(0);\n  const evRef = React.useRef(event);\n  const finRef = React.useRef(finishes);\n  evRef.current = event; finRef.current = finishes;\n  const active = !!(isHost && event && rallyPlayIsQuick(event) && event.status === 'active');\n  React.useEffect(() => {\n    if (!active) return;\n    const check = () => {\n      const ev = evRef.current;\n      if (busy.current || !ev || ev.status !== 'active') return;\n      if (Date.now() - lastTry.current < 4000) return;\n      if (!RallyEngine.finaleDue(ev, finRef.current, Date.now())) return;\n      busy.current = true; lastTry.current = Date.now();\n      Promise.resolve(window.RallyStore.startFinale(ev.id))\n        .catch(e => { if (!(e && e.code === 'event_not_active')) console.warn('[RallyPlay] auto finale', e); })\n        .then(() => { busy.current = false; });\n    };\n    check();\n    const iv = setInterval(check, 1000);\n    return () => clearInterval(iv);\n  }, [active, event && event.id, finishes]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\n// Rivalen-Toasts: neue Antworten anderer Teams (nicht beim ersten Laden), höchstens alle 8 s.\n// Dazu ein Hinweis, wenn ein Teamkollege den zweiten Versuch genutzt hat.\nconst RAL_PLAY_RIVAL_MS = 8000;\nfunction useRallyPlayRivalry(event, answers, teamNo, me, players, lang, showToast, ready) {\n  const seen = React.useRef(null);\n  const last = React.useRef(0);\n  React.useEffect(() => {\n    if (!ready || !event) return;\n    const rows = (answers || []).filter(Boolean);\n    const keyOf = a => a.team + '|' + a.stationId + '|' + (+a.attempt || 1);\n    if (!seen.current) { seen.current = new Set(rows.map(keyOf)); return; }\n    const fresh = rows.filter(a => !seen.current.has(keyOf(a)));\n    fresh.forEach(a => seen.current.add(keyOf(a)));\n    if (!fresh.length || event.status !== 'active' || teamNo == null) return;\n    const stations = (event.tour && event.tour.stations) || [];\n    const mateRetry = fresh.find(a => +a.team === +teamNo && (+a.attempt || 1) === 2 && (!me || a.playerId !== me.id));\n    if (mateRetry) {\n      const st = stations.find(s => s.id === mateRetry.stationId);\n      const ok = st && st.puzzle ? rallyPlayCheck(st.puzzle, mateRetry.value, lang) === true : false;\n      const nm = ((players || []).find(p => p.id === mateRetry.playerId) || {}).name || t('rally.play.r.someone', lang);\n      showToast(rallyPlayT(ok ? 'rally.play.toast.mateRetryRight' : 'rally.play.toast.mateRetryWrong', lang, { name: nm }));\n      last.current = Date.now();\n      return;\n    }\n    if ((event.teams || []).length < 2) return;\n    const other = fresh.filter(a => +a.team !== +teamNo && (+a.attempt || 1) === 1);\n    if (!other.length || Date.now() - last.current < RAL_PLAY_RIVAL_MS) return;\n    const a = other[other.length - 1];\n    const tm = rallyPlayTeam(event, a.team);\n    // Fortschritt statt Stationsnummer: jedes Team läuft eine eigene Reihenfolge\n    const pr = RallyEngine.teamProgress(event, a.team, rows);\n    last.current = Date.now();\n    showToast(rallyPlayT('rally.play.toast.rival', lang, {\n      emoji: (tm && tm.emoji) || '👥', name: rallyPlayBareName(rallyPlayTeamName(event, a.team, lang)),\n      n: pr.done, total: pr.total,\n    }).trim());\n  }, [answers, ready]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\n// Teams werden sichtbar: jede Person sieht einmal, mit wem sie unterwegs ist.\nfunction rallyPlayRevealKey(event, me) {\n  return event && me ? 'fact_rally_reveal:' + event.id + ':' + me.id : null;\n}\nfunction rallyPlayRevealSeen(key) {\n  try { return !!(key && localStorage.getItem(key)); } catch (e) { return true; }\n}\nfunction RallyPlayReveal({ event, team, players, me, answers, teamNo, lang, single, onGo }) {\n  const mates = (players || []).filter(p => +p.team === +teamNo);\n  const names = mates.map(p => (p.id === me.id ? t('rally.play.you', lang) : p.name)).join(', ');\n  const next = RallyEngine.nextStationFor(event, teamNo, answers, Date.now());\n  const first = next.kind === 'station' ? next.station.title : null;\n  const teamName = rallyPlayBareName(rallyPlayTeamName(event, teamNo, lang));\n  return (\n    <div role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"rally-play-reveal-title\" style={{\n      position: 'absolute', inset: 0, zIndex: 250, background: 'rgba(10,10,10,0.55)',\n      display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 16,\n    }}>\n      <div className=\"rally-anim\" style={{\n        width: '100%', maxWidth: 420, borderRadius: 24, background: 'var(--surface)', color: 'var(--ink)',\n        padding: '22px 20px', textAlign: 'center', boxShadow: '0 10px 40px rgba(0,0,0,0.3)',\n        animation: 'rallyPopIn 0.25s ease-out', boxSizing: 'border-box',\n      }}>\n        <RallyKicker>{t('rally.play.reveal.kicker', lang)}</RallyKicker>\n        <div aria-hidden=\"true\" style={{\n          width: 84, height: 84, margin: '14px auto 0', borderRadius: '50%', background: team.color || 'var(--stamp)',\n          display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 44,\n        }}>{team.emoji || '👥'}</div>\n        <RallyPlayTitle size={26} style={{ marginTop: 12 }}>\n          <span id=\"rally-play-reveal-title\">\n            {single ? t('rally.play.reveal.together', lang) : rallyPlayT('rally.play.reveal.team', lang, { emoji: team.emoji || '', name: teamName }).trim()}\n          </span>\n        </RallyPlayTitle>\n        {names && <RallyPlayBody style={{ marginTop: 6, fontSize: 17, fontWeight: 700, color: 'var(--ink)' }}>{names}</RallyPlayBody>}\n        {first && (\n          <RallyPlayNotice icon=\"📍\" style={{ marginTop: 14, textAlign: 'left' }}>\n            {rallyPlayT('rally.play.reveal.first', lang, { title: first })}\n          </RallyPlayNotice>\n        )}\n        <RallyButton size=\"lg\" full icon=\"🚀\" onClick={onGo} style={{ marginTop: 16 }}>{t('rally.play.reveal.go', lang)}</RallyButton>\n      </div>\n    </div>\n  );\n}\n\n// Münzen fürs Mitspielen: einmal pro Event und Gerät\nfunction useRallyPlayCoins(event, points) {\n  const coins = rallyPlayCoinsFor(points);\n  const ended = !!event && event.status === 'ended';\n  React.useEffect(() => {\n    if (!ended || !event || coins <= 0) return;\n    const key = 'fact_rally_coins_awarded:' + event.id;\n    try {\n      if (localStorage.getItem(key)) return;\n      if (!window.Storage || typeof window.Storage.addCoins !== 'function') return;\n      window.Storage.addCoins(coins);\n      localStorage.setItem(key, String(coins));\n      window.dispatchEvent(new CustomEvent('rally-coins-awarded', { detail: { amount: coins, eventId: event.id } }));\n    } catch (e) {}\n  }, [ended, event && event.id, coins]); // eslint-disable-line react-hooks/exhaustive-deps\n  return coins;\n}\nfunction rallyPlayFactCount(event, answers, teamNo) {\n  return ((event && event.tour && event.tour.stations) || [])\n    .filter(st => st.kind === 'fact' && st.factId != null && rallyPlayTeamAnswer(answers, teamNo, st.id)).length;\n}\n// Höchstpunktzahl bei einem Team (Tempo-Bonus ist dort aus): Quizfragen plus aufgelöste Schätzfragen\nfunction rallyPlayMaxPoints(event, withEstimates) {\n  const E = window.RallyEngine || {};\n  const est = (E.ESTIMATE_POINTS && E.ESTIMATE_POINTS[0]) || 100;\n  return ((event && event.tour && event.tour.stations) || []).reduce((sum, s) => {\n    if (!s || !s.puzzle) return sum;\n    if (s.puzzle.type === 'estimate') return withEstimates ? sum + est : sum;\n    return sum + (typeof s.puzzle.points === 'number' ? s.puzzle.points : 100);\n  }, 0);\n}\n\n// ── Kleine Darstellungs-Bausteine ─────────────────────────────────────────────\nfunction RallyPlayTitle({ children, size = 26, style }) {\n  return (\n    <div style={{\n      fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: size, lineHeight: 1.12,\n      letterSpacing: '-0.01em', color: 'var(--ink)', overflowWrap: 'anywhere', ...style,\n    }}>{children}</div>\n  );\n}\nfunction RallyPlayBody({ children, style }) {\n  return (\n    <div style={{\n      fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 16, lineHeight: 1.55,\n      color: 'var(--ink-2)', overflowWrap: 'anywhere', ...style,\n    }}>{children}</div>\n  );\n}\nfunction RallyPlayProse({ children, lang, style }) {\n  return (\n    <div lang={lang || window._lang || 'de'} style={{\n      fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 16, lineHeight: 1.6, color: 'var(--ink)',\n      textAlign: 'justify', hyphens: 'auto', WebkitHyphens: 'auto', overflowWrap: 'anywhere',\n      whiteSpace: 'pre-line', ...style,\n    }}>{children}</div>\n  );\n}\nfunction RallyPlayNotice({ icon, tone = 'info', children, style }) {\n  const pal = {\n    info: { bg: 'var(--surface-2)', bd: 'var(--border)', fg: 'var(--ink-2)' },\n    warn: { bg: 'var(--stamp-soft)', bd: 'var(--stamp)', fg: 'var(--ink)' },\n    gold: { bg: 'var(--coin-soft)', bd: 'rgba(245,197,24,0.45)', fg: 'var(--ink)' },\n  }[tone];\n  return (\n    <div role={tone === 'warn' ? 'alert' : 'status'} style={{\n      display: 'flex', gap: 10, alignItems: 'flex-start', padding: '12px 14px', borderRadius: 14,\n      background: pal.bg, border: '1px solid ' + pal.bd, color: pal.fg,\n      fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 15, lineHeight: 1.5, ...style,\n    }}>\n      {icon != null && <span aria-hidden=\"true\" style={{ fontSize: 18, lineHeight: 1.3 }}>{icon}</span>}\n      <div style={{ minWidth: 0, flex: 1 }}>{children}</div>\n    </div>\n  );\n}\nfunction RallyPlayLink({ onClick, children, style }) {\n  return (\n    <button type=\"button\" className=\"rally-tap\" onClick={onClick} style={{\n      minHeight: 44, padding: '8px 12px', border: 'none', background: 'transparent', cursor: 'pointer',\n      color: 'var(--stamp)', fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 15,\n      textDecoration: 'underline', textUnderlineOffset: 3, ...style,\n    }}>{children}</button>\n  );\n}\nfunction RallyPlayPulseDot({ color = 'var(--stamp)' }) {\n  return (\n    <span aria-hidden=\"true\" style={{ position: 'relative', width: 14, height: 14, flexShrink: 0, display: 'inline-block' }}>\n      <span className=\"rally-anim\" style={{\n        position: 'absolute', inset: 0, borderRadius: '50%', background: color, opacity: 0.5,\n        animation: 'rallyPulse 1.6s ease-out infinite',\n      }} />\n      <span style={{ position: 'absolute', inset: 2, borderRadius: '50%', background: color }} />\n    </span>\n  );\n}\nfunction RallyPlayStat({ value, label, tone }) {\n  return (\n    <div style={{\n      flex: 1, minWidth: 0, background: 'var(--surface-2)', borderRadius: 14, padding: '12px 6px', textAlign: 'center',\n    }}>\n      <div style={{\n        fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 22, lineHeight: 1.1,\n        color: tone === 'gold' ? 'var(--coin-dk, #B8900A)' : 'var(--ink)',\n      }}>{value}</div>\n      <div style={{\n        marginTop: 4, fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 10, letterSpacing: 1,\n        textTransform: 'uppercase', color: 'var(--ink-2)',\n      }}>{label}</div>\n    </div>\n  );\n}\n\n// Rangliste für Teilnehmer (Zeilen aus RallyEngine.standings): ausgeschlossene Teams markiert\n// und ohne Platz („–“), Korrekturen der Spielleitung sichtbar, Zielbonus nur wenn er an ist.\nfunction RallyPlayStandings({ event, rows = [], lang, highlightTeam, hideEstimates }) {\n  if (!rows.length) {\n    return <div style={{ fontFamily: RAL_FONT_B, fontSize: 14, color: 'var(--ink-3)' }}>{t('rally.play.st.empty', lang)}</div>;\n  }\n  const speedOn = rallyPlaySpeedOn(event);\n  const signed = (n) => (n > 0 ? '+' : n < 0 ? '−' : '') + rallyFmtNum(Math.abs(n), lang, 0);\n  return (\n    <ol style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: 8 }}>\n      {rows.map(s => {\n        const mine = highlightTeam != null && +highlightTeam === +s.team;\n        const out = !!s.disqualified || s.rank == null;\n        const name = rallyPlayTeamName(event, s.team, lang);\n        const parts = [rallyPlayT('rally.play.st.base', lang, { n: rallyFmtNum(s.base || 0, lang, 0) })];\n        if (!hideEstimates) parts.push(rallyPlayT('rally.play.st.estimate', lang, { n: rallyFmtNum(s.estimate || 0, lang, 0) }));\n        if (speedOn && !out && (s.speed > 0 || s.finishedAt)) parts.push(rallyPlayT('rally.play.st.speed', lang, { n: rallyFmtNum(s.speed || 0, lang, 0) }));\n        if (s.adjust) parts.push(rallyPlayT('rally.play.st.adjust', lang, { n: signed(s.adjust) }));\n        const noBonus = speedOn && !out && s.finishedAt && !s.speed ? rallyPlayNoBonusKey(s) : null;\n        const total = hideEstimates ? (s.total || 0) - (s.estimate || 0) : (s.total || 0);\n        return (\n          <li key={s.team} style={{\n            display: 'flex', alignItems: 'center', gap: 10, padding: '10px 12px', borderRadius: 16,\n            background: mine ? 'var(--stamp-soft)' : 'var(--surface)',\n            border: mine ? '1.5px solid var(--stamp)' : '1px solid var(--border)',\n            opacity: out ? 0.7 : 1,\n          }}>\n            <span aria-label={out ? t('rally.play.st.noRankAria', lang) : rallyPlayT('rally.play.st.rankAria', lang, { n: s.rank })} style={{\n              width: 28, flexShrink: 0, textAlign: 'center', fontFamily: RAL_FONT_M, fontWeight: 600, fontSize: 16,\n              color: s.rank === 1 ? 'var(--coin-dk, #B8900A)' : 'var(--ink-2)', alignSelf: 'flex-start', paddingTop: 7,\n            }}>{out ? '–' : s.rank + '.'}</span>\n            <span aria-hidden=\"true\" style={{\n              width: 34, height: 34, flexShrink: 0, borderRadius: '50%', background: s.color || 'var(--stamp)', alignSelf: 'flex-start',\n              display: 'inline-flex', alignItems: 'center', justifyContent: 'center', fontSize: 18, lineHeight: 1,\n              border: '2px solid #FFFFFF', boxShadow: '0 2px 5px rgba(0,0,0,0.2)', boxSizing: 'border-box',\n            }}>{s.emoji || '👥'}</span>\n            <span style={{ flex: 1, minWidth: 0 }}>\n              <span style={{ display: 'block', fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 15.5, lineHeight: 1.2, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', textDecoration: out ? 'line-through' : 'none' }}>\n                {name}\n              </span>\n              <span style={{ display: 'block', marginTop: 2, fontFamily: RAL_FONT_M, fontSize: 12, lineHeight: 1.45, color: 'var(--ink-2)', overflowWrap: 'anywhere' }}>\n                {mine && <span style={{ fontFamily: RAL_FONT_D, fontWeight: 900, color: 'var(--stamp)' }}>{t('rally.play.st.you', lang)} · </span>}\n                {out && <span style={{ fontFamily: RAL_FONT_D, fontWeight: 900, color: 'var(--stamp)' }}>{t('rally.play.st.out', lang)} · </span>}\n                {parts.join(' · ')}{s.finishedAt ? ' · 🏁' : ''}\n              </span>\n              {noBonus && (\n                <span style={{ display: 'block', marginTop: 2, fontFamily: RAL_FONT_B, fontSize: 12.5, lineHeight: 1.4, color: 'var(--ink-3)' }}>{t(noBonus, lang)}</span>\n              )}\n            </span>\n            <span style={{ fontFamily: RAL_FONT_M, fontWeight: 600, fontSize: 20, color: 'var(--ink)', alignSelf: 'flex-start', paddingTop: 4 }}>{total}</span>\n          </li>\n        );\n      })}\n    </ol>\n  );\n}\n\n// Overlays aus tiefen Komponenten landen per Portal im Shell-Root (nicht im Scrollbereich).\nconst RallyPlayOverlayCtx = React.createContext(null);\nconst RallyPlayScrollCtx = React.createContext(() => {});\n// Neuer Schritt (Frage, Ergebnis, Weg): nach oben scrollen, damit Kopf und Aufgabe sichtbar sind\nfunction useRallyPlayScrollTop(key) {\n  const toTop = React.useContext(RallyPlayScrollCtx);\n  React.useEffect(() => { toTop(); }, [key]); // eslint-disable-line react-hooks/exhaustive-deps\n}\nfunction RallyPlayPortal({ children }) {\n  const host = React.useContext(RallyPlayOverlayCtx);\n  return host ? ReactDOM.createPortal(children, host) : null;\n}\n\n// Rahmen: fuellt den Bereich unter der Statusleiste, scrollt selbst, Overlays liegen darueber.\nfunction RallyPlayShell({ children, overlays, scrollKey }) {\n  const ref = React.useRef(null);\n  const [host, setHost] = React.useState(null);\n  React.useEffect(() => { if (ref.current) ref.current.scrollTop = 0; }, [scrollKey]);\n  const toTop = React.useCallback(() => { if (ref.current) ref.current.scrollTop = 0; }, []);\n  return (\n    <RallyPlayScrollCtx.Provider value={toTop}>\n    <RallyPlayOverlayCtx.Provider value={host}>\n    <div ref={setHost} style={{ position: 'absolute', top: 44, left: 0, right: 0, bottom: 0, overflow: 'hidden', color: 'var(--ink)' }}>\n      <div ref={ref} className=\"rally-scroll\" style={{ position: 'absolute', inset: 0, overflowY: 'auto', overflowX: 'hidden' }}>\n        <div style={{\n          maxWidth: 520, margin: '0 auto', padding: '8px 16px 132px', boxSizing: 'border-box',\n          display: 'flex', flexDirection: 'column', gap: 14,\n        }}>{children}</div>\n      </div>\n      {overlays}\n    </div>\n    </RallyPlayOverlayCtx.Provider>\n    </RallyPlayScrollCtx.Provider>\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// Root\n// ══════════════════════════════════════════════════════════════════════════════\nfunction RallyPlay({ theme = 'light', lang = 'de', userId, user, userPosition, currentCity, initialCode, onExit, onSignup }) {\n  rallyEnsureStyles();\n  const code0 = rallyPlayCleanCode(initialCode);\n  const [active, setActive] = React.useState(() => {\n    const a = rallyPlayReadActive();\n    if (!a) return null;\n    if (code0 && a.code && a.code !== code0) return null;\n    return a;\n  });\n  const [joinCode, setJoinCode] = React.useState(code0);\n  const [lateJoin, setLateJoin] = React.useState(false);   // gerade im laufenden Spiel beigetreten\n\n  const onJoined = (ev, player, late) => {\n    const a = { eventId: ev.id, code: ev.code, playerId: player.id, deviceId: rallyPlayDeviceId() };\n    rallyPlayWriteActive(a);\n    setLateJoin(!!late);\n    setActive(a);\n  };\n  const clearActive = () => { rallyPlayWriteActive(null); setActive(null); };\n  const exit = () => { clearActive(); onExit && onExit(); };\n  const rejoin = (code) => { clearActive(); setJoinCode(code || ''); };\n\n  if (!active) {\n    return (\n      <RallyPlayJoin key={'join-' + joinCode} theme={theme} lang={lang} user={user}\n        initialCode={joinCode} onJoined={onJoined} onExit={() => onExit && onExit()} />\n    );\n  }\n  return (\n    <RallyPlayGame key={active.eventId} active={active} theme={theme} lang={lang}\n      userId={userId} userPosition={userPosition} lateJoin={lateJoin}\n      onLeave={exit} onBack={() => onExit && onExit()} onDone={exit} onRejoin={rejoin} onSignup={onSignup} />\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// 1. Beitreten\n// ══════════════════════════════════════════════════════════════════════════════\nfunction RallyPlayJoin({ theme, lang, user, initialCode, onJoined, onExit }) {\n  const [code, setCode] = React.useState(rallyPlayCleanCode(initialCode));\n  const [found, setFound] = React.useState(null);      // Event aus der Code-Suche\n  const [busy, setBusy] = React.useState(false);\n  const [err, setErr] = React.useState(null);\n  // Feld startet leer: auf geteilten Handys wäre der gemerkte Name oft der von jemand anderem.\n  // Der gemerkte bzw. Profil-Name erscheint nur als Vorschlag zum Antippen.\n  const [name, setName] = React.useState('');\n  const suggestName = React.useMemo(() => rallyPlayInitialName(user), []); // eslint-disable-line react-hooks/exhaustive-deps\n  const [team, setTeam] = React.useState(null);\n  const [foundPlayers, setFoundPlayers] = React.useState([]);   // Spielerliste aus der Code-Suche\n  const live = useRallyEvent(found ? found.id : null);\n  const event = live.event || found;\n  // Bis das Live-Abo geladen ist, die Liste aus der Suche zeigen (sonst „0 schon dabei“)\n  const players = live.event ? (live.players || []) : foundPlayers;\n  const nameRef = React.useRef(null);\n  // Namensvorschlag: setzen und die Tastatur schließen, bevor jemand zu „Mitmachen“ greift.\n  // Sonst verschiebt das Zuklappen das Layout und der nächste Tipp landet ins Leere.\n  const pickName = (n) => {\n    setName(String(n || '').slice(0, 24)); setErr(null);\n    try { if (nameRef.current && document.activeElement === nameRef.current) nameRef.current.blur(); } catch (e) {}\n  };\n\n  const lookup = async (raw) => {\n    const c = rallyPlayCleanCode(raw);\n    if (c.length !== 5) { setErr(t('rally.play.join.err.length', lang)); return; }\n    setBusy(true); setErr(null);\n    try {\n      const S = window.RallyStore;\n      const ev = await S.getEventByCode(c);\n      if (!ev) { setErr(t('rally.play.err.notFound', lang)); return; }\n      if (ev.status === 'ended') { setErr(t('rally.play.err.ended', lang)); return; }\n      // Dieses Geraet war schon dabei: direkt wieder rein, in jedem Status\n      const mine = S.me().playerIdFor(ev.id);\n      const ps = (await S.listPlayers(ev.id)) || [];\n      const meP = mine && ps.find(p => p.id === mine);\n      if (meP) {\n        const r = await S.joinEvent(c, { name: meP.name });\n        onJoined(r.event, r.player, false);\n        return;\n      }\n      if (ev.status !== 'lobby' && !rallyPlayLateOk(ev)) { setErr(t('rally.play.err.started', lang)); return; }\n      setFoundPlayers(ps);\n      setFound(ev);\n    } catch (e) {\n      setErr(rallyPlayErrText(e, lang));\n    } finally {\n      setBusy(false);\n    }\n  };\n\n  React.useEffect(() => {\n    if (rallyPlayCleanCode(initialCode).length === 5) lookup(initialCode);\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const join = async () => {\n    if (!event) return;\n    setBusy(true); setErr(null);\n    try {\n      const opts = { name: name.trim() };\n      if (event.assignMode === 'self' && team != null && event.status === 'lobby') opts.team = team;\n      const r = await window.RallyStore.joinEvent(event.code, opts);\n      rallyPlaySaveName(opts.name);\n      onJoined(r.event, r.player, !!r.late);\n    } catch (e) {\n      setErr(rallyPlayErrText(e, lang));\n      setBusy(false);\n    }\n  };\n\n  // ── Schritt 1: Code ──\n  if (!found) {\n    return (\n      <RallyPlayShell scrollKey=\"code\">\n        <div style={{ paddingTop: 8 }}>\n          <RallyKicker>{t('rally.play.kicker', lang)}</RallyKicker>\n          <RallyPlayTitle style={{ marginTop: 6 }}>{t('rally.play.join.title', lang)}</RallyPlayTitle>\n          <RallyPlayBody style={{ marginTop: 8 }}>{t('rally.play.join.body', lang)}</RallyPlayBody>\n        </div>\n        <RallyCard theme={theme} padding={18}>\n          <RallyField label={t('rally.play.join.codeLabel', lang)} htmlFor=\"rally-play-code\"\n            error={err} hint={t('rally.play.join.codeHint', lang)}>\n            <RallyInput id=\"rally-play-code\" mono value={code} invalid={!!err}\n              inputMode=\"text\" autoCapitalize=\"characters\" autoComplete=\"off\" autoCorrect=\"off\" spellCheck={false}\n              maxLength={5} placeholder=\"ABC23\" aria-label={t('rally.play.join.codeLabel', lang)}\n              onChange={e => {\n                const c = rallyPlayCleanCode(e.target.value);\n                setCode(c); setErr(null);\n                if (c.length === 5 && c !== code) lookup(c);\n              }}\n              onKeyDown={e => { if (e.key === 'Enter') lookup(code); }}\n              style={{ fontSize: 30, fontWeight: 700, textAlign: 'center', letterSpacing: '0.32em', minHeight: 64, textTransform: 'uppercase' }} />\n          </RallyField>\n          <RallyButton size=\"lg\" full disabled={busy || code.length !== 5} onClick={() => lookup(code)} style={{ marginTop: 16 }}>\n            {busy ? t('rally.play.join.searching', lang) : t('rally.play.join.find', lang)}\n          </RallyButton>\n        </RallyCard>\n        <div style={{ display: 'flex', justifyContent: 'center' }}>\n          <RallyPlayLink onClick={onExit}>{t('rally.play.back', lang)}</RallyPlayLink>\n        </div>\n      </RallyPlayShell>\n    );\n  }\n\n  // ── Schritt 2: Name (+ Team) ──\n  const late = rallyPlayLateOk(event);\n  const started = event && event.status !== 'lobby' && !late;\n  const self = event.assignMode === 'self' && !late;   // beim Späteinstieg teilt die App das Team zu\n  const taken = new Set(players.map(p => String(p.name || '').trim().toLowerCase()));\n  const roster = (event.roster || []).map(r => (typeof r === 'string' ? r : r && r.name)).filter(Boolean)\n    .filter(n => !taken.has(String(n).trim().toLowerCase()));\n  const counts = {};\n  players.forEach(p => { if (p.team != null) counts[p.team] = (counts[p.team] || 0) + 1; });\n  const startLabel = rallyPlayStartLabel(event, lang, false);\n  const canJoin = !busy && !started && name.trim().length > 0 && (!self || team != null);\n  // Vorschlag nur, solange das Feld leer ist, der Name nicht schon vergeben ist und nicht ohnehin als Listen-Chip erscheint\n  const suggestLc = String(suggestName || '').trim().toLowerCase();\n  const showSuggest = !!suggestLc && !name.trim() && !taken.has(suggestLc)\n    && !roster.some(n => String(n).trim().toLowerCase() === suggestLc);\n\n  return (\n    <RallyPlayShell scrollKey=\"details\">\n      <RallyCard theme={theme} accent padding={18}>\n        <RallyKicker>{t('rally.play.join.found', lang)}</RallyKicker>\n        <RallyPlayTitle size={24} style={{ marginTop: 6 }}>{event.title}</RallyPlayTitle>\n        <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, marginTop: 10 }}>\n          <RallyChip>{rallyPlaySingle(event) ? t('rally.quick.join.oneTeam', lang) : ralPlural(event.teamCount, 'rally.play.join.teams', lang)}</RallyChip>\n          <RallyChip>{t('rally.play.join.players', lang).replace('{n}', players.length)}</RallyChip>\n          {startLabel && <RallyChip icon=\"📍\">{startLabel}</RallyChip>}\n        </div>\n        <RallyPlayLink onClick={() => { setFound(null); setErr(null); setTeam(null); }} style={{ padding: '8px 0', marginTop: 4 }}>\n          {t('rally.play.join.otherCode', lang)}\n        </RallyPlayLink>\n      </RallyCard>\n\n      {started && <RallyPlayNotice icon=\"⏱️\" tone=\"warn\">{t('rally.play.err.started', lang)}</RallyPlayNotice>}\n      {late && <RallyPlayNotice icon=\"🏃\">{t('rally.play.join.late', lang)}</RallyPlayNotice>}\n\n      <RallyField label={t('rally.play.join.nameLabel', lang)} hint={t('rally.play.join.nameHint', lang)} htmlFor=\"rally-play-name\">\n        <RallyInput id=\"rally-play-name\" ref={nameRef} value={name} maxLength={24} autoComplete=\"off\"\n          placeholder={t('rally.play.join.namePh', lang)}\n          onChange={e => { setName(e.target.value); setErr(null); }}\n          onKeyDown={e => { if (e.key === 'Enter' && canJoin) join(); }}\n          style={{ fontSize: 18, minHeight: 56 }} />\n      </RallyField>\n      {showSuggest && (\n        <div style={{ display: 'flex', marginTop: -6 }}>\n          <RallyChip keepFocus icon=\"👋\" onClick={() => pickName(suggestName)}>\n            {rallyPlayT('rally.play.join.suggest', lang, { name: suggestName })}\n          </RallyChip>\n        </div>\n      )}\n\n      {roster.length > 0 && (\n        <div>\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, marginBottom: 8 }}>{t('rally.play.join.roster', lang)}</div>\n          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>\n            {roster.map(n => (\n              <RallyChip key={n} keepFocus active={name.trim().toLowerCase() === String(n).trim().toLowerCase()}\n                onClick={() => pickName(n)}>{n}</RallyChip>\n            ))}\n          </div>\n        </div>\n      )}\n\n      {self ? (\n        <div>\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, marginBottom: 8 }}>{t('rally.play.join.pickTeam', lang)}</div>\n          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', gap: 10 }}>\n            {(event.teams || []).map(tm => {\n              const on = team === tm.no;\n              const tName = rallyPlayTeamName(event, tm.no, lang);\n              const inTeam = t('rally.play.join.inTeam', lang).replace('{n}', counts[tm.no] || 0);\n              return (\n                <button key={tm.no} type=\"button\" className=\"rally-tap\" aria-pressed={on}\n                  aria-label={rallyPlayT('rally.play.join.teamAria', lang, { name: rallyPlayBareName(tName), count: inTeam })}\n                  onClick={() => { setTeam(tm.no); setErr(null); }}\n                  style={{\n                    display: 'flex', alignItems: 'center', gap: 10, minHeight: 64, padding: '10px 12px',\n                    borderRadius: 16, cursor: 'pointer', textAlign: 'left', minWidth: 0,\n                    background: on ? 'var(--stamp-soft)' : 'var(--surface)',\n                    border: on ? '2px solid var(--stamp)' : '1.5px solid var(--border-2)',\n                    boxShadow: on ? '0 3px 0 var(--stamp-deep)' : '0 2px 0 var(--border-2)',\n                    color: 'var(--ink)',\n                  }}>\n                  <span aria-hidden=\"true\" style={{\n                    width: 38, height: 38, flexShrink: 0, borderRadius: '50%', background: tm.color || 'var(--stamp)',\n                    display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 20,\n                  }}>{tm.emoji || '👥'}</span>\n                  <span style={{ minWidth: 0 }}>\n                    <span style={{ display: 'block', fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 16, lineHeight: 1.15, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n                      {tName}\n                    </span>\n                    <span style={{ display: 'block', fontFamily: RAL_FONT_M, fontSize: 12, color: 'var(--ink-2)', marginTop: 2 }}>\n                      {inTeam}\n                    </span>\n                  </span>\n                </button>\n              );\n            })}\n          </div>\n        </div>\n      ) : late ? null : (\n        <RallyPlayNotice icon=\"🎲\">\n          {t(rallyPlaySingle(event) ? 'rally.quick.join.together' : event.assignMode === 'preset' ? 'rally.play.join.assignPreset' : 'rally.play.join.assignRandom', lang)}\n        </RallyPlayNotice>\n      )}\n\n      {err && <RallyPlayNotice icon=\"⚠️\" tone=\"warn\">{err}</RallyPlayNotice>}\n\n      <RallyButton size=\"lg\" full disabled={!canJoin} onClick={join}>\n        {busy ? t('rally.play.join.joining', lang) : t('rally.play.join.cta', lang)}\n      </RallyButton>\n      {self && team == null && name.trim() && (\n        <div style={{ textAlign: 'center', fontFamily: RAL_FONT_B, fontSize: 14, color: 'var(--ink-3)', marginTop: -6 }}>\n          {t('rally.play.join.pickFirst', lang)}\n        </div>\n      )}\n    </RallyPlayShell>\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// Spiel: laedt das Event und verteilt nach Status\n// ══════════════════════════════════════════════════════════════════════════════\nfunction RallyPlayGame({ active, theme, lang, userId, userPosition, lateJoin, onLeave, onBack, onDone, onRejoin, onSignup }) {\n  const data = useRallyEvent(active.eventId);\n  const { event, players, answers, finishes, loading, error } = data;\n  const [toast, showToast] = useRallyToast(3600);\n  const [confirmLeave, setConfirmLeave] = React.useState(false);\n  const [boardOpen, setBoardOpen] = React.useState(false);\n  const [loadedOnce, setLoadedOnce] = React.useState(false);\n  React.useEffect(() => { if (!loading) setLoadedOnce(true); }, [loading]);\n\n  const me = (players || []).find(p => p.id === active.playerId) || null;\n  const teamNo = me && me.team != null ? +me.team : null;\n  const team = rallyPlayTeam(event, teamNo, lang);\n  // Späteinstieg: einmal sagen, in welches Team die App einen gesteckt hat\n  const lateToldRef = React.useRef(false);\n  React.useEffect(() => {\n    if (!lateJoin || lateToldRef.current || !event || teamNo == null || rallyPlaySingle(event)) return;\n    lateToldRef.current = true;\n    showToast(rallyPlayT('rally.play.toast.lateTeam', lang, { name: rallyPlayBareName(rallyPlayTeamName(event, teamNo, lang)) }));\n  }, [lateJoin, teamNo, event && event.id]); // eslint-disable-line react-hooks/exhaustive-deps\n  const quick = rallyPlayIsQuick(event);\n  const single = rallyPlaySingle(event);\n  const isHost = useRallyPlayIsHost(event);\n  const quickHost = quick && isHost;\n  useRallyPlayAutoFinale(event, finishes, isHost);\n  const [confirmFinale, setConfirmFinale] = React.useState(false);\n  const status = event && event.status;\n  React.useEffect(() => { if (status && status !== 'active') { setBoardOpen(false); setConfirmFinale(false); } }, [status]);\n  const Q = window;   // Schnellstart-Bausteine aus rally-quick.jsx (window.RallyQuick*)\n  const lobbyCancel = quickHost && event && event.status === 'lobby';\n  const hasEst = rallyPlayHasEst(event);\n  useRallyPlayRivalry(event, answers, teamNo, me, players, lang, showToast, loadedOnce && !loading);\n\n  // Team-Vorstellung einmal pro Person, sobald die Rallye läuft (nicht nach einem Neuladen mitten im Spiel)\n  const revealKey = rallyPlayRevealKey(event, me);\n  const [revealDone, setRevealDone] = React.useState(false);\n  const showReveal = !revealDone && status === 'active' && !!team && !!revealKey && !rallyPlayRevealSeen(revealKey)\n    && RallyEngine.teamProgress(event, teamNo, answers).done === 0;\n  const closeReveal = () => {\n    try { localStorage.setItem(revealKey, '1'); } catch (e) {}\n    setRevealDone(true);\n  };\n\n  const leave = async () => {\n    setConfirmLeave(false);\n    if (lobbyCancel) {\n      // Gastgeber geht in der Lobby: Schnellstart-Rallye für alle absagen\n      try { await window.RallyStore.deleteEvent(event.id); } catch (e) {}\n    } else if (event && event.status === 'lobby' && me) {\n      try { await window.RallyStore.removePlayer(event.id, me.id); } catch (e) {}\n    }\n    onLeave();\n  };\n  const finaleNow = async () => {\n    setConfirmFinale(false);\n    try { await window.RallyStore.startFinale(event.id); setBoardOpen(false); }\n    catch (e) {\n      if (e && e.code === 'event_not_active') setBoardOpen(false);\n      else showToast(t('rally.quick.board.failed', lang));\n    }\n  };\n\n  const overlays = (\n    <React.Fragment>\n      <RallySheet open={boardOpen} onClose={() => setBoardOpen(false)} lang={lang}\n        kicker={t(single && quick ? 'rally.quick.score.kicker' : 'rally.play.board.kicker', lang)}\n        title={t(single && quick ? 'rally.quick.score.title' : 'rally.play.board.title', lang)}>\n        {event && (\n          <div style={{ paddingBottom: 8 }}>\n            {single && quick && Q.RallyQuickScore ? (\n              <Q.RallyQuickScore event={event} answers={answers} teamNo={teamNo} lang={lang} />\n            ) : (\n              <React.Fragment>\n                <RallyPlayStandings event={event} lang={lang} highlightTeam={teamNo} hideEstimates\n                  rows={RallyEngine.standings(event, answers, finishes, { revealEstimates: false })} />\n                {hasEst && <RallyPlayNotice icon=\"🔒\" style={{ marginTop: 14 }}>{t('rally.play.board.hidden', lang)}</RallyPlayNotice>}\n              </React.Fragment>\n            )}\n            {quickHost && event.status === 'active' && (\n              <div style={{ marginTop: 16, display: 'flex', flexDirection: 'column', gap: 10 }}>\n                <RallyPlayNotice icon=\"⏱️\">{t('rally.quick.board.auto', lang)}</RallyPlayNotice>\n                <RallyButton variant=\"secondary\" full icon=\"🏁\" onClick={() => setConfirmFinale(true)}>{t('rally.quick.board.finale', lang)}</RallyButton>\n              </div>\n            )}\n          </div>\n        )}\n      </RallySheet>\n      <RallyConfirm open={confirmFinale} lang={lang}\n        title={t('rally.quick.board.finaleTitle', lang)} body={t('rally.quick.board.finaleBody', lang)}\n        confirmLabel={t('rally.quick.board.finaleConfirm', lang)} cancelLabel={t('rally.ui.cancel', lang)}\n        onConfirm={finaleNow} onCancel={() => setConfirmFinale(false)} zIndex={320} />\n      <RallyConfirm open={confirmLeave} lang={lang} danger\n        title={t(lobbyCancel ? 'rally.quick.lobby.cancelTitle' : 'rally.play.leave.title', lang)}\n        body={t(lobbyCancel ? 'rally.quick.lobby.cancelBody'\n          : event && event.status === 'lobby' ? 'rally.play.leave.bodyLobby' : 'rally.play.leave.bodyActive', lang)}\n        confirmLabel={t(lobbyCancel ? 'rally.quick.lobby.cancelConfirm' : 'rally.play.leave.confirm', lang)}\n        cancelLabel={t('rally.play.leave.stay', lang)}\n        onConfirm={leave} onCancel={() => setConfirmLeave(false)} />\n      {showReveal && (\n        <RallyPlayReveal event={event} team={team} players={players} me={me} answers={answers} teamNo={teamNo}\n          lang={lang} single={single} onGo={closeReveal} />\n      )}\n      <RallyToast message={toast} />\n    </React.Fragment>\n  );\n\n  // ── Laden / Fehler ──\n  if (!loadedOnce || (loading && !event)) {\n    return (\n      <RallyPlayShell overlays={overlays} scrollKey=\"loading\">\n        <RallyLoading lang={lang} where=\"play.game\" onRetry={data.reload} onBack={onBack} />\n      </RallyPlayShell>\n    );\n  }\n  if (error && !event) {\n    return (\n      <RallyPlayShell overlays={overlays} scrollKey=\"error\">\n        <RallyEmpty icon=\"📶\" title={t('rally.ui.event.loadError', lang)}\n          action={<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n            <RallyButton onClick={data.reload}>{t('rally.ui.retry', lang)}</RallyButton>\n            <RallyPlayLink onClick={onLeave}>{t('rally.play.back', lang)}</RallyPlayLink>\n          </div>} />\n      </RallyPlayShell>\n    );\n  }\n  if (!event) {\n    return (\n      <RallyPlayShell overlays={overlays} scrollKey=\"gone\">\n        <RallyEmpty icon=\"🗺️\" title={t('rally.ui.event.notFound', lang)}\n          action={<RallyButton onClick={onLeave}>{t('rally.play.back', lang)}</RallyButton>} />\n      </RallyPlayShell>\n    );\n  }\n  if (!me) {\n    return (\n      <RallyPlayShell overlays={overlays} scrollKey=\"removed\">\n        <RallyEmpty icon=\"👋\" title={t('rally.play.removed.title', lang)} body={t('rally.play.removed.body', lang)}\n          action={<div style={{ display: 'flex', flexDirection: 'column', gap: 10, alignItems: 'center' }}>\n            {event.status === 'lobby' && <RallyButton onClick={() => onRejoin(event.code)}>{t('rally.play.removed.rejoin', lang)}</RallyButton>}\n            <RallyPlayLink onClick={onLeave}>{t('rally.play.back', lang)}</RallyPlayLink>\n          </div>} />\n      </RallyPlayShell>\n    );\n  }\n\n  const header = (\n    <div style={{ display: 'flex', alignItems: 'center', gap: 10, minHeight: 48 }}>\n      <div style={{ flex: 1, minWidth: 0 }}>\n        <RallyKicker>{t('rally.play.kicker', lang)} · <span style={{ fontFamily: RAL_FONT_M, letterSpacing: '0.12em' }}>{event.code}</span></RallyKicker>\n        <div style={{\n          fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 17, lineHeight: 1.2, marginTop: 2,\n          whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis',\n        }}>{event.title}</div>\n      </div>\n      {event.status !== 'ended' && (\n        <RallyButton variant=\"ghost\" size=\"sm\" onClick={() => setConfirmLeave(true)}>{t('rally.play.leave', lang)}</RallyButton>\n      )}\n    </div>\n  );\n\n  let body = null, phaseKey = event.status;\n  const S = window.RallyStore;\n  const quickSolo = quick && single && !!Q.RallyQuickSolo;\n  const estCount = ((event.tour && event.tour.stations) || []).filter(s => s.puzzle && s.puzzle.type === 'estimate').length;\n  if (event.status === 'lobby') {\n    body = quick && Q.RallyQuickLobby\n      ? <Q.RallyQuickLobby event={event} players={players} me={me} isHost={isHost} lang={lang} theme={theme} showToast={showToast} />\n      : <RallyPlayLobby event={event} players={players} me={me} team={team} lang={lang} theme={theme} showToast={showToast} />;\n  } else if (event.status === 'active') {\n    body = team\n      ? <RallyPlayRun event={event} players={players} answers={answers} finishes={finishes} me={me} teamNo={teamNo} team={team}\n          lang={lang} theme={theme} userPosition={userPosition} showToast={showToast} onBoard={() => setBoardOpen(true)}\n          single={quick && single} onFinaleNow={quickHost ? () => setConfirmFinale(true) : null} isHost={quickHost} />\n      : <RallyEmpty icon=\"🎲\" title={t('rally.play.noTeam.title', lang)} body={t('rally.play.noTeam.body', lang)} />;\n  } else if (event.status === 'finale') {\n    const Finale = window.RallyFinaleView;\n    const ceremony = estCount === 0 || (event.revealStep || 0) > estCount;\n    if (quickSolo && ceremony) {\n      // Ein Team: statt Siegerehrung das eigene Ergebnis (wie nah wart ihr dran)\n      body = <Q.RallyQuickSolo event={event} answers={answers} finishes={finishes} players={players} lang={lang} theme={theme}\n        isHost={quickHost} onEnd={() => S.endEvent(event.id)} />;\n    } else {\n      body = Finale ? (\n        <Finale event={event} players={players} answers={answers} finishes={finishes}\n          lang={lang} theme={theme} isHost={quickHost} myTeam={teamNo}\n          onNext={quickHost ? () => S.revealNext(event.id) : undefined}\n          onEnd={quickHost ? () => S.endEvent(event.id) : undefined} />\n      ) : null;\n    }\n  } else if (quickSolo) {\n    body = (\n      <React.Fragment>\n        <Q.RallyQuickSolo event={event} answers={answers} finishes={finishes} players={players} lang={lang} theme={theme} isHost={quickHost} />\n        {quickHost && Q.RallyQuickSaveTour && <Q.RallyQuickSaveTour event={event} lang={lang} />}\n        <RallyPlayEndExtras event={event} answers={answers} finishes={finishes} teamNo={teamNo}\n          userId={userId} lang={lang} onSignup={onSignup} onDone={onDone} />\n      </React.Fragment>\n    );\n  } else {\n    body = <RallyPlayEnd event={event} answers={answers} finishes={finishes} teamNo={teamNo} team={team}\n      lang={lang} theme={theme} userId={userId} onSignup={onSignup} onDone={onDone}\n      extra={quickHost && Q.RallyQuickSaveTour ? <Q.RallyQuickSaveTour event={event} lang={lang} /> : null} />;\n  }\n\n  return (\n    <RallyPlayShell overlays={overlays} scrollKey={phaseKey}>\n      {header}\n      {body}\n    </RallyPlayShell>\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// 2. Warten (Lobby)\n// ══════════════════════════════════════════════════════════════════════════════\nfunction RallyPlayLobby({ event, players, me, team, lang, theme, showToast }) {\n  const [busy, setBusy] = React.useState(false);\n  const geo = useRallyGeo();   // fragt die Standort-Erlaubnis schon beim Warten ab\n  const mates = team ? players.filter(p => +p.team === +team.no) : [];\n  const counts = {};\n  players.forEach(p => { if (p.team != null) counts[p.team] = (counts[p.team] || 0) + 1; });\n  const unassigned = players.filter(p => p.team == null).length;\n  const start = event.tour && event.tour.start;\n  const self = event.assignMode === 'self';\n\n  const switchTeam = async (no) => {\n    if (busy || (team && +team.no === +no)) return;\n    setBusy(true);\n    try { await window.RallyStore.setPlayerTeam(event.id, me.id, no); }\n    catch (e) { showToast(rallyPlayErrText(e, lang)); }\n    finally { setBusy(false); }\n  };\n\n  return (\n    <React.Fragment>\n      <RallyCard accent padding={18}>\n        <RallyKicker>{t('rally.play.lobby.kicker', lang)}</RallyKicker>\n        <RallyPlayTitle size={26} style={{ marginTop: 6 }}>{t('rally.play.lobby.hello', lang).replace('{name}', me.name)}</RallyPlayTitle>\n        <div style={{ marginTop: 14 }}>\n          {team ? (\n            <div>\n              <div style={{ fontFamily: RAL_FONT_B, fontSize: 14, color: 'var(--ink-2)', marginBottom: 8 }}>{t('rally.play.lobby.yourTeam', lang)}</div>\n              <RallyTeamBadge team={team} size=\"lg\" lang={lang} />\n            </div>\n          ) : (\n            <RallyPlayBody>{t(self ? 'rally.play.lobby.noTeamSelf' : 'rally.play.lobby.noTeam', lang)}</RallyPlayBody>\n          )}\n        </div>\n      </RallyCard>\n\n      <div style={{\n        display: 'flex', alignItems: 'center', gap: 12, padding: '14px 16px', borderRadius: 16,\n        background: 'var(--coin-soft)', border: '1px solid rgba(245,197,24,0.45)',\n      }} role=\"status\">\n        <RallyPlayPulseDot color=\"var(--coin)\" />\n        <div style={{ minWidth: 0 }}>\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 18 }}>{t('rally.play.lobby.soon', lang)}</div>\n          <div style={{ fontFamily: RAL_FONT_B, fontSize: 14, lineHeight: 1.45, color: 'var(--ink-2)', marginTop: 2 }}>{t('rally.play.lobby.soonBody', lang)}</div>\n        </div>\n      </div>\n\n      {team && (\n        <RallyCard padding={16}>\n          <RallyKicker color=\"var(--ink-2)\">{t('rally.play.lobby.mates', lang).replace('{n}', mates.length)}</RallyKicker>\n          <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginTop: 10 }}>\n            {mates.map(p => (\n              <div key={p.id} style={{ display: 'flex', alignItems: 'center', gap: 10, minHeight: 32 }}>\n                <span aria-hidden=\"true\" style={{\n                  width: 32, height: 32, borderRadius: '50%', background: 'var(--surface-2)', flexShrink: 0,\n                  display: 'flex', alignItems: 'center', justifyContent: 'center',\n                  fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 14, color: 'var(--ink-2)',\n                }}>{String(p.name || '?').trim().charAt(0).toUpperCase()}</span>\n                <span style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 16, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{p.name}</span>\n                {p.id === me.id && <RallyChip active>{t('rally.play.you', lang)}</RallyChip>}\n              </div>\n            ))}\n          </div>\n        </RallyCard>\n      )}\n\n      {self && (\n        <div>\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, marginBottom: 8 }}>{t('rally.play.lobby.switch', lang)}</div>\n          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>\n            {(event.teams || []).map(tm => (\n              <RallyChip key={tm.no} icon={tm.emoji} active={team && +team.no === +tm.no} color={tm.color}\n                onClick={() => switchTeam(tm.no)}>{rallyPlayTeamName(event, tm.no, lang)} · {counts[tm.no] || 0}</RallyChip>\n            ))}\n          </div>\n        </div>\n      )}\n\n      <RallyCard padding={16}>\n        <RallyKicker color=\"var(--ink-2)\">{t('rally.play.lobby.others', lang)}</RallyKicker>\n        <div style={{ display: 'flex', flexDirection: 'column', gap: 10, marginTop: 10 }}>\n          {(event.teams || []).filter(tm => !team || +tm.no !== +team.no).map(tm => (\n            <div key={tm.no} style={{ display: 'flex', alignItems: 'center', gap: 10, justifyContent: 'space-between' }}>\n              <RallyTeamBadge team={rallyPlayTeam(event, tm.no, lang)} size=\"sm\" lang={lang} />\n              <span style={{ fontFamily: RAL_FONT_M, fontSize: 13, color: 'var(--ink-2)' }}>\n                {t('rally.play.join.inTeam', lang).replace('{n}', counts[tm.no] || 0)}\n              </span>\n            </div>\n          ))}\n          {unassigned > 0 && (\n            <div style={{ fontFamily: RAL_FONT_B, fontSize: 14, color: 'var(--ink-3)' }}>\n              {ralPlural(unassigned, 'rally.play.lobby.unassigned', lang)}\n            </div>\n          )}\n        </div>\n      </RallyCard>\n\n      {start && (\n        <div>\n          <RallyKicker color=\"var(--ink-2)\" style={{ marginBottom: 8 }}>\n            {t('rally.play.lobby.meet', lang)}{start.label ? ': ' + start.label : ''}\n          </RallyKicker>\n          <RallyMap height={170} theme={theme} lang={lang} center={start} zoom={16} interactive={false}\n            markers={[{ id: 'start', kind: 'start', lat: start.lat, lng: start.lng, title: start.label }]} />\n        </div>\n      )}\n\n      <RallyPlayGermanOnly event={event} lang={lang} />\n      <RallyPlayNotice icon=\"📍\">{t('rally.play.lobby.tip', lang)}</RallyPlayNotice>\n      {geo.error && <RallyGeoNotice geo={geo} lang={lang} />}\n    </React.Fragment>\n  );\n}\n\n// Englische Ansicht: wie viele Stationen gibt es nur auf Deutsch? (auch von rally-quick.jsx genutzt)\nfunction RallyPlayGermanOnly({ event, lang, style }) {\n  if (lang !== 'en' || !event || !event.tour) return null;\n  const E = window.RallyEngine;\n  if (!E || typeof E.germanOnlyCount !== 'function') return null;\n  let n = 0;\n  try { n = E.germanOnlyCount(event.tour, window.FACTS, 'en'); } catch (e) { n = 0; }\n  if (!n) return null;\n  const total = (event.tour.stations || []).length;\n  return <RallyPlayNotice icon=\"🌐\" style={style}>{rallyPlayT('rally.play.lobby.deOnly', lang, { n, total })}</RallyPlayNotice>;\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// 3./4. Unterwegs: Station suchen, Frage, Ergebnis, Ziel\n// ══════════════════════════════════════════════════════════════════════════════\nfunction RallyPlayRun({ event, players, answers, finishes, me, teamNo, team, lang, theme, userPosition, showToast, onBoard, single, onFinaleNow, isHost }) {\n  const teamSize = (players || []).filter(p => +p.team === +teamNo).length;\n  const now = useRallyNow(1000);\n  const geo = useRallyGeo();\n  const mountedAt = React.useRef(Date.now());\n  const settings = (event.tour && event.tour.settings) || {};\n  const gate = settings.gpsGate !== false;\n  const radius = Number(settings.gpsRadiusM) > 0 ? Number(settings.gpsRadiusM) : 60;\n  const pos = geo.pos || (userPosition && isFinite(userPosition.lat) ? { lat: userPosition.lat, lng: userPosition.lng } : null);\n\n  const endsMs = event.endsAt ? Date.parse(event.endsAt) : NaN;\n  const timeOver = isFinite(endsMs) && now > endsMs;\n  const next = RallyEngine.nextStationFor(event, teamNo, answers, now);\n  const prog = RallyEngine.teamProgress(event, teamNo, answers);\n  const finished = (finishes || []).some(f => +f.team === +teamNo);\n\n  // Position melden: hoechstens alle 20 s, nur waehrend active (Spec R6)\n  const posRef = React.useRef(null);\n  posRef.current = pos;\n  const lastSent = React.useRef(0);\n  React.useEffect(() => {\n    if (event.status !== 'active' || !me) return;\n    const send = () => {\n      const p = posRef.current;\n      if (!p) return;\n      const tNow = Date.now();\n      if (tNow - lastSent.current < RAL_PLAY_POS_MS - 500) return;\n      lastSent.current = tNow;\n      Promise.resolve(window.RallyStore.updatePosition(event.id, me.id, p.lat, p.lng)).catch(() => {});\n    };\n    send();\n    const id = setInterval(send, RAL_PLAY_POS_MS);\n    return () => clearInterval(id);\n  }, [event.id, event.status, me && me.id, !!pos]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Besuchte Fakt-Stationen landen in der eigenen Fakten-Sammlung (auch als Gast),\n  // egal wer im Team geantwortet hat: ihr wart ja alle dort.\n  React.useEffect(() => {\n    if (!window.Storage || typeof window.Storage.collectFact !== 'function') return;\n    let added = false;\n    (event.tour.stations || []).forEach(st => {\n      if (st.kind !== 'fact' || st.factId == null) return;\n      if (!rallyPlayTeamAnswer(answers, teamNo, st.id)) return;\n      if (window.Storage.isCollected(st.factId)) return;\n      window.Storage.collectFact(st.factId);\n      added = true;\n    });\n    if (added) window.dispatchEvent(new CustomEvent('rally-facts-collected'));\n  }, [answers, teamNo, event.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Ergebnis-Ansicht: eigene Antwort ODER Teamkollege hat die aktuelle Station beantwortet\n  const [resultId, setResultId] = React.useState(null);\n  const [resultAnswer, setResultAnswer] = React.useState(null);\n  const targetRef = React.useRef(null);\n  const nextId = next.kind === 'station' ? next.station.id : null;\n  // Zweiter Versuch (mcq/text/number, einmal pro Station): Frage erneut für halbe Punkte\n  const [retryId, setRetryId] = React.useState(null);\n  const [retryUsed, setRetryUsed] = React.useState({});\n  React.useEffect(() => {\n    // Teamkollege war schneller mit dem zweiten Versuch: dessen Ergebnis zeigen\n    if (!retryId) return;\n    const a = rallyPlayTeamAnswer(answers, teamNo, retryId);\n    if (a && (+a.attempt || 1) >= 2) {\n      setRetryId(null); setResultAnswer(a); setResultId(retryId);\n    }\n  }, [answers, retryId]); // eslint-disable-line react-hooks/exhaustive-deps\n  React.useEffect(() => {\n    if (resultId || retryId) return;\n    const tid = targetRef.current;\n    if (tid && rallyPlayTeamAnswer(answers, teamNo, tid)) {\n      targetRef.current = null;\n      const st = (event.tour.stations || []).find(s => s.id === tid);\n      const a = rallyPlayTeamAnswer(answers, teamNo, tid);\n      // Info-Station ohne Notiz: kein eigener Ergebnis-Schritt noetig\n      if (st && rallyPlayIsInfo(st) && !st.note && a && a.playerId !== me.id) {\n        showToast(t('rally.play.toast.mateMoved', lang));\n      } else if (st) {\n        setResultId(tid);\n        setResultAnswer(a);\n        return;\n      }\n    }\n    targetRef.current = nextId;\n  }, [answers, nextId, resultId, retryId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const onAnswered = (answer, station) => {\n    targetRef.current = null;\n    if (rallyPlayIsInfo(station) && !station.note && answer && answer.playerId === me.id) {\n      targetRef.current = null;\n      return;   // Info ohne Notiz: direkt weiter\n    }\n    setResultAnswer(answer);\n    setResultId(station.id);\n  };\n  // Beim Schließen auf die Station NACH der gezeigten zielen (nicht auf die aktuell nächste):\n  // Hat ein Teamkollege die inzwischen beantwortet, zeigt der Effekt oben dessen Ergebnis,\n  // statt sie still zu überspringen.\n  const closeResult = () => {\n    const stations = event.tour.stations || [];\n    const order = (event.orders && event.orders[teamNo]) || stations.map((_, i) => i);\n    const pos = order.findIndex(i => stations[i] && stations[i].id === resultId);\n    const after = pos >= 0 && pos + 1 < order.length ? stations[order[pos + 1]] : null;\n    targetRef.current = after ? after.id : null;\n    setResultId(null); setResultAnswer(null);\n  };\n  const startRetry = () => {\n    const id = resultId;\n    if (!id) return;\n    targetRef.current = null;\n    setResultId(null); setResultAnswer(null); setRetryId(id);\n  };\n  const cancelRetry = () => {\n    const id = retryId;\n    setRetryId(null);\n    setResultAnswer(rallyPlayTeamAnswer(answers, teamNo, id)); setResultId(id);\n  };\n  const onRetryAnswered = (answer, station) => {\n    setRetryUsed(u => ({ ...u, [station.id]: true }));\n    setRetryId(null);\n    setResultAnswer(answer); setResultId(station.id);\n  };\n  const stepOf = (stationId) => {\n    const stations = event.tour.stations || [];\n    const order = (event.orders && event.orders[teamNo]) || stations.map((_, i) => i);\n    const i = order.findIndex(k => stations[k] && stations[k].id === stationId);\n    return i >= 0 ? i + 1 : prog.done;\n  };\n\n  // Frage oeffnen: Naehe, gpsGate aus, Test-Knopf oder ehrlich bestaetigt. Einmal offen bleibt offen.\n  const [forced, setForced] = React.useState({});\n  const [honest, setHonest] = React.useState(null);  // id, fuer die der Ehrlich-Dialog offen ist\n  const [honestKeys, setHonestKeys] = React.useState({});  // per Ehrenwort geöffnete Stationen\n  const target = next.kind === 'station' ? next.station : rallyPlayFinishPoint(event);\n  const targetKey = next.kind === 'station' ? next.station.id : 'finish';\n  const dist = pos && target ? RallyEngine.haversineM(pos, target) : null;\n  const accBonus = pos && isFinite(pos.acc) ? Math.min(RAL_PLAY_ACC_BONUS_MAX, Math.max(0, pos.acc)) : 0;\n  const near = dist != null && dist <= radius + accBonus;\n  const open = !gate || near || !!forced[targetKey];\n  React.useEffect(() => {\n    if (near && next.kind === 'station' && !forced[targetKey]) setForced(f => ({ ...f, [targetKey]: true }));\n  }, [near, targetKey]); // eslint-disable-line react-hooks/exhaustive-deps\n  const gpsStuck = !pos && (!!geo.error || now - mountedAt.current > RAL_PLAY_GPS_GRACE_MS);\n  const force = (key) => setForced(f => ({ ...f, [key]: true }));\n\n  // Zielankunft\n  const [finishing, setFinishing] = React.useState(false);\n  const arrive = async () => {\n    setFinishing(true);\n    try { await window.RallyStore.markFinish(event.id, teamNo); }\n    catch (e) { showToast(rallyPlayErrText(e, lang)); }\n    finally { setFinishing(false); }\n  };\n  // ── Statusleiste ──\n  const remain = isFinite(endsMs) ? endsMs - now : null;\n  const pct = prog.total ? Math.round((prog.done / prog.total) * 100) : 0;\n  const status = (\n    <RallyCard padding={12} style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n      <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n        <div style={{ flex: 1, minWidth: 0 }}>\n          <RallyTeamBadge team={team} size=\"sm\" lang={lang} />\n        </div>\n        <button type=\"button\" className=\"rally-tap\" onClick={onBoard} style={{\n          display: 'inline-flex', alignItems: 'center', gap: 6, minHeight: 44, padding: '0 14px', borderRadius: 999, flexShrink: 0,\n          border: '1.5px solid var(--border-2)', background: 'var(--surface)', color: 'var(--ink)', cursor: 'pointer',\n          fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14,\n        }}><span aria-hidden=\"true\">{single ? '⭐' : '🏆'}</span>{t(single ? 'rally.quick.score.button' : 'rally.play.status.board', lang)}</button>\n      </div>\n      <div>\n        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 8, fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, color: 'var(--ink-2)' }}>\n          <span>{t('rally.play.status.progress', lang).replace('{done}', prog.done).replace('{total}', prog.total)}</span>\n          {remain != null && (\n            <span aria-label={t('rally.play.status.timeLeft', lang)} style={{\n              display: 'inline-flex', alignItems: 'center', gap: 4, padding: '3px 10px', borderRadius: 999,\n              background: remain < 5 * 60000 ? 'var(--stamp)' : 'var(--surface-2)',\n              color: remain < 5 * 60000 ? '#FFFFFF' : 'var(--ink)',\n              fontFamily: RAL_FONT_M, fontWeight: 600, fontSize: 14,\n            }}><span aria-hidden=\"true\">⏱</span>{rallyFmtClock(Math.max(0, remain))}</span>\n          )}\n        </div>\n        <div role=\"progressbar\" aria-valuemin={0} aria-valuemax={prog.total} aria-valuenow={prog.done}\n          style={{ height: 8, borderRadius: 999, background: 'var(--surface-2)', marginTop: 6, overflow: 'hidden' }}>\n          <div style={{ width: pct + '%', height: '100%', background: 'var(--stamp)', borderRadius: 999, transition: 'width 0.4s ease-out' }} />\n        </div>\n      </div>\n    </RallyCard>\n  );\n\n  const banner = timeOver && !finished ? (\n    <div role=\"alert\" style={{\n      display: 'flex', gap: 10, alignItems: 'center', padding: '14px 16px', borderRadius: 16,\n      background: 'var(--stamp)', color: '#FFFFFF', boxShadow: '0 3px 0 var(--stamp-deep)',\n    }}>\n      <span aria-hidden=\"true\" style={{ fontSize: 24 }}>⏰</span>\n      <div style={{ minWidth: 0 }}>\n        <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 17 }}>{t('rally.play.timeup.title', lang)}</div>\n        <div style={{ fontFamily: RAL_FONT_B, fontSize: 14, opacity: 0.92 }}>{t('rally.play.timeup.body', lang)}</div>\n      </div>\n    </div>\n  ) : null;\n\n  let body;\n  if (resultId) {\n    const st = (event.tour.stations || []).find(s => s.id === resultId);\n    const ans = rallyPlayTeamAnswer(answers, teamNo, resultId) || resultAnswer;\n    const answeredNow = !!rallyPlayTeamAnswer(answers, teamNo, resultId);\n    const isLast = timeOver || (prog.done + (answeredNow ? 0 : 1)) >= prog.total;\n    const canRetry = !!st && !!ans && !timeOver && !retryUsed[resultId] && !rallyPlayIsInfo(st)\n      && rallyPlayCanRetryType(st.puzzle) && (+ans.attempt || 1) < 2\n      && rallyPlayCheck(st.puzzle, ans.value, lang) === false;\n    body = st && ans\n      ? <RallyPlayResult key={'r-' + resultId} event={event} station={st} answer={ans} players={players} me={me} lang={lang} theme={theme}\n          isLast={isLast} onNext={closeResult} canRetry={canRetry} onRetry={startRetry} />\n      : <RallyButton size=\"lg\" full onClick={closeResult}>{t('rally.play.r.next', lang)}</RallyButton>;\n  } else if (retryId) {\n    const st = (event.tour.stations || []).find(s => s.id === retryId);\n    body = st\n      ? <RallyPlayQuestion key={'retry-' + retryId} event={event} station={st} stepNo={stepOf(retryId)} total={prog.total}\n          teamNo={teamNo} me={me} lang={lang} theme={theme} showToast={showToast} onAnswered={onRetryAnswered}\n          retry onCancel={cancelRetry} teamSize={teamSize} honest={!!honestKeys[retryId]}\n          prevValue={(rallyPlayTeamAnswer(answers, teamNo, retryId) || {}).value} />\n      : null;\n  } else if (next.kind === 'station' && open) {\n    body = <RallyPlayQuestion key={next.station.id} event={event} station={next.station} stepNo={prog.done + 1} total={prog.total}\n      teamNo={teamNo} me={me} lang={lang} theme={theme} showToast={showToast} onAnswered={onAnswered}\n      teamSize={teamSize} honest={!!honestKeys[next.station.id]} />;\n  } else if (next.kind === 'finish' && finished) {\n    body = <RallyPlayAtFinish event={event} answers={answers} finishes={finishes} teamNo={teamNo} lang={lang} theme={theme} single={single} onFinaleNow={onFinaleNow} />;\n  } else {\n    body = (\n      <RallyPlayWay kind={next.kind} event={event} station={next.kind === 'station' ? next.station : null}\n        target={target} stepNo={prog.done + 1} total={prog.total} pos={pos} dist={dist} near={near} gate={gate}\n        radius={radius} geo={geo} gpsStuck={gpsStuck} lang={lang} theme={theme} finishing={finishing}\n        onArrive={arrive} onTest={() => (next.kind === 'station' ? force(targetKey) : arrive())}\n        onHonest={() => setHonest(targetKey)} isHost={isHost} />\n    );\n  }\n\n  return (\n    <React.Fragment>\n      {banner}\n      {!finished && status}\n      {body}\n      <RallyPlayPortal>\n      <RallyConfirm open={!!honest} lang={lang}\n        title={t(honest === 'finish' ? 'rally.play.honest.titleFinish' : 'rally.play.honest.title', lang)}\n        body={t('rally.play.honest.body', lang)}\n        confirmLabel={t('rally.play.honest.confirm', lang)} cancelLabel={t('rally.play.honest.cancel', lang)}\n        onCancel={() => setHonest(null)}\n        onConfirm={() => {\n          const k = honest;\n          setHonest(null);\n          if (k === 'finish') arrive();\n          else { force(k); setHonestKeys(h => ({ ...h, [k]: true })); }\n        }} />\n      </RallyPlayPortal>\n    </React.Fragment>\n  );\n}\n\n// Weg zur Station bzw. zum Ziel\nfunction RallyPlayWay({ kind, event, station, target, stepNo, total, pos, dist, near, gate, radius, geo, gpsStuck, lang, theme, finishing, onArrive, onTest, onHonest, isHost }) {\n  useRallyPlayScrollTop(kind + (station ? station.id : ''));\n  const isFinish = kind === 'finish';\n  const loop = isFinish && !(event.tour && event.tour.finish);\n  // Schnellstart-Rundweg mit allgemeinem Startpunkt: „Zurück zum Startpunkt“ passt für alle\n  const quickLoop = loop && rallyPlayIsQuick(event) && rallyPlayStartIsGeneric(target);\n  const label = isFinish\n    ? (quickLoop ? t('rally.quick.backToStart', lang) : ((target && target.label) || t('rally.ui.map.finish', lang)))\n    : station.title;\n  const markers = [];\n  if (target) {\n    markers.push(isFinish\n      ? { id: 'finish', kind: 'finish', lat: target.lat, lng: target.lng, title: label }\n      : { id: 'target', kind: 'station', active: true, label: String(stepNo), lat: target.lat, lng: target.lng, title: label });\n  }\n  const canArrive = isFinish && (!gate || near);\n  const showFallback = gate && !near && (gpsStuck || !!geo.error);\n\n  return (\n    <React.Fragment>\n      <RallyCard accent padding={18}>\n        <RallyKicker>\n          {isFinish\n            ? t(loop && !quickLoop ? 'rally.play.way.kickerLoop' : 'rally.play.way.kickerFinish', lang)\n            : t('rally.play.way.kicker', lang).replace('{n}', stepNo).replace('{total}', total)}\n        </RallyKicker>\n        <RallyPlayTitle size={24} style={{ marginTop: 6 }}>{label}</RallyPlayTitle>\n        <div style={{ display: 'flex', alignItems: 'baseline', gap: 8, marginTop: 12 }}>\n          {dist != null ? (\n            <React.Fragment>\n              <span style={{ fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 34, lineHeight: 1, color: 'var(--ink)' }}>\n                {rallyFmtDist(dist, lang)}\n              </span>\n              <span style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 15, color: 'var(--ink-2)' }}>\n                {near ? '✓ ' + t('rally.play.way.near', lang) : t(isFinish ? 'rally.play.way.toFinish' : 'rally.play.way.toGo', lang)}\n              </span>\n            </React.Fragment>\n          ) : (\n            <span style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 15, color: 'var(--ink-2)' }}>{t('rally.play.way.noPos', lang)}</span>\n          )}\n        </div>\n        <RallyPlayBody style={{ marginTop: 10, fontSize: 15 }}>\n          {isFinish\n            ? t(gate ? 'rally.play.way.finishHint' : 'rally.play.way.finishHintNoGate', lang).replace('{r}', radius)\n            : t('rally.play.way.hint', lang).replace('{r}', radius)}\n        </RallyPlayBody>\n        {canArrive && (\n          <RallyButton size=\"lg\" full icon=\"🏁\" disabled={finishing} onClick={onArrive} style={{ marginTop: 16 }}>\n            {t('rally.play.way.arrived', lang)}\n          </RallyButton>\n        )}\n      </RallyCard>\n\n      <RallyGeoNotice geo={geo} lang={lang} />\n\n      {showFallback && (\n        <RallyCard padding={16}>\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 17 }}>{t('rally.play.way.noGpsTitle', lang)}</div>\n          <RallyPlayBody style={{ marginTop: 4, fontSize: 15 }}>{t('rally.play.way.noGpsBody', lang)}</RallyPlayBody>\n          <RallyButton variant=\"secondary\" full style={{ marginTop: 12 }} onClick={onHonest}>\n            {t(isFinish ? 'rally.play.way.honestFinish' : 'rally.play.way.honest', lang)}\n          </RallyButton>\n        </RallyCard>\n      )}\n\n      {target && (\n        <RallyMap height={250} theme={theme} lang={lang} center={target} zoom={16}\n          markers={markers} userPos={pos} fitToMarkers={!!pos} recenter />\n      )}\n      {target && (\n        <RallyButton variant=\"ghost\" full icon=\"🧭\"\n          onClick={() => { try { window.open(rallyPlayMapsUrl(target), '_blank', 'noopener'); } catch (e) {} }}>\n          {t('rally.play.way.maps', lang)}\n        </RallyButton>\n      )}\n\n      {geo.debug && gate && !near && (\n        <RallyButton variant=\"ghost\" full icon=\"🧪\" onClick={onTest}\n          style={{ borderStyle: 'dashed', color: 'var(--cat-myth, #A855F7)' }}>\n          {t('rally.play.way.test', lang)}\n        </RallyButton>\n      )}\n    </React.Fragment>\n  );\n}\n\n// ── Frage ─────────────────────────────────────────────────────────────────────\nfunction RallyPlayQuestion({ event, station, stepNo, total, teamNo, me, lang, theme, showToast, onAnswered, retry, onCancel, teamSize, honest, prevValue }) {\n  useRallyPlayScrollTop((retry ? 'q2' : 'q') + station.id);\n  const puzzle = station.puzzle;\n  const info = rallyPlayIsInfo(station);\n  const [choice, setChoice] = React.useState(null);\n  const [text, setText] = React.useState('');\n  const [hint, setHint] = React.useState(false);\n  const [busy, setBusy] = React.useState(false);\n  const [err, setErr] = React.useState(null);\n  const [confirmOpen, setConfirmOpen] = React.useState(false);\n  const fact = station.kind === 'fact' ? rallyPlayFact(station.factId, lang) : null;\n  const isNum = puzzle && (puzzle.type === 'number' || puzzle.type === 'estimate');\n  const prevChoice = retry && puzzle && puzzle.type === 'mcq' && prevValue != null ? Number(prevValue) : null;\n  // Englische Oberfläche, Inhalt (noch) nur auf Deutsch: einmal freundlich darauf hinweisen\n  const deOnly = lang === 'en' && rallyPlayLooksGerman([\n    station.title, puzzle && puzzle.question, info ? (station.text || (fact && fact.text) || '') : (station.text || ''),\n  ].filter(Boolean).join(' '));\n\n  let value = null, ready = false;\n  if (info) ready = true;\n  else if (puzzle.type === 'mcq') { value = choice; ready = choice != null; }\n  else if (isNum) { value = RallyEngine.parseNumber(text, lang); ready = text.trim() !== ''; }\n  else { value = text.trim(); ready = value.length > 0; }\n\n  // Mehrere im Team: kurz bestätigen, dass das die Teamantwort ist\n  const submit = () => {\n    if (!ready || busy) return;\n    if (isNum && isNaN(value)) { setErr(t('rally.play.q.numErr', lang)); return; }\n    if (!info && (teamSize || 0) > 1) { setConfirmOpen(true); return; }\n    send();\n  };\n  const send = async () => {\n    setConfirmOpen(false);\n    if (!ready || busy) return;\n    setBusy(true); setErr(null);\n    try {\n      const payload = {\n        team: teamNo, stationId: station.id, playerId: me.id,\n        value: info ? null : value, hintsUsed: hint ? 1 : 0,\n      };\n      if (honest) payload.honest = true;\n      if (retry) payload.retry = true;\n      const row = await window.RallyStore.submitAnswer(event.id, payload);\n      onAnswered(row, station);\n    } catch (e) {\n      if (e && e.code === 'already_answered' && e.existing) { onAnswered(e.existing, station); return; }\n      if (e && e.code === 'event_not_active') showToast(t(e.reason === 'time_over' ? 'rally.play.timeup.title' : 'rally.play.err.notActive', lang));\n      else setErr(rallyPlayErrText(e, lang));\n      setBusy(false);\n    }\n  };\n\n  const typeLabel = info ? t('rally.play.q.type.info', lang) : t('rally.play.q.type.' + puzzle.type, lang);\n  const infoText = station.text || (fact && fact.text) || '';\n  // Eigener Stationstext der Spielleitung: auch bei Stationen mit Frage zeigen (vor der Frage)\n  const ownText = !info && station.text ? String(station.text) : '';\n\n  return (\n    <React.Fragment>\n      <div style={{\n        borderRadius: 20, overflow: 'hidden', background: 'var(--surface)', border: '1px solid var(--border)',\n        boxShadow: theme === 'dark' ? 'none' : '0 2px 6px rgba(0,0,0,0.04)',\n      }}>\n        <div style={{\n          background: 'linear-gradient(135deg, var(--stamp), var(--primary-lt))', color: '#FFFFFF',\n          padding: '14px 18px 16px', boxShadow: '0 4px 12px var(--stamp-glow)',\n        }}>\n          <div style={{ display: 'flex', justifyContent: 'space-between', gap: 10, alignItems: 'center' }}>\n            <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 11, letterSpacing: 1.5, textTransform: 'uppercase', opacity: 0.95 }}>\n              {t('rally.play.q.kicker', lang).replace('{n}', stepNo).replace('{total}', total)}\n            </div>\n            <span style={{\n              padding: '3px 10px', borderRadius: 999, background: 'rgba(255,255,255,0.22)',\n              fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 11, letterSpacing: 0.8, textTransform: 'uppercase',\n            }}>{typeLabel}</span>\n          </div>\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 22, lineHeight: 1.15, marginTop: 6, overflowWrap: 'anywhere' }}>\n            {station.title}\n          </div>\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, marginTop: 4, opacity: 0.95 }}>\n            {retry ? '🔁 ' + t('rally.play.q.retryBadge', lang) : '📍 ' + t('rally.play.q.arrived', lang)}\n          </div>\n        </div>\n\n        <div style={{ padding: 18, display: 'flex', flexDirection: 'column', gap: 14 }}>\n          {deOnly && (\n            <div lang=\"en\" style={{ fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 13, lineHeight: 1.45, color: 'var(--ink-3)' }}>\n              🌐 {t('rally.play.q.deOnly', lang)}\n            </div>\n          )}\n          {info ? (\n            <React.Fragment>\n              {infoText ? <RallyPlayProse lang={lang}>{infoText}</RallyPlayProse> : <RallyPlayBody>{t('rally.play.q.infoEmpty', lang)}</RallyPlayBody>}\n            </React.Fragment>\n          ) : (\n            <React.Fragment>\n              {ownText && <RallyPlayProse lang={lang}>{ownText}</RallyPlayProse>}\n              <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 21, lineHeight: 1.3, color: 'var(--ink)', overflowWrap: 'anywhere' }}>\n                {puzzle.question}\n              </div>\n\n              {puzzle.type === 'mcq' && (\n                <div role=\"radiogroup\" aria-label={puzzle.question} style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n                  {(puzzle.choices || []).map((c, i) => {\n                    const on = choice === i;\n                    const tried = prevChoice === i;   // erster, falscher Versuch\n                    return (\n                      <button key={i} type=\"button\" role=\"radio\" aria-checked={on} className=\"rally-tap\"\n                        aria-label={String.fromCharCode(65 + i) + ': ' + c}\n                        disabled={tried} aria-disabled={tried || undefined}\n                        onClick={() => { if (tried) return; setChoice(i); setErr(null); }}\n                        style={{\n                          display: 'flex', alignItems: 'center', gap: 12, width: '100%', minHeight: 60,\n                          padding: '12px 14px', borderRadius: 16, cursor: tried ? 'default' : 'pointer', textAlign: 'left',\n                          opacity: tried ? 0.45 : 1, textDecoration: tried ? 'line-through' : 'none',\n                          background: on ? 'var(--stamp-soft)' : 'var(--surface)',\n                          border: on ? '2px solid var(--stamp)' : '1.5px solid var(--border-2)',\n                          boxShadow: on ? '0 3px 0 var(--stamp-deep)' : '0 2px 0 var(--border-2)',\n                          color: 'var(--ink)', fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 17, lineHeight: 1.25,\n                        }}>\n                        <span aria-hidden=\"true\" style={{\n                          width: 34, height: 34, flexShrink: 0, borderRadius: '50%',\n                          background: on ? 'var(--stamp)' : 'var(--surface-2)', color: on ? '#FFFFFF' : 'var(--ink-2)',\n                          display: 'flex', alignItems: 'center', justifyContent: 'center',\n                          fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 15,\n                        }}>{String.fromCharCode(65 + i)}</span>\n                        <span style={{ minWidth: 0, overflowWrap: 'anywhere' }}>{c}</span>\n                      </button>\n                    );\n                  })}\n                </div>\n              )}\n\n              {puzzle.type !== 'mcq' && (\n                <RallyField label={t(isNum ? 'rally.play.q.numLabel' : 'rally.play.q.textLabel', lang)} htmlFor=\"rally-play-answer\" error={err}>\n                  <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n                    <RallyInput id=\"rally-play-answer\" value={text} mono={isNum} invalid={!!err}\n                      inputMode={isNum ? 'decimal' : 'text'} autoComplete=\"off\" autoCorrect=\"off\" spellCheck={false}\n                      enterKeyHint=\"send\" placeholder={t(isNum ? 'rally.play.q.numPh' : 'rally.play.q.textPh', lang)}\n                      onChange={e => { setText(e.target.value); setErr(null); }}\n                      onKeyDown={e => { if (e.key === 'Enter') submit(); }}\n                      style={{ fontSize: isNum ? 24 : 18, minHeight: 58, flex: 1, minWidth: 0 }} />\n                    {isNum && puzzle.unit && (\n                      <span style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 20, color: 'var(--ink-2)', flexShrink: 0 }}>{puzzle.unit}</span>\n                    )}\n                  </div>\n                </RallyField>\n              )}\n              {puzzle.type === 'mcq' && err && <RallyPlayNotice icon=\"⚠️\" tone=\"warn\">{err}</RallyPlayNotice>}\n\n              {puzzle.type === 'estimate' && (\n                <RallyPlayNotice icon=\"🎯\" tone=\"gold\">\n                  <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900 }}>{t('rally.play.q.estimateTitle', lang)}</div>\n                  <div style={{ marginTop: 2 }}>{t('rally.play.q.estimateBody', lang)}</div>\n                </RallyPlayNotice>\n              )}\n\n              {puzzle.hint && (hint ? (\n                <RallyPlayNotice icon=\"💡\" tone=\"gold\">\n                  <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900 }}>{t('rally.play.q.hintTitle', lang)}</div>\n                  <div style={{ marginTop: 2 }}>{puzzle.hint}</div>\n                </RallyPlayNotice>\n              ) : (\n                <RallyButton variant=\"ghost\" full icon=\"💡\" onClick={() => setHint(true)}>\n                  {puzzle.type === 'estimate'\n                    ? t('rally.play.q.hintFree', lang)\n                    : t('rally.play.q.hint', lang)}\n                </RallyButton>\n              ))}\n            </React.Fragment>\n          )}\n        </div>\n      </div>\n\n      {info && err && <RallyPlayNotice icon=\"⚠️\" tone=\"warn\">{err}</RallyPlayNotice>}\n\n      {retry && <RallyPlayNotice icon=\"🔁\" tone=\"gold\">{t('rally.play.q.retryBody', lang)}</RallyPlayNotice>}\n      <RallyButton size=\"lg\" full disabled={!ready || busy} onClick={submit}\n        ariaLabel={t(info ? 'rally.play.q.infoNext' : 'rally.play.q.submit', lang)}>\n        {busy ? t('rally.play.q.sending', lang) : t(info ? 'rally.play.q.infoNext' : 'rally.play.q.submit', lang)}\n      </RallyButton>\n      {!info && !retry && (teamSize || 0) > 1 && (\n        <div style={{ textAlign: 'center', fontFamily: RAL_FONT_B, fontSize: 14, lineHeight: 1.45, color: 'var(--ink-3)', marginTop: -4 }}>\n          {t('rally.play.q.teamRule', lang)}\n        </div>\n      )}\n      {retry && onCancel && (\n        <div style={{ display: 'flex', justifyContent: 'center', marginTop: -6 }}>\n          <RallyPlayLink onClick={onCancel}>{t('rally.play.q.retryCancel', lang)}</RallyPlayLink>\n        </div>\n      )}\n      <RallyPlayPortal>\n        <RallyConfirm open={confirmOpen} lang={lang}\n          title={t('rally.play.q.confirmTitle', lang)}\n          body={rallyPlayT('rally.play.q.confirmBody', lang, { answer: rallyPlayFmtValue(puzzle, value, lang) || '?' })}\n          confirmLabel={t('rally.play.q.confirmSend', lang)} cancelLabel={t('rally.ui.cancel', lang)}\n          onConfirm={send} onCancel={() => setConfirmOpen(false)} />\n      </RallyPlayPortal>\n    </React.Fragment>\n  );\n}\n\n// ── Ergebnis nach der Antwort ─────────────────────────────────────────────────\nfunction RallyPlayResult({ event, station, answer, players, me, lang, theme, isLast, onNext, canRetry, onRetry }) {\n  const second = (+answer.attempt || 1) >= 2;\n  useRallyPlayScrollTop('r' + station.id + (second ? '-2' : ''));\n  const puzzle = station.puzzle;\n  const info = rallyPlayIsInfo(station);\n  const isEst = !info && puzzle.type === 'estimate';\n  const correct = info || isEst ? null : rallyPlayCheck(puzzle, answer.value, lang);\n  const pts = info || isEst ? 0 : rallyPlayPointsOf(puzzle, answer, lang);\n  const byOther = answer.playerId && answer.playerId !== me.id;\n  const author = byOther ? (players.find(p => p.id === answer.playerId) || {}).name : null;\n  const fact = station.kind === 'fact' ? rallyPlayFact(station.factId, lang) : null;\n  const [more, setMore] = React.useState(false);\n  // Solange der zweite Versuch möglich ist, bleibt die Lösung verdeckt (sonst wäre er geschenkt)\n  const [revealed, setRevealed] = React.useState(false);\n  const retryOpen = !!canRetry && !revealed;\n\n  const look = info ? { icon: '✓', bg: 'var(--teal, #00C2A8)', title: 'rally.play.r.info' }\n    : isEst ? { icon: '🎯', bg: 'var(--coin)', title: 'rally.play.r.estimate' }\n    : correct ? { icon: '✓', bg: 'var(--cat-nat, #22C55E)', title: 'rally.play.r.correct' }\n    : { icon: '✗', bg: 'var(--stamp)', title: 'rally.play.r.wrong' };\n\n  let sub = null;\n  if (isEst) sub = t('rally.play.r.estimateSub', lang);\n  else if (!info && correct) sub = t(second ? 'rally.play.r.pointsRetry' : answer.hintsUsed ? 'rally.play.r.pointsHint' : 'rally.play.r.points', lang).replace('{n}', pts);\n  else if (!info) sub = t(retryOpen ? 'rally.play.r.retryOffer' : 'rally.play.r.noPoints', lang);\n\n  return (\n    <React.Fragment>\n      <RallyCard padding={20} style={{ textAlign: 'center', animation: 'rallyPopIn 0.25s ease-out' }}>\n        <div aria-hidden=\"true\" className=\"rally-anim\" style={{\n          width: 76, height: 76, margin: '0 auto', borderRadius: '50%', background: look.bg,\n          color: look.bg === 'var(--coin)' ? '#3D2F00' : '#FFFFFF',\n          display: 'flex', alignItems: 'center', justifyContent: 'center',\n          fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 40, lineHeight: 1,\n          boxShadow: '0 4px 0 rgba(0,0,0,0.16)',\n        }}>{look.icon}</div>\n        {second && !info && (\n          <div style={{ marginTop: 12, fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 11, letterSpacing: 1.2, textTransform: 'uppercase', color: 'var(--ink-2)' }}>\n            🔁 {t('rally.play.r.secondTry', lang)}\n          </div>\n        )}\n        <RallyPlayTitle size={28} style={{ marginTop: second && !info ? 4 : 14 }}>{t(look.title, lang)}</RallyPlayTitle>\n        {sub && <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 17, color: 'var(--ink-2)', marginTop: 6 }}>{sub}</div>}\n        {byOther && (\n          <div style={{ marginTop: 12, display: 'inline-flex', alignItems: 'center', gap: 6, padding: '6px 12px', borderRadius: 999, background: 'var(--surface-2)', fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 14, color: 'var(--ink-2)' }}>\n            <span aria-hidden=\"true\">👥</span>\n            {t(info ? 'rally.play.r.byMateInfo' : 'rally.play.r.byMate', lang).replace('{name}', author || t('rally.play.r.someone', lang))}\n          </div>\n        )}\n      </RallyCard>\n\n      {!info && (\n        <RallyCard padding={16}>\n          <div style={{ fontFamily: RAL_FONT_B, fontSize: 15, lineHeight: 1.5, color: 'var(--ink-2)' }}>{puzzle.question}</div>\n          <div style={{ display: 'flex', flexDirection: 'column', gap: 10, marginTop: 12 }}>\n            <div>\n              <RallyKicker color=\"var(--ink-2)\">{t('rally.play.r.yours', lang)}</RallyKicker>\n              <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 20, marginTop: 2, overflowWrap: 'anywhere' }}>\n                {rallyPlayFmtValue(puzzle, answer.value, lang) || '?'}\n              </div>\n            </div>\n            {/* Innerhalb der Toleranz richtig, aber nicht exakt: genauen Wert zeigen (299 statt 306 Stufen) */}\n            {correct && puzzle.type === 'number' && RallyEngine.parseNumber(answer.value, lang) !== RallyEngine.parseNumber(puzzle.answer, lang) && (\n              <div>\n                <RallyKicker color=\"var(--ink-2)\">{t('rally.play.r.exact', lang)}</RallyKicker>\n                <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 20, marginTop: 2, overflowWrap: 'anywhere' }}>\n                  {rallyPlayFmtValue(puzzle, puzzle.answer, lang)}\n                </div>\n              </div>\n            )}\n            {correct === false && !retryOpen && (\n              <div>\n                <RallyKicker color=\"var(--ink-2)\">✓ {t('rally.play.r.right', lang)}</RallyKicker>\n                <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 20, marginTop: 2, overflowWrap: 'anywhere' }}>\n                  {rallyPlayCorrectText(puzzle, lang)}\n                </div>\n              </div>\n            )}\n          </div>\n          {!isEst && !retryOpen && puzzle.explanation && (\n            <RallyPlayProse lang={lang} style={{ marginTop: 12, fontSize: 15, color: 'var(--ink-2)' }}>{puzzle.explanation}</RallyPlayProse>\n          )}\n        </RallyCard>\n      )}\n\n      {station.note && !retryOpen && (\n        <RallyPlayNotice icon=\"💌\" tone=\"gold\">\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900 }}>{(event.tour && event.tour.organizerName)\n            ? t('rally.play.r.noteFrom', lang).replace('{name}', event.tour.organizerName)\n            : t('rally.play.r.note', lang)}</div>\n          <div style={{ marginTop: 4, whiteSpace: 'pre-line' }}>{station.note}</div>\n        </RallyPlayNotice>\n      )}\n\n      {fact && !retryOpen && (fact.text || fact.titel) && (\n        <RallyCard padding={18} accent=\"var(--teal, #00C2A8)\">\n          <RallyKicker color=\"var(--teal, #00C2A8)\">{t('rally.play.r.fact', lang)}</RallyKicker>\n          {fact.titel && <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 19, lineHeight: 1.25, marginTop: 4 }}>{fact.titel}</div>}\n          {fact.text && <RallyPlayProse lang={lang} style={{ marginTop: 8 }}>{fact.text}</RallyPlayProse>}\n          {fact.text2 && (more\n            ? <RallyPlayProse lang={lang} style={{ marginTop: 10 }}>{fact.text2}</RallyPlayProse>\n            : <RallyPlayLink onClick={() => setMore(true)} style={{ padding: '8px 0' }}>{t('rally.play.r.more', lang)}</RallyPlayLink>)}\n        </RallyCard>\n      )}\n\n      {retryOpen ? (\n        <React.Fragment>\n          <RallyButton size=\"lg\" full icon=\"🔁\" onClick={onRetry}>{t('rally.play.r.retry', lang)}</RallyButton>\n          <RallyButton variant=\"ghost\" full onClick={() => setRevealed(true)}>{t('rally.play.r.showSolution', lang)}</RallyButton>\n        </React.Fragment>\n      ) : (\n        <RallyButton size=\"lg\" full onClick={onNext} icon={isLast ? '🏁' : '➜'}>\n          {t(isLast ? 'rally.play.r.toFinish' : 'rally.play.r.next', lang)}\n        </RallyButton>\n      )}\n    </React.Fragment>\n  );\n}\n\n// ── Im Ziel: warten auf die anderen ───────────────────────────────────────────\nfunction RallyPlayAtFinish({ event, answers, finishes, teamNo, lang, theme, single, onFinaleNow }) {\n  useRallyPlayScrollTop('fin');\n  if (single) {\n    return (\n      <RallyCard padding={20} style={{ textAlign: 'center' }}>\n        <div aria-hidden=\"true\" style={{ fontSize: 52, lineHeight: 1 }}>🏁</div>\n        <RallyPlayTitle size={28} style={{ marginTop: 10 }}>{t('rally.play.fin.title', lang)}</RallyPlayTitle>\n        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 10, marginTop: 12 }}>\n          <RallyPlayPulseDot color=\"var(--coin)\" />\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 17, color: 'var(--ink-2)' }}>{t('rally.quick.fin.single', lang)}</div>\n        </div>\n      </RallyCard>\n    );\n  }\n  const fin = {};\n  (finishes || []).forEach(f => { fin[f.team] = true; });\n  const teams = event.teams || [];\n  const waiting = teams.filter(tm => !fin[tm.no]).length;\n  const standings = RallyEngine.standings(event, answers, finishes, { revealEstimates: false });\n  return (\n    <React.Fragment>\n      <RallyCard padding={20} style={{ textAlign: 'center' }}>\n        <div aria-hidden=\"true\" style={{ fontSize: 52, lineHeight: 1 }}>🏁</div>\n        <RallyPlayTitle size={28} style={{ marginTop: 10 }}>{t('rally.play.fin.title', lang)}</RallyPlayTitle>\n        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 10, marginTop: 12 }}>\n          {waiting > 0 && <RallyPlayPulseDot color=\"var(--coin)\" />}\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 17, color: 'var(--ink-2)' }}>\n            {waiting > 0 ? t(waiting === 1 ? 'rally.play.fin.waitingOne' : 'rally.play.fin.waiting', lang) : t('rally.play.fin.allIn', lang)}\n          </div>\n        </div>\n        <RallyPlayBody style={{ marginTop: 8, fontSize: 15 }}>{t('rally.play.fin.body', lang)}</RallyPlayBody>\n      </RallyCard>\n\n      <RallyCard padding={16}>\n        <RallyKicker color=\"var(--ink-2)\">{t('rally.play.fin.teams', lang)}</RallyKicker>\n        <div style={{ display: 'flex', flexDirection: 'column', gap: 10, marginTop: 10 }}>\n          {teams.map(tm => {\n            const p = RallyEngine.teamProgress(event, tm.no, answers);\n            return (\n              <div key={tm.no} style={{ display: 'flex', alignItems: 'center', gap: 10, justifyContent: 'space-between' }}>\n                <RallyTeamBadge team={rallyPlayTeam(event, tm.no, lang)} size=\"sm\" lang={lang} style={{ maxWidth: '60%' }} />\n                <span style={{\n                  fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 13,\n                  color: fin[tm.no] ? 'var(--ink)' : 'var(--ink-2)',\n                }}>\n                  {fin[tm.no] ? '✓ ' + t('rally.play.fin.in', lang)\n                    : t('rally.play.fin.onWay', lang).replace('{done}', p.done).replace('{total}', p.total)}\n                </span>\n              </div>\n            );\n          })}\n        </div>\n      </RallyCard>\n\n      <div>\n        <RallyKicker style={{ marginBottom: 8 }}>{t('rally.play.board.title', lang)}</RallyKicker>\n        <RallyPlayStandings event={event} rows={standings} lang={lang} highlightTeam={teamNo} hideEstimates />\n        {rallyPlayHasEst(event) && <RallyPlayNotice icon=\"🔒\" style={{ marginTop: 12 }}>{t('rally.play.board.hidden', lang)}</RallyPlayNotice>}\n      </div>\n\n      {onFinaleNow && (\n        <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n          <RallyPlayNotice icon=\"⏱️\">{t('rally.quick.board.auto', lang)}</RallyPlayNotice>\n          <RallyButton variant=\"secondary\" full icon=\"🏁\" onClick={onFinaleNow}>{t('rally.quick.board.finale', lang)}</RallyButton>\n        </div>\n      )}\n    </React.Fragment>\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// 6. Nach dem Spiel\n// ══════════════════════════════════════════════════════════════════════════════\n// Konto-Hinweis + Fertig-Knopf (auch für das Ein-Team-Ergebnis im Schnellstart)\nfunction RallyPlayEndExtras({ event, answers, finishes, teamNo, userId, lang, onSignup, onDone }) {\n  const rows = event ? RallyEngine.standings(event, answers || [], finishes || [], { revealEstimates: true }) : [];\n  const mine = rows.find(r => +r.team === +teamNo) || (rows.length === 1 ? rows[0] : null);\n  const coins = useRallyPlayCoins(event, mine ? mine.total : 0);\n  const facts = event && teamNo != null ? rallyPlayFactCount(event, answers, teamNo) : 0;\n  let signupTitle = t('rally.play.end.signupTitle', lang);\n  if (coins > 0) {\n    signupTitle = rallyPlayT(facts > 1 ? 'rally.play.end.signupCoinsFacts' : facts === 1 ? 'rally.play.end.signupCoinsFact' : 'rally.play.end.signupCoins',\n      lang, { coins: ralPlural(coins, 'rally.play.end.coinsWord', lang), facts });\n  }\n  return (\n    <React.Fragment>\n      {coins > 0 && (\n        <div role=\"status\" style={{\n          padding: '14px 16px', borderRadius: 16, textAlign: 'center',\n          background: 'var(--coin-soft)', border: '1px solid rgba(245,197,24,0.45)', color: 'var(--ink)',\n        }}>\n          <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 10, fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 20 }}>\n            <span aria-hidden=\"true\" style={{ fontSize: 24 }}>🪙</span>\n            {ralPlural(coins, 'rally.play.end.coins', lang)}\n          </div>\n          <div style={{ marginTop: 4, fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 13.5, lineHeight: 1.45, color: 'var(--ink-2)' }}>\n            {t('rally.play.end.coinsNote', lang)}\n          </div>\n        </div>\n      )}\n      {!userId && (\n        <RallyCard padding={18} accent=\"var(--coin)\">\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 19, lineHeight: 1.25 }}>{signupTitle}</div>\n          <RallyPlayBody style={{ marginTop: 6, fontSize: 15 }}>{t('rally.play.end.signupBody', lang)}</RallyPlayBody>\n          <RallyButton variant=\"gold\" size=\"lg\" full style={{ marginTop: 14 }} onClick={() => onSignup && onSignup()}>\n            {t('rally.play.end.signup', lang)}\n          </RallyButton>\n        </RallyCard>\n      )}\n      <RallyButton size=\"lg\" full variant={userId ? 'primary' : 'ghost'} onClick={onDone}>{t('rally.play.end.done', lang)}</RallyButton>\n    </React.Fragment>\n  );\n}\n\nfunction RallyPlayEnd({ event, answers, finishes, teamNo, team, lang, theme, userId, onSignup, onDone, extra }) {\n  const standings = RallyEngine.standings(event, answers, finishes, { revealEstimates: true });\n  const mine = standings.find(r => +r.team === +teamNo) || null;\n  const n = standings.length;\n  const quiz = (event.tour.stations || []).filter(s => s.puzzle && s.puzzle.type !== 'estimate').length;\n  const hasEst = rallyPlayHasEst(event);\n  const out = !!mine && (mine.disqualified || mine.rank == null);\n  const speedOn = rallyPlaySpeedOn(event);\n  const noBonus = mine && speedOn && !out && mine.finishedAt && !mine.speed ? rallyPlayNoBonusKey(mine) : null;\n  const signed = (v) => (v > 0 ? '+' : v < 0 ? '−' : '') + rallyFmtNum(Math.abs(v), lang, 0);\n  return (\n    <React.Fragment>\n      <div style={{\n        borderRadius: 22, padding: '22px 18px', textAlign: 'center', color: '#FFFFFF',\n        background: 'linear-gradient(135deg, var(--stamp), var(--primary-lt))', boxShadow: '0 4px 0 var(--stamp-deep)',\n      }}>\n        <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 11, letterSpacing: 1.5, textTransform: 'uppercase', opacity: 0.92 }}>\n          {t('rally.play.end.kicker', lang)}\n        </div>\n        {team && <div style={{ marginTop: 12 }}><RallyTeamBadge team={team} size=\"lg\" lang={lang} /></div>}\n        {mine && out ? (\n          <React.Fragment>\n            <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 32, lineHeight: 1.1, marginTop: 14 }}>\n              {t('rally.play.end.out', lang)}\n            </div>\n            <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 16, opacity: 0.95, marginTop: 6 }}>\n              {t('rally.play.end.outBody', lang)}\n            </div>\n            <div style={{ fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 24, marginTop: 12, opacity: 0.9 }}>\n              {ralPlural(mine.total, 'rally.play.end.points', lang)}\n            </div>\n          </React.Fragment>\n        ) : mine ? (\n          <React.Fragment>\n            <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 40, lineHeight: 1.05, marginTop: 14 }}>\n              {mine.rank === 1 ? '🏆 ' : ''}{t('rally.play.end.rank', lang).replace('{rank}', mine.rank)}\n            </div>\n            <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 16, opacity: 0.95, marginTop: 4 }}>\n              {mine.rank === 1 ? t('rally.play.end.won', lang) : ralPlural(n, 'rally.play.end.of', lang)}\n            </div>\n            <div style={{ fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 28, marginTop: 12 }}>\n              {ralPlural(mine.total, 'rally.play.end.points', lang)}\n            </div>\n          </React.Fragment>\n        ) : (\n          <RallyPlayTitle size={26} style={{ color: '#FFFFFF', marginTop: 12 }}>{t('rally.play.end.thanks', lang)}</RallyPlayTitle>\n        )}\n      </div>\n\n      {mine && (\n        <div style={{ display: 'flex', gap: 8 }}>\n          <RallyPlayStat value={mine.correct + '/' + quiz} label={t('rally.play.end.correct', lang)} />\n          {hasEst && <RallyPlayStat value={mine.estimate} label={t('rally.play.end.estimate', lang)} tone=\"gold\" />}\n          {speedOn && !out && <RallyPlayStat value={mine.speed} label={t('rally.play.end.speed', lang)} />}\n          {!!mine.adjust && <RallyPlayStat value={signed(mine.adjust)} label={t('rally.play.end.adjust', lang)} />}\n        </div>\n      )}\n      {noBonus && <RallyPlayNotice icon=\"ℹ️\">{t(noBonus, lang)}</RallyPlayNotice>}\n\n      <div>\n        <RallyKicker style={{ marginBottom: 8 }}>{t('rally.play.end.board', lang)}</RallyKicker>\n        <RallyPlayStandings event={event} rows={standings} lang={lang} highlightTeam={teamNo} hideEstimates={!hasEst} />\n      </div>\n\n      {extra}\n      <RallyPlayEndExtras event={event} answers={answers} finishes={finishes} teamNo={teamNo}\n        userId={userId} lang={lang} onSignup={onSignup} onDone={onDone} />\n    </React.Fragment>\n  );\n}\n\nwindow.RallyPlay = RallyPlay;\n"],
  "mappings": "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",
  "names": ["dev", "v", "event", "name", "S", "nm", "r", "n", "user", "key", "lang", "vars", "s", "k", "E", "puzzle", "value", "answer", "points", "text", "start", "de", "en", "isHost", "host", "c", "err", "code", "no", "tm", "x", "row", "lim", "answers", "team", "stationId", "best", "a", "at", "bt", "factId", "f", "p", "clean", "station", "unit", "digits", "base", "tol", "tour", "setHost", "id", "owner", "quick", "alive", "finishes", "busy", "lastTry", "evRef", "finRef", "active", "check", "ev", "e", "iv", "teamNo", "me", "players", "showToast", "ready", "seen", "last", "rows", "keyOf", "fresh", "stations", "mateRetry", "st", "ok", "other", "pr", "single", "onGo", "names", "next", "first", "teamName", "coins", "ended", "withEstimates", "est", "sum", "children", "size", "style", "icon", "tone", "pal", "onClick", "color", "label", "highlightTeam", "hideEstimates", "speedOn", "signed", "mine", "out", "parts", "noBonus", "total", "toTop", "overlays", "scrollKey", "ref", "theme", "userId", "userPosition", "currentCity", "initialCode", "onExit", "onSignup", "code0", "setActive", "joinCode", "setJoinCode", "lateJoin", "setLateJoin", "onJoined", "player", "late", "clearActive", "exit", "rejoin", "setCode", "found", "setFound", "setBusy", "setErr", "setName", "suggestName", "setTeam", "foundPlayers", "setFoundPlayers", "live", "nameRef", "pickName", "lookup", "raw", "ps", "meP", "join", "opts", "started", "self", "taken", "roster", "counts", "startLabel", "canJoin", "suggestLc", "showSuggest", "on", "tName", "inTeam", "onLeave", "onBack", "onDone", "onRejoin", "data", "loading", "error", "toast", "confirmLeave", "setConfirmLeave", "boardOpen", "setBoardOpen", "loadedOnce", "setLoadedOnce", "lateToldRef", "quickHost", "confirmFinale", "setConfirmFinale", "status", "Q", "lobbyCancel", "hasEst", "revealKey", "revealDone", "setRevealDone", "showReveal", "closeReveal", "leave", "finaleNow", "header", "body", "phaseKey", "quickSolo", "estCount", "Finale", "ceremony", "geo", "mates", "unassigned", "switchTeam", "onBoard", "onFinaleNow", "teamSize", "now", "mountedAt", "settings", "gate", "radius", "pos", "endsMs", "timeOver", "prog", "finished", "posRef", "lastSent", "send", "tNow", "added", "resultId", "setResultId", "resultAnswer", "setResultAnswer", "targetRef", "nextId", "retryId", "setRetryId", "retryUsed", "setRetryUsed", "tid", "onAnswered", "closeResult", "order", "_", "i", "after", "startRetry", "cancelRetry", "onRetryAnswered", "u", "stepOf", "forced", "setForced", "honest", "setHonest", "honestKeys", "setHonestKeys", "target", "targetKey", "dist", "accBonus", "near", "open", "gpsStuck", "force", "finishing", "setFinishing", "arrive", "remain", "pct", "banner", "ans", "answeredNow", "isLast", "canRetry", "h", "kind", "stepNo", "onArrive", "onTest", "onHonest", "isFinish", "loop", "quickLoop", "markers", "canArrive", "showFallback", "retry", "onCancel", "prevValue", "info", "choice", "setChoice", "setText", "hint", "setHint", "confirmOpen", "setConfirmOpen", "fact", "isNum", "prevChoice", "deOnly", "submit", "payload", "typeLabel", "infoText", "ownText", "tried", "onNext", "onRetry", "second", "isEst", "correct", "pts", "byOther", "author", "more", "setMore", "revealed", "setRevealed", "retryOpen", "look", "sub", "fin", "teams", "waiting", "standings", "facts", "signupTitle", "extra", "quiz"]
}
