@claudinho/core 0.6.2 → 0.8.0

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 (3) hide show
  1. package/dist/index.d.ts +163 -1
  2. package/dist/index.js +1402 -143
  3. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -253,6 +253,153 @@ function nationToRegion(nameOrCode) {
253
253
  return intlNameMap()[norm(nameOrCode)];
254
254
  }
255
255
 
256
+ // src/i18n.ts
257
+ var EN = {
258
+ "bracket.title": "Knockout bracket",
259
+ "bracket.stageTitle": "Knockout \xB7 {stage}",
260
+ "bracket.shareTitle": "Knockout bracket \xB7 2026",
261
+ "bracket.degraded": "Live scores unavailable \u2014 bracket structure only, no confirmed advancement.",
262
+ "bracket.standingsDegraded": "Live standings unavailable \u2014 group slots stay TBD until groups finish.",
263
+ "bracket.treeFallback": "Terminal too narrow for tree view \u2014 showing staged list.",
264
+ "bracket.empty": "No bracket matches available.",
265
+ "bracket.projected": "(proj.)",
266
+ "bracket.invalidStage": "Stage must be one of: R32, R16, QF, SF, 3P, F",
267
+ "bracket.unknownStage": 'Unknown stage "{stage}". Use R32, R16, QF, SF, 3P, or F.',
268
+ "bracket.slot.groupWinner": "Group {group} winner",
269
+ "bracket.slot.groupSecond": "Group {group} 2nd",
270
+ "bracket.slot.third": "3rd ({groups})",
271
+ "bracket.slot.winner": "{stage} {n} winner",
272
+ "bracket.slot.loser": "{stage} {n} loser",
273
+ "bracket.slot.tbd": "TBD",
274
+ "live.data": "Live data: {source}",
275
+ "share.tryIt": "Try it: {line}",
276
+ "stage.group": "Group {group}",
277
+ "stage.groupStage": "Group stage",
278
+ "stage.r32": "Round of 32",
279
+ "stage.r16": "Round of 16",
280
+ "stage.qf": "Quarter-final",
281
+ "stage.sf": "Semi-final",
282
+ "stage.3p": "Third-place play-off",
283
+ "stage.f": "Final",
284
+ "stage.friendly": "Friendly"
285
+ };
286
+ var ES = {
287
+ "bracket.title": "Cuadro de eliminatorias",
288
+ "bracket.stageTitle": "Eliminatorias \xB7 {stage}",
289
+ "bracket.shareTitle": "Cuadro de eliminatorias \xB7 2026",
290
+ "bracket.degraded": "Marcadores en vivo no disponibles \u2014 solo estructura del cuadro, sin avances confirmados.",
291
+ "bracket.standingsDegraded": "Tabla en vivo no disponible \u2014 los cupos de grupo siguen por definir hasta que terminen los grupos.",
292
+ "bracket.treeFallback": "Terminal demasiado estrecha para el \xE1rbol \u2014 mostrando lista por fase.",
293
+ "bracket.empty": "No hay partidos de eliminatorias disponibles.",
294
+ "bracket.projected": "(proy.)",
295
+ "bracket.invalidStage": "La fase debe ser una de: R32, R16, QF, SF, 3P, F",
296
+ "bracket.unknownStage": 'Fase desconocida "{stage}". Usa R32, R16, QF, SF, 3P o F.',
297
+ "bracket.slot.groupWinner": "Ganador del grupo {group}",
298
+ "bracket.slot.groupSecond": "2.\xBA del grupo {group}",
299
+ "bracket.slot.third": "3.\xBA ({groups})",
300
+ "bracket.slot.winner": "Ganador {stage} {n}",
301
+ "bracket.slot.loser": "Perdedor {stage} {n}",
302
+ "bracket.slot.tbd": "Por definir",
303
+ "live.data": "Datos en vivo: {source}",
304
+ "share.tryIt": "Pru\xE9balo: {line}",
305
+ "stage.group": "Grupo {group}",
306
+ "stage.groupStage": "Fase de grupos",
307
+ "stage.r32": "Dieciseisavos de final",
308
+ "stage.r16": "Octavos de final",
309
+ "stage.qf": "Cuartos de final",
310
+ "stage.sf": "Semifinal",
311
+ "stage.3p": "Tercer puesto",
312
+ "stage.f": "Final",
313
+ "stage.friendly": "Amistoso"
314
+ };
315
+ var PT = {
316
+ "bracket.title": "Chave do mata-mata",
317
+ "bracket.stageTitle": "Mata-mata \xB7 {stage}",
318
+ "bracket.shareTitle": "Chave do mata-mata \xB7 2026",
319
+ "bracket.degraded": "Placar ao vivo indispon\xEDvel \u2014 apenas a estrutura da chave, sem avan\xE7os confirmados.",
320
+ "bracket.standingsDegraded": "Classifica\xE7\xE3o ao vivo indispon\xEDvel \u2014 vagas de grupo seguem a definir at\xE9 o fim dos grupos.",
321
+ "bracket.treeFallback": "Terminal estreito demais para a \xE1rvore \u2014 mostrando lista por fase.",
322
+ "bracket.empty": "Nenhum jogo do mata-mata dispon\xEDvel.",
323
+ "bracket.projected": "(proj.)",
324
+ "bracket.invalidStage": "A fase deve ser uma de: R32, R16, QF, SF, 3P, F",
325
+ "bracket.unknownStage": 'Fase desconhecida "{stage}". Use R32, R16, QF, SF, 3P ou F.',
326
+ "bracket.slot.groupWinner": "Vencedor do grupo {group}",
327
+ "bracket.slot.groupSecond": "2.\xBA do grupo {group}",
328
+ "bracket.slot.third": "3.\xBA ({groups})",
329
+ "bracket.slot.winner": "Vencedor {stage} {n}",
330
+ "bracket.slot.loser": "Perdedor {stage} {n}",
331
+ "bracket.slot.tbd": "A definir",
332
+ "live.data": "Dados ao vivo: {source}",
333
+ "share.tryIt": "Experimente: {line}",
334
+ "stage.group": "Grupo {group}",
335
+ "stage.groupStage": "Fase de grupos",
336
+ "stage.r32": "Fase de 32 equipes",
337
+ "stage.r16": "Oitavas de final",
338
+ "stage.qf": "Quartas de final",
339
+ "stage.sf": "Semifinal",
340
+ "stage.3p": "Disputa do 3.\xBA lugar",
341
+ "stage.f": "Final",
342
+ "stage.friendly": "Amistoso"
343
+ };
344
+ var FR = {
345
+ "bracket.title": "Tableau \xE0 \xE9limination directe",
346
+ "bracket.stageTitle": "\xC9liminatoires \xB7 {stage}",
347
+ "bracket.shareTitle": "Tableau \xE0 \xE9limination directe \xB7 2026",
348
+ "bracket.degraded": "Scores en direct indisponibles \u2014 structure du tableau seulement, aucune qualification confirm\xE9e.",
349
+ "bracket.standingsDegraded": "Classement en direct indisponible \u2014 les places de groupe restent \xE0 d\xE9finir jusqu\u2019\xE0 la fin des poules.",
350
+ "bracket.treeFallback": "Terminal trop \xE9troit pour l\u2019arbre \u2014 affichage par phase.",
351
+ "bracket.empty": "Aucun match \xE0 \xE9limination directe disponible.",
352
+ "bracket.projected": "(proj.)",
353
+ "bracket.invalidStage": "La phase doit \xEAtre l\u2019une de : R32, R16, QF, SF, 3P, F",
354
+ "bracket.unknownStage": "Phase inconnue \xAB {stage} \xBB. Utilisez R32, R16, QF, SF, 3P ou F.",
355
+ "bracket.slot.groupWinner": "Vainqueur du groupe {group}",
356
+ "bracket.slot.groupSecond": "2e du groupe {group}",
357
+ "bracket.slot.third": "3e ({groups})",
358
+ "bracket.slot.winner": "Vainqueur {stage} {n}",
359
+ "bracket.slot.loser": "Perdant {stage} {n}",
360
+ "bracket.slot.tbd": "\xC0 d\xE9finir",
361
+ "live.data": "Donn\xE9es en direct : {source}",
362
+ "share.tryIt": "Essayez : {line}",
363
+ "stage.group": "Groupe {group}",
364
+ "stage.groupStage": "Phase de groupes",
365
+ "stage.r32": "Seizi\xE8mes de finale",
366
+ "stage.r16": "Huiti\xE8mes de finale",
367
+ "stage.qf": "Quarts de finale",
368
+ "stage.sf": "Demi-finale",
369
+ "stage.3p": "Match pour la 3e place",
370
+ "stage.f": "Finale",
371
+ "stage.friendly": "Match amical"
372
+ };
373
+ var CATALOGS = { en: EN, es: ES, pt: PT, fr: FR };
374
+ function normalizeLang(lang) {
375
+ const code = (lang ?? "en").slice(0, 2).toLowerCase();
376
+ if (code === "es" || code === "pt" || code === "fr") return code;
377
+ return "en";
378
+ }
379
+ function t(lang, key, vars) {
380
+ const dict = CATALOGS[normalizeLang(lang)];
381
+ let s = dict[key] ?? EN[key] ?? key;
382
+ if (vars) {
383
+ for (const [k, v] of Object.entries(vars)) s = s.replaceAll(`{${k}}`, v);
384
+ }
385
+ return s;
386
+ }
387
+ var STAGE_KEYS = {
388
+ GROUP: "stage.groupStage",
389
+ R32: "stage.r32",
390
+ R16: "stage.r16",
391
+ QF: "stage.qf",
392
+ SF: "stage.sf",
393
+ "3P": "stage.3p",
394
+ F: "stage.f",
395
+ FRIENDLY: "stage.friendly"
396
+ };
397
+ function stageLabelI18n(lang, stage, group) {
398
+ if (group) return t(lang, "stage.group", { group });
399
+ const key = STAGE_KEYS[stage];
400
+ return key ? t(lang, key) : stage;
401
+ }
402
+
256
403
  // src/validate.ts
257
404
  function isValidTimeZone(tz) {
258
405
  if (!tz) return false;
@@ -372,6 +519,29 @@ function matchLocation(match) {
372
519
  function byKickoff(a, b) {
373
520
  return a.kickoff.localeCompare(b.kickoff);
374
521
  }
522
+ function stageLabel(m) {
523
+ if (m.group) return `Group ${m.group}`;
524
+ switch (m.stage) {
525
+ case "GROUP":
526
+ return "Group stage";
527
+ case "R32":
528
+ return "Round of 32";
529
+ case "R16":
530
+ return "Round of 16";
531
+ case "QF":
532
+ return "Quarter-final";
533
+ case "SF":
534
+ return "Semi-final";
535
+ case "3P":
536
+ return "Third-place play-off";
537
+ case "F":
538
+ return "Final";
539
+ case "FRIENDLY":
540
+ return "Friendly";
541
+ default:
542
+ return "";
543
+ }
544
+ }
375
545
 
376
546
  // src/flavor.ts
377
547
  var FLAVOR_LEVELS = ["off", "subtle", "full"];
@@ -464,7 +634,7 @@ var schedule_2026_default = [
464
634
  flag: "\u{1F1FF}\u{1F1E6}"
465
635
  },
466
636
  status: "SCHEDULED",
467
- updatedAt: "2026-06-07T07:52:54.333Z"
637
+ updatedAt: "2026-06-24T01:20:06.301Z"
468
638
  },
469
639
  {
470
640
  id: "760414",
@@ -485,7 +655,7 @@ var schedule_2026_default = [
485
655
  flag: "\u{1F1E8}\u{1F1FF}"
486
656
  },
487
657
  status: "SCHEDULED",
488
- updatedAt: "2026-06-07T07:52:54.337Z"
658
+ updatedAt: "2026-06-24T01:20:06.302Z"
489
659
  },
490
660
  {
491
661
  id: "760416",
@@ -506,7 +676,7 @@ var schedule_2026_default = [
506
676
  flag: "\u{1F1E7}\u{1F1E6}"
507
677
  },
508
678
  status: "SCHEDULED",
509
- updatedAt: "2026-06-07T07:52:54.337Z"
679
+ updatedAt: "2026-06-24T01:20:06.302Z"
510
680
  },
511
681
  {
512
682
  id: "760417",
@@ -527,7 +697,7 @@ var schedule_2026_default = [
527
697
  flag: "\u{1F1F5}\u{1F1FE}"
528
698
  },
529
699
  status: "SCHEDULED",
530
- updatedAt: "2026-06-07T07:52:54.337Z"
700
+ updatedAt: "2026-06-24T01:20:06.302Z"
531
701
  },
532
702
  {
533
703
  id: "760420",
@@ -548,7 +718,7 @@ var schedule_2026_default = [
548
718
  flag: "\u{1F1E8}\u{1F1ED}"
549
719
  },
550
720
  status: "SCHEDULED",
551
- updatedAt: "2026-06-07T07:52:54.337Z"
721
+ updatedAt: "2026-06-24T01:20:06.302Z"
552
722
  },
553
723
  {
554
724
  id: "760419",
@@ -569,7 +739,7 @@ var schedule_2026_default = [
569
739
  flag: "\u{1F1F2}\u{1F1E6}"
570
740
  },
571
741
  status: "SCHEDULED",
572
- updatedAt: "2026-06-07T07:52:54.337Z"
742
+ updatedAt: "2026-06-24T01:20:06.302Z"
573
743
  },
574
744
  {
575
745
  id: "760418",
@@ -590,7 +760,7 @@ var schedule_2026_default = [
590
760
  flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}"
591
761
  },
592
762
  status: "SCHEDULED",
593
- updatedAt: "2026-06-07T07:52:54.337Z"
763
+ updatedAt: "2026-06-24T01:20:06.302Z"
594
764
  },
