@journey-to-code/games 0.1.0 → 0.1.2

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.
@@ -0,0 +1,459 @@
1
+ // Bowling, for one to six players: the second game on the table-sports kit. Ten pins at the far end
2
+ // of a lane, ten frames, two balls a frame, a strike or a spare earns what the next ball or two
3
+ // knock down, and the highest score wins.
4
+ //
5
+ // The lane is a physics world seen from above, like Mini Golf's holes: the ball starts on the foul
6
+ // line and is struck at an angle and a power; pins are discs that knock into one another. The
7
+ // pieces are drawn bigger than a real alley's, so a phone shows what is going on, and the lane is
8
+ // shorter, but the spacing of the pins is a real one, and so is the order of play.
9
+ //
10
+ // A pin is down when it was moved from its spot, or knocked into a gutter or the pit. The pins that
11
+ // are standing when a ball has come to rest go back to their spots, so a wobble is no harm, and what
12
+ // is down is swept away (the second ball is bowled at the pins that are left). A ball that falls
13
+ // into a gutter goes no further, and neither does one that rolls into the pit: what it knocked on
14
+ // the way still counts. With bumpers on, the gutters are closed by rails along the lane, the way a
15
+ // children's lane is, and a ball bounces down the lane.
16
+ //
17
+ // Like Mini Golf, the room rebuilds a table by replaying the move log through `apply`, which
18
+ // simulates each ball again; the physics core is bit-for-bit deterministic (see minigolf.ts).
19
+ import { PHYSICS_VERSION, simulate } from "@journey-to-code/physics";
20
+ import { angleTo, restOf } from "./sport.js";
21
+ import { careless, clone, GameError, nextRandom, rankSeats, thinkFor, who } from "./table.js";
22
+ export const tenFrames = { id: "bowling-ten", name: "Ten frames", frames: 10, bumpers: false };
23
+ export const tenBumpers = { id: "bowling-ten-bumpers", name: "Ten frames, bumpers up", frames: 10, bumpers: true };
24
+ export const fiveFrames = { id: "bowling-five", name: "Quick five", frames: 5, bumpers: false };
25
+ export const fiveBumpers = { id: "bowling-five-bumpers", name: "Quick five, bumpers up", frames: 5, bumpers: true };
26
+ const PRESETS = [tenFrames, tenBumpers, fiveFrames, fiveBumpers];
27
+ // ---- The lane -----------------------------------------------------------------------------------
28
+ // Tenths of a millimetre, as in the physics core's examples. y runs down the screen: the pins are at
29
+ // the top, and the ball is rolled up the lane (angle 27000, straight ahead).
30
+ export const PIN_R = 800;
31
+ export const BALL_R = 1300;
32
+ const LANE_HALF = 5330;
33
+ /** The foul line, where the ball starts, and the head pin. */
34
+ export const FOUL_Y = 60000;
35
+ const HEAD_Y = 0;
36
+ /** Where the pit begins, behind the last row. */
37
+ const PIT_Y = -9500;
38
+ const GUTTER = 3400;
39
+ const SPACING = 3048;
40
+ const ROW = 2640;
41
+ export const BOWL_MIN_POWER = 150;
42
+ export const BOWL_MAX_POWER = 1000;
43
+ /** A pin moved further than this from its spot is down. */
44
+ const DOWN = 1400;
45
+ /** The spots of the ten pins, numbered as they are said: 1 at the front, 7 to 10 across the back, 7 on the left. */
46
+ export const PIN_SPOTS = (() => {
47
+ const spots = [];
48
+ for (let row = 0; row < 4; row++)
49
+ for (let i = 0; i <= row; i++)
50
+ spots.push([(i - row / 2) * SPACING, HEAD_Y - row * ROW]);
51
+ return spots.map(([x, y]) => [Math.round(x), y]);
52
+ })();
53
+ export const bowlingBallId = "ball";
54
+ export const pinId = (n) => `pin-${n}`;
55
+ const pinOfId = (id) => (id.startsWith("pin-") ? Number(id.slice(4)) : 0);
56
+ /** The lane as a physics world, with `standing` pins (by number, 1 to 10) and the ball ready on the foul line. */
57
+ export function laneWorld(standing, rules) {
58
+ const bodies = [{ id: bowlingBallId, x: 0, y: FOUL_Y, r: BALL_R, mass: 3.4, restitution: 0.75 }];
59
+ for (const n of [...standing].sort((a, b) => a - b))
60
+ bodies.push({ id: pinId(n), x: PIN_SPOTS[n - 1][0], y: PIN_SPOTS[n - 1][1], r: PIN_R, mass: 1.6, restitution: 0.5 });
61
+ const edge = LANE_HALF;
62
+ return {
63
+ bounds: { x: -9000, y: PIT_Y - 2500, w: 18000, h: FOUL_Y + 4000 - PIT_Y + 2500 },
64
+ tickRate: 120,
65
+ maxTicks: 1800,
66
+ friction: 9000,
67
+ restSpeed: 250,
68
+ restitution: 0.7,
69
+ wallRestitution: 0.45,
70
+ maxShotSpeed: 80000,
71
+ bodies,
72
+ walls: rules.bumpers
73
+ ? [
74
+ { id: "bumper-left", points: [[-edge, FOUL_Y + 3000], [-edge, PIT_Y]] },
75
+ { id: "bumper-right", points: [[edge, FOUL_Y + 3000], [edge, PIT_Y]] },
76
+ ]
77
+ : [],
78
+ pockets: [],
79
+ regions: [
80
+ { id: "gutter-left", shape: { points: [[-edge - GUTTER, FOUL_Y + 3000], [-edge, FOUL_Y + 3000], [-edge, PIT_Y], [-edge - GUTTER, PIT_Y]] }, out: true },
81
+ { id: "gutter-right", shape: { points: [[edge, FOUL_Y + 3000], [edge + GUTTER, FOUL_Y + 3000], [edge + GUTTER, PIT_Y], [edge, PIT_Y]] }, out: true },
82
+ { id: "pit", shape: { points: [[-edge - GUTTER, PIT_Y], [edge + GUTTER, PIT_Y], [edge + GUTTER, PIT_Y - 2400], [-edge - GUTTER, PIT_Y - 2400]] }, out: true },
83
+ ],
84
+ };
85
+ }
86
+ const LOOK = (rules) => ({
87
+ frame: { x: -LANE_HALF - GUTTER - 700, y: PIT_Y - 1500, w: 2 * (LANE_HALF + GUTTER + 700), h: FOUL_Y + 4000 - PIT_Y + 1500 },
88
+ base: "paving",
89
+ ground: [{ shape: { points: [[-LANE_HALF - GUTTER, PIT_Y], [LANE_HALF + GUTTER, PIT_Y], [LANE_HALF + GUTTER, FOUL_Y + 3000], [-LANE_HALF - GUTTER, FOUL_Y + 3000]] }, surface: "deck" }, { shape: { points: [[-LANE_HALF, PIT_Y], [LANE_HALF, PIT_Y], [LANE_HALF, FOUL_Y + 3000], [-LANE_HALF, FOUL_Y + 3000]] }, surface: "lane" }],
90
+ regions: [{ id: "pit", surface: "soil" }],
91
+ rails: rules.bumpers
92
+ ? [
93
+ { wall: "bumper-left", material: "timber", side: "left", width: 900, height: 600 },
94
+ { wall: "bumper-right", material: "timber", side: "right", width: 900, height: 600 },
95
+ ]
96
+ : [],
97
+ blocks: [],
98
+ ledges: [],
99
+ tunnels: [],
100
+ pockets: "pocket",
101
+ decor: [],
102
+ });
103
+ const ALL = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
104
+ /** How many balls the frame being bowled lets a seat have, given what it has knocked down so far. */
105
+ function ballsAllowed(frames, frame, cur) {
106
+ if (frame < frames - 1)
107
+ return cur[0] === 10 ? 1 : 2;
108
+ return cur[0] === 10 || (cur.length >= 2 && cur[0] + cur[1] === 10) ? 3 : 2;
109
+ }
110
+ /** The score of each frame as far as it is known (null while a bonus is still to be bowled), and the running total. */
111
+ export function frameScores(rolls, frames) {
112
+ const marks = [];
113
+ const totals = [];
114
+ let i = 0;
115
+ let sum = 0;
116
+ for (let f = 0; f < frames; f++) {
117
+ const a = rolls[i];
118
+ if (a === undefined) {
119
+ marks.push("");
120
+ totals.push(null);
121
+ continue;
122
+ }
123
+ const b = rolls[i + 1];
124
+ const c = rolls[i + 2];
125
+ const last = f === frames - 1;
126
+ const mark = (n, prev) => (n === undefined ? "" : n === 10 ? "X" : prev !== undefined && prev + n === 10 ? "/" : n === 0 ? "-" : String(n));
127
+ if (last) {
128
+ const parts = [mark(a), b === undefined ? "" : a === 10 ? mark(b) : mark(b, a), c === undefined ? "" : b === 10 || a + (b ?? 0) !== 10 ? mark(c) : mark(c)];
129
+ marks.push(parts.join(""));
130
+ const need = a === 10 || (b !== undefined && a + b === 10) ? 3 : 2;
131
+ const have = [a, b, c].filter((n) => n !== undefined).length;
132
+ if (have >= need) {
133
+ sum += (a ?? 0) + (b ?? 0) + (need === 3 ? (c ?? 0) : 0);
134
+ totals.push(sum);
135
+ }
136
+ else
137
+ totals.push(null);
138
+ break;
139
+ }
140
+ if (a === 10) {
141
+ marks.push("X");
142
+ i += 1;
143
+ if (b !== undefined && c !== undefined) {
144
+ sum += 10 + b + c;
145
+ totals.push(sum);
146
+ }
147
+ else
148
+ totals.push(null);
149
+ }
150
+ else {
151
+ marks.push(b === undefined ? mark(a) : mark(a) + mark(b, a));
152
+ if (b === undefined)
153
+ totals.push(null);
154
+ else if (a + b === 10) {
155
+ const next = rolls[i + 2];
156
+ if (next === undefined)
157
+ totals.push(null);
158
+ else {
159
+ sum += 10 + next;
160
+ totals.push(sum);
161
+ }
162
+ }
163
+ else {
164
+ sum += a + b;
165
+ totals.push(sum);
166
+ }
167
+ i += 2;
168
+ }
169
+ }
170
+ while (totals.length < frames) {
171
+ marks.push("");
172
+ totals.push(null);
173
+ }
174
+ return { marks, totals };
175
+ }
176
+ /** What a seat has so far: the last known running total (balls whose bonus isn't bowled yet are counted as they stand). */
177
+ export function scoreOf(s, seat) {
178
+ const { frames } = s.rules;
179
+ const rolls = s.rolls[seat];
180
+ let i = 0;
181
+ let sum = 0;
182
+ for (let f = 0; f < frames && i < rolls.length; f++) {
183
+ if (f === frames - 1) {
184
+ sum += rolls.slice(i, i + 3).reduce((n, v) => n + v, 0);
185
+ break;
186
+ }
187
+ if (rolls[i] === 10) {
188
+ sum += 10 + (rolls[i + 1] ?? 0) + (rolls[i + 2] ?? 0);
189
+ i += 1;
190
+ }
191
+ else {
192
+ const two = (rolls[i] ?? 0) + (rolls[i + 1] ?? 0);
193
+ sum += two + (two === 10 ? (rolls[i + 2] ?? 0) : 0);
194
+ i += 2;
195
+ }
196
+ }
197
+ return sum;
198
+ }
199
+ export function newBowling(rules, seats, seed) {
200
+ const s = { game: "bowling", rules, seats, rng: seed >>> 0, physics: PHYSICS_VERSION, first: 0, frame: 0, turn: 0, standing: [...ALL], cur: [], rolls: Array.from({ length: seats }, () => []), shots: 0, last: null, phase: "playing", narration: null };
201
+ s.first = Math.floor(nextRandom(s)() * seats);
202
+ s.turn = s.first;
203
+ return s;
204
+ }
205
+ /** The order seats bowl each frame in: from the seat that started, round the table. */
206
+ const orderOf = (s) => Array.from({ length: s.seats }, (_, i) => (s.first + i) % s.seats);
207
+ // ---- Moves --------------------------------------------------------------------------------------
208
+ const pinsWord = (n) => `${n} pin${n === 1 ? "" : "s"}`;
209
+ /** The pins a ball left down, from where the physics came to rest. */
210
+ export function pinsDown(world) {
211
+ const down = [];
212
+ for (const b of world.bodies) {
213
+ const n = pinOfId(b.id);
214
+ if (!n)
215
+ continue;
216
+ const [x, y] = PIN_SPOTS[n - 1];
217
+ if (b.pocketed !== undefined || b.out !== undefined || Math.abs(b.x - x) > DOWN || Math.abs(b.y - y) > DOWN)
218
+ down.push(n);
219
+ }
220
+ return down;
221
+ }
222
+ function apply(state, seat, move) {
223
+ if (!Number.isInteger(seat) || seat < 0 || seat >= state.seats)
224
+ throw new GameError("That's not a seat at this table.");
225
+ if (move?.type !== "shot")
226
+ throw new GameError("That's not a move in Bowling.");
227
+ if (state.phase !== "playing")
228
+ throw new GameError("This game is over.");
229
+ if (state.turn !== seat)
230
+ throw new GameError("It's not your ball.");
231
+ if (move.body !== bowlingBallId)
232
+ throw new GameError("That's not the ball.");
233
+ if (!Number.isInteger(move.angle) || move.angle < 0 || move.angle >= 36000)
234
+ throw new GameError("Aim somewhere first.");
235
+ if (!Number.isInteger(move.power) || move.power < BOWL_MIN_POWER || move.power > BOWL_MAX_POWER)
236
+ throw new GameError("That's not a roll: too soft or too hard.");
237
+ const s = clone(state);
238
+ const before = laneWorld(s.standing, s.rules);
239
+ const shot = { body: bowlingBallId, angle: move.angle, power: move.power };
240
+ const played = simulate(before, shot);
241
+ s.shots += 1;
242
+ s.last = { n: s.shots, seat, shot, from: before.bodies, rest: restOf(played.world), ticks: played.ticks, physics: PHYSICS_VERSION };
243
+ const down = pinsDown(played.world);
244
+ const knocked = down.length;
245
+ const gutter = played.world.bodies.find((b) => b.id === bowlingBallId)?.out;
246
+ s.standing = s.standing.filter((n) => !down.includes(n));
247
+ s.rolls[seat].push(knocked);
248
+ s.cur.push(knocked);
249
+ const clean = s.standing.length === 0;
250
+ const strike = clean && s.cur.length === 1;
251
+ const spare = clean && s.cur.length === 2 && s.cur[0] < 10;
252
+ s.narration = strike
253
+ ? `${who(seat)} bowls a strike!`
254
+ : spare
255
+ ? `${who(seat)} picks up the spare`
256
+ : knocked === 0
257
+ ? `${who(seat)} ${gutter && gutter.startsWith("gutter") ? "rolls it in the gutter" : "misses every pin"}`
258
+ : `${who(seat)} knocks down ${pinsWord(knocked)}`;
259
+ if (s.cur.length >= ballsAllowed(s.rules.frames, s.frame, s.cur)) {
260
+ // The frame is over: the pins are set up again, and the next seat steps up.
261
+ s.cur = [];
262
+ s.standing = [...ALL];
263
+ const order = orderOf(s);
264
+ const at = order.indexOf(seat);
265
+ if (at + 1 < order.length)
266
+ s.turn = order[at + 1];
267
+ else if (s.frame + 1 >= s.rules.frames)
268
+ s.phase = "finished";
269
+ else {
270
+ s.frame += 1;
271
+ s.turn = s.first;
272
+ }
273
+ }
274
+ else if (clean) {
275
+ // In the last frame, a strike or a spare brings the pins back for the fill ball.
276
+ s.standing = [...ALL];
277
+ }
278
+ return s;
279
+ }
280
+ // ---- What a seat sees ---------------------------------------------------------------------------
281
+ const TONES = ["red", "blue", "gold", "green", "purple", "orange"];
282
+ const ballLook = (seat) => ({ id: bowlingBallId, owner: seat, kind: "ball", tone: TONES[seat % TONES.length], label: `${who(seat)}'s ball` });
283
+ const pinLook = (n) => ({ id: pinId(n), owner: null, kind: "pin", tone: "white", label: `pin ${n}`, mark: String(n), height: 3800 });
284
+ const winnersOf = (s) => {
285
+ const totals = Array.from({ length: s.seats }, (_, i) => scoreOf(s, i));
286
+ const best = Math.max(...totals);
287
+ return totals.flatMap((t, seat) => (t === best ? [seat] : []));
288
+ };
289
+ function cardOf(s) {
290
+ const { frames } = s.rules;
291
+ const sheets = Array.from({ length: s.seats }, (_, seat) => frameScores(s.rolls[seat], frames));
292
+ return {
293
+ title: "Bowling",
294
+ columns: Array.from({ length: frames }, (_, i) => ({ label: String(i + 1) })),
295
+ current: s.phase === "finished" ? null : s.frame,
296
+ rows: sheets.map((sheet, seat) => ({
297
+ seat,
298
+ cells: sheet.marks.map((m, f) => (m ? (sheet.totals[f] !== null ? `${m} ${sheet.totals[f]}` : m) : "")),
299
+ total: String(scoreOf(s, seat)),
300
+ })),
301
+ totalLabel: "Score",
302
+ };
303
+ }
304
+ function overTitle(s, winners) {
305
+ const score = scoreOf(s, winners[0]);
306
+ if (s.seats === 1)
307
+ return `Game over: ${score}`;
308
+ if (winners.length > 1)
309
+ return `It's a tie at ${score}!`;
310
+ return `${who(winners[0])} wins with ${score}!`;
311
+ }
312
+ function view(s, seat) {
313
+ const playing = s.phase === "playing";
314
+ const mine = playing && s.turn === seat;
315
+ const balls = s.cur.length + 1;
316
+ const winners = playing ? [] : winnersOf(s);
317
+ return {
318
+ game: "bowling",
319
+ seats: s.seats,
320
+ me: seat,
321
+ teams: false,
322
+ phase: s.phase,
323
+ turn: playing ? s.turn : null,
324
+ table: {
325
+ key: `lane/${s.rules.bumpers ? "bumpers" : "open"}`,
326
+ name: playing ? `Frame ${s.frame + 1}, ball ${balls}` : "The lane",
327
+ world: laneWorld(s.standing, s.rules),
328
+ look: LOOK(s.rules),
329
+ bodies: [ballLook(playing ? s.turn : (s.last?.seat ?? 0)), ...ALL.map(pinLook)],
330
+ ghosts: [],
331
+ },
332
+ shoot: mine ? { body: bowlingBallId, minPower: BOWL_MIN_POWER, maxPower: BOWL_MAX_POWER } : null,
333
+ last: s.last,
334
+ card: cardOf(s),
335
+ choices: null,
336
+ players: Array.from({ length: s.seats }, (_, i) => ({
337
+ line: `${scoreOf(s, i)}`,
338
+ body: { ...ballLook(i), id: `ball-${i}` },
339
+ done: !playing,
340
+ badge: playing && s.turn === i ? "Up" : undefined,
341
+ })),
342
+ info: playing ? [`Frame ${s.frame + 1} of ${s.rules.frames}`, `${s.standing.length} pin${s.standing.length === 1 ? "" : "s"} standing`] : [],
343
+ narration: s.narration ?? (playing ? "Pull back and let go. Aim for the pocket, just off the head pin." : null),
344
+ scores: Array.from({ length: s.seats }, (_, i) => ({ seats: [i], value: scoreOf(s, i) })),
345
+ result: null,
346
+ over: playing ? null : { winners, title: overTitle(s, winners) },
347
+ };
348
+ }
349
+ const wrap = (angle) => ((Math.round(angle) % 36000) + 36000) % 36000;
350
+ const clampPower = (power) => Math.min(BOWL_MAX_POWER, Math.max(BOWL_MIN_POWER, Math.round(power)));
351
+ const thoughts = new Map();
352
+ const TARGETS = Array.from({ length: 23 }, (_, i) => -5500 + i * 500);
353
+ const POWERS = [600, 780, 960];
354
+ /** The best ball from the foul line at these pins that a search can find: what a perfect bowler would roll. */
355
+ export function bestRoll(standing, rules) {
356
+ const key = `${standing.join(",")}/${rules.bumpers}`;
357
+ const known = thoughts.get(key);
358
+ if (known)
359
+ return known;
360
+ const world = laneWorld(standing, rules);
361
+ let best = { angle: 27000, power: 780, pins: -1 };
362
+ let bestScore = -Infinity;
363
+ const toward = (x, y) => angleTo({ x: 0, y: FOUL_Y }, { x, y });
364
+ for (const tx of TARGETS) {
365
+ for (const power of POWERS) {
366
+ const angle = toward(tx, HEAD_Y);
367
+ const down = pinsDown(simulate(world, { body: bowlingBallId, angle, power }).world);
368
+ // Pins knocked is what counts; all else equal, a ball that is still on the lane and harder is steadier.
369
+ const score = down.length * 100 + power / 20 - Math.abs(tx) / 400;
370
+ if (score > bestScore) {
371
+ bestScore = score;
372
+ best = { angle, power, pins: down.length };
373
+ }
374
+ }
375
+ }
376
+ if (thoughts.size > 400)
377
+ thoughts.clear();
378
+ thoughts.set(key, best);
379
+ return best;
380
+ }
381
+ /** The most a computer player's aim (hundredths of a degree) and strength (a share of it) can be off: at full skill, and how much more at none. */
382
+ export const BOWL_AIM_SLIP = [18, 130];
383
+ export const BOWL_POWER_SLIP = [0.05, 0.3];
384
+ function bot(s, seat, style, rand = Math.random) {
385
+ if (s.phase !== "playing" || s.turn !== seat)
386
+ return null;
387
+ const ideal = bestRoll(s.standing, s.rules);
388
+ const skill = Math.min(1, Math.max(0, style.skill ?? 1));
389
+ const slip = careless(style, rand) ? 2.5 : 1;
390
+ const wobble = () => (rand() + rand() + rand() - 1.5) / 1.5;
391
+ const angle = wrap(ideal.angle + wobble() * (BOWL_AIM_SLIP[0] + (1 - skill) * BOWL_AIM_SLIP[1]) * slip);
392
+ const power = clampPower(ideal.power * (1 + wobble() * (BOWL_POWER_SLIP[0] + (1 - skill) * BOWL_POWER_SLIP[1]) * slip));
393
+ return { type: "shot", body: bowlingBallId, angle, power };
394
+ }
395
+ // ---- The game -----------------------------------------------------------------------------------
396
+ function normalize(rules) {
397
+ const given = (rules && typeof rules === "object" ? rules : {});
398
+ const base = PRESETS.find((p) => p.id === given.id) ?? tenFrames;
399
+ const r = { ...base, ...given };
400
+ return { id: String(r.id), name: String(r.name), frames: Number(r.frames) === 5 ? 5 : 10, bumpers: r.bumpers === true };
401
+ }
402
+ export const bowling = {
403
+ id: "bowling",
404
+ name: "Bowling",
405
+ emoji: "🎳",
406
+ blurb: "Ten pins, ten frames: strikes, spares and a score sheet",
407
+ tagline: "Pull back, let go, and knock them all down. Strikes and spares earn bonus pins; the highest score wins.",
408
+ seats: { min: 1, max: 6, default: 2 },
409
+ teams: false,
410
+ presets: PRESETS,
411
+ fields: [
412
+ { key: "frames", label: "Frames", kind: "choice", options: [[10, "Ten (a full game)"], [5, "Five (a quick one)"]] },
413
+ { key: "bumpers", label: "Bumpers up", kind: "toggle", hint: "Rails along the lane close the gutters: the ball bounces down the lane instead of dropping out." },
414
+ ],
415
+ normalize,
416
+ validate: () => [],
417
+ describe(r) {
418
+ return [
419
+ `${r.frames} frames. In each, you roll up to two balls at the ten pins; the pins left standing after your first ball stay for the second.`,
420
+ "Pull back from the ball and let go: the further you pull, the harder it goes. Aim just off the head pin, the front pin, to send the pins into each other.",
421
+ "A strike (all ten with the first ball) scores ten plus your next two balls; a spare (all ten with two) scores ten plus your next ball. Otherwise, a frame scores the pins knocked down.",
422
+ `In the last frame a strike or a spare earns more balls: ${r.frames === 10 ? "up to three" : "up to three"}, with the pins set up again.`,
423
+ r.bumpers ? "Bumpers are up, so there are no gutter balls." : "A ball in the gutter knocks nothing down, unless it already hit something.",
424
+ "The highest score wins.",
425
+ ];
426
+ },
427
+ newGame: newBowling,
428
+ apply,
429
+ view,
430
+ bot,
431
+ heavy: (s, seat) => s.phase === "playing" && s.turn === seat,
432
+ thinkingTime(s) {
433
+ if (s.phase !== "playing")
434
+ return 500;
435
+ const rolling = s.last ? Math.round((s.last.ticks * 1000) / 120) : 0;
436
+ return rolling + thinkFor(3, 0.9);
437
+ },
438
+ warmUp() {
439
+ for (const rules of [tenFrames, tenBumpers])
440
+ bestRoll([...ALL], rules);
441
+ },
442
+ summary(s) {
443
+ const over = s.phase === "finished";
444
+ const seats = Array.from({ length: s.seats }, (_, i) => i);
445
+ return {
446
+ game: "bowling",
447
+ rules: s.rules.name,
448
+ phase: s.phase,
449
+ over,
450
+ hand: s.frame + 1,
451
+ scoreLine: seats.map((i) => scoreOf(s, i)).join(" · "),
452
+ order: over ? rankSeats(seats.map((i) => ({ seats: [i], score: scoreOf(s, i) }))) : null,
453
+ winners: over ? winnersOf(s) : null,
454
+ teams: false,
455
+ seats: s.seats,
456
+ };
457
+ },
458
+ };
459
+ //# sourceMappingURL=bowling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bowling.js","sourceRoot":"","sources":["../src/bowling.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,gGAAgG;AAChG,0CAA0C;AAC1C,EAAE;AACF,mGAAmG;AACnG,8FAA8F;AAC9F,kGAAkG;AAClG,mFAAmF;AACnF,EAAE;AACF,oGAAoG;AACpG,qGAAqG;AACrG,iGAAiG;AACjG,kGAAkG;AAClG,mGAAmG;AACnG,wDAAwD;AACxD,EAAE;AACF,6FAA6F;AAC7F,8FAA8F;AAC9F,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAyB,MAAM,0BAA0B,CAAC;AAE5F,OAAO,EAAE,OAAO,EAAE,MAAM,EAAiI,MAAM,YAAY,CAAC;AAC5K,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAkB,MAAM,YAAY,CAAC;AAS9G,MAAM,CAAC,MAAM,SAAS,GAAiB,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC7G,MAAM,CAAC,MAAM,UAAU,GAAiB,EAAE,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjI,MAAM,CAAC,MAAM,UAAU,GAAiB,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC9G,MAAM,CAAC,MAAM,WAAW,GAAiB,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClI,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAEjE,oGAAoG;AACpG,qGAAqG;AACrG,6EAA6E;AAE7E,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC;AACzB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;AAC3B,MAAM,SAAS,GAAG,IAAI,CAAC;AACvB,8DAA8D;AAC9D,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAC5B,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,iDAAiD;AACjD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;AACpB,MAAM,MAAM,GAAG,IAAI,CAAC;AACpB,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,GAAG,GAAG,IAAI,CAAC;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,2DAA2D;AAC3D,MAAM,IAAI,GAAG,IAAI,CAAC;AAElB,oHAAoH;AACpH,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,GAAG,EAAE;IACjD,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE;QAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3H,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AACpC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AAC/C,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAElF,kHAAkH;AAClH,MAAM,UAAU,SAAS,CAAC,QAAkB,EAAE,KAAoC;IAChF,MAAM,MAAM,GAAW,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACzG,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5K,MAAM,IAAI,GAAG,SAAS,CAAC;IACvB,OAAO;QACL,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,EAAE;QAChF,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,KAAK;QACnB,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,OAAO;YAClB,CAAC,CAAC;gBACE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;gBACvE,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;aACvE;YACH,CAAC,CAAC,EAAE;QACN,OAAO,EAAE,EAAE;QACX,OAAO,EAAE;YACP,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;YACvJ,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;YACpJ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;SAC9J;KACF,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,KAAoC,EAAa,EAAE,CAAC,CAAC;IACjE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,EAAE;IAC5H,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACpU,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACzC,KAAK,EAAE,KAAK,CAAC,OAAO;QAClB,CAAC,CAAC;YACE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YAClF,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;SACrF;QACH,CAAC,CAAC,EAAE;IACN,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,EAAE;CACV,CAAC,CAAC;AA8BH,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAE5C,qGAAqG;AACrG,SAAS,YAAY,CAAC,MAAc,EAAE,KAAa,EAAE,GAAa;IAChE,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,CAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,WAAW,CAAC,KAAe,EAAE,MAAc;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAqB,EAAE,IAAa,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzK,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5J,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;YAC7D,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;;gBAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACvC,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;;gBAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAClC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1B,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACrC,CAAC;oBACJ,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,2HAA2H;AAC3H,MAAM,UAAU,OAAO,CAAC,CAAwC,EAAE,IAAY;IAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YACpB,GAAG,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACtD,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAmB,EAAE,KAAa,EAAE,IAAY;IACzE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAkB,CAAC;IAC1Q,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;IACjB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,uFAAuF;AACvF,MAAM,OAAO,GAAG,CAAC,CAAwC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjI,oGAAoG;AAEpG,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAEhE,sEAAsE;AACtE,MAAM,UAAU,QAAQ,CAAC,KAAY;IACnC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QACjC,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5H,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,KAAK,CAAC,KAAmB,EAAE,IAAY,EAAE,IAAiB;IACjE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IACxH,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAChF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACpE,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;QAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC7E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACxH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,cAAc,IAAI,IAAI,CAAC,KAAK,GAAG,cAAc;QAAE,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAEjK,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACb,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAEpI,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,GAAG,CAAC;IAC5E,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpB,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC;IAC5D,CAAC,CAAC,SAAS,GAAG,MAAM;QAClB,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,kBAAkB;QAChC,CAAC,CAAC,KAAK;YACL,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,qBAAqB;YACnC,CAAC,CAAC,OAAO,KAAK,CAAC;gBACb,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,kBAAkB,EAAE;gBACzG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IAExD,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACjE,4EAA4E;QAC5E,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;QACX,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM;YAAE,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC;aAC9C,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;YAAE,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC;aACxD,CAAC;YACJ,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YACb,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,iFAAiF;QACjF,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,oGAAoG;AAEpG,MAAM,KAAK,GAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAChF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAa,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAE,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AAClK,MAAM,OAAO,GAAG,CAAC,CAAS,EAAa,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAExJ,MAAM,SAAS,GAAG,CAAC,CAAe,EAAE,EAAE;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,SAAS,MAAM,CAAC,CAAe;IAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACjG,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;QAChD,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI;YACJ,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvG,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;SAChC,CAAC,CAAC;QACH,UAAU,EAAE,OAAO;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,CAAe,EAAE,OAAiB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,cAAc,KAAK,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,iBAAiB,KAAK,GAAG,CAAC;IACzD,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,cAAc,KAAK,GAAG,CAAC;AACnD,CAAC;AAED,SAAS,IAAI,CAAC,CAAe,EAAE,IAAY;IACzC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;IACxC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAC7B,KAAK,EAAE;YACL,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU;YAClE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC;YACrC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACnB,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/E,MAAM,EAAE,EAAE;SACX;QACD,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI;QAChG,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACf,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACxB,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE;YACzC,IAAI,EAAE,CAAC,OAAO;YACd,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAClD,CAAC,CAAC;QACH,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;QAC5I,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kEAAkE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/G,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACzF,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE;KACjE,CAAC;AACJ,CAAC;AAeD,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAC9E,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5G,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAC;AACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACtE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAE/B,+GAA+G;AAC/G,MAAM,UAAU,QAAQ,CAAC,QAAkB,EAAE,KAAoC;IAC/E,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,IAAI,GAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IACxD,IAAI,SAAS,GAAG,CAAC,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChF,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACpF,wGAAwG;YACxG,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YAClE,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,GAAG,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1C,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mJAAmJ;AACnJ,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,GAAG,CAAU,CAAC;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,GAAG,CAAU,CAAC;AAEpD,SAAS,GAAG,CAAC,CAAe,EAAE,IAAY,EAAE,KAAgB,EAAE,OAAqB,IAAI,CAAC,MAAM;IAC5F,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxG,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACxH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC7D,CAAC;AAED,oGAAoG;AAEpG,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAA0B,CAAC;IACzF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC;IACjE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;IAChC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;AAC1H,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAuD;IACzE,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,yDAAyD;IAChE,OAAO,EAAE,yGAAyG;IAClH,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;IACrC,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE;QACN,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE;QACnH,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iGAAiG,EAAE;KACjK;IACD,SAAS;IACT,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;IAClB,QAAQ,CAAC,CAAC;QACR,OAAO;YACL,GAAG,CAAC,CAAC,MAAM,+HAA+H;YAC1I,2JAA2J;YAC3J,yLAAyL;YACzL,2DAA2D,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,+BAA+B;YACzI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,4EAA4E;YAC1I,yBAAyB;SAC1B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,UAAU;IACnB,KAAK;IACL,IAAI;IACJ,GAAG;IACH,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;IAC5D,YAAY,CAAC,CAAC;QACZ,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QACtC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,MAAM;QACJ,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;YAAE,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,CAAC,CAAC;QACP,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI;YACJ,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC;YACjB,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACtD,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACxF,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACnC,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC;IACJ,CAAC;CACF,CAAC"}
package/dist/chess.js CHANGED
@@ -495,7 +495,7 @@ export function chessPgn(s, names) {
495
495
  const name = (seat) => names?.[seat] ?? who(seat);
496
496
  const control = s.rules.minutes > 0 ? `${s.rules.minutes * 60}${s.rules.increment ? `+${s.rules.increment}` : ""}` : s.rules.days > 0 ? `1/${s.rules.days * 86_400}` : "-";
497
497
  const tags = [
498
- ["Event", "Card Room"],
498
+ ["Event", "open.parlor"],
499
499
  ["Site", "?"],
500
500
  ["Date", "????.??.??"],
501
501
  ["Round", String(s.round)],