@agoric/vats 0.16.0-u18.3 → 0.16.0-u18.5

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 (83) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/package.json +29 -29
  3. package/scripts/build-bundles.d.ts +3 -0
  4. package/scripts/build-bundles.d.ts.map +1 -0
  5. package/src/bridge-target.d.ts +4 -4
  6. package/src/bridge-target.d.ts.map +1 -1
  7. package/src/bridge.d.ts +1 -1
  8. package/src/bridge.d.ts.map +1 -1
  9. package/src/core/basic-behaviors.d.ts +1 -14
  10. package/src/core/basic-behaviors.d.ts.map +1 -1
  11. package/src/core/basic-behaviors.js +5 -24
  12. package/src/core/boot-chain.d.ts +10 -30
  13. package/src/core/boot-chain.d.ts.map +1 -1
  14. package/src/core/lib-boot.d.ts +2 -2
  15. package/src/core/lib-boot.d.ts.map +1 -1
  16. package/src/core/lib-boot.js +1 -2
  17. package/src/core/promise-space.d.ts +3 -9
  18. package/src/core/promise-space.d.ts.map +1 -1
  19. package/src/core/startWalletFactory.d.ts +1 -1
  20. package/src/core/startWalletFactory.d.ts.map +1 -1
  21. package/src/core/utils.d.ts +9 -18
  22. package/src/core/utils.d.ts.map +1 -1
  23. package/src/crc.d.ts +2 -2
  24. package/src/crc.d.ts.map +1 -1
  25. package/src/lib-board.d.ts +3 -3
  26. package/src/lib-board.d.ts.map +1 -1
  27. package/src/localchain.d.ts +0 -1
  28. package/src/localchain.d.ts.map +1 -1
  29. package/src/proposals/network-proposal.d.ts +1 -1
  30. package/src/proposals/network-proposal.d.ts.map +1 -1
  31. package/src/proposals/testUpgradedBoard.d.ts +26 -0
  32. package/src/proposals/testUpgradedBoard.d.ts.map +1 -0
  33. package/src/proposals/testUpgradedBoard.js +35 -0
  34. package/src/proposals/upgrade-agoricNames-proposal.d.ts +27 -0
  35. package/src/proposals/upgrade-agoricNames-proposal.d.ts.map +1 -0
  36. package/src/proposals/upgrade-agoricNames-proposal.js +47 -0
  37. package/src/proposals/upgrade-asset-reserve-proposal.d.ts +33 -0
  38. package/src/proposals/upgrade-asset-reserve-proposal.d.ts.map +1 -0
  39. package/src/proposals/upgrade-asset-reserve-proposal.js +93 -0
  40. package/src/proposals/upgrade-board-proposal.d.ts +27 -0
  41. package/src/proposals/upgrade-board-proposal.d.ts.map +1 -0
  42. package/src/proposals/upgrade-board-proposal.js +50 -0
  43. package/src/proposals/upgrade-mintHolder-proposal.d.ts +24 -0
  44. package/src/proposals/upgrade-mintHolder-proposal.d.ts.map +1 -0
  45. package/src/proposals/upgrade-mintHolder-proposal.js +74 -0
  46. package/src/proposals/upgrade-paRegistry-proposal.d.ts +29 -0
  47. package/src/proposals/upgrade-paRegistry-proposal.d.ts.map +1 -0
  48. package/src/proposals/upgrade-paRegistry-proposal.js +57 -0
  49. package/src/proposals/upgrade-provisionPool-proposal.d.ts +5 -1
  50. package/src/proposals/upgrade-provisionPool-proposal.d.ts.map +1 -1
  51. package/src/proposals/upgrade-provisionPool-proposal.js +55 -4
  52. package/src/proposals/{upgrade-orch-core-proposal.d.ts → upgrade-vats-generic-proposal.d.ts} +8 -3
  53. package/src/proposals/upgrade-vats-generic-proposal.d.ts.map +1 -0
  54. package/src/proposals/{upgrade-orch-core-proposal.js → upgrade-vats-generic-proposal.js} +15 -7
  55. package/src/proposals/upgrade-vaultFactory-proposal.d.ts +25 -0
  56. package/src/proposals/upgrade-vaultFactory-proposal.d.ts.map +1 -0
  57. package/src/proposals/upgrade-vaultFactory-proposal.js +124 -0
  58. package/src/repl.d.ts.map +1 -1
  59. package/src/repl.js +0 -1
  60. package/src/transfer.d.ts +0 -26
  61. package/src/transfer.d.ts.map +1 -1
  62. package/src/types.d.ts.map +1 -1
  63. package/src/types.ts +0 -1
  64. package/src/vat-bank.d.ts +6 -6
  65. package/src/vat-bank.d.ts.map +1 -1
  66. package/src/vat-board.d.ts +4 -4
  67. package/src/vat-board.d.ts.map +1 -1
  68. package/src/vat-bridge.d.ts.map +1 -1
  69. package/src/vat-network.d.ts +6 -6
  70. package/src/vat-network.d.ts.map +1 -1
  71. package/src/vat-transfer.d.ts +6 -6
  72. package/src/vat-transfer.d.ts.map +1 -1
  73. package/src/virtual-purse.d.ts.map +1 -1
  74. package/src/virtual-purse.js +1 -19
  75. package/tools/bank-utils.d.ts +2 -2
  76. package/tools/bank-utils.d.ts.map +1 -1
  77. package/tools/board-utils.d.ts +2 -2
  78. package/tools/board-utils.d.ts.map +1 -1
  79. package/tools/bootstrap-chain-reflective.js +194 -0
  80. package/tools/fake-bridge.d.ts +3 -3
  81. package/tools/fake-bridge.d.ts.map +1 -1
  82. package/tools/fake-bridge.js +7 -2
  83. package/src/proposals/upgrade-orch-core-proposal.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"board-utils.d.ts","sourceRoot":"","sources":["board-utils.js"],"names":[],"mappings":";AAoCO,sEAHI,OAAO,4CAA4C,EAAE,cAAc,GACjE,kBAAkB,CA0C9B;AAYM;;;;;;;;;;;;;;;;;;;;;GAGN;+BA1FY;IACR,KAAK,EAAE,OAAO,iCAAiC,EAAE,WAAW,CAAC;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,OAAO,iCAAiC,EAAE,WAAW,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;iCAGS;IACR,KAAK,EAAE,MAAM,CACjB,MAAY,EACZ,OAAa,iCAAiC,EAAE,WAAW,CACtD,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC"}
