@apicity/openligadb 0.6.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Justin Tanner
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,565 @@
1
+ # @apicity/openligadb
2
+
3
+ [![npm](https://img.shields.io/npm/v/@apicity/openligadb?color=cb0000)](https://www.npmjs.com/package/@apicity/openligadb)
4
+ [![dependencies](https://img.shields.io/badge/dependencies-1-blue)](package.json)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue?logo=typescript&logoColor=white)](tsconfig.json)
6
+ [![docs](https://img.shields.io/badge/docs-api.openligadb.de-blue)](https://api.openligadb.de/swagger/v1/swagger.json)
7
+
8
+ OpenLigaDB API provider for public soccer match data, metadata, standings, and scorers.
9
+
10
+ OpenLigaDB is a public read-only API. `createOpenLigaDB()` does not take credentials, and the provider does not send auth headers.
11
+
12
+ Runtime dependencies:
13
+
14
+ - `zod@^3.24.0` — request schemas attached to endpoint methods as `.schema`; response schemas exported
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install @apicity/openligadb
20
+ # or
21
+ pnpm add @apicity/openligadb
22
+ ```
23
+
24
+ ## Quick Start
25
+
26
+ ```typescript
27
+ import { createOpenLigaDB } from "@apicity/openligadb";
28
+
29
+ const openligadb = createOpenLigaDB();
30
+ ```
31
+
32
+ ## Matchdata Examples
33
+
34
+ OpenLigaDB is public and does not require an API key.
35
+
36
+ ```typescript
37
+ import { createOpenLigaDB } from "@apicity/openligadb";
38
+
39
+ const openligadb = createOpenLigaDB();
40
+
41
+ const match = await openligadb.getmatchdata.byId({ matchId: 68720 });
42
+
43
+ const season = await openligadb.getmatchdata.byLeagueSeason({
44
+ leagueShortcut: "bl1",
45
+ leagueSeason: 2024,
46
+ });
47
+ ```
48
+
49
+ The overloaded upstream `/getmatchdata` paths are exposed as explicit
50
+ `by*` methods so team, group, season, and match-id routes cannot collide.
51
+
52
+ ## Next Match And Team Window Examples
53
+
54
+ The next/last shortcuts return one match. Team windows return recent and
55
+ upcoming matches around today, controlled by past/future week counts:
56
+
57
+ ```typescript
58
+ const nextMatch = await openligadb.getnextmatchbyleagueshortcut({
59
+ leagueShortcut: "bl1",
60
+ });
61
+
62
+ const recentAndUpcoming = await openligadb.getmatchesbyteam({
63
+ teamFilterstring: "Bayern",
64
+ weekCountPast: 4,
65
+ weekCountFuture: 2,
66
+ });
67
+ ```
68
+
69
+ ## Standings And Scorers Examples
70
+
71
+ League standings, group tables, and top scorers share the same
72
+ `leagueShortcut` and `leagueSeason` request shape:
73
+
74
+ ```typescript
75
+ const standings = await openligadb.getbltable({
76
+ leagueShortcut: "bl1",
77
+ leagueSeason: 2024,
78
+ });
79
+
80
+ const groupTable = await openligadb.getgrouptable({
81
+ leagueShortcut: "bl1",
82
+ leagueSeason: 2024,
83
+ });
84
+
85
+ const topScorers = await openligadb.getgoalgetters({
86
+ leagueShortcut: "bl1",
87
+ leagueSeason: 2024,
88
+ });
89
+ ```
90
+
91
+ ## Catalog Discovery Flow
92
+
93
+ OpenLigaDB's public catalog endpoints work without credentials. A common
94
+ flow is sports -> leagues -> groups, teams, and result metadata:
95
+
96
+ ```typescript
97
+ import { createOpenLigaDB } from "@apicity/openligadb";
98
+
99
+ const openligadb = createOpenLigaDB();
100
+
101
+ const sports = await openligadb.getavailablesports();
102
+ const leagues = await openligadb.getavailableleagues.bySeason({
103
+ season: 2024,
104
+ });
105
+
106
+ const league = leagues.find((item) => item.leagueShortcut === "bl1");
107
+ if (league) {
108
+ const groups = await openligadb.getavailablegroups({
109
+ leagueShortcut: league.leagueShortcut!,
110
+ leagueSeason: Number(league.leagueSeason),
111
+ });
112
+ const teams = await openligadb.getavailableteams({
113
+ leagueShortcut: league.leagueShortcut!,
114
+ leagueSeason: Number(league.leagueSeason),
115
+ });
116
+ const resultInfo = await openligadb.getresultinfos({
117
+ leagueId: league.leagueId,
118
+ });
119
+ }
120
+ ```
121
+
122
+ All path-parameter methods expose request schemas via `.schema`, for
123
+ example `openligadb.getavailablegroups.schema.safeParse(input)`.
124
+
125
+ ## Errors And Scope
126
+
127
+ - OpenLigaDB's documented public surface is read-only. This package
128
+ exposes `GET` helpers only and never sends auth headers.
129
+ - The public upstream docs do not document pagination parameters,
130
+ rate-limit headers, or credential requirements for these routes,
131
+ so this provider does not add client-side helpers for them.
132
+ - Non-2xx responses throw `OpenLigaDBError` with `status` and `body`.
133
+ JSON error bodies stay as parsed objects, while `text/plain` bodies
134
+ are preserved as strings so missing-match messages are not lost.
135
+ - Empty success bodies resolve to `null`; endpoint helpers with schemas
136
+ expose request validation through `.schema.safeParse(input)`.
137
+
138
+ ## API Reference
139
+
140
+ 23 endpoints across 18 groups. Each method mirrors an upstream URL path.
141
+
142
+ ### getavailablegroups
143
+
144
+ <details>
145
+ <summary><code>GET</code> <b><code>openligadb.getavailablegroups</code></b></summary>
146
+
147
+ <code>GET https://api.openligadb.de/getavailablegroups/{leagueShortcut}/{leagueSeason}</code>
148
+
149
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
150
+
151
+ ```typescript
152
+ const groups = await openligadb.getavailablegroups({ leagueShortcut: "bl1", leagueSeason: 2024 });
153
+ ```
154
+
155
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
156
+
157
+ </details>
158
+
159
+ ### getavailableleagues
160
+
161
+ <details>
162
+ <summary><code>GET</code> <b><code>openligadb.getavailableleagues</code></b></summary>
163
+
164
+ <code>GET https://api.openligadb.de/getavailableleagues</code>
165
+
166
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
167
+
168
+ ```typescript
169
+ const leagues = await openligadb.getavailableleagues();
170
+ ```
171
+
172
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
173
+
174
+ </details>
175
+
176
+ <details>
177
+ <summary><code>GET</code> <b><code>openligadb.getavailableleagues.bySeason</code></b></summary>
178
+
179
+ <code>GET https://api.openligadb.de/getavailableleagues/{season}</code>
180
+
181
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
182
+
183
+ ```typescript
184
+ const leagues = await openligadb.getavailableleagues.bySeason({ season: 2024 });
185
+ ```
186
+
187
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
188
+
189
+ </details>
190
+
191
+ ### getavailablesports
192
+
193
+ <details>
194
+ <summary><code>GET</code> <b><code>openligadb.getavailablesports</code></b></summary>
195
+
196
+ <code>GET https://api.openligadb.de/getavailablesports</code>
197
+
198
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
199
+
200
+ ```typescript
201
+ const sports = await openligadb.getavailablesports();
202
+ ```
203
+
204
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
205
+
206
+ </details>
207
+
208
+ ### getavailableteams
209
+
210
+ <details>
211
+ <summary><code>GET</code> <b><code>openligadb.getavailableteams</code></b></summary>
212
+
213
+ <code>GET https://api.openligadb.de/getavailableteams/{leagueShortcut}/{leagueSeason}</code>
214
+
215
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
216
+
217
+ ```typescript
218
+ const teams = await openligadb.getavailableteams({ leagueShortcut: "bl1", leagueSeason: 2024 });
219
+ ```
220
+
221
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
222
+
223
+ </details>
224
+
225
+ ### getbltable
226
+
227
+ <details>
228
+ <summary><code>GET</code> <b><code>openligadb.getbltable</code></b></summary>
229
+
230
+ <code>GET https://api.openligadb.de/getbltable/{leagueShortcut}/{leagueSeason}</code>
231
+
232
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
233
+
234
+ ```typescript
235
+ const res = await openligadb.getbltable({
236
+ leagueShortcut: "bl1",
237
+ leagueSeason: 2024,
238
+ });
239
+ ```
240
+
241
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
242
+
243
+ </details>
244
+
245
+ ### getcurrentgroup
246
+
247
+ <details>
248
+ <summary><code>GET</code> <b><code>openligadb.getcurrentgroup</code></b></summary>
249
+
250
+ <code>GET https://api.openligadb.de/getcurrentgroup/{leagueShortcut}</code>
251
+
252
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
253
+
254
+ ```typescript
255
+ const group = await openligadb.getcurrentgroup({ leagueShortcut: "bl1" });
256
+ ```
257
+
258
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
259
+
260
+ </details>
261
+
262
+ ### getgoalgetters
263
+
264
+ <details>
265
+ <summary><code>GET</code> <b><code>openligadb.getgoalgetters</code></b></summary>
266
+
267
+ <code>GET https://api.openligadb.de/getgoalgetters/{leagueShortcut}/{leagueSeason}</code>
268
+
269
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
270
+
271
+ ```typescript
272
+ const res = await openligadb.getgoalgetters({
273
+ leagueShortcut: "bl1",
274
+ leagueSeason: 2024,
275
+ });
276
+ ```
277
+
278
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
279
+
280
+ </details>
281
+
282
+ ### getgrouptable
283
+
284
+ <details>
285
+ <summary><code>GET</code> <b><code>openligadb.getgrouptable</code></b></summary>
286
+
287
+ <code>GET https://api.openligadb.de/getgrouptable/{leagueShortcut}/{leagueSeason}</code>
288
+
289
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
290
+
291
+ ```typescript
292
+ const res = await openligadb.getgrouptable({
293
+ leagueShortcut: "bl1",
294
+ leagueSeason: 2024,
295
+ });
296
+ ```
297
+
298
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
299
+
300
+ </details>
301
+
302
+ ### getlastchangedate
303
+
304
+ <details>
305
+ <summary><code>GET</code> <b><code>openligadb.getlastchangedate</code></b></summary>
306
+
307
+ <code>GET https://api.openligadb.de/getlastchangedate/{leagueShortcut}/{leagueSeason}/{groupOrderId}</code>
308
+
309
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
310
+
311
+ ```typescript
312
+ const changedAt = await openligadb.getlastchangedate({
313
+ leagueShortcut: "bl1",
314
+ leagueSeason: 2024,
315
+ groupOrderId: 1,
316
+ });
317
+ ```
318
+
319
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
320
+
321
+ </details>
322
+
323
+ ### getlastmatchbyleagueshortcut
324
+
325
+ <details>
326
+ <summary><code>GET</code> <b><code>openligadb.getlastmatchbyleagueshortcut</code></b></summary>
327
+
328
+ <code>GET https://api.openligadb.de/getlastmatchbyleagueshortcut/{leagueShortcut}</code>
329
+
330
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
331
+
332
+ ```typescript
333
+ const match = await openligadb.getlastmatchbyleagueshortcut({ leagueShortcut: "bl1" });
334
+ ```
335
+
336
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
337
+
338
+ </details>
339
+
340
+ ### getlastmatchbyleagueteam
341
+
342
+ <details>
343
+ <summary><code>GET</code> <b><code>openligadb.getlastmatchbyleagueteam</code></b></summary>
344
+
345
+ <code>GET https://api.openligadb.de/getlastmatchbyleagueteam/{leagueId}/{teamId}</code>
346
+
347
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
348
+
349
+ ```typescript
350
+ const match = await openligadb.getlastmatchbyleagueteam({
351
+ leagueId: 4500,
352
+ teamId: 40,
353
+ });
354
+ ```
355
+
356
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
357
+
358
+ </details>
359
+
360
+ ### getmatchdata
361
+
362
+ <details>
363
+ <summary><code>GET</code> <b><code>openligadb.getmatchdata.byId</code></b></summary>
364
+
365
+ <code>GET https://api.openligadb.de/getmatchdata/{matchId}</code>
366
+
367
+ [Upstream docs ↗](https://api.openligadb.de/swagger/index.html)
368
+
369
+ ```typescript
370
+ const res = await openligadb.getmatchdata.byId({ matchId: 68720 });
371
+ ```
372
+
373
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
374
+
375
+ </details>
376
+
377
+ <details>
378
+ <summary><code>GET</code> <b><code>openligadb.getmatchdata.byLeagueSeason</code></b></summary>
379
+
380
+ <code>GET https://api.openligadb.de/getmatchdata/{leagueShortcut}/{leagueSeason}</code>
381
+
382
+ [Upstream docs ↗](https://api.openligadb.de/swagger/index.html)
383
+
384
+ ```typescript
385
+ const res = await openligadb.getmatchdata.byLeagueSeason({
386
+ leagueShortcut: "bl1",
387
+ leagueSeason: 2024,
388
+ });
389
+ ```
390
+
391
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
392
+
393
+ </details>
394
+
395
+ <details>
396
+ <summary><code>GET</code> <b><code>openligadb.getmatchdata.byLeagueSeasonGroup</code></b></summary>
397
+
398
+ <code>GET https://api.openligadb.de/getmatchdata/{leagueShortcut}/{leagueSeason}/{groupOrderId}</code>
399
+
400
+ [Upstream docs ↗](https://api.openligadb.de/swagger/index.html)
401
+
402
+ ```typescript
403
+ const res = await openligadb.getmatchdata.byLeagueSeasonGroup({
404
+ leagueShortcut: "bl1",
405
+ leagueSeason: 2024,
406
+ groupOrderId: 1,
407
+ });
408
+ ```
409
+
410
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
411
+
412
+ </details>
413
+
414
+ <details>
415
+ <summary><code>GET</code> <b><code>openligadb.getmatchdata.byLeagueSeasonTeam</code></b></summary>
416
+
417
+ <code>GET https://api.openligadb.de/getmatchdata/{leagueShortcut}/{leagueSeason}/{teamFilterstring}</code>
418
+
419
+ [Upstream docs ↗](https://api.openligadb.de/swagger/index.html)
420
+
421
+ ```typescript
422
+ const res = await openligadb.getmatchdata.byLeagueSeasonTeam({
423
+ leagueShortcut: "bl1",
424
+ leagueSeason: 2024,
425
+ teamFilterstring: "Bayern",
426
+ });
427
+ ```
428
+
429
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
430
+
431
+ </details>
432
+
433
+ <details>
434
+ <summary><code>GET</code> <b><code>openligadb.getmatchdata.byTeams</code></b></summary>
435
+
436
+ <code>GET https://api.openligadb.de/getmatchdata/{teamId1}/{teamId2}</code>
437
+
438
+ [Upstream docs ↗](https://api.openligadb.de/swagger/index.html)
439
+
440
+ ```typescript
441
+ const res = await openligadb.getmatchdata.byTeams({ teamId1: 16, teamId2: 40 });
442
+ ```
443
+
444
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
445
+
446
+ </details>
447
+
448
+ ### getmatchesbyteam
449
+
450
+ <details>
451
+ <summary><code>GET</code> <b><code>openligadb.getmatchesbyteam</code></b></summary>
452
+
453
+ <code>GET https://api.openligadb.de/getmatchesbyteam/{teamFilterstring}/{weekCountPast}/{weekCountFuture}</code>
454
+
455
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
456
+
457
+ ```typescript
458
+ const matches = await openligadb.getmatchesbyteam({
459
+ teamFilterstring: "Bayern",
460
+ weekCountPast: 4,
461
+ weekCountFuture: 2,
462
+ });
463
+ ```
464
+
465
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
466
+
467
+ </details>
468
+
469
+ ### getmatchesbyteamid
470
+
471
+ <details>
472
+ <summary><code>GET</code> <b><code>openligadb.getmatchesbyteamid</code></b></summary>
473
+
474
+ <code>GET https://api.openligadb.de/getmatchesbyteamid/{teamId}/{weekCountPast}/{weekCountFuture}</code>
475
+
476
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
477
+
478
+ ```typescript
479
+ const matches = await openligadb.getmatchesbyteamid({
480
+ teamId: 40,
481
+ weekCountPast: 4,
482
+ weekCountFuture: 2,
483
+ });
484
+ ```
485
+
486
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
487
+
488
+ </details>
489
+
490
+ ### getnextmatchbyleagueshortcut
491
+
492
+ <details>
493
+ <summary><code>GET</code> <b><code>openligadb.getnextmatchbyleagueshortcut</code></b></summary>
494
+
495
+ <code>GET https://api.openligadb.de/getnextmatchbyleagueshortcut/{leagueShortcut}</code>
496
+
497
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
498
+
499
+ ```typescript
500
+ const match = await openligadb.getnextmatchbyleagueshortcut({ leagueShortcut: "bl1" });
501
+ ```
502
+
503
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
504
+
505
+ </details>
506
+
507
+ ### getnextmatchbyleagueteam
508
+
509
+ <details>
510
+ <summary><code>GET</code> <b><code>openligadb.getnextmatchbyleagueteam</code></b></summary>
511
+
512
+ <code>GET https://api.openligadb.de/getnextmatchbyleagueteam/{leagueId}/{teamId}</code>
513
+
514
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
515
+
516
+ ```typescript
517
+ const match = await openligadb.getnextmatchbyleagueteam({
518
+ leagueId: 4500,
519
+ teamId: 40,
520
+ });
521
+ ```
522
+
523
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
524
+
525
+ </details>
526
+
527
+ ### getresultinfos
528
+
529
+ <details>
530
+ <summary><code>GET</code> <b><code>openligadb.getresultinfos</code></b></summary>
531
+
532
+ <code>GET https://api.openligadb.de/getresultinfos/{leagueId}</code>
533
+
534
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
535
+
536
+ ```typescript
537
+ const resultInfo = await openligadb.getresultinfos({ leagueId: 4500 });
538
+ ```
539
+
540
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
541
+
542
+ </details>
543
+
544
+ ### swagger
545
+
546
+ <details>
547
+ <summary><code>GET</code> <b><code>openligadb.swagger.v1.swaggerJson</code></b></summary>
548
+
549
+ <code>GET https://api.openligadb.de/swagger/v1/swagger.json</code>
550
+
551
+ [Upstream docs ↗](https://api.openligadb.de/swagger/v1/swagger.json)
552
+
553
+ ```typescript
554
+ const res = await openligadb.swagger.v1.swaggerJson();
555
+ ```
556
+
557
+ Source: [`packages/provider/openligadb/src/openligadb.ts`](src/openligadb.ts)
558
+
559
+ </details>
560
+
561
+ Part of the [apicity](https://github.com/justintanner/apicity) monorepo.
562
+
563
+ ## License
564
+
565
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,8 @@
1
+ export interface EndpointExample {
2
+ source: string;
3
+ payload: unknown;
4
+ }
5
+ declare const EXAMPLES: Record<string, EndpointExample>;
6
+ export default EXAMPLES;
7
+ export declare function attachExamples<T>(provider: T): T;
8
+ //# sourceMappingURL=example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../src/example.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,QAAA,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CA8G7C,CAAC;AAEF,eAAe,QAAQ,CAAC;AAOxB,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CA6ChD"}