@photon-grove/evt 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +85 -9
  2. package/dist/aggregate.d.ts +26 -0
  3. package/dist/aggregate.d.ts.map +1 -1
  4. package/dist/aggregate.js.map +1 -1
  5. package/dist/dynamodb/client.d.ts +83 -0
  6. package/dist/dynamodb/client.d.ts.map +1 -0
  7. package/dist/dynamodb/client.js +6 -0
  8. package/dist/dynamodb/client.js.map +1 -0
  9. package/dist/dynamodb/index.d.ts +6 -1
  10. package/dist/dynamodb/index.d.ts.map +1 -1
  11. package/dist/dynamodb/index.js +8 -3
  12. package/dist/dynamodb/index.js.map +1 -1
  13. package/dist/dynamodb/item.d.ts +2 -0
  14. package/dist/dynamodb/item.d.ts.map +1 -1
  15. package/dist/dynamodb/item.js +5 -4
  16. package/dist/dynamodb/item.js.map +1 -1
  17. package/dist/dynamodb/marker.d.ts +11 -0
  18. package/dist/dynamodb/marker.d.ts.map +1 -0
  19. package/dist/dynamodb/marker.js +56 -0
  20. package/dist/dynamodb/marker.js.map +1 -0
  21. package/dist/dynamodb/repository.d.ts +61 -0
  22. package/dist/dynamodb/repository.d.ts.map +1 -0
  23. package/dist/dynamodb/repository.js +748 -0
  24. package/dist/dynamodb/repository.js.map +1 -0
  25. package/dist/dynamodb/requests.d.ts +68 -0
  26. package/dist/dynamodb/requests.d.ts.map +1 -0
  27. package/dist/dynamodb/requests.js +194 -0
  28. package/dist/dynamodb/requests.js.map +1 -0
  29. package/dist/dynamodb/views.d.ts +18 -0
  30. package/dist/dynamodb/views.d.ts.map +1 -0
  31. package/dist/dynamodb/views.js +56 -0
  32. package/dist/dynamodb/views.js.map +1 -0
  33. package/dist/errors.d.ts +109 -2
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/errors.js +118 -2
  36. package/dist/errors.js.map +1 -1
  37. package/dist/features.d.ts +55 -0
  38. package/dist/features.d.ts.map +1 -0
  39. package/dist/features.js +126 -0
  40. package/dist/features.js.map +1 -0
  41. package/dist/index.d.ts +4 -3
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +2 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/memory/index.d.ts +1 -1
  46. package/dist/memory/index.d.ts.map +1 -1
  47. package/dist/memory/index.js +1 -1
  48. package/dist/memory/index.js.map +1 -1
  49. package/dist/memory/repository.d.ts +38 -2
  50. package/dist/memory/repository.d.ts.map +1 -1
  51. package/dist/memory/repository.js +95 -6
  52. package/dist/memory/repository.js.map +1 -1
  53. package/dist/postgres/client.d.ts +32 -0
  54. package/dist/postgres/client.d.ts.map +1 -0
  55. package/dist/postgres/client.js +4 -0
  56. package/dist/postgres/client.js.map +1 -0
  57. package/dist/postgres/index.d.ts +4 -0
  58. package/dist/postgres/index.d.ts.map +1 -0
  59. package/dist/postgres/index.js +6 -0
  60. package/dist/postgres/index.js.map +1 -0
  61. package/dist/postgres/repository.d.ts +55 -0
  62. package/dist/postgres/repository.d.ts.map +1 -0
  63. package/dist/postgres/repository.js +527 -0
  64. package/dist/postgres/repository.js.map +1 -0
  65. package/dist/postgres/schema.d.ts +81 -0
  66. package/dist/postgres/schema.d.ts.map +1 -0
  67. package/dist/postgres/schema.js +233 -0
  68. package/dist/postgres/schema.js.map +1 -0
  69. package/dist/repository.d.ts +56 -7
  70. package/dist/repository.d.ts.map +1 -1
  71. package/dist/repository.js +24 -9
  72. package/dist/repository.js.map +1 -1
  73. package/dist/store.d.ts +7 -5
  74. package/dist/store.d.ts.map +1 -1
  75. package/dist/store.js +34 -9
  76. package/dist/store.js.map +1 -1
  77. package/package.json +16 -3
  78. package/src/aggregate.ts +28 -0
  79. package/src/dynamodb/client.ts +102 -0
  80. package/src/dynamodb/index.ts +27 -2
  81. package/src/dynamodb/item.ts +6 -4
  82. package/src/dynamodb/marker.ts +64 -0
  83. package/src/dynamodb/repository.ts +1053 -0
  84. package/src/dynamodb/requests.ts +276 -0
  85. package/src/dynamodb/views.ts +67 -0
  86. package/src/errors.ts +176 -2
  87. package/src/features.ts +175 -0
  88. package/src/index.ts +28 -1
  89. package/src/memory/index.ts +9 -1
  90. package/src/memory/repository.ts +156 -6
  91. package/src/postgres/client.ts +37 -0
  92. package/src/postgres/index.ts +23 -0
  93. package/src/postgres/repository.ts +773 -0
  94. package/src/postgres/schema.ts +286 -0
  95. package/src/repository.ts +86 -13
  96. package/src/store.ts +61 -11