595
765
  {
596
766
  id: "760421",
@@ -611,7 +781,7 @@ var schedule_2026_default = [
611
781
  flag: "\u{1F1F9}\u{1F1F7}"
612
782
  },
613
783
  status: "SCHEDULED",
614
- updatedAt: "2026-06-07T07:52:54.337Z"
784
+ updatedAt: "2026-06-24T01:20:06.302Z"
615
785
  },
616
786
  {
617
787
  id: "760422",
@@ -632,7 +802,7 @@ var schedule_2026_default = [
632
802
  flag: "\u{1F1E8}\u{1F1FC}"
633
803
  },
634
804
  status: "SCHEDULED",
635
- updatedAt: "2026-06-07T07:52:54.337Z"
805
+ updatedAt: "2026-06-24T01:20:06.302Z"
636
806
  },
637
807
  {
638
808
  id: "760425",
@@ -653,7 +823,7 @@ var schedule_2026_default = [
653
823
  flag: "\u{1F1EF}\u{1F1F5}"
654
824
  },
655
825
  status: "SCHEDULED",
656
- updatedAt: "2026-06-07T07:52:54.337Z"
826
+ updatedAt: "2026-06-24T01:20:06.302Z"
657
827
  },
658
828
  {
659
829
  id: "760423",
@@ -674,7 +844,7 @@ var schedule_2026_default = [
674
844
  flag: "\u{1F1EA}\u{1F1E8}"
675
845
  },
676
846
  status: "SCHEDULED",
677
- updatedAt: "2026-06-07T07:52:54.337Z"
847
+ updatedAt: "2026-06-24T01:20:06.302Z"
678
848
  },
679
849
  {
680
850
  id: "760424",
@@ -695,7 +865,7 @@ var schedule_2026_default = [
695
865
  flag: "\u{1F1F9}\u{1F1F3}"
696
866
  },
697
867
  status: "SCHEDULED",
698
- updatedAt: "2026-06-07T07:52:54.337Z"
868
+ updatedAt: "2026-06-24T01:20:06.302Z"
699
869
  },
700
870
  {
701
871
  id: "760428",
@@ -716,7 +886,7 @@ var schedule_2026_default = [
716
886
  flag: "\u{1F1E8}\u{1F1FB}"
717
887
  },
718
888
  status: "SCHEDULED",
719
- updatedAt: "2026-06-07T07:52:54.337Z"
889
+ updatedAt: "2026-06-24T01:20:06.302Z"
720
890
  },
721
891
  {
722
892
  id: "760426",
@@ -737,7 +907,7 @@ var schedule_2026_default = [
737
907
  flag: "\u{1F1EA}\u{1F1EC}"
738
908
  },
739
909
  status: "SCHEDULED",
740
- updatedAt: "2026-06-07T07:52:54.337Z"
910
+ updatedAt: "2026-06-24T01:20:06.302Z"
741
911
  },
742
912
  {
743
913
  id: "760429",
@@ -758,7 +928,7 @@ var schedule_2026_default = [
758
928
  flag: "\u{1F1FA}\u{1F1FE}"
759
929
  },
760
930
  status: "SCHEDULED",
761
- updatedAt: "2026-06-07T07:52:54.337Z"
931
+ updatedAt: "2026-06-24T01:20:06.302Z"
762
932
  },
763
933
  {
764
934
  id: "760427",
@@ -779,7 +949,7 @@ var schedule_2026_default = [
779
949
  flag: "\u{1F1F3}\u{1F1FF}"
780
950
  },
781
951
  status: "SCHEDULED",
782
- updatedAt: "2026-06-07T07:52:54.337Z"
952
+ updatedAt: "2026-06-24T01:20:06.302Z"
783
953
  },
784
954
  {
785
955
  id: "760432",
@@ -800,7 +970,7 @@ var schedule_2026_default = [
800
970
  flag: "\u{1F1F8}\u{1F1F3}"
801
971
  },
802
972
  status: "SCHEDULED",
803
- updatedAt: "2026-06-07T07:52:54.337Z"
973
+ updatedAt: "2026-06-24T01:20:06.302Z"
804
974
  },
805
975
  {
806
976
  id: "760430",
@@ -821,7 +991,7 @@ var schedule_2026_default = [
821
991
  flag: "\u{1F1F3}\u{1F1F4}"
822
992
  },
823
993
  status: "SCHEDULED",
824
- updatedAt: "2026-06-07T07:52:54.337Z"
994
+ updatedAt: "2026-06-24T01:20:06.302Z"
825
995
  },
826
996
  {
827
997
  id: "760433",
@@ -842,7 +1012,7 @@ var schedule_2026_default = [
842
1012
  flag: "\u{1F1E9}\u{1F1FF}"
843
1013
  },
844
1014
  status: "SCHEDULED",
845
- updatedAt: "2026-06-07T07:52:54.337Z"
1015
+ updatedAt: "2026-06-24T01:20:06.302Z"
846
1016
  },
847
1017
  {
848
1018
  id: "760431",
@@ -863,7 +1033,7 @@ var schedule_2026_default = [
863
1033
  flag: "\u{1F1EF}\u{1F1F4}"
864
1034
  },
865
1035
  status: "SCHEDULED",
866
- updatedAt: "2026-06-07T07:52:54.337Z"
1036
+ updatedAt: "2026-06-24T01:20:06.302Z"
867
1037
  },
868
1038
  {
869
1039
  id: "760435",
@@ -884,7 +1054,7 @@ var schedule_2026_default = [
884
1054
  flag: "\u{1F1E8}\u{1F1E9}"
885
1055
  },
886
1056
  status: "SCHEDULED",
887
- updatedAt: "2026-06-07T07:52:54.337Z"
1057
+ updatedAt: "2026-06-24T01:20:06.302Z"
888
1058
  },
889
1059
  {
890
1060
  id: "760437",
@@ -905,7 +1075,7 @@ var schedule_2026_default = [
905
1075
  flag: "\u{1F1ED}\u{1F1F7}"
906
1076
  },
907
1077
  status: "SCHEDULED",
908
- updatedAt: "2026-06-07T07:52:54.337Z"
1078
+ updatedAt: "2026-06-24T01:20:06.302Z"
909
1079
  },
910
1080
  {
911
1081
  id: "760434",
@@ -926,7 +1096,7 @@ var schedule_2026_default = [
926
1096
  flag: "\u{1F1F5}\u{1F1E6}"
927
1097
  },
928
1098
  status: "SCHEDULED",
929
- updatedAt: "2026-06-07T07:52:54.337Z"
1099
+ updatedAt: "2026-06-24T01:20:06.302Z"
930
1100
  },
931
1101
  {
932
1102
  id: "760436",
@@ -947,7 +1117,7 @@ var schedule_2026_default = [
947
1117
  flag: "\u{1F1E8}\u{1F1F4}"
948
1118
  },
949
1119
  status: "SCHEDULED",
950
- updatedAt: "2026-06-07T07:52:54.337Z"
1120
+ updatedAt: "2026-06-24T01:20:06.302Z"
951
1121
  },
952
1122
  {
953
1123
  id: "760438",
@@ -968,7 +1138,7 @@ var schedule_2026_default = [
968
1138
  flag: "\u{1F1FF}\u{1F1E6}"
969
1139
  },
970
1140
  status: "SCHEDULED",
971
- updatedAt: "2026-06-07T07:52:54.418Z"
1141
+ updatedAt: "2026-06-24T01:20:06.394Z"
972
1142
  },
973
1143
  {
974
1144
  id: "760439",
@@ -989,7 +1159,7 @@ var schedule_2026_default = [
989
1159
  flag: "\u{1F1E7}\u{1F1E6}"
990
1160
  },
991
1161
  status: "SCHEDULED",
992
- updatedAt: "2026-06-07T07:52:54.418Z"
1162
+ updatedAt: "2026-06-24T01:20:06.394Z"
993
1163
  },
994
1164
  {
995
1165
  id: "760440",
@@ -1010,7 +1180,7 @@ var schedule_2026_default = [
1010
1180
  flag: "\u{1F1F6}\u{1F1E6}"
1011
1181
  },
1012
1182
  status: "SCHEDULED",
1013
- updatedAt: "2026-06-07T07:52:54.418Z"
1183
+ updatedAt: "2026-06-24T01:20:06.394Z"
1014
1184
  },
1015
1185
  {
1016
1186
  id: "760441",
@@ -1031,7 +1201,7 @@ var schedule_2026_default = [
1031
1201
  flag: "\u{1F1F0}\u{1F1F7}"
1032
1202
  },
1033
1203
  status: "SCHEDULED",
1034
- updatedAt: "2026-06-07T07:52:54.418Z"
1204
+ updatedAt: "2026-06-24T01:20:06.394Z"
1035
1205
  },
1036
1206
  {
1037
1207
  id: "760442",
@@ -1052,7 +1222,7 @@ var schedule_2026_default = [
1052
1222
  flag: "\u{1F1E6}\u{1F1FA}"
1053
1223
  },
1054
1224
  status: "SCHEDULED",
1055
- updatedAt: "2026-06-07T07:52:54.418Z"
1225
+ updatedAt: "2026-06-24T01:20:06.394Z"
1056
1226
  },
1057
1227
  {
1058
1228
  id: "760445",
@@ -1073,7 +1243,7 @@ var schedule_2026_default = [
1073
1243
  flag: "\u{1F1F2}\u{1F1E6}"
1074
1244
  },
1075
1245
  status: "SCHEDULED",
1076
- updatedAt: "2026-06-07T07:52:54.418Z"
1246
+ updatedAt: "2026-06-24T01:20:06.394Z"
1077
1247
  },
1078
1248
  {
1079
1249
  id: "760444",
@@ -1094,7 +1264,7 @@ var schedule_2026_default = [
1094
1264
  flag: "\u{1F1ED}\u{1F1F9}"
1095
1265
  },
1096
1266
  status: "SCHEDULED",
1097
- updatedAt: "2026-06-07T07:52:54.418Z"
1267
+ updatedAt: "2026-06-24T01:20:06.394Z"
1098
1268
  },
1099
1269
  {
1100
1270
  id: "760443",
@@ -1115,7 +1285,7 @@ var schedule_2026_default = [
1115
1285
  flag: "\u{1F1F5}\u{1F1FE}"
1116
1286
  },
1117
1287
  status: "SCHEDULED",
1118
- updatedAt: "2026-06-07T07:52:54.418Z"
1288
+ updatedAt: "2026-06-24T01:20:06.394Z"
1119
1289
  },
1120
1290
  {
1121
1291
  id: "760447",
@@ -1136,7 +1306,7 @@ var schedule_2026_default = [
1136
1306
  flag: "\u{1F1F8}\u{1F1EA}"
1137
1307
  },
1138
1308
  status: "SCHEDULED",
1139
- updatedAt: "2026-06-07T07:52:54.418Z"
1309
+ updatedAt: "2026-06-24T01:20:06.394Z"
1140
1310
  },
1141
1311
  {
1142
1312
  id: "760448",
@@ -1157,7 +1327,7 @@ var schedule_2026_default = [
1157
1327
  flag: "\u{1F1E8}\u{1F1EE}"
1158
1328
  },
1159
1329
  status: "SCHEDULED",
1160
- updatedAt: "2026-06-07T07:52:54.418Z"
1330
+ updatedAt: "2026-06-24T01:20:06.394Z"
1161
1331
  },
1162
1332
  {
1163
1333
  id: "760446",
@@ -1178,7 +1348,7 @@ var schedule_2026_default = [
1178
1348
  flag: "\u{1F1E8}\u{1F1FC}"
1179
1349
  },
1180
1350
  status: "SCHEDULED",
1181
- updatedAt: "2026-06-07T07:52:54.418Z"
1351
+ updatedAt: "2026-06-24T01:20:06.394Z"
1182
1352
  },
1183
1353
  {
1184
1354
  id: "760449",
@@ -1199,7 +1369,7 @@ var schedule_2026_default = [
1199
1369
  flag: "\u{1F1EF}\u{1F1F5}"
1200
1370
  },
1201
1371
  status: "SCHEDULED",
1202
- updatedAt: "2026-06-07T07:52:54.418Z"
1372
+ updatedAt: "2026-06-24T01:20:06.394Z"
1203
1373
  },
1204
1374
  {
1205
1375
  id: "760453",
@@ -1220,7 +1390,7 @@ var schedule_2026_default = [
1220
1390
  flag: "\u{1F1F8}\u{1F1E6}"
1221
1391
  },
1222
1392
  status: "SCHEDULED",
1223
- updatedAt: "2026-06-07T07:52:54.418Z"
1393
+ updatedAt: "2026-06-24T01:20:06.394Z"
1224
1394
  },
1225
1395
  {
1226
1396
  id: "760451",
@@ -1241,7 +1411,7 @@ var schedule_2026_default = [
1241
1411
  flag: "\u{1F1EE}\u{1F1F7}"
1242
1412
  },
1243
1413
  status: "SCHEDULED",
1244
- updatedAt: "2026-06-07T07:52:54.418Z"
1414
+ updatedAt: "2026-06-24T01:20:06.394Z"
1245
1415
  },
1246
1416
  {
1247
1417
  id: "760450",
@@ -1262,7 +1432,7 @@ var schedule_2026_default = [
1262
1432
  flag: "\u{1F1E8}\u{1F1FB}"
1263
1433
  },
1264
1434
  status: "SCHEDULED",
1265
- updatedAt: "2026-06-07T07:52:54.418Z"
1435
+ updatedAt: "2026-06-24T01:20:06.394Z"
1266
1436
  },
1267
1437
  {
1268
1438
  id: "760452",
@@ -1283,7 +1453,7 @@ var schedule_2026_default = [
1283
1453
  flag: "\u{1F1EA}\u{1F1EC}"
1284
1454
  },
1285
1455
  status: "SCHEDULED",
1286
- updatedAt: "2026-06-07T07:52:54.418Z"
1456
+ updatedAt: "2026-06-24T01:20:06.394Z"
1287
1457
  },
