@joist/observable 4.2.1 → 4.2.3-next.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joist/observable",
3
- "version": "4.2.1",
3
+ "version": "4.2.3-next.0",
4
4
  "type": "module",
5
5
  "main": "./target/lib.js",
6
6
  "module": "./target/lib.js",
@@ -6,7 +6,11 @@ it("should return default metadata", () => {
6
6
  const key = {};
7
7
  const data = new ObservableInstanceMetaDataStore().read(key);
8
8
 
9
- assert.deepEqual(data, { changes: new Changes(), scheduler: null });
9
+ assert.deepEqual(data, {
10
+ changes: new Changes(),
11
+ scheduler: null,
12
+ bindings: new Set<() => void>(),
13
+ });
10
14
  });
11
15
 
12
16
  it("should return the same metadata object after init", () => {
@@ -2,14 +2,17 @@
2
2
 
3
3
  export type EffectFn<T> = (changes: Changes<T>) => void;
4
4
 
5
- export class Changes<T> extends Map<
6
- keyof T,
7
- { oldValue: unknown; newValue: unknown }
8
- > {}
5
+ export interface Change<T> {
6
+ oldValue: T;
7
+ newValue: T;
8
+ }
9
+
10
+ export class Changes<T> extends Map<keyof T, Change<unknown>> {}
9
11
 
10
12
  export class ObservableInstanceMetadata<T> {
11
13
  scheduler: Promise<void> | null = null;
12
14
  changes: Changes<T> = new Changes();
15
+ bindings: Set<(changes: Changes<T>) => void> = new Set();
13
16
  }
14
17
 
15
18
  export class ObservableInstanceMetaDataStore extends WeakMap<
@@ -25,7 +28,7 @@ export class ObservableInstanceMetaDataStore extends WeakMap<
25
28
  this.set(key, data);
26
29
  }
27
30
 
28
- return data;
31
+ return data as ObservableInstanceMetadata<T>;
29
32
  }
30
33
  }
31
34
 
@@ -4,6 +4,8 @@ import {
4
4
  observableMetadataStore,
5
5
  } from "./metadata.js";
6
6
 