@@ -1,20 +1,37 @@
1
1
  // The in-memory repository. It enforces the storage contract the way the live backends do: a head
2
- // per stream that every commit raises, optimistic concurrency against it, and the same failure
3
- // classification and transaction budget. It's for tests and local development.
4
- import { ConflictError, CompactionUncoveredError, EvtError, SequenceGapError, StreamHeadDriftError, } from '../errors.js';
2
+ // per stream that every commit raises, optimistic concurrency against it, the feature marker and
3
+ // the rebuild-lock check, and the same failure classification and transaction budget. It's for
4
+ // tests and local development.
5
+ import { ConflictError, CompactionUncoveredError, EvtError, HistoryDependentProjectionError, RebuildInProgressError, SequenceGapError, StreamHeadDriftError, StreamHeadsNotMigratedError, } from '../errors.js';
6
+ import { checkSupported, checkWritable, declaresStreamHeads, entityTypeSet, withStreamHeads, } from '../features.js';
5
7
  import { int64Argument } from '../fields.js';
6
8
  import { checkBudget, checkNotReserved, commitSizes, validateCommit, } from '../repository.js';
7
- // Reads a repository's streams, for headFixtures. The class's static block sets it.
9
+ // Read a repository's private state, for the fixtures. The class's static block sets them.
8
10
  let streamsOf;
11
+ let controlsOf;
9
12
  /**
10
13
  * An in-memory {@link Repository}. Every call copies what it stores and what it returns, so a
11
14
  * caller that changes an event after committing it, or one it read, changes nothing stored.
12
15
  *
13
16
  * Each call runs to completion before another starts, so concurrent commits to one stream behave
14
17
  * like racing writers on a live backend: one wins and the rest fail with a conflict.
18
+ *
19
+ * A fresh store is initialized by its first commit or snapshot write, which declares stream-heads
20
+ * on its feature manifest, so {@link initialize} is needed only where code treats every backend
21
+ * alike.
15
22
  */