1288
1458
  {
1289
1459
  id: "760456",
@@ -1304,7 +1474,7 @@ var schedule_2026_default = [
1304
1474
  flag: "\u{1F1E6}\u{1F1F9}"
1305
1475
  },
1306
1476
  status: "SCHEDULED",
1307
- updatedAt: "2026-06-07T07:52:54.418Z"
1477
+ updatedAt: "2026-06-24T01:20:06.394Z"
1308
1478
  },
1309
1479
  {
1310
1480
  id: "760457",
@@ -1325,7 +1495,7 @@ var schedule_2026_default = [
1325
1495
  flag: "\u{1F1EE}\u{1F1F6}"
1326
1496
  },
1327
1497
  status: "SCHEDULED",
1328
- updatedAt: "2026-06-07T07:52:54.418Z"
1498
+ updatedAt: "2026-06-24T01:20:06.394Z"
1329
1499
  },
1330
1500
  {
1331
1501
  id: "760454",
@@ -1346,7 +1516,7 @@ var schedule_2026_default = [
1346
1516
  flag: "\u{1F1F8}\u{1F1F3}"
1347
1517
  },
1348
1518
  status: "SCHEDULED",
1349
- updatedAt: "2026-06-07T07:52:54.418Z"
1519
+ updatedAt: "2026-06-24T01:20:06.394Z"
1350
1520
  },
1351
1521
  {
1352
1522
  id: "760455",
@@ -1367,7 +1537,7 @@ var schedule_2026_default = [
1367
1537
  flag: "\u{1F1E9}\u{1F1FF}"
1368
1538
  },
1369
1539
  status: "SCHEDULED",
1370
- updatedAt: "2026-06-07T07:52:54.418Z"
1540
+ updatedAt: "2026-06-24T01:20:06.394Z"
1371
1541
  },
1372
1542
  {
1373
1543
  id: "760461",
@@ -1388,7 +1558,7 @@ var schedule_2026_default = [
1388
1558
  flag: "\u{1F1FA}\u{1F1FF}"
1389
1559
  },
1390
1560
  status: "SCHEDULED",
1391
- updatedAt: "2026-06-07T07:52:54.418Z"
1561
+ updatedAt: "2026-06-24T01:20:06.394Z"
1392
1562
  },
1393
1563
  {
1394
1564
  id: "760458",
@@ -1409,7 +1579,7 @@ var schedule_2026_default = [
1409
1579
  flag: "\u{1F1EC}\u{1F1ED}"
1410
1580
  },
1411
1581
  status: "SCHEDULED",
1412
- updatedAt: "2026-06-07T07:52:54.418Z"
1582
+ updatedAt: "2026-06-24T01:20:06.394Z"
1413
1583
  },
1414
1584
  {
1415
1585
  id: "760460",
@@ -1430,7 +1600,7 @@ var schedule_2026_default = [
1430
1600
  flag: "\u{1F1ED}\u{1F1F7}"
1431
1601
  },
1432
1602
  status: "SCHEDULED",
1433
- updatedAt: "2026-06-07T07:52:54.419Z"
1603
+ updatedAt: "2026-06-24T01:20:06.394Z"
1434
1604
  },
1435
1605
  {
1436
1606
  id: "760459",
@@ -1451,7 +1621,7 @@ var schedule_2026_default = [
1451
1621
  flag: "\u{1F1E8}\u{1F1E9}"
1452
1622
  },
1453
1623
  status: "SCHEDULED",
1454
- updatedAt: "2026-06-07T07:52:54.419Z"
1624
+ updatedAt: "2026-06-24T01:20:06.394Z"
1455
1625
  },
1456
1626
  {
1457
1627
  id: "760462",
@@ -1472,7 +1642,7 @@ var schedule_2026_default = [
1472
1642
  flag: "\u{1F1F6}\u{1F1E6}"
1473
1643
  },
1474
1644
  status: "SCHEDULED",
1475
- updatedAt: "2026-06-07T07:52:54.419Z"
1645
+ updatedAt: "2026-06-24T01:20:06.394Z"
1476
1646
  },
1477
1647
  {
1478
1648
  id: "760463",
@@ -1493,7 +1663,7 @@ var schedule_2026_default = [
1493
1663
  flag: "\u{1F1E8}\u{1F1E6}"
1494
1664
  },
1495
1665
  status: "SCHEDULED",
1496
- updatedAt: "2026-06-07T07:52:54.419Z"
1666
+ updatedAt: "2026-06-24T01:20:06.394Z"
1497
1667
  },
1498
1668
  {
1499
1669
  id: "760464",
@@ -1514,7 +1684,7 @@ var schedule_2026_default = [
1514
1684
  flag: "\u{1F1ED}\u{1F1F9}"
1515
1685
  },
1516
1686
  status: "SCHEDULED",
1517
- updatedAt: "2026-06-07T07:52:54.419Z"
1687
+ updatedAt: "2026-06-24T01:20:06.394Z"
1518
1688
  },
1519
1689
  {
1520
1690
  id: "760465",
@@ -1535,7 +1705,7 @@ var schedule_2026_default = [
1535
1705
  flag: "\u{1F1E7}\u{1F1F7}"
1536
1706
  },
1537
1707
  status: "SCHEDULED",
1538
- updatedAt: "2026-06-07T07:52:54.419Z"
1708
+ updatedAt: "2026-06-24T01:20:06.394Z"
1539
1709
  },
1540
1710
  {
1541
1711
  id: "760467",
@@ -1556,7 +1726,7 @@ var schedule_2026_default = [
1556
1726
  flag: "\u{1F1F2}\u{1F1FD}"
1557
1727
  },
1558
1728
  status: "SCHEDULED",
1559
- updatedAt: "2026-06-07T07:52:54.419Z"
1729
+ updatedAt: "2026-06-24T01:20:06.394Z"
1560
1730
  },
1561
1731
  {
1562
1732
  id: "760466",
@@ -1577,7 +1747,7 @@ var schedule_2026_default = [
1577
1747
  flag: "\u{1F1F0}\u{1F1F7}"
1578
1748
  },
1579
1749
  status: "SCHEDULED",
1580
- updatedAt: "2026-06-07T07:52:54.419Z"
1750
+ updatedAt: "2026-06-24T01:20:06.394Z"
1581
1751
  },
1582
1752
  {
1583
1753
  id: "760473",
@@ -1598,7 +1768,7 @@ var schedule_2026_default = [
1598
1768
  flag: "\u{1F1E8}\u{1F1EE}"
1599
1769
  },
1600
1770
  status: "SCHEDULED",
1601
- updatedAt: "2026-06-07T07:52:54.511Z"
1771
+ updatedAt: "2026-06-24T01:20:06.523Z"
1602
1772
  },
1603
1773
  {
1604
1774
  id: "760468",
@@ -1619,7 +1789,7 @@ var schedule_2026_default = [
1619
1789
  flag: "\u{1F1E9}\u{1F1EA}"
1620
1790
  },
1621
1791
  status: "SCHEDULED",
1622
- updatedAt: "2026-06-07T07:52:54.511Z"
1792
+ updatedAt: "2026-06-24T01:20:06.523Z"
1623
1793
  },
1624
1794
  {
1625
1795
  id: "760471",
@@ -1640,7 +1810,7 @@ var schedule_2026_default = [
1640
1810
  flag: "\u{1F1F8}\u{1F1EA}"
1641
1811
  },
1642
1812
  status: "SCHEDULED",
1643
- updatedAt: "2026-06-07T07:52:54.511Z"
1813
+ updatedAt: "2026-06-24T01:20:06.523Z"
1644
1814
  },
1645
1815
  {
1646
1816
  id: "760472",
@@ -1661,7 +1831,7 @@ var schedule_2026_default = [
1661
1831
  flag: "\u{1F1F3}\u{1F1F1}"
1662
1832
  },
1663
1833
  status: "SCHEDULED",
1664
- updatedAt: "2026-06-07T07:52:54.511Z"
1834
+ updatedAt: "2026-06-24T01:20:06.523Z"
1665
1835
  },
1666
1836
  {
1667
1837
  id: "760469",
@@ -1682,7 +1852,7 @@ var schedule_2026_default = [
1682
1852
  flag: "\u{1F1E6}\u{1F1FA}"
1683
1853
  },
1684
1854
  status: "SCHEDULED",
1685
- updatedAt: "2026-06-07T07:52:54.511Z"
1855
+ updatedAt: "2026-06-24T01:20:06.523Z"
1686
1856
  },
1687
1857
  {
1688
1858
  id: "760470",
@@ -1703,7 +1873,7 @@ var schedule_2026_default = [
1703
1873
  flag: "\u{1F1FA}\u{1F1F8}"
1704
1874
  },
1705
1875
  status: "SCHEDULED",
1706
- updatedAt: "2026-06-07T07:52:54.511Z"
1876
+ updatedAt: "2026-06-24T01:20:06.523Z"
1707
1877
  },
1708
1878
  {
1709
1879
  id: "760475",
@@ -1724,7 +1894,7 @@ var schedule_2026_default = [
1724
1894
  flag: "\u{1F1EB}\u{1F1F7}"
1725
1895
  },
1726
1896
  status: "SCHEDULED",
1727
- updatedAt: "2026-06-07T07:52:54.511Z"
1897
+ updatedAt: "2026-06-24T01:20:06.523Z"
1728
1898
  },
1729
1899
  {
1730
1900
  id: "760474",
@@ -1745,7 +1915,7 @@ var schedule_2026_default = [
1745
1915
  flag: "\u{1F1EE}\u{1F1F6}"
1746
1916
  },
1747
1917
  status: "SCHEDULED",
1748
- updatedAt: "2026-06-07T07:52:54.511Z"
1918
+ updatedAt: "2026-06-24T01:20:06.523Z"
1749
1919
  },
1750
1920
  {
1751
1921
  id: "760478",
@@ -1766,7 +1936,7 @@ var schedule_2026_default = [
1766
1936
  flag: "\u{1F1F8}\u{1F1E6}"
1767
1937
  },
1768
1938
  status: "SCHEDULED",
1769
- updatedAt: "2026-06-07T07:52:54.511Z"
1939
+ updatedAt: "2026-06-24T01:20:06.523Z"
1770
1940
  },
1771
1941
  {
1772
1942
  id: "760479",
@@ -1787,7 +1957,7 @@ var schedule_2026_default = [
1787
1957
  flag: "\u{1F1EA}\u{1F1F8}"
1788
1958
  },
1789
1959
  status: "SCHEDULED",
1790
- updatedAt: "2026-06-07T07:52:54.511Z"
1960
+ updatedAt: "2026-06-24T01:20:06.523Z"
1791
1961
  },
1792
1962
  {
1793
1963
  id: "760476",
@@ -1808,7 +1978,7 @@ var schedule_2026_default = [
1808
1978
  flag: "\u{1F1EE}\u{1F1F7}"
1809
1979
  },
1810
1980
  status: "SCHEDULED",
1811
- updatedAt: "2026-06-07T07:52:54.511Z"
1981
+ updatedAt: "2026-06-24T01:20:06.523Z"
1812
1982
  },
1813
1983
  {
1814
1984
  id: "760477",
@@ -1829,7 +1999,7 @@ var schedule_2026_default = [
1829
1999
  flag: "\u{1F1E7}\u{1F1EA}"
1830
2000
  },
1831
2001
  status: "SCHEDULED",
1832
- updatedAt: "2026-06-07T07:52:54.511Z"
2002
+ updatedAt: "2026-06-24T01:20:06.523Z"
1833
2003
  },
1834
2004
  {
1835
2005
  id: "760480",
@@ -1850,7 +2020,7 @@ var schedule_2026_default = [
1850
2020
  flag: "\u{1F1EC}\u{1F1ED}"
1851
2021
  },
1852
2022
  status: "SCHEDULED",
1853
- updatedAt: "2026-06-07T07:52:54.512Z"
2023
+ updatedAt: "2026-06-24T01:20:06.523Z"
1854
2024
  },
1855
2025
  {
1856
2026
  id: "760485",
@@ -1871,7 +2041,7 @@ var schedule_2026_default = [
1871
2041
  flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}"
1872
2042
  },
1873
2043
  status: "SCHEDULED",
1874
- updatedAt: "2026-06-07T07:52:54.512Z"
2044
+ updatedAt: "2026-06-24T01:20:06.523Z"
1875
2045
  },
1876
2046
  {
1877
2047
  id: "760481",
@@ -1892,7 +2062,7 @@ var schedule_2026_default = [
1892
2062
  flag: "\u{1F1F5}\u{1F1F9}"
1893
2063
  },
1894
2064
  status: "SCHEDULED",
1895
- updatedAt: "2026-06-07T07:52:54.512Z"
2065
+ updatedAt: "2026-06-24T01:20:06.523Z"
1896
2066
  },
1897
2067
  {
1898
2068
  id: "760482",
@@ -1913,7 +2083,7 @@ var schedule_2026_default = [
1913
2083
  flag: "\u{1F1FA}\u{1F1FF}"
1914
2084
  },
1915
2085
  status: "SCHEDULED",
1916
- updatedAt: "2026-06-07T07:52:54.512Z"
2086
+ updatedAt: "2026-06-24T01:20:06.523Z"
1917
2087
  },
1918
2088
  {
1919
2089
  id: "760484",
@@ -1934,7 +2104,7 @@ var schedule_2026_default = [
1934
2104
  flag: "\u{1F1E6}\u{1F1F9}"
1935
2105
  },
1936
2106
  status: "SCHEDULED",
1937
- updatedAt: "2026-06-07T07:52:54.512Z"
2107
+ updatedAt: "2026-06-24T01:20:06.523Z"
1938
2108
  },