7
+ const INIT_VALUE = Symbol("init");
8
+
7
9
  export function observe() {
8
10
  return function observeDecorator<This extends object, Value>(
9
11
  base: ClassAccessorDecoratorTarget<This, Value>,
@@ -13,14 +15,14 @@ export function observe() {
13
15
 
14
16
  return {
15
17
  init(value) {
16
- let val: Value | null = null;
18
+ let val: Value | typeof INIT_VALUE = INIT_VALUE;
17
19
 
18
20
  // START: Make upgradable custom elements work
19
21
  try {
20
22
  val = ctx.access.get(this);
21
23
  } catch {}
22
24
 
23
- if (val) {
25
+ if (val !== INIT_VALUE) {
24
26
  Reflect.deleteProperty(this, ctx.name);
25
27
 
26
28
  return val;
@@ -31,16 +33,19 @@ export function observe() {
31
33
  },
32
34
  set(newValue: Value) {
33
35
  const oldValue = base.get.call(this);
36
+ const instanceMeta = instanceMetadataStore.read<This>(this);
34
37
 
35
38
  if (newValue !== oldValue) {
36
- const instanceMeta = instanceMetadataStore.read<This>(this);
37
-
38
39
  if (instanceMeta.scheduler === null) {
39
40
  instanceMeta.scheduler = Promise.resolve().then(() => {
40
41
  for (const effect of observableMeta.effects) {
41
42
  effect.call(this, instanceMeta.changes);
42
43
  }
43
44
 
45
+ for (const binding of instanceMeta.bindings) {
46
+ binding.call(this, instanceMeta.changes);
47
+ }
48
+
44
49
  instanceMeta.scheduler = null;
45
50
  instanceMeta.changes.clear();
46
51
  });
package/src/lib.ts CHANGED
@@ -1,2 +1,6 @@
1
1
  export { observe, effect } from "./lib/observe.js";
2
- export { Changes } from "./lib/metadata.js";
2
+ export { Changes, Change } from "./lib/metadata.js";
3
+ export {
4
+ instanceMetadataStore,
5
+ observableMetadataStore,
6
+ } from "./lib/metadata.js";
@@ -1,12 +1,14 @@
1
1
  export type EffectFn<T> = (changes: Changes<T>) => void;
2
- export declare class Changes<T> extends Map<keyof T, {
3
- oldValue: unknown;
4
- newValue: unknown;
5
- }> {
2
+ export interface Change<T> {
3
+ oldValue: T;
4
+ newValue: T;
5
+ }
6
+ export declare class Changes<T> extends Map<keyof T, Change<unknown>> {
6
7
  }
7
8
  export declare class ObservableInstanceMetadata<T> {
8
9
  scheduler: Promise<void> | null;
9
10
  changes: Changes<T>;
11
+ bindings: Set<(changes: Changes<T>) => void>;
10
12
  }
11
13
  export declare class ObservableInstanceMetaDataStore extends WeakMap<object, ObservableInstanceMetadata<unknown>> {
12
14
  read<T extends object>(key: T): ObservableInstanceMetadata<T>;
@@ -4,6 +4,7 @@ export class Changes extends Map {
4
4
  export class ObservableInstanceMetadata {
5
5
  scheduler = null;
6
6
  changes = new Changes();
7
+ bindings = new Set();
7
8
  }
8
9
  export class ObservableInstanceMetaDataStore extends WeakMap {
9
10
  read(key) {
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAIvD,MAAM,OAAO,OAAW,SAAQ,GAG/B;CAAG;AAEJ,MAAM,OAAO,0BAA0B;IACrC,SAAS,GAAyB,IAAI,CAAC;IACvC,OAAO,GAAe,IAAI,OAAO,EAAE,CAAC;CACrC;AAED,MAAM,OAAO,+BAAgC,SAAQ,OAGpD;IACC,IAAI,CAAmB,GAAM;QAC3B,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,0BAA0B,EAAE,CAAC;YAExC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IAC7B,OAAO,GAAqB,IAAI,GAAG,EAAE,CAAC;CACvC;AAED,MAAM,OAAO,uBAAwB,SAAQ,OAG5C;IACC,IAAI,CAAmB,GAAW;QAChC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAEhC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAA6B,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,qBAAqB,GAChC,IAAI,+BAA+B,EAAE,CAAC;AAExC,MAAM,CAAC,MAAM,uBAAuB,GAClC,IAAI,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AASvD,MAAM,OAAO,OAAW,SAAQ,GAA6B;CAAG;AAEhE,MAAM,OAAO,0BAA0B;IACrC,SAAS,GAAyB,IAAI,CAAC;IACvC,OAAO,GAAe,IAAI,OAAO,EAAE,CAAC;IACpC,QAAQ,GAAuC,IAAI,GAAG,EAAE,CAAC;CAC1D;AAED,MAAM,OAAO,+BAAgC,SAAQ,OAGpD;IACC,IAAI,CAAmB,GAAM;QAC3B,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,0BAA0B,EAAE,CAAC;YAExC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAAqC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IAC7B,OAAO,GAAqB,IAAI,GAAG,EAAE,CAAC;CACvC;AAED,MAAM,OAAO,uBAAwB,SAAQ,OAG5C;IACC,IAAI,CAAmB,GAAW;QAChC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAEhC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAA6B,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,qBAAqB,GAChC,IAAI,+BAA+B,EAAE,CAAC;AAExC,MAAM,CAAC,MAAM,uBAAuB,GAClC,IAAI,uBAAuB,EAAE,CAAC"}
@@ -3,7 +3,11 @@ import { Changes, ObservableInstanceMetaDataStore } from "./metadata.js";
3
3
  it("should return default metadata", () => {
4
4
  const key = {};
5
5
  const data = new ObservableInstanceMetaDataStore().read(key);
6
- assert.deepEqual(data, { changes: new Changes(), scheduler: null });
6
+ assert.deepEqual(data, {
7
+ changes: new Changes(),
8
+ scheduler: null,
9
+ bindings: new Set(),
10
+ });
7
11
  });
8
12
  it("should return the same metadata object after init", () => {
9
13
  const key = {};
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.test.js","sourceRoot":"","sources":["../../src/lib/metadata.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAEzE,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;IACxC,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7D,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC3D,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC;IAEnD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"metadata.test.js","sourceRoot":"","sources":["../../src/lib/metadata.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAEzE,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;IACxC,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7D,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;QACrB,OAAO,EAAE,IAAI,OAAO,EAAE;QACtB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI,GAAG,EAAc;KAChC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC3D,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,IAAI,+BAA+B,EAAE,CAAC;IAEnD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
@@ -1,15 +1,16 @@
1
1
  import { instanceMetadataStore, observableMetadataStore, } from "./metadata.js";
2
+ const INIT_VALUE = Symbol("init");
2
3
  export function observe() {
3
4
  return function observeDecorator(base, ctx) {
4
5
  const observableMeta = observableMetadataStore.read(ctx.metadata);
5
6
  return {
6
7
  init(value) {
7
- let val = null;
8
+ let val = INIT_VALUE;
8
9
  try {
9
10
  val = ctx.access.get(this);
10
11
  }
11
12
  catch { }
12
- if (val) {
13
+ if (val !== INIT_VALUE) {
13
14
  Reflect.deleteProperty(this, ctx.name);
14
15
  return val;
15
16
  }
@@ -17,13 +18,16 @@ export function observe() {
17
18
  },
18
19
  set(newValue) {
19
20
  const oldValue = base.get.call(this);
21
+ const instanceMeta = instanceMetadataStore.read(this);
20
22
  if (newValue !== oldValue) {
21
- const instanceMeta = instanceMetadataStore.read(this);
22
23
  if (instanceMeta.scheduler === null) {
23
24
  instanceMeta.scheduler = Promise.resolve().then(() => {
24
25
  for (const effect of observableMeta.effects) {
25
26
  effect.call(this, instanceMeta.changes);
26
27
  }
28
+ for (const binding of instanceMeta.bindings) {
29
+ binding.call(this, instanceMeta.changes);
30
+ }
27
31
  instanceMeta.scheduler = null;
28
32
  instanceMeta.changes.clear();
29
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/lib/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,OAAO;IACrB,OAAO,SAAS,gBAAgB,CAC9B,IAA+C,EAC/C,GAA+C;QAE/C,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExE,OAAO;YACL,IAAI,CAAC,KAAK;gBACR,IAAI,GAAG,GAAiB,IAAI,CAAC;gBAG7B,IAAI,CAAC;oBACH,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBAEV,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAEvC,OAAO,GAAG,CAAC;gBACb,CAAC;gBAGD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,GAAG,CAAC,QAAe;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAErC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAO,IAAI,CAAC,CAAC;oBAE5D,IAAI,YAAY,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;wBACpC,YAAY,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;4BACnD,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gCAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;4BAC1C,CAAC;4BAED,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;4BAC9B,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBAC/B,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAkB,EAAE;wBAC/C,QAAQ;wBACR,QAAQ;qBACT,CAAC,CAAC;oBAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,SAAS,eAAe,CAC7B,KAAkB,EAClB,GAAmC;QAEnC,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/lib/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAElC,MAAM,UAAU,OAAO;IACrB,OAAO,SAAS,gBAAgB,CAC9B,IAA+C,EAC/C,GAA+C;QAE/C,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExE,OAAO;YACL,IAAI,CAAC,KAAK;gBACR,IAAI,GAAG,GAA8B,UAAU,CAAC;gBAGhD,IAAI,CAAC;oBACH,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBAEV,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBACvB,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAEvC,OAAO,GAAG,CAAC;gBACb,CAAC;gBAGD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,GAAG,CAAC,QAAe;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAO,IAAI,CAAC,CAAC;gBAE5D,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,IAAI,YAAY,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;wBACpC,YAAY,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;4BACnD,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gCAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;4BAC1C,CAAC;4BAED,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;gCAC5C,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;4BAC3C,CAAC;4BAED,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;4BAC9B,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBAC/B,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAkB,EAAE;wBAC/C,QAAQ;wBACR,QAAQ;qBACT,CAAC,CAAC;oBAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,SAAS,eAAe,CAC7B,KAAkB,EAClB,GAAmC;QAEnC,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC"}
package/target/lib.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { observe, effect } from "./lib/observe.js";
2
- export { Changes } from "./lib/metadata.js";
2
+ export { Changes, Change } from "./lib/metadata.js";
3
+ export { instanceMetadataStore, observableMetadataStore, } from "./lib/metadata.js";
package/target/lib.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { observe, effect } from "./lib/observe.js";
2
2
  export { Changes } from "./lib/metadata.js";
3
+ export { instanceMetadataStore, observableMetadataStore, } from "./lib/metadata.js";
3
4
  //# sourceMappingURL=lib.js.map
package/target/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAU,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}