@aztec/world-state 0.1.0-alpha22 → 0.1.0-alpha39

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 (36) hide show
  1. package/.tsbuildinfo +1 -1
  2. package/dest/index.d.ts +1 -0
  3. package/dest/index.d.ts.map +1 -1
  4. package/dest/index.js +2 -1
  5. package/dest/merkle-tree/merkle_tree_operations_facade.d.ts +7 -5
  6. package/dest/merkle-tree/merkle_tree_operations_facade.d.ts.map +1 -1
  7. package/dest/merkle-tree/merkle_tree_operations_facade.js +6 -5
  8. package/dest/synchroniser/config.d.ts +1 -1
  9. package/dest/synchroniser/config.d.ts.map +1 -1
  10. package/dest/synchroniser/config.js +3 -3
  11. package/dest/synchroniser/server_world_state_synchroniser.d.ts +3 -19
  12. package/dest/synchroniser/server_world_state_synchroniser.d.ts.map +1 -1
  13. package/dest/synchroniser/server_world_state_synchroniser.js +11 -23
  14. package/dest/synchroniser/server_world_state_synchroniser.test.js +11 -16
  15. package/dest/synchroniser/world_state_synchroniser.d.ts +24 -0
  16. package/dest/synchroniser/world_state_synchroniser.d.ts.map +1 -1
  17. package/dest/synchroniser/world_state_synchroniser.js +1 -1
  18. package/dest/utils.d.ts +6 -0
  19. package/dest/utils.d.ts.map +1 -1
  20. package/dest/utils.js +11 -2
  21. package/dest/world-state-db/index.d.ts +13 -7
  22. package/dest/world-state-db/index.d.ts.map +1 -1
  23. package/dest/world-state-db/index.js +2 -2
  24. package/dest/world-state-db/merkle_trees.d.ts +10 -6
  25. package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
  26. package/dest/world-state-db/merkle_trees.js +44 -52
  27. package/package.json +6 -5
  28. package/src/index.ts +1 -0
  29. package/src/merkle-tree/merkle_tree_operations_facade.ts +10 -7
  30. package/src/synchroniser/config.ts +3 -3
  31. package/src/synchroniser/server_world_state_synchroniser.test.ts +21 -15
  32. package/src/synchroniser/server_world_state_synchroniser.ts +17 -23
  33. package/src/synchroniser/world_state_synchroniser.ts +30 -0
  34. package/src/utils.ts +13 -2
  35. package/src/world-state-db/index.ts +13 -8
  36. package/src/world-state-db/merkle_trees.ts +54 -77
@@ -1,10 +1,11 @@
1
- import { BaseRollupInputs, CONTRACT_TREE_HEIGHT, CONTRACT_TREE_ROOTS_TREE_HEIGHT, CircuitsWasm, L1_TO_L2_MSG_ROOTS_TREE_HEIGHT, L1_TO_L2_MSG_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PRIVATE_DATA_TREE_HEIGHT, PRIVATE_DATA_TREE_ROOTS_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, } from '@aztec/circuits.js';
2
- import { Pedersen, SparseTree, StandardIndexedTree, StandardTree, newTree, } from '@aztec/merkle-tree';
3
- import { INITIAL_NULLIFIER_TREE_SIZE, } from './index.js';
4
- import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
5
- import { MerkleTreeId, merkleTreeIds } from '@aztec/types';
1
+ import { BaseRollupInputs, CONTRACT_TREE_HEIGHT, CircuitsWasm, Fr, GlobalVariables, HISTORIC_BLOCKS_TREE_HEIGHT, L1_TO_L2_MSG_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PRIVATE_DATA_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, } from '@aztec/circuits.js';
2
+ import { computeBlockHashWithGlobals } from '@aztec/circuits.js/abis';
6
3
  import { SerialQueue } from '@aztec/foundation/fifo';
7
4
  import { createDebugLogger } from '@aztec/foundation/log';
5
+ import { Pedersen, SparseTree, StandardIndexedTree, StandardTree, newTree, } from '@aztec/merkle-tree';
6
+ import { MerkleTreeId, merkleTreeIds } from '@aztec/types';
7
+ import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
8
+ import { INITIAL_NULLIFIER_TREE_SIZE, } from './index.js';
8
9
  /**
9
10
  * A convenience class for managing multiple merkle trees.
10
11
  */
@@ -23,28 +24,16 @@ export class MerkleTrees {
23
24
  const wasm = optionalWasm ?? (await CircuitsWasm.get());
24
25
  const hasher = new Pedersen(wasm);
25
26
  const contractTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE]}`, CONTRACT_TREE_HEIGHT);
26
- const contractTreeRootsTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE_ROOTS_TREE]}`, CONTRACT_TREE_ROOTS_TREE_HEIGHT);
27
27
  const nullifierTree = await newTree(StandardIndexedTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, NULLIFIER_TREE_HEIGHT, INITIAL_NULLIFIER_TREE_SIZE);
28
28
  const privateDataTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PRIVATE_DATA_TREE]}`, PRIVATE_DATA_TREE_HEIGHT);
29
- const privateDataTreeRootsTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE]}`, PRIVATE_DATA_TREE_ROOTS_TREE_HEIGHT);
30
29
  const publicDataTree = await newTree(SparseTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PUBLIC_DATA_TREE]}`, PUBLIC_DATA_TREE_HEIGHT);
31
30
  const l1Tol2MessagesTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGES_TREE]}`, L1_TO_L2_MSG_TREE_HEIGHT);
32
- const l1Tol2MessagesRootsTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE]}`, L1_TO_L2_MSG_ROOTS_TREE_HEIGHT);
33
- this.trees = [
34
- contractTree,
35
- contractTreeRootsTree,
36
- nullifierTree,
37
- privateDataTree,
38
- privateDataTreeRootsTree,
39
- publicDataTree,
40
- l1Tol2MessagesTree,
41
- l1Tol2MessagesRootsTree,
42
- ];
31
+ const historicBlocksTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.BLOCKS_TREE]}`, HISTORIC_BLOCKS_TREE_HEIGHT);
32
+ this.trees = [contractTree, nullifierTree, privateDataTree, publicDataTree, l1Tol2MessagesTree, historicBlocksTree];
43
33
  this.jobQueue.start();