1939
2109
  {
1940
2110
  id: "760483",
@@ -1955,7 +2125,7 @@ var schedule_2026_default = [
1955
2125
  flag: "\u{1F1E6}\u{1F1F7}"
1956
2126
  },
1957
2127
  status: "SCHEDULED",
1958
- updatedAt: "2026-06-07T07:52:54.512Z"
2128
+ updatedAt: "2026-06-24T01:20:06.523Z"
1959
2129
  },
1960
2130
  {
1961
2131
  id: "760486",
@@ -1975,7 +2145,7 @@ var schedule_2026_default = [
1975
2145
  flag: "\u{1F3F3}\uFE0F"
1976
2146
  },
1977
2147
  status: "SCHEDULED",
1978
- updatedAt: "2026-06-07T07:52:54.540Z"
2148
+ updatedAt: "2026-06-24T01:20:06.529Z"
1979
2149
  },
1980
2150
  {
1981
2151
  id: "760487",
@@ -1995,7 +2165,7 @@ var schedule_2026_default = [
1995
2165
  flag: "\u{1F3F3}\uFE0F"
1996
2166
  },
1997
2167
  status: "SCHEDULED",
1998
- updatedAt: "2026-06-07T07:52:54.540Z"
2168
+ updatedAt: "2026-06-24T01:20:06.529Z"
1999
2169
  },
