@aztec/sequencer-client 0.76.4 → 0.77.0-testnet-ignition.21

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 (87) hide show
  1. package/dest/client/index.js +0 -1
  2. package/dest/client/sequencer-client.d.ts +12 -9
  3. package/dest/client/sequencer-client.d.ts.map +1 -1
  4. package/dest/client/sequencer-client.js +55 -60
  5. package/dest/config.d.ts +2 -2
  6. package/dest/config.d.ts.map +1 -1
  7. package/dest/config.js +41 -46
  8. package/dest/global_variable_builder/global_builder.d.ts +5 -2
  9. package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
  10. package/dest/global_variable_builder/global_builder.js +45 -31
  11. package/dest/global_variable_builder/index.js +0 -1
  12. package/dest/index.js +0 -1
  13. package/dest/publisher/config.d.ts.map +1 -1
  14. package/dest/publisher/config.js +33 -48
  15. package/dest/publisher/index.js +0 -1
  16. package/dest/publisher/sequencer-publisher-metrics.d.ts +5 -2
  17. package/dest/publisher/sequencer-publisher-metrics.d.ts.map +1 -1
  18. package/dest/publisher/sequencer-publisher-metrics.js +47 -23
  19. package/dest/publisher/sequencer-publisher.d.ts +10 -9
  20. package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
  21. package/dest/publisher/sequencer-publisher.js +191 -160
  22. package/dest/sequencer/allowed.d.ts +1 -1
  23. package/dest/sequencer/allowed.d.ts.map +1 -1
  24. package/dest/sequencer/allowed.js +6 -13
  25. package/dest/sequencer/config.d.ts +1 -1
  26. package/dest/sequencer/config.d.ts.map +1 -1
  27. package/dest/sequencer/config.js +1 -2
  28. package/dest/sequencer/index.js +0 -1
  29. package/dest/sequencer/metrics.js +26 -18
  30. package/dest/sequencer/sequencer.d.ts +18 -12
  31. package/dest/sequencer/sequencer.d.ts.map +1 -1
  32. package/dest/sequencer/sequencer.js +589 -560
  33. package/dest/sequencer/timetable.d.ts +1 -1
  34. package/dest/sequencer/timetable.d.ts.map +1 -1
  35. package/dest/sequencer/timetable.js +33 -19
  36. package/dest/sequencer/utils.d.ts +2 -2
  37. package/dest/sequencer/utils.d.ts.map +1 -1
  38. package/dest/sequencer/utils.js +22 -32
  39. package/dest/slasher/factory.d.ts +4 -8
  40. package/dest/slasher/factory.d.ts.map +1 -1
  41. package/dest/slasher/factory.js +5 -7
  42. package/dest/slasher/index.js +0 -1
  43. package/dest/slasher/slasher_client.d.ts +10 -62
  44. package/dest/slasher/slasher_client.d.ts.map +1 -1
  45. package/dest/slasher/slasher_client.js +47 -231
  46. package/dest/test/index.d.ts +3 -3
  47. package/dest/test/index.d.ts.map +1 -1
  48. package/dest/test/index.js +4 -1
  49. package/dest/tx_validator/archive_cache.d.ts +3 -3
  50. package/dest/tx_validator/archive_cache.d.ts.map +1 -1
  51. package/dest/tx_validator/archive_cache.js +8 -8
  52. package/dest/tx_validator/gas_validator.d.ts +5 -3
  53. package/dest/tx_validator/gas_validator.d.ts.map +1 -1
  54. package/dest/tx_validator/gas_validator.js +70 -70
  55. package/dest/tx_validator/nullifier_cache.d.ts +2 -2
  56. package/dest/tx_validator/nullifier_cache.d.ts.map +1 -1
  57. package/dest/tx_validator/nullifier_cache.js +9 -9
  58. package/dest/tx_validator/phases_validator.d.ts +3 -2
  59. package/dest/tx_validator/phases_validator.d.ts.map +1 -1
  60. package/dest/tx_validator/phases_validator.js +29 -21
  61. package/dest/tx_validator/test_utils.d.ts +4 -2
  62. package/dest/tx_validator/test_utils.d.ts.map +1 -1
  63. package/dest/tx_validator/test_utils.js +2 -3
  64. package/dest/tx_validator/tx_validator_factory.d.ts +7 -5
  65. package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
  66. package/dest/tx_validator/tx_validator_factory.js +14 -13
  67. package/package.json +28 -29
  68. package/src/client/sequencer-client.ts +17 -14
  69. package/src/config.ts +6 -14
  70. package/src/global_variable_builder/global_builder.ts +18 -19
  71. package/src/publisher/config.ts +9 -17
  72. package/src/publisher/sequencer-publisher-metrics.ts +23 -2
  73. package/src/publisher/sequencer-publisher.ts +15 -17
  74. package/src/sequencer/allowed.ts +4 -4
  75. package/src/sequencer/config.ts +1 -1
  76. package/src/sequencer/sequencer.ts +40 -35
  77. package/src/sequencer/timetable.ts +1 -1
  78. package/src/sequencer/utils.ts +2 -2
  79. package/src/slasher/factory.ts +7 -13
  80. package/src/slasher/slasher_client.ts +30 -252
  81. package/src/test/index.ts +3 -3
  82. package/src/tx_validator/archive_cache.ts +4 -3
  83. package/src/tx_validator/gas_validator.ts +22 -31
  84. package/src/tx_validator/nullifier_cache.ts +3 -2
  85. package/src/tx_validator/phases_validator.ts +8 -8
  86. package/src/tx_validator/test_utils.ts +5 -3
  87. package/src/tx_validator/tx_validator_factory.ts +23 -17