44
- // The roots trees must contain the empty roots of their data trees
45
- await this.updateHistoricRootsTrees(true);
46
- const historicRootsTrees = [contractTreeRootsTree, privateDataTreeRootsTree, l1Tol2MessagesRootsTree];
47
- await Promise.all(historicRootsTrees.map(tree => tree.commit()));
34
+ // The first leaf in the blocks tree contains the empty roots of the other trees and empty global variables.
35
+ await this.updateHistoricBlocksTree(GlobalVariables.empty(), true);
36
+ await historicBlocksTree.commit();
48
37
  }
49
38
  /**
50
39
  * Method to asynchronously create and initialise a MerkleTrees instance.
@@ -80,17 +69,12 @@ export class MerkleTrees {
80
69
  /**
81
70
  * Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE, L1_TO_L2_MESSAGES_TREE_ROOTS_TREE)
82
71
  * the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE, L1_TO_L2_MESSAGES_TREE).
72
+ * @param globals - The global variables to use for hashing.
83
73
  * @param includeUncommitted - Indicates whether to include uncommitted data.
84
74
  */
85
- async updateHistoricRootsTrees(includeUncommitted) {
86
- for (const [newTree, rootTree] of [
87
- [MerkleTreeId.PRIVATE_DATA_TREE, MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE],
88
- [MerkleTreeId.CONTRACT_TREE, MerkleTreeId.CONTRACT_TREE_ROOTS_TREE],
89
- [MerkleTreeId.L1_TO_L2_MESSAGES_TREE, MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE],
90
- ]) {
91
- const newTreeInfo = await this.getTreeInfo(newTree, includeUncommitted);
92
- await this.appendLeaves(rootTree, [newTreeInfo.root]);
93
- }
75
+ async updateHistoricBlocksTree(globals, includeUncommitted) {
76
+ const blockHash = await this.getCurrentBlockHash(globals, includeUncommitted);
77
+ await this.appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
94
78
  }
95
79
  /**
96
80
  * Gets the tree info for the specified tree.
@@ -106,19 +90,31 @@ export class MerkleTrees {
106
90
  * @param includeUncommitted - Indicates whether to include uncommitted data.
107
91
  * @returns The current roots of the trees.
108
92
  */
109
- getCommitmentTreeRoots(includeUncommitted) {
110
- const roots = [
93
+ getTreeRoots(includeUncommitted) {
94
+ const roots = this.getAllTreeRoots(includeUncommitted);
95
+ return {
96
+ privateDataTreeRoot: roots[0],
97
+ nullifierTreeRoot: roots[1],
98
+ contractDataTreeRoot: roots[2],
99
+ l1Tol2MessagesTreeRoot: roots[3],
100
+ publicDataTreeRoot: roots[4],
101
+ blocksTreeRoot: roots[5],
102
+ };
103
+ }
104
+ async getCurrentBlockHash(globals, includeUncommitted) {
105
+ const roots = this.getAllTreeRoots(includeUncommitted).map(root => Fr.fromBuffer(root));
106
+ const wasm = await CircuitsWasm.get();
107
+ return computeBlockHashWithGlobals(wasm, globals, roots[0], roots[1], roots[2], roots[3], roots[4]);
108
+ }
109
+ getAllTreeRoots(includeUncommitted) {
110
+ return [
111
111
  MerkleTreeId.PRIVATE_DATA_TREE,
112
+ MerkleTreeId.NULLIFIER_TREE,
112
113
  MerkleTreeId.CONTRACT_TREE,
113
114
  MerkleTreeId.L1_TO_L2_MESSAGES_TREE,
114
- MerkleTreeId.NULLIFIER_TREE,
115
+ MerkleTreeId.PUBLIC_DATA_TREE,
116
+ MerkleTreeId.BLOCKS_TREE,
115
117
  ].map(tree => this.trees[tree].getRoot(includeUncommitted));
116
- return {
117
- privateDataTreeRoot: roots[0],
118
- contractDataTreeRoot: roots[1],
119
- l1Tol2MessagesTreeRoot: roots[2],
120
- nullifierTreeRoot: roots[3],
121
- };
122
118
  }
123
119
  /**
124
120
  * Gets the value at the given index.
@@ -326,10 +322,8 @@ export class MerkleTrees {
326
322
  compareRoot(l2Block.endNullifierTreeSnapshot.root, MerkleTreeId.NULLIFIER_TREE),
327
323
  compareRoot(l2Block.endPrivateDataTreeSnapshot.root, MerkleTreeId.PRIVATE_DATA_TREE),
328
324
  compareRoot(l2Block.endPublicDataTreeRoot, MerkleTreeId.PUBLIC_DATA_TREE),
329
- compareRoot(l2Block.endTreeOfHistoricContractTreeRootsSnapshot.root, MerkleTreeId.CONTRACT_TREE_ROOTS_TREE),
330
- compareRoot(l2Block.endTreeOfHistoricPrivateDataTreeRootsSnapshot.root, MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE),
331
325
  compareRoot(l2Block.endL1ToL2MessageTreeSnapshot.root, MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
332
- compareRoot(l2Block.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot.root, MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE),
326
+ compareRoot(l2Block.endHistoricBlocksTreeSnapshot.root, MerkleTreeId.BLOCKS_TREE),
333
327
  ];
334
328
  const ourBlock = rootChecks.every(x => x);
335
329
  if (ourBlock) {
@@ -339,6 +333,7 @@ export class MerkleTrees {
339
333
  else {
340
334
  this.log(`Block ${l2Block.number} is not ours, rolling back world state and committing state from chain..`);
341
335
  await this._rollback();
336
+ // Sync the append only trees
342
337
  for (const [tree, leaves] of [
343
338
  [MerkleTreeId.CONTRACT_TREE, l2Block.newContracts],
344
339
  [MerkleTreeId.PRIVATE_DATA_TREE, l2Block.newCommitments],
@@ -346,21 +341,18 @@ export class MerkleTrees {
346
341
  ]) {
347
342
  await this._appendLeaves(tree, leaves.map(fr => fr.toBuffer()));
348
343
  }
344
+ // Sync the indexed trees
349
345
  await this.trees[MerkleTreeId.NULLIFIER_TREE].batchInsert(l2Block.newNullifiers.map(fr => fr.toBuffer()), BaseRollupInputs.NULLIFIER_SUBTREE_HEIGHT);
346
+ // Sync the public data tree
350
347
  for (const dataWrite of l2Block.newPublicDataWrites) {
351
348
  if (dataWrite.isEmpty())
352
349
  continue;
353
350
  const { newValue, leafIndex } = dataWrite;
354
351
  await this._updateLeaf(MerkleTreeId.PUBLIC_DATA_TREE, newValue.toBuffer(), leafIndex.value);
355
352
  }
356
- for (const [newTree, rootTree] of [
357
- [MerkleTreeId.PRIVATE_DATA_TREE, MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE],
358
- [MerkleTreeId.CONTRACT_TREE, MerkleTreeId.CONTRACT_TREE_ROOTS_TREE],
359
- [MerkleTreeId.L1_TO_L2_MESSAGES_TREE, MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE],
360
- ]) {
361
- const newTreeRoot = this.trees[newTree].getRoot(true);
362
- await this._appendLeaves(rootTree, [newTreeRoot]);
363
- }
353
+ // Sync and add the block to the historic blocks tree
354
+ const blockHash = await this.getCurrentBlockHash(l2Block.globalVariables, true);
355
+ await this._appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
364
356
  await this._commit();
365
357
  }
366
358
  for (const treeId of merkleTreeIds()) {
@@ -369,4 +361,4 @@ export class MerkleTrees {
369
361
  }
370
362
  }
371
363
  }
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQiwrQkFBK0IsRUFDL0IsWUFBWSxFQUVaLDhCQUE4QixFQUM5Qix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUtMLFFBQVEsRUFFUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFlBQVksRUFFWixPQUFPLEdBQ1IsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBRUwsMkJBQTJCLEdBTTVCLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzdGLE9BQU8sRUFBVyxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUcxRDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQW9CLEVBQW1CLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztRQUExRSxPQUFFLEdBQUYsRUFBRSxDQUFpQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQTBDO1FBSHRGLFVBQUssR0FBd0MsRUFBRSxDQUFDO1FBQ2hELGFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRTRELENBQUM7SUFFbEc7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUEwQjtRQUMxQyxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksQ0FBQyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sWUFBWSxHQUFtQixNQUFNLE9BQU8sQ0FDaEQsWUFBWSxFQUNaLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUM3QyxvQkFBb0IsQ0FDckIsQ0FBQztRQUNGLE1BQU0scUJBQXFCLEdBQW1CLE1BQU0sT0FBTyxDQUN6RCxZQUFZLEVBQ1osSUFBSSxDQUFDLEVBQUUsRUFDUCxNQUFNLEVBQ04sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsRUFDeEQsK0JBQStCLENBQ2hDLENBQUM7UUFDRixNQUFNLGFBQWEsR0FBRyxNQUFNLE9BQU8sQ0FDakMsbUJBQW1CLEVBQ25CLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUM5QyxxQkFBcUIsRUFDckIsMkJBQTJCLENBQzVCLENBQUM7UUFDRixNQUFNLGVBQWUsR0FBbUIsTUFBTSxPQUFPLENBQ25ELFlBQVksRUFDWixJQUFJLENBQUMsRUFBRSxFQUNQLE1BQU0sRUFDTixHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUNqRCx3QkFBd0IsQ0FDekIsQ0FBQztRQUNGLE1BQU0sd0JBQXdCLEdBQW1CLE1BQU0sT0FBTyxDQUM1RCxZQUFZLEVBQ1osSUFBSSxDQUFDLEVBQUUsRUFDUCxNQUFNLEVBQ04sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLDRCQUE0QixDQUFDLEVBQUUsRUFDNUQsbUNBQW1DLENBQ3BDLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBbUIsTUFBTSxPQUFPLENBQ2xELFVBQVUsRUFDVixJQUFJLENBQUMsRUFBRSxFQUNQLE1BQU0sRUFDTixHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUNoRCx1QkFBdUIsQ0FDeEIsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQW1CLE1BQU0sT0FBTyxDQUN0RCxZQUFZLEVBQ1osSUFBSSxDQUFDLEVBQUUsRUFDUCxNQUFNLEVBQ04sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsRUFDdEQsd0JBQXdCLENBQ3pCLENBQUM7UUFDRixNQUFNLHVCQUF1QixHQUFtQixNQUFNLE9BQU8sQ0FDM0QsWUFBWSxFQUNaLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLEVBQzVELDhCQUE4QixDQUMvQixDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLFlBQVk7WUFDWixxQkFBcUI7WUFDckIsYUFBYTtZQUNiLGVBQWU7WUFDZix3QkFBd0I7WUFDeEIsY0FBYztZQUNkLGtCQUFrQjtZQUNsQix1QkFBdUI7U0FDeEIsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdEIsbUVBQW1FO1FBQ25FLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQW1CLEVBQUUsSUFBa0I7UUFDN0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxRQUFRO1FBQ2IsT0FBTyxJQUFJLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVztRQUNoQixPQUFPLElBQUksMEJBQTBCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLHdCQUF3QixDQUFDLGtCQUEyQjtRQUMvRCxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDaEMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLDRCQUE0QixDQUFDO1lBQzNFLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsd0JBQXdCLENBQUM7WUFDbkUsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxDQUFDLDRCQUE0QixDQUFDO1NBQ3hFLEVBQUU7WUFDVixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDeEUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFvQixFQUFFLGtCQUEyQjtRQUN4RSxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxzQkFBc0IsQ0FBQyxrQkFBMkI7UUFDdkQsTUFBTSxLQUFLLEdBQUc7WUFDWixZQUFZLENBQUMsaUJBQWlCO1lBQzlCLFlBQVksQ0FBQyxhQUFhO1lBQzFCLFlBQVksQ0FBQyxzQkFBc0I7WUFDbkMsWUFBWSxDQUFDLGNBQWM7U0FDNUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFFNUQsT0FBTztZQUNMLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDN0Isb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM5QixzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUN2QixNQUFvQixFQUNwQixLQUFhLEVBQ2Isa0JBQTJCO1FBRTNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxjQUFjLENBQ3pCLE1BQW9CLEVBQ3BCLEtBQWEsRUFDYixrQkFBMkI7UUFFM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQW9CLEVBQUUsTUFBZ0I7UUFDOUQsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLE1BQU07UUFDakIsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxRQUFRO1FBQ25CLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMscUJBQXFCLENBQ2hDLE1BQXFCLEVBQ3JCLEtBQWEsRUFDYixrQkFBMkI7UUFXM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQ2pDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUNsRyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxXQUFXLENBQ3RCLE1BQXFCLEVBQ3JCLEtBQWEsRUFDYixrQkFBMkI7UUFFM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQ2pDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUMvRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQ3hCLE1BQW9CLEVBQ3BCLEtBQWEsRUFDYixrQkFBMkI7UUFFM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMvRCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3BFLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzlDLE9BQU8sQ0FBQyxDQUFDO2lCQUNWO2FBQ0Y7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQW9DLEVBQUUsSUFBdUIsRUFBRSxLQUFhO1FBQ2xHLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQWM7UUFDdkMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FLdEIsTUFBb0IsRUFDcEIsTUFBZ0IsRUFDaEIsYUFBNEI7UUFLNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQXdCLENBQUM7UUFDdkQsSUFBSSxDQUFDLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztTQUMvRDtRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUFJLEVBQW9CO1FBQy9DLE9BQU8sTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxZQUFZLENBQUMsTUFBb0IsRUFBRSxrQkFBMkI7UUFDcEUsTUFBTSxRQUFRLEdBQUc7WUFDZixNQUFNO1lBQ04sSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1lBQ3BELElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztZQUN6RCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUU7U0FDekIsQ0FBQztRQUNkLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGVBQWUsQ0FBQyxNQUFxQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxlQUFlLENBQ3JCLE1BQW9CLEVBQ3BCLEtBQWEsRUFDYixrQkFBMkI7UUFFM0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFJLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFvQixFQUFFLE1BQWdCO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztTQUNoRTtRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVyxDQUN2QixNQUFvQyxFQUNwQyxJQUF1QixFQUN2QixLQUFhO1FBRWIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsT0FBTyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsT0FBTztRQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDN0IsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLFNBQVM7UUFDckIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBZ0I7UUFDM0MsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFRLEVBQUUsTUFBb0IsRUFBRSxFQUFFO1lBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRztZQUNqQixXQUFXLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDO1lBQzdFLFdBQVcsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUM7WUFDL0UsV0FBVyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLGlCQUFpQixDQUFDO1lBQ3BGLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixDQUFDO1lBQ3pFLFdBQVcsQ0FBQyxPQUFPLENBQUMsMENBQTBDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQztZQUMzRyxXQUFXLENBQ1QsT0FBTyxDQUFDLDZDQUE2QyxDQUFDLElBQUksRUFDMUQsWUFBWSxDQUFDLDRCQUE0QixDQUMxQztZQUNELFdBQVcsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQztZQUMzRixXQUFXLENBQ1QsT0FBTyxDQUFDLCtDQUErQyxDQUFDLElBQUksRUFDNUQsWUFBWSxDQUFDLDRCQUE0QixDQUMxQztTQUNGLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sb0NBQW9DLENBQUMsQ0FBQztZQUN0RSxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLDBFQUEwRSxDQUFDLENBQUM7WUFDNUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFdkIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUMzQixDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQztnQkFDbEQsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQztnQkFDeEQsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDO2FBQ3hELEVBQUU7Z0JBQ1YsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUN0QixJQUFJLEVBQ0osTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUNoQyxDQUFDO2FBQ0g7WUFFRCxNQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBeUIsQ0FBQyxXQUFXLENBQ2hGLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzlDLGdCQUFnQixDQUFDLHdCQUF3QixDQUMxQyxDQUFDO1lBRUYsS0FBSyxNQUFNLFNBQVMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ25ELElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRTtvQkFBRSxTQUFTO2dCQUNsQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLFNBQVMsQ0FBQztnQkFDMUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdGO1lBRUQsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNoQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsNEJBQTRCLENBQUM7Z0JBQzNFLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsd0JBQXdCLENBQUM7Z0JBQ25FLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQzthQUN4RSxFQUFFO2dCQUNWLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzthQUNuRDtZQUNELE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3RCO1FBQ0QsS0FBSyxNQUFNLE1BQU0sSUFBSSxhQUFhLEVBQUUsRUFBRTtZQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxZQUFZLENBQUMsTUFBTSxDQUFDLHNCQUFzQixJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzRztJQUNILENBQUM7Q0FDRiJ9
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osRUFBRSxFQUNGLGVBQWUsRUFDZiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFLTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixZQUFZLEVBRVosT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFXLFlBQVksRUFBZSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJakYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUVMLDJCQUEyQixHQU01QixNQUFNLFlBQVksQ0FBQztBQUVwQjs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQW9CLEVBQW1CLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztRQUExRSxPQUFFLEdBQUYsRUFBRSxDQUFpQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQTBDO1FBSHRGLFVBQUssR0FBd0MsRUFBRSxDQUFDO1FBQ2hELGFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRTRELENBQUM7SUFFbEc7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUEwQjtRQUMxQyxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksQ0FBQyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sWUFBWSxHQUFtQixNQUFNLE9BQU8sQ0FDaEQsWUFBWSxFQUNaLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUM3QyxvQkFBb0IsQ0FDckIsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sT0FBTyxDQUNqQyxtQkFBbUIsRUFDbkIsSUFBSSxDQUFDLEVBQUUsRUFDUCxNQUFNLEVBQ04sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQzlDLHFCQUFxQixFQUNyQiwyQkFBMkIsQ0FDNUIsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFtQixNQUFNLE9BQU8sQ0FDbkQsWUFBWSxFQUNaLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQ2pELHdCQUF3QixDQUN6QixDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQW1CLE1BQU0sT0FBTyxDQUNsRCxVQUFVLEVBQ1YsSUFBSSxDQUFDLEVBQUUsRUFDUCxNQUFNLEVBQ04sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFDaEQsdUJBQXVCLENBQ3hCLENBQUM7UUFDRixNQUFNLGtCQUFrQixHQUFtQixNQUFNLE9BQU8sQ0FDdEQsWUFBWSxFQUNaLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQ3RELHdCQUF3QixDQUN6QixDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBbUIsTUFBTSxPQUFPLENBQ3RELFlBQVksRUFDWixJQUFJLENBQUMsRUFBRSxFQUNQLE1BQU0sRUFDTixHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFDM0MsMkJBQTJCLENBQzVCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFcEgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUV0Qiw0R0FBNEc7UUFDNUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25FLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBbUIsRUFBRSxJQUFrQjtRQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVE7UUFDYixPQUFPLElBQUksMEJBQTBCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLHdCQUF3QixDQUFDLE9BQXdCLEVBQUUsa0JBQTJCO1FBQ3pGLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQW9CLEVBQUUsa0JBQTJCO1FBQ3hFLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFlBQVksQ0FBQyxrQkFBMkI7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXZELE9BQU87WUFDTCxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0Isb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM5QixzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBd0IsRUFBRSxrQkFBMkI7UUFDN0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxPQUFPLDJCQUEyQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFFRCxlQUFlLENBQUMsa0JBQTJCO1FBQ3pDLE9BQU87WUFDTCxZQUFZLENBQUMsaUJBQWlCO1lBQzlCLFlBQVksQ0FBQyxjQUFjO1lBQzNCLFlBQVksQ0FBQyxhQUFhO1lBQzFCLFlBQVksQ0FBQyxzQkFBc0I7WUFDbkMsWUFBWSxDQUFDLGdCQUFnQjtZQUM3QixZQUFZLENBQUMsV0FBVztTQUN6QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FDdkIsTUFBb0IsRUFDcEIsS0FBYSxFQUNiLGtCQUEyQjtRQUUzQixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsY0FBYyxDQUN6QixNQUFvQixFQUNwQixLQUFhLEVBQ2Isa0JBQTJCO1FBRTNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFvQixFQUFFLE1BQWdCO1FBQzlELE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxNQUFNO1FBQ2pCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsUUFBUTtRQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLHFCQUFxQixDQUNoQyxNQUFxQixFQUNyQixLQUFhLEVBQ2Isa0JBQTJCO1FBVzNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FDbEcsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUN0QixNQUFxQixFQUNyQixLQUFhLEVBQ2Isa0JBQTJCO1FBRTNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FDL0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUN4QixNQUFvQixFQUNwQixLQUFhLEVBQ2Isa0JBQTJCO1FBRTNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUM5QyxPQUFPLENBQUMsQ0FBQztpQkFDVjthQUNGO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFvQyxFQUFFLElBQXVCLEVBQUUsS0FBYTtRQUNsRyxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFjO1FBQ3ZDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxXQUFXLENBS3RCLE1BQW9CLEVBQ3BCLE1BQWdCLEVBQ2hCLGFBQTRCO1FBSzVCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUF3QixDQUFDO1FBQ3ZELElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FBSSxFQUFvQjtRQUMvQyxPQUFPLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLE1BQW9CLEVBQUUsa0JBQTJCO1FBQ3BFLE1BQU0sUUFBUSxHQUFHO1lBQ2YsTUFBTTtZQUNOLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUNwRCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUM7WUFDekQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFO1NBQ3pCLENBQUM7UUFDZCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxlQUFlLENBQUMsTUFBcUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBZ0IsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssZUFBZSxDQUNyQixNQUFvQixFQUNwQixLQUFhLEVBQ2Isa0JBQTJCO1FBRTNCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGNBQWMsQ0FBSSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBb0IsRUFBRSxNQUFnQjtRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDaEU7UUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FDdkIsTUFBb0MsRUFDcEMsSUFBdUIsRUFDdkIsS0FBYTtRQUViLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUM5RDtRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLE9BQU87UUFDbkIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxTQUFTO1FBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM3QixNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQWdCO1FBQzNDLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBUSxFQUFFLE1BQW9CLEVBQUUsRUFBRTtZQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUc7WUFDakIsV0FBVyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLGFBQWEsQ0FBQztZQUM3RSxXQUFXLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDO1lBQy9FLFdBQVcsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztZQUNwRixXQUFXLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztZQUN6RSxXQUFXLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUM7WUFDM0YsV0FBVyxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQztTQUNsRixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLG9DQUFvQyxDQUFDLENBQUM7WUFDdEUsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDdEI7YUFBTTtZQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSwwRUFBMEUsQ0FBQyxDQUFDO1lBQzVHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXZCLDZCQUE2QjtZQUM3QixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQzNCLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUNsRCxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDO2dCQUN4RCxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUM7YUFDeEQsRUFBRTtnQkFDVixNQUFNLElBQUksQ0FBQyxhQUFhLENBQ3RCLElBQUksRUFDSixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQ2hDLENBQUM7YUFDSDtZQUVELHlCQUF5QjtZQUN6QixNQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBeUIsQ0FBQyxXQUFXLENBQ2hGLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzlDLGdCQUFnQixDQUFDLHdCQUF3QixDQUMxQyxDQUFDO1lBRUYsNEJBQTRCO1lBQzVCLEtBQUssTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFO2dCQUNuRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUU7b0JBQUUsU0FBUztnQkFDbEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7Z0JBQzFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM3RjtZQUVELHFEQUFxRDtZQUNyRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUzRSxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUN0QjtRQUNELEtBQUssTUFBTSxNQUFNLElBQUksYUFBYSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsWUFBWSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0c7SUFDSCxDQUFDO0NBQ0YifQ==
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@aztec/world-state",
3
- "version": "0.1.0-alpha22",
3
+ "version": "0.1.0-alpha39",
4
4
  "exports": "./dest/index.js",
5
5
  "type": "module",
6
6
  "dependencies": {
7
- "@aztec/circuits.js": "0.1.0-alpha22",
8
- "@aztec/foundation": "0.1.0-alpha22",
9
- "@aztec/merkle-tree": "0.1.0-alpha22",
10
- "@aztec/types": "0.1.0-alpha22",
7
+ "@aztec/circuits.js": "0.1.0-alpha39",
8
+ "@aztec/foundation": "0.1.0-alpha39",
9
+ "@aztec/merkle-tree": "0.1.0-alpha39",
10
+ "@aztec/types": "0.1.0-alpha39",
11
11
  "levelup": "^5.1.1",
12
+ "lodash.times": "^4.3.2",
12
13
  "memdown": "^6.1.1",
13
14
  "tslib": "^2.4.0"
14
15
  }
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './synchroniser/index.js';
2
2
  export * from './world-state-db/index.js';
3
3
  export * from './utils.js';
4
+ export * from './synchroniser/config.js';
@@ -1,6 +1,8 @@
1
- import { LeafData, MerkleTreeDb, TreeInfo, MerkleTreeOperations, CurrentCommitmentTreeRoots } from '../index.js';
2
- import { L2Block, MerkleTreeId } from '@aztec/types';
3
- import { LowLeafWitnessData, SiblingPath } from '@aztec/merkle-tree';
1
+ import { GlobalVariables } from '@aztec/circuits.js';
2
+ import { LowLeafWitnessData } from '@aztec/merkle-tree';
3
+ import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
4
+
5
+ import { CurrentTreeRoots, LeafData, MerkleTreeDb, MerkleTreeOperations, TreeInfo } from '../index.js';
4
6
 
5
7
  /**
6
8
  * Wraps a MerkleTreeDbOperations to call all functions with a preset includeUncommitted flag.
@@ -22,8 +24,8 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
22
24
  * Get the current roots of the commitment trees.
23
25
  * @returns The current roots of the trees.
24
26
  */
25
- getCommitmentTreeRoots(): CurrentCommitmentTreeRoots {
26
- return this.trees.getCommitmentTreeRoots(this.includeUncommitted);
27
+ getTreeRoots(): CurrentTreeRoots {
28
+ return this.trees.getTreeRoots(this.includeUncommitted);
27
29
  }
28
30
 
29
31
  /**
@@ -114,10 +116,11 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
114
116
  /**
115
117
  * Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE)
116
118
  * the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE).
119
+ * @param globalVariables - The current global variables to include in the block hash.
117
120
  * @returns Empty promise.
118
121
  */
119
- public updateHistoricRootsTrees(): Promise<void> {
120
- return this.trees.updateHistoricRootsTrees(this.includeUncommitted);
122
+ public updateHistoricBlocksTree(globalVariables: GlobalVariables): Promise<void> {
123
+ return this.trees.updateHistoricBlocksTree(globalVariables, this.includeUncommitted);
121
124
  }
122
125
 
123
126
  /**
@@ -5,7 +5,7 @@ export interface WorldStateConfig {
5
5
  /**
6
6
  * The frequency in which to check.
7
7
  */
8
- checkInterval: number;
8
+ worldStateBlockCheckIntervalMS: number;
9
9
 
10
10
  /**
11
11
  * Size of queue of L2 blocks to store.
@@ -18,9 +18,9 @@ export interface WorldStateConfig {
18
18
  * @returns The configuration values for the world state synchroniser.
19
19
  */
20
20
  export function getConfigEnvVars(): WorldStateConfig {
21
- const { WS_CHECK_INTERVAL, WS_L2_BLOCK_QUEUE_SIZE } = process.env;
21
+ const { WS_BLOCK_CHECK_INTERVAL_MS, WS_L2_BLOCK_QUEUE_SIZE } = process.env;
22
22
  const envVars: WorldStateConfig = {
23
- checkInterval: WS_CHECK_INTERVAL ? +WS_CHECK_INTERVAL : 100,
23
+ worldStateBlockCheckIntervalMS: WS_BLOCK_CHECK_INTERVAL_MS ? +WS_BLOCK_CHECK_INTERVAL_MS : 100,
24
24
  l2QueueSize: WS_L2_BLOCK_QUEUE_SIZE ? +WS_L2_BLOCK_QUEUE_SIZE : 1000,
25
25
  };
26
26
  return envVars;
@@ -1,24 +1,34 @@
1
1
  import {
2
2
  AppendOnlyTreeSnapshot,
3
3
  CircuitsWasm,
4
+ Fr,
4
5
  GlobalVariables,
5
6
  MAX_NEW_COMMITMENTS_PER_TX,
6
7
  MAX_NEW_CONTRACTS_PER_TX,
8
+ MAX_NEW_L2_TO_L1_MSGS_PER_CALL,
7
9
  MAX_NEW_NULLIFIERS_PER_TX,
8
10
  MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
9
- MAX_NEW_L2_TO_L1_MSGS_PER_CALL,
10
11
  NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
11
12
  } from '@aztec/circuits.js';
12
- import { INITIAL_LEAF, Pedersen, SiblingPath } from '@aztec/merkle-tree';
13
- import { ContractData, L2Block, L2BlockL2Logs, L2BlockSource, MerkleTreeId, PublicDataWrite } from '@aztec/types';
13
+ import { createDebugLogger } from '@aztec/foundation/log';
14
+ import { sleep } from '@aztec/foundation/sleep';
15
+ import { INITIAL_LEAF, Pedersen } from '@aztec/merkle-tree';
16
+ import {
17
+ ContractData,
18
+ L2Block,
19
+ L2BlockL2Logs,
20
+ L2BlockSource,
21
+ MerkleTreeId,
22
+ PublicDataWrite,
23
+ SiblingPath,
24
+ } from '@aztec/types';
25
+
14
26
  import { jest } from '@jest/globals';
27
+ import times from 'lodash.times';
28
+
15
29
  import { MerkleTreeDb } from '../index.js';
16
30
  import { ServerWorldStateSynchroniser } from './server_world_state_synchroniser.js';
17
31
  import { WorldStateRunningState } from './world_state_synchroniser.js';
18
- import { Fr } from '@aztec/foundation/fields';
19
- import { sleep } from '@aztec/foundation/sleep';
20
- import { createLogger } from '@aztec/foundation/log';
21
- import times from 'lodash.times';
22
32
 
23
33
  /**
24
34
  * Generic mock implementation.
@@ -65,19 +75,15 @@ const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) =
65
75
  startPrivateDataTreeSnapshot: getMockTreeSnapshot(),
66
76
  startNullifierTreeSnapshot: getMockTreeSnapshot(),
67
77
  startContractTreeSnapshot: getMockTreeSnapshot(),
68
- startTreeOfHistoricPrivateDataTreeRootsSnapshot: getMockTreeSnapshot(),
69
- startTreeOfHistoricContractTreeRootsSnapshot: getMockTreeSnapshot(),
70
78
  startPublicDataTreeRoot: Fr.random(),
71
79
  startL1ToL2MessageTreeSnapshot: getMockTreeSnapshot(),
72
- startTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: getMockTreeSnapshot(),
80
+ startHistoricBlocksTreeSnapshot: getMockTreeSnapshot(),
73
81
  endPrivateDataTreeSnapshot: getMockTreeSnapshot(),
74
82
  endNullifierTreeSnapshot: getMockTreeSnapshot(),
75
83
  endContractTreeSnapshot: getMockTreeSnapshot(),
76
- endTreeOfHistoricPrivateDataTreeRootsSnapshot: getMockTreeSnapshot(),
77
- endTreeOfHistoricContractTreeRootsSnapshot: getMockTreeSnapshot(),
78
84
  endPublicDataTreeRoot: Fr.random(),
79
85
  endL1ToL2MessageTreeSnapshot: getMockTreeSnapshot(),
80
- endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot: getMockTreeSnapshot(),
86
+ endHistoricBlocksTreeSnapshot: getMockTreeSnapshot(),
81
87
  newCommitments: times(MAX_NEW_COMMITMENTS_PER_TX, Fr.random),
82
88
  newNullifiers: times(MAX_NEW_NULLIFIERS_PER_TX, Fr.random),
83
89
  newContracts: newContractsCommitments?.map(x => Fr.fromBuffer(x)) ?? [Fr.random()],
@@ -93,7 +99,7 @@ const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) =
93
99
  const createSynchroniser = (merkleTreeDb: any, rollupSource: any) =>
94
100
  new ServerWorldStateSynchroniser(merkleTreeDb as MerkleTreeDb, rollupSource as L2BlockSource);
95
101
 
96
- const log = createLogger('aztec:server_world_state_synchroniser_test');
102
+ const log = createDebugLogger('aztec:server_world_state_synchroniser_test');
97
103
 
98
104
  describe('server_world_state_synchroniser', () => {
99
105
  const rollupSource: Mockify<Pick<L2BlockSource, 'getBlockHeight' | 'getL2Blocks'>> = {
@@ -116,7 +122,7 @@ describe('server_world_state_synchroniser', () => {
116
122
  SiblingPath.ZERO(32, INITIAL_LEAF, pedersen);
117
123
  }; //Promise.resolve();
118
124
  }),
119
- updateHistoricRootsTrees: jest.fn().mockImplementation(() => Promise.resolve()),
125
+ updateHistoricBlocksTree: jest.fn().mockImplementation(() => Promise.resolve()),
120
126
  commit: jest.fn().mockImplementation(() => Promise.resolve()),
121
127
  rollback: jest.fn().mockImplementation(() => Promise.resolve()),
122
128
  handleL2Block: jest.fn().mockImplementation(() => Promise.resolve()),
@@ -1,9 +1,11 @@
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ import { createDebugLogger } from '@aztec/foundation/log';
1
3
  import { L2Block, L2BlockDownloader, L2BlockSource } from '@aztec/types';
2
- import { MerkleTreeDb, MerkleTreeOperations } from '../index.js';
4
+
5
+ import { MerkleTreeDb, MerkleTreeOperations, computeGlobalVariablesHash } from '../index.js';
3
6
  import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
4
- import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js';
5
7
  import { getConfigEnvVars } from './config.js';
6
- import { createDebugLogger } from '@aztec/foundation/log';
8
+ import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js';
7
9
 
8
10
  /**
9
11
  * Synchronises the world state with the L2 blocks from a L2BlockSource.
@@ -13,6 +15,7 @@ import { createDebugLogger } from '@aztec/foundation/log';
13
15
  export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
14
16
  private currentL2BlockNum = 0;
15
17
  private latestBlockNumberAtStart = 0;
18
+
16
19
  private l2BlockDownloader: L2BlockDownloader;
17
20
  private syncPromise: Promise<void> = Promise.resolve();
18
21
  private syncResolve?: () => void = undefined;
@@ -20,35 +23,30 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
20
23
  private runningPromise: Promise<void> = Promise.resolve();
21
24
  private currentState: WorldStateRunningState = WorldStateRunningState.IDLE;
22
25
 
26
+ /** The latest Global Variables hash for the HEAD of the chain. */
27
+ public latestGlobalVariablesHash: Fr = Fr.ZERO;
28
+
23
29
  constructor(
24
30
  private merkleTreeDb: MerkleTreeDb,
25
31
  private l2BlockSource: L2BlockSource,
26
32
  private log = createDebugLogger('aztec:world_state'),
27
33
  ) {
28
34
  const config = getConfigEnvVars();
29
- this.l2BlockDownloader = new L2BlockDownloader(l2BlockSource, config.l2QueueSize, config.checkInterval);
35
+ this.l2BlockDownloader = new L2BlockDownloader(
36
+ l2BlockSource,
37
+ config.l2QueueSize,
38
+ config.worldStateBlockCheckIntervalMS,
39
+ );
30
40
  }
31
41
 
32
- /**
33
- * Returns an instance of MerkleTreeOperations that will include uncommitted data.
34
- * @returns An instance of MerkleTreeOperations that will include uncommitted data.
35
- */
36
42
  public getLatest(): MerkleTreeOperations {
37
43
  return new MerkleTreeOperationsFacade(this.merkleTreeDb, true);
38
44
  }
39
45
 
40
- /**
41
- * Returns an instance of MerkleTreeOperations that will not include uncommitted data.
42
- * @returns An instance of MerkleTreeOperations that will not include uncommitted data.
43
- */
44
46
  public getCommitted(): MerkleTreeOperations {
45
47
  return new MerkleTreeOperationsFacade(this.merkleTreeDb, false);
46
48
  }
47
49
 
48
- /**
49
- * Starts the synchroniser.
50
- * @returns A promise that resolves once the initial sync is completed.
51
- */
52
50
  public async start() {
53
51
  if (this.currentState === WorldStateRunningState.STOPPED) {
54
52
  throw new Error('Synchroniser already stopped');
@@ -59,6 +57,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
59
57
 
60
58
  // get the current latest block number
61
59
  this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockHeight();
60
+ this.latestGlobalVariablesHash = await computeGlobalVariablesHash();
62
61
 
63
62
  const blockToDownloadFrom = this.currentL2BlockNum + 1;
64
63
 
@@ -89,9 +88,6 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
89
88
  return this.syncPromise;
90
89
  }
91
90
 
92
- /**
93
- * Stops the synchroniser.
94
- */
95
91
  public async stop() {
96
92
  this.log('Stopping world state...');
97
93
  this.stopping = true;
@@ -100,10 +96,6 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
100
96
  this.setCurrentState(WorldStateRunningState.STOPPED);
101
97
  }
102
98
 
103
- /**
104
- * Returns the current status of the synchroniser.
105
- * @returns The current status of the synchroniser.
106
- */
107
99
  public status(): Promise<WorldStateStatus> {
108
100
  const status = {
109
101
  syncedToL2Block: this.currentL2BlockNum,
@@ -129,6 +121,8 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
129
121
  private async handleL2Block(l2Block: L2Block) {
130
122
  await this.merkleTreeDb.handleL2Block(l2Block);
131
123
  this.currentL2BlockNum = l2Block.number;
124
+ this.latestGlobalVariablesHash = await computeGlobalVariablesHash(l2Block.globalVariables);
125
+ this.log(`Synced global variables with hash ${this.latestGlobalVariablesHash.toString()}`);
132
126
  if (
133
127
  this.currentState === WorldStateRunningState.SYNCHING &&
134
128
  this.currentL2BlockNum >= this.latestBlockNumberAtStart
@@ -1,3 +1,5 @@
1
+ import { Fr } from '@aztec/circuits.js';
2
+
1
3
  import { MerkleTreeOperations } from '../index.js';
2
4
 
3
5
  /**
@@ -28,9 +30,37 @@ export interface WorldStateStatus {
28
30
  * Defines the interface for a world state synchroniser.
29
31
  */
30
32
  export interface WorldStateSynchroniser {
33
+ /**
34
+ * Starts the synchroniser.
35
+ * @returns A promise that resolves once the initial sync is completed.
36
+ */
31
37
  start(): void;
38
+
39
+ /**
40
+ * Returns the current status of the synchroniser.
41
+ * @returns The current status of the synchroniser.
42
+ */
32
43
  status(): Promise<WorldStateStatus>;
44
+
45
+ /**
46
+ * Stops the synchroniser.
47
+ */
33
48
  stop(): Promise<void>;
49
+
50
+ /**
51
+ * Returns an instance of MerkleTreeOperations that will include uncommitted data.
52
+ * @returns An instance of MerkleTreeOperations that will include uncommitted data.
53
+ */
34
54
  getLatest(): MerkleTreeOperations;
55
+
56
+ /**
57
+ * Returns an instance of MerkleTreeOperations that will not include uncommitted data.
58
+ * @returns An instance of MerkleTreeOperations that will not include uncommitted data.
59
+ */
35
60
  getCommitted(): MerkleTreeOperations;
61
+
62
+ /**
63
+ * The latest Global Variables hash for the HEAD of the chain.
64
+ */
65
+ latestGlobalVariablesHash: Fr;
36
66
  }
package/src/utils.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { GeneratorIndex } from '@aztec/circuits.js';
1
+ import { CircuitsWasm, GeneratorIndex, GlobalVariables } from '@aztec/circuits.js';
2
+ import { computeGlobalsHash } from '@aztec/circuits.js/abis';
2
3
  import { pedersenCompressWithHashIndex } from '@aztec/circuits.js/barretenberg';
3
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
4
5
  import { Fr } from '@aztec/foundation/fields';
5
6
  import { toBigInt } from '@aztec/foundation/serialize';
6
-
7
7
  import { IWasmModule } from '@aztec/foundation/wasm';
8
8
 
9
9
  /**
@@ -22,3 +22,14 @@ export function computePublicDataTreeLeafIndex(contract: AztecAddress, slot: Fr,
22
22
  ),
23
23
  );
24
24
  }
25
+
26
+ /**
27
+ * Computes the hash of the global variables.
28
+ * @returns The hash of the global variables.
29
+ */
30
+ export async function computeGlobalVariablesHash(
31
+ globalVariables: GlobalVariables = GlobalVariables.empty(),
32
+ ): Promise<Fr> {
33
+ const wasm = await CircuitsWasm.get();
34
+ return computeGlobalsHash(wasm, globalVariables);
35
+ }
@@ -1,7 +1,7 @@
1
- import { LeafData, SiblingPath, LowLeafWitnessData } from '@aztec/merkle-tree';
2
- import { L2Block, MerkleTreeId } from '@aztec/types';
1
+ import { GlobalVariables, MAX_NEW_NULLIFIERS_PER_TX } from '@aztec/circuits.js';
3
2
  import { createDebugLogger } from '@aztec/foundation/log';
4
- import { MAX_NEW_NULLIFIERS_PER_TX } from '@aztec/circuits.js';
3
+ import { LeafData, LowLeafWitnessData } from '@aztec/merkle-tree';
4
+ import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
5
5
 
6
6
  export * from './merkle_trees.js';
7
7
  export { LeafData } from '@aztec/merkle-tree';
@@ -66,7 +66,7 @@ type WithIncludeUncommitted<F> = F extends (...args: [...infer Rest]) => infer R
66
66
  /**
67
67
  * The current roots of the commitment trees
68
68
  */
69
- export type CurrentCommitmentTreeRoots = {
69
+ export type CurrentTreeRoots = {
70
70
  /** Private data tree root. */
71
71
  privateDataTreeRoot: Buffer;
72
72
  /** Contract data tree root. */
@@ -75,6 +75,10 @@ export type CurrentCommitmentTreeRoots = {
75
75
  l1Tol2MessagesTreeRoot: Buffer;
76
76
  /** Nullifier data tree root. */
77
77
  nullifierTreeRoot: Buffer;
78
+ /** Blocks tree root. */
79
+ blocksTreeRoot: Buffer;
80
+ /** Public data tree root */
81
+ publicDataTreeRoot: Buffer;
78
82
  };
79
83
 
80
84
  /**
@@ -111,7 +115,7 @@ export interface MerkleTreeOperations {
111
115
  /**
112
116
  * Gets the current roots of the commitment trees.
113
117
  */
114
- getCommitmentTreeRoots(): CurrentCommitmentTreeRoots;
118
+ getTreeRoots(): CurrentTreeRoots;
115
119
 
116
120
  /**
117
121
  * Gets sibling path for a leaf.
@@ -169,10 +173,11 @@ export interface MerkleTreeOperations {
169
173
  getLeafValue(treeId: MerkleTreeId, index: bigint): Promise<Buffer | undefined>;
170
174
 
171
175
  /**
172
- * Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE, L1_TO_L2_MESSAGES_TREE_ROOTS_TREE)
173
- * the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE, L1_TO_L2_MESSAGES_TREE).
176
+ * Inserts the new block hash into the new block hashes tree.
177
+ * This includes all of the current roots of all of the data trees and the current blocks global vars.
178
+ * @param globalVariables - The global variables to insert into the block hash.
174
179
  */
175
- updateHistoricRootsTrees(): Promise<void>;
180
+ updateHistoricBlocksTree(globalVariables: GlobalVariables): Promise<void>;
176
181
 
177
182
  /**
178
183
  * Batch insert multiple leaves into the tree.