1
+ {"version":3,"file":"board-utils.d.ts","sourceRoot":"","sources":["board-utils.js"],"names":[],"mappings":";AAoCO,sEAHI,OAAO,4CAA4C,EAAE,cAAc,GACjE,kBAAkB,CA0C9B;AAYM,6CALI,MAAM,GAAG,MAAM,YAEvB;IAAyB,MAAM;IACN,SAAS;CAAC;;;;;;;;;;;;;;;;;;GAKrC;+BA1FY;IACR,KAAK,EAAE,OAAO,iCAAiC,EAAE,WAAW,CAAC;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,OAAO,iCAAiC,EAAE,WAAW,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;iCAGS;IACR,KAAK,EAAE,MAAM,CACjB,MAAY,EACZ,OAAa,iCAAiC,EAAE,WAAW,CACtD,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * @file Source code for a bootstrap vat that runs blockchain behaviors (such as
3
+ * bridge vat integration) and exposes reflective methods for use in testing.
4
+ *
5
+ * TODO: Share code with packages/SwingSet/tools/bootstrap-relay.js
6
+ */
7
+
8
+ import { Fail, q } from '@endo/errors';
9
+ import { Far, E } from '@endo/far';
10
+ import { makePromiseKit } from '@endo/promise-kit';
11
+ import { buildManualTimer } from '@agoric/swingset-vat/tools/manual-timer.js';
12
+ import { makeReflectionMethods } from '@agoric/swingset-vat/tools/vat-puppet.js';
13
+ import { makeDurableZone } from '@agoric/zone/durable.js';
14
+ import { makeBootstrap } from '../src/core/lib-boot.js';
15
+ import * as basicBehaviorsNamespace from '../src/core/basic-behaviors.js';
16
+ import * as chainBehaviorsNamespace from '../src/core/chain-behaviors.js';
17
+ import * as utils from '../src/core/utils.js';
18
+
19
+ // Gather up all defined bootstrap behaviors.
20
+ const { BASIC_BOOTSTRAP_PERMITS: BASIC_BOOTSTRAP, ...basicBehaviors } =
21
+ basicBehaviorsNamespace;
22
+ const {
23
+ CHAIN_BOOTSTRAP_MANIFEST: CHAIN_BOOTSTRAP,
24
+ SHARED_CHAIN_BOOTSTRAP_MANIFEST: SHARED_CHAIN_BOOTSTRAP,
25
+ ...chainBehaviors
26
+ } = chainBehaviorsNamespace;
27
+ const manifests = { BASIC_BOOTSTRAP, CHAIN_BOOTSTRAP, SHARED_CHAIN_BOOTSTRAP };
28
+ const allBehaviors = { ...basicBehaviors, ...chainBehaviors };
29
+ export const modules = {
30
+ behaviors: { ...allBehaviors },
31
+ utils: { ...utils },
32
+ };
33
+
34
+ // Support constructing a new manifest as a subset from the union of all
35
+ // standard manifests.
36
+ const allPermits = Object.fromEntries(
37
+ Object.values(manifests)
38
+ .map(manifest => Object.entries(manifest))
39
+ .flat(),
40
+ );
41
+ const makeManifestForBehaviors = behaviors => {
42
+ const manifest = {};
43
+ for (const behavior of behaviors) {
44
+ const { name } = behavior;
45
+ Object.hasOwn(allPermits, name) || Fail`missing permit for ${name}`;
46
+ manifest[name] = allPermits[name];
47
+ }
48
+ return manifest;
49
+ };
50
+
51
+ // Define a minimal manifest of entries plucked from the above union.
52
+ manifests.MINIMAL = makeManifestForBehaviors([
53
+ allBehaviors.bridgeCoreEval,
54
+ allBehaviors.makeBridgeManager,
55
+ allBehaviors.makeVatsFromBundles,
56
+ allBehaviors.startTimerService,
57
+ allBehaviors.setupClientManager,
58
+ ]);
59
+
60
+ /**
61
+ * @param {VatPowers & { D: DProxy; testLog: typeof console.log }} vatPowers
62
+ * @param {{
63
+ * baseManifest?: string;
64
+ * addBehaviors?: string[];
65
+ * coreProposalCodeSteps?: string[];
66
+ * }} bootstrapParameters
67
+ * @param {import('@agoric/vat-data').Baggage} baggage
68
+ */
69
+ export const buildRootObject = (vatPowers, bootstrapParameters, baggage) => {
70
+ const manualTimer = buildManualTimer();
71
+ let vatAdmin;
72
+ const { promise: vatAdminP, resolve: captureVatAdmin } = makePromiseKit();
73
+ void vatAdminP.then(value => (vatAdmin = value)); // for better debugging
74
+ /** @typedef {{ root: object; incarnationNumber?: number }} VatRecord */
75
+ /**
76
+ * @typedef {VatRecord &
77
+ * import('@agoric/swingset-vat').CreateVatResults & {
78
+ * bundleCap: unknown;
79
+ * }} DynamicVatRecord
80
+ */
81
+ /** @type {Map<string, VatRecord | DynamicVatRecord>} */
82
+ const vatRecords = new Map();
83
+ const devicesByName = new Map();
84
+
85
+ const { baseManifest: manifestName = 'MINIMAL', addBehaviors = [] } =
86
+ bootstrapParameters;
87
+ Object.hasOwn(manifests, manifestName) ||
88
+ Fail`missing manifest ${manifestName}`;
89
+ const manifest = {
90
+ ...manifests[manifestName],
91
+ ...makeManifestForBehaviors(addBehaviors),
92
+ };
93
+
94
+ /**
95
+ * bootstrapBase provides CORE_EVAL support, and also exposes:
96
+ *
97
+ * - promise-space functions consumeItem(name), produceItem(name, resolution),
98
+ * resetItem(name)
99
+ * - awaitVatObject(presence: object, path?: PropertyKey[])
100
+ * - snapshotStore<K, V>(store: { entries: () => Iterable<[K, V]> }): Array<[K,
101
+ * V]>
102
+ */
103
+ const bootstrapBase = makeBootstrap(
104
+ { ...vatPowers, logger: vatPowers.testLog },
105
+ bootstrapParameters,
106
+ manifest,
107
+ allBehaviors,
108
+ modules,
109
+ makeDurableZone(baggage),
110
+ );
111
+
112
+ const reflectionMethods = makeReflectionMethods(vatPowers, baggage);
113
+
114
+ return Far('root', {
115
+ ...reflectionMethods,
116
+
117
+ ...bootstrapBase,
118
+ bootstrap: async (vats, devices) => {
119
+ await bootstrapBase.bootstrap(vats, devices);
120
+
121
+ // createVatAdminService is idempotent (despite the name).
122
+ captureVatAdmin(E(vats.vatAdmin).createVatAdminService(devices.vatAdmin));
123
+
124
+ // Capture references to static vats and devices.
125
+ for (const [name, root] of Object.entries(vats)) {
126
+ if (name !== 'vatAdmin') {
127
+ vatRecords.set(name, { root });
128
+ }
129
+ }
130
+ for (const [name, device] of Object.entries(devices)) {
131
+ devicesByName.set(name, device);
132
+ }
133
+ },
134
+
135
+ getDevice: deviceName => devicesByName.get(deviceName),
136
+
137
+ getManualTimer: () => manualTimer,
138
+
139
+ getVatAdmin: () => vatAdmin || vatAdminP,
140
+
141
+ getVatAdminNode: vatName => {
142
+ const vat =
143
+ vatRecords.get(vatName) || Fail`unknown vat name: ${q(vatName)}`;
144
+ const { adminNode } = /** @type {DynamicVatRecord} */ (vat);
145
+ return adminNode;
146
+ },
147
+
148
+ getVatRoot: vatName => {
149
+ const vat =
150
+ vatRecords.get(vatName) || Fail`unknown vat name: ${q(vatName)}`;
151
+ const { root } = vat;
152
+ return root;
153
+ },
154
+
155
+ /**
156
+ * @param {string} vatName
157
+ * @param {string} [bundleCapName]
158
+ * @param {{ vatParameters?: object } & Record<string, unknown>} [vatOptions]
159
+ * @returns {Promise<DynamicVatRecord['root']>} root object of the new vat
160
+ */
161
+ createVat: async (vatName, bundleCapName = vatName, vatOptions = {}) => {
162
+ const bundleCap = await E(vatAdminP).getNamedBundleCap(bundleCapName);
163
+ const { root, adminNode } = await E(vatAdminP).createVat(bundleCap, {
164
+ vatParameters: {},
165
+ ...vatOptions,
166
+ });
167
+ vatRecords.set(vatName, { root, adminNode, bundleCap });
168
+ return root;
169
+ },
170
+
171
+ /**
172
+ * @param {string} vatName
173
+ * @param {string} [bundleCapName]
174
+ * @param {{ vatParameters?: object } & Record<string, unknown>} [vatOptions]
175
+ * @returns {Promise<number>} the resulting incarnation number
176
+ */
177
+ upgradeVat: async (vatName, bundleCapName, vatOptions = {}) => {
178
+ const vatRecord = /** @type {DynamicVatRecord} */ (
179
+ vatRecords.get(vatName) || Fail`unknown vat name: ${q(vatName)}`
180
+ );
181
+ const bundleCap = await (bundleCapName
182
+ ? E(vatAdminP).getNamedBundleCap(bundleCapName)
183
+ : vatRecord.bundleCap);
184
+ const upgradeOptions = { vatParameters: {}, ...vatOptions };
185
+ const { incarnationNumber } = await E(vatRecord.adminNode).upgrade(
186
+ bundleCap,
187
+ upgradeOptions,
188
+ );
189
+ vatRecord.incarnationNumber = incarnationNumber;
190
+ return incarnationNumber;
191
+ },
192
+ });
193
+ };
194
+ harden(buildRootObject);
@@ -3,7 +3,7 @@ export const FAUCET_ADDRESS: "faucet";
3
3
  export function makeFakeBankBridge(zone: import("@agoric/zone").Zone, { balances, onToBridge }?: {
4
4
  balances?: Balances | undefined;
5
5
  onToBridge?: ((obj: any) => void) | undefined;
6
- } | undefined): ScopedBridgeManager<"bank">;
6
+ }): ScopedBridgeManager<"bank">;
7
7
  export function makeFakeIbcBridge(zone: import("@agoric/zone").Zone, onToBridge: (obj: any) => void): ScopedBridgeManager<"dibc">;