2000
2170
  {
2001
2171
  id: "760489",
@@ -2005,8 +2175,8 @@ var schedule_2026_default = [
2005
2175
  city: "Foxborough, Massachusetts",
2006
2176
  country: "USA",
2007
2177
  home: {
2008
- code: "1E",
2009
- name: "Group E Winner",
2178
+ code: "TBD",
2179
+ name: "Germany",
2010
2180
  flag: "\u{1F3F3}\uFE0F"
2011
2181
  },
2012
2182
  away: {
@@ -2015,7 +2185,7 @@ var schedule_2026_default = [
2015
2185
  flag: "\u{1F3F3}\uFE0F"
2016
2186
  },
2017
2187
  status: "SCHEDULED",
2018
- updatedAt: "2026-06-07T07:52:54.540Z"
2188
+ updatedAt: "2026-06-24T01:20:06.529Z"
2019
2189
  },
2020
2190
  {
2021
2191
  id: "760488",
@@ -2035,7 +2205,7 @@ var schedule_2026_default = [
2035
2205
  flag: "\u{1F3F3}\uFE0F"
2036
2206
  },
2037
2207
  status: "SCHEDULED",
2038
- updatedAt: "2026-06-07T07:52:54.540Z"
2208
+ updatedAt: "2026-06-24T01:20:06.529Z"
2039
2209
  },
2040
2210
  {
2041
2211
  id: "760490",
@@ -2055,7 +2225,7 @@ var schedule_2026_default = [
2055
2225
  flag: "\u{1F3F3}\uFE0F"
2056
2226
  },
2057
2227
  status: "SCHEDULED",
2058
- updatedAt: "2026-06-07T07:52:54.540Z"
2228
+ updatedAt: "2026-06-24T01:20:06.529Z"
2059
2229
  },
2060
2230
  {
2061
2231
  id: "760492",
@@ -2075,7 +2245,7 @@ var schedule_2026_default = [
2075
2245
  flag: "\u{1F3F3}\uFE0F"
2076
2246
  },
2077
2247
  status: "SCHEDULED",
2078
- updatedAt: "2026-06-07T07:52:54.541Z"
2248
+ updatedAt: "2026-06-24T01:20:06.529Z"
2079
2249
  },
2080
2250
  {
2081
2251
  id: "760491",
@@ -2085,8 +2255,8 @@ var schedule_2026_default = [
2085
2255
  city: "Mexico City",
2086
2256
  country: "Mexico",
2087
2257
  home: {
2088
- code: "1A",
2089
- name: "Group A Winner",
2258
+ code: "TBD",
2259
+ name: "Mexico",
2090
2260
  flag: "\u{1F3F3}\uFE0F"
2091
2261
  },
2092
2262
  away: {
@@ -2095,7 +2265,7 @@ var schedule_2026_default = [
2095
2265
  flag: "\u{1F3F3}\uFE0F"
2096
2266
  },
2097
2267
  status: "SCHEDULED",
2098
- updatedAt: "2026-06-07T07:52:54.541Z"
2268
+ updatedAt: "2026-06-24T01:20:06.529Z"
2099
2269
  },
2100
2270
  {
2101
2271
  id: "760495",
@@ -2115,7 +2285,7 @@ var schedule_2026_default = [
2115
2285
  flag: "\u{1F3F3}\uFE0F"
2116
2286
  },
2117
2287
  status: "SCHEDULED",
2118
- updatedAt: "2026-06-07T07:52:54.541Z"
2288
+ updatedAt: "2026-06-24T01:20:06.529Z"
2119
2289
  },
2120
2290
  {
2121
2291
  id: "760493",
@@ -2135,7 +2305,7 @@ var schedule_2026_default = [
2135
2305
  flag: "\u{1F3F3}\uFE0F"
2136
2306
  },
2137
2307
  status: "SCHEDULED",
2138
- updatedAt: "2026-06-07T07:52:54.541Z"
2308
+ updatedAt: "2026-06-24T01:20:06.529Z"
2139
2309
  },
2140
2310
  {
2141
2311
  id: "760494",
@@ -2145,8 +2315,8 @@ var schedule_2026_default = [
2145
2315
  city: "Santa Clara, California",
2146
2316
  country: "USA",
2147
2317
  home: {
2148
- code: "1D",
2149
- name: "Group D Winner",
2318
+ code: "TBD",
2319
+ name: "United States",
2150
2320
  flag: "\u{1F3F3}\uFE0F"
2151
2321
  },
2152
2322
  away: {
@@ -2155,7 +2325,7 @@ var schedule_2026_default = [
2155
2325
  flag: "\u{1F3F3}\uFE0F"
2156
2326
  },
2157
2327
  status: "SCHEDULED",
2158
- updatedAt: "2026-06-07T07:52:54.541Z"
2328
+ updatedAt: "2026-06-24T01:20:06.529Z"
2159
2329
  },
2160
2330
  {
2161
2331
  id: "760497",
@@ -2175,7 +2345,7 @@ var schedule_2026_default = [
2175
2345
  flag: "\u{1F3F3}\uFE0F"
2176
2346
  },
2177
2347
  status: "SCHEDULED",
2178
- updatedAt: "2026-06-07T07:52:54.616Z"
2348
+ updatedAt: "2026-06-24T01:20:06.593Z"
2179
2349
  },
2180
2350
  {
2181
2351
  id: "760496",
@@ -2195,7 +2365,7 @@ var schedule_2026_default = [
2195
2365
  flag: "\u{1F3F3}\uFE0F"
2196
2366
  },
2197
2367
  status: "SCHEDULED",
2198
- updatedAt: "2026-06-07T07:52:54.616Z"
2368
+ updatedAt: "2026-06-24T01:20:06.593Z"
2199
2369
  },
2200
2370
  {
2201
2371
  id: "760498",
@@ -2215,7 +2385,7 @@ var schedule_2026_default = [
2215
2385
  flag: "\u{1F3F3}\uFE0F"
2216
2386
  },
2217
2387
  status: "SCHEDULED",
2218
- updatedAt: "2026-06-07T07:52:54.616Z"
2388
+ updatedAt: "2026-06-24T01:20:06.593Z"
2219
2389
  },
2220
2390
  {
2221
2391
  id: "760499",
@@ -2235,7 +2405,7 @@ var schedule_2026_default = [
2235
2405
  flag: "\u{1F3F3}\uFE0F"
2236
2406
  },
2237
2407
  status: "SCHEDULED",
2238
- updatedAt: "2026-06-07T07:52:54.616Z"
2408
+ updatedAt: "2026-06-24T01:20:06.593Z"
2239
2409
  },
2240
2410
  {
2241
2411
  id: "760500",
@@ -2245,8 +2415,8 @@ var schedule_2026_default = [
2245
2415
  city: "Miami Gardens, Florida",
2246
2416
  country: "USA",
2247
2417
  home: {
2248
- code: "1J",
2249
- name: "Group J Winner",
2418
+ code: "TBD",
2419
+ name: "Argentina",
2250
2420
  flag: "\u{1F3F3}\uFE0F"
2251
2421
  },
2252
2422
  away: {
@@ -2255,7 +2425,7 @@ var schedule_2026_default = [
2255
2425
  flag: "\u{1F3F3}\uFE0F"
2256
2426
  },
2257
2427
  status: "SCHEDULED",
2258
- updatedAt: "2026-06-07T07:52:54.616Z"
2428
+ updatedAt: "2026-06-24T01:20:06.593Z"
2259
2429
  },
2260
2430
  {
2261
2431
  id: "760501",
@@ -2275,7 +2445,7 @@ var schedule_2026_default = [
2275
2445
  flag: "\u{1F3F3}\uFE0F"
2276
2446
  },
2277
2447
  status: "SCHEDULED",
2278
- updatedAt: "2026-06-07T07:52:54.616Z"
2448
+ updatedAt: "2026-06-24T01:20:06.593Z"
2279
2449
  },
2280
2450
  {
2281
2451
  id: "760502",
@@ -2295,7 +2465,7 @@ var schedule_2026_default = [
2295
2465
  flag: "\u{1F3F3}\uFE0F"
2296
2466
  },
2297
2467
  status: "SCHEDULED",
2298
- updatedAt: "2026-06-07T07:52:54.616Z"
2468
+ updatedAt: "2026-06-24T01:20:06.593Z"
2299
2469
  },
2300
2470
  {
2301
2471
  id: "760503",
@@ -2315,7 +2485,7 @@ var schedule_2026_default = [
2315
2485
  flag: "\u{1F3F3}\uFE0F"
2316
2486
  },
2317
2487
  status: "SCHEDULED",
2318
- updatedAt: "2026-06-07T07:52:54.616Z"
2488
+ updatedAt: "2026-06-24T01:20:06.593Z"
2319
2489
  },
2320
2490
  {
2321
2491
  id: "760504",
@@ -2335,7 +2505,7 @@ var schedule_2026_default = [
2335
2505
  flag: "\u{1F3F3}\uFE0F"
2336
2506
  },
2337
2507
  status: "SCHEDULED",
2338
- updatedAt: "2026-06-07T07:52:54.616Z"
2508
+ updatedAt: "2026-06-24T01:20:06.593Z"
2339
2509
  },
2340
2510
  {
2341
2511
  id: "760505",
@@ -2355,7 +2525,7 @@ var schedule_2026_default = [
2355
2525
  flag: "\u{1F3F3}\uFE0F"
2356
2526
  },
2357
2527
  status: "SCHEDULED",
2358
- updatedAt: "2026-06-07T07:52:54.616Z"
2528
+ updatedAt: "2026-06-24T01:20:06.593Z"
2359
2529
  },
2360
2530
  {
2361
2531
  id: "760506",
@@ -2375,7 +2545,7 @@ var schedule_2026_default = [
2375
2545
  flag: "\u{1F3F3}\uFE0F"
2376
2546
  },
2377
2547
  status: "SCHEDULED",
2378
- updatedAt: "2026-06-07T07:52:54.616Z"
2548
+ updatedAt: "2026-06-24T01:20:06.593Z"
2379
2549
  },
2380
2550
  {
2381
2551
  id: "760507",
@@ -2395,7 +2565,7 @@ var schedule_2026_default = [
2395
2565
  flag: "\u{1F3F3}\uFE0F"
2396
2566
  },
2397
2567
  status: "SCHEDULED",
2398
- updatedAt: "2026-06-07T07:52:54.616Z"
2568
+ updatedAt: "2026-06-24T01:20:06.593Z"
2399
2569
  },
2400
2570
  {
2401
2571
  id: "760509",
@@ -2415,7 +2585,7 @@ var schedule_2026_default = [
2415
2585
  flag: "\u{1F3F3}\uFE0F"
2416
2586
  },
2417
2587
  status: "SCHEDULED",
2418
- updatedAt: "2026-06-07T07:52:54.616Z"
2588
+ updatedAt: "2026-06-24T01:20:06.593Z"
2419
2589
  },
2420
2590
  {
2421
2591
  id: "760508",
@@ -2435,7 +2605,7 @@ var schedule_2026_default = [
2435
2605
  flag: "\u{1F3F3}\uFE0F"
2436
2606
  },
2437
2607
  status: "SCHEDULED",
2438
- updatedAt: "2026-06-07T07:52:54.616Z"
2608
+ updatedAt: "2026-06-24T01:20:06.593Z"
2439
2609
  },
2440
2610
  {
2441
2611
  id: "760510",
@@ -2445,17 +2615,17 @@ var schedule_2026_default = [
2445
2615
  city: "Foxborough, Massachusetts",
2446
2616
  country: "USA",
2447
2617
  home: {
2448
- code: "RD16 W1",
2618
+ code: "RD32",
2449
2619
  name: "Round of 16 1 Winner",
2450
2620
  flag: "\u{1F3F3}\uFE0F"
2451
2621
  },
2452
2622
  away: {
2453
- code: "RD16 W2",
2623
+ code: "RD32",
2454
2624
  name: "Round of 16 2 Winner",
2455
2625
  flag: "\u{1F3F3}\uFE0F"
2456
2626
  },
2457
2627
  status: "SCHEDULED",
2458
- updatedAt: "2026-06-07T07:52:54.684Z"
2628
+ updatedAt: "2026-06-24T01:20:06.650Z"
2459
2629
  },
2460
2630
  {
2461
2631
  id: "760511",
@@ -2465,17 +2635,17 @@ var schedule_2026_default = [
2465
2635
  city: "Inglewood, California",
2466
2636
  country: "USA",
2467
2637
  home: {
2468
- code: "RD16 W5",
2638
+ code: "RD32",
2469
2639
  name: "Round of 16 5 Winner",
2470
2640
  flag: "\u{1F3F3}\uFE0F"
2471
2641
  },
2472
2642
  away: {
2473
- code: "RD16 W6",
2643
+ code: "RD32",
2474
2644
  name: "Round of 16 6 Winner",
2475
2645
  flag: "\u{1F3F3}\uFE0F"
2476
2646
  },
2477
2647
  status: "SCHEDULED",
2478
- updatedAt: "2026-06-07T07:52:54.684Z"
2648
+ updatedAt: "2026-06-24T01:20:06.650Z"
2479
2649
  },
2480
2650
  {
2481
2651
  id: "760512",
@@ -2485,17 +2655,17 @@ var schedule_2026_default = [
2485
2655
  city: "Miami Gardens, Florida",
2486
2656
  country: "USA",
2487
2657
  home: {
2488
- code: "RD16 W3",
2658
+ code: "RD32",
2489
2659
  name: "Round of 16 3 Winner",
2490
2660
  flag: "\u{1F3F3}\uFE0F"
2491
2661
  },
2492
2662
  away: {
2493
- code: "RD16 W4",
2663
+ code: "RD32",
2494
2664
  name: "Round of 16 4 Winner",
2495
2665
  flag: "\u{1F3F3}\uFE0F"
2496
2666
  },
2497
2667
  status: "SCHEDULED",
2498
- updatedAt: "2026-06-07T07:52:54.684Z"
2668
+ updatedAt: "2026-06-24T01:20:06.650Z"
2499
2669
  },
2500
2670
  {
2501
2671
  id: "760513",
@@ -2505,17 +2675,17 @@ var schedule_2026_default = [
2505
2675
  city: "Kansas City, Missouri",
2506
2676
  country: "USA",
2507
2677
  home: {
2508
- code: "RD16 W7",
2678
+ code: "RD32",
2509
2679
  name: "Round of 16 7 Winner",
2510
2680
  flag: "\u{1F3F3}\uFE0F"
2511
2681
  },
2512
2682
  away: {
2513
- code: "RD16 W8",
2683
+ code: "RD32",
2514
2684
  name: "Round of 16 8 Winner",
2515
2685
  flag: "\u{1F3F3}\uFE0F"
2516
2686
  },
2517
2687
  status: "SCHEDULED",
2518
- updatedAt: "2026-06-07T07:52:54.684Z"
2688
+ updatedAt: "2026-06-24T01:20:06.650Z"
2519
2689
  },
2520
2690
  {
2521
2691
  id: "760514",
@@ -2525,17 +2695,17 @@ var schedule_2026_default = [
2525
2695
  city: "Arlington, Texas",
2526
2696
  country: "USA",
2527
2697
  home: {
2528
- code: "QFW1",
2698
+ code: "RD32",
2529
2699
  name: "Quarterfinal 1 Winner",
2530
2700
  flag: "\u{1F3F3}\uFE0F"
2531
2701
  },
2532
2702
  away: {
2533
- code: "QFW2",
2703
+ code: "RD32",
2534
2704
  name: "Quarterfinal 2 Winner",
2535
2705
  flag: "\u{1F3F3}\uFE0F"
2536
2706
  },
2537
2707
  status: "SCHEDULED",
2538
- updatedAt: "2026-06-07T07:52:54.684Z"
2708
+ updatedAt: "2026-06-24T01:20:06.650Z"
2539
2709
  },
2540
2710
  {
2541
2711
  id: "760515",
@@ -2545,17 +2715,17 @@ var schedule_2026_default = [
2545
2715
  city: "Atlanta, Georgia",
2546
2716
  country: "USA",
2547
2717
  home: {
2548
- code: "QFW3",
2718
+ code: "RD32",
2549
2719
  name: "Quarterfinal 3 Winner",
2550
2720
  flag: "\u{1F3F3}\uFE0F"
2551
2721
  },
2552
2722
  away: {
2553
- code: "QW4",
2723
+ code: "RD32",
2554
2724
  name: "Quarterfinal 4 Winner",
2555
2725
  flag: "\u{1F3F3}\uFE0F"
2556
2726
  },
2557
2727
  status: "SCHEDULED",
2558
- updatedAt: "2026-06-07T07:52:54.684Z"
2728
+ updatedAt: "2026-06-24T01:20:06.650Z"
2559
2729
  },
2560
2730
  {
2561
2731
  id: "760516",
@@ -2565,17 +2735,17 @@ var schedule_2026_default = [
2565
2735
  city: "Miami Gardens, Florida",
2566
2736
  country: "USA",
2567
2737
  home: {
2568
- code: "SF L1",
2738
+ code: "RD32",
2569
2739
  name: "Semifinal 1 Loser",
2570
2740
  flag: "\u{1F3F3}\uFE0F"
2571
2741
  },
2572
2742
  away: {
2573
- code: "SF L2",
2743
+ code: "RD32",
2574
2744
  name: "Semifinal 2 Loser",
2575
2745
  flag: "\u{1F3F3}\uFE0F"
2576
2746
  },
2577
2747
  status: "SCHEDULED",
2578
- updatedAt: "2026-06-07T07:52:54.772Z"
2748
+ updatedAt: "2026-06-24T01:20:06.749Z"
2579
2749
  },
2580
2750
  {
2581
2751
  id: "760517",
@@ -2585,22 +2755,93 @@ var schedule_2026_default = [
2585
2755
  city: "East Rutherford, New Jersey",
2586
2756
  country: "USA",
2587
2757
  home: {
2588
- code: "SFW1",
2758
+ code: "RD32",
2589
2759
  name: "Semifinal 1 Winner",
2590
2760
  flag: "\u{1F3F3}\uFE0F"
2591
2761
  },
2592
2762
  away: {
2593
- code: "SFW2",
2763
+ code: "RD32",
2594
2764
  name: "Semifinal 2 Winner",
2595
2765
  flag: "\u{1F3F3}\uFE0F"
2596
2766
  },
2597
2767
  status: "SCHEDULED",
2598
- updatedAt: "2026-06-07T07:52:54.772Z"
2768
+ updatedAt: "2026-06-24T01:20:06.749Z"
2599
2769
  }
2600
2770
  ];
2601
2771
 
2772
+ // src/bracket/placeholders.ts
2773
+ var PLACEHOLDER_FLAG = "\u{1F3F3}\uFE0F";
2774
+ function winnerName(stage, index) {
2775
+ switch (stage) {
2776
+ case "R32":
2777
+ return `Round of 32 ${index} Winner`;
2778
+ case "R16":
2779
+ return `Round of 16 ${index} Winner`;
2780
+ case "QF":
2781
+ return `Quarterfinal ${index} Winner`;
2782
+ case "SF":
2783
+ return `Semifinal ${index} Winner`;
2784
+ default:
2785
+ return `${stage}-${index} Winner`;
2786
+ }
2787
+ }
2788
+ function slotRefToTeam(ref) {
2789
+ switch (ref.kind) {
2790
+ case "group":
2791
+ return {
2792
+ code: ref.position === 1 ? `1${ref.group}` : `2${ref.group}`,
2793
+ name: ref.position === 1 ? `Group ${ref.group} Winner` : `Group ${ref.group} 2nd Place`,
2794
+ flag: PLACEHOLDER_FLAG
2795
+ };
2796
+ case "third":
2797
+ return {
2798
+ code: "3RD",
2799
+ name: `Third Place Group ${ref.groups.join("/")}`,
2800
+ flag: PLACEHOLDER_FLAG
2801
+ };
2802
+ case "winner":
2803
+ return { code: "RD32", name: winnerName(ref.stage, ref.index), flag: PLACEHOLDER_FLAG };
2804
+ case "loser":
2805
+ return {
2806
+ code: "RD32",
2807
+ name: `Semifinal ${ref.index} Loser`,
2808
+ flag: PLACEHOLDER_FLAG
2809
+ };
2810
+ case "seed":
2811
+ return { code: "TBD", name: ref.label, flag: PLACEHOLDER_FLAG };
2812
+ default:
2813
+ return { code: "TBD", name: "TBD", flag: PLACEHOLDER_FLAG };
2814
+ }
2815
+ }
2816
+ function isResolvedNation(team) {
2817
+ return team.flag !== PLACEHOLDER_FLAG;
2818
+ }
2819
+
2602
2820
  // src/schedule.ts
2603
2821
  var SCHEDULE = schedule_2026_default;
2822
+ function sanitizeBundledFixture(m, node) {
2823
+ const base = {
2824
+ id: m.id,
2825
+ stage: m.stage,
2826
+ group: m.group,
2827
+ kickoff: m.kickoff,
2828
+ venue: m.venue,
2829
+ city: m.city,
2830
+ country: m.country,
2831
+ home: m.home,
2832
+ away: m.away,
2833
+ status: "SCHEDULED",
2834
+ updatedAt: m.updatedAt
2835
+ };
2836
+ if (node && m.stage !== "GROUP" && m.stage !== "FRIENDLY") {
2837
+ return {
2838
+ ...base,
2839
+ home: slotRefToTeam(node.home),
2840
+ away: slotRefToTeam(node.away)
2841
+ };
2842
+ }
2843
+ return base;
2844
+ }
2604
2845
  function allFixtures() {
2605
2846
  return SCHEDULE;
2606
2847
  }
@@ -2660,11 +2901,11 @@ function blankRow(team) {
2660
2901
  }
2661
2902
  function computeStandings(matches) {
2662
2903
  const rows = /* @__PURE__ */ new Map();
2663
- const ensure = (t) => {
2664
- let r = rows.get(t.code);
2904
+ const ensure = (t2) => {
2905
+ let r = rows.get(t2.code);
2665
2906
  if (!r) {
2666
- r = blankRow(t);
2667
- rows.set(t.code, r);
2907
+ r = blankRow(t2);
2908
+ rows.set(t2.code, r);
2668
2909
  }
2669
2910
  return r;
2670
2911
  };
@@ -2699,6 +2940,14 @@ function computeStandings(matches) {
2699
2940
  (a, b) => b.points - a.points || b.goalDiff - a.goalDiff || b.goalsFor - a.goalsFor || a.team.name.localeCompare(b.team.name)
2700
2941
  );
2701
2942
  }
2943
+ function rosterAtZero(matches) {
2944
+ const teams = /* @__PURE__ */ new Map();
2945
+ for (const m of matches) {
2946
+ teams.set(m.home.code, m.home);
2947
+ teams.set(m.away.code, m.away);
2948
+ }
2949
+ return [...teams.values()].sort((a, b) => a.name.localeCompare(b.name)).map(blankRow);
2950
+ }
2702
2951
 
2703
2952
  // src/adapters/espn.ts
2704
2953
  var ESPN_SOCCER = "https://site.api.espn.com/apis/site/v2/sports/soccer";
@@ -2747,10 +2996,10 @@ function toInt(s) {
2747
2996
  const n = parseInt(s, 10);
2748
2997
  return Number.isFinite(n) ? n : void 0;
2749
2998
  }
2750
- function toTeam(t) {
2751
- const name = t?.displayName ?? t?.name ?? t?.location ?? t?.shortDisplayName ?? "TBD";
2752
- const code = (t?.abbreviation ?? name.slice(0, 3)).toUpperCase();
2753
- return { code, name, flag: nationToFlag(t?.displayName ?? t?.abbreviation ?? name) };
2999
+ function toTeam(t2) {
3000
+ const name = t2?.displayName ?? t2?.name ?? t2?.location ?? t2?.shortDisplayName ?? "TBD";
3001
+ const code = (t2?.abbreviation ?? name.slice(0, 3)).toUpperCase();
3002
+ return { code, name, flag: nationToFlag(t2?.displayName ?? t2?.abbreviation ?? name) };
2754
3003
  }
2755
3004
  function mapEspnEvent(ev, ctx = {}) {
2756
3005
  const comp = ev.competitions?.[0];
@@ -2768,6 +3017,11 @@ function mapEspnEvent(ev, ctx = {}) {
2768
3017
  const hs = toInt(homeC?.score);
2769
3018
  const as = toInt(awayC?.score);
2770
3019
  const hasScore = status !== "SCHEDULED" && hs !== void 0 && as !== void 0;
3020
+ let winnerCode;
3021
+ if (isFinished(status)) {
3022
+ if (homeC?.winner) winnerCode = home.code;
3023
+ else if (awayC?.winner) winnerCode = away.code;
3024
+ }
2771
3025
  return {
2772
3026
  id: ev.id,
2773
3027
  stage,
@@ -2781,6 +3035,7 @@ function mapEspnEvent(ev, ctx = {}) {
2781
3035
  score: hasScore ? { home: hs, away: as } : void 0,
2782
3036
  minute: parseMinute(ev.status ?? comp?.status),
2783
3037
  status,
3038
+ winnerCode,
2784
3039
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
2785
3040
  };
2786
3041
  }
@@ -2872,7 +3127,7 @@ var EspnAdapter = class {
2872
3127
  const map = {};
2873
3128
  try {
2874
3129
  const tables = parseStandings(await this.get(this.standingsUrl()));
2875
- for (const t of tables) for (const r of t.rows) map[r.team.code] = t.group;
3130
+ for (const t2 of tables) for (const r of t2.rows) map[r.team.code] = t2.group;
2876
3131
  } catch {
2877
3132
  }
2878
3133
  this.groupMap = map;
@@ -2909,6 +3164,854 @@ var EspnAdapter = class {
2909
3164
  }
2910
3165
  };
2911
3166
 
3167
+ // src/bracket/parse.ts
3168
+ var PLACEHOLDER_FLAG2 = "\u{1F3F3}\uFE0F";
3169
+ function parseTeamSlot(team) {
3170
+ const name = team.name;
3171
+ let m = name.match(/^Group ([A-L]) Winner$/);
3172
+ if (m) return { kind: "group", position: 1, group: m[1] };
3173
+ m = name.match(/^Group ([A-L]) 2nd Place$/);
3174
+ if (m) return { kind: "group", position: 2, group: m[1] };
3175
+ m = name.match(/^Third Place Group ([A-L](?:\/[A-L])+)$/);
3176
+ if (m) return { kind: "third", groups: m[1].split("/") };
3177
+ m = name.match(/^Round of 32 (\d+) Winner$/);
3178
+ if (m) return { kind: "winner", stage: "R32", index: Number(m[1]) };
3179
+ m = name.match(/^Round of 16 (\d+) Winner$/);
3180
+ if (m) return { kind: "winner", stage: "R16", index: Number(m[1]) };
3181
+ m = name.match(/^Quarterfinal (\d+) Winner$/);
3182
+ if (m) return { kind: "winner", stage: "QF", index: Number(m[1]) };
3183
+ m = name.match(/^Semifinal (\d+) Winner$/);
3184
+ if (m) return { kind: "winner", stage: "SF", index: Number(m[1]) };
3185
+ m = name.match(/^Semifinal (\d+) Loser$/);
3186
+ if (m) return { kind: "loser", stage: "SF", index: Number(m[1]) };
3187
+ if (isResolvedNation(team)) {
3188
+ return { kind: "seed", label: team.name, code: "TBD" };
3189
+ }
3190
+ if (team.flag === PLACEHOLDER_FLAG2 && team.code === "TBD") {
3191
+ return { kind: "seed", label: team.name, code: "TBD" };
3192
+ }
3193
+ return null;
3194
+ }
3195
+
3196
+ // src/bracket/types.ts
3197
+ var BRACKET_STAGE_ORDER = ["R32", "R16", "QF", "SF", "3P", "F"];
3198
+ var EXPECTED_KNOCKOUT_COUNTS = {
3199
+ R32: 16,
3200
+ R16: 8,
3201
+ QF: 4,
3202
+ SF: 2,
3203
+ "3P": 1,
3204
+ F: 1
3205
+ };
3206
+ function teamFromMatch(match, code) {
3207
+ if (match.home.code === code) return match.home;
3208
+ if (match.away.code === code) return match.away;
3209
+ return void 0;
3210
+ }
3211
+
3212
+ // src/bracket/build.ts
3213
+ function matchKey(stage, index) {
3214
+ return `${stage}:${index}`;
3215
+ }
3216
+ function orderByBracketIndex(matches) {
3217
+ return [...matches].sort((a, b) => Number(a.id) - Number(b.id));
3218
+ }
3219
+ function buildBracketTopology(matches, generatedAt) {
3220
+ const knockout = matches.filter((m) => m.stage !== "GROUP" && m.stage !== "FRIENDLY");
3221
+ const problems = [];
3222
+ const nodes = [];
3223
+ for (const stage of BRACKET_STAGE_ORDER) {
3224
+ const stageMatches = orderByBracketIndex(knockout.filter((m) => m.stage === stage));
3225
+ const expected = EXPECTED_KNOCKOUT_COUNTS[stage];
3226
+ if (expected != null && stageMatches.length !== expected) {
3227
+ problems.push(`stage ${stage}: expected ${expected}, got ${stageMatches.length}`);
3228
+ }
3229
+ stageMatches.forEach((m, i) => {
3230
+ const home = parseTeamSlot(m.home);
3231
+ const away = parseTeamSlot(m.away);
3232
+ if (!home) problems.push(`${m.id}: unparsed home slot "${m.home.name}"`);
3233
+ if (!away) problems.push(`${m.id}: unparsed away slot "${m.away.name}"`);
3234
+ if (home && away) {
3235
+ nodes.push({ matchId: m.id, stage, index: i + 1, home, away });
3236
+ }
3237
+ });
3238
+ }
3239
+ const knockoutIds = new Set(knockout.map((m) => m.id));
3240
+ const topologyIds = new Set(nodes.map((n) => n.matchId));
3241
+ for (const id of knockoutIds) {
3242
+ if (!topologyIds.has(id)) problems.push(`knockout fixture ${id} missing from topology`);
3243
+ }
3244
+ for (const id of topologyIds) {
3245
+ if (!knockoutIds.has(id)) problems.push(`topology match ${id} not in knockout schedule`);
3246
+ }
3247
+ validateWinnerChain(nodes, problems);
3248
+ validateThirdPlace(nodes, problems);
3249
+ validateBracketIndexing(knockout, nodes, problems);
3250
+ if (problems.length > 0) {
3251
+ throw new Error(
3252
+ `bracket topology validation failed:
3253
+ ${problems.map((p) => ` - ${p}`).join("\n")}`
3254
+ );
3255
+ }
3256
+ return { generatedAt, stages: [...BRACKET_STAGE_ORDER], matches: nodes };
3257
+ }
3258
+ function validateBracketIndexing(knockout, nodes, problems) {
3259
+ for (const stage of ["R32", "R16"]) {
3260
+ const byKickoff2 = [...knockout.filter((m) => m.stage === stage)].sort(
3261
+ (a, b) => a.kickoff.localeCompare(b.kickoff)
3262
+ );
3263
+ const byId = orderByBracketIndex(knockout.filter((m) => m.stage === stage));
3264
+ const kickoffIds = byKickoff2.map((m) => m.id).join(",");
3265
+ const idIds = byId.map((m) => m.id).join(",");
3266
+ if (kickoffIds !== idIds) {
3267
+ const diverged = byKickoff2.map((m, i) => ({ kickoffRank: i + 1, idRank: byId.findIndex((x) => x.id === m.id) + 1, id: m.id })).filter((x) => x.kickoffRank !== x.idRank);
3268
+ if (diverged.length > 0 && stage === "R32") {
3269
+ const r32ById = new Map(nodes.filter((n) => n.stage === "R32").map((n) => [n.index, n.matchId]));
3270
+ const r16First = nodes.find((n) => n.stage === "R16" && n.index === 1);
3271
+ if (r16First) {
3272
+ const home = r16First.home;
3273
+ const away = r16First.away;
3274
+ if (home.kind === "winner" && home.stage === "R32") {
3275
+ const expectedId = r32ById.get(home.index);
3276
+ if (!expectedId) {
3277
+ problems.push(`R32 index ${home.index} missing for R16-1 home ref`);
3278
+ }
3279
+ }
3280
+ if (away.kind === "winner" && away.stage === "R32") {
3281
+ const expectedId = r32ById.get(away.index);
3282
+ if (!expectedId) {
3283
+ problems.push(`R32 index ${away.index} missing for R16-1 away ref`);
3284
+ }
3285
+ }
3286
+ }
3287
+ }
3288
+ }
3289
+ }
3290
+ }
3291
+ function validateWinnerChain(nodes, problems) {
3292
+ const indexMap = new Map(nodes.map((n) => [matchKey(n.stage, n.index), n]));
3293
+ const chains = [
3294
+ { from: "R32", to: "R16", count: 16 },
3295
+ { from: "R16", to: "QF", count: 8 },
3296
+ { from: "QF", to: "SF", count: 4 },
3297
+ { from: "SF", to: "F", count: 2 }
3298
+ ];
3299
+ for (const { from, to, count } of chains) {
3300
+ const refs = nodes.filter((n) => n.stage === to).flatMap((n) => [n.home, n.away]).filter((r) => r.kind === "winner" && r.stage === from);
3301
+ const indices = refs.map((r) => r.index);
3302
+ if (indices.length !== count) {
3303
+ problems.push(`${to}: expected ${count} ${from} winner refs, got ${indices.length}`);
3304
+ }
3305
+ const unique = new Set(indices);
3306
+ if (unique.size !== count) {
3307
+ problems.push(`${to}: ${from} winner indices must be unique 1..${count}`);
3308
+ }
3309
+ for (let i = 1; i <= count; i++) {
3310
+ if (!unique.has(i)) problems.push(`${to}: missing ${from} winner index ${i}`);
3311
+ if (!indexMap.has(matchKey(from, i))) problems.push(`missing ${from} match index ${i}`);
3312
+ }
3313
+ }
3314
+ }
3315
+ function validateThirdPlace(nodes, problems) {
3316
+ const third = nodes.find((n) => n.stage === "3P");
3317
+ if (!third) {
3318
+ problems.push("missing third-place play-off node");
3319
+ return;
3320
+ }
3321
+ const slots = [third.home, third.away];
3322
+ const indices = /* @__PURE__ */ new Set();
3323
+ for (const slot of slots) {
3324
+ if (slot.kind !== "loser" || slot.stage !== "SF") {
3325
+ problems.push("3P slots must reference SF losers");
3326
+ return;
3327
+ }
3328
+ indices.add(slot.index);
3329
+ }
3330
+ if (!indices.has(1) || !indices.has(2)) {
3331
+ problems.push("3P must reference Semifinal 1 Loser and Semifinal 2 Loser");
3332
+ }
3333
+ }
3334
+
3335
+ // src/bracket/resolve.ts
3336
+ function isGroupComplete(group, tables, standingsDegraded) {
3337
+ if (standingsDegraded) return false;
3338
+ const table = tables.find((t2) => t2.group === group);
3339
+ if (!table?.rows.length || table.rows.length !== 4) return false;
3340
+ return table.rows.every((r) => r.played >= 3);
3341
+ }
3342
+ function teamFromStandings(group, position, tables) {
3343
+ const table = tables.find((t2) => t2.group === group);
3344
+ if (!table) return void 0;
3345
+ const row = table.rows[position - 1];
3346
+ return row?.team;
3347
+ }
3348
+ function resolveWinner(match) {
3349
+ if (!isFinished(match.status)) return void 0;
3350
+ if (match.winnerCode) {
3351
+ const w = teamFromMatch(match, match.winnerCode);
3352
+ if (w && w.flag !== "\u{1F3F3}\uFE0F") return w;
3353
+ }
3354
+ if (!match.score) return void 0;
3355
+ const outcome = outcomeFromScore(match.score.home, match.score.away);
3356
+ if (outcome === "H") return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3357
+ if (outcome === "A") return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3358
+ return void 0;
3359
+ }
3360
+ function resolveLoser(match) {
3361
+ if (!isFinished(match.status)) return void 0;
3362
+ if (match.winnerCode) {
3363
+ const winner = teamFromMatch(match, match.winnerCode);
3364
+ if (winner?.code === match.home.code) {
3365
+ return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3366
+ }
3367
+ if (winner?.code === match.away.code) {
3368
+ return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3369
+ }
3370
+ }
3371
+ if (!match.score) return void 0;
3372
+ const outcome = outcomeFromScore(match.score.home, match.score.away);
3373
+ if (outcome === "H") return match.away.flag !== "\u{1F3F3}\uFE0F" ? match.away : void 0;
3374
+ if (outcome === "A") return match.home.flag !== "\u{1F3F3}\uFE0F" ? match.home : void 0;
3375
+ return void 0;
3376
+ }
3377
+ function participant(team, status) {
3378
+ return { label: team.name, flag: team.flag, code: team.code, status };
3379
+ }
3380
+ function tbd(label) {
3381
+ return { label, flag: "\u{1F3F3}\uFE0F", status: "tbd" };
3382
+ }
3383
+ function winnerLabel(ctx, stage, index) {
3384
+ return t(ctx.lang, "bracket.slot.winner", {
3385
+ stage: stageLabelI18n(ctx.lang, stage),
3386
+ n: String(index)
3387
+ });
3388
+ }
3389
+ function resolveSlot(ref, ctx) {
3390
+ switch (ref.kind) {
3391
+ case "seed":
3392
+ return tbd(ref.label);
3393
+ case "group": {
3394
+ if (isGroupComplete(ref.group, ctx.tables, ctx.standingsDegraded)) {
3395
+ const team = teamFromStandings(ref.group, ref.position, ctx.tables);
3396
+ if (team) return participant(team, "projected");
3397
+ }
3398
+ const label = ref.position === 1 ? t(ctx.lang, "bracket.slot.groupWinner", { group: ref.group }) : t(ctx.lang, "bracket.slot.groupSecond", { group: ref.group });
3399
+ return tbd(label);
3400
+ }
3401
+ case "third":
3402
+ return tbd(t(ctx.lang, "bracket.slot.third", { groups: ref.groups.join("/") }));
3403
+ case "winner": {
3404
+ const node = ctx.nodesByKey.get(matchKey(ref.stage, ref.index));
3405
+ const match = node ? ctx.matchesById.get(node.matchId) : void 0;
3406
+ if (match) {
3407
+ const winner = resolveWinner(match);
3408
+ if (winner) return participant(winner, "confirmed");
3409
+ }
3410
+ return tbd(winnerLabel(ctx, ref.stage, ref.index));
3411
+ }
3412
+ case "loser": {
3413
+ const node = ctx.nodesByKey.get(matchKey(ref.stage, ref.index));
3414
+ const match = node ? ctx.matchesById.get(node.matchId) : void 0;
3415
+ if (match) {
3416
+ const loser = resolveLoser(match);
3417
+ if (loser) return participant(loser, "confirmed");
3418
+ }
3419
+ return tbd(
3420
+ t(ctx.lang, "bracket.slot.loser", {
3421
+ stage: stageLabelI18n(ctx.lang, ref.stage),
3422
+ n: String(ref.index)
3423
+ })
3424
+ );
3425
+ }
3426
+ default:
3427
+ return tbd(t(ctx.lang, "bracket.slot.tbd"));
3428
+ }
3429
+ }
3430
+ function buildBracketView(topology, matches, tables, standingsDegraded, liveDegraded, filterStage, lang) {
3431
+ const knockout = matches.filter((m) => m.stage !== "GROUP" && m.stage !== "FRIENDLY");
3432
+ const matchesById = new Map(knockout.map((m) => [m.id, m]));
3433
+ const nodesByKey = new Map(topology.matches.map((n) => [matchKey(n.stage, n.index), n]));
3434
+ const ctx = { nodesByKey, matchesById, tables, standingsDegraded, lang };
3435
+ const want = filterStage?.toUpperCase();
3436
+ const stages = [];
3437
+ for (const stage of topology.stages) {
3438
+ if (want && stage !== want) continue;
3439
+ const nodes = topology.matches.filter((n) => n.stage === stage);
3440
+ const matchViews = nodes.map((node) => {
3441
+ const match = matchesById.get(node.matchId) ?? {
3442
+ id: node.matchId,
3443
+ stage: node.stage,
3444
+ kickoff: "",
3445
+ venue: "",
3446
+ home: { code: "?", name: "TBD", flag: "\u{1F3F3}\uFE0F" },
3447
+ away: { code: "?", name: "TBD", flag: "\u{1F3F3}\uFE0F" },
3448
+ status: "SCHEDULED",
3449
+ updatedAt: ""
3450
+ };
3451
+ return {
3452
+ matchId: node.matchId,
3453
+ stage: node.stage,
3454
+ index: node.index,
3455
+ kickoff: match.kickoff,
3456
+ home: resolveSlot(node.home, ctx),
3457
+ away: resolveSlot(node.away, ctx),
3458
+ match
3459
+ };
3460
+ });
3461
+ stages.push({
3462
+ stage,
3463
+ label: stageLabelI18n(lang, stage),
3464
+ matches: matchViews
3465
+ });
3466
+ }
3467
+ return {
3468
+ stages,
3469
+ degraded: liveDegraded,
3470
+ standingsDegraded
3471
+ };
3472
+ }
3473
+
3474
+ // src/data/bracket.2026.json
3475
+ var bracket_2026_default = {
3476
+ generatedAt: "2026-06-24T01:20:06.749Z",
3477
+ stages: [
3478
+ "R32",
3479
+ "R16",
3480
+ "QF",
3481
+ "SF",
3482
+ "3P",
3483
+ "F"
3484
+ ],
3485
+ matches: [
3486
+ {
3487
+ matchId: "760486",
3488
+ stage: "R32",
3489
+ index: 1,
3490
+ home: {
3491
+ kind: "group",
3492
+ position: 2,
3493
+ group: "A"
3494
+ },
3495
+ away: {
3496
+ kind: "group",
3497
+ position: 2,
3498
+ group: "B"
3499
+ }
3500
+ },
3501
+ {
3502
+ matchId: "760487",
3503
+ stage: "R32",
3504
+ index: 2,
3505
+ home: {
3506
+ kind: "group",
3507
+ position: 1,
3508
+ group: "C"
3509
+ },
3510
+ away: {
3511
+ kind: "group",
3512
+ position: 2,
3513
+ group: "F"
3514
+ }
3515
+ },
3516
+ {
3517
+ matchId: "760488",
3518
+ stage: "R32",
3519
+ index: 3,
3520
+ home: {
3521
+ kind: "group",
3522
+ position: 1,
3523
+ group: "F"
3524
+ },
3525
+ away: {
3526
+ kind: "group",
3527
+ position: 2,
3528
+ group: "C"
3529
+ }
3530
+ },
3531
+ {
3532
+ matchId: "760489",
3533
+ stage: "R32",
3534
+ index: 4,
3535
+ home: {
3536
+ kind: "seed",
3537
+ label: "Germany",
3538
+ code: "TBD"
3539
+ },
3540
+ away: {
3541
+ kind: "third",
3542
+ groups: [
3543
+ "A",
3544
+ "B",
3545
+ "C",
3546
+ "D",
3547
+ "F"
3548
+ ]
3549
+ }
3550
+ },
3551
+ {
3552
+ matchId: "760490",
3553
+ stage: "R32",
3554
+ index: 5,
3555
+ home: {
3556
+ kind: "group",
3557
+ position: 2,
3558
+ group: "E"
3559
+ },
3560
+ away: {
3561
+ kind: "group",
3562
+ position: 2,
3563
+ group: "I"
3564
+ }
3565
+ },
3566
+ {
3567
+ matchId: "760491",
3568
+ stage: "R32",
3569
+ index: 6,
3570
+ home: {
3571
+ kind: "seed",
3572
+ label: "Mexico",
3573
+ code: "TBD"
3574
+ },
3575
+ away: {
3576
+ kind: "third",
3577
+ groups: [
3578
+ "C",
3579
+ "E",
3580
+ "F",
3581
+ "H",
3582
+ "I"
3583
+ ]
3584
+ }
3585
+ },
3586
+ {
3587
+ matchId: "760492",
3588
+ stage: "R32",
3589
+ index: 7,
3590
+ home: {
3591
+ kind: "group",
3592
+ position: 1,
3593
+ group: "I"
3594
+ },
3595
+ away: {
3596
+ kind: "third",
3597
+ groups: [
3598
+ "C",
3599
+ "D",
3600
+ "F",
3601
+ "G",
3602
+ "H"
3603
+ ]
3604
+ }
3605
+ },
3606
+ {
3607
+ matchId: "760493",
3608
+ stage: "R32",
3609
+ index: 8,
3610
+ home: {
3611
+ kind: "group",
3612
+ position: 1,
3613
+ group: "G"
3614
+ },
3615
+ away: {
3616
+ kind: "third",
3617
+ groups: [
3618
+ "A",
3619
+ "E",
3620
+ "H",
3621
+ "I",
3622
+ "J"
3623
+ ]
3624
+ }
3625
+ },
3626
+ {
3627
+ matchId: "760494",
3628
+ stage: "R32",
3629
+ index: 9,
3630
+ home: {
3631
+ kind: "seed",
3632
+ label: "United States",
3633
+ code: "TBD"
3634
+ },
3635
+ away: {
3636
+ kind: "third",
3637
+ groups: [
3638
+ "B",
3639
+ "E",
3640
+ "F",
3641
+ "I",
3642
+ "J"
3643
+ ]
3644
+ }
3645
+ },
3646
+ {
3647
+ matchId: "760495",
3648
+ stage: "R32",
3649
+ index: 10,
3650
+ home: {
3651
+ kind: "group",
3652
+ position: 1,
3653
+ group: "L"
3654
+ },
3655
+ away: {
3656
+ kind: "third",
3657
+ groups: [
3658
+ "E",
3659
+ "H",
3660
+ "I",
3661
+ "J",
3662
+ "K"
3663
+ ]
3664
+ }
3665
+ },
3666
+ {
3667
+ matchId: "760496",
3668
+ stage: "R32",
3669
+ index: 11,
3670
+ home: {
3671
+ kind: "group",
3672
+ position: 2,
3673
+ group: "K"
3674
+ },
3675
+ away: {
3676
+ kind: "group",
3677
+ position: 2,
3678
+ group: "L"
3679
+ }
3680
+ },
3681
+ {
3682
+ matchId: "760497",
3683
+ stage: "R32",
3684
+ index: 12,
3685
+ home: {
3686
+ kind: "group",
3687
+ position: 1,
3688
+ group: "H"
3689
+ },
3690
+ away: {
3691
+ kind: "group",
3692
+ position: 2,
3693
+ group: "J"
3694
+ }
3695
+ },
3696
+ {
3697
+ matchId: "760498",
3698
+ stage: "R32",
3699
+ index: 13,
3700
+ home: {
3701
+ kind: "group",
3702
+ position: 1,
3703
+ group: "B"
3704
+ },
3705
+ away: {
3706
+ kind: "third",
3707
+ groups: [
3708
+ "E",
3709
+ "F",
3710
+ "G",
3711
+ "I",
3712
+ "J"
3713
+ ]
3714
+ }
3715
+ },
3716
+ {
3717
+ matchId: "760499",
3718
+ stage: "R32",
3719
+ index: 14,
3720
+ home: {
3721
+ kind: "group",
3722
+ position: 2,
3723
+ group: "D"
3724
+ },
3725
+ away: {
3726
+ kind: "group",
3727
+ position: 2,
3728
+ group: "G"
3729
+ }
3730
+ },
3731
+ {
3732
+ matchId: "760500",
3733
+ stage: "R32",
3734
+ index: 15,
3735
+ home: {
3736
+ kind: "seed",
3737
+ label: "Argentina",
3738
+ code: "TBD"
3739
+ },
3740
+ away: {
3741
+ kind: "group",
3742
+ position: 2,
3743
+ group: "H"
3744
+ }
3745
+ },
3746
+ {
3747
+ matchId: "760501",
3748
+ stage: "R32",
3749
+ index: 16,
3750
+ home: {
3751
+ kind: "group",
3752
+ position: 1,
3753
+ group: "K"
3754
+ },
3755
+ away: {
3756
+ kind: "third",
3757
+ groups: [
3758
+ "D",
3759
+ "E",
3760
+ "I",
3761
+ "J",
3762
+ "L"
3763
+ ]
3764
+ }
3765
+ },
3766
+ {
3767
+ matchId: "760502",
3768
+ stage: "R16",
3769
+ index: 1,
3770
+ home: {
3771
+ kind: "winner",
3772
+ stage: "R32",
3773
+ index: 1
3774
+ },
3775
+ away: {
3776
+ kind: "winner",
3777
+ stage: "R32",
3778
+ index: 3
3779
+ }
3780
+ },
3781
+ {
3782
+ matchId: "760503",
3783
+ stage: "R16",
3784
+ index: 2,
3785
+ home: {
3786
+ kind: "winner",
3787
+ stage: "R32",
3788
+ index: 2
3789
+ },
3790
+ away: {
3791
+ kind: "winner",
3792
+ stage: "R32",
3793
+ index: 5
3794
+ }
3795
+ },
3796
+ {
3797
+ matchId: "760504",
3798
+ stage: "R16",
3799
+ index: 3,
3800
+ home: {
3801
+ kind: "winner",
3802
+ stage: "R32",
3803
+ index: 4
3804
+ },
3805
+ away: {
3806
+ kind: "winner",
3807
+ stage: "R32",
3808
+ index: 6
3809
+ }
3810
+ },
3811
+ {
3812
+ matchId: "760505",
3813
+ stage: "R16",
3814
+ index: 4,
3815
+ home: {
3816
+ kind: "winner",
3817
+ stage: "R32",
3818
+ index: 7
3819
+ },
3820
+ away: {
3821
+ kind: "winner",
3822
+ stage: "R32",
3823
+ index: 8
3824
+ }
3825
+ },
3826
+ {
3827
+ matchId: "760506",
3828
+ stage: "R16",
3829
+ index: 5,
3830
+ home: {
3831
+ kind: "winner",
3832
+ stage: "R32",
3833
+ index: 11
3834
+ },
3835
+ away: {
3836
+ kind: "winner",
3837
+ stage: "R32",
3838
+ index: 12
3839
+ }
3840
+ },
3841
+ {
3842
+ matchId: "760507",
3843
+ stage: "R16",
3844
+ index: 6,
3845
+ home: {
3846
+ kind: "winner",
3847
+ stage: "R32",
3848
+ index: 9
3849
+ },
3850
+ away: {
3851
+ kind: "winner",
3852
+ stage: "R32",
3853
+ index: 10
3854
+ }
3855
+ },
3856
+ {
3857
+ matchId: "760508",
3858
+ stage: "R16",
3859
+ index: 7,
3860
+ home: {
3861
+ kind: "winner",
3862
+ stage: "R32",
3863
+ index: 13
3864
+ },
3865
+ away: {
3866
+ kind: "winner",
3867
+ stage: "R32",
3868
+ index: 15
3869
+ }
3870
+ },
3871
+ {
3872
+ matchId: "760509",
3873
+ stage: "R16",
3874
+ index: 8,
3875
+ home: {
3876
+ kind: "winner",
3877
+ stage: "R32",
3878
+ index: 14
3879
+ },
3880
+ away: {
3881
+ kind: "winner",
3882
+ stage: "R32",
3883
+ index: 16
3884
+ }
3885
+ },
3886
+ {
3887
+ matchId: "760510",
3888
+ stage: "QF",
3889
+ index: 1,
3890
+ home: {
3891
+ kind: "winner",
3892
+ stage: "R16",
3893
+ index: 1
3894
+ },
3895
+ away: {
3896
+ kind: "winner",
3897
+ stage: "R16",
3898
+ index: 2
3899
+ }
3900
+ },
3901
+ {
3902
+ matchId: "760511",
3903
+ stage: "QF",
3904
+ index: 2,
3905
+ home: {
3906
+ kind: "winner",
3907
+ stage: "R16",
3908
+ index: 5
3909
+ },
3910
+ away: {
3911
+ kind: "winner",
3912
+ stage: "R16",
3913
+ index: 6
3914
+ }
3915
+ },
3916
+ {
3917
+ matchId: "760512",
3918
+ stage: "QF",
3919
+ index: 3,
3920
+ home: {
3921
+ kind: "winner",
3922
+ stage: "R16",
3923
+ index: 3
3924
+ },
3925
+ away: {
3926
+ kind: "winner",
3927
+ stage: "R16",
3928
+ index: 4
3929
+ }
3930
+ },
3931
+ {
3932
+ matchId: "760513",
3933
+ stage: "QF",
3934
+ index: 4,
3935
+ home: {
3936
+ kind: "winner",
3937
+ stage: "R16",
3938
+ index: 7
3939
+ },
3940
+ away: {
3941
+ kind: "winner",
3942
+ stage: "R16",
3943
+ index: 8
3944
+ }
3945
+ },
3946
+ {
3947
+ matchId: "760514",
3948
+ stage: "SF",
3949
+ index: 1,
3950
+ home: {
3951
+ kind: "winner",
3952
+ stage: "QF",
3953
+ index: 1
3954
+ },
3955
+ away: {
3956
+ kind: "winner",
3957
+ stage: "QF",
3958
+ index: 2
3959
+ }
3960
+ },
3961
+ {
3962
+ matchId: "760515",
3963
+ stage: "SF",
3964
+ index: 2,
3965
+ home: {
3966
+ kind: "winner",
3967
+ stage: "QF",
3968
+ index: 3
3969
+ },
3970
+ away: {
3971
+ kind: "winner",
3972
+ stage: "QF",
3973
+ index: 4
3974
+ }
3975
+ },
3976
+ {
3977
+ matchId: "760516",
3978
+ stage: "3P",
3979
+ index: 1,
3980
+ home: {
3981
+ kind: "loser",
3982
+ stage: "SF",
3983
+ index: 1
3984
+ },
3985
+ away: {
3986
+ kind: "loser",
3987
+ stage: "SF",
3988
+ index: 2
3989
+ }
3990
+ },
3991
+ {
3992
+ matchId: "760517",
3993
+ stage: "F",
3994
+ index: 1,
3995
+ home: {
3996
+ kind: "winner",
3997
+ stage: "SF",
3998
+ index: 1
3999
+ },
4000
+ away: {
4001
+ kind: "winner",
4002
+ stage: "SF",
4003
+ index: 2
4004
+ }
4005
+ }
4006
+ ]
4007
+ };
4008
+
4009
+ // src/bracket/topology.ts
4010
+ var TOPOLOGY = bracket_2026_default;
4011
+ function loadBracketTopology() {
4012
+ return TOPOLOGY;
4013
+ }
4014
+
2912
4015
  // src/live.ts
2913
4016
  function resolveCompetition(explicit) {
2914
4017
  if (explicit) return explicit;
@@ -2950,7 +4053,7 @@ async function getStandings(adapter, group) {
2950
4053
  if (adapter.fetchStandings) {
2951
4054
  try {
2952
4055
  const all = await adapter.fetchStandings();
2953
- const tables2 = (want ? all.filter((t) => t.group === want) : all).sort(
4056
+ const tables2 = (want ? all.filter((t2) => t2.group === want) : all).sort(
2954
4057
  (a, b) => a.group.localeCompare(b.group)
2955
4058
  );
2956
4059
  return { tables: tables2, degraded: false, source: adapter.name };
@@ -2958,9 +4061,45 @@ async function getStandings(adapter, group) {
2958
4061
  }
2959
4062
  }
2960
4063
  const letters = want ? [want] : groups();
2961
- const tables = letters.map((g) => ({ group: g, rows: computeStandings(fixturesByGroup(g)) })).filter((t) => t.rows.length > 0);
4064
+ const tables = letters.map((g) => ({ group: g, rows: rosterAtZero(fixturesByGroup(g)) })).filter((t2) => t2.rows.length > 0);
2962
4065
  return { tables, degraded: true };
2963
4066
  }
4067
+ var KNOCKOUT_WINDOW_START = "20260628";
4068
+ var KNOCKOUT_WINDOW_END = "20260719";
4069
+ async function getBracket(adapter, opts = {}) {
4070
+ const topology = loadBracketTopology();
4071
+ const base = allFixtures().filter((m) => m.stage !== "GROUP" && m.stage !== "FRIENDLY");
4072
+ let matches = base;
4073
+ let liveDegraded = true;
4074
+ let source;
4075
+ try {
4076
+ const live = adapter.fetchWindow ? await adapter.fetchWindow(KNOCKOUT_WINDOW_START, KNOCKOUT_WINDOW_END) : [];
4077
+ matches = mergeLive(base, live);
4078
+ liveDegraded = false;
4079
+ source = adapter.name;
4080
+ } catch {
4081
+ }
4082
+ const standings = await getStandings(adapter);
4083
+ if (!source && !standings.degraded && standings.source) {
4084
+ source = standings.source;
4085
+ }
4086
+ const view = buildBracketView(
4087
+ topology,
4088
+ matches,
4089
+ standings.tables,
4090
+ standings.degraded,
4091
+ liveDegraded,
4092
+ opts.stage,
4093
+ opts.lang
4094
+ );
4095
+ if (source) view.source = source;
4096
+ return {
4097
+ view,
4098
+ degraded: liveDegraded,
4099
+ standingsDegraded: standings.degraded,
4100
+ source
4101
+ };
4102
+ }
2964
4103
  function shiftUtcDate(dateISO, days) {
2965
4104
  const [y, m, d] = dateISO.slice(0, 10).split("-").map(Number);
2966
4105
  return new Date(Date.UTC(y ?? 1970, (m ?? 1) - 1, (d ?? 1) + days)).toISOString().slice(0, 10);
@@ -3118,9 +4257,9 @@ function outcomeLabel(o, match) {
3118
4257
  return o.label;
3119
4258
  }
3120
4259
  function utcHhmm(iso) {
3121
- const t = Date.parse(iso);
3122
- if (!Number.isFinite(t)) return "";
3123
- return `${new Date(t).toISOString().slice(11, 16)} UTC`;
4260
+ const t2 = Date.parse(iso);
4261
+ if (!Number.isFinite(t2)) return "";
4262
+ return `${new Date(t2).toISOString().slice(11, 16)} UTC`;
3124
4263
  }
3125
4264
  function marketFavoriteText(signal, match) {
3126
4265
  const fav = signal.favorite;
@@ -3493,6 +4632,7 @@ function socialCard(m, input) {
3493
4632
  }
3494
4633
  const loc = matchLocation(m);
3495
4634
  if (loc) lines.push(loc);
4635
+ if (m.stage !== "GROUP") lines.push(stageLabel(m));
3496
4636
  return lines;
3497
4637
  }
3498
4638
  function formatShareSnippet(input, options = {}) {
@@ -3567,7 +4707,111 @@ function formatShareTable(input, options = {}) {
3567
4707
  );
3568
4708
  return blocks.join("\n\n");
3569
4709
  }
4710
+
4711
+ // src/bracket/format.ts
4712
+ function formatParticipant(p, flags, locale) {
4713
+ const suffix = p.status === "projected" ? ` ${t(locale, "bracket.projected")}` : "";
4714
+ if (flags && p.flag !== "\u{1F3F3}\uFE0F") return `${p.flag} ${p.label}${suffix}`;
4715
+ if (p.code) return `${p.code}${suffix}`;
4716
+ return `${p.label}${suffix}`;
4717
+ }
4718
+ function statusTail2(m) {
4719
+ if (m.status === "LIVE" && m.minute) return ` ${m.minute}'`;
4720
+ if (m.status === "HT") return " HT";
4721
+ if (m.status === "FT") return " FT";
4722
+ if (isLive(m.status)) return " LIVE";
4723
+ return "";
4724
+ }
4725
+ function formatBracketMatchLine(mv, opts = {}) {
4726
+ const flags = opts.flags !== false;
4727
+ const home = formatParticipant(mv.home, flags, opts.locale);
4728
+ const away = formatParticipant(mv.away, flags, opts.locale);
4729
+ const m = mv.match;
4730
+ if (isFinished(m.status) || isLive(m.status)) {
4731
+ return ` ${home} ${scoreline(m)} ${away}${statusTail2(m)}`;
4732
+ }
4733
+ const kickoff = mv.kickoff ? formatKickoff(mv.kickoff, { tz: opts.tz, locale: opts.locale }) : "";
4734
+ return ` ${home} vs ${away}${kickoff ? ` \xB7 ${kickoff}` : ""}`;
4735
+ }
4736
+ function formatBracketList(view, opts = {}) {
4737
+ const blocks = [];
4738
+ for (const stage of view.stages) {
4739
+ blocks.push(stage.label);
4740
+ for (const mv of stage.matches) {
4741
+ blocks.push(formatBracketMatchLine(mv, opts));
4742
+ }
4743
+ blocks.push("");
4744
+ }
4745
+ if (opts.footer !== false) {
4746
+ if (view.degraded) {
4747
+ blocks.push(`(${t(opts.locale, "bracket.degraded")})`);
4748
+ } else if (view.standingsDegraded) {
4749
+ blocks.push(`(${t(opts.locale, "bracket.standingsDegraded")})`);
4750
+ }
4751
+ if (view.source) {
4752
+ blocks.push(t(opts.locale, "live.data", { source: liveSourceLabel(view.source) }));
4753
+ }
4754
+ }
4755
+ return blocks.join("\n").trimEnd();
4756
+ }
4757
+ var MIN_TREE_WIDTH = 80;
4758
+ function formatBracketTree(view, opts = {}) {
4759
+ const width = opts.width ?? 80;
4760
+ if (width < MIN_TREE_WIDTH) return null;
4761
+ const blocks = [];
4762
+ for (let i = 0; i < view.stages.length; i++) {
4763
+ const stage = view.stages[i];
4764
+ blocks.push(`\u2501\u2501\u2501 ${stage.label} \u2501\u2501\u2501`);
4765
+ for (const mv of stage.matches) {
4766
+ blocks.push(formatBracketMatchLine(mv, opts));
4767
+ }
4768
+ if (i < view.stages.length - 1) {
4769
+ blocks.push(" \u2502");
4770
+ blocks.push(" \u25BC");
4771
+ }
4772
+ blocks.push("");
4773
+ }
4774
+ if (opts.footer !== false) {
4775
+ if (view.degraded) {
4776
+ blocks.push(`(${t(opts.locale, "bracket.degraded")})`);
4777
+ } else if (view.standingsDegraded) {
4778
+ blocks.push(`(${t(opts.locale, "bracket.standingsDegraded")})`);
4779
+ }
4780
+ if (view.source) {
4781
+ blocks.push(t(opts.locale, "live.data", { source: liveSourceLabel(view.source) }));
4782
+ }
4783
+ }
4784
+ return blocks.join("\n").trimEnd();
4785
+ }
4786
+ function formatShareBracket(input, options = {}) {
4787
+ const includeHashtag = options.includeHashtag !== false;
4788
+ const includeInstall = options.includeInstallLine !== false;
4789
+ const locale = options.locale;
4790
+ const blocks = [t(locale, "bracket.shareTitle"), ""];
4791
+ if (input.view.stages.length === 0) {
4792
+ blocks.push(input.emptyNote ?? t(locale, "bracket.empty"));
4793
+ } else {
4794
+ blocks.push(formatBracketList(input.view, { footer: false, locale }));
4795
+ if (input.view.degraded) {
4796
+ blocks.push(`(${t(locale, "bracket.degraded")})`);
4797
+ } else if (input.view.standingsDegraded) {
4798
+ blocks.push(`(${t(locale, "bracket.standingsDegraded")})`);
4799
+ }
4800
+ }
4801
+ const footer = [];
4802
+ const src = input.source ?? input.view.source;
4803
+ if (src) footer.push(t(locale, "live.data", { source: liveSourceLabel(src) }));
4804
+ footer.push(
4805
+ [includeHashtag ? SHARE_HASHTAG : "", SHARE_DISCLAIMER].filter(Boolean).join(" \xB7 ")
4806
+ );
4807
+ if (includeInstall && input.installLine) {
4808
+ footer.push(t(locale, "share.tryIt", { line: input.installLine }));
4809
+ }
4810
+ blocks.push("", footer.join("\n"));
4811
+ return blocks.join("\n");
4812
+ }
3570
4813
  export {
4814
+ BRACKET_STAGE_ORDER,
3571
4815
  DEFAULT_COMPETITION,
3572
4816
  DEFAULT_FLAVOR,
3573
4817
  DEFAULT_MAX_AGE_MS,
@@ -3580,6 +4824,8 @@ export {
3580
4824
  SHARE_HASHTAG,
3581
4825
  allFixtures,
3582
4826
  asFlavorLevel,
4827
+ buildBracketTopology,
4828
+ buildBracketView,
3583
4829
  buildMarketSignal,
3584
4830
  byKickoff,
3585
4831
  competitionBase,
@@ -3593,11 +4839,16 @@ export {
3593
4839
  fixturesByTeam,
3594
4840
  fixturesInLiveWindow,
3595
4841
  flagEmoji,
4842
+ formatBracketList,
4843
+ formatBracketMatchLine,
4844
+ formatBracketTree,
3596
4845
  formatDate,
3597
4846
  formatKickoff,
4847
+ formatShareBracket,
3598
4848
  formatShareSnippet,
3599
4849
  formatShareTable,
3600
4850
  formatTime,
4851
+ getBracket,
3601
4852
  getLiveMatches,
3602
4853
  getMarketSignal,
3603
4854
  getMarketSignals,
@@ -3614,6 +4865,7 @@ export {
3614
4865
  isValidDate,
3615
4866
  isValidTimeZone,
3616
4867
  liveSourceLabel,
4868
+ loadBracketTopology,
3617
4869
  localDate,
3618
4870
  makeAdapter,
3619
4871
  makeMarketProvider,
@@ -3628,16 +4880,23 @@ export {
3628
4880
  marketRelevant,
3629
4881
  marketSourceLabel,
3630
4882
  matchFlavor,
4883
+ matchKey,
3631
4884
  matchLocation,
3632
4885
  mergeLive,
3633
4886
  nationToFlag,
3634
4887
  nationToRegion,
3635
4888
  nextFixtureForTeam,
4889
+ normalizeLang,
3636
4890
  normalizeOutcomes,
3637
4891
  outcomeFromScore,
3638
4892
  parseStandings,
4893
+ parseTeamSlot,
3639
4894
  resolveCompetition,
3640
4895
  resolveMarketSource,
3641
4896
  resolveTz,
3642
- scoreline
4897
+ sanitizeBundledFixture,
4898
+ scoreline,
4899
+ stageLabel,
4900
+ stageLabelI18n,
4901
+ t
3643
4902
  };