@livestore/sync-s2 0.4.0 → 0.5.0-dev.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.
@@ -1,32 +1,32 @@
1
1
  import { Schema } from '@livestore/utils/effect';
2
2
  export declare const PullArgs: Schema.Struct<{
3
- storeId: typeof Schema.String;
4
- s2SeqNum: Schema.Union<[Schema.BrandSchema<number & import("effect/Brand").Brand<"S2SeqNum">, number, never>, Schema.Literal<["from-start"]>]>;
5
- live: typeof Schema.Boolean;
6
- payload: Schema.UndefinedOr<Schema.Schema<Schema.JsonValue, Schema.JsonValue, never>>;
3
+ readonly storeId: Schema.String;
4
+ readonly s2SeqNum: Schema.Union<readonly [Schema.brand<Schema.Int, "S2SeqNum">, Schema.Literal<"from-start">]>;
5
+ readonly live: Schema.Boolean;
6
+ readonly payload: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
7
7
  }>;
8
8
  export declare const PushPayload: Schema.Struct<{
9
- storeId: typeof Schema.String;
10
- batch: Schema.Array$<Schema.Struct<{
11
- name: typeof Schema.String;
12
- args: typeof Schema.Any;
13
- seqNum: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
14
- parentSeqNum: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
15
- clientId: typeof Schema.String;
16
- sessionId: typeof Schema.String;
9
+ readonly storeId: Schema.String;
10
+ readonly batch: Schema.$Array<Schema.Struct<{
11
+ readonly name: Schema.String;
12
+ readonly args: Schema.Any;
13
+ readonly seqNum: Schema.brand<Schema.Int, "GlobalEventSequenceNumber">;
14
+ readonly parentSeqNum: Schema.brand<Schema.Int, "GlobalEventSequenceNumber">;
15
+ readonly clientId: Schema.String;
16
+ readonly sessionId: Schema.String;
17
17
  }>>;
18
18
  }>;
19
19
  export type PullArgs = typeof PullArgs.Type;
20
20
  export type PushPayload = typeof PushPayload.Type;
21
21
  /** Encoded form for query parameter `args` */
22
- export declare const ArgsSchema: Schema.transform<Schema.transformOrFail<Schema.SchemaClass<string, string, never>, typeof Schema.String, never>, Schema.transform<Schema.SchemaClass<unknown, string, never>, Schema.Struct<{
23
- storeId: typeof Schema.String;
24
- s2SeqNum: Schema.Union<[Schema.BrandSchema<number & import("effect/Brand").Brand<"S2SeqNum">, number, never>, Schema.Literal<["from-start"]>]>;
25
- live: typeof Schema.Boolean;
26
- payload: Schema.UndefinedOr<Schema.Schema<Schema.JsonValue, Schema.JsonValue, never>>;
27
- }>>>;
22
+ export declare const ArgsSchema: Schema.compose<Schema.fromJsonString<Schema.Struct<{
23
+ readonly storeId: Schema.String;
24
+ readonly s2SeqNum: Schema.Union<readonly [Schema.brand<Schema.Int, "S2SeqNum">, Schema.Literal<"from-start">]>;
25
+ readonly live: Schema.Boolean;
26
+ readonly payload: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
27
+ }>>, Schema.StringFromUriComponent>;
28
28
  export declare const PushResponse: Schema.Struct<{
29
- success: typeof Schema.Boolean;
29
+ readonly success: Schema.Boolean;
30
30
  }>;
31
31
  export type PushResponse = typeof PushResponse.Type;
32
32
  //# sourceMappingURL=api-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-schema.d.ts","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAIhD,eAAO,MAAM,QAAQ;;;;;EAKnB,CAAA;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;EAGtB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAC3C,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAEjD,8CAA8C;AAC9C,eAAO,MAAM,UAAU;;;;;IAA4E,CAAA;AAEnG,eAAO,MAAM,YAAY;;EAA6C,CAAA;AACtE,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA"}
1
+ {"version":3,"file":"api-schema.d.ts","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAIhD,eAAO,MAAM,QAAQ;;;;;EAKnB,CAAA;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;EAGtB,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAC3C,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAEjD,8CAA8C;AAC9C,eAAO,MAAM,UAAU;;;;;mCAAuF,CAAA;AAE9G,eAAO,MAAM,YAAY;;EAA6C,CAAA;AACtE,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA"}
@@ -3,15 +3,15 @@ import { Schema } from '@livestore/utils/effect';
3
3
  import { S2SeqNum } from "./types.js";
4
4
  export const PullArgs = Schema.Struct({
5
5
  storeId: Schema.String,
6
- s2SeqNum: Schema.Union(S2SeqNum, Schema.Literal('from-start')),
6
+ s2SeqNum: Schema.Union([S2SeqNum, Schema.Literal('from-start')]),
7
7
  live: Schema.Boolean,
8
- payload: Schema.UndefinedOr(Schema.JsonValue),
8
+ payload: Schema.optional(Schema.Json),
9
9
  });
10
10
  export const PushPayload = Schema.Struct({
11
11
  storeId: Schema.String,
12
12
  batch: Schema.Array(LiveStoreEvent.Global.Encoded),
13
13
  });
14
14
  /** Encoded form for query parameter `args` */
15
- export const ArgsSchema = Schema.compose(Schema.StringFromUriComponent, Schema.parseJson(PullArgs));
15
+ export const ArgsSchema = Schema.StringFromUriComponent.pipe(Schema.decodeTo(Schema.fromJsonString(PullArgs)));
16
16
  export const PushResponse = Schema.Struct({ success: Schema.Boolean });
17
17
  //# sourceMappingURL=api-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-schema.js","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC,OAAO;IACpB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;CAC9C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;CACnD,CAAC,CAAA;AAKF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;AAEnG,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"api-schema.js","sourceRoot":"","sources":["../src/api-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAChE,IAAI,EAAE,MAAM,CAAC,OAAO;IACpB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;CACtC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;CACnD,CAAC,CAAA;AAKF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAE9G,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA"}
@@ -1,20 +1,25 @@
1
+ import { Result, Schema } from '@livestore/utils/effect';
1
2
  import { describe, expect, it } from 'vitest';
2
- import { Schema } from '@livestore/utils/effect';
3
3
  import * as Api from "./api-schema.js";
4
4
  import { decodePullArgsFromSearchParams } from "./make-s2-url.js";
5
5
  import { s2SeqNum } from "./types.js";
6
6
  describe('ApiSchema', () => {
7
- it('encodes and decodes PullArgs via args search param', () => {
8
- const args = Api.PullArgs.make({ storeId: 'store-1', s2SeqNum: s2SeqNum(42), live: true, payload: { a: 1 } });
9
- const encoded = Schema.encodeSync(Api.ArgsSchema)(args);
10
- const sp = new URLSearchParams({ args: encoded });
11
- const roundtrip = decodePullArgsFromSearchParams(sp);
12
- expect(roundtrip).toEqual(args);
13
- });
7
+ for (const { name, payload } of [
8
+ { name: 'an omitted payload', payload: undefined },
9
+ { name: 'an explicit payload', payload: { a: 1 } },
10
+ ]) {
11
+ it(`encodes and decodes PullArgs with ${name} via args search param`, () => {
12
+ const args = Api.PullArgs.make({ storeId: 'store-1', s2SeqNum: s2SeqNum(42), live: true, payload });
13
+ const encoded = Schema.encodeSync(Api.ArgsSchema)(args);
14
+ const sp = new URLSearchParams({ args: encoded });
15
+ const roundtrip = decodePullArgsFromSearchParams(sp);
16
+ expect(roundtrip).toEqual(args);
17
+ });
18
+ }
14
19
  it('decodes PushPayload with typed events', () => {
15
20
  const payload = Api.PushPayload.make({ storeId: 's', batch: [] });
16
- const decoded = Schema.decodeUnknownEither(Api.PushPayload)(payload);
17
- expect(decoded._tag).toBe('Right');
21
+ const decoded = Schema.decodeUnknownResult(Api.PushPayload)(payload);
22
+ expect(Result.isSuccess(decoded)).toBe(true);
18
23
  });
19
24
  });
20
25
  //# sourceMappingURL=api-schema.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-schema.test.js","sourceRoot":"","sources":["../src/api-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7G,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACjD,MAAM,SAAS,GAAG,8BAA8B,CAAC,EAAE,CAAC,CAAA;QACpD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAA;QACpE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"api-schema.test.js","sourceRoot":"","sources":["../src/api-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI;QAC9B,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE;QAClD,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;KAC1C,EAAE,CAAC;QACX,EAAE,CAAC,qCAAqC,IAAI,wBAAwB,EAAE,GAAG,EAAE;YACzE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;YACnG,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAA;YACvD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;YACjD,MAAM,SAAS,GAAG,8BAA8B,CAAC,EAAE,CAAC,CAAA;YACpD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAA;QACpE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/dist/decode.js CHANGED
@@ -3,14 +3,14 @@ import { Option, Schema } from '@livestore/utils/effect';
3
3
  import { S2SeqNum } from "./types.js";
4
4
  const ReadBatchSchema = Schema.Struct({
5
5
  records: Schema.Array(Schema.Struct({
6
- body: Schema.optional(Schema.parseJson(LiveStoreEvent.Global.Encoded)),
6
+ body: Schema.optional(Schema.NullOr(Schema.fromJsonString(LiveStoreEvent.Global.Encoded))),
7
7
  seq_num: S2SeqNum,
8
8
  })),
9
- }).annotations({ title: '@livestore/sync-s2:ReadBatchSchema' });
9
+ }).annotate({ title: '@livestore/sync-s2:ReadBatchSchema' });
10
10
  export const decodeReadBatch = (readBatch) => {
11
11
  const decoded = Schema.decodeSync(ReadBatchSchema)(readBatch);
12
12
  return decoded.records
13
- .filter((r) => r.body !== undefined)
13
+ .filter((r) => r.body != null)
14
14
  .map((r) => ({
15
15
  eventEncoded: r.body,
16
16
  metadata: Option.some({ s2SeqNum: r.seq_num }),
@@ -1 +1 @@
1
- {"version":3,"file":"decode.js","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,KAAK,CACnB,MAAM,CAAC,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,EAAE,QAAQ;KAClB,CAAC,CACH;CACF,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAA;AAE/D,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,SAAoD,EAInD,EAAE;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,CAAA;IAC7D,OAAO,OAAO,CAAC,OAAO;SACnB,MAAM,CAAC,CAAC,CAAC,EAAmE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;SACpG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,YAAY,EAAE,CAAC,CAAC,IAAI;QACpB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;KAC/C,CAAC,CAAC,CAAA;AACP,CAAC,CAAA"}
1
+ {"version":3,"file":"decode.js","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,KAAK,CACnB,MAAM,CAAC,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1F,OAAO,EAAE,QAAQ;KAClB,CAAC,CACH;CACF,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAA;AAE5D,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,SAAoD,EAInD,EAAE;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,CAAA;IAC7D,OAAO,OAAO,CAAC,OAAO;SACnB,MAAM,CAAC,CAAC,CAAC,EAAmE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;SAC9F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,YAAY,EAAE,CAAC,CAAC,IAAI;QACpB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;KAC/C,CAAC,CAAC,CAAA;AACP,CAAC,CAAA"}