8
8
  export const LOCALCHAIN_DEFAULT_ADDRESS: "agoric1fakeLCAAddress";
9
9
  export namespace SIMULATED_ERRORS {
@@ -16,8 +16,8 @@ export const LOCALCHAIN_QUERY_ALL_BALANCES_RESPONSE: {
16
16
  denom: string;
17
17
  }[];
18
18
  export function fakeLocalChainBridgeQueryHandler(message: object): unknown;
19
- export function makeFakeLocalchainBridge(zone: import("@agoric/zone").Zone, onToBridge?: ((obj: any) => void) | undefined): ScopedBridgeManager<"vlocalchain">;
20
- export function makeFakeTransferBridge(zone: import("@agoric/zone").Zone, onToBridge?: ((obj: any) => void) | undefined): ScopedBridgeManager<"vtransfer">;
19
+ export function makeFakeLocalchainBridge(zone: import("@agoric/zone").Zone, onToBridge?: (obj: any) => void, makeAddressFn?: (number: any) => string): ScopedBridgeManager<"vlocalchain">;
20
+ export function makeFakeTransferBridge(zone: import("@agoric/zone").Zone, onToBridge?: (obj: any) => void): ScopedBridgeManager<"vtransfer">;
21
21
  export type Balances = {
22
22
  [address: string]: {
23
23
  [denom: string]: bigint;
@@ -1 +1 @@
1
- {"version":3,"file":"fake-bridge.d.ts","sourceRoot":"","sources":["fake-bridge.js"],"names":[],"mappings":"AAkBA,6EAA6E;AAE7E,sCAAuC;AAehC,yCAPI,OAAO,cAAc,EAAE,IAAI;;gCAGlB,IAAI;gBACX,oBAAoB,MAAM,CAAC,CA4FvC;AAOM,wCAJI,OAAO,cAAc,EAAE,IAAI,cAC3B,CAAC,GAAG,KAAA,KAAK,IAAI,GACX,oBAAoB,MAAM,CAAC,CAwCvC;AAED,iEAAkE;;;;;AAwB3D,0DALI,MAAM,YACN,MAAM,GACJ,OAAO,CAsCnB;AAED;;;IASE;AAWK,0DAHI,MAAM,GACJ,OAAO,CAsCnB;AAOM,+CAJI,OAAO,cAAc,EAAE,IAAI,8BAClB,IAAI,gBACX,oBAAoB,aAAa,CAAC,CAgD9C;AAOM,6CAJI,OAAO,cAAc,EAAE,IAAI,8BAClB,IAAI,gBACX,oBAAoB,WAAW,CAAC,CAuC5C;uBA/Wa;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CAAE;yCAPX,iBAAiB"}
1
+ {"version":3,"file":"fake-bridge.d.ts","sourceRoot":"","sources":["fake-bridge.js"],"names":[],"mappings":"AAkBA,6EAA6E;AAE7E,6BAA8B,QAAQ,CAAC;AAehC,yCAPI,OAAO,cAAc,EAAE,IAAI,6BAEnC;IAAwB,QAAQ;IACH,UAAU,kBAAtB,IAAI;CACrB,GAAU,oBAAoB,MAAM,CAAC,CA4FvC;AAOM,wCAJI,OAAO,cAAc,EAAE,IAAI,cAC3B,CAAC,GAAG,KAAA,KAAK,IAAI,GACX,oBAAoB,MAAM,CAAC,CAwCvC;AAED,yCAA0C,uBAAuB,CAAC;;;;;AAwB3D,0DALI,MAAM,YACN,MAAM,GACJ,OAAO,CAsCnB;AAED;;;IASE;AAWK,0DAHI,MAAM,GACJ,OAAO,CAsCnB;AAQM,+CALI,OAAO,cAAc,EAAE,IAAI,eAC3B,CAAC,GAAG,KAAA,KAAK,IAAI,kBACb,CAAC,MAAM,KAAA,KAAK,MAAM,GAChB,oBAAoB,aAAa,CAAC,CAoD9C;AAOM,6CAJI,OAAO,cAAc,EAAE,IAAI,eAC3B,CAAC,GAAG,KAAA,KAAK,IAAI,GACX,oBAAoB,WAAW,CAAC,CAuC5C;uBApXa;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CAAE;yCAPX,iBAAiB"}
@@ -291,9 +291,14 @@ export const fakeLocalChainBridgeQueryHandler = message => {
291
291
  /**
292
292
  * @param {import('@agoric/zone').Zone} zone
293
293
  * @param {(obj) => void} [onToBridge]
294
+ * @param {(number) => string} makeAddressFn
294
295
  * @returns {ScopedBridgeManager<'vlocalchain'>}
295
296
  */
296
- export const makeFakeLocalchainBridge = (zone, onToBridge = () => {}) => {
297
+ export const makeFakeLocalchainBridge = (
298
+ zone,
299
+ onToBridge = () => {},
300
+ makeAddressFn = index => `${LOCALCHAIN_DEFAULT_ADDRESS}${index || ''}`,
301
+ ) => {
297
302
  /** @type {Remote<BridgeHandler>} */
298
303
  let hndlr;
299
304
  let lcaExecuteTxSequence = 0;
@@ -306,7 +311,7 @@ export const makeFakeLocalchainBridge = (zone, onToBridge = () => {}) => {
306
311
  trace('toBridge', type, method, params);
307
312
  switch (type) {
308
313
  case 'VLOCALCHAIN_ALLOCATE_ADDRESS': {
309
- const address = `${LOCALCHAIN_DEFAULT_ADDRESS}${accountsCreated || ''}`;
314
+ const address = makeAddressFn(accountsCreated);
310
315
  accountsCreated += 1;
311
316
  return address;
312
317
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade-orch-core-proposal.d.ts","sourceRoot":"","sources":["upgrade-orch-core-proposal.js"],"names":[],"mappings":"AAeO,wEAZI,eAAe,GAAG;IACxB,OAAO,EAAE;QACP,WAAW,EAAE,WAAW,CAAC;QACzB,QAAQ,EAAE,QAAQ,CACxB,MAAc,EACd,OAAe,sBAAsB,EAAE,gBAAgB,CAChD,CAAC;KACH,CAAC;CACH,WAED;IAAqE,OAAO,EAApE;QAAE,UAAU,EAAE;YAAE,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAA;SAAE,CAAA;KAAE;CAC7D,iBAeA;AAEM;;;;;;;;;;;;;;;EAWL"}