@@ -1,21 +1,18 @@
1
- import { L2BlockStream, } from '@aztec/circuit-types';
2
- import { INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js/constants';
3
1
  import { createEthereumChain } from '@aztec/ethereum';
4
2
  import { EthAddress } from '@aztec/foundation/eth-address';
5
3
  import { createLogger } from '@aztec/foundation/log';
6
4
  import { SlashFactoryAbi } from '@aztec/l1-artifacts';
5
+ import { L2BlockSourceEvents } from '@aztec/stdlib/block';
7
6
  import { WithTracer, getTelemetryClient } from '@aztec/telemetry-client';
8
- import { createPublicClient, getAddress, getContract, http, } from 'viem';
7
+ import { createPublicClient, fallback, getAddress, getContract, http } from 'viem';
9
8
  /**
10
9
  * Enum defining the possible states of the Slasher client.
11
- */
12
- export var SlasherClientState;
13
- (function (SlasherClientState) {
10
+ */ export var SlasherClientState = /*#__PURE__*/ function(SlasherClientState) {
14
11
  SlasherClientState[SlasherClientState["IDLE"] = 0] = "IDLE";
15
- SlasherClientState[SlasherClientState["SYNCHING"] = 1] = "SYNCHING";
16
- SlasherClientState[SlasherClientState["RUNNING"] = 2] = "RUNNING";
17
- SlasherClientState[SlasherClientState["STOPPED"] = 3] = "STOPPED";
18
- })(SlasherClientState || (SlasherClientState = {}));
12
+ SlasherClientState[SlasherClientState["RUNNING"] = 1] = "RUNNING";
13
+ SlasherClientState[SlasherClientState["STOPPED"] = 2] = "STOPPED";
14
+ return SlasherClientState;
15
+ }({});
19
16
  /**
20
17
  * @notice A Hypomeiones slasher client implementation
21
18
  *
@@ -40,50 +37,39 @@ export var SlasherClientState;
40
37
  * - Decide how to deal with multiple slashing events in the same round.
41
38
  * - This could be that multiple epochs are pruned in the same round, but with the current naive implementation we could end up
42
39
  * slashing only the first, because the "lifetime" of the second would have passed after that vote
43
- */
44
- export class SlasherClient extends WithTracer {
45
- constructor(config, store, l2BlockSource, telemetry = getTelemetryClient(), log = createLogger('slasher')) {
46
- super(telemetry, 'slasher');
47
- this.config = config;
48
- this.store = store;
49
- this.l2BlockSource = l2BlockSource;
50
- this.log = log;
51
- this.currentState = SlasherClientState.IDLE;
52
- this.syncPromise = Promise.resolve();
53
- this.syncResolve = undefined;
54
- this.latestBlockNumberAtStart = -1;
55
- this.provenBlockNumberAtStart = -1;
56
- this.slashEvents = [];
57
- this.slashFactoryContract = undefined;
58
- // The amount to slash for a prune.
59
- // Note that we set it to 0, such that no actual slashing will happen, but the event will be fired,
60
- // showing that the slashing mechanism is working.
61
- this.slashingAmount = 0n;
62
- this.blockStream = new L2BlockStream(l2BlockSource, this, this, createLogger('slasher:block_stream'), {
63
- batchSize: config.blockRequestBatchSize,
64
- pollIntervalMS: config.blockCheckIntervalMS,
65
- });
66
- this.synchedBlockHashes = store.openMap('slasher_block_hashes');
67
- this.synchedLatestBlockNumber = store.openSingleton('slasher_last_l2_block');
68
- this.synchedProvenBlockNumber = store.openSingleton('slasher_last_proven_l2_block');
40
+ */ export class SlasherClient extends WithTracer {
41
+ config;
42
+ l2BlockSource;
43
+ log;
44
+ slashEvents;
45
+ slashFactoryContract;
46
+ // The amount to slash for a prune.
47
+ // Note that we set it to 0, such that no actual slashing will happen, but the event will be fired,
48
+ // showing that the slashing mechanism is working.
49
+ slashingAmount;
50
+ constructor(config, l2BlockSource, telemetry = getTelemetryClient(), log = createLogger('slasher')){
51
+ super(telemetry, 'slasher'), this.config = config, this.l2BlockSource = l2BlockSource, this.log = log, this.slashEvents = [], this.slashFactoryContract = undefined, this.slashingAmount = 0n;
69
52
  if (config.l1Contracts.slashFactoryAddress && config.l1Contracts.slashFactoryAddress !== EthAddress.ZERO) {
70
- const chain = createEthereumChain(config.l1RpcUrl, config.l1ChainId);
53
+ const chain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
71
54
  const publicClient = createPublicClient({
72
55
  chain: chain.chainInfo,
73
- transport: http(chain.rpcUrl),
74
- pollingInterval: config.viemPollingIntervalMS,
56
+ transport: fallback(chain.rpcUrls.map((url)=>http(url))),
57
+ pollingInterval: config.viemPollingIntervalMS
75
58
  });
76
59
  this.slashFactoryContract = getContract({
77
60
  address: getAddress(config.l1Contracts.slashFactoryAddress.toString()),
78
61
  abi: SlashFactoryAbi,
79
- client: publicClient,
62
+ client: publicClient
80
63
  });
81
- }
82
- else {
64
+ } else {
83
65
  this.log.warn('No slash factory address found, slashing will not be enabled');
84
66
  }
85
67
  this.log.info(`Slasher client initialized`);
86
68
  }
69
+ start() {
70
+ this.log.info('Starting Slasher client...');
71
+ this.l2BlockSource.on(L2BlockSourceEvents.L2PruneDetected, this.handlePruneL2Blocks.bind(this));
72
+ }
87
73
  // This is where we should put a bunch of the improvements mentioned earlier.
88
74
  async getSlashPayload(slotNumber) {
89
75
  if (!this.slashFactoryContract) {
@@ -91,7 +77,7 @@ export class SlasherClient extends WithTracer {
91
77
  }
92
78
  // As long as the slot is greater than the lifetime, we want to keep deleting the first element
93
79
  // since it will not make sense to include anymore.
94
- while (this.slashEvents.length > 0 && this.slashEvents[0].lifetime < slotNumber) {
80
+ while(this.slashEvents.length > 0 && this.slashEvents[0].lifetime < slotNumber){
95
81
  this.slashEvents.shift();
96
82
  }
97
83
  if (this.slashEvents.length == 0) {
@@ -100,7 +86,7 @@ export class SlasherClient extends WithTracer {
100
86
  const slashEvent = this.slashEvents[0];
101
87
  const [payloadAddress, isDeployed] = await this.slashFactoryContract.read.getAddressAndIsDeployed([
102
88
  slashEvent.epoch,
103
- slashEvent.amount,
89
+ slashEvent.amount
104
90
  ]);
105
91
  if (!isDeployed) {
106
92
  // The proposal cannot be executed until it is deployed
@@ -108,175 +94,30 @@ export class SlasherClient extends WithTracer {
108
94
  }
109
95
  return EthAddress.fromString(payloadAddress);
110
96
  }
111
- getL2BlockHash(number) {
112
- return this.synchedBlockHashes.getAsync(number);
113
- }
114
- async getL2Tips() {
115
- const latestBlockNumber = await this.getSyncedLatestBlockNum();
116
- let latestBlockHash;
117
- const provenBlockNumber = await this.getSyncedProvenBlockNum();
118
- let provenBlockHash;
119
- if (latestBlockNumber > 0) {
120
- latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
121
- if (typeof latestBlockHash === 'undefined') {
122
- this.log.warn(`Block hash for latest block ${latestBlockNumber} not found`);
123
- throw new Error();
124
- }
125
- }
126
- if (provenBlockNumber > 0) {
127
- provenBlockHash = await this.synchedBlockHashes.getAsync(provenBlockNumber);
128
- if (typeof provenBlockHash === 'undefined') {
129
- this.log.warn(`Block hash for proven block ${provenBlockNumber} not found`);
130
- throw new Error();
131
- }
132
- }
133
- return Promise.resolve({
134
- latest: { hash: latestBlockHash, number: latestBlockNumber },
135
- proven: { hash: provenBlockHash, number: provenBlockNumber },
136
- finalized: { hash: provenBlockHash, number: provenBlockNumber },
137
- });
138
- }
139
- async handleBlockStreamEvent(event) {
97
+ handleBlockStreamEvent(event) {
140
98
  this.log.debug(`Handling block stream event ${event.type}`);
141
- switch (event.type) {
142
- case 'blocks-added':
143
- await this.handleLatestL2Blocks(event.blocks);
144
- break;
145
- case 'chain-finalized':
146
- // TODO (alexg): I think we can prune the block hashes map here
147
- break;
148
- case 'chain-proven': {
149
- const from = (await this.getSyncedProvenBlockNum()) + 1;
150
- const limit = event.blockNumber - from + 1;
151
- await this.handleProvenL2Blocks(await this.l2BlockSource.getBlocks(from, limit));
99
+ switch(event.type){
100
+ case L2BlockSourceEvents.L2PruneDetected:
101
+ this.handlePruneL2Blocks(event);
152
102
  break;
153
- }
154
- case 'chain-pruned':
155
- await this.handlePruneL2Blocks(event.blockNumber);
156
- break;
157
- default: {
158
- const _ = event;
159
- break;
160
- }
161
- }
162
- }
163
- async start() {
164
- if (this.currentState === SlasherClientState.STOPPED) {
165
- throw new Error('Slasher already stopped');
166
- }
167
- if (this.currentState !== SlasherClientState.IDLE) {
168
- return this.syncPromise;
103
+ default:
104
+ {
105
+ break;
106
+ }
169
107
  }
170
- // get the current latest block numbers
171
- this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockNumber();
172
- this.provenBlockNumberAtStart = await this.l2BlockSource.getProvenBlockNumber();
173
- const syncedLatestBlock = (await this.getSyncedLatestBlockNum()) + 1;
174
- const syncedProvenBlock = (await this.getSyncedProvenBlockNum()) + 1;
175
- // if there are blocks to be retrieved, go to a synching state
176
- if (syncedLatestBlock <= this.latestBlockNumberAtStart || syncedProvenBlock <= this.provenBlockNumberAtStart) {
177
- this.setCurrentState(SlasherClientState.SYNCHING);
178
- this.syncPromise = new Promise(resolve => {
179
- this.syncResolve = resolve;
180
- });
181
- this.log.verbose(`Starting sync from ${syncedLatestBlock} (last proven ${syncedProvenBlock})`);
182
- }
183
- else {
184
- // if no blocks to be retrieved, go straight to running
185
- this.setCurrentState(SlasherClientState.RUNNING);
186
- this.syncPromise = Promise.resolve();
187
- this.log.verbose(`Block ${syncedLatestBlock} (proven ${syncedProvenBlock}) already beyond current block`);
188
- }
189
- this.blockStream.start();
190
- this.log.verbose(`Started block downloader from block ${syncedLatestBlock}`);
191
- return this.syncPromise;
108
+ return Promise.resolve();
192
109
  }
193
110
  /**
194
- * Allows consumers to stop the instance of the slasher client.
195
- * 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
196
- */
197
- async stop() {
111
+ * Allows consumers to stop the instance of the slasher client.
112
+ * 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
113
+ */ stop() {
198
114
  this.log.debug('Stopping Slasher client...');
199
- await this.blockStream.stop();
200
- this.log.debug('Stopped block downloader');
201
- await this.store.close();
202
- this.log.debug('Stopped slasher store');
203
- this.setCurrentState(SlasherClientState.STOPPED);
115
+ this.l2BlockSource.removeListener(L2BlockSourceEvents.L2PruneDetected, this.handlePruneL2Blocks.bind(this));
204
116
  this.log.info('Slasher client stopped.');
205
117
  }
206
- /**
207
- * Public function to check if the slasher client is fully synced and ready to receive txs.
208
- * @returns True if the slasher client is ready to receive txs.
209
- */
210
- isReady() {
211
- return this.currentState === SlasherClientState.RUNNING;
212
- }
213
- /**
214
- * Public function to check the latest block number that the slasher client is synced to.
215
- * @returns Block number of latest L2 Block we've synced with.
216
- */
217
- async getSyncedLatestBlockNum() {
218
- return (await this.synchedLatestBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
219
- }
220
- /**
221
- * Public function to check the latest proven block number that the slasher client is synced to.
222
- * @returns Block number of latest proven L2 Block we've synced with.
223
- */
224
- async getSyncedProvenBlockNum() {
225
- return (await this.synchedProvenBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
226
- }
227
- /**
228
- * Method to check the status of the slasher client.
229
- * @returns Information about slasher client status: state & syncedToBlockNum.
230
- */
231
- async getStatus() {
232
- const blockNumber = await this.getSyncedLatestBlockNum();
233
- const blockHash = blockNumber == 0
234
- ? ''
235
- : await this.l2BlockSource
236
- .getBlockHeader(blockNumber)
237
- .then(header => header?.hash())
238
- .then(hash => hash?.toString());
239
- return Promise.resolve({
240
- state: this.currentState,
241
- syncedToL2Block: { number: blockNumber, hash: blockHash },
242
- });
243
- }
244
- /**
245
- * Handles new blocks
246
- * @param blocks - A list of blocks that the slasher client needs to store block hashes for
247
- * @returns Empty promise.
248
- */
249
- async handleLatestL2Blocks(blocks) {
250
- if (!blocks.length) {
251
- return;
252
- }
253
- await this.store.transactionAsync(async () => {
254
- for (const block of blocks) {
255
- await this.synchedBlockHashes.set(block.number, (await block.hash()).toString());
256
- }
257
- const lastBlockNum = blocks[blocks.length - 1].number;
258
- await this.synchedLatestBlockNumber.set(lastBlockNum);
259
- });
260
- await this.startServiceIfSynched();
261
- }
262
- /**
263
- * Handles new proven blocks by updating the proven block number
264
- * @param blocks - A list of proven L2 blocks.
265
- * @returns Empty promise.
266
- */
267
- async handleProvenL2Blocks(blocks) {
268
- if (!blocks.length) {
269
- return Promise.resolve();
270
- }
271
- const lastBlockNum = blocks[blocks.length - 1].number;
272
- await this.synchedProvenBlockNumber.set(lastBlockNum);
273
- this.log.debug(`Synched to proven block ${lastBlockNum}`);
274
- await this.startServiceIfSynched();
275
- }
276
- async handlePruneL2Blocks(latestBlock) {
277
- const blockHeader = await this.l2BlockSource.getBlockHeader(latestBlock);
278
- const slotNumber = blockHeader ? blockHeader.globalVariables.slotNumber.toBigInt() : BigInt(0);
279
- const epochNumber = slotNumber / BigInt(this.config.aztecEpochDuration);
118
+ // I need to get the slot number from the block that was just pruned
119
+ handlePruneL2Blocks(event) {
120
+ const { slotNumber, epochNumber } = event;
280
121
  this.log.info(`Detected chain prune. Punishing the validators at epoch ${epochNumber}`);
281
122
  // Set the lifetime such that we have a full round that we could vote throughout.
282
123
  const slotsIntoRound = slotNumber % BigInt(this.config.slashingRoundSize);
@@ -285,32 +126,7 @@ export class SlasherClient extends WithTracer {
285
126
  this.slashEvents.push({
286
127
  epoch: epochNumber,
287
128
  amount: this.slashingAmount,
288
- lifetime,
129
+ lifetime
289
130
  });
290
- await this.synchedLatestBlockNumber.set(latestBlock);
291
- }
292
- async startServiceIfSynched() {
293
- const [latestBlock, provenBlock] = await Promise.all([
294
- this.getSyncedLatestBlockNum(),
295
- this.getSyncedProvenBlockNum(),
296
- ]);
297
- if (this.currentState === SlasherClientState.SYNCHING &&
298
- latestBlock >= this.latestBlockNumberAtStart &&
299
- provenBlock >= this.provenBlockNumberAtStart) {
300
- this.log.debug(`Synched to blocks at start`);
301
- this.setCurrentState(SlasherClientState.RUNNING);
302
- if (this.syncResolve !== undefined) {
303
- this.syncResolve();
304
- }
305
- }
306
- }
307
- /**
308
- * Method to set the value of the current state.
309
- * @param newState - New state value.
310
- */
311
- setCurrentState(newState) {
312
- this.currentState = newState;
313
- this.log.debug(`Moved to state ${SlasherClientState[this.currentState]}`);
314
131
  }
315
132
  }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUErQyxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBd0IsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFL0YsT0FBTyxFQUtMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QiwyREFBSSxDQUFBO0lBQ0osbUVBQVEsQ0FBQTtJQUNSLGlFQUFPLENBQUE7SUFDUCxpRUFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUxXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLN0I7QUEyQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsVUFBVTtJQXVCM0MsWUFDVSxNQUEwRCxFQUMxRCxLQUF3QixFQUN4QixhQUE0QixFQUNwQyxZQUE2QixrQkFBa0IsRUFBRSxFQUN6QyxNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFFckMsS0FBSyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQU5wQixXQUFNLEdBQU4sTUFBTSxDQUFvRDtRQUMxRCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUU1QixRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQTNCL0IsaUJBQVksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7UUFDdkMsZ0JBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBZ0IsU0FBUyxDQUFDO1FBQ3JDLDZCQUF3QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlCLDZCQUF3QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBUTlCLGdCQUFXLEdBQWlCLEVBQUUsQ0FBQztRQUU3Qix5QkFBb0IsR0FDNUIsU0FBUyxDQUFDO1FBRVosbUNBQW1DO1FBQ25DLG1HQUFtRztRQUNuRyxrREFBa0Q7UUFDMUMsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFXbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUNwRyxTQUFTLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjtZQUN2QyxjQUFjLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjtTQUM1QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUVwRixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekcsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckUsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDdEIsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUM3QixlQUFlLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjthQUM5QyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxDQUFDO2dCQUN0QyxPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxlQUFlO2dCQUNwQixNQUFNLEVBQUUsWUFBWTthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELDZFQUE2RTtJQUN0RSxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQWtCO1FBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsK0ZBQStGO1FBQy9GLG1EQUFtRDtRQUNuRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ2hHLFVBQVUsQ0FBQyxLQUFLO1lBQ2hCLFVBQVUsQ0FBQyxNQUFNO1NBQ2xCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQix1REFBdUQ7WUFDdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sY0FBYyxDQUFDLE1BQWM7UUFDbEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUztRQUNwQixNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0QsSUFBSSxlQUFtQyxDQUFDO1FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvRCxJQUFJLGVBQW1DLENBQUM7UUFFeEMsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUUsSUFBSSxPQUFPLGVBQWUsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsK0JBQStCLGlCQUFpQixZQUFZLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUUsSUFBSSxPQUFPLGVBQWUsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsK0JBQStCLGlCQUFpQixZQUFZLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxlQUFnQixFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRTtZQUM3RCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZ0IsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUU7WUFDN0QsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWdCLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFO1NBQ2pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsS0FBeUI7UUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsK0JBQStCLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVELFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLEtBQUssY0FBYztnQkFDakIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5QyxNQUFNO1lBQ1IsS0FBSyxpQkFBaUI7Z0JBQ3BCLCtEQUErRDtnQkFDL0QsTUFBTTtZQUNSLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxjQUFjO2dCQUNqQixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2xELE1BQU07WUFDUixPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxHQUFVLEtBQUssQ0FBQztnQkFDdkIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUVELHVDQUF1QztRQUN2QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUVoRixNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyRSw4REFBOEQ7UUFDOUQsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksaUJBQWlCLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDN0csSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHNCQUFzQixpQkFBaUIsaUJBQWlCLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUNqRyxDQUFDO2FBQU0sQ0FBQztZQUNOLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsaUJBQWlCLFlBQVksaUJBQWlCLGdDQUFnQyxDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUU3RSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUMzQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssa0JBQWtCLENBQUMsT0FBTyxDQUFDO0lBQzFELENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsdUJBQXVCO1FBQ2xDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLHVCQUF1QjtRQUNsQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQ2IsV0FBVyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhO2lCQUNyQixjQUFjLENBQUMsV0FBVyxDQUFDO2lCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDeEIsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1NBQ3RDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFpQjtRQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzNDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLENBQUM7WUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDdEQsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFpQjtRQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdEQsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBRTFELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFtQjtRQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixNQUFNLFdBQVcsR0FBRyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQywyREFBMkQsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUV4RixpRkFBaUY7UUFDakYsTUFBTSxjQUFjLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUUsTUFBTSxNQUFNLEdBQUcsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLGNBQWMsQ0FBQztRQUVsRyxNQUFNLFFBQVEsR0FBRyxVQUFVLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFN0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsS0FBSyxFQUFFLFdBQVc7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQzNCLFFBQVE7U0FDVCxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUI7UUFDakMsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDbkQsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzlCLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtTQUMvQixDQUFDLENBQUM7UUFDSCxJQUNFLElBQUksQ0FBQyxZQUFZLEtBQUssa0JBQWtCLENBQUMsUUFBUTtZQUNqRCxXQUFXLElBQUksSUFBSSxDQUFDLHdCQUF3QjtZQUM1QyxXQUFXLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUM1QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGVBQWUsQ0FBQyxRQUE0QjtRQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0NBQ0YifQ==
@@ -1,8 +1,8 @@
1
- import { type PublicProcessorFactory } from '@aztec/simulator/server';
1
+ import type { PublicProcessorFactory } from '@aztec/simulator/server';
2
2
  import { SequencerClient } from '../client/sequencer-client.js';
3
- import { type SequencerPublisher } from '../publisher/sequencer-publisher.js';
3
+ import type { SequencerPublisher } from '../publisher/sequencer-publisher.js';
4
4
  import { Sequencer } from '../sequencer/sequencer.js';
5
- import { type SequencerTimetable } from '../sequencer/timetable.js';
5
+ import type { SequencerTimetable } from '../sequencer/timetable.js';
6
6
  declare class TestSequencer_ extends Sequencer {
7
7
  publicProcessorFactory: PublicProcessorFactory;
8
8
  timetable: SequencerTimetable;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,cAAM,cAAe,SAAQ,SAAS;IACpB,sBAAsB,EAAG,sBAAsB,CAAC;IAChD,SAAS,EAAG,kBAAkB,CAAC;IAC/B,SAAS,EAAG,kBAAkB,CAAC;CAChD;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC;AAE3C,cAAM,oBAAqB,SAAQ,eAAe;IAChC,SAAS,EAAG,aAAa,CAAC;CAC3C;AAED,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,cAAM,cAAe,SAAQ,SAAS;IACpB,sBAAsB,EAAG,sBAAsB,CAAC;IAChD,SAAS,EAAG,kBAAkB,CAAC;IAC/B,SAAS,EAAG,kBAAkB,CAAC;CAChD;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC;AAE3C,cAAM,oBAAqB,SAAQ,eAAe;IAChC,SAAS,EAAG,aAAa,CAAC;CAC3C;AAED,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CAAC"}
@@ -1,7 +1,10 @@
1
1
  import { SequencerClient } from '../client/sequencer-client.js';
2
2
  import { Sequencer } from '../sequencer/sequencer.js';
3
3
  class TestSequencer_ extends Sequencer {
4
+ publicProcessorFactory;
5
+ timetable;
6
+ publisher;
4
7
  }
5
8
  class TestSequencerClient_ extends SequencerClient {
9
+ sequencer;
6
10
  }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3RELE1BQU0sY0FBZSxTQUFRLFNBQVM7Q0FJckM7QUFJRCxNQUFNLG9CQUFxQixTQUFRLGVBQWU7Q0FFakQifQ==
@@ -1,6 +1,6 @@
1
- import { type MerkleTreeReadOperations } from '@aztec/circuit-types';
2
- import { type Fr } from '@aztec/circuits.js';
3
- import { type ArchiveSource } from '@aztec/p2p';
1
+ import type { Fr } from '@aztec/foundation/fields';
2
+ import type { ArchiveSource } from '@aztec/p2p';
3
+ import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
4
4
  /**
5
5
  * Implements an archive source by checking a DB and an in-memory collection.
6
6
  * Intended for validating transactions as they are added to a block.
@@ -1 +1 @@
1
- {"version":3,"file":"archive_cache.d.ts","sourceRoot":"","sources":["../../src/tx_validator/archive_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;GAGG;AACH,qBAAa,YAAa,YAAW,aAAa;IAGpC,OAAO,CAAC,EAAE;IAFtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEV,EAAE,EAAE,wBAAwB;IAInC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;CAWhF"}
1
+ {"version":3,"file":"archive_cache.d.ts","sourceRoot":"","sources":["../../src/tx_validator/archive_cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAGhF;;;GAGG;AACH,qBAAa,YAAa,YAAW,aAAa;IAGpC,OAAO,CAAC,EAAE;IAFtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEV,EAAE,EAAE,wBAAwB;IAInC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;CAWhF"}
@@ -1,22 +1,22 @@
1
- import { MerkleTreeId } from '@aztec/circuit-types';
1
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
2
2
  /**
3
3
  * Implements an archive source by checking a DB and an in-memory collection.
4
4
  * Intended for validating transactions as they are added to a block.
5
- */
6
- export class ArchiveCache {
7
- constructor(db) {
5
+ */ export class ArchiveCache {
6
+ db;
7
+ archives;
8
+ constructor(db){
8
9
  this.db = db;
9
10
  this.archives = new Map();
10
11
  }
11
12
  async getArchiveIndices(archives) {
12
- const toCheckDb = archives.filter(n => !this.archives.has(n.toString()));
13
+ const toCheckDb = archives.filter((n)=>!this.archives.has(n.toString()));
13
14
  const dbHits = await this.db.findLeafIndices(MerkleTreeId.ARCHIVE, toCheckDb);
14
- dbHits.forEach((x, index) => {
15
+ dbHits.forEach((x, index)=>{
15
16
  if (x !== undefined) {
16
17
  this.archives.set(toCheckDb[index].toString(), x);
17
18
  }
18
19
  });
19
- return archives.map(n => this.archives.get(n.toString()));
20
+ return archives.map((n)=>this.archives.get(n.toString()));
20
21
  }
21
22
  }
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZV9jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvYXJjaGl2ZV9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFpQyxNQUFNLHNCQUFzQixDQUFDO0FBSW5GOzs7R0FHRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBR3ZCLFlBQW9CLEVBQTRCO1FBQTVCLE9BQUUsR0FBRixFQUFFLENBQTBCO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDNUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFjO1FBQzNDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDRiJ9
@@ -1,12 +1,14 @@
1
- import { type Tx, type TxValidationResult, type TxValidator } from '@aztec/circuit-types';
2
- import { type AztecAddress, Fr, type GasFees } from '@aztec/circuits.js';
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { GasFees } from '@aztec/stdlib/gas';
4
+ import { type Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
5
  /** Provides a view into public contract state */
4
6
  export interface PublicStateSource {
5
7
  storageRead: (contractAddress: AztecAddress, slot: Fr) => Promise<Fr>;
6
8
  }
7
9
  export declare class GasTxValidator implements TxValidator<Tx> {
8
10
  #private;
9
- constructor(publicDataSource: PublicStateSource, feeJuiceAddress: AztecAddress, enforceFees: boolean, gasFees: GasFees);
11
+ constructor(publicDataSource: PublicStateSource, feeJuiceAddress: AztecAddress, gasFees: GasFees);
10
12
  validateTx(tx: Tx): Promise<TxValidationResult>;
11
13
  }
12
14
  //# sourceMappingURL=gas_validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gas_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/gas_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAoB,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC5G,OAAO,EAAE,KAAK,YAAY,EAAE,EAAE,EAAoB,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAK3F,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;CACvE;AAED,qBAAa,cAAe,YAAW,WAAW,CAAC,EAAE,CAAC;;gBAQlD,gBAAgB,EAAE,iBAAiB,EACnC,eAAe,EAAE,YAAY,EAC7B,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,OAAO;IAQlB,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA+EhD"}
1
+ {"version":3,"file":"gas_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/gas_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAK9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,EAAoB,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAExG,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;CACvE;AAED,qBAAa,cAAe,YAAW,WAAW,CAAC,EAAE,CAAC;;gBAMxC,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;IAM1F,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA0EtD"}