16
23
  export class MemRepository {
17
24
  #streams = new Map();
25
+ #controls = { manifest: null, rebuild: { generation: 0n, lock: null } };
26
+ async initialize(options) {
27
+ options?.signal?.throwIfAborted();
28
+ checkSupported(this.#controls.manifest);
29
+ if (declaresStreamHeads(this.#controls.manifest)) {
30
+ return false;
31
+ }
32
+ this.#declareStreamHeads();
33
+ return true;
34
+ }
18
35
  async commit(commit, options) {
19
36
  options?.signal?.throwIfAborted();
20
37
  validateCommit(commit);
@@ -24,6 +41,13 @@ export class MemRepository {
24
41
  }
25
42
  // Every backend budgets a commit the same way, so an oversized one fails before any write.
26
43
  checkBudget(commitSizes(commit, () => undefined));
44
+ // The control rows come first, as the two checks that open every live commit: the marker,
45
+ // then the rebuild lock, which an unsettled generation fails, a force-released one included.
46
+ this.#checkManifest();
47
+ const { rebuild } = this.#controls;
48
+ if (rebuild.lock !== null || rebuild.generation % 2n !== 0n) {
49
+ throw new RebuildInProgressError();
50
+ }
27
51
  const held = this.#streams.get(commit.entityId) ?? emptyStream();
28
52
  checkWrite(commit, held);
29
53
  // Copy everything before the first write, so a copy that throws leaves the stream as it was.
@@ -72,6 +96,7 @@ export class MemRepository {
72
96
  checkNotReserved(snapshot.entityId);
73
97
  int64Argument(snapshot.sequence, 'snapshot.sequence');
74
98
  int64Argument(snapshot.eventSequence, 'snapshot.eventSequence');
99
+ this.#checkManifest();
75
100
  // The stream's head must cover the snapshot. One of an empty stream (event sequence 0) may
76
101
  // have no head at all.
77
102
  const held = this.#streams.get(snapshot.entityId);
@@ -95,11 +120,19 @@ export class MemRepository {
95
120
  if (int64Argument(through, 'through') < 1n) {
96
121
  return 0;
97
122
  }
123
+ // Compaction validates the manifest, but never declares stream-heads itself.
124
+ const { manifest } = this.#controls;
125
+ checkWritable(manifest);
98
126
  const stream = this.#streams.get(entityId);
99
- const covered = stream?.snapshot?.eventSequence ?? null;
100
- if (stream === undefined || covered === null || covered < through) {
127
+ const snapshot = stream?.snapshot;
128
+ const covered = snapshot?.eventSequence ?? null;
129
+ if (stream === undefined || !snapshot || covered === null || covered < through) {
101
130
  throw new CompactionUncoveredError(entityId, through, covered);
102
131
  }
132
+ // A history-dependent type's rebuild replays the events compaction would delete.
133
+ if (manifest?.historyDependent.includes(snapshot.entityType)) {
134
+ throw new HistoryDependentProjectionError(snapshot.entityType, entityId);
135
+ }
103
136
  let deleted = 0;
104
137
  for (const sequence of stream.events.keys()) {
105
138
  if (sequence <= through) {
@@ -111,6 +144,22 @@ export class MemRepository {
111
144
  }
112
145
  static {
113
146
  streamsOf = (repo) => repo.#streams;
147
+ controlsOf = (repo) => repo.#controls;
148
+ }
149
+ // Refuses a write to a store whose manifest declares an unsupported pair, and declares
150
+ // stream-heads on a store without it, as its first writer, when the store holds no data.
151
+ #checkManifest() {
152
+ checkSupported(this.#controls.manifest);
153
+ if (!declaresStreamHeads(this.#controls.manifest)) {
154
+ this.#declareStreamHeads();
155
+ }
156
+ }
157
+ #declareStreamHeads() {
158
+ const holdsData = Array.from(this.#streams.values()).some((stream) => stream.events.size > 0 || stream.snapshot !== null);
159
+ if (holdsData) {
160
+ throw new StreamHeadsNotMigratedError();
161
+ }
162
+ this.#controls.manifest = withStreamHeads(this.#controls.manifest);
114
163
  }
115
164
  // The stream's events by sequence, ascending or descending. Sequences are unique.
116
165
  #sorted(entityId, descending = false) {
@@ -191,6 +240,46 @@ export function headFixtures(repo) {
191
240
  },
192
241
  };
193
242
  }
243
+ /**
244
+ * Hooks that change a repository's control rows, for conformance suites only. A declaration may
245
+ * declare features this package doesn't model, which then refuse every write.
246
+ */
247
+ export function controlFixtures(repo) {
248
+ const controls = controlsOf(repo);
249
+ return {
250
+ manifest() {
251
+ return controls.manifest && cloneManifest(controls.manifest);
252
+ },
253
+ declare(change) {
254
+ const draft = {
255
+ features: new Map(controls.manifest?.features),
256
+ historyDependent: [...(controls.manifest?.historyDependent ?? [])],
257
+ retention: [...(controls.manifest?.retention ?? [])],
258
+ };
259
+ change(draft);
260
+ // Stored as the marker row stores them: each set sorted and deduplicated.
261
+ controls.manifest = {
262
+ version: (controls.manifest?.version ?? 0n) + 1n,
263
+ features: new Map(draft.features),
264
+ historyDependent: entityTypeSet(draft.historyDependent),
265
+ retention: entityTypeSet(draft.retention),
266
+ };
267
+ return cloneManifest(controls.manifest);
268
+ },
269
+ setRebuild(state) {
270
+ int64Argument(state.generation, 'generation');
271
+ controls.rebuild = { ...state };
272
+ },
273
+ };
274
+ }
275
+ function cloneManifest(manifest) {
276
+ return {
277
+ version: manifest.version,
278
+ features: new Map(manifest.features),
279
+ historyDependent: [...manifest.historyDependent],
280
+ retention: [...manifest.retention],
281
+ };
282
+ }
194
283
  function emptyStream() {
195
284
  return { events: new Map(), snapshot: null, head: 0n };
196
285
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/memory/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/memory/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** The result of one statement: its rows, as the driver returns them. */
2
+ export interface PgResult {
3
+ readonly rows: readonly unknown[];
4
+ }
5
+ /** Something that runs one statement: `$1`, `$2` and so on in `text` take `values` in order. */
6
+ export interface PgQueryable {
7
+ query(text: string, values?: unknown[]): Promise<PgResult>;
8
+ }
9
+ /**
10
+ * A connection held for one transaction, as a pool lends it. `release` returns it to the pool, and
11
+ * gets the error when the connection may be unusable, so the pool can discard it.
12
+ */
13
+ export interface PgConnection extends PgQueryable {
14
+ release(error?: Error): void;
15
+ }
16
+ /**
17
+ * The client a {@link PgRepository} runs on.
18
+ *
19
+ * - A pool, such as `pg`'s `Pool` or Neon's serverless `Pool`, has `connect`, which lends one
20
+ * connection for each transaction. Single statements outside a transaction go to `query`.
21
+ * - A single connection without `connect`, such as PGlite, runs everything itself, so every
22
+ * repository on it runs one operation at a time on it. Nothing else may use the connection
23
+ * meanwhile: a statement sent inside a repository's transaction would join it.
24
+ *
25
+ * Every value the repository sends is a string or null, with casts in the SQL, and every column it
26
+ * reads is text, so no driver's type parsing touches a stored value. A `pg` `Client` has a
27
+ * `connect` that opens the client rather than lending a connection, so pass a `Pool` instead.
28
+ */
29
+ export interface PgClient extends PgQueryable {
30
+ connect?(): Promise<PgConnection>;
31
+ }
32
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/postgres/client.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAA;CAClC;AAED,gGAAgG;AAChG,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC3D;AAED;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,QAAS,SAAQ,WAAW;IAC3C,OAAO,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;CAClC"}
@@ -0,0 +1,4 @@
1
+ // The PostgreSQL client a PgRepository takes: a structural interface that `pg`'s Pool, Neon's
2
+ // serverless Pool and PGlite satisfy without an adapter, so this package imports no driver.
3
+ export {};
4
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/postgres/client.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,4FAA4F"}
@@ -0,0 +1,4 @@
1
+ export { type PgClient, type PgConnection, type PgQueryable, type PgResult } from './client.js';
2
+ export { POSTGRES_BACKEND, PgRepository, type PgRepositoryOptions } from './repository.js';
3
+ export { DEFAULT_EVENTS_TABLE, DEFAULT_SNAPSHOTS_TABLE, MAX_EVENTS_TABLE_NAME_BYTES, MAX_SNAPSHOTS_TABLE_NAME_BYTES, type PgTables, RESERVED_INFIX, SCHEMA_LOCK, entityTypeIndex, featuresTable, outcomesTable, pgTables, rebuildGenerationTable, rebuildLockTable, schemaDdl, streamHeadsTable, } from './schema.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/postgres/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAC,MAAM,aAAa,CAAA;AAC7F,OAAO,EAAC,gBAAgB,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAC,MAAM,iBAAiB,CAAA;AAExF,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC3B,8BAA8B,EAC9B,KAAK,QAAQ,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,aAAa,EACb,aAAa,EACb,QAAQ,EACR,sBAAsB,EACtB,gBAAgB,EAChB,SAAS,EACT,gBAAgB,GACjB,MAAM,aAAa,CAAA"}
@@ -0,0 +1,6 @@
1
+ // @photon-grove/evt/postgres: the PostgreSQL backend. It imports no driver: the repository takes
2
+ // `pg`'s Pool, or anything shaped like it, as a PgClient.
3
+ export {} from './client.js';
4
+ export { POSTGRES_BACKEND, PgRepository } from './repository.js';
5
+ export { DEFAULT_EVENTS_TABLE, DEFAULT_SNAPSHOTS_TABLE, MAX_EVENTS_TABLE_NAME_BYTES, MAX_SNAPSHOTS_TABLE_NAME_BYTES, RESERVED_INFIX, SCHEMA_LOCK, entityTypeIndex, featuresTable, outcomesTable, pgTables, rebuildGenerationTable, rebuildLockTable, schemaDdl, streamHeadsTable, } from './schema.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/postgres/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,0DAA0D;AAE1D,OAAO,EAAmE,MAAM,aAAa,CAAA;AAC7F,OAAO,EAAC,gBAAgB,EAAE,YAAY,EAA2B,MAAM,iBAAiB,CAAA;AAExF,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC3B,8BAA8B,EAE9B,cAAc,EACd,WAAW,EACX,eAAe,EACf,aAAa,EACb,aAAa,EACb,QAAQ,EACR,sBAAsB,EACtB,gBAAgB,EAChB,SAAS,EACT,gBAAgB,GACjB,MAAM,aAAa,CAAA"}
@@ -0,0 +1,55 @@
1
+ import type { SerializedEvent, SerializedSnapshot } from '../event.js';
2
+ import { type CallOptions, type Commit, type Repository, type StoreInitializer } from '../repository.js';
3
+ import type { PgClient } from './client.js';
4
+ import { type PgTables } from './schema.js';
5
+ /** The tables a {@link PgRepository} stores its event log in. */
6
+ export interface PgRepositoryOptions {
7
+ /** The events table, `evt_events` by default. The engine tables derive their names from it. */
8
+ eventsTable?: string;
9
+ /** The snapshots table, `evt_snapshots` by default. */
10
+ snapshotsTable?: string;
11
+ }
12
+ /** The backend name a projector group for the PostgreSQL repository would carry. */
13
+ export declare const POSTGRES_BACKEND = "postgres";
14
+ /**
15
+ * A {@link Repository} on PostgreSQL, through any client shaped like `pg`'s `Pool`
16
+ * ({@link PgClient}).
17
+ *
18
+ * Run {@link PgRepository.ensureSchema} once before the first write. A writer initializes a fresh
19
+ * store itself on its first write, as Go's and Rust's do: the check is two `EXISTS` probes under
20
+ * the lock it takes anyway. {@link PgRepository.initialize} is for a deploy step that treats every
21
+ * backend alike.
22
+ *
23
+ * The repository validates the store's feature manifest at its first write and caches the version
24
+ * it validated. Every commit and snapshot write reads the manifest again under a shared lock that
25
+ * no declaration can take while the write is open, and validates it again when it changed.
26
+ */
27
+ export declare class PgRepository implements Repository, StoreInitializer {
28
+ #private;
29
+ /**
30
+ * Takes the client and the table names, which must be plain identifiers that fit their limits
31
+ * ({@link pgTables}), or the constructor fails with `invalidArgument`.
32
+ */
33
+ constructor(client: PgClient, options?: PgRepositoryOptions);
34
+ /** The tables this repository reads and writes, folded to lower case. */
35
+ get tables(): PgTables;
36
+ /**
37
+ * Creates the event log's tables if they don't exist, with the DDL Go and Rust run
38
+ * ({@link schemaDdl}), under the schema lock they take. Safe to call on every start.
39
+ */
40
+ ensureSchema(options?: CallOptions): Promise<void>;
41
+ /**
42
+ * Declares stream-heads on a store whose events and snapshots tables are empty, under the
43
+ * manifest's exclusive lock, and resolves `true` when this call declared it. A store that
44
+ * already declares it is left alone. Run {@link PgRepository.ensureSchema} first.
45
+ */
46
+ initialize(options?: CallOptions): Promise<boolean>;
47
+ commit(commit: Commit, options?: CallOptions): Promise<void>;
48
+ events(entityId: string, options?: CallOptions): Promise<SerializedEvent[]>;
49
+ eventsAfter(entityId: string, after: bigint, options?: CallOptions): Promise<SerializedEvent[]>;
50
+ latest(entityId: string, n: number, options?: CallOptions): Promise<SerializedEvent[]>;
51
+ snapshot(entityId: string, options?: CallOptions): Promise<SerializedSnapshot | null>;
52
+ putSnapshot(snapshot: SerializedSnapshot, options?: CallOptions): Promise<boolean>;
53
+ compactBelow(entityId: string, through: bigint, options?: CallOptions): Promise<number>;
54
+ }
55
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/postgres/repository.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAC,eAAe,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAA;AAYpE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,gBAAgB,EAKtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAC,QAAQ,EAA4B,MAAM,aAAa,CAAA;AACpE,OAAO,EAIL,KAAK,QAAQ,EAUd,MAAM,aAAa,CAAA;AAEpB,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,aAAa,CAAA;AAgB1C;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAa,YAAW,UAAU,EAAE,gBAAgB;;IAS/D;;;OAGG;IACH,YAAY,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAE,mBAAwB,EAG9D;IAED,yEAAyE;IACzE,IAAI,MAAM,IAAI,QAAQ,CAErB;IAED;;;OAGG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvD;IAED;;;;OAIG;IACG,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BxD;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEjE;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAShF;IAEK,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CAU5B;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgB3F;IAEK,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAU1F;IAEK,WAAW,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBvF;IAEK,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC5F;CAkRF"}