@minicode-dev/chat 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +112 -5
  2. package/README.md +401 -312
  3. package/assets/sounds/effects/avalanche.mp3 +0 -0
  4. package/assets/sounds/racing/car_boost.mp3 +0 -0
  5. package/assets/sounds/racing/car_boost.ogg +0 -0
  6. package/assets/sounds/racing/car_bump.mp3 +0 -0
  7. package/assets/sounds/racing/car_bump.ogg +0 -0
  8. package/assets/sounds/racing/car_drift_loop.mp3 +0 -0
  9. package/assets/sounds/racing/car_drift_loop.ogg +0 -0
  10. package/assets/sounds/racing/car_engine_loop.mp3 +0 -0
  11. package/assets/sounds/racing/car_engine_loop.ogg +0 -0
  12. package/assets/sounds/racing/car_engine_start.mp3 +0 -0
  13. package/assets/sounds/racing/car_engine_start.ogg +0 -0
  14. package/assets/sounds/racing/countdown_beep.mp3 +0 -0
  15. package/assets/sounds/racing/countdown_beep.ogg +0 -0
  16. package/assets/sounds/racing/countdown_go.mp3 +0 -0
  17. package/assets/sounds/racing/countdown_go.ogg +0 -0
  18. package/assets/sounds/racing/final_lap.mp3 +0 -0
  19. package/assets/sounds/racing/final_lap.ogg +0 -0
  20. package/assets/sounds/racing/finish_line.mp3 +0 -0
  21. package/assets/sounds/racing/finish_line.ogg +0 -0
  22. package/assets/sounds/racing/lap_complete.mp3 +0 -0
  23. package/assets/sounds/racing/lap_complete.ogg +0 -0
  24. package/assets/sounds/racing/music_circuit.mp3 +0 -0
  25. package/assets/sounds/racing/music_circuit.ogg +0 -0
  26. package/assets/sounds/racing/music_final_lap.mp3 +0 -0
  27. package/assets/sounds/racing/music_final_lap.ogg +0 -0
  28. package/assets/sounds/racing/race_defeat.mp3 +0 -0
  29. package/assets/sounds/racing/race_defeat.ogg +0 -0
  30. package/assets/sounds/racing/race_victory.mp3 +0 -0
  31. package/assets/sounds/racing/race_victory.ogg +0 -0
  32. package/assets/sounds/tanks/barrel_explode.mp3 +0 -0
  33. package/assets/sounds/tanks/barrel_explode.ogg +0 -0
  34. package/assets/sounds/tanks/crate_break.mp3 +0 -0
  35. package/assets/sounds/tanks/crate_break.ogg +0 -0
  36. package/assets/sounds/tanks/health_pickup.mp3 +0 -0
  37. package/assets/sounds/tanks/health_pickup.ogg +0 -0
  38. package/assets/sounds/tanks/last_life.mp3 +0 -0
  39. package/assets/sounds/tanks/last_life.ogg +0 -0
  40. package/assets/sounds/tanks/life_lost.mp3 +0 -0
  41. package/assets/sounds/tanks/life_lost.ogg +0 -0
  42. package/assets/sounds/tanks/respawn.mp3 +0 -0
  43. package/assets/sounds/tanks/respawn.ogg +0 -0
  44. package/assets/sounds/tanks/shield_end.mp3 +0 -0
  45. package/assets/sounds/tanks/shield_end.ogg +0 -0
  46. package/assets/sounds/tanks/shield_loop.mp3 +0 -0
  47. package/assets/sounds/tanks/shield_loop.ogg +0 -0
  48. package/assets/sounds/tanks/wall_hit.mp3 +0 -0
  49. package/assets/sounds/tanks/wall_hit.ogg +0 -0
  50. package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js → BattleshipGameCard-8H-sBCsv.js} +146 -144
  51. package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js.map → BattleshipGameCard-8H-sBCsv.js.map} +1 -1
  52. package/dist/chunks/{ChatContext-DjIEifGY.js → ChatContext-CVW58bzC.js} +2 -2
  53. package/dist/chunks/{ChatContext-DjIEifGY.js.map → ChatContext-CVW58bzC.js.map} +1 -1
  54. package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js +1654 -0
  55. package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js.map +1 -0
  56. package/dist/chunks/{TanksGameCard-GrqmdwJ7.js → TanksGameCard-DnCufSH6.js} +168 -166
  57. package/dist/chunks/{TanksGameCard-GrqmdwJ7.js.map → TanksGameCard-DnCufSH6.js.map} +1 -1
  58. package/dist/chunks/TanksLiveGameCard-D_27Jomp.js +1274 -0
  59. package/dist/chunks/TanksLiveGameCard-D_27Jomp.js.map +1 -0
  60. package/dist/chunks/avalancheScene3d-CIE2WKQn.js +1300 -0
  61. package/dist/chunks/avalancheScene3d-CIE2WKQn.js.map +1 -0
  62. package/dist/chunks/cars-D1PM7mVD.js +340 -0
  63. package/dist/chunks/cars-D1PM7mVD.js.map +1 -0
  64. package/dist/chunks/connect4Sounds-BqEHULjv.js +235 -0
  65. package/dist/chunks/connect4Sounds-BqEHULjv.js.map +1 -0
  66. package/dist/chunks/connectionStore-DwgIUl30.js +13 -0
  67. package/dist/chunks/connectionStore-DwgIUl30.js.map +1 -0
  68. package/dist/chunks/createLiveScene-MTGRv8rx.js +758 -0
  69. package/dist/chunks/createLiveScene-MTGRv8rx.js.map +1 -0
  70. package/dist/chunks/createRaceScene-BiEtQsVs.js +306 -0
  71. package/dist/chunks/createRaceScene-BiEtQsVs.js.map +1 -0
  72. package/dist/chunks/{createTankScene-6asWHKFf.js → createTankScene-yhX6la27.js} +125 -123
  73. package/dist/chunks/{createTankScene-6asWHKFf.js.map → createTankScene-yhX6la27.js.map} +1 -1
  74. package/dist/chunks/decor-CyyCnmct.js +418 -0
  75. package/dist/chunks/decor-CyyCnmct.js.map +1 -0
  76. package/dist/chunks/fx-1ZwzmPWj.js +458 -0
  77. package/dist/chunks/fx-1ZwzmPWj.js.map +1 -0
  78. package/dist/chunks/fx-DhXerGyt.js +248 -0
  79. package/dist/chunks/fx-DhXerGyt.js.map +1 -0
  80. package/dist/chunks/gameStatus-BChd29yI.js +62 -0
  81. package/dist/chunks/gameStatus-BChd29yI.js.map +1 -0
  82. package/dist/chunks/games-Bl_8raG6.js +3681 -0
  83. package/dist/chunks/games-Bl_8raG6.js.map +1 -0
  84. package/dist/chunks/rolldown-runtime-CGnMp29N.js +10 -0
  85. package/dist/chunks/tank-DjEQ4FXF.js +553 -0
  86. package/dist/chunks/tank-DjEQ4FXF.js.map +1 -0
  87. package/dist/chunks/tanks-live-BcKmrhnV.js +261 -0
  88. package/dist/chunks/tanks-live-BcKmrhnV.js.map +1 -0
  89. package/dist/chunks/{tanksSounds-CUNDIOal.js → tanksSounds-DTnidbiq.js} +44 -12
  90. package/dist/chunks/tanksSounds-DTnidbiq.js.map +1 -0
  91. package/dist/chunks/track-BcnnpnAm.js +259 -0
  92. package/dist/chunks/track-BcnnpnAm.js.map +1 -0
  93. package/dist/chunks/util-DwI9bfS7.js +57 -0
  94. package/dist/chunks/util-DwI9bfS7.js.map +1 -0
  95. package/dist/index.js +822 -635
  96. package/dist/index.js.map +1 -1
  97. package/dist/styles.css +1 -1
  98. package/index.d.ts +3 -1
  99. package/package.json +1 -1
  100. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js +0 -1225
  101. package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js.map +0 -1
  102. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js +0 -1878
  103. package/dist/chunks/avalancheScene3d-Dnl2E3EA.js.map +0 -1
  104. package/dist/chunks/connect4Sounds-Cv0q31VW.js +0 -3245
  105. package/dist/chunks/connect4Sounds-Cv0q31VW.js.map +0 -1
  106. package/dist/chunks/createLiveScene-819NWv84.js +0 -365
  107. package/dist/chunks/createLiveScene-819NWv84.js.map +0 -1
  108. package/dist/chunks/fx-BNJvJYOu.js +0 -871
  109. package/dist/chunks/fx-BNJvJYOu.js.map +0 -1
  110. package/dist/chunks/gameStatus-Cu1Z8un9.js +0 -69
  111. package/dist/chunks/gameStatus-Cu1Z8un9.js.map +0 -1
  112. package/dist/chunks/tank-DIn6Jyt8.js +0 -605
  113. package/dist/chunks/tank-DIn6Jyt8.js.map +0 -1
  114. package/dist/chunks/tanksSounds-CUNDIOal.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TanksLiveGameCard-D_27Jomp.js","names":["_Fragment","__exportAll","damageDestructible","moveTank","isDestructibleAlive","validPosition","createTank","interpolatePose","useChatGames","advanceShell","generateMap","explodeBarrel","createArena","RULES","createPeerLink","decodeSignal","encodeSignal","ChatContext","GameSoundControls","connectionHint","ManualTurnDialog","connectionDiagnostics","startTanksLoop","stopTanksLoop","playTanksCue","handleSceneEvent","startTanksSounds","playOutcome","stopAllTanksLoops","getTanksSoundManager","LIVE_TIMING","finite","n","idValid","id","createLiveMatch","selfId","game","ids","initialTurnConfigured","iceServers","server","url","peerId","config","legacy","arena","maxLives","initialDestructibles","d","spawnTank","t","i","s","destructible","tanks","shells","events","input","time","sendAt","round","sequence","lives","shieldUntil","respawnAt","status","winner","destroyed","net","wasConnected","pendingResign","endReason","poses","lastPoseAt","lastPose","lastFire","seen","wantsRematch","me","other","notify","onChange","emit","send","link","e","remember","key","shieldLeft","snapshot","restoreDestructibles","respawnTank","fresh","loseLife","next","hostKill","w","killer","finish","hostDamage","dead","hits","dmg","reset","force","fire","tank","owner","shot","broadcast","receiveMove","data","x","z","yaw","turretYaw","speed","elapsed","previous","pose","keysOnly","keys","validLives","l","validExtras","ms","destructibleEvents","shellId","receiveEvent","isHost","hp","nextLives","validPlaying","validOver","local","wasDead","maybeRematch","chained","peerFactory","signaling","signal","text","scoped","frame","listener","previousPhase","state","resumed","dtMs","dt","renderTime","a","b","remaining","hz","hit","shell","result","blast","resolve","out","at","options","RAD_TO_DEG","num","value","fallback","arenaBounds","withSize","box","arenaObstacles","o","eventKind","event","shooterOf","list","found","best","bestD","tankById","selfTank","damageLevel","alive","wrapAngle","v","createSelfTracker","last","moving","turning","moveIdle","turnIdle","hull","turret","isMoving","moveSpeed","turnSpeed","holdMs","isTurning","soundEventsFor","outcomeFor","render","MAP_NAMES","MAP_ICONS","isMapArena","mapName","mapObstacles","mapDestructibles","brokenDestructibles","indexOfTank","livesOf","shieldOf","SELF_ONLY","liveCuesFor","kind","target","mine","MAP_2D","SHAPE_2D","DECOR_2D","createLiveScene2d","canvas","container","ctx","bounds","map","colors","shapes","crates","decor","clock","h","scale","ox","oz","resize","dpr","ro","nx","ny","broken","c","shield","TanksLiveGameCard_exports","TanksLiveGameCard_default","act","type","stopInput","RESPAWN_MS","arenaOf","Hearts","total","max","label","connectionText","manual","prolonged","TanksLiveGameCard","rtcOptions","useContext","gameKey","suspendedRef","useRef","suspended","stage","match","renderer","view","setView","useState","error","setError","prefer2d","setPrefer2d","mode","setMode","turnOpen","setTurnOpen","waitingMs","setWaitingMs","connected","useEffect","started","timer","active","setArena","disposed","scene","createLiveScene","published","outcome","tracker","session","currentUserId","shieldOn","clear","down","up","host","visibility","tick","now","paused","sound","name","own","wantShield","ownIndex","respawnIn","nextOutcome","guest","over","configuring","connectionProblem","currentMap","heartsMax","showHearts","respawnSeconds","routeText","applyTurn","json","aim","rect","ground","hold","field","onMinimize","onDismiss","CheckCircle2","AlertTriangle","Loader2","Settings2","Link2","Fragment","r","memo"],"sources":["../../src/games/tanks-live/net/createLiveMatch.js","../../src/games/tanks-live/scene/liveView.js","../../src/games/tanks-live/scene/createLiveScene2d.js","../../src/games/tanks-live/TanksLiveGameCard.jsx"],"sourcesContent":["import { decodeSignal, encodeSignal } from '../../../net/webrtc/protocol.js';\nimport { createPeerLink } from '../../../net/webrtc/createPeerLink.js';\nimport { RULES, createArena, createTank, moveTank, advanceShell, validPosition, interpolatePose, damageDestructible, explodeBarrel, isDestructibleAlive } from '../logic/simulation.js';\nimport { generateMap } from '../logic/maps.js';\n\nexport const LIVE_TIMING = Object.freeze({ respawnMs: 3000, shieldMs: 2000 });\n\nconst finite = n => typeof n === 'number' && Number.isFinite(n);\nconst idValid = id => typeof id === 'string' && id.length > 0 && id.length < 160;\nexport function createLiveMatch({ game, selfId, isHost = String(selfId) === String(game.hostId), signaling, onChange = () => {}, peerFactory = createPeerLink, iceServers, iceTransportPolicy, RTCPeerConnectionImpl } = {}) {\n selfId = String(selfId);\n const ids = [String(game.hostId), String(game.guestId)];\n if (!ids.includes(selfId) || ids[0] === ids[1]) throw new Error('Invalid live match players');\n const initialTurnConfigured = (iceServers || []).some(server => [server.urls].flat().some(url => /^turns?:/i.test(String(url))));\n const peerId = ids.find(id => id !== selfId);\n // Legacy match (no liveConfig): meadow createArena() and 1 life, byte-identical wire behaviour to before.\n const config = game.liveConfig ?? null, legacy = !config;\n const arena = legacy ? createArena() : generateMap(config.mapId, config.seed);\n if (!legacy && arena.hash !== config.mapHash) throw new Error('El mapa no coincide con la invitación');\n const maxLives = legacy ? 1 : config.lives;\n if (![1, 3, 5].includes(maxLives)) throw new Error('Vidas inválidas');\n const initialDestructibles = (arena.destructibles || []).map(d => ({ id: d.id, hp: d.hp }));\n const spawnTank = (id, i) => { const t = createTank(id, i), s = arena.spawns?.[i]; if (s) Object.assign(t, { x: s.x, z: s.z, yaw: s.yaw, turretYaw: s.yaw }); return t; };\n const destructible = id => (arena.destructibles || []).find(d => d.id === id);\n let tanks = ids.map(spawnTank), shells = [], events = [], input = {}, time = 0, sendAt = 0, round = 0, sequence = 0;\n let lives = [maxLives, maxLives], shieldUntil = [0, 0], respawnAt = [null, null];\n let status = 'connecting', winner = null, destroyed = false, net = { phase: 'idle', rtt: null, route: null }, wasConnected = false, pendingResign = false, endReason = null;\n let poses = [], lastPoseAt = null, lastPose = null, lastFire = new Map(), seen = new Set(), wantsRematch = new Set();\n const me = () => tanks.find(t => t.id === selfId), other = () => tanks.find(t => t.id === peerId);\n const notify = () => { if (!destroyed) onChange({ status, winner, net }); };\n const emit = e => { events.push(e); if (events.length > 200) events.shift(); };\n const send = e => link.sendEvent({ ...e, g: game.gameId, r: round });\n const remember = key => { seen.add(key); if (seen.size > 2048) seen.delete(seen.values().next().value); };\n const shieldLeft = i => Math.max(0, Math.round(shieldUntil[i] - time));\n const snapshot = () => ({ k: 'snapshot', hp: tanks.map(t => t.hp), status, winner, reason: endReason,\n ...(legacy ? {} : { lives: [...lives], shield: [0, 1].map(shieldLeft), destructibles: (arena.destructibles || []).map(d => ({ id: d.id, hp: d.hp })) }) });\n function restoreDestructibles() { (arena.destructibles || []).forEach((d, i) => { d.hp = initialDestructibles[i].hp; d.alive = true; }); }\n // Puts tank i back on its own spawn with full HP and the spawn shield. Both peers call it (host decides when).\n function respawnTank(i) {\n const fresh = spawnTank(ids[i], i); Object.assign(tanks[i], { x: fresh.x, z: fresh.z, yaw: fresh.yaw, turretYaw: fresh.turretYaw, speed: 0, hp: 100, alive: true });\n respawnAt[i] = null; shieldUntil[i] = time + LIVE_TIMING.shieldMs;\n if (ids[i] === peerId) { poses = []; lastPose = null; lastPoseAt = null; }\n emit({ k: 'respawn', target: ids[i], x: fresh.x, z: fresh.z, shield: LIVE_TIMING.shieldMs });\n }\n // Applies a life loss already decided (host) or announced (guest). Returns remaining lives.\n function loseLife(i, next) {\n lives[i] = next; emit({ k: 'life_lost', target: ids[i], lives: [...lives] });\n if (next === 1 && maxLives > 1) emit({ k: 'last_life', target: ids[i] });\n respawnAt[i] = next > 0 ? time + LIVE_TIMING.respawnMs : null;\n }\n // Host only: tank i reached 0 HP. Legacy sends exactly destroyed + over, as before.\n function hostKill(i, killer) {\n if (!legacy) { loseLife(i, Math.max(0, lives[i] - 1)); send({ k: 'life_lost', target: ids[i], lives: [...lives] }); }\n else lives[i] = 0;\n const e = { k: 'destroyed', target: ids[i] }; send(e); emit(e);\n if (lives[i] === 0 && status === 'playing') { const w = killer !== ids[i] ? killer : ids[1 - i]; send({ k: 'over', winner: w }); finish(w); }\n }\n // Host only: applies damage to several tanks, then resolves deaths (so a double kill is consistent).\n function hostDamage(hits, killer) {\n const dead = [];\n for (const { id, dmg } of hits) { const i = ids.indexOf(id); if (i < 0 || !tanks[i].alive || shieldUntil[i] > time) continue; tanks[i].hp = Math.max(0, tanks[i].hp - dmg); tanks[i].alive = tanks[i].hp > 0; if (!tanks[i].alive) dead.push(i); }\n return () => dead.forEach(i => hostKill(i, killer));\n }\n function reset() {\n tanks = ids.map(spawnTank); shells = []; lives = [maxLives, maxLives]; shieldUntil = [0, 0]; respawnAt = [null, null]; restoreDestructibles(); poses = []; lastPoseAt = null; lastPose = null; lastFire.clear(); seen.clear(); wantsRematch.clear(); pendingResign = false; endReason = null; winner = null; status = net.phase === 'connected' ? 'playing' : 'connecting'; emit({ k: 'rematch' }); notify();\n }\n function finish(id, force = false) { if (status === 'over' && (!force || winner === id)) return; status = 'over'; winner = id; shells = []; link.clearManualTurn?.(); emit({ k: 'over', winner }); notify(); }\n function fire(owner, e, broadcast) {\n if (status !== 'playing' || !idValid(e.id) || seen.has(e.id)) return false;\n const tank = tanks.find(t => t.id === owner);\n if (!tank?.alive || time - (lastFire.get(owner) ?? -Infinity) < RULES.reloadMs - 20) return false;\n if (![e.x, e.z, e.yaw].every(finite) || Math.hypot(e.x - (owner === peerId && lastPose ? lastPose.x : tank.x), e.z - (owner === peerId && lastPose ? lastPose.z : tank.z)) > 6) return false;\n remember(e.id);\n lastFire.set(owner, time);\n const shot = { ...e, k: 'fire', owner, x: e.x + Math.cos(e.yaw) * 2.8, z: e.z + Math.sin(e.yaw) * 2.8, y: 1.4, age: 0 };\n shells.push(shot); emit(shot); if (broadcast) send({ ...e, k: 'fire' }); return true;\n }\n function receiveMove(data) {\n if (destroyed || status !== 'playing' || data?.g !== game.gameId || data.r !== round || !Array.isArray(data.p) || data.p.length !== 5 || !data.p.every(finite)) return;\n const [x, z, yaw, turretYaw, speed] = data.p;\n if (!other().alive || !validPosition(x, z, { ...arena, destructibles: [] }) || Math.abs(speed) > RULES.speed + 0.1 || Math.abs(yaw) > 1e6 || Math.abs(turretYaw) > 1e6) return;\n const elapsed = lastPoseAt === null ? 0.1 : Math.max(0, (time - lastPoseAt) / 1000);\n const previous = lastPose || other();\n if (Math.hypot(x - previous.x, z - previous.z) > RULES.speed * elapsed + 3) return;\n const pose = { ...other(), x, z, yaw, turretYaw, speed };\n lastPose = pose; lastPoseAt = time; poses.push({ time, pose }); if (poses.length > 30) poses.shift();\n }\n const keysOnly = (e, keys) => Object.keys(e).every(key => keys.includes(key));\n const validLives = l => Array.isArray(l) && l.length === 2 && l.every(n => Number.isInteger(n) && n >= 0 && n <= maxLives);\n const validExtras = e => validLives(e.lives) && Array.isArray(e.shield) && e.shield.length === 2 && e.shield.every(ms => Number.isInteger(ms) && ms >= 0 && ms <= LIVE_TIMING.shieldMs)\n && Array.isArray(e.destructibles) && e.destructibles.length === initialDestructibles.length\n && e.destructibles.every((d, i) => d && keysOnly(d, ['id', 'hp']) && d.id === initialDestructibles[i].id && Number.isInteger(d.hp) && d.hp >= 0 && d.hp <= initialDestructibles[i].hp);\n // Render events after a destructible changed (both peers).\n function destructibleEvents(d, shellId, x, z) {\n emit({ k: 'destructible_hit', id: shellId, target: d.id, kind: d.kind, hp: d.hp, x, z });\n if (d.hp === 0 && d.kind === 'crate') emit({ k: 'crate_break', id: d.id, x: d.x, z: d.z });\n }\n function receiveEvent(e) {\n if (destroyed || !e || e.g !== game.gameId || !Number.isInteger(e.r)) return;\n if (e.k === 'round' && !isHost && status === 'over' && wantsRematch.has(selfId) && e.r === round + 1) { round = e.r; reset(); return; }\n if (e.r !== round) return;\n if (e.k === 'sync' && isHost) { send(snapshot()); return; }\n if (e.k === 'snapshot' && !isHost && Array.isArray(e.hp) && e.hp.length === 2 && e.hp.every(hp => Number.isInteger(hp) && hp >= 0 && hp <= 100)) {\n if (!legacy && !validExtras(e)) return;\n const nextLives = legacy ? lives : e.lives;\n const validPlaying = e.status === 'playing' && e.winner === null && e.hp.every((hp, i) => hp > 0 || (!legacy && nextLives[i] > 0));\n const validOver = e.status === 'over' && ids.includes(e.winner) && ((e.hp[1 - ids.indexOf(e.winner)] === 0 && nextLives[1 - ids.indexOf(e.winner)] === (legacy ? lives[1 - ids.indexOf(e.winner)] : 0)) || e.reason === 'resigned');\n if (!validPlaying && !validOver) return;\n if (!legacy) {\n e.destructibles.forEach((d, i) => { const local = arena.destructibles[i]; local.hp = d.hp; local.alive = d.hp > 0; });\n tanks.forEach((t, i) => { const wasDead = t.hp === 0; lives[i] = e.lives[i]; if (wasDead && e.hp[i] > 0) respawnTank(i); shieldUntil[i] = e.shield[i] ? time + e.shield[i] : 0; if (e.hp[i] === 0 && lives[i] > 0 && respawnAt[i] === null) respawnAt[i] = time + LIVE_TIMING.respawnMs; });\n }\n tanks.forEach((t, i) => { t.hp = e.hp[i]; t.alive = t.hp > 0; });\n if (validOver) { pendingResign = false; endReason = e.reason; finish(e.winner, true); }\n return;\n }\n if (e.k === 'resign') { endReason = 'resigned'; finish(selfId, isHost); if (isHost) send(snapshot()); return; }\n if (e.k === 'rematch' && status === 'over') { wantsRematch.add(peerId); maybeRematch(); return; }\n if (status !== 'playing') return;\n if (e.k === 'fire') fire(peerId, e, false);\n if (!isHost && e.k === 'hit' && idValid(e.id) && !seen.has(`hit:${e.id}`) && ids.includes(e.target) && Array.isArray(e.hp) && e.hp.length === 2 && e.hp.every((hp, i) => Number.isInteger(hp) && hp >= 0 && hp <= tanks[i].hp) && [e.x, e.z].every(finite)) {\n remember(`hit:${e.id}`); tanks.forEach((tank, i) => { tank.hp = e.hp[i]; tank.alive = tank.hp > 0; }); shells = shells.filter(s => s.id !== e.id); emit(e);\n }\n if (!isHost && e.k === 'destroyed' && ids.includes(e.target) && !seen.has(`destroyed:${e.target}:${lives[ids.indexOf(e.target)]}`) && tanks.find(t => t.id === e.target).hp === 0) { remember(`destroyed:${e.target}:${lives[ids.indexOf(e.target)]}`); emit(e); }\n if (!isHost && e.k === 'over' && ids.includes(e.winner) && tanks.find(t => t.id !== e.winner).hp === 0 && (legacy || lives[1 - ids.indexOf(e.winner)] === 0)) finish(e.winner);\n if (isHost || legacy) return;\n const i = ids.indexOf(e.target);\n // life_lost: exactly one life less for a destroyed tank; duplicates fail the monotonic check.\n if (e.k === 'life_lost' && i >= 0 && tanks[i].hp === 0 && validLives(e.lives) && e.lives[i] === lives[i] - 1 && e.lives[1 - i] === lives[1 - i]) loseLife(i, e.lives[i]);\n if (e.k === 'respawn' && i >= 0 && tanks[i].hp === 0 && lives[i] > 0 && keysOnly(e, ['k', 'target', 'g', 'r'])) respawnTank(i);\n if (e.k === 'destructible_hit' && idValid(e.id) && !seen.has(`dh:${e.id}`) && keysOnly(e, ['k', 'id', 'target', 'hp', 'x', 'z', 'g', 'r']) && [e.x, e.z].every(finite)) {\n const d = destructible(e.target);\n if (!isDestructibleAlive(d) || !Number.isInteger(e.hp) || e.hp < 0 || e.hp >= d.hp) return;\n remember(`dh:${e.id}`); d.hp = e.hp; d.alive = e.hp > 0; shells = shells.filter(s => s.id !== e.id); destructibleEvents(d, e.id, e.x, e.z);\n }\n if (e.k === 'barrel_explode' && keysOnly(e, ['k', 'target', 'chained', 'hp', 'g', 'r']) && !seen.has(`be:${e.target}`)) {\n const d = destructible(e.target), chained = e.chained === null ? null : destructible(e.chained);\n if (d?.kind !== 'barrel' || isDestructibleAlive(d) || (e.chained !== null && (chained?.kind !== 'barrel' || !isDestructibleAlive(chained) || chained === d))) return;\n if (!Array.isArray(e.hp) || e.hp.length !== 2 || !e.hp.every((hp, n) => Number.isInteger(hp) && hp >= 0 && hp <= tanks[n].hp)) return;\n remember(`be:${e.target}`); if (chained) { chained.hp = 0; chained.alive = false; }\n tanks.forEach((tank, n) => { tank.hp = e.hp[n]; tank.alive = tank.hp > 0; });\n emit({ k: 'barrel_explode', id: d.id, x: d.x, z: d.z, chained: chained ? { id: chained.id, x: chained.x, z: chained.z } : null, hp: [...e.hp] });\n }\n }\n // Scope negotiation itself: a finished card must never answer another game's hello.\n const scopedSignaling = signaling && {\n send(text) { const signal = decodeSignal(text); if (!signal) return Promise.reject(new Error('Invalid live signal')); const scoped = encodeSignal({ ...signal, liveGame: game.gameId }); return scoped ? signaling.send(scoped) : Promise.reject(new Error('Live signal too large')); },\n subscribe(listener) { return signaling.subscribe(frame => { const signal = decodeSignal(frame?.text); if (signal?.liveGame === game.gameId) listener(frame); }); },\n };\n const link = peerFactory({ configurationAuthority: isHost, signaling: scopedSignaling, selfId, peerId, roomId: game.roomId, iceServers, iceTransportPolicy, RTCPeerConnectionImpl, onMove: receiveMove, onEvent: receiveEvent, onChange(state) {\n const previousPhase = net.phase; net = state;\n if (state.phase === 'connected') { const resumed = wasConnected; wasConnected = true; if (status !== 'over') status = 'playing'; if (previousPhase !== 'connected') queueMicrotask(() => { if (!destroyed) { if (pendingResign) send({ k: 'resign' }); if (isHost && resumed) send(snapshot()); else if (!isHost) send({ k: 'sync' }); } }); }\n else if (status !== 'over') status = wasConnected ? 'disconnected' : 'connecting';\n notify();\n } });\n function maybeRematch() { if (isHost && wantsRematch.size === 2) { round++; send({ k: 'round' }); reset(); } }\n if (isHost) link.connect(); else link.setListening(true);\n return {\n setInput(next) { input = { ...next }; },\n step(dtMs) {\n if (destroyed) return;\n const elapsed = Math.max(0, Math.min(Number(dtMs) || 0, 100)); time += elapsed;\n if (status !== 'playing') return;\n const dt = elapsed / 1000;\n for (let i = 0; i < 2; i++) {\n if (shieldUntil[i] && time >= shieldUntil[i]) { shieldUntil[i] = 0; emit({ k: 'shield_end', target: ids[i] }); }\n if (isHost && respawnAt[i] !== null && time >= respawnAt[i] && lives[i] > 0) { respawnTank(i); send({ k: 'respawn', target: ids[i] }); }\n }\n const renderTime = time - 100;\n while (poses.length > 1 && poses[1].time <= renderTime) poses.shift();\n if (poses.length) { const a = poses[0], b = poses[1] || a; const pose = interpolatePose(a.pose, b.pose, b.time === a.time ? 1 : (renderTime - a.time) / (b.time - a.time)); for (const key of ['x', 'z', 'yaw', 'turretYaw', 'speed']) other()[key] = pose[key]; }\n for (let remaining = dt; remaining > 0; remaining -= 0.016) moveTank(me(), input, Math.min(remaining, 0.016), arena);\n if (input.fire) fire(selfId, { id: `${selfId}:${round}:${++sequence}`, x: me().x, z: me().z, yaw: me().turretYaw, t: time }, true);\n const hz = net.rtt > 250 || net.move?.lossPct > 15 ? 10 : net.rtt > 100 ? 15 : 20;\n if (time >= sendAt) { sendAt = time + 1000 / hz; const t = me(); link.sendMove({ g: game.gameId, r: round, p: [t.x, t.z, t.yaw, t.turretYaw, t.speed], t: time }); }\n shells = shells.filter(shell => {\n const hit = advanceShell(shell, dt, arena, tanks);\n if (!hit) return true;\n if (isHost && hit.target && status === 'playing' && shieldUntil[ids.indexOf(hit.target)] > time) emit({ k: 'impact', kind: 'shield', target: hit.target, x: shell.x, z: shell.z });\n else if (isHost && hit.target && status === 'playing') {\n const tank = tanks.find(t => t.id === hit.target); tank.hp = Math.max(0, tank.hp - RULES.damage); tank.alive = tank.hp > 0;\n const e = { k: 'hit', id: shell.id, target: tank.id, dmg: RULES.damage, hp: tanks.map(t => t.hp), x: shell.x, z: shell.z }; send(e); emit(e);\n if (!tank.alive) hostKill(ids.indexOf(tank.id), shell.owner);\n } else if (isHost && hit.kind === 'destructible' && status === 'playing') {\n const d = destructible(hit.id), result = damageDestructible(arena, hit.id, 1);\n send({ k: 'destructible_hit', id: shell.id, target: hit.id, hp: result.hp, x: shell.x, z: shell.z }); destructibleEvents(d, shell.id, shell.x, shell.z);\n if (result.destroyed && d.kind === 'barrel') {\n const blast = explodeBarrel(arena, d.id, tanks), resolve = hostDamage(blast.hits, shell.owner);\n const e = { k: 'barrel_explode', target: d.id, chained: blast.chained?.id ?? null, hp: tanks.map(t => t.hp) };\n send(e); emit({ k: 'barrel_explode', id: d.id, x: d.x, z: d.z, chained: blast.chained, hp: [...e.hp] }); resolve();\n }\n } else {\n emit({ k: 'impact', kind: hit.kind, x: shell.x, z: shell.z });\n if (hit.shape === 'rect') emit({ k: 'wall_hit', id: hit.id, kind: hit.obstacleKind, x: shell.x, z: shell.z });\n }\n return false;\n });\n },\n getRender() { const out = { arena, map: arena, maxLives, lives: [...lives], shield: [0, 1].map(shieldLeft), respawn: respawnAt.map(at => at === null ? null : Math.max(0, Math.round(at - time))),\n destructibles: (arena.destructibles || []).map(d => ({ id: d.id, kind: d.kind, x: d.x, z: d.z, r: d.r, hp: d.hp, alive: isDestructibleAlive(d) })), tanks: tanks.map(t => ({ ...t, self: t.id === selfId, reload: Math.min(1, (time - (lastFire.get(t.id) ?? -Infinity)) / RULES.reloadMs) })), shells: shells.map(s => ({ ...s })), events, status, winner, net: { ...net, turnConfigured: net.turnConfigured ?? initialTurnConfigured } }; events = []; return out; },\n configureTurn(config, options) {\n if (destroyed || status === 'over') return Promise.reject(new Error('La partida ya terminó.'));\n return link.configureTurn(config, options);\n },\n reconnect() { if (!destroyed && status !== 'over') { if (link.requestReconnect) link.requestReconnect(); else link.connect(); } },\n rematch() { if (!destroyed && status === 'over') { wantsRematch.add(selfId); send({ k: 'rematch' }); maybeRematch(); } },\n resign() { if (!destroyed && status !== 'over') { pendingResign = true; endReason = 'resigned'; send({ k: 'resign' }); finish(peerId); } },\n destroy() { if (destroyed) return; destroyed = true; link.destroy(); shells = []; poses = []; events = []; },\n };\n}\n","// Pure helpers shared by the live 3D/2D scenes and the card (no three, no DOM).\n// Render-state yaw is radians with forward = (cos yaw, sin yaw) on the x/z plane.\n\nexport const DEFAULT_ARENA_SIZE = 120;\nexport const RAD_TO_DEG = 180 / Math.PI;\n\nconst num = (value, fallback) => (Number.isFinite(value) ? value : fallback);\n\n/** Arena rectangle in world meters: explicit bounds, or `size` (corner origin unless `centered`). */\nexport function arenaBounds(arena) {\n const a = arena || {};\n const b = a.bounds || a;\n if (Number.isFinite(b.minX) && Number.isFinite(b.maxX) && Number.isFinite(b.minZ) && Number.isFinite(b.maxZ)) {\n return withSize({ minX: b.minX, minZ: b.minZ, maxX: b.maxX, maxZ: b.maxZ });\n }\n const w = num(a.width, num(a.size, DEFAULT_ARENA_SIZE));\n const d = num(a.depth, num(a.height, num(a.size, w)));\n const centered = a.centered === true || a.origin === 'center';\n return withSize(centered\n ? { minX: -w / 2, minZ: -d / 2, maxX: w / 2, maxZ: d / 2 }\n : { minX: 0, minZ: 0, maxX: w, maxZ: d });\n}\n\nfunction withSize(box) {\n return { ...box, width: box.maxX - box.minX, depth: box.maxZ - box.minZ, cx: (box.minX + box.maxX) / 2, cz: (box.minZ + box.maxZ) / 2 };\n}\n\n/** Circular obstacles [{ x, z, r, kind: 'tree'|'rock' }]. */\nexport function arenaObstacles(arena) {\n const list = arena?.obstacles || [];\n return list\n .filter((o) => Number.isFinite(o?.x) && Number.isFinite(o?.z))\n .map((o) => ({ x: o.x, z: o.z, r: num(o.r, num(o.radius, 1.5)), kind: o.kind === 'tree' ? 'tree' : 'rock' }));\n}\n\nexport const eventKind = (event) => (event ? event.k ?? event.type ?? null : null);\n\n/** Tank that fired: explicit owner field, else the tank nearest to the shot origin. */\nexport function shooterOf(event, tanks) {\n const list = tanks || [];\n const owner = event?.tank ?? event?.by ?? event?.owner ?? event?.from;\n if (owner != null) {\n const found = list.find((t) => String(t.id) === String(owner));\n if (found) return found;\n }\n if (!Number.isFinite(event?.x) || !Number.isFinite(event?.z)) return null;\n let best = null;\n let bestD = Infinity;\n for (const t of list) {\n const d = (t.x - event.x) ** 2 + (t.z - event.z) ** 2;\n if (d < bestD) { bestD = d; best = t; }\n }\n return best;\n}\n\nexport const tankById = (tanks, id) => (id == null ? null : (tanks || []).find((t) => String(t.id) === String(id)) || null);\nexport const selfTank = (tanks) => (tanks || []).find((t) => t.self) || null;\n\n/** 0 healthy, 1 smoking, 2 burning (also wrecks). */\nexport const damageLevel = (hp, alive = true) => (!alive || hp <= 25 ? 2 : hp <= 50 ? 1 : 0);\n\nexport const wrapAngle = (a) => {\n let v = a % (Math.PI * 2);\n if (v > Math.PI) v -= Math.PI * 2;\n if (v < -Math.PI) v += Math.PI * 2;\n return v;\n};\n\n/**\n * Tracks the own tank between frames to drive the engine/tracks/turret loops.\n * update(tank, dtMs) → scene-style sound events (move_start/move_end/turret_start/turret_end).\n */\nexport function createSelfTracker({ moveSpeed = 0.6, turnSpeed = 0.35, holdMs = 160 } = {}) {\n let last = null;\n let moving = false;\n let turning = false;\n let moveIdle = 0;\n let turnIdle = 0;\n return {\n update(tank, dtMs) {\n const out = [];\n if (!tank || tank.alive === false) {\n if (moving) out.push({ type: 'move_end' });\n if (turning) out.push({ type: 'turret_end' });\n moving = turning = false;\n last = null;\n return out;\n }\n const dt = Math.max(1, dtMs) / 1000;\n if (last) {\n const speed = Math.hypot(tank.x - last.x, tank.z - last.z) / dt;\n const hull = Math.abs(wrapAngle((tank.yaw ?? 0) - last.yaw)) / dt;\n const turret = Math.abs(wrapAngle((tank.turretYaw ?? 0) - (tank.yaw ?? 0) - last.rel)) / dt;\n const isMoving = speed > moveSpeed || hull > turnSpeed;\n moveIdle = isMoving ? 0 : moveIdle + dtMs;\n if (isMoving && !moving) { moving = true; out.push({ type: 'move_start' }); }\n else if (!isMoving && moving && moveIdle >= holdMs) { moving = false; out.push({ type: 'move_end' }); }\n const isTurning = turret > turnSpeed;\n turnIdle = isTurning ? 0 : turnIdle + dtMs;\n if (isTurning && !turning) { turning = true; out.push({ type: 'turret_start' }); }\n else if (!isTurning && turning && turnIdle >= holdMs) { turning = false; out.push({ type: 'turret_end' }); }\n }\n last = { x: tank.x, z: tank.z, yaw: tank.yaw ?? 0, rel: wrapAngle((tank.turretYaw ?? 0) - (tank.yaw ?? 0)) };\n return out;\n },\n reset() {\n last = null;\n moving = turning = false;\n moveIdle = turnIdle = 0;\n },\n get moving() { return moving; },\n get turning() { return turning; },\n };\n}\n\n/** Render events → scene-style sound events (sound/cues.js vocabulary). */\nexport function soundEventsFor(event) {\n switch (eventKind(event)) {\n case 'fire': return [{ type: 'fire' }, { type: 'projectile_start' }];\n case 'impact': return [{ type: 'impact', kind: event.kind === 'obstacle' ? 'obstacle' : 'terrain' }];\n case 'hit': return [{ type: 'tank_hit' }];\n case 'destroyed': return [{ type: 'destroyed' }];\n default: return [];\n }\n}\n\n/** 'victory' | 'defeat' | null for the own player once the match is over. */\nexport function outcomeFor(render) {\n if (!render || render.status !== 'over') return null;\n const me = selfTank(render.tanks);\n if (!me || render.winner == null) return null;\n return String(render.winner) === String(me.id) ? 'victory' : 'defeat';\n}\n\n/** Own reload progress 0..1 (1 = ready): the tank's own field when given, else from the last own fire. */\nexport function reloadProgress(tank, lastFireAt, now, reloadMs = 1500) {\n if (!tank) return 1;\n if (Number.isFinite(tank.reload)) return Math.max(0, Math.min(1, tank.reload));\n if (Number.isFinite(tank.reloadMs)) return Math.max(0, Math.min(1, 1 - tank.reloadMs / reloadMs));\n if (!Number.isFinite(lastFireAt)) return 1;\n return Math.max(0, Math.min(1, (now - lastFireAt) / reloadMs));\n}\n\n// ---------------------------------------------------------------- maps, lives, shield (§8 contract)\n\nexport const MAP_NAMES = { meadow: 'Pradera', forest: 'Bosque', desert: 'Desierto', ruins: 'Ciudad en ruinas', arctic: 'Ártico' };\nexport const MAP_ICONS = { meadow: '🌿', forest: '🌲', desert: '🏜️', ruins: '🏚️', arctic: '❄️' };\n\n/** Generated map (logic/maps.js, has an id) vs the legacy arena, which must render exactly as before. */\nexport const isMapArena = (arena) => Boolean(arena && typeof arena.id === 'string' && MAP_NAMES[arena.id]);\nexport const mapName = (arena) => (isMapArena(arena) ? MAP_NAMES[arena.id] : null);\n\n/** Every obstacle normalized: circles { shape:'circle', x, z, r, kind }, rects { shape:'rect', x, z, w, d, rot, kind }. */\nexport function mapObstacles(arena) {\n return (arena?.obstacles || [])\n .filter((o) => Number.isFinite(o?.x) && Number.isFinite(o?.z))\n .map((o) => (o.shape === 'rect'\n ? { id: o.id, shape: 'rect', x: o.x, z: o.z, w: num(o.w, 2), d: num(o.d, 2), rot: num(o.rot, 0), kind: o.kind || 'wall' }\n : { id: o.id, shape: 'circle', x: o.x, z: o.z, r: num(o.r, num(o.radius, 1.5)), kind: o.kind || 'rock' }));\n}\n\nexport function mapDestructibles(arena) {\n return (arena?.destructibles || [])\n .filter((o) => o?.id != null && Number.isFinite(o.x) && Number.isFinite(o.z))\n .map((o) => ({ id: String(o.id), x: o.x, z: o.z, r: num(o.r, o.kind === 'barrel' ? 0.9 : 1.2), kind: o.kind === 'barrel' ? 'barrel' : 'crate' }));\n}\n\n/** Ids of destructibles gone in this render state (hp 0 / alive false). */\nexport function brokenDestructibles(render) {\n const out = new Set();\n for (const d of render?.destructibles || []) if (d && d.id != null && (d.alive === false || (Number.isFinite(d.hp) && d.hp <= 0))) out.add(String(d.id));\n return out;\n}\n\nconst indexOfTank = (render, tank) => (render?.tanks || []).findIndex((t) => String(t.id) === String(tank?.id));\n/** Lives left: tank field, else render.lives[index]; null when the match has no lives (legacy). */\nexport function livesOf(render, tank) {\n if (Number.isFinite(tank?.lives)) return tank.lives;\n const i = indexOfTank(render, tank);\n const v = Array.isArray(render?.lives) && i >= 0 ? render.lives[i] : undefined;\n return Number.isFinite(v) ? v : null;\n}\n/** Shield ms left (0 when none). */\nexport function shieldOf(render, tank) {\n if (Number.isFinite(tank?.shield)) return Math.max(0, tank.shield);\n if (tank?.shield === true) return 1;\n const i = indexOfTank(render, tank);\n const v = Array.isArray(render?.shield) && i >= 0 ? render.shield[i] : 0;\n return Number.isFinite(v) ? Math.max(0, v) : v === true ? 1 : 0;\n}\nexport function maxLives(render) {\n const n = Number(render?.maxLives ?? render?.map?.lives ?? render?.arena?.lives);\n if (Number.isFinite(n) && n > 0) return n;\n const lives = (render?.tanks || []).map((t) => livesOf(render, t)).filter(Number.isFinite);\n return lives.length ? Math.max(...lives) : null;\n}\n\nconst SELF_ONLY = new Set(['respawn', 'shield_end', 'last_life', 'health_pickup']);\n/** Render events of the lives/map layer → tanks sound names (one-shots). */\nexport function liveCuesFor(event, render) {\n const kind = eventKind(event);\n const target = event?.target ?? event?.tank ?? event?.id;\n const me = selfTank(render?.tanks);\n const mine = me != null && target != null && String(target) === String(me.id);\n switch (kind) {\n case 'life_lost': return ['life_lost'];\n case 'crate_break': return ['crate_break'];\n case 'barrel_explode': return ['barrel_explode'];\n case 'wall_hit': return ['wall_hit'];\n case 'pickup':\n case 'health_pickup': return mine || target == null ? ['health_pickup'] : [];\n default: return SELF_ONLY.has(kind) && (mine || target == null) ? [kind] : [];\n }\n}\n","import { arenaBounds, arenaObstacles, brokenDestructibles, isMapArena, mapDestructibles, mapObstacles, shieldOf } from './liveView.js';\n\n// Generated maps only (the legacy arena keeps its original colors).\nconst MAP_2D = {\n meadow: { bg: '#152519', ground: '#526348' },\n forest: { bg: '#10200f', ground: '#3f5a33' },\n desert: { bg: '#3a2e1c', ground: '#c9a86c' },\n ruins: { bg: '#24221f', ground: '#7a7266' },\n arctic: { bg: '#2a3846', ground: '#dfe9f2' },\n};\nconst SHAPE_2D = {\n tree: '#24472d', rock: '#929285', log: '#6b4a2e', ice: '#a9dcef',\n wall: '#9a8f84', house: '#a8927a', car: '#6b4a35', ice_block: '#bfe6f5', low: '#a89468',\n};\nconst DECOR_2D = { grass: '#4f7a34', weed: '#5e6b33', dry_grass: '#a8935a', flower: '#e8d24a', bush: '#2f5a27', pebble: '#8d877e', rubble: '#6e675e', bones: '#ece2cc', snow: '#ffffff', ice_shard: '#a9dcef', cactus: '#3f7a36' };\n\n/** Lightweight top-down fallback, with the same render/picking lifecycle as WebGL. */\nexport function createLiveScene2d(container, { arena } = {}) {\n const canvas = document.createElement('canvas');\n canvas.style.cssText = 'width:100%;height:100%;display:block';\n container.appendChild(canvas);\n const ctx = canvas.getContext('2d');\n if (!ctx) { canvas.remove(); throw new Error('Canvas 2D unavailable'); }\n const bounds = arenaBounds(arena);\n const map = isMapArena(arena) ? arena : null;\n const colors = map ? MAP_2D[map.id] : { bg: '#152519', ground: '#526348' };\n const shapes = map ? mapObstacles(arena) : arenaObstacles(arena).map((o) => ({ ...o, shape: 'circle' }));\n const crates = map ? mapDestructibles(arena) : [];\n const decor = map ? (arena.decor || []).filter((d) => DECOR_2D[d?.kind] && Number.isFinite(d.x) && Number.isFinite(d.z)) : [];\n let clock = 0;\n let w = 1; let h = 1; let scale = 1; let ox = 0; let oz = 0;\n function resize() {\n w = Math.max(1, container.clientWidth); h = Math.max(1, container.clientHeight);\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = w * dpr; canvas.height = h * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n scale = Math.min(w / bounds.width, h / bounds.depth);\n ox = (w - bounds.width * scale) / 2; oz = (h - bounds.depth * scale) / 2;\n }\n resize();\n const ro = typeof ResizeObserver === 'function' ? new ResizeObserver(resize) : null;\n ro?.observe(container);\n return {\n kind: '2d', resize,\n screenToGround(nx, ny) { return { x: ((nx + 1) * w / 2 - ox) / scale + bounds.minX, z: ((1 - ny) * h / 2 - oz) / scale + bounds.minZ }; },\n render(state, dtMs = 16) {\n clock += (Number(dtMs) || 16) / 1000;\n ctx.fillStyle = colors.bg; ctx.fillRect(0, 0, w, h);\n ctx.save(); ctx.translate(ox, oz); ctx.scale(scale, scale); ctx.translate(-bounds.minX, -bounds.minZ);\n ctx.fillStyle = colors.ground; ctx.fillRect(bounds.minX, bounds.minZ, bounds.width, bounds.depth);\n for (const d of decor) { ctx.fillStyle = DECOR_2D[d.kind]; ctx.beginPath(); ctx.arc(d.x, d.z, 0.35 * (Number(d.s) || 1), 0, Math.PI * 2); ctx.fill(); }\n for (const o of shapes) {\n ctx.fillStyle = SHAPE_2D[o.kind] || '#929285';\n if (o.shape === 'rect') {\n // Same rotation as simulation.js: width w along (cos rot, sin rot).\n ctx.save(); ctx.translate(o.x, o.z); ctx.rotate(o.rot); ctx.fillRect(-o.w / 2, -o.d / 2, o.w, o.d);\n if (o.kind === 'low') { ctx.strokeStyle = '#6f5f3c'; ctx.lineWidth = 0.25; ctx.strokeRect(-o.w / 2, -o.d / 2, o.w, o.d); }\n ctx.restore();\n } else { ctx.beginPath(); ctx.arc(o.x, o.z, o.r, 0, Math.PI * 2); ctx.fill(); }\n }\n const broken = brokenDestructibles(state);\n for (const c of crates) {\n if (broken.has(c.id)) continue;\n if (c.kind === 'barrel') { ctx.fillStyle = '#c62d24'; ctx.beginPath(); ctx.arc(c.x, c.z, c.r, 0, Math.PI * 2); ctx.fill(); ctx.strokeStyle = '#3a2a24'; ctx.lineWidth = 0.25; ctx.stroke(); }\n else { ctx.fillStyle = '#a7773f'; ctx.fillRect(c.x - c.r * 0.8, c.z - c.r * 0.8, c.r * 1.6, c.r * 1.6); ctx.strokeStyle = '#5e3f1e'; ctx.lineWidth = 0.2; ctx.strokeRect(c.x - c.r * 0.8, c.z - c.r * 0.8, c.r * 1.6, c.r * 1.6); }\n }\n for (const tank of state.tanks || []) {\n ctx.save(); ctx.translate(tank.x, tank.z); ctx.rotate(tank.yaw);\n ctx.fillStyle = tank.alive === false ? '#333' : tank.color || '#73ce68';\n ctx.fillRect(-3, -1.8, 6, 3.6); ctx.restore();\n ctx.save(); ctx.translate(tank.x, tank.z); ctx.rotate(tank.turretYaw); ctx.strokeStyle = '#dce8cf'; ctx.lineWidth = 0.8; ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(5, 0); ctx.stroke(); ctx.restore();\n const shield = tank.alive === false ? 0 : shieldOf(state, tank);\n if (shield > 0 && (shield > 500 || Math.floor(clock * 8) % 2 === 0)) { ctx.fillStyle = 'rgba(127,220,255,0.28)'; ctx.strokeStyle = '#7fdcff'; ctx.lineWidth = 0.35; ctx.beginPath(); ctx.arc(tank.x, tank.z, 4.6, 0, Math.PI * 2); ctx.fill(); ctx.stroke(); }\n if (tank.self) { ctx.strokeStyle = '#fff'; ctx.lineWidth = 0.3; ctx.beginPath(); ctx.arc(tank.x, tank.z, 4, 0, Math.PI * 2); ctx.stroke(); }\n }\n ctx.fillStyle = '#ffe097';\n for (const shell of state.shells || []) { ctx.beginPath(); ctx.arc(shell.x, shell.z, 0.7, 0, Math.PI * 2); ctx.fill(); }\n ctx.restore();\n },\n dispose() { ro?.disconnect(); canvas.remove(); },\n };\n}\n","/* eslint-disable react/prop-types */\nimport { memo, useContext, useEffect, useRef, useState } from 'react';\nimport { AlertTriangle, CheckCircle2, Link2, Loader2, Settings2 } from 'lucide-react';\nimport ManualTurnDialog from './ManualTurnDialog.jsx';\nimport { ChatContext } from '../../provider/ChatContext.js';\nimport useChatGames from '../shared/useChatGames.js';\nimport GameSoundControls from '../shared/GameSoundControls.jsx';\nimport { connectionDiagnostics, connectionHint } from './net/connectionDiagnostics.js';\nimport { createLiveMatch } from './net/createLiveMatch.js';\nimport { createLiveScene2d } from './scene/createLiveScene2d.js';\nimport { createSelfTracker, eventKind, isMapArena, liveCuesFor, livesOf, MAP_ICONS, mapName, maxLives, outcomeFor, selfTank, shieldOf, soundEventsFor } from './scene/liveView.js';\nimport { getTanksSoundManager, startTanksSounds, handleSceneEvent, playOutcome, playTanksCue, startTanksLoop, stopTanksLoop, stopAllTanksLoops } from '../tanks/sound/tanksSounds.js';\nimport '../connect4/games.css';\nimport './tanks-live.css';\n\nconst act = (key, type) => { void useChatGames.getState().act(key, type).catch(() => {}); };\nconst stopInput = (input) => { input.throttle = 0; input.steer = 0; input.fire = false; };\nconst RESPAWN_MS = 3000;\n// Generated map (render.map, contract §8) when present; otherwise the legacy arena.\nconst arenaOf = (render) => (isMapArena(render?.map) ? render.map : render?.arena);\nfunction Hearts({ lives, max, label }) {\n if (!Number.isFinite(lives)) return null;\n const total = Math.max(lives, max || lives);\n return <span className={`tl-hearts${lives === 1 && total > 1 ? ' tl-hearts--last' : ''}`} role=\"img\" aria-label={`${label}: ${lives} ${lives === 1 ? 'vida' : 'vidas'}`}>\n {Array.from({ length: total }, (_, i) => <span key={i} className={i < lives ? 'tl-heart' : 'tl-heart tl-heart--lost'} aria-hidden=\"true\">{i < lives ? '❤️' : '🖤'}</span>)}\n </span>;\n}\nfunction connectionText(net, prolonged) {\n const manual = net?.manualTurn;\n if (manual?.status === 'applying') return 'Aplicando configuración…';\n if (manual?.status === 'sharing') return 'Sincronizando con el otro jugador…';\n if (manual?.status === 'waiting_peer') return 'Esperando al otro jugador para compartir la configuración…';\n if (net?.phase === 'connected') return '¡Conexión establecida!';\n if (manual?.status === 'failed' || net?.phase === 'failed' || net?.ice === 'failed') return 'No pudimos conectar. Puedes reintentar.';\n if (prolonged) return 'La conexión está tardando más de lo esperado';\n if (net?.phase === 'restarting' || net?.phase === 'reconnecting') return 'Reconectando…';\n if (net?.phase === 'listening') return 'Esperando la conexión del otro jugador…';\n if (net?.phase === 'calling') return 'Buscando al otro jugador…';\n if (net?.phase === 'negotiating') return 'Buscando una conexión entre los jugadores…';\n return 'Preparando partida…';\n}\n\nfunction TanksLiveGameCard({ gameKey, currentUserId, onMinimize, onDismiss, suspended = false }) {\n const rtcOptions = useContext(ChatContext)?.config?.webrtc;\n const game = useChatGames((state) => state.games[gameKey]);\n const suspendedRef = useRef(suspended);\n suspendedRef.current = suspended;\n const stage = useRef(null); const match = useRef(null); const renderer = useRef(null);\n const input = useRef({ throttle: 0, steer: 0, fire: false });\n const [view, setView] = useState(null); const [error, setError] = useState(''); const [prefer2d, setPrefer2d] = useState(false);\n const [mode, setMode] = useState('loading');\n const [turnOpen, setTurnOpen] = useState(false);\n const [waitingMs, setWaitingMs] = useState(0);\n const connected = view?.net?.phase === 'connected';\n useEffect(() => {\n if (!game || game.status !== 'active' || connected) { setWaitingMs(0); return undefined; }\n const started = Date.now();\n const timer = setInterval(() => setWaitingMs(Date.now() - started), 1000);\n return () => clearInterval(timer);\n }, [gameKey, game?.status, connected]);\n useEffect(() => { setTurnOpen(false); }, [gameKey, game?.status]);\n\n useEffect(() => {\n if (suspended) { stopInput(input.current); stopAllTanksLoops(); }\n else renderer.current?.resize();\n }, [suspended]);\n const active = ['active', 'won'].includes(game?.status);\n const [arena, setArena] = useState(null);\n useEffect(() => {\n if (!active || !arena || !stage.current) return undefined;\n let disposed = false; let scene = null;\n const options = { arena, lowPower: matchMedia('(pointer: coarse)').matches, reducedMotion: matchMedia('(prefers-reduced-motion: reduce)').matches, onEvent: (event) => { if (event.type === 'context_lost') setPrefer2d(true); } };\n const fallback = () => { if (!disposed) { scene = createLiveScene2d(stage.current, options); renderer.current = scene; setMode('2d'); } };\n if (prefer2d) fallback();\n else import('./scene/createLiveScene.js').then(({ createLiveScene }) => { if (!disposed) { try { scene = createLiveScene(stage.current, options); renderer.current = scene; setMode('3d'); } catch { fallback(); } } }).catch(fallback);\n return () => { disposed = true; scene?.dispose(); if (renderer.current === scene) renderer.current = null; };\n }, [active, arena, prefer2d]);\n useEffect(() => {\n if (!active || game.status !== 'active' || !stage.current) return undefined;\n let disposed = false; let frame = 0; let last = performance.now(); let published = 0; let outcome = null;\n const tracker = createSelfTracker(); const keys = new Set();\n startTanksSounds();\n let session;\n try {\n const signaling = useChatGames.getState().createLiveSignaling(gameKey);\n session = createLiveMatch({ iceServers: rtcOptions?.iceServers, iceTransportPolicy: rtcOptions?.iceTransportPolicy, game, selfId: String(currentUserId), isHost: String(game.hostId) === String(currentUserId), signaling });\n match.current = session;\n } catch (e) { setError(e.message || 'No se pudo iniciar WebRTC'); return undefined; }\n setArena(arenaOf(session.getRender()));\n let respawnAt = null; let shieldOn = false;\n function clear() { keys.clear(); stopInput(input.current); stopAllTanksLoops(); }\n function key(event, down) {\n if (/^(INPUT|TEXTAREA|SELECT)$/.test(event.target?.tagName)) return;\n if (!['KeyW', 'KeyA', 'KeyS', 'KeyD', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Space'].includes(event.code)) return;\n event.preventDefault(); if (down) keys.add(event.code); else keys.delete(event.code);\n input.current.throttle = Number(keys.has('KeyW') || keys.has('ArrowUp')) - Number(keys.has('KeyS') || keys.has('ArrowDown'));\n input.current.steer = Number(keys.has('KeyD') || keys.has('ArrowRight')) - Number(keys.has('KeyA') || keys.has('ArrowLeft'));\n input.current.fire = keys.has('Space');\n }\n const down = (e) => key(e, true); const up = (e) => key(e, false);\n const host = stage.current;\n host.addEventListener('keydown', down); host.addEventListener('keyup', up); host.addEventListener('blur', clear);\n const visibility = () => { if (document.hidden) clear(); };\n document.addEventListener('visibilitychange', visibility);\n handleSceneEvent({ type: 'engine_start' }, gameKey);\n function tick(now) {\n if (disposed) return;\n const dt = Math.min(80, now - last); last = now;\n const paused = suspendedRef.current || document.hidden;\n session.setInput(paused ? { throttle: 0, steer: 0, fire: false } : input.current);\n session.step(dt); const state = session.getRender();\n if (!paused) renderer.current?.render(state, dt);\n if (paused) { keys.clear(); tracker.reset(); stopAllTanksLoops(); shieldOn = false; }\n if (!paused) for (const event of state.events || []) for (const sound of soundEventsFor(event)) handleSceneEvent(sound, event.id);\n if (!paused) for (const event of state.events || []) for (const name of liveCuesFor(event, state)) playTanksCue(name);\n const own = selfTank(state.tanks);\n for (const event of state.events || []) {\n const target = event?.target ?? event?.tank;\n if (!own || target == null || String(target) !== String(own.id)) continue;\n if (eventKind(event) === 'life_lost') respawnAt = now + (Number.isFinite(event.respawnMs) ? event.respawnMs : RESPAWN_MS);\n if (eventKind(event) === 'respawn') respawnAt = null;\n }\n if (own?.alive !== false && respawnAt != null && now >= respawnAt) respawnAt = null;\n const wantShield = !paused && state.status === 'playing' && own?.alive !== false && shieldOf(state, own) > 0;\n if (wantShield !== shieldOn) { shieldOn = wantShield; if (wantShield) startTanksLoop('shield_loop'); else stopTanksLoop('shield_loop'); }\n const ownIndex = own ? state.tanks.indexOf(own) : -1;\n const respawnIn = Number.isFinite(state.respawn?.[ownIndex]) ? state.respawn[ownIndex] : respawnAt != null && state.status === 'playing' ? Math.max(0, respawnAt - now) : 0;\n if (!paused) for (const event of tracker.update(selfTank(state.tanks), dt)) handleSceneEvent(event);\n const nextOutcome = outcomeFor(state);\n if (nextOutcome && !outcome) { respawnAt = null; setView({ ...state, respawnIn: 0 }); outcome = nextOutcome; if (!paused) playOutcome(outcome, gameKey); useChatGames.getState().liveFinish?.(gameKey, state.winner); }\n if (now - published > 100) { published = now; setView({ ...state, respawnIn }); }\n frame = requestAnimationFrame(tick);\n }\n frame = requestAnimationFrame(tick);\n return () => {\n disposed = true; cancelAnimationFrame(frame); clear(); session.destroy(); match.current = null;\n host.removeEventListener('keydown', down); host.removeEventListener('keyup', up); host.removeEventListener('blur', clear); document.removeEventListener('visibilitychange', visibility);\n };\n }, [active, gameKey, currentUserId]);\n if (!game) return null;\n const guest = String(currentUserId) === String(game.guestId);\n const over = view?.status === 'over' || game.status === 'won';\n const net = view?.net;\n const manual = net?.manualTurn;\n const configuring = ['waiting_peer', 'sharing', 'applying'].includes(manual?.status);\n const connectionProblem = !connected && (waitingMs >= 12000 || net?.phase === 'failed' || net?.ice === 'failed' || manual?.status === 'failed' || Boolean(error));\n const currentMap = isMapArena(arena) ? arena : null;\n const heartsMax = maxLives(view);\n const showHearts = (view?.tanks || []).some((tank) => Number.isFinite(livesOf(view, tank))) && (currentMap != null || heartsMax > 1);\n const respawnSeconds = Math.ceil((view?.respawnIn || 0) / 1000);\n const routeText = connected ? (net?.route?.relay === true ? 'TURN Relay' : net?.route?.relay === false ? 'P2P' : null) : null;\n const applyTurn = async (json, options) => {\n if (!match.current?.configureTurn) throw new Error('La partida aún no está preparada. Espera un momento y vuelve a intentarlo.');\n await match.current.configureTurn(json, options);\n };\n\n function aim(event) {\n const rect = stage.current?.getBoundingClientRect(); const me = selfTank(view?.tanks);\n if (!rect || !me) return;\n const ground = renderer.current?.screenToGround((event.clientX - rect.left) / rect.width * 2 - 1, 1 - (event.clientY - rect.top) / rect.height * 2);\n if (ground) input.current.turretYaw = Math.atan2(ground.z - me.z, ground.x - me.x);\n }\n const hold = (field, value) => ({ onPointerDown: (e) => { e.preventDefault(); e.currentTarget.setPointerCapture(e.pointerId); input.current[field] = value; }, onPointerUp: () => { input.current[field] = field === 'fire' ? false : 0; }, onPointerCancel: () => { input.current[field] = field === 'fire' ? false : 0; }, onLostPointerCapture: () => { input.current[field] = field === 'fire' ? false : 0; } });\n return <section className={`chat-game-card tl-card${active ? ' tl-card--active' : ''}`} aria-label=\"Tanques LIVE 3D\">\n <header className=\"tl-header\"><strong>Tanques LIVE 3D</strong><div className=\"tl-header-actions\"><GameSoundControls manager={getTanksSoundManager()} />{onMinimize && <button onClick={onMinimize} aria-label=\"Minimizar\">−</button>}{onDismiss && <button onClick={onDismiss} aria-label=\"Ocultar\">×</button>}</div></header>\n {game.status === 'invited' && <div className=\"tl-invite\"><span className=\"tl-invite-icon\" aria-hidden=\"true\">🪖</span><strong>{guest ? '¿Listo para combatir?' : 'Invitación enviada'}</strong><p>{guest ? 'Te invitaron a un combate en tiempo real.' : 'Esperando que el rival acepte…'}</p>{guest && <div className=\"tl-invite-actions\"><button className=\"tl-button-primary\" onClick={() => act(gameKey, 'game_accept')}>Aceptar combate</button><button onClick={() => act(gameKey, 'game_decline')}>Rechazar</button></div>}</div>}\n {active && !over && <div className={`tl-connection tl-connection--${connected ? 'connected' : connectionProblem ? 'problem' : 'pending'}`}>\n <div className=\"tl-connection-heading\">{connected ? <CheckCircle2 size={18} aria-hidden=\"true\" /> : connectionProblem ? <AlertTriangle size={18} aria-hidden=\"true\" /> : <Loader2 size={18} className=\"tl-connection-spinner\" aria-hidden=\"true\" />}<div><strong>{connectionProblem ? 'Problemas de conexión' : connectionText(net, false)}</strong>{connectionProblem && <p>No pudimos establecer una conexión con el otro jugador. Puedes configurar una conexión alternativa para continuar.</p>}</div>{routeText && <span className=\"tl-route-badge\">{routeText}</span>}</div>\n {!connected && <p className=\"tl-connection-message\" role=\"status\">{connectionProblem ? connectionText(net, waitingMs >= 12000) : connectionHint(net)}</p>}\n {manual?.status === 'synchronized' && <p className=\"tl-connection-shared\" role=\"status\">{manual.received ? 'Configuración recibida del otro jugador y aplicada en ambos.' : 'Configuración compartida y aplicada en ambos jugadores.'}</p>}\n {manual?.expiresAt != null && manual.expiresAt <= Date.now() && <p className=\"tl-connection-expired\" role=\"status\">La validez indicada para las credenciales terminó. Introduce una configuración nueva si necesitas reconectar.</p>}\n <div className=\"tl-connection-actions\"><button type=\"button\" className={connectionProblem ? 'tl-button-primary' : ''} onClick={() => setTurnOpen(true)}><Settings2 size={15} aria-hidden=\"true\" />Configurar conexión alternativa</button>{!connected && <button type=\"button\" disabled={configuring} onClick={() => match.current?.reconnect()}><Link2 size={15} aria-hidden=\"true\" />Reintentar conexión</button>}</div>\n </div>}\n <ManualTurnDialog open={turnOpen && active && !over} onClose={() => setTurnOpen(false)} onApply={applyTurn} manualTurn={manual} />\n {(active || view) && <><div className=\"tl-hud\">{(view?.tanks || []).map((tank) => <span key={tank.id}>{tank.self ? 'Tú' : 'Rival'} <meter min=\"0\" max=\"100\" value={tank.hp} aria-label={tank.self ? 'Tu vida' : 'Vida del rival'} /> {tank.hp} HP{showHearts && <Hearts lives={livesOf(view, tank)} max={heartsMax} label={tank.self ? 'Tus vidas' : 'Vidas del rival'} />}{shieldOf(view, tank) > 0 && tank.alive !== false && <span className=\"tl-shield-badge\" title=\"Escudo activo\">🛡️</span>}</span>)}{currentMap && <span className=\"tl-map\">{MAP_ICONS[currentMap.id]} {mapName(currentMap)}</span>}<span role=\"status\">{connected ? routeText || 'Conectado' : connectionText(net, waitingMs >= 12000)} {Number.isFinite(net?.rtt) ? `· ${Math.round(net.rtt)} ms` : ''}</span></div>\n {respawnSeconds > 0 && !over && <div className=\"tl-respawn\" role=\"status\">Reapareces en {respawnSeconds} s…</div>}\n <div className=\"tl-stage\" ref={stage} tabIndex={0} aria-label=\"Arena. WASD o flechas para conducir, ratón para apuntar, clic o espacio para disparar\" onPointerMove={aim} onPointerDown={(e) => { aim(e); if (e.pointerType === 'mouse') { e.currentTarget.focus(); e.currentTarget.setPointerCapture(e.pointerId); aim(e); input.current.fire = true; } }} onPointerUp={() => { input.current.fire = false; }} onPointerCancel={() => { stopInput(input.current); }} onLostPointerCapture={() => { input.current.fire = false; }} />\n <div className=\"tl-controls\"><div className=\"tl-joystick\" role=\"group\" aria-label=\"Joystick de conducción\" onPointerDown={(e) => { e.preventDefault(); e.currentTarget.setPointerCapture(e.pointerId); const r = e.currentTarget.getBoundingClientRect(); input.current.steer = Math.max(-1, Math.min(1, (e.clientX - r.left - r.width / 2) / (r.width / 2))); input.current.throttle = Math.max(-1, Math.min(1, -(e.clientY - r.top - r.height / 2) / (r.height / 2))); }} onPointerMove={(e) => { if (!e.currentTarget.hasPointerCapture(e.pointerId)) return; const r = e.currentTarget.getBoundingClientRect(); input.current.steer = Math.max(-1, Math.min(1, (e.clientX - r.left - r.width / 2) / (r.width / 2))); input.current.throttle = Math.max(-1, Math.min(1, -(e.clientY - r.top - r.height / 2) / (r.height / 2))); }} onPointerUp={() => stopInput(input.current)} onPointerCancel={() => stopInput(input.current)} onLostPointerCapture={() => stopInput(input.current)}>✥</div><div className=\"tl-drive\" aria-label=\"Controles de conducción\"><button aria-label=\"Avanzar\" {...hold('throttle', 1)}>▲</button><button aria-label=\"Girar izquierda\" {...hold('steer', -1)}>◀</button><button aria-label=\"Retroceder\" {...hold('throttle', -1)}>▼</button><button aria-label=\"Girar derecha\" {...hold('steer', 1)}>▶</button></div><button className=\"tl-fire\" {...hold('fire', true)}>Disparar</button></div>\n <div className=\"tl-reload\"><label>Recarga <progress max=\"1\" value={selfTank(view?.tanks)?.reload ?? 1} /> {(selfTank(view?.tanks)?.reload ?? 1) >= 1 ? 'Listo' : 'Recargando…'}</label></div>\n <small>WASD / flechas · ratón o toca la arena para apuntar · espacio / clic para disparar</small><button onClick={() => setPrefer2d((v) => !v)}>{mode === '2d' ? 'Probar 3D' : 'Vista 2D'}</button>\n </>}\n {over && <p role=\"status\">{String(view?.winner ?? game.winnerId) === String(currentUserId) ? '¡Victoria!' : 'Fin del combate'} <button onClick={() => { void Promise.resolve(useChatGames.getState().liveRematch?.(gameKey)).catch(() => {}); }}>Revancha</button>{currentMap && <button onClick={() => { void Promise.resolve(useChatGames.getState().liveRematch?.(gameKey, { newMap: true })).catch(() => {}); }}>Revancha en otro mapa 🎲</button>}</p>}\n {active && <details className=\"tl-diagnostics\"><summary>Diagnóstico de conexión</summary><pre>{JSON.stringify(connectionDiagnostics(view?.net), null, 2)}</pre></details>}\n {active && !over && <button onClick={() => match.current?.resign()}>Rendirse</button>}\n {game.pending && <p role=\"status\">Enviando…</p>}{game.pendingEvent && game.error && <button onClick={() => { void useChatGames.getState().retry(gameKey).catch(() => {}); }}>Reintentar envío</button>}\n {error && <p role=\"alert\">{error}</p>}{game.error && <p role=\"alert\">{game.error}</p>}\n {!['closed', 'declined'].includes(game.status) && <footer className=\"tl-footer\"><button onClick={() => act(gameKey, 'game_end')}>Cerrar partida</button></footer>}\n </section>;\n}\nexport default memo(TanksLiveGameCard);\n"],"mappings":";;;;;;;;;;;AAKA,IAAa8B,KAAc,OAAO,OAAO;CAAE,WAAW;CAAM,UAAU;AAAK,CAAC,GAEtEC,MAAS,MAAK,OAAOC,KAAM,YAAY,OAAO,SAASA,CAAC,GACxDC,MAAU,MAAM,OAAOC,KAAO,YAAYA,EAAG,SAAS,KAAKA,EAAG,SAAS;AAC7E,SAAgBC,EAAgB,EAAE,SAAM,WAAQ,YAAS,OAAOC,CAAM,MAAM,OAAOC,EAAK,MAAM,GAAG,cAAW,oBAAiB,CAAC,GAAG,iBAAcvB,GAAgB,gBAAY,wBAAoB,8BAA0B,CAAC,GAAG;CAC3N,IAAS,OAAOsB,CAAM;CACtB,IAAME,IAAM,CAAC,OAAOD,EAAK,MAAM,GAAG,OAAOA,EAAK,OAAO,CAAC;CACtD,IAAI,CAACC,EAAI,SAASF,CAAM,KAAKE,EAAI,OAAOA,EAAI,IAAI,MAAU,MAAM,4BAA4B;CAC5F,IAAMC,MAAyBC,MAAc,CAAC,EAAA,CAAG,MAAK,MAAU,CAACC,EAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAK,MAAO,YAAY,KAAK,OAAOC,CAAG,CAAC,CAAC,CAAC,GACzHC,IAASL,EAAI,MAAK,MAAMJ,MAAOE,CAAM,GAErCQ,KAASP,EAAK,cAAc,MAAMQ,IAAS,CAACD,IAC5CE,IAAQD,IAASjC,EAAY,IAAIF,EAAYkC,GAAO,OAAOA,GAAO,IAAI;CAC5E,IAAI,CAACC,KAAUC,EAAM,SAASF,GAAO,SAAS,MAAU,MAAM,uCAAuC;CACrG,IAAMG,IAAWF,IAAS,IAAID,GAAO;CACrC,IAAI,CAAC;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC,SAASG,CAAQ,GAAG,MAAU,MAAM,iBAAiB;CACpE,IAAMC,KAAwBF,EAAM,iBAAiB,CAAC,EAAA,CAAG,KAAI,OAAM;EAAE,IAAIG,EAAE;EAAI,IAAIA,EAAE;CAAG,EAAE,GACpFC,KAAa,GAAI,MAAM;EAAE,IAAMC,IAAI7C,EAAW4B,GAAIkB,CAAC,GAAGC,IAAIP,EAAM,SAASM;EAA+E,OAAvEC,KAAG,OAAO,OAAOF,GAAG;GAAE,GAAGE,EAAE;GAAG,GAAGA,EAAE;GAAG,KAAKA,EAAE;GAAK,WAAWA,EAAE;EAAI,CAAC,GAAUF;CAAG,GAClKG,KAAe,OAAOR,EAAM,iBAAiB,CAAC,EAAA,CAAG,MAAK,MAAKG,EAAE,OAAOf,CAAE,GACxEqB,IAAQjB,EAAI,IAAIY,CAAS,GAAGM,IAAS,CAAC,GAAGC,IAAS,CAAC,GAAGC,KAAQ,CAAC,GAAGC,IAAO,GAAGC,KAAS,GAAGC,IAAQ,GAAGC,IAAW,GAC9GC,IAAQ,CAAChB,GAAUA,CAAQ,GAAGiB,IAAc,CAAC,GAAG,CAAC,GAAGC,IAAY,CAAC,MAAM,IAAI,GAC3EC,IAAS,cAAcC,IAAS,MAAMC,IAAY,IAAOC,IAAM;EAAE,OAAO;EAAQ,KAAK;EAAM,OAAO;CAAK,GAAGC,IAAe,IAAOC,IAAgB,IAAOC,IAAY,MACnKC,IAAQ,CAAC,GAAGC,IAAa,MAAMC,IAAW,MAAMC,qBAAW,IAAI,IAAI,GAAGC,oBAAO,IAAI,IAAI,GAAGC,qBAAe,IAAI,IAAI,GAC7GC,UAAWxB,EAAM,MAAK,MAAKJ,EAAE,OAAOf,CAAM,GAAG4C,WAAczB,EAAM,MAAK,MAAKJ,EAAE,OAAOR,CAAM,GAC1FsC,WAAe;EAAE,AAAKb,KAAWc,EAAS;GAAE;GAAQ;GAAQ;EAAI,CAAC;CAAG,GACpEC,KAAO,MAAK;EAAkB,AAAhB1B,EAAO,KAAK,CAAC,GAAOA,EAAO,SAAS,OAAKA,EAAO,MAAM;CAAG,GACvE2B,KAAO,MAAKC,EAAK,UAAU;EAAE,GAAGC;EAAG,GAAGjD,EAAK;EAAQ,GAAGwB;CAAM,CAAC,GAC7D0B,KAAW,MAAO;EAAiB,AAAfV,EAAK,IAAIW,CAAG,GAAOX,EAAK,OAAO,QAAMA,EAAK,OAAOA,EAAK,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK;CAAG,GAClGY,KAAa,MAAK,KAAK,IAAI,GAAG,KAAK,MAAMzB,EAAYZ,KAAKO,CAAI,CAAC,GAC/D+B,YAAkB;EAAE,GAAG;EAAY,IAAInC,EAAM,KAAI,MAAKJ,EAAE,EAAE;EAAG;EAAQ;EAAQ,QAAQqB;EACzF,GAAI3B,IAAS,CAAC,IAAI;GAAE,OAAO,CAAC,GAAGkB,CAAK;GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI0B,CAAU;GAAG,gBAAgB3C,EAAM,iBAAiB,CAAC,EAAA,CAAG,KAAI,OAAM;IAAE,IAAIG,EAAE;IAAI,IAAIA,EAAE;GAAG,EAAE;EAAE;CAAG;CAC1J,SAAS0C,KAAuB;EAAE,CAAC7C,EAAM,iBAAiB,CAAC,EAAA,CAAG,SAAS,GAAG,MAAM;GAAqC,AAAnC,EAAE,KAAKE,EAAqBI,EAAE,CAAC,IAAI,EAAE,QAAQ;EAAM,CAAC;CAAG;CAEzI,SAASwC,GAAY,GAAG;EACtB,IAAMC,IAAQ3C,EAAUZ,EAAIc,IAAIA,CAAC;EAGjC,AAHoC,OAAO,OAAOG,EAAMH,IAAI;GAAE,GAAGyC,EAAM;GAAG,GAAGA,EAAM;GAAG,KAAKA,EAAM;GAAK,WAAWA,EAAM;GAAW,OAAO;GAAG,IAAI;GAAK,OAAO;EAAK,CAAC,GAClK,EAAUzC,KAAK,MAAM,EAAYA,KAAKO,IAAO7B,GAAY,UACrDQ,EAAIc,OAAOT,MAAU,IAAQ,CAAC,GAAG,IAAW,MAAM,IAAa,OACnEwC,EAAK;GAAE,GAAG;GAAW,QAAQ7C,EAAIc;GAAI,GAAGyC,EAAM;GAAG,GAAGA,EAAM;GAAG,QAAQ/D,GAAY;EAAS,CAAC;CAC7F;CAEA,SAASgE,GAAS,GAAG,GAAM;EAGzB,AAFA,EAAM1C,KAAK2C,GAAMZ,EAAK;GAAE,GAAG;GAAa,QAAQ7C,EAAIc;GAAI,OAAO,CAAC,GAAGW,CAAK;EAAE,CAAC,GACvEgC,MAAS,KAAKhD,IAAW,KAAGoC,EAAK;GAAE,GAAG;GAAa,QAAQ7C,EAAIc;EAAG,CAAC,GACvE,EAAUA,KAAK2C,IAAO,IAAIpC,IAAO7B,GAAY,YAAY;CAC3D;CAEA,SAASkE,EAAS,GAAG,GAAQ;EAC3B,AAAKnD,IACA,EAAMO,KAAK,KADD0C,GAAS1C,GAAG,KAAK,IAAI,GAAGW,EAAMX,KAAK,CAAC,CAAC,GAAGgC,EAAK;GAAE,GAAG;GAAa,QAAQ9C,EAAIc;GAAI,OAAO,CAAC,GAAGW,CAAK;EAAE,CAAC;EAEjH,IAAMuB,IAAI;GAAE,GAAG;GAAa,QAAQhD,EAAIc;EAAG;EAC3C,IAD8CgC,EAAKE,CAAC,GAAGH,EAAKG,CAAC,GACzDvB,EAAMX,OAAO,KAAKc,MAAW,WAAW;GAAE,IAAM+B,IAAIC,MAAW5D,EAAIc,KAAcd,EAAI,IAAIc,KAAjB8C;GAAqD,AAAhCd,EAAK;IAAE,GAAG;IAAQ,QAAQa;GAAE,CAAC,GAAGE,GAAOF,CAAC;EAAG;CAC9I;CAEA,SAASG,GAAW,GAAM,GAAQ;EAChC,IAAMC,IAAO,CAAC;EACd,KAAK,IAAM,EAAE,OAAI,YAASC,GAAM;GAAE,IAAMlD,IAAId,EAAI,QAAQJ,CAAE;GAAG,AAAIkB,IAAI,KAAK,CAACG,EAAMH,EAAE,CAAC,SAASY,EAAYZ,KAAKO,MAAgB,EAAMP,EAAE,CAAC,KAAK,KAAK,IAAI,GAAGG,EAAMH,EAAE,CAAC,KAAKmD,CAAG,GAAG,EAAMnD,EAAE,CAAC,QAAQG,EAAMH,EAAE,CAAC,KAAK,GAAQG,EAAMH,EAAE,CAAC,SAAOiD,EAAK,KAAKjD,CAAC;EAAG;EACjP,aAAaiD,EAAK,SAAQ,MAAKL,EAAS5C,GAAG8C,CAAM,CAAC;CACpD;CACA,SAASM,KAAQ;EACqX,AAApY,IAAQlE,EAAI,IAAIY,CAAS,GAAG,IAAS,CAAC,GAAG,IAAQ,CAACH,GAAUA,CAAQ,GAAG,IAAc,CAAC,GAAG,CAAC,GAAG,IAAY,CAAC,MAAM,IAAI,GAAG4C,GAAqB,GAAG,IAAQ,CAAC,GAAG,IAAa,MAAM,IAAW,MAAMf,GAAS,MAAM,GAAGC,EAAK,MAAM,GAAGC,GAAa,MAAM,GAAG,IAAgB,IAAO,IAAY,MAAM,IAAS,MAAM,IAAST,EAAI,UAAU,cAAc,YAAY,cAAcc,EAAK,EAAE,GAAG,UAAU,CAAC,GAAGF,GAAO;CAC7Y;CACA,SAASkB,GAAO,GAAI,IAAQ,IAAO;EAAE,CAAIjC,MAAW,UAAYuC,KAAStC,MAAWjC,OAAa,IAAS,QAAQ,IAASA,GAAI,IAAS,CAAC,GAAGmD,EAAK,kBAAkB,GAAGF,EAAK;GAAE,GAAG;GAAQ;EAAO,CAAC,GAAGF,GAAO;CAAG;CAC7M,SAASyB,GAAK,GAAO,GAAG,GAAW;EACjC,IAAIxC,MAAW,aAAa,CAACjC,GAAQqD,EAAE,EAAE,KAAKT,EAAK,IAAIS,EAAE,EAAE,GAAG,OAAO;EACrE,IAAMqB,IAAOpD,EAAM,MAAK,MAAK,EAAE,OAAOqD,CAAK;EAE3C,IADI,CAACD,GAAM,SAAShD,KAAQiB,GAAS,IAAIgC,CAAK,KAAK,aAAa/F,EAAM,WAAW,MAC7E,CAAC;GAACyE,EAAE;GAAGA,EAAE;GAAGA,EAAE;EAAG,CAAC,CAAC,MAAMvD,EAAM,KAAK,KAAK,MAAMuD,EAAE,KAAKsB,MAAUjE,KAAUgC,IAAWA,EAAS,IAAIgC,EAAK,IAAIrB,EAAE,KAAKsB,MAAUjE,KAAUgC,IAAWA,EAAS,IAAIgC,EAAK,EAAE,IAAI,GAAG,OAAO;EAEvL,AADApB,EAASD,EAAE,EAAE,GACbV,GAAS,IAAIgC,GAAOjD,CAAI;EACxB,IAAMkD,IAAO;GAAE,GAAGvB;GAAG,GAAG;GAAQ;GAAO,GAAGA,EAAE,IAAI,KAAK,IAAIA,EAAE,GAAG,IAAI;GAAK,GAAGA,EAAE,IAAI,KAAK,IAAIA,EAAE,GAAG,IAAI;GAAK,GAAG;GAAK,KAAK;EAAE;EAC7C,OAAzE9B,EAAO,KAAKqD,CAAI,GAAG1B,EAAK0B,CAAI,GAAOC,KAAW1B,EAAK;GAAE,GAAGE;GAAG,GAAG;EAAO,CAAC,GAAU;CAClF;CACA,SAASyB,GAAY,GAAM;EACzB,IAAI3C,KAAaF,MAAW,aAAa8C,GAAM,MAAM3E,EAAK,UAAU2E,EAAK,MAAMnD,KAAS,CAAC,MAAM,QAAQmD,EAAK,CAAC,KAAKA,EAAK,EAAE,WAAW,KAAK,CAACA,EAAK,EAAE,MAAMjF,EAAM,GAAG;EAChK,IAAM,CAACkF,GAAGC,GAAGC,GAAKC,GAAWC,KAASL,EAAK;EAC3C,IAAI,CAAChC,GAAM,CAAC,CAAC,SAAS,CAAC3E,EAAc4G,GAAGC,GAAG;GAAE,GAAGpE;GAAO,eAAe,CAAC;EAAE,CAAC,KAAK,KAAK,IAAIuE,CAAK,IAAIxG,EAAM,QAAQ,MAAO,KAAK,IAAIsG,CAAG,IAAI,OAAO,KAAK,IAAIC,CAAS,IAAI,KAAK;EACxK,IAAME,IAAU5C,MAAe,OAAO,KAAM,KAAK,IAAI,IAAIf,IAAOe,KAAc,GAAI,GAC5E6C,IAAW5C,KAAYK,GAAM;EACnC,IAAI,KAAK,MAAMiC,IAAIM,EAAS,GAAGL,IAAIK,EAAS,CAAC,IAAI1G,EAAM,QAAQyG,IAAU,GAAG;EAC5E,IAAME,IAAO;GAAE,GAAGxC,GAAM;GAAG;GAAG;GAAG;GAAK;GAAW;EAAM;EACS,AAAhE,IAAWwC,GAAM,IAAa7D,GAAMc,EAAM,KAAK;GAAE;GAAM;EAAK,CAAC,GAAOA,EAAM,SAAS,MAAIA,EAAM,MAAM;CACrG;CACA,IAAMgD,MAAY,GAAG,MAAS,OAAO,KAAK,CAAC,CAAC,CAAC,OAAM,MAAOC,EAAK,SAASlC,CAAG,CAAC,GACtEmC,MAAa,MAAK,MAAM,QAAQC,CAAC,KAAKA,EAAE,WAAW,KAAKA,EAAE,OAAM,MAAK,OAAO,UAAU5F,CAAC,KAAKA,KAAK,KAAKA,KAAKe,CAAQ,GACnH8E,MAAc,MAAKF,GAAW,EAAE,KAAK,KAAK,MAAM,QAAQ,EAAE,MAAM,KAAK,EAAE,OAAO,WAAW,KAAK,EAAE,OAAO,OAAM,MAAM,OAAO,UAAUG,CAAE,KAAKA,KAAM,KAAKA,KAAMhG,GAAY,QAAQ,KACjL,MAAM,QAAQ,EAAE,aAAa,KAAK,EAAE,cAAc,WAAWkB,EAAqB,UAClF,EAAE,cAAc,OAAO,GAAG,MAAMC,KAAKwE,GAASxE,GAAG,CAAC,MAAM,IAAI,CAAC,KAAKA,EAAE,OAAOD,EAAqBI,EAAE,CAAC,MAAM,OAAO,UAAUH,EAAE,EAAE,KAAKA,EAAE,MAAM,KAAKA,EAAE,MAAMD,EAAqBI,EAAE,CAAC,EAAE;CAEvL,SAAS2E,GAAmB,GAAG,GAAS,GAAG,GAAG;EAE5C,AADA5C,EAAK;GAAE,GAAG;GAAoB,IAAI6C;GAAS,QAAQ/E,EAAE;GAAI,MAAMA,EAAE;GAAM,IAAIA,EAAE;GAAI;GAAG;EAAE,CAAC,GACnFA,EAAE,OAAO,KAAKA,EAAE,SAAS,WAASkC,EAAK;GAAE,GAAG;GAAe,IAAIlC,EAAE;GAAI,GAAGA,EAAE;GAAG,GAAGA,EAAE;EAAE,CAAC;CAC3F;CACA,SAASgF,GAAa,GAAG;EACvB,IAAI7D,KAAa,CAACkB,KAAKA,EAAE,MAAMjD,EAAK,UAAU,CAAC,OAAO,UAAUiD,EAAE,CAAC,GAAG;EACtE,IAAIA,EAAE,MAAM,WAAW,CAAC4C,KAAUhE,MAAW,UAAUY,GAAa,IAAI1C,CAAM,KAAKkD,EAAE,MAAMzB,IAAQ,GAAG;GAAe,AAAb,IAAQyB,EAAE,GAAGkB,GAAM;GAAG;EAAQ;EACtI,IAAIlB,EAAE,MAAMzB,GAAO;EACnB,IAAIyB,EAAE,MAAM,UAAU4C,GAAQ;GAAE,EAAKxC,GAAS,CAAC;GAAG;EAAQ;EAC1D,IAAIJ,EAAE,MAAM,cAAc,CAAC4C,KAAU,MAAM,QAAQ5C,EAAE,EAAE,KAAKA,EAAE,GAAG,WAAW,KAAKA,EAAE,GAAG,OAAM,MAAM,OAAO,UAAU6C,CAAE,KAAKA,KAAM,KAAKA,KAAM,GAAG,GAAG;GAC/I,IAAI,CAACtF,KAAU,CAACgF,GAAYvC,CAAC,GAAG;GAChC,IAAM8C,IAAYvF,IAASkB,IAAQuB,EAAE,OAC/B+C,IAAe/C,EAAE,WAAW,aAAaA,EAAE,WAAW,QAAQA,EAAE,GAAG,OAAO,GAAI,MAAM6C,IAAK,KAAM,CAACtF,KAAUuF,EAAUhF,KAAK,CAAE,GAC3HkF,IAAYhD,EAAE,WAAW,UAAUhD,EAAI,SAASgD,EAAE,MAAM,MAAOA,EAAE,GAAG,IAAIhD,EAAI,QAAQgD,EAAE,MAAM,OAAO,KAAK8C,EAAU,IAAI9F,EAAI,QAAQgD,EAAE,MAAM,QAAQzC,IAASkB,EAAM,IAAIzB,EAAI,QAAQgD,EAAE,MAAM,KAAK,MAAOA,EAAE,WAAW;GACxN,IAAI,CAAC+C,KAAgB,CAACC,GAAW;GAMjC,AALKzF,MACHyC,EAAE,cAAc,SAAS,GAAG,MAAM;IAAE,IAAMiD,IAAQzF,EAAM,cAAcM;IAAqB,AAAjB,EAAM,KAAKH,EAAE,IAAI,EAAM,QAAQA,EAAE,KAAK;GAAG,CAAC,GACpHM,EAAM,SAAS,GAAG,MAAM;IAAE,IAAMiF,IAAUrF,EAAE,OAAO;IAA6H,AAA1H,EAAMC,KAAKkC,EAAE,MAAMlC,IAAQoF,KAAWlD,EAAE,GAAGlC,KAAK,KAAGwC,GAAYxC,CAAC,GAAG,EAAYA,KAAKkC,EAAE,OAAOlC,KAAKO,IAAO2B,EAAE,OAAOlC,KAAK,GAAOkC,EAAE,GAAGlC,OAAO,KAAKW,EAAMX,KAAK,KAAKa,EAAUb,OAAO,SAAM,EAAUA,KAAKO,IAAO7B,GAAY;GAAW,CAAC,IAE5RyB,EAAM,SAAS,GAAG,MAAM;IAAkB,AAAhB,EAAE,KAAK+B,EAAE,GAAGlC,IAAI,EAAE,QAAQD,EAAE,KAAK;GAAG,CAAC,GAC3DmF,MAAa,IAAgB,IAAO,IAAYhD,EAAE,QAAQa,GAAOb,EAAE,QAAQ,EAAI;GACnF;EACF;EACA,IAAIA,EAAE,MAAM,UAAU;GAAkD,AAAhD,IAAY,YAAYa,GAAO/D,GAAQ8F,CAAM,GAAOA,KAAQ9C,EAAKM,GAAS,CAAC;GAAG;EAAQ;EAC9G,IAAIJ,EAAE,MAAM,aAAapB,MAAW,QAAQ;GAA4B,AAA1BY,GAAa,IAAInC,CAAM,GAAG8F,GAAa;GAAG;EAAQ;EAQhG,IAPIvE,MAAW,cACXoB,EAAE,MAAM,UAAQoB,GAAK/D,GAAQ2C,GAAG,EAAK,GACrC,CAAC4C,KAAU5C,EAAE,MAAM,SAASrD,GAAQqD,EAAE,EAAE,KAAK,CAACT,EAAK,IAAI,OAAOS,EAAE,IAAI,KAAKhD,EAAI,SAASgD,EAAE,MAAM,KAAK,MAAM,QAAQA,EAAE,EAAE,KAAKA,EAAE,GAAG,WAAW,KAAKA,EAAE,GAAG,OAAO,GAAI,MAAM,OAAO,UAAU6C,CAAE,KAAKA,KAAM,KAAKA,KAAM5E,EAAMH,EAAE,CAAC,EAAE,KAAK,CAACkC,EAAE,GAAGA,EAAE,CAAC,CAAC,CAAC,MAAMvD,EAAM,MACvPwD,EAAS,OAAOD,EAAE,IAAI,GAAG/B,EAAM,SAAS,GAAM,MAAM;GAAqB,AAAnB,EAAK,KAAK+B,EAAE,GAAGlC,IAAI,EAAK,QAAQuD,EAAK,KAAK;EAAG,CAAC,GAAG,IAASnD,EAAO,QAAO,MAAKH,EAAE,OAAOiC,EAAE,EAAE,GAAGH,EAAKG,CAAC,IAEvJ,CAAC4C,KAAU5C,EAAE,MAAM,eAAehD,EAAI,SAASgD,EAAE,MAAM,KAAK,CAACT,EAAK,IAAI,aAAaS,EAAE,OAAO,GAAGvB,EAAMzB,EAAI,QAAQgD,EAAE,MAAM,IAAI,KAAK/B,EAAM,MAAK,MAAKJ,EAAE,OAAOmC,EAAE,MAAM,CAAC,CAAC,OAAO,MAAKC,EAAS,aAAaD,EAAE,OAAO,GAAGvB,EAAMzB,EAAI,QAAQgD,EAAE,MAAM,IAAI,GAAGH,EAAKG,CAAC,IAC1P,CAAC4C,KAAU5C,EAAE,MAAM,UAAUhD,EAAI,SAASgD,EAAE,MAAM,KAAK/B,EAAM,MAAK,MAAKJ,EAAE,OAAOmC,EAAE,MAAM,CAAC,CAAC,OAAO,MAAMzC,KAAUkB,EAAM,IAAIzB,EAAI,QAAQgD,EAAE,MAAM,OAAO,MAAIa,GAAOb,EAAE,MAAM,GACzK4C,KAAUrF,IAAQ;EACtB,IAAMO,IAAId,EAAI,QAAQgD,EAAE,MAAM;EAI9B,IAFIA,EAAE,MAAM,eAAelC,KAAK,KAAKG,EAAMH,EAAE,CAAC,OAAO,KAAKuE,GAAWrC,EAAE,KAAK,KAAKA,EAAE,MAAMlC,OAAOW,EAAMX,KAAK,KAAKkC,EAAE,MAAM,IAAIlC,OAAOW,EAAM,IAAIX,MAAI0C,GAAS1C,GAAGkC,EAAE,MAAMlC,EAAE,GACnKkC,EAAE,MAAM,aAAalC,KAAK,KAAKG,EAAMH,EAAE,CAAC,OAAO,KAAKW,EAAMX,KAAK,KAAKqE,GAASnC,GAAG;GAAC;GAAK;GAAU;GAAK;EAAG,CAAC,KAAGM,GAAYxC,CAAC,GACzHkC,EAAE,MAAM,sBAAsBrD,GAAQqD,EAAE,EAAE,KAAK,CAACT,EAAK,IAAI,MAAMS,EAAE,IAAI,KAAKmC,GAASnC,GAAG;GAAC;GAAK;GAAM;GAAU;GAAM;GAAK;GAAK;GAAK;EAAG,CAAC,KAAK,CAACA,EAAE,GAAGA,EAAE,CAAC,CAAC,CAAC,MAAMvD,EAAM,GAAG;GACtK,IAAMkB,IAAIK,EAAagC,EAAE,MAAM;GAC/B,IAAI,CAAClF,EAAoB6C,CAAC,KAAK,CAAC,OAAO,UAAUqC,EAAE,EAAE,KAAKA,EAAE,KAAK,KAAKA,EAAE,MAAMrC,EAAE,IAAI;GACiB,AAArGsC,EAAS,MAAMD,EAAE,IAAI,GAAG,EAAE,KAAKA,EAAE,IAAI,EAAE,QAAQA,EAAE,KAAK,GAAG,IAAS9B,EAAO,QAAO,MAAKH,EAAE,OAAOiC,EAAE,EAAE,GAAGyC,GAAmB9E,GAAGqC,EAAE,IAAIA,EAAE,GAAGA,EAAE,CAAC;EAC3I;EACA,IAAIA,EAAE,MAAM,oBAAoBmC,GAASnC,GAAG;GAAC;GAAK;GAAU;GAAW;GAAM;GAAK;EAAG,CAAC,KAAK,CAACT,EAAK,IAAI,MAAMS,EAAE,QAAQ,GAAG;GACtH,IAAMrC,IAAIK,EAAagC,EAAE,MAAM,GAAGoD,IAAUpD,EAAE,YAAY,OAAO,OAAOhC,EAAagC,EAAE,OAAO;GAE9F,IADIrC,GAAG,SAAS,YAAY7C,EAAoB6C,CAAC,KAAMqC,EAAE,YAAY,SAASoD,GAAS,SAAS,YAAY,CAACtI,EAAoBsI,CAAO,KAAKA,MAAYzF,MACrJ,CAAC,MAAM,QAAQqC,EAAE,EAAE,KAAKA,EAAE,GAAG,WAAW,KAAK,CAACA,EAAE,GAAG,OAAO,GAAI,MAAM,OAAO,UAAU6C,CAAE,KAAKA,KAAM,KAAKA,KAAM5E,EAAMvB,EAAE,CAAC,EAAE,GAAG;GAG/H,AAFAuD,EAAS,MAAMD,EAAE,QAAQ,GAAOoD,MAAW,EAAQ,KAAK,GAAG,EAAQ,QAAQ,KAC3EnF,EAAM,SAAS,GAAM,MAAM;IAAqB,AAAnB,EAAK,KAAK+B,EAAE,GAAG,IAAI,EAAK,QAAQqB,EAAK,KAAK;GAAG,CAAC,GAC3ExB,EAAK;IAAE,GAAG;IAAkB,IAAIlC,EAAE;IAAI,GAAGA,EAAE;IAAG,GAAGA,EAAE;IAAG,SAASyF,IAAU;KAAE,IAAIA,EAAQ;KAAI,GAAGA,EAAQ;KAAG,GAAGA,EAAQ;IAAE,IAAI;IAAM,IAAI,CAAC,GAAGpD,EAAE,EAAE;GAAE,CAAC;EACjJ;CACF;CAMA,IAAMD,IAAOsD,EAAY;EAAE,wBAAwBT;EAAQ,WAJnCU,KAAa;GACnC,KAAK,GAAM;IAAE,IAAMC,IAAS9H,GAAa+H,CAAI;IAAG,IAAI,CAACD,GAAQ,OAAO,QAAQ,OAAO,gBAAI,MAAM,qBAAqB,CAAC;IAAG,IAAME,IAAS/H,EAAa;KAAE,GAAG6H;KAAQ,UAAUxG,EAAK;IAAO,CAAC;IAAG,OAAO0G,IAASH,EAAU,KAAKG,CAAM,IAAI,QAAQ,OAAO,gBAAI,MAAM,uBAAuB,CAAC;GAAG;GACtR,UAAU,GAAU;IAAE,OAAOH,EAAU,WAAU,MAAS;KAA4C,AAA3B7H,GAAaiI,GAAO,IAAgB,CAAC,EAAE,aAAa3G,EAAK,UAAQ4G,EAASD,CAAK;IAAG,CAAC;GAAG;EACnK;EACuF;EAAQ;EAAQ,QAAQ3G,EAAK;EAAQ;EAAY;EAAoB;EAAuB,QAAQ0E;EAAa,SAASkB;EAAc,SAAS,GAAO;GAC7O,IAAMiB,IAAgB7E,EAAI;GAC1B,IADiC,IAAM8E,GACnCA,EAAM,UAAU,aAAa;IAAE,IAAMC,IAAU9E;IAA8E,AAAhE,IAAe,IAAUJ,MAAW,WAAQ,IAAS,YAAegF,MAAkB,eAAa,qBAAqB;KAAE,AAAK9E,MAAiBG,KAAea,EAAK,EAAE,GAAG,SAAS,CAAC,GAAO8C,KAAUkB,IAAShE,EAAKM,GAAS,CAAC,IAAawC,KAAQ9C,EAAK,EAAE,GAAG,OAAO,CAAC;IAAK,CAAC;GAAG,OACxU,AAAIlB,MAAW,WAAQ,IAASI,IAAe,iBAAiB;GACrE,GAAO;EACT;CAAE,CAAC;CACH,SAASmE,KAAe;EAAE,AAAIP,KAAUpD,GAAa,SAAS,MAAK,KAASM,EAAK,EAAE,GAAG,QAAQ,CAAC,GAAGoB,GAAM;CAAK;CAE7G,OADI0B,IAAQ7C,EAAK,QAAQ,IAAQA,EAAK,aAAa,EAAI,GAChD;EACL,SAAS,GAAM;GAAE,KAAQ,EAAE,GAAGU,EAAK;EAAG;EACtC,KAAK,GAAM;GACT,IAAI3B,GAAW;GACf,IAAMkD,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO+B,CAAI,KAAK,GAAG,GAAG,CAAC;GAC5D,IAD+D,KAAQ/B,GACnEpD,MAAW,WAAW;GAC1B,IAAMoF,IAAKhC,IAAU;GACrB,KAAK,IAAIlE,IAAI,GAAGA,IAAI,GAAG,KAErB,AADIY,EAAYZ,MAAMO,KAAQK,EAAYZ,OAAM,EAAYA,KAAK,GAAG+B,EAAK;IAAE,GAAG;IAAc,QAAQ7C,EAAIc;GAAG,CAAC,IACxG8E,KAAUjE,EAAUb,OAAO,QAAQO,KAAQM,EAAUb,MAAMW,EAAMX,KAAK,MAAKwC,GAAYxC,CAAC,GAAGgC,EAAK;IAAE,GAAG;IAAW,QAAQ9C,EAAIc;GAAG,CAAC;GAEtI,IAAMmG,IAAa5F,IAAO;GAC1B,OAAOc,EAAM,SAAS,KAAKA,EAAM,EAAE,CAAC,QAAQ8E,IAAY,EAAM,MAAM;GACpE,IAAI9E,EAAM,QAAQ;IAAE,IAAM+E,IAAI/E,EAAM,IAAIgF,IAAIhF,EAAM,MAAM+E,GAAShC,IAAOjH,EAAgBiJ,EAAE,MAAMC,EAAE,MAAMA,EAAE,SAASD,EAAE,OAAO,KAAKD,IAAaC,EAAE,SAASC,EAAE,OAAOD,EAAE,KAAK;IAAG,KAAK,IAAMhE,KAAO;KAAC;KAAK;KAAK;KAAO;KAAa;IAAO,GAAG,GAAM,CAAC,CAACA,KAAOgC,EAAKhC;GAAM;GACjQ,KAAK,IAAIkE,IAAYJ,GAAII,IAAY,GAAG,KAAa,MAAO,EAAS3E,EAAG,GAAGrB,IAAO,KAAK,IAAIgG,GAAW,IAAK,GAAG5G,CAAK;GACnH,AAAIY,GAAM,QAAMgD,GAAKtE,GAAQ;IAAE,IAAI,GAAGA,EAAO,GAAGyB,EAAM,GAAG,EAAEC;IAAY,GAAGiB,EAAG,CAAC,CAAC;IAAG,GAAGA,EAAG,CAAC,CAAC;IAAG,KAAKA,EAAG,CAAC,CAAC;IAAW,GAAGpB;GAAK,GAAG,EAAI;GACjI,IAAMgG,IAAKtF,EAAI,MAAM,OAAOA,EAAI,MAAM,UAAU,KAAK,KAAKA,EAAI,MAAM,MAAM,KAAK;GAC/E,IAAIV,KAAQC,IAAQ;IAAE,KAASD,IAAO,MAAOgG;IAAI,IAAM,IAAI5E,EAAG;IAAG,EAAK,SAAS;KAAE,GAAG1C,EAAK;KAAQ,GAAGwB;KAAO,GAAG;MAAC,EAAE;MAAG,EAAE;MAAG,EAAE;MAAK,EAAE;MAAW,EAAE;KAAK;KAAG,GAAGF;IAAK,CAAC;GAAG;GACnK,IAASH,EAAO,QAAO,MAAS;IAC9B,IAAMoG,IAAMnJ,EAAaoJ,GAAOP,GAAIxG,GAAOS,CAAK;IAChD,IAAI,CAACqG,GAAK,OAAO;IACjB,IAAI1B,KAAU0B,EAAI,UAAU1F,MAAW,aAAaF,EAAY1B,EAAI,QAAQsH,EAAI,MAAM,KAAKjG,GAAM,EAAK;KAAE,GAAG;KAAU,MAAM;KAAU,QAAQiG,EAAI;KAAQ,GAAGC,EAAM;KAAG,GAAGA,EAAM;IAAE,CAAC;SAC5K,IAAI3B,KAAU0B,EAAI,UAAU1F,MAAW,WAAW;KACrD,IAAMyC,IAAOpD,EAAM,MAAK,MAAKJ,EAAE,OAAOyG,EAAI,MAAM;KAAkD,AAA/C,EAAK,KAAK,KAAK,IAAI,GAAGjD,EAAK,KAAK9F,EAAM,MAAM,GAAG,EAAK,QAAQ8F,EAAK,KAAK;KACzH,IAAMrB,IAAI;MAAE,GAAG;MAAO,IAAIuE,EAAM;MAAI,QAAQlD,EAAK;MAAI,KAAK9F,EAAM;MAAQ,IAAI0C,EAAM,KAAI,MAAKJ,EAAE,EAAE;MAAG,GAAG0G,EAAM;MAAG,GAAGA,EAAM;KAAE;KACzH,AAD4HzE,EAAKE,CAAC,GAAGH,EAAKG,CAAC,GACtIqB,EAAK,SAAOX,EAAS1D,EAAI,QAAQqE,EAAK,EAAE,GAAGkD,EAAM,KAAK;IAC7D,OAAO,IAAI3B,KAAU0B,EAAI,SAAS,kBAAkB1F,MAAW,WAAW;KACxE,IAAMjB,IAAIK,EAAasG,EAAI,EAAE,GAAGE,IAAS5J,EAAmB4C,GAAO8G,EAAI,IAAI,CAAC;KAE5E,IADAxE,EAAK;MAAE,GAAG;MAAoB,IAAIyE,EAAM;MAAI,QAAQD,EAAI;MAAI,IAAIE,EAAO;MAAI,GAAGD,EAAM;MAAG,GAAGA,EAAM;KAAE,CAAC,GAAG9B,GAAmB9E,GAAG4G,EAAM,IAAIA,EAAM,GAAGA,EAAM,CAAC,GAClJC,EAAO,aAAa7G,EAAE,SAAS,UAAU;MAC3C,IAAM8G,IAAQpJ,EAAcmC,GAAOG,EAAE,IAAIM,CAAK,GAAGyG,IAAU5D,GAAW2D,EAAM,MAAMF,EAAM,KAAK,GACvFvE,IAAI;OAAE,GAAG;OAAkB,QAAQrC,EAAE;OAAI,SAAS8G,EAAM,SAAS,MAAM;OAAM,IAAIxG,EAAM,KAAI,MAAKJ,EAAE,EAAE;MAAE;MACH,AAAzGiC,EAAKE,CAAC,GAAGH,EAAK;OAAE,GAAG;OAAkB,IAAIlC,EAAE;OAAI,GAAGA,EAAE;OAAG,GAAGA,EAAE;OAAG,SAAS8G,EAAM;OAAS,IAAI,CAAC,GAAGzE,EAAE,EAAE;MAAE,CAAC,GAAG0E,EAAQ;KACnH;IACF,OAEE,AADA7E,EAAK;KAAE,GAAG;KAAU,MAAMyE,EAAI;KAAM,GAAGC,EAAM;KAAG,GAAGA,EAAM;IAAE,CAAC,GACxDD,EAAI,UAAU,UAAQzE,EAAK;KAAE,GAAG;KAAY,IAAIyE,EAAI;KAAI,MAAMA,EAAI;KAAc,GAAGC,EAAM;KAAG,GAAGA,EAAM;IAAE,CAAC;IAE9G,OAAO;GACT,CAAC;EACH;EACA,YAAY;GAAE,IAAMI,IAAM;IAAE;IAAO,KAAKnH;IAAO;IAAU,OAAO,CAAC,GAAGiB,CAAK;IAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI0B,CAAU;IAAG,SAASxB,EAAU,KAAI,MAAMiG,MAAO,OAAO,OAAO,KAAK,IAAI,GAAG,KAAK,MAAMA,IAAKvG,CAAI,CAAC,CAAC;IAC9L,gBAAgBb,EAAM,iBAAiB,CAAC,EAAA,CAAG,KAAI,OAAM;KAAE,IAAIG,EAAE;KAAI,MAAMA,EAAE;KAAM,GAAGA,EAAE;KAAG,GAAGA,EAAE;KAAG,GAAGA,EAAE;KAAG,IAAIA,EAAE;KAAI,OAAO7C,EAAoB6C,CAAC;IAAE,EAAE;IAAG,OAAOM,EAAM,KAAI,OAAM;KAAE,GAAGJ;KAAG,MAAMA,EAAE,OAAOf;KAAQ,QAAQ,KAAK,IAAI,IAAIuB,KAAQiB,GAAS,IAAIzB,EAAE,EAAE,KAAK,cAActC,EAAM,QAAQ;IAAE,EAAE;IAAG,QAAQ2C,EAAO,KAAI,OAAM,EAAE,GAAGH,EAAE,EAAE;IAAG;IAAQ;IAAQ;IAAQ,KAAK;KAAE,GAAGgB;KAAK,gBAAgBA,EAAI,kBAAkB9B;IAAsB;GAAE;GAAgB,OAAb,IAAS,CAAC,GAAU0H;EAAK;EACxc,cAAc,GAAQ,GAAS;GAE7B,OADI7F,KAAaF,MAAW,SAAe,QAAQ,OAAO,gBAAI,MAAM,wBAAwB,CAAC,IACtFmB,EAAK,cAAczC,GAAQuH,CAAO;EAC3C;EACA,YAAY;GAAE,AAAI,CAAC/F,KAAaF,MAAW,WAAcmB,EAAK,mBAAkBA,EAAK,iBAAiB,IAAQA,EAAK,QAAQ;EAAK;EAChI,UAAU;GAAE,AAAI,CAACjB,KAAaF,MAAW,WAAUY,GAAa,IAAI1C,CAAM,GAAGgD,EAAK,EAAE,GAAG,UAAU,CAAC,GAAGqD,GAAa;EAAK;EACvH,SAAS;GAAE,AAAI,CAACrE,KAAaF,MAAW,WAAU,IAAgB,IAAM,IAAY,YAAYkB,EAAK,EAAE,GAAG,SAAS,CAAC,GAAGe,GAAOxD,CAAM;EAAK;EACzI,UAAU;GAAE,AAAIyB,MAAmB,IAAY,IAAMiB,EAAK,QAAQ,GAAG,IAAS,CAAC,GAAG,IAAQ,CAAC,GAAG,IAAS,CAAC;EAAG;CAC7G;AACF;AC7MA,IAAa+E,IAAa,MAAM,KAAK,IAE/BC,KAAO,GAAO,MAAc,OAAO,SAASC,CAAK,IAAIA,IAAQC;AAGnE,SAAgBC,EAAY,GAAO;CACjC,IAAMhB,IAAI1G,KAAS,CAAC,GACd2G,IAAID,EAAE,UAAUA;CACtB,IAAI,OAAO,SAASC,EAAE,IAAI,KAAK,OAAO,SAASA,EAAE,IAAI,KAAK,OAAO,SAASA,EAAE,IAAI,KAAK,OAAO,SAASA,EAAE,IAAI,GACzG,OAAOgB,EAAS;EAAE,MAAMhB,EAAE;EAAM,MAAMA,EAAE;EAAM,MAAMA,EAAE;EAAM,MAAMA,EAAE;CAAK,CAAC;CAE5E,IAAMxD,IAAIoE,EAAIb,EAAE,OAAOa,EAAIb,EAAE,MAAA,GAAwB,CAAC,GAChDvG,IAAIoH,EAAIb,EAAE,OAAOa,EAAIb,EAAE,QAAQa,EAAIb,EAAE,MAAMvD,CAAC,CAAC,CAAC;CAEpD,OAAOwE,EADUjB,EAAE,aAAa,MAAQA,EAAE,WAAW,WAEjD;EAAE,MAAM,CAACvD,IAAI;EAAG,MAAM,CAAChD,IAAI;EAAG,MAAMgD,IAAI;EAAG,MAAMhD,IAAI;CAAE,IACvD;EAAE,MAAM;EAAG,MAAM;EAAG,MAAMgD;EAAG,MAAMhD;CAAE,CAAC;AAC5C;AAEA,SAASwH,EAAS,GAAK;CACrB,OAAO;EAAE,GAAGC;EAAK,OAAOA,EAAI,OAAOA,EAAI;EAAM,OAAOA,EAAI,OAAOA,EAAI;EAAM,KAAKA,EAAI,OAAOA,EAAI,QAAQ;EAAG,KAAKA,EAAI,OAAOA,EAAI,QAAQ;CAAE;AACxI;AAGA,SAAgBC,EAAe,GAAO;CAEpC,QADa7H,GAAO,aAAa,CAAC,EAAA,CAE/B,QAAQ,MAAM,OAAO,SAAS8H,GAAG,CAAC,KAAK,OAAO,SAASA,GAAG,CAAC,CAAC,CAAC,CAC7D,KAAK,OAAO;EAAE,GAAGA,EAAE;EAAG,GAAGA,EAAE;EAAG,GAAGP,EAAIO,EAAE,GAAGP,EAAIO,EAAE,QAAQ,GAAG,CAAC;EAAG,MAAMA,EAAE,SAAS,SAAS,SAAS;CAAO,EAAE;AAChH;AAEA,IAAaC,KAAa,MAAWC,IAAQA,EAAM,KAAKA,EAAM,QAAQ,OAAO;AAG7E,SAAgBC,EAAU,GAAO,GAAO;CACtC,IAAMC,IAAOzH,KAAS,CAAC,GACjBqD,IAAQkE,GAAO,QAAQA,GAAO,MAAMA,GAAO,SAASA,GAAO;CACjE,IAAIlE,KAAS,MAAM;EACjB,IAAMqE,IAAQD,EAAK,MAAM,MAAM,OAAO7H,EAAE,EAAE,MAAM,OAAOyD,CAAK,CAAC;EAC7D,IAAIqE,GAAO,OAAOA;CACpB;CACA,IAAI,CAAC,OAAO,SAASH,GAAO,CAAC,KAAK,CAAC,OAAO,SAASA,GAAO,CAAC,GAAG,OAAO;CACrE,IAAII,IAAO,MACPC,IAAQ;CACZ,KAAK,IAAM,KAAKH,GAAM;EACpB,IAAM/H,KAAK,EAAE,IAAI6H,EAAM,MAAM,KAAK,EAAE,IAAIA,EAAM,MAAM;EACpD,AAAI7H,IAAIkI,MAAS,IAAQlI,GAAG,IAAO;CACrC;CACA,OAAOiI;AACT;AAEA,IAAaE,KAAY,GAAO,MAAQlJ,KAAM,OAAO,QAAQqB,KAAS,CAAC,EAAA,CAAG,MAAM,MAAM,OAAOJ,EAAE,EAAE,MAAM,OAAOjB,CAAE,CAAC,KAAK,MACzGmJ,KAAY,OAAW9H,KAAS,CAAC,EAAA,CAAG,MAAM,MAAMJ,EAAE,IAAI,KAAK,MAG3DmI,KAAe,GAAI,IAAQ,OAAU,CAACC,KAASpD,KAAM,KAAK,IAAI,OAAM,KAEpEqD,KAAa,MAAM;CAC9B,IAAIC,IAAIjC,KAAK,KAAK,KAAK;CAGvB,OAFIiC,IAAI,KAAK,OAAI,KAAK,KAAK,KAAK,IAC5BA,IAAI,CAAC,KAAK,OAAI,KAAK,KAAK,KAAK,IAC1BA;AACT;AAMA,SAAgBC,GAAkB,EAAE,eAAY,IAAK,eAAY,KAAM,YAAS,QAAQ,CAAC,GAAG;CAC1F,IAAIC,IAAO,MACPC,IAAS,IACTC,IAAU,IACVC,IAAW,GACXC,IAAW;CACf,OAAO;EACL,OAAO,GAAM,GAAM;GACjB,IAAM9B,IAAM,CAAC;GACb,IAAI,CAACtD,KAAQA,EAAK,UAAU,IAK1B,OAJIiF,KAAQ3B,EAAI,KAAK,EAAE,MAAM,WAAW,CAAC,GACrC4B,KAAS5B,EAAI,KAAK,EAAE,MAAM,aAAa,CAAC,GAC5C,IAAS,IAAU,IACnB,IAAO,MACAA;GAET,IAAMX,IAAK,KAAK,IAAI,GAAGD,CAAI,IAAI;GAC/B,IAAIsC,GAAM;IACR,IAAMtE,IAAQ,KAAK,MAAMV,EAAK,IAAIgF,EAAK,GAAGhF,EAAK,IAAIgF,EAAK,CAAC,IAAIrC,GACvD0C,IAAO,KAAK,IAAIR,GAAW7E,EAAK,OAAO,KAAKgF,EAAK,GAAG,CAAC,IAAIrC,GACzD2C,KAAS,KAAK,IAAIT,GAAW7E,EAAK,aAAa,MAAMA,EAAK,OAAO,KAAKgF,EAAK,GAAG,CAAC,IAAIrC,GACnF4C,IAAW7E,IAAQ8E,KAAaH,IAAOI;IAE7C,AADA,IAAWF,IAAW,IAAIJ,IAAWzC,GACjC6C,KAAY,CAACN,KAAU,IAAS,IAAM3B,EAAI,KAAK,EAAE,MAAM,aAAa,CAAC,KAChE,CAACiC,KAAYN,KAAUE,KAAYO,MAAU,IAAS,IAAOpC,EAAI,KAAK,EAAE,MAAM,WAAW,CAAC;IACnG,IAAMqC,IAAYL,KAASG;IAE3B,AADA,IAAWE,IAAY,IAAIP,IAAW1C,GAClCiD,KAAa,CAACT,KAAW,IAAU,IAAM5B,EAAI,KAAK,EAAE,MAAM,eAAe,CAAC,KACrE,CAACqC,KAAaT,KAAWE,KAAYM,MAAU,IAAU,IAAOpC,EAAI,KAAK,EAAE,MAAM,aAAa,CAAC;GAC1G;GAEA,OADA,IAAO;IAAE,GAAGtD,EAAK;IAAG,GAAGA,EAAK;IAAG,KAAKA,EAAK,OAAO;IAAG,KAAK6E,GAAW7E,EAAK,aAAa,MAAMA,EAAK,OAAO,EAAE;GAAE,GACpGsD;EACT;EACA,QAAQ;GAGN,AAFA,IAAO,MACP,IAAS,IAAU,IACnB,IAAW,IAAW;EACxB;EACA,IAAI,SAAS;GAAE,OAAO2B;EAAQ;EAC9B,IAAI,UAAU;GAAE,OAAOC;EAAS;CAClC;AACF;AAGA,SAAgBU,EAAe,GAAO;CACpC,QAAQ1B,EAAUC,CAAK,GAAvB;EACE,KAAK,QAAQ,OAAO,CAAC,EAAE,MAAM,OAAO,GAAG,EAAE,MAAM,mBAAmB,CAAC;EACnE,KAAK,UAAU,OAAO,CAAC;GAAE,MAAM;GAAU,MAAMA,EAAM,SAAS,aAAa,aAAa;EAAU,CAAC;EACnG,KAAK,OAAO,OAAO,CAAC,EAAE,MAAM,WAAW,CAAC;EACxC,KAAK,aAAa,OAAO,CAAC,EAAE,MAAM,YAAY,CAAC;EAC/C,SAAS,OAAO,CAAC;CACnB;AACF;AAGA,SAAgB0B,GAAW,GAAQ;CACjC,IAAI,CAACC,KAAUA,EAAO,WAAW,QAAQ,OAAO;CAChD,IAAM1H,IAAKsG,EAASoB,EAAO,KAAK;CAEhC,OADI,CAAC1H,KAAM0H,EAAO,UAAU,OAAa,OAClC,OAAOA,EAAO,MAAM,MAAM,OAAO1H,EAAG,EAAE,IAAI,YAAY;AAC/D;AAaA,IAAa2H,IAAY;CAAE,QAAQ;CAAW,QAAQ;CAAU,QAAQ;CAAY,OAAO;CAAoB,QAAQ;AAAS,GACnHC,KAAY;CAAE,QAAQ;CAAM,QAAQ;CAAM,QAAQ;CAAO,OAAO;CAAO,QAAQ;AAAK,GAGpFC,MAAc,MAAU,GAAQ9J,KAAS,OAAOA,EAAM,MAAO,YAAY4J,EAAU5J,EAAM,MACzF+J,KAAW,MAAWD,GAAW9J,CAAK,IAAI4J,EAAU5J,EAAM,MAAM;AAG7E,SAAgBgK,EAAa,GAAO;CAClC,QAAQhK,GAAO,aAAa,CAAC,EAAA,CAC1B,QAAQ,MAAM,OAAO,SAAS8H,GAAG,CAAC,KAAK,OAAO,SAASA,GAAG,CAAC,CAAC,CAAC,CAC7D,KAAK,MAAOA,EAAE,UAAU,SACrB;EAAE,IAAIA,EAAE;EAAI,OAAO;EAAQ,GAAGA,EAAE;EAAG,GAAGA,EAAE;EAAG,GAAGP,EAAIO,EAAE,GAAG,CAAC;EAAG,GAAGP,EAAIO,EAAE,GAAG,CAAC;EAAG,KAAKP,EAAIO,EAAE,KAAK,CAAC;EAAG,MAAMA,EAAE,QAAQ;CAAO,IACtH;EAAE,IAAIA,EAAE;EAAI,OAAO;EAAU,GAAGA,EAAE;EAAG,GAAGA,EAAE;EAAG,GAAGP,EAAIO,EAAE,GAAGP,EAAIO,EAAE,QAAQ,GAAG,CAAC;EAAG,MAAMA,EAAE,QAAQ;CAAO,CAAE;AAC/G;AAEA,SAAgBmC,EAAiB,GAAO;CACtC,QAAQjK,GAAO,iBAAiB,CAAC,EAAA,CAC9B,QAAQ,MAAM8H,GAAG,MAAM,QAAQ,OAAO,SAASA,EAAE,CAAC,KAAK,OAAO,SAASA,EAAE,CAAC,CAAC,CAAC,CAC5E,KAAK,OAAO;EAAE,IAAI,OAAOA,EAAE,EAAE;EAAG,GAAGA,EAAE;EAAG,GAAGA,EAAE;EAAG,GAAGP,EAAIO,EAAE,GAAGA,EAAE,SAAS,WAAW,KAAM,GAAG;EAAG,MAAMA,EAAE,SAAS,WAAW,WAAW;CAAQ,EAAE;AACpJ;AAGA,SAAgBoC,EAAoB,GAAQ;CAC1C,IAAM/C,oBAAM,IAAI,IAAI;CACpB,KAAK,IAAMhH,KAAKwJ,GAAQ,iBAAiB,CAAC,GAAG,AAAIxJ,KAAKA,EAAE,MAAM,SAASA,EAAE,UAAU,MAAU,OAAO,SAASA,EAAE,EAAE,KAAKA,EAAE,MAAM,MAAKgH,EAAI,IAAI,OAAOhH,EAAE,EAAE,CAAC;CACvJ,OAAOgH;AACT;AAEA,IAAMgD,MAAe,GAAQ,OAAUR,GAAQ,SAAS,CAAC,EAAA,CAAG,WAAW,MAAM,OAAOtJ,EAAE,EAAE,MAAM,OAAOwD,GAAM,EAAE,CAAC;AAE9G,SAAgBuG,GAAQ,GAAQ,GAAM;CACpC,IAAI,OAAO,SAASvG,GAAM,KAAK,GAAG,OAAOA,EAAK;CAC9C,IAAMvD,IAAI6J,GAAYR,GAAQ9F,CAAI,GAC5B8E,IAAI,MAAM,QAAQgB,GAAQ,KAAK,KAAKrJ,KAAK,IAAIqJ,EAAO,MAAMrJ,KAAK,KAAA;CACrE,OAAO,OAAO,SAASqI,CAAC,IAAIA,IAAI;AAClC;AAEA,SAAgB0B,GAAS,GAAQ,GAAM;CACrC,IAAI,OAAO,SAASxG,GAAM,MAAM,GAAG,OAAO,KAAK,IAAI,GAAGA,EAAK,MAAM;CACjE,IAAIA,GAAM,WAAW,IAAM,OAAO;CAClC,IAAMvD,IAAI6J,GAAYR,GAAQ9F,CAAI,GAC5B8E,IAAI,MAAM,QAAQgB,GAAQ,MAAM,KAAKrJ,KAAK,IAAIqJ,EAAO,OAAOrJ,KAAK;CACvE,OAAO,OAAO,SAASqI,CAAC,IAAI,KAAK,IAAI,GAAGA,CAAC,IAAI,QAAM;AACrD;AACA,SAAgB1I,GAAS,GAAQ;CAC/B,IAAMf,IAAI,OAAOyK,GAAQ,YAAYA,GAAQ,KAAK,SAASA,GAAQ,OAAO,KAAK;CAC/E,IAAI,OAAO,SAASzK,CAAC,KAAKA,IAAI,GAAG,OAAOA;CACxC,IAAM+B,KAAS0I,GAAQ,SAAS,CAAC,EAAA,CAAG,KAAK,MAAMS,GAAQT,GAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,OAAO,QAAQ;CACzF,OAAO1I,EAAM,SAAS,KAAK,IAAI,GAAGA,CAAK,IAAI;AAC7C;AAEA,IAAMqJ,oBAAY,IAAI,IAAI;CAAC;CAAW;CAAc;CAAa;AAAe,CAAC;AAEjF,SAAgBC,GAAY,GAAO,GAAQ;CACzC,IAAMC,IAAOzC,EAAUC,CAAK,GACtByC,IAASzC,GAAO,UAAUA,GAAO,QAAQA,GAAO,IAChD/F,IAAKsG,EAASoB,GAAQ,KAAK,GAC3Be,IAAOzI,KAAM,QAAQwI,KAAU,QAAQ,OAAOA,CAAM,MAAM,OAAOxI,EAAG,EAAE;CAC5E,QAAQuI,GAAR;EACE,KAAK,aAAa,OAAO,CAAC,WAAW;EACrC,KAAK,eAAe,OAAO,CAAC,aAAa;EACzC,KAAK,kBAAkB,OAAO,CAAC,gBAAgB;EAC/C,KAAK,YAAY,OAAO,CAAC,UAAU;EACnC,KAAK;EACL,KAAK,iBAAiB,OAAOE,KAAQD,KAAU,OAAO,CAAC,eAAe,IAAI,CAAC;EAC3E,SAAS,OAAOH,EAAU,IAAIE,CAAI,MAAME,KAAQD,KAAU,QAAQ,CAACD,CAAI,IAAI,CAAC;CAC9E;AACF;;AClNA,IAAMG,KAAS;CACb,QAAQ;EAAE,IAAI;EAAW,QAAQ;CAAU;CAC3C,QAAQ;EAAE,IAAI;EAAW,QAAQ;CAAU;CAC3C,QAAQ;EAAE,IAAI;EAAW,QAAQ;CAAU;CAC3C,OAAO;EAAE,IAAI;EAAW,QAAQ;CAAU;CAC1C,QAAQ;EAAE,IAAI;EAAW,QAAQ;CAAU;AAC7C,GACMC,KAAW;CACf,MAAM;CAAW,MAAM;CAAW,KAAK;CAAW,KAAK;CACvD,MAAM;CAAW,OAAO;CAAW,KAAK;CAAW,WAAW;CAAW,KAAK;AAChF,GACMC,KAAW;CAAE,OAAO;CAAW,MAAM;CAAW,WAAW;CAAW,QAAQ;CAAW,MAAM;CAAW,QAAQ;CAAW,QAAQ;CAAW,OAAO;CAAW,MAAM;CAAW,WAAW;CAAW,QAAQ;AAAU;AAGjO,SAAgBC,GAAkB,GAAW,EAAE,aAAU,CAAC,GAAG;CAC3D,IAAMC,IAAS,SAAS,cAAc,QAAQ;CAE9C,AADA,EAAO,MAAM,UAAU,wCACvBC,EAAU,YAAYD,CAAM;CAC5B,IAAME,IAAMF,EAAO,WAAW,IAAI;CAClC,IAAI,CAACE,GAAwB,MAAjBF,EAAO,OAAO,GAAa,MAAM,uBAAuB;CACpE,IAAMG,IAASxD,EAAY1H,CAAK,GAC1BmL,IAAMrB,GAAW9J,CAAK,IAAIA,IAAQ,MAClCoL,IAASD,IAAMR,GAAOQ,EAAI,MAAM;EAAE,IAAI;EAAW,QAAQ;CAAU,GACnEE,IAASF,IAAMnB,EAAahK,CAAK,IAAI6H,EAAe7H,CAAK,CAAC,CAAC,KAAK,OAAO;EAAE,GAAG8H;EAAG,OAAO;CAAS,EAAE,GACjGwD,IAASH,IAAMlB,EAAiBjK,CAAK,IAAI,CAAC,GAC1CuL,IAAQJ,KAAOnL,EAAM,SAAS,CAAC,EAAA,CAAG,QAAQ,MAAM6K,GAAS1K,GAAG,SAAS,OAAO,SAASA,EAAE,CAAC,KAAK,OAAO,SAASA,EAAE,CAAC,CAAC,IAAI,CAAC,GACxHqL,IAAQ,GACRrI,IAAI,GAAOsI,IAAI,GAAOC,IAAQ,GAAOC,KAAK,GAAOC,IAAK;CAC1D,SAASC,IAAS;EACwB,AAAxC,IAAI,KAAK,IAAI,GAAGb,EAAU,WAAW,GAAG,IAAI,KAAK,IAAI,GAAGA,EAAU,YAAY;EAC9E,IAAMc,IAAM,KAAK,IAAI,OAAO,oBAAoB,GAAG,CAAC;EAIf,AAHrC,EAAO,QAAQ3I,IAAI2I,GAAK,EAAO,SAASL,IAAIK,GAC5Cb,EAAI,aAAaa,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GACrC,IAAQ,KAAK,IAAI3I,IAAI+H,EAAO,OAAOO,IAAIP,EAAO,KAAK,GACnD,MAAM/H,IAAI+H,EAAO,QAAQQ,KAAS,GAAG,KAAMD,IAAIP,EAAO,QAAQQ,KAAS;CACzE;CACA,EAAO;CACP,IAAMK,IAAK,OAAO,kBAAmB,aAAa,IAAI,eAAeF,CAAM,IAAI;CAE/E,OADAE,GAAI,QAAQf,CAAS,GACd;EACL,MAAM;EAAM;EACZ,eAAe,GAAI,GAAI;GAAE,OAAO;IAAE,KAAKgB,IAAK,KAAK7I,IAAI,IAAIwI,MAAMD,IAAQR,EAAO;IAAM,KAAK,IAAIe,KAAMR,IAAI,IAAIG,KAAMF,IAAQR,EAAO;GAAK;EAAG;EACxI,OAAO,GAAO,IAAO,IAAI;GAIQ,AAH/B,MAAU,OAAO3E,CAAI,KAAK,MAAM,KAChC,EAAI,YAAY6E,EAAO,IAAIH,EAAI,SAAS,GAAG,GAAG9H,GAAGsI,CAAC,GAClDR,EAAI,KAAK,GAAGA,EAAI,UAAUU,IAAIC,CAAE,GAAGX,EAAI,MAAMS,GAAOA,CAAK,GAAGT,EAAI,UAAU,CAACC,EAAO,MAAM,CAACA,EAAO,IAAI,GACpG,EAAI,YAAYE,EAAO,QAAQH,EAAI,SAASC,EAAO,MAAMA,EAAO,MAAMA,EAAO,OAAOA,EAAO,KAAK;GAChG,KAAK,IAAM/K,KAAKoL,GAA0H,AAAjH,EAAI,YAAYV,GAAS1K,EAAE,OAAO8K,EAAI,UAAU,GAAGA,EAAI,IAAI9K,EAAE,GAAGA,EAAE,GAAG,OAAQ,OAAOA,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG8K,EAAI,KAAK;GACnJ,KAAK,IAAMnD,KAAKuD,GAEd,AADA,EAAI,YAAYT,GAAS9C,EAAE,SAAS,WAChCA,EAAE,UAAU,UAEdmD,EAAI,KAAK,GAAGA,EAAI,UAAUnD,EAAE,GAAGA,EAAE,CAAC,GAAGmD,EAAI,OAAOnD,EAAE,GAAG,GAAGmD,EAAI,SAAS,CAACnD,EAAE,IAAI,GAAG,CAACA,EAAE,IAAI,GAAGA,EAAE,GAAGA,EAAE,CAAC,GAC7FA,EAAE,SAAS,UAAS,EAAI,cAAc,WAAW,EAAI,YAAY,KAAMmD,EAAI,WAAW,CAACnD,EAAE,IAAI,GAAG,CAACA,EAAE,IAAI,GAAGA,EAAE,GAAGA,EAAE,CAAC,IACtHmD,EAAI,QAAQ,MACLA,EAAI,UAAU,GAAGA,EAAI,IAAInD,EAAE,GAAGA,EAAE,GAAGA,EAAE,GAAG,GAAG,KAAK,KAAK,CAAC,GAAGmD,EAAI,KAAK;GAE7E,IAAMiB,IAAShC,EAAoB7D,CAAK;GACxC,KAAK,IAAM8F,KAAKb,GACd,AAAIY,EAAO,IAAIC,EAAE,EAAE,MACfA,EAAE,SAAS,YAAY,EAAI,YAAY,WAAWlB,EAAI,UAAU,GAAGA,EAAI,IAAIkB,EAAE,GAAGA,EAAE,GAAGA,EAAE,GAAG,GAAG,KAAK,KAAK,CAAC,GAAGlB,EAAI,KAAK,GAAG,EAAI,cAAc,WAAW,EAAI,YAAY,KAAMA,EAAI,OAAO,MAClL,EAAI,YAAY,WAAWA,EAAI,SAASkB,EAAE,IAAIA,EAAE,IAAI,IAAKA,EAAE,IAAIA,EAAE,IAAI,IAAKA,EAAE,IAAI,KAAKA,EAAE,IAAI,GAAG,GAAG,EAAI,cAAc,WAAW,EAAI,YAAY,IAAKlB,EAAI,WAAWkB,EAAE,IAAIA,EAAE,IAAI,IAAKA,EAAE,IAAIA,EAAE,IAAI,IAAKA,EAAE,IAAI,KAAKA,EAAE,IAAI,GAAG;GAEjO,KAAK,IAAMtI,KAAQwC,EAAM,SAAS,CAAC,GAAG;IAIwJ,AAH5L4E,EAAI,KAAK,GAAGA,EAAI,UAAUpH,EAAK,GAAGA,EAAK,CAAC,GAAGoH,EAAI,OAAOpH,EAAK,GAAG,GAC9D,EAAI,YAAYA,EAAK,UAAU,KAAQ,SAASA,EAAK,SAAS,WAC9DoH,EAAI,SAAS,IAAI,MAAM,GAAG,GAAG,GAAGA,EAAI,QAAQ,GAC5CA,EAAI,KAAK,GAAGA,EAAI,UAAUpH,EAAK,GAAGA,EAAK,CAAC,GAAGoH,EAAI,OAAOpH,EAAK,SAAS,GAAG,EAAI,cAAc,WAAW,EAAI,YAAY,IAAKoH,EAAI,UAAU,GAAGA,EAAI,OAAO,GAAG,CAAC,GAAGA,EAAI,OAAO,GAAG,CAAC,GAAGA,EAAI,OAAO,GAAGA,EAAI,QAAQ;IACxM,IAAMmB,IAASvI,EAAK,UAAU,KAAQ,IAAIwG,GAAShE,GAAOxC,CAAI;IAE9D,AADIuI,IAAS,MAAMA,IAAS,OAAO,KAAK,MAAMZ,IAAQ,CAAC,IAAI,KAAM,OAAM,EAAI,YAAY,0BAA0B,EAAI,cAAc,WAAW,EAAI,YAAY,KAAMP,EAAI,UAAU,GAAGA,EAAI,IAAIpH,EAAK,GAAGA,EAAK,GAAG,KAAK,GAAG,KAAK,KAAK,CAAC,GAAGoH,EAAI,KAAK,GAAGA,EAAI,OAAO,IACtPpH,EAAK,SAAQ,EAAI,cAAc,QAAQ,EAAI,YAAY,IAAKoH,EAAI,UAAU,GAAGA,EAAI,IAAIpH,EAAK,GAAGA,EAAK,GAAG,GAAG,GAAG,KAAK,KAAK,CAAC,GAAGoH,EAAI,OAAO;GAC1I;GACA,EAAI,YAAY;GAChB,KAAK,IAAMlE,KAASV,EAAM,UAAU,CAAC,GAAsE,AAAjE4E,EAAI,UAAU,GAAGA,EAAI,IAAIlE,EAAM,GAAGA,EAAM,GAAG,IAAK,GAAG,KAAK,KAAK,CAAC,GAAGkE,EAAI,KAAK;GACpH,EAAI,QAAQ;EACd;EACA,UAAU;GAAoB,AAAlBc,GAAI,WAAW,GAAGhB,EAAO,OAAO;EAAG;CACjD;AACF;;A,mDClEMwB,MAAO,GAAK,MAAS;CAAE,EAAkB,SAAS,CAAC,CAAC,IAAI7J,GAAK8J,CAAI,CAAC,CAAC,YAAY,CAAC,CAAC;AAAG,GACpFC,MAAa,MAAU;CAAuC,AAArC,EAAM,WAAW,GAAG,EAAM,QAAQ,GAAG,EAAM,OAAO;AAAO,GAClFC,KAAa,KAEbC,MAAW,MAAY7C,GAAWH,GAAQ,GAAG,IAAIA,EAAO,MAAMA,GAAQ;AAC5E,SAASiD,EAAO,EAAE,UAAO,QAAK,YAAS;CACrC,IAAI,CAAC,OAAO,SAAS3L,CAAK,GAAG,OAAO;CACpC,IAAM4L,IAAQ,KAAK,IAAI5L,GAAO6L,KAAO7L,CAAK;CAC1C,OAAO,kBAAC,QAAD;EAAM,WAAW,YAAYA,MAAU,KAAK4L,IAAQ,IAAI,qBAAqB;EAAM,MAAK;EAAM,cAAY,GAAGE,EAAM,IAAI9L,EAAM,GAAGA,MAAU,IAAI,SAAS;EAC3J,UAAA,MAAM,KAAK,EAAE,QAAQ4L,EAAM,IAAI,GAAG,MAAM,kBAAC,QAAD;GAAc,WAAWvM,IAAIW,IAAQ,aAAa;GAA2B,eAAY;GAAQ,UAAAX,IAAIW,IAAQ,OAAO;EAAW,GAApHX,CAAoH,CAAC;CACrK,CAAA;AACR;AACA,SAAS0M,GAAe,GAAK,GAAW;CACtC,IAAMC,IAAS1L,GAAK;CAWpB,OAVI0L,GAAQ,WAAW,aAAmB,6BACtCA,GAAQ,WAAW,YAAkB,uCACrCA,GAAQ,WAAW,iBAAuB,+DAC1C1L,GAAK,UAAU,cAAoB,2BACnC0L,GAAQ,WAAW,YAAY1L,GAAK,UAAU,YAAYA,GAAK,QAAQ,WAAiB,4CACxF2L,IAAkB,iDAClB3L,GAAK,UAAU,gBAAgBA,GAAK,UAAU,iBAAuB,kBACrEA,GAAK,UAAU,cAAoB,4CACnCA,GAAK,UAAU,YAAkB,8BACjCA,GAAK,UAAU,gBAAsB,+CAClC;AACT;AAEA,SAAS4L,GAAkB,EAAE,YAAS,kBAAe,eAAY,cAAW,eAAY,MAAS;CAC/F,IAAMC,IAAaC,EAAWlP,CAAW,CAAC,EAAE,QAAQ,QAC9CoB,IAAO7B,GAAc,MAAU2I,EAAM,MAAMiH,EAAQ,GACnDC,IAAeC,EAAOC,CAAS;CACrC,EAAa,UAAUA;CACvB,IAAMC,IAAQF,EAAO,IAAI,GAASG,IAAQH,EAAO,IAAI,GAASI,IAAWJ,EAAO,IAAI,GAC9E5M,IAAQ4M,EAAO;EAAE,UAAU;EAAG,OAAO;EAAG,MAAM;CAAM,CAAC,GACrD,CAACK,GAAMC,MAAWC,EAAS,IAAI,GAAS,CAACC,GAAOC,KAAYF,EAAS,EAAE,GAAS,CAACG,IAAUC,MAAeJ,EAAS,EAAK,GACxH,CAACK,IAAMC,KAAWN,EAAS,SAAS,GACpC,CAACO,GAAUC,KAAeR,EAAS,EAAK,GACxC,CAACS,GAAWC,KAAgBV,EAAS,CAAC,GACtCW,IAAYb,GAAM,KAAK,UAAU;CASvC,AARAc,QAAgB;EACd,IAAI,CAACpP,KAAQA,EAAK,WAAW,YAAYmP,GAAW;GAAE,EAAa,CAAC;GAAG;EAAkB;EACzF,IAAME,IAAU,KAAK,IAAI,GACnBC,IAAQ,kBAAkBJ,EAAa,KAAK,IAAI,IAAIG,CAAO,GAAG,GAAI;EACxE,aAAa,cAAcC,CAAK;CAClC,GAAG;EAACvB;EAAS/N,GAAM;EAAQmP;CAAS,CAAC,GACrCC,QAAgB;EAAE,EAAY,EAAK;CAAG,GAAG,CAACrB,GAAS/N,GAAM,MAAM,CAAC,GAEhEoP,QAAgB;EACd,AAAIlB,KAAahB,GAAU7L,EAAM,OAAO,GAAG9B,EAAkB,KACxD8O,EAAS,SAAS,OAAO;CAChC,GAAG,CAACH,CAAS,CAAC;CACd,IAAMqB,IAAS,CAAC,UAAU,KAAK,CAAC,CAAC,SAASvP,GAAM,MAAM,GAChD,CAACS,GAAO+O,KAAYhB,EAAS,IAAI;CAwEvC,IAvEAY,QAAgB;EACd,IAAI,CAACG,KAAU,CAAC9O,KAAS,CAAC0N,EAAM,SAAS;EACzC,IAAIsB,IAAW,IAAWC,IAAQ,MAC5B5H,IAAU;GAAE;GAAO,UAAU,WAAW,mBAAmB,CAAC,CAAC;GAAS,eAAe,WAAW,kCAAkC,CAAC,CAAC;GAAS,UAAU,MAAU;IAAE,AAAIW,EAAM,SAAS,kBAAgBmG,GAAY,EAAI;GAAG;EAAE,GAC3N1G,UAAiB;GAAE,AAAKuH,MAAY,IAAQlE,GAAkB4C,EAAM,SAASrG,CAAO,GAAG,EAAS,UAAU4H,GAAOZ,EAAQ,IAAI;EAAK;EAGxI,OAFIH,KAAUzG,EAAS,IAClB,OAAO,gCAA6B,CAAC,MAAM,EAAE,yBAAsB;GAAE,IAAI,CAACuH,GAAY,IAAI;IAA6E,AAA3E,IAAQE,EAAgBxB,EAAM,SAASrG,CAAO,GAAG,EAAS,UAAU4H,GAAOZ,EAAQ,IAAI;GAAG,QAAQ;IAAE,EAAS;GAAG;EAAI,CAAC,CAAC,CAAC,MAAM5G,CAAQ,SACzN;GAAqC,AAAnC,IAAW,IAAMwH,GAAO,QAAQ,GAAOrB,EAAS,YAAYqB,MAAO,EAAS,UAAU;EAAM;CAC7G,GAAG;EAACH;EAAQ9O;EAAOkO;CAAQ,CAAC,GAC5BS,QAAgB;EACd,IAAI,CAACG,KAAUvP,EAAK,WAAW,YAAY,CAACmO,EAAM,SAAS;EAC3D,IAAIsB,IAAW,IAAW9I,IAAQ,GAAO2C,IAAO,YAAY,IAAI,GAAOsG,IAAY,GAAOC,IAAU,MAC9FC,IAAUzG,GAAkB,GAAShE,oBAAO,IAAI,IAAI;EAC1D,EAAiB;EACjB,IAAI0K;EACJ,IAAI;GACF,IAAMxJ,IAAYpI,EAAa,SAAS,CAAC,CAAC,oBAAoB4P,CAAO;GAErE,AADA,IAAUjO,EAAgB;IAAE,YAAY+N,GAAY;IAAY,oBAAoBA,GAAY;IAAoB;IAAM,QAAQ,OAAOmC,CAAa;IAAG,QAAQ,OAAOhQ,EAAK,MAAM,MAAM,OAAOgQ,CAAa;IAAG;GAAU,CAAC,GAC3N,EAAM,UAAUD;EAClB,SAAS,GAAG;GAAE,EAAS,EAAE,WAAW,2BAA2B;GAAG;EAAkB;EACpF,EAAS3C,GAAQ2C,EAAQ,UAAU,CAAC,CAAC;EACrC,IAAInO,IAAY,MAAUqO,KAAW;EACrC,SAASC,IAAQ;GAA0C,AAAxC7K,EAAK,MAAM,GAAG6H,GAAU7L,EAAM,OAAO,GAAG9B,EAAkB;EAAG;EAChF,SAAS4D,EAAI,GAAO,GAAM;GACxB,AAAI,4BAA4B,KAAKsF,EAAM,QAAQ,OAAO,KACrD;IAAC;IAAQ;IAAQ;IAAQ;IAAQ;IAAW;IAAa;IAAa;IAAc;GAAO,CAAC,CAAC,SAASA,EAAM,IAAI,MACrHA,EAAM,eAAe,GAAO0H,IAAM9K,EAAK,IAAIoD,EAAM,IAAI,IAAQpD,EAAK,OAAOoD,EAAM,IAAI,GACnF,EAAM,QAAQ,WAAW,OAAOpD,EAAK,IAAI,MAAM,KAAKA,EAAK,IAAI,SAAS,CAAC,IAAI,OAAOA,EAAK,IAAI,MAAM,KAAKA,EAAK,IAAI,WAAW,CAAC,GAC3H,EAAM,QAAQ,QAAQ,OAAOA,EAAK,IAAI,MAAM,KAAKA,EAAK,IAAI,YAAY,CAAC,IAAI,OAAOA,EAAK,IAAI,MAAM,KAAKA,EAAK,IAAI,WAAW,CAAC,GAC3H,EAAM,QAAQ,OAAOA,EAAK,IAAI,OAAO;EACvC;EACA,IAAM8K,KAAQ,MAAMhN,EAAI,GAAG,EAAI,GAASiN,KAAM,MAAMjN,EAAI,GAAG,EAAK,GAC1DkN,IAAOlC,EAAM;EACyD,AAA5EkC,EAAK,iBAAiB,WAAWF,CAAI,GAAGE,EAAK,iBAAiB,SAASD,CAAE,GAAGC,EAAK,iBAAiB,QAAQH,CAAK;EAC/G,IAAMI,UAAmB;GAAE,AAAI,SAAS,UAAQJ,EAAM;EAAG;EAEzD,AADA,SAAS,iBAAiB,oBAAoBI,CAAU,GACxDlR,GAAiB,EAAE,MAAM,eAAe,GAAG2O,CAAO;EAClD,SAASwC,EAAK,GAAK;GACjB,IAAId,GAAU;GACd,IAAMxI,IAAK,KAAK,IAAI,IAAIuJ,IAAMlH,CAAI;GAAG,IAAOkH;GAC5C,IAAMC,IAASzC,EAAa,WAAW,SAAS;GAEhD,AADA+B,EAAQ,SAASU,IAAS;IAAE,UAAU;IAAG,OAAO;IAAG,MAAM;GAAM,IAAIpP,EAAM,OAAO,GAChF0O,EAAQ,KAAK9I,CAAE;GAAG,IAAMH,IAAQiJ,EAAQ,UAAU;GAGlD,IAFKU,KAAQpC,EAAS,SAAS,OAAOvH,GAAOG,CAAE,GAC3CwJ,MAAUpL,EAAK,MAAM,GAAGyK,EAAQ,MAAM,GAAGvQ,EAAkB,GAAG,KAAW,KACzE,CAACkR,GAAQ,KAAK,IAAMhI,KAAS3B,EAAM,UAAU,CAAC,GAAG,KAAK,IAAM4J,KAASxG,EAAezB,CAAK,GAAG,GAAiBiI,GAAOjI,EAAM,EAAE;GAChI,IAAI,CAACgI,GAAQ,KAAK,IAAMhI,KAAS3B,EAAM,UAAU,CAAC,GAAG,KAAK,IAAM6J,KAAQ3F,GAAYvC,GAAO3B,CAAK,GAAG,EAAa6J,CAAI;GACpH,IAAMC,IAAM5H,EAASlC,EAAM,KAAK;GAChC,KAAK,IAAM2B,KAAS3B,EAAM,UAAU,CAAC,GAAG;IACtC,IAAMoE,IAASzC,GAAO,UAAUA,GAAO;IACvC,AAAKmI,KAAO1F,KAAU,QAAQ,OAAOA,CAAM,MAAM,OAAO0F,EAAI,EAAE,MAC1DpI,EAAUC,CAAK,MAAM,gBAAa,IAAY+H,KAAO,OAAO,SAAS/H,EAAM,SAAS,IAAIA,EAAM,YAAY0E,MAC1G3E,EAAUC,CAAK,MAAM,cAAW,IAAY;GAClD;GACA,AAAImI,GAAK,UAAU,MAAShP,KAAa,QAAQ4O,KAAO5O,MAAW,IAAY;GAC/E,IAAMiP,IAAa,CAACJ,KAAU3J,EAAM,WAAW,aAAa8J,GAAK,UAAU,MAAS9F,GAAShE,GAAO8J,CAAG,IAAI;GAC3G,AAAIC,MAAeZ,OAAY,KAAWY,GAAgBA,IAAY5R,GAAe,aAAa,IAAQC,GAAc,aAAa;GACrI,IAAM4R,IAAWF,IAAM9J,EAAM,MAAM,QAAQ8J,CAAG,IAAI,IAC5CG,IAAY,OAAO,SAASjK,EAAM,UAAUgK,EAAS,IAAIhK,EAAM,QAAQgK,KAAYlP,KAAa,QAAQkF,EAAM,WAAW,YAAY,KAAK,IAAI,GAAGlF,IAAY4O,CAAG,IAAI;GAC1K,IAAI,CAACC,GAAQ,KAAK,IAAMhI,KAASqH,EAAQ,OAAO9G,EAASlC,EAAM,KAAK,GAAGG,CAAE,GAAG,GAAiBwB,CAAK;GAClG,IAAMuI,IAAc7G,GAAWrD,CAAK;GAGpC,AAFIkK,KAAe,CAACnB,MAAW,IAAY,MAAMtB,GAAQ;IAAE,GAAGzH;IAAO,WAAW;GAAE,CAAC,GAAG,IAAUkK,GAAkBP,KAAQnR,GAAYuQ,GAAS9B,CAAO,GAAG5P,EAAa,SAAS,CAAC,CAAC,aAAa4P,GAASjH,EAAM,MAAM,IAC/M0J,IAAMZ,IAAY,QAAO,IAAYY,GAAKjC,GAAQ;IAAE,GAAGzH;IAAO;GAAU,CAAC,IAC7E,IAAQ,sBAAsByJ,CAAI;EACpC;EAEA,OADA,IAAQ,sBAAsBA,CAAI,SACrB;GAEgH,AAD3H,IAAW,IAAM,qBAAqB5J,CAAK,GAAGuJ,EAAM,GAAGH,EAAQ,QAAQ,GAAG,EAAM,UAAU,MAC1FM,EAAK,oBAAoB,WAAWF,CAAI,GAAGE,EAAK,oBAAoB,SAASD,CAAE,GAAGC,EAAK,oBAAoB,QAAQH,CAAK,GAAG,SAAS,oBAAoB,oBAAoBI,CAAU;EACxL;CACF,GAAG;EAACf;EAAQxB;EAASiC;CAAa,CAAC,GAC/B,CAAChQ,GAAM,OAAO;CAClB,IAAMiR,IAAQ,OAAOjB,CAAa,MAAM,OAAOhQ,EAAK,OAAO,GACrDkR,IAAO5C,GAAM,WAAW,UAAUtO,EAAK,WAAW,OAClDgC,IAAMsM,GAAM,KACZZ,IAAS1L,GAAK,YACdmP,KAAc;EAAC;EAAgB;EAAW;CAAU,CAAC,CAAC,SAASzD,GAAQ,MAAM,GAC7E0D,IAAoB,CAACjC,MAAcF,KAAa,QAASjN,GAAK,UAAU,YAAYA,GAAK,QAAQ,YAAY0L,GAAQ,WAAW,YAAY,EAAQe,IACpJ4C,KAAa9G,GAAW9J,CAAK,IAAIA,IAAQ,MACzC6Q,KAAY5Q,GAAS4N,CAAI,GACzBiD,MAAcjD,GAAM,SAAS,CAAC,EAAA,CAAG,MAAM,MAAS,OAAO,SAASzD,GAAQyD,GAAMhK,CAAI,CAAC,CAAC,MAAM+M,MAAc,QAAQC,KAAY,IAC5HE,KAAiB,KAAK,MAAMlD,GAAM,aAAa,KAAK,GAAI,GACxDmD,KAAYtC,IAAanN,GAAK,OAAO,UAAU,KAAO,eAAeA,GAAK,OAAO,UAAU,KAAQ,QAAQ,OAAQ,MACnH0P,KAAY,OAAO,GAAM,MAAY;EACzC,IAAI,CAACtD,EAAM,SAAS,eAAe,MAAU,MAAM,4EAA4E;EAC/H,MAAMA,EAAM,QAAQ,cAAcuD,GAAM7J,CAAO;CACjD;CAEA,SAAS8J,GAAI,GAAO;EAClB,IAAMC,IAAO1D,EAAM,SAAS,sBAAsB,GAASzL,IAAKsG,EAASsF,GAAM,KAAK;EACpF,IAAI,CAACuD,KAAQ,CAACnP,GAAI;EAClB,IAAMoP,IAASzD,EAAS,SAAS,gBAAgB5F,EAAM,UAAUoJ,EAAK,QAAQA,EAAK,QAAQ,IAAI,GAAG,KAAKpJ,EAAM,UAAUoJ,EAAK,OAAOA,EAAK,SAAS,CAAC;EAClJ,AAAIC,MAAQ,EAAM,QAAQ,YAAY,KAAK,MAAMA,EAAO,IAAIpP,EAAG,GAAGoP,EAAO,IAAIpP,EAAG,CAAC;CACnF;CACA,IAAMqP,MAAQ,GAAO,OAAW;EAAE,gBAAgB,MAAM;GAAsE,AAApE9O,EAAE,eAAe,GAAGA,EAAE,cAAc,kBAAkBA,EAAE,SAAS,GAAG,EAAM,QAAQ+O,KAAS/J;EAAO;EAAG,mBAAmB;GAAE,EAAM,QAAQ+J,KAASA,MAAU,UAAiB;EAAG;EAAG,uBAAuB;GAAE,EAAM,QAAQA,KAASA,MAAU,UAAiB;EAAG;EAAG,4BAA4B;GAAE,EAAM,QAAQA,KAASA,MAAU,UAAiB;EAAG;CAAE;CAClZ,OAAO,kBAAC,WAAD;EAAS,WAAW,yBAAyBzC,IAAS,qBAAqB;EAAM,cAAW;EAA5F,UAAA;GACL,kBAAC,UAAD;IAAQ,WAAU;IAAlB,UAAA,CAA8B,kBAAC,UAAD,EAAA,UAAQ,kBAAuB,CAAA,GAAC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MAAmC,kBAAC1Q,GAAD,EAAmB,SAASW,EAAqB,EAAI,CAAA;MAAEyS,KAAc,kBAAC,UAAD;OAAQ,SAASA;OAAY,cAAW;OAAY,UAAA;MAAS,CAAA;MAAGC,KAAa,kBAAC,UAAD;OAAQ,SAASA;OAAW,cAAW;OAAU,UAAA;MAAS,CAAA;KAAO;IAAS,CAAA,CAAA;;GAC5TlS,EAAK,WAAW,aAAa,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KAA2B,kBAAC,QAAD;MAAM,WAAU;MAAiB,eAAY;MAAO,UAAA;KAAQ,CAAA;KAAC,kBAAC,UAAD,EAAA,UAASiR,IAAQ,0BAA0B,qBAA6B,CAAA;KAAC,kBAAC,KAAD,EAAA,UAAIA,IAAQ,8CAA8C,iCAAoC,CAAA;KAAEA,KAAS,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAAmC,kBAAC,UAAD;OAAQ,WAAU;OAAoB,eAAejE,GAAIe,GAAS,aAAa;OAAG,UAAA;MAAuB,CAAA,GAAC,kBAAC,UAAD;OAAQ,eAAef,GAAIe,GAAS,cAAc;OAAG,UAAA;MAAgB,CAAA,CAAM;;IAAO;;GACtgBwB,KAAU,CAAC2B,KAAQ,kBAAC,OAAD;IAAK,WAAW,gCAAgC/B,IAAY,cAAciC,IAAoB,YAAY;IAA1G,UAAA;KAClB,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OAAwCjC,IAAY,kBAACgD,GAAD;QAAc,MAAM;QAAI,eAAY;OAAQ,CAAA,IAAIf,IAAoB,kBAACgB,GAAD;QAAe,MAAM;QAAI,eAAY;OAAQ,CAAA,IAAI,kBAACC,GAAD;QAAS,MAAM;QAAI,WAAU;QAAwB,eAAY;OAAQ,CAAA;OAAE,kBAAC,OAAD,EAAA,UAAA,CAAK,kBAAC,UAAD,EAAA,UAASjB,IAAoB,0BAA0B3D,GAAezL,GAAK,EAAK,EAAU,CAAA,GAAEoP,KAAqB,kBAAC,KAAD,EAAA,UAAG,qHAAqH,CAAA,CAAO,EAAA,CAAA;OAAEK,MAAa,kBAAC,QAAD;QAAM,WAAU;QAAkB,UAAAA;OAAgB,CAAA;MAAO;;KAChjB,CAACtC,KAAa,kBAAC,KAAD;MAAG,WAAU;MAAwB,MAAK;MAAU,UAAAiC,IAAoB3D,GAAezL,GAAKiN,KAAa,IAAK,IAAInQ,EAAekD,CAAG;KAAK,CAAA;KACvJ0L,GAAQ,WAAW,kBAAkB,kBAAC,KAAD;MAAG,WAAU;MAAuB,MAAK;MAAU,UAAAA,EAAO,WAAW,iEAAiE;KAA6D,CAAA;KACxOA,GAAQ,aAAa,QAAQA,EAAO,aAAa,KAAK,IAAI,KAAK,kBAAC,KAAD;MAAG,WAAU;MAAwB,MAAK;MAAS,UAAA;KAAgH,CAAA;KACnO,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAAuC,kBAAC,UAAD;OAAQ,MAAK;OAAS,WAAW0D,IAAoB,sBAAsB;OAAI,eAAepC,EAAY,EAAI;OAA9G,UAAA,CAAiH,kBAACsD,IAAD;QAAW,MAAM;QAAI,eAAY;OAAQ,CAAA,GAAC,iCAAuC;MAAE,CAAA,GAAA,CAACnD,KAAa,kBAAC,UAAD;OAAQ,MAAK;OAAS,UAAUgC;OAAa,eAAe/C,EAAM,SAAS,UAAU;OAArF,UAAA,CAAwF,kBAACmE,IAAD;QAAO,MAAM;QAAI,eAAY;OAAQ,CAAA,GAAC,qBAA2B;MAAO,CAAA,CAAA;;IACtZ;;GACL,kBAACxT,GAAD;IAAkB,MAAMgQ,KAAYQ,KAAU,CAAC2B;IAAM,eAAelC,EAAY,EAAK;IAAG,SAAS0C;IAAW,YAAYhE;GAAS,CAAA;IAC/H6B,KAAUjB,MAAS,kBAAA3Q,GAAA,EAAA,UAAA;IAAE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;OAA0B2Q,GAAM,SAAS,CAAC,EAAA,CAAG,KAAK,MAAS,kBAAC,QAAD,EAAA,UAAA;OAAqBhK,EAAK,OAAO,OAAO;OAAQ;OAAC,kBAAC,SAAD;QAAO,KAAI;QAAI,KAAI;QAAM,OAAOA,EAAK;QAAI,cAAYA,EAAK,OAAO,YAAY;OAAmB,CAAA;OAAC;OAAEA,EAAK;OAAG;OAAIiN,MAAc,kBAAClE,GAAD;QAAQ,OAAOxC,GAAQyD,GAAMhK,CAAI;QAAG,KAAKgN;QAAW,OAAOhN,EAAK,OAAO,cAAc;OAAoB,CAAA;OAAGwG,GAASwD,GAAMhK,CAAI,IAAI,KAAKA,EAAK,UAAU,MAAS,kBAAC,QAAD;QAAM,WAAU;QAAkB,OAAM;QAAgB,UAAA;OAAS,CAAA;MAAQ,EAAA,GAA5YA,EAAK,EAAuY,CAAC;MAAG+M,MAAc,kBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA;QAA0B/G,GAAU+G,GAAW;QAAI;QAAE7G,EAAQ6G,EAAU;OAAQ;;MAAE,kBAAC,QAAD;OAAM,MAAK;OAAX,UAAA;QAAqBlC,IAAYsC,MAAa,cAAchE,GAAezL,GAAKiN,KAAa,IAAK;QAAE;QAAE,OAAO,SAASjN,GAAK,GAAG,IAAI,KAAK,KAAK,MAAMA,EAAI,GAAG,EAAE,OAAO;OAAS;;KAAM;;IAC1vBwP,KAAiB,KAAK,CAACN,KAAQ,kBAAC,OAAD;KAAK,WAAU;KAAa,MAAK;KAAjC,UAAA;MAA0C;MAAeM;MAAe;KAAQ;;IAChH,kBAAC,OAAD;KAAK,WAAU;KAAW,KAAKrD;KAAO,UAAU;KAAG,cAAW;KAAwF,eAAeyD;KAAK,gBAAgB,MAAM;MAAU,AAARA,GAAI,CAAC,GAAO,EAAE,gBAAgB,YAAW,EAAE,cAAc,MAAM,GAAG,EAAE,cAAc,kBAAkB,EAAE,SAAS,GAAGA,GAAI,CAAC,GAAG,EAAM,QAAQ,OAAO;KAAQ;KAAG,mBAAmB;MAAE,EAAM,QAAQ,OAAO;KAAO;KAAG,uBAAuB;MAAE,GAAUvQ,EAAM,OAAO;KAAG;KAAG,4BAA4B;MAAE,EAAM,QAAQ,OAAO;KAAO;IAAI,CAAA;IACpgB,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MAA6B,kBAAC,OAAD;OAAK,WAAU;OAAc,MAAK;OAAQ,cAAW;OAAyB,gBAAgB,MAAM;QAAsB,AAApB,EAAE,eAAe,GAAG,EAAE,cAAc,kBAAkB,EAAE,SAAS;QAAG,IAAMoR,IAAI,EAAE,cAAc,sBAAsB;QAAwG,AAArG,EAAM,QAAQ,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,UAAUA,EAAE,OAAOA,EAAE,QAAQ,MAAMA,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAM,QAAQ,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,EAAE,UAAUA,EAAE,MAAMA,EAAE,SAAS,MAAMA,EAAE,SAAS,EAAE,CAAC;OAAG;OAAG,gBAAgB,MAAM;QAAE,IAAI,CAAC,EAAE,cAAc,kBAAkB,EAAE,SAAS,GAAG;QAAQ,IAAMA,IAAI,EAAE,cAAc,sBAAsB;QAAwG,AAArG,EAAM,QAAQ,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,UAAUA,EAAE,OAAOA,EAAE,QAAQ,MAAMA,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAM,QAAQ,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,EAAE,UAAUA,EAAE,MAAMA,EAAE,SAAS,MAAMA,EAAE,SAAS,EAAE,CAAC;OAAG;OAAG,mBAAmBvF,GAAU7L,EAAM,OAAO;OAAG,uBAAuB6L,GAAU7L,EAAM,OAAO;OAAG,4BAA4B6L,GAAU7L,EAAM,OAAO;OAAG,UAAA;MAAM,CAAA;MAAC,kBAAC,OAAD;OAAK,WAAU;OAAW,cAAW;OAArC,UAAA;QAA+D,kBAAC,UAAD;SAAQ,cAAW;SAAU,GAAI0Q,GAAK,YAAY,CAAC;SAAG,UAAA;QAAS,CAAA;QAAC,kBAAC,UAAD;SAAQ,cAAW;SAAkB,GAAIA,GAAK,SAAS,EAAE;SAAG,UAAA;QAAS,CAAA;QAAC,kBAAC,UAAD;SAAQ,cAAW;SAAa,GAAIA,GAAK,YAAY,EAAE;SAAG,UAAA;QAAS,CAAA;QAAC,kBAAC,UAAD;SAAQ,cAAW;SAAgB,GAAIA,GAAK,SAAS,CAAC;SAAG,UAAA;QAAS,CAAA;OAAM;;MAAC,kBAAC,UAAD;OAAQ,WAAU;OAAU,GAAIA,GAAK,QAAQ,EAAI;OAAG,UAAA;MAAgB,CAAA;KAAM;;IAC71C,kBAAC,OAAD;KAAK,WAAU;KAAY,UAAA,kBAAC,SAAD,EAAA,UAAA;MAAO;MAAQ,kBAAC,YAAD;OAAU,KAAI;OAAI,OAAO/I,EAASsF,GAAM,KAAK,CAAC,EAAE,UAAU;MAAI,CAAA;MAAC;OAAGtF,EAASsF,GAAM,KAAK,CAAC,EAAE,UAAU,MAAM,IAAI,UAAU;KAAqB,EAAA,CAAA;IAAM,CAAA;IAC5L,kBAAC,SAAD,EAAA,UAAO,qFAAyF,CAAA;IAAC,kBAAC,UAAD;KAAQ,eAAeM,IAAa,MAAM,CAACxF,CAAC;KAAI,UAAAyF,OAAS,OAAO,cAAc;IAAmB,CAAA;GAClM,EAAA,CAAA;GACDqC,KAAQ,kBAAC,KAAD;IAAG,MAAK;IAAR,UAAA;KAAkB,OAAO5C,GAAM,UAAUtO,EAAK,QAAQ,MAAM,OAAOgQ,CAAa,IAAI,eAAe;KAAkB;KAAC,kBAAC,UAAD;MAAQ,eAAe;OAAE,QAAa,QAAQ7R,EAAa,SAAS,CAAC,CAAC,cAAc4P,CAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;MAAG;MAAG,UAAA;KAAgB,CAAA;KAAEsD,MAAc,kBAAC,UAAD;MAAQ,eAAe;OAAE,QAAa,QAAQlT,EAAa,SAAS,CAAC,CAAC,cAAc4P,GAAS,EAAE,QAAQ,GAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;MAAG;MAAG,UAAA;KAAgC,CAAA;IAAK;;GACzbwB,KAAU,kBAAC,WAAD;IAAS,WAAU;IAAnB,UAAA,CAAoC,kBAAC,WAAD,EAAA,UAAS,0BAAgC,CAAA,GAAC,kBAAC,OAAD,EAAA,UAAM,KAAK,UAAUvQ,GAAsBsP,GAAM,GAAG,GAAG,MAAM,CAAC,EAAO,CAAA,CAAU;;GACvKiB,KAAU,CAAC2B,KAAQ,kBAAC,UAAD;IAAQ,eAAe9C,EAAM,SAAS,OAAO;IAAG,UAAA;GAAgB,CAAA;GACnFpO,EAAK,WAAW,kBAAC,KAAD;IAAG,MAAK;IAAS,UAAA;GAAY,CAAA;GAAGA,EAAK,gBAAgBA,EAAK,SAAS,kBAAC,UAAD;IAAQ,eAAe;KAAE,EAAkB,SAAS,CAAC,CAAC,MAAM+N,CAAO,CAAC,CAAC,YAAY,CAAC,CAAC;IAAG;IAAG,UAAA;GAAwB,CAAA;GACpMU,KAAS,kBAAC,KAAD;IAAG,MAAK;IAAS,UAAAA;GAAS,CAAA;GAAGzO,EAAK,SAAS,kBAAC,KAAD;IAAG,MAAK;IAAS,UAAAA,EAAK;GAAS,CAAA;GACnF,CAAC,CAAC,UAAU,UAAU,CAAC,CAAC,SAASA,EAAK,MAAM,KAAK,kBAAC,UAAD;IAAQ,WAAU;IAAY,UAAA,kBAAC,UAAD;KAAQ,eAAegN,GAAIe,GAAS,UAAU;KAAG,UAAA;IAAsB,CAAA;GAAS,CAAA;EACzJ;;AACX;AACA,IAAAhB,KAAe2F,EAAK9E,EAAiB"}